@@ -35,9 +35,9 @@ interface MappedMessage {
35
35
nodeName: string ;
36
36
};
37
37
timeSent: string ;
38
- level? : number ;
39
- width? : number ;
40
- XPos? : number ;
38
+ level: number ;
39
+ width: number ;
40
+ XPos: number ;
41
41
}
42
42
43
43
const nodeSpacingX = 300 ;
@@ -84,6 +84,9 @@ function mapMessage(message: Message): MappedMessage {
84
84
type ,
85
85
isError: message .status !== MessageStatus .Successful && message .status !== MessageStatus .ResolvedSuccessfully ,
86
86
sagaName ,
87
+ level: 0 ,
88
+ width: 0 ,
89
+ XPos: 0 ,
87
90
link: {
88
91
name: ` Link ${message .id } ` ,
89
92
nodeName: message .id ,
@@ -92,12 +95,12 @@ function mapMessage(message: Message): MappedMessage {
92
95
};
93
96
}
94
97
95
- function constructNodes(mappedMessages : MappedMessage []): Node [] {
98
+ function constructNodes(mappedMessages : MappedMessage []): Node < MappedMessage > [] {
96
99
return (
97
100
mappedMessages
98
101
// group by level
99
102
.reduce ((groups : MappedMessage [][], message : MappedMessage ) => {
100
- groups [message .level ! ] = [... (groups [message .level ! ] ?? []), message ];
103
+ groups [message .level ] = [... (groups [message .level ] ?? []), message ];
101
104
return groups ;
102
105
}, [])
103
106
// ensure each level has their items in the same "grouped" order as the level above
@@ -118,9 +121,9 @@ function constructNodes(mappedMessages: MappedMessage[]): Node[] {
118
121
const parentMessage = previousLevel ?.find ((plMessage ) => message .parentId === plMessage .messageId && message .parentEndpoint === plMessage .receivingEndpoint .name ) ?? null ;
119
122
// if the current parent node is the same as the previous parent node, then the current position needs to be to the right of siblings
120
123
const currentParentWidth = previousParent === parentMessage ? currentWidth : 0 ;
121
- const startX = parentMessage == null ? 0 : parentMessage .XPos ! - parentMessage .width ! / 2 ;
124
+ const startX = parentMessage == null ? 0 : parentMessage .XPos - parentMessage .width / 2 ;
122
125
// store the position of the node against the message, so child nodes can use it to determine their start position
123
- message .XPos = startX + (currentParentWidth + message .width ! / 2 );
126
+ message .XPos = startX + (currentParentWidth + message .width / 2 );
124
127
return {
125
128
result: [
126
129
... result ,
@@ -129,10 +132,10 @@ function constructNodes(mappedMessages: MappedMessage[]): Node[] {
129
132
type: " message" ,
130
133
data: message ,
131
134
label: message .nodeName ,
132
- position: { x: message .XPos * nodeSpacingX , y: message .level ! * nodeSpacingY },
135
+ position: { x: message .XPos * nodeSpacingX , y: message .level * nodeSpacingY },
133
136
},
134
137
],
135
- currentWidth: currentParentWidth + message .width ! ,
138
+ currentWidth: currentParentWidth + message .width ,
136
139
previousParent: parentMessage ,
137
140
};
138
141
},
@@ -170,12 +173,17 @@ onMounted(async () => {
170
173
message .width =
171
174
children .length === 0
172
175
? 1 // leaf node
173
- : children .map ((child ) => (child .width == null ? assignDescendantLevelsAndWidth (child , level + 1 ) : child )).reduce ((sum , { width }) => sum + width ! , 0 );
176
+ : children .map ((child ) => (child .width === 0 ? assignDescendantLevelsAndWidth (child , level + 1 ) : child )).reduce ((sum , { width }) => sum + width , 0 );
174
177
return message ;
175
178
};
176
- for (const root of mappedMessages .filter ((message ) => ! message .parentId )) assignDescendantLevelsAndWidth (root );
179
+ for (const root of mappedMessages .filter ((message ) => ! message .parentId )) {
180
+ assignDescendantLevelsAndWidth (root );
181
+ }
182
+
183
+ const nodes = constructNodes (mappedMessages );
184
+ const edges = constructEdges (nodes .map ((n ) => n .data as MappedMessage ));
177
185
178
- elements .value = [... constructNodes ( mappedMessages ) , ... constructEdges ( mappedMessages ) ];
186
+ elements .value = [... nodes , ... edges ];
179
187
});
180
188
181
189
function typeIcon(type : MessageType ) {
@@ -196,16 +204,17 @@ function toggleAddress() {
196
204
}
197
205
198
206
const blackColor = hexToCSSFilter (" #000000" ).filter ;
207
+ const greenColor = hexToCSSFilter (" #00c468" ).filter ;
199
208
</script >
200
209
201
210
<template >
202
211
<div v-if =" store.conversationData.failed_to_load" class =" alert alert-info" >FlowDiagram data is unavailable.</div >
203
212
<LoadingSpinner v-else-if =" store.conversationData.loading" />
204
213
<div v-else id =" tree-container" >
205
- <VueFlow v-model =" elements" :min-zoom =" 0.1" :fit-view-on-init =" true" >
214
+ <VueFlow v-model =" elements" :min-zoom =" 0.1" :fit-view-on-init =" true" :only-render-visible-elements = " true " >
206
215
<Controls position =" top-left" class =" controls" >
207
- <ControlButton v-tippy =" `Show endpoints`" @click =" toggleAddress" >
208
- <i class =" fa pa-flow-endpoint" :style =" { filter: blackColor }" ></i >
216
+ <ControlButton v-tippy =" showAddress ? `Hide endpoints` : `Show endpoints`" @click =" toggleAddress" >
217
+ <i class =" fa pa-flow-endpoint" :style =" { filter: showAddress ? greenColor : blackColor }" ></i >
209
218
</ControlButton >
210
219
</Controls >
211
220
<template #node-message =" { data }: { data: MappedMessage } " >
0 commit comments