Skip to content

Commit 65a6715

Browse files
committed
Improvements to Flow diagram
1 parent 95fd4a4 commit 65a6715

File tree

10 files changed

+156
-49
lines changed

10 files changed

+156
-49
lines changed

src/Frontend/package-lock.json

Lines changed: 13 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"bootstrap": "^5.3.5",
2727
"bootstrap-icons": "^1.11.3",
2828
"codemirror": "^6.0.1",
29+
"hex-to-css-filter": "^6.0.0",
2930
"lodash.debounce": "^4.0.8",
3031
"lossless-json": "^4.0.2",
3132
"memoize-one": "^6.0.0",
Lines changed: 4 additions & 4 deletions
Loading
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<script setup lang="ts">
2+
import { ref, watch, onMounted } from "vue";
3+
4+
const props = withDefaults(
5+
defineProps<{
6+
text: string;
7+
ellipsesStyle?: "RightSide" | "LeftSide";
8+
}>(),
9+
{ ellipsesStyle: "RightSide" }
10+
);
11+
12+
const textContainer = ref<HTMLElement | null>(null);
13+
const tooltipText = ref("");
14+
15+
const updateTooltip = () => {
16+
if (textContainer.value) {
17+
tooltipText.value = textContainer.value.scrollWidth > textContainer.value.clientWidth ? textContainer.value.textContent || "" : "";
18+
}
19+
};
20+
21+
onMounted(() => {
22+
updateTooltip();
23+
});
24+
25+
watch([() => props.text], () => {
26+
updateTooltip();
27+
});
28+
</script>
29+
30+
<template>
31+
<div ref="textContainer" title="" class="text-container hackToPreventSafariFromShowingTooltip" :class="{ 'left-side-ellipsis': ellipsesStyle === 'LeftSide' }" v-tippy="{ content: tooltipText, maxWidth: 'none' }">
32+
{{ text }}
33+
</div>
34+
</template>
35+
36+
<style scoped>
37+
.hackToPreventSafariFromShowingTooltip::after {
38+
content: "";
39+
display: block;
40+
}
41+
42+
.left-side-ellipsis {
43+
direction: rtl;
44+
text-align: left;
45+
}
46+
47+
.text-container {
48+
white-space: nowrap;
49+
overflow: hidden;
50+
text-overflow: ellipsis;
51+
display: inline-block;
52+
}
53+
</style>

src/Frontend/src/components/TimeSince.vue

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,25 @@
11
<script setup lang="ts">
22
import { onMounted, onUnmounted, ref } from "vue";
33
import moment from "moment";
4+
import { Tippy } from "vue-tippy";
45
56
const emptyDate = "0001-01-01T00:00:00";
67
78
const props = withDefaults(defineProps<{ dateUtc?: string; defaultTextOnFailure?: string; titleValue?: string }>(), { dateUtc: emptyDate, defaultTextOnFailure: "n/a", titleValue: undefined });
89
910
let interval: number | undefined = undefined;
1011
11-
const title = ref(),
12+
const title = ref<string[]>([]),
1213
text = ref();
1314
1415
function updateText() {
1516
if (props.dateUtc != null && props.dateUtc !== emptyDate) {
1617
const m = moment.utc(props.dateUtc);
1718
text.value = m.fromNow();
18-
title.value = props.titleValue ?? m.local().format("LLLL") + " (local)\n" + m.utc().format("LLLL") + " (UTC)";
19+
title.value = props.titleValue ? [props.titleValue] : [`${m.local().format("LLLL")} (local)`, `${m.utc().format("LLLL")} (UTC)`];
1920
} else {
2021
text.value = props.defaultTextOnFailure;
21-
title.value = props.titleValue ?? props.defaultTextOnFailure;
22+
title.value = [props.titleValue ?? props.defaultTextOnFailure];
2223
}
2324
}
2425
@@ -34,5 +35,10 @@ onUnmounted(() => window.clearInterval(interval));
3435
</script>
3536

3637
<template>
37-
<span :title="title">{{ text }}</span>
38+
<Tippy>
39+
<template #content>
40+
<div v-for="row in title" :key="row">{{ row }}</div>
41+
</template>
42+
<span>{{ text }}</span>
43+
</Tippy>
3844
</template>

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import TimeSince from "../TimeSince.vue";
44
import NoData from "../NoData.vue";
55
import routeLinks from "@/router/routeLinks";
66
import { FailedMessageStatus, ExtendedFailedMessage } from "@/resources/FailedMessage";
7+
import { hexToCSSFilter } from "hex-to-css-filter";
78
89
export interface IMessageList {
910
getSelectedMessages(): ExtendedFailedMessage[];
@@ -89,6 +90,7 @@ defineExpose<IMessageList>({
8990
isAnythingDisplayed,
9091
numberDisplayed,
9192
});
93+
const endpointColor = hexToCSSFilter("#929E9E").filter;
9294
</script>
9395

9496
<template>
@@ -122,7 +124,7 @@ defineExpose<IMessageList>({
122124
<span v-if="message.edited" :title="'Message was edited'" class="label sidebar-label label-info metadata-label">Edited</span>
123125

124126
<span class="metadata"><i class="fa fa-clock-o"></i> Failed: <time-since :dateUtc="message.time_of_failure"></time-since></span>
125-
<span class="metadata"><i class="fa pa-endpoint"></i> Endpoint: {{ message.receiving_endpoint.name }}</span>
127+
<span class="metadata"><i class="fa pa-endpoint" :style="{ filter: endpointColor }"></i> Endpoint: {{ message.receiving_endpoint.name }}</span>
126128
<span class="metadata"><i class="fa fa-laptop"></i> Machine: {{ message.receiving_endpoint.host }}</span>
127129
<span class="metadata" v-if="message.redirect"><i class="fa pa-redirect-source pa-redirect-small"></i> Redirect: {{ message.redirect }}</span>
128130
<!-- for deleted messages-->

src/Frontend/src/components/heartbeats/LastHeartbeat.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ defineProps<{ date?: string; tooltipTarget: string }>();
1313
<p>No heartbeat data received for this {{ tooltipTarget }}.</p>
1414
<p>Have you installed and configured the <a target="_blank" href="https://docs.particular.net/monitoring/heartbeats/install-plugin">heartbeats plugin</a> for this {{ tooltipTarget }}?</p>
1515
</template>
16-
<span title="Last Heartbeat">No data available</span>
16+
<span>No data available</span>
1717
</tippy>
1818
</p>
1919
</template>

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import HeadersView from "@/components/messages/HeadersView.vue";
2525
import StackTraceView from "@/components/messages/StacktraceView.vue";
2626
import { stringify, parse } from "lossless-json";
2727
import xmlFormat from "xml-formatter";
28+
import { hexToCSSFilter } from "hex-to-css-filter";
2829
2930
let refreshInterval: number | undefined;
3031
let pollingFaster = false;
@@ -280,6 +281,7 @@ onMounted(async () => {
280281
onUnmounted(() => {
281282
stopRefreshInterval();
282283
});
284+
const endpointColor = hexToCSSFilter("#929E9E").filter;
283285
</script>
284286

285287
<template>
@@ -317,7 +319,7 @@ onUnmounted(() => {
317319
<i class="fa fa-history"></i> <RouterLink :to="{ path: routeLinks.messages.failedMessage.link(failedMessage.edit_of), query: { back: route.path } }">View previous version</RouterLink>
318320
</span>
319321
<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>
320-
<span class="metadata"><i class="fa pa-endpoint"></i> Endpoint: {{ failedMessage.receiving_endpoint.name }}</span>
322+
<span class="metadata"><i class="fa pa-endpoint" :style="{ filter: endpointColor }"></i> Endpoint: {{ failedMessage.receiving_endpoint.name }}</span>
321323
<span class="metadata"><i class="fa fa-laptop"></i> Machine: {{ failedMessage.receiving_endpoint.host }}</span>
322324
<span v-if="failedMessage.redirect" class="metadata"><i class="fa pa-redirect-source pa-redirect-small"></i> Redirect: {{ failedMessage.redirect }}</span>
323325
</div>

0 commit comments

Comments
 (0)