1
1
// (C) 2021-2025 GoodData Corporation
2
2
3
- import { IDashboard , IDashboardDefinition , IAccessControlAware } from "@gooddata/sdk-model" ;
3
+ import {
4
+ IDashboard ,
5
+ IDashboardDefinition ,
6
+ IAccessControlAware ,
7
+ isDashboardAttributeFilter ,
8
+ } from "@gooddata/sdk-model" ;
4
9
import { BatchAction , batchActions } from "redux-batched-actions" ;
5
10
import { SagaIterator } from "redux-saga" ;
6
11
import { call , put , SagaReturnType , select } from "redux-saga/effects" ;
@@ -12,7 +17,10 @@ import {
12
17
import { SaveDashboardAs } from "../../commands/dashboard.js" ;
13
18
import { DashboardCopySaved , dashboardCopySaved } from "../../events/dashboard.js" ;
14
19
import { filterContextActions } from "../../store/filterContext/index.js" ;
15
- import { selectFilterContextDefinition } from "../../store/filterContext/filterContextSelectors.js" ;
20
+ import {
21
+ selectFilterContextDefinition ,
22
+ selectFilterContextAttributeFilters ,
23
+ } from "../../store/filterContext/filterContextSelectors.js" ;
16
24
import { layoutActions } from "../../store/layout/index.js" ;
17
25
import { selectBasicLayout } from "../../store/layout/layoutSelectors.js" ;
18
26
import { metaActions } from "../../store/meta/index.js" ;
@@ -25,7 +33,10 @@ import { DashboardContext } from "../../types/commonTypes.js";
25
33
import { PromiseFnReturnType } from "../../types/sagas.js" ;
26
34
import { selectDateFilterConfigOverrides } from "../../store/dateFilterConfig/dateFilterConfigSelectors.js" ;
27
35
import { savingActions } from "../../store/saving/index.js" ;
28
- import { selectSettings } from "../../store/config/configSelectors.js" ;
36
+ import {
37
+ selectSettings ,
38
+ selectEnableImmediateAttributeFilterDisplayAsLabelMigration ,
39
+ } from "../../store/config/configSelectors.js" ;
29
40
import { selectBackendCapabilities } from "../../store/backendCapabilities/backendCapabilitiesSelectors.js" ;
30
41
import { listedDashboardsActions } from "../../store/listedDashboards/index.js" ;
31
42
import { createListedDashboard } from "../../../_staging/listedDashboard/listedDashboardUtils.js" ;
@@ -36,6 +47,10 @@ import { changeRenderMode } from "../../commands/index.js";
36
47
import { selectIsInViewMode } from "../../store/renderMode/renderModeSelectors.js" ;
37
48
import { selectAttributeFilterConfigsOverrides } from "../../store/attributeFilterConfigs/attributeFilterConfigsSelectors.js" ;
38
49
import { selectDateFilterConfigsOverrides } from "../../store/dateFilterConfigs/dateFilterConfigsSelectors.js" ;
50
+ import {
51
+ getMigratedAttributeFilters ,
52
+ mergedMigratedAttributeFilters ,
53
+ } from "./common/migratedAttributeFilters.js" ;
39
54
40
55
type DashboardSaveAsContext = {
41
56
cmd : SaveDashboardAs ;
@@ -83,15 +98,33 @@ function* createDashboardSaveAsContext(cmd: SaveDashboardAs): SagaIterator<Dashb
83
98
selectDashboardDescriptor ,
84
99
) ;
85
100
86
- const originalDashboardDescription : ReturnType < typeof selectPersistedDashboard > = yield select (
101
+ const originalPersistedDashboard : ReturnType < typeof selectPersistedDashboard > = yield select (
87
102
selectPersistedDashboard ,
88
103
) ;
89
104
105
+ const isImmediateAttributeFilterMigrationEnabled : ReturnType <
106
+ typeof selectEnableImmediateAttributeFilterDisplayAsLabelMigration
107
+ > = yield select ( selectEnableImmediateAttributeFilterDisplayAsLabelMigration ) ;
108
+ const currentFilters : ReturnType < typeof selectFilterContextAttributeFilters > = yield select (
109
+ selectFilterContextAttributeFilters ,
110
+ ) ;
111
+ const migratedAttributeFilters = isImmediateAttributeFilterMigrationEnabled
112
+ ? getMigratedAttributeFilters (
113
+ originalPersistedDashboard ?. filterContext ?. filters . filter ( isDashboardAttributeFilter ) ,
114
+ currentFilters ,
115
+ )
116
+ : [ ] ;
90
117
const filterContextDefinition : ReturnType < typeof selectFilterContextDefinition > = yield select (
91
- ! useOriginalFilterContext || ! originalDashboardDescription
118
+ ! useOriginalFilterContext || ! originalPersistedDashboard
92
119
? selectFilterContextDefinition
93
120
: selectPersistedDashboardFilterContextAsFilterContextDefinition ,
94
121
) ;
122
+ // merge migrated filters only in view mode (useOriginalFilterContext), edit mode filter context is
123
+ // selected from state where it is already migrated
124
+ const migratedFilterContext =
125
+ isImmediateAttributeFilterMigrationEnabled && useOriginalFilterContext
126
+ ? mergedMigratedAttributeFilters ( filterContextDefinition , migratedAttributeFilters )
127
+ : filterContextDefinition ;
95
128
96
129
const layout : ReturnType < typeof selectBasicLayout > = yield select ( selectBasicLayout ) ;
97
130
const dateFilterConfig : ReturnType < typeof selectDateFilterConfigOverrides > = yield select (
@@ -115,7 +148,7 @@ function* createDashboardSaveAsContext(cmd: SaveDashboardAs): SagaIterator<Dashb
115
148
type : "IDashboard" ,
116
149
...dashboardDescriptorRest ,
117
150
filterContext : {
118
- ...filterContextDefinition ,
151
+ ...migratedFilterContext ,
119
152
} ,
120
153
layout,
121
154
dateFilterConfig,
0 commit comments