Skip to content

Commit b737536

Browse files
committed
Bring back the previous version to be backwards compat
1 parent aa1a7dd commit b737536

17 files changed

+619
-85
lines changed
Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,20 @@
11
<script setup lang="ts">
2-
import { computed, watch } from "vue";
2+
import { ExtendedFailedMessage } from "@/resources/FailedMessage";
3+
import { computed } from "vue";
34
import CodeEditor from "@/components/CodeEditor.vue";
45
import parseContentType from "@/composables/contentTypeParser";
5-
import { useMessageViewStore } from "@/stores/MessageViewStore";
6-
import LoadingSpinner from "@/components/LoadingSpinner.vue";
7-
import { storeToRefs } from "pinia";
6+
const props = defineProps<{
7+
message: ExtendedFailedMessage;
8+
}>();
89
9-
const store = useMessageViewStore();
10-
const { body: bodyState, state } = storeToRefs(store);
11-
12-
watch(
13-
() => state.value.data.body_url,
14-
async () => {
15-
await store.downloadBody();
16-
},
17-
{ immediate: true }
18-
);
19-
const contentType = computed(() => parseContentType(bodyState.value.data.content_type));
20-
const body = computed(() => bodyState.value.data.value);
10+
const contentType = computed(() => parseContentType(props.message.contentType));
2111
</script>
2212

2313
<template>
24-
<div v-if="bodyState.not_found" class="alert alert-info">Could not find message body. This could be because the message URL is invalid or the corresponding message was processed and is no longer tracked by ServiceControl.</div>
25-
<div v-else-if="bodyState.failed_to_load" class="alert alert-info">Message body unavailable.</div>
26-
<LoadingSpinner v-else-if="bodyState.loading" />
27-
<CodeEditor v-else-if="body !== undefined && contentType.isSupported" :model-value="body" :language="contentType.language" :read-only="true" :show-gutter="true"></CodeEditor>
28-
<div v-else class="alert alert-warning">Message body cannot be displayed because content type "{{ bodyState.data.content_type }}" is not supported.</div>
14+
<div v-if="props.message.messageBodyNotFound" class="alert alert-info">Could not find message body. This could be because the message URL is invalid or the corresponding message was processed and is no longer tracked by ServiceControl.</div>
15+
<div v-else-if="props.message.bodyUnavailable" class="alert alert-info">Message body unavailable.</div>
16+
<CodeEditor v-else-if="contentType.isSupported" :model-value="props.message.messageBody" :language="contentType.language" :read-only="true" :show-gutter="true"></CodeEditor>
17+
<div v-else class="alert alert-warning">Message body cannot be displayed because content type "{{ props.message.contentType }}" is not supported.</div>
2918
</template>
3019

3120
<style scoped></style>

src/Frontend/src/components/messages/FlowDiagram.vue

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
<script setup lang="ts">
22
import { onMounted, ref } from "vue";
3+
import { useTypedFetchFromServiceControl } from "@/composables/serviceServiceControlUrls";
34
import { type DefaultEdge, MarkerType, VueFlow, type Styles, type Node } from "@vue-flow/core";
45
import TimeSince from "../TimeSince.vue";
56
import routeLinks from "@/router/routeLinks";
67
import Message from "@/resources/Message";
78
import { NServiceBusHeaders } from "@/resources/Header";
9+
import { useRoute } from "vue-router";
10+
import { ExtendedFailedMessage } from "@/resources/FailedMessage";
811
import { Controls } from "@vue-flow/controls";
9-
import { useMessageViewStore } from "@/stores/MessageViewStore";
10-
import LoadingSpinner from "@/components/LoadingSpinner.vue";
11-
import { storeToRefs } from "pinia";
12+
13+
const props = defineProps<{
14+
message: ExtendedFailedMessage;
15+
}>();
1216
1317
enum MessageType {
1418
Event = "Event message",
@@ -40,13 +44,11 @@ interface MappedMessage {
4044
const nodeSpacingX = 300;
4145
const nodeSpacingY = 200;
4246
43-
const store = useMessageViewStore();
44-
const { state } = storeToRefs(useMessageViewStore());
47+
const route = useRoute();
4548
4649
async function getConversation(conversationId: string) {
47-
await store.loadConversation(conversationId);
48-
49-
return store.conversationData.data;
50+
const [, data] = await useTypedFetchFromServiceControl<Message[]>(`conversations/${conversationId}`);
51+
return data;
5052
}
5153
5254
function mapMessage(message: Message): MappedMessage {
@@ -159,9 +161,9 @@ function constructEdges(mappedMessages: MappedMessage[]): DefaultEdge[] {
159161
const elements = ref<(Node | DefaultEdge)[]>([]);
160162
161163
onMounted(async () => {
162-
if (!state.value.data.conversation_id) return;
164+
if (!props.message.conversationId) return;
163165
164-
const messages = await getConversation(state.value.data.conversation_id);
166+
const messages = await getConversation(props.message.conversationId);
165167
const mappedMessages = messages.map(mapMessage);
166168
167169
const assignDescendantLevelsAndWidth = (message: MappedMessage, level = 0) => {
@@ -191,28 +193,26 @@ function typeIcon(type: MessageType) {
191193
</script>
192194

193195
<template>
194-
<div v-if="store.conversationData.failed_to_load" class="alert alert-info">FlowDiagram data is unavailable.</div>
195-
<LoadingSpinner v-else-if="store.conversationData.loading" />
196-
<div v-else id="tree-container">
196+
<div id="tree-container">
197197
<VueFlow v-model="elements" :min-zoom="0.1" :fit-view-on-init="true">
198198
<Controls />
199-
<template #node-message="{ data }: { data: MappedMessage }">
200-
<div class="node" :class="{ error: data.isError, 'current-message': data.id === store.state.data.id }">
199+
<template #node-message="nodeProps">
200+
<div class="node" :class="[nodeProps.data.isError && 'error', nodeProps.data.id === props.message.id && 'current-message']">
201201
<div class="node-text wordwrap">
202-
<i v-if="data.isError" class="fa pa-flow-failed" />
203-
<i class="fa" :class="typeIcon(data.type)" :title="data.type" />
204-
<div class="lead right-side-ellipsis" :title="data.nodeName">
202+
<i v-if="nodeProps.data.isError" class="fa pa-flow-failed" />
203+
<i class="fa" :class="typeIcon(nodeProps.data.type)" :title="nodeProps.data.type" />
204+
<div class="lead righ-side-ellipsis" :title="nodeProps.data.nodeName">
205205
<strong>
206-
<RouterLink v-if="data.isError" :to="{ path: routeLinks.messages.failedMessage.link(data.id) }">{{ data.nodeName }}</RouterLink>
207-
<RouterLink v-else :to="{ path: routeLinks.messages.successMessage.link(data.messageId, data.id) }">{{ data.nodeName }}</RouterLink>
206+
<RouterLink v-if="nodeProps.data.isError" :to="{ path: routeLinks.messages.failedMessage.link(nodeProps.data.id), query: { back: route.path } }">{{ nodeProps.data.nodeName }}</RouterLink>
207+
<span v-else>{{ nodeProps.data.nodeName }}</span>
208208
</strong>
209209
</div>
210210
<span class="time-sent">
211-
<time-since class="time-since" :date-utc="data.timeSent" />
211+
<time-since class="time-since" :date-utc="nodeProps.data.timeSent" />
212212
</span>
213-
<template v-if="data.sagaName">
213+
<template v-if="nodeProps.data.sagaName">
214214
<i class="fa pa-flow-saga" />
215-
<div class="saga lead right-side-ellipsis" :title="data.sagaName">{{ data.sagaName }}</div>
215+
<div class="saga lead righ-side-ellipsis" :title="nodeProps.data.sagaName">{{ nodeProps.data.sagaName }}</div>
216216
</template>
217217
</div>
218218
</div>
@@ -243,13 +243,14 @@ function typeIcon(type: MessageType) {
243243
padding: 10px;
244244
border-radius: 3px;
245245
font-size: 12px;
246+
text-align: center;
246247
border-width: 1px;
247248
border-style: solid;
248249
color: var(--vf-node-text);
249250
text-align: left;
250251
}
251252
252-
.right-side-ellipsis {
253+
.righ-side-ellipsis {
253254
direction: rtl;
254255
text-align: left;
255256
}
@@ -305,11 +306,6 @@ function typeIcon(type: MessageType) {
305306
width: 182px;
306307
}
307308
308-
.current-message {
309-
border-color: #cccbcc;
310-
background-color: #cccbcc !important;
311-
}
312-
313309
.current-message.error {
314310
border-color: #be514a;
315311
background-color: #be514a !important;
@@ -350,10 +346,6 @@ function typeIcon(type: MessageType) {
350346
text-decoration: none;
351347
}
352348
353-
.node-text a {
354-
color: #000;
355-
}
356-
357349
.error .node-text a {
358350
color: #be514a;
359351
}

src/Frontend/src/components/messages/HeadersView.vue

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<script setup lang="ts">
2+
import { ExtendedFailedMessage } from "@/resources/FailedMessage";
23
import CopyToClipboard from "@/components/CopyToClipboard.vue";
34
import { computed, ref } from "vue";
4-
import { useMessageViewStore } from "@/stores/MessageViewStore";
5-
import { storeToRefs } from "pinia";
6-
7-
const { headers } = storeToRefs(useMessageViewStore());
5+
const props = defineProps<{
6+
message: ExtendedFailedMessage;
7+
}>();
88
99
const hoverStates = ref<Record<number, boolean>>({});
1010
const searchTerm = ref<string>("");
@@ -14,9 +14,9 @@ const toggleHover = (index: number, state: boolean) => {
1414
// Computed property to filter headers based on search term
1515
const filteredHeaders = computed(() => {
1616
if (!searchTerm.value) {
17-
return headers.value.data;
17+
return props.message.headers;
1818
}
19-
return headers.value.data.filter((header) => header.key.toLowerCase().includes(searchTerm.value.toLowerCase()) || header.value?.toLowerCase().includes(searchTerm.value.toLowerCase()));
19+
return props.message.headers.filter((header) => header.key.toLowerCase().includes(searchTerm.value.toLowerCase()) || header.value?.toLowerCase().includes(searchTerm.value.toLowerCase()));
2020
});
2121
</script>
2222

@@ -32,7 +32,7 @@ const filteredHeaders = computed(() => {
3232
</div>
3333
</div>
3434
</div>
35-
<table class="table" v-if="filteredHeaders.length > 0 && !headers.not_found">
35+
<table class="table" v-if="filteredHeaders.length > 0 && !props.message.headersNotFound">
3636
<tbody>
3737
<tr class="interactiveList" v-for="(header, index) in filteredHeaders" :key="index">
3838
<td nowrap="nowrap">{{ header.key }}</td>
@@ -47,13 +47,14 @@ const filteredHeaders = computed(() => {
4747
</table>
4848

4949
<!-- Message if filtered list is empty -->
50-
<div v-if="filteredHeaders.length <= 0 && !headers.not_found" class="alert alert-warning">No headers found matching the search term.</div>
51-
<div v-if="headers.not_found" class="alert alert-info">Could not find message headers. This could be because the message URL is invalid or the corresponding message was processed and is no longer tracked by ServiceControl.</div>
50+
<div v-if="filteredHeaders.length <= 0 && !props.message.headersNotFound" class="alert alert-warning">No headers found matching the search term.</div>
51+
<div v-if="props.message.headersNotFound" class="alert alert-info">Could not find message headers. This could be because the message URL is invalid or the corresponding message was processed and is no longer tracked by ServiceControl.</div>
5252
</template>
5353

5454
<style scoped>
5555
.headercopy {
5656
display: flex;
57+
align-items: top;
5758
gap: 0.4rem;
5859
}
5960

src/Frontend/src/components/messages/MessageView.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,10 +310,10 @@ onUnmounted(() => {
310310
<span v-if="failedMessage.number_of_processing_attempts > 1" :title="'This message has already failed ' + failedMessage.number_of_processing_attempts + ' times'" class="label sidebar-label label-important metadata-label">
311311
{{ failedMessage.number_of_processing_attempts - 1 }} Retry Failures
312312
</span>
313-
<template v-if="failedMessage.edited">
314-
<span v-tippy="`Message was edited`" class="label sidebar-label label-info metadata-label">Edited</span>
315-
<span class="metadata metadata-link"> <i class="fa fa-history"></i> <RouterLink :to="{ path: routeLinks.messages.failedMessage.link(failedMessage.edit_of) }">View previous version</RouterLink> </span>
316-
</template>
313+
<span v-if="failedMessage.edited" v-tippy="`Message was edited`" class="label sidebar-label label-info metadata-label">Edited</span>
314+
<span v-if="failedMessage.edited" class="metadata metadata-link">
315+
<i class="fa fa-history"></i> <RouterLink :to="{ path: routeLinks.messages.failedMessage.link(failedMessage.edit_of), query: { back: route.path } }">View previous version</RouterLink>
316+
</span>
317317
<span v-if="failedMessage.time_of_failure" class="metadata"><i class="fa fa-clock-o"></i> Failed: <time-since :date-utc="failedMessage.time_of_failure"></time-since></span>
318318
<span class="metadata"><i class="fa pa-endpoint"></i> Endpoint: {{ failedMessage.receiving_endpoint.name }}</span>
319319
<span class="metadata"><i class="fa fa-laptop"></i> Machine: {{ failedMessage.receiving_endpoint.host }}</span>
Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
<script setup lang="ts">
2+
import { ExtendedFailedMessage } from "@/resources/FailedMessage";
23
import CodeEditor from "@/components/CodeEditor.vue";
3-
import { useMessageViewStore } from "@/stores/MessageViewStore";
4-
import LoadingSpinner from "@/components/LoadingSpinner.vue";
5-
import { storeToRefs } from "pinia";
64
7-
const { state } = storeToRefs(useMessageViewStore());
5+
const props = defineProps<{
6+
message: ExtendedFailedMessage;
7+
}>();
88
</script>
99

1010
<template>
11-
<div v-if="state.failed_to_load" class="alert alert-info">Stacktrace not available.</div>
12-
<LoadingSpinner v-else-if="state.loading" />
13-
<CodeEditor v-else :model-value="state.data.failure_metadata.exception?.stack_trace!" language="powershell" :read-only="true" :show-gutter="false"></CodeEditor>
11+
<CodeEditor :model-value="props.message.exception.stack_trace" language="powershell" :read-only="true" :show-gutter="false"></CodeEditor>
1412
</template>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<script setup lang="ts">
2+
import { computed, watch } from "vue";
3+
import CodeEditor from "@/components/CodeEditor.vue";
4+
import parseContentType from "@/composables/contentTypeParser";
5+
import { useMessageViewStore } from "@/stores/MessageViewStore";
6+
import LoadingSpinner from "@/components/LoadingSpinner.vue";
7+
import { storeToRefs } from "pinia";
8+
9+
const store = useMessageViewStore();
10+
const { body: bodyState, state } = storeToRefs(store);
11+
12+
watch(
13+
() => state.value.data.body_url,
14+
async () => {
15+
await store.downloadBody();
16+
},
17+
{ immediate: true }
18+
);
19+
const contentType = computed(() => parseContentType(bodyState.value.data.content_type));
20+
const body = computed(() => bodyState.value.data.value);
21+
</script>
22+
23+
<template>
24+
<div v-if="bodyState.not_found" class="alert alert-info">Could not find message body. This could be because the message URL is invalid or the corresponding message was processed and is no longer tracked by ServiceControl.</div>
25+
<div v-else-if="bodyState.failed_to_load" class="alert alert-info">Message body unavailable.</div>
26+
<LoadingSpinner v-else-if="bodyState.loading" />
27+
<CodeEditor v-else-if="body !== undefined && contentType.isSupported" :model-value="body" :language="contentType.language" :read-only="true" :show-gutter="true"></CodeEditor>
28+
<div v-else class="alert alert-warning">Message body cannot be displayed because content type "{{ bodyState.data.content_type }}" is not supported.</div>
29+
</template>
30+
31+
<style scoped></style>
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)