Skip to content

Commit 6a89993

Browse files
committed
navigate to timeout message
1 parent e58bcad commit 6a89993

File tree

4 files changed

+68
-12
lines changed

4 files changed

+68
-12
lines changed

src/Frontend/src/components/messages2/SagaDiagram/SagaDiagramParser.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface InitiatingMessageViewModel {
1919
}
2020
export interface SagaTimeoutMessageViewModel extends SagaMessageViewModel {
2121
TimeoutFriendly: string;
22+
HasBeenProcessed: boolean;
2223
}
2324

2425
export interface SagaUpdateViewModel {
@@ -88,19 +89,22 @@ export function parseSagaUpdates(sagaHistory: SagaHistory | null, messagesData:
8889

8990
const outgoingTimeoutMessages = outgoingMessages
9091
.filter((msg) => msg.HasTimeout)
91-
.map(
92-
(msg) =>
93-
({
94-
...msg,
95-
TimeoutFriendly: `${msg.TimeoutFriendly}`,
96-
}) as SagaTimeoutMessageViewModel
97-
);
92+
.map((msg) => {
93+
// Check if this timeout message has been processed by checking if there's an initiating message with matching ID
94+
const hasBeenProcessed = sagaHistory.changes.some((update) => update.initiating_message?.message_id === msg.MessageId);
95+
96+
return {
97+
...msg,
98+
TimeoutFriendly: `${msg.TimeoutFriendly}`,
99+
HasBeenProcessed: hasBeenProcessed,
100+
} as SagaTimeoutMessageViewModel;
101+
});
98102

99103
const regularMessages = outgoingMessages.filter((msg) => !msg.HasTimeout) as SagaMessageViewModel[];
100104

101105
const hasTimeout = outgoingTimeoutMessages.length > 0;
102106

103-
return {
107+
return <SagaUpdateViewModel>{
104108
MessageId: update.initiating_message?.message_id || "",
105109
StartTime: startTime,
106110
FinishTime: finishTime,

src/Frontend/src/components/messages2/SagaDiagram/SagaOutgoingTimeoutMessage.vue

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,29 @@ import { SagaTimeoutMessageViewModel } from "./SagaDiagramParser";
33
import MessageDataBox from "./MessageDataBox.vue";
44
import TimeoutIcon from "@/assets/TimeoutIcon.svg";
55
import SagaTimeoutIcon from "@/assets/SagaTimeoutIcon.svg";
6+
import { useSagaDiagramStore } from "@/stores/SagaDiagramStore";
67
7-
defineProps<{
8+
const props = defineProps<{
89
message: SagaTimeoutMessageViewModel;
910
isLastMessage: boolean;
1011
showMessageData?: boolean;
1112
}>();
13+
14+
const store = useSagaDiagramStore();
15+
16+
const navigateToTimeout = () => {
17+
// Set the selected message ID in the store
18+
store.setSelectedMessageId(props.message.MessageId);
19+
};
1220
</script>
1321

1422
<template>
1523
<div class="row row--right">
1624
<div class="cell cell--center">
1725
<div class="cell-inner cell-inner-line">
1826
<img class="saga-icon saga-icon--center-cell saga-icon--overlap" :src="SagaTimeoutIcon" alt="" />
19-
<a class="timeout-status" href="" aria-label="timeout requested">Timeout Requested = {{ message.TimeoutFriendly }}</a>
27+
<a v-if="message.HasBeenProcessed" class="timeout-status" href="#" @click.prevent="navigateToTimeout" aria-label="timeout requested">Timeout Requested = {{ message.TimeoutFriendly }}</a>
28+
<span v-else class="timeout-status" aria-label="timeout requested">Timeout Requested = {{ message.TimeoutFriendly }}</span>
2029
</div>
2130
</div>
2231
<div class="cell cell--side"></div>

src/Frontend/src/components/messages2/SagaDiagram/SagaUpdateNode.vue

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,60 @@ import { SagaUpdateViewModel } from "./SagaDiagramParser";
33
import MessageDataBox from "./MessageDataBox.vue";
44
import SagaOutgoingTimeoutMessage from "./SagaOutgoingTimeoutMessage.vue";
55
import SagaOutgoingMessage from "./SagaOutgoingMessage.vue";
6+
import { useSagaDiagramStore } from "@/stores/SagaDiagramStore";
7+
import { ref, watch } from "vue";
68
79
// Import the images directly
810
import CommandIcon from "@/assets/command.svg";
911
import SagaInitiatedIcon from "@/assets/SagaInitiatedIcon.svg";
1012
import SagaUpdatedIcon from "@/assets/SagaUpdatedIcon.svg";
1113
import TimeoutIcon from "@/assets/timeout.svg";
1214
import SagaTimeoutIcon from "@/assets/SagaTimeoutIcon.svg";
13-
defineProps<{
15+
16+
const props = defineProps<{
1417
update: SagaUpdateViewModel;
1518
showMessageData?: boolean;
1619
}>();
20+
21+
const store = useSagaDiagramStore();
22+
const initiatingMessageRef = ref<HTMLElement | null>(null);
23+
const isActive = ref(false);
24+
25+
// Watch for changes to selectedMessageId
26+
watch(
27+
() => store.selectedMessageId,
28+
(newMessageId) => {
29+
// Check if this node contains the selected message
30+
const isSelected = props.update.InitiatingMessage.IsSagaTimeoutMessage && newMessageId === props.update.MessageId;
31+
32+
// Update active state
33+
isActive.value = isSelected;
34+
35+
// If this is the selected message, scroll to it
36+
if (isSelected && initiatingMessageRef.value) {
37+
initiatingMessageRef.value.scrollIntoView({
38+
behavior: "smooth",
39+
block: "center",
40+
});
41+
}
42+
}
43+
);
1744
</script>
1845

1946
<template>
2047
<div class="block" role="row">
2148
<!-- Initiating message and saga status header -->
2249
<div class="row">
2350
<div class="cell cell--side">
24-
<div class="cell-inner cell-inner-side">
51+
<div
52+
ref="initiatingMessageRef"
53+
:class="{
54+
'cell-inner': true,
55+
'cell-inner-side': true,
56+
'cell-inner-side--active': isActive || (update.InitiatingMessage.IsSagaTimeoutMessage && update.MessageId === store.selectedMessageId),
57+
}"
58+
:data-message-id="update.InitiatingMessage.IsSagaTimeoutMessage ? update.MessageId : ''"
59+
>
2560
<img class="saga-icon saga-icon--side-cell" :src="update.InitiatingMessage.IsSagaTimeoutMessage ? TimeoutIcon : CommandIcon" alt="" />
2661
<h2 class="message-title" aria-label="initiating message type">{{ update.InitiatingMessage.MessageType }}</h2>
2762
<div class="timestamp" aria-label="initiating message timestamp">{{ update.InitiatingMessage.FormattedMessageTimestamp }}</div>

src/Frontend/src/stores/SagaDiagramStore.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export const useSagaDiagramStore = defineStore("SagaDiagramStore", () => {
2222
const showMessageData = ref(false);
2323
const fetchedMessages = ref(new Set<string>());
2424
const messagesData = ref<SagaMessageData[]>([]);
25+
const selectedMessageId = ref<string | null>(null);
2526
const MessageBodyEndpoint = "messages/{0}/body";
2627

2728
// Watch the sagaId and fetch saga history when it changes
@@ -188,6 +189,7 @@ export const useSagaDiagramStore = defineStore("SagaDiagramStore", () => {
188189
error.value = null;
189190
fetchedMessages.value.clear();
190191
messagesData.value = [];
192+
selectedMessageId.value = null;
191193
}
192194

193195
function formatUrl(template: string, id: string): string {
@@ -248,6 +250,10 @@ export const useSagaDiagramStore = defineStore("SagaDiagramStore", () => {
248250
}
249251
}
250252

253+
function setSelectedMessageId(messageId: string | null) {
254+
selectedMessageId.value = messageId;
255+
}
256+
251257
return {
252258
sagaHistory,
253259
sagaId,
@@ -256,9 +262,11 @@ export const useSagaDiagramStore = defineStore("SagaDiagramStore", () => {
256262
error,
257263
showMessageData,
258264
messagesData,
265+
selectedMessageId,
259266
setSagaId,
260267
clearSagaHistory,
261268
toggleMessageData,
269+
setSelectedMessageId,
262270
};
263271
});
264272

0 commit comments

Comments
 (0)