You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ru...@apache.org on 2026/07/06 23:55:29 UTC
(superset) 01/01: test(plugin-chart-echarts): prove user-selected plain legend type is honored (#39540)
This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch test/issue-39540-legend-type-plain
in repository https://gitbox.apache.org/repos/asf/superset.git
commit df11a40ccc63d5aa1d155533aa1b654662bc6678
Author: Claude Code <no...@anthropic.com>
AuthorDate: Mon Jul 6 16:53:40 2026 -0700
test(plugin-chart-echarts): prove user-selected plain legend type is honored (#39540)
Adds regression coverage for issue #39540, where switching the legend
type control from scroll to plain had no effect on rendered charts.
The regression came from unconditionally forcing scroll legends for
horizontal (top/bottom) orientations; plain legend layout support with
an effectiveType fallback later restored the user's choice.
These tests pin the fixed contract at two levels:
- getLegendLayoutResult: a user-selected plain type is honored for
horizontal legends (including many items on a wide chart, and bottom
orientation), and a user-selected scroll type passes through
untouched, with scroll reserved as a fallback for legends that do not
fit the available space.
- Timeseries transformProps: the plain selection survives end-to-end
into echartOptions.legend.type for both top and bottom orientations
when space allows.
Co-Authored-By: Claude Fable 5 <no...@anthropic.com>
---
.../test/Timeseries/transformProps.test.ts | 40 ++++++++++++++++
.../plugin-chart-echarts/test/utils/series.test.ts | 56 ++++++++++++++++++++++
2 files changed, 96 insertions(+)
diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts
index 00cc84ff11f..74c7dfd1237 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/test/Timeseries/transformProps.test.ts
@@ -938,6 +938,46 @@ describe('legend sorting', () => {
});
});
+test('honors user-selected plain legend type for top orientation when space allows (#39540)', () => {
+ // Regression test for issue #39540: switching the legend type control from
+ // scroll to plain must reach the rendered ECharts config. Horizontal legends
+ // were once unconditionally forced to scroll; scroll should be a fallback
+ // reserved for legends that do not fit the available space.
+ const chartProps = createTestChartProps({
+ formData: {
+ ...formData,
+ legendType: LegendType.Plain,
+ legendOrientation: LegendOrientation.Top,
+ showLegend: true,
+ },
+ });
+
+ const { legend } = transformProps(chartProps).echartOptions as {
+ legend: { show?: boolean; type?: LegendType };
+ };
+
+ expect(legend.show).toBe(true);
+ expect(legend.type).toBe(LegendType.Plain);
+});
+
+test('honors user-selected plain legend type for bottom orientation when space allows (#39540)', () => {
+ const chartProps = createTestChartProps({
+ formData: {
+ ...formData,
+ legendType: LegendType.Plain,
+ legendOrientation: LegendOrientation.Bottom,
+ showLegend: true,
+ },
+ });
+
+ const { legend } = transformProps(chartProps).echartOptions as {
+ legend: { show?: boolean; type?: LegendType };
+ };
+
+ expect(legend.show).toBe(true);
+ expect(legend.type).toBe(LegendType.Plain);
+});
+
const timeCompareFormData: SqlaFormData = {
colorScheme: 'bnbColors',
datasource: '3__table',
diff --git a/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts b/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts
index 62489ee6b02..d0ae93f80c0 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts
@@ -993,6 +993,62 @@ test('getLegendLayoutResult keeps plain horizontal legends when they fit within
});
});
+test('getLegendLayoutResult honors user-selected plain type for many horizontal legend items given ample width (#39540)', () => {
+ // Regression contract for issue #39540: a legend with enough items to be
+ // scrollable must still honor a user-selected plain type when the chart is
+ // wide enough, instead of being unconditionally forced to scroll.
+ const layout = getLegendLayoutResult({
+ chartHeight: 600,
+ chartWidth: 1600,
+ legendItems: Array.from({ length: 10 }, (_, i) => `Series ${i + 1}`),
+ legendMargin: null,
+ orientation: LegendOrientation.Top,
+ show: true,
+ theme,
+ type: LegendType.Plain,
+ });
+
+ expect(layout.effectiveType).toBe(LegendType.Plain);
+ expect(layout.effectiveMargin).toBeGreaterThanOrEqual(
+ defaultLegendPadding[LegendOrientation.Top],
+ );
+});
+
+test('getLegendLayoutResult keeps user-selected plain type for bottom-oriented legends when space allows', () => {
+ expect(
+ getLegendLayoutResult({
+ chartHeight: 400,
+ chartWidth: 800,
+ legendItems: ['Alpha', 'Beta', 'Gamma', 'Delta'],
+ legendMargin: null,
+ orientation: LegendOrientation.Bottom,
+ show: true,
+ theme,
+ type: LegendType.Plain,
+ }),
+ ).toEqual({
+ effectiveMargin: defaultLegendPadding[LegendOrientation.Bottom],
+ effectiveType: LegendType.Plain,
+ });
+});
+
+test('getLegendLayoutResult passes a user-selected scroll type through untouched', () => {
+ expect(
+ getLegendLayoutResult({
+ chartHeight: 400,
+ chartWidth: 800,
+ legendItems: ['Alpha', 'Beta'],
+ legendMargin: null,
+ orientation: LegendOrientation.Top,
+ show: true,
+ theme,
+ type: LegendType.Scroll,
+ }),
+ ).toEqual({
+ effectiveType: LegendType.Scroll,
+ });
+});
+
test('getLegendLayoutResult adds extra margin for wrapped plain horizontal legends', () => {
const layout = getLegendLayoutResult({
chartHeight: 400,