diff --git a/core/core-frontend/src/utils/treeDraggble.ts b/core/core-frontend/src/utils/treeDraggble.ts new file mode 100644 index 0000000000..20d1ec45ae --- /dev/null +++ b/core/core-frontend/src/utils/treeDraggble.ts @@ -0,0 +1,81 @@ +const treeDraggble = (state, key, req, type) => { + let dragNodeParentId = '' + let dragNodeId = '' + let dragNodeIndex = 0 + + const dfsTreeNode = (arr, parentId) => { + arr.forEach((element, index) => { + if (element.id === dragNodeId) { + dragNodeIndex = index + dragNodeParentId = parentId + } + if (element.children?.length) { + dfsTreeNode(element.children, element.id) + } + }) + } + + const dfsTreeNodeBack = (arr, parentId, params) => { + arr.forEach(element => { + if (element.id === params.id) { + params.pid = parentId + } + if (element.children?.length) { + dfsTreeNodeBack(element.children, element.id, params) + } + }) + } + + const dfsTreeNodeReset = (arr, node) => { + arr.forEach(element => { + if (element.id === dragNodeParentId) { + element.children.splice(dragNodeIndex, 0, node) + } + if (element.children?.length) { + dfsTreeNodeReset(element.children, node) + } + }) + } + + const handleDragStart = node => { + dragNodeId = node.data.id + dfsTreeNode(state[key], '0') + } + + const allowDrop = (_, dropNode) => { + return !dropNode.data?.leaf + } + + const handleDrop = (draggingNode, dropNode, dropType) => { + const params = { + id: draggingNode.data?.id, + name: draggingNode.data?.name, + nodeType: draggingNode.data?.leaf ? type : 'folder', + pid: '0', + action: 'move' + } + + if (dropType === 'inner') { + params.pid = dropNode.data?.id + } else { + dfsTreeNodeBack(state[key], '0', params) + } + + req(params).catch(() => { + if (dragNodeParentId === '0') { + state[key].splice(dragNodeIndex, 0, draggingNode.data) + return + } + + dfsTreeNodeReset(state[key], draggingNode.data) + }) + } + + return { + handleDrop, + allowDrop, + handleDragStart + } +} + +export { treeDraggble } diff --git a/core/core-frontend/src/utils/treeDraggbleChart.ts b/core/core-frontend/src/utils/treeDraggbleChart.ts new file mode 100644 index 0000000000..90d727e966 --- /dev/null +++ b/core/core-frontend/src/utils/treeDraggbleChart.ts @@ -0,0 +1,90 @@ +import { dvNameCheck, moveResource } from '@/api/visualization/dataVisualization' +const treeDraggbleChart = (state, key, type) => { + let dragNodeParentId = '' + let dragNodeId = '' + let dragNodeIndex = 0 + + const dfsTreeNode = (arr, parentId) => { + arr.forEach((element, index) => { + if (element.id === dragNodeId) { + dragNodeIndex = index + dragNodeParentId = parentId + } + if (element.children?.length) { + dfsTreeNode(element.children, element.id) + } + }) + } + + const dfsTreeNodeBack = (arr, parentId, params) => { + arr.forEach(element => { + if (element.id === params.id) { + params.pid = parentId + } + if (element.children?.length) { + dfsTreeNodeBack(element.children, element.id, params) + } + }) + } + + const dfsTreeNodeReset = (arr, node) => { + arr.forEach(element => { + if (element.id === dragNodeParentId) { + element.children.splice(dragNodeIndex, 0, node) + } + if (element.children?.length) { + dfsTreeNodeReset(element.children, node) + } + }) + } + + const handleDragStart = node => { + dragNodeId = node.data.id + dfsTreeNode(state[key], '0') + } + + const allowDrop = (_, dropNode) => { + return !dropNode.data?.leaf + } + + const handleDrop = async (draggingNode, dropNode, dropType) => { + const params = { + id: draggingNode.data?.id, + name: draggingNode.data?.name, + nodeType: draggingNode.data?.leaf ? 'leaf' : 'folder', + pid: '0', + opt: 'move', + type + } + + try { + await dvNameCheck(params) + } catch (error) { + console.error(error) + } + delete params.opt + + if (dropType === 'inner') { + params.pid = dropNode.data?.id + } else { + dfsTreeNodeBack(state[key], '0', params) + } + + moveResource(params).catch(() => { + if (dragNodeParentId === '0') { + state[key].splice(dragNodeIndex, 0, draggingNode.data) + return + } + + dfsTreeNodeReset(state[key], draggingNode.data) + }) + } + + return { + handleDrop, + allowDrop, + handleDragStart + } +} + +export { treeDraggbleChart } diff --git a/core/core-frontend/src/views/common/DeResourceTree.vue b/core/core-frontend/src/views/common/DeResourceTree.vue index 69e122cfdb..3a0a0d98b0 100644 --- a/core/core-frontend/src/views/common/DeResourceTree.vue +++ b/core/core-frontend/src/views/common/DeResourceTree.vue @@ -4,6 +4,7 @@ import icon_add_outlined from '@/assets/svg/icon_add_outlined.svg' import dvCopyDark from '@/assets/svg/dv-copy-dark.svg' import dvDelete from '@/assets/svg/dv-delete.svg' import dvMove from '@/assets/svg/dv-move.svg' +import { treeDraggbleChart } from '@/utils/treeDraggbleChart' import dvRename from '@/assets/svg/dv-rename.svg' import dvDashboardSpine from '@/assets/svg/dv-dashboard-spine.svg' import dvScreenSpine from '@/assets/svg/dv-screen-spine.svg' @@ -153,7 +154,11 @@ const resourceTypeList = computed(() => { ] return list }) - +const { handleDrop, allowDrop, handleDragStart } = treeDraggbleChart( + state, + 'resourceTree', + curCanvasType.value +) const menuList = computed(() => { const list = [ { @@ -640,6 +645,10 @@ defineExpose({ @node-expand="nodeExpand" @node-collapse="nodeCollapse" @node-click="nodeClick" + @node-drag-start="handleDragStart" + :allow-drop="allowDrop" + @node-drop="handleDrop" + draggable >