From bce476c4a23c29fcda23c8d3763e2585ec3e8ebd Mon Sep 17 00:00:00 2001 From: "JUST.in DO IT" Date: Wed, 13 Aug 2025 14:40:42 -0700 Subject: [PATCH] feat(extension): Add extension for chart header (#34678) --- .../src/ui-overrides/types.ts | 23 ++++++++++- .../components/ExploreChartPanel/index.tsx | 38 ++++++++++++++----- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/superset-frontend/packages/superset-ui-core/src/ui-overrides/types.ts b/superset-frontend/packages/superset-ui-core/src/ui-overrides/types.ts index cdc9ed399af..cca2aed8809 100644 --- a/superset-frontend/packages/superset-ui-core/src/ui-overrides/types.ts +++ b/superset-frontend/packages/superset-ui-core/src/ui-overrides/types.ts @@ -23,8 +23,13 @@ import { ComponentType, } from 'react'; import type { Editor } from 'brace'; -import { BaseFormData } from '../query'; -import { JsonResponse } from '../connection'; +import type { QueryData } from '../chart/types/QueryResponse'; +import type { + BaseFormData, + LatestQueryFormData, + QueryFormData, +} from '../query'; +import type { JsonResponse } from '../connection'; /** * A function which returns text (or marked-up text) @@ -219,6 +224,19 @@ export interface DateFilterControlProps { isOverflowingFilterBar?: boolean; } +export interface ExploreChartHeaderProps { + chartId: number; + queriesResponse: QueryData[] | null; + sliceFormData: QueryFormData | null; + queryFormData: QueryFormData; + lastRendered: number; + latestQueryFormData: LatestQueryFormData; + chartUpdateEndTime: number | null; + chartUpdateStartTime: number; + queryController: AbortController | null; + triggerQuery: boolean; +} + export type Extensions = Partial<{ 'alertsreports.header.icon': ComponentType; 'load.drillby.options': LoadDrillByOptions; @@ -251,4 +269,5 @@ export type Extensions = Partial<{ ComponentType, ][]; 'filter.dateFilterControl': ComponentType; + 'explore.chart.header': ComponentType; }>; diff --git a/superset-frontend/src/explore/components/ExploreChartPanel/index.tsx b/superset-frontend/src/explore/components/ExploreChartPanel/index.tsx index 09de98577f4..a9fa4a11a4d 100644 --- a/superset-frontend/src/explore/components/ExploreChartPanel/index.tsx +++ b/superset-frontend/src/explore/components/ExploreChartPanel/index.tsx @@ -31,6 +31,7 @@ import { useTheme, QueryFormData, JsonObject, + getExtensionsRegistry, } from '@superset-ui/core'; import ChartContainer from 'src/components/Chart/ChartContainer'; import { @@ -50,6 +51,9 @@ import { ChartPills } from '../ChartPills'; import { ExploreAlert } from '../ExploreAlert'; import useResizeDetectorByObserver from './useResizeDetectorByObserver'; +const extensionsRegistry = getExtensionsRegistry(); +const DefaultHeader: React.FC = ({ children }) => <>{children}; + export interface ExploreChartPanelProps { actions: { setForceQuery: (force: boolean) => void; @@ -149,6 +153,9 @@ const ExploreChartPanel = ({ width: chartPanelWidth, height: chartPanelHeight, } = useResizeDetectorByObserver(); + + const ChartHeaderExtension = + extensionsRegistry.get('explore.chart.header') ?? DefaultHeader; const [splitSizes, setSplitSizes] = useState( isFeatureEnabled(FeatureFlag.DatapanelClosedByDefault) ? INITIAL_SIZES @@ -367,16 +374,29 @@ const ExploreChartPanel = ({ `} /> )} - + queryController={chart.queryController} + triggerQuery={chart.triggerQuery} + > + + {renderChart()} ),