@gooddata/sdk-ui-dashboard 11.51.0-alpha.3 → 11.51.0-alpha.5

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 (191) 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/index.d.ts +3 -1
  5. package/esm/index.d.ts.map +1 -1
  6. package/esm/index.js +3 -1
  7. package/esm/model/commandHandlers/index.d.ts.map +1 -1
  8. package/esm/model/commandHandlers/index.js +2 -0
  9. package/esm/model/commandHandlers/timezone/changeDashboardTimezoneOverrideHandler.d.ts +6 -0
  10. package/esm/model/commandHandlers/timezone/changeDashboardTimezoneOverrideHandler.d.ts.map +1 -0
  11. package/esm/model/commandHandlers/timezone/changeDashboardTimezoneOverrideHandler.js +39 -0
  12. package/esm/model/commands/base.d.ts +1 -1
  13. package/esm/model/commands/base.d.ts.map +1 -1
  14. package/esm/model/commands/index.d.ts +2 -1
  15. package/esm/model/commands/index.d.ts.map +1 -1
  16. package/esm/model/commands/timezone.d.ts +42 -0
  17. package/esm/model/commands/timezone.d.ts.map +1 -0
  18. package/esm/model/commands/timezone.js +29 -0
  19. package/esm/model/events/base.d.ts +1 -1
  20. package/esm/model/events/base.d.ts.map +1 -1
  21. package/esm/model/events/index.d.ts +2 -1
  22. package/esm/model/events/index.d.ts.map +1 -1
  23. package/esm/model/events/timezone.d.ts +50 -0
  24. package/esm/model/events/timezone.d.ts.map +1 -0
  25. package/esm/model/events/timezone.js +31 -0
  26. package/esm/model/react/useDashboardCommand.d.ts +1 -0
  27. package/esm/model/react/useDashboardCommand.d.ts.map +1 -1
  28. package/esm/model/react/useDashboardCommandProcessing.d.ts +4 -0
  29. package/esm/model/react/useDashboardCommandProcessing.d.ts.map +1 -1
  30. package/esm/model/store/meta/metaSelectors.d.ts +6 -4
  31. package/esm/model/store/meta/metaSelectors.d.ts.map +1 -1
  32. package/esm/model/store/meta/metaSelectors.js +17 -6
  33. package/esm/model/store/ui/index.d.ts +3 -0
  34. package/esm/model/store/ui/index.d.ts.map +1 -1
  35. package/esm/model/store/ui/uiReducers.d.ts +6 -0
  36. package/esm/model/store/ui/uiReducers.d.ts.map +1 -1
  37. package/esm/model/store/ui/uiReducers.js +15 -0
  38. package/esm/model/store/ui/uiSelectors.d.ts +15 -0
  39. package/esm/model/store/ui/uiSelectors.d.ts.map +1 -1
  40. package/esm/model/store/ui/uiSelectors.js +15 -0
  41. package/esm/model/store/ui/uiState.d.ts +12 -0
  42. package/esm/model/store/ui/uiState.d.ts.map +1 -1
  43. package/esm/model/store/ui/uiState.js +4 -0
  44. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts.map +1 -1
  45. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.js +4 -23
  46. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFilters.d.ts +17 -8
  47. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFilters.d.ts.map +1 -1
  48. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFilters.js +20 -8
  49. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFormState.js +1 -1
  50. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useEditAlert.d.ts +7 -8
  51. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useEditAlert.d.ts.map +1 -1
  52. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useEditAlert.js +14 -4
  53. package/esm/presentation/automations/connectors/ScheduledEmailConnector.js +1 -1
  54. package/esm/presentation/automations/connectors/ScheduledEmailConnector.test.js +1 -1
  55. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts.map +1 -1
  56. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +4 -44
  57. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts +25 -26
  58. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts.map +1 -1
  59. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.js +20 -9
  60. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.js +1 -1
  61. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.d.ts +37 -15
  62. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.d.ts.map +1 -1
  63. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.js +42 -20
  64. package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.js +1 -1
  65. package/esm/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.d.ts.map +1 -1
  66. package/esm/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.js +2 -1
  67. package/esm/presentation/automations/shared/automationFilters/utils.d.ts +1 -32
  68. package/esm/presentation/automations/shared/automationFilters/utils.d.ts.map +1 -1
  69. package/esm/presentation/automations/shared/automationFilters/utils.js +2 -177
  70. package/esm/presentation/automations/shared/filters/conversions.d.ts +36 -0
  71. package/esm/presentation/automations/shared/filters/conversions.d.ts.map +1 -0
  72. package/esm/presentation/automations/shared/filters/conversions.js +242 -0
  73. package/esm/presentation/automations/shared/filters/index.d.ts +2 -0
  74. package/esm/presentation/automations/shared/filters/index.d.ts.map +1 -0
  75. package/esm/presentation/automations/shared/filters/index.js +3 -0
  76. package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.d.ts.map +1 -1
  77. package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.js +2 -1
  78. package/esm/presentation/dashboard/DashboardHeader/TimezoneDialogProvider.d.ts +6 -0
  79. package/esm/presentation/dashboard/DashboardHeader/TimezoneDialogProvider.d.ts.map +1 -0
  80. package/esm/presentation/dashboard/DashboardHeader/TimezoneDialogProvider.js +14 -0
  81. package/esm/presentation/dashboard/components/DashboardLoading.js +1 -1
  82. package/esm/presentation/dashboardSettingsDialog/TimezoneOption.d.ts.map +1 -1
  83. package/esm/presentation/dashboardSettingsDialog/TimezoneOption.js +9 -7
  84. package/esm/presentation/drill/DrillSelect/DrillSelectDropdownMenuItem.js +2 -2
  85. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts +11 -0
  86. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
  87. package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +13 -2
  88. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +11 -0
  89. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
  90. package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +13 -2
  91. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +11 -0
  92. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
  93. package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +13 -2
  94. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +40 -0
  95. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  96. package/esm/presentation/localization/bundles/en-US.localization-bundle.js +45 -5
  97. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +11 -0
  98. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
  99. package/esm/presentation/localization/bundles/es-419.localization-bundle.js +13 -2
  100. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +11 -0
  101. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
  102. package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +13 -2
  103. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +11 -0
  104. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
  105. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +13 -2
  106. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +11 -0
  107. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
  108. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +13 -2
  109. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +11 -0
  110. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
  111. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +13 -2
  112. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +11 -0
  113. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
  114. package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +13 -2
  115. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +11 -0
  116. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
  117. package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +13 -2
  118. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +11 -0
  119. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
  120. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +13 -2
  121. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +11 -0
  122. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
  123. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +13 -2
  124. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +11 -0
  125. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
  126. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +13 -2
  127. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +11 -0
  128. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
  129. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +13 -2
  130. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +11 -0
  131. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
  132. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +13 -2
  133. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +11 -0
  134. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
  135. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +13 -2
  136. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +11 -0
  137. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
  138. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +13 -2
  139. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +11 -0
  140. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
  141. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +13 -2
  142. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +11 -0
  143. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
  144. package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +13 -2
  145. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +11 -0
  146. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
  147. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +13 -2
  148. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +11 -0
  149. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
  150. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +13 -2
  151. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +11 -0
  152. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
  153. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +13 -2
  154. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +11 -0
  155. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
  156. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +13 -2
  157. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +11 -0
  158. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
  159. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +13 -2
  160. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +11 -0
  161. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
  162. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +13 -2
  163. package/esm/presentation/timezoneDialog/TimezoneDialog.d.ts +15 -0
  164. package/esm/presentation/timezoneDialog/TimezoneDialog.d.ts.map +1 -0
  165. package/esm/presentation/timezoneDialog/TimezoneDialog.js +80 -0
  166. package/esm/presentation/topBar/menuButton/useDefaultMenuItems.d.ts.map +1 -1
  167. package/esm/presentation/topBar/menuButton/useDefaultMenuItems.js +22 -3
  168. package/esm/presentation/topBar/timezoneIndicator/TimezoneIndicator.d.ts.map +1 -1
  169. package/esm/presentation/topBar/timezoneIndicator/TimezoneIndicator.js +2 -2
  170. package/esm/presentation/topBar/timezoneIndicator/resolveDashboardTimezoneInfo.d.ts +5 -3
  171. package/esm/presentation/topBar/timezoneIndicator/resolveDashboardTimezoneInfo.d.ts.map +1 -1
  172. package/esm/presentation/topBar/timezoneIndicator/resolveDashboardTimezoneInfo.js +6 -4
  173. package/esm/presentation/topBar/topBar/DefaultTopBar.d.ts.map +1 -1
  174. package/esm/presentation/topBar/topBar/DefaultTopBar.js +5 -3
  175. package/esm/sdk-ui-dashboard.d.ts +140 -11
  176. package/package.json +21 -21
  177. package/styles/css/filterBar.css +1 -0
  178. package/styles/css/filterBar.css.map +1 -1
  179. package/styles/css/main.css +24 -0
  180. package/styles/css/main.css.map +1 -1
  181. package/styles/css/timezoneDialog.css +24 -0
  182. package/styles/css/timezoneDialog.css.map +1 -0
  183. package/styles/scss/filterBar.scss +7 -0
  184. package/styles/scss/main.scss +1 -0
  185. package/styles/scss/timezoneDialog.scss +31 -0
  186. package/esm/presentation/automations/scheduledEmail/utils/filters.d.ts +0 -3
  187. package/esm/presentation/automations/scheduledEmail/utils/filters.d.ts.map +0 -1
  188. package/esm/presentation/automations/scheduledEmail/utils/filters.js +0 -5
  189. package/esm/presentation/automations/shared/utils/filterContextUtils.d.ts +0 -4
  190. package/esm/presentation/automations/shared/utils/filterContextUtils.d.ts.map +0 -1
  191. package/esm/presentation/automations/shared/utils/filterContextUtils.js +0 -67
@@ -1,34 +1,56 @@
1
1
  import { type Dispatch, type SetStateAction } from "react";
2
- import { type FilterContextItem, type IAutomationMetadataObjectDefinition, type IAutomationVisibleFilter, type IInsight, type IWidget } from "@gooddata/sdk-model";
2
+ import { type FilterContextItem, type IAutomationMetadataObject, type IAutomationMetadataObjectDefinition, type IAutomationVisibleFilter, type IDashboardExportParameter, type IInsight, type IWidget } from "@gooddata/sdk-model";
3
3
  import type { IAutomationFiltersTab } from "../../../../../model/store/filtering/types.js";
4
+ import { type IUseAutomationExportParameters } from "../../../shared/automationFilters/useAutomationExportParameters.js";
4
5
  export interface IUseScheduledEmailFiltersProps {
5
6
  setEditedAutomation: Dispatch<SetStateAction<IAutomationMetadataObjectDefinition>>;
7
+ scheduledExportToEdit?: IAutomationMetadataObject;
6
8
  widget?: IWidget;
7
9
  insight?: IInsight;
10
+ editedAutomationFilters: FilterContextItem[];
8
11
  setEditedAutomationFilters: (filters: FilterContextItem[]) => void;
12
+ editedAutomationFiltersByTab?: Record<string, FilterContextItem[]>;
9
13
  setEditedAutomationFiltersByTab?: (filters: Record<string, FilterContextItem[]>) => void;
14
+ availableFilters?: FilterContextItem[];
10
15
  availableFiltersAsVisibleFilters?: IAutomationVisibleFilter[] | undefined;
11
16
  availableFiltersAsVisibleFiltersByTab?: Record<string, IAutomationVisibleFilter[]>;
12
- filtersDataByTab?: IAutomationFiltersTab[] | undefined;
13
- storeFilters?: boolean;
17
+ filtersByTab?: IAutomationFiltersTab[] | undefined;
18
+ storeFilters: boolean;
14
19
  setStoreFilters: (storeFilters: boolean) => void;
15
20
  filtersForNewAutomation: FilterContextItem[];
21
+ setParametersWire: (wire: Record<string, IDashboardExportParameter[]> | undefined) => void;
16
22
  }
17
23
  /**
18
- * Owns the scheduled-email dialog's filter changes. Each handler updates the edited filter state and
19
- * mirrors the result into the draft — rewriting the filters on its export definitions along with the
20
- * `metadata.visibleFilters`/`visibleFiltersByTab` used to render them back to the user.
21
- *
22
- * Runs after `useScheduledEmailFormState`, because every handler writes through `setEditedAutomation`.
23
- * The filter sets these handlers start from are derived earlier, in
24
- * {@link useScheduledEmailEffectiveFilters}.
24
+ * The scheduled-email dialog's single filter model: the current selection and available filters
25
+ * (flat and per-tab), the handlers that mutate them and mirror the result into the draft, the
26
+ * `automationIsValid`/`filtersAreStale` staleness gate for a saved schedule, and the absorbed
27
+ * export-parameters model (chips, add/change/delete handlers, apply-latest and store-toggle).
28
+ * `automationIsValid` gates the repair / apply-current-filters dialog: it is false whenever the
29
+ * saved filters no longer match the dashboard, or the saved parameters are stale, or both — it does
30
+ * not distinguish which. `filtersAreStale` reports only whether saved filters no longer match.
31
+ * Parameters live here — rather than in form-state, as on the alerting side — because they have no
32
+ * draft dependency of their own; they only need `storeFilters` (the read model) and `setParametersWire`
33
+ * (from {@link useScheduledEmailExportSettings}).
25
34
  *
26
35
  * @internal
27
36
  */
28
- export declare function useScheduledEmailFilters({ setEditedAutomation, widget, insight, setEditedAutomationFilters, setEditedAutomationFiltersByTab, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersDataByTab, storeFilters, setStoreFilters, filtersForNewAutomation }: IUseScheduledEmailFiltersProps): {
29
- onFiltersChange: (filters: FilterContextItem[], storeFiltersParam?: boolean | undefined) => void;
30
- onFiltersByTabChange: (newFiltersByTab: Record<string, FilterContextItem[]>, storeFiltersParam?: boolean | undefined) => void;
37
+ export declare function useScheduledEmailFilters({ setEditedAutomation, scheduledExportToEdit, widget, insight, editedAutomationFilters, setEditedAutomationFilters, editedAutomationFiltersByTab, setEditedAutomationFiltersByTab, availableFilters, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersByTab, storeFilters, setStoreFilters, filtersForNewAutomation, setParametersWire }: IUseScheduledEmailFiltersProps): IUseScheduledEmailFilters;
38
+ /**
39
+ * Return type of {@link useScheduledEmailFilters}: its own filter model plus the whole absorbed
40
+ * {@link useAutomationExportParameters} model, spread in verbatim so its member names stay canonical.
41
+ * @internal
42
+ */
43
+ export interface IUseScheduledEmailFilters extends IUseAutomationExportParameters {
44
+ selectedFilters: FilterContextItem[];
45
+ availableFilters: FilterContextItem[] | undefined;
46
+ storeFilters: boolean;
47
+ filtersByTab: IAutomationFiltersTab[] | undefined;
48
+ editedFiltersByTab: Record<string, FilterContextItem[]> | undefined;
49
+ onFiltersChange: (filters: FilterContextItem[], storeFiltersParam?: boolean) => void;
50
+ onFiltersByTabChange: (newFiltersByTab: Record<string, FilterContextItem[]>, storeFiltersParam?: boolean) => void;
31
51
  onApplyCurrentFilters: () => void;
32
- onStoreFiltersChange: (value: boolean, filters?: FilterContextItem[] | undefined, filtersByTabParam?: Record<string, FilterContextItem[]> | undefined) => void;
33
- };
52
+ onStoreFiltersChange: (value: boolean, filters?: FilterContextItem[], filtersByTabParam?: Record<string, FilterContextItem[]>) => void;
53
+ automationIsValid: boolean;
54
+ filtersAreStale: boolean;
55
+ }
34
56
  //# sourceMappingURL=useScheduledEmailFilters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useScheduledEmailFilters.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAe,MAAM,OAAO,CAAC;AAExE,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,mCAAmC,EACxC,KAAK,wBAAwB,EAC7B,KAAK,QAAQ,EACb,KAAK,OAAO,EAIf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AAU3F,MAAM,WAAW,8BAA8B;IAC3C,mBAAmB,EAAE,QAAQ,CAAC,cAAc,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,0BAA0B,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IACnE,+BAA+B,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,KAAK,IAAI,CAAC;IACzF,gCAAgC,CAAC,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IAC1E,qCAAqC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;IACnF,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;IACvD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,uBAAuB,EAAE,iBAAiB,EAAE,CAAC;CAChD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,EACrC,mBAAmB,EACnB,MAAM,EACN,OAAO,EACP,0BAA0B,EAC1B,+BAA+B,EAC/B,gCAAgC,EAChC,qCAAqC,EACrC,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,uBAAuB,EAC1B,EAAE,8BAA8B;;;;;EAqPhC"}
1
+ {"version":3,"file":"useScheduledEmailFilters.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.ts"],"names":[],"mappings":"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"}
@@ -2,20 +2,25 @@
2
2
  import { useCallback } from "react";
3
3
  import { isExportDefinitionDashboardRequestPayload, isExportDefinitionVisualizationObjectRequestPayload, isInsightWidget, } from "@gooddata/sdk-model";
4
4
  import { useScheduledEmailDialogContext } from "../../../contexts/ScheduledEmailDialogContext.js";
5
+ import { useValidateExistingAutomationFilters } from "../../../shared/automationFilters/hooks/useValidateExistingAutomationFilters.js";
6
+ import { useAutomationExportParameters, } from "../../../shared/automationFilters/useAutomationExportParameters.js";
5
7
  import { getDefaultSelectedFiltersFromFiltersByTab } from "../../../shared/automationFilters/useAutomationFiltersSelect.js";
6
- import { getAppliedDashboardFilters, getAppliedWidgetFilters, getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, } from "../../../shared/automationFilters/utils.js";
8
+ import { getAppliedDashboardFilters, getAppliedWidgetFilters, getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, } from "../../../shared/filters/index.js";
7
9
  /**
8
- * Owns the scheduled-email dialog's filter changes. Each handler updates the edited filter state and
9
- * mirrors the result into the draft — rewriting the filters on its export definitions along with the
10
- * `metadata.visibleFilters`/`visibleFiltersByTab` used to render them back to the user.
11
- *
12
- * Runs after `useScheduledEmailFormState`, because every handler writes through `setEditedAutomation`.
13
- * The filter sets these handlers start from are derived earlier, in
14
- * {@link useScheduledEmailEffectiveFilters}.
10
+ * The scheduled-email dialog's single filter model: the current selection and available filters
11
+ * (flat and per-tab), the handlers that mutate them and mirror the result into the draft, the
12
+ * `automationIsValid`/`filtersAreStale` staleness gate for a saved schedule, and the absorbed
13
+ * export-parameters model (chips, add/change/delete handlers, apply-latest and store-toggle).
14
+ * `automationIsValid` gates the repair / apply-current-filters dialog: it is false whenever the
15
+ * saved filters no longer match the dashboard, or the saved parameters are stale, or both — it does
16
+ * not distinguish which. `filtersAreStale` reports only whether saved filters no longer match.
17
+ * Parameters live here — rather than in form-state, as on the alerting side — because they have no
18
+ * draft dependency of their own; they only need `storeFilters` (the read model) and `setParametersWire`
19
+ * (from {@link useScheduledEmailExportSettings}).
15
20
  *
16
21
  * @internal
17
22
  */
18
- export function useScheduledEmailFilters({ setEditedAutomation, widget, insight, setEditedAutomationFilters, setEditedAutomationFiltersByTab, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersDataByTab, storeFilters, setStoreFilters, filtersForNewAutomation, }) {
23
+ export function useScheduledEmailFilters({ setEditedAutomation, scheduledExportToEdit, widget, insight, editedAutomationFilters, setEditedAutomationFilters, editedAutomationFiltersByTab, setEditedAutomationFiltersByTab, availableFilters, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersByTab, storeFilters, setStoreFilters, filtersForNewAutomation, setParametersWire, }) {
19
24
  const { hiddenFilters: dashboardHiddenFilters, commonDateFilterId } = useScheduledEmailDialogContext();
20
25
  // Re-derived locally (not passed as a prop) so that the `if (isWidget)` branch below narrows
21
26
  // `widget`/`insight` via TS's aliased-condition control-flow analysis — this requires the boolean
@@ -115,7 +120,7 @@ export function useScheduledEmailFilters({ setEditedAutomation, widget, insight,
115
120
  const shouldStoreFilters = storeFiltersParam ?? storeFilters;
116
121
  const newEffectiveFiltersByTab = shouldStoreFilters
117
122
  ? Object.entries(newFiltersByTab).reduce((acc, [tabId, filters]) => {
118
- const tabHiddenFilters = filtersDataByTab?.find((tab) => tab.tabId === tabId)?.hiddenFilters ?? [];
123
+ const tabHiddenFilters = filtersByTab?.find((tab) => tab.tabId === tabId)?.hiddenFilters ?? [];
119
124
  const appliedFilters = getAppliedDashboardFilters(filters ?? [], tabHiddenFilters, true);
120
125
  if (appliedFilters) {
121
126
  acc[tabId] = appliedFilters;
@@ -152,27 +157,35 @@ export function useScheduledEmailFilters({ setEditedAutomation, widget, insight,
152
157
  storeFilters,
153
158
  setEditedAutomation,
154
159
  availableFiltersAsVisibleFiltersByTab,
155
- filtersDataByTab,
160
+ filtersByTab,
156
161
  ]);
157
162
  const onApplyCurrentFilters = useCallback(() => {
158
163
  // Widget schedules should never use per-tab filters, only dashboard schedules can have tabs
159
164
  const filtersByTabForNewAutomation = widget
160
165
  ? undefined
161
- : getDefaultSelectedFiltersFromFiltersByTab(filtersDataByTab);
166
+ : getDefaultSelectedFiltersFromFiltersByTab(filtersByTab);
162
167
  if (filtersByTabForNewAutomation) {
163
168
  onFiltersByTabChange(filtersByTabForNewAutomation);
164
169
  }
165
170
  else {
166
171
  onFiltersChange(filtersForNewAutomation ?? [], widget ? true : storeFilters);
167
172
  }
168
- }, [
169
- filtersForNewAutomation,
170
- storeFilters,
171
- onFiltersChange,
172
- onFiltersByTabChange,
173
+ }, [filtersForNewAutomation, storeFilters, onFiltersChange, onFiltersByTabChange, widget, filtersByTab]);
174
+ const { isValid: automationIsValid, filtersAreStale = false } = useValidateExistingAutomationFilters({
175
+ automationToEdit: scheduledExportToEdit,
173
176
  widget,
174
- filtersDataByTab,
175
- ]);
177
+ insight,
178
+ });
179
+ const parameters = useAutomationExportParameters({
180
+ automationToEdit: scheduledExportToEdit,
181
+ widget,
182
+ storeParameters: storeFilters,
183
+ setParametersWire,
184
+ });
185
+ const { onStoreParametersChange } = parameters;
186
+ // The store-filters toggle gates parameter persistence as well, and this hook owns both sides of
187
+ // it, so no caller has to remember the parameters half. `value` is forwarded explicitly to every
188
+ // side because `storeFilters` still holds the old one at call time.
176
189
  const onStoreFiltersChange = useCallback((value, filters, filtersByTabParam) => {
177
190
  setStoreFilters(value);
178
191
  // If filtersByTab is provided, use onFiltersByTabChange, otherwise use onFiltersChange
@@ -184,11 +197,20 @@ export function useScheduledEmailFilters({ setEditedAutomation, widget, insight,
184
197
  // Use regular filters change
185
198
  onFiltersChange(filters, value);
186
199
  }
187
- }, [onFiltersChange, onFiltersByTabChange, setStoreFilters]);
200
+ onStoreParametersChange(value);
201
+ }, [onFiltersChange, onFiltersByTabChange, setStoreFilters, onStoreParametersChange]);
188
202
  return {
203
+ selectedFilters: editedAutomationFilters,
204
+ availableFilters,
205
+ storeFilters,
206
+ filtersByTab,
207
+ editedFiltersByTab: editedAutomationFiltersByTab,
189
208
  onFiltersChange,
190
209
  onFiltersByTabChange,
191
210
  onApplyCurrentFilters,
192
211
  onStoreFiltersChange,
212
+ automationIsValid,
213
+ filtersAreStale,
214
+ ...parameters,
193
215
  };
194
216
  }
@@ -4,8 +4,8 @@ import { dashboardFilterLocalIdentifier, filterLocalIdentifier, isDashboardArbit
4
4
  import { removeIgnoredWidgetFilters } from "../../../../../model/utils/widgetFilters.js";
5
5
  import { isDashboardFilter } from "../../../../../types.js";
6
6
  import { useAutomationsContext } from "../../../contexts/AutomationsContext.js";
7
+ import { dashboardFilterToFilterContextItem } from "../../filters/index.js";
7
8
  import { getAutomationAlertFilters, getAutomationDashboardFilters, getAutomationDashboardFiltersByTab, getAutomationVisualizationFilters, } from "../../utils/automationUtils.js";
8
- import { dashboardFilterToFilterContextItem } from "../../utils/filterContextUtils.js";
9
9
  export function useDefaultSelectedFiltersForExistingAutomation(automationToEdit, availableVisibleFilters, widget) {
10
10
  const { automationAvailableFilters: availableDashboardFilters, commonDateFilterId } = useAutomationsContext();
11
11
  const savedWidgetAlertFilters = getAutomationAlertFilters(automationToEdit);
@@ -1 +1 @@
1
- {"version":3,"file":"useValidateExistingAutomationFilters.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useValidateExistingAutomationFilters.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.ts"],"names":[],"mappings":"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"}
@@ -11,9 +11,10 @@ import { selectWidgetLocalIdToTabIdMap } from "../../../../../model/store/tabs/l
11
11
  import { selectSmartPersistedTabsParameters } from "../../../../../model/store/tabs/parameters/parametersSelectors.js";
12
12
  import { selectTabs } from "../../../../../model/store/tabs/tabsSelectors.js";
13
13
  import { useAutomationsContext } from "../../../contexts/AutomationsContext.js";
14
+ import { isNoopAllTimeDateFilterFixed } from "../../filters/index.js";
14
15
  import { getAutomationAlertFilters, getAutomationDashboardFilters, getAutomationDashboardFiltersByTab, getAutomationVisualizationFilters, } from "../../utils/automationUtils.js";
15
16
  import { hasStaleAlertParameters } from "../automationParameters.js";
16
- import { areFiltersEqual, isFilterIgnoredByWidget, isFilterMatch, isNoopAllTimeDateFilterFixed, } from "../utils.js";
17
+ import { areFiltersEqual, isFilterIgnoredByWidget, isFilterMatch } from "../utils.js";
17
18
  function sanitizeCommonDateFilter(filter, commonDateFilterId) {
18
19
  // Sanitize common date filters by removing date dataSet
19
20
  if (isDateFilter(filter) && filterLocalIdentifier(filter) === commonDateFilterId) {
@@ -1,5 +1,5 @@
1
1
  import { type IntlShape } from "react-intl";
2
- import { type FilterContextItem, type IAutomationVisibleFilter, type ICatalogAttribute, type ICatalogDateDataset, type ICatalogMeasure, type IDashboardAttributeFilterConfig, type IDashboardDateFilterConfigItem, type IDashboardMeasureValueFilterConfig, type IDateFilter, type IFilter, type IInsight, type ObjRef } from "@gooddata/sdk-model";
2
+ import { type FilterContextItem, type ICatalogAttribute, type ICatalogDateDataset, type ICatalogMeasure, type IDashboardAttributeFilterConfig, type IDashboardDateFilterConfigItem, type IDashboardMeasureValueFilterConfig, type IDateFilter, type IFilter, type ObjRef } from "@gooddata/sdk-model";
3
3
  import { type ExtendedDashboardWidget } from "../../../../model/types/layoutTypes.js";
4
4
  export declare const getFilterLocalIdentifier: (filter: FilterContextItem) => string | undefined;
5
5
  export declare const validateAllFilterLocalIdentifiers: (filters: FilterContextItem[]) => boolean;
@@ -9,29 +9,6 @@ export declare const getCatalogAttributesByFilters: (filters: FilterContextItem[
9
9
  export declare const getCatalogMeasuresByFilters: (filters: FilterContextItem[], measures: ICatalogMeasure[], mvfConfigs: IDashboardMeasureValueFilterConfig[]) => ICatalogMeasure[];
10
10
  export declare const getCatalogDateDatasetsByFilters: (filters: FilterContextItem[], dateDataset: ICatalogDateDataset[], dateConfigs: IDashboardDateFilterConfigItem[]) => ICatalogDateDataset[];
11
11
  export declare const getFilterByCatalogItemRef: (ref: ObjRef, filters: FilterContextItem[]) => FilterContextItem | undefined;
12
- export declare const getVisibleFiltersByFilters: (selectedFilters: FilterContextItem[] | undefined, visibleFiltersMetadata: IAutomationVisibleFilter[] | undefined, storeFilters?: boolean | undefined) => IAutomationVisibleFilter[] | undefined;
13
- /**
14
- * Get visible filters metadata structured by tab.
15
- * Applies the same logic as getVisibleFiltersByFilters to each tab's filters.
16
- */
17
- export declare const getVisibleFiltersByFiltersByTab: (filtersByTab: Record<string, FilterContextItem[]> | undefined, visibleFiltersMetadata: Record<string, IAutomationVisibleFilter[]> | undefined, storeFilters?: boolean | undefined) => Record<string, IAutomationVisibleFilter[]> | undefined;
18
- /**
19
- * Resolve MVF dimensionality localIdRefs to stable identifierRefs using the insight's attributes.
20
- *
21
- * Measure value filters may reference attributes in their dimensionality via localIdRef,
22
- * which is only meaningful within the insight's own execution context. When these filters
23
- * are used in an alert execution (which may not include the original attributes), the
24
- * localIdRefs become dangling. This function resolves them to display form identifierRefs.
25
- */
26
- export declare function resolveMvfDimensionalityLocalRefs(filters: IFilter[], insight: IInsight | undefined): IFilter[];
27
- /**
28
- * Get final execution filters for the widget alert or scheduled export.
29
- */
30
- export declare const getAppliedWidgetFilters: (selectedAutomationFilters: FilterContextItem[], dashboardHiddenFilters: FilterContextItem[], widget: ExtendedDashboardWidget | undefined, insight: IInsight | undefined, commonDateFilterId: string | undefined, mergeInsightFilters?: boolean, withoutWidget?: boolean) => IFilter[];
31
- /**
32
- * Get final filters for the dashboard scheduled export.
33
- */
34
- export declare const getAppliedDashboardFilters: (selectedAutomationFilters: FilterContextItem[], dashboardHiddenFilters: FilterContextItem[], storeFilters?: boolean | undefined) => FilterContextItem[] | undefined;
35
12
  export declare const getNonHiddenFilters: (filters: FilterContextItem[] | undefined, attributeConfigs: IDashboardAttributeFilterConfig[], dateConfigs: IDashboardDateFilterConfigItem[], isCommonDateFilterHidden: boolean, disableDateFilters: boolean) => FilterContextItem[];
36
13
  export declare const getFilterByLocalIdentifier: (localIdentifier: string | undefined, filters: FilterContextItem[]) => FilterContextItem | undefined;
37
14
  /**
@@ -40,14 +17,6 @@ export declare const getFilterByLocalIdentifier: (localIdentifier: string | unde
40
17
  * This function is used to fix this inconsistency.
41
18
  */
42
19
  export declare function isAllTimeDateFilterFixed(f: IFilter): boolean;
43
- /**
44
- * Similar to {@link isAllTimeDateFilterFixed}, but only matches *noop* all-time filters.
45
- *
46
- * @remarks
47
- * Noop all-time filters are implicit defaults and have no effect on execution. All-time filters with `emptyValueHandling`
48
- * are considered meaningful (they carry extra configuration) and should not be treated as no-op.
49
- */
50
- export declare function isNoopAllTimeDateFilterFixed(f: IFilter): boolean;
51
20
  export declare function areFiltersEqual(filter1: IFilter, filter2: IFilter): boolean;
52
21
  export declare function dateFilterValues(filter: IDateFilter): import("@gooddata/sdk-model").IAbsoluteDateFilterValues | import("@gooddata/sdk-model").IRelativeDateFilterValues;
53
22
  export declare function isFilterIgnoredByWidget(filter: FilterContextItem, widget: ExtendedDashboardWidget): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/automationFilters/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,MAAM,EAwCd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAGtF,eAAO,MAAM,wBAAwB,mDAEpC,CAAC;AAEF,eAAO,MAAM,iCAAiC,2CAE7C,CAAC;AAEF,eAAO,MAAM,6BAA6B,qEAKzC,CAAC;AAEF,eAAO,MAAM,qBAAqB,gGASjC,CAAC;AAEF,eAAO,MAAM,6BAA6B,6IA0BzC,CAAC;AAEF,eAAO,MAAM,2BAA2B,oIAqBvC,CAAC;AAEF,eAAO,MAAM,+BAA+B,4IAwB3C,CAAC;AAEF,eAAO,MAAM,yBAAyB,8EAcrC,CAAC;AAEF,eAAO,MAAM,0BAA0B,kMAmCtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,+BAA+B,+OAuB3C,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC7C,OAAO,EAAE,OAAO,EAAE,EAClB,OAAO,EAAE,QAAQ,GAAG,SAAS,GAC9B,OAAO,EAAE,CA4CX;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,wRA+CnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,sKAyBtC,CAAC;AAEF,eAAO,MAAM,mBAAmB,uOA0B/B,CAAC;AAEF,eAAO,MAAM,0BAA0B,sGAYtC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAuB5D;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CA0BhE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CA+C3E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,qHAMnD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CA+B3G;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAazE;AAED,eAAO,MAAM,cAAc,oIA8C1B,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/automationFilters/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,+BAA+B,EACpC,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,MAAM,EA6Bd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEtF,eAAO,MAAM,wBAAwB,mDAEpC,CAAC;AAEF,eAAO,MAAM,iCAAiC,2CAE7C,CAAC;AAEF,eAAO,MAAM,6BAA6B,qEAKzC,CAAC;AAEF,eAAO,MAAM,qBAAqB,gGASjC,CAAC;AAEF,eAAO,MAAM,6BAA6B,6IA0BzC,CAAC;AAEF,eAAO,MAAM,2BAA2B,oIAqBvC,CAAC;AAEF,eAAO,MAAM,+BAA+B,4IAwB3C,CAAC;AAEF,eAAO,MAAM,yBAAyB,8EAcrC,CAAC;AAEF,eAAO,MAAM,mBAAmB,uOA0B/B,CAAC;AAEF,eAAO,MAAM,0BAA0B,sGAYtC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAuB5D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CA+C3E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,qHAMnD;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,uBAAuB,GAAG,OAAO,CA+B3G;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAazE;AAED,eAAO,MAAM,cAAc,oIA8C1B,CAAC"}
@@ -1,8 +1,6 @@
1
1
  // (C) 2025-2026 GoodData Corporation
2
- import { compact, isEqual } from "lodash-es";
3
- import { absoluteDateFilterValues, areObjRefsEqual, attributeLocalId, dashboardAttributeFilterItemDisplayForm, dashboardAttributeFilterItemLocalIdentifier, dashboardFilterLocalIdentifier, dashboardFilterObjRef, filterAttributeElements, filterLocalIdentifier, filterObjRef, getAttributeElementsItems, hasMeasureValueFilterConditions, insightAttributes, isAbsoluteDateFilter, isAllDashboardMeasureValueFilter, isAllTimeDateFilter, isAllValuesAttributeFilter, isAllValuesDashboardAttributeFilter, isArbitraryAttributeFilter, isAttributeFilter, isDashboardArbitraryAttributeFilter, isDashboardAttributeFilter, isDashboardAttributeFilterItem, isDashboardCommonDateFilter, isDashboardDateFilter, isDashboardMatchAttributeFilter, isDashboardMeasureValueFilter, isDateFilter, isInsightWidget, isLocalIdRef, isMatchAttributeFilter, isMeasureValueFilter, isNegativeAttributeFilter, isNoopAllTimeDashboardDateFilter, isPositiveAttributeFilter, isRelativeDateFilter, mergeFilters, relativeDateFilterValues, } from "@gooddata/sdk-model";
4
- import { filterContextItemsToDashboardFiltersByWidget } from "../../../../converters/filterConverters.js";
5
- import { removeIgnoredWidgetFilters } from "../../../../model/utils/widgetFilters.js";
2
+ import { isEqual } from "lodash-es";
3
+ import { absoluteDateFilterValues, areObjRefsEqual, dashboardAttributeFilterItemDisplayForm, dashboardAttributeFilterItemLocalIdentifier, dashboardFilterLocalIdentifier, dashboardFilterObjRef, filterAttributeElements, filterLocalIdentifier, filterObjRef, getAttributeElementsItems, isAbsoluteDateFilter, isAllTimeDateFilter, isArbitraryAttributeFilter, isAttributeFilter, isDashboardArbitraryAttributeFilter, isDashboardAttributeFilter, isDashboardAttributeFilterItem, isDashboardCommonDateFilter, isDashboardDateFilter, isDashboardMatchAttributeFilter, isDashboardMeasureValueFilter, isDateFilter, isInsightWidget, isMatchAttributeFilter, isNegativeAttributeFilter, isPositiveAttributeFilter, isRelativeDateFilter, relativeDateFilterValues, } from "@gooddata/sdk-model";
6
4
  export const getFilterLocalIdentifier = (filter) => {
7
5
  return dashboardFilterLocalIdentifier(filter);
8
6
  };
@@ -82,152 +80,6 @@ export const getFilterByCatalogItemRef = (ref, filters) => {
82
80
  return false;
83
81
  });
84
82
  };
85
- export const getVisibleFiltersByFilters = (selectedFilters, visibleFiltersMetadata, storeFilters) => {
86
- if (!storeFilters) {
87
- return undefined;
88
- }
89
- const filters = (selectedFilters ?? [])
90
- // Strip noop "All values" attribute filters and "All" measure value filters —
91
- // they have no effect on execution and should not be stored in visible filters metadata.
92
- .filter((filter) => !isAllValuesDashboardAttributeFilter(filter) && !isAllDashboardMeasureValueFilter(filter))
93
- .map((selectedFilter) => {
94
- const selectedLocalIdentifier = getFilterLocalIdentifier(selectedFilter);
95
- const targetFilter = (visibleFiltersMetadata ?? []).find((visibleFilter) => {
96
- return selectedLocalIdentifier === visibleFilter.localIdentifier;
97
- });
98
- if (targetFilter && isDashboardDateFilter(selectedFilter)) {
99
- return {
100
- ...targetFilter,
101
- // NOTE: despite the name, this flag is used to mark *noop* "All time" filters (implicit default)
102
- // that are intentionally not stored in automation execution filters.
103
- isAllTimeDateFilter: isNoopAllTimeDashboardDateFilter(selectedFilter),
104
- };
105
- }
106
- return targetFilter;
107
- });
108
- return compact(filters);
109
- };
110
- /**
111
- * Get visible filters metadata structured by tab.
112
- * Applies the same logic as getVisibleFiltersByFilters to each tab's filters.
113
- */
114
- export const getVisibleFiltersByFiltersByTab = (filtersByTab, visibleFiltersMetadata, storeFilters) => {
115
- if (!storeFilters || !filtersByTab) {
116
- return undefined;
117
- }
118
- return Object.entries(filtersByTab).reduce((acc, [tabId, tabFilters]) => {
119
- const visibleFilters = getVisibleFiltersByFilters(tabFilters, visibleFiltersMetadata?.[tabId], true);
120
- if (visibleFilters && visibleFilters.length > 0) {
121
- acc[tabId] = visibleFilters;
122
- }
123
- return acc;
124
- }, {});
125
- };
126
- /**
127
- * Resolve MVF dimensionality localIdRefs to stable identifierRefs using the insight's attributes.
128
- *
129
- * Measure value filters may reference attributes in their dimensionality via localIdRef,
130
- * which is only meaningful within the insight's own execution context. When these filters
131
- * are used in an alert execution (which may not include the original attributes), the
132
- * localIdRefs become dangling. This function resolves them to display form identifierRefs.
133
- */
134
- export function resolveMvfDimensionalityLocalRefs(filters, insight) {
135
- if (!insight) {
136
- return filters;
137
- }
138
- const attributeLocalIdToDisplayForm = new Map();
139
- insightAttributes(insight).forEach((attribute) => {
140
- attributeLocalIdToDisplayForm.set(attributeLocalId(attribute), attribute.attribute.displayForm);
141
- });
142
- if (attributeLocalIdToDisplayForm.size === 0) {
143
- return filters;
144
- }
145
- return filters.map((filter) => {
146
- if (!isMeasureValueFilter(filter)) {
147
- return filter;
148
- }
149
- const dimensionality = filter.measureValueFilter.dimensionality;
150
- if (!dimensionality?.length) {
151
- return filter;
152
- }
153
- const resolvedDimensionality = dimensionality.map((item) => {
154
- if (!isLocalIdRef(item)) {
155
- return item;
156
- }
157
- return attributeLocalIdToDisplayForm.get(item.localIdentifier) ?? item;
158
- });
159
- const changed = dimensionality.some((item, i) => item !== resolvedDimensionality[i]);
160
- if (!changed) {
161
- return filter;
162
- }
163
- return {
164
- ...filter,
165
- measureValueFilter: {
166
- ...filter.measureValueFilter,
167
- dimensionality: resolvedDimensionality,
168
- },
169
- };
170
- });
171
- }
172
- /**
173
- * Get final execution filters for the widget alert or scheduled export.
174
- */
175
- export const getAppliedWidgetFilters = (selectedAutomationFilters, dashboardHiddenFilters, widget, insight, commonDateFilterId, mergeInsightFilters = false, withoutWidget = false) => {
176
- // Hidden filters are never included in selectedAutomationFilters,
177
- // but we need them to construct proper execution filters, so merge them.
178
- const selectedFiltersWithHiddenFilters = [...selectedAutomationFilters, ...dashboardHiddenFilters];
179
- // Now, remove ignored filters (some of the hidden filters might be ignored).
180
- const selectedFiltersWithoutIgnoredFilters = removeIgnoredWidgetFilters(selectedFiltersWithHiddenFilters, widget);
181
- // Now, convert sanitized selected filters to execution filters shape.
182
- const selectedExecutionFilters = isInsightWidget(widget)
183
- ? filterContextItemsToDashboardFiltersByWidget(selectedFiltersWithoutIgnoredFilters, widget)
184
- : withoutWidget
185
- ? filterContextItemsToDashboardFiltersByWidget(selectedFiltersWithoutIgnoredFilters, undefined)
186
- : [];
187
- const filtersToUse = mergeInsightFilters
188
- ? mergeFilters(insight?.insight?.filters ?? [], selectedExecutionFilters, commonDateFilterId)
189
- : selectedExecutionFilters;
190
- // Resolve MVF dimensionality localIdRefs to stable identifierRefs so that
191
- // alert executions (which have empty attributes) don't contain dangling refs.
192
- const resolvedFilters = resolveMvfDimensionalityLocalRefs(filtersToUse, insight);
193
- // Strip noop filters - they have no effect on execution.
194
- return resolvedFilters.filter((filter) => {
195
- // Strip noop "All time" date filters (implicit default with no extra configuration).
196
- if (isDateFilter(filter)) {
197
- return !isNoopAllTimeDateFilterFixed(filter);
198
- }
199
- // Strip noop "All" measure value filters (no conditions).
200
- if (isMeasureValueFilter(filter)) {
201
- return hasMeasureValueFilterConditions(filter);
202
- }
203
- // Strip noop "All values" attribute filters (negative filter with empty exclusion list).
204
- return !isAllValuesAttributeFilter(filter);
205
- });
206
- };
207
- /**
208
- * Get final filters for the dashboard scheduled export.
209
- */
210
- export const getAppliedDashboardFilters = (selectedAutomationFilters, dashboardHiddenFilters, storeFilters) => {
211
- if (!storeFilters) {
212
- return undefined;
213
- }
214
- // Hidden filters are never included in selectedAutomationFilters,
215
- // but we need them to construct proper execution filters, so merge them.
216
- const selectedFiltersWithHiddenFilters = [...selectedAutomationFilters, ...dashboardHiddenFilters];
217
- // Strip noop filters - they have no effect on execution.
218
- return selectedFiltersWithHiddenFilters.filter((filter) => {
219
- // Strip noop "All time" date filters (implicit default with no extra configuration).
220
- if (isDashboardDateFilter(filter)) {
221
- return !isNoopAllTimeDashboardDateFilter(filter);
222
- }
223
- // Strip noop "All" measure value filters (no/empty conditions).
224
- if (isDashboardMeasureValueFilter(filter)) {
225
- return !isAllDashboardMeasureValueFilter(filter);
226
- }
227
- // Strip noop "All values" attribute filters.
228
- return !isAllValuesDashboardAttributeFilter(filter);
229
- });
230
- };
231
83
  export const getNonHiddenFilters = (filters, attributeConfigs, dateConfigs, isCommonDateFilterHidden, disableDateFilters) => {
232
84
  return (filters ?? []).filter((filter) => {
233
85
  if (isDashboardAttributeFilterItem(filter)) {
@@ -279,33 +131,6 @@ export function isAllTimeDateFilterFixed(f) {
279
131
  }
280
132
  return false;
281
133
  }
282
- /**
283
- * Similar to {@link isAllTimeDateFilterFixed}, but only matches *noop* all-time filters.
284
- *
285
- * @remarks
286
- * Noop all-time filters are implicit defaults and have no effect on execution. All-time filters with `emptyValueHandling`
287
- * are considered meaningful (they carry extra configuration) and should not be treated as no-op.
288
- */
289
- export function isNoopAllTimeDateFilterFixed(f) {
290
- // Standard check for noop all-time date filter.
291
- if (isAllTimeDateFilter(f)) {
292
- return f.relativeDateFilter.emptyValueHandling === undefined;
293
- }
294
- // Analytical Designer may store "all-time" as a relative date filter without from/to.
295
- // Treat it as no-op only when it does NOT carry extra configuration (e.g. emptyValueHandling).
296
- if (isRelativeDateFilter(f)) {
297
- return ((f.relativeDateFilter.from === null || f.relativeDateFilter.from === undefined) &&
298
- (f.relativeDateFilter.to === null || f.relativeDateFilter.to === undefined) &&
299
- f.relativeDateFilter.emptyValueHandling === undefined);
300
- }
301
- // Not expected, but keep the symmetric safety behavior for absolute filters.
302
- if (isAbsoluteDateFilter(f)) {
303
- return ((f.absoluteDateFilter.from === null || f.absoluteDateFilter.from === undefined) &&
304
- (f.absoluteDateFilter.to === null || f.absoluteDateFilter.to === undefined) &&
305
- f.absoluteDateFilter.emptyValueHandling === undefined);
306
- }
307
- return false;
308
- }
309
134
  export function areFiltersEqual(filter1, filter2) {
310
135
  if (isAttributeFilter(filter1) && isAttributeFilter(filter2)) {
311
136
  const filter1Ref = filterObjRef(filter1);
@@ -0,0 +1,36 @@
1
+ import { type FilterContextItem, type IAutomationVisibleFilter, type IFilter, type IInsight } from "@gooddata/sdk-model";
2
+ import { type ExtendedDashboardWidget } from "../../../../model/types/layoutTypes.js";
3
+ import { type IDashboardFilter } from "../../../../types.js";
4
+ export declare const getVisibleFiltersByFilters: (selectedFilters: FilterContextItem[] | undefined, visibleFiltersMetadata: IAutomationVisibleFilter[] | undefined, storeFilters?: boolean | undefined) => IAutomationVisibleFilter[] | undefined;
5
+ /**
6
+ * Get visible filters metadata structured by tab.
7
+ * Applies the same logic as getVisibleFiltersByFilters to each tab's filters.
8
+ */
9
+ export declare const getVisibleFiltersByFiltersByTab: (filtersByTab: Record<string, FilterContextItem[]> | undefined, visibleFiltersMetadata: Record<string, IAutomationVisibleFilter[]> | undefined, storeFilters?: boolean | undefined) => Record<string, IAutomationVisibleFilter[]> | undefined;
10
+ /**
11
+ * Get final execution filters for the widget alert or scheduled export.
12
+ */
13
+ export declare const getAppliedWidgetFilters: (selectedAutomationFilters: FilterContextItem[], dashboardHiddenFilters: FilterContextItem[], widget: ExtendedDashboardWidget | undefined, insight: IInsight | undefined, commonDateFilterId: string | undefined, mergeInsightFilters?: boolean, withoutWidget?: boolean) => IFilter[];
14
+ /**
15
+ * Get final filters for the dashboard scheduled export.
16
+ */
17
+ export declare const getAppliedDashboardFilters: (selectedAutomationFilters: FilterContextItem[], dashboardHiddenFilters: FilterContextItem[], storeFilters?: boolean | undefined) => FilterContextItem[] | undefined;
18
+ export declare function dashboardFilterToFilterContextItem(filter: IDashboardFilter, keepDatasets: boolean): FilterContextItem | undefined;
19
+ /**
20
+ * Resolve MVF dimensionality localIdRefs to stable identifierRefs using the insight's attributes.
21
+ *
22
+ * Measure value filters may reference attributes in their dimensionality via localIdRef,
23
+ * which is only meaningful within the insight's own execution context. When these filters
24
+ * are used in an alert execution (which may not include the original attributes), the
25
+ * localIdRefs become dangling. This function resolves them to display form identifierRefs.
26
+ */
27
+ export declare function resolveMvfDimensionalityLocalRefs(filters: IFilter[], insight: IInsight | undefined): IFilter[];
28
+ /**
29
+ * Matches all-time date filters that are *noop*, i.e. that have no effect on execution.
30
+ *
31
+ * @remarks
32
+ * Noop all-time filters are implicit defaults and have no effect on execution. All-time filters with `emptyValueHandling`
33
+ * are considered meaningful (they carry extra configuration) and should not be treated as no-op.
34
+ */
35
+ export declare function isNoopAllTimeDateFilterFixed(f: IFilter): boolean;
36
+ //# sourceMappingURL=conversions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversions.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/filters/conversions.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,OAAO,EACZ,KAAK,QAAQ,EAkChB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEtF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAO,MAAM,0BAA0B,kMAmCtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,+BAA+B,+OAuB3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,wRA+CnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,sKAyBtC,CAAC;AAEF,wBAAgB,kCAAkC,CAC9C,MAAM,EAAE,gBAAgB,EACxB,YAAY,EAAE,OAAO,GACtB,iBAAiB,GAAG,SAAS,CA8E/B;AAED;;;;;;;GAOG;AACH,wBAAgB,iCAAiC,CAC7C,OAAO,EAAE,OAAO,EAAE,EAClB,OAAO,EAAE,QAAQ,GAAG,SAAS,GAC9B,OAAO,EAAE,CA4CX;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CA0BhE"}