|
|
@@ -9,18 +9,20 @@
|
|
|
<el-tree
|
|
|
ref="hierarchyTreeRef"
|
|
|
style="max-width: 600px"
|
|
|
- default-expand-all
|
|
|
node-key="id"
|
|
|
draggable
|
|
|
:allow-drag="allowDrag"
|
|
|
:allow-drop="allowDrop"
|
|
|
:height="treeHeight"
|
|
|
+ :default-expanded-keys="expandedNodeKeys"
|
|
|
:highlight-current="false"
|
|
|
:data="hierarchyTreeData"
|
|
|
:props="{ label: 'name', children: 'children' }"
|
|
|
:filter-node-method="filterNode"
|
|
|
@node-click="handleNodeClick"
|
|
|
@node-drop="handleNodeDrop"
|
|
|
+ @node-expand="handleNodeExpand"
|
|
|
+ @node-collapse="handleNodeCollapse"
|
|
|
>
|
|
|
<template #default="{ node, data }">
|
|
|
<ScreenTreeItem
|
|
|
@@ -71,6 +73,8 @@ const projectStore = useProjectStore()
|
|
|
const search = ref('')
|
|
|
const hierarchyTreeRef = ref<TreeInstance | null>(null)
|
|
|
const treeBoxRef = ref<HTMLDivElement | null>(null)
|
|
|
+const expandedNodeKeySet = ref(new Set<string>())
|
|
|
+const hasInitializedExpandedKeys = ref(false)
|
|
|
|
|
|
const { height } = useElementSize(treeBoxRef, {
|
|
|
height: 100,
|
|
|
@@ -125,6 +129,58 @@ const hierarchyTreeData = computed<HierarchyNodeData[]>(() => {
|
|
|
)
|
|
|
})
|
|
|
|
|
|
+const collectNodeKeys = (nodes: HierarchyNodeData[]) => {
|
|
|
+ const keys: string[] = []
|
|
|
+
|
|
|
+ const walk = (items: HierarchyNodeData[]) => {
|
|
|
+ items.forEach((item) => {
|
|
|
+ keys.push(item.id)
|
|
|
+ walk(item.children || [])
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ walk(nodes)
|
|
|
+
|
|
|
+ return keys
|
|
|
+}
|
|
|
+
|
|
|
+const collectCurrentAndDescendantNodeKeys = (node: HierarchyNodeData) => {
|
|
|
+ return collectNodeKeys([node])
|
|
|
+}
|
|
|
+
|
|
|
+const expandedNodeKeys = computed(() => [...expandedNodeKeySet.value])
|
|
|
+
|
|
|
+watch(
|
|
|
+ hierarchyTreeData,
|
|
|
+ (nodes) => {
|
|
|
+ const nodeKeys = collectNodeKeys(nodes)
|
|
|
+
|
|
|
+ if (!hasInitializedExpandedKeys.value) {
|
|
|
+ expandedNodeKeySet.value = new Set(nodeKeys)
|
|
|
+ hasInitializedExpandedKeys.value = true
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const existingKeys = new Set(nodeKeys)
|
|
|
+ expandedNodeKeySet.value = new Set(
|
|
|
+ [...expandedNodeKeySet.value].filter((key) => existingKeys.has(key))
|
|
|
+ )
|
|
|
+ },
|
|
|
+ {
|
|
|
+ immediate: true
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+const handleNodeExpand = (nodeData: HierarchyNodeData) => {
|
|
|
+ expandedNodeKeySet.value = new Set(expandedNodeKeySet.value).add(nodeData.id)
|
|
|
+}
|
|
|
+
|
|
|
+const handleNodeCollapse = (nodeData: HierarchyNodeData) => {
|
|
|
+ const next = new Set(expandedNodeKeySet.value)
|
|
|
+ collectCurrentAndDescendantNodeKeys(nodeData).forEach((key) => next.delete(key))
|
|
|
+ expandedNodeKeySet.value = next
|
|
|
+}
|
|
|
+
|
|
|
const setOpenedPage = (screenId?: string, pageId?: string) => {
|
|
|
if (!screenId || !pageId) return
|
|
|
|