88 Tooltip ,
99 Legend ,
1010 type ChartOptions ,
11+ type LegendItem ,
1112 type ScriptableLineSegmentContext ,
1213} from 'chart.js'
1314import { 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+
3037export 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
3850function 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 ,
0 commit comments