From 0ad0b09aeac9abb5340a50b3c3d8a3f2842e270d Mon Sep 17 00:00:00 2001 From: Damian Pendrak Date: Thu, 15 May 2025 09:10:28 +0200 Subject: [PATCH] Add dynamicQueryObjectCount property to Chart Metadata --- .../src/chart/models/ChartMetadata.ts | 5 +++ .../components/useResultsPane.tsx | 33 ++++++++++--------- .../test/ResultsPaneOnDashboard.test.tsx | 29 ++++++++++++++++ 3 files changed, 52 insertions(+), 15 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartMetadata.ts b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartMetadata.ts index 9a9716a22be0..c132c9ea4c8c 100644 --- a/superset-frontend/packages/superset-ui-core/src/chart/models/ChartMetadata.ts +++ b/superset-frontend/packages/superset-ui-core/src/chart/models/ChartMetadata.ts @@ -49,6 +49,7 @@ export interface ChartMetadataConfig { label?: ChartLabel | null; labelExplanation?: string | null; queryObjectCount?: number; + dynamicQueryObjectCount?: boolean; parseMethod?: ParseMethod; // suppressContextMenu: true hides the default context menu for the chart. // This is useful for viz plugins that define their own context menu. @@ -92,6 +93,8 @@ export default class ChartMetadata { queryObjectCount: number; + dynamicQueryObjectCount: boolean; + parseMethod: ParseMethod; suppressContextMenu?: boolean; @@ -115,6 +118,7 @@ export default class ChartMetadata { label = null, labelExplanation = null, queryObjectCount = 1, + dynamicQueryObjectCount = false, parseMethod = 'json-bigint', suppressContextMenu = false, } = config; @@ -145,6 +149,7 @@ export default class ChartMetadata { this.label = label; this.labelExplanation = labelExplanation; this.queryObjectCount = queryObjectCount; + this.dynamicQueryObjectCount = dynamicQueryObjectCount; this.parseMethod = parseMethod; this.suppressContextMenu = suppressContextMenu; } diff --git a/superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx b/superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx index e96963d10854..969a9ef12d89 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane/components/useResultsPane.tsx @@ -57,6 +57,7 @@ export const useResultsPane = ({ const [isLoading, setIsLoading] = useState(true); const [responseError, setResponseError] = useState(''); const queryCount = metadata?.queryObjectCount ?? 1; + const isQueryCountDynamic = metadata?.dynamicQueryObjectCount; useEffect(() => { // it's an invalid formData when gets a errorMessage @@ -139,19 +140,21 @@ export const useResultsPane = ({ , ); } - return resultResp - .slice(0, queryCount) - .map((result, idx) => ( - - )); + const resultRespToDisplay = isQueryCountDynamic + ? resultResp + : resultResp.slice(0, queryCount); + + return resultRespToDisplay.map((result, idx) => ( + + )); }; diff --git a/superset-frontend/src/explore/components/DataTablesPane/test/ResultsPaneOnDashboard.test.tsx b/superset-frontend/src/explore/components/DataTablesPane/test/ResultsPaneOnDashboard.test.tsx index 48ccb547027a..46de4787217c 100644 --- a/superset-frontend/src/explore/components/DataTablesPane/test/ResultsPaneOnDashboard.test.tsx +++ b/superset-frontend/src/explore/components/DataTablesPane/test/ResultsPaneOnDashboard.test.tsx @@ -174,4 +174,33 @@ describe('ResultsPaneOnDashboard', () => { expect(await findByText('Results')).toBeVisible(); expect(await findByText('Results 2')).toBeVisible(); }); + + test('dynamic number of results pane', async () => { + const FakeChart = () => test; + const metadata = new ChartMetadata({ + name: 'test-chart', + thumbnail: '', + dynamicQueryObjectCount: true, + }); + + const plugin = new ChartPlugin({ + metadata, + Chart: FakeChart, + }); + plugin.configure({ key: VizType.MixedTimeseries }).register(); + + const props = createResultsPaneOnDashboardProps({ + sliceId: 196, + vizType: VizType.MixedTimeseries, + }); + const { findByText, queryByText } = render( + , + { + useRedux: true, + }, + ); + expect(await findByText('Results')).toBeVisible(); + expect(await findByText('Results 2')).toBeVisible(); + expect(queryByText('Results 3')).not.toBeInTheDocument(); + }); });