From d666317d860eb2db945ff073deefbece9423bd71 Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Thu, 16 Jul 2020 19:28:44 +0800 Subject: [PATCH 01/13] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=20variable=20?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E6=95=B0=E6=8D=AE=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/editor-preset-vision/src/editor.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/editor-preset-vision/src/editor.ts b/packages/editor-preset-vision/src/editor.ts index 22c44174e..0bf3c4627 100644 --- a/packages/editor-preset-vision/src/editor.ts +++ b/packages/editor-preset-vision/src/editor.ts @@ -151,6 +151,14 @@ function compatiableReducer(props: any) { }, } } + // 为了能降级到老版本,建议在后期版本去掉以下代码 + if (isJSExpression(val)) { + val = { + type: 'variable', + value: val.mock, + variable: val.value, + } + } newProps[key] = val; }); return newProps; From ef71632dc097ba340d31b1c54c99e276225a520a Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Thu, 16 Jul 2020 19:31:49 +0800 Subject: [PATCH 02/13] =?UTF-8?q?fix:=20=E4=BD=8E=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E4=BF=AE=E6=94=B9=E4=B9=8B=E5=90=8E=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/designer/designer.ts | 7 +++++-- packages/designer/src/project/project.ts | 2 +- packages/react-simulator-renderer/src/renderer.ts | 10 +++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/designer/src/designer/designer.ts b/packages/designer/src/designer/designer.ts index 3b09b1b3f..3562a9219 100644 --- a/packages/designer/src/designer/designer.ts +++ b/packages/designer/src/designer/designer.ts @@ -386,6 +386,8 @@ export class Designer { let meta = this._componentMetasMap.get(key); if (meta) { meta.setMetadata(data); + + this._componentMetasMap.set(key, meta); } else { meta = this._lostComponentMetasMap.get(key); @@ -426,10 +428,11 @@ export class Designer { @computed get componentsMap(): { [key: string]: NpmInfo | Component } { const maps: any = {}; - this._componentMetasMap.forEach((config, key) => { + const designer = this; + designer._componentMetasMap.forEach((config, key) => { const metaData = config.getMetadata(); if (metaData.devMode === 'lowcode') { - maps[key] = this.currentDocument?.simulator?.createComponent(metaData.schema!); + maps[key] = metaData.schema; } else { const view = metaData.experimental?.view; if (view) { diff --git a/packages/designer/src/project/project.ts b/packages/designer/src/project/project.ts index e010c5476..2480ded99 100644 --- a/packages/designer/src/project/project.ts +++ b/packages/designer/src/project/project.ts @@ -102,7 +102,7 @@ export class Project { | string, ): any {} - open(doc?: string | DocumentModel | RootSchema): void { + open(doc?: string | DocumentModel | RootSchema): DocumentModel { if (!doc) { const got = this.documents.find((item) => item.isBlank()); if (got) { diff --git a/packages/react-simulator-renderer/src/renderer.ts b/packages/react-simulator-renderer/src/renderer.ts index dd578ce4b..b24dc60a1 100644 --- a/packages/react-simulator-renderer/src/renderer.ts +++ b/packages/react-simulator-renderer/src/renderer.ts @@ -74,7 +74,7 @@ export class SimulatorRenderer implements BuiltinSimulatorRenderer { } private _libraryMap: { [key: string]: string } = {}; private buildComponents() { - this._components = buildComponents(this._libraryMap, this._componentsMap); + this._components = buildComponents(this._libraryMap, this._componentsMap, this.createComponent.bind(this)); } @obx.ref private _components: any = {}; @computed get components(): object { @@ -386,13 +386,17 @@ const builtinComponents = { Leaf, }; -function buildComponents(libraryMap: LibraryMap, componentsMap: { [componentName: string]: NpmInfo | ComponentType }) { +function buildComponents(libraryMap: LibraryMap, + componentsMap: { [componentName: string]: NpmInfo | ComponentType }, + createComponent: (schema: ComponentSchema) => Component | null) { const components: any = { ...builtinComponents }; Object.keys(componentsMap).forEach((componentName) => { let component = componentsMap[componentName]; - if (isReactComponent(component)) { + if (component && component.componentName === 'Component') { + components[componentName] = createComponent(component); + } else if (isReactComponent(component)) { components[componentName] = component; } else { component = findComponent(libraryMap, componentName, component); From 1c0b50869d94c8f3e2b1801fa3a3af15e783b4db Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Fri, 17 Jul 2020 12:13:28 +0800 Subject: [PATCH 03/13] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=20Block=20=E5=AE=B9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react-renderer/src/engine/blockEngine.jsx | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/react-renderer/src/engine/blockEngine.jsx b/packages/react-renderer/src/engine/blockEngine.jsx index 9712ef3ea..1485b3e64 100644 --- a/packages/react-renderer/src/engine/blockEngine.jsx +++ b/packages/react-renderer/src/engine/blockEngine.jsx @@ -59,7 +59,7 @@ export default class BlockEngine extends BaseEngine { } render() { - const { __schema } = this.props; + const { __schema, __components } = this.props; if (!isSchema(__schema, true) || (__schema.componentName !== 'Block' && __schema.componentName !== 'Div')) { return '区块schema结构异常!'; @@ -69,7 +69,33 @@ export default class BlockEngine extends BaseEngine { this.__generateCtx(); this.__render(); - const { id, className, style, autoLoading, defaultHeight = 300, loading } = this.__parseData(__schema.props); + const props = this.__parseData(__schema.props); + const { id, className, style, autoLoading, defaultHeight = 300, loading } = props; + + const { Block } = __components; + if (Block) { + const { engine } = this.context || {}; + return ( + + {engine.createElement( + Block, + { + ...props, + ref: this.__getRef, + className: classnames(getFileCssName(__schema.fileName), className, this.props.className), + __id: __schema.id, + }, + this.__createDom(), + )} + + ); + } + const renderContent = () => ( Date: Fri, 17 Jul 2020 14:05:52 +0800 Subject: [PATCH 04/13] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E9=9D=A2=E6=9D=BF=E8=AF=A6=E6=83=85=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E4=B8=8D=E4=BA=86=E7=9A=84=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/editor-preset-vision/src/bundle/prototype.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/editor-preset-vision/src/bundle/prototype.ts b/packages/editor-preset-vision/src/bundle/prototype.ts index 86a9a0c92..04c0e47b0 100644 --- a/packages/editor-preset-vision/src/bundle/prototype.ts +++ b/packages/editor-preset-vision/src/bundle/prototype.ts @@ -219,6 +219,9 @@ class Prototype { readonly isPrototype = true; readonly meta: ComponentMeta; readonly options: OldPrototypeConfig | ComponentMetadata; + get packageName() { + return this.meta.npm?.package; + } constructor(input: OldPrototypeConfig | ComponentMetadata | ComponentMeta, lookup: boolean = false) { if (lookup) { @@ -250,7 +253,7 @@ class Prototype { } getPackageName() { - return this.meta.npm?.package; + return this.packageName; } getContextInfo(name: string): any { From caf9915382f2f2dd80d6f7801a36c6ad7e344dda Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Fri, 17 Jul 2020 14:06:31 +0800 Subject: [PATCH 05/13] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E7=9A=84=E7=BB=84=E4=BB=B6=E6=8B=96=E5=85=A5=E7=94=BB?= =?UTF-8?q?=E5=B8=83=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/builtin-simulator/host.ts | 2 +- packages/plugin-outline-pane/src/views/tree-branches.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index d71715cc6..5c9c2ae60 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -826,7 +826,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost ); treeNode.children?.forEach((child, index) => { - const childIsModal = child.node.getPrototype().isModal(); + const childIsModal = child.node.getPrototype()?.isModal() || false; if (isModal != childIsModal) { return; } From f4c07afba35557eea1b5a906b9240d64b40a5dee Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Fri, 17 Jul 2020 14:53:21 +0800 Subject: [PATCH 06/13] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/editor-preset-vision/src/editor.ts | 2 +- packages/types/src/value-type.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/editor-preset-vision/src/editor.ts b/packages/editor-preset-vision/src/editor.ts index 0bf3c4627..45a9938db 100644 --- a/packages/editor-preset-vision/src/editor.ts +++ b/packages/editor-preset-vision/src/editor.ts @@ -152,7 +152,7 @@ function compatiableReducer(props: any) { } } // 为了能降级到老版本,建议在后期版本去掉以下代码 - if (isJSExpression(val)) { + if (isJSExpression(val) && !val.events) { val = { type: 'variable', value: val.mock, diff --git a/packages/types/src/value-type.ts b/packages/types/src/value-type.ts index dd6e48f18..6e5083c0a 100644 --- a/packages/types/src/value-type.ts +++ b/packages/types/src/value-type.ts @@ -11,6 +11,10 @@ export interface JSExpression { * 模拟值 */ mock?: any; + /** + * 额外扩展属性,如 extType、events + */ + [key: string]: any; } export interface JSSlot { From 40d8260afb22f4944bdf99672629c25e87c4930e Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Mon, 20 Jul 2020 10:05:18 +0800 Subject: [PATCH 07/13] feat: support float pane fixed --- packages/editor-skeleton/src/area.ts | 4 + packages/editor-skeleton/src/icons/fix.tsx | 11 ++ packages/editor-skeleton/src/icons/float.tsx | 12 ++ .../src/layouts/left-fixed-pane.tsx | 42 +++++-- .../src/layouts/left-float-pane.tsx | 40 +++++-- .../src/layouts/workbench.less | 111 ++++++++++-------- 6 files changed, 150 insertions(+), 70 deletions(-) create mode 100644 packages/editor-skeleton/src/icons/fix.tsx create mode 100644 packages/editor-skeleton/src/icons/float.tsx diff --git a/packages/editor-skeleton/src/area.ts b/packages/editor-skeleton/src/area.ts index aafbab857..403a93dcf 100644 --- a/packages/editor-skeleton/src/area.ts +++ b/packages/editor-skeleton/src/area.ts @@ -34,6 +34,10 @@ export default class Area + + + ); +} + +IconFix.displayName = 'Fix'; diff --git a/packages/editor-skeleton/src/icons/float.tsx b/packages/editor-skeleton/src/icons/float.tsx new file mode 100644 index 000000000..a6d88109c --- /dev/null +++ b/packages/editor-skeleton/src/icons/float.tsx @@ -0,0 +1,12 @@ +import { SVGIcon, IconProps } from "@ali/lowcode-utils"; + +export function IconFloat(props: IconProps) { + return ( + + + + + ); +} + +IconFloat.displayName = 'Float'; diff --git a/packages/editor-skeleton/src/layouts/left-fixed-pane.tsx b/packages/editor-skeleton/src/layouts/left-fixed-pane.tsx index 1a7359d38..b3d9594a7 100644 --- a/packages/editor-skeleton/src/layouts/left-fixed-pane.tsx +++ b/packages/editor-skeleton/src/layouts/left-fixed-pane.tsx @@ -6,16 +6,31 @@ import Area from '../area'; import { PanelConfig } from '../types'; import Panel from '../widget/panel'; import { Designer } from '@ali/lowcode-designer'; +import { IconFloat } from '../icons/float'; @observer export default class LeftFixedPane extends Component<{ area: Area }> { shouldComponentUpdate() { return false; } + componentDidUpdate() { // FIXME: dirty fix, need deep think this.props.area.skeleton.editor.get(Designer)?.touchOffsetObserver(); } + + // 取消固定 + setFloat() { + const { area } = this.props; + const { current } = area; + if (!current) { + return; + } + area.skeleton.leftFixedArea.remove(current); + area.skeleton.leftFloatArea.add(current); + area.skeleton.leftFloatArea.container.active(current); + } + render() { const { area } = this.props; const hideTitleBar = area.current?.config.props?.hideTitleBar; @@ -26,15 +41,24 @@ export default class LeftFixedPane extends Component<{ area: Area {!hideTitleBar && ( - + + + + )} diff --git a/packages/editor-skeleton/src/layouts/left-float-pane.tsx b/packages/editor-skeleton/src/layouts/left-float-pane.tsx index d904887f7..6d184c5ac 100644 --- a/packages/editor-skeleton/src/layouts/left-float-pane.tsx +++ b/packages/editor-skeleton/src/layouts/left-float-pane.tsx @@ -2,6 +2,7 @@ import { Component, Fragment } from 'react'; import classNames from 'classnames'; import { observer, Focusable, focusTracker } from '@ali/lowcode-editor-core'; import { Button, Icon } from '@alifd/next'; +import { IconFix } from '../icons/fix'; import Area from '../area'; import Panel from '../widget/panel'; @@ -76,6 +77,18 @@ export default class LeftFloatPane extends Component<{ area: Area }> this.dispose?.(); } + // 固定 + setFixed() { + const { area } = this.props; + const { current } = area; + if (!current) { + return; + } + area.skeleton.leftFloatArea.remove(current); + area.skeleton.leftFixedArea.add(current); + area.skeleton.leftFixedArea.container.active(current); + } + render() { const { area } = this.props; const width = area.current?.config.props?.width; @@ -93,15 +106,24 @@ export default class LeftFloatPane extends Component<{ area: Area }> > { !hideTitleBar && ( - + + + + ) } diff --git a/packages/editor-skeleton/src/layouts/workbench.less b/packages/editor-skeleton/src/layouts/workbench.less index 504b1e6ff..f73c6ca52 100644 --- a/packages/editor-skeleton/src/layouts/workbench.less +++ b/packages/editor-skeleton/src/layouts/workbench.less @@ -171,6 +171,65 @@ body { display: flex; min-height: 0; position: relative; + + .lc-tabs-title { + width: 100%; + height: 32px; + position: relative; + display: center; + display: flex; + justify-content: center; + align-items: center; + // background: rgba(31,56,88,0.04); + border-bottom: 1px solid #EDEFF3; + .lc-tab-title{ + flex: 1; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + border-bottom: 2px solid transparent; + cursor: pointer; + font-size: 12px; + &.actived { + color: #0079F2; + border-bottom-color: #0079F2; + } + } + } + + .lc-tabs-content { + position: absolute; + top: 32px; + bottom: 0; + left: 0; + right: 0; + } + + .lc-pane-icon-close { + position: absolute; + right: 16px; + top: 14px; + height: auto; + z-index: 2; + .next-icon{ + line-height: 1; + color: rgba(0,0,0,0.6); + } + } + + .lc-pane-icon-fix, .lc-pane-icon-float{ + position: absolute; + right: 38px; + top: 14px; + height: auto; + z-index: 2; + svg { + vertical-align: middle; + color: rgba(0,0,0,0.6); + } + } + .lc-left-float-pane { position: absolute; top: 0; @@ -186,48 +245,6 @@ body { &.lc-area-visible { display: block; } - .lc-pane-close{ - position: absolute; - right: 16px; - top: 16px; - height: auto; - z-index: 2; - .next-icon{ - line-height: 1; - } - } - .lc-tabs-title { - width: 100%; - height: 32px; - position: relative; - display: center; - display: flex; - justify-content: center; - align-items: center; - // background: rgba(31,56,88,0.04); - border-bottom: 1px solid #EDEFF3; - .lc-tab-title{ - flex: 1; - height: 32px; - display: flex; - align-items: center; - justify-content: center; - border-bottom: 2px solid transparent; - cursor: pointer; - font-size: 12px; - &.actived { - color: #0079F2; - border-bottom-color: #0079F2; - } - } - } - .lc-tabs-content { - position: absolute; - top: 32px; - bottom: 0; - left: 0; - right: 0; - } } .lc-left-area { height: 100%; @@ -289,16 +306,6 @@ body { &.lc-area-visible { display: block; } - .lc-pane-close { - position: absolute; - right: 16px; - top: 16px; - height: auto; - z-index: 2; - .next-icon { - line-height: 1; - } - } } .lc-left-area.lc-area-visible ~ .lc-left-fixed-pane { margin-left: 1px; From 7eeb51cd33b8765fd09e3cdab76988144cc181d5 Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Mon, 20 Jul 2020 11:53:37 +0800 Subject: [PATCH 08/13] feat: support subtreeModified --- .../src/document/node/node-children.ts | 18 ++++++++++++++++++ packages/designer/src/document/node/node.ts | 8 ++++++++ .../src/bundle/upgrade-metadata.ts | 5 +---- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/designer/src/document/node/node-children.ts b/packages/designer/src/document/node/node-children.ts index 1553a54f3..aeb306a9b 100644 --- a/packages/designer/src/document/node/node-children.ts +++ b/packages/designer/src/document/node/node-children.ts @@ -79,6 +79,10 @@ export class NodeChildren { return this.size > 0; } + @computed length() { + return this.children.length; + } + /** * 删除一个节点 */ @@ -94,6 +98,7 @@ export class NodeChildren { deleted.purge(); } this.emitter.emit('change'); + this.reportModified(node, this.owner, {type: 'remove', removeIndex: i, removeNode: node}); return false; } @@ -290,4 +295,17 @@ export class NodeChildren { // 保证向前兼容性 return "Array"; } + + private reportModified(node: Node, owner: Node, options = {}) { + if (!node) { return; } + if (node.isRoot()) { return; } + const callbacks = owner.componentMeta.getMetadata().experimental?.callbacks; + if (callbacks?.onSubtreeModified) { + callbacks?.onSubtreeModified.call(node, owner, options); + } + + if (owner.parent && !owner.parent.isRoot()) { + this.reportModified(node, owner.parent, options); + } + } } diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 8152afab0..e2673169b 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -631,6 +631,14 @@ export class Node { this._slots.push(slotNode); } + /** + * 删除一个节点 + * @param node + */ + removeChild(node: Node) { + this.children?.delete(node); + } + private purged = false; /** * 是否已销毁 diff --git a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts index 0db24f0b5..788203075 100644 --- a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts +++ b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts @@ -749,10 +749,7 @@ export function upgradeMetadata(oldConfig: OldPrototypeConfig) { callbacks.onNodeRemove = didDropOut; } if (subtreeModified) { - callbacks.onSubtreeModified = (...args: any[]) => { - // FIXME! args not correct - subtreeModified.apply(args[0], args as any); - }; + callbacks.onSubtreeModified = subtreeModified; } if (onResize) { callbacks.onResize = (e: any, currentNode: any) => { From 760e6a622628e4d7c95bbc813a88b41921f38358 Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Mon, 20 Jul 2020 14:59:12 +0800 Subject: [PATCH 09/13] fix: updateProps before init --- packages/designer/src/document/node/node.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index b6f0ed4c3..7b91d2e64 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -159,7 +159,7 @@ export class Node { this.props = new Props(this, props, extras); this._children = new NodeChildren(this as ParentalNode, this.initialChildren(children)); this._children.interalInitParent(); - this.props.import(this.upgradeProps(this.initProps(props || {})), this.upgradeProps(extras || {})); + this.props.import(this.initProps(this.upgradeProps(props || {})), this.upgradeProps(extras || {})); this.setupAutoruns(); } From 582c41a121bb56a5ae2a355115809860142933c3 Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Tue, 21 Jul 2020 09:48:09 +0800 Subject: [PATCH 10/13] fix: settingField items is empty when type is not 'group' --- .../designer/src/designer/setting/setting-field.ts | 11 ++++++++--- .../src/bundle/upgrade-metadata.ts | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/designer/src/designer/setting/setting-field.ts b/packages/designer/src/designer/setting/setting-field.ts index f15969b75..5b11022d1 100644 --- a/packages/designer/src/designer/setting/setting-field.ts +++ b/packages/designer/src/designer/setting/setting-field.ts @@ -51,10 +51,15 @@ export class SettingField extends SettingPropEntry implements SettingEntry { this._expanded = extraProps?.defaultCollapsed ? false : true; // initial items - if (this.type === 'group' && items) { + if (items && items.length > 0) { this.initItems(items, settingFieldCollector); - } else if (settingFieldCollector && config.name) { - settingFieldCollector(config.name, this); + } + if (settingFieldCollector && config.name) { + if (parent && parent instanceof SettingField && parent.type !== 'group') { + settingFieldCollector((parent as SettingField).name + '.' + config.name, this); + } else { + settingFieldCollector(config.name, this); + } } // compatiable old config diff --git a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts index 788203075..0f00fe94f 100644 --- a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts +++ b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts @@ -268,8 +268,9 @@ export function upgradePropConfig(config: OldPropConfig, collector: ConfigCollec extraProps.condition = (field: Field) => !(isHidden(field) || isDisabled(field)); } + newConfig.items = items ? upgradeConfigure(items, collector) : []; + if (type === 'group') { - newConfig.items = items ? upgradeConfigure(items, collector) : []; return newConfig; } From bf79e6381f24d06785603b8651d9047ab8a220df Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Tue, 21 Jul 2020 17:50:43 +0800 Subject: [PATCH 11/13] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20initial=20?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E3=80=81type=20=3D=20'composite'=20=E6=97=B6?= =?UTF-8?q?=20items=20=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/bundle/upgrade-metadata.ts | 51 ++++++++++--------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts index 0f00fe94f..cf7ef1ff9 100644 --- a/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts +++ b/packages/editor-preset-vision/src/bundle/upgrade-metadata.ts @@ -268,9 +268,8 @@ export function upgradePropConfig(config: OldPropConfig, collector: ConfigCollec extraProps.condition = (field: Field) => !(isHidden(field) || isDisabled(field)); } - newConfig.items = items ? upgradeConfigure(items, collector) : []; - if (type === 'group') { + newConfig.items = items ? upgradeConfigure(items, collector) : []; return newConfig; } @@ -333,27 +332,29 @@ export function upgradePropConfig(config: OldPropConfig, collector: ConfigCollec const setterInitial = getInitialFromSetter(setter); - collector.addInitial({ - // FIXME! name could be "xxx.xxx" - name: slotName || name, - initial: (field: Field, currentValue: any) => { - // FIXME! read from prototype.defaultProps - const defaults = extraProps.defaultValue; - - if (typeof initialFn !== 'function') { - initialFn = defaultInitial; - } - - const v = initialFn.call(field, currentValue, defaults); - - if (setterInitial) { - return setterInitial.call(field, v, defaults); - } - - return v; - }, - }); - + if (type !== 'composite') { + collector.addInitial({ + // FIXME! name could be "xxx.xxx" + name: slotName || name, + initial: (field: Field, currentValue: any) => { + // FIXME! read from prototype.defaultProps + const defaults = extraProps.defaultValue; + + if (typeof initialFn !== 'function') { + initialFn = defaultInitial; + } + + const v = initialFn.call(field, currentValue, defaults); + + if (setterInitial) { + return setterInitial.call(field, v, defaults); + } + + return v; + }, + }); + } + if (ignore != null || disabled != null) { collector.addFilter({ // FIXME! name should be "xxx.xxx" @@ -432,9 +433,11 @@ export function upgradePropConfig(config: OldPropConfig, collector: ConfigCollec autorun: item.autorun, }); }, - } + }, ) : []; + newConfig.items = objItems; + const initial = (target: SettingTarget, value?: any) => { // TODO: const defaults = extraProps.defaultValue; From 5cfd57d16ba6f82888ee5b8379c2a59531d04b5b Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Tue, 21 Jul 2020 20:10:53 +0800 Subject: [PATCH 12/13] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=20setting-?= =?UTF-8?q?filed=20settingFieldCollector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/designer/setting/setting-field.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/designer/src/designer/setting/setting-field.ts b/packages/designer/src/designer/setting/setting-field.ts index 5b11022d1..956de1c8d 100644 --- a/packages/designer/src/designer/setting/setting-field.ts +++ b/packages/designer/src/designer/setting/setting-field.ts @@ -5,6 +5,18 @@ import { SettingEntry } from './setting-entry'; import { computed, obx } from '@ali/lowcode-editor-core'; import { cloneDeep } from '@ali/lowcode-utils'; +function getSettingFieldCollectorKey(parent: SettingEntry, config: FieldConfig) { + let top = parent; + const path = [config.name]; + while (top !== parent.top) { + if (top instanceof SettingField && top.type !== 'group') { + path.unshift(top.name); + } + top = top.parent; + } + return path.join('.'); +} + export class SettingField extends SettingPropEntry implements SettingEntry { readonly isSettingField = true; readonly isRequired: boolean; @@ -54,12 +66,8 @@ export class SettingField extends SettingPropEntry implements SettingEntry { if (items && items.length > 0) { this.initItems(items, settingFieldCollector); } - if (settingFieldCollector && config.name) { - if (parent && parent instanceof SettingField && parent.type !== 'group') { - settingFieldCollector((parent as SettingField).name + '.' + config.name, this); - } else { - settingFieldCollector(config.name, this); - } + if (this.type !== 'group' && settingFieldCollector && config.name) { + settingFieldCollector(getSettingFieldCollectorKey(parent, config), this); } // compatiable old config From 09fc1a06c931e2854b5f01e6441de0cc172781d2 Mon Sep 17 00:00:00 2001 From: "mario.gk" Date: Tue, 21 Jul 2020 21:13:32 +0800 Subject: [PATCH 13/13] =?UTF-8?q?fix:=20=E8=B0=83=E6=95=B4=20upgrade=20?= =?UTF-8?q?=E5=92=8C=20init=20=E7=9A=84=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/document/node/node.ts | 2 +- packages/editor-preset-vision/src/editor.ts | 28 +++++++++++++++---- .../react-simulator-renderer/src/renderer.ts | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 7b91d2e64..b6f0ed4c3 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -159,7 +159,7 @@ export class Node { this.props = new Props(this, props, extras); this._children = new NodeChildren(this as ParentalNode, this.initialChildren(children)); this._children.interalInitParent(); - this.props.import(this.initProps(this.upgradeProps(props || {})), this.upgradeProps(extras || {})); + this.props.import(this.upgradeProps(this.initProps(props || {})), this.upgradeProps(extras || {})); this.setupAutoruns(); } diff --git a/packages/editor-preset-vision/src/editor.ts b/packages/editor-preset-vision/src/editor.ts index 9d8a94bb8..86a89a43e 100644 --- a/packages/editor-preset-vision/src/editor.ts +++ b/packages/editor-preset-vision/src/editor.ts @@ -85,17 +85,35 @@ designer.addPropsReducer((props, node) => { const newProps: any = { ...props, }; + const getRealValue = (propValue: any) => { + if (isVariable(propValue)) { + return propValue.value; + } + if (isJSExpression(propValue)) { + return propValue.mock; + } + return propValue; + }; initials.forEach((item) => { // FIXME! this implements SettingTarget try { // FIXME! item.name could be 'xxx.xxx' const ov = props[item.name]; - const v = item.initial(node as any, isJSExpression(ov) ? ov.mock : ov); + const v = item.initial(node as any, getRealValue(ov)); if (v !== undefined) { - newProps[item.name] = isJSExpression(ov) ? { - ...ov, - mock: v, - } : v; + if (isVariable(ov)) { + newProps[item.name] = { + ...ov, + value: v, + }; + } else if (isJSExpression(ov)) { + newProps[item.name] = { + ...ov, + mock: v, + }; + } else { + newProps[item.name] = v; + } } } catch (e) { if (hasOwnProperty(props, item.name)) { diff --git a/packages/react-simulator-renderer/src/renderer.ts b/packages/react-simulator-renderer/src/renderer.ts index 6f4d622ec..afe970ef7 100644 --- a/packages/react-simulator-renderer/src/renderer.ts +++ b/packages/react-simulator-renderer/src/renderer.ts @@ -248,8 +248,8 @@ export class SimulatorRenderer implements BuiltinSimulatorRenderer { const _leaf = host.document.designer.currentDocument?.createNode(schema); const node = host.document.createNode(schema); let { props } = schema; - props = host.document.designer.transformProps(props, node, TransformStage.Upgrade); props = host.document.designer.transformProps(props, node, TransformStage.Init); + props = host.document.designer.transformProps(props, node, TransformStage.Upgrade); props = processPropsSchema(props, propsMap); props = host.document.designer.transformProps(props, node, TransformStage.Render); return createElement(Com, { ...props, _leaf }, children);