mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-05 08:53:14 +00:00
@@ -33,6 +33,7 @@ const propTypes = {
|
|||||||
onItemMove: PropTypes.func.isRequired,
|
onItemMove: PropTypes.func.isRequired,
|
||||||
onItemCopy: PropTypes.func.isRequired,
|
onItemCopy: PropTypes.func.isRequired,
|
||||||
selectedDirentList: PropTypes.array.isRequired,
|
selectedDirentList: PropTypes.array.isRequired,
|
||||||
|
onItemsMove: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class DirColumnNav extends React.Component {
|
class DirColumnNav extends React.Component {
|
||||||
@@ -276,6 +277,7 @@ class DirColumnNav extends React.Component {
|
|||||||
onItemMove={this.props.onItemMove}
|
onItemMove={this.props.onItemMove}
|
||||||
currentRepoInfo={this.props.currentRepoInfo}
|
currentRepoInfo={this.props.currentRepoInfo}
|
||||||
selectedDirentList={this.props.selectedDirentList}
|
selectedDirentList={this.props.selectedDirentList}
|
||||||
|
onItemsMove={this.props.onItemsMove}
|
||||||
/>)
|
/>)
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
@@ -171,6 +171,7 @@ class DirColumnView extends React.Component {
|
|||||||
onItemMove={this.props.onItemMove}
|
onItemMove={this.props.onItemMove}
|
||||||
onItemCopy={this.props.onItemCopy}
|
onItemCopy={this.props.onItemCopy}
|
||||||
selectedDirentList={this.props.selectedDirentList}
|
selectedDirentList={this.props.selectedDirentList}
|
||||||
|
onItemsMove={this.props.onItemsMove}
|
||||||
/>
|
/>
|
||||||
<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}}>
|
||||||
|
@@ -49,6 +49,7 @@ const propTypes = {
|
|||||||
onFileTagChanged: PropTypes.func,
|
onFileTagChanged: PropTypes.func,
|
||||||
enableDirPrivateShare: PropTypes.bool.isRequired,
|
enableDirPrivateShare: PropTypes.bool.isRequired,
|
||||||
showDirentDetail: PropTypes.func.isRequired,
|
showDirentDetail: PropTypes.func.isRequired,
|
||||||
|
onItemsMove: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
|
|
||||||
class DirentListItem extends React.Component {
|
class DirentListItem extends React.Component {
|
||||||
@@ -349,15 +350,28 @@ class DirentListItem extends React.Component {
|
|||||||
if (Utils.isIEBrower()) {
|
if (Utils.isIEBrower()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
let nodeRootPath = '';
|
|
||||||
nodeRootPath = this.props.path === '/' ? `${this.props.path}${this.props.dirent.name}` : `${this.props.path}/${this.props.dirent.name}`;
|
|
||||||
let dragStartItemData = {nodeDirent: this.props.dirent, nodeParentPath: this.props.path, nodeRootPath: nodeRootPath};
|
|
||||||
dragStartItemData = JSON.stringify(dragStartItemData);
|
|
||||||
|
|
||||||
e.dataTransfer.effectAllowed = 'move';
|
e.dataTransfer.effectAllowed = 'move';
|
||||||
if (e.dataTransfer && e.dataTransfer.setDragImage) {
|
if (e.dataTransfer && e.dataTransfer.setDragImage) {
|
||||||
e.dataTransfer.setDragImage(this.refs.drag_icon, 15, 15);
|
e.dataTransfer.setDragImage(this.refs.drag_icon, 15, 15);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let { selectedDirentList } = this.props;
|
||||||
|
if (selectedDirentList.length > 0 && selectedDirentList.includes(this.props.dirent)) { // drag items and selectedDirentList include item
|
||||||
|
let selectedList = selectedDirentList.map(item => {
|
||||||
|
let nodeRootPath = this.getDirentPath(item);
|
||||||
|
let dragStartItemData = {nodeDirent: item, nodeParentPath: this.props.path, nodeRootPath: nodeRootPath};
|
||||||
|
return dragStartItemData;
|
||||||
|
});
|
||||||
|
selectedList = JSON.stringify(selectedList);
|
||||||
|
e.dataTransfer.setData('applicaiton/drag-item-info', selectedList);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
let nodeRootPath = this.getDirentPath(this.props.dirent);
|
||||||
|
let dragStartItemData = {nodeDirent: this.props.dirent, nodeParentPath: this.props.path, nodeRootPath: nodeRootPath};
|
||||||
|
dragStartItemData = JSON.stringify(dragStartItemData);
|
||||||
|
|
||||||
e.dataTransfer.setData('applicaiton/drag-item-info', dragStartItemData);
|
e.dataTransfer.setData('applicaiton/drag-item-info', dragStartItemData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,7 +409,22 @@ class DirentListItem extends React.Component {
|
|||||||
}
|
}
|
||||||
let dragStartItemData = e.dataTransfer.getData('applicaiton/drag-item-info');
|
let dragStartItemData = e.dataTransfer.getData('applicaiton/drag-item-info');
|
||||||
dragStartItemData = JSON.parse(dragStartItemData);
|
dragStartItemData = JSON.parse(dragStartItemData);
|
||||||
let {nodeDirent, nodeParentPath, nodeRootPath} = dragStartItemData;
|
if (Array.isArray(dragStartItemData)) { //move items
|
||||||
|
let direntPaths = dragStartItemData.map(draggedItem => {
|
||||||
|
return draggedItem.nodeRootPath
|
||||||
|
});
|
||||||
|
|
||||||
|
let selectedPath = Utils.joinPath(this.props.path, this.props.dirent.name);
|
||||||
|
|
||||||
|
if (direntPaths.some(direntPath => { return direntPath === selectedPath;})) { //eg; A/B, A/C --> A/B
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.props.onItemsMove(this.props.currentRepoInfo, selectedPath);
|
||||||
|
return ;
|
||||||
|
}
|
||||||
|
|
||||||
|
let { nodeDirent, nodeParentPath, nodeRootPath } = dragStartItemData;
|
||||||
let dropItemData = this.props.dirent;
|
let dropItemData = this.props.dirent;
|
||||||
|
|
||||||
if (nodeDirent.name === dropItemData.name) {
|
if (nodeDirent.name === dropItemData.name) {
|
||||||
|
@@ -577,6 +577,11 @@ class DirentListView extends React.Component {
|
|||||||
let {nodeDirent, nodeParentPath, nodeRootPath} = dragStartItemData;
|
let {nodeDirent, nodeParentPath, nodeRootPath} = dragStartItemData;
|
||||||
|
|
||||||
if (e.target.className === 'table-container table-drop-active') {
|
if (e.target.className === 'table-container table-drop-active') {
|
||||||
|
|
||||||
|
if (Array.isArray(dragStartItemData)) { //selected items
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (nodeRootPath === this.props.path || nodeParentPath === this.props.path) {
|
if (nodeRootPath === this.props.path || nodeParentPath === this.props.path) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -664,6 +669,7 @@ class DirentListView extends React.Component {
|
|||||||
onFileTagChanged={this.props.onFileTagChanged}
|
onFileTagChanged={this.props.onFileTagChanged}
|
||||||
getDirentItemMenuList={this.getDirentItemMenuList}
|
getDirentItemMenuList={this.getDirentItemMenuList}
|
||||||
showDirentDetail={this.props.showDirentDetail}
|
showDirentDetail={this.props.showDirentDetail}
|
||||||
|
onItemsMove={this.props.onItemsMove}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
@@ -18,6 +18,7 @@ const propTypes = {
|
|||||||
onItemMove: PropTypes.func,
|
onItemMove: PropTypes.func,
|
||||||
currentRepoInfo: PropTypes.object,
|
currentRepoInfo: PropTypes.object,
|
||||||
selectedDirentList: PropTypes.array,
|
selectedDirentList: PropTypes.array,
|
||||||
|
onItemsMove: PropTypes.func,
|
||||||
};
|
};
|
||||||
|
|
||||||
const PADDING_LEFT = 20;
|
const PADDING_LEFT = 20;
|
||||||
@@ -91,6 +92,20 @@ class TreeView extends React.Component {
|
|||||||
let {nodeDirent, nodeParentPath, nodeRootPath} = dragStartNodeData;
|
let {nodeDirent, nodeParentPath, nodeRootPath} = dragStartNodeData;
|
||||||
let dropNodeData = node;
|
let dropNodeData = node;
|
||||||
|
|
||||||
|
if (Array.isArray(dragStartNodeData)) { //move items
|
||||||
|
if (!dropNodeData) { //move items to root
|
||||||
|
if (dragStartNodeData[0].nodeParentPath === '/') {
|
||||||
|
this.setState({isTreeViewDropTipShow: false});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.props.onItemsMove(this.props.currentRepoInfo, '/');
|
||||||
|
this.setState({isTreeViewDropTipShow: false});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.onMoveItems(dragStartNodeData, dropNodeData, this.props.currentRepoInfo, dropNodeData.path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!dropNodeData) {
|
if (!dropNodeData) {
|
||||||
if (nodeParentPath === '/') {
|
if (nodeParentPath === '/') {
|
||||||
this.setState({isTreeViewDropTipShow: false});
|
this.setState({isTreeViewDropTipShow: false});
|
||||||
@@ -119,7 +134,8 @@ class TreeView extends React.Component {
|
|||||||
// copy the dirent to it's child. eg: A/B -> A/B/C
|
// copy the dirent to it's child. eg: A/B -> A/B/C
|
||||||
if (dropNodeData.object.type === 'dir' && nodeDirent.type === 'dir') {
|
if (dropNodeData.object.type === 'dir' && nodeDirent.type === 'dir') {
|
||||||
if (dropNodeData.parentNode.path !== nodeParentPath) {
|
if (dropNodeData.parentNode.path !== nodeParentPath) {
|
||||||
if (dropNodeData.path.indexOf(nodeRootPath) !== -1) {
|
let paths = Utils.getPaths(dropNodeData.path);
|
||||||
|
if (paths.includes(nodeRootPath)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -128,6 +144,39 @@ class TreeView extends React.Component {
|
|||||||
this.onItemMove(this.props.currentRepoInfo, nodeDirent, dropNodeData.path, nodeParentPath);
|
this.onItemMove(this.props.currentRepoInfo, nodeDirent, dropNodeData.path, nodeParentPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onMoveItems = (dragStartNodeData, dropNodeData, destRepo, destDirentPath) => {
|
||||||
|
let direntPaths = [];
|
||||||
|
let paths = Utils.getPaths(destDirentPath);
|
||||||
|
dragStartNodeData.forEach(dirent => {
|
||||||
|
let path = dirent.nodeRootPath;
|
||||||
|
direntPaths.push(path);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dropNodeData.object.type !== 'dir') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// move dirents to one of them. eg: A/B, A/C -> A/B
|
||||||
|
if (direntPaths.some(direntPath => { return direntPath === destDirentPath;})) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// move dirents to current path
|
||||||
|
if (dragStartNodeData[0].nodeParentPath && dragStartNodeData[0].nodeParentPath === dropNodeData.path ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// move dirents to one of their child. eg: A/B, A/D -> A/B/C
|
||||||
|
let isChildPath = direntPaths.some(direntPath => {
|
||||||
|
return paths.includes(direntPath);
|
||||||
|
});
|
||||||
|
if (isChildPath) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.props.onItemsMove(destRepo, destDirentPath);
|
||||||
|
}
|
||||||
|
|
||||||
freezeItem = () => {
|
freezeItem = () => {
|
||||||
this.setState({isItemFreezed: true});
|
this.setState({isItemFreezed: true});
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user