@gooddata/sdk-ui-dashboard 11.37.0-alpha.5 → 11.37.0
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 +6 -6
- package/esm/__version.d.ts +1 -1
- package/esm/__version.js +1 -1
- package/esm/_staging/dashboard/dashboardFilterContext.d.ts +6 -1
- package/esm/_staging/dashboard/dashboardFilterContext.js +10 -3
- package/esm/model/commandHandlers/filterContext/changeFilterContextSelectionHandler.js +3 -5
- package/esm/model/commandHandlers/scheduledEmail/initializeAutomationsHandler.js +22 -8
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +5 -3
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.js +37 -3
- package/esm/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.js +4 -1
- package/package.json +20 -20
package/NOTICE
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
The following 3rd-party software packages may be used by or distributed with gooddata-ui-sdk. Any information relevant to third-party vendors listed below are collected using common, reasonable means.
|
|
9
9
|
|
|
10
|
-
Date generated: 2026-5-
|
|
10
|
+
Date generated: 2026-5-25
|
|
11
11
|
|
|
12
|
-
Revision ID:
|
|
12
|
+
Revision ID: 071fd8600e18fa643f19bd192894b326ecedff0a
|
|
13
13
|
|
|
14
14
|
================================================================================
|
|
15
15
|
================================================================================
|
|
@@ -377,7 +377,7 @@ Revision ID: b6d15371a966d44461e8af8bc123206c32e6cb20
|
|
|
377
377
|
- bail (2.0.2) [MIT]
|
|
378
378
|
- balanced-match (2.0.0) [MIT]
|
|
379
379
|
- base64-js (1.5.1) [MIT]
|
|
380
|
-
- baseline-browser-mapping (2.10.
|
|
380
|
+
- baseline-browser-mapping (2.10.32) [Apache-2.0]
|
|
381
381
|
- batch (0.6.1) [MIT]
|
|
382
382
|
- binary-extensions (2.3.0) [MIT]
|
|
383
383
|
- bl (4.1.0) [MIT]
|
|
@@ -5379,9 +5379,9 @@ MIT
|
|
|
5379
5379
|
|
|
5380
5380
|
|
|
5381
5381
|
--------------------------------------------------------------------------------
|
|
5382
|
-
Package Title: baseline-browser-mapping (2.10.
|
|
5382
|
+
Package Title: baseline-browser-mapping (2.10.32)
|
|
5383
5383
|
|
|
5384
|
-
Package Locator: npm+baseline-browser-mapping$2.10.
|
|
5384
|
+
Package Locator: npm+baseline-browser-mapping$2.10.32
|
|
5385
5385
|
|
|
5386
5386
|
Package Depth: Transitive
|
|
5387
5387
|
--------------------------------------------------------------------------------
|
|
@@ -38189,4 +38189,4 @@ POSSIBILITY OF SUCH DAMAGE.
|
|
|
38189
38189
|
--------------------------------------------------------------------------------
|
|
38190
38190
|
--------------------------------------------------------------------------------
|
|
38191
38191
|
|
|
38192
|
-
Report Generated by FOSSA on 2026-5-
|
|
38192
|
+
Report Generated by FOSSA on 2026-5-25
|
package/esm/__version.d.ts
CHANGED
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.37.0
|
|
3
|
+
export const LIB_VERSION = "11.37.0";
|
|
4
4
|
export const LIB_DESCRIPTION = "GoodData SDK - Dashboard Component";
|
|
5
5
|
export const LIB_NAME = "@gooddata/sdk-ui-dashboard";
|
|
@@ -39,5 +39,10 @@ export declare function dashboardFilterContextIdentity<TWidget>({ filterContext
|
|
|
39
39
|
export declare function dashboardFilterContextSanitize(filterContext: IFilterContextDefinition): IFilterContextDefinition;
|
|
40
40
|
/**
|
|
41
41
|
* Transform supported dashboard filter to filter context item.
|
|
42
|
+
*
|
|
43
|
+
* Returns undefined when the input has no honest representation in the dashboard filter context —
|
|
44
|
+
* specifically for insight-originated MVFs that reference the measure via LocalIdRef (bucket localId).
|
|
45
|
+
* Dashboard MVFs require an ObjRef measure; callers receiving alert/automation execution filters
|
|
46
|
+
* (which mix dashboard and insight filters) should drop the undefined entries.
|
|
42
47
|
*/
|
|
43
|
-
export declare function dashboardFilterToFilterContextItem(filter: IDashboardFilter, keepDatasets: boolean): FilterContextItem;
|
|
48
|
+
export declare function dashboardFilterToFilterContextItem(filter: IDashboardFilter, keepDatasets: boolean): FilterContextItem | undefined;
|
|
@@ -111,6 +111,11 @@ export function dashboardFilterContextSanitize(filterContext) {
|
|
|
111
111
|
}
|
|
112
112
|
/**
|
|
113
113
|
* Transform supported dashboard filter to filter context item.
|
|
114
|
+
*
|
|
115
|
+
* Returns undefined when the input has no honest representation in the dashboard filter context —
|
|
116
|
+
* specifically for insight-originated MVFs that reference the measure via LocalIdRef (bucket localId).
|
|
117
|
+
* Dashboard MVFs require an ObjRef measure; callers receiving alert/automation execution filters
|
|
118
|
+
* (which mix dashboard and insight filters) should drop the undefined entries.
|
|
114
119
|
*/
|
|
115
120
|
export function dashboardFilterToFilterContextItem(filter, keepDatasets) {
|
|
116
121
|
if (isAttributeFilterWithSelection(filter)) {
|
|
@@ -157,10 +162,12 @@ export function dashboardFilterToFilterContextItem(filter, keepDatasets) {
|
|
|
157
162
|
}
|
|
158
163
|
else if (isMeasureValueFilter(filter)) {
|
|
159
164
|
const measure = measureValueFilterMeasure(filter);
|
|
160
|
-
// Dashboard
|
|
161
|
-
//
|
|
165
|
+
// Dashboard MVFs always reference the measure by ObjRef. Insight MVFs use LocalIdRef
|
|
166
|
+
// (bucket localId) and have no honest representation in the dashboard filter context —
|
|
167
|
+
// they reach this converter only because automation execution filters mix dashboard and
|
|
168
|
+
// insight filters. Caller is responsible for dropping these undefined entries.
|
|
162
169
|
if (!isObjRef(measure)) {
|
|
163
|
-
|
|
170
|
+
return undefined;
|
|
164
171
|
}
|
|
165
172
|
const conditions = measureValueFilterConditions(filter);
|
|
166
173
|
return {
|
|
@@ -78,16 +78,14 @@ export function* changeFilterContextSelectionHandler(ctx, cmd) {
|
|
|
78
78
|
}
|
|
79
79
|
// Cross-filtering is always compatible with dashboard tabs now
|
|
80
80
|
// (removed the check that prevented cross-filtering without tabs)
|
|
81
|
-
const normalizedFilters = filters.map((filter) => {
|
|
81
|
+
const normalizedFilters = compact(filters.map((filter) => {
|
|
82
82
|
if (isDashboardAttributeFilterItem(filter) ||
|
|
83
83
|
isDashboardDateFilter(filter) ||
|
|
84
84
|
isDashboardMeasureValueFilter(filter)) {
|
|
85
85
|
return filter;
|
|
86
86
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
});
|
|
87
|
+
return dashboardFilterToFilterContextItem(filter, !!ctx.backend.capabilities.supportsMultipleDateFilters);
|
|
88
|
+
}));
|
|
91
89
|
// Separate text filter types (arbitrary, match) — they use whole-filter replacement
|
|
92
90
|
const textAttributeFiltersRaw = normalizedFilters.filter((filter) => isDashboardAttributeFilterItem(filter) && !isDashboardAttributeFilter(filter));
|
|
93
91
|
// Deduplicate text filters by localIdentifier (last occurrence wins, matching batch behavior)
|
|
@@ -3,7 +3,7 @@ import { compact, omit } from "lodash-es";
|
|
|
3
3
|
import { batchActions } from "redux-batched-actions";
|
|
4
4
|
import { all, call, put, select } from "redux-saga/effects";
|
|
5
5
|
import { generateDateFilterLocalIdentifier } from "@gooddata/sdk-backend-base";
|
|
6
|
-
import { dashboardFilterLocalIdentifier, filterLocalIdentifier, filterObjRef, idRef, insightFilters, isAbsoluteDateFilter, isAttributeFilter, isDashboardAttributeFilter, isDashboardAttributeFilterItem, isDashboardCommonDateFilter, isDashboardDateFilter, isDateFilter, isExportDefinitionDashboardRequestPayload, isExportDefinitionVisualizationObjectRequestPayload, isFilterContextItem, isInsightWidget, isMeasureValueFilter,
|
|
6
|
+
import { dashboardFilterLocalIdentifier, filterLocalIdentifier, filterObjRef, idRef, insightFilters, isAbsoluteDateFilter, isAttributeFilter, isDashboardAttributeFilter, isDashboardAttributeFilterItem, isDashboardCommonDateFilter, isDashboardDateFilter, isDateFilter, isExportDefinitionDashboardRequestPayload, isExportDefinitionVisualizationObjectRequestPayload, isFilterContextItem, isInsightWidget, isMeasureValueFilter, isRankingFilter, isRelativeDateFilter, isSingleSelectionFilter, } from "@gooddata/sdk-model";
|
|
7
7
|
import { convertError } from "@gooddata/sdk-ui";
|
|
8
8
|
import { dashboardFilterToFilterContextItem } from "../../../_staging/dashboard/dashboardFilterContext.js";
|
|
9
9
|
import { isDashboardFilter } from "../../../types.js";
|
|
@@ -94,7 +94,7 @@ export function* initializeAutomationsHandler(ctx, _cmd) {
|
|
|
94
94
|
? getDashboardFiltersOnly(targetAlertFilters, commonDateFilterLocalId, insight, widget)
|
|
95
95
|
: targetAlertFilters;
|
|
96
96
|
const keepDateFilterDataSets = !!ctx.backend.capabilities.supportsMultipleDateFilters;
|
|
97
|
-
const filtersToSetAsFilterContextItems = filtersToSet.map((filter) => dashboardFilterToFilterContextItem(filter, keepDateFilterDataSets));
|
|
97
|
+
const filtersToSetAsFilterContextItems = compact(filtersToSet.map((filter) => dashboardFilterToFilterContextItem(filter, keepDateFilterDataSets)));
|
|
98
98
|
const compatibleFiltersToSet = filtersToSetAsFilterContextItems.filter((filter) => isFilterContextItemCompatibleWithSelectionType(filter, effectiveActiveTabSelectionTypeMap, enableArbitraryFilterKD, enableMatchFilterKD, filterContextFilters));
|
|
99
99
|
// Empty alert execution filters = reset all filters (set them to all).
|
|
100
100
|
// Empty sanitized filters = keep filters as they are, do not reset them (all alert execution filters are insight specific / ignored).
|
|
@@ -304,8 +304,10 @@ function getDashboardFiltersOnly(filters, commonDateFilterLocalId, insight, widg
|
|
|
304
304
|
const withoutAlertFilters = removeAlertFilters(filters);
|
|
305
305
|
// Remove insight specific attribute filters from the list of filters.
|
|
306
306
|
const withoutInsightAttributeFilters = removeInsightAttributeFilters(withoutAlertFilters, insight);
|
|
307
|
+
// Remove insight specific MVFs from the list of filters.
|
|
308
|
+
const withoutInsightMVFs = removeInsightMVFs(withoutInsightAttributeFilters, insight);
|
|
307
309
|
// If widget has ignored date filter, remove date filter(s) - they originate from the insight, otherwise, it's the dashboard date filter, so keep it.
|
|
308
|
-
const withoutInsightDateFilters = removeDateFiltersIfDateFilterIsIgnored(
|
|
310
|
+
const withoutInsightDateFilters = removeDateFiltersIfDateFilterIsIgnored(withoutInsightMVFs, widget);
|
|
309
311
|
// Find common date filter by local id or by absence of dataset
|
|
310
312
|
const dateFilters = withoutInsightDateFilters.filter(isDateFilter);
|
|
311
313
|
const foundCommonFilter = dateFilters.find((f) => {
|
|
@@ -334,15 +336,14 @@ function getDashboardFiltersOnly(filters, commonDateFilterLocalId, insight, widg
|
|
|
334
336
|
/**
|
|
335
337
|
* Remove alert filters (these that are set during creation of the alert sliced by attribute) from the list of filters.
|
|
336
338
|
* These filters can be recognized by the fact that they do not have filter objRef (they have localIdentifier only).
|
|
339
|
+
* MVFs and ranking filters are not the concern of this function — filterObjRef returns undefined for them,
|
|
340
|
+
* so they are passed through and filtered by later steps.
|
|
337
341
|
* @internal
|
|
338
342
|
*/
|
|
339
343
|
function removeAlertFilters(filters) {
|
|
340
344
|
return filters?.filter((f) => {
|
|
341
|
-
if (isMeasureValueFilter(f)) {
|
|
342
|
-
|
|
343
|
-
// dashboard MVFs always store an ObjRef (catalog metric) and the downstream conversion
|
|
344
|
-
// in dashboardFilterToFilterContextItem requires it.
|
|
345
|
-
return isObjRef(measureValueFilterMeasure(f));
|
|
345
|
+
if (isMeasureValueFilter(f) || isRankingFilter(f)) {
|
|
346
|
+
return true;
|
|
346
347
|
}
|
|
347
348
|
const objRef = filterObjRef(f);
|
|
348
349
|
return !!objRef;
|
|
@@ -362,6 +363,19 @@ function removeInsightAttributeFilters(filters, insight) {
|
|
|
362
363
|
return !insightFilter;
|
|
363
364
|
});
|
|
364
365
|
}
|
|
366
|
+
/**
|
|
367
|
+
* Remove insight specific measure value filters from the list of filters.
|
|
368
|
+
* These filters can be recognized by matching them against insight filters and their local identifiers.
|
|
369
|
+
*/
|
|
370
|
+
function removeInsightMVFs(filters, insight) {
|
|
371
|
+
const insightMVFs = insightFilters(insight).filter(isMeasureValueFilter);
|
|
372
|
+
return filters.filter((f) => {
|
|
373
|
+
const insightFilter = insightMVFs.find((f2) => {
|
|
374
|
+
return filterLocalIdentifier(f) === filterLocalIdentifier(f2);
|
|
375
|
+
});
|
|
376
|
+
return !insightFilter;
|
|
377
|
+
});
|
|
378
|
+
}
|
|
365
379
|
/**
|
|
366
380
|
* Remove date filters if widget date filter is ignored.
|
|
367
381
|
* If widget date filter is not ignored, date filter provided to the alert execution is the dashboard date filter.
|
|
@@ -11,6 +11,7 @@ import { selectDateFormat, selectEnableAutomationManagement, selectEnableCustomi
|
|
|
11
11
|
import { selectIsCrossFiltering } from "../../../../model/store/drill/drillSelectors.js";
|
|
12
12
|
import { selectEntitlementMinimumRecurrenceMinutes, selectMaxAutomationRecipients, } from "../../../../model/store/entitlements/entitlementsSelectors.js";
|
|
13
13
|
import { selectDashboardTitle } from "../../../../model/store/meta/metaSelectors.js";
|
|
14
|
+
import { selectTabs } from "../../../../model/store/tabs/tabsSelectors.js";
|
|
14
15
|
import { selectIsAutomationDialogSecondaryTitleVisible } from "../../../../model/store/topBar/topBarSelectors.js";
|
|
15
16
|
import { selectExecutionTimestamp } from "../../../../model/store/ui/uiSelectors.js";
|
|
16
17
|
import { getWidgetTitle } from "../../../../model/utils/dashboardItemUtils.js";
|
|
@@ -58,6 +59,8 @@ export function ScheduledMailDialogRenderer({ scheduledExportToEdit, users, user
|
|
|
58
59
|
const externalRecipientOverride = useDashboardSelector(selectExternalRecipient);
|
|
59
60
|
const isSecondaryTitleVisible = useDashboardSelector(selectIsAutomationDialogSecondaryTitleVisible);
|
|
60
61
|
const enableAutomationManagement = useDashboardSelector(selectEnableAutomationManagement);
|
|
62
|
+
const dashboardTabs = useDashboardSelector(selectTabs);
|
|
63
|
+
const hasMultipleTabs = (dashboardTabs?.length ?? 0) > 1;
|
|
61
64
|
const exportTemplates = useExportTemplates();
|
|
62
65
|
const handleScheduleDeleteSuccess = () => {
|
|
63
66
|
onDeleteSuccess?.();
|
|
@@ -206,10 +209,9 @@ export function ScheduledMailDialogRenderer({ scheduledExportToEdit, users, user
|
|
|
206
209
|
}), children: [
|
|
207
210
|
_jsx("div", { className: "gd-divider-with-margin" }), selectedTabId === "filters" ? (_jsx("div", { ref: filtersTabContentRef, className: "gd-schedule-dialog-tab-content", style: tabContentHeight
|
|
208
211
|
? { minHeight: `${tabContentHeight}px` }
|
|
209
|
-
: undefined, children: _jsx(AutomationFiltersSelect, { availableFilters: availableFilters, selectedFilters: editedAutomationFilters, onFiltersChange: onFiltersChange, storeFilters: storeFilters, onStoreFiltersChange: onStoreFiltersChange, isDashboardAutomation: !widget, overlayPositionType: OVERLAY_POSITION_TYPE, hideTitle: true, showAllFilters: true, filtersByTab: filtersByTab, editedFiltersByTab: editedAutomationFiltersByTab, onFiltersByTabChange: onFiltersByTabChange }) })) : (_jsxs("div", { ref: generalTabContentRef, className: "gd-schedule-dialog-tab-content", children: [
|
|
210
|
-
_jsx(Message, { type: "progress", className: "gd-schedule-dialog-tab-content-info", children: intl.formatMessage({
|
|
212
|
+
: undefined, children: _jsx(AutomationFiltersSelect, { availableFilters: availableFilters, selectedFilters: editedAutomationFilters, onFiltersChange: onFiltersChange, storeFilters: storeFilters, onStoreFiltersChange: onStoreFiltersChange, isDashboardAutomation: !widget, overlayPositionType: OVERLAY_POSITION_TYPE, hideTitle: true, showAllFilters: true, filtersByTab: filtersByTab, editedFiltersByTab: editedAutomationFiltersByTab, onFiltersByTabChange: onFiltersByTabChange }) })) : (_jsxs("div", { ref: generalTabContentRef, className: "gd-schedule-dialog-tab-content", children: [!widget && hasMultipleTabs ? (_jsx(Message, { type: "progress", className: "gd-schedule-dialog-tab-content-info", children: intl.formatMessage({
|
|
211
213
|
id: "dialogs.schedule.email.tabs.info",
|
|
212
|
-
}) }), _jsx(RecurrenceForm, { startDate: startDate, cronExpression: editedAutomation.schedule?.cron ??
|
|
214
|
+
}) })) : null, _jsx(RecurrenceForm, { startDate: startDate, cronExpression: editedAutomation.schedule?.cron ??
|
|
213
215
|
getDefaultCronExpression(startDate), cronDescription: editedAutomation.schedule?.cronDescription, timezone: editedAutomation.schedule?.timezone ??
|
|
214
216
|
TIMEZONE_DEFAULT.identifier, dateFormat: dateFormat ?? "MM/dd/yyyy", locale: locale, weekStart: weekStart, onChange: onRecurrenceChange, allowHourlyRecurrence: allowHourlyRecurrence, isWhiteLabeled: isWhiteLabeled, closeDropdownsOnParentScroll: CLOSE_ON_PARENT_SCROLL, onKeyDownSubmit: handleSubmitForm }), _jsx(ContentDivider, { className: "gd-divider-with-margin" }), _jsx(DestinationSelect, { notificationChannels: notificationChannels, selectedItemId: editedAutomation.notificationChannel, onChange: onDestinationChange, closeOnParentScroll: CLOSE_ON_PARENT_SCROLL, overlayPositionType: OVERLAY_POSITION_TYPE }), _jsx(ContentDivider, { className: "gd-divider-with-margin" }), _jsx(RecipientsSelect, { id: "schedule.email.recipients", loggedUser: defaultUser, users: users, usersError: usersError, value: editedAutomation.recipients ?? [], originalValue: originalAutomation.recipients || [], onChange: onRecipientsChange, allowEmptySelection: true, allowOnlyLoggedUserRecipients: allowOnlyLoggedUserRecipients, allowExternalRecipients: allowExternalRecipients, maxRecipients: maxAutomationsRecipients, notificationChannels: notificationChannels, notificationChannelId: editedAutomation.notificationChannel, onKeyDownSubmit: handleSubmitForm, externalRecipientOverride: externalRecipientOverride }), isInPlatformChannel ? null : (_jsxs(_Fragment, { children: [
|
|
215
217
|
_jsx(SubjectForm, { dashboardTitle: dashboardTitle, editedAutomation: editedAutomation, onChange: onSubjectChange, onKeyDownSubmit: handleSaveScheduledEmail, isSubmitDisabled: isSubmitDisabled }), _jsx(MessageForm, { onChange: onMessageChange, value: editedAutomation.details?.message ?? "" })
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { useMemo } from "react";
|
|
3
|
-
import { dashboardFilterLocalIdentifier, filterLocalIdentifier, isDashboardAttributeFilter, isDashboardDateFilter, newAllTimeDashboardDateFilter, } from "@gooddata/sdk-model";
|
|
3
|
+
import { dashboardFilterLocalIdentifier, filterLocalIdentifier, isDashboardArbitraryAttributeFilter, isDashboardAttributeFilter, isDashboardDateFilter, isDashboardMatchAttributeFilter, isDashboardMeasureValueFilter, newAllTimeDashboardDateFilter, } from "@gooddata/sdk-model";
|
|
4
4
|
import { getAutomationAlertFilters, getAutomationDashboardFilters, getAutomationDashboardFiltersByTab, getAutomationVisualizationFilters, } from "../../../../../_staging/automation/index.js";
|
|
5
5
|
import { dashboardFilterToFilterContextItem } from "../../../../../_staging/dashboard/dashboardFilterContext.js";
|
|
6
6
|
import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
|
|
@@ -18,7 +18,8 @@ export function useDefaultSelectedFiltersForExistingAutomation(automationToEdit,
|
|
|
18
18
|
const savedAutomationWidgetFilters = savedWidgetAlertFilters ?? savedWidgetScheduleFilters;
|
|
19
19
|
const convertedSavedWidgetFilters = savedAutomationWidgetFilters
|
|
20
20
|
?.filter(isDashboardFilter)
|
|
21
|
-
.map((filter) => convertAndSanitizeFilter(filter, availableVisibleFilters))
|
|
21
|
+
.map((filter) => convertAndSanitizeFilter(filter, availableVisibleFilters))
|
|
22
|
+
.filter((item) => item !== undefined);
|
|
22
23
|
return (savedDashboardScheduleFilters ??
|
|
23
24
|
savedWidgetScheduleFilterContextItems ??
|
|
24
25
|
convertedSavedWidgetFilters);
|
|
@@ -113,6 +114,9 @@ export function getDefaultSelectedFiltersByTabForExistingAutomation(automationTo
|
|
|
113
114
|
}
|
|
114
115
|
function convertAndSanitizeFilter(filter, availableVisibleFilters) {
|
|
115
116
|
const convertedItem = dashboardFilterToFilterContextItem(filter, true);
|
|
117
|
+
if (!convertedItem) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
116
120
|
// Because execution filters do not include titles, and they cannot be saved there,
|
|
117
121
|
// get them from the current available visible filters.
|
|
118
122
|
const titleToUse = availableVisibleFilters?.find((visibleFilter) => visibleFilter.localIdentifier === filterLocalIdentifier(filter));
|
|
@@ -126,6 +130,10 @@ function convertAndSanitizeFilter(filter, availableVisibleFilters) {
|
|
|
126
130
|
};
|
|
127
131
|
}
|
|
128
132
|
else if (isDashboardDateFilter(convertedItem)) {
|
|
133
|
+
// IDashboardDateFilter has no `title` field on its current type, but downstream UI relies
|
|
134
|
+
// on the saved automation title carried alongside the filter. Preserved as pre-existing
|
|
135
|
+
// behavior via a structural assertion until the type is widened or the field is consumed
|
|
136
|
+
// from a different source.
|
|
129
137
|
return {
|
|
130
138
|
...convertedItem,
|
|
131
139
|
dateFilter: {
|
|
@@ -134,6 +142,32 @@ function convertAndSanitizeFilter(filter, availableVisibleFilters) {
|
|
|
134
142
|
},
|
|
135
143
|
};
|
|
136
144
|
}
|
|
137
|
-
|
|
145
|
+
else if (isDashboardMeasureValueFilter(convertedItem)) {
|
|
146
|
+
return {
|
|
147
|
+
...convertedItem,
|
|
148
|
+
dashboardMeasureValueFilter: {
|
|
149
|
+
...convertedItem.dashboardMeasureValueFilter,
|
|
150
|
+
title: titleToUse?.title,
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
else if (isDashboardArbitraryAttributeFilter(convertedItem)) {
|
|
155
|
+
return {
|
|
156
|
+
...convertedItem,
|
|
157
|
+
arbitraryAttributeFilter: {
|
|
158
|
+
...convertedItem.arbitraryAttributeFilter,
|
|
159
|
+
title: titleToUse?.title,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
else if (isDashboardMatchAttributeFilter(convertedItem)) {
|
|
164
|
+
return {
|
|
165
|
+
...convertedItem,
|
|
166
|
+
matchAttributeFilter: {
|
|
167
|
+
...convertedItem.matchAttributeFilter,
|
|
168
|
+
title: titleToUse?.title,
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
138
172
|
return convertedItem;
|
|
139
173
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { differenceBy, omit } from "lodash-es";
|
|
3
|
-
import { dashboardFilterLocalIdentifier, filterLocalIdentifier, isAllValuesAttributeFilter, isAllValuesDashboardAttributeFilter, isAttributeFilter, isAttributeFilterWithSelection, isDashboardAttributeFilter, isDashboardCommonDateFilter, isDateFilter, isInsightWidget, isLocalIdRef, isNegativeAttributeFilter, isPositiveAttributeFilter, isRelativeDateFilter, isSingleSelectionFilter, } from "@gooddata/sdk-model";
|
|
3
|
+
import { dashboardFilterLocalIdentifier, filterLocalIdentifier, isAllDashboardMeasureValueFilter, isAllValuesAttributeFilter, isAllValuesDashboardAttributeFilter, isAttributeFilter, isAttributeFilterWithSelection, isDashboardAttributeFilter, isDashboardCommonDateFilter, isDateFilter, isInsightWidget, isLocalIdRef, isNegativeAttributeFilter, isPositiveAttributeFilter, isRelativeDateFilter, isSingleSelectionFilter, } from "@gooddata/sdk-model";
|
|
4
4
|
import { getAutomationAlertFilters, getAutomationDashboardFilters, getAutomationDashboardFiltersByTab, getAutomationVisualizationFilters, } from "../../../../../_staging/automation/index.js";
|
|
5
5
|
import { filterContextItemsToDashboardFiltersByWidget } from "../../../../../converters/filterConverters.js";
|
|
6
6
|
import { isFilterTypeCompatibleWithSelectionType } from "../../../../../model/commandHandlers/dashboard/common/attributeFilterSelectionTypeCompatibility.js";
|
|
@@ -365,6 +365,9 @@ function validateVisibleFilters(savedAutomationFilters, savedVisibleFilters, das
|
|
|
365
365
|
if (isAllValuesDashboardAttributeFilter(currentDashboardFilter)) {
|
|
366
366
|
continue;
|
|
367
367
|
}
|
|
368
|
+
if (isAllDashboardMeasureValueFilter(currentDashboardFilter)) {
|
|
369
|
+
continue;
|
|
370
|
+
}
|
|
368
371
|
visibleFilterIsMissingInSavedFilters = true;
|
|
369
372
|
}
|
|
370
373
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddata/sdk-ui-dashboard",
|
|
3
|
-
"version": "11.37.0
|
|
3
|
+
"version": "11.37.0",
|
|
4
4
|
"description": "GoodData SDK - Dashboard Component",
|
|
5
5
|
"license": "LicenseRef-LICENSE",
|
|
6
6
|
"author": "GoodData Corporation",
|
|
@@ -60,19 +60,19 @@
|
|
|
60
60
|
"ts-invariant": "0.10.3",
|
|
61
61
|
"tslib": "2.8.1",
|
|
62
62
|
"uuid": "11.1.0",
|
|
63
|
-
"@gooddata/sdk-backend-base": "11.37.0
|
|
64
|
-
"@gooddata/sdk-backend-spi": "11.37.0
|
|
65
|
-
"@gooddata/sdk-model": "11.37.0
|
|
66
|
-
"@gooddata/sdk-ui": "11.37.0
|
|
67
|
-
"@gooddata/sdk-ui-
|
|
68
|
-
"@gooddata/sdk-ui-
|
|
69
|
-
"@gooddata/sdk-ui-filters": "11.37.0
|
|
70
|
-
"@gooddata/sdk-ui-
|
|
71
|
-
"@gooddata/sdk-ui-
|
|
72
|
-
"@gooddata/sdk-ui-pivot": "11.37.0
|
|
73
|
-
"@gooddata/sdk-ui-theme-provider": "11.37.0
|
|
74
|
-
"@gooddata/
|
|
75
|
-
"@gooddata/
|
|
63
|
+
"@gooddata/sdk-backend-base": "11.37.0",
|
|
64
|
+
"@gooddata/sdk-backend-spi": "11.37.0",
|
|
65
|
+
"@gooddata/sdk-model": "11.37.0",
|
|
66
|
+
"@gooddata/sdk-ui": "11.37.0",
|
|
67
|
+
"@gooddata/sdk-ui-ext": "11.37.0",
|
|
68
|
+
"@gooddata/sdk-ui-charts": "11.37.0",
|
|
69
|
+
"@gooddata/sdk-ui-filters": "11.37.0",
|
|
70
|
+
"@gooddata/sdk-ui-kit": "11.37.0",
|
|
71
|
+
"@gooddata/sdk-ui-geo": "11.37.0",
|
|
72
|
+
"@gooddata/sdk-ui-pivot": "11.37.0",
|
|
73
|
+
"@gooddata/sdk-ui-theme-provider": "11.37.0",
|
|
74
|
+
"@gooddata/util": "11.37.0",
|
|
75
|
+
"@gooddata/sdk-ui-vis-commons": "11.37.0"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@microsoft/api-documenter": "^7.17.0",
|
|
@@ -118,12 +118,12 @@
|
|
|
118
118
|
"typescript": "5.9.3",
|
|
119
119
|
"vitest": "4.1.0",
|
|
120
120
|
"vitest-dom": "0.1.1",
|
|
121
|
-
"@gooddata/eslint-config": "11.37.0
|
|
122
|
-
"@gooddata/
|
|
123
|
-
"@gooddata/
|
|
124
|
-
"@gooddata/
|
|
125
|
-
"@gooddata/stylelint-config": "11.37.0
|
|
126
|
-
"@gooddata/oxlint-config": "11.37.0
|
|
121
|
+
"@gooddata/eslint-config": "11.37.0",
|
|
122
|
+
"@gooddata/i18n-toolkit": "11.37.0",
|
|
123
|
+
"@gooddata/reference-workspace": "11.37.0",
|
|
124
|
+
"@gooddata/sdk-backend-mockingbird": "11.37.0",
|
|
125
|
+
"@gooddata/stylelint-config": "11.37.0",
|
|
126
|
+
"@gooddata/oxlint-config": "11.37.0"
|
|
127
127
|
},
|
|
128
128
|
"peerDependencies": {
|
|
129
129
|
"react": "^18.0.0 || ^19.0.0",
|