diff --git a/packages/editor/src/initService.ts b/packages/editor/src/initService.ts index 19fddd3b..788383c5 100644 --- a/packages/editor/src/initService.ts +++ b/packages/editor/src/initService.ts @@ -11,11 +11,12 @@ import { Target, } from '@tmagic/dep'; import type { CodeBlockContent, DataSourceSchema, Id, MApp, MNode, MPage, MPageFragment } from '@tmagic/schema'; -import { getNodes, isPage } from '@tmagic/utils'; +import { isPage } from '@tmagic/utils'; import PropsPanel from './layouts/PropsPanel.vue'; import { EditorProps } from './editorProps'; import { Services } from './type'; +import { traverseNode } from './utils'; export declare type LooseRequired = { [P in string & keyof T]: T[P]; @@ -204,38 +205,6 @@ export const initServiceEvents = ( } }; - const updateNodeWhenDataSourceChange = (nodes: MNode[]) => { - const root = editorService.get('root'); - const stage = editorService.get('stage'); - - if (!root || !stage) return; - - const app = getApp(); - - if (!app) return; - - if (app.dsl) { - app.dsl.dataSourceDeps = root.dataSourceDeps; - app.dsl.dataSourceCondDeps = root.dataSourceCondDeps; - app.dsl.dataSources = root.dataSources; - } - - updateDataSourceSchema(); - - nodes.forEach((node) => { - const deps = Object.values(root.dataSourceDeps || {}); - deps.forEach((dep) => { - if (dep[node.id]) { - stage.update({ - config: cloneDeep(node), - parentId: editorService.getParentById(node.id)?.id, - root: cloneDeep(root), - }); - } - }); - }); - }; - const targetAddHandler = (target: Target) => { const root = editorService.get('root'); if (!root) return; @@ -267,8 +236,50 @@ export const initServiceEvents = ( } }; - const collectedHandler = (nodes: MNode[]) => { - updateNodeWhenDataSourceChange(nodes); + const collectedHandler = (nodes: MNode[], deep: boolean) => { + const root = editorService.get('root'); + const stage = editorService.get('stage'); + + if (!root || !stage) return; + + const app = getApp(); + + if (!app) return; + + if (app.dsl) { + app.dsl.dataSourceDeps = root.dataSourceDeps; + app.dsl.dataSourceCondDeps = root.dataSourceCondDeps; + app.dsl.dataSources = root.dataSources; + } + + updateDataSourceSchema(); + + const allNodes: MNode[] = []; + + if (deep) { + nodes.forEach((node) => { + traverseNode(node, (node) => { + if (!allNodes.includes(node)) { + allNodes.push(node); + } + }); + }); + } else { + allNodes.push(...nodes); + } + + const deps = Object.values(root.dataSourceDeps || {}); + deps.forEach((dep) => { + Object.keys(dep).forEach((id) => { + const node = allNodes.find((node) => node.id === id); + node && + stage.update({ + config: cloneDeep(node), + parentId: editorService.getParentById(node.id)?.id, + root: cloneDeep(root), + }); + }); + }); }; depService.on('add-target', targetAddHandler); @@ -399,12 +410,6 @@ export const initServiceEvents = ( (root?.items || []).forEach((page) => { depService.collectIdle([page], { pageId: page.id }, true); }); - - const targets = depService.getTargets(DepTargetType.DATA_SOURCE); - - const nodes = getNodes(Object.keys(targets[config.id].deps), root?.items); - - updateNodeWhenDataSourceChange(nodes); }; const removeDataSourceTarget = (id: string) => { diff --git a/packages/editor/src/utils/editor.ts b/packages/editor/src/utils/editor.ts index 68763f1a..f2b94782 100644 --- a/packages/editor/src/utils/editor.ts +++ b/packages/editor/src/utils/editor.ts @@ -285,7 +285,7 @@ export const traverseNode = ( ) => { cb(node, parents); - if (node.items?.length) { + if (Array.isArray(node.items) && node.items.length) { parents.push(node); node.items.forEach((item) => { traverseNode(item as T, cb, [...parents]); diff --git a/runtime/vue2/build.vite.config.ts b/runtime/vue2/build.vite.config.ts index b9802c89..c72bc157 100644 --- a/runtime/vue2/build.vite.config.ts +++ b/runtime/vue2/build.vite.config.ts @@ -73,6 +73,13 @@ export default defineConfig(({ mode }) => { sourcemap: true, outDir: path.resolve(process.cwd(), `../../playground/public/runtime/vue2/${mode}`), }, + + resolve: { + alias: [ + { find: /^vue$/, replacement: path.join(__dirname, 'node_modules/vue/dist/vue.esm.js') }, + { find: /^vue-demi$/, replacement: path.join(__dirname, 'node_modules/vue/dist/vue.esm.js') }, + ], + }, }; } diff --git a/runtime/vue2/page/index.html b/runtime/vue2/page/index.html index 221ad39a..62759d74 100644 --- a/runtime/vue2/page/index.html +++ b/runtime/vue2/page/index.html @@ -11,6 +11,8 @@ #app { width: 100%; height: 100%; + margin: 0; + padding: 0 } #app { @@ -23,10 +25,10 @@ display: none; } -
+ diff --git a/runtime/vue2/playground/index.html b/runtime/vue2/playground/index.html index e565f0da..8fa2ba63 100644 --- a/runtime/vue2/playground/index.html +++ b/runtime/vue2/playground/index.html @@ -7,8 +7,6 @@ Vue2 Playground -
+ + diff --git a/runtime/vue3/playground/index.html b/runtime/vue3/playground/index.html index 98c324a3..40cf28c5 100644 --- a/runtime/vue3/playground/index.html +++ b/runtime/vue3/playground/index.html @@ -7,8 +7,6 @@ Vue3 Playground -
- \ No newline at end of file