import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { Utils } from '../../utils/utils'; import { enableSeadoc, enableWhiteboard, gettext } from '../../utils/constants'; import ModalPortal from '../modal-portal'; import CreateFolder from '../../components/dialog/create-folder-dialog'; import CreateFile from '../../components/dialog/create-file-dialog'; import ShareDialog from '../../components/dialog/share-dialog'; import toaster from '../toast'; import { seafileAPI } from '../../utils/seafile-api'; import TipDialog from '../dialog/tip-dailog'; const propTypes = { path: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, repoName: PropTypes.string.isRequired, repoEncrypted: PropTypes.bool.isRequired, enableDirPrivateShare: PropTypes.bool.isRequired, userPerm: PropTypes.string.isRequired, isGroupOwnedRepo: PropTypes.bool.isRequired, showShareBtn: PropTypes.bool.isRequired, onAddFile: PropTypes.func.isRequired, onAddFolder: PropTypes.func.isRequired, onUploadFile: PropTypes.func.isRequired, onUploadFolder: PropTypes.func.isRequired, direntList: PropTypes.array.isRequired, children: PropTypes.object, loadDirentList: PropTypes.func }; class DirOperationToolbar extends React.Component { constructor(props) { super(props); this.state = { fileType: '.md', isCreateFileDialogShow: false, isCreateFolderDialogShow: false, isShareDialogShow: false, operationMenuStyle: '', isDesktopMenuOpen: false, isSubMenuShown: false, isMobileOpMenuOpen: false, isImportingSdoc: false, }; this.fileInputRef = React.createRef(); } toggleDesktopOpMenu = () => { this.setState({ isDesktopMenuOpen: !this.state.isDesktopMenuOpen }); }; toggleMobileOpMenu = () => { this.setState({ isMobileOpMenuOpen: !this.state.isMobileOpMenuOpen }); }; onUploadFile = (e) => { this.props.onUploadFile(e); }; onUploadFolder = (e) => { this.props.onUploadFolder(e); }; onShareClick = () => { this.setState({ isShareDialogShow: !this.state.isShareDialogShow }); }; onCreateFolderToggle = () => { this.setState({ isCreateFolderDialogShow: !this.state.isCreateFolderDialogShow }); }; onCreateFileToggle = () => { this.setState({ isCreateFileDialogShow: !this.state.isCreateFileDialogShow, fileType: '' }); }; onCreateMarkdownToggle = () => { this.setState({ isCreateFileDialogShow: !this.state.isCreateFileDialogShow, fileType: '.md' }); }; onCreateExcelToggle = () => { this.setState({ isCreateFileDialogShow: !this.state.isCreateFileDialogShow, fileType: '.xlsx' }); }; onCreatePPTToggle = () => { this.setState({ isCreateFileDialogShow: !this.state.isCreateFileDialogShow, fileType: '.pptx' }); }; onCreateWordToggle = () => { this.setState({ isCreateFileDialogShow: !this.state.isCreateFileDialogShow, fileType: '.docx' }); }; onCreateTldrawToggle = () => { this.setState({ isCreateFileDialogShow: !this.state.isCreateFileDialogShow, fileType: '.draw' }); }; onCreateSeaDocToggle = () => { this.setState({ isCreateFileDialogShow: !this.state.isCreateFileDialogShow, fileType: '.sdoc' }); }; onAddFolder = (dirPath) => { this.setState({ isCreateFolderDialogShow: false }); this.props.onAddFolder(dirPath); }; checkDuplicatedName = (newName) => { let direntList = this.props.direntList; let isDuplicated = direntList.some(object => { return object.name === newName; }); return isDuplicated; }; onDropdownToggleKeyDown = (e) => { if (e.key == 'Enter' || e.key == 'Space') { this.toggleDesktopOpMenu(); } }; onDropDownMouseMove = (e) => { if (this.state.isSubMenuShown && e.target && e.target.className === 'dropdown-item') { this.setState({ isSubMenuShown: false }); } }; toggleSubMenu = (e) => { e.stopPropagation(); this.setState({ isSubMenuShown: !this.state.isSubMenuShown }); }; toggleSubMenuShown = (item) => { this.setState({ isSubMenuShown: true, currentItem: item.text }); }; onMenuItemKeyDown = (item, e) => { if (e.key == 'Enter' || e.key == 'Space') { item.onClick(); } }; onUploadSdoc = (e) => { this.fileInputRef.current.click(); }; uploadSdoc = (e) => { // no file selected if (!this.fileInputRef.current.files.length) { return; } // check file extension let fileName = this.fileInputRef.current.files[0].name; if (fileName.substr(fileName.lastIndexOf('.') + 1) != 'sdoczip') { toaster.warning(gettext('Please choose a .sdoczip file.'), { hasCloseButton: true, duration: null }); return; } this.setState({ isImportingSdoc: true }); const file = this.fileInputRef.current.files[0]; let { repoID, path } = this.props; seafileAPI.importSdoc(file, repoID, path).then((res) => { this.props.loadDirentList(path); }).catch((error) => { let errMsg = Utils.getErrorMsg(error); toaster.danger(errMsg); }).finally(() => { this.fileInputRef.current.value = ''; setTimeout(() => { this.setState({ isImportingSdoc: false }); }, 500); }); }; render() { let { path, repoName, userPerm } = this.props; const { isCustomPermission, customPermission } = Utils.getUserPermission(userPerm); const isShowDropdownMenu = (userPerm === 'rw' || userPerm === 'admin' || userPerm === 'cloud-edit' || isCustomPermission); if (!isShowDropdownMenu) { return (
{this.props.children}
); } let itemType = path === '/' ? 'library' : 'dir'; let itemName = path == '/' ? repoName : Utils.getFolderName(path); let canUpload = true; let canCreate = true; if (isCustomPermission) { const { permission } = customPermission; canUpload = permission.upload; canCreate = permission.create; } let content = null; if (Utils.isDesktop()) { const { showShareBtn, repoEncrypted } = this.props; let opList = []; if (canUpload) { if (Utils.isSupportUploadFolder()) { opList.push({ 'icon': 'upload-files', 'text': gettext('Upload Files'), 'onClick': this.onUploadFile }, { 'icon': 'upload-files', 'text': gettext('Upload Folder'), 'onClick': this.onUploadFolder }); } else { opList.push({ 'icon': 'upload-files', 'text': gettext('Upload'), 'onClick': this.onUploadFile }); } } if (canCreate) { let newSubOpList = [ { 'text': gettext('New Folder'), 'onClick': this.onCreateFolderToggle }, { 'text': gettext('New File'), 'onClick': this.onCreateFileToggle }, 'Divider', ]; if (enableSeadoc && !repoEncrypted) { newSubOpList.push({ 'text': gettext('New SeaDoc File'), 'onClick': this.onCreateSeaDocToggle }); } newSubOpList.push( { 'text': gettext('New Markdown File'), 'onClick': this.onCreateMarkdownToggle }, { 'text': gettext('New Excel File'), 'onClick': this.onCreateExcelToggle }, { 'text': gettext('New PowerPoint File'), 'onClick': this.onCreatePPTToggle }, { 'text': gettext('New Word File'), 'onClick': this.onCreateWordToggle }, ); if (enableWhiteboard) { newSubOpList.push({ 'text': gettext('New Whiteboard File'), 'onClick': this.onCreateTldrawToggle }); } opList.push({ 'icon': 'new', 'text': gettext('New'), 'subOpList': newSubOpList }); } if (showShareBtn) { opList.push({ 'icon': 'share', 'text': gettext('Share'), 'onClick': this.onShareClick }); } if (enableSeadoc && !repoEncrypted) { opList.push('Divider', { 'icon': 'import-sdoc', 'text': gettext('Import sdoc'), 'onClick': this.onUploadSdoc }); } content = ( {this.props.children} {opList.map((item, index) => { if (item == 'Divider') { return ; } else if (item.subOpList) { return ( {e.stopPropagation();}} > {item.text} {item.subOpList.map((item, index) => { if (item == 'Divider') { return ; } else { return ({item.text}); } })} ); } else { return ( {item.text} ); } })} ); } else { content = ( {this.props.children} {canUpload && ( {gettext('Upload')} )} {canCreate && ( {gettext('New Folder')} {gettext('New File')} )} ); } return ( {isShowDropdownMenu && (
{content}
)} {this.state.isCreateFileDialogShow && ( )} {this.state.isCreateFolderDialogShow && ( )} {this.state.isShareDialogShow && } {this.state.isImportingSdoc && ( )}
); } } DirOperationToolbar.propTypes = propTypes; export default DirOperationToolbar;