fix(types): resolve additional TypeScript errors in explore components

- 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 <noreply@anthropic.com>
This commit is contained in:
Evan Rusackas
2025-12-20 11:03:44 -08:00
parent 7400fb199b
commit 23da4d7693
8 changed files with 19 additions and 19 deletions

View File

@@ -300,7 +300,7 @@ const AdhocFilterEditPopoverSimpleTabContent: FC<Props> = props => {
};
const renderSubjectOptionLabel = (option: ColumnType) => (
<FilterDefinitionOption option={option} />
<FilterDefinitionOption option={option as unknown as { column_name?: string; saved_metric_name?: string; label?: string; type?: string; [key: string]: unknown }} />
);
const getOptionsRemaining = () => {

View File

@@ -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) ? (
<>
<ControlHeader label={t('Time Range')} />
<DateFilterComponent

View File

@@ -237,8 +237,8 @@ export default class AdhocMetricEditPopover extends PureComponent<
this.props.onChange(
{
...metric,
},
oldMetric,
} as Metric,
oldMetric as Metric,
);
this.props.onClose();
}
@@ -390,7 +390,7 @@ export default class AdhocMetricEditPopover extends PureComponent<
ariaLabel: t('Select aggregate options'),
placeholder: t('%s aggregates(s)', AGGREGATES_OPTIONS.length),
value: adhocMetric.aggregate ?? adhocMetric.inferSqlExpressionAggregate() ?? undefined,
onChange: this.onAggregateChange,
onChange: this.onAggregateChange as (value: unknown) => void,
allowClear: true,
autoFocus: !!columnValue,
};

View File

@@ -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<typeof defaultProps> = {}) {
function setup(overrides: Record<string, unknown> = {}) {
const props = {
...defaultProps,
...overrides,

View File

@@ -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<string, never>;
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}

View File

@@ -44,7 +44,7 @@ describe('FilterDefinitionOption', () => {
});
test('renders a StyledColumnOption given an adhoc metric', async () => {
render(<FilterDefinitionOption option={sumValueAdhocMetric} />);
render(<FilterDefinitionOption option={sumValueAdhocMetric as unknown as { label: string }} />);
await expect(screen.getByText('SUM(source)')).toBeVisible();
});

View File

@@ -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<typeof defaultProps> = {}) => {
const setup = (propOverrides: Record<string, unknown> = {}) => {
const props = {
...defaultProps,
...propOverrides,
@@ -48,7 +48,7 @@ const setup = (propOverrides: Partial<typeof defaultProps> = {}) => {
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();
});

View File

@@ -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;
}