@gooddata/sdk-ui-dashboard 11.50.0-alpha.1 → 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 (17) 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 +4 -4
  5. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts.map +1 -1
  6. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.js +51 -207
  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/useScheduledEmailFormState.d.ts +55 -0
  11. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.d.ts.map +1 -0
  12. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useScheduledEmailFormState.js +203 -0
  13. package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.d.ts.map +1 -1
  14. package/esm/presentation/filterBar/filterBar/DefaultFilterBarContainer.js +11 -5
  15. package/esm/tsdoc-metadata.json +1 -1
  16. package/package.json +21 -21
  17. package/styles/css/main.css +1 -1
@@ -1,4 +1,4 @@
1
- export declare const LIB_VERSION = "11.50.0-alpha.1";
1
+ export declare const LIB_VERSION = "11.50.0-alpha.2";
2
2
  export declare const LIB_DESCRIPTION = "GoodData SDK - Dashboard Component";
3
3
  export declare const LIB_NAME = "@gooddata/sdk-ui-dashboard";
4
4
  //# sourceMappingURL=__version.d.ts.map
package/esm/__version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // (C) 2021 GoodData Corporation
2
2
  // DO NOT CHANGE THIS FILE, IT IS RE-GENERATED ON EVERY BUILD
3
- export const LIB_VERSION = "11.50.0-alpha.1";
3
+ export const LIB_VERSION = "11.50.0-alpha.2";
4
4
  export const LIB_DESCRIPTION = "GoodData SDK - Dashboard Component";
5
5
  export const LIB_NAME = "@gooddata/sdk-ui-dashboard";
@@ -1,4 +1,4 @@
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";
1
+ import { type FilterContextItem, type IAutomationMetadataObject, type IAutomationVisibleFilter, type IDashboardExportParameter, type IExportDefinitionVisualizationObjectSettings, type IFilter, type IInsight, type INotificationChannelIdentifier, type INotificationChannelMetadataObject, type IWidget, type IWorkspaceUser } from "@gooddata/sdk-model";
2
2
  import type { IAutomationFiltersTab } from "../../../../../model/store/filtering/types.js";
3
3
  export interface IUseEditScheduledEmailProps {
4
4
  scheduledExportToEdit?: IAutomationMetadataObject;
@@ -34,8 +34,8 @@ export interface IUseEditScheduledEmailProps {
34
34
  export declare function useEditScheduledEmail({ scheduledExportToEdit, notificationChannels, insight, widget, users, editedAutomationFilters, dashboardFilters, editedAutomationFiltersByTab, maxAutomationsRecipients, setEditedAutomationFilters, setEditedAutomationFiltersByTab, availableFiltersAsVisibleFilters, storeFilters, setStoreFilters, filtersForNewAutomation, externalRecipientOverride, defaultPdfPageSize, filtersDataByTab, availableFiltersAsVisibleFiltersByTab }: IUseEditScheduledEmailProps): {
35
35
  defaultUser: IWorkspaceUser;
36
36
  areDashboardFiltersChanged: boolean;
37
- originalAutomation: IAutomationMetadataObjectDefinition;
38
- editedAutomation: IAutomationMetadataObjectDefinition;
37
+ originalAutomation: import("@gooddata/sdk-model").IAutomationMetadataObjectDefinition;
38
+ editedAutomation: import("@gooddata/sdk-model").IAutomationMetadataObjectDefinition;
39
39
  isCronValid: boolean;
40
40
  notificationChannels: INotificationChannelIdentifier[] | INotificationChannelMetadataObject[];
41
41
  isDashboardExportSelected: boolean;
@@ -68,7 +68,7 @@ export declare function useEditScheduledEmail({ scheduledExportToEdit, notificat
68
68
  onRecurrenceChange: (cronExpression: string, startDate: Date | null, isValid: boolean) => void;
69
69
  onEvaluationModeChange: (isShared: boolean) => void;
70
70
  onDestinationChange: (notificationChannelId: string) => void;
71
- onRecipientsChange: (updatedRecipients: IAutomationRecipient[]) => void;
71
+ onRecipientsChange: (updatedRecipients: import("@gooddata/sdk-model").IAutomationRecipient[]) => void;
72
72
  onSubjectChange: (value: string | number, isValid: boolean) => void;
73
73
  onMessageChange: (value: string, isValid: boolean) => void;
74
74
  onDashboardAttachmentsChange: (formats: import("@gooddata/sdk-model").DashboardAttachmentType[]) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useEditScheduledEmail.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.ts"],"names":[],"mappings":"AAIA,OAAO,EAGH,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,EAItB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AA8B3F,MAAM,WAAW,2BAA2B;IACxC,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,oBAAoB,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAC9F,wBAAwB,EAAE,MAAM,CAAC;IACjC,iFAAiF;IACjF,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC;IAC1B,uBAAuB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9C,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACvC,0BAA0B,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IAEnE;;;OAGG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACnE;;;OAGG;IACH,+BAA+B,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,KAAK,IAAI,CAAC;IACzF,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;IACvD,gCAAgC,CAAC,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IAC1E,qCAAqC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAEnF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,uBAAuB,EAAE,iBAAiB,EAAE,CAAC;IAC7C,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kBAAkB,CAAC,EAAE,4CAA4C,CAAC,UAAU,CAAC,CAAC;CACjF;AAED,wBAAgB,qBAAqB,CAAC,EAClC,qBAAqB,EACrB,oBAAoB,EACpB,OAAO,EACP,MAAM,EACN,KAAK,EACL,uBAAuB,EACvB,gBAAgB,EAChB,4BAA4B,EAC5B,wBAAwB,EACxB,0BAA0B,EAC1B,+BAA+B,EAC/B,gCAAgC,EAChC,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EAChB,qCAAqC,EACxC,EAAE,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+iB7B"}
1
+ {"version":3,"file":"useEditScheduledEmail.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.ts"],"names":[],"mappings":"AAIA,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,yBAAyB,EAC9B,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,EAItB,MAAM,qBAAqB,CAAC;AAM7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AAiB3F,MAAM,WAAW,2BAA2B;IACxC,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,oBAAoB,EAAE,8BAA8B,EAAE,GAAG,kCAAkC,EAAE,CAAC;IAC9F,wBAAwB,EAAE,MAAM,CAAC;IACjC,iFAAiF;IACjF,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC;IAC1B,uBAAuB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9C,gBAAgB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACvC,0BAA0B,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IAEnE;;;OAGG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACnE;;;OAGG;IACH,+BAA+B,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,KAAK,IAAI,CAAC;IACzF,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,GAAG,SAAS,CAAC;IACvD,gCAAgC,CAAC,EAAE,wBAAwB,EAAE,GAAG,SAAS,CAAC;IAC1E,qCAAqC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAEnF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,uBAAuB,EAAE,iBAAiB,EAAE,CAAC;IAC7C,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,kBAAkB,CAAC,EAAE,4CAA4C,CAAC,UAAU,CAAC,CAAC;CACjF;AAED,wBAAgB,qBAAqB,CAAC,EAClC,qBAAqB,EACrB,oBAAoB,EACpB,OAAO,EACP,MAAM,EACN,KAAK,EACL,uBAAuB,EACvB,gBAAgB,EAChB,4BAA4B,EAC5B,wBAAwB,EACxB,0BAA0B,EAC1B,+BAA+B,EAC/B,gCAAgC,EAChC,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EAChB,qCAAqC,EACxC,EAAE,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8a7B"}
@@ -1,96 +1,53 @@
1
1
  // (C) 2019-2026 GoodData Corporation
2
- import { useCallback, useMemo, useRef, useState } from "react";
2
+ import { useCallback, useRef } from "react";
3
3
  import { DEFAULT_CSV_DELIMITER, isExportDefinitionDashboardRequestPayload, isExportDefinitionVisualizationObjectRequestPayload, isInsightWidget, } from "@gooddata/sdk-model";
4
4
  import { getAutomationExportParametersByTab, setExportParametersByTab, } from "../../../../../_staging/automation/index.js";
5
5
  import { useAutomationsContext } from "../../../contexts/AutomationsContext.js";
6
6
  import { useScheduledEmailDialogContext } from "../../../contexts/ScheduledEmailDialogContext.js";
7
- import { shouldStoreExportParameters } from "../../../shared/automationFilters/automationParameters.js";
8
7
  import { getDefaultSelectedFiltersFromFiltersByTab } from "../../../shared/automationFilters/useAutomationFiltersSelect.js";
9
8
  import { getAppliedDashboardFilters, getAppliedWidgetFilters, getVisibleFiltersByFilters, getVisibleFiltersByFiltersByTab, } from "../../../shared/automationFilters/utils.js";
10
- import { convertCurrentUserToAutomationRecipient, convertCurrentUserToWorkspaceUser, convertExternalRecipientToAutomationRecipient, } from "../../../shared/utils/automationUtils.js";
11
- import { toModifiedISOStringToTimezone, toNormalizedFirstRunAndCron, toNormalizedStartDate, } from "../../utils/date.js";
12
- import { getUserTimezone } from "../../utils/timezone.js";
13
- import { newDashboardExportDefinitionMetadataObjectDefinition, newWidgetExportDefinitionMetadataObjectDefinition, } from "../utils/exportDefinitions.js";
9
+ import { toNormalizedStartDate } from "../../utils/date.js";
10
+ import { useScheduledEmailEffectiveFilters } from "./useScheduledEmailEffectiveFilters.js";
14
11
  import { useScheduledEmailExportSettings } from "./useScheduledEmailExportSettings.js";
12
+ import { useScheduledEmailFormState } from "./useScheduledEmailFormState.js";
15
13
  import { useScheduledEmailFormValidity } from "./useScheduledEmailFormValidity.js";
16
14
  export function useEditScheduledEmail({ scheduledExportToEdit, notificationChannels, insight, widget, users, editedAutomationFilters, dashboardFilters, editedAutomationFiltersByTab, maxAutomationsRecipients, setEditedAutomationFilters, setEditedAutomationFiltersByTab, availableFiltersAsVisibleFilters, storeFilters, setStoreFilters, filtersForNewAutomation, externalRecipientOverride, defaultPdfPageSize, filtersDataByTab, availableFiltersAsVisibleFiltersByTab, }) {
17
- const { settings, timezone, currentUser, features: { enableAutomationEvaluationMode }, } = useAutomationsContext();
18
- const { dashboardId, dashboardTitle, hiddenFilters: dashboardHiddenFilters, commonDateFilterId, widgetLocalIdToTabIdMap: widgetTabMap, exportParametersByTab: effectiveExportParametersByTab, } = useScheduledEmailDialogContext();
19
- const [isCronValid, setIsCronValid] = useState(true);
20
- const [isTitleValid, setIsTitleValid] = useState(true);
21
- const [isSubjectValid, setIsSubjectValid] = useState(true);
22
- const [isOnMessageValid, setIsOnMessageValid] = useState(true);
15
+ const { settings, features: { enableAutomationEvaluationMode }, } = useAutomationsContext();
16
+ const { dashboardId, dashboardTitle, hiddenFilters: dashboardHiddenFilters, commonDateFilterId, widgetLocalIdToTabIdMap: widgetTabMap, } = useScheduledEmailDialogContext();
23
17
  const isWidget = !!widget && !!insight;
24
18
  // Dashboard
25
19
  const resolvedDefaultCsvDelimiter = settings?.exportCsvCustomDelimiter ?? DEFAULT_CSV_DELIMITER;
26
20
  const areDashboardFiltersChanged = !!dashboardFilters;
27
- const defaultUser = convertCurrentUserToWorkspaceUser(users ?? [], currentUser);
28
- const defaultRecipient = externalRecipientOverride
29
- ? convertExternalRecipientToAutomationRecipient(externalRecipientOverride)
30
- : convertCurrentUserToAutomationRecipient(users ?? [], currentUser);
31
- const firstChannel = notificationChannels[0]?.id;
32
21
  // Determine target tab ID if widget is present
33
22
  const targetTabId = widget?.localIdentifier ? widgetTabMap[widget.localIdentifier] : undefined;
34
- const effectiveWidgetFilters = getAppliedWidgetFilters(editedAutomationFilters ?? [], dashboardHiddenFilters, widget, insight, commonDateFilterId, false);
35
- const effectiveWidgetFiltersWithInsight = getAppliedWidgetFilters(editedAutomationFilters ?? [], dashboardHiddenFilters, widget, insight, commonDateFilterId, true);
36
- const effectiveVisibleWidgetFilters = getVisibleFiltersByFilters(editedAutomationFilters, availableFiltersAsVisibleFilters, true);
37
- const effectiveDashboardFilters = getAppliedDashboardFilters(editedAutomationFilters ?? [], dashboardHiddenFilters, isWidget ? true : storeFilters);
38
- // Process filters per tab if provided (for dashboard automations with tabs enabled)
39
- const effectiveDashboardFiltersByTab = useMemo(() => {
40
- if (!editedAutomationFiltersByTab || !storeFilters) {
41
- return undefined;
42
- }
43
- // Apply the same processing as effectiveDashboardFilters to each tab's filters
44
- return Object.entries(editedAutomationFiltersByTab).reduce((acc, [tabId, filters]) => {
45
- const tabHiddenFilters = filtersDataByTab?.find((tab) => tab.tabId === tabId)?.hiddenFilters ?? [];
46
- const appliedFilters = getAppliedDashboardFilters(filters ?? [], tabHiddenFilters, storeFilters);
47
- // Only add if we got filters back (storeFilters is true)
48
- if (appliedFilters) {
49
- acc[tabId] = appliedFilters;
50
- }
51
- return acc;
52
- }, {});
53
- }, [editedAutomationFiltersByTab, filtersDataByTab, storeFilters]);
54
- const effectiveVisibleDashboardFilters = getVisibleFiltersByFilters(editedAutomationFilters ?? [], availableFiltersAsVisibleFilters, storeFilters);
55
- const effectiveVisibleDashboardFiltersByTab = getVisibleFiltersByFiltersByTab(editedAutomationFiltersByTab, availableFiltersAsVisibleFiltersByTab, storeFilters);
56
- // Mirrors the filters seed above, for parameters.
57
- const parametersByTabForNewAutomation = shouldStoreExportParameters(isWidget, storeFilters) &&
58
- Object.keys(effectiveExportParametersByTab).length > 0
59
- ? effectiveExportParametersByTab
60
- : undefined;
61
- const [editedAutomation, setEditedAutomation] = useState(scheduledExportToEdit ??
62
- newAutomationMetadataObjectDefinition(isWidget
63
- ? {
64
- timezone,
65
- dashboardId: dashboardId,
66
- notificationChannel: firstChannel,
67
- insight,
68
- widget,
69
- recipient: defaultRecipient,
70
- widgetFilters: effectiveWidgetFilters,
71
- widgetFiltersWithInsight: effectiveWidgetFiltersWithInsight,
72
- dashboardFilters: effectiveDashboardFilters,
73
- visibleFiltersMetadata: effectiveVisibleWidgetFilters,
74
- defaultPdfPageSize,
75
- evaluationMode: "PER_RECIPIENT",
76
- targetTabId,
77
- parametersByTab: parametersByTabForNewAutomation,
78
- }
79
- : {
80
- timezone,
81
- dashboardId: dashboardId,
82
- notificationChannel: firstChannel,
83
- title: dashboardTitle,
84
- recipient: defaultRecipient,
85
- dashboardFilters: effectiveDashboardFilters,
86
- filtersByTab: effectiveDashboardFiltersByTab,
87
- visibleFiltersMetadata: effectiveVisibleDashboardFilters,
88
- visibleFiltersByTab: effectiveVisibleDashboardFiltersByTab,
89
- defaultPdfPageSize,
90
- evaluationMode: "PER_RECIPIENT",
91
- parametersByTab: parametersByTabForNewAutomation,
92
- }));
93
- const [originalAutomation] = useState(editedAutomation);
23
+ const { effectiveWidgetFilters, effectiveWidgetFiltersWithInsight, effectiveVisibleWidgetFilters, effectiveDashboardFilters, effectiveDashboardFiltersByTab, effectiveVisibleDashboardFilters, effectiveVisibleDashboardFiltersByTab, parametersByTabForNewAutomation, } = useScheduledEmailEffectiveFilters({
24
+ widget,
25
+ insight,
26
+ editedAutomationFilters,
27
+ editedAutomationFiltersByTab,
28
+ availableFiltersAsVisibleFilters,
29
+ availableFiltersAsVisibleFiltersByTab,
30
+ filtersDataByTab,
31
+ storeFilters,
32
+ });
33
+ const { editedAutomation, setEditedAutomation, originalAutomation, defaultRecipient, defaultUser, onTitleChange, onRecurrenceChange, onEvaluationModeChange, onDestinationChange, onRecipientsChange, onSubjectChange, onMessageChange, isCronValid, isTitleValid, isSubjectValid, isOnMessageValid, } = useScheduledEmailFormState({
34
+ scheduledExportToEdit,
35
+ widget,
36
+ insight,
37
+ notificationChannels,
38
+ users,
39
+ externalRecipientOverride,
40
+ effectiveWidgetFilters,
41
+ effectiveWidgetFiltersWithInsight,
42
+ effectiveVisibleWidgetFilters,
43
+ effectiveDashboardFilters,
44
+ effectiveDashboardFiltersByTab,
45
+ effectiveVisibleDashboardFilters,
46
+ effectiveVisibleDashboardFiltersByTab,
47
+ parametersByTabForNewAutomation,
48
+ defaultPdfPageSize,
49
+ targetTabId,
50
+ });
94
51
  // Holds the wire outside the automation so it survives a rebuild from zero export definitions —
95
52
  // with no definitions `setExportParametersByTab` has nowhere to store it.
96
53
  // Seeded from the stored wire.
@@ -101,60 +58,23 @@ export function useEditScheduledEmail({ scheduledExportToEdit, notificationChann
101
58
  const setParametersWire = useCallback((wire) => {
102
59
  latestParametersWireRef.current = wire;
103
60
  setEditedAutomation((automation) => setExportParametersByTab(automation, wire));
104
- }, []);
105
- const onTitleChange = (value, isValid) => {
106
- setIsTitleValid(isValid);
107
- setEditedAutomation((s) => ({ ...s, title: value }));
108
- };
109
- const onRecurrenceChange = (cronExpression, startDate, isValid) => {
110
- setIsCronValid(isValid);
111
- setEditedAutomation((s) => ({
112
- ...s,
113
- schedule: {
114
- ...s.schedule,
115
- cron: cronExpression,
116
- firstRun: toModifiedISOStringToTimezone(startDate ?? new Date(), timezone).iso,
117
- },
118
- }));
119
- };
120
- const onEvaluationModeChange = (isShared) => {
121
- setEditedAutomation((s) => ({
122
- ...s,
123
- evaluationMode: isShared ? "SHARED" : "PER_RECIPIENT",
124
- }));
125
- };
126
- const onDestinationChange = (notificationChannelId) => {
127
- setEditedAutomation((s) => ({
128
- ...s,
129
- notificationChannel: notificationChannelId,
130
- }));
131
- };
132
- const onRecipientsChange = (updatedRecipients) => {
133
- setEditedAutomation((s) => ({
134
- ...s,
135
- recipients: updatedRecipients,
136
- }));
137
- };
138
- const onSubjectChange = (value, isValid) => {
139
- setIsSubjectValid(isValid);
140
- setEditedAutomation((s) => ({
141
- ...s,
142
- details: {
143
- ...s.details,
144
- subject: value,
145
- },
146
- }));
147
- };
148
- const onMessageChange = (value, isValid) => {
149
- setIsOnMessageValid(isValid);
150
- setEditedAutomation((s) => ({
151
- ...s,
152
- details: {
153
- ...s.details,
154
- message: value,
155
- },
156
- }));
157
- };
61
+ }, [setEditedAutomation]);
62
+ const { selectedAttachments, isDashboardExportSelected, isCsvExportSelected, isXlsxExportSelected, xlsxSettings, pdfSettings, csvSettings, csvRawSettings, slidesTemplateIds, onDashboardAttachmentsChange, onWidgetAttachmentsChange, onXlsxSettingsChange, onPdfSettingsChange, onCsvSettingsChange, onCsvRawSettingsChange, onSlidesTemplateIdChange, } = useScheduledEmailExportSettings({
63
+ editedAutomation,
64
+ setEditedAutomation,
65
+ insight,
66
+ widget,
67
+ dashboardId,
68
+ dashboardTitle,
69
+ storeFilters,
70
+ effectiveDashboardFilters,
71
+ effectiveDashboardFiltersByTab,
72
+ effectiveWidgetFilters,
73
+ effectiveWidgetFiltersWithInsight,
74
+ defaultPdfPageSize,
75
+ resolvedDefaultCsvDelimiter,
76
+ latestParametersWireRef,
77
+ });
158
78
  const onFiltersChange = useCallback((filters, storeFiltersParam) => {
159
79
  setEditedAutomationFilters(filters);
160
80
  const shouldStoreFilters = storeFiltersParam ?? storeFilters;
@@ -319,22 +239,6 @@ export function useEditScheduledEmail({ scheduledExportToEdit, notificationChann
319
239
  onFiltersChange(filters, value);
320
240
  }
321
241
  }, [onFiltersChange, onFiltersByTabChange, setStoreFilters]);
322
- const { selectedAttachments, isDashboardExportSelected, isCsvExportSelected, isXlsxExportSelected, xlsxSettings, pdfSettings, csvSettings, csvRawSettings, slidesTemplateIds, onDashboardAttachmentsChange, onWidgetAttachmentsChange, onXlsxSettingsChange, onPdfSettingsChange, onCsvSettingsChange, onCsvRawSettingsChange, onSlidesTemplateIdChange, } = useScheduledEmailExportSettings({
323
- editedAutomation,
324
- setEditedAutomation,
325
- insight,
326
- widget,
327
- dashboardId,
328
- dashboardTitle,
329
- storeFilters,
330
- effectiveDashboardFilters,
331
- effectiveDashboardFiltersByTab,
332
- effectiveWidgetFilters,
333
- effectiveWidgetFiltersWithInsight,
334
- defaultPdfPageSize,
335
- resolvedDefaultCsvDelimiter,
336
- latestParametersWireRef,
337
- });
338
242
  const startDate = toNormalizedStartDate(editedAutomation.schedule?.firstRun, editedAutomation.schedule?.timezone);
339
243
  const { isSubmitDisabled, validationErrorMessage, isParentValid, allowExternalRecipients, allowOnlyLoggedUserRecipients, } = useScheduledEmailFormValidity({
340
244
  editedAutomation,
@@ -393,63 +297,3 @@ export function useEditScheduledEmail({ scheduledExportToEdit, notificationChann
393
297
  enableAutomationEvaluationMode,
394
298
  };
395
299
  }
396
- function newAutomationMetadataObjectDefinition({ timezone, dashboardId, notificationChannel, title, insight, widget, recipient, dashboardFilters, filtersByTab, widgetFilters, widgetFiltersWithInsight, visibleFiltersMetadata, visibleFiltersByTab, defaultPdfPageSize, evaluationMode, targetTabId, parametersByTab, }) {
397
- const { firstRun, cron } = toNormalizedFirstRunAndCron(timezone);
398
- const exportDefinition = widget && insight
399
- ? newWidgetExportDefinitionMetadataObjectDefinition({
400
- insight,
401
- widget,
402
- dashboardId,
403
- format: "PNG",
404
- widgetFilters,
405
- widgetFiltersWithInsight,
406
- dashboardFilters,
407
- defaultPdfPageSize,
408
- })
409
- : newDashboardExportDefinitionMetadataObjectDefinition({
410
- dashboardId,
411
- dashboardTitle: title ?? "",
412
- dashboardFilters,
413
- filtersByTab,
414
- format: "PDF",
415
- });
416
- let metadataObj = visibleFiltersMetadata || visibleFiltersByTab
417
- ? {
418
- metadata: {
419
- ...(visibleFiltersMetadata ? { visibleFilters: visibleFiltersMetadata } : {}),
420
- ...(visibleFiltersByTab ? { visibleFiltersByTab } : {}),
421
- },
422
- }
423
- : {};
424
- if (targetTabId) {
425
- metadataObj = {
426
- ...metadataObj,
427
- metadata: {
428
- ...metadataObj.metadata,
429
- targetTabIdentifier: targetTabId,
430
- },
431
- };
432
- }
433
- const automation = {
434
- type: "automation",
435
- title: undefined,
436
- description: undefined,
437
- tags: [],
438
- schedule: {
439
- timezone: timezone ?? getUserTimezone().identifier,
440
- firstRun,
441
- cron,
442
- },
443
- details: {
444
- message: "",
445
- subject: "",
446
- },
447
- exportDefinitions: [{ ...exportDefinition }],
448
- recipients: [recipient],
449
- evaluationMode,
450
- notificationChannel,
451
- dashboard: dashboardId ? { id: dashboardId } : undefined,
452
- ...metadataObj,
453
- };
454
- return parametersByTab ? setExportParametersByTab(automation, parametersByTab) : automation;
455
- }
@@ -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,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"}