@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.
Files changed (55) hide show
  1. package/NOTICE +3 -3
  2. package/esm/__version.d.ts +1 -1
  3. package/esm/__version.js +1 -1
  4. package/esm/_staging/drills/drillingUtils.d.ts +9 -0
  5. package/esm/_staging/drills/drillingUtils.js +19 -1
  6. package/esm/index.d.ts +2 -2
  7. package/esm/index.js +1 -1
  8. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.js +9 -2
  9. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.d.ts +12 -0
  10. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.js +98 -0
  11. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js +1 -0
  12. package/esm/model/commandHandlers/drill/common/mergeFilters.d.ts +3 -3
  13. package/esm/model/commandHandlers/drill/common/mergeFilters.js +26 -1
  14. package/esm/model/commandHandlers/drill/common/sourceDrillFilters.d.ts +2 -1
  15. package/esm/model/commandHandlers/drill/common/sourceDrillFilters.js +25 -5
  16. package/esm/model/commandHandlers/drill/drillToDashboardHandler.js +17 -16
  17. package/esm/model/commandHandlers/filterContext/changeFilterContextSelectionHandler.js +7 -4
  18. package/esm/model/commandHandlers/filterContext/measureValueFilter/removeMeasureValueFilterHandler.js +7 -0
  19. package/esm/model/commandHandlers/scheduledEmail/initializeAutomationsHandler.js +7 -1
  20. package/esm/model/react/useWidgetFilters.js +4 -1
  21. package/esm/model/store/catalog/catalogReducers.d.ts +5 -1
  22. package/esm/model/store/catalog/catalogReducers.js +4 -0
  23. package/esm/model/store/catalog/catalogSelectors.d.ts +15 -2
  24. package/esm/model/store/catalog/catalogSelectors.js +13 -0
  25. package/esm/model/store/catalog/catalogState.d.ts +20 -1
  26. package/esm/model/store/catalog/catalogState.js +1 -0
  27. package/esm/model/store/catalog/index.d.ts +1 -0
  28. package/esm/model/store/tabs/index.d.ts +6 -0
  29. package/esm/model/store/tabs/layout/layoutReducers.d.ts +4 -0
  30. package/esm/model/store/tabs/layout/layoutReducers.js +25 -0
  31. package/esm/model/store/tabs/parameters/parametersSelectors.d.ts +19 -6
  32. package/esm/model/store/tabs/parameters/parametersSelectors.js +69 -16
  33. package/esm/presentation/filterBar/parameterFilter/DashboardParameterFilter.js +3 -2
  34. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +8 -0
  35. package/esm/presentation/localization/bundles/en-US.localization-bundle.js +8 -0
  36. package/esm/presentation/widget/common/configuration/FilterConfiguration.js +4 -2
  37. package/esm/presentation/widget/common/configuration/useMeasureValueFilterCompatibility.d.ts +6 -2
  38. package/esm/presentation/widget/common/configuration/useMeasureValueFilterCompatibility.js +95 -22
  39. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useExcludedDrillDefinitionFilters.js +2 -2
  40. package/esm/presentation/widget/insight/configuration/DrillFilters/TargetDashboardFiltersContext.d.ts +2 -1
  41. package/esm/presentation/widget/insight/configuration/DrillFilters/TargetDashboardFiltersContext.js +3 -1
  42. package/esm/presentation/widget/insight/configuration/DrillFilters/drillFiltersConfigUtils.d.ts +4 -1
  43. package/esm/presentation/widget/insight/configuration/DrillFilters/drillFiltersConfigUtils.js +15 -1
  44. package/esm/presentation/widget/insight/configuration/DrillFilters/messages.d.ts +6 -0
  45. package/esm/presentation/widget/insight/configuration/DrillFilters/messages.js +6 -0
  46. package/esm/presentation/widget/insight/configuration/DrillFilters/optionMappings/mapDashboardFilterToOption.d.ts +6 -2
  47. package/esm/presentation/widget/insight/configuration/DrillFilters/optionMappings/mapDashboardFilterToOption.js +18 -3
  48. package/esm/presentation/widget/insight/configuration/DrillFilters/optionMappings/mapSourceInsightFilterToOption.d.ts +4 -2
  49. package/esm/presentation/widget/insight/configuration/DrillFilters/optionMappings/mapSourceInsightFilterToOption.js +10 -6
  50. package/esm/presentation/widget/insight/configuration/DrillFilters/types.d.ts +2 -1
  51. package/esm/presentation/widget/insight/configuration/DrillFilters/useDrillFiltersConfig.js +78 -6
  52. package/esm/presentation/widget/insight/configuration/DrillFilters/useFetchTargetDashboardFilters.d.ts +2 -1
  53. package/esm/presentation/widget/insight/configuration/DrillFilters/useFetchTargetDashboardFilters.js +4 -1
  54. package/esm/sdk-ui-dashboard.d.ts +53 -6
  55. package/package.json +20 -20
@@ -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
  }
@@ -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;
@@ -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
- ...(isDrillToDashboard
59
- ? getDisabledOptionProps(true, intl.formatMessage(messages.drillToDashboardMetricFilterTooltip), false)
60
- : disabled),
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 { selectInsightByWidgetRef } from "../../../../../model/store/insights/insightsSelectors.js";
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
  }
@@ -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
- * The widget's owning tab is resolved from layout, then the result is the intersection of that
23626
- * tab's parameter entries and the parameters referenced by the widget's insight (per
23627
- * `insightParameters`). Dashboard parameters not referenced by the widget's insight are excluded
23628
- * so that adding/removing unrelated parameters does not invalidate the widget's `defFingerprint`.
23629
- * Returns an empty array when `enableParameters` is off so persisted parameter values cannot
23630
- * silently affect execution while the UI is hidden.
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;