From ba2f1e5ac5b71ece1d61aec81b84adf166ab063e Mon Sep 17 00:00:00 2001 From: roymondchen Date: Tue, 12 Dec 2023 15:09:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(stage,=20editor):=20runtime=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=9B=B4=E6=8E=A5=E6=B8=B2=E6=9F=93=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E4=B8=8D=E7=94=A8iframe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/editor/src/Editor.vue | 1 + packages/editor/src/editorProps.ts | 4 + packages/editor/src/hooks/use-stage.ts | 1 + .../layouts/sidebar/layer/use-node-status.ts | 2 +- packages/editor/src/type.ts | 2 + packages/editor/src/utils/editor.ts | 15 ++- packages/form/src/containers/Container.vue | 1 + packages/stage/src/StageCore.ts | 1 + packages/stage/src/StageRender.ts | 99 +++++++++++++------ packages/stage/src/TargetShadow.ts | 2 +- packages/stage/src/types.ts | 9 +- 11 files changed, 102 insertions(+), 35 deletions(-) diff --git a/packages/editor/src/Editor.vue b/packages/editor/src/Editor.vue index aa5a2bd6..7d36b5b2 100644 --- a/packages/editor/src/Editor.vue +++ b/packages/editor/src/Editor.vue @@ -175,6 +175,7 @@ provide( containerHighlightDuration: props.containerHighlightDuration, containerHighlightType: props.containerHighlightType, disabledDragStart: props.disabledDragStart, + renderType: props.renderType, }), ); diff --git a/packages/editor/src/editorProps.ts b/packages/editor/src/editorProps.ts index f6011626..488e4512 100644 --- a/packages/editor/src/editorProps.ts +++ b/packages/editor/src/editorProps.ts @@ -7,6 +7,7 @@ import StageCore, { ContainerHighlightType, CustomizeMoveableOptionsCallbackConfig, MoveableOptions, + RenderType, UpdateDragEl, } from '@tmagic/stage'; @@ -39,6 +40,8 @@ export interface EditorProps { render?: (stage: StageCore) => HTMLDivElement | Promise; /** 中间工作区域中画布通过iframe渲染时的页面url */ runtimeUrl?: string; + /** 是用iframe渲染还是直接渲染 */ + renderType?: RenderType; /** 选中时是否自动滚动到可视区域 */ autoScrollIntoView?: boolean; /** 组件的属性配置表单的dsl */ @@ -87,4 +90,5 @@ export const defaultEditorProps = { containerHighlightDuration: 800, containerHighlightType: ContainerHighlightType.DEFAULT, codeOptions: () => ({}), + renderType: RenderType.IFRAME, }; diff --git a/packages/editor/src/hooks/use-stage.ts b/packages/editor/src/hooks/use-stage.ts index c310deb9..7f32fbeb 100644 --- a/packages/editor/src/hooks/use-stage.ts +++ b/packages/editor/src/hooks/use-stage.ts @@ -31,6 +31,7 @@ export const useStage = (stageOptions: StageOptions) => { containerHighlightDuration: stageOptions.containerHighlightDuration, containerHighlightType: stageOptions.containerHighlightType, disabledDragStart: stageOptions.disabledDragStart, + renderType: stageOptions.renderType, canSelect: (el, event, stop) => { const elCanSelect = stageOptions.canSelect(el); // 在组件联动过程中不能再往下选择,返回并触发 ui-select diff --git a/packages/editor/src/layouts/sidebar/layer/use-node-status.ts b/packages/editor/src/layouts/sidebar/layer/use-node-status.ts index 65dad93e..dc8add8b 100644 --- a/packages/editor/src/layouts/sidebar/layer/use-node-status.ts +++ b/packages/editor/src/layouts/sidebar/layer/use-node-status.ts @@ -18,7 +18,7 @@ const createPageNodeStatus = (page: MPage, initalLayerNodeStatus?: Map - traverseNode(node, (node) => { + traverseNode(node, (node) => { map.set( node.id, initalLayerNodeStatus?.get(node.id) || { diff --git a/packages/editor/src/type.ts b/packages/editor/src/type.ts index 051cd2ac..eba82fa1 100644 --- a/packages/editor/src/type.ts +++ b/packages/editor/src/type.ts @@ -25,6 +25,7 @@ import type { ContainerHighlightType, CustomizeMoveableOptionsCallbackConfig, MoveableOptions, + RenderType, UpdateDragEl, } from '@tmagic/stage'; @@ -129,6 +130,7 @@ export interface StageOptions { canSelect: (el: HTMLElement) => boolean | Promise; isContainer: (el: HTMLElement) => boolean | Promise; updateDragEl: UpdateDragEl; + renderType: RenderType; } export interface StoreState { diff --git a/packages/editor/src/utils/editor.ts b/packages/editor/src/utils/editor.ts index 2e8dc858..bb276206 100644 --- a/packages/editor/src/utils/editor.ts +++ b/packages/editor/src/utils/editor.ts @@ -257,13 +257,22 @@ export const serializeConfig = (config: any) => unsafe: true, }).replace(/"(\w+)":\s/g, '$1: '); -export const traverseNode = (node: MNode, cb: (node: MNode, parents: MNode[]) => void, parents: MNode[] = []) => { +export interface NodeItem { + items?: NodeItem[]; + [key: string]: any; +} + +export const traverseNode = ( + node: T, + cb: (node: T, parents: T[]) => void, + parents: T[] = [], +) => { cb(node, parents); if (node.items?.length) { parents.push(node); - node.items.forEach((item: MNode) => { - traverseNode(item, cb, [...parents]); + node.items.forEach((item) => { + traverseNode(item as T, cb, [...parents]); }); } }; diff --git a/packages/form/src/containers/Container.vue b/packages/form/src/containers/Container.vue index 2ecea9b7..536bc7a5 100644 --- a/packages/form/src/containers/Container.vue +++ b/packages/form/src/containers/Container.vue @@ -1,6 +1,7 @@