Skip to content

Commit 8183710

Browse files
asizikovCopilot
andcommitted
refactor: add static chart legend items
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent baaef4d commit 8183710

2 files changed

Lines changed: 39 additions & 19 deletions

File tree

src/components/DualAxisLineChart.tsx

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
Tooltip,
99
Legend,
1010
type ChartOptions,
11+
type LegendItem,
1112
type ScriptableLineSegmentContext,
1213
} from 'chart.js'
1314
import { Line } from 'react-chartjs-2'
@@ -27,12 +28,23 @@ export interface LineSeries {
2728
segmentColor?: (startValue: number, endValue: number) => string
2829
}
2930

31+
export interface ExtraLegendItem {
32+
label: string
33+
color: string
34+
legendOrder?: number
35+
}
36+
3037
export interface DualAxisLineChartProps {
3138
title: string
3239
labels: string[]
3340
series: [LineSeries, LineSeries, ...LineSeries[]]
3441
height?: number
3542
formatYAsCurrency?: boolean
43+
extraLegendItems?: ExtraLegendItem[]
44+
}
45+
46+
type OrderedLegendItem = LegendItem & {
47+
legendOrder?: number
3648
}
3749

3850
function formatTick(value: number): string {
@@ -52,6 +64,7 @@ export function DualAxisLineChart({
5264
series,
5365
height = 320,
5466
formatYAsCurrency = false,
67+
extraLegendItems = [],
5568
}: DualAxisLineChartProps) {
5669
const tickFormatter = formatYAsCurrency ? formatUsdTick : formatTick
5770
const usesSecondaryAxis = series.some((dataset) => dataset.yAxisID === 'y1')
@@ -111,24 +124,33 @@ export function DualAxisLineChart({
111124
font: { size: 11, weight: 500 },
112125
generateLabels: (chart) => {
113126
const defaultLabels = ChartJS.defaults.plugins.legend.labels.generateLabels?.(chart) ?? []
114-
return defaultLabels.map((item) => {
127+
const datasetLabels: OrderedLegendItem[] = defaultLabels.map((item) => {
115128
const dataset = typeof item.datasetIndex === 'number'
116129
? chart.data.datasets[item.datasetIndex] as { legendLabel?: string, legendOrder?: number }
117130
: undefined
118131

119-
return dataset?.legendLabel ? { ...item, text: dataset.legendLabel } : item
120-
}).sort((a, b) => {
121-
const datasetA = typeof a.datasetIndex === 'number'
122-
? chart.data.datasets[a.datasetIndex] as { legendOrder?: number }
123-
: undefined
124-
const datasetB = typeof b.datasetIndex === 'number'
125-
? chart.data.datasets[b.datasetIndex] as { legendOrder?: number }
126-
: undefined
132+
return {
133+
...item,
134+
text: dataset?.legendLabel ?? item.text,
135+
legendOrder: dataset?.legendOrder,
136+
}
137+
})
138+
139+
const additionalLabels: OrderedLegendItem[] = extraLegendItems.map((item) => ({
140+
text: item.label,
141+
fillStyle: item.color,
142+
strokeStyle: item.color,
143+
hidden: false,
144+
lineWidth: 2,
145+
legendOrder: item.legendOrder,
146+
}))
127147

128-
return (datasetA?.legendOrder ?? a.datasetIndex ?? 0) - (datasetB?.legendOrder ?? b.datasetIndex ?? 0)
148+
return [...datasetLabels, ...additionalLabels].sort((a, b) => {
149+
return (a.legendOrder ?? a.datasetIndex ?? 0) - (b.legendOrder ?? b.datasetIndex ?? 0)
129150
})
130151
},
131152
},
153+
onClick: () => undefined,
132154
},
133155
title: {
134156
display: true,

src/views/CostManagementView.tsx

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -441,15 +441,6 @@ export function CostManagementView({
441441
: SIMULATED_ADDITIONAL_COLOR
442442
),
443443
},
444-
{
445-
label: 'Simulated - additional usage',
446-
legendOrder: 2,
447-
color: SIMULATED_ADDITIONAL_COLOR,
448-
data: cumulativeSimulationSeries.labels.map(() => null),
449-
yAxisID: 'y',
450-
order: 4,
451-
pointRadius: 0,
452-
},
453444
{
454445
label: 'Included AI Credits pool',
455446
legendOrder: 4,
@@ -461,6 +452,13 @@ export function CostManagementView({
461452
pointRadius: 0,
462453
},
463454
]}
455+
extraLegendItems={[
456+
{
457+
label: 'Simulated - additional usage',
458+
color: SIMULATED_ADDITIONAL_COLOR,
459+
legendOrder: 2,
460+
},
461+
]}
464462
formatYAsCurrency
465463
height={320}
466464
/>

0 commit comments

Comments
 (0)