Skip to content

Commit 268c1dc

Browse files
authored
fix: Saving Mixed Chart with dashboard filter applied breaks adhoc_filter_b (#25877)
1 parent 887be5d commit 268c1dc

File tree

2 files changed

+66
-6
lines changed

2 files changed

+66
-6
lines changed

superset-frontend/src/explore/actions/saveModalActions.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export function saveSliceSuccess(data) {
5050
return { type: SAVE_SLICE_SUCCESS, data };
5151
}
5252

53-
const extractAddHocFiltersFromFormData = formDataToHandle =>
53+
const extractAdhocFiltersFromFormData = formDataToHandle =>
5454
Object.entries(formDataToHandle).reduce(
5555
(acc, [key, value]) =>
5656
ADHOC_FILTER_REGEX.test(key)
@@ -71,7 +71,7 @@ export const getSlicePayload = (
7171
owners,
7272
formDataFromSlice = {},
7373
) => {
74-
const adhocFilters = extractAddHocFiltersFromFormData(
74+
const adhocFilters = extractAdhocFiltersFromFormData(
7575
formDataWithNativeFilters,
7676
);
7777

@@ -80,10 +80,17 @@ export const getSlicePayload = (
8080
// to filter the chart. Before, any time range filter applied in the dashboard
8181
// would end up as an extra filter and when overwriting the chart the original
8282
// time range adhoc_filter was lost
83-
if (isEmpty(adhocFilters?.adhoc_filters) && !isEmpty(formDataFromSlice)) {
84-
formDataFromSlice?.adhoc_filters?.forEach(filter => {
85-
if (filter.operator === Operators.TEMPORAL_RANGE && !filter.isExtra) {
86-
adhocFilters.adhoc_filters.push({ ...filter, comparator: 'No filter' });
83+
if (!isEmpty(formDataFromSlice)) {
84+
Object.keys(adhocFilters || {}).forEach(adhocFilterKey => {
85+
if (isEmpty(adhocFilters[adhocFilterKey])) {
86+
formDataFromSlice?.[adhocFilterKey]?.forEach(filter => {
87+
if (filter.operator === Operators.TEMPORAL_RANGE && !filter.isExtra) {
88+
adhocFilters[adhocFilterKey].push({
89+
...filter,
90+
comparator: 'No filter',
91+
});
92+
}
93+
});
8794
}
8895
});
8996
}

superset-frontend/src/explore/actions/saveModalActions.test.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,4 +391,57 @@ describe('getSlicePayload', () => {
391391
formDataFromSlice.adhoc_filters,
392392
);
393393
});
394+
395+
test('should return the correct payload when formDataWithNativeFilters has a filter with isExtra set to true in mixed chart', () => {
396+
const formDataFromSliceWithAdhocFilterB = {
397+
...formDataFromSlice,
398+
adhoc_filters_b: [
399+
{
400+
clause: 'WHERE',
401+
subject: 'year',
402+
operator: 'TEMPORAL_RANGE',
403+
comparator: 'No filter',
404+
expressionType: 'SIMPLE',
405+
},
406+
],
407+
};
408+
const formDataWithAdhocFiltersWithExtra = {
409+
...formDataWithNativeFilters,
410+
viz_type: 'mixed_timeseries',
411+
adhoc_filters: [
412+
{
413+
clause: 'WHERE',
414+
subject: 'year',
415+
operator: 'TEMPORAL_RANGE',
416+
comparator: 'No filter',
417+
expressionType: 'SIMPLE',
418+
isExtra: true,
419+
},
420+
],
421+
adhoc_filters_b: [
422+
{
423+
clause: 'WHERE',
424+
subject: 'year',
425+
operator: 'TEMPORAL_RANGE',
426+
comparator: 'No filter',
427+
expressionType: 'SIMPLE',
428+
isExtra: true,
429+
},
430+
],
431+
};
432+
const result = getSlicePayload(
433+
sliceName,
434+
formDataWithAdhocFiltersWithExtra,
435+
dashboards,
436+
owners,
437+
formDataFromSliceWithAdhocFilterB,
438+
);
439+
440+
expect(JSON.parse(result.params).adhoc_filters).toEqual(
441+
formDataFromSliceWithAdhocFilterB.adhoc_filters,
442+
);
443+
expect(JSON.parse(result.params).adhoc_filters_b).toEqual(
444+
formDataFromSliceWithAdhocFilterB.adhoc_filters_b,
445+
);
446+
});
394447
});

0 commit comments

Comments
 (0)