From 2e3f60d86c780b7dc4c3fa4fa4bef2f185733766 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B9=BD=E5=9F=8E?= Date: Sun, 3 May 2020 21:02:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/setting/setting-prop-entry.ts | 34 +++++++++++++++---- packages/designer/src/document/node/node.ts | 33 ++++++++++++++---- packages/types/src/index.ts | 1 + packages/types/src/node.ts | 5 +++ 4 files changed, 60 insertions(+), 13 deletions(-) create mode 100644 packages/types/src/node.ts diff --git a/packages/designer/src/designer/setting/setting-prop-entry.ts b/packages/designer/src/designer/setting/setting-prop-entry.ts index 7a4913e69..a231eaf2b 100644 --- a/packages/designer/src/designer/setting/setting-prop-entry.ts +++ b/packages/designer/src/designer/setting/setting-prop-entry.ts @@ -1,10 +1,11 @@ -import { obx, computed } from '@ali/lowcode-editor-core'; +import { obx, computed, autorun } from '@ali/lowcode-editor-core'; import { IEditor, isJSExpression } from '@ali/lowcode-types'; import { uniqueId } from '@ali/lowcode-utils'; import { SettingEntry } from './setting-entry'; import { Node } from '../../document'; import { ComponentMeta } from '../../component-meta'; import { Designer } from '../designer'; +import { EventEmitter } from 'events'; export class SettingPropEntry implements SettingEntry { // === static properties === @@ -20,6 +21,8 @@ export class SettingPropEntry implements SettingEntry { readonly type: 'field' | 'group'; readonly id = uniqueId('entry'); + readonly emitter = new EventEmitter(); + // ==== dynamic properties ==== @obx.ref private _name: string | number; get name() { @@ -59,6 +62,14 @@ export class SettingPropEntry implements SettingEntry { this.isSingle = parent.isSingle; this.designer = parent.designer; this.top = parent.top; + + autorun(({ firstRun }) => { + const value = this.getValue(); + if (firstRun) { + return; + } + this.emitter.emit('valuechange', value); + }); } getId() { @@ -88,7 +99,7 @@ export class SettingPropEntry implements SettingEntry { const propName = this.path.join('.'); let l = this.nodes.length; while (l-- > 1) { - this.nodes[l].getProp(propName)?.remove() + this.nodes[l].getProp(propName)?.remove(); } } @@ -117,7 +128,6 @@ export class SettingPropEntry implements SettingEntry { if (setValue) { setValue(this, val); } - // TODO: emit value change } /** @@ -170,9 +180,21 @@ export class SettingPropEntry implements SettingEntry { return this.top; } - onValueChange() { - // TODO: - return () => {}; + onValueChange(func: () => any) { + this.emitter.on('valuechange', func); + + return () => { + this.emitter.removeListener('valuechange', func); + }; + } + + /** + * @deprecated + */ + valueChange() { + console.warn('valueChange deprecated'); + + this.emitter.emit('valuechange'); } getDefaultValue() { diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index cd4d1db5b..1406ce2fe 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -10,6 +10,7 @@ import { SlotSchema, PageSchema, ComponentSchema, + NodeStatus, } from '@ali/lowcode-types'; import { Props, EXTRA_KEY_PREFIX } from './props/props'; import { DocumentModel } from '../document-model'; @@ -483,7 +484,7 @@ export class Node { } const { props = {}, extras } = this.props.export(stage) || {}; - const _extras_: {[key: string]: any} = { + const _extras_: { [key: string]: any } = { ...extras, }; if (_extras_) { @@ -597,16 +598,34 @@ export class Node { this.children?.mergeChildren(remover, adder, sorter); } + @obx.val status: NodeStatus = { + inPlaceEditing: false, + locking: false, + pseudo: false, + }; + /** * @deprecated */ - getStatus() { - return 'default'; + getStatus(field?: keyof NodeStatus) { + if (field && this.status[field] != null) { + return this.status[field]; + } + + return this.status; } /** * @deprecated */ - setStatus() {} + setStatus(field: keyof NodeStatus, flag: boolean) { + if (!this.status.hasOwnProperty(field)) { + return; + } + + if (flag !== this.status[field]) { + this.status[field] = flag; + } + } /** * @deprecated */ @@ -666,9 +685,9 @@ export interface LeafNode extends Node { readonly children: null; } -export interface SlotNode extends ParentalNode {} -export interface PageNode extends ParentalNode {} -export interface ComponentNode extends ParentalNode {} +export type SlotNode = ParentalNode; +export type PageNode = ParentalNode; +export type ComponentNode = ParentalNode; export type RootNode = PageNode | ComponentNode; export function isNode(node: any): node is Node { diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 31aa669f3..4129097f2 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -13,3 +13,4 @@ export * from './utils'; export * from './value-type'; export * from './setter-config'; export * from './setting-target'; +export * from './node'; diff --git a/packages/types/src/node.ts b/packages/types/src/node.ts new file mode 100644 index 000000000..400f6d987 --- /dev/null +++ b/packages/types/src/node.ts @@ -0,0 +1,5 @@ +export interface NodeStatus { + locking: boolean; + pseudo: boolean; + inPlaceEditing: boolean; +}