mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-02 07:27:04 +00:00
sysadmin reconstrcut orgs frontend (#4074)
* sysadmin reconstruct orgs page * [system admin] orgs: refactored it
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Label, Input } from 'reactstrap';
|
||||
import { gettext } from '../../../utils/constants';
|
||||
|
||||
const propTypes = {
|
||||
toggleDialog: PropTypes.func.isRequired,
|
||||
addOrg: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
class SysAdminAddOrgDialog extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
name: '',
|
||||
email: '',
|
||||
password: '',
|
||||
passwordAgain: '',
|
||||
errorMsg: '',
|
||||
isSubmitBtnActive: false
|
||||
};
|
||||
}
|
||||
|
||||
checkSubmitBtnActive = () => {
|
||||
const { name, email, password, passwordAgain } = this.state;
|
||||
let btnActive = true;
|
||||
if (name !='' &&
|
||||
email != '' &&
|
||||
password != '' &&
|
||||
passwordAgain != '') {
|
||||
btnActive = true;
|
||||
} else {
|
||||
btnActive = false;
|
||||
}
|
||||
this.setState({
|
||||
isSubmitBtnActive: btnActive
|
||||
});
|
||||
}
|
||||
|
||||
toggle = () => {
|
||||
this.props.toggleDialog();
|
||||
}
|
||||
|
||||
inputPassword = (e) => {
|
||||
let passwd = e.target.value.trim();
|
||||
this.setState({
|
||||
password: passwd
|
||||
}, this.checkSubmitBtnActive);
|
||||
}
|
||||
|
||||
inputPasswordAgain = (e) => {
|
||||
let passwd = e.target.value.trim();
|
||||
this.setState({
|
||||
passwordAgain: passwd
|
||||
}, this.checkSubmitBtnActive);
|
||||
}
|
||||
|
||||
inputEmail = (e) => {
|
||||
let email = e.target.value.trim();
|
||||
this.setState({
|
||||
email: email
|
||||
}, this.checkSubmitBtnActive);
|
||||
}
|
||||
|
||||
inputName = (e) => {
|
||||
let name = e.target.value.trim();
|
||||
this.setState({
|
||||
name: name
|
||||
}, this.checkSubmitBtnActive);
|
||||
}
|
||||
|
||||
handleSubmit = () => {
|
||||
let { name, email, password, passwordAgain } = this.state;
|
||||
if (password != passwordAgain) {
|
||||
this.setState({errorMsg: gettext('Passwords do not match.')});
|
||||
return;
|
||||
}
|
||||
const data = {
|
||||
orgName: name,
|
||||
ownerEmail: email,
|
||||
password: password
|
||||
};
|
||||
this.props.addOrg(data);
|
||||
this.toggle();
|
||||
}
|
||||
|
||||
render() {
|
||||
const { errorMsg, password, passwordAgain, email, name, isSubmitBtnActive } = this.state;
|
||||
return (
|
||||
<Modal isOpen={true} toggle={this.toggle}>
|
||||
<ModalHeader toggle={this.toggle}>{gettext('Add Organization')}</ModalHeader>
|
||||
<ModalBody>
|
||||
<Form autoComplete="off">
|
||||
<FormGroup>
|
||||
<Label>{gettext('Name')}</Label>
|
||||
<Input value={name} onChange={this.inputName} />
|
||||
</FormGroup>
|
||||
<FormGroup>
|
||||
<Label>
|
||||
{gettext('Owner')}
|
||||
<span className="small text-secondary ml-1 fas fa-question-circle" title={gettext('Owner can use admin panel in an organization, must be a new account.')}></span>
|
||||
</Label>
|
||||
<Input value={email} onChange={this.inputEmail} />
|
||||
</FormGroup>
|
||||
<FormGroup>
|
||||
<Label>{gettext('Password')}</Label>
|
||||
<Input type="password" value={password} onChange={this.inputPassword} />
|
||||
</FormGroup>
|
||||
<FormGroup>
|
||||
<Label>{gettext('Password again')}</Label>
|
||||
<Input type="password" value={passwordAgain} onChange={this.inputPasswordAgain} />
|
||||
</FormGroup>
|
||||
</Form>
|
||||
{errorMsg && <Alert color="danger">{errorMsg}</Alert>}
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={this.toggle}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
SysAdminAddOrgDialog.propTypes = propTypes;
|
||||
|
||||
export default SysAdminAddOrgDialog;
|
@@ -0,0 +1,149 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Label, Input, InputGroup, InputGroupAddon } from 'reactstrap';
|
||||
import { gettext } from '../../../utils/constants';
|
||||
import { Utils } from '../../../utils/utils';
|
||||
import SysAdminUserRoleEditor from '../../../components/select-editor/sysadmin-user-role-editor';
|
||||
|
||||
const propTypes = {
|
||||
toggleDialog: PropTypes.func.isRequired,
|
||||
addUser: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
class SysAdminAddUserDialog extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
errorMsg: '',
|
||||
isPasswordVisible: false,
|
||||
password: '',
|
||||
passwordAgain: '',
|
||||
email: '',
|
||||
name: '',
|
||||
isSubmitBtnActive: false
|
||||
};
|
||||
}
|
||||
|
||||
checkSubmitBtnActive = () => {
|
||||
const { email, password, passwordAgain } = this.state;
|
||||
let btnActive = true;
|
||||
if (email != '' &&
|
||||
password != '' &&
|
||||
passwordAgain != '') {
|
||||
btnActive = true;
|
||||
} else {
|
||||
btnActive = false;
|
||||
}
|
||||
this.setState({
|
||||
isSubmitBtnActive: btnActive
|
||||
});
|
||||
}
|
||||
|
||||
toggle = () => {
|
||||
this.props.toggleDialog();
|
||||
}
|
||||
|
||||
togglePasswordVisible = () => {
|
||||
this.setState({isPasswordVisible: !this.state.isPasswordVisible});
|
||||
}
|
||||
|
||||
inputPassword = (e) => {
|
||||
let passwd = e.target.value.trim();
|
||||
this.setState({
|
||||
password: passwd,
|
||||
errorMsg: ''
|
||||
}, this.checkSubmitBtnActive);
|
||||
}
|
||||
|
||||
inputPasswordAgain = (e) => {
|
||||
let passwd = e.target.value.trim();
|
||||
this.setState({
|
||||
passwordAgain: passwd,
|
||||
errorMsg: ''
|
||||
}, this.checkSubmitBtnActive);
|
||||
}
|
||||
|
||||
generatePassword = () => {
|
||||
let val = Utils.generatePassword(8);
|
||||
this.setState({
|
||||
password: val,
|
||||
passwordAgain: val
|
||||
}, this.checkSubmitBtnActive);
|
||||
}
|
||||
|
||||
inputEmail = (e) => {
|
||||
let email = e.target.value.trim();
|
||||
this.setState({
|
||||
email: email
|
||||
}, this.checkSubmitBtnActive);
|
||||
}
|
||||
|
||||
inputName = (e) => {
|
||||
let name = e.target.value.trim();
|
||||
this.setState({
|
||||
name: name
|
||||
});
|
||||
}
|
||||
|
||||
handleSubmit = () => {
|
||||
const { email, password, passwordAgain, name } = this.state;
|
||||
if (password != passwordAgain) {
|
||||
this.setState({errorMsg: gettext('Passwords do not match.')});
|
||||
return;
|
||||
}
|
||||
const data = {
|
||||
email: email,
|
||||
name: name,
|
||||
password: password
|
||||
};
|
||||
this.props.addUser(data);
|
||||
this.toggle();
|
||||
}
|
||||
|
||||
render() {
|
||||
const { errorMsg, isPasswordVisible, password, passwordAgain, email, name,
|
||||
isSubmitBtnActive
|
||||
} = this.state;
|
||||
return (
|
||||
<Modal isOpen={true} toggle={this.toggle}>
|
||||
<ModalHeader toggle={this.toggle}>{gettext('Add Member')}</ModalHeader>
|
||||
<ModalBody>
|
||||
<Form autoComplete="off">
|
||||
<FormGroup>
|
||||
<Label>{gettext('Email')}</Label>
|
||||
<Input value={email} onChange={this.inputEmail} />
|
||||
</FormGroup>
|
||||
<FormGroup>
|
||||
<Label>{gettext('Name(optional)')}</Label>
|
||||
<Input autoComplete="new-password" value={name} onChange={this.inputName} />
|
||||
</FormGroup>
|
||||
<FormGroup>
|
||||
<Label>{gettext('Password')}</Label>
|
||||
<InputGroup>
|
||||
<Input autoComplete="new-password" type={isPasswordVisible ? 'text' : 'password'} value={password || ''} onChange={this.inputPassword} />
|
||||
<InputGroupAddon addonType="append">
|
||||
<Button className="mt-0" onClick={this.togglePasswordVisible}><i className={`link-operation-icon fas ${this.state.isPasswordVisible ? 'fa-eye': 'fa-eye-slash'}`}></i></Button>
|
||||
<Button className="mt-0" onClick={this.generatePassword}><i className="link-operation-icon fas fa-magic"></i></Button>
|
||||
</InputGroupAddon>
|
||||
</InputGroup>
|
||||
</FormGroup>
|
||||
<FormGroup>
|
||||
<Label>{gettext('Password again')}</Label>
|
||||
<Input type={isPasswordVisible ? 'text' : 'password'} value={passwordAgain || ''} onChange={this.inputPasswordAgain} />
|
||||
</FormGroup>
|
||||
</Form>
|
||||
{errorMsg && <Alert color="danger">{errorMsg}</Alert>}
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={this.toggle}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
SysAdminAddUserDialog.propTypes = propTypes;
|
||||
|
||||
export default SysAdminAddUserDialog;
|
@@ -0,0 +1,75 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Input, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';
|
||||
import { gettext } from '../../../utils/constants';
|
||||
import { Utils } from '../../../utils/utils';
|
||||
|
||||
const propTypes = {
|
||||
toggle: PropTypes.func.isRequired,
|
||||
updateValue: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
class SysAdminSetOrgMaxUserNumberDialog extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
value: this.props.value,
|
||||
isSubmitBtnActive: false
|
||||
};
|
||||
}
|
||||
|
||||
toggle = () => {
|
||||
this.props.toggle();
|
||||
}
|
||||
|
||||
handleInputChange = (e) => {
|
||||
const value = e.target.value.trim();
|
||||
this.setState({
|
||||
value: value,
|
||||
isSubmitBtnActive: value != ''
|
||||
});
|
||||
}
|
||||
|
||||
handleKeyPress = (e) => {
|
||||
if (e.key == 'Enter') {
|
||||
this.handleSubmit();
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
handleSubmit = () => {
|
||||
this.props.updateValue(this.state.value);
|
||||
this.toggle();
|
||||
}
|
||||
|
||||
render() {
|
||||
const { value, isSubmitBtnActive } = this.state;
|
||||
return (
|
||||
<Modal isOpen={true} toggle={this.toggle}>
|
||||
<ModalHeader toggle={this.toggle}>{gettext('Set max number of members')}</ModalHeader>
|
||||
<ModalBody>
|
||||
<Form>
|
||||
<FormGroup>
|
||||
<Input
|
||||
type="text"
|
||||
className="form-control"
|
||||
value={value}
|
||||
onKeyPress={this.handleKeyPress}
|
||||
onChange={this.handleInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
</Form>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={this.toggle}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
SysAdminSetOrgMaxUserNumberDialog.propTypes = propTypes;
|
||||
|
||||
export default SysAdminSetOrgMaxUserNumberDialog;
|
@@ -0,0 +1,75 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Input, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';
|
||||
import { gettext } from '../../../utils/constants';
|
||||
import { Utils } from '../../../utils/utils';
|
||||
|
||||
const propTypes = {
|
||||
toggle: PropTypes.func.isRequired,
|
||||
updateName: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
class SysAdminSetOrgNameDialog extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
name: this.props.name,
|
||||
isSubmitBtnActive: false
|
||||
};
|
||||
}
|
||||
|
||||
toggle = () => {
|
||||
this.props.toggle();
|
||||
}
|
||||
|
||||
handleInputChange = (e) => {
|
||||
const value = e.target.value.trim();
|
||||
this.setState({
|
||||
name: value,
|
||||
isSubmitBtnActive: value != ''
|
||||
});
|
||||
}
|
||||
|
||||
handleKeyPress = (e) => {
|
||||
if (e.key == 'Enter') {
|
||||
this.handleSubmit();
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
handleSubmit = () => {
|
||||
this.props.updateName(this.state.name);
|
||||
this.toggle();
|
||||
}
|
||||
|
||||
render() {
|
||||
const { name, isSubmitBtnActive } = this.state;
|
||||
return (
|
||||
<Modal isOpen={true} toggle={this.toggle}>
|
||||
<ModalHeader toggle={this.toggle}>{gettext('Set Name')}</ModalHeader>
|
||||
<ModalBody>
|
||||
<Form>
|
||||
<FormGroup>
|
||||
<Input
|
||||
type="text"
|
||||
className="form-control"
|
||||
value={name}
|
||||
onKeyPress={this.handleKeyPress}
|
||||
onChange={this.handleInputChange}
|
||||
/>
|
||||
</FormGroup>
|
||||
</Form>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={this.toggle}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
SysAdminSetOrgNameDialog.propTypes = propTypes;
|
||||
|
||||
export default SysAdminSetOrgNameDialog;
|
@@ -0,0 +1,85 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Input, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';
|
||||
import { gettext } from '../../../utils/constants';
|
||||
import { Utils } from '../../../utils/utils';
|
||||
|
||||
const propTypes = {
|
||||
toggle: PropTypes.func.isRequired,
|
||||
updateQuota: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
class SysAdminOrgSetQuotaDialog extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
quota: '',
|
||||
isSubmitBtnActive: false
|
||||
};
|
||||
}
|
||||
|
||||
toggle = () => {
|
||||
this.props.toggle();
|
||||
}
|
||||
|
||||
handleQuotaChange = (e) => {
|
||||
const value = e.target.value.trim();
|
||||
this.setState({
|
||||
quota: value,
|
||||
isSubmitBtnActive: value != ''
|
||||
});
|
||||
}
|
||||
|
||||
handleKeyPress = (e) => {
|
||||
if (e.key == 'Enter') {
|
||||
this.handleSubmit();
|
||||
e.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
handleSubmit = () => {
|
||||
this.props.updateQuota(this.state.quota);
|
||||
this.toggle();
|
||||
}
|
||||
|
||||
render() {
|
||||
const { quota, isSubmitBtnActive } = this.state;
|
||||
return (
|
||||
<Modal isOpen={true} toggle={this.toggle}>
|
||||
<ModalHeader toggle={this.toggle}>{gettext('Set Quota')}</ModalHeader>
|
||||
<ModalBody>
|
||||
<Form>
|
||||
<FormGroup>
|
||||
<InputGroup>
|
||||
<Input
|
||||
type="text"
|
||||
className="form-control"
|
||||
value={quota}
|
||||
onKeyPress={this.handleKeyPress}
|
||||
onChange={this.handleQuotaChange}
|
||||
/>
|
||||
<InputGroupAddon addonType="append">
|
||||
<InputGroupText>MB</InputGroupText>
|
||||
</InputGroupAddon>
|
||||
</InputGroup>
|
||||
<p className="small text-secondary mt-2 mb-2">
|
||||
{gettext('An integer that is greater than or equal to 0.')}
|
||||
<br />
|
||||
{gettext('Tip: 0 means default limit')}
|
||||
</p>
|
||||
</FormGroup>
|
||||
</Form>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button color="secondary" onClick={this.toggle}>{gettext('Cancel')}</Button>
|
||||
<Button color="primary" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>
|
||||
</ModalFooter>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
SysAdminOrgSetQuotaDialog.propTypes = propTypes;
|
||||
|
||||
export default SysAdminOrgSetQuotaDialog;
|
Reference in New Issue
Block a user