diff --git a/src/Frontend/src/components/messages2/DiffContent.vue b/src/Frontend/src/components/messages2/DiffContent.vue
new file mode 100644
index 000000000..2561ab087
--- /dev/null
+++ b/src/Frontend/src/components/messages2/DiffContent.vue
@@ -0,0 +1,401 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.lineInfo.left.lineNumber }}
+ {{ item.lineInfo.left.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.lineInfo.right.lineNumber }}
+ {{ item.lineInfo.right.value }}
+
+
+
+
+
+
+
+
+
diff --git a/src/Frontend/src/components/messages2/DiffViewer.vue b/src/Frontend/src/components/messages2/DiffViewer.vue
new file mode 100644
index 000000000..5deb14fd6
--- /dev/null
+++ b/src/Frontend/src/components/messages2/DiffViewer.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Frontend/src/components/messages2/SagaDiagram.spec.ts b/src/Frontend/src/components/messages2/SagaDiagram.spec.ts
index 77252fbdb..b9da2c0ea 100644
--- a/src/Frontend/src/components/messages2/SagaDiagram.spec.ts
+++ b/src/Frontend/src/components/messages2/SagaDiagram.spec.ts
@@ -282,6 +282,9 @@ function rendercomponent({ initialState = {} }: { initialState?: { MessageStore?
stubActions: true, // Explicitly stub actions (this is the default)
}),
],
+ stubs: {
+ CodeEditor: true,
+ },
},
});
diff --git a/src/Frontend/src/components/messages2/SagaDiagram.vue b/src/Frontend/src/components/messages2/SagaDiagram.vue
index bc2144a0d..3091a7e22 100644
--- a/src/Frontend/src/components/messages2/SagaDiagram.vue
+++ b/src/Frontend/src/components/messages2/SagaDiagram.vue
@@ -133,8 +133,8 @@ const vm = computed
(() => {
}
.container {
- width: 66.6667%;
min-width: 50rem;
+ max-width: 100rem;
}
.loading-container {
diff --git a/src/Frontend/src/components/messages2/SagaDiagram/SagaDiagramParser.ts b/src/Frontend/src/components/messages2/SagaDiagram/SagaDiagramParser.ts
index d08d0917f..d9f282cfa 100644
--- a/src/Frontend/src/components/messages2/SagaDiagram/SagaDiagramParser.ts
+++ b/src/Frontend/src/components/messages2/SagaDiagram/SagaDiagramParser.ts
@@ -36,6 +36,9 @@ export interface SagaUpdateViewModel {
OutgoingTimeoutMessages: SagaTimeoutMessageViewModel[];
HasOutgoingMessages: boolean;
HasOutgoingTimeoutMessages: boolean;
+ showUpdatedPropertiesOnly: boolean;
+ stateAfterChange: string;
+ previousStateAfterChange?: string;
}
export interface SagaViewModel {
@@ -54,7 +57,7 @@ export interface SagaViewModel {
export function parseSagaUpdates(sagaHistory: SagaHistory | null, messagesData: SagaMessageData[]): SagaUpdateViewModel[] {
if (!sagaHistory || !sagaHistory.changes || !sagaHistory.changes.length) return [];
- return sagaHistory.changes
+ const updates = sagaHistory.changes
.map((update) => {
const startTime = new Date(update.start_time);
const finishTime = new Date(update.finish_time);
@@ -123,8 +126,17 @@ export function parseSagaUpdates(sagaHistory: SagaHistory | null, messagesData:
OutgoingMessages: regularMessages,
HasOutgoingMessages: regularMessages.length > 0,
HasOutgoingTimeoutMessages: outgoingTimeoutMessages.length > 0,
+ showUpdatedPropertiesOnly: true, // Default to showing only updated properties
+ stateAfterChange: update.state_after_change || "{}",
};
})
.sort((a, b) => a.StartTime.getTime() - b.StartTime.getTime())
.sort((a, b) => a.FinishTime.getTime() - b.FinishTime.getTime());
+
+ // Add reference to previous state for each update except the first one
+ for (let i = 1; i < updates.length; i++) {
+ updates[i].previousStateAfterChange = updates[i - 1].stateAfterChange;
+ }
+
+ return updates;
}
diff --git a/src/Frontend/src/components/messages2/SagaDiagram/SagaOutgoingTimeoutMessage.vue b/src/Frontend/src/components/messages2/SagaDiagram/SagaOutgoingTimeoutMessage.vue
index eced9b366..14170588d 100644
--- a/src/Frontend/src/components/messages2/SagaDiagram/SagaOutgoingTimeoutMessage.vue
+++ b/src/Frontend/src/components/messages2/SagaDiagram/SagaOutgoingTimeoutMessage.vue
@@ -35,7 +35,7 @@ const navigateToTimeout = () => {