1
- <script setup lang="ts">
2
- import {ref , Ref } from " vue" ;
1
+ <script setup lang="tsx">
2
+ import {h , ref , Ref } from " vue" ;
3
+ import {parseISO , differenceInHours } from " date-fns" ;
3
4
import {formatISODate } from " ../../utils/formatting" ;
4
5
import {CollectorConfig , BenchmarkJobStatus } from " ./data" ;
5
6
6
7
const props = defineProps <{
7
8
collector: CollectorConfig ;
8
9
}>();
9
10
10
- function statusClass(c : CollectorConfig ): string {
11
- return c .isActive ? " active" : " inactive" ;
12
- }
13
-
14
11
const FILTERS: BenchmarkJobStatus [] = [
15
12
" InProgress" ,
16
13
" Queued" ,
@@ -40,6 +37,37 @@ function formatJobStatus(status: BenchmarkJobStatus): string {
40
37
return " Unknown" ;
41
38
}
42
39
}
40
+
41
+ function ActiveStatus({collector }: {collector: CollectorConfig }) {
42
+ const now = new Date ();
43
+ const maxInactivityHours = 1 ;
44
+ const lastHeartBeatAt = parseISO (collector .lastHeartbeatAt );
45
+ const hourDiff = differenceInHours (now , lastHeartBeatAt );
46
+ let statusText = " Active" ;
47
+ let statusClass = " active" ;
48
+
49
+ switch (collector .isActive ) {
50
+ case false :
51
+ if (hourDiff >= maxInactivityHours ) {
52
+ statusText = " Offline" ;
53
+ statusClass = " offline" ;
54
+ } else {
55
+ statusText = " Active" ;
56
+ statusClass = " active" ;
57
+ }
58
+ break ;
59
+ case true :
60
+ statusText = " Inactive" ;
61
+ statusClass = " inactive" ;
62
+ break ;
63
+ }
64
+
65
+ return (
66
+ <span class = { ` collector-sm-padding-left-right status ${statusClass } ` } >
67
+ { statusText }
68
+ </span >
69
+ );
70
+ }
43
71
</script >
44
72
45
73
<template >
@@ -54,12 +82,7 @@ function formatJobStatus(status: BenchmarkJobStatus): string {
54
82
class =" collector-sm-padding-left-right collector-left-divider"
55
83
>{{ collector.target }}</span
56
84
>
57
- <span
58
- class =" collector-sm-padding-left-right status"
59
- :class =" statusClass(collector)"
60
- >
61
- {{ collector.isActive ? "Active" : "Inactive" }}
62
- </span >
85
+ <ActiveStatus :collector =" collector" />
63
86
</span >
64
87
</div >
65
88
</div >
@@ -235,6 +258,11 @@ $sm-radius: 8px;
235
258
font-weight : bold ;
236
259
}
237
260
.status.inactive {
261
+ background : #ccc ;
262
+ color : white ;
263
+ font-weight : bold ;
264
+ }
265
+ .status.offline {
238
266
background : red ;
239
267
color : white ;
240
268
font-weight : bold ;
0 commit comments