From bfc53d59b75cad037c1b37aeeaf0ad9febeb0e72 Mon Sep 17 00:00:00 2001 From: Phil Bastian Date: Fri, 11 Apr 2025 09:49:01 +0800 Subject: [PATCH 01/10] selection of messages and navigation to selection --- .../SequenceDiagram/HandlersComponent.vue | 40 ++++++++++++++-- .../SequenceDiagram/RoutesComponent.vue | 46 ++++++++++++++++--- .../src/stores/SequenceDiagramStore.ts | 21 +++++++-- 3 files changed, 93 insertions(+), 14 deletions(-) diff --git a/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue b/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue index b7a23eb27..630f799e6 100644 --- a/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue +++ b/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue @@ -10,7 +10,7 @@ const Handler_Gap = 20; const Handler_Width = 14; const store = useSequenceDiagramStore(); -const { handlers, endpointCentrePoints, highlightId } = storeToRefs(store); +const { handlers, endpointCentrePoints, highlightId, selectedId } = storeToRefs(store); const messageTypeRefs = ref([]); @@ -27,6 +27,7 @@ const handlerItems = computed(() => { const fill = (() => { if (handler.id === "First") return "black"; if (handler.state === HandlerState.Fail) return "var(--error)"; + if (handler.route?.name === selectedId.value) return "var(--highlight)"; if (handler.route?.name === highlightId.value) return "var(--highlight-background)"; return "var(--gray60)"; })(); @@ -51,6 +52,8 @@ const handlerItems = computed(() => { return { id: handler.id, + messageId: { id: handler.selectedMessage?.message_id, uniqueId: handler.selectedMessage?.id }, + isError: handler.state === HandlerState.Fail, endpointName: handler.endpoint.name, incomingId: handler.route?.name, left, @@ -63,6 +66,7 @@ const handlerItems = computed(() => { messageType: handler.name, messageTypeOffset, messageTypeHighlight: handler.route?.name === highlightId.value, + messageTypeSelected: handler.route?.name === selectedId.value, setUIRef: (el: SVGElement) => (handler.uiRef = el), }; }); @@ -81,18 +85,32 @@ function setMessageTypeRef(el: SVGTextElement, index: number) { diff --git a/src/Frontend/src/components/messages2/SequenceDiagram/EndpointsComponent.vue b/src/Frontend/src/components/messages2/SequenceDiagram/EndpointsComponent.vue index df2890cd7..ded1ec7b2 100644 --- a/src/Frontend/src/components/messages2/SequenceDiagram/EndpointsComponent.vue +++ b/src/Frontend/src/components/messages2/SequenceDiagram/EndpointsComponent.vue @@ -25,6 +25,10 @@ interface EndpointSurround { const Endpoint_Gap = 30; const Endpoint_Image_Width = 20; +defineProps<{ + yOffset: number; +}>(); + const store = useSequenceDiagramStore(); const { startX, endpoints } = storeToRefs(store); @@ -79,7 +83,7 @@ function setEndpointTextRef(el: SVGTextElement, index: number) { From 04127fc4ce0de8cf173208af15301b2a1cd3b82a Mon Sep 17 00:00:00 2001 From: Phil Bastian Date: Fri, 11 Apr 2025 15:11:26 +0800 Subject: [PATCH 07/10] handle handler state not being known due to missing incoming message --- .../messages2/SequenceDiagram/HandlersComponent.vue | 4 ++-- .../components/messages2/SequenceDiagram/tooltipOverlay.ts | 3 ++- src/Frontend/src/resources/SequenceDiagram/Handler.ts | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue b/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue index 630f799e6..7f1c3a0ec 100644 --- a/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue +++ b/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue @@ -27,8 +27,8 @@ const handlerItems = computed(() => { const fill = (() => { if (handler.id === "First") return "black"; if (handler.state === HandlerState.Fail) return "var(--error)"; - if (handler.route?.name === selectedId.value) return "var(--highlight)"; - if (handler.route?.name === highlightId.value) return "var(--highlight-background)"; + if (handler.route && handler.route.name === selectedId.value) return "var(--highlight)"; + if (handler.route && handler.route.name === highlightId.value) return "var(--highlight-background)"; return "var(--gray60)"; })(); const icon = (() => { diff --git a/src/Frontend/src/components/messages2/SequenceDiagram/tooltipOverlay.ts b/src/Frontend/src/components/messages2/SequenceDiagram/tooltipOverlay.ts index f6ec4778b..b72e5f6f5 100644 --- a/src/Frontend/src/components/messages2/SequenceDiagram/tooltipOverlay.ts +++ b/src/Frontend/src/components/messages2/SequenceDiagram/tooltipOverlay.ts @@ -5,6 +5,7 @@ import { useTippy } from "vue-tippy"; import EndpointTooltip from "./EndpointTooltip.vue"; import HandlerTooltip from "./HandlerTooltip.vue"; import RouteTooltip from "./RouteTooltip.vue"; +import { HandlerState } from "@/resources/SequenceDiagram/Handler"; export default function useTooltips() { const store = useSequenceDiagramStore(); @@ -30,7 +31,7 @@ export default function useTooltips() { () => handlers.value.map((handler) => handler.uiRef), () => handlers.value - .filter((handler) => handler.uiRef) + .filter((handler) => handler.uiRef && handler.state !== HandlerState.Unknown) .forEach((handler) => useTippy(handler.uiRef, { interactive: true, diff --git a/src/Frontend/src/resources/SequenceDiagram/Handler.ts b/src/Frontend/src/resources/SequenceDiagram/Handler.ts index 03848ca82..d63a39a72 100644 --- a/src/Frontend/src/resources/SequenceDiagram/Handler.ts +++ b/src/Frontend/src/resources/SequenceDiagram/Handler.ts @@ -27,6 +27,7 @@ export interface Handler { export enum HandlerState { Fail, Success, + Unknown, } export const ConversationStartHandlerName = "First"; @@ -85,7 +86,7 @@ class HandlerItem implements Handler { name?: string; partOfSaga?: string; inMessage?: RoutedMessage; - state: HandlerState = HandlerState.Fail; + state: HandlerState = HandlerState.Unknown; processedAt?: Date; processingTime?: number; route?: MessageProcessingRoute; From e5ab10848457f40f810032c48e09b61c33ce3be3 Mon Sep 17 00:00:00 2001 From: Phil Bastian Date: Mon, 14 Apr 2025 11:47:19 +0800 Subject: [PATCH 08/10] switch to using full type name for internal identification of handlers/routes --- .../components/messages2/SequenceDiagram/HandlerTooltip.vue | 2 +- .../messages2/SequenceDiagram/HandlersComponent.vue | 2 +- src/Frontend/src/resources/SequenceDiagram/Handler.ts | 4 +++- src/Frontend/src/stores/SequenceDiagramStore.ts | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Frontend/src/components/messages2/SequenceDiagram/HandlerTooltip.vue b/src/Frontend/src/components/messages2/SequenceDiagram/HandlerTooltip.vue index cdcb230fa..0f1d52578 100644 --- a/src/Frontend/src/components/messages2/SequenceDiagram/HandlerTooltip.vue +++ b/src/Frontend/src/components/messages2/SequenceDiagram/HandlerTooltip.vue @@ -18,7 +18,7 @@ function formatTime(milliseconds: number) { {{ formatTime(handler.processingTime ?? 0) }} - {{ handler.name }} + {{ handler.friendlyName }} {{ handler.partOfSaga }} diff --git a/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue b/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue index 7f1c3a0ec..3ea60e6eb 100644 --- a/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue +++ b/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue @@ -63,7 +63,7 @@ const handlerItems = computed(() => { fill, icon, iconSize, - messageType: handler.name, + messageType: handler.friendlyName, messageTypeOffset, messageTypeHighlight: handler.route?.name === highlightId.value, messageTypeSelected: handler.route?.name === selectedId.value, diff --git a/src/Frontend/src/resources/SequenceDiagram/Handler.ts b/src/Frontend/src/resources/SequenceDiagram/Handler.ts index d63a39a72..a7bd3a068 100644 --- a/src/Frontend/src/resources/SequenceDiagram/Handler.ts +++ b/src/Frontend/src/resources/SequenceDiagram/Handler.ts @@ -7,6 +7,7 @@ import { friendlyTypeName } from "./SequenceModel"; export interface Handler { readonly id: string; name?: string; + friendlyName?: string; readonly endpoint: Endpoint; readonly isPartOfSaga: boolean; partOfSaga?: string; @@ -61,7 +62,8 @@ export function updateProcessingHandler(handler: Handler, message: Message) { //TODO: extract logic since it's also currently used in AuditList const [hh, mm, ss] = message.processing_time.split(":"); handler.processingTime = ((parseInt(hh) * 60 + parseInt(mm)) * 60 + parseFloat(ss)) * 1000; - handler.name = friendlyTypeName(message.message_type); + handler.name = message.message_type; + handler.friendlyName = friendlyTypeName(message.message_type); if ((message.invoked_sagas?.length ?? 0) > 0) { handler.partOfSaga = message.invoked_sagas!.map((saga) => friendlyTypeName(saga.saga_type)).join(", "); diff --git a/src/Frontend/src/stores/SequenceDiagramStore.ts b/src/Frontend/src/stores/SequenceDiagramStore.ts index 028a522ba..72e6f2634 100644 --- a/src/Frontend/src/stores/SequenceDiagramStore.ts +++ b/src/Frontend/src/stores/SequenceDiagramStore.ts @@ -1,6 +1,6 @@ import { acceptHMRUpdate, defineStore, storeToRefs } from "pinia"; import { computed, ref, watch } from "vue"; -import { friendlyTypeName, ModelCreator } from "@/resources/SequenceDiagram/SequenceModel"; +import { ModelCreator } from "@/resources/SequenceDiagram/SequenceModel"; import { Endpoint } from "@/resources/SequenceDiagram/Endpoint"; import { Handler } from "@/resources/SequenceDiagram/Handler"; import { MessageProcessingRoute } from "@/resources/SequenceDiagram/RoutedMessage"; @@ -40,7 +40,7 @@ export const useSequenceDiagramStore = defineStore("SequenceDiagramStore", () => const handlerLocations = ref([]); const highlightId = ref(); - const selectedId = computed(() => `${friendlyTypeName(state.value.data.message_type ?? "")}(${state.value.data.id})`); + const selectedId = computed(() => `${state.value.data.message_type ?? ""}(${state.value.data.id})`); watch( () => messageStore.conversationData.data, From fb5e15d2ed41ad9b11d1d01449cf37fe686b1739 Mon Sep 17 00:00:00 2001 From: Phil Bastian Date: Mon, 14 Apr 2025 13:49:17 +0800 Subject: [PATCH 09/10] scroll to selected element on tab load/activate --- .../SequenceDiagram/HandlersComponent.vue | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue b/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue index 3ea60e6eb..402020585 100644 --- a/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue +++ b/src/Frontend/src/components/messages2/SequenceDiagram/HandlersComponent.vue @@ -1,6 +1,6 @@