Ver Fonte

feat(core): node.updateExtInfo auto merge previous data (#884)

* feat(core): node.updateExtInfo auto merge previous data

* feat(document): node.updateExtInfo add fullUpdate param
xiamidaxia há 3 meses atrás
pai
commit
ccc30c0b92

+ 26 - 0
packages/canvas-engine/document/__tests__/flow-node-entity.spec.ts

@@ -135,4 +135,30 @@ describe('flow-node-entity', () => {
     // transform 数据还在
     expect(node.getData(TransformData)).toBeDefined();
   });
+  it('getExtInfo and updateExtInfo', () => {
+    const node = document.getNode('start_0');
+    let changedTimes = 0;
+    node.onExtInfoChange((data) => {
+      changedTimes++;
+    });
+    expect(node.toJSON().data).toEqual(undefined);
+    expect(node.getExtInfo()).toEqual(undefined);
+    node.updateExtInfo({ title: 'start' });
+    expect(node.getExtInfo()).toEqual({ title: 'start' });
+    expect(changedTimes).toEqual(1);
+    node.updateExtInfo({ title: 'start' }); // same
+    expect(changedTimes).toEqual(1);
+    node.updateExtInfo({ content: 'content' });
+    expect(node.getExtInfo()).toEqual({ title: 'start', content: 'content' });
+    expect(changedTimes).toEqual(2);
+    expect(node.toJSON()).toEqual({
+      id: 'start_0',
+      type: 'start',
+      data: { title: 'start', content: 'content' }, // By default, extInfo will be present in data
+    });
+    node.updateExtInfo({ title: 'start2' }, true);
+    expect(node.getExtInfo()).toEqual({ title: 'start2' });
+    expect(changedTimes).toEqual(3);
+    expect(node.toJSON().data).toEqual({ title: 'start2' });
+  });
 });

+ 6 - 5
packages/canvas-engine/document/src/datas/flow-node-render-data.ts

@@ -53,13 +53,14 @@ export class FlowNodeRenderData extends EntityData<FlowNodeRenderSchema> {
     };
   }
 
-  updateExtInfo(info: Record<string, any>) {
-    if (Compare.isChanged(this.data.extInfo, info)) {
-      const oldInfo = this.data.extInfo;
+  updateExtInfo(info: Record<string, any>, fullUpdate?: boolean) {
+    const oldInfo = this.data.extInfo;
+    const newInfo = fullUpdate ? info : { ...oldInfo, ...info };
+    if (Compare.isChanged(oldInfo, newInfo)) {
       this.update({
-        extInfo: info,
+        extInfo: newInfo,
       });
-      this.onExtInfoChangeEmitter.fire({ oldInfo, newInfo: info });
+      this.onExtInfoChangeEmitter.fire({ oldInfo, newInfo });
     }
   }
 

+ 5 - 2
packages/canvas-engine/document/src/entities/flow-node-entity.ts

@@ -353,8 +353,11 @@ export class FlowNodeEntity extends Entity<FlowNodeEntityConfig> {
    * 修改节点扩展信息
    * @param info
    */
-  updateExtInfo<T extends Record<string, any> = Record<string, any>>(extInfo: T): void {
-    this.getData(FlowNodeRenderData).updateExtInfo(extInfo);
+  updateExtInfo<T extends Record<string, any> = Record<string, any>>(
+    extInfo: T,
+    fullUpdate?: boolean
+  ): void {
+    this.getData(FlowNodeRenderData).updateExtInfo(extInfo, fullUpdate);
   }
 
   /**

+ 1 - 1
packages/canvas-engine/free-layout-core/src/hooks/typings.ts

@@ -85,7 +85,7 @@ export interface NodeRenderReturnType {
    * 更新节点的扩展数据
    * @param extInfo
    */
-  updateExtInfo<T = any>(extInfo: T): void;
+  updateExtInfo<T = any>(extInfo: T, fullUpdate?: boolean): void;
   /**
    * 展开/收起节点
    * @param expanded

+ 3 - 3
packages/canvas-engine/free-layout-core/src/hooks/use-node-render.tsx

@@ -123,8 +123,8 @@ export function useNodeRender(nodeFromProps?: WorkflowNodeEntity): NodeRenderRet
   }, []);
   const getExtInfo = useCallback(() => node.getExtInfo() as any, [node]);
   const updateExtInfo = useCallback(
-    (data: any) => {
-      node.updateExtInfo(data);
+    (data: any, fullUpdate?: boolean) => {
+      node.updateExtInfo(data, fullUpdate);
     },
     [node]
   );
@@ -161,7 +161,7 @@ export function useNodeRender(nodeFromProps?: WorkflowNodeEntity): NodeRenderRet
         if (form) {
           form.updateFormValues(values);
         } else {
-          updateExtInfo(values);
+          updateExtInfo(values, true);
         }
       },
       node,

+ 4 - 4
packages/client/fixed-layout-editor/src/hooks/use-node-render.tsx

@@ -84,7 +84,7 @@ export interface NodeRenderReturnType {
    * 更新节点的扩展数据
    * @param extInfo
    */
-  updateExtInfo<T = any>(extInfo: T): void;
+  updateExtInfo<T = any>(extInfo: T, fullUpdate?: boolean): void;
 
   /**
    * 展开/收起节点
@@ -154,8 +154,8 @@ export function useNodeRender(nodeFromProps?: FlowNodeEntity): NodeRenderReturnT
 
   const getExtInfo = useCallback(() => node.getExtInfo() as any, [node]);
   const updateExtInfo = useCallback(
-    (data: any) => {
-      node.updateExtInfo(data);
+    (data: any, fullUpdate?: boolean) => {
+      node.updateExtInfo(data, fullUpdate);
     },
     [node]
   );
@@ -198,7 +198,7 @@ export function useNodeRender(nodeFromProps?: FlowNodeEntity): NodeRenderReturnT
         if (form) {
           form.updateFormValues(values);
         } else {
-          updateExtInfo(values);
+          updateExtInfo(values, true);
         }
       },
       node,

+ 1 - 1
packages/client/fixed-layout-editor/src/preset/node-serialize.ts

@@ -18,7 +18,7 @@ export function fromNodeJSON(
   // 如果没有使用表单引擎,将 data 数据填入 extInfo
   if (!formData) {
     if (json.data) {
-      node.updateExtInfo(json.data);
+      node.updateExtInfo(json.data, true);
     }
   } else {
     const defaultFormMeta = opts.nodeEngine?.createDefaultFormMeta?.(node);

+ 1 - 1
packages/client/free-layout-editor/src/preset/node-serialize.ts

@@ -28,7 +28,7 @@ export function fromNodeJSON(
   // 如果没有使用表单引擎,将 data 数据填入 extInfo
   if (!formData) {
     if (json.data) {
-      node.updateExtInfo(json.data);
+      node.updateExtInfo(json.data, true);
     }
     // extInfo 数据更新则触发内容更新
     if (isFirstCreate) {