From 6dac7a9aad241c9c2a01eb359fd240c18c7e5dec Mon Sep 17 00:00:00 2001
From: NathanViaud <nathan.viaud@inria.fr>
Date: Tue, 11 Apr 2023 09:16:46 +0200
Subject: [PATCH] Remember connected edges when undo or redo

---
 src/shared/interfaces/undoRedo.interface.ts |  2 ++
 src/shared/stores/undoRedoStore.ts          | 33 ++++++++++++++-------
 2 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/shared/interfaces/undoRedo.interface.ts b/src/shared/interfaces/undoRedo.interface.ts
index a6cfcbd2..7d6c6b9a 100644
--- a/src/shared/interfaces/undoRedo.interface.ts
+++ b/src/shared/interfaces/undoRedo.interface.ts
@@ -13,11 +13,13 @@ export interface NodeAddedAction extends UndoRedoAction {
     type: 'nodeAdded';
     //TODO: use the type defined by vue flow
     node: any;
+    edges: any;
 }
 
 export interface NodeRemovedAction extends UndoRedoAction {
     type: 'nodeRemoved';
     node: any;
+    edges: any;
 }
 
 export interface NodeUpdatedAction extends UndoRedoAction {
diff --git a/src/shared/stores/undoRedoStore.ts b/src/shared/stores/undoRedoStore.ts
index a88a6aa8..2d955b53 100644
--- a/src/shared/stores/undoRedoStore.ts
+++ b/src/shared/stores/undoRedoStore.ts
@@ -1,8 +1,9 @@
 import { defineStore } from 'pinia';
 import { UndoRedoAction, NodeMovedAction, NodeRemovedAction, NodeAddedAction } from '../interfaces';
-import { applyNodeChanges, useVueFlow } from '@vue-flow/core';
+import { applyNodeChanges, getConnectedEdges, useVueFlow } from '@vue-flow/core';
+import { toRaw } from 'vue';
 
-const { findNode, addNodes, nodes } = useVueFlow({ id: 'main' });
+const { findNode, addNodes, nodes, edges, addEdges } = useVueFlow({ id: 'main' });
 
 interface UndoRedoState {
     undoStack: UndoRedoAction[];
@@ -38,6 +39,8 @@ export const useUndoRedoStore = defineStore('epoc', {
                 this.moveNode(action, reverseStack);
                 break;
             case 'nodeRemoved':
+                console.log('action:', action);
+                console.log('reverseStack:', reverseStack);
                 this.addNode(action, reverseStack);
                 break;
             case 'nodeAdded':
@@ -72,28 +75,38 @@ export const useUndoRedoStore = defineStore('epoc', {
             };
             reverseStack.push(reverseAction);
         },
-        deleteNode(action: NodeRemovedAction, reverseStack: UndoRedoAction[]) {
+        deleteNode(action: NodeRemovedAction, reverseStack: UndoRedoAction[]): void {
             const node = JSON.parse(action.node);
 
-            applyNodeChanges(
-                [{ id: node.id, type: 'remove' }],
-                nodes.value
-            );
-
             const reverseAction: NodeRemovedAction = {
                 type: 'nodeRemoved',
                 node: action.node,
+                edges: JSON.stringify(getConnectedEdges([node], edges.value))
             };
+            
+            applyNodeChanges(
+                [{ id: node.id, type: 'remove' }],
+                nodes.value
+            );
             reverseStack.push(reverseAction);
         },
-        addNode(action: NodeAddedAction, reverseStack: UndoRedoAction[]) {
+        addNode(action: NodeAddedAction, reverseStack: UndoRedoAction[]): void {
             const node = JSON.parse(action.node);
-
             addNodes([node]);
 
+            let edges = toRaw(action.edges);
+
+            if(edges) {
+                edges = JSON.parse(action.edges);
+                edges = Array.isArray(edges) ? edges : [edges];
+                addEdges(edges);
+            }
+
+
             const reverseAction: NodeAddedAction = {
                 type: 'nodeAdded',
                 node: action.node,
+                edges: action.edges
             };
             reverseStack.push(reverseAction);
             
-- 
GitLab