@gooddata/sdk-ui-dashboard 11.36.0-alpha.1 → 11.36.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +3 -3
- package/esm/__version.d.ts +1 -1
- package/esm/__version.js +1 -1
- package/esm/_staging/drills/drillingUtils.d.ts +9 -0
- package/esm/_staging/drills/drillingUtils.js +19 -1
- package/esm/index.d.ts +2 -2
- package/esm/index.js +1 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.js +9 -2
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.d.ts +12 -0
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.js +98 -0
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js +1 -0
- package/esm/model/commandHandlers/drill/common/mergeFilters.d.ts +3 -3
- package/esm/model/commandHandlers/drill/common/mergeFilters.js +26 -1
- package/esm/model/commandHandlers/drill/common/sourceDrillFilters.d.ts +2 -1
- package/esm/model/commandHandlers/drill/common/sourceDrillFilters.js +25 -5
- package/esm/model/commandHandlers/drill/drillToDashboardHandler.js +17 -16
- package/esm/model/commandHandlers/filterContext/changeFilterContextSelectionHandler.js +7 -4
- package/esm/model/commandHandlers/filterContext/measureValueFilter/removeMeasureValueFilterHandler.js +7 -0
- package/esm/model/commandHandlers/scheduledEmail/initializeAutomationsHandler.js +7 -1
- package/esm/model/react/useWidgetFilters.js +4 -1
- package/esm/model/store/catalog/catalogReducers.d.ts +5 -1
- package/esm/model/store/catalog/catalogReducers.js +4 -0
- package/esm/model/store/catalog/catalogSelectors.d.ts +15 -2
- package/esm/model/store/catalog/catalogSelectors.js +13 -0
- package/esm/model/store/catalog/catalogState.d.ts +20 -1
- package/esm/model/store/catalog/catalogState.js +1 -0
- package/esm/model/store/catalog/index.d.ts +1 -0
- package/esm/model/store/tabs/index.d.ts +6 -0
- package/esm/model/store/tabs/layout/layoutReducers.d.ts +4 -0
- package/esm/model/store/tabs/layout/layoutReducers.js +25 -0
- package/esm/model/store/tabs/parameters/parametersSelectors.d.ts +19 -6
- package/esm/model/store/tabs/parameters/parametersSelectors.js +69 -16
- package/esm/presentation/filterBar/parameterFilter/DashboardParameterFilter.js +3 -2
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +8 -0
- package/esm/presentation/localization/bundles/en-US.localization-bundle.js +8 -0
- package/esm/presentation/widget/common/configuration/FilterConfiguration.js +4 -2
- package/esm/presentation/widget/common/configuration/useMeasureValueFilterCompatibility.d.ts +6 -2
- package/esm/presentation/widget/common/configuration/useMeasureValueFilterCompatibility.js +95 -22
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useExcludedDrillDefinitionFilters.js +2 -2
- package/esm/presentation/widget/insight/configuration/DrillFilters/TargetDashboardFiltersContext.d.ts +2 -1
- package/esm/presentation/widget/insight/configuration/DrillFilters/TargetDashboardFiltersContext.js +3 -1
- package/esm/presentation/widget/insight/configuration/DrillFilters/drillFiltersConfigUtils.d.ts +4 -1
- package/esm/presentation/widget/insight/configuration/DrillFilters/drillFiltersConfigUtils.js +15 -1
- package/esm/presentation/widget/insight/configuration/DrillFilters/messages.d.ts +6 -0
- package/esm/presentation/widget/insight/configuration/DrillFilters/messages.js +6 -0
- package/esm/presentation/widget/insight/configuration/DrillFilters/optionMappings/mapDashboardFilterToOption.d.ts +6 -2
- package/esm/presentation/widget/insight/configuration/DrillFilters/optionMappings/mapDashboardFilterToOption.js +18 -3
- package/esm/presentation/widget/insight/configuration/DrillFilters/optionMappings/mapSourceInsightFilterToOption.d.ts +4 -2
- package/esm/presentation/widget/insight/configuration/DrillFilters/optionMappings/mapSourceInsightFilterToOption.js +10 -6
- package/esm/presentation/widget/insight/configuration/DrillFilters/types.d.ts +2 -1
- package/esm/presentation/widget/insight/configuration/DrillFilters/useDrillFiltersConfig.js +78 -6
- package/esm/presentation/widget/insight/configuration/DrillFilters/useFetchTargetDashboardFilters.d.ts +2 -1
- package/esm/presentation/widget/insight/configuration/DrillFilters/useFetchTargetDashboardFilters.js +4 -1
- package/esm/sdk-ui-dashboard.d.ts +53 -6
- package/package.json +20 -20
package/esm/presentation/widget/insight/configuration/DrillFilters/TargetDashboardFiltersContext.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
// (C) 2020-2026 GoodData Corporation
|
|
3
3
|
import { createContext, useCallback, useContext, useMemo, useRef, useState } from "react";
|
|
4
|
-
import { isDashboardAttributeFilter, isDashboardTextAttributeFilter, } from "@gooddata/sdk-model";
|
|
4
|
+
import { isDashboardAttributeFilter, isDashboardMeasureValueFilter, isDashboardTextAttributeFilter, } from "@gooddata/sdk-model";
|
|
5
5
|
import { useBackendStrict, useWorkspaceStrict } from "@gooddata/sdk-ui";
|
|
6
6
|
import { dashboardFilterContextDefinition } from "../../../../../_staging/dashboard/dashboardFilterContext.js";
|
|
7
7
|
import { defaultDateFilterConfig } from "../../../../../_staging/dateFilterConfig/defaultConfig.js";
|
|
@@ -24,6 +24,7 @@ function getTargetDashboardFilterData(dashboard, targetTabLocalIdentifier) {
|
|
|
24
24
|
targetDashboardFilters,
|
|
25
25
|
targetDashboardAttributeFilters: targetDashboardFilters.filter(isDashboardAttributeFilter),
|
|
26
26
|
targetDashboardTextAttributeFilters: targetDashboardFilters.filter(isDashboardTextAttributeFilter),
|
|
27
|
+
targetDashboardMeasureValueFilters: targetDashboardFilters.filter(isDashboardMeasureValueFilter),
|
|
27
28
|
targetDashboardAttributeFilterConfigs: targetDashboard.attributeFilterConfigs ?? [],
|
|
28
29
|
};
|
|
29
30
|
}
|
|
@@ -33,6 +34,7 @@ function createEmptyCacheEntry(status) {
|
|
|
33
34
|
targetDashboardFilters: [],
|
|
34
35
|
targetDashboardAttributeFilters: [],
|
|
35
36
|
targetDashboardTextAttributeFilters: [],
|
|
37
|
+
targetDashboardMeasureValueFilters: [],
|
|
36
38
|
targetDashboardAttributeFilterConfigs: [],
|
|
37
39
|
};
|
|
38
40
|
}
|
package/esm/presentation/widget/insight/configuration/DrillFilters/drillFiltersConfigUtils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type IntlShape } from "react-intl";
|
|
2
|
-
import { type DashboardTextAttributeFilter, type FilterContextItem, type IAttributeDisplayFormMetadataObject, type ICatalogMeasure, type IDashboardAttributeFilter, type IDashboardAttributeFilterConfig, type IDashboardDateFilterConfigItem, type IMeasure, type ObjRef, type ObjRefInScope, type SourceInsightFilterObjRef } from "@gooddata/sdk-model";
|
|
2
|
+
import { type DashboardTextAttributeFilter, type FilterContextItem, type IAttributeDisplayFormMetadataObject, type ICatalogMeasure, type IDashboardAttributeFilter, type IDashboardAttributeFilterConfig, type IDashboardDateFilterConfigItem, type IDashboardMeasureValueFilter, type IMeasure, type ObjRef, type ObjRefInScope, type SourceInsightFilterObjRef } from "@gooddata/sdk-model";
|
|
3
3
|
import { type ObjRefMap } from "../../../../../_staging/metadata/objRefMap.js";
|
|
4
4
|
import { type IDrillFiltersConfigOption } from "./types.js";
|
|
5
5
|
export declare function getMeasureTitleFromSourceInsightMeasures(sourceInsightMeasures: IMeasure[], measureRef: ObjRefInScope | undefined, allCatalogMeasures: ICatalogMeasure[], intl: IntlShape): string | undefined;
|
|
@@ -23,9 +23,12 @@ export declare function getDashboardDateFilterCustomTitle({ datasetRef, allDateF
|
|
|
23
23
|
datasetRef: ObjRefInScope;
|
|
24
24
|
allDateFilterConfigsOverrides: IDashboardDateFilterConfigItem[];
|
|
25
25
|
}): string | undefined;
|
|
26
|
+
export declare function getCatalogMeasureTitle(measureRef: ObjRef, allCatalogMeasures: ICatalogMeasure[]): string;
|
|
26
27
|
export declare function hasMatchingTargetDashboardAttributeFilterDisplayForm(displayFormRef: ObjRef, targetDashboardAttributeFilters: IDashboardAttributeFilter[]): boolean;
|
|
27
28
|
export declare function hasMatchingTargetDashboardAttributeFilter(dashboardFilter: IDashboardAttributeFilter, sourceDashboardAttributeFilterConfigs: IDashboardAttributeFilterConfig[], targetDashboardAttributeFilters: IDashboardAttributeFilter[], targetDashboardAttributeFilterConfigs: IDashboardAttributeFilterConfig[], allCatalogDisplayFormsMap: ObjRefMap<IAttributeDisplayFormMetadataObject>): boolean;
|
|
28
29
|
export declare function hasMatchingTargetDashboardDateFilter(datasetRef: ObjRef, targetDashboardFilters: FilterContextItem[]): boolean;
|
|
30
|
+
export declare function hasMatchingTargetDashboardMeasureValueFilter(measureRef: ObjRefInScope | undefined, targetDashboardFilters: FilterContextItem[]): boolean;
|
|
31
|
+
export declare function hasCompatibleTargetInsightMeasureValueFilter(measureRef: ObjRef, targetInsightCompatibleMeasureValueFilters: IDashboardMeasureValueFilter[]): boolean;
|
|
29
32
|
export declare function isDateIntersectionAttribute(displayFormRef: ObjRef, allCatalogDateAttributeDisplayForms: Array<{
|
|
30
33
|
ref: ObjRef;
|
|
31
34
|
title?: string;
|
package/esm/presentation/widget/insight/configuration/DrillFilters/drillFiltersConfigUtils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// (C) 2020-2026 GoodData Corporation
|
|
2
|
-
import { areObjRefsEqual, dashboardAttributeFilterItemDisplayForm, dashboardAttributeFilterItemLocalIdentifier, isDashboardDateFilterWithDimension, isLocalIdRef, measureAlias, measureFilters, measureLocalId, measureTitle, serializeObjRef, } from "@gooddata/sdk-model";
|
|
2
|
+
import { areObjRefsEqual, dashboardAttributeFilterItemDisplayForm, dashboardAttributeFilterItemLocalIdentifier, isDashboardDateFilterWithDimension, isDashboardMeasureValueFilter, isLocalIdRef, measureAlias, measureFilters, measureLocalId, measureTitle, serializeObjRef, } from "@gooddata/sdk-model";
|
|
3
3
|
import { buildMeasureTitles } from "@gooddata/sdk-ui/internal";
|
|
4
4
|
import { sourceInsightFilterObjRefValue } from "../../../../../_staging/drills/drillingUtils.js";
|
|
5
5
|
import { canApplyFilterTypeToTarget } from "../../../../../model/commandHandlers/dashboard/common/attributeFilterSelectionTypeCompatibility.js";
|
|
@@ -81,6 +81,10 @@ export function getDashboardDateFilterCustomTitle({ datasetRef, allDateFilterCon
|
|
|
81
81
|
const customTitle = allDateFilterConfigsOverrides.find((configOverride) => areObjRefsEqual(configOverride.dateDataSet, datasetRef))?.config.filterName;
|
|
82
82
|
return customTitle || undefined;
|
|
83
83
|
}
|
|
84
|
+
export function getCatalogMeasureTitle(measureRef, allCatalogMeasures) {
|
|
85
|
+
return (allCatalogMeasures.find((measure) => areObjRefsEqual(measure.measure.ref, measureRef))?.measure
|
|
86
|
+
.title ?? "");
|
|
87
|
+
}
|
|
84
88
|
export function hasMatchingTargetDashboardAttributeFilterDisplayForm(displayFormRef, targetDashboardAttributeFilters) {
|
|
85
89
|
return !!findDashboardAttributeFilterByDisplayForm(targetDashboardAttributeFilters, displayFormRef);
|
|
86
90
|
}
|
|
@@ -105,6 +109,16 @@ export function hasMatchingTargetDashboardDateFilter(datasetRef, targetDashboard
|
|
|
105
109
|
return targetDashboardFilters.some((targetDashboardFilter) => isDashboardDateFilterWithDimension(targetDashboardFilter) &&
|
|
106
110
|
areObjRefsEqual(datasetRef, targetDashboardFilter.dateFilter.dataSet));
|
|
107
111
|
}
|
|
112
|
+
export function hasMatchingTargetDashboardMeasureValueFilter(measureRef, targetDashboardFilters) {
|
|
113
|
+
if (!measureRef) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
return targetDashboardFilters.some((targetDashboardFilter) => isDashboardMeasureValueFilter(targetDashboardFilter) &&
|
|
117
|
+
areObjRefsEqual(measureRef, targetDashboardFilter.dashboardMeasureValueFilter.measure));
|
|
118
|
+
}
|
|
119
|
+
export function hasCompatibleTargetInsightMeasureValueFilter(measureRef, targetInsightCompatibleMeasureValueFilters) {
|
|
120
|
+
return targetInsightCompatibleMeasureValueFilters.some((targetMeasureValueFilter) => areObjRefsEqual(measureRef, targetMeasureValueFilter.dashboardMeasureValueFilter.measure));
|
|
121
|
+
}
|
|
108
122
|
export function isDateIntersectionAttribute(displayFormRef, allCatalogDateAttributeDisplayForms) {
|
|
109
123
|
return allCatalogDateAttributeDisplayForms.some((displayForm) => areObjRefsEqual(displayForm.ref, displayFormRef));
|
|
110
124
|
}
|
|
@@ -41,6 +41,12 @@ export declare const messages: {
|
|
|
41
41
|
drillToDashboardMetricFilterTooltip: {
|
|
42
42
|
id: string;
|
|
43
43
|
};
|
|
44
|
+
drillToDashboardDuplicateMetricFilterTooltip: {
|
|
45
|
+
id: string;
|
|
46
|
+
};
|
|
47
|
+
drillToInsightMeasureValueFilterTooltip: {
|
|
48
|
+
id: string;
|
|
49
|
+
};
|
|
44
50
|
drillToDashboardRankingFilterTooltip: {
|
|
45
51
|
id: string;
|
|
46
52
|
};
|
|
@@ -43,6 +43,12 @@ export const messages = defineMessages({
|
|
|
43
43
|
drillToDashboardMetricFilterTooltip: {
|
|
44
44
|
id: "configurationPanel.drillConfig.filterSelection.drillToDashboardMetricFilter.tooltip",
|
|
45
45
|
},
|
|
46
|
+
drillToDashboardDuplicateMetricFilterTooltip: {
|
|
47
|
+
id: "configurationPanel.drillConfig.filterSelection.drillToDashboardDuplicateMetricFilter.tooltip",
|
|
48
|
+
},
|
|
49
|
+
drillToInsightMeasureValueFilterTooltip: {
|
|
50
|
+
id: "configurationPanel.drillConfig.filterSelection.drillToInsightMeasureValueFilter.tooltip",
|
|
51
|
+
},
|
|
46
52
|
drillToDashboardRankingFilterTooltip: {
|
|
47
53
|
id: "configurationPanel.drillConfig.filterSelection.drillToDashboardRankingFilter.tooltip",
|
|
48
54
|
},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { type IntlShape } from "react-intl";
|
|
2
|
-
import { type DashboardTextAttributeFilter, type FilterContextItem, type IAttributeDisplayFormMetadataObject, type IDashboardAttributeFilter, type IDashboardAttributeFilterConfig, type IDashboardDateFilterConfig, type IDashboardDateFilterConfigItem, type ObjRef } from "@gooddata/sdk-model";
|
|
2
|
+
import { type DashboardTextAttributeFilter, type FilterContextItem, type IAttributeDisplayFormMetadataObject, type ICatalogMeasure, type IDashboardAttributeFilter, type IDashboardAttributeFilterConfig, type IDashboardDateFilterConfig, type IDashboardDateFilterConfigItem, type IDashboardMeasureValueFilter, type ObjRef } from "@gooddata/sdk-model";
|
|
3
3
|
import { type ObjRefMap } from "../../../../../../_staging/metadata/objRefMap.js";
|
|
4
4
|
import { type IDrillFiltersConfigOption } from "../types.js";
|
|
5
5
|
interface IMapDashboardFilterToOptionParams {
|
|
6
6
|
dashboardFilter: FilterContextItem;
|
|
7
7
|
allCatalogDisplayFormsMap: ObjRefMap<IAttributeDisplayFormMetadataObject>;
|
|
8
|
+
allCatalogMeasures: ICatalogMeasure[];
|
|
8
9
|
allCatalogDateDatasets: Array<{
|
|
9
10
|
dataSet: {
|
|
10
11
|
ref: ObjRef;
|
|
@@ -17,10 +18,13 @@ interface IMapDashboardFilterToOptionParams {
|
|
|
17
18
|
targetDashboardFilters: FilterContextItem[];
|
|
18
19
|
targetDashboardAttributeFilters: IDashboardAttributeFilter[];
|
|
19
20
|
targetDashboardTextAttributeFilters: DashboardTextAttributeFilter[];
|
|
21
|
+
targetDashboardMeasureValueFilters: IDashboardMeasureValueFilter[];
|
|
22
|
+
targetInsightCompatibleMeasureValueFilters: IDashboardMeasureValueFilter[];
|
|
20
23
|
targetDashboardAttributeFilterConfigs: IDashboardAttributeFilterConfig[];
|
|
21
24
|
isDrillDown: boolean;
|
|
25
|
+
isDrillToInsight: boolean;
|
|
22
26
|
isDrillToDashboard: boolean;
|
|
23
27
|
intl: IntlShape;
|
|
24
28
|
}
|
|
25
|
-
export declare function mapDashboardFilterToOption({ dashboardFilter, allCatalogDisplayFormsMap, allCatalogDateDatasets, dateFilterConfigOverride, allDateFilterConfigsOverrides, sourceDashboardAttributeFilterConfigs, targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardAttributeFilterConfigs, isDrillDown, isDrillToDashboard, intl }: IMapDashboardFilterToOptionParams): IDrillFiltersConfigOption | undefined;
|
|
29
|
+
export declare function mapDashboardFilterToOption({ dashboardFilter, allCatalogDisplayFormsMap, allCatalogMeasures, allCatalogDateDatasets, dateFilterConfigOverride, allDateFilterConfigsOverrides, sourceDashboardAttributeFilterConfigs, targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardMeasureValueFilters, targetInsightCompatibleMeasureValueFilters, targetDashboardAttributeFilterConfigs, isDrillDown, isDrillToInsight, isDrillToDashboard, intl }: IMapDashboardFilterToOptionParams): IDrillFiltersConfigOption | undefined;
|
|
26
30
|
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// (C) 2020-2026 GoodData Corporation
|
|
2
|
-
import { dashboardAttributeFilterItemDisplayForm, dashboardAttributeFilterItemLocalIdentifier, dashboardAttributeFilterItemTitle, isDashboardAttributeFilter, isDashboardAttributeFilterItem, isDashboardDateFilter, } from "@gooddata/sdk-model";
|
|
3
|
-
import { canTransferDashboardAttributeFilter, canTransferTextAttributeFilter, getDashboardDateFilterCustomTitle, getDateDatasetTitle, getDisabledOptionProps, getDisabledOptionPropsForTransferResult, getDisplayFormTitle, hasMatchingTargetDashboardDateFilter, } from "../drillFiltersConfigUtils.js";
|
|
2
|
+
import { dashboardAttributeFilterItemDisplayForm, dashboardAttributeFilterItemLocalIdentifier, dashboardAttributeFilterItemTitle, dashboardFilterObjRef, dashboardMeasureValueFilterLocalIdentifier, isDashboardAttributeFilter, isDashboardAttributeFilterItem, isDashboardDateFilter, isDashboardMeasureValueFilter, } from "@gooddata/sdk-model";
|
|
3
|
+
import { canTransferDashboardAttributeFilter, canTransferTextAttributeFilter, getCatalogMeasureTitle, getDashboardDateFilterCustomTitle, getDateDatasetTitle, getDisabledOptionProps, getDisabledOptionPropsForTransferResult, getDisplayFormTitle, hasCompatibleTargetInsightMeasureValueFilter, hasMatchingTargetDashboardDateFilter, hasMatchingTargetDashboardMeasureValueFilter, } from "../drillFiltersConfigUtils.js";
|
|
4
4
|
import { messages } from "../messages.js";
|
|
5
|
-
export function mapDashboardFilterToOption({ dashboardFilter, allCatalogDisplayFormsMap, allCatalogDateDatasets, dateFilterConfigOverride, allDateFilterConfigsOverrides, sourceDashboardAttributeFilterConfigs, targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardAttributeFilterConfigs, isDrillDown, isDrillToDashboard, intl, }) {
|
|
5
|
+
export function mapDashboardFilterToOption({ dashboardFilter, allCatalogDisplayFormsMap, allCatalogMeasures, allCatalogDateDatasets, dateFilterConfigOverride, allDateFilterConfigsOverrides, sourceDashboardAttributeFilterConfigs, targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardMeasureValueFilters, targetInsightCompatibleMeasureValueFilters, targetDashboardAttributeFilterConfigs, isDrillDown, isDrillToInsight, isDrillToDashboard, intl, }) {
|
|
6
6
|
const disabled = getDisabledOptionProps(isDrillDown, intl.formatMessage(messages.drillDownDashboardFilterTooltip), true);
|
|
7
7
|
if (isDashboardAttributeFilterItem(dashboardFilter)) {
|
|
8
8
|
const displayFormRef = dashboardAttributeFilterItemDisplayForm(dashboardFilter);
|
|
@@ -60,5 +60,20 @@ export function mapDashboardFilterToOption({ dashboardFilter, allCatalogDisplayF
|
|
|
60
60
|
...getDisabledOptionProps(isDrillToDashboard && !hasMatchingTargetDateFilter, intl.formatMessage(messages.drillToDashboardDashboardFilterTooltip), false),
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
|
+
if (isDashboardMeasureValueFilter(dashboardFilter)) {
|
|
64
|
+
const measure = dashboardFilterObjRef(dashboardFilter);
|
|
65
|
+
const localIdentifier = dashboardMeasureValueFilterLocalIdentifier(dashboardFilter);
|
|
66
|
+
const title = dashboardFilter.dashboardMeasureValueFilter.title;
|
|
67
|
+
const hasMatchingTargetMeasureValueFilter = hasMatchingTargetDashboardMeasureValueFilter(measure, targetDashboardMeasureValueFilters);
|
|
68
|
+
const compatible = hasCompatibleTargetInsightMeasureValueFilter(measure, targetInsightCompatibleMeasureValueFilters);
|
|
69
|
+
return {
|
|
70
|
+
id: localIdentifier,
|
|
71
|
+
title: title ?? getCatalogMeasureTitle(measure, allCatalogMeasures),
|
|
72
|
+
metricFilterMeasureRef: measure,
|
|
73
|
+
...disabled,
|
|
74
|
+
...getDisabledOptionProps(isDrillToDashboard && !hasMatchingTargetMeasureValueFilter, intl.formatMessage(messages.drillToDashboardDashboardFilterTooltip), false),
|
|
75
|
+
...getDisabledOptionProps(isDrillToInsight && !compatible, intl.formatMessage(messages.drillToInsightMeasureValueFilterTooltip), false),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
63
78
|
return undefined;
|
|
64
79
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type IntlShape } from "react-intl";
|
|
2
|
-
import { type DashboardTextAttributeFilter, type FilterContextItem, type IAttributeDisplayFormMetadataObject, type ICatalogMeasure, type IDashboardAttributeFilter, type IDashboardAttributeFilterConfig, type IFilter, type IMeasure, type ObjRef } from "@gooddata/sdk-model";
|
|
2
|
+
import { type DashboardTextAttributeFilter, type FilterContextItem, type IAttributeDisplayFormMetadataObject, type ICatalogMeasure, type IDashboardAttributeFilter, type IDashboardAttributeFilterConfig, type IDashboardMeasureValueFilter, type IFilter, type IMeasure, type ObjRef } from "@gooddata/sdk-model";
|
|
3
3
|
import { type ObjRefMap } from "../../../../../../_staging/metadata/objRefMap.js";
|
|
4
4
|
import { type IDrillFiltersConfigOption } from "../types.js";
|
|
5
5
|
interface IMapSourceInsightFilterToOptionParams {
|
|
@@ -16,10 +16,12 @@ interface IMapSourceInsightFilterToOptionParams {
|
|
|
16
16
|
targetDashboardFilters: FilterContextItem[];
|
|
17
17
|
targetDashboardAttributeFilters: IDashboardAttributeFilter[];
|
|
18
18
|
targetDashboardTextAttributeFilters: DashboardTextAttributeFilter[];
|
|
19
|
+
targetDashboardMeasureValueFilters: IDashboardMeasureValueFilter[];
|
|
19
20
|
targetDashboardAttributeFilterConfigs: IDashboardAttributeFilterConfig[];
|
|
20
21
|
isDrillDown: boolean;
|
|
21
22
|
isDrillToDashboard: boolean;
|
|
23
|
+
enableMeasureValueFilter: boolean;
|
|
22
24
|
intl: IntlShape;
|
|
23
25
|
}
|
|
24
|
-
export declare function mapSourceInsightFilterToOption({ sourceInsightFilter, allCatalogDisplayFormsMap, allCatalogDateDatasets, sourceInsightMeasures, allCatalogMeasures, targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardAttributeFilterConfigs, isDrillDown, isDrillToDashboard, intl }: IMapSourceInsightFilterToOptionParams): IDrillFiltersConfigOption | undefined;
|
|
26
|
+
export declare function mapSourceInsightFilterToOption({ sourceInsightFilter, allCatalogDisplayFormsMap, allCatalogDateDatasets, sourceInsightMeasures, allCatalogMeasures, targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardMeasureValueFilters, targetDashboardAttributeFilterConfigs, isDrillDown, isDrillToDashboard, enableMeasureValueFilter, intl }: IMapSourceInsightFilterToOptionParams): IDrillFiltersConfigOption | undefined;
|
|
25
27
|
export {};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// (C) 2020-2026 GoodData Corporation
|
|
2
2
|
import { isArbitraryAttributeFilter, isLocalIdRef, isMatchAttributeFilter, isRankingFilter, } from "@gooddata/sdk-model";
|
|
3
|
-
import { sourceInsightFilterObjRef as getSourceInsightFilterObjRef } from "../../../../../../_staging/drills/drillingUtils.js";
|
|
4
|
-
import { canTransferAttributeFilterByDisplayForm, getDateDatasetTitle, getDisabledOptionProps, getDisabledOptionPropsForTransferResult, getDisplayFormTitle, getMeasureTitleFromSourceInsightMeasures, hasMatchingTargetDashboardDateFilter, sourceFilterOptionId, } from "../drillFiltersConfigUtils.js";
|
|
3
|
+
import { sourceInsightFilterObjRef as getSourceInsightFilterObjRef, resolveSourceMeasureRef, } from "../../../../../../_staging/drills/drillingUtils.js";
|
|
4
|
+
import { canTransferAttributeFilterByDisplayForm, getDateDatasetTitle, getDisabledOptionProps, getDisabledOptionPropsForTransferResult, getDisplayFormTitle, getMeasureTitleFromSourceInsightMeasures, hasMatchingTargetDashboardDateFilter, hasMatchingTargetDashboardMeasureValueFilter, sourceFilterOptionId, } from "../drillFiltersConfigUtils.js";
|
|
5
5
|
import { messages } from "../messages.js";
|
|
6
|
-
export function mapSourceInsightFilterToOption({ sourceInsightFilter, allCatalogDisplayFormsMap, allCatalogDateDatasets, sourceInsightMeasures, allCatalogMeasures, targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardAttributeFilterConfigs, isDrillDown, isDrillToDashboard, intl, }) {
|
|
6
|
+
export function mapSourceInsightFilterToOption({ sourceInsightFilter, allCatalogDisplayFormsMap, allCatalogDateDatasets, sourceInsightMeasures, allCatalogMeasures, targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardMeasureValueFilters, targetDashboardAttributeFilterConfigs, isDrillDown, isDrillToDashboard, enableMeasureValueFilter, intl, }) {
|
|
7
7
|
const sourceFilterObjRef = getSourceInsightFilterObjRef(sourceInsightFilter);
|
|
8
8
|
if (!sourceFilterObjRef) {
|
|
9
9
|
return undefined;
|
|
@@ -51,13 +51,17 @@ export function mapSourceInsightFilterToOption({ sourceInsightFilter, allCatalog
|
|
|
51
51
|
}
|
|
52
52
|
if (sourceFilterObjRef.type === "measureValueFilter") {
|
|
53
53
|
const measureRef = sourceFilterObjRef.measure;
|
|
54
|
+
const dashboardMeasureRef = resolveSourceMeasureRef(measureRef, sourceInsightMeasures);
|
|
55
|
+
const hasMatchingTargetMeasureValueFilter = hasMatchingTargetDashboardMeasureValueFilter(dashboardMeasureRef, targetDashboardMeasureValueFilters);
|
|
54
56
|
const measureTitleFromInsight = getMeasureTitleFromSourceInsightMeasures(sourceInsightMeasures, measureRef, allCatalogMeasures, intl);
|
|
55
57
|
return {
|
|
56
58
|
id: sourceFilterOptionId(sourceFilterObjRef),
|
|
57
59
|
title: measureTitleFromInsight ?? "",
|
|
58
|
-
...(
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
...(dashboardMeasureRef ? { metricFilterMeasureRef: dashboardMeasureRef } : {}),
|
|
61
|
+
...disabled,
|
|
62
|
+
...getDisabledOptionProps(isDrillToDashboard && (!enableMeasureValueFilter || !hasMatchingTargetMeasureValueFilter), intl.formatMessage(enableMeasureValueFilter
|
|
63
|
+
? messages.drillToDashboardDashboardFilterTooltip
|
|
64
|
+
: messages.drillToDashboardMetricFilterTooltip), false),
|
|
61
65
|
sourceInsightFilterObjRef: sourceFilterObjRef,
|
|
62
66
|
};
|
|
63
67
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type SourceInsightFilterObjRef, type SourceMeasureFilterObjRef } from "@gooddata/sdk-model";
|
|
1
|
+
import { type ObjRefInScope, type SourceInsightFilterObjRef, type SourceMeasureFilterObjRef } from "@gooddata/sdk-model";
|
|
2
2
|
export interface IDrillFiltersConfigOptionDisabled {
|
|
3
3
|
message: string;
|
|
4
4
|
selected: boolean;
|
|
@@ -9,5 +9,6 @@ export interface IDrillFiltersConfigOption {
|
|
|
9
9
|
disabled?: IDrillFiltersConfigOptionDisabled;
|
|
10
10
|
sourceInsightFilterObjRef?: SourceInsightFilterObjRef;
|
|
11
11
|
sourceMeasureFilterObjRef?: SourceMeasureFilterObjRef;
|
|
12
|
+
metricFilterMeasureRef?: ObjRefInScope;
|
|
12
13
|
}
|
|
13
14
|
export declare function isDrillFiltersConfigOptionSelected(option: IDrillFiltersConfigOption, selectedIds: string[]): boolean;
|
|
@@ -2,32 +2,40 @@
|
|
|
2
2
|
import { useCallback, useMemo } from "react";
|
|
3
3
|
import { isEqual } from "lodash-es";
|
|
4
4
|
import { useIntl } from "react-intl";
|
|
5
|
-
import { bucketsAttributes, insightBuckets, insightFilters, insightMeasures, measureFilters, measureLocalId, } from "@gooddata/sdk-model";
|
|
5
|
+
import { areObjRefsEqual, bucketsAttributes, insightBuckets, insightFilters, insightMeasures, isDashboardMeasureValueFilter, measureFilters, measureLocalId, } from "@gooddata/sdk-model";
|
|
6
|
+
import { isSourceInsightFilterObjRefEqual } from "../../../../../_staging/drills/drillingUtils.js";
|
|
6
7
|
import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
|
|
7
8
|
import { selectAllCatalogDisplayFormsMap, selectCatalogDateDatasets, selectCatalogMeasures, } from "../../../../../model/store/catalog/catalogSelectors.js";
|
|
8
|
-
import {
|
|
9
|
+
import { selectEnableMeasureValueFilterKD } from "../../../../../model/store/config/configSelectors.js";
|
|
10
|
+
import { selectInsightByRef, selectInsightByWidgetRef, } from "../../../../../model/store/insights/insightsSelectors.js";
|
|
9
11
|
import { selectAttributeFilterConfigsOverrides } from "../../../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
|
|
10
12
|
import { selectDateFilterConfigOverrides } from "../../../../../model/store/tabs/dateFilterConfig/dateFilterConfigSelectors.js";
|
|
11
13
|
import { selectDateFilterConfigsOverrides } from "../../../../../model/store/tabs/dateFilterConfigs/dateFilterConfigsSelectors.js";
|
|
12
14
|
import { selectFilterContextFilters } from "../../../../../model/store/tabs/filterContext/filterContextSelectors.js";
|
|
13
15
|
import { selectWidgetDrills } from "../../../../../model/store/tabs/layout/layoutSelectors.js";
|
|
14
16
|
import { DRILL_TARGET_TYPE, isDrillToInsightConfig, } from "../../../../drill/types.js";
|
|
17
|
+
import { useMeasureValueFilterCompatibility } from "../../../common/configuration/useMeasureValueFilterCompatibility.js";
|
|
18
|
+
import { messages } from "./messages.js";
|
|
15
19
|
import { mapDashboardFilterToOption } from "./optionMappings/mapDashboardFilterToOption.js";
|
|
16
20
|
import { mapIntersectionAttributeToOption } from "./optionMappings/mapIntersectionAttributeToOption.js";
|
|
17
21
|
import { mapSourceInsightFilterToOption } from "./optionMappings/mapSourceInsightFilterToOption.js";
|
|
18
22
|
import { mapSourceMeasureFilterToOption } from "./optionMappings/mapSourceMeasureFilterToOption.js";
|
|
23
|
+
import { isDrillFiltersConfigOptionSelected } from "./types.js";
|
|
19
24
|
import { useFetchTargetDashboardFilters } from "./useFetchTargetDashboardFilters.js";
|
|
20
25
|
export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
21
26
|
const intl = useIntl();
|
|
22
27
|
const isDrillToDashboard = item.drillTargetType === DRILL_TARGET_TYPE.DRILL_TO_DASHBOARD;
|
|
28
|
+
const isDrillToInsight = item.drillTargetType === DRILL_TARGET_TYPE.DRILL_TO_INSIGHT;
|
|
29
|
+
const isDrillDown = item.drillTargetType === DRILL_TARGET_TYPE.DRILL_DOWN;
|
|
23
30
|
const supportsExtendedFiltersConfig = item.drillTargetType === DRILL_TARGET_TYPE.DRILL_TO_INSIGHT ||
|
|
24
31
|
item.drillTargetType === DRILL_TARGET_TYPE.DRILL_TO_DASHBOARD;
|
|
25
|
-
const isDrillDown = item.drillTargetType === DRILL_TARGET_TYPE.DRILL_DOWN;
|
|
26
32
|
const extendedDrillFiltersItem = isDrillToInsightConfig(item) || item.drillTargetType === DRILL_TARGET_TYPE.DRILL_TO_DASHBOARD
|
|
27
33
|
? item
|
|
28
34
|
: undefined;
|
|
29
35
|
const insight = useDashboardSelector(selectInsightByWidgetRef(item.widgetRef));
|
|
36
|
+
const targetInsight = useDashboardSelector(selectInsightByRef(isDrillToInsight ? item.insightRef : undefined));
|
|
30
37
|
const widgetDrills = useDashboardSelector(selectWidgetDrills(item.widgetRef));
|
|
38
|
+
const enableMeasureValueFilter = useDashboardSelector(selectEnableMeasureValueFilterKD);
|
|
31
39
|
const sourceDashboardFilters = useDashboardSelector(selectFilterContextFilters);
|
|
32
40
|
const sourceDashboardAttributeFilterConfigs = useDashboardSelector(selectAttributeFilterConfigsOverrides);
|
|
33
41
|
const allCatalogDisplayFormsMap = useDashboardSelector(selectAllCatalogDisplayFormsMap);
|
|
@@ -35,13 +43,15 @@ export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
|
35
43
|
const dateFilterConfigOverride = useDashboardSelector(selectDateFilterConfigOverrides);
|
|
36
44
|
const allCatalogMeasures = useDashboardSelector(selectCatalogMeasures);
|
|
37
45
|
const allDateFilterConfigsOverrides = useDashboardSelector(selectDateFilterConfigsOverrides);
|
|
38
|
-
const { targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardAttributeFilterConfigs, isLoading, } = useFetchTargetDashboardFilters(item);
|
|
46
|
+
const { targetDashboardFilters, targetDashboardAttributeFilters, targetDashboardTextAttributeFilters, targetDashboardAttributeFilterConfigs, targetDashboardMeasureValueFilters, isLoading, } = useFetchTargetDashboardFilters(item);
|
|
39
47
|
const sourceInsightAttributes = useMemo(() => bucketsAttributes(insight ? insightBuckets(insight) : []), [insight]);
|
|
40
48
|
const sourceInsightMeasures = useMemo(() => (insight ? insightMeasures(insight) : []), [insight]);
|
|
41
49
|
const allCatalogDateAttributeDisplayForms = useMemo(() => allCatalogDateDatasets.flatMap((ds) => ds.dateAttributes).flatMap((da) => da.defaultDisplayForm), [allCatalogDateDatasets]);
|
|
42
50
|
const sourceMeasure = item.type === "measure"
|
|
43
51
|
? sourceInsightMeasures.find((measure) => measureLocalId(measure) === item.originLocalIdentifier)
|
|
44
52
|
: undefined;
|
|
53
|
+
const sourceDashboardMeasureValueFilters = useMemo(() => sourceDashboardFilters.filter(isDashboardMeasureValueFilter), [sourceDashboardFilters]);
|
|
54
|
+
const { compatibleMeasureValueFilters: targetInsightCompatibleMeasureValueFilters } = useMeasureValueFilterCompatibility(targetInsight, sourceDashboardMeasureValueFilters);
|
|
45
55
|
const intersectionAttributesOptions = useMemo(() => sourceInsightAttributes.map((insightAttribute) => mapIntersectionAttributeToOption({
|
|
46
56
|
insightAttribute,
|
|
47
57
|
allCatalogDisplayFormsMap,
|
|
@@ -71,9 +81,11 @@ export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
|
71
81
|
targetDashboardFilters,
|
|
72
82
|
targetDashboardAttributeFilters,
|
|
73
83
|
targetDashboardTextAttributeFilters,
|
|
84
|
+
targetDashboardMeasureValueFilters,
|
|
74
85
|
targetDashboardAttributeFilterConfigs,
|
|
75
86
|
isDrillDown,
|
|
76
87
|
isDrillToDashboard,
|
|
88
|
+
enableMeasureValueFilter,
|
|
77
89
|
intl,
|
|
78
90
|
}))
|
|
79
91
|
.filter((option) => !!option);
|
|
@@ -87,9 +99,11 @@ export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
|
87
99
|
targetDashboardFilters,
|
|
88
100
|
targetDashboardAttributeFilters,
|
|
89
101
|
targetDashboardTextAttributeFilters,
|
|
102
|
+
targetDashboardMeasureValueFilters,
|
|
90
103
|
targetDashboardAttributeFilterConfigs,
|
|
91
104
|
isDrillDown,
|
|
92
105
|
isDrillToDashboard,
|
|
106
|
+
enableMeasureValueFilter,
|
|
93
107
|
intl,
|
|
94
108
|
]);
|
|
95
109
|
const sourceMeasureFiltersOptions = useMemo(() => {
|
|
@@ -130,15 +144,19 @@ export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
|
130
144
|
.map((dashboardFilter) => mapDashboardFilterToOption({
|
|
131
145
|
dashboardFilter,
|
|
132
146
|
allCatalogDisplayFormsMap,
|
|
147
|
+
allCatalogMeasures,
|
|
133
148
|
allCatalogDateDatasets,
|
|
134
149
|
dateFilterConfigOverride,
|
|
135
150
|
allDateFilterConfigsOverrides,
|
|
136
151
|
sourceDashboardAttributeFilterConfigs,
|
|
137
152
|
targetDashboardFilters,
|
|
153
|
+
targetDashboardMeasureValueFilters,
|
|
154
|
+
targetInsightCompatibleMeasureValueFilters,
|
|
138
155
|
targetDashboardAttributeFilters,
|
|
139
156
|
targetDashboardTextAttributeFilters,
|
|
140
157
|
targetDashboardAttributeFilterConfigs,
|
|
141
158
|
isDrillDown,
|
|
159
|
+
isDrillToInsight,
|
|
142
160
|
isDrillToDashboard,
|
|
143
161
|
intl,
|
|
144
162
|
}))
|
|
@@ -148,6 +166,7 @@ export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
|
148
166
|
isDrillDown,
|
|
149
167
|
sourceDashboardFilters,
|
|
150
168
|
allCatalogDisplayFormsMap,
|
|
169
|
+
allCatalogMeasures,
|
|
151
170
|
allCatalogDateDatasets,
|
|
152
171
|
dateFilterConfigOverride,
|
|
153
172
|
allDateFilterConfigsOverrides,
|
|
@@ -155,8 +174,11 @@ export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
|
155
174
|
targetDashboardFilters,
|
|
156
175
|
targetDashboardAttributeFilters,
|
|
157
176
|
targetDashboardTextAttributeFilters,
|
|
177
|
+
targetDashboardMeasureValueFilters,
|
|
178
|
+
targetInsightCompatibleMeasureValueFilters,
|
|
158
179
|
targetDashboardAttributeFilterConfigs,
|
|
159
180
|
isDrillToDashboard,
|
|
181
|
+
isDrillToInsight,
|
|
160
182
|
intl,
|
|
161
183
|
]);
|
|
162
184
|
const currentSelection = useMemo(() => ({
|
|
@@ -170,6 +192,30 @@ export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
|
170
192
|
extendedDrillFiltersItem?.ignoredDashboardFilters,
|
|
171
193
|
extendedDrillFiltersItem?.includedSourceMeasureFiltersObjRefs,
|
|
172
194
|
]);
|
|
195
|
+
const dashboardSelection = useMemo(() => dashboardFiltersOptions
|
|
196
|
+
.map((option) => option.id)
|
|
197
|
+
.filter((id) => !currentSelection.ignoredDashboardFilters?.includes(id)), [dashboardFiltersOptions, currentSelection.ignoredDashboardFilters]);
|
|
198
|
+
const sourceInsightSelection = useMemo(() => sourceInsightFiltersOptions
|
|
199
|
+
.filter((option) => currentSelection.includedSourceInsightFiltersObjRefs?.some((includedFilter) => option.sourceInsightFilterObjRef &&
|
|
200
|
+
isSourceInsightFilterObjRefEqual(includedFilter, option.sourceInsightFilterObjRef)))
|
|
201
|
+
.map((option) => option.id), [sourceInsightFiltersOptions, currentSelection.includedSourceInsightFiltersObjRefs]);
|
|
202
|
+
const duplicateMetricFilterMessage = intl.formatMessage(messages.drillToDashboardDuplicateMetricFilterTooltip);
|
|
203
|
+
const selectedDashboardMetricFilterRefs = useMemo(() => getSelectedMetricFilterRefs(dashboardFiltersOptions, dashboardSelection), [dashboardFiltersOptions, dashboardSelection]);
|
|
204
|
+
const selectedSourceInsightMetricFilterRefs = useMemo(() => getSelectedMetricFilterRefs(sourceInsightFiltersOptions, sourceInsightSelection), [sourceInsightFiltersOptions, sourceInsightSelection]);
|
|
205
|
+
const dashboardFiltersOptionsWithDuplicateMetricState = useMemo(() => applyDuplicateMetricFilterState(dashboardFiltersOptions, dashboardSelection, isDrillToDashboard ? selectedSourceInsightMetricFilterRefs : [], duplicateMetricFilterMessage), [
|
|
206
|
+
dashboardFiltersOptions,
|
|
207
|
+
dashboardSelection,
|
|
208
|
+
isDrillToDashboard,
|
|
209
|
+
selectedSourceInsightMetricFilterRefs,
|
|
210
|
+
duplicateMetricFilterMessage,
|
|
211
|
+
]);
|
|
212
|
+
const sourceInsightFiltersOptionsWithDuplicateMetricState = useMemo(() => applyDuplicateMetricFilterState(sourceInsightFiltersOptions, sourceInsightSelection, isDrillToDashboard ? selectedDashboardMetricFilterRefs : [], duplicateMetricFilterMessage), [
|
|
213
|
+
sourceInsightFiltersOptions,
|
|
214
|
+
sourceInsightSelection,
|
|
215
|
+
isDrillToDashboard,
|
|
216
|
+
selectedDashboardMetricFilterRefs,
|
|
217
|
+
duplicateMetricFilterMessage,
|
|
218
|
+
]);
|
|
173
219
|
const onDrillFiltersChange = useCallback((selection) => {
|
|
174
220
|
const { drillIntersectionIgnoredAttributes, includedSourceInsightFiltersObjRefs, ignoredDashboardFilters, includedSourceMeasureFiltersObjRefs, } = {
|
|
175
221
|
...currentSelection,
|
|
@@ -229,9 +275,9 @@ export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
|
229
275
|
isLoading,
|
|
230
276
|
supportsExtendedFiltersConfig,
|
|
231
277
|
intersectionAttributesOptions,
|
|
232
|
-
sourceInsightFiltersOptions,
|
|
278
|
+
sourceInsightFiltersOptions: sourceInsightFiltersOptionsWithDuplicateMetricState,
|
|
233
279
|
sourceMeasureFiltersOptions,
|
|
234
|
-
dashboardFiltersOptions,
|
|
280
|
+
dashboardFiltersOptions: dashboardFiltersOptionsWithDuplicateMetricState,
|
|
235
281
|
drillIntersectionIgnoredAttributes: currentSelection.drillIntersectionIgnoredAttributes ?? [],
|
|
236
282
|
includedSourceInsightFiltersObjRefs: currentSelection.includedSourceInsightFiltersObjRefs ?? [],
|
|
237
283
|
ignoredDashboardFilters: currentSelection.ignoredDashboardFilters ?? [],
|
|
@@ -239,3 +285,29 @@ export function useDrillFiltersConfig({ item, onUpdateDrillItem }) {
|
|
|
239
285
|
onDrillFiltersChange,
|
|
240
286
|
};
|
|
241
287
|
}
|
|
288
|
+
function getSelectedMetricFilterRefs(options, selectedIds) {
|
|
289
|
+
return options.flatMap((option) => option.metricFilterMeasureRef && isDrillFiltersConfigOptionSelected(option, selectedIds)
|
|
290
|
+
? [option.metricFilterMeasureRef]
|
|
291
|
+
: []);
|
|
292
|
+
}
|
|
293
|
+
function applyDuplicateMetricFilterState(options, selectedIds, selectedMetricFilterRefsFromOtherSection, message) {
|
|
294
|
+
if (!selectedMetricFilterRefsFromOtherSection.length) {
|
|
295
|
+
return options;
|
|
296
|
+
}
|
|
297
|
+
return options.map((option) => {
|
|
298
|
+
const metricFilterMeasureRef = option.metricFilterMeasureRef;
|
|
299
|
+
if (option.disabled ||
|
|
300
|
+
!metricFilterMeasureRef ||
|
|
301
|
+
isDrillFiltersConfigOptionSelected(option, selectedIds) ||
|
|
302
|
+
!selectedMetricFilterRefsFromOtherSection.some((measureRef) => areObjRefsEqual(measureRef, metricFilterMeasureRef))) {
|
|
303
|
+
return option;
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
...option,
|
|
307
|
+
disabled: {
|
|
308
|
+
message,
|
|
309
|
+
selected: false,
|
|
310
|
+
},
|
|
311
|
+
};
|
|
312
|
+
});
|
|
313
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { type DashboardTextAttributeFilter, type FilterContextItem, type IDashboardAttributeFilter, type IDashboardAttributeFilterConfig } from "@gooddata/sdk-model";
|
|
1
|
+
import { type DashboardTextAttributeFilter, type FilterContextItem, type IDashboardAttributeFilter, type IDashboardAttributeFilterConfig, type IDashboardMeasureValueFilter } from "@gooddata/sdk-model";
|
|
2
2
|
import { type IDrillConfigItem } from "../../../../drill/types.js";
|
|
3
3
|
interface IUseFetchTargetDashboardFiltersResult {
|
|
4
4
|
targetDashboardFilters: FilterContextItem[];
|
|
5
5
|
targetDashboardAttributeFilters: IDashboardAttributeFilter[];
|
|
6
6
|
targetDashboardTextAttributeFilters: DashboardTextAttributeFilter[];
|
|
7
|
+
targetDashboardMeasureValueFilters: IDashboardMeasureValueFilter[];
|
|
7
8
|
targetDashboardAttributeFilterConfigs: IDashboardAttributeFilterConfig[];
|
|
8
9
|
isLoading: boolean;
|
|
9
10
|
}
|
package/esm/presentation/widget/insight/configuration/DrillFilters/useFetchTargetDashboardFilters.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// (C) 2020-2026 GoodData Corporation
|
|
2
2
|
import { useEffect } from "react";
|
|
3
|
-
import { areObjRefsEqual, isDashboardAttributeFilter, isDashboardTextAttributeFilter, } from "@gooddata/sdk-model";
|
|
3
|
+
import { areObjRefsEqual, isDashboardAttributeFilter, isDashboardMeasureValueFilter, isDashboardTextAttributeFilter, } from "@gooddata/sdk-model";
|
|
4
4
|
import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
|
|
5
5
|
import { selectDashboardRef } from "../../../../../model/store/meta/metaSelectors.js";
|
|
6
6
|
import { selectAttributeFilterConfigsOverrides } from "../../../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
|
|
@@ -46,6 +46,7 @@ export function useFetchTargetDashboardFilters(item) {
|
|
|
46
46
|
targetDashboardFilters: [],
|
|
47
47
|
targetDashboardAttributeFilters: [],
|
|
48
48
|
targetDashboardTextAttributeFilters: [],
|
|
49
|
+
targetDashboardMeasureValueFilters: [],
|
|
49
50
|
targetDashboardAttributeFilterConfigs: [],
|
|
50
51
|
isLoading: false,
|
|
51
52
|
};
|
|
@@ -55,6 +56,7 @@ export function useFetchTargetDashboardFilters(item) {
|
|
|
55
56
|
targetDashboardFilters: sourceDashboardFilters,
|
|
56
57
|
targetDashboardAttributeFilters: sourceDashboardFilters.filter(isDashboardAttributeFilter),
|
|
57
58
|
targetDashboardTextAttributeFilters: sourceDashboardFilters.filter(isDashboardTextAttributeFilter),
|
|
59
|
+
targetDashboardMeasureValueFilters: sourceDashboardFilters.filter(isDashboardMeasureValueFilter),
|
|
58
60
|
targetDashboardAttributeFilterConfigs: sourceDashboardAttributeFilterConfigs,
|
|
59
61
|
isLoading: false,
|
|
60
62
|
};
|
|
@@ -63,6 +65,7 @@ export function useFetchTargetDashboardFilters(item) {
|
|
|
63
65
|
targetDashboardFilters: targetDashboardFiltersCacheEntry?.targetDashboardFilters ?? [],
|
|
64
66
|
targetDashboardAttributeFilters: targetDashboardFiltersCacheEntry?.targetDashboardAttributeFilters ?? [],
|
|
65
67
|
targetDashboardTextAttributeFilters: targetDashboardFiltersCacheEntry?.targetDashboardTextAttributeFilters ?? [],
|
|
68
|
+
targetDashboardMeasureValueFilters: targetDashboardFiltersCacheEntry?.targetDashboardMeasureValueFilters ?? [],
|
|
66
69
|
targetDashboardAttributeFilterConfigs: targetDashboardFiltersCacheEntry?.targetDashboardAttributeFilterConfigs ?? [],
|
|
67
70
|
isLoading: !targetDashboardFiltersCacheEntry || targetDashboardFiltersCacheEntry.status === "loading",
|
|
68
71
|
};
|
|
@@ -811,8 +811,16 @@ export declare const catalogActions: {
|
|
|
811
811
|
updateAttributeHierarchy: ActionCreatorWithPayload<ICatalogAttributeHierarchy, "catalog/updateAttributeHierarchy">;
|
|
812
812
|
deleteAttributeHierarchy: ActionCreatorWithPayload<ICatalogAttributeHierarchy, "catalog/deleteAttributeHierarchy">;
|
|
813
813
|
setCatalogParameters: ActionCreatorWithPayload<ICatalogParametersState, "catalog/setCatalogParameters">;
|
|
814
|
+
setCatalogMeasureParameters: ActionCreatorWithPayload<ICatalogMeasureParametersState, "catalog/setCatalogMeasureParameters">;
|
|
814
815
|
};
|
|
815
816
|
|
|
817
|
+
/**
|
|
818
|
+
* Status of the dashboard-wide metric → parameter dependency map.
|
|
819
|
+
*
|
|
820
|
+
* @alpha
|
|
821
|
+
*/
|
|
822
|
+
export declare type CatalogMeasureParametersStatus = "uninitialized" | "loading" | "loaded" | "failed";
|
|
823
|
+
|
|
816
824
|
/**
|
|
817
825
|
* Status of catalog parameters loading.
|
|
818
826
|
*
|
|
@@ -838,6 +846,8 @@ export declare type CatalogState = {
|
|
|
838
846
|
dateHierarchyTemplates?: IDateHierarchyTemplate[];
|
|
839
847
|
/** @alpha */
|
|
840
848
|
parameters: ICatalogParametersState;
|
|
849
|
+
/** @alpha */
|
|
850
|
+
measureParameters: ICatalogMeasureParametersState;
|
|
841
851
|
};
|
|
842
852
|
|
|
843
853
|
/**
|
|
@@ -5956,6 +5966,18 @@ export declare interface ICancelRenamingDashboardTabPayload {
|
|
|
5956
5966
|
readonly tabId?: string;
|
|
5957
5967
|
}
|
|
5958
5968
|
|
|
5969
|
+
/**
|
|
5970
|
+
* Maps each referenced metric (keyed by `objRefToString(metricRef)`) to the parameter refs the
|
|
5971
|
+
* metric depends on, as reported by the workspace references service. Drives runtime parameter
|
|
5972
|
+
* applicability for widget execution.
|
|
5973
|
+
*
|
|
5974
|
+
* @alpha
|
|
5975
|
+
*/
|
|
5976
|
+
export declare interface ICatalogMeasureParametersState {
|
|
5977
|
+
status: CatalogMeasureParametersStatus;
|
|
5978
|
+
byMetric: Record<string, IdentifierRef[]>;
|
|
5979
|
+
}
|
|
5980
|
+
|
|
5959
5981
|
/**
|
|
5960
5982
|
* Catalog parameters slice.
|
|
5961
5983
|
*
|
|
@@ -22905,6 +22927,21 @@ export declare const selectCatalogFacts: DashboardSelector<ICatalogFact[]>;
|
|
|
22905
22927
|
*/
|
|
22906
22928
|
export declare const selectCatalogIsLoaded: DashboardSelector<boolean>;
|
|
22907
22929
|
|
|
22930
|
+
/**
|
|
22931
|
+
* Returns the dashboard-wide map from metric ref string to the parameter refs the metric depends on.
|
|
22932
|
+
* The map is populated during dashboard initialization from the workspace references service.
|
|
22933
|
+
*
|
|
22934
|
+
* @alpha
|
|
22935
|
+
*/
|
|
22936
|
+
export declare const selectCatalogMeasureParameters: DashboardSelector<Record<string, IdentifierRef[]>>;
|
|
22937
|
+
|
|
22938
|
+
/**
|
|
22939
|
+
* Returns the load status of the dashboard-wide metric → parameter dependency map.
|
|
22940
|
+
*
|
|
22941
|
+
* @alpha
|
|
22942
|
+
*/
|
|
22943
|
+
export declare const selectCatalogMeasureParametersStatus: DashboardSelector<CatalogMeasureParametersStatus>;
|
|
22944
|
+
|
|
22908
22945
|
/**
|
|
22909
22946
|
* @public
|
|
22910
22947
|
*/
|
|
@@ -23622,12 +23659,16 @@ export declare const selectEffectiveDateFilterTitle: DashboardSelector<string |
|
|
|
23622
23659
|
* Returns the parameter values to inject into the widget's `IExecutionConfig.parameterValues`.
|
|
23623
23660
|
*
|
|
23624
23661
|
* @remarks
|
|
23625
|
-
*
|
|
23626
|
-
*
|
|
23627
|
-
*
|
|
23628
|
-
*
|
|
23629
|
-
*
|
|
23630
|
-
*
|
|
23662
|
+
* For each parameter referenced by the widget's metrics (via the dashboard-wide MAQL
|
|
23663
|
+
* metric → parameter dependency map), the value is resolved in this order:
|
|
23664
|
+
*
|
|
23665
|
+
* 1. dashboard chip on the widget's tab with `runtimeOverride !== undefined`,
|
|
23666
|
+
* 2. else `insight.parameters` entry for that ref (AD-authored per-insight override),
|
|
23667
|
+
* 3. else nothing (backend uses workspace default).
|
|
23668
|
+
*
|
|
23669
|
+
* Parameters not referenced by the widget's metrics are excluded so that adding/removing
|
|
23670
|
+
* unrelated parameters does not invalidate the widget's `defFingerprint`. Returns `[]` when
|
|
23671
|
+
* `enableParameters` is off or while the dependency map has not been loaded.
|
|
23631
23672
|
*
|
|
23632
23673
|
* @alpha
|
|
23633
23674
|
*/
|
|
@@ -26721,6 +26762,12 @@ dateDataSets: ObjRef[];
|
|
|
26721
26762
|
};
|
|
26722
26763
|
type: string;
|
|
26723
26764
|
}) => void | ITabsState | WritableDraft<ITabsState>;
|
|
26765
|
+
readonly removeIgnoredMeasureValueFilter: (state: WritableDraft<ITabsState>, action: {
|
|
26766
|
+
payload: {
|
|
26767
|
+
measureRefs: ObjRef[];
|
|
26768
|
+
};
|
|
26769
|
+
type: string;
|
|
26770
|
+
}) => void | ITabsState | WritableDraft<ITabsState>;
|
|
26724
26771
|
readonly addSection: (state: WritableDraft<ITabsState>, action: {
|
|
26725
26772
|
payload: IUndoPayload<IDashboardCommand> & {
|
|
26726
26773
|
section: ExtendedDashboardLayoutSection;
|