@gooddata/sdk-ui-dashboard 11.51.0 → 11.52.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 (164) hide show
  1. package/NOTICE +3 -3
  2. package/esm/__version.d.ts +1 -1
  3. package/esm/__version.d.ts.map +1 -1
  4. package/esm/__version.js +1 -1
  5. package/esm/index.d.ts +1 -5
  6. package/esm/index.d.ts.map +1 -1
  7. package/esm/index.js +0 -3
  8. package/esm/model/commandHandlers/index.d.ts.map +1 -1
  9. package/esm/model/commandHandlers/index.js +0 -2
  10. package/esm/model/commands/base.d.ts +1 -1
  11. package/esm/model/commands/base.d.ts.map +1 -1
  12. package/esm/model/commands/index.d.ts +1 -2
  13. package/esm/model/commands/index.d.ts.map +1 -1
  14. package/esm/model/store/dashboardStore.d.ts +0 -2
  15. package/esm/model/store/dashboardStore.d.ts.map +1 -1
  16. package/esm/model/store/dashboardStore.js +0 -2
  17. package/esm/model/store/types.d.ts +0 -3
  18. package/esm/model/store/types.d.ts.map +1 -1
  19. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts.map +1 -1
  20. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.js +2 -2
  21. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFormState.d.ts +3 -4
  22. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFormState.d.ts.map +1 -1
  23. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFormState.js +14 -16
  24. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useEditAlert.d.ts +1 -3
  25. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useEditAlert.d.ts.map +1 -1
  26. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useEditAlert.js +1 -4
  27. package/esm/presentation/automations/alerting/types.d.ts +1 -13
  28. package/esm/presentation/automations/alerting/types.d.ts.map +1 -1
  29. package/esm/presentation/automations/connectors/AlertingConnector.d.ts +4 -5
  30. package/esm/presentation/automations/connectors/AlertingConnector.d.ts.map +1 -1
  31. package/esm/presentation/automations/connectors/AlertingConnector.js +8 -17
  32. package/esm/presentation/automations/connectors/AlertingConnector.test.js +0 -16
  33. package/esm/presentation/automations/connectors/ScheduledEmailConnector.d.ts +4 -4
  34. package/esm/presentation/automations/connectors/ScheduledEmailConnector.d.ts.map +1 -1
  35. package/esm/presentation/automations/connectors/ScheduledEmailConnector.js +8 -18
  36. package/esm/presentation/automations/connectors/ScheduledEmailConnector.test.js +0 -20
  37. package/esm/presentation/automations/connectors/hooks/useBuildAlertingDialogContext.d.ts +1 -4
  38. package/esm/presentation/automations/connectors/hooks/useBuildAlertingDialogContext.d.ts.map +1 -1
  39. package/esm/presentation/automations/connectors/hooks/useBuildAlertingDialogContext.js +5 -10
  40. package/esm/presentation/automations/connectors/hooks/useBuildAlertingDialogContext.test.js +13 -10
  41. package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.d.ts.map +1 -1
  42. package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.js +35 -3
  43. package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.test.js +76 -27
  44. package/esm/presentation/automations/connectors/hooks/useBuildScheduledEmailDialogContext.d.ts +1 -4
  45. package/esm/presentation/automations/connectors/hooks/useBuildScheduledEmailDialogContext.d.ts.map +1 -1
  46. package/esm/presentation/automations/connectors/hooks/useBuildScheduledEmailDialogContext.js +1 -14
  47. package/esm/presentation/automations/connectors/hooks/useBuildScheduledEmailDialogContext.test.js +1 -11
  48. package/esm/presentation/automations/contexts/AlertingDialogContext.d.ts +11 -14
  49. package/esm/presentation/automations/contexts/AlertingDialogContext.d.ts.map +1 -1
  50. package/esm/presentation/automations/contexts/AlertingDialogContext.js +3 -3
  51. package/esm/presentation/automations/contexts/AutomationsContext.d.ts +31 -1
  52. package/esm/presentation/automations/contexts/AutomationsContext.d.ts.map +1 -1
  53. package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.d.ts +5 -18
  54. package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.d.ts.map +1 -1
  55. package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.js +3 -5
  56. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts.map +1 -1
  57. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +5 -5
  58. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelect.d.ts +3 -12
  59. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelect.d.ts.map +1 -1
  60. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelect.js +21 -21
  61. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.d.ts +6 -3
  62. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.d.ts.map +1 -1
  63. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.js +14 -27
  64. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/useWorkspaceUsersSearch.d.ts +13 -0
  65. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/useWorkspaceUsersSearch.d.ts.map +1 -0
  66. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/useWorkspaceUsersSearch.js +44 -0
  67. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts +1 -3
  68. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts.map +1 -1
  69. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.js +1 -4
  70. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.d.ts.map +1 -1
  71. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.js +3 -12
  72. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.d.ts.map +1 -1
  73. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.js +2 -1
  74. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.d.ts +8 -9
  75. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.d.ts.map +1 -1
  76. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.js +12 -11
  77. package/esm/presentation/automations/scheduledEmail/types.d.ts +1 -13
  78. package/esm/presentation/automations/scheduledEmail/types.d.ts.map +1 -1
  79. package/esm/presentation/automations/scheduledEmail/utils/users.d.ts +1 -2
  80. package/esm/presentation/automations/scheduledEmail/utils/users.d.ts.map +1 -1
  81. package/esm/presentation/automations/scheduledEmail/utils/users.js +1 -10
  82. package/esm/presentation/automations/shared/automationFilters/components/AutomationDateFilter.test.js +9 -0
  83. package/esm/presentation/automations/shared/automationFilters/hooks/useAutomationVisibleFilters.d.ts.map +1 -1
  84. package/esm/presentation/automations/shared/automationFilters/hooks/useAutomationVisibleFilters.js +7 -2
  85. package/esm/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.d.ts.map +1 -1
  86. package/esm/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.js +2 -14
  87. package/esm/presentation/automations/shared/automationFilters/useAutomationAlertParameters.d.ts +12 -3
  88. package/esm/presentation/automations/shared/automationFilters/useAutomationAlertParameters.d.ts.map +1 -1
  89. package/esm/presentation/automations/shared/automationFilters/useAutomationAlertParameters.js +3 -11
  90. package/esm/presentation/automations/shared/automationFilters/useAutomationExportParameters.d.ts +7 -1
  91. package/esm/presentation/automations/shared/automationFilters/useAutomationExportParameters.d.ts.map +1 -1
  92. package/esm/presentation/automations/shared/automationFilters/useAutomationExportParameters.js +9 -25
  93. package/esm/presentation/automations/shared/automationFilters/useAutomationFiltersSelect.d.ts.map +1 -1
  94. package/esm/presentation/automations/shared/automationFilters/useAutomationFiltersSelect.js +4 -7
  95. package/esm/presentation/automations/shared/hooks/useDateFiltersTitles.d.ts.map +1 -1
  96. package/esm/presentation/automations/shared/hooks/useDateFiltersTitles.js +6 -3
  97. package/esm/presentation/automations/shared/hooks/useFiltersNamings.d.ts.map +1 -1
  98. package/esm/presentation/automations/shared/hooks/useFiltersNamings.js +23 -10
  99. package/esm/presentation/automations/shared/utils/automationUtils.d.ts +1 -3
  100. package/esm/presentation/automations/shared/utils/automationUtils.d.ts.map +1 -1
  101. package/esm/presentation/automations/shared/utils/automationUtils.js +0 -17
  102. package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditor.d.ts.map +1 -1
  103. package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditor.js +5 -4
  104. package/esm/presentation/drill/utils/dashboardPredicate.d.ts +0 -15
  105. package/esm/presentation/drill/utils/dashboardPredicate.d.ts.map +1 -1
  106. package/esm/presentation/drill/utils/dashboardPredicate.js +1 -16
  107. package/esm/presentation/presentationComponents/DashboardItems/DashboardItem.d.ts +4 -0
  108. package/esm/presentation/presentationComponents/DashboardItems/DashboardItem.d.ts.map +1 -1
  109. package/esm/presentation/widget/insight/configuration/InsightAlertConfig/CreateAlert.d.ts +2 -3
  110. package/esm/presentation/widget/insight/configuration/InsightAlertConfig/CreateAlert.d.ts.map +1 -1
  111. package/esm/presentation/widget/insight/configuration/InsightAlertConfig/CreateAlert.js +2 -2
  112. package/esm/presentation/widget/insight/configuration/InsightAlertConfig/EditAlert.d.ts +2 -3
  113. package/esm/presentation/widget/insight/configuration/InsightAlertConfig/EditAlert.d.ts.map +1 -1
  114. package/esm/presentation/widget/insight/configuration/InsightAlertConfig/EditAlert.js +2 -2
  115. package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useEditAlert.d.ts +1 -1
  116. package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useEditAlert.d.ts.map +1 -1
  117. package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useEditAlert.js +4 -6
  118. package/esm/presentation/widget/visualizationSwitcher/EditModeDashboardVisualizationSwitcher.d.ts.map +1 -1
  119. package/esm/presentation/widget/visualizationSwitcher/EditModeDashboardVisualizationSwitcher.js +1 -1
  120. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.d.ts.map +1 -1
  121. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.js +3 -1
  122. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/DefaultDashboardVisualizationSwitcherWidget.d.ts.map +1 -1
  123. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/DefaultDashboardVisualizationSwitcherWidget.js +1 -1
  124. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/EditableDashboardVisualizationSwitcherWidget.d.ts.map +1 -1
  125. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/EditableDashboardVisualizationSwitcherWidget.js +1 -1
  126. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/ExportableDashboardVisualizationSwitcherWidget.d.ts.map +1 -1
  127. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/ExportableDashboardVisualizationSwitcherWidget.js +1 -1
  128. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/VisualizationSwitcherNavigationHeader.d.ts +2 -1
  129. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/VisualizationSwitcherNavigationHeader.d.ts.map +1 -1
  130. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/VisualizationSwitcherNavigationHeader.js +4 -4
  131. package/esm/sdk-ui-dashboard.d.ts +47 -115
  132. package/package.json +21 -21
  133. package/styles/css/main.css +2 -0
  134. package/styles/css/main.css.map +1 -1
  135. package/styles/css/visualizationSwitcherHeader.css +1 -0
  136. package/styles/css/visualizationSwitcherHeader.css.map +1 -1
  137. package/styles/css/visualizationSwitcherWidget.css +1 -0
  138. package/styles/css/visualizationSwitcherWidget.css.map +1 -1
  139. package/styles/scss/visualizationSwitcherHeader.scss +2 -0
  140. package/styles/scss/visualizationSwitcherWidget.scss +2 -0
  141. package/esm/model/commandHandlers/users/loadAllUsersHandler.d.ts +0 -5
  142. package/esm/model/commandHandlers/users/loadAllUsersHandler.d.ts.map +0 -1
  143. package/esm/model/commandHandlers/users/loadAllUsersHandler.js +0 -19
  144. package/esm/model/commandHandlers/users/loadWorkspaceUsers.d.ts +0 -4
  145. package/esm/model/commandHandlers/users/loadWorkspaceUsers.d.ts.map +0 -1
  146. package/esm/model/commandHandlers/users/loadWorkspaceUsers.js +0 -3
  147. package/esm/model/commands/users.d.ts +0 -19
  148. package/esm/model/commands/users.d.ts.map +0 -1
  149. package/esm/model/commands/users.js +0 -15
  150. package/esm/model/react/useWorkspaceUsers.d.ts +0 -9
  151. package/esm/model/react/useWorkspaceUsers.d.ts.map +0 -1
  152. package/esm/model/react/useWorkspaceUsers.js +0 -27
  153. package/esm/model/store/users/index.d.ts +0 -9
  154. package/esm/model/store/users/index.d.ts.map +0 -1
  155. package/esm/model/store/users/index.js +0 -12
  156. package/esm/model/store/users/usersReducers.d.ts +0 -21
  157. package/esm/model/store/users/usersReducers.d.ts.map +0 -1
  158. package/esm/model/store/users/usersReducers.js +0 -15
  159. package/esm/model/store/users/usersSelectors.d.ts +0 -22
  160. package/esm/model/store/users/usersSelectors.d.ts.map +0 -1
  161. package/esm/model/store/users/usersSelectors.js +0 -27
  162. package/esm/model/store/users/usersState.d.ts +0 -12
  163. package/esm/model/store/users/usersState.d.ts.map +0 -1
  164. package/esm/model/store/users/usersState.js +0 -2
@@ -39,11 +39,13 @@ vi.mock("../../../../model/store/meta/metaSelectors.js", () => ({
39
39
  selectDashboardId: () => "dashboard-1",
40
40
  selectEvaluationFrequency: () => undefined,
41
41
  }));
42
- vi.mock("../../../../model/store/tabs/layout/layoutSelectors.js", () => ({
43
- selectWidgetLocalIdToTabIdMap: () => ({}),
42
+ const parameterSentinels = vi.hoisted(() => ({
43
+ parameterValues: [],
44
+ dashboardParameters: [],
44
45
  }));
45
46
  vi.mock("../../../../model/store/tabs/parameters/parametersSelectors.js", () => ({
46
- selectEffectiveParameterValuesForWidget: () => () => [],
47
+ selectEffectiveParameterValuesForWidget: () => () => parameterSentinels.parameterValues,
48
+ selectEffectiveDashboardParametersForWidget: () => () => parameterSentinels.dashboardParameters,
47
49
  }));
48
50
  vi.mock("../../../../model/utils/dashboardItemUtils.js", () => ({
49
51
  getWidgetTitle: () => "widget title",
@@ -54,7 +56,6 @@ describe("useBuildAlertingDialogContext", () => {
54
56
  const ref = idRef("widget-1");
55
57
  const { result, rerender } = renderHook(() => useBuildAlertingDialogContext({
56
58
  mode: "create",
57
- users: [],
58
59
  notificationChannels: [],
59
60
  isLoading: false,
60
61
  }));
@@ -70,23 +71,25 @@ describe("useBuildAlertingDialogContext", () => {
70
71
  });
71
72
  it("passes the create/edit inputs through to the context unchanged", () => {
72
73
  const alertToEdit = { id: "alert-1", title: "My alert" };
73
- const users = [
74
- { ref: idRef("user-1"), uri: "/users/user-1", login: "user-1", email: "user-1@example.com" },
75
- ];
76
74
  const notificationChannels = [
77
75
  { id: "channel-1", type: "notificationChannel" },
78
76
  ];
79
77
  const { result } = renderHook(() => useBuildAlertingDialogContext({
80
78
  mode: "edit",
81
79
  alertToEdit,
82
- users,
83
- usersError: undefined,
84
80
  notificationChannels,
85
81
  isLoading: true,
86
82
  }));
87
83
  expect(result.current.alertToEdit).toBe(alertToEdit);
88
- expect(result.current.users).toBe(users);
89
84
  expect(result.current.notificationChannels).toBe(notificationChannels);
90
85
  expect(result.current.isLoading).toBe(true);
91
86
  });
87
+ it("forwards the widget's effective dashboard parameters onto the alerting dialog context", () => {
88
+ const { result } = renderHook(() => useBuildAlertingDialogContext({
89
+ mode: "create",
90
+ notificationChannels: [],
91
+ isLoading: false,
92
+ }));
93
+ expect(result.current.dashboardParameters).toBe(parameterSentinels.dashboardParameters);
94
+ });
92
95
  });
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildAutomationsContext.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/connectors/hooks/useBuildAutomationsContext.ts"],"names":[],"mappings":"AA0EA,OAAO,KAAK,EACR,wBAAwB,EAE3B,MAAM,sCAAsC,CAAC;AAI9C,wBAAgB,0BAA0B,IAAI,wBAAwB,CA+LrE"}
1
+ {"version":3,"file":"useBuildAutomationsContext.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/connectors/hooks/useBuildAutomationsContext.ts"],"names":[],"mappings":"AAmFA,OAAO,KAAK,EACR,wBAAwB,EAG3B,MAAM,sCAAsC,CAAC;AAI9C,wBAAgB,0BAA0B,IAAI,wBAAwB,CAmOrE"}
@@ -1,8 +1,8 @@
1
1
  // (C) 2026 GoodData Corporation
2
2
  import { useCallback, useMemo } from "react";
3
3
  import { useDashboardSelector } from "../../../../model/react/DashboardStoreProvider.js";
4
- import { selectAllCatalogAttributesMap, selectAllCatalogDisplayFormsMap, selectCatalogAttributes, selectCatalogDateDatasets, selectCatalogMeasures, } from "../../../../model/store/catalog/catalogSelectors.js";
5
- import { selectEnableAlertOncePerInterval, selectEnableAnomalyDetectionAlert, selectEnableAutomationEvaluationMode, selectEnableSlideshowExports, selectExternalRecipient, selectIsWhiteLabeled, selectLocale, selectSeparators, selectSettings, selectTimezone, selectWeekStart, } from "../../../../model/store/config/configSelectors.js";
4
+ import { selectAllCatalogAttributesMap, selectAllCatalogDisplayFormsMap, selectCatalogAttributes, selectCatalogDateDatasets, selectCatalogMeasures, selectCatalogParameters, selectCatalogParametersIsLoaded, } from "../../../../model/store/catalog/catalogSelectors.js";
5
+ import { selectEnableAlertOncePerInterval, selectEnableAnomalyDetectionAlert, selectEnableAutomationEvaluationMode, selectEnableParameters, selectEnableSlideshowExports, selectEnableStringParameters, selectExternalRecipient, selectIsWhiteLabeled, selectLocale, selectSeparators, selectSettings, selectTimezone, selectWeekStart, } from "../../../../model/store/config/configSelectors.js";
6
6
  import { selectEntitlementMinimumRecurrenceMinutes, selectMaxAutomationRecipients, } from "../../../../model/store/entitlements/entitlementsSelectors.js";
7
7
  import { selectAutomationAvailableDashboardFilters, selectAutomationCommonDateFilterId, selectAutomationDefaultSelectedFilters, selectAutomationFiltersByTab, selectDashboardFiltersWithoutCrossFiltering, selectDashboardHiddenFilters, selectDashboardLockedFilters, } from "../../../../model/store/filtering/dashboardFilterSelectors.js";
8
8
  import { selectPersistedDashboardFilterContextDateFilterConfig } from "../../../../model/store/meta/metaSelectors.js";
@@ -11,8 +11,10 @@ import { selectAttributeFilterConfigsOverrides, selectAttributeFilterConfigsOver
11
11
  import { selectDateFilterConfigOverridesByTab, selectEffectiveDateFilterAvailableGranularities, selectEffectiveDateFilterGranularitiesPerTab, selectEffectiveDateFilterOptions, selectEffectiveDateFilterOptionsPerTab, } from "../../../../model/store/tabs/dateFilterConfig/dateFilterConfigSelectors.js";
12
12
  import { selectDateFilterConfigsOverrides, selectDateFilterConfigsOverridesByTab, } from "../../../../model/store/tabs/dateFilterConfigs/dateFilterConfigsSelectors.js";
13
13
  import { selectAttributeFilterDisplayFormsMap } from "../../../../model/store/tabs/filterContext/filterContextSelectors.js";
14
- import { selectWidgetsMap } from "../../../../model/store/tabs/layout/layoutSelectors.js";
14
+ import { selectWidgetLocalIdToTabIdMap, selectWidgetsMap, } from "../../../../model/store/tabs/layout/layoutSelectors.js";
15
15
  import { selectMeasureValueFilterConfigsOverrides, selectMeasureValueFilterConfigsOverridesByTab, } from "../../../../model/store/tabs/measureValueFilterConfigs/measureValueFilterConfigsSelectors.js";
16
+ import { selectSmartPersistedTabsParameters } from "../../../../model/store/tabs/parameters/parametersSelectors.js";
17
+ import { selectTabs } from "../../../../model/store/tabs/tabsSelectors.js";
16
18
  import { selectExecutionTimestamp, selectScheduleEmailDialogReturnFocusTo, } from "../../../../model/store/ui/uiSelectors.js";
17
19
  import { selectCurrentUser } from "../../../../model/store/user/userSelectors.js";
18
20
  const DEFAULT_MIN_RECURRENCE_MINUTES = "60";
@@ -66,6 +68,13 @@ export function useBuildAutomationsContext() {
66
68
  const isExecutionTimestampMode = !!executionTimestamp;
67
69
  const scheduleEmailDialogReturnFocusTo = useDashboardSelector(selectScheduleEmailDialogReturnFocusTo);
68
70
  const widgetsMap = useDashboardSelector(selectWidgetsMap);
71
+ const parametersEnabled = useDashboardSelector(selectEnableParameters);
72
+ const stringParametersEnabled = useDashboardSelector(selectEnableStringParameters);
73
+ const parameterCatalog = useDashboardSelector(selectCatalogParameters);
74
+ const parameterCatalogIsLoaded = useDashboardSelector(selectCatalogParametersIsLoaded);
75
+ const dashboardParametersByTab = useDashboardSelector(selectSmartPersistedTabsParameters);
76
+ const tabs = useDashboardSelector(selectTabs);
77
+ const widgetLocalIdToTabIdMap = useDashboardSelector(selectWidgetLocalIdToTabIdMap);
69
78
  const getCatalogAttributeByRef = useCallback((ref) => allCatalogAttributesMap.get(ref), [allCatalogAttributesMap]);
70
79
  const getAttributeFilterDisplayForm = useCallback((displayForm) => attrFilterDisplayFormsMap.get(displayForm) ?? catalogDisplayFormsMap.get(displayForm), [attrFilterDisplayFormsMap, catalogDisplayFormsMap]);
71
80
  const widgetExistsByRef = useCallback((ref) => !!ref && widgetsMap.get(ref) !== undefined, [widgetsMap]);
@@ -75,6 +84,23 @@ export function useBuildAutomationsContext() {
75
84
  getGranularitiesForTab: (tabId) => granularitiesPerTab[tabId] ?? [],
76
85
  getOptionsForTab: (tabId) => optionsPerTab[tabId],
77
86
  }), [availableGranularities, dateFilterOptions, granularitiesPerTab, optionsPerTab]);
87
+ // Memoized deliberately: `.map()` allocates, and an unstable `tabIds` would land in the
88
+ // dependency array of the context useMemo below and change the whole context identity on
89
+ // every render.
90
+ const tabIds = useMemo(() => (tabs ?? []).map((tab) => tab.localIdentifier), [tabs]);
91
+ const parameters = useMemo(() => ({
92
+ enabled: parametersEnabled,
93
+ stringParametersEnabled,
94
+ catalog: parameterCatalog,
95
+ catalogIsLoaded: parameterCatalogIsLoaded,
96
+ dashboardParametersByTab,
97
+ }), [
98
+ parametersEnabled,
99
+ stringParametersEnabled,
100
+ parameterCatalog,
101
+ parameterCatalogIsLoaded,
102
+ dashboardParametersByTab,
103
+ ]);
78
104
  const features = useMemo(() => ({
79
105
  canCreateAutomation,
80
106
  enableAlertOncePerInterval,
@@ -127,6 +153,9 @@ export function useBuildAutomationsContext() {
127
153
  isSecondaryTitleVisible: true,
128
154
  externalRecipient,
129
155
  features,
156
+ parameters,
157
+ tabIds,
158
+ widgetLocalIdToTabIdMap,
130
159
  getCatalogAttributeByRef,
131
160
  getAttributeFilterDisplayForm,
132
161
  widgetExistsByRef,
@@ -165,6 +194,9 @@ export function useBuildAutomationsContext() {
165
194
  isWhiteLabeled,
166
195
  externalRecipient,
167
196
  features,
197
+ parameters,
198
+ tabIds,
199
+ widgetLocalIdToTabIdMap,
168
200
  getCatalogAttributeByRef,
169
201
  getAttributeFilterDisplayForm,
170
202
  widgetExistsByRef,
@@ -26,33 +26,51 @@ const selectors = vi.hoisted(() => {
26
26
  },
27
27
  },
28
28
  };
29
+ // Every mocked selector must return one of these. A mock that allocates per call
30
+ // (`() => []`) would make the context value change identity on every render, which the
31
+ // referential-stability test below exists to catch. In production every one of these
32
+ // selectors is a createSelector and returns a stable reference.
29
33
  return {
30
34
  availableGranularities,
31
35
  dateFilterOptions,
32
36
  granularitiesPerTab,
33
37
  optionsPerTab,
38
+ emptyArray: [],
39
+ emptyRecord: {},
40
+ emptyMap: new Map(),
41
+ separators: { decimal: ".", thousand: "," },
42
+ currentUser: { login: "test@example.com", ref: { identifier: "test" } },
43
+ widgetsMap: { get: () => undefined },
44
+ parameterCatalog: [],
45
+ dashboardParametersByTab: {},
46
+ tabs: [{ localIdentifier: "tab1" }],
47
+ widgetTabMap: { "widget-1": "tab1" },
34
48
  };
35
49
  });
36
50
  vi.mock("../../../../model/react/DashboardStoreProvider.js", () => ({
37
51
  useDashboardSelector: vi.fn((selector) => selector()),
38
52
  }));
39
53
  vi.mock("../../../../model/store/catalog/catalogSelectors.js", () => ({
40
- selectAllCatalogAttributesMap: () => new Map(),
41
- selectAllCatalogDisplayFormsMap: () => new Map(),
42
- selectCatalogAttributes: () => [],
43
- selectCatalogDateDatasets: () => [],
44
- selectCatalogMeasures: () => [],
54
+ selectAllCatalogAttributesMap: () => selectors.emptyMap,
55
+ selectAllCatalogDisplayFormsMap: () => selectors.emptyMap,
56
+ selectCatalogAttributes: () => selectors.emptyArray,
57
+ selectCatalogDateDatasets: () => selectors.emptyArray,
58
+ selectCatalogMeasures: () => selectors.emptyArray,
59
+ selectCatalogParameters: () => selectors.parameterCatalog,
60
+ selectCatalogParametersIsLoaded: () => true,
45
61
  }));
46
62
  vi.mock("../../../../model/store/config/configSelectors.js", () => ({
47
63
  selectDateFormat: () => "MM/dd/yyyy",
48
64
  selectEnableAlertOncePerInterval: () => false,
49
65
  selectEnableAnomalyDetectionAlert: () => false,
50
66
  selectEnableAutomationEvaluationMode: () => false,
67
+ selectEnableParameters: () => true,
51
68
  selectEnableSlideshowExports: () => false,
69
+ selectEnableStringParameters: () => true,
52
70
  selectExternalRecipient: () => undefined,
53
71
  selectIsWhiteLabeled: () => false,
54
72
  selectLocale: () => "en-US",
55
- selectSeparators: () => ({ decimal: ".", thousand: "," }),
73
+ selectSeparators: () => selectors.separators,
56
74
  selectSettings: () => undefined,
57
75
  selectTimezone: () => undefined,
58
76
  selectWeekStart: () => "Sunday",
@@ -61,7 +79,10 @@ vi.mock("../../../../model/store/drill/drillSelectors.js", () => ({
61
79
  selectIsCrossFiltering: () => false,
62
80
  }));
63
81
  vi.mock("../../../../model/store/tabs/tabsSelectors.js", () => ({
64
- selectTabs: () => [],
82
+ selectTabs: () => selectors.tabs,
83
+ }));
84
+ vi.mock("../../../../model/store/tabs/parameters/parametersSelectors.js", () => ({
85
+ selectSmartPersistedTabsParameters: () => selectors.dashboardParametersByTab,
65
86
  }));
66
87
  vi.mock("../../../../model/store/permissions/permissionsSelectors.js", () => ({
67
88
  selectCanCreateAutomation: () => true,
@@ -69,29 +90,29 @@ vi.mock("../../../../model/store/permissions/permissionsSelectors.js", () => ({
69
90
  selectCanUseAiAssistant: () => false,
70
91
  }));
71
92
  vi.mock("../../../../model/store/user/userSelectors.js", () => ({
72
- selectCurrentUser: () => ({ login: "test@example.com", ref: { identifier: "test" } }),
93
+ selectCurrentUser: () => selectors.currentUser,
73
94
  }));
74
95
  vi.mock("../../../../model/store/filtering/dashboardFilterSelectors.js", () => ({
75
- selectAutomationAvailableDashboardFilters: () => [],
96
+ selectAutomationAvailableDashboardFilters: () => selectors.emptyArray,
76
97
  selectAutomationCommonDateFilterId: () => undefined,
77
- selectAutomationDefaultSelectedFilters: () => [],
78
- selectAutomationFiltersByTab: () => [],
79
- selectDashboardFiltersWithoutCrossFiltering: () => [],
80
- selectDashboardHiddenFilters: () => [],
81
- selectDashboardLockedFilters: () => [],
98
+ selectAutomationDefaultSelectedFilters: () => selectors.emptyArray,
99
+ selectAutomationFiltersByTab: () => selectors.emptyArray,
100
+ selectDashboardFiltersWithoutCrossFiltering: () => selectors.emptyArray,
101
+ selectDashboardHiddenFilters: () => selectors.emptyArray,
102
+ selectDashboardLockedFilters: () => selectors.emptyArray,
82
103
  }));
83
104
  vi.mock("../../../../model/store/meta/metaSelectors.js", () => ({
84
105
  selectPersistedDashboardFilterContextDateFilterConfig: () => undefined,
85
106
  }));
86
107
  vi.mock("../../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js", () => ({
87
- selectAttributeFilterConfigsOverrides: () => [],
88
- selectAttributeFilterConfigsOverridesByTab: () => ({}),
89
- selectAttributeFilterConfigsSelectionTypeMap: () => new Map(),
90
- selectAttributeFilterConfigsSelectionTypeMapByTab: () => ({}),
91
- selectEffectiveAttributeFiltersModeMap: () => new Map(),
108
+ selectAttributeFilterConfigsOverrides: () => selectors.emptyArray,
109
+ selectAttributeFilterConfigsOverridesByTab: () => selectors.emptyRecord,
110
+ selectAttributeFilterConfigsSelectionTypeMap: () => selectors.emptyMap,
111
+ selectAttributeFilterConfigsSelectionTypeMapByTab: () => selectors.emptyRecord,
112
+ selectEffectiveAttributeFiltersModeMap: () => selectors.emptyMap,
92
113
  }));
93
114
  vi.mock("../../../../model/store/tabs/dateFilterConfig/dateFilterConfigSelectors.js", () => ({
94
- selectDateFilterConfigOverridesByTab: () => ({}),
115
+ selectDateFilterConfigOverridesByTab: () => selectors.emptyRecord,
95
116
  selectEffectiveDateFilterAvailableGranularities: () => selectors.availableGranularities,
96
117
  selectEffectiveDateFilterGranularitiesPerTab: () => selectors.granularitiesPerTab,
97
118
  selectEffectiveDateFilterMode: () => "active",
@@ -99,12 +120,12 @@ vi.mock("../../../../model/store/tabs/dateFilterConfig/dateFilterConfigSelectors
99
120
  selectEffectiveDateFilterOptionsPerTab: () => selectors.optionsPerTab,
100
121
  }));
101
122
  vi.mock("../../../../model/store/tabs/dateFilterConfigs/dateFilterConfigsSelectors.js", () => ({
102
- selectDateFilterConfigsOverrides: () => [],
103
- selectDateFilterConfigsOverridesByTab: () => ({}),
104
- selectEffectiveDateFiltersModeMap: () => new Map(),
123
+ selectDateFilterConfigsOverrides: () => selectors.emptyArray,
124
+ selectDateFilterConfigsOverridesByTab: () => selectors.emptyRecord,
125
+ selectEffectiveDateFiltersModeMap: () => selectors.emptyMap,
105
126
  }));
106
127
  vi.mock("../../../../model/store/tabs/filterContext/filterContextSelectors.js", () => ({
107
- selectAttributeFilterDisplayFormsMap: () => new Map(),
128
+ selectAttributeFilterDisplayFormsMap: () => selectors.emptyMap,
108
129
  }));
109
130
  vi.mock("../../../../model/store/entitlements/entitlementsSelectors.js", () => ({
110
131
  selectMaxAutomationRecipients: () => 10,
@@ -115,11 +136,12 @@ vi.mock("../../../../model/store/ui/uiSelectors.js", () => ({
115
136
  selectScheduleEmailDialogReturnFocusTo: () => undefined,
116
137
  }));
117
138
  vi.mock("../../../../model/store/tabs/measureValueFilterConfigs/measureValueFilterConfigsSelectors.js", () => ({
118
- selectMeasureValueFilterConfigsOverrides: () => [],
119
- selectMeasureValueFilterConfigsOverridesByTab: () => ({}),
139
+ selectMeasureValueFilterConfigsOverrides: () => selectors.emptyArray,
140
+ selectMeasureValueFilterConfigsOverridesByTab: () => selectors.emptyRecord,
120
141
  }));
121
142
  vi.mock("../../../../model/store/tabs/layout/layoutSelectors.js", () => ({
122
- selectWidgetsMap: () => ({ get: () => undefined }),
143
+ selectWidgetsMap: () => selectors.widgetsMap,
144
+ selectWidgetLocalIdToTabIdMap: () => selectors.widgetTabMap,
123
145
  }));
124
146
  import { useBuildAutomationsContext } from "./useBuildAutomationsContext.js";
125
147
  describe("useBuildAutomationsContext", () => {
@@ -134,3 +156,30 @@ describe("useBuildAutomationsContext", () => {
134
156
  expect(result.current.features.canCreateAutomation).toBe(true);
135
157
  });
136
158
  });
159
+ describe("useBuildAutomationsContext — parameter data", () => {
160
+ it("exposes the dashboard-global parameter data the shared automationFilters hooks need", () => {
161
+ const { result } = renderHook(() => useBuildAutomationsContext());
162
+ expect(result.current.parameters).toEqual({
163
+ enabled: true,
164
+ stringParametersEnabled: true,
165
+ catalog: selectors.parameterCatalog,
166
+ catalogIsLoaded: true,
167
+ dashboardParametersByTab: selectors.dashboardParametersByTab,
168
+ });
169
+ expect(result.current.tabIds).toEqual(["tab1"]);
170
+ expect(result.current.widgetLocalIdToTabIdMap).toBe(selectors.widgetTabMap);
171
+ });
172
+ });
173
+ describe("useBuildAutomationsContext — referential stability", () => {
174
+ it("returns a referentially identical context value when re-rendered with unchanged store state", () => {
175
+ const { result, rerender } = renderHook(() => useBuildAutomationsContext());
176
+ const first = result.current;
177
+ rerender();
178
+ // The whole context value, not just its members: an unmemoized `tabIds` or `parameters`
179
+ // would land in the top-level useMemo's dependency array and change this identity on
180
+ // every render, re-rendering every consumer in both dialog trees.
181
+ expect(result.current).toBe(first);
182
+ expect(result.current.tabIds).toBe(first.tabIds);
183
+ expect(result.current.parameters).toBe(first.parameters);
184
+ });
185
+ });
@@ -1,12 +1,9 @@
1
- import { type FilterContextItem, type IAutomationMetadataObject, type IInsight, type INotificationChannelIdentifier, type INotificationChannelMetadataObject, type IWidget, type IWorkspaceUser } from "@gooddata/sdk-model";
2
- import type { GoodDataSdkError } from "@gooddata/sdk-ui";
1
+ import { type FilterContextItem, type IAutomationMetadataObject, type IInsight, type INotificationChannelIdentifier, type INotificationChannelMetadataObject, type IWidget } from "@gooddata/sdk-model";
3
2
  import type { IScheduledEmailDialogContextValue } from "../../contexts/ScheduledEmailDialogContext.js";
4
3
  export interface IUseBuildScheduledEmailDialogContextOpts {
5
4
  widget?: IWidget;
6
5
  insight?: IInsight;
7
6
  scheduledExportToEdit?: IAutomationMetadataObject;
8
- users: IWorkspaceUser[];
9
- usersError?: GoodDataSdkError;
10
7
  notificationChannels: INotificationChannelIdentifier[] | INotificationChannelMetadataObject[];
11
8
  isLoading: boolean;
12
9
  dashboardFilters?: FilterContextItem[];
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildScheduledEmailDialogContext.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/connectors/hooks/useBuildScheduledEmailDialogContext.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,QAAQ,EACb,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,OAAO,EACZ,KAAK,cAAc,EAEtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAuBzD,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,+CAA+C,CAAC;AAIvG,MAAM,WAAW,wCAAwC;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,oBAAoB,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAC9F,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AAED,wBAAgB,mCAAmC,CAC/C,IAAI,EAAE,wCAAwC,GAC/C,iCAAiC,CA2GnC"}
1
+ {"version":3,"file":"useBuildScheduledEmailDialogContext.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/connectors/hooks/useBuildScheduledEmailDialogContext.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,QAAQ,EACb,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,OAAO,EAEf,MAAM,qBAAqB,CAAC;AAqB7B,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,+CAA+C,CAAC;AAIvG,MAAM,WAAW,wCAAwC;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,oBAAoB,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAC9F,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC1C;AAED,wBAAgB,mCAAmC,CAC/C,IAAI,EAAE,wCAAwC,GAC/C,iCAAiC,CAwFnC"}
@@ -11,24 +11,19 @@ import { selectDashboardId, selectDashboardTitle } from "../../../../model/store
11
11
  import { selectEffectiveAttributeFiltersModeMap } from "../../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
12
12
  import { selectEffectiveDateFilterMode } from "../../../../model/store/tabs/dateFilterConfig/dateFilterConfigSelectors.js";
13
13
  import { selectEffectiveDateFiltersModeMap } from "../../../../model/store/tabs/dateFilterConfigs/dateFilterConfigsSelectors.js";
14
- import { selectWidgetLocalIdToTabIdMap } from "../../../../model/store/tabs/layout/layoutSelectors.js";
15
14
  import { selectExportEffectiveParameters } from "../../../../model/store/tabs/parameters/parametersSelectors.js";
16
- import { selectTabs } from "../../../../model/store/tabs/tabsSelectors.js";
17
15
  import { getWidgetTitle } from "../../../../model/utils/dashboardItemUtils.js";
18
16
  import { useCommandAsPromise, useDeleteAutomation } from "./useCommandAsPromise.js";
19
17
  export function useBuildScheduledEmailDialogContext(opts) {
20
- const { widget, insight, scheduledExportToEdit, users, usersError, notificationChannels, isLoading, dashboardFilters, } = opts;
18
+ const { widget, insight, scheduledExportToEdit, notificationChannels, isLoading, dashboardFilters } = opts;
21
19
  const hiddenFilters = useDashboardSelector(selectDashboardHiddenFilters);
22
20
  const dashboardId = useDashboardSelector(selectDashboardId);
23
21
  const dashboardTitle = useDashboardSelector(selectDashboardTitle);
24
- const widgetLocalIdToTabIdMap = useDashboardSelector(selectWidgetLocalIdToTabIdMap);
25
22
  const commonDateFilterId = useDashboardSelector(selectAutomationCommonDateFilterId);
26
23
  const exportParametersByTab = useDashboardSelector(selectExportEffectiveParameters(widget ? [objRefToString(widget.ref)] : undefined));
27
24
  const exportTemplates = useExportTemplates();
28
25
  const dateFormat = useDashboardSelector(selectDateFormat);
29
26
  const isCrossFiltering = useDashboardSelector(selectIsCrossFiltering);
30
- const tabs = useDashboardSelector(selectTabs);
31
- const hasMultipleTabs = (tabs?.length ?? 0) > 1;
32
27
  const commonDateFilterMode = useDashboardSelector(selectEffectiveDateFilterMode);
33
28
  const dateFiltersModeMap = useDashboardSelector(selectEffectiveDateFiltersModeMap);
34
29
  const attributeFiltersModeMap = useDashboardSelector(selectEffectiveAttributeFiltersModeMap);
@@ -57,13 +52,11 @@ export function useBuildScheduledEmailDialogContext(opts) {
57
52
  dashboardTitle,
58
53
  dashboardFilters,
59
54
  hiddenFilters,
60
- widgetLocalIdToTabIdMap,
61
55
  commonDateFilterId,
62
56
  exportParametersByTab,
63
57
  exportTemplates,
64
58
  dateFormat,
65
59
  isCrossFiltering,
66
- hasMultipleTabs,
67
60
  commonDateFilterMode,
68
61
  dateFiltersModeMap,
69
62
  attributeFiltersModeMap,
@@ -71,8 +64,6 @@ export function useBuildScheduledEmailDialogContext(opts) {
71
64
  saveScheduledEmail,
72
65
  deleteScheduledEmail,
73
66
  scheduledExportToEdit,
74
- users,
75
- usersError,
76
67
  notificationChannels,
77
68
  isLoading,
78
69
  }), [
@@ -83,13 +74,11 @@ export function useBuildScheduledEmailDialogContext(opts) {
83
74
  dashboardTitle,
84
75
  dashboardFilters,
85
76
  hiddenFilters,
86
- widgetLocalIdToTabIdMap,
87
77
  commonDateFilterId,
88
78
  exportParametersByTab,
89
79
  exportTemplates,
90
80
  dateFormat,
91
81
  isCrossFiltering,
92
- hasMultipleTabs,
93
82
  commonDateFilterMode,
94
83
  dateFiltersModeMap,
95
84
  attributeFiltersModeMap,
@@ -97,8 +86,6 @@ export function useBuildScheduledEmailDialogContext(opts) {
97
86
  saveScheduledEmail,
98
87
  deleteScheduledEmail,
99
88
  scheduledExportToEdit,
100
- users,
101
- usersError,
102
89
  notificationChannels,
103
90
  isLoading,
104
91
  ]);
@@ -43,9 +43,6 @@ vi.mock("../../../../model/store/config/configSelectors.js", () => ({
43
43
  vi.mock("../../../../model/store/drill/drillSelectors.js", () => ({
44
44
  selectIsCrossFiltering: () => false,
45
45
  }));
46
- vi.mock("../../../../model/store/tabs/layout/layoutSelectors.js", () => ({
47
- selectWidgetLocalIdToTabIdMap: () => ({ widgetId: "tab-1" }),
48
- }));
49
46
  vi.mock("../../../../model/store/tabs/dateFilterConfig/dateFilterConfigSelectors.js", () => ({
50
47
  selectEffectiveDateFilterMode: () => "active",
51
48
  }));
@@ -79,10 +76,9 @@ import { useBuildScheduledEmailDialogContext, } from "./useBuildScheduledEmailDi
79
76
  // ---------------------------------------------------------------------------
80
77
  // Tests
81
78
  // ---------------------------------------------------------------------------
82
- // The builder's create/edit inputs (users, notificationChannels, isLoading) are required options;
79
+ // The builder's create/edit inputs (notificationChannels, isLoading) are required options;
83
80
  // tests that don't care about them use this minimal, valid base and override what they need.
84
81
  const BASE_OPTS = {
85
- users: [],
86
82
  notificationChannels: [],
87
83
  isLoading: false,
88
84
  };
@@ -94,23 +90,17 @@ describe("useBuildScheduledEmailDialogContext", () => {
94
90
  });
95
91
  it("passes the create/edit inputs through and carries the effective dashboard filters", () => {
96
92
  const scheduledExportToEdit = { id: "schedule-1", title: "Weekly" };
97
- const users = [
98
- { ref: idRef("user-1"), uri: "/users/user-1", login: "user-1", email: "user-1@example.com" },
99
- ];
100
93
  const notificationChannels = [
101
94
  { id: "channel-1", type: "notificationChannel" },
102
95
  ];
103
96
  const dashboardFilters = [];
104
97
  const { result } = renderHook(() => useBuildScheduledEmailDialogContext({
105
98
  scheduledExportToEdit,
106
- users,
107
- usersError: undefined,
108
99
  notificationChannels,
109
100
  isLoading: true,
110
101
  dashboardFilters,
111
102
  }));
112
103
  expect(result.current.scheduledExportToEdit).toBe(scheduledExportToEdit);
113
- expect(result.current.users).toBe(users);
114
104
  expect(result.current.notificationChannels).toBe(notificationChannels);
115
105
  expect(result.current.isLoading).toBe(true);
116
106
  // the connector computes `saved ?? getAppliedDashboardFilters(...)` and passes the result in;
@@ -1,6 +1,5 @@
1
1
  import type { IExecutionResult } from "@gooddata/sdk-backend-spi";
2
- import type { FilterContextItem, IAutomationMetadataObject, IAutomationMetadataObjectDefinition, IInsight, IInsightParameterValue, INotificationChannelIdentifier, INotificationChannelMetadataObject, IWidget, IWorkspaceUser, ObjRef } from "@gooddata/sdk-model";
3
- import type { GoodDataSdkError } from "@gooddata/sdk-ui";
2
+ import type { FilterContextItem, IAutomationMetadataObject, IAutomationMetadataObjectDefinition, IDashboardParameter, IInsight, IInsightParameterValue, INotificationChannelIdentifier, INotificationChannelMetadataObject, IWidget, ObjRef } from "@gooddata/sdk-model";
4
3
  /**
5
4
  * Sub-context for the alerting create/edit dialog.
6
5
  *
@@ -18,12 +17,17 @@ export interface IAlertingDialogContextValue {
18
17
  dashboardId?: string;
19
18
  dashboardFilters: FilterContextItem[];
20
19
  hiddenFilters: FilterContextItem[];
21
- widgetLocalIdToTabIdMap: Record<string, string>;
22
20
  executionResultByRef: (ref: ObjRef | undefined) => {
23
21
  executionResult?: IExecutionResult;
24
22
  } | undefined;
25
23
  /** Effective widget parameter values for the dialog's widget (replaces direct selectEffectiveParameterValuesForWidget read) */
26
24
  parameterValues: IInsightParameterValue[];
25
+ /**
26
+ * Effective dashboard parameters for the dialog's widget — the owning tab's parameters with any
27
+ * runtime override folded in (replaces the direct selectEffectiveDashboardParametersForWidget
28
+ * read in useAutomationAlertParameters).
29
+ */
30
+ dashboardParameters: IDashboardParameter[];
27
31
  commonDateFilterId?: string;
28
32
  dashboardEvaluationFrequency?: string;
29
33
  createAlert(alert: IAutomationMetadataObjectDefinition): Promise<IAutomationMetadataObject>;
@@ -31,16 +35,9 @@ export interface IAlertingDialogContextValue {
31
35
  deleteAlert(alert: IAutomationMetadataObject): Promise<void>;
32
36
  /** The alert being edited; undefined when creating a new one. */
33
37
  alertToEdit?: IAutomationMetadataObject;
34
- /**
35
- * Workspace users available as alert recipients. Loaded only while the create/edit dialog is
36
- * mounted, so opening the management dialog alone does not trigger the load.
37
- */
38
- users: IWorkspaceUser[];
39
- /** Error from loading workspace users, if any. */
40
- usersError?: GoodDataSdkError;
41
38
  /** Notification channels available as alert destinations. */
42
39
  notificationChannels: INotificationChannelIdentifier[] | INotificationChannelMetadataObject[];
43
- /** True while the dialog's initial data (automations, workspace users) is still loading. */
40
+ /** True while the dialog's initial data (automations) is still loading. */
44
41
  isLoading: boolean;
45
42
  }
46
43
  export declare const AlertingDialogContextProvider: import("react").Provider<IAlertingDialogContextValue | undefined>;
@@ -49,10 +46,10 @@ export declare const AlertingDialogContextProvider: import("react").Provider<IAl
49
46
  *
50
47
  * A replacement for `AlertingDialogComponent` renders inside this context and reads the dialog's widget
51
48
  * and insight, the dashboard filter context it should apply, the alert being edited, the available
52
- * workspace users and notification channels, and the create/save/delete callbacks from here.
49
+ * notification channels, and the create/save/delete callbacks from here.
53
50
  *
54
- * Some members exist to wire internal machinery (`executionResultByRef`, `widgetLocalIdToTabIdMap`,
55
- * `parameterValues`) and are not intended as a customization surface.
51
+ * Some members exist to wire internal machinery (`executionResultByRef`, `parameterValues`,
52
+ * `dashboardParameters`) and are not intended as a customization surface.
56
53
  *
57
54
  * @alpha
58
55
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AlertingDialogContext.d.ts","sourceRoot":"","sources":["../../../../src/presentation/automations/contexts/AlertingDialogContext.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EACR,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,EACnC,QAAQ,EACR,sBAAsB,EACtB,8BAA8B,EAC9B,kCAAkC,EAClC,OAAO,EACP,cAAc,EACd,MAAM,EACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD;;;;;;;;GAQG;AACH,MAAM,WAAW,2BAA2B;IACxC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,oBAAoB,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK;QAAE,eAAe,CAAC,EAAE,gBAAgB,CAAA;KAAE,GAAG,SAAS,CAAC;IACtG,+HAA+H;IAC/H,eAAe,EAAE,sBAAsB,EAAE,CAAC;IAC1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,WAAW,CAAC,KAAK,EAAE,mCAAmC,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC5F,SAAS,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAChF,WAAW,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,iEAAiE;IACjE,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC;;;OAGG;IACH,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,kDAAkD;IAClD,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,6DAA6D;IAC7D,oBAAoB,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAC9F,4FAA4F;IAC5F,SAAS,EAAE,OAAO,CAAC;CACtB;AAID,eAAO,MAAM,6BAA6B,mEAAiC,CAAC;AAE5E;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,2BAA2B,CAMtE"}
1
+ {"version":3,"file":"AlertingDialogContext.d.ts","sourceRoot":"","sources":["../../../../src/presentation/automations/contexts/AlertingDialogContext.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EACR,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,EACnC,mBAAmB,EACnB,QAAQ,EACR,sBAAsB,EACtB,8BAA8B,EAC9B,kCAAkC,EAClC,OAAO,EACP,MAAM,EACT,MAAM,qBAAqB,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,WAAW,2BAA2B;IACxC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,oBAAoB,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,KAAK;QAAE,eAAe,CAAC,EAAE,gBAAgB,CAAA;KAAE,GAAG,SAAS,CAAC;IACtG,+HAA+H;IAC/H,eAAe,EAAE,sBAAsB,EAAE,CAAC;IAC1C;;;;OAIG;IACH,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,WAAW,CAAC,KAAK,EAAE,mCAAmC,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC5F,SAAS,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAChF,WAAW,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,iEAAiE;IACjE,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,6DAA6D;IAC7D,oBAAoB,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAC9F,2EAA2E;IAC3E,SAAS,EAAE,OAAO,CAAC;CACtB;AAID,eAAO,MAAM,6BAA6B,mEAAiC,CAAC;AAE5E;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,IAAI,2BAA2B,CAMtE"}
@@ -7,10 +7,10 @@ export const AlertingDialogContextProvider = AlertingDialogContext.Provider;
7
7
  *
8
8
  * A replacement for `AlertingDialogComponent` renders inside this context and reads the dialog's widget
9
9
  * and insight, the dashboard filter context it should apply, the alert being edited, the available
10
- * workspace users and notification channels, and the create/save/delete callbacks from here.
10
+ * notification channels, and the create/save/delete callbacks from here.
11
11
  *
12
- * Some members exist to wire internal machinery (`executionResultByRef`, `widgetLocalIdToTabIdMap`,
13
- * `parameterValues`) and are not intended as a customization surface.
12
+ * Some members exist to wire internal machinery (`executionResultByRef`, `parameterValues`,
13
+ * `dashboardParameters`) and are not intended as a customization surface.
14
14
  *
15
15
  * @alpha
16
16
  */
@@ -1,4 +1,4 @@
1
- import type { DashboardAttributeFilterSelectionType, DateFilterGranularity, FilterContextItem, IAttributeDisplayFormMetadataObject, ICatalogAttribute, ICatalogDateAttribute, ICatalogDateDataset, ICatalogMeasure, IDashboardAttributeFilterConfig, IDashboardDateFilterConfig, IDashboardDateFilterConfigItem, IDashboardMeasureValueFilterConfig, ISeparators, ISettings, IUser, ObjRef, WeekStart } from "@gooddata/sdk-model";
1
+ import type { DashboardAttributeFilterSelectionType, DateFilterGranularity, FilterContextItem, IAttributeDisplayFormMetadataObject, ICatalogAttribute, ICatalogDateAttribute, ICatalogDateDataset, ICatalogMeasure, IDashboardAttributeFilterConfig, IDashboardDateFilterConfig, IDashboardDateFilterConfigItem, IDashboardMeasureValueFilterConfig, IDashboardParameter, IParameterMetadataObject, ISeparators, ISettings, IUser, ObjRef, WeekStart } from "@gooddata/sdk-model";
2
2
  import type { ILocale } from "@gooddata/sdk-ui";
3
3
  import type { IDateFilterOptionsByType } from "@gooddata/sdk-ui-filters";
4
4
  import type { IAutomationFiltersTab } from "../../../model/store/filtering/types.js";
@@ -14,6 +14,27 @@ export interface IAutomationsDateFilterConfig {
14
14
  getGranularitiesForTab: (tabId: string) => DateFilterGranularity[];
15
15
  getOptionsForTab: (tabId: string) => IDateFilterOptionsByType | undefined;
16
16
  }
17
+ /**
18
+ * Workspace and dashboard parameter data provided by the dashboard connector so that the shared
19
+ * automationFilters hooks do not need to read dashboard selectors directly.
20
+ *
21
+ * @alpha
22
+ */
23
+ export interface IAutomationsParameters {
24
+ /** Whether the parameters feature is enabled; from selectEnableParameters. */
25
+ enabled: boolean;
26
+ /** Whether STRING-typed parameters are enabled; from selectEnableStringParameters. */
27
+ stringParametersEnabled: boolean;
28
+ /** The workspace parameter catalog; from selectCatalogParameters. */
29
+ catalog: IParameterMetadataObject[];
30
+ /**
31
+ * Whether the parameter catalog has finished loading. Before it has, every stored parameter
32
+ * ref looks removed, so staleness checks must treat loading as not-stale.
33
+ */
34
+ catalogIsLoaded: boolean;
35
+ /** Effective dashboard parameter values keyed by tab; from selectSmartPersistedTabsParameters. */
36
+ dashboardParametersByTab: Record<string, IDashboardParameter[]>;
37
+ }
17
38
  /**
18
39
  * Main context shared across all automation dialogs.
19
40
  * Only fields actively consumed by migrated leaves are listed here — add fields as each leaf migrates.
@@ -63,6 +84,15 @@ export interface IAutomationsContextValue {
63
84
  enableSlideshowExports: boolean;
64
85
  enableAutomationEvaluationMode: boolean;
65
86
  };
87
+ parameters: IAutomationsParameters;
88
+ /**
89
+ * Local identifiers of the dashboard's tabs, in layout order; empty when the dashboard has none.
90
+ * Narrowed from selectTabs (`ITabState[] | undefined`) because every consumer only ever reads
91
+ * `localIdentifier`, and all of them already coalesce `undefined` to `[]`.
92
+ */
93
+ tabIds: string[];
94
+ /** Maps a widget's localIdentifier to the localIdentifier of the tab that owns it. */
95
+ widgetLocalIdToTabIdMap: Record<string, string>;
66
96
  getCatalogAttributeByRef: (ref: ObjRef) => ICatalogAttribute | ICatalogDateAttribute | undefined;
67
97
  getAttributeFilterDisplayForm: (displayForm: ObjRef) => IAttributeDisplayFormMetadataObject | undefined;
68
98
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AutomationsContext.d.ts","sourceRoot":"","sources":["../../../../src/presentation/automations/contexts/AutomationsContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AutomationsContext.d.ts","sourceRoot":"","sources":["../../../../src/presentation/automations/contexts/AutomationsContext.ts"],"names":[],"mappings":"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"}