From 914d2a2ac2f6a48ee37fcd34b8a13fc73c94849e Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Wed, 22 Apr 2026 16:08:41 -0400 Subject: [PATCH] Disable adhoc --- .../ColumnSelectPopover.tsx | 12 ++++++++ .../AdhocMetricEditPopover/index.tsx | 29 ++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx index f61fafe8bcb..72ad3a7519a 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/ColumnSelectPopover.tsx @@ -142,6 +142,10 @@ const ColumnSelectPopover = ({ const datasourceType = useSelector( state => state.explore.datasource.type, ); + const compatibleDimensions = useSelector< + ExplorePageState, + string[] | null | undefined + >(state => state.explore.compatibleDimensions); const [initialLabel] = useState(label); const [initialAdhocColumn, initialCalculatedColumn, initialSimpleColumn] = getInitialColumnValues(editedColumn); @@ -551,6 +555,11 @@ const ColumnSelectPopover = ({ key: `column-${simpleColumn.column_name}`, column_name: simpleColumn.column_name, verbose_name: simpleColumn.verbose_name ?? '', + disabled: + compatibleDimensions != null && + !compatibleDimensions.includes( + simpleColumn.column_name, + ), })), ...availableMetrics.map(metric => ({ value: metric.metric_name, @@ -565,6 +574,9 @@ const ColumnSelectPopover = ({ key: `metric-${metric.metric_name}`, metric_name: metric.metric_name, verbose_name: metric.verbose_name ?? '', + disabled: + compatibleDimensions != null && + !compatibleDimensions.includes(metric.metric_name), })), ]} optionFilterProps={[ diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx index 031248df0a0..1951c16bfcf 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricEditPopover/index.tsx @@ -18,6 +18,7 @@ */ /* eslint-disable camelcase */ import { PureComponent, createRef } from 'react'; +import { useSelector } from 'react-redux'; import { isDefined, ensureIsArray, DatasourceType } from '@superset-ui/core'; import { t } from '@apache-superset/core/translation'; import type { editors } from '@apache-superset/core'; @@ -94,6 +95,8 @@ interface AdhocMetricEditPopoverProps { datasource?: DatasourceInfo; isNewMetric?: boolean; isLabelModified?: boolean; + /** Names of metrics the user may select; null means no filtering. */ + compatibleMetrics?: string[] | null; } interface AdhocMetricEditPopoverState { @@ -123,7 +126,7 @@ const StyledSelect = styled(Select)` export const SAVED_TAB_KEY = 'SAVED'; -export default class AdhocMetricEditPopover extends PureComponent< +class AdhocMetricEditPopover extends PureComponent< AdhocMetricEditPopoverProps, AdhocMetricEditPopoverState > { @@ -445,6 +448,11 @@ export default class AdhocMetricEditPopover extends PureComponent< key: savedMetric.id, metric_name: savedMetric.metric_name, verbose_name: savedMetric.verbose_name ?? '', + disabled: + this.props.compatibleMetrics != null && + !this.props.compatibleMetrics.includes( + savedMetric.metric_name, + ), }), )} optionFilterProps={['metric_name', 'verbose_name']} @@ -596,3 +604,22 @@ export default class AdhocMetricEditPopover extends PureComponent< } // @ts-expect-error - defaultProps for backward compatibility AdhocMetricEditPopover.defaultProps = defaultProps; + +// --------------------------------------------------------------------------- +// Thin functional wrapper that injects compatibility data from Redux. +// AdhocMetricEditPopover is a class component and cannot use hooks directly. +// --------------------------------------------------------------------------- +function AdhocMetricEditPopoverWithRedux( + props: AdhocMetricEditPopoverProps, +) { + const compatibleMetrics = useSelector( + (state: any) => state.explore?.compatibleMetrics as string[] | null | undefined, + ); + return ( + + ); +} + +export { AdhocMetricEditPopover }; +export default AdhocMetricEditPopoverWithRedux; +