@automattic/charts 0.57.0 → 0.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +36 -2
- package/README.md +7 -54
- package/dist/index.cjs +9607 -21
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +32 -49
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +1612 -33
- package/dist/index.d.ts +1612 -33
- package/dist/index.js +9640 -54
- package/dist/index.js.map +1 -1
- package/package.json +9 -126
- package/src/charts/bar-chart/bar-chart.module.scss +0 -5
- package/src/charts/bar-chart/bar-chart.tsx +142 -149
- package/src/charts/bar-chart/test/bar-chart.test.tsx +48 -31
- package/src/charts/leaderboard-chart/leaderboard-chart.tsx +54 -74
- package/src/charts/leaderboard-chart/test/leaderboard-chart.test.tsx +4 -5
- package/src/charts/leaderboard-chart/types.ts +1 -11
- package/src/charts/line-chart/line-chart.module.scss +0 -5
- package/src/charts/line-chart/line-chart.tsx +202 -193
- package/src/charts/line-chart/private/line-chart-annotations-overlay.tsx +1 -2
- package/src/charts/line-chart/test/line-chart.test.tsx +49 -27
- package/src/charts/line-chart/types.ts +0 -1
- package/src/charts/pie-chart/pie-chart.module.scss +2 -10
- package/src/charts/pie-chart/pie-chart.tsx +212 -212
- package/src/charts/pie-chart/test/composition-api.test.tsx +44 -3
- package/src/charts/pie-chart/test/pie-chart.test.tsx +51 -44
- package/src/charts/pie-semi-circle-chart/pie-semi-circle-chart.module.scss +2 -8
- package/src/charts/pie-semi-circle-chart/pie-semi-circle-chart.tsx +166 -168
- package/src/charts/pie-semi-circle-chart/test/pie-semi-circle-chart.test.tsx +58 -30
- package/src/charts/private/chart-composition/index.ts +2 -0
- package/src/charts/private/chart-composition/render-legend-slot.ts +22 -0
- package/src/charts/private/chart-composition/test/render-legend-slot.test.tsx +60 -0
- package/src/charts/private/chart-composition/test/use-chart-children.test.tsx +91 -0
- package/src/charts/private/chart-composition/use-chart-children.ts +34 -2
- package/src/charts/private/chart-layout/chart-layout.module.scss +7 -0
- package/src/charts/private/chart-layout/chart-layout.tsx +106 -0
- package/src/charts/private/chart-layout/index.ts +2 -0
- package/src/charts/private/chart-layout/test/chart-layout.test.tsx +167 -0
- package/src/charts/private/single-chart-context/single-chart-context.tsx +2 -2
- package/src/charts/private/svg-empty-state/index.ts +1 -0
- package/src/charts/private/svg-empty-state/svg-empty-state.module.scss +7 -0
- package/src/charts/private/svg-empty-state/svg-empty-state.tsx +40 -0
- package/src/components/legend/hooks/test/use-chart-legend-items.test.tsx +12 -8
- package/src/components/legend/hooks/use-chart-legend-items.ts +12 -13
- package/src/components/legend/index.ts +1 -8
- package/src/components/legend/legend.tsx +33 -8
- package/src/components/legend/private/base-legend.module.scss +19 -37
- package/src/components/legend/private/base-legend.tsx +0 -2
- package/src/components/legend/test/legend.test.tsx +93 -1
- package/src/components/legend/types.ts +7 -34
- package/src/hooks/index.ts +1 -1
- package/src/hooks/use-data-with-percentages.ts +24 -0
- package/src/hooks/use-interactive-legend-data.ts +18 -15
- package/src/index.ts +66 -9
- package/src/providers/chart-context/global-charts-provider.tsx +7 -1
- package/src/providers/chart-context/hooks/use-chart-registration.ts +2 -1
- package/src/providers/chart-context/types.ts +2 -2
- package/src/types.ts +110 -45
- package/src/utils/date-parsing.ts +10 -1
- package/src/utils/test/date-parsing.test.ts +12 -0
- package/src/utils/test/resolve-css-var.test.ts +4 -2
- package/tsup.config.ts +1 -1
- package/dist/base-tooltip-DOq93wjU.d.cts +0 -38
- package/dist/base-tooltip-DOq93wjU.d.ts +0 -38
- package/dist/charts/bar-chart/index.cjs +0 -15
- package/dist/charts/bar-chart/index.cjs.map +0 -1
- package/dist/charts/bar-chart/index.css +0 -153
- package/dist/charts/bar-chart/index.css.map +0 -1
- package/dist/charts/bar-chart/index.d.cts +0 -37
- package/dist/charts/bar-chart/index.d.ts +0 -37
- package/dist/charts/bar-chart/index.js +0 -15
- package/dist/charts/bar-chart/index.js.map +0 -1
- package/dist/charts/bar-list-chart/index.cjs +0 -16
- package/dist/charts/bar-list-chart/index.cjs.map +0 -1
- package/dist/charts/bar-list-chart/index.css +0 -153
- package/dist/charts/bar-list-chart/index.css.map +0 -1
- package/dist/charts/bar-list-chart/index.d.cts +0 -92
- package/dist/charts/bar-list-chart/index.d.ts +0 -92
- package/dist/charts/bar-list-chart/index.js +0 -16
- package/dist/charts/bar-list-chart/index.js.map +0 -1
- package/dist/charts/conversion-funnel-chart/index.cjs +0 -11
- package/dist/charts/conversion-funnel-chart/index.cjs.map +0 -1
- package/dist/charts/conversion-funnel-chart/index.css +0 -251
- package/dist/charts/conversion-funnel-chart/index.css.map +0 -1
- package/dist/charts/conversion-funnel-chart/index.d.cts +0 -97
- package/dist/charts/conversion-funnel-chart/index.d.ts +0 -97
- package/dist/charts/conversion-funnel-chart/index.js +0 -11
- package/dist/charts/conversion-funnel-chart/index.js.map +0 -1
- package/dist/charts/geo-chart/index.cjs +0 -13
- package/dist/charts/geo-chart/index.cjs.map +0 -1
- package/dist/charts/geo-chart/index.css +0 -117
- package/dist/charts/geo-chart/index.css.map +0 -1
- package/dist/charts/geo-chart/index.d.cts +0 -67
- package/dist/charts/geo-chart/index.d.ts +0 -67
- package/dist/charts/geo-chart/index.js +0 -13
- package/dist/charts/geo-chart/index.js.map +0 -1
- package/dist/charts/leaderboard-chart/index.cjs +0 -20
- package/dist/charts/leaderboard-chart/index.cjs.map +0 -1
- package/dist/charts/leaderboard-chart/index.css +0 -172
- package/dist/charts/leaderboard-chart/index.css.map +0 -1
- package/dist/charts/leaderboard-chart/index.d.cts +0 -46
- package/dist/charts/leaderboard-chart/index.d.ts +0 -46
- package/dist/charts/leaderboard-chart/index.js +0 -20
- package/dist/charts/leaderboard-chart/index.js.map +0 -1
- package/dist/charts/line-chart/index.cjs +0 -15
- package/dist/charts/line-chart/index.cjs.map +0 -1
- package/dist/charts/line-chart/index.css +0 -225
- package/dist/charts/line-chart/index.css.map +0 -1
- package/dist/charts/line-chart/index.d.cts +0 -99
- package/dist/charts/line-chart/index.d.ts +0 -99
- package/dist/charts/line-chart/index.js +0 -15
- package/dist/charts/line-chart/index.js.map +0 -1
- package/dist/charts/pie-chart/index.cjs +0 -18
- package/dist/charts/pie-chart/index.cjs.map +0 -1
- package/dist/charts/pie-chart/index.css +0 -143
- package/dist/charts/pie-chart/index.css.map +0 -1
- package/dist/charts/pie-chart/index.d.cts +0 -97
- package/dist/charts/pie-chart/index.d.ts +0 -97
- package/dist/charts/pie-chart/index.js +0 -18
- package/dist/charts/pie-chart/index.js.map +0 -1
- package/dist/charts/pie-semi-circle-chart/index.cjs +0 -17
- package/dist/charts/pie-semi-circle-chart/index.cjs.map +0 -1
- package/dist/charts/pie-semi-circle-chart/index.css +0 -144
- package/dist/charts/pie-semi-circle-chart/index.css.map +0 -1
- package/dist/charts/pie-semi-circle-chart/index.d.cts +0 -94
- package/dist/charts/pie-semi-circle-chart/index.d.ts +0 -94
- package/dist/charts/pie-semi-circle-chart/index.js +0 -17
- package/dist/charts/pie-semi-circle-chart/index.js.map +0 -1
- package/dist/charts/sparkline/index.cjs +0 -16
- package/dist/charts/sparkline/index.cjs.map +0 -1
- package/dist/charts/sparkline/index.css +0 -242
- package/dist/charts/sparkline/index.css.map +0 -1
- package/dist/charts/sparkline/index.d.cts +0 -113
- package/dist/charts/sparkline/index.d.ts +0 -113
- package/dist/charts/sparkline/index.js +0 -16
- package/dist/charts/sparkline/index.js.map +0 -1
- package/dist/chunk-2A34OA5O.cjs +0 -51
- package/dist/chunk-2A34OA5O.cjs.map +0 -1
- package/dist/chunk-2NCY7R4G.js +0 -3897
- package/dist/chunk-2NCY7R4G.js.map +0 -1
- package/dist/chunk-32DH6JDF.js +0 -1263
- package/dist/chunk-32DH6JDF.js.map +0 -1
- package/dist/chunk-4OPFE4RM.js +0 -614
- package/dist/chunk-4OPFE4RM.js.map +0 -1
- package/dist/chunk-6CCZL2JJ.js +0 -63
- package/dist/chunk-6CCZL2JJ.js.map +0 -1
- package/dist/chunk-77OKCVQN.cjs +0 -421
- package/dist/chunk-77OKCVQN.cjs.map +0 -1
- package/dist/chunk-7FQX4ALL.cjs +0 -219
- package/dist/chunk-7FQX4ALL.cjs.map +0 -1
- package/dist/chunk-ASLARV7L.cjs +0 -81
- package/dist/chunk-ASLARV7L.cjs.map +0 -1
- package/dist/chunk-BCX5THDQ.js +0 -403
- package/dist/chunk-BCX5THDQ.js.map +0 -1
- package/dist/chunk-BPYKWMI7.js +0 -194
- package/dist/chunk-BPYKWMI7.js.map +0 -1
- package/dist/chunk-CZGYJKG6.js +0 -421
- package/dist/chunk-CZGYJKG6.js.map +0 -1
- package/dist/chunk-D2UH4CFE.cjs +0 -120
- package/dist/chunk-D2UH4CFE.cjs.map +0 -1
- package/dist/chunk-DAU3HNEG.js +0 -344
- package/dist/chunk-DAU3HNEG.js.map +0 -1
- package/dist/chunk-H2V4JMSA.js +0 -219
- package/dist/chunk-H2V4JMSA.js.map +0 -1
- package/dist/chunk-I2276W3I.cjs +0 -66
- package/dist/chunk-I2276W3I.cjs.map +0 -1
- package/dist/chunk-I35UYJJR.cjs +0 -468
- package/dist/chunk-I35UYJJR.cjs.map +0 -1
- package/dist/chunk-IU4DYUAV.js +0 -120
- package/dist/chunk-IU4DYUAV.js.map +0 -1
- package/dist/chunk-KXRWNFQJ.js +0 -51
- package/dist/chunk-KXRWNFQJ.js.map +0 -1
- package/dist/chunk-OP6PHB2U.js +0 -81
- package/dist/chunk-OP6PHB2U.js.map +0 -1
- package/dist/chunk-PXLEMUGJ.js +0 -165
- package/dist/chunk-PXLEMUGJ.js.map +0 -1
- package/dist/chunk-RCY6XLGU.cjs +0 -63
- package/dist/chunk-RCY6XLGU.cjs.map +0 -1
- package/dist/chunk-RHHVEJHJ.cjs +0 -1263
- package/dist/chunk-RHHVEJHJ.cjs.map +0 -1
- package/dist/chunk-TO3OQBXG.cjs +0 -165
- package/dist/chunk-TO3OQBXG.cjs.map +0 -1
- package/dist/chunk-V36ERY7Y.js +0 -375
- package/dist/chunk-V36ERY7Y.js.map +0 -1
- package/dist/chunk-VJM5XCB4.cjs +0 -614
- package/dist/chunk-VJM5XCB4.cjs.map +0 -1
- package/dist/chunk-VTS3PNMS.cjs +0 -344
- package/dist/chunk-VTS3PNMS.cjs.map +0 -1
- package/dist/chunk-WLODYNLB.js +0 -1067
- package/dist/chunk-WLODYNLB.js.map +0 -1
- package/dist/chunk-XKRJL2QT.cjs +0 -375
- package/dist/chunk-XKRJL2QT.cjs.map +0 -1
- package/dist/chunk-XWYZIFZW.js +0 -66
- package/dist/chunk-XWYZIFZW.js.map +0 -1
- package/dist/chunk-Y3NNQMAX.cjs +0 -194
- package/dist/chunk-Y3NNQMAX.cjs.map +0 -1
- package/dist/chunk-YE2T52VZ.cjs +0 -1067
- package/dist/chunk-YE2T52VZ.cjs.map +0 -1
- package/dist/chunk-Z26M4V2M.js +0 -468
- package/dist/chunk-Z26M4V2M.js.map +0 -1
- package/dist/chunk-Z45KX47P.cjs +0 -3897
- package/dist/chunk-Z45KX47P.cjs.map +0 -1
- package/dist/chunk-ZH4F5RMG.cjs +0 -403
- package/dist/chunk-ZH4F5RMG.cjs.map +0 -1
- package/dist/components/legend/index.cjs +0 -11
- package/dist/components/legend/index.cjs.map +0 -1
- package/dist/components/legend/index.css +0 -103
- package/dist/components/legend/index.css.map +0 -1
- package/dist/components/legend/index.d.cts +0 -37
- package/dist/components/legend/index.d.ts +0 -37
- package/dist/components/legend/index.js +0 -11
- package/dist/components/legend/index.js.map +0 -1
- package/dist/components/tooltip/index.cjs +0 -12
- package/dist/components/tooltip/index.cjs.map +0 -1
- package/dist/components/tooltip/index.css +0 -13
- package/dist/components/tooltip/index.css.map +0 -1
- package/dist/components/tooltip/index.d.cts +0 -71
- package/dist/components/tooltip/index.d.ts +0 -71
- package/dist/components/tooltip/index.js +0 -12
- package/dist/components/tooltip/index.js.map +0 -1
- package/dist/components/trend-indicator/index.cjs +0 -8
- package/dist/components/trend-indicator/index.cjs.map +0 -1
- package/dist/components/trend-indicator/index.css +0 -27
- package/dist/components/trend-indicator/index.css.map +0 -1
- package/dist/components/trend-indicator/index.d.cts +0 -44
- package/dist/components/trend-indicator/index.d.ts +0 -44
- package/dist/components/trend-indicator/index.js +0 -8
- package/dist/components/trend-indicator/index.js.map +0 -1
- package/dist/format-metric-value-MXm5DtQ_.d.cts +0 -24
- package/dist/format-metric-value-MXm5DtQ_.d.ts +0 -24
- package/dist/hooks/index.cjs +0 -31
- package/dist/hooks/index.cjs.map +0 -1
- package/dist/hooks/index.css +0 -103
- package/dist/hooks/index.css.map +0 -1
- package/dist/hooks/index.d.cts +0 -272
- package/dist/hooks/index.d.ts +0 -272
- package/dist/hooks/index.js +0 -31
- package/dist/hooks/index.js.map +0 -1
- package/dist/leaderboard-chart-BKYYXcg2.d.ts +0 -83
- package/dist/leaderboard-chart-DR7CGb0L.d.cts +0 -83
- package/dist/legend-C2grwnWk.d.cts +0 -9
- package/dist/legend-Cj0xM5dU.d.ts +0 -9
- package/dist/providers/index.cjs +0 -21
- package/dist/providers/index.cjs.map +0 -1
- package/dist/providers/index.css +0 -103
- package/dist/providers/index.css.map +0 -1
- package/dist/providers/index.d.cts +0 -28
- package/dist/providers/index.d.ts +0 -28
- package/dist/providers/index.js +0 -21
- package/dist/providers/index.js.map +0 -1
- package/dist/themes-BmVGrYnF.d.ts +0 -67
- package/dist/themes-CyjKm-P_.d.cts +0 -67
- package/dist/types-CuUEszrM.d.ts +0 -19
- package/dist/types-DZordNiO.d.cts +0 -505
- package/dist/types-DZordNiO.d.ts +0 -505
- package/dist/types-I67mddpr.d.cts +0 -78
- package/dist/types-I67mddpr.d.ts +0 -78
- package/dist/types-KtOPPzPX.d.cts +0 -19
- package/dist/utils/index.cjs +0 -44
- package/dist/utils/index.cjs.map +0 -1
- package/dist/utils/index.d.cts +0 -226
- package/dist/utils/index.d.ts +0 -226
- package/dist/utils/index.js +0 -44
- package/dist/utils/index.js.map +0 -1
- package/dist/with-responsive-CNfhzAUu.d.cts +0 -18
- package/dist/with-responsive-CNfhzAUu.d.ts +0 -18
- package/src/hooks/use-has-legend-child.ts +0 -22
|
@@ -7,8 +7,8 @@ describe( 'PieChart', () => {
|
|
|
7
7
|
const defaultProps = {
|
|
8
8
|
size: 500,
|
|
9
9
|
data: [
|
|
10
|
-
{ label: 'A',
|
|
11
|
-
{ label: 'B',
|
|
10
|
+
{ label: 'A', value: 50 },
|
|
11
|
+
{ label: 'B', value: 50 },
|
|
12
12
|
],
|
|
13
13
|
};
|
|
14
14
|
|
|
@@ -21,21 +21,21 @@ describe( 'PieChart', () => {
|
|
|
21
21
|
};
|
|
22
22
|
|
|
23
23
|
describe( 'Data Validation', () => {
|
|
24
|
-
test( 'validates total
|
|
24
|
+
test( 'validates total value is greater than 0', () => {
|
|
25
25
|
renderWithTheme( {
|
|
26
26
|
data: [
|
|
27
|
-
{ label: 'A',
|
|
28
|
-
{ label: 'B',
|
|
27
|
+
{ label: 'A', value: 0 },
|
|
28
|
+
{ label: 'B', value: 0 },
|
|
29
29
|
],
|
|
30
30
|
} );
|
|
31
|
-
expect( screen.getByText( /invalid
|
|
31
|
+
expect( screen.getByText( /invalid data/i ) ).toBeInTheDocument();
|
|
32
32
|
} );
|
|
33
33
|
|
|
34
34
|
test( 'handles negative values', () => {
|
|
35
35
|
renderWithTheme( {
|
|
36
36
|
data: [
|
|
37
|
-
{ label: 'A',
|
|
38
|
-
{ label: 'B',
|
|
37
|
+
{ label: 'A', value: -30 },
|
|
38
|
+
{ label: 'B', value: 130 },
|
|
39
39
|
],
|
|
40
40
|
} );
|
|
41
41
|
expect( screen.getByText( /invalid data/i ) ).toBeInTheDocument();
|
|
@@ -48,7 +48,7 @@ describe( 'PieChart', () => {
|
|
|
48
48
|
|
|
49
49
|
test( 'handles single data point', () => {
|
|
50
50
|
renderWithTheme( {
|
|
51
|
-
data: [ { label: 'A',
|
|
51
|
+
data: [ { label: 'A', value: 100 } ],
|
|
52
52
|
} );
|
|
53
53
|
// Use getAllByText since 'A' appears in both chart and legend
|
|
54
54
|
const labels = screen.getAllByText( 'A' );
|
|
@@ -60,7 +60,7 @@ describe( 'PieChart', () => {
|
|
|
60
60
|
test( 'renders legend when showLegend is true', () => {
|
|
61
61
|
renderWithTheme( {
|
|
62
62
|
showLegend: true,
|
|
63
|
-
|
|
63
|
+
legend: { position: 'top' },
|
|
64
64
|
} );
|
|
65
65
|
|
|
66
66
|
// Check that legend container is rendered using accessible queries
|
|
@@ -72,7 +72,7 @@ describe( 'PieChart', () => {
|
|
|
72
72
|
test( 'renders correct number of legend items', () => {
|
|
73
73
|
renderWithTheme( {
|
|
74
74
|
showLegend: true,
|
|
75
|
-
|
|
75
|
+
legend: { position: 'top' },
|
|
76
76
|
} );
|
|
77
77
|
|
|
78
78
|
// Use getAllByTestId to find legend items
|
|
@@ -83,7 +83,7 @@ describe( 'PieChart', () => {
|
|
|
83
83
|
test( 'chart renders with legend at top position', () => {
|
|
84
84
|
renderWithTheme( {
|
|
85
85
|
showLegend: true,
|
|
86
|
-
|
|
86
|
+
legend: { position: 'top' },
|
|
87
87
|
} );
|
|
88
88
|
|
|
89
89
|
// Verify the chart renders without errors when legend is at top
|
|
@@ -98,7 +98,7 @@ describe( 'PieChart', () => {
|
|
|
98
98
|
test( 'chart renders with legend at bottom position', () => {
|
|
99
99
|
renderWithTheme( {
|
|
100
100
|
showLegend: true,
|
|
101
|
-
|
|
101
|
+
legend: { position: 'bottom' },
|
|
102
102
|
} );
|
|
103
103
|
|
|
104
104
|
// Verify the chart renders without errors when legend is at bottom
|
|
@@ -157,10 +157,11 @@ describe( 'PieChart', () => {
|
|
|
157
157
|
} );
|
|
158
158
|
|
|
159
159
|
describe( 'Legend Value Display', () => {
|
|
160
|
+
// Values that give clean percentages: 60/100=60%, 23/100=23%, 17/100=17%
|
|
160
161
|
const testData = [
|
|
161
|
-
{ label: 'Windows', value:
|
|
162
|
-
{ label: 'MacOS', value:
|
|
163
|
-
{ label: 'Linux', value:
|
|
162
|
+
{ label: 'Windows', value: 60, valueDisplay: '60' },
|
|
163
|
+
{ label: 'MacOS', value: 23, valueDisplay: '23' },
|
|
164
|
+
{ label: 'Linux', value: 17, valueDisplay: '17' },
|
|
164
165
|
];
|
|
165
166
|
|
|
166
167
|
test( 'shows percentage values by default when showLegend and showValues are enabled', () => {
|
|
@@ -170,7 +171,7 @@ describe( 'PieChart', () => {
|
|
|
170
171
|
// legendValueDisplay defaults to 'percentage'
|
|
171
172
|
} );
|
|
172
173
|
|
|
173
|
-
// Should display
|
|
174
|
+
// Should display calculated percentages from values
|
|
174
175
|
expect( screen.getByText( '60%' ) ).toBeInTheDocument();
|
|
175
176
|
expect( screen.getByText( '23%' ) ).toBeInTheDocument();
|
|
176
177
|
expect( screen.getByText( '17%' ) ).toBeInTheDocument();
|
|
@@ -184,9 +185,9 @@ describe( 'PieChart', () => {
|
|
|
184
185
|
} );
|
|
185
186
|
|
|
186
187
|
// Should display localized numeric values
|
|
187
|
-
expect( screen.getByText( '
|
|
188
|
-
expect( screen.getByText( '
|
|
189
|
-
expect( screen.getByText( '
|
|
188
|
+
expect( screen.getByText( '60' ) ).toBeInTheDocument();
|
|
189
|
+
expect( screen.getByText( '23' ) ).toBeInTheDocument();
|
|
190
|
+
expect( screen.getByText( '17' ) ).toBeInTheDocument();
|
|
190
191
|
} );
|
|
191
192
|
|
|
192
193
|
test( 'shows formatted values when legendValueDisplay is set to "valueDisplay"', () => {
|
|
@@ -197,9 +198,9 @@ describe( 'PieChart', () => {
|
|
|
197
198
|
} );
|
|
198
199
|
|
|
199
200
|
// Should display formatted values (valueDisplay field)
|
|
200
|
-
expect( screen.getByText( '
|
|
201
|
-
expect( screen.getByText( '
|
|
202
|
-
expect( screen.getByText( '
|
|
201
|
+
expect( screen.getByText( '60' ) ).toBeInTheDocument();
|
|
202
|
+
expect( screen.getByText( '23' ) ).toBeInTheDocument();
|
|
203
|
+
expect( screen.getByText( '17' ) ).toBeInTheDocument();
|
|
203
204
|
} );
|
|
204
205
|
|
|
205
206
|
test( 'shows no values when legendValueDisplay is set to "none"', () => {
|
|
@@ -222,9 +223,12 @@ describe( 'PieChart', () => {
|
|
|
222
223
|
} );
|
|
223
224
|
|
|
224
225
|
describe( 'Tooltip Functionality', () => {
|
|
226
|
+
// Values: 80000 + 30000 = 110000
|
|
227
|
+
// Windows: 80000/110000 = 72.727...%
|
|
228
|
+
// MacOS: 30000/110000 = 27.272...%
|
|
225
229
|
const testData = [
|
|
226
|
-
{ label: 'Windows', value: 80000, valueDisplay: '80K'
|
|
227
|
-
{ label: 'MacOS', value: 30000, valueDisplay: '30K'
|
|
230
|
+
{ label: 'Windows', value: 80000, valueDisplay: '80K' },
|
|
231
|
+
{ label: 'MacOS', value: 30000, valueDisplay: '30K' },
|
|
228
232
|
];
|
|
229
233
|
|
|
230
234
|
test( 'does not show tooltip when withTooltips is false', async () => {
|
|
@@ -314,7 +318,7 @@ describe( 'PieChart', () => {
|
|
|
314
318
|
|
|
315
319
|
test( 'tooltip shows valueDisplay when available, falls back to value', async () => {
|
|
316
320
|
const user = userEvent.setup();
|
|
317
|
-
const dataWithoutValueDisplay = [ { label: 'Test', value: 42
|
|
321
|
+
const dataWithoutValueDisplay = [ { label: 'Test', value: 42 } ];
|
|
318
322
|
|
|
319
323
|
renderWithTheme( {
|
|
320
324
|
data: dataWithoutValueDisplay,
|
|
@@ -356,15 +360,18 @@ describe( 'PieChart', () => {
|
|
|
356
360
|
expect( customTooltipRenderer ).toHaveBeenCalled();
|
|
357
361
|
|
|
358
362
|
// Verify the renderer received correct parameters
|
|
363
|
+
// Percentage is calculated from values: 80000 / (80000 + 30000) = 72.727...%
|
|
359
364
|
expect( customTooltipRenderer ).toHaveBeenCalledWith(
|
|
360
365
|
expect.objectContaining( {
|
|
361
366
|
tooltipData: expect.objectContaining( {
|
|
362
367
|
label: 'Windows',
|
|
363
368
|
value: 80000,
|
|
364
|
-
percentage: 70,
|
|
365
369
|
} ),
|
|
366
370
|
} )
|
|
367
371
|
);
|
|
372
|
+
// Verify percentage is calculated (approximately 72.73%)
|
|
373
|
+
const callArgs = customTooltipRenderer.mock.calls[ 0 ][ 0 ];
|
|
374
|
+
expect( callArgs.tooltipData.percentage ).toBeCloseTo( 72.73, 1 );
|
|
368
375
|
} );
|
|
369
376
|
} );
|
|
370
377
|
|
|
@@ -372,14 +379,14 @@ describe( 'PieChart', () => {
|
|
|
372
379
|
test( 'filters segments when interactive legend is enabled and segment is toggled', async () => {
|
|
373
380
|
const user = userEvent.setup();
|
|
374
381
|
const testData = [
|
|
375
|
-
{ label: 'Segment A', value: 50
|
|
376
|
-
{ label: 'Segment B', value: 50
|
|
382
|
+
{ label: 'Segment A', value: 50 },
|
|
383
|
+
{ label: 'Segment B', value: 50 },
|
|
377
384
|
];
|
|
378
385
|
|
|
379
386
|
renderWithTheme( {
|
|
380
387
|
data: testData,
|
|
381
388
|
showLegend: true,
|
|
382
|
-
|
|
389
|
+
legend: { interactive: true },
|
|
383
390
|
chartId: 'test-interactive-pie-chart',
|
|
384
391
|
} );
|
|
385
392
|
|
|
@@ -404,14 +411,14 @@ describe( 'PieChart', () => {
|
|
|
404
411
|
test( 'shows empty state when all segments are hidden', async () => {
|
|
405
412
|
const user = userEvent.setup();
|
|
406
413
|
const testData = [
|
|
407
|
-
{ label: 'Segment A', value: 50
|
|
408
|
-
{ label: 'Segment B', value: 50
|
|
414
|
+
{ label: 'Segment A', value: 50 },
|
|
415
|
+
{ label: 'Segment B', value: 50 },
|
|
409
416
|
];
|
|
410
417
|
|
|
411
418
|
renderWithTheme( {
|
|
412
419
|
data: testData,
|
|
413
420
|
showLegend: true,
|
|
414
|
-
|
|
421
|
+
legend: { interactive: true },
|
|
415
422
|
chartId: 'test-all-hidden-pie-chart',
|
|
416
423
|
} );
|
|
417
424
|
|
|
@@ -443,14 +450,14 @@ describe( 'PieChart', () => {
|
|
|
443
450
|
|
|
444
451
|
test( 'does not filter segments when legendInteractive is false', () => {
|
|
445
452
|
const testData = [
|
|
446
|
-
{ label: 'Segment A', value: 50
|
|
447
|
-
{ label: 'Segment B', value: 50
|
|
453
|
+
{ label: 'Segment A', value: 50 },
|
|
454
|
+
{ label: 'Segment B', value: 50 },
|
|
448
455
|
];
|
|
449
456
|
|
|
450
457
|
renderWithTheme( {
|
|
451
458
|
data: testData,
|
|
452
459
|
showLegend: true,
|
|
453
|
-
|
|
460
|
+
legend: { interactive: false },
|
|
454
461
|
chartId: 'test-non-interactive-pie-chart',
|
|
455
462
|
} );
|
|
456
463
|
|
|
@@ -466,15 +473,15 @@ describe( 'PieChart', () => {
|
|
|
466
473
|
test( 'maintains consistent colors when segments are hidden', async () => {
|
|
467
474
|
const user = userEvent.setup();
|
|
468
475
|
const testData = [
|
|
469
|
-
{ label: 'Segment A', value: 30
|
|
470
|
-
{ label: 'Segment B', value: 40
|
|
471
|
-
{ label: 'Segment C', value: 30
|
|
476
|
+
{ label: 'Segment A', value: 30 },
|
|
477
|
+
{ label: 'Segment B', value: 40 },
|
|
478
|
+
{ label: 'Segment C', value: 30 },
|
|
472
479
|
];
|
|
473
480
|
|
|
474
481
|
renderWithTheme( {
|
|
475
482
|
data: testData,
|
|
476
483
|
showLegend: true,
|
|
477
|
-
|
|
484
|
+
legend: { interactive: true },
|
|
478
485
|
chartId: 'test-color-consistency-pie-chart',
|
|
479
486
|
} );
|
|
480
487
|
|
|
@@ -498,15 +505,15 @@ describe( 'PieChart', () => {
|
|
|
498
505
|
test( 'recalculates legend percentages when segments are hidden', async () => {
|
|
499
506
|
const user = userEvent.setup();
|
|
500
507
|
const testData = [
|
|
501
|
-
{ label: 'Segment A', value: 25
|
|
502
|
-
{ label: 'Segment B', value: 50
|
|
503
|
-
{ label: 'Segment C', value: 25
|
|
508
|
+
{ label: 'Segment A', value: 25 },
|
|
509
|
+
{ label: 'Segment B', value: 50 },
|
|
510
|
+
{ label: 'Segment C', value: 25 },
|
|
504
511
|
];
|
|
505
512
|
|
|
506
513
|
renderWithTheme( {
|
|
507
514
|
data: testData,
|
|
508
515
|
showLegend: true,
|
|
509
|
-
|
|
516
|
+
legend: { interactive: true },
|
|
510
517
|
legendValueDisplay: 'percentage',
|
|
511
518
|
chartId: 'test-percentage-recalc-pie-chart',
|
|
512
519
|
} );
|
|
@@ -5,15 +5,9 @@
|
|
|
5
5
|
width: 100%;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
&__svg-wrapper {
|
|
10
|
-
flex: 1;
|
|
11
|
-
min-height: 0; // Required for flex shrinking
|
|
12
|
-
min-width: 0; // Required for flex shrinking
|
|
8
|
+
&__centering {
|
|
13
9
|
width: 100%;
|
|
14
|
-
|
|
15
|
-
align-items: center;
|
|
16
|
-
justify-content: center;
|
|
10
|
+
height: 100%;
|
|
17
11
|
}
|
|
18
12
|
|
|
19
13
|
.label {
|