Skip to content

Commit 307a8fe

Browse files
committed
More changes
1 parent d26ec6b commit 307a8fe

20 files changed

+260
-139
lines changed

src/Frontend/public/js/app.constants.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ window.defaultConfig = {
44
service_control_url: 'http://localhost:33333/api/',
55
monitoring_urls: ['http://localhost:33633/'],
66
showPendingRetry: false,
7+
showAllMessages: true,
78
};

src/Frontend/src/components/CopyToClipboard.vue

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup lang="ts">
22
import { Tippy, TippyComponent } from "vue-tippy";
3-
import { useTemplateRef } from "vue";
3+
import { ref, useTemplateRef, watch } from "vue";
44
55
const props = withDefaults(
66
defineProps<{
@@ -11,14 +11,16 @@ const props = withDefaults(
1111
);
1212
1313
const tippyRef = useTemplateRef<TippyComponent | null>("tippyRef");
14-
let timeoutId: number;
14+
const timeoutId = ref(0);
1515
1616
async function copyToClipboard() {
1717
await navigator.clipboard.writeText(props.value);
18-
window.clearTimeout(timeoutId);
18+
1919
tippyRef.value?.show();
20-
timeoutId = window.setTimeout(() => tippyRef.value?.hide(), 3000);
20+
timeoutId.value = window.setTimeout(() => tippyRef.value?.hide(), 3000);
2121
}
22+
23+
watch(timeoutId, (_, previousTimeoutId) => window.clearTimeout(previousTimeoutId));
2224
</script>
2325

2426
<template>

src/Frontend/src/components/EventLogItem.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { useRoute, useRouter } from "vue-router";
2+
import { useRouter } from "vue-router";
33
import TimeSince from "../components/TimeSince.vue";
44
import type EventLogItem from "@/resources/EventLogItem";
55
// eslint-disable-next-line no-duplicate-imports
@@ -8,7 +8,6 @@ import routeLinks from "@/router/routeLinks";
88
99
defineProps<{ eventLogItem: EventLogItem }>();
1010
const router = useRouter();
11-
const route = useRoute();
1211
1312
function navigateToEvent(eventLogItem: EventLogItem) {
1413
switch (eventLogItem.category) {
@@ -27,7 +26,7 @@ function navigateToEvent(eventLogItem: EventLogItem) {
2726
case "MessageFailures":
2827
if (eventLogItem.related_to?.length && eventLogItem.related_to[0].search("message") > 0) {
2928
const messageId = eventLogItem.related_to[0].substring(9);
30-
router.push({ path: routeLinks.messages.message.link(messageId), query: { back: route.path } });
29+
router.push({ path: routeLinks.messages.failedMessage.link(messageId) });
3130
} else {
3231
router.push(routeLinks.failedMessage.root);
3332
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<script setup lang="ts"></script>
2+
3+
<template>
4+
<div class="text-center">
5+
<div class="spinner-border" role="status">
6+
<span class="visually-hidden">Loading...</span>
7+
</div>
8+
</div>
9+
</template>

src/Frontend/src/components/audit/AuditList.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,15 @@ function formatDotNetTimespan(timespan: string) {
101101
<template #content>
102102
<p :style="{ overflowWrap: 'break-word' }">{{ message.message_id }}</p>
103103
</template>
104-
<RouterLink class="hackToPreventSafariFromShowingTooltip" aria-label="details-link" :to="{ path: routeLinks.messages.message.link(message.id), query: { back: route.path } }">
104+
<RouterLink
105+
v-if="message.status === MessageStatus.Successful"
106+
class="hackToPreventSafariFromShowingTooltip"
107+
aria-label="details-link"
108+
:to="{ path: routeLinks.messages.successMessage.link(message.message_id, message.id), query: { back: route.path } }"
109+
>
110+
{{ message.message_id }}
111+
</RouterLink>
112+
<RouterLink v-else class="hackToPreventSafariFromShowingTooltip" aria-label="details-link" :to="{ path: routeLinks.messages.failedMessage.link(message.id) }">
105113
{{ message.message_id }}
106114
</RouterLink>
107115
</tippy>

src/Frontend/src/components/failedmessages/MessageList.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { useRoute, useRouter } from "vue-router";
2+
import { useRouter } from "vue-router";
33
import TimeSince from "../TimeSince.vue";
44
import NoData from "../NoData.vue";
55
import routeLinks from "@/router/routeLinks";
@@ -17,7 +17,6 @@ export interface IMessageList {
1717
1818
let lastLabelClickedIndex: number | undefined;
1919
const router = useRouter();
20-
const route = useRoute();
2120
const emit = defineEmits(["retryRequested"]);
2221
const props = withDefaults(
2322
defineProps<{
@@ -78,7 +77,7 @@ function labelClicked($event: MouseEvent, index: number) {
7877
}
7978
8079
function navigateToMessage(messageId: string) {
81-
router.push({ path: routeLinks.messages.message.link(messageId), query: { back: route.path } });
80+
router.push({ path: routeLinks.messages.failedMessage.link(messageId) });
8281
}
8382
8483
defineExpose<IMessageList>({

src/Frontend/src/components/messages/BodyView.vue

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
<script setup lang="ts">
2-
import { computed } from "vue";
2+
import { computed, watch } from "vue";
33
import CodeEditor from "@/components/CodeEditor.vue";
44
import parseContentType from "@/composables/contentTypeParser";
55
import { useMessageViewStore } from "@/stores/MessageViewStore.ts";
6+
import LoadingSpinner from "@/components/LoadingSpinner.vue";
67
78
const store = useMessageViewStore();
8-
9+
watch(
10+
() => store.state.data.body_url,
11+
async () => {
12+
await store.downloadBody();
13+
},
14+
{ immediate: true }
15+
);
916
const contentType = computed(() => parseContentType(store.body.data.content_type));
17+
const body = computed(() => store.body.data.value);
1018
</script>
1119

1220
<template>
1321
<div v-if="store.body.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>
1422
<div v-else-if="store.body.failed_to_load" class="alert alert-info">Message body unavailable.</div>
15-
<CodeEditor v-else-if="contentType.isSupported" :model-value="store.body.data.value ?? ''" :language="contentType.language" :read-only="true" :show-gutter="true"></CodeEditor>
23+
<LoadingSpinner v-else-if="store.body.loading" />
24+
<CodeEditor v-else-if="body !== undefined && contentType.isSupported" :model-value="body" :language="contentType.language" :read-only="true" :show-gutter="true"></CodeEditor>
1625
<div v-else class="alert alert-warning">Message body cannot be displayed because content type "{{ store.body.data.content_type }}" is not supported.</div>
1726
</template>
1827

src/Frontend/src/components/messages/DeleteMessageButton.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import { useMessageViewStore } from "@/stores/MessageViewStore.ts";
44
import { computed, ref } from "vue";
55
import { showToastAfterOperation } from "@/composables/toast.ts";
66
import { TYPE } from "vue-toastification";
7+
import { MessageStatus } from "@/resources/Message.ts";
78
89
const store = useMessageViewStore();
910
const isConfirmDialogVisible = ref(false);
1011
1112
const failureStatus = computed(() => store.state.data.failure_status);
1213
const isDisabled = computed(() => failureStatus.value.retried || failureStatus.value.resolved);
14+
const isVisible = computed(() => !failureStatus.value.archived && store.state.data.status !== MessageStatus.Successful && store.state.data.status !== MessageStatus.ResolvedSuccessfully);
1315
1416
const handleConfirm = async () => {
1517
isConfirmDialogVisible.value = false;
@@ -21,7 +23,7 @@ const handleConfirm = async () => {
2123
</script>
2224

2325
<template>
24-
<template v-if="!failureStatus.archived">
26+
<template v-if="isVisible">
2527
<button type="button" class="btn btn-default" :disabled="isDisabled" @click="isConfirmDialogVisible = true"><i class="fa fa-trash"></i> Delete message</button>
2628
<Teleport to="#modalDisplay">
2729
<ConfirmDialog

src/Frontend/src/components/messages/EditAndRetryButton.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import { computed, ref } from "vue";
44
import { showToastAfterOperation } from "@/composables/toast.ts";
55
import { TYPE } from "vue-toastification";
66
import EditRetryDialog2 from "@/components/failedmessages/EditRetryDialog2.vue";
7+
import { MessageStatus } from "@/resources/Message.ts";
78
89
const store = useMessageViewStore();
910
const isConfirmDialogVisible = ref(false);
1011
1112
const failureStatus = computed(() => store.state.data.failure_status);
1213
const isDisabled = computed(() => failureStatus.value.retried || failureStatus.value.archived || failureStatus.value.resolved);
13-
14+
const isVisible = computed(() => store.edit_and_retry_config.enabled && store.state.data.status !== MessageStatus.Successful && store.state.data.status !== MessageStatus.ResolvedSuccessfully);
1415
const handleConfirm = async () => {
1516
isConfirmDialogVisible.value = false;
1617
@@ -21,10 +22,10 @@ const handleConfirm = async () => {
2122
</script>
2223

2324
<template>
24-
<template v-if="store.edit_and_retry_config.enabled">
25+
<template v-if="isVisible">
2526
<button type="button" class="btn btn-default" aria-label="Edit & retry" :disabled="isDisabled" @click="isConfirmDialogVisible = true"><i class="fa fa-pencil"></i> Edit & retry</button>
2627
<Teleport to="#modalDisplay">
27-
<EditRetryDialog2 @cancel="isConfirmDialogVisible = false" @confirm="handleConfirm"></EditRetryDialog2>
28+
<EditRetryDialog2 v-if="isConfirmDialogVisible" @cancel="isConfirmDialogVisible = false" @confirm="handleConfirm"></EditRetryDialog2>
2829
</Teleport>
2930
</template>
3031
</template>
Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,34 @@
11
<script setup lang="ts">
22
import { useMessageViewStore } from "@/stores/MessageViewStore.ts";
3+
import { useDownloadFileFromString } from "@/composables/fileDownloadCreator.ts";
4+
import { showToastAfterOperation } from "@/composables/toast.ts";
5+
import { TYPE } from "vue-toastification";
6+
import { ref } from "vue";
37
48
const store = useMessageViewStore();
9+
const executing = ref(false);
10+
11+
async function exportMessage() {
12+
executing.value = true;
13+
await showToastAfterOperation(
14+
async () => {
15+
const exportedString = await store.exportMessage();
16+
useDownloadFileFromString(exportedString, "text/txt", "failedMessage.txt");
17+
},
18+
TYPE.INFO,
19+
"Info",
20+
"Message export completed."
21+
);
22+
executing.value = false;
23+
}
524
</script>
625

726
<template>
8-
<button type="button" class="btn btn-default" @click="store.exportMessage"><i class="fa fa-download"></i> Export message</button>
27+
<button v-if="!executing" type="button" class="btn btn-default" @click="exportMessage"><i class="fa fa-download"></i> Export message</button>
28+
<button v-else type="button" class="btn btn-default" disabled>
29+
<span class="spinner-border spinner-border-sm" aria-hidden="true"></span>
30+
<span role="status"> Exporting message</span>
31+
</button>
932
</template>
1033

1134
<style scoped></style>

0 commit comments

Comments
 (0)