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 (