import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { Button, ButtonGroup } from 'reactstrap'; import { gettext } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; import URLDecorator from '../../utils/url-decorator'; import MoveDirentDialog from '../dialog/move-dirent-dialog'; import CopyDirentDialog from '../dialog/copy-dirent-dialog'; import DirentsMenu from '../dirent-list-view/dirents-menu'; import ShareDialog from '../dialog/share-dialog'; import RelatedFileDialogs from '../dialog/related-file-dialogs'; import EditFileTagDialog from '../dialog/edit-filetag-dialog'; import ZipDownloadDialog from '../dialog/zip-download-dialog'; import ModalPortal from '../modal-portal'; const propTypes = { path: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, repoEncrypted: PropTypes.bool.isRequired, selectedDirentList: PropTypes.array.isRequired, onItemsMove: PropTypes.func.isRequired, onItemsCopy: PropTypes.func.isRequired, onItemsDelete: PropTypes.func.isRequired, isRepoOwner: PropTypes.bool.isRequired, enableDirPrivateShare: PropTypes.bool.isRequired, currentRepoInfo: PropTypes.object.isRequired, onFilesTagChanged: PropTypes.func.isRequired, unSelectDirent: PropTypes.func.isRequired, updateDirent: PropTypes.func.isRequired, showDirentDetail: PropTypes.func.isRequired, }; class MutipleDirOperationToolbar extends React.Component { constructor(props) { super(props); this.state = { isZipDialogOpen: false, isMoveDialogShow: false, isCopyDialogShow: false, isMutipleOperation: true, showLibContentViewDialogs: false, showShareDialog: false, showEditFileTagDialog: false, fileTagList: [], multiFileTagList: [], showRelatedFileDialog: false, viewMode: 'list_related_file', }; } onMoveToggle = () => { this.setState({isMoveDialogShow: !this.state.isMoveDialogShow}); } onCopyToggle = () => { this.setState({isCopyDialogShow: !this.state.isCopyDialogShow}); } onItemsDelete = () => { this.props.onItemsDelete(); } onItemsDownload = () => { let { path, repoID, selectedDirentList } = this.props; if (selectedDirentList.length) { if (selectedDirentList.length === 1 && !selectedDirentList[0].isDir()) { let direntPath = Utils.joinPath(path, selectedDirentList[0].name); let url = URLDecorator.getUrl({type: 'download_file_url', repoID: repoID, filePath: direntPath}); location.href= url; return; } this.setState({ isZipDialogOpen: true }); } } closeZipDialog = () => { this.setState({ isZipDialogOpen: false }); } onMenuItemClick = (operation) => { const dirents = this.props.selectedDirentList; const dirent = dirents[0]; switch(operation) { case 'Share': this.setState({ showLibContentViewDialogs: true, showShareDialog: true, }); break; case 'Tags': this.listFileTags(dirent); break; case 'Details': this.props.showDirentDetail(); break; case 'Lock': this.lockFile(dirent); break; case 'Unlock': this.unlockFile(dirent); break; case 'Related Files': this.openRelatedFilesDialog(dirent); break; case 'History': this.onHistory(dirent); break; case 'Open via Client': this.onOpenViaClient(dirent); break; default: break; } } lockFile = (dirent) => { const filePath = this.getDirentPath(dirent); seafileAPI.lockfile(this.props.repoID, filePath).then((res) => { if (res.data.is_locked) { this.props.updateDirent(dirent, 'is_locked', true); this.props.updateDirent(dirent, 'locked_by_me', true); this.props.unSelectDirent(); } }); } unlockFile = (dirent) => { const filePath = this.getDirentPath(dirent); seafileAPI.unlockfile(this.props.repoID, filePath).then((res) => { if (!res.data.is_locked) { this.props.updateDirent(dirent, 'is_locked', false); this.props.updateDirent(dirent, 'locked_by_me', false); this.props.unSelectDirent(); } }); } onOpenViaClient = (dirent) => { const filePath = this.getDirentPath(dirent); let url = URLDecorator.getUrl({ type: 'open_via_client', repoID: this.props.repoID, filePath: filePath }); location.href = url; this.props.unSelectDirent(); } onHistory = (dirent) => { let filePath = this.getDirentPath(dirent); let url = URLDecorator.getUrl({ type: 'file_revisions', repoID: this.props.repoID, filePath: filePath }); location.href = url; } openRelatedFilesDialog = (dirent) => { let filePath = this.getDirentPath(dirent); seafileAPI.listRelatedFiles(this.props.repoID, filePath).then(res => { let relatedFiles = res.data.related_files; if (relatedFiles.length > 0) { this.setState({ relatedFiles: relatedFiles, showLibContentViewDialogs: true, showRelatedFileDialog: true, viewMode: 'list_related_file', }); } else { this.setState({ relatedFiles: relatedFiles, showLibContentViewDialogs: true, showRelatedFileDialog: true, viewMode: 'add_related_file', }); } }); } toggleCancel = () => { this.setState({ showLibContentViewDialogs: false, showShareDialog: false, showEditFileTagDialog: false, showRelatedFileDialog: false, }); } listFileTags = (dirent) => { let filePath = this.getDirentPath(dirent); seafileAPI.listFileTags(this.props.repoID, filePath).then(res => { let fileTagList = res.data.file_tags; for (let i = 0, length = fileTagList.length; i < length; i++) { fileTagList[i].id = fileTagList[i].file_tag_id; } this.setState({ fileTagList: fileTagList, showLibContentViewDialogs: true, showEditFileTagDialog: true, }); }); } onMenuFileTagChanged = () => { this.listFileTags(this.props.selectedDirentList[0]); let length = this.props.selectedDirentList.length; for (let i = 0; i < length; i++) { const dirent = this.props.selectedDirentList[i]; const direntPath = this.getDirentPath(dirent); this.props.onFilesTagChanged(dirent, direntPath); } } listRelatedFiles = (dirent) => { let filePath = this.getDirentPath(dirent); seafileAPI.listRelatedFiles(this.props.repoID, filePath).then(res => { this.setState({ relatedFiles: res.data.related_files }); }); } onRelatedFileChange = () => { this.listRelatedFiles(this.props.selectedDirentList[0]); } getDirentPath = (dirent) => { if (dirent) return Utils.joinPath(this.props.path, dirent.name); } render() { const { repoID } = this.props; let direntPath = this.getDirentPath(this.props.selectedDirentList[0]); return (
{this.props.selectedDirentList.length > 0 && }
{this.state.isMoveDialogShow && } {this.state.isCopyDialogShow && } {this.state.isZipDialogOpen && dirent.name)} toggleDialog={this.closeZipDialog} /> } {this.state.showLibContentViewDialogs && ( {this.state.showShareDialog && } {this.state.showEditFileTagDialog && } {this.state.showRelatedFileDialog && } )}
); } } MutipleDirOperationToolbar.propTypes = propTypes; export default MutipleDirOperationToolbar;