From 91ad1abbb9275b016205df78b7600d6642fdf806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Tue, 8 Jun 2021 13:49:20 +0800 Subject: [PATCH 01/27] =?UTF-8?q?refactor(props):=20=E5=B0=86=E5=BA=95?= =?UTF-8?q?=E5=B1=82=20prop=20=E7=9A=84=E5=B1=82=E7=BA=A7=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=88=90=E8=B7=9F=E5=85=83=E6=95=B0=E6=8D=AE=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=E4=B8=80=E8=87=B4,=20=E6=94=AF=E6=8C=81=E9=80=9A?= =?UTF-8?q?=E8=BF=87=20API=20=E6=96=B9=E5=BC=8F=E8=AE=BE=E7=BD=AE=20prop?= =?UTF-8?q?=20=E5=88=86=E6=94=AF=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/designer/setting/setting-field.ts | 10 ++-- .../designer/src/document/node/props/prop.ts | 57 ++++++++++++++++++- .../designer/src/document/node/props/props.ts | 2 + .../src/components/object-setter/index.tsx | 22 ++++--- .../src/components/settings/main.ts | 14 ++--- 5 files changed, 82 insertions(+), 23 deletions(-) diff --git a/packages/designer/src/designer/setting/setting-field.ts b/packages/designer/src/designer/setting/setting-field.ts index 2267fcef9..0bedf77c3 100644 --- a/packages/designer/src/designer/setting/setting-field.ts +++ b/packages/designer/src/designer/setting/setting-field.ts @@ -6,13 +6,13 @@ import { computed, obx } from '@ali/lowcode-editor-core'; import { cloneDeep } from '@ali/lowcode-utils'; function getSettingFieldCollectorKey(parent: SettingEntry, config: FieldConfig) { - let top = parent; + let cur = parent; const path = [config.name]; - while (top !== parent.top) { - if (top instanceof SettingField && top.type !== 'group') { - path.unshift(top.name); + while (cur !== parent.top) { + if (cur instanceof SettingField && cur.type !== 'group') { + path.unshift(cur.name); } - top = top.parent; + cur = cur.parent; } return path.join('.'); } diff --git a/packages/designer/src/document/node/props/prop.ts b/packages/designer/src/document/node/props/prop.ts index 1622bcfac..148654962 100644 --- a/packages/designer/src/document/node/props/prop.ts +++ b/packages/designer/src/document/node/props/prop.ts @@ -1,11 +1,12 @@ import { untracked, computed, obx, engineConfig } from '@ali/lowcode-editor-core'; -import { CompositeValue, isJSExpression, isJSSlot, JSSlot, SlotSchema } from '@ali/lowcode-types'; +import { CompositeValue, FieldConfig, isJSExpression, isJSSlot, JSSlot, SlotSchema } from '@ali/lowcode-types'; import { uniqueId, isPlainObject, hasOwnProperty, compatStage } from '@ali/lowcode-utils'; import { PropStash } from './prop-stash'; import { valueToSource } from './value-to-source'; import { Props } from './props'; import { SlotNode, Node } from '../node'; import { TransformStage } from '../transform-stage'; +import { getFocusedElement } from 'medium-editor'; export const UNSET = Symbol.for('unset'); export type UNSET = typeof UNSET; @@ -14,10 +15,40 @@ export interface IPropParent { delete(prop: Prop): void; readonly props: Props; readonly owner: Node; + readonly path: string[]; } export type ValueTypes = 'unset' | 'literal' | 'map' | 'list' | 'expression' | 'slot'; +function hasItemsInMetadata(prop: Prop) { + const path = prop.path; + const { configure } = prop.getNode().componentMeta.getMetadata(); + if (!path || path.length === 0) return false; + let props = configure?.props; + while (path.length > 0) { + let name = path.shift(); + let matchedProp = getMatchedProp(props, name!); + if (!matchedProp) return false; + if (path.length === 0) return !!matchedProp?.items; + props = matchedProp.items; + } +} + +function getMatchedProp(props: FieldConfig[] | undefined, name: string): FieldConfig | null { + let found = null; + if (!props) return null; + for (const prop of props) { + if (prop.name === name) { + found = prop; + break; + } else if (prop.type === 'group' && prop.items) { + found = getMatchedProp(prop.items, name); + if (found) return found; + } + } + return found; +} + export class Prop implements IPropParent { readonly isProp = true; @@ -253,6 +284,21 @@ export class Prop implements IPropParent { }; } + this.dispose(); + + // 将父属性设置成一个对象,得同时把子属性都设值,同时清空其他子属性 + if (this._type === 'map' && isPlainObject(val)) { + this.items?.forEach((item) => { + // @ts-ignore + if ([item.key] in val) { + // @ts-ignore + item.setValue(val[item.key]); + } else { + this.clearPropValue(item.key!); + } + }); + } + if (oldValue !== this._value) { editor?.emit('node.innerProp.change', { node: this.owner, @@ -261,7 +307,6 @@ export class Prop implements IPropParent { newValue: this._value, }); } - this.dispose(); } @computed getValue(): CompositeValue { @@ -358,7 +403,13 @@ export class Prop implements IPropParent { @obx.val private _maps: Map | null = null; - @computed private get items(): Prop[] | null { + get path(): string[] { + return (this.parent.path || []).concat(this.key as string); + } + + private get items(): Prop[] | null { + // 不在元数据配置项中的,不产生 items + if (!hasItemsInMetadata(this)) return null; let _items: any; untracked(() => { _items = this._items; diff --git a/packages/designer/src/document/node/props/props.ts b/packages/designer/src/document/node/props/props.ts index 3c40d17fd..028d190a0 100644 --- a/packages/designer/src/document/node/props/props.ts +++ b/packages/designer/src/document/node/props/props.ts @@ -37,6 +37,8 @@ export class Props implements IPropParent { return maps; } + readonly path = []; + get props(): Props { return this; } diff --git a/packages/editor-skeleton/src/components/object-setter/index.tsx b/packages/editor-skeleton/src/components/object-setter/index.tsx index 1dcb7e25f..ec309ff2c 100644 --- a/packages/editor-skeleton/src/components/object-setter/index.tsx +++ b/packages/editor-skeleton/src/components/object-setter/index.tsx @@ -1,9 +1,9 @@ import { Component, Fragment } from 'react'; import { Icon, Button } from '@alifd/next'; -import { SetterType, FieldConfig } from '@ali/lowcode-types'; +import { SetterType, FieldConfig, CustomView } from '@ali/lowcode-types'; import { createSettingFieldView } from '../settings/settings-pane'; import { PopupContext, PopupPipe } from '../popup'; -import { SettingField } from '@ali/lowcode-designer'; +import { isSettingField, SettingField } from '@ali/lowcode-designer'; import './style.less'; import { Title } from '@ali/lowcode-editor-core'; @@ -165,11 +165,17 @@ class FormSetter extends Component { super(props); const { config, field } = props; const { extraProps } = field; - this.items = (config?.items || []).map((conf) => field.createField({ - ...conf, - setValue: extraProps?.setValue, - })); - + field.items.forEach((item: SettingField | CustomView) => { + if (isSettingField(item)) { + const originalSetValue = item.extraProps.setValue; + item.extraProps.setValue = (...args) => { + // 调用子字段本身的 setValue + originalSetValue?.apply(null, args); + // 调用父字段本身的 setValue + extraProps.setValue?.apply(null, args); + }; + } + }); // TODO: extraConfig for custom fields } @@ -181,7 +187,7 @@ class FormSetter extends Component { const { field } = this.props; return (
- {this.items.map((item, index) => createSettingFieldView(item, field, index))} + {field.items.map((item, index) => createSettingFieldView(item, field, index))}
); } diff --git a/packages/editor-skeleton/src/components/settings/main.ts b/packages/editor-skeleton/src/components/settings/main.ts index 60a20c2bf..66e78bc3d 100644 --- a/packages/editor-skeleton/src/components/settings/main.ts +++ b/packages/editor-skeleton/src/components/settings/main.ts @@ -69,13 +69,13 @@ export class SettingsMain { if (!this.designer) { this.designer = nodes[0].document.designer; } - - let lastSettings = this._settings; - // obx 的一些响应式计算会延迟到下一个时钟周期,导致 prop.parent 获取不到,这里也做一个延迟 - executePendingFn(() => { - lastSettings?.purge(); - }, 2000); - this._settings = this.designer.createSettingEntry(nodes); + // 当节点只有一个时,复用 node 上挂载的 settingEntry,不会产生平行的两个实例,这样在整个系统中对 + // 某个节点操作的 SettingTopEntry 只有一个实例,后续的 getProp() 也会拿到相同的 SettingField 实例 + if (nodes.length === 1) { + this._settings = nodes[0].settingEntry; + } else { + this._settings = this.designer.createSettingEntry(nodes); + } } purge() { From d46efaadd4fe3a4ecc8a8fa383b49ff83e9af9ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Wed, 9 Jun 2021 14:57:52 +0800 Subject: [PATCH 02/27] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20valueChange?= =?UTF-8?q?=20=E4=B8=8D=E4=BC=9A=E5=9B=A0=E4=B8=BA=E5=AD=90=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=8F=98=E5=8C=96=E8=80=8C=E9=80=9A=E7=9F=A5=E7=88=B6?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E4=BA=8B=E4=BB=B6=E7=9B=91=E5=90=AC,=20?= =?UTF-8?q?=E8=80=83=E8=99=91=E5=88=B0=E5=90=8E=E7=BB=AD=E6=8E=A8=E8=8D=90?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8=20setValue,=20=E4=B9=9F?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=20valueChange=20=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/designer/setting/setting-field.ts | 12 ++++++--- .../designer/setting/setting-prop-entry.ts | 25 ++++++++++--------- packages/designer/src/types/index.ts | 19 +++++++++++++- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/packages/designer/src/designer/setting/setting-field.ts b/packages/designer/src/designer/setting/setting-field.ts index 0bedf77c3..6f2a935d8 100644 --- a/packages/designer/src/designer/setting/setting-field.ts +++ b/packages/designer/src/designer/setting/setting-field.ts @@ -4,6 +4,7 @@ import { SettingPropEntry } from './setting-prop-entry'; import { SettingEntry } from './setting-entry'; import { computed, obx } from '@ali/lowcode-editor-core'; import { cloneDeep } from '@ali/lowcode-utils'; +import { ISetValueOptions } from '../../types'; function getSettingFieldCollectorKey(parent: SettingEntry, config: FieldConfig) { let cur = parent; @@ -140,7 +141,7 @@ export class SettingField extends SettingPropEntry implements SettingEntry { private hotValue: any; - setValue(val: any, isHotValue?: boolean, force?: boolean, extraOptions?: any) { + setValue(val: any, isHotValue?: boolean, force?: boolean, extraOptions?: ISetValueOptions) { if (isHotValue) { this.setHotValue(val, extraOptions); return; @@ -172,9 +173,14 @@ export class SettingField extends SettingPropEntry implements SettingEntry { this.valueChange(); } - setHotValue(data: any, options?: any) { + setHotValue(data: any, options?: ISetValueOptions) { this.hotValue = data; const value = this.transducer.toNative(data); + if (options) { + options.fromSetHotValue = true; + } else { + options = { fromSetHotValue: true }; + } if (this.isUseVariable()) { const oldValue = this.getValue(); this.setValue({ @@ -191,7 +197,7 @@ export class SettingField extends SettingPropEntry implements SettingEntry { return; } - this.valueChange(); + this.valueChange(options); } onEffect(action: () => void): () => void { diff --git a/packages/designer/src/designer/setting/setting-prop-entry.ts b/packages/designer/src/designer/setting/setting-prop-entry.ts index 3ec65bd4e..351af3cfe 100644 --- a/packages/designer/src/designer/setting/setting-prop-entry.ts +++ b/packages/designer/src/designer/setting/setting-prop-entry.ts @@ -6,6 +6,8 @@ import { Node } from '../../document'; import { ComponentMeta } from '../../component-meta'; import { Designer } from '../designer'; import { EventEmitter } from 'events'; +import { ISetValueOptions } from '../../types'; +import { isSettingField } from './setting-field'; export class SettingPropEntry implements SettingEntry { // === static properties === @@ -162,7 +164,7 @@ export class SettingPropEntry implements SettingEntry { /** * 设置当前属性值 */ - setValue(val: any, isHotValue?: boolean, force?: boolean, extraOptions?: any) { + setValue(val: any, isHotValue?: boolean, force?: boolean, extraOptions?: ISetValueOptions) { const oldValue = this.getValue(); if (this.type === 'field') { this.parent.setPropValue(this.name, val); @@ -178,6 +180,10 @@ export class SettingPropEntry implements SettingEntry { } } this.notifyValueChange(oldValue, val); + // 如果 fromSetHotValue,那么在 setHotValue 中已经调用过 valueChange 了 + if (!extraOptions?.fromSetHotValue) { + this.valueChange(extraOptions); + } } /** @@ -272,8 +278,12 @@ export class SettingPropEntry implements SettingEntry { /** * @deprecated */ - valueChange() { - this.emitter.emit('valuechange'); + valueChange(options: ISetValueOptions = {}) { + this.emitter.emit('valuechange', options); + + if (this.parent && isSettingField(this.parent)) { + this.parent.valueChange(options); + } } notifyValueChange(oldValue: any, newValue:any) { @@ -288,15 +298,6 @@ export class SettingPropEntry implements SettingEntry { return false; } - /* - getConfig(configName?: K): IPropConfig[K] | IPropConfig { - if (configName) { - return this.config[configName]; - } - - return this.config; - } - */ getVariableValue() { const v = this.getValue(); if (isJSExpression(v)) { diff --git a/packages/designer/src/types/index.ts b/packages/designer/src/types/index.ts index e079964b0..97cf60c6a 100644 --- a/packages/designer/src/types/index.ts +++ b/packages/designer/src/types/index.ts @@ -18,4 +18,21 @@ const utils = { compatibleLegaoSchema, getNodeSchemaById, }; -export type Utils = typeof utils; \ No newline at end of file +export type Utils = typeof utils; + +export enum PROP_VALUE_CHANGED_TYPE { + /** + * normal set value + */ + SET_VALUE = 'SET_VALUE', + /** + * value changed caused by sub-prop value change + */ + SUB_VALUE_CHANGE = 'SUB_VALUE_CHANGE', +} + +export interface ISetValueOptions { + disableMutator?: boolean; + type?: PROP_VALUE_CHANGED_TYPE; + fromSetHotValue?: boolean; +} \ No newline at end of file From 8fd8e7d45ae1e8494211a7e43363a284bfd14cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Thu, 10 Jun 2021 15:43:15 +0800 Subject: [PATCH 03/27] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E5=A2=9E?= =?UTF-8?q?=E9=87=8F=E6=9B=B4=E6=96=B0=E6=9C=BA=E5=88=B6=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E9=99=90=E5=88=B6=E6=9D=A1=E4=BB=B6,=20=E5=B9=B6?= =?UTF-8?q?=E5=B0=86=E9=97=A8=E6=A7=9B=E8=B0=83=E6=95=B4=E5=88=B0=20200=20?= =?UTF-8?q?=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react-simulator-renderer/src/renderer.ts | 6 ++--- .../src/utils/misc.ts | 23 +++++++++++++++---- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/react-simulator-renderer/src/renderer.ts b/packages/react-simulator-renderer/src/renderer.ts index 92b8ff08e..c70800190 100644 --- a/packages/react-simulator-renderer/src/renderer.ts +++ b/packages/react-simulator-renderer/src/renderer.ts @@ -48,8 +48,8 @@ export class DocumentInstance { this.disposeFunctions.push(host.onActivityEvent((data: ActivityData, ctx: any) => { if (host.mutedActivityEvent || (ctx && ctx.doc !== this.document)) return; - // 当节点数小数 300 个时,不走入增量更新逻辑,后面优化、细化逻辑后逐步放开限制 - if (this.document.nodesMap.size < 300) return; + // 当节点数小数 200 个时,不走入增量更新逻辑,后面优化、细化逻辑后逐步放开限制 + if (this.document.nodesMap.size < 200) return; if (tid) clearTimeout(tid); // 临时关闭全量计算 schema 的逻辑,在增量计算结束后,来一次全量计算 @@ -59,7 +59,7 @@ export class DocumentInstance { if (supportsQuickPropSetting(data, this)) { setInstancesProp(data, this); } else { - this._schema = applyActivities(this._schema!, data); + // this._schema = applyActivities(this._schema!, data); } } else if (data.type === ActivityType.ADDED) { // FIXME: 待补充 节点增加 逻辑 diff --git a/packages/react-simulator-renderer/src/utils/misc.ts b/packages/react-simulator-renderer/src/utils/misc.ts index 9777c4047..a4cd86848 100644 --- a/packages/react-simulator-renderer/src/utils/misc.ts +++ b/packages/react-simulator-renderer/src/utils/misc.ts @@ -1,6 +1,7 @@ import { ReactInstance } from 'react'; import { ActivityData, isJSSlot } from '@ali/lowcode-types'; import { DocumentInstance } from '../renderer'; +import { isReactClass } from '@ali/lowcode-utils'; interface UtilsMetadata { name: string; @@ -55,9 +56,9 @@ function haveForceUpdate(instances: any[]): boolean { export function supportsQuickPropSetting(data: ActivityData, doc: DocumentInstance) { const { payload } = data; const { schema, prop } = payload; - const nodeId = schema.id!; + const { componentName, id: nodeId } = schema; // const key = data.payload.prop.key; - const instances = doc.instancesMap.get(nodeId); + const instances = doc.instancesMap.get(nodeId!); const propKey = getUppermostPropKey(prop); let value = (schema.props as any)[propKey]; @@ -65,14 +66,28 @@ export function supportsQuickPropSetting(data: ActivityData, doc: DocumentInstan nodeId && Array.isArray(instances) && instances.length > 0 && - haveForceUpdate(instances) && propKey && // 不是 extraProp !propKey.startsWith('___') && - !isJSSlot(value) + !isJSSlot(value) && + // functional component 不支持 ref.props 直接设值,是 readonly 的 + isReactClass((doc.container?.components as any)[componentName]) && + haveForceUpdate(instances) && + // 黑名单组件通常会把 schema / children 魔改,导致直接设置 props 失效 + isAllowedComponent(componentName) ); } +// 不允许走快捷设置的组件黑名单 +const DISABLED__QUICK_SETTING_COMPONENT_NAMES = [ + 'Filter', // 查询组件 + 'Filter2', // 查询组件 + 'TableField', // 明细组件 +]; +function isAllowedComponent(name: string): boolean { + return !DISABLED__QUICK_SETTING_COMPONENT_NAMES.includes(name); +} + /** * 设置属性值 * @param data From c8e2f9d8efcb482321d15b15ab1f280387951411 Mon Sep 17 00:00:00 2001 From: "wuyue.xht" Date: Thu, 10 Jun 2021 14:36:19 +0800 Subject: [PATCH 04/27] =?UTF-8?q?fix:=20=E4=BB=A5=E8=8A=82=E7=82=B9id?= =?UTF-8?q?=E4=BD=9C=E4=B8=BAkey=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=8B=96?= =?UTF-8?q?=E6=8B=BD=E3=80=81=E5=A2=9E=E5=88=A0=E6=97=B6=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E9=A2=91=E7=B9=81=E5=8D=B8=E8=BD=BD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/renderer-core/src/renderer/base.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/renderer-core/src/renderer/base.tsx b/packages/renderer-core/src/renderer/base.tsx index 1d81ac6d8..745e71796 100644 --- a/packages/renderer-core/src/renderer/base.tsx +++ b/packages/renderer-core/src/renderer/base.tsx @@ -372,7 +372,7 @@ export default function baseRenererFactory() { } if (Array.isArray(schema)) { if (schema.length === 1) return this.__createVirtualDom(schema[0], self, parentInfo); - return schema.map((item, idy) => this.__createVirtualDom(item, self, parentInfo, item?.__ctx?.lceKey ? '' : idy)); + return schema.map((item, idy) => this.__createVirtualDom(item, self, parentInfo, item?.__ctx?.lceKey ? '' : String(idy))); } // FIXME const _children = this.getSchemaChildren(schema); @@ -484,6 +484,7 @@ export default function baseRenererFactory() { } props.key = props.key || `${schema.__ctx.lceKey}_${schema.__ctx.idx || 0}_${idx !== undefined ? idx : ''}`; } else if (typeof idx === 'number' && !props.key) { + // 仅当循环场景走这里 props.key = idx; } From f5e8239c4d80674cddc85e016d7de039e5b79315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Thu, 10 Jun 2021 16:05:24 +0800 Subject: [PATCH 05/27] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=98=AF=E5=90=A6=E5=85=81=E8=AE=B8=E7=94=BB=E5=B8=83?= =?UTF-8?q?=E9=BC=A0=E6=A0=87=E4=BA=8B=E4=BB=B6=E7=9A=84=E5=86=92=E6=B3=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/builtin-simulator/host.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 0eb5c2429..4cb8199df 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -641,14 +641,16 @@ export class BuiltinSimulatorHost implements ISimulatorHost { if (!detecting.enable || this.designMode !== 'design') { return; } const nodeInst = this.getNodeInstanceFromElement(e.target as Element); detecting.capture(nodeInst?.node || null); - e.stopPropagation(); + if (!engineConfig.get('enableMouseEventPropagationInCanvas', false) || dragon.dragging) { + e.stopPropagation(); + } }; const leave = () => detecting.leave(this.project.currentDocument); @@ -659,7 +661,9 @@ export class BuiltinSimulatorHost implements ISimulatorHost { - e.stopPropagation(); + if (!engineConfig.get('enableMouseEventPropagationInCanvas', false) || dragon.dragging) { + e.stopPropagation(); + } }, true, ); From d8a39683d9dbb3d1c0910f24ae988a63a86b32a3 Mon Sep 17 00:00:00 2001 From: "jianhui.fjh" Date: Thu, 10 Jun 2021 17:32:07 +0800 Subject: [PATCH 06/27] =?UTF-8?q?feat:=20=E5=85=BC=E5=AE=B9=E7=A3=81?= =?UTF-8?q?=E8=B4=B4=E5=B8=83=E5=B1=80=E5=8A=9F=E8=83=BD=20to=20#34464969?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/builtin-simulator/bem-tools/index.tsx | 4 +- .../designer/src/builtin-simulator/host.ts | 247 ++++++++++++++---- packages/designer/src/designer/designer.ts | 43 ++- packages/designer/src/designer/dragon.ts | 78 +++++- packages/engine/src/engine-core.ts | 6 +- 5 files changed, 301 insertions(+), 77 deletions(-) diff --git a/packages/designer/src/builtin-simulator/bem-tools/index.tsx b/packages/designer/src/builtin-simulator/bem-tools/index.tsx index 97ce673dc..6551633e8 100644 --- a/packages/designer/src/builtin-simulator/bem-tools/index.tsx +++ b/packages/designer/src/builtin-simulator/bem-tools/index.tsx @@ -24,7 +24,7 @@ export class BemTools extends Component<{ host: BuiltinSimulatorHost }> { } return (
- + { !engineConfig.get('disableDetecting') && } { engineConfig.get('enableReactiveContainer') && } @@ -38,4 +38,4 @@ export class BemTools extends Component<{ host: BuiltinSimulatorHost }> {
); } -} +} \ No newline at end of file diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 0eb5c2429..3520bf05d 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -1,9 +1,23 @@ -import { obx, autorun, computed, getPublicPath, hotkey, focusTracker, engineConfig } from '@ali/lowcode-editor-core'; +import { + obx, + autorun, + computed, + getPublicPath, + hotkey, + focusTracker, + engineConfig, +} from '@ali/lowcode-editor-core'; import { EventEmitter } from 'events'; -import { ISimulatorHost, Component, NodeInstance, ComponentInstance, DropContainer } from '../simulator'; +import { + ISimulatorHost, + Component, + NodeInstance, + ComponentInstance, + DropContainer, +} from '../simulator'; import Viewport from './viewport'; import { createSimulator } from './create-simulator'; -import { Node, ParentalNode, isNode, contains, isRootNode } from '../document'; +import { Node, ParentalNode, contains, isRootNode } from '../document'; import ResourceConsumer from './resource-consumer'; import { AssetLevel, @@ -23,7 +37,6 @@ import { LocateEvent, isDragAnyObject, isDragNodeObject, - LocationData, isLocationData, LocationChildrenDetail, LocationDetailType, @@ -36,7 +49,12 @@ import { } from '../designer'; import { parseMetadata } from './utils/parse-metadata'; import { getClosestClickableNode } from './utils/clickable'; -import { ComponentMetadata, ComponentSchema, TransformStage, ActivityData } from '@ali/lowcode-types'; +import { + ComponentMetadata, + ComponentSchema, + TransformStage, + ActivityData, +} from '@ali/lowcode-types'; import { BuiltinSimulatorRenderer } from './renderer'; import clipboard from '../designer/clipboard'; import { LiveEditing } from './live-editing/live-editing'; @@ -80,7 +98,10 @@ const defaultSimulatorUrl = (() => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_, prefix = '', dev] = /^(.+?)(\/js)?\/?$/.exec(publicPath) || []; if (dev) { - urls = [`${prefix}/css/react-simulator-renderer.css`, `${prefix}/js/react-simulator-renderer.js`]; + urls = [ + `${prefix}/css/react-simulator-renderer.css`, + `${prefix}/js/react-simulator-renderer.js`, + ]; } else if (process.env.NODE_ENV === 'production') { urls = [`${prefix}/react-simulator-renderer.css`, `${prefix}/react-simulator-renderer.js`]; } else { @@ -106,12 +127,16 @@ const defaultRaxSimulatorUrl = (() => { const defaultEnvironment = [ // https://g.alicdn.com/mylib/??react/16.11.0/umd/react.production.min.js,react-dom/16.8.6/umd/react-dom.production.min.js,prop-types/15.7.2/prop-types.min.js - assetItem(AssetType.JSText, 'window.React=parent.React;window.ReactDOM=parent.ReactDOM;window.__is_simulator_env__=true;', undefined, 'react'), + assetItem( + AssetType.JSText, + 'window.React=parent.React;window.ReactDOM=parent.ReactDOM;window.__is_simulator_env__=true;', + undefined, + 'react', + ), assetItem( AssetType.JSText, 'window.PropTypes=parent.PropTypes;React.PropTypes=parent.PropTypes; window.__REACT_DEVTOOLS_GLOBAL_HOOK__ = window.parent.__REACT_DEVTOOLS_GLOBAL_HOOK__;', ), - ]; const defaultRaxEnvironment = [ @@ -217,7 +242,10 @@ export class BuiltinSimulatorHost implements ISimulatorHost void; firstRun: boolean }) => void) { + connect( + renderer: BuiltinSimulatorRenderer, + fn: (context: { dispose: () => void; firstRun: boolean }) => void, + ) { this._renderer = renderer; return autorun(fn as any, true); } @@ -294,7 +325,7 @@ export class BuiltinSimulatorHost implements ISimulatorHostwindow.${item.library}});`); + libraryExportList.push( + `Object.defineProperty(window,'${item.exportName}',{get:()=>window.${item.library}});`, + ); } if (item.urls) { libraryAsset.push(item.urls); @@ -337,7 +370,8 @@ export class BuiltinSimulatorHost implements ISimulatorHost 0) { // 加载异步Library await renderer.loadAsyncLibrary(this.asyncLibraryMap); @@ -384,7 +417,6 @@ export class BuiltinSimulatorHost implements ISimulatorHost { // console.log('add node', node); @@ -501,20 +537,82 @@ export class BuiltinSimulatorHost implements ISimulatorHost { + const _nodeInst = this.getNodeInstanceFromElement(e.target as Element); + const { isRGL: _isRGL, rglNode: _rglNode } = this.getRGLObject( + _nodeInst as NodeInstance, + ); + const status = !!( + _isRGL && + _rglNode?.id !== rglNode?.id && + _rglNode?.getParent() !== node && + nodeInst?.node !== _nodeInst?.node + ); + return { status, rglNode: _rglNode }; + }; + const move = (e: MouseEvent) => { + if (!isShaken(downEvent, e)) { + if (nodeInst.instance && nodeInst.instance.style) { + nodeInst.instance.style.pointerEvents = 'none'; + } + } + const { status, rglNode: _rglNode } = judgeEnterOtherRGL(e); + if (status) { + designer.dragon.emitter.emit('rgl.add.placeholder', { + rglNode: _rglNode, + node, + event: e, + fromRglNode: rglNode, + }); + } else { + designer.dragon.emitter.emit('rgl.remove.placeholder'); + } + }; + const over = (e: MouseEvent) => { + const { status, rglNode: _rglNode } = judgeEnterOtherRGL(e); + if (status) { + designer.dragon.emitter.emit('rgl.drop', { + rglNode: _rglNode, + node, + fromRglNode: rglNode, + }); + } + designer.dragon.emitter.emit('rgl.remove.placeholder'); + if (nodeInst.instance && nodeInst.instance.style) { + nodeInst.instance.style.pointerEvents = ''; + } + designer.dragon.emitter.emit('rgl.switch', { + action: 'end', + rglNode, + }); + doc.removeEventListener('mouseup', over, true); + doc.removeEventListener('mousemove', move, true); + }; + doc.addEventListener('mouseup', over, true); + doc.addEventListener('mousemove', move, true); + } else { + // stop response document focus event + downEvent.stopPropagation(); + downEvent.preventDefault(); + } // if (!node?.isValidComponent()) { // // 对于未注册组件直接返回 // return; @@ -522,8 +620,8 @@ export class BuiltinSimulatorHost implements ISimulatorHost { doc.removeEventListener('mouseup', checkSelect, true); - // 鼠标是否移动 - if (!isShaken(downEvent, e)) { + // 鼠标是否移动 ? - 鼠标抖动应该也需要支持选中事件,偶尔点击不能选中,磁帖块移除shaken检测 + if (!isShaken(downEvent, e) || isRGLNode) { let { id } = node; designer.activeTracker.track({ node, instance: nodeInst?.instance }); if (isMulti && !isRootNode(node) && selection.has(id)) { @@ -531,10 +629,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost void; private disableDetecting?: () => void; + + /** + * 获取node实例的磁贴相关信息 + */ + getRGLObject(nodeInst: NodeInstance) { + const isContainerNode = nodeInst?.node.isContainer(); + const isEmptyNode = nodeInst?.node?.isEmpty(); + const isRGLContainerNode = nodeInst?.node?.isRGLContainer; + const isRGLNode = nodeInst?.node?.getParent()?.isRGLContainer; + const isRGL = isRGLContainerNode || (isRGLNode && (!isContainerNode || !isEmptyNode)); + let rglNode = isRGLContainerNode ? nodeInst?.node : isRGL ? nodeInst?.node?.getParent() : {}; + return { isContainerNode, isEmptyNode, isRGLContainerNode, isRGLNode, isRGL, rglNode }; + } + /** * 设置悬停处理 */ @@ -694,7 +805,10 @@ export class BuiltinSimulatorHost implements ISimulatorHost // 可能是 [null]; item && item.contains(targetElement), @@ -847,7 +961,10 @@ export class BuiltinSimulatorHost implements ISimulatorHost | null { + getClosestNodeInstance( + from: ComponentInstance, + specId?: string, + ): NodeInstance | null { return this.renderer?.getClosestNodeInstance(from, specId) || null; } @@ -974,7 +1091,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost= rect.top && e.globalY <= rect.bottom && e.globalX >= rect.left && e.globalX <= rect.right; + return ( + e.globalY >= rect.top && + e.globalY <= rect.bottom && + e.globalX >= rect.left && + e.globalX <= rect.right + ); } private sensing = false; @@ -1153,7 +1275,10 @@ export class BuiltinSimulatorHost implements ISimulatorHost 1 - ? instances.find((_inst) => this.getClosestNodeInstance(_inst, container.id)?.instance === containerInstance) + ? instances.find( + (_inst) => + this.getClosestNodeInstance(_inst, container.id)?.instance === containerInstance, + ) : instances[0] : null; - const rect = inst ? this.computeComponentInstanceRect(inst, node.componentMeta.rootSelector) : null; + const rect = inst + ? this.computeComponentInstanceRect(inst, node.componentMeta.rootSelector) + : null; if (!rect) { continue; @@ -1340,7 +1470,10 @@ export class BuiltinSimulatorHost implements ISimulatorHost, e: LocateEvent) { + getNearByContainer( + { container, instance }: DropContainer, + drillDownExcludes: Set, + e: LocateEvent, + ) { const { children } = container; const document = this.project.currentDocument!; if (!children || children.isEmpty()) { diff --git a/packages/designer/src/designer/designer.ts b/packages/designer/src/designer/designer.ts index bab9d20ab..3d885088e 100644 --- a/packages/designer/src/designer/designer.ts +++ b/packages/designer/src/designer/designer.ts @@ -13,7 +13,14 @@ import { } from '@ali/lowcode-types'; import { megreAssets, AssetsJson } from '@ali/lowcode-utils'; import { Project } from '../project'; -import { Node, DocumentModel, insertChildren, isRootNode, ParentalNode, TransformStage } from '../document'; +import { + Node, + DocumentModel, + insertChildren, + isRootNode, + ParentalNode, + TransformStage, +} from '../document'; import { ComponentMeta } from '../component-meta'; import { INodeSelector, Component } from '../simulator'; import { Scroller, IScrollable } from './scroller'; @@ -125,7 +132,7 @@ export class Designer { } else if (isDragNodeDataObject(dragObject)) { // process nodeData const nodeData = Array.isArray(dragObject.data) ? dragObject.data : [dragObject.data]; - const isNotNodeSchema = nodeData.find(item => !isNodeSchema(item)); + const isNotNodeSchema = nodeData.find((item) => !isNodeSchema(item)); if (isNotNodeSchema) { return; } @@ -213,7 +220,11 @@ export class Designer { } const { currentSelection } = this; // TODO: 避免选中 Page 组件,默认选中第一个子节点;新增规则 或 判断 Live 模式 - if (currentSelection && currentSelection.selected.length === 0 && this.simulatorProps?.designMode === 'live') { + if ( + currentSelection && + currentSelection.selected.length === 0 && + this.simulatorProps?.designMode === 'live' + ) { const rootNodeChildrens = this.currentDocument.getRoot().getChildren().children; if (rootNodeChildrens.length > 0) { currentSelection.select(rootNodeChildrens[0].id); @@ -301,12 +312,18 @@ export class Designer { /** * 获得合适的插入位置 */ - getSuitableInsertion(insertNode?: Node | NodeSchema | NodeSchema[]): { target: ParentalNode; index?: number } | null { + getSuitableInsertion( + insertNode?: Node | NodeSchema | NodeSchema[], + ): { target: ParentalNode; index?: number } | null { const activedDoc = this.project.currentDocument; if (!activedDoc) { return null; } - if (Array.isArray(insertNode) && isNodeSchema(insertNode[0]) && this.getComponentMeta(insertNode[0].componentName).isModal) { + if ( + Array.isArray(insertNode) && + isNodeSchema(insertNode[0]) && + this.getComponentMeta(insertNode[0].componentName).isModal + ) { return { target: activedDoc.rootNode as ParentalNode, }; @@ -355,7 +372,10 @@ export class Designer { if (props.suspensed !== this.props.suspensed && props.suspensed != null) { this.suspensed = props.suspensed; } - if (props.componentMetadatas !== this.props.componentMetadatas && props.componentMetadatas != null) { + if ( + props.componentMetadatas !== this.props.componentMetadatas && + props.componentMetadatas != null + ) { this.buildComponentMetasMap(props.componentMetadatas); } } else { @@ -477,7 +497,10 @@ export class Designer { return this.props?.globalComponentActions || null; } - getComponentMeta(componentName: string, generateMetadata?: () => ComponentMetadata | null): ComponentMeta { + getComponentMeta( + componentName: string, + generateMetadata?: () => ComponentMetadata | null, + ): ComponentMeta { if (this._componentMetasMap.has(componentName)) { return this._componentMetasMap.get(componentName)!; } @@ -558,4 +581,8 @@ export class Designer { } export type PropsReducerContext = { stage: TransformStage }; -export type PropsReducer = (props: CompositeObject, node: Node, ctx?: PropsReducerContext) => CompositeObject; +export type PropsReducer = ( + props: CompositeObject, + node: Node, + ctx?: PropsReducerContext, +) => CompositeObject; diff --git a/packages/designer/src/designer/dragon.ts b/packages/designer/src/designer/dragon.ts index b53b6cf20..c336039ea 100644 --- a/packages/designer/src/designer/dragon.ts +++ b/packages/designer/src/designer/dragon.ts @@ -4,7 +4,7 @@ import { NodeSchema } from '@ali/lowcode-types'; import { setNativeSelection, cursor } from '@ali/lowcode-utils'; import { DropLocation } from './location'; import { Node, DocumentModel } from '../document'; -import { ISimulatorHost, isSimulatorHost } from '../simulator'; +import { ISimulatorHost, isSimulatorHost, NodeInstance, ComponentInstance } from '../simulator'; import { Designer } from './designer'; export interface LocateEvent { @@ -72,6 +72,14 @@ export interface ISensor { * 取消激活 */ deactiveSensor(): void; + /** + * 获取节点实例 + */ + getNodeInstanceFromElement(e: Element | null): NodeInstance | null; + /** + * 获取RGL相关信息 + */ + getRGLObject(nodeInst: NodeInstance): any; } export type DragObject = DragNodeObject | DragNodeDataObject | DragAnyObject; @@ -126,7 +134,9 @@ export function isShaken(e1: MouseEvent | DragEvent, e2: MouseEvent | DragEvent) if (e1.target !== e2.target) { return true; } - return Math.pow(e1.clientY - e2.clientY, 2) + Math.pow(e1.clientX - e2.clientX, 2) > SHAKE_DISTANCE; + return ( + Math.pow(e1.clientY - e2.clientY, 2) + Math.pow(e1.clientX - e2.clientX, 2) > SHAKE_DISTANCE + ); } function isInvalidPoint(e: any, last: any): boolean { @@ -199,6 +209,8 @@ export class Dragon { @obx.ref private _dragging = false; + @obx.ref private _canDrop = false; + get dragging(): boolean { return this._dragging; } @@ -239,17 +251,26 @@ export class Dragon { * @param dragObject 拖拽对象 * @param boostEvent 拖拽初始时事件 */ - boost(dragObject: DragObject, boostEvent: MouseEvent | DragEvent) { + boost(dragObject: DragObject, boostEvent: MouseEvent | DragEvent, isFromRGLNode?: boolean) { const { designer } = this; const masterSensors = this.getMasterSensors(); const handleEvents = makeEventsHandler(boostEvent, masterSensors); const newBie = !isDragNodeObject(dragObject); - const forceCopyState = isDragNodeObject(dragObject) && dragObject.nodes.some((node) => node.isSlot()); + const forceCopyState = + isDragNodeObject(dragObject) && dragObject.nodes.some((node) => node.isSlot()); const isBoostFromDragAPI = isDragEvent(boostEvent); let lastSensor: ISensor | undefined; this._dragging = false; + const getRGLObject = (e: MouseEvent | DragEvent) => { + const locateEvent = createLocateEvent(e); + const sensor = chooseSensor(locateEvent); + if (!sensor || !sensor.getNodeInstanceFromElement) return {}; + const nodeInst = sensor.getNodeInstanceFromElement(e.target as Element); + return sensor.getRGLObject(nodeInst as NodeInstance); + }; + const checkesc = (e: KeyboardEvent) => { if (e.keyCode === 27) { designer.clearLocation(); @@ -304,13 +325,31 @@ export class Dragon { const locateEvent = createLocateEvent(e); const sensor = chooseSensor(locateEvent); - if (sensor) { - sensor.fixEvent(locateEvent); - sensor.locate(locateEvent); - } else { + this._canDrop = !!sensor?.locate(locateEvent); + const { isRGL, rglNode } = getRGLObject(e); + if (isRGL) { + // 禁止原生响应 + if (!isFromRGLNode && this._canDrop) { + this.emitter.emit('rgl.add.placeholder', { + rglNode, + node: locateEvent.dragObject.nodes[0], + event: e, + }); + } designer.clearLocation(); + this.clearState(); + this.emitter.emit('drag', locateEvent); + } else { + if (!isFromRGLNode && this._canDrop) { + this.emitter.emit('rgl.remove.placeholder'); + } + if (sensor) { + sensor.fixEvent(locateEvent); + } else { + designer.clearLocation(); + } + this.emitter.emit('drag', locateEvent); } - this.emitter.emit('drag', locateEvent); }; const dragstart = () => { @@ -363,6 +402,20 @@ export class Dragon { // end-tail drag process const over = (e?: any) => { + // 发送drop事件 + if (e) { + const { isRGL, rglNode } = getRGLObject(e); + if (isRGL && !isFromRGLNode && this._canDrop) { + const tarNode = dragObject.nodes[0]; + this.emitter.emit('rgl.drop', { + rglNode, + node: tarNode, + }); + const { selection } = designer.project.currentDocument; + selection.select(tarNode.id); + } + } + /* istanbul ignore next */ if (e && isDragEvent(e)) { e.preventDefault(); @@ -461,7 +514,10 @@ export class Dragon { const chooseSensor = (e: LocateEvent) => { // this.sensors will change on dragstart const sensors: ISensor[] = (masterSensors as ISensor[]).concat(this.sensors); - let sensor = e.sensor && e.sensor.isEnter(e) ? e.sensor : sensors.find((s) => s.sensorAvailable && s.isEnter(e)); + let sensor = + e.sensor && e.sensor.isEnter(e) + ? e.sensor + : sensors.find((s) => s.sensorAvailable && s.isEnter(e)); if (!sensor) { // TODO: enter some area like componentspanel cancel if (lastSensor) { @@ -547,7 +603,7 @@ export class Dragon { } private getSimulators() { - return new Set(this.designer.project.documents.map(doc => doc.simulator)); + return new Set(this.designer.project.documents.map((doc) => doc.simulator)); } // #region ======== drag and drop helpers ============ diff --git a/packages/engine/src/engine-core.ts b/packages/engine/src/engine-core.ts index a4b1c21ab..752c7066f 100644 --- a/packages/engine/src/engine-core.ts +++ b/packages/engine/src/engine-core.ts @@ -195,6 +195,10 @@ interface EngineOptions { * 关闭画布自动渲染,在资产包多重异步加载的场景有效,默认值:false */ disableAutoRender?: boolean; + /** + * 关闭拖拽组件时的虚线响应,性能考虑,默认值:false + */ + disableDetecting?: boolean; /** * Vision-polyfill settings */ @@ -203,7 +207,7 @@ interface EngineOptions { disableCompatibleReducer?: boolean; // 是否开启在 render 阶段开启 filter reducer,默认值:false enableFilterReducerInRenderStage?: boolean; - } + }; [key: string]: any; } export async function init(container?: Element, options?: EngineOptions) { From 00d42a6c23f1482df423f26c0811f358c014e606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Thu, 10 Jun 2021 20:55:33 +0800 Subject: [PATCH 07/27] =?UTF-8?q?chore(ut):=20=E4=BF=AE=E5=A4=8D=20prop=20?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=8F=98=E6=9B=B4=E5=90=8E=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E6=B5=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 + packages/designer/jest.config.js | 2 +- .../tests/document/node/node.modify.test.ts | 66 +++++++++---------- .../props/{prop.test.ts => prop.test_wip.ts} | 0 .../{props.test.ts => props.test_wip.ts} | 0 5 files changed, 37 insertions(+), 34 deletions(-) rename packages/designer/tests/document/node/props/{prop.test.ts => prop.test_wip.ts} (100%) rename packages/designer/tests/document/node/props/{props.test.ts => props.test_wip.ts} (100%) diff --git a/package.json b/package.json index 401ceeccc..ad2023cce 100644 --- a/package.json +++ b/package.json @@ -48,5 +48,8 @@ "tnpm": { "mode": "yarn", "lockfile": "enable" + }, + "resolutions": { + "@builder/babel-preset-ice": "1.0.1" } } diff --git a/packages/designer/jest.config.js b/packages/designer/jest.config.js index 05a022b87..3703fedbe 100644 --- a/packages/designer/jest.config.js +++ b/packages/designer/jest.config.js @@ -6,7 +6,7 @@ module.exports = { // // '^.+\\.(ts|tsx)$': 'ts-jest', // // '^.+\\.(js|jsx)$': 'babel-jest', // }, - // testMatch: ['**/project.test.ts'], + // testMatch: ['**/node.modify.test.ts'], // testMatch: ['(/tests?/.*(test))\\.[jt]s$'], transformIgnorePatterns: [ `/node_modules/(?!${esModules})/`, diff --git a/packages/designer/tests/document/node/node.modify.test.ts b/packages/designer/tests/document/node/node.modify.test.ts index cd157868b..145610899 100644 --- a/packages/designer/tests/document/node/node.modify.test.ts +++ b/packages/designer/tests/document/node/node.modify.test.ts @@ -89,12 +89,12 @@ describe('schema 生成节点模型测试', () => { b: false, c: 'string', }); - const objAProp = formNode?.getProp('obj.a'); - const objBProp = formNode?.getProp('obj.b'); - const objCProp = formNode?.getProp('obj.c'); - expect(objAProp?.getValue()).toBe(1); - expect(objBProp?.getValue()).toBe(false); - expect(objCProp?.getValue()).toBe('string'); + // const objAProp = formNode?.getProp('obj.a'); + // const objBProp = formNode?.getProp('obj.b'); + // const objCProp = formNode?.getProp('obj.c'); + // expect(objAProp?.getValue()).toBe(1); + // expect(objBProp?.getValue()).toBe(false); + // expect(objCProp?.getValue()).toBe('string'); const idProp = formNode?.getExtraProp('extraPropA'); expect(idProp?.getValue()).toBe('extraPropA'); @@ -154,17 +154,17 @@ describe('schema 生成节点模型测试', () => { formNode?.setPropValue('obj.a', 3); formNode?.setPropValue('obj.b', false); formNode?.setPropValue('obj.c', 'string'); - const objAProp = formNode?.getProp('obj.a'); - const objBProp = formNode?.getProp('obj.b'); - const objCProp = formNode?.getProp('obj.c'); - expect(objAProp?.getValue()).toBe(3); - expect(objBProp?.getValue()).toBe(false); - expect(objCProp?.getValue()).toBe('string'); - expect(objProp?.getValue()).toEqual({ - a: 3, - b: false, - c: 'string', - }); + // const objAProp = formNode?.getProp('obj.a'); + // const objBProp = formNode?.getProp('obj.b'); + // const objCProp = formNode?.getProp('obj.c'); + // expect(objAProp?.getValue()).toBe(3); + // expect(objBProp?.getValue()).toBe(false); + // expect(objCProp?.getValue()).toBe('string'); + // expect(objProp?.getValue()).toEqual({ + // a: 3, + // b: false, + // c: 'string', + // }); }); it('修改普通属性,string | number | object,使用 Props 实例接口', () => { @@ -222,17 +222,17 @@ describe('schema 生成节点模型测试', () => { props?.setPropValue('obj.a', 3); props?.setPropValue('obj.b', false); props?.setPropValue('obj.c', 'string'); - const objAProp = formNode?.getProp('obj.a'); - const objBProp = formNode?.getProp('obj.b'); - const objCProp = formNode?.getProp('obj.c'); - expect(objAProp?.getValue()).toBe(3); - expect(objBProp?.getValue()).toBe(false); - expect(objCProp?.getValue()).toBe('string'); - expect(objProp?.getValue()).toEqual({ - a: 3, - b: false, - c: 'string', - }); + // const objAProp = formNode?.getProp('obj.a'); + // const objBProp = formNode?.getProp('obj.b'); + // const objCProp = formNode?.getProp('obj.c'); + // expect(objAProp?.getValue()).toBe(3); + // expect(objBProp?.getValue()).toBe(false); + // expect(objCProp?.getValue()).toBe('string'); + // expect(objProp?.getValue()).toEqual({ + // a: 3, + // b: false, + // c: 'string', + // }); }); it('修改普通属性,string | number | object,使用 Prop 实例接口', () => { @@ -296,11 +296,11 @@ describe('schema 生成节点模型测试', () => { expect(objAProp?.getValue()).toBe(3); expect(objBProp?.getValue()).toBe(false); expect(objCProp?.getValue()).toBe('string'); - expect(objProp?.getValue()).toEqual({ - a: 3, - b: false, - c: 'string', - }); + // expect(objProp?.getValue()).toEqual({ + // a: 3, + // b: false, + // c: 'string', + // }); }); }); diff --git a/packages/designer/tests/document/node/props/prop.test.ts b/packages/designer/tests/document/node/props/prop.test_wip.ts similarity index 100% rename from packages/designer/tests/document/node/props/prop.test.ts rename to packages/designer/tests/document/node/props/prop.test_wip.ts diff --git a/packages/designer/tests/document/node/props/props.test.ts b/packages/designer/tests/document/node/props/props.test_wip.ts similarity index 100% rename from packages/designer/tests/document/node/props/props.test.ts rename to packages/designer/tests/document/node/props/props.test_wip.ts From f8f5742d0aad26ec5a4eb185cd8875a3086781da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Tue, 15 Jun 2021 10:03:31 +0800 Subject: [PATCH 08/27] =?UTF-8?q?chore(test):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=90=84=E5=8C=85=E4=B8=AD=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84?= =?UTF-8?q?=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/jest.config.js | 2 +- packages/editor-skeleton/package.json | 4 +--- packages/engine/package.json | 2 +- packages/plugin-designer/package.json | 4 +--- packages/plugin-outline-pane/package.json | 4 +--- packages/rax-renderer/package.json | 2 +- packages/rax-simulator-renderer/package.json | 6 ++---- .../react-renderer/tests/__snapshots__/index.test.tsx.snap | 4 ++-- packages/react-simulator-renderer/package.json | 2 -- packages/types/package.json | 4 +--- packages/utils/package.json | 4 +--- 11 files changed, 12 insertions(+), 26 deletions(-) diff --git a/packages/designer/jest.config.js b/packages/designer/jest.config.js index 3703fedbe..1a6063f1a 100644 --- a/packages/designer/jest.config.js +++ b/packages/designer/jest.config.js @@ -6,7 +6,7 @@ module.exports = { // // '^.+\\.(ts|tsx)$': 'ts-jest', // // '^.+\\.(js|jsx)$': 'babel-jest', // }, - // testMatch: ['**/node.modify.test.ts'], + // testMatch: ['**/node.add.test.ts'], // testMatch: ['(/tests?/.*(test))\\.[jt]s$'], transformIgnorePatterns: [ `/node_modules/(?!${esModules})/`, diff --git a/packages/editor-skeleton/package.json b/packages/editor-skeleton/package.json index 5b2715764..7362a1234 100644 --- a/packages/editor-skeleton/package.json +++ b/packages/editor-skeleton/package.json @@ -10,9 +10,7 @@ "es" ], "scripts": { - "build": "build-scripts build --skip-demo", - "test": "ava", - "test:snapshot": "ava --update-snapshots" + "build": "build-scripts build --skip-demo" }, "keywords": [ "lowcode", diff --git a/packages/engine/package.json b/packages/engine/package.json index 725982e2c..9f19f7488 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -14,7 +14,7 @@ "version:update": "node ./scripts/version.js", "build": "NODE_OPTIONS=--max_old_space_size=8192 build-scripts build --skip-demo", "cloud-build": "build-scripts build --config build.cloud.json && tnpm run version:update", - "test": "build-scripts test --config build.test.json" + "test": "build-scripts test --config build.test.json --jest-passWithNoTests" }, "license": "MIT", "dependencies": { diff --git a/packages/plugin-designer/package.json b/packages/plugin-designer/package.json index 4cebfc395..2e2bbe68b 100644 --- a/packages/plugin-designer/package.json +++ b/packages/plugin-designer/package.json @@ -10,9 +10,7 @@ "module": "es/index.js", "stylePath": "style.js", "scripts": { - "build": "build-scripts build --skip-demo", - "test": "ava", - "test:snapshot": "ava --update-snapshots" + "build": "build-scripts build --skip-demo" }, "keywords": [ "lowcode", diff --git a/packages/plugin-outline-pane/package.json b/packages/plugin-outline-pane/package.json index 3861e2f0d..973c33853 100644 --- a/packages/plugin-outline-pane/package.json +++ b/packages/plugin-outline-pane/package.json @@ -9,9 +9,7 @@ "main": "lib/index.js", "module": "es/index.js", "scripts": { - "build": "build-scripts build --skip-demo", - "test": "ava", - "test:snapshot": "ava --update-snapshots" + "build": "build-scripts build --skip-demo" }, "dependencies": { "@ali/lowcode-designer": "1.0.54", diff --git a/packages/rax-renderer/package.json b/packages/rax-renderer/package.json index 1a417311d..01e00ac59 100644 --- a/packages/rax-renderer/package.json +++ b/packages/rax-renderer/package.json @@ -3,7 +3,7 @@ "version": "1.0.54", "description": "Rax renderer for Ali lowCode engine", "main": "lib/index.js", - "module": "lib/index.js", + "module": "es/index.js", "miniappConfig": { "main": "lib/miniapp/index", "main:wechat": "lib/wechat-miniprogram/index" diff --git a/packages/rax-simulator-renderer/package.json b/packages/rax-simulator-renderer/package.json index 82cf500e3..48433fd76 100644 --- a/packages/rax-simulator-renderer/package.json +++ b/packages/rax-simulator-renderer/package.json @@ -8,9 +8,7 @@ "files": [], "scripts": { "build": "NODE_OPTIONS=--max_old_space_size=8192 build-scripts build", - "cloud-build": "build-scripts build --skip-demo", - "test": "ava", - "test:snapshot": "ava --update-snapshots" + "cloud-build": "build-scripts build --skip-demo" }, "dependencies": { "@ali/lowcode-designer": "1.0.54", @@ -57,6 +55,6 @@ "publishConfig": { "registry": "https://registry.npm.alibaba-inc.com" }, - "homepage": "https://unpkg.alibaba-inc.com/@ali/lowcode-rax-simulator-renderer@1.0.49/build/index.html", + "homepage": "https://unpkg.alibaba-inc.com/@ali/lowcode-rax-simulator-renderer@1.0.54/build/index.html", "gitHead": "3bfd7df92985ec6c9d2ccb8ba95d7b0829fa2b1d" } diff --git a/packages/react-renderer/tests/__snapshots__/index.test.tsx.snap b/packages/react-renderer/tests/__snapshots__/index.test.tsx.snap index 90d2f6a5d..7a4d4b365 100644 --- a/packages/react-renderer/tests/__snapshots__/index.test.tsx.snap +++ b/packages/react-renderer/tests/__snapshots__/index.test.tsx.snap @@ -2,7 +2,7 @@ exports[`React Renderer render basic case 1`] = `
diff --git a/packages/react-simulator-renderer/package.json b/packages/react-simulator-renderer/package.json index 277ba69f1..6cadb38cf 100644 --- a/packages/react-simulator-renderer/package.json +++ b/packages/react-simulator-renderer/package.json @@ -11,8 +11,6 @@ ], "scripts": { "cloud-build": "build-scripts build --skip-demo", - "test": "ava", - "test:snapshot": "ava --update-snapshots", "build": "NODE_OPTIONS=--max_old_space_size=8192 build-scripts build --skip-demo" }, "dependencies": { diff --git a/packages/types/package.json b/packages/types/package.json index a373448dc..88017f218 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -9,9 +9,7 @@ "main": "lib/index.js", "module": "es/index.js", "scripts": { - "build": "build-scripts build --skip-demo", - "test": "ava", - "test:snapshot": "ava --update-snapshots" + "build": "build-scripts build --skip-demo" }, "dependencies": { "@ali/lowcode-datasource-types": "^1.0.21", diff --git a/packages/utils/package.json b/packages/utils/package.json index ab53d2346..a2fa681bc 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -9,9 +9,7 @@ "main": "lib/index.js", "module": "es/index.js", "scripts": { - "build": "build-scripts build --skip-demo", - "test": "ava", - "test:snapshot": "ava --update-snapshots" + "build": "build-scripts build --skip-demo" }, "dependencies": { "@ali/lowcode-types": "1.0.54", From 150d8f5fc54075edb7af5b3be6afa6ad8f8917eb Mon Sep 17 00:00:00 2001 From: "jianhui.fjh" Date: Wed, 16 Jun 2021 11:02:42 +0800 Subject: [PATCH 09/27] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A3=81?= =?UTF-8?q?=E8=B4=B4=E7=82=B9=E5=87=BB=E9=A1=B5=E9=9D=A2=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E5=81=87=E6=AD=BB=E9=97=AE=E9=A2=98=20to=20#34464969?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/designer/dragon.ts | 48 ++++++++++++------------ 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/packages/designer/src/designer/dragon.ts b/packages/designer/src/designer/dragon.ts index c336039ea..5e8c63b9d 100644 --- a/packages/designer/src/designer/dragon.ts +++ b/packages/designer/src/designer/dragon.ts @@ -322,34 +322,33 @@ export class Dragon { return; } lastArrive = e; - const locateEvent = createLocateEvent(e); const sensor = chooseSensor(locateEvent); - this._canDrop = !!sensor?.locate(locateEvent); const { isRGL, rglNode } = getRGLObject(e); if (isRGL) { - // 禁止原生响应 - if (!isFromRGLNode && this._canDrop) { + this._canDrop = !!sensor?.locate(locateEvent); + if (this._canDrop) { this.emitter.emit('rgl.add.placeholder', { rglNode, node: locateEvent.dragObject.nodes[0], event: e, }); - } - designer.clearLocation(); - this.clearState(); - this.emitter.emit('drag', locateEvent); - } else { - if (!isFromRGLNode && this._canDrop) { - this.emitter.emit('rgl.remove.placeholder'); - } - if (sensor) { - sensor.fixEvent(locateEvent); - } else { designer.clearLocation(); + this.clearState(); + this.emitter.emit('drag', locateEvent); + return; } - this.emitter.emit('drag', locateEvent); + } else { + this._canDrop = false; + this.emitter.emit('rgl.remove.placeholder'); } + if (sensor) { + sensor.locate(locateEvent); + sensor.fixEvent(locateEvent); + } else { + designer.clearLocation(); + } + this.emitter.emit('drag', locateEvent); }; const dragstart = () => { @@ -405,14 +404,17 @@ export class Dragon { // 发送drop事件 if (e) { const { isRGL, rglNode } = getRGLObject(e); - if (isRGL && !isFromRGLNode && this._canDrop) { + if (isRGL && this._canDrop) { const tarNode = dragObject.nodes[0]; - this.emitter.emit('rgl.drop', { - rglNode, - node: tarNode, - }); - const { selection } = designer.project.currentDocument; - selection.select(tarNode.id); + if (rglNode.id !== tarNode.id) { + // 避免死循环 + this.emitter.emit('rgl.drop', { + rglNode, + node: tarNode, + }); + const { selection } = designer.project.currentDocument; + selection.select(tarNode.id); + } } } From f747f7934b4dd5a2c4a2e8d366fb10a1f85b3b97 Mon Sep 17 00:00:00 2001 From: "jianhui.fjh" Date: Wed, 16 Jun 2021 12:40:20 +0800 Subject: [PATCH 10/27] fix: deploy node version 14.17.0 --- scripts/deploy.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/deploy.sh b/scripts/deploy.sh index d9b026bbd..f5c862c8a 100755 --- a/scripts/deploy.sh +++ b/scripts/deploy.sh @@ -12,7 +12,7 @@ tnpm i -g n export N_NODE_MIRROR=https://npm.taobao.org/mirrors/node echo "Switch node version to 14" -n 14 +n 14.17.0 echo "Node Version" node -v From 51eaf4051ca19dabbc938fed8b213200805b5789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Wed, 16 Jun 2021 12:54:53 +0800 Subject: [PATCH 11/27] =?UTF-8?q?refactor(prop):=20=E6=AF=8F=E6=AC=A1=20pr?= =?UTF-8?q?op.dispose=20=E5=90=8E=E9=9C=80=E8=A6=81=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=20items,=20field.items=20=E6=9C=89=E5=88=99?= =?UTF-8?q?=E5=A4=8D=E7=94=A8,=20=E6=97=A0=E5=88=99=E6=96=B0=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/src/document/node/props/prop.ts | 52 +-------------- .../tests/document/node/node.modify.test.ts | 66 +++++++++---------- .../props/{prop.test_wip.ts => prop.test.ts} | 0 .../{props.test_wip.ts => props.test.ts} | 0 .../src/components/object-setter/index.tsx | 35 ++++++---- .../src/components/settings/settings-pane.tsx | 2 +- 6 files changed, 58 insertions(+), 97 deletions(-) rename packages/designer/tests/document/node/props/{prop.test_wip.ts => prop.test.ts} (100%) rename packages/designer/tests/document/node/props/{props.test_wip.ts => props.test.ts} (100%) diff --git a/packages/designer/src/document/node/props/prop.ts b/packages/designer/src/document/node/props/prop.ts index 148654962..79a3564f9 100644 --- a/packages/designer/src/document/node/props/prop.ts +++ b/packages/designer/src/document/node/props/prop.ts @@ -6,7 +6,6 @@ import { valueToSource } from './value-to-source'; import { Props } from './props'; import { SlotNode, Node } from '../node'; import { TransformStage } from '../transform-stage'; -import { getFocusedElement } from 'medium-editor'; export const UNSET = Symbol.for('unset'); export type UNSET = typeof UNSET; @@ -20,35 +19,6 @@ export interface IPropParent { export type ValueTypes = 'unset' | 'literal' | 'map' | 'list' | 'expression' | 'slot'; -function hasItemsInMetadata(prop: Prop) { - const path = prop.path; - const { configure } = prop.getNode().componentMeta.getMetadata(); - if (!path || path.length === 0) return false; - let props = configure?.props; - while (path.length > 0) { - let name = path.shift(); - let matchedProp = getMatchedProp(props, name!); - if (!matchedProp) return false; - if (path.length === 0) return !!matchedProp?.items; - props = matchedProp.items; - } -} - -function getMatchedProp(props: FieldConfig[] | undefined, name: string): FieldConfig | null { - let found = null; - if (!props) return null; - for (const prop of props) { - if (prop.name === name) { - found = prop; - break; - } else if (prop.type === 'group' && prop.items) { - found = getMatchedProp(prop.items, name); - if (found) return found; - } - } - return found; -} - export class Prop implements IPropParent { readonly isProp = true; @@ -286,19 +256,6 @@ export class Prop implements IPropParent { this.dispose(); - // 将父属性设置成一个对象,得同时把子属性都设值,同时清空其他子属性 - if (this._type === 'map' && isPlainObject(val)) { - this.items?.forEach((item) => { - // @ts-ignore - if ([item.key] in val) { - // @ts-ignore - item.setValue(val[item.key]); - } else { - this.clearPropValue(item.key!); - } - }); - } - if (oldValue !== this._value) { editor?.emit('node.innerProp.change', { node: this.owner, @@ -407,13 +364,8 @@ export class Prop implements IPropParent { return (this.parent.path || []).concat(this.key as string); } - private get items(): Prop[] | null { - // 不在元数据配置项中的,不产生 items - if (!hasItemsInMetadata(this)) return null; - let _items: any; - untracked(() => { - _items = this._items; - }); + @computed private get items(): Prop[] | null { + let _items: any = this._items; if (!_items) { if (this._type === 'list') { const data = this._value; diff --git a/packages/designer/tests/document/node/node.modify.test.ts b/packages/designer/tests/document/node/node.modify.test.ts index 145610899..cd157868b 100644 --- a/packages/designer/tests/document/node/node.modify.test.ts +++ b/packages/designer/tests/document/node/node.modify.test.ts @@ -89,12 +89,12 @@ describe('schema 生成节点模型测试', () => { b: false, c: 'string', }); - // const objAProp = formNode?.getProp('obj.a'); - // const objBProp = formNode?.getProp('obj.b'); - // const objCProp = formNode?.getProp('obj.c'); - // expect(objAProp?.getValue()).toBe(1); - // expect(objBProp?.getValue()).toBe(false); - // expect(objCProp?.getValue()).toBe('string'); + const objAProp = formNode?.getProp('obj.a'); + const objBProp = formNode?.getProp('obj.b'); + const objCProp = formNode?.getProp('obj.c'); + expect(objAProp?.getValue()).toBe(1); + expect(objBProp?.getValue()).toBe(false); + expect(objCProp?.getValue()).toBe('string'); const idProp = formNode?.getExtraProp('extraPropA'); expect(idProp?.getValue()).toBe('extraPropA'); @@ -154,17 +154,17 @@ describe('schema 生成节点模型测试', () => { formNode?.setPropValue('obj.a', 3); formNode?.setPropValue('obj.b', false); formNode?.setPropValue('obj.c', 'string'); - // const objAProp = formNode?.getProp('obj.a'); - // const objBProp = formNode?.getProp('obj.b'); - // const objCProp = formNode?.getProp('obj.c'); - // expect(objAProp?.getValue()).toBe(3); - // expect(objBProp?.getValue()).toBe(false); - // expect(objCProp?.getValue()).toBe('string'); - // expect(objProp?.getValue()).toEqual({ - // a: 3, - // b: false, - // c: 'string', - // }); + const objAProp = formNode?.getProp('obj.a'); + const objBProp = formNode?.getProp('obj.b'); + const objCProp = formNode?.getProp('obj.c'); + expect(objAProp?.getValue()).toBe(3); + expect(objBProp?.getValue()).toBe(false); + expect(objCProp?.getValue()).toBe('string'); + expect(objProp?.getValue()).toEqual({ + a: 3, + b: false, + c: 'string', + }); }); it('修改普通属性,string | number | object,使用 Props 实例接口', () => { @@ -222,17 +222,17 @@ describe('schema 生成节点模型测试', () => { props?.setPropValue('obj.a', 3); props?.setPropValue('obj.b', false); props?.setPropValue('obj.c', 'string'); - // const objAProp = formNode?.getProp('obj.a'); - // const objBProp = formNode?.getProp('obj.b'); - // const objCProp = formNode?.getProp('obj.c'); - // expect(objAProp?.getValue()).toBe(3); - // expect(objBProp?.getValue()).toBe(false); - // expect(objCProp?.getValue()).toBe('string'); - // expect(objProp?.getValue()).toEqual({ - // a: 3, - // b: false, - // c: 'string', - // }); + const objAProp = formNode?.getProp('obj.a'); + const objBProp = formNode?.getProp('obj.b'); + const objCProp = formNode?.getProp('obj.c'); + expect(objAProp?.getValue()).toBe(3); + expect(objBProp?.getValue()).toBe(false); + expect(objCProp?.getValue()).toBe('string'); + expect(objProp?.getValue()).toEqual({ + a: 3, + b: false, + c: 'string', + }); }); it('修改普通属性,string | number | object,使用 Prop 实例接口', () => { @@ -296,11 +296,11 @@ describe('schema 生成节点模型测试', () => { expect(objAProp?.getValue()).toBe(3); expect(objBProp?.getValue()).toBe(false); expect(objCProp?.getValue()).toBe('string'); - // expect(objProp?.getValue()).toEqual({ - // a: 3, - // b: false, - // c: 'string', - // }); + expect(objProp?.getValue()).toEqual({ + a: 3, + b: false, + c: 'string', + }); }); }); diff --git a/packages/designer/tests/document/node/props/prop.test_wip.ts b/packages/designer/tests/document/node/props/prop.test.ts similarity index 100% rename from packages/designer/tests/document/node/props/prop.test_wip.ts rename to packages/designer/tests/document/node/props/prop.test.ts diff --git a/packages/designer/tests/document/node/props/props.test_wip.ts b/packages/designer/tests/document/node/props/props.test.ts similarity index 100% rename from packages/designer/tests/document/node/props/props.test_wip.ts rename to packages/designer/tests/document/node/props/props.test.ts diff --git a/packages/editor-skeleton/src/components/object-setter/index.tsx b/packages/editor-skeleton/src/components/object-setter/index.tsx index ec309ff2c..eb0bd6058 100644 --- a/packages/editor-skeleton/src/components/object-setter/index.tsx +++ b/packages/editor-skeleton/src/components/object-setter/index.tsx @@ -159,23 +159,32 @@ interface FormSetterProps { config: ObjectSetterConfig; } class FormSetter extends Component { - private items: SettingField[]; + private items: (SettingField | CustomView)[]; constructor(props: RowSetterProps) { super(props); const { config, field } = props; const { extraProps } = field; - field.items.forEach((item: SettingField | CustomView) => { - if (isSettingField(item)) { - const originalSetValue = item.extraProps.setValue; - item.extraProps.setValue = (...args) => { - // 调用子字段本身的 setValue - originalSetValue?.apply(null, args); - // 调用父字段本身的 setValue - extraProps.setValue?.apply(null, args); - }; - } - }); + + if (Array.isArray(field.items) && field.items.length > 0) { + field.items.forEach((item: SettingField | CustomView) => { + if (isSettingField(item)) { + const originalSetValue = item.extraProps.setValue; + item.extraProps.setValue = (...args) => { + // 调用子字段本身的 setValue + originalSetValue?.apply(null, args); + // 调用父字段本身的 setValue + extraProps.setValue?.apply(null, args); + }; + } + }); + this.items = field.items; + } else { + this.items = (config?.items || []).map((conf) => field.createField({ + ...conf, + setValue: extraProps?.setValue, + })); + } // TODO: extraConfig for custom fields } @@ -187,7 +196,7 @@ class FormSetter extends Component { const { field } = this.props; return (
- {field.items.map((item, index) => createSettingFieldView(item, field, index))} + {this.items.map((item, index) => createSettingFieldView(item, field, index))}
); } diff --git a/packages/editor-skeleton/src/components/settings/settings-pane.tsx b/packages/editor-skeleton/src/components/settings/settings-pane.tsx index a003318b5..16f9ae138 100644 --- a/packages/editor-skeleton/src/components/settings/settings-pane.tsx +++ b/packages/editor-skeleton/src/components/settings/settings-pane.tsx @@ -24,7 +24,7 @@ class SettingFieldView extends Component<{ field: SettingField }> { const { field } = this.props; const { extraProps, componentMeta } = field; const { condition, defaultValue, display } = extraProps; - const { prototype } = componentMeta; + const { prototype } = componentMeta!; let visible; try { visible = typeof condition === 'function' ? condition(field) !== false : true; From cabb91ab8b8f9ebe573b07a676aba446977f065a Mon Sep 17 00:00:00 2001 From: "jianhui.fjh" Date: Wed, 16 Jun 2021 16:55:28 +0800 Subject: [PATCH 12/27] =?UTF-8?q?fix:=20node=E6=94=AF=E6=8C=81getRGL?= =?UTF-8?q?=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/src/builtin-simulator/host.ts | 21 +---- packages/designer/src/designer/dragon.ts | 12 +-- packages/designer/src/document/node/node.ts | 82 +++++++++++++++---- 3 files changed, 75 insertions(+), 40 deletions(-) diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index de53e8cf7..1a5d12cfd 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -557,14 +557,14 @@ export class BuiltinSimulatorHost implements ISimulatorHost { const _nodeInst = this.getNodeInstanceFromElement(e.target as Element); - const { isRGL: _isRGL, rglNode: _rglNode } = this.getRGLObject( - _nodeInst as NodeInstance, - ); + const _node = _nodeInst?.node; + if (!_node) return { status: false }; + const { isRGL: _isRGL, rglNode: _rglNode } = _node.getRGL(); const status = !!( _isRGL && _rglNode?.id !== rglNode?.id && _rglNode?.getParent() !== node && - nodeInst?.node !== _nodeInst?.node + _node !== nodeInst?.node ); return { status, rglNode: _rglNode }; }; @@ -734,19 +734,6 @@ export class BuiltinSimulatorHost implements ISimulatorHost void; - /** - * 获取node实例的磁贴相关信息 - */ - getRGLObject(nodeInst: NodeInstance) { - const isContainerNode = nodeInst?.node.isContainer(); - const isEmptyNode = nodeInst?.node?.isEmpty(); - const isRGLContainerNode = nodeInst?.node?.isRGLContainer; - const isRGLNode = nodeInst?.node?.getParent()?.isRGLContainer; - const isRGL = isRGLContainerNode || (isRGLNode && (!isContainerNode || !isEmptyNode)); - let rglNode = isRGLContainerNode ? nodeInst?.node : isRGL ? nodeInst?.node?.getParent() : {}; - return { isContainerNode, isEmptyNode, isRGLContainerNode, isRGLNode, isRGL, rglNode }; - } - /** * 设置悬停处理 */ diff --git a/packages/designer/src/designer/dragon.ts b/packages/designer/src/designer/dragon.ts index 5e8c63b9d..e2525b172 100644 --- a/packages/designer/src/designer/dragon.ts +++ b/packages/designer/src/designer/dragon.ts @@ -76,10 +76,6 @@ export interface ISensor { * 获取节点实例 */ getNodeInstanceFromElement(e: Element | null): NodeInstance | null; - /** - * 获取RGL相关信息 - */ - getRGLObject(nodeInst: NodeInstance): any; } export type DragObject = DragNodeObject | DragNodeDataObject | DragAnyObject; @@ -263,12 +259,12 @@ export class Dragon { this._dragging = false; - const getRGLObject = (e: MouseEvent | DragEvent) => { + const getRGL = (e: MouseEvent | DragEvent) => { const locateEvent = createLocateEvent(e); const sensor = chooseSensor(locateEvent); if (!sensor || !sensor.getNodeInstanceFromElement) return {}; const nodeInst = sensor.getNodeInstanceFromElement(e.target as Element); - return sensor.getRGLObject(nodeInst as NodeInstance); + return nodeInst?.node?.getRGL() || {}; }; const checkesc = (e: KeyboardEvent) => { @@ -324,7 +320,7 @@ export class Dragon { lastArrive = e; const locateEvent = createLocateEvent(e); const sensor = chooseSensor(locateEvent); - const { isRGL, rglNode } = getRGLObject(e); + const { isRGL, rglNode } = getRGL(e); if (isRGL) { this._canDrop = !!sensor?.locate(locateEvent); if (this._canDrop) { @@ -403,7 +399,7 @@ export class Dragon { const over = (e?: any) => { // 发送drop事件 if (e) { - const { isRGL, rglNode } = getRGLObject(e); + const { isRGL, rglNode } = getRGL(e); if (isRGL && this._canDrop) { const tarNode = dragObject.nodes[0]; if (rglNode.id !== tarNode.id) { diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index d2dede1bc..9a35e8ceb 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -110,7 +110,7 @@ export class Node { /** * @deprecated */ - private _addons: { [key: string]: { exportData: () => any; isProp: boolean; } } = {}; + private _addons: { [key: string]: { exportData: () => any; isProp: boolean } } = {}; @obx.ref private _parent: ParentalNode | null = null; @@ -177,7 +177,10 @@ export class Node { this.settingEntry = this.document.designer.createSettingEntry([this]); this._children = new NodeChildren(this as ParentalNode, this.initialChildren(children)); this._children.internalInitParent(); - this.props.import(this.upgradeProps(this.initProps(props || {})), this.upgradeProps(extras || {})); + this.props.import( + this.upgradeProps(this.initProps(props || {})), + this.upgradeProps(extras || {}), + ); this.setupAutoruns(); } @@ -221,6 +224,16 @@ export class Node { return children || []; } + private _isRGLContainer = false; + + set isRGLContainer(status: boolean) { + this._isRGLContainer = status; + } + + get isRGLContainer(): boolean { + return !!this._isRGLContainer; + } + isContainer(): boolean { return this.isParental() && this.componentMeta.isContainer; } @@ -335,7 +348,11 @@ export class Node { /** * 移除当前节点 */ - remove(useMutator = true, purge = true, options: NodeRemoveOptions = { suppressRemoveEvent: false }) { + remove( + useMutator = true, + purge = true, + options: NodeRemoveOptions = { suppressRemoveEvent: false }, + ) { if (this.parent) { if (!options.suppressRemoveEvent) { this.document.designer.editor?.emit('node.remove.topLevel', { @@ -616,15 +633,21 @@ export class Node { import(data: Schema, checkId = false) { const { componentName, id, children, props, ...extras } = data; if (this.isSlot()) { - foreachReverse(this.children, (subNode: Node) => { - subNode.remove(true, true); - }, (iterable, idx) => (iterable as NodeChildren).get(idx)); + foreachReverse( + this.children, + (subNode: Node) => { + subNode.remove(true, true); + }, + (iterable, idx) => (iterable as NodeChildren).get(idx), + ); } if (this.isParental()) { this.props.import(props, extras); (this._children as NodeChildren).import(children, checkId); } else { - this.props.get('children', true)!.setValue(isDOMText(children) || isJSExpression(children) ? children : ''); + this.props + .get('children', true)! + .setValue(isDOMText(children) || isJSExpression(children) ? children : ''); } } @@ -792,7 +815,8 @@ export class Node { * 是否可执行某action */ canPerformAction(action: string): boolean { - const availableActions = this.componentMeta?.availableActions?.map((action) => action.name) || []; + const availableActions = + this.componentMeta?.availableActions?.map((action) => action.name) || []; return availableActions.indexOf(action) >= 0; } @@ -854,7 +878,11 @@ export class Node { return this.children?.onChange(fn); } - mergeChildren(remover: () => any, adder: (children: Node[]) => NodeData[] | null, sorter: () => any) { + mergeChildren( + remover: () => any, + adder: (children: Node[]) => NodeData[] | null, + sorter: () => any, + ) { this.children?.mergeChildren(remover, adder, sorter); } @@ -907,6 +935,21 @@ export class Node { return this.document; } + /** + * 获取磁贴相关信息 + */ + getRGL() { + const isContainerNode = this.isContainer(); + const isEmptyNode = this.isEmpty(); + const isRGLContainerNode = this.isRGLContainer; + const isRGLNode = this.getParent()?.isRGLContainer; + const isRGL = isRGLContainerNode || (isRGLNode && (!isContainerNode || !isEmptyNode)); + let rglNode = isRGLContainerNode ? this : isRGL ? this?.getParent() : {}; + return { isContainerNode, isEmptyNode, isRGLContainerNode, isRGLNode, isRGL, rglNode }; + } + + /** + /** * @deprecated */ @@ -933,9 +976,11 @@ export class Node { return { container: dropElement, ref }; } const rootCanDropIn = this.componentMeta?.prototype?.options?.canDropIn; - if (rootCanDropIn === undefined - || rootCanDropIn === true - || (typeof rootCanDropIn === 'function' && rootCanDropIn(node))) { + if ( + rootCanDropIn === undefined || + rootCanDropIn === true || + (typeof rootCanDropIn === 'function' && rootCanDropIn(node)) + ) { return { container: this, ref }; } // 假如最后找不到合适位置,返回 null 阻止继续插入节点 @@ -944,9 +989,11 @@ export class Node { const canDropIn = this.componentMeta?.prototype?.options?.canDropIn; if (this.isContainer()) { - if (canDropIn === undefined || + if ( + canDropIn === undefined || (typeof canDropIn === 'boolean' && canDropIn) || - (typeof canDropIn === 'function' && canDropIn(node))) { + (typeof canDropIn === 'function' && canDropIn(node)) + ) { return { container: this, ref }; } } @@ -1113,7 +1160,12 @@ export function comparePosition(node1: Node, node2: Node): PositionNO { return PositionNO.BeforeOrAfter; } -export function insertChild(container: ParentalNode, thing: Node | NodeData, at?: number | null, copy?: boolean): Node { +export function insertChild( + container: ParentalNode, + thing: Node | NodeData, + at?: number | null, + copy?: boolean, +): Node { let node: Node; if (isNode(thing) && (copy || thing.isSlot())) { thing = thing.export(TransformStage.Clone); From 71ff7c698daa54465594352374f1fa598d083706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Thu, 17 Jun 2021 11:13:19 +0800 Subject: [PATCH 13/27] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=8C=BA=20stage=20=E5=9B=9E=E5=88=B0=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/editor-skeleton/src/components/stage-box/stage-box.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/editor-skeleton/src/components/stage-box/stage-box.tsx b/packages/editor-skeleton/src/components/stage-box/stage-box.tsx index 92e77db57..f1125d229 100644 --- a/packages/editor-skeleton/src/components/stage-box/stage-box.tsx +++ b/packages/editor-skeleton/src/components/stage-box/stage-box.tsx @@ -45,6 +45,7 @@ export default class StageBox extends Component { } else { const stateName = skeleton.createStage({ content: children, + isRoot: true, }); this.stageChain = new StageChain(skeleton.getStage(stateName as string) as StageWidget); } From b11331fdbf24e0e7d065a16b9ed6a2b32ab76bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Thu, 17 Jun 2021 11:14:03 +0800 Subject: [PATCH 14/27] =?UTF-8?q?fix(vision):=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E5=8E=9F=20vision=20proto=20transducers=20=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/src/document/node/props/props.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/designer/src/document/node/props/props.ts b/packages/designer/src/document/node/props/props.ts index 028d190a0..2d24e477d 100644 --- a/packages/designer/src/document/node/props/props.ts +++ b/packages/designer/src/document/node/props/props.ts @@ -107,6 +107,7 @@ export class Props implements IPropParent { if (this.items.length < 1) { return {}; } + let allProps = {} as any; let props: any = {}; const extras: any = {}; if (this.type === 'list') { @@ -139,6 +140,12 @@ export class Props implements IPropParent { if (value === UNSET) { value = undefined; } + allProps[name] = value; + }); + // compatible vision + const transformedProps = this.transformToStatic(allProps); + Object.keys(transformedProps).forEach((name) => { + const value = transformedProps[name]; if (typeof name === 'string' && name.startsWith(EXTRA_KEY_PREFIX)) { name = getOriginalExtraKey(name); extras[name] = value; @@ -151,6 +158,26 @@ export class Props implements IPropParent { return { props, extras }; } + /** + * @deprecated + */ + private transformToStatic(props: any) { + let transducers = this.owner.componentMeta.prototype?.options?.transducers; + if (!transducers) { + return props; + } + if (!Array.isArray(transducers)) { + transducers = [transducers]; + } + props = transducers.reduce((xprops: any, transducer: any) => { + if (transducer && typeof transducer.toStatic === 'function') { + return transducer.toStatic(xprops); + } + return xprops; + }, props); + return props; + } + /** * 根据 path 路径查询属性 * From e2af81e68031d3a079d67b3bcbbf89fa8de2e6c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Thu, 17 Jun 2021 11:14:36 +0800 Subject: [PATCH 15/27] =?UTF-8?q?fix:=20=E5=85=BC=E5=AE=B9=20icon=20?= =?UTF-8?q?=E4=B8=BA=20esmodule=20=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/utils/src/create-icon.tsx | 4 ++++ packages/utils/src/is-es-module.ts | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/utils/src/create-icon.tsx b/packages/utils/src/create-icon.tsx index a69a042ae..34c405147 100644 --- a/packages/utils/src/create-icon.tsx +++ b/packages/utils/src/create-icon.tsx @@ -2,6 +2,7 @@ import { isValidElement, ReactNode, createElement, cloneElement } from 'react'; import { Icon } from '@alifd/next'; import { IconType } from '@ali/lowcode-types'; import { isReactComponent } from './is-react'; +import { isESModule } from './is-es-module'; const URL_RE = /^(https?:)\/\//i; @@ -9,6 +10,9 @@ export function createIcon(icon?: IconType | null, props?: Record; diff --git a/packages/utils/src/is-es-module.ts b/packages/utils/src/is-es-module.ts index 32839a38b..6a9d0fa9e 100644 --- a/packages/utils/src/is-es-module.ts +++ b/packages/utils/src/is-es-module.ts @@ -1,3 +1,7 @@ -export function isESModule(obj: any): obj is { [key: string]: any } { +export type ESModule = { + __esModule: true; + default: any; +}; +export function isESModule(obj: any): obj is ESModule { return obj && obj.__esModule; } From 3046018a360c46b80b5e0daadeb61c5e7b8895ea Mon Sep 17 00:00:00 2001 From: "jianhui.fjh" Date: Thu, 17 Jun 2021 15:24:53 +0800 Subject: [PATCH 16/27] =?UTF-8?q?feat:=20=E7=A3=81=E8=B4=B4=E5=9D=97?= =?UTF-8?q?=E7=9A=84=E5=A4=8D=E5=88=B6=E6=8C=89=E9=92=AE=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=BB=9A=E5=8A=A8=E5=88=B0=E6=96=B0=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/component-meta.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/designer/src/component-meta.ts b/packages/designer/src/component-meta.ts index 0fe273601..78bd995be 100644 --- a/packages/designer/src/component-meta.ts +++ b/packages/designer/src/component-meta.ts @@ -178,10 +178,10 @@ export class ComponentMeta { this._title = typeof title === 'string' ? { - type: 'i18n', - 'en-US': this.componentName, - 'zh-CN': title, - } + type: 'i18n', + 'en-US': this.componentName, + 'zh-CN': title, + } : title; } @@ -436,6 +436,10 @@ const builtinComponentActions: ComponentAction[] = [ if (parent) { const newNode = doc.insertNode(parent, node, index + 1, true); newNode.select(); + if (node.getRGL().isRGL) { + // 如果是磁贴块复制,则需要滚动到影响位置 + setTimeout(() => newNode.document.simulator?.scrollToNode(newNode), 10); + } } }, }, From efd033c5e57d203deea53daf9b62374afb9854b3 Mon Sep 17 00:00:00 2001 From: "jianhui.fjh" Date: Thu, 17 Jun 2021 18:39:09 +0800 Subject: [PATCH 17/27] =?UTF-8?q?fix:=20=E5=A4=8D=E5=88=B6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=A3=81=E8=B4=B4=E5=A4=A7=E5=B0=8F=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/component-meta.ts | 11 ++++++++++- packages/designer/src/designer/builtin-hotkey.ts | 4 +++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/designer/src/component-meta.ts b/packages/designer/src/component-meta.ts index 78bd995be..398f827d2 100644 --- a/packages/designer/src/component-meta.ts +++ b/packages/designer/src/component-meta.ts @@ -436,7 +436,16 @@ const builtinComponentActions: ComponentAction[] = [ if (parent) { const newNode = doc.insertNode(parent, node, index + 1, true); newNode.select(); - if (node.getRGL().isRGL) { + const { isRGL, rglNode } = node.getRGL(); + if (isRGL) { + // 复制layout信息 + let layout = rglNode.getPropValue('layout'); + let curLayout = layout.filter((item) => item.i === node.getPropValue('fieldId')); + layout.push({ + ...curLayout[0], + i: newNode.getPropValue('fieldId'), + }); + rglNode.setPropValue('layout', layout); // 如果是磁贴块复制,则需要滚动到影响位置 setTimeout(() => newNode.document.simulator?.scrollToNode(newNode), 10); } diff --git a/packages/designer/src/designer/builtin-hotkey.ts b/packages/designer/src/designer/builtin-hotkey.ts index 1ea18c9ad..73cc409b4 100644 --- a/packages/designer/src/designer/builtin-hotkey.ts +++ b/packages/designer/src/designer/builtin-hotkey.ts @@ -6,7 +6,9 @@ import clipboard from './clipboard'; function isInLiveEditing() { if (globalContext.has(Editor)) { - return Boolean(globalContext.get(Editor).get('designer')?.project?.simulator?.liveEditing?.editing); + return Boolean( + globalContext.get(Editor).get('designer')?.project?.simulator?.liveEditing?.editing, + ); } } From 8b0c9189e2af82596b6cf8c24df3c7756a4c182c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Fri, 18 Jun 2021 12:01:17 +0800 Subject: [PATCH 18/27] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=85=83=E6=95=B0=E6=8D=AE=E6=9B=B4=E6=96=B0=E5=90=8E?= =?UTF-8?q?=20SettingTopEntry=20=E6=9C=AA=E5=90=8C=E6=AD=A5=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E7=9A=84=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/component-meta.ts | 15 +++++++++++++++ .../src/designer/setting/setting-top-entry.ts | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/packages/designer/src/component-meta.ts b/packages/designer/src/component-meta.ts index 398f827d2..e40256d40 100644 --- a/packages/designer/src/component-meta.ts +++ b/packages/designer/src/component-meta.ts @@ -23,6 +23,7 @@ import { IconRemove } from './icons/remove'; import { IconClone } from './icons/clone'; import { ReactElement } from 'react'; import { IconHidden } from './icons/hidden'; +import EventEmitter from 'events'; function ensureAList(list?: string | string[]): string[] | null { if (!list) { @@ -66,6 +67,8 @@ export class ComponentMeta { private _npm?: NpmInfo; + private emitter: EventEmitter = new EventEmitter(); + get npm() { return this._npm; } @@ -229,6 +232,11 @@ export class ComponentMeta { this._isContainer = false; this._isModal = false; } + this.emitter.emit('metadata_change'); + } + + refreshMetadata() { + this.parseMetadata(this.getMetadata()); } private transformMetadata(metadta: ComponentMetadata): TransformedComponentMetadata { @@ -297,6 +305,13 @@ export class ComponentMeta { return true; } + onMetadataChange(fn: (args: any) => void): () => void { + this.emitter.on('metadata_change', fn); + return () => { + this.emitter.removeListener('metadata_change', fn); + }; + } + // compatiable vision prototype?: any; } diff --git a/packages/designer/src/designer/setting/setting-top-entry.ts b/packages/designer/src/designer/setting/setting-top-entry.ts index ab09d355c..6e03cc66a 100644 --- a/packages/designer/src/designer/setting/setting-top-entry.ts +++ b/packages/designer/src/designer/setting/setting-top-entry.ts @@ -80,6 +80,8 @@ export class SettingTopEntry implements SettingEntry { // clear fields this.setupItems(); + + this.setupEvents(); } private setupComponentMeta() { @@ -120,6 +122,12 @@ export class SettingTopEntry implements SettingEntry { } } + private setupEvents() { + this.componentMeta?.onMetadataChange(() => { + this.setupItems(); + }); + } + /** * 获取当前属性值 */ From 3c07142f711644e4cb0837d6244142efb79b2ac5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8A=9B=E7=9A=93?= Date: Fri, 18 Jun 2021 16:45:34 +0800 Subject: [PATCH 19/27] =?UTF-8?q?fix:=20=E5=85=B3=E9=97=AD=E4=BD=8E?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=84=E4=BB=B6=E5=9C=A8=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E6=97=B6=E7=9A=84=E5=8E=9F=E5=9C=B0=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/builtin-simulator/host.ts | 4 ++-- packages/designer/src/document/node/node.ts | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 1a5d12cfd..7ad6547bb 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -17,7 +17,7 @@ import { } from '../simulator'; import Viewport from './viewport'; import { createSimulator } from './create-simulator'; -import { Node, ParentalNode, contains, isRootNode } from '../document'; +import { Node, ParentalNode, contains, isRootNode, isLowCodeComponent } from '../document'; import ResourceConsumer from './resource-consumer'; import { AssetLevel, @@ -792,7 +792,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost Date: Tue, 22 Jun 2021 10:58:09 +0800 Subject: [PATCH 20/27] =?UTF-8?q?refactor(perf):=20=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=20settingEntry=20=E6=8C=89=E9=9C=80=E6=9E=84?= =?UTF-8?q?=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/document/node/node.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index b55ee359a..9dfde4baf 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -156,8 +156,6 @@ export class Node { return this.componentMeta.icon; } - readonly settingEntry: SettingTopEntry; - private isInited = false; constructor(readonly document: DocumentModel, nodeSchema: Schema, options: any = {}) { @@ -168,13 +166,11 @@ export class Node { this.props = new Props(this, { children: isDOMText(children) || isJSExpression(children) ? children : '', }); - this.settingEntry = this.document.designer.createSettingEntry([this]); } else { // 这里 props 被初始化两次,一次 new,一次 import,new 的实例需要给 propsReducer 的钩子去使用, // import 是为了使用钩子返回的值,并非完全幂等的操作,部分行为执行两次会有 bug, // 所以在 props 里会对 new / import 做一些区别化的解析 this.props = new Props(this, props, extras); - this.settingEntry = this.document.designer.createSettingEntry([this]); this._children = new NodeChildren(this as ParentalNode, this.initialChildren(children)); this._children.internalInitParent(); this.props.import( @@ -188,6 +184,14 @@ export class Node { this.emitter = new EventEmitter(); } + _settingEntry: SettingTopEntry; + + get settingEntry(): SettingTopEntry { + if (this._settingEntry) return this._settingEntry; + this._settingEntry = this.document.designer.createSettingEntry([this]); + return this._settingEntry; + } + private initProps(props: any): any { return this.document.designer.transformProps(props, this, TransformStage.Init); } From 6827ac3650aa98096dc088eb35c20bd7766a5734 Mon Sep 17 00:00:00 2001 From: "jianhui.fjh" Date: Wed, 23 Jun 2021 17:02:32 +0800 Subject: [PATCH 21/27] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=8D?= =?UTF-8?q?=E5=88=B6=E7=BB=84=E4=BB=B6=E9=97=AE=E9=A2=98=20to=20#34464969?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/component-meta.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/designer/src/component-meta.ts b/packages/designer/src/component-meta.ts index 398f827d2..d3f75fc6c 100644 --- a/packages/designer/src/component-meta.ts +++ b/packages/designer/src/component-meta.ts @@ -439,15 +439,17 @@ const builtinComponentActions: ComponentAction[] = [ const { isRGL, rglNode } = node.getRGL(); if (isRGL) { // 复制layout信息 - let layout = rglNode.getPropValue('layout'); + let layout = rglNode.getPropValue('layout') || []; let curLayout = layout.filter((item) => item.i === node.getPropValue('fieldId')); - layout.push({ - ...curLayout[0], - i: newNode.getPropValue('fieldId'), - }); - rglNode.setPropValue('layout', layout); - // 如果是磁贴块复制,则需要滚动到影响位置 - setTimeout(() => newNode.document.simulator?.scrollToNode(newNode), 10); + if (curLayout && curLayout[0]) { + layout.push({ + ...curLayout[0], + i: newNode.getPropValue('fieldId'), + }); + rglNode.setPropValue('layout', layout); + // 如果是磁贴块复制,则需要滚动到影响位置 + setTimeout(() => newNode.document.simulator?.scrollToNode(newNode), 10); + } } } }, From 0d6b6905942b0fa367cb25dd34719579e2ab00e3 Mon Sep 17 00:00:00 2001 From: "lihao.ylh" Date: Thu, 24 Jun 2021 14:16:52 +0800 Subject: [PATCH 22/27] =?UTF-8?q?fix:=20=E6=81=A2=E5=A4=8D=20fixEvent=20/?= =?UTF-8?q?=20locate=20=E7=9A=84=E8=B0=83=E7=94=A8=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/designer/dragon.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/designer/src/designer/dragon.ts b/packages/designer/src/designer/dragon.ts index e2525b172..eb08e7b4a 100644 --- a/packages/designer/src/designer/dragon.ts +++ b/packages/designer/src/designer/dragon.ts @@ -339,8 +339,8 @@ export class Dragon { this.emitter.emit('rgl.remove.placeholder'); } if (sensor) { - sensor.locate(locateEvent); sensor.fixEvent(locateEvent); + sensor.locate(locateEvent); } else { designer.clearLocation(); } From b5edc4b140f18e3224e659f64ae3de6f11a652a7 Mon Sep 17 00:00:00 2001 From: "lihao.ylh" Date: Thu, 24 Jun 2021 14:32:19 +0800 Subject: [PATCH 23/27] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E5=88=B6=E7=94=BB=E5=B8=83=E4=B8=AD=E8=A2=AB=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E7=9A=84=E8=8A=82=E7=82=B9=E9=80=89=E6=8B=A9=E5=99=A8?= =?UTF-8?q?=20-=20customizeIgnoreSelectors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/builtin-simulator/host.ts | 4 +++- packages/engine/src/engine-core.ts | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 7ad6547bb..09080c7a8 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -695,8 +695,9 @@ export class BuiltinSimulatorHost implements ISimulatorHost defaultSelectors); // TODO: need more elegant solution to ignore click events of components in designer - const ignoreSelectors: any = [ + const defaultIgnoreSelectors: any = [ '.next-input-group', '.next-checkbox-group', '.next-checkbox-wrapper', @@ -718,6 +719,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost selectors + */ + customizeIgnoreSelectors?: (defaultIgnoreSelectors: string[]) => string[]; /** * Vision-polyfill settings */ From 97099d0d0b7d1cf7bbee53736d79859f7f9cca5b Mon Sep 17 00:00:00 2001 From: "lihao.ylh" Date: Thu, 24 Jun 2021 14:37:49 +0800 Subject: [PATCH 24/27] =?UTF-8?q?refactor(publish):=20=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E5=8C=85=E7=9A=84=20changelog=20=E7=94=9F?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index ad2023cce..d0e32422d 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,9 @@ "clean": "rm -rf ./packages/*/lib ./packages/*/es ./packages/*/dist ./packages/*/build", "lint": "eslint --ext .ts,.tsx,.js,.jsx ./ --quiet", "lint:fix": "eslint --ext .ts,.tsx,.js,.jsx ./ --quiet --fix", - "pub": "tnpm run watchdog:build && lerna publish patch --force-publish --exact", - "pub:prepatch": "tnpm run watchdog:build && lerna publish prepatch --force-publish --exact --dist-tag beta --preid beta", - "pub:prerelease": "tnpm run watchdog:build && lerna publish prerelease --force-publish --exact --dist-tag beta --preid beta", + "pub": "tnpm run watchdog:build && lerna publish patch --force-publish --exact --no-changelog", + "pub:prepatch": "tnpm run watchdog:build && lerna publish prepatch --force-publish --exact --dist-tag beta --preid beta --no-changelog", + "pub:prerelease": "tnpm run watchdog:build && lerna publish prerelease --force-publish --exact --dist-tag beta --preid beta --no-changelog", "setup": "./scripts/setup.sh", "setup:skip-build": "./scripts/setup-skip-build.sh", "start": "./scripts/start.sh", From f68ad97cd5159e912481d8c3387820d8fa3f408b Mon Sep 17 00:00:00 2001 From: "lihao.ylh" Date: Thu, 24 Jun 2021 14:40:43 +0800 Subject: [PATCH 25/27] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=20prop=20/=20s?= =?UTF-8?q?etting-prop-entry=20/=20setting-top-entry=20=E9=83=A8=E5=88=86?= =?UTF-8?q?=E7=9A=84=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/jest.config.js | 3 +- .../designer/setting/setting-prop-entry.ts | 8 +- packages/designer/src/document/node/node.ts | 2 +- .../designer/src/document/node/props/prop.ts | 22 +--- .../designer/src/document/node/props/props.ts | 3 +- .../tests/builtin-simulator/host.test.ts | 4 +- .../setting/setting-prop-entry.test.ts | 120 +++++++++++++++++- .../setting/setting-top-entry.test.ts | 26 ++++ .../tests/document/node/node.add.test.ts | 4 + .../tests/document/node/props/prop.test.ts | 115 ++++++++++++++--- .../tests/document/node/props/props.test.ts | 2 +- .../node/props/value-to-source.test.ts | 1 + .../designer/tests/project/project.test.ts | 8 ++ tsconfig.json | 2 +- 14 files changed, 269 insertions(+), 51 deletions(-) diff --git a/packages/designer/jest.config.js b/packages/designer/jest.config.js index 1a6063f1a..0c79d473b 100644 --- a/packages/designer/jest.config.js +++ b/packages/designer/jest.config.js @@ -6,7 +6,7 @@ module.exports = { // // '^.+\\.(ts|tsx)$': 'ts-jest', // // '^.+\\.(js|jsx)$': 'babel-jest', // }, - // testMatch: ['**/node.add.test.ts'], + // testMatch: ['**/setting-prop-entry.test.ts'], // testMatch: ['(/tests?/.*(test))\\.[jt]s$'], transformIgnorePatterns: [ `/node_modules/(?!${esModules})/`, @@ -22,6 +22,7 @@ module.exports = { '!src/builtin-simulator/utils/**', '!src/plugin/sequencify.ts', '!src/document/node/exclusive-group.ts', + '!src/document/node/props/value-to-source.ts', '!**/node_modules/**', '!**/vendor/**', ], diff --git a/packages/designer/src/designer/setting/setting-prop-entry.ts b/packages/designer/src/designer/setting/setting-prop-entry.ts index 351af3cfe..5a8a369d1 100644 --- a/packages/designer/src/designer/setting/setting-prop-entry.ts +++ b/packages/designer/src/designer/setting/setting-prop-entry.ts @@ -118,6 +118,7 @@ export class SettingPropEntry implements SettingEntry { * 1 类似值,比如数组长度一样 * 2 单一植 */ + /* istanbul ignore next */ @computed get valueState(): number { if (this.type !== 'field') { const { getValue } = this.extraProps; @@ -155,7 +156,6 @@ export class SettingPropEntry implements SettingEntry { try { return getValue ? getValue(this, val) : val; } catch (e) { - // todo: add log console.warn(e); return val; } @@ -175,7 +175,7 @@ export class SettingPropEntry implements SettingEntry { try { setValue(this, val); } catch (e) { - // todo: add log + /* istanbul ignore next */ console.warn(e); } } @@ -198,7 +198,7 @@ export class SettingPropEntry implements SettingEntry { try { setValue(this, undefined); } catch (e) { - // todo: add log + /* istanbul ignore next */ console.warn(e); } } @@ -320,7 +320,7 @@ export class SettingPropEntry implements SettingEntry { return; } const v = this.getValue(); - if (isJSExpression(v)) { + if (this.isUseVariable()) { this.setValue(v.mock); } else { this.setValue({ diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 9dfde4baf..0bc849f1a 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -1096,7 +1096,7 @@ export function isRootNode(node: Node): node is RootNode { } export function isLowCodeComponent(node: Node): boolean { - return node.componentMeta.getMetadata().devMode === 'lowcode'; + return node.componentMeta?.getMetadata().devMode === 'lowcode'; } export function getZLevelTop(child: Node, zLevel: number): Node | null { diff --git a/packages/designer/src/document/node/props/prop.ts b/packages/designer/src/document/node/props/prop.ts index 79a3564f9..f8237e8f0 100644 --- a/packages/designer/src/document/node/props/prop.ts +++ b/packages/designer/src/document/node/props/prop.ts @@ -98,7 +98,7 @@ export class Prop implements IPropParent { return this.export(TransformStage.Serilize); } - export(stage: TransformStage = TransformStage.Save): CompositeValue | UNSET { + export(stage: TransformStage = TransformStage.Save): CompositeValue { stage = compatStage(stage); const type = this._type; if (stage === TransformStage.Render && this.key === '___condition___') { @@ -110,7 +110,6 @@ export class Prop implements IPropParent { } if (type === 'unset') { - // return UNSET; @康为 之后 review 下这块改造 return undefined; } @@ -147,10 +146,6 @@ export class Prop implements IPropParent { const maps: any = {}; this.items!.forEach((prop, key) => { const v = prop.export(stage); - // if (v !== UNSET) { - // maps[prop.key == null ? key : prop.key] = v; - // } - // @康为 之后 review 下这块改造 maps[prop.key == null ? key : prop.key] = v; }); return maps; @@ -161,12 +156,9 @@ export class Prop implements IPropParent { return this._value; } return this.items!.map((prop) => { - const v = prop.export(stage); - return v === UNSET ? undefined : v; + return prop.export(stage); }); } - - return undefined; } private _code: string | null = null; @@ -246,7 +238,7 @@ export class Prop implements IPropParent { } else { this._type = 'map'; } - } else { + } /* istanbul ignore next */ else { this._type = 'expression'; this._value = { type: 'JSExpression', @@ -267,11 +259,7 @@ export class Prop implements IPropParent { } @computed getValue(): CompositeValue { - const v = this.export(TransformStage.Serilize); - if (v === UNSET) { - return undefined; - } - return v; + return this.export(TransformStage.Serilize); } private dispose() { @@ -563,7 +551,7 @@ export class Prop implements IPropParent { items.push(prop); maps.set(key, prop); } - } else { + } /* istanbul ignore next */ else { return null; } diff --git a/packages/designer/src/document/node/props/props.ts b/packages/designer/src/document/node/props/props.ts index 2d24e477d..1e900710f 100644 --- a/packages/designer/src/document/node/props/props.ts +++ b/packages/designer/src/document/node/props/props.ts @@ -161,8 +161,9 @@ export class Props implements IPropParent { /** * @deprecated */ + /* istanbul ignore next */ private transformToStatic(props: any) { - let transducers = this.owner.componentMeta.prototype?.options?.transducers; + let transducers = this.owner.componentMeta?.prototype?.options?.transducers; if (!transducers) { return props; } diff --git a/packages/designer/tests/builtin-simulator/host.test.ts b/packages/designer/tests/builtin-simulator/host.test.ts index 9b4121267..ab96b20ec 100644 --- a/packages/designer/tests/builtin-simulator/host.test.ts +++ b/packages/designer/tests/builtin-simulator/host.test.ts @@ -408,7 +408,7 @@ describe('Host 测试', () => { host.setupContextMenu(); host.getNodeInstanceFromElement = () => { return { - node: { componentMeta: { componentName: 'Button' } }, + node: { componentMeta: { componentName: 'Button', getMetadata() { return {} } } }, }; }; const mockFn = jest.fn(); @@ -428,7 +428,7 @@ describe('Host 测试', () => { dispatchEvent() {}, }; - // 非法分支测试 + // 非法分支测试 host.mountContentFrame(); expect(host._iframe).toBeUndefined(); diff --git a/packages/designer/tests/designer/setting/setting-prop-entry.test.ts b/packages/designer/tests/designer/setting/setting-prop-entry.test.ts index 655dea54c..e5bb5f6c5 100644 --- a/packages/designer/tests/designer/setting/setting-prop-entry.test.ts +++ b/packages/designer/tests/designer/setting/setting-prop-entry.test.ts @@ -1,8 +1,11 @@ +// @ts-nocheck import set from 'lodash/set'; import cloneDeep from 'lodash/cloneDeep'; import '../../fixtures/window'; import { Editor } from '@ali/lowcode-editor-core'; import { Project } from '../../../src/project/project'; +import { SettingTopEntry } from '../../../src/designer/setting/setting-top-entry'; +import { SettingPropEntry } from '../../../src/designer/setting/setting-prop-entry'; import { Node } from '../../../src/document/node/node'; import { Designer } from '../../../src/designer/designer'; import formSchema from '../../../fixtures/schema/form'; @@ -28,6 +31,119 @@ describe('setting-prop-entry 测试', () => { doc = null; }); + describe('纯粹的 UnitTest', () => { + let mockNode: Node; + let mockTopEntry: SettingTopEntry; + beforeEach(() => { + mockNode = new Node(designer.currentDocument, { + componentName: 'Button', + props: { + a: 'str', + b: 222, + obj: { + x: 1, + }, + jse: { + type: 'JSExpression', + value: 'state.a', + mock: 111, + } + }, + }); + mockTopEntry = new SettingTopEntry(editor, [mockNode]); + }); + afterEach(() => { + mockNode = null; + mockTopEntry = null; + }); + + it('常规方法', () => { + // type: group 类型 + const prop = new SettingPropEntry(mockTopEntry, 'xGroup', 'group'); + expect(prop.setKey('xxx')).toBeUndefined(); + expect(prop.remove()).toBeUndefined(); + + const prop2 = new SettingPropEntry(mockTopEntry, '#xGroup'); + expect(prop2.setKey('xxx')).toBeUndefined(); + expect(prop2.remove()).toBeUndefined(); + + expect(prop.getVariableValue()).toBe(''); + }); + + it('setValue / getValue / onValueChange', () => { + // 获取已有的 prop + const prop1 = mockTopEntry.getProp('a'); + prop1.extraProps = { + getValue: (prop, val) => `prefix ${val}`, + setValue: (prop, val) => { prop.setValue(`modified ${val}`, false, false, { disableMutator: true }) }, + defaultValue: 'default', + }; + + expect(prop1.getDefaultValue()).toBe('default'); + expect(prop1.getValue()).toBe('prefix str'); + + // disableMutator: true + prop1.setValue('bbb', false, false, { disableMutator: true }); + expect(prop1.getValue()).toBe('prefix bbb'); + + // disableMutator: false + prop1.setValue('bbb'); + expect(prop1.getValue()).toBe('prefix modified bbb'); + + const mockFn3 = jest.fn(); + const prop2 = mockTopEntry.getProp('obj'); + const prop3 = prop2.get('x'); + const offFn = prop3.onValueChange(mockFn3); + expect(prop3.getValue()).toBe(1); + prop3.setValue(2); + expect(mockFn3).toHaveBeenCalled(); + + offFn(); + prop3.setValue(3); + mockFn3.mockClear(); + expect(mockFn3).toHaveBeenCalledTimes(0); + + const prop4 = mockTopEntry.getProp('b'); + prop4.extraProps = { + getValue: () => { throw 'error'; }, + }; + expect(prop4.getValue()).toBe(222); + }); + + it('clearValue', () => { + const prop1 = mockTopEntry.getProp('a'); + prop1.clearValue(); + expect(prop1.getValue()).toBeUndefined(); + + const mockFn = jest.fn(); + prop1.extraProps = { + setValue: mockFn, + }; + prop1.clearValue(); + expect(mockFn).toHaveBeenCalled(); + }); + + it('getVariableValue/ setUseVariable / isUseVariable / getMockOrValue', () => { + const prop1 = mockTopEntry.getProp('jse'); + + expect(prop1.isUseVariable()).toBeTruthy(); + expect(prop1.useVariable).toBeTruthy(); + + expect(prop1.getMockOrValue()).toEqual(111); + expect(prop1.getVariableValue()).toEqual('state.a'); + + prop1.setUseVariable(false); + expect(prop1.getValue()).toEqual(111); + prop1.setUseVariable(true); + expect(prop1.getValue()).toEqual({ + type: 'JSExpression', + value: '', + mock: 111, + }); + prop1.setUseVariable(true); + }); + }); + describe('node 构造函数生成 settingEntry', () => { it('常规方法测试', () => { const divNode = doc?.getNode('div'); @@ -81,9 +197,7 @@ describe('setting-prop-entry 测试', () => { expect(divNode?.getProp('behavior').getValue()).toBeUndefined(); }); - it.skip('type: group 场景测试', () => { - - }); + it.skip('type: group 场景测试', () => {}); it('JSExpression 类型的 prop', () => { designer.createComponentMeta(divMeta); diff --git a/packages/designer/tests/designer/setting/setting-top-entry.test.ts b/packages/designer/tests/designer/setting/setting-top-entry.test.ts index 94fdbab90..b0dc27012 100644 --- a/packages/designer/tests/designer/setting/setting-top-entry.test.ts +++ b/packages/designer/tests/designer/setting/setting-top-entry.test.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import set from 'lodash/set'; import cloneDeep from 'lodash/cloneDeep'; import '../../fixtures/window'; @@ -75,6 +76,31 @@ describe('setting-top-entry 测试', () => { settingEntry.getValue(); }); + it('onMetadataChange', () => { + designer.createComponentMeta(divMeta); + designer.project.open(settingSchema); + const { currentDocument } = designer.project; + const divNode = currentDocument?.getNode('div') as Node; + + const { settingEntry } = divNode!; + const mockFn = jest.fn(); + settingEntry.componentMeta.onMetadataChange(mockFn); + settingEntry.componentMeta.refreshMetadata(); + expect(mockFn).toHaveBeenCalled(); + }); + + it.skip('setupItems - customView', () => { + designer.createComponentMeta(divMeta); + designer.project.open(settingSchema); + const { currentDocument } = designer.project; + const divNode = currentDocument?.getNode('div') as Node; + + const { settingEntry } = divNode; + // 模拟将第一个配置变成 react funcional component + settingEntry.componentMeta.getMetadata().combined[0].items[0] = props => props.xx; + settingEntry.setupItems(); + }); + it('清理方法测试', () => { designer.createComponentMeta(divMeta); designer.project.open(settingSchema); diff --git a/packages/designer/tests/document/node/node.add.test.ts b/packages/designer/tests/document/node/node.add.test.ts index 200fe524f..c9dd53d1f 100644 --- a/packages/designer/tests/document/node/node.add.test.ts +++ b/packages/designer/tests/document/node/node.add.test.ts @@ -64,6 +64,10 @@ describe('schema 生成节点模型测试', () => { const exportSchema = currentDocument?.export(1); expect(getIdsFromSchema(exportSchema).length).toBe(expectedNodeCnt); + nodesMap.forEach(node => { + // 触发 getter + node.settingEntry; + }); expect(mockCreateSettingEntry).toBeCalledTimes(expectedNodeCnt); }); diff --git a/packages/designer/tests/document/node/props/prop.test.ts b/packages/designer/tests/document/node/props/prop.test.ts index 00ab084e5..3c01de7ec 100644 --- a/packages/designer/tests/document/node/props/prop.test.ts +++ b/packages/designer/tests/document/node/props/prop.test.ts @@ -1,16 +1,32 @@ +// @ts-nocheck import '../../../fixtures/window'; -import { set, delayObxTick } from '../../../utils'; -import { Editor } from '@ali/lowcode-editor-core'; -import { Props } from '../../../../src/document/node/props/props'; +import { delayObxTick } from '../../../utils'; +import { Editor, engineConfig } from '@ali/lowcode-editor-core'; import { Designer } from '../../../../src/designer/designer'; -import { Project } from '../../../../src/project/project'; import { DocumentModel } from '../../../../src/document/document-model'; import { Prop, isProp, isValidArrayIndex } from '../../../../src/document/node/props/prop'; import { TransformStage } from '@ali/lowcode-types'; - +const slotNodeImportMockFn = jest.fn(); +const slotNodeRemoveMockFn = jest.fn(); const mockedOwner = { componentName: 'Div', + addSlot() {}, + document: { + createNode(schema) { + return { + ...schema, + addSlot() {}, + internalSetSlotFor() {}, + import: slotNodeImportMockFn, + export() { + return schema; + }, + remove: slotNodeRemoveMockFn, + }; + }, + designer: {}, + }, }; const mockedPropsInst = { @@ -32,7 +48,19 @@ describe('Prop 类测试', () => { numProp = new Prop(mockedPropsInst, 1, 'numProp'); nullProp = new Prop(mockedPropsInst, null, 'nullProp'); expProp = new Prop(mockedPropsInst, { type: 'JSExpression', value: 'state.haha' }, 'expProp'); - // slotProp = new Prop(mockedPropsInst, { type: 'JSSlot', value: [{ componentName: 'Button' }] }, 'slotProp'); + slotProp = new Prop( + mockedPropsInst, + { + type: 'JSSlot', + title: '测试 slot', + name: 'testSlot', + params: { a: 1 }, + value: [{ componentName: 'Button' }], + }, + 'slotProp', + ); + slotNodeImportMockFn.mockClear(); + slotNodeRemoveMockFn.mockClear(); }); afterEach(() => { boolProp.purge(); @@ -40,7 +68,7 @@ describe('Prop 类测试', () => { numProp.purge(); nullProp.purge(); expProp.purge(); - // slotProp.purge(); + slotProp.purge(); }); it('consturctor / getProps / getNode', () => { @@ -60,6 +88,7 @@ describe('Prop 类测试', () => { expect(numProp.set()).toBeNull(); expect(numProp.has()).toBeFalsy(); + expect(numProp.path).toEqual(['numProp']); }); it('getValue / getAsString / setValue', () => { @@ -121,7 +150,28 @@ describe('Prop 类测试', () => { expect( new Prop(mockedPropsInst, false, '___condition___').export(TransformStage.Render), ).toBeTruthy(); - // console.log(slotProp.export(TransformStage.Render)); + engineConfig.set('enableCondition', true); + expect( + new Prop(mockedPropsInst, false, '___condition___').export(TransformStage.Render), + ).toBeFalsy(); + expect(slotProp.export(TransformStage.Render)).toEqual({ + type: 'JSSlot', + params: { a: 1 }, + value: { + componentName: 'Slot', + title: '测试 slot', + name: 'testSlot', + params: { a: 1 }, + children: [{ componentName: 'Button' }], + }, + }); + expect(slotProp.export(TransformStage.Save)).toEqual({ + type: 'JSSlot', + params: { a: 1 }, + value: [{ componentName: 'Button' }], + title: '测试 slot', + name: 'testSlot', + }); }); it('compare', () => { @@ -145,6 +195,21 @@ describe('Prop 类测试', () => { boolProp.purge(); }); + it('slot', () => { + // 更新 slot + slotProp.setValue({ + type: 'JSSlot', + value: [{ + componentName: 'Form', + }] + }); + expect(slotNodeImportMockFn).toBeCalled(); + + // 节点类型转换 + slotProp.setValue(true); + expect(slotNodeRemoveMockFn).toBeCalled(); + }); + it('迭代器 / map / forEach', () => { const mockedFn = jest.fn(); for (const item of strProp) { @@ -153,13 +218,13 @@ describe('Prop 类测试', () => { expect(mockedFn).not.toHaveBeenCalled(); mockedFn.mockClear(); - strProp.forEach(item => { + strProp.forEach((item) => { mockedFn(); }); expect(mockedFn).not.toHaveBeenCalled(); mockedFn.mockClear(); - strProp.map(item => { + strProp.map((item) => { return mockedFn(); }); expect(mockedFn).not.toHaveBeenCalled(); @@ -201,7 +266,6 @@ describe('Prop 类测试', () => { z2: 'str', }); - expect(prop.getPropValue('a')).toBe(1); prop.setPropValue('a', 2); expect(prop.getPropValue('a')).toBe(2); @@ -283,13 +347,13 @@ describe('Prop 类测试', () => { expect(mockedFn).toHaveBeenCalledTimes(5); mockedFn.mockClear(); - prop.forEach(item => { + prop.forEach((item) => { mockedFn(); }); expect(mockedFn).toHaveBeenCalledTimes(5); mockedFn.mockClear(); - prop.map(item => { + prop.map((item) => { return mockedFn(); }); expect(mockedFn).toHaveBeenCalledTimes(5); @@ -297,6 +361,7 @@ describe('Prop 类测试', () => { }); it('dispose', () => { + prop.items; prop.dispose(); expect(prop._items).toBeNull(); @@ -321,9 +386,15 @@ describe('Prop 类测试', () => { expect(prop.get(2).getValue()).toBe('haha'); expect(prop.getAsString()).toBe(''); + + prop.unset(); + prop.set(0, true); + expect(prop.set('x', 'invalid')).toBeNull(); + expect(prop.get(0).getValue()).toBeTruthy(); }); it('export', () => { + expect(prop.export()).toEqual([1, true, 'haha']); // 触发构造 prop.items; expect(prop.export()).toEqual([1, true, 'haha']); @@ -351,18 +422,22 @@ describe('Prop 类测试', () => { const designer = new Designer({ editor }); const doc = new DocumentModel(designer.project, { componentName: 'Page', - children: [{ - id: 'div', - componentName: 'Div', - }], + children: [ + { + id: 'div', + componentName: 'Div', + }, + ], }); const div = doc.getNode('div'); const slotProp = new Prop(div?.getProps(), { type: 'JSSlot', - value: [{ - componentName: 'Button', - }], + value: [ + { + componentName: 'Button', + }, + ], }); expect(slotProp.slotNode?.componentName).toBe('Slot'); diff --git a/packages/designer/tests/document/node/props/props.test.ts b/packages/designer/tests/document/node/props/props.test.ts index 56597ecc2..eb49568a5 100644 --- a/packages/designer/tests/document/node/props/props.test.ts +++ b/packages/designer/tests/document/node/props/props.test.ts @@ -1,4 +1,4 @@ - +// @ts-nocheck import '../../../fixtures/window'; import { set, delayObxTick } from '../../../utils'; import { Editor } from '@ali/lowcode-editor-core'; diff --git a/packages/designer/tests/document/node/props/value-to-source.test.ts b/packages/designer/tests/document/node/props/value-to-source.test.ts index 2694211e8..43ed19b2a 100644 --- a/packages/designer/tests/document/node/props/value-to-source.test.ts +++ b/packages/designer/tests/document/node/props/value-to-source.test.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import '../../../fixtures/silent-console'; import { getSource, valueToSource } from '../../../../src/document/node/props/value-to-source'; diff --git a/packages/designer/tests/project/project.test.ts b/packages/designer/tests/project/project.test.ts index 1fa17f8e4..6f2ddddb5 100644 --- a/packages/designer/tests/project/project.test.ts +++ b/packages/designer/tests/project/project.test.ts @@ -59,6 +59,10 @@ describe('schema 生成节点模型测试', () => { const exportSchema = currentDocument?.export(1); expect(getIdsFromSchema(exportSchema).length).toBe(expectedNodeCnt); + nodesMap.forEach(node => { + // 触发 getter + node.settingEntry; + }); expect(mockCreateSettingEntry).toBeCalledTimes(expectedNodeCnt); }); @@ -77,6 +81,10 @@ describe('schema 生成节点模型测试', () => { const exportSchema = currentDocument?.export(1); expect(getIdsFromSchema(exportSchema).length).toBe(expectedNodeCnt); + nodesMap.forEach(node => { + // 触发 getter + node.settingEntry; + }); expect(mockCreateSettingEntry).toBeCalledTimes(expectedNodeCnt); }); diff --git a/tsconfig.json b/tsconfig.json index 556a1fea8..fce8ef03d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,5 +37,5 @@ }, "outDir": "lib" }, - "exclude": ["**/test", "**/lib", "**/es", "node_modules"] + "exclude": ["**/tests/*", "**/*.test.ts", "**/lib", "**/es", "node_modules"] } From dc0c102ecc2226f8534a38a6f86a23a94c7f0c51 Mon Sep 17 00:00:00 2001 From: "lihao.ylh" Date: Thu, 24 Jun 2021 15:42:13 +0800 Subject: [PATCH 26/27] =?UTF-8?q?fix:=20=E6=8F=90=E4=BE=9B=20customizeIgno?= =?UTF-8?q?reSelectors=20=E7=9A=84=E6=83=85=E5=86=B5=E4=B8=8B,=20=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E8=A1=A8=E5=8D=95=E5=85=83=E7=B4=A0=E7=9A=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/designer/src/builtin-simulator/host.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/designer/src/builtin-simulator/host.ts b/packages/designer/src/builtin-simulator/host.ts index 09080c7a8..efe00d474 100644 --- a/packages/designer/src/builtin-simulator/host.ts +++ b/packages/designer/src/builtin-simulator/host.ts @@ -695,7 +695,7 @@ export class BuiltinSimulatorHost implements ISimulatorHost defaultSelectors); + const customizeIgnoreSelectors = engineConfig.get('customizeIgnoreSelectors'); // TODO: need more elegant solution to ignore click events of components in designer const defaultIgnoreSelectors: any = [ '.next-input-group', @@ -719,9 +719,10 @@ export class BuiltinSimulatorHost implements ISimulatorHost Date: Thu, 24 Jun 2021 16:44:31 +0800 Subject: [PATCH 27/27] chore(release): publish 1.0.56 --- lerna.json | 2 +- packages/designer/package.json | 8 ++++---- packages/editor-core/package.json | 6 +++--- packages/editor-preset-general/package.json | 14 +++++++------- packages/editor-skeleton/package.json | 10 +++++----- packages/engine/package.json | 14 +++++++------- packages/ignitor/package.json | 2 +- packages/plugin-designer/package.json | 4 ++-- packages/plugin-outline-pane/package.json | 10 +++++----- packages/rax-renderer/package.json | 6 +++--- packages/rax-simulator-renderer/package.json | 12 ++++++------ packages/react-renderer/package.json | 4 ++-- packages/react-simulator-renderer/package.json | 10 +++++----- packages/renderer-core/package.json | 2 +- packages/types/package.json | 2 +- packages/utils/package.json | 4 ++-- packages/vision-polyfill/package.json | 10 +++++----- 17 files changed, 60 insertions(+), 60 deletions(-) diff --git a/lerna.json b/lerna.json index 92a6ed85d..87bc9fc56 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "lerna": "2.11.0", - "version": "1.0.55", + "version": "1.0.56", "npmClient": "tnpm", "registry": "http://registry.npm.alibaba-inc.com", "useWorkspaces": true, diff --git a/packages/designer/package.json b/packages/designer/package.json index b80b5c458..87b357c24 100644 --- a/packages/designer/package.json +++ b/packages/designer/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-designer", - "version": "1.0.55", + "version": "1.0.56", "description": "Designer for Ali LowCode Engine", "main": "lib/index.js", "module": "es/index.js", @@ -14,9 +14,9 @@ }, "license": "MIT", "dependencies": { - "@ali/lowcode-editor-core": "1.0.55", - "@ali/lowcode-types": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-editor-core": "1.0.56", + "@ali/lowcode-types": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "classnames": "^2.2.6", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.5", diff --git a/packages/editor-core/package.json b/packages/editor-core/package.json index afca8834e..02912993e 100644 --- a/packages/editor-core/package.json +++ b/packages/editor-core/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-editor-core", - "version": "1.0.55", + "version": "1.0.56", "description": "Core Api for Ali lowCode engine", "license": "MIT", "main": "lib/index.js", @@ -13,8 +13,8 @@ "build": "build-scripts build --skip-demo" }, "dependencies": { - "@ali/lowcode-types": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-types": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "@alifd/next": "^1.19.16", "@recore/obx": "^1.0.9", "@recore/obx-react": "^1.0.8", diff --git a/packages/editor-preset-general/package.json b/packages/editor-preset-general/package.json index 281e2c9b0..d5a669f1e 100644 --- a/packages/editor-preset-general/package.json +++ b/packages/editor-preset-general/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-editor-preset-general", - "version": "1.0.55", + "version": "1.0.56", "description": "Ali General Editor Preset", "main": "lib/index.js", "private": true, @@ -14,12 +14,12 @@ }, "license": "MIT", "dependencies": { - "@ali/lowcode-editor-core": "1.0.55", - "@ali/lowcode-editor-skeleton": "1.0.55", - "@ali/lowcode-plugin-designer": "1.0.55", - "@ali/lowcode-plugin-outline-pane": "1.0.55", - "@ali/lowcode-types": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-editor-core": "1.0.56", + "@ali/lowcode-editor-skeleton": "1.0.56", + "@ali/lowcode-plugin-designer": "1.0.56", + "@ali/lowcode-plugin-outline-pane": "1.0.56", + "@ali/lowcode-types": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "@alifd/next": "^1.19.12", "@alife/theme-lowcode-dark": "^0.1.0", "@alife/theme-lowcode-light": "^0.1.0", diff --git a/packages/editor-skeleton/package.json b/packages/editor-skeleton/package.json index a64ac2e17..fe517ad60 100644 --- a/packages/editor-skeleton/package.json +++ b/packages/editor-skeleton/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-editor-skeleton", - "version": "1.0.55", + "version": "1.0.56", "description": "alibaba lowcode editor skeleton", "main": "lib/index.js", "module": "es/index.js", @@ -17,10 +17,10 @@ "editor" ], "dependencies": { - "@ali/lowcode-designer": "1.0.55", - "@ali/lowcode-editor-core": "1.0.55", - "@ali/lowcode-types": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-designer": "1.0.56", + "@ali/lowcode-editor-core": "1.0.56", + "@ali/lowcode-types": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "@ali/ve-icons": "latest", "@ali/ve-less-variables": "^2.0.0", "@alifd/next": "^1.20.12", diff --git a/packages/engine/package.json b/packages/engine/package.json index 3c6576546..4e346c917 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-engine", - "version": "1.0.55", + "version": "1.0.56", "description": "Universal API for AliLowCode engine", "main": "lib/engine-core.js", "module": "es/engine-core.js", @@ -18,14 +18,14 @@ }, "license": "MIT", "dependencies": { - "@ali/lowcode-designer": "1.0.55", - "@ali/lowcode-editor-core": "1.0.55", + "@ali/lowcode-designer": "1.0.56", + "@ali/lowcode-editor-core": "1.0.56", "@ali/lowcode-editor-setters": "1.0.30", - "@ali/lowcode-editor-skeleton": "1.0.55", + "@ali/lowcode-editor-skeleton": "1.0.56", "@ali/lowcode-engine-ext": "^1.0.0", - "@ali/lowcode-plugin-designer": "1.0.55", - "@ali/lowcode-plugin-outline-pane": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-plugin-designer": "1.0.56", + "@ali/lowcode-plugin-outline-pane": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "@ali/ve-i18n-util": "^2.0.0", "@ali/ve-icons": "^4.1.9", "@ali/ve-less-variables": "2.0.3", diff --git a/packages/ignitor/package.json b/packages/ignitor/package.json index a82250e27..31d7b9097 100644 --- a/packages/ignitor/package.json +++ b/packages/ignitor/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-ignitor", - "version": "1.0.55", + "version": "1.0.56", "description": "点火器,bootstrap lce project", "main": "lib/index.js", "private": true, diff --git a/packages/plugin-designer/package.json b/packages/plugin-designer/package.json index f4a868f2d..935375040 100644 --- a/packages/plugin-designer/package.json +++ b/packages/plugin-designer/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-plugin-designer", - "version": "1.0.55", + "version": "1.0.56", "description": "alibaba lowcode editor designer plugin", "files": [ "es", @@ -18,7 +18,7 @@ ], "author": "xiayang.xy", "dependencies": { - "@ali/lowcode-editor-core": "1.0.55", + "@ali/lowcode-editor-core": "1.0.56", "react": "^16.8.1", "react-dom": "^16.8.1" }, diff --git a/packages/plugin-outline-pane/package.json b/packages/plugin-outline-pane/package.json index 727c13a0f..d33f7821f 100644 --- a/packages/plugin-outline-pane/package.json +++ b/packages/plugin-outline-pane/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-plugin-outline-pane", - "version": "1.0.55", + "version": "1.0.56", "description": "Outline pane for Ali lowCode engine", "files": [ "es", @@ -12,10 +12,10 @@ "build": "build-scripts build --skip-demo" }, "dependencies": { - "@ali/lowcode-designer": "1.0.55", - "@ali/lowcode-editor-core": "1.0.55", - "@ali/lowcode-types": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-designer": "1.0.56", + "@ali/lowcode-editor-core": "1.0.56", + "@ali/lowcode-types": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "@alifd/next": "^1.19.16", "classnames": "^2.2.6", "react": "^16", diff --git a/packages/rax-renderer/package.json b/packages/rax-renderer/package.json index 70f4cc679..3f59ed409 100644 --- a/packages/rax-renderer/package.json +++ b/packages/rax-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-rax-renderer", - "version": "1.0.55", + "version": "1.0.56", "description": "Rax renderer for Ali lowCode engine", "main": "lib/index.js", "module": "es/index.js", @@ -30,8 +30,8 @@ "build": "build-scripts build" }, "dependencies": { - "@ali/lowcode-renderer-core": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-renderer-core": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "rax-find-dom-node": "^1.0.1" }, "devDependencies": { diff --git a/packages/rax-simulator-renderer/package.json b/packages/rax-simulator-renderer/package.json index 50084cabf..e62863647 100644 --- a/packages/rax-simulator-renderer/package.json +++ b/packages/rax-simulator-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-rax-simulator-renderer", - "version": "1.0.55", + "version": "1.0.56", "description": "rax simulator renderer for alibaba lowcode designer", "main": "lib/index.js", "module": "es/index.js", @@ -11,10 +11,10 @@ "cloud-build": "build-scripts build --skip-demo" }, "dependencies": { - "@ali/lowcode-designer": "1.0.55", - "@ali/lowcode-rax-renderer": "1.0.55", - "@ali/lowcode-types": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-designer": "1.0.56", + "@ali/lowcode-rax-renderer": "1.0.56", + "@ali/lowcode-types": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "@ali/recore-rax": "^1.2.4", "@ali/vu-css-style": "^1.0.2", "@recore/obx": "^1.0.8", @@ -55,6 +55,6 @@ "publishConfig": { "registry": "https://registry.npm.alibaba-inc.com" }, - "homepage": "https://unpkg.alibaba-inc.com/@ali/lowcode-rax-simulator-renderer@1.0.54/build/index.html", + "homepage": "https://unpkg.alibaba-inc.com/@ali/lowcode-rax-simulator-renderer@1.0.55/build/index.html", "gitHead": "3bfd7df92985ec6c9d2ccb8ba95d7b0829fa2b1d" } diff --git a/packages/react-renderer/package.json b/packages/react-renderer/package.json index 5514c39a2..75918c668 100644 --- a/packages/react-renderer/package.json +++ b/packages/react-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-react-renderer", - "version": "1.0.55", + "version": "1.0.56", "description": "react renderer for ali lowcode engine", "main": "lib/index.js", "module": "es/index.js", @@ -23,7 +23,7 @@ "react" ], "dependencies": { - "@ali/lowcode-renderer-core": "1.0.55", + "@ali/lowcode-renderer-core": "1.0.56", "@alifd/next": "^1.21.16" }, "devDependencies": { diff --git a/packages/react-simulator-renderer/package.json b/packages/react-simulator-renderer/package.json index aa942e06c..16b44f27b 100644 --- a/packages/react-simulator-renderer/package.json +++ b/packages/react-simulator-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-react-simulator-renderer", - "version": "1.0.55", + "version": "1.0.56", "description": "react simulator renderer for alibaba lowcode designer", "main": "lib/index.js", "module": "es/index.js", @@ -14,10 +14,10 @@ "build": "NODE_OPTIONS=--max_old_space_size=8192 build-scripts build --skip-demo" }, "dependencies": { - "@ali/lowcode-designer": "1.0.55", - "@ali/lowcode-react-renderer": "1.0.55", - "@ali/lowcode-types": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-designer": "1.0.56", + "@ali/lowcode-react-renderer": "1.0.56", + "@ali/lowcode-types": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "@ali/vu-css-style": "^1.0.2", "@recore/obx": "^1.0.8", "@recore/obx-react": "^1.0.7", diff --git a/packages/renderer-core/package.json b/packages/renderer-core/package.json index 3f28ae2ba..efaaa5862 100644 --- a/packages/renderer-core/package.json +++ b/packages/renderer-core/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-renderer-core", - "version": "1.0.55", + "version": "1.0.56", "description": "renderer core", "license": "MIT", "main": "lib/index.js", diff --git a/packages/types/package.json b/packages/types/package.json index a2df7bc5c..96a876dd4 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-types", - "version": "1.0.55", + "version": "1.0.56", "description": "Types for Ali lowCode engine", "files": [ "es", diff --git a/packages/utils/package.json b/packages/utils/package.json index b9af19e92..2641ee7da 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-utils", - "version": "1.0.55", + "version": "1.0.56", "description": "Utils for Ali lowCode engine", "files": [ "es", @@ -12,7 +12,7 @@ "build": "build-scripts build --skip-demo" }, "dependencies": { - "@ali/lowcode-types": "1.0.55", + "@ali/lowcode-types": "1.0.56", "@alifd/next": "^1.19.16", "lodash.get": "^4.4.2", "react": "^16" diff --git a/packages/vision-polyfill/package.json b/packages/vision-polyfill/package.json index d3099ab8d..234ad6655 100644 --- a/packages/vision-polyfill/package.json +++ b/packages/vision-polyfill/package.json @@ -1,6 +1,6 @@ { "name": "@ali/lowcode-vision-polyfill", - "version": "1.0.55", + "version": "1.0.56", "description": "Vision Polyfill for Ali lowCode engine", "main": "lib/index.js", "private": true, @@ -18,10 +18,10 @@ }, "license": "MIT", "dependencies": { - "@ali/lowcode-designer": "1.0.55", - "@ali/lowcode-editor-core": "1.0.55", - "@ali/lowcode-editor-skeleton": "1.0.55", - "@ali/lowcode-utils": "1.0.55", + "@ali/lowcode-designer": "1.0.56", + "@ali/lowcode-editor-core": "1.0.56", + "@ali/lowcode-editor-skeleton": "1.0.56", + "@ali/lowcode-utils": "1.0.56", "@ali/ve-i18n-util": "^2.0.0", "@ali/ve-icons": "^4.1.9", "@ali/ve-less-variables": "2.0.3",