1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-18 06:57:52 +00:00

add copy and move effect (#3142)

* add copy and move effect

* Add copy and move effect

* Add move and copy effects

* Add move and copy effects
This commit is contained in:
zxj96 2019-03-20 11:04:36 +08:00 committed by Daniel Pan
parent 882e608d4b
commit b9aca2aba9
6 changed files with 71 additions and 12 deletions

View File

@ -14,7 +14,7 @@ const propTypes = {
onItemCopy: PropTypes.func, onItemCopy: PropTypes.func,
onItemsCopy: PropTypes.func, onItemsCopy: PropTypes.func,
onCancelCopy: PropTypes.func.isRequired, onCancelCopy: PropTypes.func.isRequired,
repoEncrypted: PropTypes.object.isRequired, repoEncrypted: PropTypes.bool.isRequired,
}; };
// need dirent file Path // need dirent file Path
@ -126,7 +126,7 @@ class CopyDirent extends React.Component {
return; return;
} }
this.props.onItemCopy(repo, this.props.dirent, selectedPath); this.props.onItemCopy(repo, this.props.dirent, selectedPath, this.props.path);
this.toggle(); this.toggle();
} }

View File

@ -14,7 +14,7 @@ const propTypes = {
onItemMove: PropTypes.func, onItemMove: PropTypes.func,
onItemsMove: PropTypes.func, onItemsMove: PropTypes.func,
onCancelMove: PropTypes.func.isRequired, onCancelMove: PropTypes.func.isRequired,
repoEncrypted: PropTypes.object.isRequired, repoEncrypted: PropTypes.bool.isRequired,
}; };
// need dirent file Path // need dirent file Path
@ -126,7 +126,7 @@ class MoveDirent extends React.Component {
return; return;
} }
this.props.onItemMove(repo, this.props.dirent, selectedPath); this.props.onItemMove(repo, this.props.dirent, selectedPath, this.props.path);
this.toggle(); this.toggle();
} }

View File

@ -5,6 +5,8 @@ import Loading from '../../components/loading';
import ModalPortal from '../../components/modal-portal'; import ModalPortal from '../../components/modal-portal';
import Delete from '../../components/dialog/delete-dialog'; import Delete from '../../components/dialog/delete-dialog';
import Rename from '../../components/dialog/rename-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 CreateFolder from '../../components/dialog/create-folder-dialog';
import CreateFile from '../../components/dialog/create-file-dialog'; import CreateFile from '../../components/dialog/create-file-dialog';
import { siteRoot, gettext, thumbnailSizeForOriginal } from '../../utils/constants'; import { siteRoot, gettext, thumbnailSizeForOriginal } from '../../utils/constants';
@ -45,6 +47,9 @@ class DirColumnNav extends React.Component {
isNodeImagePopupOpen: false, isNodeImagePopupOpen: false,
imageNodeItems: [], imageNodeItems: [],
imageIndex: 0, imageIndex: 0,
isCopyDialogShow: false,
isMoveDialogShow: false,
isMutipleOperation:false,
}; };
this.isNodeMenuShow = true; this.isNodeMenuShow = true;
} }
@ -77,6 +82,12 @@ class DirColumnNav extends React.Component {
case 'Delete': case 'Delete':
this.onDeleteToggle(); this.onDeleteToggle();
break; break;
case 'Copy':
this.onCopyToggle();
break;
case 'Move':
this.onMoveToggle();
break;
case 'Open in New Tab': case 'Open in New Tab':
this.onOpenFile(node); this.onOpenFile(node);
break; break;
@ -115,6 +126,14 @@ class DirColumnNav extends React.Component {
this.setState({isDeleteDialogShow: !this.state.isDeleteDialogShow}); this.setState({isDeleteDialogShow: !this.state.isDeleteDialogShow});
} }
onCopyToggle =() => {
this.setState({isCopyDialogShow: !this.state.isCopyDialogShow})
}
onMoveToggle = () => {
this.setState({isMoveDialogShow: !this.state.isMoveDialogShow})
}
onAddFolderNode = (dirPath) => { onAddFolderNode = (dirPath) => {
this.setState({isAddFolderDialogShow: !this.state.isAddFolderDialogShow}); this.setState({isAddFolderDialogShow: !this.state.isAddFolderDialogShow});
this.props.onAddFolderNode(dirPath); this.props.onAddFolderNode(dirPath);
@ -295,6 +314,32 @@ class DirColumnNav extends React.Component {
/> />
</ModalPortal> </ModalPortal>
)} )}
{this.state.isCopyDialogShow && (
<ModalPortal>
<Copy
path={this.state.opNode.parentNode.path}
repoID={this.props.repoID}
dirent={this.state.opNode.object}
onItemCopy={this.props.onItemCopy}
repoEncrypted={this.props.currentRepoInfo.encrypted}
onCancelCopy={this.onCopyToggle}
isMutipleOperation={this.state.isMutipleOperation}
/>
</ModalPortal>
)}
{this.state.isMoveDialogShow && (
<ModalPortal>
<Move
path={this.state.opNode.parentNode.path}
repoID={this.props.repoID}
dirent={this.state.opNode.object}
onItemMove={this.props.onItemMove}
repoEncrypted={this.props.currentRepoInfo.encrypted}
onCancelMove={this.onMoveToggle}
isMutipleOperation={this.state.isMutipleOperation}
/>
</ModalPortal>
)}
{this.state.isNodeImagePopupOpen && ( {this.state.isNodeImagePopupOpen && (
<Lightbox <Lightbox
mainSrc={imageNodeItems[imageIndex].src} mainSrc={imageNodeItems[imageIndex].src}

View File

@ -163,6 +163,8 @@ class DirColumnView extends React.Component {
navRate={this.state.navRate} navRate={this.state.navRate}
inResizing={this.state.inResizing} inResizing={this.state.inResizing}
currentRepoInfo={this.props.currentRepoInfo} currentRepoInfo={this.props.currentRepoInfo}
onItemMove={this.props.onItemMove}
onItemCopy={this.props.onItemCopy}
/> />
<div className="dir-content-resize" onMouseDown={this.onResizeMouseDown}></div> <div className="dir-content-resize" onMouseDown={this.onResizeMouseDown}></div>
<div className="dir-content-main" style={{userSelect: select, flex: mainFlex}}> <div className="dir-content-main" style={{userSelect: select, flex: mainFlex}}>

View File

@ -29,9 +29,9 @@ class TreeNodeMenu extends React.Component {
let { node } = this.props; let { node } = this.props;
let menuList = []; let menuList = [];
if (node.object.type === 'dir') { if (node.object.type === 'dir') {
menuList = ['New Folder', 'New File', 'Rename', 'Delete']; menuList = ['New Folder', 'New File', 'Copy', 'Move', 'Rename', 'Delete'];
} else { } else {
menuList = ['Rename', 'Delete', 'Open in New Tab']; menuList = ['Rename', 'Delete', 'Copy', 'Move', 'Open in New Tab'];
} }
return menuList; return menuList;
} }
@ -48,6 +48,12 @@ class TreeNodeMenu extends React.Component {
case 'Rename': case 'Rename':
translateResult = gettext('Rename'); translateResult = gettext('Rename');
break; break;
case 'Copy':
translateResult = gettext('Copy');
break;
case 'Move':
translateResult = gettext('Move');
break;
case 'Delete': case 'Delete':
translateResult = gettext('Delete'); translateResult = gettext('Delete');
break; break;

View File

@ -682,12 +682,15 @@ class LibContentView extends React.Component {
} }
// list operations // list operations
onMoveItem = (destRepo, dirent, moveToDirentPath) => { onMoveItem = (destRepo, dirent, moveToDirentPath, nodeParentPath) => {
let repoID = this.props.repoID; let repoID = this.props.repoID;
//just for view list state //just for view list state
let dirName = dirent.name; let dirName = dirent.name;
let direntPath = Utils.joinPath(this.state.path, dirName); if (!nodeParentPath) {
seafileAPI.moveDir(repoID, destRepo.repo_id,moveToDirentPath, this.state.path, dirName).then(res => { 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; let nodeName = res.data[0].obj_name;
if (this.state.currentMode === 'column') { if (this.state.currentMode === 'column') {
this.moveTreeNode(direntPath, moveToDirentPath, destRepo, nodeName); 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; let repoID = this.props.repoID;
//just for view list state //just for view list state
let dirName = dirent.name; let dirName = dirent.name;
let direntPath = Utils.joinPath(this.state.path, dirName); if (!nodeParentPath) {
seafileAPI.copyDir(repoID, destRepo.repo_id, copyToDirentPath, this.state.path, dirName).then(res => { 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; let nodeName = res.data[0].obj_name;
if (this.state.currentMode === 'column') { if (this.state.currentMode === 'column') {
this.copyTreeNode(direntPath, copyToDirentPath, destRepo, nodeName); this.copyTreeNode(direntPath, copyToDirentPath, destRepo, nodeName);