|
32 | 32 | const interval = $derived(page.url.searchParams.get('interval') ?? '7d');
|
33 | 33 |
|
34 | 34 | const visualizationColors: string[] = [
|
35 |
| - '#CCE1FF', |
36 |
| - '#99C4DD', |
37 | 35 | '#FFC166',
|
38 |
| - '#66CBEC', |
39 | 36 | '#99DEAD',
|
40 |
| - '#C0B2D2' |
| 37 | + '#CCE1FF', |
| 38 | + '#C0B2D2', |
| 39 | + '#66CBEC', |
| 40 | + '#99C4DD' |
41 | 41 | ];
|
42 | 42 |
|
43 | 43 | function options(
|
44 | 44 | data: resourceUsage,
|
45 | 45 | request: number,
|
46 | 46 | limit?: number,
|
47 |
| - color: string = '#000000', |
48 | 47 | valueFormatter: (value: number) => string = (value: number) =>
|
49 | 48 | value == null ? '-' : value.toLocaleString('en-GB', { maximumFractionDigits: 4 })
|
50 | 49 | ): EChartsOption {
|
51 | 50 | const safeData = data ?? [];
|
52 | 51 |
|
53 |
| - console.log(safeData); |
| 52 | + const uniqueTimestamps = Array.from(new Set(safeData.map((d) => d.timestamp.getTime()))); |
54 | 53 |
|
55 |
| - return { |
| 54 | + const opts = { |
56 | 55 | animation: false,
|
57 | 56 | tooltip: {
|
58 | 57 | trigger: 'axis',
|
|
61 | 60 | `<div style="height: 8px; width: 8px; border-radius: 50%; background-color: ${color};"></div>`;
|
62 | 61 | const div = document.createElement('div');
|
63 | 62 |
|
64 |
| - const [usage, request, limit] = value; |
65 |
| - if (Array.isArray(usage.value) && Array.isArray(request.value)) { |
66 |
| - div.innerHTML = ` |
67 |
| - <div>${format(usage.value.at(0) as number, 'dd/MM/yyyy HH:mm')}</div> |
| 63 | + div.innerHTML = ` |
| 64 | + <div>${format( |
| 65 | + Array.isArray(value) && Array.isArray(value[0]?.value) |
| 66 | + ? (value[0].value[0] as number) |
| 67 | + : 0, |
| 68 | + 'dd/MM/yyyy HH:mm' |
| 69 | + )}</div> |
68 | 70 | <hr style="border: none; height: 1px; background-color: var(--a-border-subtle);" />
|
69 | 71 | <div style="display: grid; grid-template-columns: auto auto; column-gap: 0.5rem;">
|
70 |
| - <div style="display: flex; align-items: center; gap: 0.25rem;">${dot(color)}${usage.seriesName}:</div><div style="text-align: right;">${valueFormatter(usage.value.at(1) as number)}</div> |
71 |
| - <div style="display: flex; align-items: center; gap: 0.25rem;">${dot(requestColor)}${request.seriesName}:</div><div style="text-align: right;">${valueFormatter(request.value.at(1) as number)}</div> |
72 |
| - ${Array.isArray(limit?.value) ? `<div style="display: flex; align-items: center; gap: 0.25rem;">${dot(limitColor)}${limit.seriesName}:</div><div style="text-align: right;">${valueFormatter(limit.value.at(1) as number)}</div>` : ''} |
| 72 | + ${value |
| 73 | + .map( |
| 74 | + (v) => |
| 75 | + `<div style="display: flex; align-items: center; gap: 0.25rem;">${dot( |
| 76 | + v.color?.toString() ?? '' |
| 77 | + )}${v.seriesName}:</div><div style="text-align: right;">${valueFormatter( |
| 78 | + (Array.isArray(v.value) ? v.value[1] : null) as number |
| 79 | + )}</div>` |
| 80 | + ) |
| 81 | + .join('')} |
73 | 82 | </div>
|
74 | 83 | `;
|
75 |
| - } |
76 | 84 | return div;
|
77 | 85 | },
|
78 | 86 | axisPointer: {
|
|
105 | 113 | }
|
106 | 114 | })),
|
107 | 115 | {
|
108 |
| - data: safeData.map((d) => [d.timestamp.getTime(), request]), |
| 116 | + data: uniqueTimestamps.map((timestamp) => [timestamp, request]), |
109 | 117 | type: 'line',
|
110 | 118 | name: 'Requested',
|
111 | 119 | showSymbol: false,
|
|
122 | 130 | ]
|
123 | 131 | }
|
124 | 132 | },
|
125 |
| - ...(limit |
126 |
| - ? [ |
127 |
| - { |
128 |
| - data: safeData.map((d) => [d.timestamp.getTime(), limit]), |
129 |
| - type: 'line', |
130 |
| - name: 'Limit', |
131 |
| - showSymbol: false, |
132 |
| - color: limitColor, |
133 |
| - lineStyle: { color: limitColor }, |
134 |
| - markLine: { |
135 |
| - symbol: 'none', |
136 |
| - data: [ |
137 |
| - { |
138 |
| - yAxis: limit, |
139 |
| - label: { formatter: 'Limit', position: 'end', color: limitColor }, |
140 |
| - lineStyle: { type: 'solid', color: 'transparent' } |
141 |
| - } |
142 |
| - ] |
143 |
| - } |
| 133 | + limit |
| 134 | + ? { |
| 135 | + data: uniqueTimestamps.map((timestamp) => [timestamp, limit]), |
| 136 | + type: 'line', |
| 137 | + name: 'Limit', |
| 138 | + showSymbol: false, |
| 139 | + color: limitColor, |
| 140 | + lineStyle: { color: limitColor }, |
| 141 | + markLine: { |
| 142 | + symbol: 'none', |
| 143 | + data: [ |
| 144 | + { |
| 145 | + yAxis: limit, |
| 146 | + label: { formatter: 'Limit', position: 'end', color: limitColor }, |
| 147 | + lineStyle: { type: 'solid', color: 'transparent' } |
| 148 | + } |
| 149 | + ] |
144 | 150 | }
|
145 |
| - ] |
146 |
| - : []) |
| 151 | + } |
| 152 | + : null |
147 | 153 | ]
|
148 | 154 | } as EChartsOption;
|
| 155 | +
|
| 156 | + return opts; |
149 | 157 | }
|
150 | 158 |
|
151 | 159 | const limitColor = '#DE2E2E';
|
|
0 commit comments