Skip to content

Commit 8b39f15

Browse files
committed
fix: reflect specs ids on legend items when using single series
1 parent 322f38a commit 8b39f15

File tree

4 files changed

+123
-19
lines changed

4 files changed

+123
-19
lines changed

src/lib/series/legend.test.ts

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import { getGroupId, getSpecId, SpecId } from '../utils/ids';
2+
import { ScaleType } from '../utils/scales/scales';
3+
import { computeLegend } from './legend';
4+
import { DataSeriesColorsValues } from './series';
5+
import { BasicSeriesSpec } from './specs';
6+
7+
const colorValues1a = {
8+
specId: getSpecId('spec1'),
9+
colorValues: [],
10+
};
11+
const colorValues1b = {
12+
specId: getSpecId('spec1'),
13+
colorValues: ['a', 'b'],
14+
};
15+
const colorValues2a = {
16+
specId: getSpecId('spec2'),
17+
colorValues: [],
18+
};
19+
const colorValues2b = {
20+
specId: getSpecId('spec3'),
21+
colorValues: ['c', 'd'],
22+
};
23+
const spec1: BasicSeriesSpec = {
24+
id: getSpecId('spec1'),
25+
groupId: getGroupId('group'),
26+
seriesType: 'line',
27+
yScaleType: ScaleType.Log,
28+
xScaleType: ScaleType.Linear,
29+
xAccessor: 'x',
30+
yAccessors: ['y'],
31+
yScaleToDataExtent: false,
32+
data: [],
33+
};
34+
const spec2: BasicSeriesSpec = {
35+
id: getSpecId('spec2'),
36+
groupId: getGroupId('group'),
37+
seriesType: 'line',
38+
yScaleType: ScaleType.Log,
39+
xScaleType: ScaleType.Linear,
40+
xAccessor: 'x',
41+
yAccessors: ['y'],
42+
yScaleToDataExtent: false,
43+
data: [],
44+
};
45+
46+
describe('Legends', () => {
47+
const seriesColor = new Map<string, DataSeriesColorsValues>();
48+
const seriesColorMap = new Map<string, string>();
49+
const specs = new Map<SpecId, BasicSeriesSpec>();
50+
specs.set(spec1.id, spec1);
51+
specs.set(spec2.id, spec2);
52+
seriesColorMap.set('colorSeries1a', 'red');
53+
seriesColorMap.set('colorSeries1b', 'blue');
54+
seriesColorMap.set('colorSeries2a', 'green');
55+
seriesColorMap.set('colorSeries2b', 'white');
56+
beforeEach(() => {
57+
seriesColor.clear();
58+
});
59+
it('compute legend for a single series', () => {
60+
seriesColor.set('colorSeries1a', colorValues1a);
61+
const legend = computeLegend(seriesColor, seriesColorMap, specs, 'violet');
62+
const expected = [
63+
{ color: 'red', label: 'spec1', value: { colorValues: [], specId: 'spec1' } },
64+
];
65+
expect(legend).toEqual(expected);
66+
});
67+
it('compute legend for a single spec but with multiple series', () => {
68+
seriesColor.set('colorSeries1a', colorValues1a);
69+
seriesColor.set('colorSeries1b', colorValues1b);
70+
const legend = computeLegend(seriesColor, seriesColorMap, specs, 'violet');
71+
const expected = [
72+
{ color: 'red', label: 'spec1', value: { colorValues: [], specId: 'spec1' } },
73+
{ color: 'blue', label: 'a - b', value: { colorValues: ['a', 'b'], specId: 'spec1' } },
74+
];
75+
expect(legend).toEqual(expected);
76+
});
77+
it('compute legend for multiple specs', () => {
78+
seriesColor.set('colorSeries1a', colorValues1a);
79+
seriesColor.set('colorSeries2a', colorValues2a);
80+
const legend = computeLegend(seriesColor, seriesColorMap, specs, 'violet');
81+
const expected = [
82+
{ color: 'red', label: 'spec1', value: { colorValues: [], specId: 'spec1' } },
83+
{ color: 'green', label: 'spec2', value: { colorValues: [], specId: 'spec2' } },
84+
];
85+
expect(legend).toEqual(expected);
86+
});
87+
it('empty legend for missing spec', () => {
88+
seriesColor.set('colorSeries2b', colorValues2b);
89+
const legend = computeLegend(seriesColor, seriesColorMap, specs, 'violet');
90+
expect(legend).toEqual([]);
91+
});
92+
it('compute legend with default color for missing series color', () => {
93+
seriesColor.set('colorSeries1a', colorValues1a);
94+
const emptyColorMap = new Map<string, string>();
95+
const legend = computeLegend(seriesColor, emptyColorMap, specs, 'violet');
96+
const expected = [
97+
{ color: 'violet', label: 'spec1', value: { colorValues: [], specId: 'spec1' } },
98+
];
99+
expect(legend).toEqual(expected);
100+
});
101+
});

src/lib/series/legend.ts

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { getAxesSpecForSpecId } from '../../state/utils';
2-
import { AxisId, SpecId } from '../utils/ids';
1+
import { SpecId } from '../utils/ids';
32
import { DataSeriesColorsValues } from './series';
4-
import { AxisSpec, BasicSeriesSpec } from './specs';
3+
import { BasicSeriesSpec } from './specs';
54
export interface LegendItem {
65
color: string;
76
label: string;
@@ -11,24 +10,19 @@ export function computeLegend(
1110
seriesColor: Map<string, DataSeriesColorsValues>,
1211
seriesColorMap: Map<string, string>,
1312
specs: Map<SpecId, BasicSeriesSpec>,
14-
axes: Map<AxisId, AxisSpec>,
1513
defaultColor: string,
1614
): LegendItem[] {
1715
const legendItems: LegendItem[] = [];
1816
seriesColor.forEach((series, key) => {
1917
const color = seriesColorMap.get(key) || defaultColor;
20-
const spec = specs.get(series.specId);
21-
if (!spec) {
22-
return;
23-
}
2418
let label = '';
19+
2520
if (seriesColor.size === 1 || series.colorValues.length === 0 || !series.colorValues[0]) {
26-
const axis = getAxesSpecForSpecId(axes, spec.groupId);
27-
if (axis.yAxis) {
28-
label = `${axis.yAxis.title}`;
29-
} else {
30-
label = `${spec.id}`;
21+
const spec = specs.get(series.specId);
22+
if (!spec) {
23+
return;
3124
}
25+
label = `${spec.id}`;
3226
} else {
3327
label = series.colorValues.join(' - ');
3428
}

src/state/chart_state.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,6 @@ export class ChartStore {
289289
seriesDomains.seriesColors,
290290
seriesColorMap,
291291
this.seriesSpecs,
292-
this.axesSpecs,
293292
this.chartTheme.colors.defaultVizColor,
294293
);
295294
// tslint:disable-next-line:no-console

src/stories/bar_chart.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,25 +276,25 @@ storiesOf('Bar Chart', module)
276276
</Chart>
277277
);
278278
})
279-
.add('clustered multi series', () => {
279+
.add('clustered multiple series specs', () => {
280280
return (
281281
<Chart renderer="canvas" className={'story-chart'}>
282282
<Settings showLegend={true} legendPosition={Position.Right} />
283283
<Axis
284284
id={getAxisId('bottom')}
285285
position={Position.Bottom}
286-
title={'Bottom axis'}
286+
title={'elements'}
287287
showOverlappingTicks={true}
288288
/>
289289
<Axis
290290
id={getAxisId('left2')}
291-
title={'Left axis'}
291+
title={'count'}
292292
position={Position.Left}
293293
tickFormat={(d) => Number(d).toFixed(2)}
294294
/>
295295

296296
<BarSeries
297-
id={getSpecId('bars1')}
297+
id={getSpecId('bar series 1')}
298298
xScaleType={ScaleType.Linear}
299299
yScaleType={ScaleType.Linear}
300300
xAccessor="x"
@@ -304,7 +304,17 @@ storiesOf('Bar Chart', module)
304304
yScaleToDataExtent={false}
305305
/>
306306
<BarSeries
307-
id={getSpecId('bars2')}
307+
id={getSpecId('bar series 2')}
308+
xScaleType={ScaleType.Linear}
309+
yScaleType={ScaleType.Linear}
310+
xAccessor="x"
311+
yAccessors={['y']}
312+
splitSeriesAccessors={['g']}
313+
data={[{ x: 0, y: 1 }, { x: 1, y: 2 }, { x: 2, y: 3 }, { x: 3, y: 4 }]}
314+
yScaleToDataExtent={false}
315+
/>
316+
<BarSeries
317+
id={getSpecId('bar series 3')}
308318
xScaleType={ScaleType.Linear}
309319
yScaleType={ScaleType.Linear}
310320
xAccessor="x"

0 commit comments

Comments
 (0)