mirror of
https://github.com/haiwen/seahub.git
synced 2025-08-08 18:38:00 +00:00
1. ModalPortal 2. Icon 3. IconBtn 4. Loading 5. CenteredLoading 6. ClickOutside 7. SearchInput 8. Switch 9. CustomizeAddTool 10. SfCalendar 11. SfFilterCalendar 12. CustomizeSelect 13. CustomizePopover 14. FieldDisplaySettings 15. Formatters 16. remove duplicate codes
238 lines
8.2 KiB
JavaScript
238 lines
8.2 KiB
JavaScript
import React, { Fragment } from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import { Button, Modal, ModalBody, ModalFooter,
|
|
Nav, NavItem, NavLink, TabContent, TabPane, Label } from 'reactstrap';
|
|
import SeahubModalHeader from '@/components/common/seahub-modal-header';
|
|
import makeAnimated from 'react-select/animated';
|
|
import { seafileAPI } from '../../utils/seafile-api';
|
|
import { systemAdminAPI } from '../../utils/system-admin-api';
|
|
import { orgAdminAPI } from '../../utils/org-admin-api';
|
|
import { gettext, isPro, orgID } from '../../utils/constants';
|
|
import { Utils } from '../../utils/utils';
|
|
import toaster from '../toast';
|
|
import UserSelect from '../user-select';
|
|
import { SeahubSelect } from '../common/select';
|
|
import Switch from '../switch';
|
|
import '../../css/transfer-dialog.css';
|
|
|
|
const propTypes = {
|
|
itemName: PropTypes.string.isRequired,
|
|
toggleDialog: PropTypes.func.isRequired,
|
|
onTransferRepo: PropTypes.func.isRequired,
|
|
canTransferToDept: PropTypes.bool,
|
|
isOrgAdmin: PropTypes.bool,
|
|
isSysAdmin: PropTypes.bool,
|
|
isDepAdminTransfer: PropTypes.bool,
|
|
};
|
|
|
|
const TRANS_USER = 'transUser';
|
|
const TRANS_DEPART = 'transDepart';
|
|
|
|
class TransferDialog extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
options: [],
|
|
selectedOption: null,
|
|
errorMsg: [],
|
|
transferToUser: true,
|
|
transferToGroup: false,
|
|
reshare: false,
|
|
activeTab: !this.props.isDepAdminTransfer ? TRANS_USER : TRANS_DEPART
|
|
};
|
|
this.userSelect = React.createRef();
|
|
}
|
|
|
|
handleSelectChange = (option) => {
|
|
this.setState({ selectedOption: option });
|
|
};
|
|
|
|
submit = () => {
|
|
const { activeTab, reshare, selectedOption } = this.state;
|
|
const email = activeTab === TRANS_DEPART ? selectedOption.email : selectedOption[0].email;
|
|
this.props.onTransferRepo(email, reshare);
|
|
};
|
|
|
|
componentDidMount() {
|
|
if (isPro) {
|
|
if (this.props.isOrgAdmin) {
|
|
orgAdminAPI.orgAdminListDepartments(orgID).then((res) => {
|
|
this.updateOptions(res);
|
|
}).catch(error => {
|
|
let errMessage = Utils.getErrorMsg(error);
|
|
toaster.danger(errMessage);
|
|
});
|
|
}
|
|
else if (this.props.isSysAdmin) {
|
|
systemAdminAPI.sysAdminListDepartments().then((res) => {
|
|
this.updateOptions(res);
|
|
}).catch(error => {
|
|
let errMessage = Utils.getErrorMsg(error);
|
|
toaster.danger(errMessage);
|
|
});
|
|
}
|
|
else {
|
|
seafileAPI.listDepartments().then((res) => {
|
|
this.updateOptions(res);
|
|
}).catch(error => {
|
|
let errMessage = Utils.getErrorMsg(error);
|
|
toaster.danger(errMessage);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
updateOptions = (departmentsRes) => {
|
|
const options = departmentsRes.data.map(item => {
|
|
let option = {
|
|
value: item.name,
|
|
email: item.email,
|
|
label: item.name,
|
|
};
|
|
return option;
|
|
});
|
|
this.setState({ options });
|
|
};
|
|
|
|
onClick = () => {
|
|
this.setState({
|
|
transferToUser: !this.state.transferToUser,
|
|
});
|
|
};
|
|
|
|
toggle = (tab) => {
|
|
if (this.state.activeTab !== tab) {
|
|
this.setState({
|
|
activeTab: tab,
|
|
reshare: false,
|
|
selectedOption: null,
|
|
});
|
|
}
|
|
};
|
|
|
|
toggleReshareStatus = () => {
|
|
this.setState({
|
|
reshare: !this.state.reshare
|
|
});
|
|
};
|
|
|
|
renderTransContent = () => {
|
|
let activeTab = this.state.activeTab;
|
|
let reshare = this.state.reshare;
|
|
let canTransferToDept = true;
|
|
if (this.props.canTransferToDept != undefined) {
|
|
canTransferToDept = this.props.canTransferToDept;
|
|
}
|
|
return (
|
|
<Fragment>
|
|
<div className="transfer-dialog-side">
|
|
<Nav pills>
|
|
{!this.props.isDepAdminTransfer &&
|
|
<NavItem role="tab" aria-selected={activeTab === TRANS_USER} aria-controls="transfer-user-panel">
|
|
<NavLink
|
|
className={activeTab === TRANS_USER ? 'active' : ''}
|
|
onClick={(this.toggle.bind(this, TRANS_USER))}
|
|
tabIndex="0"
|
|
onKeyDown={this.onTabKeyDown}
|
|
>
|
|
{gettext('Transfer to user')}
|
|
</NavLink>
|
|
</NavItem>
|
|
}
|
|
{isPro &&
|
|
<NavItem role="tab" aria-selected={activeTab === TRANS_DEPART} aria-controls="transfer-depart-panel">
|
|
<NavLink
|
|
className={activeTab === TRANS_DEPART ? 'active' : ''}
|
|
onClick={this.toggle.bind(this, TRANS_DEPART)}
|
|
tabIndex="0"
|
|
onKeyDown={this.onTabKeyDown}
|
|
>
|
|
{gettext('Transfer to department')}
|
|
</NavLink>
|
|
</NavItem>}
|
|
</Nav>
|
|
</div>
|
|
<div className="transfer-dialog-main">
|
|
<TabContent activeTab={this.state.activeTab}>
|
|
<Fragment>
|
|
<TabPane tabId="transUser" role="tabpanel" id="transfer-user-panel">
|
|
<Label className='transfer-repo-label'>{gettext('Users')}</Label>
|
|
<UserSelect
|
|
ref={this.userSelect}
|
|
isMulti={false}
|
|
placeholder={gettext('Select a user')}
|
|
onSelectChange={this.handleSelectChange}
|
|
/>
|
|
<Switch
|
|
checked={reshare}
|
|
disabled={false}
|
|
size="large"
|
|
textPosition="right"
|
|
className='transfer-repo-reshare-switch w-100 mt-3 mb-1'
|
|
onChange={this.toggleReshareStatus}
|
|
placeholder={gettext('Keep sharing')}
|
|
/>
|
|
<div className='tip'>{gettext('If the library is shared to another user, the sharing will be kept.')}</div>
|
|
</TabPane>
|
|
{isPro && canTransferToDept &&
|
|
<TabPane tabId="transDepart" role="tabpanel" id="transfer-depart-panel">
|
|
<Label className='transfer-repo-label'>{gettext('Departments')}</Label>
|
|
<SeahubSelect
|
|
isClearable
|
|
maxMenuHeight={200}
|
|
hideSelectedOptions={true}
|
|
components={makeAnimated()}
|
|
placeholder={gettext('Select a department')}
|
|
options={this.state.options}
|
|
onChange={this.handleSelectChange}
|
|
value={this.state.selectedOption}
|
|
className="transfer-repo-select-department"
|
|
/>
|
|
<Switch
|
|
checked={reshare}
|
|
disabled={false}
|
|
size="large"
|
|
textPosition="right"
|
|
className='transfer-repo-reshare-switch w-100 mt-3 mb-1'
|
|
onChange={this.toggleReshareStatus}
|
|
placeholder={gettext('Keep sharing')}
|
|
/>
|
|
<div className='tip'>{gettext('If the library is shared to another department, the sharing will be kept.')}</div>
|
|
</TabPane>}
|
|
</Fragment>
|
|
</TabContent>
|
|
</div>
|
|
</Fragment>
|
|
);
|
|
};
|
|
|
|
render() {
|
|
const { selectedOption } = this.state;
|
|
const { itemName: repoName } = this.props;
|
|
let title = gettext('Transfer Library {library_name}');
|
|
title = title.replace('{library_name}', '<span class="op-target text-truncate mx-1">' + Utils.HTMLescape(repoName) + '</span>');
|
|
let buttonDisabled = false;
|
|
if (selectedOption === null || (Array.isArray(selectedOption) && selectedOption.length === 0)) {
|
|
buttonDisabled = true;
|
|
}
|
|
return (
|
|
<Modal isOpen={true} style={{ maxWidth: '720px' }} toggle={this.props.toggleDialog} className="transfer-dialog">
|
|
<SeahubModalHeader toggle={this.props.toggleDialog}>
|
|
<span dangerouslySetInnerHTML={{ __html: title }} className="d-flex mw-100"></span>
|
|
</SeahubModalHeader>
|
|
<ModalBody className="transfer-dialog-content" role="tablist">
|
|
{this.renderTransContent()}
|
|
</ModalBody>
|
|
<ModalFooter>
|
|
<Button color="secondary" onClick={this.props.toggleDialog}>{gettext('Cancel')}</Button>
|
|
<Button color="primary" onClick={this.submit} disabled={buttonDisabled}>{gettext('Submit')}</Button>
|
|
</ModalFooter>
|
|
</Modal>
|
|
);
|
|
}
|
|
}
|
|
|
|
TransferDialog.propTypes = propTypes;
|
|
|
|
export default TransferDialog;
|