diff --git a/packages/designer/src/document/document-model.ts b/packages/designer/src/document/document-model.ts index 5e0717e03..679931bc7 100644 --- a/packages/designer/src/document/document-model.ts +++ b/packages/designer/src/document/document-model.ts @@ -15,6 +15,8 @@ import { IPublicApiProject, IPublicModelDropLocation, IPublicEnumTransformStage, + IPublicOnChangeOptions, + EDITOR_EVENT, } from '@alilc/lowcode-types'; import { Project } from '../project'; import { ISimulatorHost } from '../simulator'; @@ -158,6 +160,22 @@ export class DocumentModel implements IDocumentModel { this.inited = true; } + onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): () => void { + this.designer.editor?.eventBus.on(EDITOR_EVENT.NODE_CHILDREN_CHANGE, fn); + + return () => { + this.designer.editor?.eventBus.off(EDITOR_EVENT.NODE_CHILDREN_CHANGE, fn); + }; + } + + onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): () => void { + this.designer.editor?.eventBus.on(EDITOR_EVENT.NODE_VISIBLE_CHANGE, fn); + + return () => { + this.designer.editor?.eventBus.off(EDITOR_EVENT.NODE_VISIBLE_CHANGE, fn); + }; + } + @obx.shallow private willPurgeSpace: Node[] = []; get modalNode() { diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 8840155fe..169dc5cbf 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -16,6 +16,7 @@ import { IPublicModelNode, IPublicModelExclusiveGroup, IPublicEnumTransformStage, + EDITOR_EVENT, } from '@alilc/lowcode-types'; import { compatStage, isDOMText, isJSExpression } from '@alilc/lowcode-utils'; import { SettingTopEntry } from '@alilc/lowcode-designer'; @@ -193,6 +194,13 @@ export class Node this.isInited = true; this.emitter = createModuleEventBus('Node'); + const editor = this.document.designer.editor; + this.onVisibleChange((visible: boolean) => { + editor?.eventBus.emit(EDITOR_EVENT.NODE_VISIBLE_CHANGE, this, visible); + }); + this.onChildrenChange((info?: { type: string; node: Node }) => { + editor?.eventBus.emit(EDITOR_EVENT.NODE_VISIBLE_CHANGE, info); + }); } _settingEntry: SettingTopEntry; diff --git a/packages/designer/tests/document/node/node.add.test.ts b/packages/designer/tests/document/node/node.add.test.ts index a9ca5247c..4f5655db9 100644 --- a/packages/designer/tests/document/node/node.add.test.ts +++ b/packages/designer/tests/document/node/node.add.test.ts @@ -6,7 +6,6 @@ import { Node } from '../../../src/document/node/node'; import { Designer } from '../../../src/designer/designer'; import formSchema from '../../fixtures/schema/form'; import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils'; -import { EBADF } from 'constants'; const mockCreateSettingEntry = jest.fn(); jest.mock('../../../src/designer/designer', () => { diff --git a/packages/designer/tests/document/node/node.dragdrop.test.ts b/packages/designer/tests/document/node/node.dragdrop.test.ts index c15ced2b2..3fe909124 100644 --- a/packages/designer/tests/document/node/node.dragdrop.test.ts +++ b/packages/designer/tests/document/node/node.dragdrop.test.ts @@ -1,8 +1,5 @@ -import set from 'lodash/set'; -import cloneDeep from 'lodash/cloneDeep'; import '../../fixtures/window'; import { Project } from '../../../src/project/project'; -import { Node } from '../../../src/document/node/node'; import { Designer } from '../../../src/designer/designer'; import formSchema from '../../fixtures/schema/form'; import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils'; diff --git a/packages/designer/tests/document/node/node.modify.test.ts b/packages/designer/tests/document/node/node.modify.test.ts index 34db3b238..7aa055ae1 100644 --- a/packages/designer/tests/document/node/node.modify.test.ts +++ b/packages/designer/tests/document/node/node.modify.test.ts @@ -1,8 +1,5 @@ -import set from 'lodash/set'; -import cloneDeep from 'lodash/cloneDeep'; import '../../fixtures/window'; import { Project } from '../../../src/project/project'; -import { Node } from '../../../src/document/node/node'; import { Designer } from '../../../src/designer/designer'; import formSchema from '../../fixtures/schema/form'; import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils'; diff --git a/packages/designer/tests/document/node/node.remove.test.ts b/packages/designer/tests/document/node/node.remove.test.ts index 1adf7dd0b..28bdf914f 100644 --- a/packages/designer/tests/document/node/node.remove.test.ts +++ b/packages/designer/tests/document/node/node.remove.test.ts @@ -2,10 +2,9 @@ import set from 'lodash/set'; import cloneDeep from 'lodash/cloneDeep'; import '../../fixtures/window'; import { Project } from '../../../src/project/project'; -import { Node } from '../../../src/document/node/node'; import { Designer } from '../../../src/designer/designer'; import formSchema from '../../fixtures/schema/form'; -import { getIdsFromSchema, getNodeFromSchemaById } from '../../utils'; +import { getIdsFromSchema } from '../../utils'; const mockCreateSettingEntry = jest.fn(); jest.mock('../../../src/designer/designer', () => { diff --git a/packages/shell/src/api/project.ts b/packages/shell/src/api/project.ts index e97a18334..3ad977584 100644 --- a/packages/shell/src/api/project.ts +++ b/packages/shell/src/api/project.ts @@ -139,7 +139,6 @@ export class Project implements IPublicApiProject { */ importSchema(schema?: IPublicTypeProjectSchema): void { this[projectSymbol].load(schema, true); - // this[editorSymbol].emit(Events.IMPORT_SCHEMA, schema); } /** diff --git a/packages/shell/src/model/document-model.ts b/packages/shell/src/model/document-model.ts index be69b04aa..f771d62ec 100644 --- a/packages/shell/src/model/document-model.ts +++ b/packages/shell/src/model/document-model.ts @@ -288,11 +288,8 @@ export class DocumentModel implements IPublicModelDocumentModel { * @param fn */ onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): void { - // TODO: history 变化时需要重新绑定 - this[documentSymbol].nodesMap?.forEach((node) => { - node.onVisibleChange((flag: boolean) => { - fn(Node.create(node)!, flag); - }); + this[documentSymbol].onChangeNodeVisible((node: IPublicModelNode, visible: boolean) => { + fn(Node.create(node)!, visible); }); } @@ -300,16 +297,14 @@ export class DocumentModel implements IPublicModelDocumentModel { * 当前 document 的节点 children 变更事件 * @param fn */ - onChangeNodeChildren(fn: (info?: IPublicOnChangeOptions) => void): void { - // TODO: history 变化时需要重新绑定 - this[documentSymbol].nodesMap?.forEach((node) => { - node.onChildrenChange((info?: InnerOnChangeOptions) => { - return info - ? fn({ - type: info.type, - node: Node.create(node)!, - }) - : fn(); + onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): void { + this[documentSymbol].onChangeNodeChildren((info?: IPublicOnChangeOptions) => { + if (!info) { + return; + } + fn({ + type: info.type, + node: Node.create(info.node)!, }); }); } diff --git a/packages/types/src/editor.ts b/packages/types/src/editor.ts index 72dcb9f31..1334f4439 100644 --- a/packages/types/src/editor.ts +++ b/packages/types/src/editor.ts @@ -173,3 +173,9 @@ export interface PluginStatus { export interface PluginStatusSet { [key: string]: PluginStatus; } + +export enum EDITOR_EVENT { + NODE_CHILDREN_CHANGE = 'node.children.change', + + NODE_VISIBLE_CHANGE = 'node.visible.change', +} \ No newline at end of file diff --git a/packages/types/src/shell/model/document-model.ts b/packages/types/src/shell/model/document-model.ts index 7383fda2a..48ad9cbd3 100644 --- a/packages/types/src/shell/model/document-model.ts +++ b/packages/types/src/shell/model/document-model.ts @@ -2,6 +2,7 @@ import { IPublicTypeRootSchema, IPublicTypeDragNodeDataObject, IPublicTypeDragNo import { IPublicEnumTransformStage } from '../enum'; import { IPublicApiProject } from '../api'; import { IPublicModelDropLocation, IPublicModelDetecting, IPublicModelNode, IPublicModelSelection, IPublicModelHistory, IPublicModelModalNodesManager } from './'; +import { IPublicOnChangeOptions } from '@alilc/lowcode-types'; export interface IPublicModelDocumentModel { @@ -168,6 +169,12 @@ export interface IPublicModelDocumentModel { onChangeNodeVisible(fn: (node: IPublicModelNode, visible: boolean) => void): void; + /** + * 当前 document 的节点 children 变更事件 + * @param fn + */ + onChangeNodeChildren(fn: (info: IPublicOnChangeOptions) => void): void; + /** * 当前 document 节点属性修改事件 * @param fn