From 23da4d7693dc1e21f95518dedef57da41f8bb896 Mon Sep 17 00:00:00 2001 From: Evan Rusackas Date: Sat, 20 Dec 2025 11:03:44 -0800 Subject: [PATCH] fix(types): resolve additional TypeScript errors in explore components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Make columnName optional in useDatePickerInAdhocFilter hook - Cast FilterDefinitionOption option prop for ColumnType compatibility - Cast onChange and metric arguments in AdhocMetricEditPopover - Update AdhocMetricPopoverTrigger to accept empty savedMetric object - Cast datasource and onChange in AdhocMetricPopoverTrigger render - Fix MetricDefinitionValue metric_name type check - Update test files with proper type annotations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../AdhocFilterEditPopoverSimpleTabContent/index.tsx | 2 +- .../FilterControl/utils/useDatePickerInAdhocFilter.tsx | 6 +++--- .../MetricControl/AdhocMetricEditPopover/index.tsx | 6 +++--- .../controls/MetricControl/AdhocMetricOption.test.tsx | 4 ++-- .../controls/MetricControl/AdhocMetricPopoverTrigger.tsx | 8 ++++---- .../MetricControl/FilterDefinitionOption.test.tsx | 2 +- .../controls/MetricControl/MetricDefinitionValue.test.tsx | 8 ++++---- .../controls/MetricControl/MetricDefinitionValue.tsx | 2 +- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx index 141ef55c03f..6c3b92f16d4 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/index.tsx @@ -300,7 +300,7 @@ const AdhocFilterEditPopoverSimpleTabContent: FC = props => { }; const renderSubjectOptionLabel = (option: ColumnType) => ( - + ); const getOptionsRemaining = () => { diff --git a/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocFilter.tsx b/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocFilter.tsx index af148bb92dd..8d2f895fb52 100644 --- a/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocFilter.tsx +++ b/superset-frontend/src/explore/components/controls/FilterControl/utils/useDatePickerInAdhocFilter.tsx @@ -24,7 +24,7 @@ import DateFilterControl from 'src/explore/components/controls/DateFilterControl import ControlHeader from 'src/explore/components/ControlHeader'; interface DatePickerInFilterProps { - columnName: string; + columnName?: string; timeRange?: string; datasource: Dataset; onChange: (columnName: string, timeRange: string) => void; @@ -36,7 +36,7 @@ export const useDatePickerInAdhocFilter = ({ datasource, onChange, }: DatePickerInFilterProps): ReactElement | undefined => { - const onTimeRangeChange = (val: string) => onChange(columnName, val); + const onTimeRangeChange = (val: string) => onChange(columnName ?? '', val); const extensionsRegistry = getExtensionsRegistry(); @@ -45,7 +45,7 @@ export const useDatePickerInAdhocFilter = ({ ); const DateFilterComponent = DateFilterControlExtension ?? DateFilterControl; - return isTemporalColumn(columnName, datasource) ? ( + return columnName && isTemporalColumn(columnName, datasource) ? ( <> void, allowClear: true, autoFocus: !!columnValue, }; diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.test.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.test.tsx index d2fa1e7cbbd..bcddf9802b9 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.test.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricOption.test.tsx @@ -51,13 +51,13 @@ const defaultProps = { savedMetricsOptions: [], onMetricEdit: jest.fn(), columns, - datasource, + datasource: undefined, onMoveLabel: jest.fn(), onDropLabel: jest.fn(), index: 0, }; -function setup(overrides: Partial = {}) { +function setup(overrides: Record = {}) { const props = { ...defaultProps, ...overrides, diff --git a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx index 2822ee088ab..2c112b01117 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/AdhocMetricPopoverTrigger.tsx @@ -37,7 +37,7 @@ export type AdhocMetricPopoverTriggerProps = { onMetricEdit(newMetric: Metric, oldMetric: Metric): void; columns: { column_name: string; type: string }[]; savedMetricsOptions: savedMetricType[]; - savedMetric: savedMetricType; + savedMetric: savedMetricType | Record; datasource: Datasource & ISaveableDatasource; children: ReactNode; isControlledComponent?: boolean; @@ -216,12 +216,12 @@ class AdhocMetricPopoverTrigger extends PureComponent< adhocMetric={adhocMetric} columns={columns} savedMetricsOptions={savedMetricsOptions} - savedMetric={savedMetric} - datasource={datasource} + savedMetric={savedMetric as savedMetricType} + datasource={datasource as unknown as { type?: string; id?: number | string; extra?: string }} handleDatasetModal={this.handleDatasetModal} onResize={this.onPopoverResize} onClose={closePopover} - onChange={this.onChange} + onChange={this.onChange as (newMetric: unknown, oldMetric?: unknown) => void} getCurrentTab={this.getCurrentTab} getCurrentLabel={this.getCurrentLabel} isNewMetric={this.props.isNew} diff --git a/superset-frontend/src/explore/components/controls/MetricControl/FilterDefinitionOption.test.tsx b/superset-frontend/src/explore/components/controls/MetricControl/FilterDefinitionOption.test.tsx index 96eb9d46eb2..a7e02bf9156 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/FilterDefinitionOption.test.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/FilterDefinitionOption.test.tsx @@ -44,7 +44,7 @@ describe('FilterDefinitionOption', () => { }); test('renders a StyledColumnOption given an adhoc metric', async () => { - render(); + render(); await expect(screen.getByText('SUM(source)')).toBeVisible(); }); diff --git a/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.test.tsx b/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.test.tsx index c3735d4edac..51717d0d57c 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.test.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.test.tsx @@ -28,17 +28,17 @@ const sumValueAdhocMetric = new AdhocMetric({ const defaultProps = { onMetricEdit: jest.fn(), - option: sumValueAdhocMetric, + option: sumValueAdhocMetric as AdhocMetric, index: 1, columns: [], savedMetrics: [], savedMetricsOptions: [], - datasource: {}, + datasource: undefined, onMoveLabel: jest.fn(), onDropLabel: jest.fn(), }; -const setup = (propOverrides: Partial = {}) => { +const setup = (propOverrides: Record = {}) => { const props = { ...defaultProps, ...propOverrides, @@ -48,7 +48,7 @@ const setup = (propOverrides: Partial = {}) => { test('renders a MetricOption given a saved metric', () => { setup({ - option: { metric_name: 'a_saved_metric', expression: 'COUNT(*)' } as typeof defaultProps['option'], + option: { metric_name: 'a_saved_metric', expression: 'COUNT(*)' }, }); expect(screen.getByText('a_saved_metric')).toBeInTheDocument(); }); diff --git a/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.tsx b/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.tsx index ba86a4bb8ee..d78f09bac7e 100644 --- a/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.tsx +++ b/superset-frontend/src/explore/components/controls/MetricControl/MetricDefinitionValue.tsx @@ -78,7 +78,7 @@ export default function MetricDefinitionValue({ let savedMetric; if (typeof option === 'string') { savedMetric = getSavedMetricByName(option); - } else if (option.metric_name) { + } else if ((option as SavedMetricTypeDef).metric_name) { savedMetric = option; }