From 689f0afe33f80c2c259c4614acbf3f12af57690e Mon Sep 17 00:00:00 2001
From: NathanViaud <nathan.viaud@inria.fr>
Date: Fri, 5 May 2023 16:42:57 +0200
Subject: [PATCH] Adding edge update to undo redo

---
 src/features/ePocFlow/ePocFlow.vue          | 21 +++++++++++++++-----
 src/shared/interfaces/undoRedo.interface.ts |  8 ++++++++
 src/shared/stores/undoRedoStore.ts          | 22 ++++++++++++++-------
 3 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/src/features/ePocFlow/ePocFlow.vue b/src/features/ePocFlow/ePocFlow.vue
index 4f14919d..fdb462d9 100644
--- a/src/features/ePocFlow/ePocFlow.vue
+++ b/src/features/ePocFlow/ePocFlow.vue
@@ -8,7 +8,7 @@ import { useEditorStore, useGraphStore } from '@/src/shared/stores';
 import ChapterNode from './nodes/ChapterNode.vue';
 import ePocNode from './nodes/ePocNode.vue';
 import AddChapterNode from './nodes/AddChapterNode.vue';
-import { EdgeAction, NodeElement, SideAction } from '@/src/shared/interfaces';
+import { EdgeAction, EdgeUpdatedAction, NodeMovedAction, NodeElement, SideAction } from '@/src/shared/interfaces';
 import { addPage, createPageFromContent, removeContentFromPage } from '@/src/shared/services/graph';
 import { useUndoRedoStore } from '@/src/shared/stores/undoRedoStore';
 
@@ -73,10 +73,21 @@ function selectionStart() {
 }
 
 function update(event) {
-    updateEdge(event.edge, {
-        source: event.connection.source,
-        target: event.connection.target,
-    });
+    const { edge, connection } = event;
+
+    const newEdge = updateEdge(edge, {
+        source: connection.source,
+        target: connection.target,
+    }, false);
+
+    if(!newEdge) return;
+
+    const undoRedoAction: EdgeUpdatedAction = {
+        type: 'edgeUpdated',
+        newEdge,
+        oldEdge: edge
+    };
+    undoRedoStore.addAction(undoRedoAction);
 }
 
 function nodeChange(event) {
diff --git a/src/shared/interfaces/undoRedo.interface.ts b/src/shared/interfaces/undoRedo.interface.ts
index 727ef335..aaad9de7 100644
--- a/src/shared/interfaces/undoRedo.interface.ts
+++ b/src/shared/interfaces/undoRedo.interface.ts
@@ -1,3 +1,5 @@
+import { GraphEdge } from '@vue-flow/core';
+
 export interface UndoRedoAction {
     type: 'nodeMoved' | 'nodeAdded' | 'nodeRemoved' | 'nodeUpdated' | 'edgeAdded' | 'edgeUpdated' | 'edgeRemoved';
 }
@@ -23,4 +25,10 @@ export interface NodeUpdatedAction extends UndoRedoAction {
 export interface EdgeAction extends UndoRedoAction {
     type: 'edgeAdded' | 'edgeUpdated' | 'edgeRemoved';
     edge: string;
+}
+
+export interface EdgeUpdatedAction extends UndoRedoAction {
+    type: 'edgeUpdated';
+    newEdge: GraphEdge;
+    oldEdge: GraphEdge
 }
\ No newline at end of file
diff --git a/src/shared/stores/undoRedoStore.ts b/src/shared/stores/undoRedoStore.ts
index ceb56251..a5a7d9db 100644
--- a/src/shared/stores/undoRedoStore.ts
+++ b/src/shared/stores/undoRedoStore.ts
@@ -1,9 +1,9 @@
 import { defineStore } from 'pinia';
-import { UndoRedoAction, NodeMovedAction, NodeMutatedAction, EdgeAction } from '../interfaces';
+import { UndoRedoAction, NodeMovedAction, NodeMutatedAction, EdgeAction, EdgeUpdatedAction } from '../interfaces';
 import { applyEdgeChanges, applyNodeChanges, getConnectedEdges, useVueFlow } from '@vue-flow/core';
 import { toRaw } from 'vue';
 
-const { findNode, addNodes, nodes, edges, addEdges } = useVueFlow({ id: 'main' });
+const { findNode, addNodes, nodes, edges, addEdges, updateEdge } = useVueFlow({ id: 'main' });
 
 interface UndoRedoState {
     undoStack: UndoRedoAction[];
@@ -54,7 +54,7 @@ export const useUndoRedoStore = defineStore('epoc', {
                 this.deleteEdge(action, reverseStack);
                 break;
             case 'edgeUpdated':
-                this.updateEdge(action, reverseStack);
+                this.updateEdgeAction(action, reverseStack);
                 break;
             case 'edgeRemoved':
                 this.addEdge(action, reverseStack);
@@ -138,12 +138,20 @@ export const useUndoRedoStore = defineStore('epoc', {
             reverseStack.push(reverseAction);
         },
 
-        updateEdge(action: EdgeAction, reverseStack: UndoRedoAction[]): void {            
-            const edge = JSON.parse(action.edge);
+        updateEdgeAction(action: EdgeUpdatedAction, reverseStack: UndoRedoAction[]): void {            
+            const { newEdge, oldEdge } = action; 
+
+            const reverseNewEdge = updateEdge(newEdge, {
+                source: oldEdge.source,
+                target: oldEdge.target
+            }, false);
+
+            if(!reverseNewEdge) return;
             
-            const reverseAction: EdgeAction = {
+            const reverseAction: EdgeUpdatedAction = {
                 type: 'edgeUpdated',
-                edge: action.edge
+                newEdge: reverseNewEdge,
+                oldEdge: newEdge
             };
             reverseStack.push(reverseAction);
         },
-- 
GitLab