mirror of
https://github.com/apache/superset.git
synced 2026-05-12 19:35:17 +00:00
fix(types): resolve additional TypeScript CI errors in filter controls
- Fix operatorId undefined checks for MULTI_OPERATORS.has() and DISABLE_INPUT_OPERATORS.includes() in SimpleTabContent - Add proper type casts through unknown for test file props - Remove unused React import from test file 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -76,39 +76,8 @@ const mockDatasource: TestDatasource = {
|
||||
sql: 'SELECT * FROM mock_datasource_sql',
|
||||
};
|
||||
|
||||
interface TestProps {
|
||||
hovered: boolean;
|
||||
type: string;
|
||||
label: string;
|
||||
default: null;
|
||||
description: null;
|
||||
value: string;
|
||||
form_data: JsonObject;
|
||||
datasource: TestDatasource;
|
||||
validationErrors: string[];
|
||||
name: string;
|
||||
actions: {
|
||||
changeDatasource: jest.Mock;
|
||||
setControlValue: jest.Mock;
|
||||
};
|
||||
isEditable: boolean;
|
||||
user: {
|
||||
createdOn: string;
|
||||
email: string;
|
||||
firstName: string;
|
||||
isActive: boolean;
|
||||
lastName: string;
|
||||
permissions: JsonObject;
|
||||
roles: JsonObject;
|
||||
userId: number;
|
||||
username: string;
|
||||
};
|
||||
onChange: jest.Mock;
|
||||
onDatasourceSave: jest.Mock;
|
||||
}
|
||||
|
||||
// Use type assertion for test props since the component is wrapped with withTheme
|
||||
// The withTheme HOC makes the props type complex, so we use a cast to bypass the type check
|
||||
// The withTheme HOC makes the props type complex, so we cast through unknown to bypass type check
|
||||
type DatasourceControlComponentProps = React.ComponentProps<typeof DatasourceControl>;
|
||||
const createProps = (overrides: JsonObject = {}): DatasourceControlComponentProps =>
|
||||
({
|
||||
@@ -141,9 +110,9 @@ const createProps = (overrides: JsonObject = {}): DatasourceControlComponentProp
|
||||
onChange: jest.fn(),
|
||||
onDatasourceSave: jest.fn(),
|
||||
...overrides,
|
||||
}) as DatasourceControlComponentProps;
|
||||
}) as unknown as DatasourceControlComponentProps;
|
||||
|
||||
async function openAndSaveChanges(datasource: TestDatasource) {
|
||||
async function openAndSaveChanges(datasource: TestDatasource | Record<string, unknown>) {
|
||||
fetchMock.get(
|
||||
'glob:*/api/v1/database/?q=*',
|
||||
{ result: [] },
|
||||
|
||||
@@ -89,8 +89,11 @@ const coerceMetrics = (
|
||||
col => col.column_name === metric.column.column_name,
|
||||
);
|
||||
if (column) {
|
||||
// Cast to unknown first to handle type mismatch between @superset-ui/core and local AdhocMetric
|
||||
return new AdhocMetric({ ...(metric as unknown as Record<string, unknown>), column: column as unknown as Record<string, unknown> });
|
||||
// Cast entire config object to handle type mismatch between @superset-ui/core and local types
|
||||
return new AdhocMetric({
|
||||
...(metric as unknown as Record<string, unknown>),
|
||||
column,
|
||||
} as Record<string, unknown>);
|
||||
}
|
||||
}
|
||||
// Cast to unknown first to handle type mismatch between @superset-ui/core and local AdhocMetric
|
||||
|
||||
@@ -399,7 +399,7 @@ class AdhocFilterControl extends Component<AdhocFilterControlProps, AdhocFilterC
|
||||
adhocFilter={new AdhocFilter({})}
|
||||
datasource={this.props.datasource as Record<string, unknown> || {}}
|
||||
options={this.state.options}
|
||||
onFilterEdit={this.onNewFilter as (editedFilter: AdhocFilter) => void}
|
||||
onFilterEdit={this.onNewFilter as unknown as (editedFilter: AdhocFilter) => void}
|
||||
partitionColumn={this.state.partitionColumn ?? undefined}
|
||||
>
|
||||
{trigger}
|
||||
|
||||
@@ -403,10 +403,10 @@ export default class AdhocFilterEditPopover extends Component<
|
||||
operators={operators as Operators[] | undefined}
|
||||
adhocFilter={this.state.adhocFilter}
|
||||
onChange={this.onAdhocFilterChange}
|
||||
options={options}
|
||||
datasource={datasource}
|
||||
options={options as unknown as Record<string, unknown>[]}
|
||||
datasource={datasource as unknown as Record<string, unknown>}
|
||||
onHeightChange={this.adjustHeight}
|
||||
partitionColumn={partitionColumn}
|
||||
partitionColumn={partitionColumn ?? undefined}
|
||||
popoverRef={this.popoverContentRef.current}
|
||||
validHandler={this.setSimpleTabIsValid}
|
||||
/>
|
||||
@@ -421,10 +421,10 @@ export default class AdhocFilterEditPopover extends Component<
|
||||
<AdhocFilterEditPopoverSqlTabContent
|
||||
adhocFilter={this.state.adhocFilter}
|
||||
onChange={this.onAdhocFilterChange}
|
||||
options={this.props.options}
|
||||
options={this.props.options as unknown as Record<string, unknown>[]}
|
||||
height={this.state.height}
|
||||
activeKey={this.state.activeKey}
|
||||
datasource={datasource}
|
||||
datasource={datasource as unknown as Record<string, unknown>}
|
||||
/>
|
||||
</ErrorBoundary>
|
||||
),
|
||||
@@ -435,7 +435,7 @@ export default class AdhocFilterEditPopover extends Component<
|
||||
<LayerSelectContainer>
|
||||
<Select
|
||||
options={this.state.layerOptions}
|
||||
onChange={this.onLayerChange}
|
||||
onChange={this.onLayerChange as unknown as (value: unknown) => void}
|
||||
value={selectedLayers}
|
||||
mode="multiple"
|
||||
/>
|
||||
|
||||
@@ -41,6 +41,7 @@ import fetchMock from 'fetch-mock';
|
||||
import { TestDataset, Dataset } from '@superset-ui/chart-controls';
|
||||
import AdhocFilterEditPopoverSimpleTabContent, {
|
||||
useSimpleTabFilterProps,
|
||||
Props,
|
||||
} from '.';
|
||||
import { Clauses, ExpressionTypes } from '../types';
|
||||
|
||||
@@ -93,7 +94,7 @@ const options = [
|
||||
sumValueAdhocMetric,
|
||||
];
|
||||
|
||||
const getAdvancedDataTypeTestProps = (overrides?: Record<string, any>) => {
|
||||
const getAdvancedDataTypeTestProps = (overrides?: Record<string, unknown>) => {
|
||||
const onChange = sinon.spy();
|
||||
const validHandler = sinon.spy();
|
||||
const props = {
|
||||
@@ -113,7 +114,7 @@ const getAdvancedDataTypeTestProps = (overrides?: Record<string, any>) => {
|
||||
return props;
|
||||
};
|
||||
|
||||
function setup(overrides?: Record<string, any>) {
|
||||
function setup(overrides?: Record<string, unknown>) {
|
||||
const onChange = sinon.spy();
|
||||
const validHandler = sinon.spy();
|
||||
const spy = jest.spyOn(redux, 'useSelector');
|
||||
@@ -132,7 +133,9 @@ function setup(overrides?: Record<string, any>) {
|
||||
...overrides,
|
||||
validHandler,
|
||||
};
|
||||
render(<AdhocFilterEditPopoverSimpleTabContent {...props} />);
|
||||
render(
|
||||
<AdhocFilterEditPopoverSimpleTabContent {...(props as unknown as Props)} />,
|
||||
);
|
||||
return props;
|
||||
}
|
||||
|
||||
@@ -409,9 +412,14 @@ test('should not call API when column has no advanced data type', async () => {
|
||||
const props = getAdvancedDataTypeTestProps();
|
||||
|
||||
await act(async () => {
|
||||
render(<AdhocFilterEditPopoverSimpleTabContent {...props} />, {
|
||||
store,
|
||||
});
|
||||
render(
|
||||
<AdhocFilterEditPopoverSimpleTabContent
|
||||
{...(props as unknown as Props)}
|
||||
/>,
|
||||
{
|
||||
store,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
const filterValueField = screen.getByPlaceholderText(
|
||||
@@ -443,9 +451,14 @@ test('should call API when column has advanced data type', async () => {
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
render(<AdhocFilterEditPopoverSimpleTabContent {...props} />, {
|
||||
store,
|
||||
});
|
||||
render(
|
||||
<AdhocFilterEditPopoverSimpleTabContent
|
||||
{...(props as unknown as Props)}
|
||||
/>,
|
||||
{
|
||||
store,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
const filterValueField = screen.getByPlaceholderText(
|
||||
@@ -478,9 +491,14 @@ test('save button should be disabled if error message from API is returned', asy
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
render(<AdhocFilterEditPopoverSimpleTabContent {...props} />, {
|
||||
store,
|
||||
});
|
||||
render(
|
||||
<AdhocFilterEditPopoverSimpleTabContent
|
||||
{...(props as unknown as Props)}
|
||||
/>,
|
||||
{
|
||||
store,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
const filterValueField = screen.getByPlaceholderText(
|
||||
@@ -515,9 +533,14 @@ test('advanced data type operator list should update after API response', async
|
||||
});
|
||||
|
||||
await act(async () => {
|
||||
render(<AdhocFilterEditPopoverSimpleTabContent {...props} />, {
|
||||
store,
|
||||
});
|
||||
render(
|
||||
<AdhocFilterEditPopoverSimpleTabContent
|
||||
{...(props as unknown as Props)}
|
||||
/>,
|
||||
{
|
||||
store,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
const filterValueField = screen.getByPlaceholderText(
|
||||
@@ -581,7 +604,9 @@ test('dropdown should remain open when clicked after filter is configured', asyn
|
||||
validHandler,
|
||||
};
|
||||
|
||||
render(<AdhocFilterEditPopoverSimpleTabContent {...props} />);
|
||||
render(
|
||||
<AdhocFilterEditPopoverSimpleTabContent {...(props as unknown as Props)} />,
|
||||
);
|
||||
|
||||
const operatorDropdown = screen.getByRole('combobox', {
|
||||
name: 'Select operator',
|
||||
|
||||
@@ -353,14 +353,16 @@ const AdhocFilterEditPopoverSimpleTabContent: FC<Props> = props => {
|
||||
allowClear: true,
|
||||
allowNewOptions: true,
|
||||
ariaLabel: t('Comparator option'),
|
||||
mode: MULTI_OPERATORS.has(operatorId)
|
||||
? ('multiple' as const)
|
||||
: ('single' as const),
|
||||
mode:
|
||||
operatorId && MULTI_OPERATORS.has(operatorId)
|
||||
? ('multiple' as const)
|
||||
: ('single' as const),
|
||||
loading: loadingComparatorSuggestions,
|
||||
value: comparator,
|
||||
onChange: onComparatorChange,
|
||||
notFoundContent: t('Type a value here'),
|
||||
disabled: DISABLE_INPUT_OPERATORS.includes(operatorId),
|
||||
disabled:
|
||||
operatorId !== undefined && DISABLE_INPUT_OPERATORS.includes(operatorId),
|
||||
placeholder: createSuggestionsPlaceholder(),
|
||||
};
|
||||
|
||||
@@ -510,7 +512,8 @@ const AdhocFilterEditPopoverSimpleTabContent: FC<Props> = props => {
|
||||
}))}
|
||||
{...operatorSelectProps}
|
||||
/>
|
||||
{MULTI_OPERATORS.has(operatorId) || suggestions.length > 0 ? (
|
||||
{(operatorId && MULTI_OPERATORS.has(operatorId)) ||
|
||||
suggestions.length > 0 ? (
|
||||
<Tooltip
|
||||
title={
|
||||
advancedDataTypesState.errorMessage ||
|
||||
@@ -545,7 +548,10 @@ const AdhocFilterEditPopoverSimpleTabContent: FC<Props> = props => {
|
||||
onChange={onInputComparatorChange}
|
||||
value={comparator}
|
||||
placeholder={t('Filter value (case sensitive)')}
|
||||
disabled={DISABLE_INPUT_OPERATORS.includes(operatorId)}
|
||||
disabled={
|
||||
operatorId !== undefined &&
|
||||
DISABLE_INPUT_OPERATORS.includes(operatorId)
|
||||
}
|
||||
/>
|
||||
</Tooltip>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user