fix(filters): Adds a fix for saving time range adhoc_filters (#30581)

Co-authored-by: Muhammad Musfir <muhammad.musfir@de-cix.net>
This commit is contained in:
ObservabilityTeam 2024-10-15 16:44:31 +02:00 committed by GitHub
parent 6ede3271ff
commit 2c3ba95768
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 75 additions and 14 deletions

View File

@ -20,7 +20,11 @@ import sinon from 'sinon';
import fetchMock from 'fetch-mock'; import fetchMock from 'fetch-mock';
import { Dispatch } from 'redux'; import { Dispatch } from 'redux';
import { ADD_TOAST } from 'src/components/MessageToasts/actions'; import { ADD_TOAST } from 'src/components/MessageToasts/actions';
import { DatasourceType, QueryFormData } from '@superset-ui/core'; import {
DatasourceType,
QueryFormData,
SimpleAdhocFilter,
} from '@superset-ui/core';
import { import {
createDashboard, createDashboard,
createSlice, createSlice,
@ -31,6 +35,7 @@ import {
getSlicePayload, getSlicePayload,
PayloadSlice, PayloadSlice,
} from './saveModalActions'; } from './saveModalActions';
import { Operators } from '../constants';
// Define test constants and mock data using imported types // Define test constants and mock data using imported types
const sliceId = 10; const sliceId = 10;
@ -594,6 +599,7 @@ describe('getSlicePayload', () => {
}, },
], ],
}; };
const formDataWithAdhocFiltersWithExtra: QueryFormData = { const formDataWithAdhocFiltersWithExtra: QueryFormData = {
...formDataWithNativeFilters, ...formDataWithNativeFilters,
viz_type: 'mixed_timeseries', viz_type: 'mixed_timeseries',
@ -625,11 +631,61 @@ describe('getSlicePayload', () => {
owners as [], owners as [],
formDataFromSliceWithAdhocFilterB, formDataFromSliceWithAdhocFilterB,
); );
expect(JSON.parse(result.params as string).adhoc_filters).toEqual( expect(JSON.parse(result.params as string).adhoc_filters).toEqual(
formDataFromSliceWithAdhocFilterB.adhoc_filters, formDataFromSliceWithAdhocFilterB.adhoc_filters,
); );
expect(JSON.parse(result.params as string).adhoc_filters).toEqual( expect(JSON.parse(result.params as string).adhoc_filters_b).toEqual(
formDataFromSliceWithAdhocFilterB.adhoc_filters_b, formDataFromSliceWithAdhocFilterB.adhoc_filters_b,
); );
}); });
test('should return the correct payload when formDataFromSliceWithAdhocFilter has no time range filters in mixed chart', () => {
const formDataFromSliceWithAdhocFilterB: QueryFormData = {
...formDataFromSlice,
adhoc_filters: [],
adhoc_filters_b: [],
};
const formDataWithAdhocFiltersWithExtra: QueryFormData = {
...formDataWithNativeFilters,
viz_type: 'mixed_timeseries',
adhoc_filters: [
{
clause: 'WHERE',
subject: 'year',
operator: 'TEMPORAL_RANGE',
comparator: 'No filter',
expressionType: 'SIMPLE',
isExtra: true,
},
],
adhoc_filters_b: [
{
clause: 'WHERE',
subject: 'year',
operator: 'TEMPORAL_RANGE',
comparator: 'No filter',
expressionType: 'SIMPLE',
isExtra: true,
},
],
};
const result = getSlicePayload(
sliceName,
formDataWithAdhocFiltersWithExtra,
dashboards,
owners as [],
formDataFromSliceWithAdhocFilterB,
);
const hasTemporalRange = (
JSON.parse(result.params as string).adhoc_filters_b || []
).some(
(filter: SimpleAdhocFilter) =>
filter.operator === Operators.TemporalRange,
);
expect(hasTemporalRange).toBe(true);
});
}); });

View File

@ -119,19 +119,24 @@ export const getSlicePayload = (
} }
if (!hasTemporalRangeFilter(adhocFilters)) { if (!hasTemporalRangeFilter(adhocFilters)) {
formDataWithNativeFilters.adhoc_filters?.forEach( const adhocFiltersKeys = Object.keys(formDataWithNativeFilters).filter(
(filter: SimpleAdhocFilter) => { key => ADHOC_FILTER_REGEX.test(key),
if (filter.operator === Operators.TemporalRange && filter.isExtra) {
if (!adhocFilters.adhoc_filters) {
adhocFilters.adhoc_filters = [];
}
adhocFilters.adhoc_filters.push({
...filter,
comparator: 'No filter',
});
}
},
); );
adhocFiltersKeys?.forEach(filtersKey => {
formDataWithNativeFilters[filtersKey]?.forEach(
(filter: SimpleAdhocFilter) => {
if (filter.operator === Operators.TemporalRange && filter.isExtra) {
if (!adhocFilters[filtersKey]) {
adhocFilters[filtersKey] = [];
}
adhocFilters[filtersKey].push({
...filter,
comparator: 'No filter',
});
}
},
);
});
} }
const formData = { const formData = {
...formDataWithNativeFilters, ...formDataWithNativeFilters,