From 741140fa71819ad6e01b139a295c362e63c3bf31 Mon Sep 17 00:00:00 2001 From: roymondchen Date: Fri, 8 Dec 2023 17:20:43 +0800 Subject: [PATCH] =?UTF-8?q?refactor(editor):=20=E4=BB=A3=E7=A0=81=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E3=80=81=E6=95=B0=E6=8D=AE=E6=BA=90=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/editor/src/Editor.vue | 4 + packages/editor/src/components/Tree.vue | 5 + packages/editor/src/components/TreeNode.vue | 8 +- .../sidebar/layer => hooks}/use-filter.ts | 20 +-- packages/editor/src/hooks/use-node-status.ts | 48 +++++++ .../editor/src/layouts/sidebar/Sidebar.vue | 5 + .../sidebar/code-block/CodeBlockList.vue | 120 ++++++++--------- .../sidebar/code-block/CodeBlockListPanel.vue | 3 +- .../sidebar/data-source/DataSourceList.vue | 122 +++++++++--------- .../data-source/DataSourceListPanel.vue | 2 +- .../src/layouts/sidebar/layer/LayerPanel.vue | 17 ++- .../layouts/workspace/viewer/NodeListMenu.vue | 7 +- packages/editor/src/theme/dep-list.scss | 59 --------- packages/editor/src/theme/layer-panel.scss | 19 +++ packages/editor/src/theme/theme.scss | 1 - packages/editor/src/theme/tree.scss | 13 +- packages/editor/src/type.ts | 4 +- 17 files changed, 245 insertions(+), 212 deletions(-) rename packages/editor/src/{layouts/sidebar/layer => hooks}/use-filter.ts (69%) create mode 100644 packages/editor/src/hooks/use-node-status.ts delete mode 100644 packages/editor/src/theme/dep-list.scss diff --git a/packages/editor/src/Editor.vue b/packages/editor/src/Editor.vue index 9e6800b4..aa5a2bd6 100644 --- a/packages/editor/src/Editor.vue +++ b/packages/editor/src/Editor.vue @@ -25,6 +25,10 @@ + + diff --git a/packages/editor/src/components/Tree.vue b/packages/editor/src/components/Tree.vue index e7f488a0..bfad5f02 100644 --- a/packages/editor/src/components/Tree.vue +++ b/packages/editor/src/components/Tree.vue @@ -6,6 +6,10 @@ + + @@ -28,6 +32,7 @@ import TreeNode from './TreeNode.vue'; defineSlots<{ 'tree-node-content'(props: { data: TreeNodeData }): any; + 'tree-node-label'(props: { data: TreeNodeData }): any; 'tree-node-tool'(props: { data: TreeNodeData }): any; }>(); diff --git a/packages/editor/src/components/TreeNode.vue b/packages/editor/src/components/TreeNode.vue index ce662f04..95e50152 100644 --- a/packages/editor/src/components/TreeNode.vue +++ b/packages/editor/src/components/TreeNode.vue @@ -25,7 +25,9 @@
-
{{ `${data.name} (${data.id})` }}
+
+ {{ `${data.name} (${data.id})` }} +
@@ -44,6 +46,9 @@ + @@ -63,6 +68,7 @@ import type { LayerNodeStatus, TreeNodeData } from '@editor/type'; import { updateStatus } from '@editor/utils/tree'; defineSlots<{ + 'tree-node-label'(props: { data: TreeNodeData }): any; 'tree-node-tool'(props: { data: TreeNodeData }): any; 'tree-node-content'(props: { data: TreeNodeData }): any; }>(); diff --git a/packages/editor/src/layouts/sidebar/layer/use-filter.ts b/packages/editor/src/hooks/use-filter.ts similarity index 69% rename from packages/editor/src/layouts/sidebar/layer/use-filter.ts rename to packages/editor/src/hooks/use-filter.ts index 60680f81..e4f0f2e3 100644 --- a/packages/editor/src/layouts/sidebar/layer/use-filter.ts +++ b/packages/editor/src/hooks/use-filter.ts @@ -1,18 +1,16 @@ -import { computed, type ComputedRef, ref } from 'vue'; +import { type Ref, ref } from 'vue'; -import { Id, MNode } from '@tmagic/schema'; +import type { Id, MNode } from '@tmagic/schema'; -import { LayerNodeStatus, Services } from '@editor/type'; +import type { LayerNodeStatus, TreeNodeData } from '@editor/type'; import { traverseNode } from '@editor/utils'; import { updateStatus } from '@editor/utils/tree'; export const useFilter = ( - services: Services | undefined, - nodeStatusMap: ComputedRef | undefined>, + nodeData: Ref, + nodeStatusMap: Ref | undefined>, filterNodeMethod: (value: string, data: MNode) => boolean, ) => { - const page = computed(() => services?.editorService.get('page')); - // tree方法:对树节点进行筛选时执行的方法 const filterIsMatch = (value: string | string[], data: MNode): boolean => { const string = !Array.isArray(value) ? [value] : value; @@ -25,18 +23,14 @@ export const useFilter = ( }; const filter = (text: string | string[]) => { - if (!page.value?.items?.length) return; + if (!nodeData.value.length) return; - page.value.items.forEach((node) => { + nodeData.value.forEach((node) => { traverseNode(node, (node: MNode, parents: MNode[]) => { if (!nodeStatusMap.value) return; const visible = filterIsMatch(text, node); if (visible && parents.length) { - console.log( - node.id, - parents.map((a) => a.id), - ); parents.forEach((parent) => { updateStatus(nodeStatusMap.value!, parent.id, { visible, diff --git a/packages/editor/src/hooks/use-node-status.ts b/packages/editor/src/hooks/use-node-status.ts new file mode 100644 index 00000000..df9880f4 --- /dev/null +++ b/packages/editor/src/hooks/use-node-status.ts @@ -0,0 +1,48 @@ +import { ComputedRef, ref, watch } from 'vue'; + +import type { Id, MNode } from '@tmagic/schema'; + +import { LayerNodeStatus, TreeNodeData } from '@editor/type'; +import { traverseNode } from '@editor/utils'; + +const createPageNodeStatus = (nodeData: TreeNodeData[], initalLayerNodeStatus?: Map) => { + const map = new Map(); + + nodeData.forEach((node: MNode) => + traverseNode(node, (node) => { + map.set( + node.id, + initalLayerNodeStatus?.get(node.id) || { + visible: true, + expand: false, + selected: false, + draggable: false, + }, + ); + }), + ); + + return map; +}; + +export const useNodeStatus = (nodeData: ComputedRef) => { + /** 所有页面的节点状态 */ + const nodeStatusMap = ref(new Map()); + + // 切换页面或者新增页面,重新生成节点状态 + watch( + nodeData, + (nodeData) => { + // 生成节点状态 + nodeStatusMap.value = createPageNodeStatus(nodeData, nodeStatusMap.value); + }, + { + immediate: true, + deep: true, + }, + ); + + return { + nodeStatusMap, + }; +}; diff --git a/packages/editor/src/layouts/sidebar/Sidebar.vue b/packages/editor/src/layouts/sidebar/Sidebar.vue index 812c1569..cefec9f0 100644 --- a/packages/editor/src/layouts/sidebar/Sidebar.vue +++ b/packages/editor/src/layouts/sidebar/Sidebar.vue @@ -74,6 +74,11 @@ + +