@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.
- package/NOTICE +216 -203
- package/esm/__version.d.ts +1 -1
- package/esm/__version.js +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts +6 -6
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.js +65 -534
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.d.ts +38 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.d.ts.map +1 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailEffectiveFilters.js +61 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailExportSettings.d.ts +57 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailExportSettings.d.ts.map +1 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailExportSettings.js +241 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.d.ts +55 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.d.ts.map +1 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.js +203 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormValidity.d.ts +21 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormValidity.d.ts.map +1 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormValidity.js +52 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/utils/exportDefinitions.d.ts +27 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/utils/exportDefinitions.d.ts.map +1 -0
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/utils/exportDefinitions.js +95 -0
- package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.d.ts.map +1 -1
- package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.js +11 -5
- package/esm/tsdoc-metadata.json +1 -1
- package/package.json +21 -21
- 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"}
|