@gooddata/sdk-ui-dashboard 11.50.0-alpha.0 → 11.50.0-alpha.2

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 (26) hide show
  1. package/NOTICE +216 -203
  2. package/esm/__version.d.ts +1 -1
  3. package/esm/__version.js +1 -1
  4. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts +6 -6
  5. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts.map +1 -1
  6. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.js +65 -534
  7. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.d.ts +38 -0
  8. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.d.ts.map +1 -0
  9. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.js +61 -0
  10. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailExportSettings.d.ts +57 -0
  11. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailExportSettings.d.ts.map +1 -0
  12. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailExportSettings.js +241 -0
  13. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.d.ts +55 -0
  14. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.d.ts.map +1 -0
  15. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.js +203 -0
  16. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormValidity.d.ts +21 -0
  17. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormValidity.d.ts.map +1 -0
  18. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormValidity.js +52 -0
  19. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/utils/exportDefinitions.d.ts +27 -0
  20. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/utils/exportDefinitions.d.ts.map +1 -0
  21. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/utils/exportDefinitions.js +95 -0
  22. package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.d.ts.map +1 -1
  23. package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.js +11 -5
  24. package/esm/tsdoc-metadata.json +1 -1
  25. package/package.json +21 -21
  26. package/styles/css/main.css +1 -1
@@ -0,0 +1,38 @@
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";
3
+ export interface IUseScheduledEmailEffectiveFiltersProps {
4
+ widget?: IWidget;
5
+ insight?: IInsight;
6
+ editedAutomationFilters?: FilterContextItem[];
7
+ editedAutomationFiltersByTab?: Record<string, FilterContextItem[]>;
8
+ availableFiltersAsVisibleFilters?: IAutomationVisibleFilter[] | undefined;
9
+ availableFiltersAsVisibleFiltersByTab?: Record<string, IAutomationVisibleFilter[]>;
10
+ filtersDataByTab?: IAutomationFiltersTab[] | undefined;
11
+ storeFilters?: boolean;
12
+ }
13
+ /**
14
+ * Derives the effective-filters cluster consumed early by `useScheduledEmailFormState` (draft init) and
15
+ * `useScheduledEmailExportSettings`, and later still by the (still-in-parent) filters handlers.
16
+ *
17
+ * Filters slice A of 2. Reads `hiddenFilters`/`commonDateFilterId`/`exportParametersByTab` from
18
+ * {@link useScheduledEmailDialogContext} internally, same as the parent (`useEditScheduledEmail`) does
19
+ * today. `isWidget` is re-derived internally (`!!widget && !!insight`) — if the parent still needs it for
20
+ * the filters handlers, it keeps its own copy, a harmless identical re-derivation (mirrors the sibling
21
+ * hooks).
22
+ *
23
+ * Slice B (`useScheduledEmailFilters`, next PR) will own the four filters handlers, which run after
24
+ * `formState` (they need `setEditedAutomation`); this derivation cluster runs before it, hence the split.
25
+ *
26
+ * @internal
27
+ */
28
+ export declare function useScheduledEmailEffectiveFilters({ widget, insight, editedAutomationFilters, editedAutomationFiltersByTab, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersDataByTab, storeFilters }: IUseScheduledEmailEffectiveFiltersProps): {
29
+ effectiveWidgetFilters: IFilter[];
30
+ effectiveWidgetFiltersWithInsight: IFilter[];
31
+ effectiveVisibleWidgetFilters: IAutomationVisibleFilter[] | undefined;
32
+ effectiveDashboardFilters: FilterContextItem[] | undefined;
33
+ effectiveDashboardFiltersByTab: Record<string, FilterContextItem[]> | undefined;
34
+ effectiveVisibleDashboardFilters: IAutomationVisibleFilter[] | undefined;
35
+ effectiveVisibleDashboardFiltersByTab: Record<string, IAutomationVisibleFilter[]> | undefined;
36
+ parametersByTabForNewAutomation: Record<string, IDashboardExportParameter[]> | undefined;
37
+ };
38
+ //# sourceMappingURL=useScheduledEmailEffectiveFilters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledEmailEffectiveFilters.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/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,+CAA+C,CAAC;AAU3F,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;;;;;;;;;;;;;;GAcG;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,CA4FA"}
@@ -0,0 +1,61 @@
1
+ // (C) 2026 GoodData Corporation
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/automationFilters/utils.js";
6
+ /**
7
+ * Derives the effective-filters cluster consumed early by `useScheduledEmailFormState` (draft init) and
8
+ * `useScheduledEmailExportSettings`, and later still by the (still-in-parent) filters handlers.
9
+ *
10
+ * Filters slice A of 2. Reads `hiddenFilters`/`commonDateFilterId`/`exportParametersByTab` from
11
+ * {@link useScheduledEmailDialogContext} internally, same as the parent (`useEditScheduledEmail`) does
12
+ * today. `isWidget` is re-derived internally (`!!widget && !!insight`) — if the parent still needs it for
13
+ * the filters handlers, it keeps its own copy, a harmless identical re-derivation (mirrors the sibling
14
+ * hooks).
15
+ *
16
+ * Slice B (`useScheduledEmailFilters`, next PR) will own the four filters handlers, which run after
17
+ * `formState` (they need `setEditedAutomation`); this derivation cluster runs before it, hence the split.
18
+ *
19
+ * @internal
20
+ */
21
+ export function useScheduledEmailEffectiveFilters({ widget, insight, editedAutomationFilters, editedAutomationFiltersByTab, availableFiltersAsVisibleFilters, availableFiltersAsVisibleFiltersByTab, filtersDataByTab, storeFilters, }) {
22
+ const { hiddenFilters: dashboardHiddenFilters, commonDateFilterId, exportParametersByTab: effectiveExportParametersByTab, } = useScheduledEmailDialogContext();
23
+ const isWidget = !!widget && !!insight;
24
+ const effectiveWidgetFilters = getAppliedWidgetFilters(editedAutomationFilters ?? [], dashboardHiddenFilters, widget, insight, commonDateFilterId, false);
25
+ const effectiveWidgetFiltersWithInsight = getAppliedWidgetFilters(editedAutomationFilters ?? [], dashboardHiddenFilters, widget, insight, commonDateFilterId, true);
26
+ const effectiveVisibleWidgetFilters = getVisibleFiltersByFilters(editedAutomationFilters, availableFiltersAsVisibleFilters, true);
27
+ const effectiveDashboardFilters = getAppliedDashboardFilters(editedAutomationFilters ?? [], dashboardHiddenFilters, isWidget ? true : storeFilters);
28
+ // Process filters per tab if provided (for dashboard automations with tabs enabled)
29
+ const effectiveDashboardFiltersByTab = useMemo(() => {
30
+ if (!editedAutomationFiltersByTab || !storeFilters) {
31
+ return undefined;
32
+ }
33
+ // Apply the same processing as effectiveDashboardFilters to each tab's filters
34
+ return Object.entries(editedAutomationFiltersByTab).reduce((acc, [tabId, filters]) => {
35
+ const tabHiddenFilters = filtersDataByTab?.find((tab) => tab.tabId === tabId)?.hiddenFilters ?? [];
36
+ const appliedFilters = getAppliedDashboardFilters(filters ?? [], tabHiddenFilters, storeFilters);
37
+ // Only add if we got filters back (storeFilters is true)
38
+ if (appliedFilters) {
39
+ acc[tabId] = appliedFilters;
40
+ }
41
+ return acc;
42
+ }, {});
43
+ }, [editedAutomationFiltersByTab, filtersDataByTab, storeFilters]);
44
+ const effectiveVisibleDashboardFilters = getVisibleFiltersByFilters(editedAutomationFilters ?? [], availableFiltersAsVisibleFilters, storeFilters);
45
+ const effectiveVisibleDashboardFiltersByTab = getVisibleFiltersByFiltersByTab(editedAutomationFiltersByTab, availableFiltersAsVisibleFiltersByTab, storeFilters);
46
+ // Mirrors the filters seed above, for parameters.
47
+ const parametersByTabForNewAutomation = shouldStoreExportParameters(isWidget, storeFilters) &&
48
+ Object.keys(effectiveExportParametersByTab).length > 0
49
+ ? effectiveExportParametersByTab
50
+ : undefined;
51
+ return {
52
+ effectiveWidgetFilters,
53
+ effectiveWidgetFiltersWithInsight,
54
+ effectiveVisibleWidgetFilters,
55
+ effectiveDashboardFilters,
56
+ effectiveDashboardFiltersByTab,
57
+ effectiveVisibleDashboardFilters,
58
+ effectiveVisibleDashboardFiltersByTab,
59
+ parametersByTabForNewAutomation,
60
+ };
61
+ }
@@ -0,0 +1,57 @@
1
+ import { type Dispatch, type RefObject, type SetStateAction } from "react";
2
+ import { type DashboardAttachmentType, type FilterContextItem, type IAutomationMetadataObjectDefinition, type IDashboardExportParameter, type IExportDefinitionVisualizationObjectSettings, type IFilter, type IInsight, type IWidget, type WidgetAttachmentType } from "@gooddata/sdk-model";
3
+ export interface IUseScheduledEmailExportSettingsProps {
4
+ editedAutomation: IAutomationMetadataObjectDefinition;
5
+ setEditedAutomation: Dispatch<SetStateAction<IAutomationMetadataObjectDefinition>>;
6
+ insight?: IInsight;
7
+ widget?: IWidget;
8
+ dashboardId?: string;
9
+ dashboardTitle: string;
10
+ storeFilters?: boolean;
11
+ effectiveDashboardFilters: FilterContextItem[] | undefined;
12
+ effectiveDashboardFiltersByTab: Record<string, FilterContextItem[]> | undefined;
13
+ effectiveWidgetFilters: IFilter[];
14
+ effectiveWidgetFiltersWithInsight: IFilter[];
15
+ defaultPdfPageSize?: IExportDefinitionVisualizationObjectSettings["pageSize"];
16
+ resolvedDefaultCsvDelimiter: string;
17
+ /**
18
+ * Holds the wire outside the automation so it survives a rebuild from zero export definitions —
19
+ * with no definitions `setExportParametersByTab` has nowhere to store it. Owned by the parent
20
+ * (`useEditScheduledEmail`); read here (never written) at attachment-change time.
21
+ */
22
+ latestParametersWireRef: RefObject<Record<string, IDashboardExportParameter[]> | undefined>;
23
+ }
24
+ export declare function useScheduledEmailExportSettings({ editedAutomation, setEditedAutomation, insight, widget, dashboardId, dashboardTitle, storeFilters, effectiveDashboardFilters, effectiveDashboardFiltersByTab, effectiveWidgetFilters, effectiveWidgetFiltersWithInsight, defaultPdfPageSize, resolvedDefaultCsvDelimiter, latestParametersWireRef }: IUseScheduledEmailExportSettingsProps): {
25
+ selectedAttachments: ("CSV" | "CSV_RAW" | "HTML" | "PDF" | "PDF_SLIDES" | "PDF_TABULAR" | "PNG" | "PPTX" | "XLSX")[];
26
+ isDashboardExportSelected: boolean;
27
+ isCsvExportSelected: boolean;
28
+ isXlsxExportSelected: boolean;
29
+ xlsxSettings: {
30
+ mergeHeaders: boolean;
31
+ exportInfo: boolean;
32
+ };
33
+ pdfSettings: {
34
+ pageSize: "A3" | "A4" | "LETTER";
35
+ orientation: "landscape" | "portrait";
36
+ exportInfo: boolean;
37
+ };
38
+ csvSettings: {
39
+ delimiter: string;
40
+ };
41
+ csvRawSettings: {
42
+ delimiter: string;
43
+ };
44
+ slidesTemplateIds: {
45
+ PPTX: string | undefined;
46
+ PDF_SLIDES: string | undefined;
47
+ PDF: string | undefined;
48
+ };
49
+ onDashboardAttachmentsChange: (formats: DashboardAttachmentType[]) => void;
50
+ onWidgetAttachmentsChange: (formats: WidgetAttachmentType[]) => void;
51
+ onXlsxSettingsChange: (settings: IExportDefinitionVisualizationObjectSettings) => void;
52
+ onPdfSettingsChange: (settings: IExportDefinitionVisualizationObjectSettings) => void;
53
+ onCsvSettingsChange: (settings: IExportDefinitionVisualizationObjectSettings) => void;
54
+ onCsvRawSettingsChange: (settings: IExportDefinitionVisualizationObjectSettings) => void;
55
+ onSlidesTemplateIdChange: (templateId: string | undefined, format: "PDF" | "PDF_SLIDES" | "PPTX") => void;
56
+ };
57
+ //# sourceMappingURL=useScheduledEmailExportSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledEmailExportSettings.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailExportSettings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAwB,MAAM,OAAO,CAAC;AAIjG,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;AAQ7B,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,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,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;IAC9E,2BAA2B,EAAE,MAAM,CAAC;IACpC;;;;OAIG;IACH,uBAAuB,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,yBAAyB,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;CAC/F;AAED,wBAAgB,+BAA+B,CAAC,EAC5C,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,MAAM,EACN,WAAW,EACX,cAAc,EACd,YAAY,EACZ,yBAAyB,EACzB,8BAA8B,EAC9B,sBAAsB,EACtB,iCAAiC,EACjC,kBAAkB,EAClB,2BAA2B,EAC3B,uBAAuB,EAC1B,EAAE,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8UvC"}
@@ -0,0 +1,241 @@
1
+ // (C) 2019-2026 GoodData Corporation
2
+ import { useCallback, useMemo } from "react";
3
+ import { invariant } from "ts-invariant";
4
+ import { isExportDefinitionDashboardRequestPayload, isExportDefinitionVisualizationObjectRequestPayload, } from "@gooddata/sdk-model";
5
+ import { newDashboardExportDefinitionMetadataObjectDefinition, newWidgetExportDefinitionMetadataObjectDefinition, withRebuiltExportDefinitions, } from "../utils/exportDefinitions.js";
6
+ export function useScheduledEmailExportSettings({ editedAutomation, setEditedAutomation, insight, widget, dashboardId, dashboardTitle, storeFilters, effectiveDashboardFilters, effectiveDashboardFiltersByTab, effectiveWidgetFilters, effectiveWidgetFiltersWithInsight, defaultPdfPageSize, resolvedDefaultCsvDelimiter, latestParametersWireRef, }) {
7
+ // Re-derived locally (not passed as a prop) so that `invariant(isWidget, ...)` below narrows
8
+ // `widget`/`insight` via TS's aliased-condition control-flow analysis — this requires the boolean
9
+ // to be declared from those exact variables in this same scope, same as in the parent.
10
+ const isWidget = !!widget && !!insight;
11
+ const selectedAttachments = useMemo(() => {
12
+ return (editedAutomation.exportDefinitions
13
+ ?.map((exportDefinition) => exportDefinition.requestPayload.format)
14
+ .filter(Boolean) ?? []);
15
+ }, [editedAutomation.exportDefinitions]);
16
+ const onDashboardAttachmentsChange = (formats) => {
17
+ setEditedAutomation((s) => {
18
+ const currentExportDefinitions = s.exportDefinitions || [];
19
+ const currentDashboardExportDefinitions = currentExportDefinitions.filter((exportDefinition) => isExportDefinitionDashboardRequestPayload(exportDefinition.requestPayload));
20
+ const currentFormats = currentDashboardExportDefinitions.map((exportDefinition) => exportDefinition.requestPayload.format);
21
+ const formatsToKeep = currentFormats.filter((format) => formats.includes(format));
22
+ const formatsToAdd = formats.filter((format) => !currentFormats.includes(format));
23
+ const keptExportDefinitions = currentDashboardExportDefinitions.filter((exportDefinition) => formatsToKeep.includes(exportDefinition.requestPayload.format));
24
+ const newExportDefinitions = formatsToAdd.map((format) => newDashboardExportDefinitionMetadataObjectDefinition({
25
+ dashboardId: dashboardId,
26
+ dashboardTitle,
27
+ dashboardFilters: storeFilters ? effectiveDashboardFilters : undefined,
28
+ filtersByTab: storeFilters ? effectiveDashboardFiltersByTab : undefined,
29
+ format,
30
+ }));
31
+ const updatedExportDefinitions = [...keptExportDefinitions, ...newExportDefinitions];
32
+ return withRebuiltExportDefinitions(s, updatedExportDefinitions, latestParametersWireRef.current);
33
+ });
34
+ };
35
+ const onWidgetAttachmentsChange = (formats) => {
36
+ invariant(isWidget, "Widget or insight is missing in scheduling dialog context.");
37
+ setEditedAutomation((s) => {
38
+ const currentExportDefinitions = s.exportDefinitions || [];
39
+ const currentWidgetExportDefinitions = currentExportDefinitions.filter((exportDefinition) => isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload));
40
+ const currentFormats = currentWidgetExportDefinitions.map((exportDefinition) => exportDefinition.requestPayload.format);
41
+ const formatsToKeep = currentFormats.filter((format) => formats.includes(format));
42
+ const formatsToAdd = formats.filter((format) => !currentFormats.includes(format));
43
+ const keptExportDefinitions = currentWidgetExportDefinitions.filter((exportDefinition) => formatsToKeep.includes(exportDefinition.requestPayload.format));
44
+ const newExportDefinitions = formatsToAdd.map((format) => newWidgetExportDefinitionMetadataObjectDefinition({
45
+ insight,
46
+ widget,
47
+ dashboardId: dashboardId,
48
+ format,
49
+ widgetFilters: effectiveWidgetFilters,
50
+ widgetFiltersWithInsight: effectiveWidgetFiltersWithInsight,
51
+ dashboardFilters: effectiveDashboardFilters,
52
+ defaultPdfPageSize,
53
+ }));
54
+ const updatedExportDefinitions = [...keptExportDefinitions, ...newExportDefinitions];
55
+ return withRebuiltExportDefinitions(s, updatedExportDefinitions, latestParametersWireRef.current);
56
+ });
57
+ };
58
+ const onXlsxSettingsChange = useCallback((settings) => {
59
+ setEditedAutomation((s) => ({
60
+ ...s,
61
+ exportDefinitions: s.exportDefinitions?.map((exportDefinition) => {
62
+ if (exportDefinition.requestPayload.format !== "XLSX") {
63
+ return exportDefinition;
64
+ }
65
+ const nextSettings = {
66
+ ...exportDefinition.requestPayload?.settings,
67
+ mergeHeaders: settings.mergeHeaders,
68
+ exportInfo: settings.exportInfo,
69
+ };
70
+ return {
71
+ ...exportDefinition,
72
+ requestPayload: {
73
+ ...exportDefinition.requestPayload,
74
+ settings: nextSettings,
75
+ },
76
+ };
77
+ }),
78
+ }));
79
+ }, [setEditedAutomation]);
80
+ const onPdfSettingsChange = useCallback((settings) => {
81
+ setEditedAutomation((s) => ({
82
+ ...s,
83
+ exportDefinitions: s.exportDefinitions?.map((exportDefinition) => {
84
+ if (exportDefinition.requestPayload.format !== "PDF_TABULAR") {
85
+ return exportDefinition;
86
+ }
87
+ const nextSettings = {
88
+ ...exportDefinition.requestPayload?.settings,
89
+ pageSize: settings.pageSize,
90
+ orientation: settings.orientation ?? "portrait",
91
+ exportInfo: settings.exportInfo,
92
+ };
93
+ return {
94
+ ...exportDefinition,
95
+ requestPayload: {
96
+ ...exportDefinition.requestPayload,
97
+ settings: nextSettings,
98
+ },
99
+ };
100
+ }),
101
+ }));
102
+ }, [setEditedAutomation]);
103
+ const onCsvSettingsChange = useCallback((settings) => {
104
+ setEditedAutomation((s) => ({
105
+ ...s,
106
+ exportDefinitions: s.exportDefinitions?.map((exportDefinition) => {
107
+ if (exportDefinition.requestPayload.format !== "CSV") {
108
+ return exportDefinition;
109
+ }
110
+ return {
111
+ ...exportDefinition,
112
+ requestPayload: {
113
+ ...exportDefinition.requestPayload,
114
+ settings: {
115
+ ...exportDefinition.requestPayload.settings,
116
+ delimiter: settings.delimiter,
117
+ },
118
+ },
119
+ };
120
+ }),
121
+ }));
122
+ }, [setEditedAutomation]);
123
+ const onCsvRawSettingsChange = useCallback((settings) => {
124
+ setEditedAutomation((s) => ({
125
+ ...s,
126
+ exportDefinitions: s.exportDefinitions?.map((exportDefinition) => {
127
+ if (exportDefinition.requestPayload.format !== "CSV_RAW") {
128
+ return exportDefinition;
129
+ }
130
+ return {
131
+ ...exportDefinition,
132
+ requestPayload: {
133
+ ...exportDefinition.requestPayload,
134
+ settings: {
135
+ ...exportDefinition.requestPayload.settings,
136
+ delimiter: settings.delimiter,
137
+ },
138
+ },
139
+ };
140
+ }),
141
+ }));
142
+ }, [setEditedAutomation]);
143
+ const onSlidesTemplateIdChange = useCallback((templateId, format) => {
144
+ setEditedAutomation((s) => ({
145
+ ...s,
146
+ exportDefinitions: s.exportDefinitions?.map((exportDefinition) => {
147
+ const matchesFormat = exportDefinition.requestPayload.format === format;
148
+ const matchesType = isWidget
149
+ ? isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload)
150
+ : isExportDefinitionDashboardRequestPayload(exportDefinition.requestPayload);
151
+ if (!matchesFormat || !matchesType) {
152
+ return exportDefinition;
153
+ }
154
+ return {
155
+ ...exportDefinition,
156
+ requestPayload: {
157
+ ...exportDefinition.requestPayload,
158
+ templateId,
159
+ },
160
+ };
161
+ }),
162
+ }));
163
+ }, [setEditedAutomation, isWidget]);
164
+ const isDashboardExportSelected = editedAutomation.exportDefinitions?.some((exportDefinition) => isExportDefinitionDashboardRequestPayload(exportDefinition.requestPayload)) ?? true;
165
+ const isCsvExportSelected = editedAutomation.exportDefinitions?.some((exportDefinition) => {
166
+ if (isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload)) {
167
+ return exportDefinition.requestPayload.format === "CSV";
168
+ }
169
+ return false;
170
+ }) ?? false;
171
+ const isXlsxExportSelected = editedAutomation.exportDefinitions?.some((exportDefinition) => {
172
+ if (isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload)) {
173
+ return exportDefinition.requestPayload.format === "XLSX";
174
+ }
175
+ return false;
176
+ }) ?? false;
177
+ const xlsxExportSettings = editedAutomation.exportDefinitions?.find((exportDefinition) => exportDefinition.requestPayload.format === "XLSX")?.requestPayload.settings;
178
+ const xlsxSettings = {
179
+ mergeHeaders: xlsxExportSettings?.mergeHeaders ?? true,
180
+ exportInfo: xlsxExportSettings?.exportInfo ?? true,
181
+ };
182
+ const pdfVisualizationSettings = editedAutomation.exportDefinitions?.find((exportDefinition) => isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload) &&
183
+ exportDefinition.requestPayload.format === "PDF_TABULAR")?.requestPayload.settings;
184
+ const pdfTabularSettings = pdfVisualizationSettings && "pageSize" in pdfVisualizationSettings
185
+ ? pdfVisualizationSettings
186
+ : undefined;
187
+ const pdfSettings = {
188
+ pageSize: pdfTabularSettings?.pageSize ?? defaultPdfPageSize ?? "A4",
189
+ orientation: pdfTabularSettings?.orientation ?? "portrait",
190
+ exportInfo: pdfTabularSettings?.exportInfo ?? true,
191
+ };
192
+ const csvExportDefinition = editedAutomation.exportDefinitions?.find((exportDefinition) => isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload) &&
193
+ exportDefinition.requestPayload.format === "CSV");
194
+ const csvExportSettings = csvExportDefinition &&
195
+ isExportDefinitionVisualizationObjectRequestPayload(csvExportDefinition.requestPayload)
196
+ ? csvExportDefinition.requestPayload.settings
197
+ : undefined;
198
+ const csvSettings = {
199
+ delimiter: csvExportSettings?.delimiter ?? resolvedDefaultCsvDelimiter,
200
+ };
201
+ const csvRawExportDefinition = editedAutomation.exportDefinitions?.find((exportDefinition) => isExportDefinitionVisualizationObjectRequestPayload(exportDefinition.requestPayload) &&
202
+ exportDefinition.requestPayload.format === "CSV_RAW");
203
+ const csvRawExportSettings = csvRawExportDefinition &&
204
+ isExportDefinitionVisualizationObjectRequestPayload(csvRawExportDefinition.requestPayload)
205
+ ? csvRawExportDefinition.requestPayload.settings
206
+ : undefined;
207
+ const csvRawSettings = {
208
+ delimiter: csvRawExportSettings?.delimiter ?? resolvedDefaultCsvDelimiter,
209
+ };
210
+ // Extract templateId per slides format, scoped to the current dialog mode
211
+ const getTemplateIdForFormat = (format) => {
212
+ const def = editedAutomation.exportDefinitions?.find((ed) => ed.requestPayload.format === format &&
213
+ (isWidget
214
+ ? isExportDefinitionVisualizationObjectRequestPayload(ed.requestPayload)
215
+ : isExportDefinitionDashboardRequestPayload(ed.requestPayload)));
216
+ return def?.requestPayload.templateId;
217
+ };
218
+ const slidesTemplateIds = {
219
+ PPTX: getTemplateIdForFormat("PPTX"),
220
+ PDF_SLIDES: getTemplateIdForFormat("PDF_SLIDES"),
221
+ PDF: getTemplateIdForFormat("PDF"),
222
+ };
223
+ return {
224
+ selectedAttachments,
225
+ isDashboardExportSelected,
226
+ isCsvExportSelected,
227
+ isXlsxExportSelected,
228
+ xlsxSettings,
229
+ pdfSettings,
230
+ csvSettings,
231
+ csvRawSettings,
232
+ slidesTemplateIds,
233
+ onDashboardAttachmentsChange,
234
+ onWidgetAttachmentsChange,
235
+ onXlsxSettingsChange,
236
+ onPdfSettingsChange,
237
+ onCsvSettingsChange,
238
+ onCsvRawSettingsChange,
239
+ onSlidesTemplateIdChange,
240
+ };
241
+ }
@@ -0,0 +1,55 @@
1
+ import { type FilterContextItem, type IAutomationMetadataObject, type IAutomationMetadataObjectDefinition, type IAutomationRecipient, type IAutomationVisibleFilter, type IDashboardExportParameter, type IExportDefinitionVisualizationObjectSettings, type IFilter, type IInsight, type INotificationChannelIdentifier, type INotificationChannelMetadataObject, type IWidget, type IWorkspaceUser } from "@gooddata/sdk-model";
2
+ export interface IUseScheduledEmailFormStateProps {
3
+ scheduledExportToEdit?: IAutomationMetadataObject;
4
+ widget?: IWidget;
5
+ insight?: IInsight;
6
+ notificationChannels: INotificationChannelIdentifier[] | INotificationChannelMetadataObject[];
7
+ /** Workspace users, lazy-loaded in the connector and passed via dialog props. */
8
+ users: IWorkspaceUser[];
9
+ externalRecipientOverride?: string;
10
+ effectiveWidgetFilters: IFilter[];
11
+ effectiveWidgetFiltersWithInsight: IFilter[];
12
+ effectiveVisibleWidgetFilters: IAutomationVisibleFilter[] | undefined;
13
+ effectiveDashboardFilters: FilterContextItem[] | undefined;
14
+ effectiveDashboardFiltersByTab: Record<string, FilterContextItem[]> | undefined;
15
+ effectiveVisibleDashboardFilters: IAutomationVisibleFilter[] | undefined;
16
+ effectiveVisibleDashboardFiltersByTab: Record<string, IAutomationVisibleFilter[]> | undefined;
17
+ parametersByTabForNewAutomation: Record<string, IDashboardExportParameter[]> | undefined;
18
+ defaultPdfPageSize?: IExportDefinitionVisualizationObjectSettings["pageSize"];
19
+ targetTabId?: string;
20
+ }
21
+ /**
22
+ * Owns the scheduled-email dialog's `editedAutomation` draft (initialized either from
23
+ * `scheduledExportToEdit` or via `newAutomationMetadataObjectDefinition`), its `originalAutomation`
24
+ * baseline, the derived defaults (`defaultRecipient`, `defaultUser`), and the form's field/message
25
+ * change handlers and their validity UI state.
26
+ *
27
+ * `timezone` (already part 1) and `currentUser` are read from {@link useAutomationsContext};
28
+ * `dashboardId`/`dashboardTitle` from {@link useScheduledEmailDialogContext}. The effective-filters
29
+ * derivations, `parametersByTabForNewAutomation`, `defaultPdfPageSize`, and `targetTabId` stay owned
30
+ * by the parent (`useEditScheduledEmail`) — shared with other consumers — and are passed in as params.
31
+ *
32
+ * Part 2 of 2 (mirrors the alerting `useAlertFormState` part 2): completes the hook by folding in the
33
+ * draft init that part 1 left in the parent.
34
+ *
35
+ * @internal
36
+ */
37
+ export declare function useScheduledEmailFormState({ scheduledExportToEdit, widget, insight, notificationChannels, users, externalRecipientOverride, effectiveWidgetFilters, effectiveWidgetFiltersWithInsight, effectiveVisibleWidgetFilters, effectiveDashboardFilters, effectiveDashboardFiltersByTab, effectiveVisibleDashboardFilters, effectiveVisibleDashboardFiltersByTab, parametersByTabForNewAutomation, defaultPdfPageSize, targetTabId }: IUseScheduledEmailFormStateProps): {
38
+ editedAutomation: IAutomationMetadataObjectDefinition;
39
+ setEditedAutomation: import("react").Dispatch<import("react").SetStateAction<IAutomationMetadataObjectDefinition>>;
40
+ originalAutomation: IAutomationMetadataObjectDefinition;
41
+ defaultRecipient: IAutomationRecipient;
42
+ defaultUser: IWorkspaceUser;
43
+ onTitleChange: (value: string, isValid: boolean) => void;
44
+ onRecurrenceChange: (cronExpression: string, startDate: Date | null, isValid: boolean) => void;
45
+ onEvaluationModeChange: (isShared: boolean) => void;
46
+ onDestinationChange: (notificationChannelId: string) => void;
47
+ onRecipientsChange: (updatedRecipients: IAutomationRecipient[]) => void;
48
+ onSubjectChange: (value: string | number, isValid: boolean) => void;
49
+ onMessageChange: (value: string, isValid: boolean) => void;
50
+ isCronValid: boolean;
51
+ isTitleValid: boolean;
52
+ isSubjectValid: boolean;
53
+ isOnMessageValid: boolean;
54
+ };
55
+ //# sourceMappingURL=useScheduledEmailFormState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledEmailFormState.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/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,EACZ,KAAK,cAAc,EACtB,MAAM,qBAAqB,CAAC;AAiB7B,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,iFAAiF;IACjF,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,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;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,0BAA0B,CAAC,EACvC,qBAAqB,EACrB,MAAM,EACN,OAAO,EACP,oBAAoB,EACpB,KAAK,EACL,yBAAyB,EACzB,sBAAsB,EACtB,iCAAiC,EACjC,6BAA6B,EAC7B,yBAAyB,EACzB,8BAA8B,EAC9B,gCAAgC,EAChC,qCAAqC,EACrC,+BAA+B,EAC/B,kBAAkB,EAClB,WAAW,EACd,EAAE,gCAAgC;;;;;;;;;;;;;;;;;EAwIlC"}