ソースを参照

fix(free-layout): node deletion data loss after redo (#284)

* fix(demo): node required validate

* fix(free-layout): node deletion data loss after redo/undo
xiamidaxia 7 ヶ月 前
コミット
7d846dc48f

+ 4 - 1
apps/demo-fixed-layout/src/nodes/block/form-meta.tsx

@@ -20,7 +20,10 @@ export const formMeta: FormMeta<FlowNodeJSON['data']> = {
     'inputsValues.*': ({ value, context, formValues, name }) => {
       const valuePropetyKey = name.replace(/^inputsValues\./, '');
       const required = formValues.inputs?.required || [];
-      if (required.includes(valuePropetyKey) && (value === '' || value === undefined)) {
+      if (
+        required.includes(valuePropetyKey) &&
+        (value === '' || value === undefined || value?.content === '')
+      ) {
         return `${valuePropetyKey} is required`;
       }
       return undefined;

+ 4 - 1
apps/demo-fixed-layout/src/nodes/default-form-meta.tsx

@@ -22,7 +22,10 @@ export const defaultFormMeta: FormMeta<FlowNodeJSON['data']> = {
     'inputsValues.*': ({ value, context, formValues, name }) => {
       const valuePropetyKey = name.replace(/^inputsValues\./, '');
       const required = formValues.inputs?.required || [];
-      if (required.includes(valuePropetyKey) && (value === '' || value === undefined)) {
+      if (
+        required.includes(valuePropetyKey) &&
+        (value === '' || value === undefined || value?.content === '')
+      ) {
         return `${valuePropetyKey} is required`;
       }
       return undefined;

+ 4 - 1
apps/demo-free-layout/src/nodes/default-form-meta.tsx

@@ -22,7 +22,10 @@ export const defaultFormMeta: FormMeta<FlowNodeJSON> = {
     'inputsValues.*': ({ value, context, formValues, name }) => {
       const valuePropetyKey = name.replace(/^inputsValues\./, '');
       const required = formValues.inputs?.required || [];
-      if (required.includes(valuePropetyKey) && (value === '' || value === undefined)) {
+      if (
+        required.includes(valuePropetyKey) &&
+        (value === '' || value === undefined || value?.content === '')
+      ) {
         return `${valuePropetyKey} is required`;
       }
       return undefined;

+ 5 - 1
packages/canvas-engine/free-layout-core/src/workflow-document.ts

@@ -238,11 +238,15 @@ export class WorkflowDocument extends FlowDocument {
         const parentTransform = node.parent.getData(FlowNodeTransformData);
         parentTransform.fireChange();
       });
+      let lastDeleteNodeData: WorkflowNodeJSON | undefined;
+      node.preDispose.onDispose(() => {
+        lastDeleteNodeData = this.toNodeJSON(node);
+      });
       node.onDispose(() => {
         this.fireContentChange({
           type: WorkflowContentChangeType.DELETE_NODE,
           entity: node,
-          toJSON: () => this.toNodeJSON(node),
+          toJSON: () => lastDeleteNodeData,
         });
       });
     }

+ 2 - 3
packages/plugins/free-history-plugin/src/changes/delete-node-change.ts

@@ -1,4 +1,4 @@
-import { WorkflowDocument, WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';
+import { WorkflowContentChangeType } from '@flowgram.ai/free-layout-core';
 import { type FlowNodeEntity } from '@flowgram.ai/document';
 
 import {
@@ -12,9 +12,8 @@ export const deleteNodeChange: ContentChangeTypeToOperation<DeleteWorkflowNodeOp
   type: WorkflowContentChangeType.DELETE_NODE,
   toOperation: (event, ctx) => {
     const config = ctx.get<FreeHistoryConfig>(FreeHistoryConfig);
-    const document = ctx.get<WorkflowDocument>(WorkflowDocument);
     const node = event.entity as FlowNodeEntity;
-    const json = document.toNodeJSON(node);
+    const json = event.toJSON();
     const parentID = node.parent?.id;
 
     return {