@gooddata/sdk-ui-dashboard 11.52.0-alpha.5 → 11.52.0-alpha.7

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 (186) hide show
  1. package/esm/__version.d.ts +1 -1
  2. package/esm/__version.js +1 -1
  3. package/esm/index.d.ts +8 -7
  4. package/esm/index.d.ts.map +1 -1
  5. package/esm/index.js +8 -7
  6. package/esm/kdaDialog/composition/hooks/usePeriodChangeHandler.js +5 -0
  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/widgets/changeVisualizationSwitcherActiveVisualizationHandler.d.ts +6 -0
  10. package/esm/model/commandHandlers/widgets/changeVisualizationSwitcherActiveVisualizationHandler.d.ts.map +1 -0
  11. package/esm/model/commandHandlers/widgets/changeVisualizationSwitcherActiveVisualizationHandler.js +12 -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 -2
  15. package/esm/model/commands/index.d.ts.map +1 -1
  16. package/esm/model/commands/visualizationSwitcher.d.ts +33 -0
  17. package/esm/model/commands/visualizationSwitcher.d.ts.map +1 -1
  18. package/esm/model/commands/visualizationSwitcher.js +21 -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 -2
  22. package/esm/model/events/index.d.ts.map +1 -1
  23. package/esm/model/events/visualizationSwitcher.d.ts +34 -0
  24. package/esm/model/events/visualizationSwitcher.d.ts.map +1 -1
  25. package/esm/model/events/visualizationSwitcher.js +21 -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/config/configSelectors.d.ts +6 -0
  31. package/esm/model/store/config/configSelectors.d.ts.map +1 -1
  32. package/esm/model/store/config/configSelectors.js +8 -0
  33. package/esm/model/store/keyDriverAnalysis/const.d.ts +6 -6
  34. package/esm/model/store/keyDriverAnalysis/const.d.ts.map +1 -1
  35. package/esm/model/store/keyDriverAnalysis/const.js +12 -26
  36. package/esm/model/store/ui/index.d.ts +4 -0
  37. package/esm/model/store/ui/index.d.ts.map +1 -1
  38. package/esm/model/store/ui/uiReducers.d.ts +7 -0
  39. package/esm/model/store/ui/uiReducers.d.ts.map +1 -1
  40. package/esm/model/store/ui/uiReducers.js +6 -0
  41. package/esm/model/store/ui/uiSelectors.d.ts +8 -0
  42. package/esm/model/store/ui/uiSelectors.d.ts.map +1 -1
  43. package/esm/model/store/ui/uiSelectors.js +10 -0
  44. package/esm/model/store/ui/uiState.d.ts +6 -0
  45. package/esm/model/store/ui/uiState.d.ts.map +1 -1
  46. package/esm/model/store/ui/uiState.js +1 -0
  47. package/esm/model/store/widgetDrills/widgetDrillSelectors.d.ts.map +1 -1
  48. package/esm/model/store/widgetDrills/widgetDrillSelectors.js +5 -5
  49. package/esm/presentation/automations/alerting/AlertingDialog.d.ts +3 -0
  50. package/esm/presentation/automations/alerting/AlertingDialog.d.ts.map +1 -1
  51. package/esm/presentation/automations/alerting/AlertingDialog.js +5 -1
  52. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts +10 -7
  53. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts.map +1 -1
  54. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.js +36 -16
  55. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertThreshold.d.ts +9 -0
  56. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertThreshold.d.ts.map +1 -1
  57. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertThreshold.js +9 -0
  58. package/esm/presentation/automations/alerting/state/AlertActionsContext.d.ts +23 -0
  59. package/esm/presentation/automations/alerting/state/AlertActionsContext.d.ts.map +1 -0
  60. package/esm/presentation/automations/alerting/state/AlertActionsContext.js +19 -0
  61. package/esm/presentation/automations/alerting/state/AlertDataContext.d.ts +24 -0
  62. package/esm/presentation/automations/alerting/state/AlertDataContext.d.ts.map +1 -0
  63. package/esm/presentation/automations/alerting/state/AlertDataContext.js +19 -0
  64. package/esm/presentation/automations/alerting/state/AlertDraftContext.d.ts +24 -0
  65. package/esm/presentation/automations/alerting/state/AlertDraftContext.d.ts.map +1 -0
  66. package/esm/presentation/automations/alerting/state/AlertDraftContext.js +19 -0
  67. package/esm/presentation/automations/alerting/state/AlertFiltersContext.d.ts +26 -0
  68. package/esm/presentation/automations/alerting/state/AlertFiltersContext.d.ts.map +1 -0
  69. package/esm/presentation/automations/alerting/state/AlertFiltersContext.js +19 -0
  70. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.d.ts +25 -0
  71. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.d.ts.map +1 -0
  72. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.js +172 -0
  73. package/esm/presentation/automations/alerting/state/missingAlertStateProvider.d.ts +7 -0
  74. package/esm/presentation/automations/alerting/state/missingAlertStateProvider.d.ts.map +1 -0
  75. package/esm/presentation/automations/alerting/state/missingAlertStateProvider.js +9 -0
  76. package/esm/presentation/automations/alerting/state/useAlertDialogValidity.d.ts +15 -0
  77. package/esm/presentation/automations/alerting/state/useAlertDialogValidity.d.ts.map +1 -0
  78. package/esm/presentation/automations/alerting/state/useAlertDialogValidity.js +45 -0
  79. package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertFiltersModel.d.ts +2 -2
  80. package/esm/presentation/automations/alerting/state/useAlertFiltersModel.d.ts.map +1 -0
  81. package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertFiltersModel.js +3 -3
  82. package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertFormState.d.ts +4 -4
  83. package/esm/presentation/automations/alerting/state/useAlertFormState.d.ts.map +1 -0
  84. package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertFormState.js +8 -8
  85. package/esm/presentation/automations/alerting/state/useAlertFormValidation.d.ts.map +1 -0
  86. package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertFormValidation.js +3 -3
  87. package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertSelectedValues.d.ts +17 -7
  88. package/esm/presentation/automations/alerting/state/useAlertSelectedValues.d.ts.map +1 -0
  89. package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertSelectedValues.js +27 -4
  90. package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertSupportedMetrics.d.ts +3 -3
  91. package/esm/presentation/automations/alerting/state/useAlertSupportedMetrics.d.ts.map +1 -0
  92. package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertSupportedMetrics.js +5 -5
  93. package/esm/presentation/automations/alerting/types.d.ts +15 -1
  94. package/esm/presentation/automations/alerting/types.d.ts.map +1 -1
  95. package/esm/presentation/automations/contexts/AlertingDialogContext.d.ts +26 -0
  96. package/esm/presentation/automations/contexts/AlertingDialogContext.d.ts.map +1 -1
  97. package/esm/presentation/automations/contexts/AlertingDialogContext.js +26 -0
  98. package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.d.ts +10 -1
  99. package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.d.ts.map +1 -1
  100. package/esm/presentation/automations/contexts/ScheduledEmailDialogContext.js +9 -0
  101. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts +1 -1
  102. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts.map +1 -1
  103. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +19 -17
  104. package/esm/presentation/automations/scheduledEmail/ScheduledEmailDialog.d.ts +3 -0
  105. package/esm/presentation/automations/scheduledEmail/ScheduledEmailDialog.d.ts.map +1 -1
  106. package/esm/presentation/automations/scheduledEmail/ScheduledEmailDialog.js +5 -1
  107. package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.d.ts +22 -0
  108. package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.d.ts.map +1 -0
  109. package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.js +150 -0
  110. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportActionsContext.d.ts +28 -0
  111. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportActionsContext.d.ts.map +1 -0
  112. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportActionsContext.js +20 -0
  113. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportDataContext.d.ts +25 -0
  114. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportDataContext.d.ts.map +1 -0
  115. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportDataContext.js +20 -0
  116. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportDraftContext.d.ts +25 -0
  117. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportDraftContext.d.ts.map +1 -0
  118. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportDraftContext.js +20 -0
  119. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportFiltersContext.d.ts +26 -0
  120. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportFiltersContext.d.ts.map +1 -0
  121. package/esm/presentation/automations/scheduledEmail/state/ScheduledExportFiltersContext.js +20 -0
  122. package/esm/presentation/automations/scheduledEmail/state/exportDefinitions.d.ts.map +1 -0
  123. package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/utils → state}/exportDefinitions.js +1 -1
  124. package/esm/presentation/automations/scheduledEmail/state/missingScheduledExportStateProvider.d.ts +7 -0
  125. package/esm/presentation/automations/scheduledEmail/state/missingScheduledExportStateProvider.d.ts.map +1 -0
  126. package/esm/presentation/automations/scheduledEmail/state/missingScheduledExportStateProvider.js +9 -0
  127. package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks → state}/useScheduledEmailEffectiveFilters.d.ts +2 -2
  128. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailEffectiveFilters.d.ts.map +1 -0
  129. package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks → state}/useScheduledEmailEffectiveFilters.js +4 -4
  130. package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks → state}/useScheduledEmailExportSettings.d.ts +12 -25
  131. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailExportSettings.d.ts.map +1 -0
  132. package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks → state}/useScheduledEmailExportSettings.js +38 -86
  133. package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.d.ts → state/useScheduledEmailFiltersModel.d.ts} +7 -7
  134. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.d.ts.map +1 -0
  135. package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.js → state/useScheduledEmailFiltersModel.js} +26 -9
  136. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFormState.d.ts.map +1 -0
  137. package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks → state}/useScheduledEmailFormState.js +25 -25
  138. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFormValidity.d.ts.map +1 -0
  139. package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks → state}/useScheduledEmailFormValidity.js +3 -3
  140. package/esm/presentation/automations/scheduledEmail/state/useScheduledExportAttachments.d.ts +39 -0
  141. package/esm/presentation/automations/scheduledEmail/state/useScheduledExportAttachments.d.ts.map +1 -0
  142. package/esm/presentation/automations/scheduledEmail/state/useScheduledExportAttachments.js +102 -0
  143. package/esm/presentation/automations/scheduledEmail/state/useScheduledExportDialogValidity.d.ts +13 -0
  144. package/esm/presentation/automations/scheduledEmail/state/useScheduledExportDialogValidity.d.ts.map +1 -0
  145. package/esm/presentation/automations/scheduledEmail/state/useScheduledExportDialogValidity.js +34 -0
  146. package/esm/presentation/automations/scheduledEmail/types.d.ts +15 -1
  147. package/esm/presentation/automations/scheduledEmail/types.d.ts.map +1 -1
  148. package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForNewAutomation.d.ts.map +1 -1
  149. package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForNewAutomation.js +2 -1
  150. package/esm/presentation/drill/DrillSelect/DrillSelectDropdown.d.ts +2 -1
  151. package/esm/presentation/drill/DrillSelect/DrillSelectDropdown.d.ts.map +1 -1
  152. package/esm/presentation/drill/DrillSelect/DrillSelectDropdown.js +6 -2
  153. package/esm/presentation/drill/utils/kdaUtils.d.ts +1 -1
  154. package/esm/presentation/drill/utils/kdaUtils.d.ts.map +1 -1
  155. package/esm/presentation/drill/utils/kdaUtils.js +6 -5
  156. package/esm/presentation/filterBar/dateFilter/DefaultDashboardDateFilter.d.ts +1 -1
  157. package/esm/presentation/filterBar/dateFilter/DefaultDashboardDateFilter.d.ts.map +1 -1
  158. package/esm/presentation/filterBar/dateFilter/DefaultDashboardDateFilter.js +2 -2
  159. package/esm/presentation/filterBar/dateFilter/types.d.ts +8 -1
  160. package/esm/presentation/filterBar/dateFilter/types.d.ts.map +1 -1
  161. package/esm/presentation/filterBar/dateFilter/types.js +1 -1
  162. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.d.ts.map +1 -1
  163. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.js +11 -2
  164. package/esm/sdk-ui-dashboard.d.ts +240 -28
  165. package/package.json +21 -21
  166. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFiltersModel.d.ts.map +0 -1
  167. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFormState.d.ts.map +0 -1
  168. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertFormValidation.d.ts.map +0 -1
  169. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertSelectedValues.d.ts.map +0 -1
  170. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useAlertSupportedMetrics.d.ts.map +0 -1
  171. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useEditAlert.d.ts +0 -69
  172. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useEditAlert.d.ts.map +0 -1
  173. package/esm/presentation/automations/alerting/DefaultAlertingDialog/hooks/useEditAlert.js +0 -145
  174. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts +0 -89
  175. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts.map +0 -1
  176. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.js +0 -131
  177. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.d.ts.map +0 -1
  178. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailExportSettings.d.ts.map +0 -1
  179. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFilters.d.ts.map +0 -1
  180. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.d.ts.map +0 -1
  181. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormValidity.d.ts.map +0 -1
  182. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/utils/exportDefinitions.d.ts.map +0 -1
  183. /package/esm/presentation/automations/alerting/{DefaultAlertingDialog/hooks → state}/useAlertFormValidation.d.ts +0 -0
  184. /package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/utils → state}/exportDefinitions.d.ts +0 -0
  185. /package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks → state}/useScheduledEmailFormState.d.ts +0 -0
  186. /package/esm/presentation/automations/scheduledEmail/{DefaultScheduledEmailDialog/hooks → state}/useScheduledEmailFormValidity.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missingScheduledExportStateProvider.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/scheduledEmail/state/missingScheduledExportStateProvider.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,CAI3E"}
@@ -0,0 +1,9 @@
1
+ // (C) 2026 GoodData Corporation
2
+ /**
3
+ * The single error every scheduled-export dialog state accessor throws when no provider is above it.
4
+ *
5
+ * @internal
6
+ */
7
+ export function missingScheduledExportStateProvider(accessor) {
8
+ throw new Error(`${accessor} must be used within ScheduledEmailDialogStateProvider. The provider mounts only once the dialog's data has loaded, so check useScheduledEmailDialogContext().isLoading before reading scheduled-export dialog state.`);
9
+ }
@@ -1,5 +1,5 @@
1
1
  import { type FilterContextItem, type IAutomationVisibleFilter, type IDashboardExportParameter, type IFilter, type IInsight, type IWidget } from "@gooddata/sdk-model";
2
- import type { IAutomationFiltersTab } from "../../../../../model/store/filtering/types.js";
2
+ import type { IAutomationFiltersTab } from "../../../../model/store/filtering/types.js";
3
3
  export interface IUseScheduledEmailEffectiveFiltersProps {
4
4
  widget?: IWidget;
5
5
  insight?: IInsight;
@@ -17,7 +17,7 @@ export interface IUseScheduledEmailEffectiveFiltersProps {
17
17
  *
18
18
  * This has to run before the draft exists, because `useScheduledEmailFormState` and
19
19
  * `useScheduledEmailExportSettings` consume these values while initializing it. The handlers that
20
- * *change* filters live in {@link useScheduledEmailFilters} and necessarily run later — they write
20
+ * *change* filters live in {@link useScheduledEmailFiltersModel} and necessarily run later — they write
21
21
  * through the draft's setter. That ordering is why reading and writing filters are two hooks rather
22
22
  * than one.
23
23
  *
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledEmailEffectiveFilters.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/scheduledEmail/state/useScheduledEmailEffectiveFilters.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,OAAO,EACf,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAUxF,MAAM,WAAW,uCAAuC;IACpD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,uBAAuB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9C,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACnE,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;CAC1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iCAAiC,CAAC,EAC9C,MAAM,EACN,OAAO,EACP,uBAAuB,EACvB,4BAA4B,EAC5B,gCAAgC,EAChC,qCAAqC,EACrC,gBAAgB,EAChB,YAAY,EACf,EAAE,uCAAuC,GAAG;IACzC,sBAAsB,EAAE,OAAO,EAAE,CAAC;IAClC,iCAAiC,EAAE,OAAO,EAAE,CAAC;IAC7C,6BAA6B,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IACtE,yBAAyB,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3D,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAAG,SAAS,CAAC;IAChF,gCAAgC,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IACzE,qCAAqC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,GAAG,SAAS,CAAC;IAC9F,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,EAAE,CAAC,GAAG,SAAS,CAAC;CAC5F,CA+GA"}
@@ -1,8 +1,8 @@
1
1
  // (C) 2026 GoodData Corporation
2
2
  import { useMemo } from "react";
3
- import { useScheduledEmailDialogContext } from "../../../contexts/ScheduledEmailDialogContext.js";
4
- import { shouldStoreExportParameters } from "../../../shared/automationFilters/automationParameters.js";
5
- import { getAppliedDashboardFilters, getAppliedWidgetFilters, getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, } from "../../../shared/filters/index.js";
3
+ import { useScheduledEmailDialogContext } from "../../contexts/ScheduledEmailDialogContext.js";
4
+ import { shouldStoreExportParameters } from "../../shared/automationFilters/automationParameters.js";
5
+ import { getAppliedDashboardFilters, getAppliedWidgetFilters, getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, } from "../../shared/filters/index.js";
6
6
  /**
7
7
  * Derives the filter sets a scheduled export actually runs with: the widget and dashboard filters left
8
8
  * after hidden filters are removed, their visible-filter counterparts for display, and the per-tab
@@ -10,7 +10,7 @@ import { getAppliedDashboardFilters, getAppliedWidgetFilters, getVisibleFiltersB
10
10
  *
11
11
  * This has to run before the draft exists, because `useScheduledEmailFormState` and
12
12
  * `useScheduledEmailExportSettings` consume these values while initializing it. The handlers that
13
- * *change* filters live in {@link useScheduledEmailFilters} and necessarily run later — they write
13
+ * *change* filters live in {@link useScheduledEmailFiltersModel} and necessarily run later — they write
14
14
  * through the draft's setter. That ordering is why reading and writing filters are two hooks rather
15
15
  * than one.
16
16
  *
@@ -12,31 +12,19 @@ export interface IUseScheduledEmailExportSettingsProps {
12
12
  effectiveWidgetFiltersWithInsight: IFilter[];
13
13
  defaultPdfPageSize?: IExportDefinitionVisualizationObjectSettings["pageSize"];
14
14
  }
15
+ /**
16
+ * Owns the scheduled export's attachment write path: the per-tab export-parameter wire, which is
17
+ * held outside the automation so it survives an export-definition rebuild, and every handler that
18
+ * rebuilds or patches export definitions and therefore captures that wire.
19
+ *
20
+ * The wire must exist once per dialog, so this hook is called once, by the state provider, and its
21
+ * handlers are published on the actions context. What the attachment section *displays* is a pure
22
+ * function of the draft and is derived per consumer in {@link useScheduledExportAttachments}.
23
+ *
24
+ * @internal
25
+ */
15
26
  export declare function useScheduledEmailExportSettings({ editedAutomation, setEditedAutomation, insight, widget, storeFilters, effectiveDashboardFilters, effectiveDashboardFiltersByTab, effectiveWidgetFilters, effectiveWidgetFiltersWithInsight, defaultPdfPageSize }: IUseScheduledEmailExportSettingsProps): {
16
- selectedAttachments: ("CSV" | "CSV_RAW" | "HTML" | "PDF" | "PDF_SLIDES" | "PDF_TABULAR" | "PNG" | "PPTX" | "XLSX")[];
17
- isDashboardExportSelected: boolean;
18
- isCsvExportSelected: boolean;
19
- isXlsxExportSelected: boolean;
20
- xlsxSettings: {
21
- mergeHeaders: boolean;
22
- exportInfo: boolean;
23
- };
24
- pdfSettings: {
25
- pageSize: "A3" | "A4" | "LETTER";
26
- orientation: "landscape" | "portrait";
27
- exportInfo: boolean;
28
- };
29
- csvSettings: {
30
- delimiter: string;
31
- };
32
- csvRawSettings: {
33
- delimiter: string;
34
- };
35
- slidesTemplateIds: {
36
- PPTX: string | undefined;
37
- PDF_SLIDES: string | undefined;
38
- PDF: string | undefined;
39
- };
27
+ setParametersWire: (wire: Record<string, IDashboardExportParameter[]> | undefined) => void;
40
28
  onDashboardAttachmentsChange: (formats: DashboardAttachmentType[]) => void;
41
29
  onWidgetAttachmentsChange: (formats: WidgetAttachmentType[]) => void;
42
30
  onXlsxSettingsChange: (settings: IExportDefinitionVisualizationObjectSettings) => void;
@@ -44,6 +32,5 @@ export declare function useScheduledEmailExportSettings({ editedAutomation, setE
44
32
  onCsvSettingsChange: (settings: IExportDefinitionVisualizationObjectSettings) => void;
45
33
  onCsvRawSettingsChange: (settings: IExportDefinitionVisualizationObjectSettings) => void;
46
34
  onSlidesTemplateIdChange: (templateId: string | undefined, format: "PDF" | "PDF_SLIDES" | "PPTX") => void;
47
- setParametersWire: (wire: Record<string, IDashboardExportParameter[]> | undefined) => void;
48
35
  };
49
36
  //# sourceMappingURL=useScheduledEmailExportSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledEmailExportSettings.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/scheduledEmail/state/useScheduledEmailExportSettings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAuB,MAAM,OAAO,CAAC;AAIhF,OAAO,EACH,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,mCAAmC,EACxC,KAAK,yBAAyB,EAC9B,KAAK,4CAA4C,EACjD,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,KAAK,oBAAoB,EAG5B,MAAM,qBAAqB,CAAC;AAc7B,MAAM,WAAW,qCAAqC;IAClD,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,mBAAmB,EAAE,QAAQ,CAAC,cAAc,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACnF,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yBAAyB,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3D,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAAG,SAAS,CAAC;IAChF,sBAAsB,EAAE,OAAO,EAAE,CAAC;IAClC,iCAAiC,EAAE,OAAO,EAAE,CAAC;IAC7C,kBAAkB,CAAC,EAAE,4CAA4C,CAAC,UAAU,CAAC,CAAC;CACjF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,+BAA+B,CAAC,EAC5C,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,MAAM,EACN,YAAY,EACZ,yBAAyB,EACzB,8BAA8B,EAC9B,sBAAsB,EACtB,iCAAiC,EACjC,kBAAkB,EACrB,EAAE,qCAAqC;;;;;;;;;EAsRvC"}
@@ -1,15 +1,23 @@
1
1
  // (C) 2019-2026 GoodData Corporation
2
- import { useCallback, useMemo, useRef } from "react";
2
+ import { useCallback, useRef } from "react";
3
3
  import { invariant } from "ts-invariant";
4
- import { DEFAULT_CSV_DELIMITER, isExportDefinitionDashboardRequestPayload, isExportDefinitionVisualizationObjectRequestPayload, } from "@gooddata/sdk-model";
5
- import { getAutomationExportParametersByTab, setExportParametersByTab, } from "../../../../../_staging/automation/index.js";
6
- import { useAutomationsContext } from "../../../contexts/AutomationsContext.js";
7
- import { useScheduledEmailDialogContext } from "../../../contexts/ScheduledEmailDialogContext.js";
8
- import { newDashboardExportDefinitionMetadataObjectDefinition, newWidgetExportDefinitionMetadataObjectDefinition, withRebuiltExportDefinitions, } from "../utils/exportDefinitions.js";
4
+ import { isExportDefinitionDashboardRequestPayload, isExportDefinitionVisualizationObjectRequestPayload, } from "@gooddata/sdk-model";
5
+ import { getAutomationExportParametersByTab, setExportParametersByTab, } from "../../../../_staging/automation/index.js";
6
+ import { useScheduledEmailDialogContext } from "../../contexts/ScheduledEmailDialogContext.js";
7
+ import { newDashboardExportDefinitionMetadataObjectDefinition, newWidgetExportDefinitionMetadataObjectDefinition, withRebuiltExportDefinitions, } from "./exportDefinitions.js";
8
+ /**
9
+ * Owns the scheduled export's attachment write path: the per-tab export-parameter wire, which is
10
+ * held outside the automation so it survives an export-definition rebuild, and every handler that
11
+ * rebuilds or patches export definitions and therefore captures that wire.
12
+ *
13
+ * The wire must exist once per dialog, so this hook is called once, by the state provider, and its
14
+ * handlers are published on the actions context. What the attachment section *displays* is a pure
15
+ * function of the draft and is derived per consumer in {@link useScheduledExportAttachments}.
16
+ *
17
+ * @internal
18
+ */
9
19
  export function useScheduledEmailExportSettings({ editedAutomation, setEditedAutomation, insight, widget, storeFilters, effectiveDashboardFilters, effectiveDashboardFiltersByTab, effectiveWidgetFilters, effectiveWidgetFiltersWithInsight, defaultPdfPageSize, }) {
10
- const { settings } = useAutomationsContext();
11
20
  const { dashboardId, dashboardTitle } = useScheduledEmailDialogContext();
12
- const resolvedDefaultCsvDelimiter = settings?.exportCsvCustomDelimiter ?? DEFAULT_CSV_DELIMITER;
13
21
  // Holds the wire outside the automation so it survives a rebuild from zero export definitions —
14
22
  // with no definitions `setExportParametersByTab` has nowhere to store it.
15
23
  // Seeded from the stored wire.
@@ -25,12 +33,7 @@ export function useScheduledEmailExportSettings({ editedAutomation, setEditedAut
25
33
  // `widget`/`insight` via TS's aliased-condition control-flow analysis — this requires the boolean
26
34
  // to be declared from those exact variables in this same scope, same as in the parent.
27
35
  const isWidget = !!widget && !!insight;
28
- const selectedAttachments = useMemo(() => {
29
- return (editedAutomation.exportDefinitions
30
- ?.map((exportDefinition) => exportDefinition.requestPayload.format)
31
- .filter(Boolean) ?? []);
32
- }, [editedAutomation.exportDefinitions]);
33
- const onDashboardAttachmentsChange = (formats) => {
36
+ const onDashboardAttachmentsChange = useCallback((formats) => {
34
37
  setEditedAutomation((s) => {
35
38
  const currentExportDefinitions = s.exportDefinitions || [];
36
39
  const currentDashboardExportDefinitions = currentExportDefinitions.filter((exportDefinition) => isExportDefinitionDashboardRequestPayload(exportDefinition.requestPayload));
@@ -48,8 +51,15 @@ export function useScheduledEmailExportSettings({ editedAutomation, setEditedAut
48
51
  const updatedExportDefinitions = [...keptExportDefinitions, ...newExportDefinitions];
49
52
  return withRebuiltExportDefinitions(s, updatedExportDefinitions, latestParametersWireRef.current);
50
53
  });
51
- };
52
- const onWidgetAttachmentsChange = (formats) => {
54
+ }, [
55
+ setEditedAutomation,
56
+ dashboardId,
57
+ dashboardTitle,
58
+ storeFilters,
59
+ effectiveDashboardFilters,
60
+ effectiveDashboardFiltersByTab,
61
+ ]);
62
+ const onWidgetAttachmentsChange = useCallback((formats) => {
53
63
  invariant(isWidget, "Widget or insight is missing in scheduling dialog context.");
54
64
  setEditedAutomation((s) => {
55
65
  const currentExportDefinitions = s.exportDefinitions || [];
@@ -71,7 +81,17 @@ export function useScheduledEmailExportSettings({ editedAutomation, setEditedAut
71
81
  const updatedExportDefinitions = [...keptExportDefinitions, ...newExportDefinitions];
72
82
  return withRebuiltExportDefinitions(s, updatedExportDefinitions, latestParametersWireRef.current);
73
83
  });
74
- };
84
+ }, [
85
+ setEditedAutomation,
86
+ isWidget,
87
+ insight,
88
+ widget,
89
+ dashboardId,
90
+ effectiveWidgetFilters,
91
+ effectiveWidgetFiltersWithInsight,
92
+ effectiveDashboardFilters,
93
+ defaultPdfPageSize,
94
+ ]);
75
95
  const onXlsxSettingsChange = useCallback((settings) => {
76
96
  setEditedAutomation((s) => ({
77
97
  ...s,
@@ -178,75 +198,8 @@ export function useScheduledEmailExportSettings({ editedAutomation, setEditedAut
178
198
  }),
179
199
  }));
180
200
  }, [setEditedAutomation, isWidget]);
181
- const isDashboardExportSelected = editedAutomation.exportDefinitions?.some((exportDefinition) => isExportDefinitionDashboardRequestPayload(exportDefinition.requestPayload)) ?? true;
182
- const isCsvExportSelected = editedAutomation.exportDefinitions?.some((exportDefinition) => {
183
- if (isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload)) {
184
- return exportDefinition.requestPayload.format === "CSV";
185
- }
186
- return false;
187
- }) ?? false;
188
- const isXlsxExportSelected = editedAutomation.exportDefinitions?.some((exportDefinition) => {
189
- if (isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload)) {
190
- return exportDefinition.requestPayload.format === "XLSX";
191
- }
192
- return false;
193
- }) ?? false;
194
- const xlsxExportSettings = editedAutomation.exportDefinitions?.find((exportDefinition) => exportDefinition.requestPayload.format === "XLSX")?.requestPayload.settings;
195
- const xlsxSettings = {
196
- mergeHeaders: xlsxExportSettings?.mergeHeaders ?? true,
197
- exportInfo: xlsxExportSettings?.exportInfo ?? true,
198
- };
199
- const pdfVisualizationSettings = editedAutomation.exportDefinitions?.find((exportDefinition) => isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload) &&
200
- exportDefinition.requestPayload.format === "PDF_TABULAR")?.requestPayload.settings;
201
- const pdfTabularSettings = pdfVisualizationSettings && "pageSize" in pdfVisualizationSettings
202
- ? pdfVisualizationSettings
203
- : undefined;
204
- const pdfSettings = {
205
- pageSize: pdfTabularSettings?.pageSize ?? defaultPdfPageSize ?? "A4",
206
- orientation: pdfTabularSettings?.orientation ?? "portrait",
207
- exportInfo: pdfTabularSettings?.exportInfo ?? true,
208
- };
209
- const csvExportDefinition = editedAutomation.exportDefinitions?.find((exportDefinition) => isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload) &&
210
- exportDefinition.requestPayload.format === "CSV");
211
- const csvExportSettings = csvExportDefinition &&
212
- isExportDefinitionVisualizationObjectRequestPayload(csvExportDefinition.requestPayload)
213
- ? csvExportDefinition.requestPayload.settings
214
- : undefined;
215
- const csvSettings = {
216
- delimiter: csvExportSettings?.delimiter ?? resolvedDefaultCsvDelimiter,
217
- };
218
- const csvRawExportDefinition = editedAutomation.exportDefinitions?.find((exportDefinition) => isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload) &&
219
- exportDefinition.requestPayload.format === "CSV_RAW");
220
- const csvRawExportSettings = csvRawExportDefinition &&
221
- isExportDefinitionVisualizationObjectRequestPayload(csvRawExportDefinition.requestPayload)
222
- ? csvRawExportDefinition.requestPayload.settings
223
- : undefined;
224
- const csvRawSettings = {
225
- delimiter: csvRawExportSettings?.delimiter ?? resolvedDefaultCsvDelimiter,
226
- };
227
- // Extract templateId per slides format, scoped to the current dialog mode
228
- const getTemplateIdForFormat = (format) => {
229
- const def = editedAutomation.exportDefinitions?.find((ed) => ed.requestPayload.format === format &&
230
- (isWidget
231
- ? isExportDefinitionVisualizationObjectRequestPayload(ed.requestPayload)
232
- : isExportDefinitionDashboardRequestPayload(ed.requestPayload)));
233
- return def?.requestPayload.templateId;
234
- };
235
- const slidesTemplateIds = {
236
- PPTX: getTemplateIdForFormat("PPTX"),
237
- PDF_SLIDES: getTemplateIdForFormat("PDF_SLIDES"),
238
- PDF: getTemplateIdForFormat("PDF"),
239
- };
240
201
  return {
241
- selectedAttachments,
242
- isDashboardExportSelected,
243
- isCsvExportSelected,
244
- isXlsxExportSelected,
245
- xlsxSettings,
246
- pdfSettings,
247
- csvSettings,
248
- csvRawSettings,
249
- slidesTemplateIds,
202
+ setParametersWire,
250
203
  onDashboardAttachmentsChange,
251
204
  onWidgetAttachmentsChange,
252
205
  onXlsxSettingsChange,
@@ -254,6 +207,5 @@ export function useScheduledEmailExportSettings({ editedAutomation, setEditedAut
254
207
  onCsvSettingsChange,
255
208
  onCsvRawSettingsChange,
256
209
  onSlidesTemplateIdChange,
257
- setParametersWire,
258
210
  };
259
211
  }
@@ -1,8 +1,8 @@
1
1
  import { type Dispatch, type SetStateAction } from "react";
2
2
  import { type FilterContextItem, type IAutomationMetadataObject, type IAutomationMetadataObjectDefinition, type IAutomationVisibleFilter, type IDashboardExportParameter, type IInsight, type IWidget } from "@gooddata/sdk-model";
3
- import type { IAutomationFiltersTab } from "../../../../../model/store/filtering/types.js";
4
- import { type IUseAutomationExportParameters } from "../../../shared/automationFilters/useAutomationExportParameters.js";
5
- export interface IUseScheduledEmailFiltersProps {
3
+ import type { IAutomationFiltersTab } from "../../../../model/store/filtering/types.js";
4
+ import { type IUseAutomationExportParameters } from "../../shared/automationFilters/useAutomationExportParameters.js";
5
+ export interface IUseScheduledEmailFiltersModelProps {
6
6
  setEditedAutomation: Dispatch<SetStateAction<IAutomationMetadataObjectDefinition>>;
7
7
  scheduledExportToEdit?: IAutomationMetadataObject;
8
8
  widget?: IWidget;
@@ -34,13 +34,13 @@ export interface IUseScheduledEmailFiltersProps {
34
34
  *
35
35
  * @internal
36
36
  */
37
- export declare function useScheduledEmailFilters({ setEditedAutomation, scheduledExportToEdit, widget, insight, editedAutomationFilters, setEditedAutomationFilters, editedAutomationFiltersByTab, setEditedAutomationFiltersByTab, availableFilters, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersByTab, storeFilters, setStoreFilters, filtersForNewAutomation, setParametersWire }: IUseScheduledEmailFiltersProps): IUseScheduledEmailFilters;
37
+ export declare function useScheduledEmailFiltersModel({ setEditedAutomation, scheduledExportToEdit, widget, insight, editedAutomationFilters, setEditedAutomationFilters, editedAutomationFiltersByTab, setEditedAutomationFiltersByTab, availableFilters, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersByTab, storeFilters, setStoreFilters, filtersForNewAutomation, setParametersWire }: IUseScheduledEmailFiltersModelProps): IUseScheduledEmailFiltersModel;
38
38
  /**
39
- * Return type of {@link useScheduledEmailFilters}: its own filter model plus the whole absorbed
39
+ * Return type of {@link useScheduledEmailFiltersModel}: its own filter model plus the whole absorbed
40
40
  * {@link useAutomationExportParameters} model, spread in verbatim so its member names stay canonical.
41
41
  * @internal
42
42
  */
43
- export interface IUseScheduledEmailFilters extends IUseAutomationExportParameters {
43
+ export interface IUseScheduledEmailFiltersModel extends IUseAutomationExportParameters {
44
44
  selectedFilters: FilterContextItem[];
45
45
  availableFilters: FilterContextItem[] | undefined;
46
46
  storeFilters: boolean;
@@ -53,4 +53,4 @@ export interface IUseScheduledEmailFilters extends IUseAutomationExportParameter
53
53
  automationIsValid: boolean;
54
54
  filtersAreStale: boolean;
55
55
  }
56
- //# sourceMappingURL=useScheduledEmailFilters.d.ts.map
56
+ //# sourceMappingURL=useScheduledEmailFiltersModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledEmailFiltersModel.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAuB,MAAM,OAAO,CAAC;AAEhF,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EACxC,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,QAAQ,EACb,KAAK,OAAO,EAIf,MAAM,qBAAqB,CAAC;AAG7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAGxF,OAAO,EACH,KAAK,8BAA8B,EAEtC,MAAM,iEAAiE,CAAC;AASzE,MAAM,WAAW,mCAAmC;IAChD,mBAAmB,EAAE,QAAQ,CAAC,cAAc,CAAC,mCAAmC,CAAC,CAAC,CAAC;IACnF,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,uBAAuB,EAAE,iBAAiB,EAAE,CAAC;IAC7C,0BAA0B,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IACnE,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACnE,+BAA+B,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,KAAK,IAAI,CAAC;IACzF,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACvC,gCAAgC,CAAC,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IAC1E,qCAAqC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;IACnF,YAAY,CAAC,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;IACnD,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,uBAAuB,EAAE,iBAAiB,EAAE,CAAC;IAC7C,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,CAAC;CAC9F;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,6BAA6B,CAAC,EAC1C,mBAAmB,EACnB,qBAAqB,EACrB,MAAM,EACN,OAAO,EACP,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAC5B,+BAA+B,EAC/B,gBAAgB,EAChB,gCAAgC,EAChC,qCAAqC,EACrC,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACpB,EAAE,mCAAmC,GAAG,8BAA8B,CAiRtE;AAkBD;;;;GAIG;AACH,MAAM,WAAW,8BAA+B,SAAQ,8BAA8B;IAClF,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAClD,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;IAClD,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAAG,SAAS,CAAC;IACpE,eAAe,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,iBAAiB,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACrF,oBAAoB,EAAE,CAClB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,EACpD,iBAAiB,CAAC,EAAE,OAAO,KAC1B,IAAI,CAAC;IACV,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,oBAAoB,EAAE,CAClB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,iBAAiB,EAAE,EAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,KACtD,IAAI,CAAC;IACV,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;CAC5B"}
@@ -1,11 +1,12 @@
1
1
  // (C) 2026 GoodData Corporation
2
- import { useCallback } from "react";
2
+ import { useCallback, useRef } from "react";
3
3
  import { isExportDefinitionDashboardRequestPayload, isExportDefinitionVisualizationObjectRequestPayload, isInsightWidget, } from "@gooddata/sdk-model";
4
- import { useScheduledEmailDialogContext } from "../../../contexts/ScheduledEmailDialogContext.js";
5
- import { useValidateExistingAutomationFilters } from "../../../shared/automationFilters/hooks/useValidateExistingAutomationFilters.js";
6
- import { useAutomationExportParameters, } from "../../../shared/automationFilters/useAutomationExportParameters.js";
7
- import { getDefaultSelectedFiltersFromFiltersByTab } from "../../../shared/automationFilters/useAutomationFiltersSelect.js";
8
- import { getAppliedDashboardFilters, getAppliedWidgetFilters, getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, } from "../../../shared/filters/index.js";
4
+ import { shallowEqualObjects } from "@gooddata/util";
5
+ import { useScheduledEmailDialogContext } from "../../contexts/ScheduledEmailDialogContext.js";
6
+ import { useValidateExistingAutomationFilters } from "../../shared/automationFilters/hooks/useValidateExistingAutomationFilters.js";
7
+ import { useAutomationExportParameters, } from "../../shared/automationFilters/useAutomationExportParameters.js";
8
+ import { getDefaultSelectedFiltersFromFiltersByTab } from "../../shared/automationFilters/useAutomationFiltersSelect.js";
9
+ import { getAppliedDashboardFilters, getAppliedWidgetFilters, getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, } from "../../shared/filters/index.js";
9
10
  /**
10
11
  * The scheduled-email dialog's single filter model: the current selection and available filters
11
12
  * (flat and per-tab), the handlers that mutate them and mirror the result into the draft, the
@@ -20,7 +21,7 @@ import { getAppliedDashboardFilters, getAppliedWidgetFilters, getVisibleFiltersB
20
21
  *
21
22
  * @internal
22
23
  */
23
- export function useScheduledEmailFilters({ setEditedAutomation, scheduledExportToEdit, widget, insight, editedAutomationFilters, setEditedAutomationFilters, editedAutomationFiltersByTab, setEditedAutomationFiltersByTab, availableFilters, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersByTab, storeFilters, setStoreFilters, filtersForNewAutomation, setParametersWire, }) {
24
+ export function useScheduledEmailFiltersModel({ setEditedAutomation, scheduledExportToEdit, widget, insight, editedAutomationFilters, setEditedAutomationFilters, editedAutomationFiltersByTab, setEditedAutomationFiltersByTab, availableFilters, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersByTab, storeFilters, setStoreFilters, filtersForNewAutomation, setParametersWire, }) {
24
25
  const { hiddenFilters: dashboardHiddenFilters, commonDateFilterId, exportParametersByTab, } = useScheduledEmailDialogContext();
25
26
  // Re-derived locally (not passed as a prop) so that the `if (isWidget)` branch below narrows
26
27
  // `widget`/`insight` via TS's aliased-condition control-flow analysis — this requires the boolean
@@ -200,7 +201,10 @@ export function useScheduledEmailFilters({ setEditedAutomation, scheduledExportT
200
201
  }
201
202
  onStoreParametersChange(value);
202
203
  }, [onFiltersChange, onFiltersByTabChange, setStoreFilters, onStoreParametersChange]);
203
- return {
204
+ // Held stable member-wise, not just internally: this whole object is the filter context's value,
205
+ // so its identity is what every consumer re-renders on. The model never reads the draft, so a
206
+ // keystroke changes no member — and without this a fresh literal would re-render every consumer.
207
+ return useShallowStable({
204
208
  selectedFilters: editedAutomationFilters,
205
209
  availableFilters,
206
210
  storeFilters,
@@ -213,5 +217,18 @@ export function useScheduledEmailFilters({ setEditedAutomation, scheduledExportT
213
217
  automationIsValid,
214
218
  filtersAreStale,
215
219
  ...parameters,
216
- };
220
+ });
221
+ }
222
+ /**
223
+ * Returns the previous object while every member keeps its identity, so a caller can hold a whole
224
+ * model stable without naming its members. Preferred over `useMemo` here because the roster is the
225
+ * hook's return shape: a dependency array would have to restate all of it, and a missed entry would
226
+ * serve a stale member rather than fail loudly.
227
+ */
228
+ function useShallowStable(value) {
229
+ const previous = useRef(value);
230
+ if (!shallowEqualObjects(previous.current, value)) {
231
+ previous.current = value;
232
+ }
233
+ return previous.current;
217
234
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledEmailFormState.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/scheduledEmail/state/useScheduledEmailFormState.ts"],"names":[],"mappings":"AAIA,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAE9B,KAAK,mCAAmC,EACxC,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,4CAA4C,EACjD,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,OAAO,EACf,MAAM,qBAAqB,CAAC;AAqB7B,MAAM,WAAW,gCAAgC;IAC7C,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,oBAAoB,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAC9F,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB,EAAE,OAAO,EAAE,CAAC;IAClC,iCAAiC,EAAE,OAAO,EAAE,CAAC;IAC7C,6BAA6B,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IACtE,yBAAyB,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC3D,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAAG,SAAS,CAAC;IAChF,gCAAgC,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IACzE,qCAAqC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,GAAG,SAAS,CAAC;IAC9F,+BAA+B,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,EAAE,CAAC,GAAG,SAAS,CAAC;IACzF,kBAAkB,CAAC,EAAE,4CAA4C,CAAC,UAAU,CAAC,CAAC;CACjF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,EACvC,qBAAqB,EACrB,MAAM,EACN,OAAO,EACP,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,iCAAiC,EACjC,6BAA6B,EAC7B,yBAAyB,EACzB,8BAA8B,EAC9B,gCAAgC,EAChC,qCAAqC,EACrC,+BAA+B,EAC/B,kBAAkB,EACrB,EAAE,gCAAgC;;;;;;;;;;;;;;;;;;EAyJlC"}
@@ -1,12 +1,12 @@
1
1
  // (C) 2026 GoodData Corporation
2
- import { useState } from "react";
3
- import { setExportParametersByTab } from "../../../../../_staging/automation/index.js";
4
- import { useAutomationsContext } from "../../../contexts/AutomationsContext.js";
5
- import { useScheduledEmailDialogContext } from "../../../contexts/ScheduledEmailDialogContext.js";
6
- import { convertExternalRecipientToAutomationRecipient, convertUserToAutomationRecipient, } from "../../../shared/utils/automationUtils.js";
7
- import { toModifiedISOStringToTimezone, toNormalizedFirstRunAndCron, toNormalizedStartDate, } from "../../utils/date.js";
8
- import { getUserTimezone } from "../../utils/timezone.js";
9
- import { newDashboardExportDefinitionMetadataObjectDefinition, newWidgetExportDefinitionMetadataObjectDefinition, } from "../utils/exportDefinitions.js";
2
+ import { useCallback, useMemo, useState } from "react";
3
+ import { setExportParametersByTab } from "../../../../_staging/automation/index.js";
4
+ import { useAutomationsContext } from "../../contexts/AutomationsContext.js";
5
+ import { useScheduledEmailDialogContext } from "../../contexts/ScheduledEmailDialogContext.js";
6
+ import { convertExternalRecipientToAutomationRecipient, convertUserToAutomationRecipient, } from "../../shared/utils/automationUtils.js";
7
+ import { toModifiedISOStringToTimezone, toNormalizedFirstRunAndCron, toNormalizedStartDate, } from "../utils/date.js";
8
+ import { getUserTimezone } from "../utils/timezone.js";
9
+ import { newDashboardExportDefinitionMetadataObjectDefinition, newWidgetExportDefinitionMetadataObjectDefinition, } from "./exportDefinitions.js";
10
10
  /**
11
11
  * Owns the scheduled-email dialog's `editedAutomation` draft (initialized either from
12
12
  * `scheduledExportToEdit` or via `newAutomationMetadataObjectDefinition`), its `originalAutomation`
@@ -27,10 +27,10 @@ export function useScheduledEmailFormState({ scheduledExportToEdit, widget, insi
27
27
  const isWidget = !!widget && !!insight;
28
28
  // Determine target tab ID if widget is present
29
29
  const targetTabId = widget?.localIdentifier ? widgetTabMap[widget.localIdentifier] : undefined;
30
- const defaultUser = convertUserToAutomationRecipient(currentUser);
31
- const defaultRecipient = externalRecipientOverride
30
+ const defaultUser = useMemo(() => convertUserToAutomationRecipient(currentUser), [currentUser]);
31
+ const defaultRecipient = useMemo(() => externalRecipientOverride
32
32
  ? convertExternalRecipientToAutomationRecipient(externalRecipientOverride)
33
- : convertUserToAutomationRecipient(currentUser);
33
+ : convertUserToAutomationRecipient(currentUser), [externalRecipientOverride, currentUser]);
34
34
  const firstChannel = notificationChannels[0]?.id;
35
35
  const [editedAutomation, setEditedAutomation] = useState(() => scheduledExportToEdit ??
36
36
  newAutomationMetadataObjectDefinition(isWidget
@@ -70,11 +70,11 @@ export function useScheduledEmailFormState({ scheduledExportToEdit, widget, insi
70
70
  const [isTitleValid, setIsTitleValid] = useState(true);
71
71
  const [isSubjectValid, setIsSubjectValid] = useState(true);
72
72
  const [isOnMessageValid, setIsOnMessageValid] = useState(true);
73
- const onTitleChange = (value, isValid) => {
73
+ const onTitleChange = useCallback((value, isValid) => {
74
74
  setIsTitleValid(isValid);
75
75
  setEditedAutomation((s) => ({ ...s, title: value }));
76
- };
77
- const onRecurrenceChange = (cronExpression, startDate, isValid) => {
76
+ }, []);
77
+ const onRecurrenceChange = useCallback((cronExpression, startDate, isValid) => {
78
78
  setIsCronValid(isValid);
79
79
  setEditedAutomation((s) => ({
80
80
  ...s,
@@ -84,26 +84,26 @@ export function useScheduledEmailFormState({ scheduledExportToEdit, widget, insi
84
84
  firstRun: toModifiedISOStringToTimezone(startDate ?? new Date(), timezone).iso,
85
85
  },
86
86
  }));
87
- };
88
- const onEvaluationModeChange = (isShared) => {
87
+ }, [timezone]);
88
+ const onEvaluationModeChange = useCallback((isShared) => {
89
89
  setEditedAutomation((s) => ({
90
90
  ...s,
91
91
  evaluationMode: isShared ? "SHARED" : "PER_RECIPIENT",
92
92
  }));
93
- };
94
- const onDestinationChange = (notificationChannelId) => {
93
+ }, []);
94
+ const onDestinationChange = useCallback((notificationChannelId) => {
95
95
  setEditedAutomation((s) => ({
96
96
  ...s,
97
97
  notificationChannel: notificationChannelId,
98
98
  }));
99
- };
100
- const onRecipientsChange = (updatedRecipients) => {
99
+ }, []);
100
+ const onRecipientsChange = useCallback((updatedRecipients) => {
101
101
  setEditedAutomation((s) => ({
102
102
  ...s,
103
103
  recipients: updatedRecipients,
104
104
  }));
105
- };
106
- const onSubjectChange = (value, isValid) => {
105
+ }, []);
106
+ const onSubjectChange = useCallback((value, isValid) => {
107
107
  setIsSubjectValid(isValid);
108
108
  setEditedAutomation((s) => ({
109
109
  ...s,
@@ -112,8 +112,8 @@ export function useScheduledEmailFormState({ scheduledExportToEdit, widget, insi
112
112
  subject: value,
113
113
  },
114
114
  }));
115
- };
116
- const onMessageChange = (value, isValid) => {
115
+ }, []);
116
+ const onMessageChange = useCallback((value, isValid) => {
117
117
  setIsOnMessageValid(isValid);
118
118
  setEditedAutomation((s) => ({
119
119
  ...s,
@@ -122,7 +122,7 @@ export function useScheduledEmailFormState({ scheduledExportToEdit, widget, insi
122
122
  message: value,
123
123
  },
124
124
  }));
125
- };
125
+ }, []);
126
126
  return {
127
127
  editedAutomation,
128
128
  setEditedAutomation,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledEmailFormValidity.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/scheduledEmail/state/useScheduledEmailFormValidity.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EACxC,KAAK,oBAAoB,EACzB,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EAI1C,MAAM,qBAAqB,CAAC;AAM7B,MAAM,WAAW,mCAAmC;IAChD,gBAAgB,EAAE,mCAAmC,CAAC;IACtD,kBAAkB,EAAE,mCAAmC,CAAC;IACxD,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,oBAAoB,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAC9F,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,wBAAwB,EAAE,MAAM,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,mCAAmC,GAAG;IAIvF,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,aAAa,EAAE,OAAO,CAAC;IACvB,uBAAuB,EAAE,OAAO,CAAC;IACjC,6BAA6B,EAAE,OAAO,CAAC;CAC1C,CAsEA"}
@@ -1,9 +1,9 @@
1
1
  // (C) 2026 GoodData Corporation
2
2
  import { useIntl } from "react-intl";
3
3
  import { isAutomationExternalUserRecipient, isAutomationUnknownUserRecipient, isAutomationUserRecipient, } from "@gooddata/sdk-model";
4
- import { areAutomationsEqual } from "../../../shared/utils/automationUtils.js";
5
- import { isEmail } from "../../utils/validate.js";
6
- import { useScheduleValidation } from "./useScheduleValidation.js";
4
+ import { areAutomationsEqual } from "../../shared/utils/automationUtils.js";
5
+ import { useScheduleValidation } from "../DefaultScheduledEmailDialog/hooks/useScheduleValidation.js";
6
+ import { isEmail } from "../utils/validate.js";
7
7
  export function useScheduledEmailFormValidity(props) {
8
8
  const { editedAutomation, originalAutomation, scheduledExportToEdit, notificationChannels, defaultRecipient, maxAutomationsRecipients, isCronValid, isTitleValid, isSubjectValid, isOnMessageValid, } = props;
9
9
  const intl = useIntl();
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Reads what the scheduled-export dialog's attachment section displays: the selected formats, which
3
+ * export kinds are present, the per-format settings with their fallbacks, and the slides template
4
+ * chosen per format.
5
+ *
6
+ * Derived per consumer rather than published on a context: every value is a pure function of the
7
+ * draft and of workspace settings, and no consumer observes their identity. The handlers that
8
+ * *change* attachments are on {@link useScheduledExportActions}, because they capture the stored
9
+ * export-parameter wire, which must exist once per dialog.
10
+ *
11
+ * @internal
12
+ */
13
+ export declare function useScheduledExportAttachments(): {
14
+ selectedAttachments: ("CSV" | "CSV_RAW" | "HTML" | "PDF" | "PDF_SLIDES" | "PDF_TABULAR" | "PNG" | "PPTX" | "XLSX")[];
15
+ isDashboardExportSelected: boolean;
16
+ isCsvExportSelected: boolean;
17
+ isXlsxExportSelected: boolean;
18
+ xlsxSettings: {
19
+ mergeHeaders: boolean;
20
+ exportInfo: boolean;
21
+ };
22
+ pdfSettings: {
23
+ pageSize: import("../utils/pdfPageSize.js").PdfPageSize;
24
+ orientation: "landscape" | "portrait";
25
+ exportInfo: boolean;
26
+ };
27
+ csvSettings: {
28
+ delimiter: string;
29
+ };
30
+ csvRawSettings: {
31
+ delimiter: string;
32
+ };
33
+ slidesTemplateIds: {
34
+ PPTX: string | undefined;
35
+ PDF_SLIDES: string | undefined;
36
+ PDF: string | undefined;
37
+ };
38
+ };
39
+ //# sourceMappingURL=useScheduledExportAttachments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledExportAttachments.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/scheduledEmail/state/useScheduledExportAttachments.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;GAWG;AACH,wBAAgB,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;EAwH5C"}