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:
parent
6ede3271ff
commit
2c3ba95768
|
|
@ -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);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue