diff --git a/src/Frontend/src/components/messages2/SagaDiagram.spec.ts b/src/Frontend/src/components/messages2/SagaDiagram.spec.ts index 2e135af1b..0a0fe4d64 100644 --- a/src/Frontend/src/components/messages2/SagaDiagram.spec.ts +++ b/src/Frontend/src/components/messages2/SagaDiagram.spec.ts @@ -255,6 +255,7 @@ function rendercomponent({ initialState = {} }: { initialState?: { MessageStore? ], stubs: { CodeEditor: true, + CopyToClipboard: true, }, }, }); diff --git a/src/Frontend/src/components/messages2/SagaDiagram/SagaDiagramParser.ts b/src/Frontend/src/components/messages2/SagaDiagram/SagaDiagramParser.ts index f1854f13e..910f30e9d 100644 --- a/src/Frontend/src/components/messages2/SagaDiagram/SagaDiagramParser.ts +++ b/src/Frontend/src/components/messages2/SagaDiagram/SagaDiagramParser.ts @@ -17,6 +17,8 @@ export interface InitiatingMessageViewModel { FormattedMessageTimestamp: string; IsEventMessage: boolean; MessageData: SagaMessageDataItem[]; + HasRelatedTimeoutRequest?: boolean; + MessageId: string; } export interface SagaTimeoutMessageViewModel extends SagaMessageViewModel { TimeoutFriendly: string; @@ -57,6 +59,18 @@ export interface SagaViewModel { export function parseSagaUpdates(sagaHistory: SagaHistory | null, messagesData: SagaMessageData[]): SagaUpdateViewModel[] { if (!sagaHistory || !sagaHistory.changes || !sagaHistory.changes.length) return []; + const timeoutMessageIds = new Set(); + sagaHistory.changes.forEach((update) => { + if (update.outgoing_messages) { + update.outgoing_messages.forEach((msg) => { + const delivery_delay = msg.delivery_delay || "00:00:00"; + if (delivery_delay && delivery_delay !== "00:00:00") { + timeoutMessageIds.add(msg.message_id); + } + }); + } + }); + const updates = sagaHistory.changes .map((update) => { const startTime = new Date(update.start_time); @@ -107,6 +121,9 @@ export function parseSagaUpdates(sagaHistory: SagaHistory | null, messagesData: const hasTimeout = outgoingTimeoutMessages.length > 0; + // Check if initiating message is a timeout and if so, if it has a corresponding request in the diagram + const hasRelatedTimeoutRequest = update.initiating_message?.is_saga_timeout_message && timeoutMessageIds.has(update.initiating_message?.message_id); + return { MessageId: update.initiating_message?.message_id || "", StartTime: startTime, @@ -115,11 +132,13 @@ export function parseSagaUpdates(sagaHistory: SagaHistory | null, messagesData: Status: update.status, StatusDisplay: update.status === "new" ? "Saga Initiated" : "Saga Updated", InitiatingMessage: { + MessageId: update.initiating_message?.message_id || "", MessageType: typeToName(update.initiating_message?.message_type || "Unknown Message") || "", FormattedMessageTimestamp: `${initiatingMessageTimestamp.toLocaleDateString()} ${initiatingMessageTimestamp.toLocaleTimeString()}`, MessageData: initiatingMessageData, IsEventMessage: update.initiating_message?.intent === "Publish", IsSagaTimeoutMessage: update.initiating_message?.is_saga_timeout_message || false, + HasRelatedTimeoutRequest: hasRelatedTimeoutRequest, }, HasTimeout: hasTimeout, IsFirstNode: update.status === "new", diff --git a/src/Frontend/src/components/messages2/SagaDiagram/SagaOutgoingMessage.vue b/src/Frontend/src/components/messages2/SagaDiagram/SagaOutgoingMessage.vue index 433a84d78..ec4766a4c 100644 --- a/src/Frontend/src/components/messages2/SagaDiagram/SagaOutgoingMessage.vue +++ b/src/Frontend/src/components/messages2/SagaDiagram/SagaOutgoingMessage.vue @@ -3,15 +3,29 @@ import MessageDataBox from "./MessageDataBox.vue"; import CommandIcon from "@/assets/command.svg"; import EventIcon from "@/assets/event.svg"; import { SagaMessageViewModel } from "./SagaDiagramParser"; +import { useSagaDiagramStore } from "@/stores/SagaDiagramStore"; +import { computed } from "vue"; -defineProps<{ +const shouldBeActive = computed(() => { + return store.selectedMessageId === props.message.MessageId; +}); + +const store = useSagaDiagramStore(); + +const props = defineProps<{ message: SagaMessageViewModel; showMessageData?: boolean; }>();