Skip to content

Commit 39929c2

Browse files
committed
highlight on handlers
1 parent 5108f2a commit 39929c2

File tree

4 files changed

+35
-15
lines changed

4 files changed

+35
-15
lines changed

src/Frontend/src/components/messages/SequenceDiagram.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useSequenceDiagramStore } from "@/stores/SequenceDiagramStore";
77
import { storeToRefs } from "pinia";
88
99
const store = useSequenceDiagramStore();
10-
store.setConversationId("b4dac7d7-4571-4f26-aa32-b29c0030c95f");
10+
store.setConversationId("39907d51-12e5-4202-82c3-b2b30077ebd4");
1111
1212
const { maxWidth, maxHeight } = storeToRefs(store);
1313
</script>

src/Frontend/src/components/messages/SequenceDiagram/HandlersComponent.vue

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const Handler_Gap = 20;
1010
const Handler_Width = 14;
1111
1212
const store = useSequenceDiagramStore();
13-
const { handlers, endpointCentrePoints } = storeToRefs(store);
13+
const { handlers, endpointCentrePoints, highlightId } = storeToRefs(store);
1414
1515
const messageTypeRefs = ref<SVGTextElement[]>([]);
1616
@@ -27,6 +27,7 @@ const handlerItems = computed(() => {
2727
const fill = (() => {
2828
if (handler.id === "First") return "black";
2929
if (handler.state === HandlerState.Fail) return "var(--error)";
30+
if (handler.route?.name === highlightId.value) return "var(--highlight-background)";
3031
return "var(--gray60)";
3132
})();
3233
const icon = (() => {
@@ -41,7 +42,8 @@ const handlerItems = computed(() => {
4142
})();
4243
4344
return {
44-
key: handler.id,
45+
id: handler.id,
46+
incomingId: handler.route?.name,
4547
left: (endpoint?.centre ?? 0) - Handler_Width / 2,
4648
right: (endpoint?.centre ?? 0) + Handler_Width / 2,
4749
y,
@@ -51,11 +53,12 @@ const handlerItems = computed(() => {
5153
iconSize,
5254
messageType: handler.name,
5355
messageTypeOffset: handler.direction === Direction.Right ? ((messageTypeElement?.getBBox().width ?? 0) + 24) * -1 : 20,
56+
messageTypeHighlight: handler.route?.name === highlightId.value,
5457
};
5558
});
5659
5760
store.setMaxHeight(nextY);
58-
store.setHandlerLocations(result.map((handler) => ({ id: handler.key, left: handler.left, right: handler.right, y: handler.y, height: handler.height })));
61+
store.setHandlerLocations(result.map((handler) => ({ id: handler.id, left: handler.left, right: handler.right, y: handler.y, height: handler.height })));
5962
6063
return result;
6164
});
@@ -67,15 +70,28 @@ function setMessageTypeRef(el: SVGTextElement, index: number) {
6770

6871
<template>
6972
<g>
70-
<g v-for="(handler, i) in handlerItems" :key="handler.key" :transform="`translate(${handler.left}, ${handler.y})`">
73+
<g v-for="(handler, i) in handlerItems" :key="handler.id" :transform="`translate(${handler.left}, ${handler.y})`">
7174
<!--Handler Activation Box-->
72-
<rect :width="Handler_Width" :height="handler.height" :fill="handler.fill" />
75+
<rect :width="Handler_Width" :height="handler.height" :class="handler.incomingId && 'clickable'" :fill="handler.fill" @mouseover="() => store.setHighlightId(handler.incomingId)" @mouseleave="() => store.setHighlightId()" />
7376
<path v-if="handler.icon" :d="handler.icon" fill="white" :transform="`translate(${Handler_Width / 2 - handler.iconSize / 2}, ${handler.height / 2 - handler.iconSize / 2})`" />
7477
<!--Message Type and Icon-->
75-
<g v-if="handler.messageType" :transform="`translate(${handler.messageTypeOffset}, 4)`" fill="var(--gray40)">
78+
<g
79+
v-if="handler.messageType"
80+
:transform="`translate(${handler.messageTypeOffset}, 4)`"
81+
class="clickable"
82+
:fill="handler.messageTypeHighlight ? 'var(--highlight)' : 'var(--gray40)'"
83+
@mouseover="() => store.setHighlightId(handler.incomingId)"
84+
@mouseleave="() => store.setHighlightId()"
85+
>
7686
<path d="M9,3L9,3 9,0 0,0 0,3 4,3 4,6 0,6 0,9 4,9 4,12 0,12 0,15 9,15 9,12 5,12 5,9 9,9 9,6 5,6 5,3z" />
7787
<text x="14" y="10" alignment-baseline="middle" :ref="(el) => setMessageTypeRef(el as SVGTextElement, i)">{{ handler.messageType }}</text>
7888
</g>
7989
</g>
8090
</g>
8191
</template>
92+
93+
<style scoped>
94+
.clickable {
95+
cursor: pointer;
96+
}
97+
</style>

src/Frontend/src/components/messages/SequenceDiagram/RoutesComponent.vue

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ const Arrow_Head_Width = 4;
88
const Message_Type_Margin = 4;
99
1010
const store = useSequenceDiagramStore();
11-
const { routes, handlerLocations } = storeToRefs(store);
11+
const { routes, handlerLocations, highlightId } = storeToRefs(store);
1212
1313
const messageTypeRefs = ref<SVGTextElement[]>([]);
14-
const highlightId = ref<string | undefined>();
1514
1615
const arrows = computed(() =>
1716
routes.value.map((route, index) => {
@@ -56,9 +55,6 @@ const arrows = computed(() =>
5655
function setMessageTypeRef(el: SVGTextElement, index: number) {
5756
if (el) messageTypeRefs.value[index] = el;
5857
}
59-
function setHighlightId(arrowId?: string) {
60-
highlightId.value = arrowId;
61-
}
6258
</script>
6359

6460
<template>
@@ -72,8 +68,8 @@ function setHighlightId(arrowId?: string) {
7268
class="clickable"
7369
:transform="`translate(${arrow.messageTypeOffset}, ${arrow.y - 7.5 - Message_Type_Margin})`"
7470
:fill="arrow.highlight ? 'var(--highlight)' : 'black'"
75-
@mouseover="() => setHighlightId(arrow.id)"
76-
@mouseleave="() => setHighlightId()"
71+
@mouseover="() => store.setHighlightId(arrow.id)"
72+
@mouseleave="() => store.setHighlightId()"
7773
>
7874
<rect v-if="arrow.highlight && arrow.messageTypeOffset" :width="arrow.highlightTextWidth + 19 + 4 + 4" :height="arrow.highlightTextHeight + 4 + 4" fill="var(--highlight-background)" />
7975
<svg :x="Message_Type_Margin" :y="Message_Type_Margin" width="15" height="15" viewBox="0 0 32 32">

src/Frontend/src/stores/SequenceDiagramStore.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export interface HandlerLocation {
2222
}
2323

2424
export const useSequenceDiagramStore = defineStore("SequenceDiagramStore", () => {
25-
const conversationId = ref("");
25+
const conversationId = ref<string>();
2626

2727
const endpoints = ref<Endpoint[]>([]);
2828
const handlers = ref<Handler[]>([]);
@@ -31,8 +31,10 @@ export const useSequenceDiagramStore = defineStore("SequenceDiagramStore", () =>
3131
const maxWidth = ref(150);
3232
const maxHeight = ref(150);
3333
const handlerLocations = ref<HandlerLocation[]>([]);
34+
const highlightId = ref<string>();
3435

3536
watch(conversationId, async () => {
37+
if (!conversationId.value) return;
3638
const response = await useFetchFromServiceControl(`conversations/${conversationId.value}`);
3739
if (response.status === 404) {
3840
return;
@@ -64,6 +66,10 @@ export const useSequenceDiagramStore = defineStore("SequenceDiagramStore", () =>
6466
handlerLocations.value = locations;
6567
}
6668

69+
function setHighlightId(id?: string) {
70+
highlightId.value = id;
71+
}
72+
6773
return {
6874
setConversationId,
6975
endpoints,
@@ -73,10 +79,12 @@ export const useSequenceDiagramStore = defineStore("SequenceDiagramStore", () =>
7379
maxWidth,
7480
maxHeight,
7581
handlerLocations,
82+
highlightId,
7683
setMaxWidth,
7784
setMaxHeight,
7885
setEndpointCentrePoints,
7986
setHandlerLocations,
87+
setHighlightId,
8088
};
8189
});
8290

0 commit comments

Comments
 (0)