diff --git a/frontend/src/components/dialog/copy-dirent-dialog.js b/frontend/src/components/dialog/copy-dirent-dialog.js index c1166e80b5..2ee855273a 100644 --- a/frontend/src/components/dialog/copy-dirent-dialog.js +++ b/frontend/src/components/dialog/copy-dirent-dialog.js @@ -14,7 +14,7 @@ const propTypes = { onItemCopy: PropTypes.func, onItemsCopy: PropTypes.func, onCancelCopy: PropTypes.func.isRequired, - repoEncrypted: PropTypes.object.isRequired, + repoEncrypted: PropTypes.bool.isRequired, }; // need dirent file Path; @@ -126,7 +126,7 @@ class CopyDirent extends React.Component { return; } - this.props.onItemCopy(repo, this.props.dirent, selectedPath); + this.props.onItemCopy(repo, this.props.dirent, selectedPath, this.props.path); this.toggle(); } diff --git a/frontend/src/components/dialog/move-dirent-dialog.js b/frontend/src/components/dialog/move-dirent-dialog.js index 02657599e3..0d3263386e 100644 --- a/frontend/src/components/dialog/move-dirent-dialog.js +++ b/frontend/src/components/dialog/move-dirent-dialog.js @@ -14,7 +14,7 @@ const propTypes = { onItemMove: PropTypes.func, onItemsMove: PropTypes.func, onCancelMove: PropTypes.func.isRequired, - repoEncrypted: PropTypes.object.isRequired, + repoEncrypted: PropTypes.bool.isRequired, }; // need dirent file Path; @@ -126,7 +126,7 @@ class MoveDirent extends React.Component { return; } - this.props.onItemMove(repo, this.props.dirent, selectedPath); + this.props.onItemMove(repo, this.props.dirent, selectedPath, this.props.path); this.toggle(); } diff --git a/frontend/src/components/dir-view-mode/dir-column-nav.js b/frontend/src/components/dir-view-mode/dir-column-nav.js index 4f1af79faa..55700aa8bc 100644 --- a/frontend/src/components/dir-view-mode/dir-column-nav.js +++ b/frontend/src/components/dir-view-mode/dir-column-nav.js @@ -5,6 +5,8 @@ import Loading from '../../components/loading'; import ModalPortal from '../../components/modal-portal'; import Delete from '../../components/dialog/delete-dialog'; import Rename from '../../components/dialog/rename-dialog'; +import Copy from '../../components/dialog/copy-dirent-dialog'; +import Move from '../../components/dialog/move-dirent-dialog'; import CreateFolder from '../../components/dialog/create-folder-dialog'; import CreateFile from '../../components/dialog/create-file-dialog'; import { siteRoot, gettext, thumbnailSizeForOriginal } from '../../utils/constants'; @@ -45,6 +47,9 @@ class DirColumnNav extends React.Component { isNodeImagePopupOpen: false, imageNodeItems: [], imageIndex: 0, + isCopyDialogShow: false, + isMoveDialogShow: false, + isMutipleOperation:false, }; this.isNodeMenuShow = true; } @@ -77,6 +82,12 @@ class DirColumnNav extends React.Component { case 'Delete': this.onDeleteToggle(); break; + case 'Copy': + this.onCopyToggle(); + break; + case 'Move': + this.onMoveToggle(); + break; case 'Open in New Tab': this.onOpenFile(node); break; @@ -115,6 +126,14 @@ class DirColumnNav extends React.Component { this.setState({isDeleteDialogShow: !this.state.isDeleteDialogShow}); } + onCopyToggle =() => { + this.setState({isCopyDialogShow: !this.state.isCopyDialogShow}) + } + + onMoveToggle = () => { + this.setState({isMoveDialogShow: !this.state.isMoveDialogShow}) + } + onAddFolderNode = (dirPath) => { this.setState({isAddFolderDialogShow: !this.state.isAddFolderDialogShow}); this.props.onAddFolderNode(dirPath); @@ -295,6 +314,32 @@ class DirColumnNav extends React.Component { /> )} + {this.state.isCopyDialogShow && ( + + + + )} + {this.state.isMoveDialogShow && ( + + + + )} {this.state.isNodeImagePopupOpen && (
diff --git a/frontend/src/components/tree-view/tree-node-menu.js b/frontend/src/components/tree-view/tree-node-menu.js index 0270fd0a09..f8929b2553 100644 --- a/frontend/src/components/tree-view/tree-node-menu.js +++ b/frontend/src/components/tree-view/tree-node-menu.js @@ -29,9 +29,9 @@ class TreeNodeMenu extends React.Component { let { node } = this.props; let menuList = []; if (node.object.type === 'dir') { - menuList = ['New Folder', 'New File', 'Rename', 'Delete']; + menuList = ['New Folder', 'New File', 'Copy', 'Move', 'Rename', 'Delete']; } else { - menuList = ['Rename', 'Delete', 'Open in New Tab']; + menuList = ['Rename', 'Delete', 'Copy', 'Move', 'Open in New Tab']; } return menuList; } @@ -48,6 +48,12 @@ class TreeNodeMenu extends React.Component { case 'Rename': translateResult = gettext('Rename'); break; + case 'Copy': + translateResult = gettext('Copy'); + break; + case 'Move': + translateResult = gettext('Move'); + break; case 'Delete': translateResult = gettext('Delete'); break; diff --git a/frontend/src/pages/lib-content-view/lib-content-view.js b/frontend/src/pages/lib-content-view/lib-content-view.js index d9f2a2de62..713f1e9224 100644 --- a/frontend/src/pages/lib-content-view/lib-content-view.js +++ b/frontend/src/pages/lib-content-view/lib-content-view.js @@ -682,12 +682,15 @@ class LibContentView extends React.Component { } // list operations - onMoveItem = (destRepo, dirent, moveToDirentPath) => { + onMoveItem = (destRepo, dirent, moveToDirentPath, nodeParentPath) => { let repoID = this.props.repoID; //just for view list state let dirName = dirent.name; - let direntPath = Utils.joinPath(this.state.path, dirName); - seafileAPI.moveDir(repoID, destRepo.repo_id,moveToDirentPath, this.state.path, dirName).then(res => { + if (!nodeParentPath) { + nodeParentPath = this.state.path; + } + let direntPath = Utils.joinPath(nodeParentPath, dirName); + seafileAPI.moveDir(repoID, destRepo.repo_id,moveToDirentPath, nodeParentPath, dirName).then(res => { let nodeName = res.data[0].obj_name; if (this.state.currentMode === 'column') { this.moveTreeNode(direntPath, moveToDirentPath, destRepo, nodeName); @@ -704,12 +707,15 @@ class LibContentView extends React.Component { }); } - onCopyItem = (destRepo, dirent, copyToDirentPath) => { + onCopyItem = (destRepo, dirent, copyToDirentPath, nodeParentPath) => { let repoID = this.props.repoID; //just for view list state let dirName = dirent.name; - let direntPath = Utils.joinPath(this.state.path, dirName); - seafileAPI.copyDir(repoID, destRepo.repo_id, copyToDirentPath, this.state.path, dirName).then(res => { + if (!nodeParentPath) { + nodeParentPath = this.state.path; + } + let direntPath = Utils.joinPath(nodeParentPath, dirName); + seafileAPI.copyDir(repoID, destRepo.repo_id, copyToDirentPath, nodeParentPath, dirName).then(res => { let nodeName = res.data[0].obj_name; if (this.state.currentMode === 'column') { this.copyTreeNode(direntPath, copyToDirentPath, destRepo, nodeName);