@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.
- 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 +4 -4
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.js +51 -207
- 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/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/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
package/esm/__version.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const LIB_VERSION = "11.50.0-alpha.
|
|
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.
|
|
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
|
|
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,
|
|
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,
|
|
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 {
|
|
11
|
-
import {
|
|
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,
|
|
18
|
-
const { dashboardId, dashboardTitle, hiddenFilters: dashboardHiddenFilters, commonDateFilterId, widgetLocalIdToTabIdMap: widgetTabMap,
|
|
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
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
106
|
-
|
|
107
|
-
setEditedAutomation
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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"}
|