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:
parent
882e608d4b
commit
b9aca2aba9
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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}
|
||||||
|
@ -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}}>
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user