Skip to content

Commit 088767c

Browse files
authored
feat(react-chart): add legend for pie chart (#1393)
1 parent dadddbd commit 088767c

File tree

9 files changed

+73
-21
lines changed

9 files changed

+73
-21
lines changed

packages/dx-chart-core/src/plugins/series/computeds.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,5 @@ export const seriesData = (series = [], seriesProps) => {
165165
};
166166

167167
export const checkZeroStart = (fromZero, axisName, pathType) => ({ ...fromZero, [axisName]: fromZero[axisName] || (pathType === 'area' || pathType === 'bar') });
168+
169+
export const getPieItems = (series, domain) => domain.map(uniqueName => ({ uniqueName }));

packages/dx-chart-core/src/plugins/series/computeds.test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
seriesData,
1818
checkZeroStart,
1919
barCoordinates,
20+
getPieItems,
2021
} from './computeds';
2122

2223
jest.mock('../../utils/scale', () => ({
@@ -343,3 +344,9 @@ describe('checkZeroStart', () => {
343344
expect(fromZero).toEqual({ axis1: false });
344345
});
345346
});
347+
348+
describe('#getPieItems', () => {
349+
it('should return function returns items of series', () => {
350+
expect(getPieItems(undefined, ['name1', 'name2'])).toEqual([{ uniqueName: 'name1' }, { uniqueName: 'name2' }]);
351+
});
352+
});

packages/dx-react-chart/src/plugins/legend.jsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,19 @@ export class Legend extends React.PureComponent {
2525
<TemplateConnector>
2626
{({
2727
series,
28+
domains,
29+
argumentAxisName,
2830
colorDomain,
31+
items,
2932
}) => (
3033
<Root name={`legend-${placeholder}`}>
31-
{colorDomain.domain().map((domainName) => {
32-
const { name, color } = series.find(({
33-
uniqueName,
34-
}) => uniqueName === domainName);
35-
return (
36-
<Item key={domainName}>
37-
<Marker name={name} color={color || colorDomain(domainName)} />
38-
<Label text={name} />
34+
{items(series, domains[argumentAxisName].domain)
35+
.map(({ uniqueName, color }) => (
36+
<Item key={uniqueName}>
37+
<Marker name={uniqueName} color={color || colorDomain(uniqueName)} />
38+
<Label text={uniqueName} />
3939
</Item>
40-
);
41-
})}
40+
))}
4241
</Root>
4342
)}
4443
</TemplateConnector>

packages/dx-react-chart/src/plugins/legend.test.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ describe('Legend', () => {
1919
});
2020
const defaultDeps = {
2121
getter: {
22-
layouts: { pane: {} },
2322
series: [{ name: 'first', color: 'color', uniqueName: 'first' }],
24-
setBBox: jest.fn(),
2523
colorDomain,
24+
domains: { argument: { domain: 'domain' } },
25+
argumentAxisName: 'argument',
26+
items: series => series,
2627
},
2728
template: {
2829
right: {},

packages/dx-react-chart/src/plugins/pie-series.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as React from 'react';
22
import * as PropTypes from 'prop-types';
3-
import { pieAttributes } from '@devexpress/dx-chart-core';
3+
import { pieAttributes, getPieItems } from '@devexpress/dx-chart-core';
44
import { withSeriesPlugin } from '../utils';
55

66
const Series = ({
@@ -29,6 +29,7 @@ export const PieSeries = withSeriesPlugin(
2929
'PieSeries',
3030
'arc',
3131
pieAttributes,
32+
getPieItems,
3233
);
3334

3435

packages/dx-react-chart/src/plugins/theme-manager.jsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@ import * as React from 'react';
22
import { Plugin, Getter } from '@devexpress/dx-react-core';
33
import { palette } from '@devexpress/dx-chart-core';
44

5-
const themeComputing = ({ series }) => palette(series);
6-
const pieThemeComputing = ({
7-
domains,
8-
argumentAxisName,
9-
}) => palette(domains[argumentAxisName].domain.map(uniqueName => ({ uniqueName })));
5+
const themeComputing = ({
6+
series, domains, argumentAxisName, items,
7+
}) => palette(items(series, domains[argumentAxisName].domain));
108

119

1210
export const ThemeManager = () => (
1311
<Plugin name="ThemeManager">
1412
<Getter name="colorDomain" computed={themeComputing} />
15-
<Getter name="pieColorDomain" computed={pieThemeComputing} />
1613
</Plugin>
1714
);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import * as React from 'react';
2+
import { mount } from 'enzyme';
3+
import { PluginHost } from '@devexpress/dx-react-core';
4+
import { palette } from '@devexpress/dx-chart-core';
5+
import { pluginDepsToComponents, getComputedState } from '@devexpress/dx-react-core/test-utils';
6+
import { ThemeManager } from './theme-manager';
7+
8+
const callbackItems = jest.fn();
9+
10+
jest.mock('@devexpress/dx-chart-core', () => ({
11+
palette: jest.fn(),
12+
}));
13+
14+
describe('Theme Manager', () => {
15+
beforeEach(() => {
16+
palette.mockImplementation(() => 'palette');
17+
});
18+
afterEach(() => {
19+
jest.resetAllMocks();
20+
});
21+
22+
it('should provide options', () => {
23+
const tree = mount((
24+
<PluginHost>
25+
{pluginDepsToComponents({
26+
getter: {
27+
series: [{}],
28+
domains: { argument: { domain: 'domain' } },
29+
argumentAxisName: 'argument',
30+
items: callbackItems,
31+
},
32+
})}
33+
<ThemeManager />
34+
</PluginHost>
35+
));
36+
37+
expect(getComputedState(tree).colorDomain).toBe('palette');
38+
expect(callbackItems).toBeCalledWith([{}], 'domain');
39+
});
40+
});

packages/dx-react-chart/src/utils/series-helper.jsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export const withSeriesPlugin = (
1616
pluginName,
1717
pathType,
1818
calculateCoordinates,
19+
getItems = series => series,
1920
) => {
2021
class Component extends React.PureComponent {
2122
render() {
@@ -48,6 +49,7 @@ export const withSeriesPlugin = (
4849
<Plugin name={pluginName}>
4950
<Getter name="series" computed={getSeriesDataComputed} />
5051
<Getter name="startFromZero" computed={startFromZeroByAxes} />
52+
<Getter name="items" value={getItems} />
5153
<Template name="series">
5254
<TemplatePlaceholder />
5355
<TemplateConnector>
@@ -60,7 +62,6 @@ export const withSeriesPlugin = (
6062
layouts,
6163
scaleExtension,
6264
colorDomain,
63-
pieColorDomain,
6465
}) => {
6566
const {
6667
stack, uniqueName,
@@ -88,7 +89,7 @@ export const withSeriesPlugin = (
8889
return (
8990
<Series
9091
uniqueName={uniqueName}
91-
colorDomain={pluginName === 'PieSeries' ? pieColorDomain : colorDomain}
92+
colorDomain={colorDomain}
9293
coordinates={calculatedCoordinates}
9394
color={color}
9495
{...restProps}

packages/dx-react-chart/src/utils/series-helper.test.jsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ describe('Base series', () => {
5555
stacks: ['one', 'two'],
5656
argumentAxisName: 'argumentAxisName',
5757
scaleExtension: 'scaleExtension',
58+
colorDomain: 'colorDomain',
5859
},
5960
template: {
6061
series: {},
@@ -68,6 +69,7 @@ describe('Base series', () => {
6869
argumentField: 'argumentField',
6970
axisName: 'axisName',
7071
stack: 'stack',
72+
color: 'color',
7173
};
7274
const TestComponentPath = () => (
7375
<div>
@@ -95,6 +97,8 @@ describe('Base series', () => {
9597

9698
expect(tree.find(TestComponentPath).props()).toEqual({
9799
coordinates: coords,
100+
color: 'color',
101+
colorDomain: 'colorDomain',
98102
styles: 'styles',
99103
});
100104
});

0 commit comments

Comments
 (0)