Просмотр исходного кода

Merge pull request #27 from sanmaopep/feat/form-init-in-to-json

feat: move form init logic in free layout from createWorkflowNode to fromNodeJSON
xiamidaxia 10 месяцев назад
Родитель
Сommit
bac351c42a

+ 18 - 2
packages/canvas-engine/free-layout-core/src/utils/flow-node-form-data.ts

@@ -1,7 +1,8 @@
 import { FlowNodeFormData } from '@flowgram.ai/form-core';
-import { FlowNodeEntity } from '@flowgram.ai/document';
+import { FlowNodeEntity, FlowNodeJSON } from '@flowgram.ai/document';
 
-import type { WorkflowNodeRegistry } from '../typings';
+import { type WorkflowDocument } from '../workflow-document';
+import { WorkflowContentChangeType, type WorkflowNodeRegistry } from '../typings';
 
 export function getFlowNodeFormData(node: FlowNodeEntity) {
   return node.getData(FlowNodeFormData) as FlowNodeFormData;
@@ -12,3 +13,18 @@ export function toFormJSON(node: FlowNodeEntity) {
   if (!formData || !(node.getNodeRegistry() as WorkflowNodeRegistry).formMeta) return undefined;
   return formData.toJSON();
 }
+
+export function initFormDataFromJSON(node: FlowNodeEntity, json: FlowNodeJSON) {
+  const formData = node.getData(FlowNodeFormData)!;
+  const registry = node.getNodeRegistry();
+  const { formMeta } = registry;
+
+  formData.createForm(formMeta, json.data);
+  formData.onDataChange(() => {
+    (node.document as WorkflowDocument).fireContentChange({
+      type: WorkflowContentChangeType.NODE_DATA_CHANGE,
+      toJSON: () => formData.toJSON(),
+      entity: node,
+    });
+  });
+}

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
packages/canvas-engine/free-layout-core/src/workflow-document-option.ts


+ 3 - 2
packages/canvas-engine/free-layout-core/src/workflow-document.ts

@@ -193,9 +193,10 @@ export class WorkflowDocument extends FlowDocument {
     });
 
     // 初始化表单数据
-    if (formMeta && formData) {
+    if (formMeta && formData && !formData.formModel.initialized) {
+      // 如果表单数据在前置步骤(fromJSON)内已定义,则跳过表单初始化逻辑
       formData.createForm(formMeta, json.data);
-      // formData.onDataChange(() => node.getData(FlowNodeRenderData)!.fireChange())
+
       formData.onDataChange(() => {
         this.fireContentChange({
           type: WorkflowContentChangeType.NODE_DATA_CHANGE,

+ 3 - 0
packages/client/free-layout-editor/src/preset/free-layout-props.ts

@@ -220,7 +220,10 @@ export namespace FreeLayoutProps {
             entity: node,
           });
         });
+        return;
       }
+
+      return WorkflowDocumentOptionsDefault.fromNodeJSON?.(node, json);
     },
     toNodeJSON(node: FlowNodeEntity): FlowNodeJSON {
       const formData = node.getData(FlowNodeFormData)!;

Некоторые файлы не были показаны из-за большого количества измененных файлов