@gooddata/sdk-ui-dashboard 11.43.0-alpha.0 → 11.43.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 +130 -130
- package/esm/__version.d.ts +1 -1
- package/esm/__version.js +1 -1
- package/esm/index.d.ts +3 -2
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -1
- package/esm/model/commandHandlers/drill/resolveDrillToCustomUrl.d.ts.map +1 -1
- package/esm/model/commandHandlers/drill/resolveDrillToCustomUrl.js +10 -5
- package/esm/model/commandHandlers/filterContext/dateFilter/removeDateFiltersHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/dateFilter/removeDateFiltersHandler.js +22 -4
- package/esm/model/commandHandlers/scheduledEmail/createScheduledEmailHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/scheduledEmail/createScheduledEmailHandler.js +3 -1
- package/esm/model/commandHandlers/scheduledEmail/csvRawExecutionDefinition.d.ts +2 -2
- package/esm/model/commandHandlers/scheduledEmail/csvRawExecutionDefinition.d.ts.map +1 -1
- package/esm/model/commandHandlers/scheduledEmail/csvRawExecutionDefinition.js +36 -3
- package/esm/model/commandHandlers/scheduledEmail/saveScheduledEmailHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/scheduledEmail/saveScheduledEmailHandler.js +3 -1
- package/esm/model/store/executionResults/executionResultsSelectors.d.ts +4 -0
- package/esm/model/store/executionResults/executionResultsSelectors.d.ts.map +1 -1
- package/esm/model/store/executionResults/executionResultsSelectors.js +4 -1
- package/esm/model/store/filtering/dashboardFilterSelectors.d.ts +1 -30
- package/esm/model/store/filtering/dashboardFilterSelectors.d.ts.map +1 -1
- package/esm/model/store/filtering/dashboardFilterSelectors.js +3 -0
- package/esm/model/store/filtering/types.d.ts +33 -0
- package/esm/model/store/filtering/types.d.ts.map +1 -0
- package/esm/model/store/filtering/types.js +2 -0
- package/esm/model/store/tabs/dateFilterConfig/dateFilterConfigSelectors.d.ts +14 -0
- package/esm/model/store/tabs/dateFilterConfig/dateFilterConfigSelectors.d.ts.map +1 -1
- package/esm/model/store/tabs/dateFilterConfig/dateFilterConfigSelectors.js +35 -0
- package/esm/model/store/tabs/parameters/parametersSelectors.d.ts +12 -0
- package/esm/model/store/tabs/parameters/parametersSelectors.d.ts.map +1 -1
- package/esm/model/store/tabs/parameters/parametersSelectors.js +37 -12
- package/esm/presentation/automations/_staging/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts.map +1 -1
- package/esm/presentation/automations/_staging/alerting/DefaultAlertingDialog/DefaultAlertingDialog.js +10 -5
- package/esm/presentation/automations/_staging/alerting/DefaultAlertingManagementDialog/components/PauseAlertRunner.js +1 -1
- package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.d.ts +3 -0
- package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.d.ts.map +1 -0
- package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.js +110 -0
- package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.test.d.ts +2 -0
- package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.test.d.ts.map +1 -0
- package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.test.js +99 -0
- package/esm/presentation/automations/connectors/hooks/useWidgetAutomationFilters.d.ts +4 -0
- package/esm/presentation/automations/connectors/hooks/useWidgetAutomationFilters.d.ts.map +1 -0
- package/esm/presentation/automations/connectors/hooks/useWidgetAutomationFilters.js +46 -0
- package/esm/presentation/automations/contexts/AutomationsContext.d.ts +42 -2
- package/esm/presentation/automations/contexts/AutomationsContext.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +8 -2
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/hooks/useEditScheduledEmail.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/hooks/useWidgetAutomationFilters.d.ts +2 -3
- package/esm/presentation/automations/scheduledEmail/hooks/useWidgetAutomationFilters.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/hooks/useWidgetAutomationFilters.js +4 -45
- package/esm/presentation/automations/shared/automationFilters/components/AutomationDateFilter.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/components/AutomationDateFilter.js +9 -16
- package/esm/presentation/automations/shared/automationFilters/components/AutomationDateFilter.test.d.ts +2 -0
- package/esm/presentation/automations/shared/automationFilters/components/AutomationDateFilter.test.d.ts.map +1 -0
- package/esm/presentation/automations/shared/automationFilters/components/AutomationDateFilter.test.js +131 -0
- package/esm/presentation/automations/shared/automationFilters/components/AutomationFiltersSelect.d.ts +1 -1
- package/esm/presentation/automations/shared/automationFilters/components/AutomationFiltersSelect.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useAutomationVisibleFilters.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useAutomationVisibleFilters.js +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.d.ts +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.js +4 -6
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForNewAutomation.d.ts +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForNewAutomation.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForNewAutomation.js +3 -4
- package/esm/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.d.ts +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useValidateExistingAutomationFilters.js +4 -10
- package/esm/presentation/automations/shared/automationFilters/useAutomationFilters.d.ts +1 -1
- package/esm/presentation/automations/shared/automationFilters/useAutomationFilters.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/useAutomationFilters.js +3 -28
- package/esm/presentation/automations/shared/automationFilters/useAutomationFiltersSelect.d.ts +2 -2
- package/esm/presentation/automations/shared/automationFilters/useAutomationFiltersSelect.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/useAutomationFiltersSelect.js +2 -5
- package/esm/presentation/automations/shared/automationFilters/utils.d.ts +1 -1
- package/esm/presentation/automations/shared/automationFilters/utils.d.ts.map +1 -1
- package/esm/presentation/automations/shared/dateFilterConfig/dateFilterConfigConverters.d.ts +10 -0
- package/esm/presentation/automations/shared/dateFilterConfig/dateFilterConfigConverters.d.ts.map +1 -0
- package/esm/presentation/automations/shared/dateFilterConfig/dateFilterConfigConverters.js +89 -0
- package/esm/presentation/automations/shared/dateFilterConfig/dateFilterOptionMapping.d.ts +34 -0
- package/esm/presentation/automations/shared/dateFilterConfig/dateFilterOptionMapping.d.ts.map +1 -0
- package/esm/presentation/automations/shared/dateFilterConfig/dateFilterOptionMapping.js +261 -0
- package/esm/presentation/automations/shared/dateFilterConfig/defaultConfig.d.ts +12 -0
- package/esm/presentation/automations/shared/dateFilterConfig/defaultConfig.d.ts.map +1 -0
- package/esm/presentation/automations/shared/dateFilterConfig/defaultConfig.js +437 -0
- package/esm/presentation/automations/shared/exportUtils/filterUtils.d.ts +3 -0
- package/esm/presentation/automations/shared/exportUtils/filterUtils.d.ts.map +1 -0
- package/esm/presentation/automations/shared/exportUtils/filterUtils.js +14 -0
- package/esm/presentation/automations/shared/hooks/useAttributeFilterDisplayFormFromMap.d.ts +3 -0
- package/esm/presentation/automations/shared/hooks/useAttributeFilterDisplayFormFromMap.d.ts.map +1 -0
- package/esm/presentation/automations/shared/hooks/useAttributeFilterDisplayFormFromMap.js +7 -0
- package/esm/presentation/automations/shared/hooks/useCommonDateFilterTitle.d.ts +3 -0
- package/esm/presentation/automations/shared/hooks/useCommonDateFilterTitle.d.ts.map +1 -0
- package/esm/presentation/automations/shared/hooks/useCommonDateFilterTitle.js +6 -0
- package/esm/presentation/automations/shared/hooks/useDateFiltersTitles.d.ts +4 -0
- package/esm/presentation/automations/shared/hooks/useDateFiltersTitles.d.ts.map +1 -0
- package/esm/presentation/automations/shared/hooks/useDateFiltersTitles.js +19 -0
- package/esm/presentation/automations/shared/hooks/useFiltersNamings.d.ts +13 -0
- package/esm/presentation/automations/shared/hooks/useFiltersNamings.d.ts.map +1 -0
- package/esm/presentation/automations/shared/hooks/useFiltersNamings.js +196 -0
- package/esm/presentation/automations/shared/utils/automationUtils.d.ts +24 -0
- package/esm/presentation/automations/shared/utils/automationUtils.d.ts.map +1 -0
- package/esm/presentation/automations/shared/utils/automationUtils.js +135 -0
- package/esm/presentation/automations/shared/utils/filterContextUtils.d.ts +4 -0
- package/esm/presentation/automations/shared/utils/filterContextUtils.d.ts.map +1 -0
- package/esm/presentation/automations/shared/utils/filterContextUtils.js +67 -0
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditor.d.ts.map +1 -1
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditor.js +11 -13
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useDependentDateFilterConfigurationState.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useDependentDateFilterConfigurationState.js +34 -16
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useDependentDateFiltersConfiguration.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useDependentDateFiltersConfiguration.js +23 -8
- package/esm/presentation/filterBar/attributeFilter/useDependentDateFilters.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/useDependentDateFilters.js +17 -6
- package/esm/presentation/topBar/menuButton/DefaultMenuButton.d.ts.map +1 -1
- package/esm/presentation/topBar/menuButton/DefaultMenuButton.js +11 -20
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.d.ts.map +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.js +3 -4
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogExportDropdown.d.ts.map +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogExportDropdown.js +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.d.ts.map +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.js +11 -2
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useCreateAlert.d.ts.map +1 -0
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useInsightWidgetAlerting.d.ts.map +1 -1
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useInsightWidgetAlerting.js +2 -2
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useSaveAlertToBackend.d.ts.map +1 -0
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useUpdateAlert.d.ts.map +1 -0
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useWidgetAutomationFilters.d.ts +4 -0
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useWidgetAutomationFilters.d.ts.map +1 -0
- package/esm/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useWidgetAutomationFilters.js +46 -0
- package/esm/presentation/widget/insight/configuration/InsightAlertsNew.d.ts.map +1 -1
- package/esm/presentation/widget/insight/configuration/InsightAlertsNew.js +1 -1
- package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/DashboardInsightMenuItemButton.d.ts.map +1 -1
- package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/DashboardInsightMenuItemButton.js +2 -2
- package/esm/presentation/widget/insightMenu/types.js +1 -1
- package/esm/presentation/widget/widget/warningPartialResult/InsightWidgetWarningPartialResult.d.ts.map +1 -1
- package/esm/presentation/widget/widget/warningPartialResult/InsightWidgetWarningPartialResult.js +1 -1
- package/esm/sdk-ui-dashboard.d.ts +11 -2
- package/esm/tsdoc-metadata.json +1 -1
- package/package.json +20 -20
- package/esm/presentation/automations/_staging/alerting/DefaultAlertingDialog/hooks/useCreateAlert.d.ts.map +0 -1
- package/esm/presentation/automations/_staging/alerting/DefaultAlertingDialog/hooks/useSaveAlertToBackend.d.ts.map +0 -1
- package/esm/presentation/automations/_staging/alerting/DefaultAlertingDialog/hooks/useUpdateAlert.d.ts.map +0 -1
- /package/esm/presentation/{automations/_staging/alerting/DefaultAlertingDialog → widget/insight/configuration/InsightAlertConfig}/hooks/useCreateAlert.d.ts +0 -0
- /package/esm/presentation/{automations/_staging/alerting/DefaultAlertingDialog → widget/insight/configuration/InsightAlertConfig}/hooks/useCreateAlert.js +0 -0
- /package/esm/presentation/{automations/_staging/alerting/DefaultAlertingDialog → widget/insight/configuration/InsightAlertConfig}/hooks/useSaveAlertToBackend.d.ts +0 -0
- /package/esm/presentation/{automations/_staging/alerting/DefaultAlertingDialog → widget/insight/configuration/InsightAlertConfig}/hooks/useSaveAlertToBackend.js +0 -0
- /package/esm/presentation/{automations/_staging/alerting/DefaultAlertingDialog → widget/insight/configuration/InsightAlertConfig}/hooks/useUpdateAlert.d.ts +0 -0
- /package/esm/presentation/{automations/_staging/alerting/DefaultAlertingDialog → widget/insight/configuration/InsightAlertConfig}/hooks/useUpdateAlert.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDependentDateFilters.d.ts","sourceRoot":"","sources":["../../../../src/presentation/filterBar/attributeFilter/useDependentDateFilters.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,KAAK,4BAA4B,
|
|
1
|
+
{"version":3,"file":"useDependentDateFilters.d.ts","sourceRoot":"","sources":["../../../../src/presentation/filterBar/attributeFilter/useDependentDateFilters.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,KAAK,4BAA4B,EAMpC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAe1E;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,yBAAyB,EAAE,sBAAsB,CAAC,CAAC;AAE7F;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,8FAiFnC,CAAC"}
|
|
@@ -34,23 +34,34 @@ export const useDependentDateFilters = (filter, tabId) => {
|
|
|
34
34
|
const dependentDateFilters = useMemo(() => {
|
|
35
35
|
return filterElementsByDate?.map((dependentDateFilter) => {
|
|
36
36
|
if (dependentDateFilter.isCommonDate) {
|
|
37
|
+
// The dimension to apply the common date range through.
|
|
38
|
+
// New format: the explicit `dataSet` field (filterLocalIdentifier references the common
|
|
39
|
+
// date filter itself). Legacy format: no `dataSet` field, so the dataset identifier was
|
|
40
|
+
// stored directly in filterLocalIdentifier.
|
|
41
|
+
const dataSet = dependentDateFilter.dataSet ?? {
|
|
42
|
+
identifier: dependentDateFilter.filterLocalIdentifier,
|
|
43
|
+
type: "dataSet",
|
|
44
|
+
};
|
|
37
45
|
const commonDashboardDateFilter = {
|
|
38
46
|
dateFilter: {
|
|
39
47
|
type: commonDateFilterWithAllTime?.dateFilter.type,
|
|
40
48
|
granularity: commonDateFilterWithAllTime?.dateFilter.granularity,
|
|
41
49
|
from: commonDateFilterWithAllTime?.dateFilter.from,
|
|
42
50
|
to: commonDateFilterWithAllTime?.dateFilter.to,
|
|
43
|
-
dataSet
|
|
44
|
-
identifier: dependentDateFilter.filterLocalIdentifier,
|
|
45
|
-
type: "dataSet",
|
|
46
|
-
},
|
|
51
|
+
dataSet,
|
|
47
52
|
},
|
|
48
53
|
};
|
|
49
54
|
return commonDashboardDateFilter;
|
|
50
55
|
}
|
|
51
56
|
else {
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
// Try localIdentifier first (new format), then fall back to dataset identifier
|
|
58
|
+
// (legacy format) for dashboards saved before the localIdentifier-based approach.
|
|
59
|
+
// NOTE: If a filter's localIdentifier happens to equal another filter's dataset
|
|
60
|
+
// identifier the wrong filter could be matched — this is an accepted theoretical
|
|
61
|
+
// risk given the practical namespace separation between the two.
|
|
62
|
+
const matchingFilter = allDateFilters.find((filter) => filter.dateFilter.localIdentifier === dependentDateFilter.filterLocalIdentifier ||
|
|
63
|
+
objRefToString(filter.dateFilter.dataSet) ===
|
|
64
|
+
dependentDateFilter.filterLocalIdentifier);
|
|
54
65
|
invariant(matchingFilter); // if this blows up, the state is inconsistent
|
|
55
66
|
return matchingFilter;
|
|
56
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultMenuButton.d.ts","sourceRoot":"","sources":["../../../../src/presentation/topBar/menuButton/DefaultMenuButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGH,KAAK,YAAY,EAOpB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DefaultMenuButton.d.ts","sourceRoot":"","sources":["../../../../src/presentation/topBar/menuButton/DefaultMenuButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGH,KAAK,YAAY,EAOpB,MAAM,OAAO,CAAC;AA2Bf,OAAO,EAIH,KAAK,gBAAgB,EACxB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CAgOtF"}
|
|
@@ -3,7 +3,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
3
3
|
import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
|
|
4
4
|
import cx from "classnames";
|
|
5
5
|
import { useIntl } from "react-intl";
|
|
6
|
-
import { Button, ItemsWrapper, Overlay, SingleSelectListItem, UiFocusManager, UiIcon, UiTooltip, getFocusableElements, isActionKey, makeMenuKeyboardNavigation, useId, useIdPrefixed, } from "@gooddata/sdk-ui-kit";
|
|
6
|
+
import { Button, ItemsWrapper, Overlay, SingleSelectListItem, UiFocusManager, UiIcon, UiTooltip, findFocusableElementOutsideContainer, getFocusableElements, isActionKey, makeMenuKeyboardNavigation, useId, useIdPrefixed, } from "@gooddata/sdk-ui-kit";
|
|
7
7
|
import { DEFAULT_MENU_BUTTON_ID } from "../../../_staging/accessibility/elementId.js";
|
|
8
8
|
import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
|
|
9
9
|
import { selectDashboardDensity } from "../../../model/store/ui/uiSelectors.js";
|
|
@@ -20,6 +20,7 @@ export function DefaultMenuButton({ menuItems }) {
|
|
|
20
20
|
const backLabel = intl.formatMessage({ id: "controlButtons.options.back" });
|
|
21
21
|
const closeLabel = intl.formatMessage({ id: "controlButtons.options.closeMenu" });
|
|
22
22
|
const menuWrapperRef = useRef(null);
|
|
23
|
+
const triggerButtonRef = useRef(null);
|
|
23
24
|
const [parentItemId, setParentItemId] = useState(null);
|
|
24
25
|
const menuItemRefs = useRef(new Map());
|
|
25
26
|
const density = useDashboardSelector(selectDashboardDensity);
|
|
@@ -99,24 +100,14 @@ export function DefaultMenuButton({ menuItems }) {
|
|
|
99
100
|
}
|
|
100
101
|
event.stopPropagation();
|
|
101
102
|
event.preventDefault();
|
|
102
|
-
if (
|
|
103
|
+
if (event.key !== "Tab") {
|
|
103
104
|
return;
|
|
104
105
|
}
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const getNextElementIndex = (currentIndex, isShiftKey) => {
|
|
111
|
-
if (isShiftKey) {
|
|
112
|
-
return currentIndex <= 0 ? focusableElements.length - 1 : currentIndex - 1;
|
|
113
|
-
}
|
|
114
|
-
return (currentIndex + 1) % focusableElements.length;
|
|
115
|
-
};
|
|
116
|
-
do {
|
|
117
|
-
currentIndex = getNextElementIndex(currentIndex, event.shiftKey);
|
|
118
|
-
nextElement = focusableElements[currentIndex];
|
|
119
|
-
} while (isMenuItemExceptTheFirstOne(nextElement));
|
|
106
|
+
const triggerButton = triggerButtonRef.current;
|
|
107
|
+
const nextElement = triggerButton
|
|
108
|
+
? findFocusableElementOutsideContainer(triggerButton, event.shiftKey ? "backward" : "forward")
|
|
109
|
+
: null;
|
|
110
|
+
onClose();
|
|
120
111
|
nextElement?.focus();
|
|
121
112
|
},
|
|
122
113
|
});
|
|
@@ -139,7 +130,7 @@ export function DefaultMenuButton({ menuItems }) {
|
|
|
139
130
|
return null;
|
|
140
131
|
}
|
|
141
132
|
const renderMenuItems = () => {
|
|
142
|
-
return (_jsx(Overlay, { alignTo: `.${dropdownAnchorClassName}`, alignPoints: overlayAlignPoints, className: "gd-header-menu-overlay", closeOnMouseDrag: true, closeOnOutsideClick: true, onClose: onMenuButtonClick, children: _jsx(UiFocusManager, { enableAutofocus: true,
|
|
133
|
+
return (_jsx(Overlay, { alignTo: `.${dropdownAnchorClassName}`, alignPoints: overlayAlignPoints, className: "gd-header-menu-overlay", closeOnMouseDrag: true, closeOnOutsideClick: true, onClose: onMenuButtonClick, children: _jsx(UiFocusManager, { enableAutofocus: true, enableReturnFocusOnUnmount: true, children: _jsx("div", { onKeyDown: menuKeyboardNavigationHandler, children: _jsxs(ItemsWrapper, { smallItemsSpacing: true, className: "gd-menu", wrapperRef: menuWrapperRef, children: [selectedMenuItem ? (_jsx(DefaultSubmenuHeader, { title: selectedMenuItem.itemName, backLabel: backLabel, closeLabel: closeLabel, onClose: onClose, onGoBack: () => {
|
|
143
134
|
setAutofocusSubmenu(true);
|
|
144
135
|
setSelectedMenuItem(null);
|
|
145
136
|
} })) : null, _jsx("div", { role: "menu", id: menuId, "aria-labelledby": DEFAULT_MENU_BUTTON_ID, children: visibleMenuItems.map((menuItem) => {
|
|
@@ -148,7 +139,7 @@ export function DefaultMenuButton({ menuItems }) {
|
|
|
148
139
|
] }) }) }) }, "topBarMenuButton"));
|
|
149
140
|
};
|
|
150
141
|
return (_jsxs(_Fragment, { children: [
|
|
151
|
-
_jsx(UiTooltip, { arrowPlacement: "top-end", content: tooltipText, anchor: _jsx(Button, { onClick: onMenuButtonClick, value: "\u22EF", id: DEFAULT_MENU_BUTTON_ID, className: cx("gd-button-primary dash-header-options-button s-header-options-button gd-button", dropdownAnchorClassName, {
|
|
142
|
+
_jsx(UiTooltip, { arrowPlacement: "top-end", content: tooltipText, anchor: _jsx(Button, { ref: triggerButtonRef, onClick: onMenuButtonClick, value: "\u22EF", id: DEFAULT_MENU_BUTTON_ID, className: cx("gd-button-primary dash-header-options-button s-header-options-button gd-button", dropdownAnchorClassName, {
|
|
152
143
|
"gd-button-small": density === "compact",
|
|
153
144
|
}), accessibilityConfig: {
|
|
154
145
|
ariaLabel: tooltipText,
|
|
@@ -236,5 +227,5 @@ function MenuItem({ menuItem, selectedMenuItem, setMenuItemRef, setSelectedMenuI
|
|
|
236
227
|
});
|
|
237
228
|
}
|
|
238
229
|
function renderMenuItemWarning(info, suppressHover) {
|
|
239
|
-
return (_jsx("span", { className: "gd-list-icon gd-list-icon-right", children: _jsx(UiTooltip, { triggerBy: ["hover"], disabled: suppressHover, arrowPlacement: "left", optimalPlacement: true, content: info, anchor: _jsx(UiIcon, { type: "warning", size: 16, color: "warning", accessibilityConfig: { ariaHidden: true } }) }) }));
|
|
230
|
+
return (_jsx("span", { className: "gd-list-icon gd-list-icon-right", "data-testid": "menu-item-info-icon", children: _jsx(UiTooltip, { triggerBy: ["hover"], disabled: suppressHover, arrowPlacement: "left", optimalPlacement: true, content: info, anchor: _jsx(UiIcon, { type: "warning", size: 16, color: "warning", accessibilityConfig: { ariaHidden: true } }) }) }));
|
|
240
231
|
}
|
package/esm/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardInsight.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,YAAY,EAMpB,MAAM,OAAO,CAAC;AAkDf,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAkD7D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,OAAO,EACP,MAAM,EACN,YAAY,EACZ,WAAW,EACX,OAAO,EACP,SAAS,EACT,OAAO,EACP,OAAO,EAAE,SAAS,EAClB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EAAE,oBAAoB,EACpC,gBAAgB,EAAE,sBAAsB,EACxC,UAAU,EACV,YAAY,EACZ,aAAa,EAChB,EAAE,sBAAsB,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"DashboardInsight.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,YAAY,EAMpB,MAAM,OAAO,CAAC;AAkDf,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAkD7D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,OAAO,EACP,MAAM,EACN,YAAY,EACZ,WAAW,EACX,OAAO,EACP,SAAS,EACT,OAAO,EACP,OAAO,EAAE,SAAS,EAClB,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,cAAc,EAAE,oBAAoB,EACpC,gBAAgB,EAAE,sBAAsB,EACxC,UAAU,EACV,YAAY,EACZ,aAAa,EAChB,EAAE,sBAAsB,GAAG,YAAY,CAyQvC"}
|
package/esm/presentation/widget/insight/ViewModeDashboardInsight/Insight/DashboardInsight.js
CHANGED
|
@@ -164,11 +164,11 @@ export function DashboardInsight({ insight, widget, clientHeight, clientWidth, b
|
|
|
164
164
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
165
165
|
[onError, executionsHandler.onError, onResolveAsyncRender]);
|
|
166
166
|
const effectiveError = filtersError ?? visualizationError;
|
|
167
|
+
const execConfig = useWidgetExecConfig(ref);
|
|
167
168
|
useEffect(() => {
|
|
168
|
-
//
|
|
169
|
-
// one of custom error is no data
|
|
169
|
+
// Clear a stale error (e.g. "no data") on any execution change — parameters flow via execConfig, not filters.
|
|
170
170
|
setVisualizationError(undefined);
|
|
171
|
-
}, [filtersForInsightHash]);
|
|
171
|
+
}, [filtersForInsightHash, execConfig]);
|
|
172
172
|
// CSS
|
|
173
173
|
const insightPositionStyle = useInsightPositionStyle();
|
|
174
174
|
const insightWrapperStyle = useMemo(() => {
|
|
@@ -181,7 +181,6 @@ export function DashboardInsight({ insight, widget, clientHeight, clientWidth, b
|
|
|
181
181
|
// if filter status is success and visualization is loading, render both loading and insight
|
|
182
182
|
const loading = filtersStatus === "running" || isVisualizationLoading;
|
|
183
183
|
const exportDataVis = useVisualizationExportData(exportData, isVisualizationInitializing || isVisualizationLoading, !!effectiveError);
|
|
184
|
-
const execConfig = useWidgetExecConfig(ref);
|
|
185
184
|
const { setContent, isTooSmall, fontSize } = useMinimalSizeValidation(minimalWidth, minimalHeight, loading);
|
|
186
185
|
const isExportSlidesMode = useDashboardSelector(selectIsInExportMode);
|
|
187
186
|
const shouldLoadingBeHidden = isExportSlidesMode && !loading;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrillDialogExportDropdown.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogExportDropdown.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AAoC3F,wBAAgB,yBAAyB,CAAC,EACtC,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,kBAAkB,EACrB,EAAE,+BAA+B,
|
|
1
|
+
{"version":3,"file":"DrillDialogExportDropdown.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogExportDropdown.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AAoC3F,wBAAgB,yBAAyB,CAAC,EACtC,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,kBAAkB,EACrB,EAAE,+BAA+B,2CA+EjC"}
|
|
@@ -52,7 +52,7 @@ export function DrillDialogExportDropdown({ exportAvailable, exportXLSXEnabled,
|
|
|
52
52
|
item.data.action();
|
|
53
53
|
}, []);
|
|
54
54
|
const itemDataTestId = useCallback((item) => (item.type === "interactive" ? item.data.dataTestId : undefined), []);
|
|
55
|
-
return (_jsx("div", { className: classNames, children: _jsx(Dropdown, { autofocusOnOpen: true, alignPoints: dropdownAlignPoints, renderBody: ({ closeDropdown, ariaAttributes }) => (_jsx("div", { className: "gd-drill-dialog-export", children: _jsx(UiMenu, { onClose: closeDropdown, ariaAttributes: ariaAttributes, onSelect: handleSelectItem, items: items, dataTestId: "s-drill-modal-export-options", itemDataTestId: itemDataTestId, InteractiveItem: DrillModalExportMenuItem }) })), renderButton: (buttonRenderProps) => {
|
|
55
|
+
return (_jsx("div", { className: classNames, children: _jsx(Dropdown, { autofocusOnOpen: true, shouldTrapFocus: false, alignPoints: dropdownAlignPoints, renderBody: ({ closeDropdown, ariaAttributes }) => (_jsx("div", { className: "gd-drill-dialog-export", children: _jsx(UiMenu, { onClose: closeDropdown, ariaAttributes: ariaAttributes, onSelect: handleSelectItem, items: items, dataTestId: "s-drill-modal-export-options", itemDataTestId: itemDataTestId, InteractiveItem: DrillModalExportMenuItem }) })), renderButton: (buttonRenderProps) => {
|
|
56
56
|
return isDropdownDisabled ? (_jsx("div", { className: classNames, children: _jsxs(BubbleHoverTrigger, { children: [
|
|
57
57
|
_jsx(DropdownTriggerButton, { ...buttonRenderProps, isDisabled: true }), _jsx(Bubble, { className: "bubble-primary", alignPoints: dropdownDisabledBubbleAlignPoints, children: _jsx(FormattedMessage, { id: "export_unsupported.disabled" }) })
|
|
58
58
|
] }) })) : (_jsx(DropdownTriggerButton, { ...buttonRenderProps }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrillDialogInsight.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,YAAY,EAMpB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DrillDialogInsight.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,YAAY,EAMpB,MAAM,OAAO,CAAC;AAmCf,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAwC7D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAC/B,OAAO,EACP,MAAM,EACN,OAAO,EACP,SAAS,EACT,SAAS,EACT,OAAO,EACP,OAAO,EAAE,SAAS,EAClB,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,QAAQ,EACR,cAAc,EACd,gBAAgB,EACnB,EAAE,sBAAsB,GAAG,YAAY,CAyJvC"}
|
|
@@ -8,7 +8,7 @@ import { useDashboardSelector } from "../../../../../model/react/DashboardStoreP
|
|
|
8
8
|
import { useWidgetExecConfig } from "../../../../../model/react/useWidgetExecConfig.js";
|
|
9
9
|
import { useWidgetFilters } from "../../../../../model/react/useWidgetFilters.js";
|
|
10
10
|
import { selectCatalogAttributes } from "../../../../../model/store/catalog/catalogSelectors.js";
|
|
11
|
-
import { selectAgGridToken, selectColorPalette, selectIsExport, selectLocale, selectMapboxToken, selectSeparators, selectSettings, } from "../../../../../model/store/config/configSelectors.js";
|
|
11
|
+
import { selectAgGridToken, selectColorPalette, selectIsExport, selectLocale, selectMapboxToken, selectMaxZoomLevel, selectSeparators, selectSettings, } from "../../../../../model/store/config/configSelectors.js";
|
|
12
12
|
import { selectDrillableItems } from "../../../../../model/store/drill/drillSelectors.js";
|
|
13
13
|
import { selectPermissions } from "../../../../../model/store/permissions/permissionsSelectors.js";
|
|
14
14
|
import { selectPreloadedAttributesWithReferences } from "../../../../../model/store/tabs/filterContext/filterContextSelectors.js";
|
|
@@ -28,9 +28,18 @@ const selectCommonDashboardInsightProps = createSelector([selectLocale, selectSe
|
|
|
28
28
|
settings,
|
|
29
29
|
colorPalette,
|
|
30
30
|
}));
|
|
31
|
-
const selectChartConfig = createSelector([
|
|
31
|
+
const selectChartConfig = createSelector([
|
|
32
|
+
selectMapboxToken,
|
|
33
|
+
selectAgGridToken,
|
|
34
|
+
selectMaxZoomLevel,
|
|
35
|
+
selectSeparators,
|
|
36
|
+
selectDrillableItems,
|
|
37
|
+
selectIsExport,
|
|
38
|
+
], (mapboxToken, agGridToken, maxZoomLevel, separators, drillableItems, isExport) => ({
|
|
32
39
|
mapboxToken,
|
|
33
40
|
agGridToken,
|
|
41
|
+
// Explicit undefined check — null is a meaningful value that clears the zoom limit
|
|
42
|
+
...(typeof maxZoomLevel === "undefined" ? {} : { maxZoomLevel }),
|
|
34
43
|
separators,
|
|
35
44
|
forceDisableDrillOnAxes: !drillableItems.length, // to keep in line with KD, enable axes drilling only if using explicit drills
|
|
36
45
|
isExportMode: isExport,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCreateAlert.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useCreateAlert.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EAC3C,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACH,KAAK,uBAAuB,EAE/B,MAAM,gEAAgE,CAAC;AAExE,eAAO,MAAM,cAAc;;;;;;;CAsC1B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInsightWidgetAlerting.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useInsightWidgetAlerting.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EAExC,KAAK,cAAc,EACtB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"useInsightWidgetAlerting.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useInsightWidgetAlerting.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EAExC,KAAK,cAAc,EACtB,MAAM,qBAAqB,CAAC;AAyD7B,KAAK,6BAA6B,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,2BAA2B;IACxC,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IACpC,sBAAsB,EAAE,MAAM,IAAI,CAAC;CACtC;AAED,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwUpC,CAAC"}
|
|
@@ -21,12 +21,12 @@ import { selectNotificationChannels } from "../../../../../../model/store/notifi
|
|
|
21
21
|
import { selectCanCreateAutomation, selectCanManageWorkspace, } from "../../../../../../model/store/permissions/permissionsSelectors.js";
|
|
22
22
|
import { selectExecutionTimestamp } from "../../../../../../model/store/ui/uiSelectors.js";
|
|
23
23
|
import { selectCurrentUser } from "../../../../../../model/store/user/userSelectors.js";
|
|
24
|
-
import { useSaveAlertToBackend } from "../../../../../automations/_staging/alerting/DefaultAlertingDialog/hooks/useSaveAlertToBackend.js";
|
|
25
24
|
import { messages } from "../../../../../automations/_staging/alerting/DefaultAlertingDialog/messages.js";
|
|
26
25
|
import { createDefaultAlert } from "../../../../../automations/_staging/alerting/DefaultAlertingDialog/utils/convertors.js";
|
|
27
26
|
import { getMeasureFormatsFromExecution } from "../../../../../automations/_staging/alerting/DefaultAlertingDialog/utils/getters.js";
|
|
28
27
|
import { getSupportedInsightAttributesByInsight, getSupportedInsightMeasuresByInsight, } from "../../../../../automations/_staging/alerting/DefaultAlertingDialog/utils/items.js";
|
|
29
|
-
import {
|
|
28
|
+
import { useSaveAlertToBackend } from "./useSaveAlertToBackend.js";
|
|
29
|
+
import { useWidgetAutomationFilters } from "./useWidgetAutomationFilters.js";
|
|
30
30
|
export const useInsightWidgetAlerting = ({ widget, closeInsightWidgetMenu }) => {
|
|
31
31
|
const { addSuccess, addError } = useToastMessage();
|
|
32
32
|
const { automationInteraction } = useDashboardUserInteraction();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSaveAlertToBackend.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useSaveAlertToBackend.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EAG3C,MAAM,qBAAqB,CAAC;AAK7B;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,EAClC,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,EACf,aAAa,EAChB,EAAE;IACC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC7D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACvC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC7D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACtC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC7D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC1C;;;;;;EA0DA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpdateAlert.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useUpdateAlert.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAIrE,OAAO,EACH,KAAK,uBAAuB,EAE/B,MAAM,gEAAgE,CAAC;AAExE,eAAO,MAAM,cAAc;;;;;;;CAsC1B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type IFilter, type IInsightDefinition } from "@gooddata/sdk-model";
|
|
2
|
+
import { type FilterableDashboardWidget } from "../../../../../../model/types/layoutTypes.js";
|
|
3
|
+
export declare function useWidgetAutomationFilters(widget?: FilterableDashboardWidget, insight?: IInsightDefinition): import("../../../../../../index.js").QueryProcessingState<IFilter[]>;
|
|
4
|
+
//# sourceMappingURL=useWidgetAutomationFilters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWidgetAutomationFilters.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/widget/insight/configuration/InsightAlertConfig/hooks/useWidgetAutomationFilters.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,OAAO,EACZ,KAAK,kBAAkB,EAK1B,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,8CAA8C,CAAC;AAE9F,wBAAgB,0BAA0B,CAAC,MAAM,CAAC,EAAE,yBAAyB,EAAE,OAAO,CAAC,EAAE,kBAAkB,wEAmB1G"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { filterIsEmpty, filterLocalIdentifier, isAttributeFilter, isNoopAllTimeDateFilter, } from "@gooddata/sdk-model";
|
|
4
|
+
import { useDashboardSelector } from "../../../../../../model/react/DashboardStoreProvider.js";
|
|
5
|
+
import { useWidgetFilters } from "../../../../../../model/react/useWidgetFilters.js";
|
|
6
|
+
import { selectCrossFilteringItems } from "../../../../../../model/store/drill/drillSelectors.js";
|
|
7
|
+
export function useWidgetAutomationFilters(widget, insight) {
|
|
8
|
+
const widgetFiltersQuery = useWidgetFilters(widget, insight);
|
|
9
|
+
const crossFilteringItems = useDashboardSelector(selectCrossFilteringItems);
|
|
10
|
+
return useMemo(() => {
|
|
11
|
+
const { result: widgetFilters, status: widgetFiltersStatus } = widgetFiltersQuery;
|
|
12
|
+
const sanitizedWidgetFilters = widgetFilters
|
|
13
|
+
? sanitizeWidgetFilters(widgetFilters, crossFilteringItems)
|
|
14
|
+
: undefined;
|
|
15
|
+
if (widgetFiltersStatus === "success" && sanitizedWidgetFilters) {
|
|
16
|
+
return {
|
|
17
|
+
...widgetFiltersQuery,
|
|
18
|
+
result: sanitizedWidgetFilters,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return widgetFiltersQuery;
|
|
22
|
+
}, [crossFilteringItems, widgetFiltersQuery]);
|
|
23
|
+
}
|
|
24
|
+
function sanitizeWidgetFilters(filters, crossFilteringItems) {
|
|
25
|
+
const withoutCrossFiltering = removeCrossFilteringFilters(filters, crossFilteringItems);
|
|
26
|
+
const withoutAllTimeDateFilters = removeAllTimeDateFilters(withoutCrossFiltering);
|
|
27
|
+
return removeEmptyAttributeFilters(withoutAllTimeDateFilters);
|
|
28
|
+
}
|
|
29
|
+
function removeCrossFilteringFilters(filters, crossFilteringItems) {
|
|
30
|
+
const crossFilteringFilterLocalIdentifiers = new Set(crossFilteringItems.flatMap((c) => c.filterLocalIdentifiers));
|
|
31
|
+
return filters.filter((filter) => {
|
|
32
|
+
const filterLocalId = filterLocalIdentifier(filter);
|
|
33
|
+
return filterLocalId ? !crossFilteringFilterLocalIdentifiers.has(filterLocalId) : true;
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function removeEmptyAttributeFilters(filters) {
|
|
37
|
+
return filters.filter((filter) => {
|
|
38
|
+
if (isAttributeFilter(filter)) {
|
|
39
|
+
return !filterIsEmpty(filter);
|
|
40
|
+
}
|
|
41
|
+
return true;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function removeAllTimeDateFilters(filters) {
|
|
45
|
+
return filters.filter((filter) => !isNoopAllTimeDateFilter(filter));
|
|
46
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InsightAlertsNew.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/widget/insight/configuration/InsightAlertsNew.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InsightAlertsNew.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/widget/insight/configuration/InsightAlertsNew.tsx"],"names":[],"mappings":"AAkDA,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,4BAA4B,CAAC;AAQpF,wBAAgB,gBAAgB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,iCAAiC,2CAyKhG"}
|
|
@@ -19,11 +19,11 @@ import { selectCanCreateAutomation, selectCanManageWorkspace, } from "../../../.
|
|
|
19
19
|
import { selectExecutionTimestamp } from "../../../../model/store/ui/uiSelectors.js";
|
|
20
20
|
import { selectCurrentUser } from "../../../../model/store/user/userSelectors.js";
|
|
21
21
|
import { AlertDeleteDialog } from "../../../automations/_staging/alerting/DefaultAlertingDialog/components/AlertDeleteDialog.js";
|
|
22
|
-
import { useSaveAlertToBackend } from "../../../automations/_staging/alerting/DefaultAlertingDialog/hooks/useSaveAlertToBackend.js";
|
|
23
22
|
import { messages } from "../../../automations/_staging/alerting/DefaultAlertingDialog/messages.js";
|
|
24
23
|
import { getSupportedInsightMeasuresByInsight } from "../../../automations/_staging/alerting/DefaultAlertingDialog/utils/items.js";
|
|
25
24
|
import { DASHBOARD_HEADER_OVERLAYS_Z_INDEX } from "../../../constants/zIndex.js";
|
|
26
25
|
import { AlertsList } from "./InsightAlertConfig/AlertsList.js";
|
|
26
|
+
import { useSaveAlertToBackend } from "./InsightAlertConfig/hooks/useSaveAlertToBackend.js";
|
|
27
27
|
import { NoAvailableMeasures } from "./InsightAlertConfig/NoAvailableAlerts.js";
|
|
28
28
|
const overlayController = OverlayController.getInstance(DASHBOARD_HEADER_OVERLAYS_Z_INDEX);
|
|
29
29
|
export function InsightAlertsNew({ widget, onClose, onGoBack }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardInsightMenuItemButton.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/DashboardInsightMenuItemButton.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,eAAO,MAAM,8BAA8B;;
|
|
1
|
+
{"version":3,"file":"DashboardInsightMenuItemButton.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/DashboardInsightMenuItemButton.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,eAAO,MAAM,8BAA8B;;6CAiC1C,CAAC"}
|
|
@@ -2,9 +2,9 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import cx from "classnames";
|
|
3
3
|
import { Item, UiTooltip } from "@gooddata/sdk-ui-kit";
|
|
4
4
|
export const DashboardInsightMenuItemButton = (props) => {
|
|
5
|
-
const { itemName, disabled, icon, onClick, tooltip, isFocused, className, submenu = false } = props;
|
|
5
|
+
const { itemName, itemId, disabled, icon, onClick, tooltip, isFocused, className, submenu = false, } = props;
|
|
6
6
|
// for JSX icons we need an extra gd-icon-wrapper class to align the icon and the text vertically
|
|
7
|
-
return renderButtonWithTooltip(_jsx(Item, { className: className, onClick: disabled ? undefined : onClick, disabled: disabled, subMenu: submenu, children: _jsxs("span", { className: cx({ "gd-icon-wrapper": icon && typeof icon !== "string" }), children: [icon ? typeof icon === "string" ? _jsx("i", { "aria-hidden": true, className: icon }) : icon : null, itemName] }) }), disabled, tooltip, isFocused);
|
|
7
|
+
return renderButtonWithTooltip(_jsx(Item, { className: className, testId: itemId, onClick: disabled ? undefined : onClick, disabled: disabled, subMenu: submenu, children: _jsxs("span", { className: cx({ "gd-icon-wrapper": icon && typeof icon !== "string" }), children: [icon ? typeof icon === "string" ? _jsx("i", { "aria-hidden": true, className: icon }) : icon : null, itemName] }) }), disabled, tooltip, isFocused);
|
|
8
8
|
};
|
|
9
9
|
function renderButtonWithTooltip(button, disabled, tooltip, isFocused) {
|
|
10
10
|
if (tooltip && disabled) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InsightWidgetWarningPartialResult.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/widget/widget/warningPartialResult/InsightWidgetWarningPartialResult.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAItE,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,mDAAmD,CAAC;AAElG,UAAU,uCAAuC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,0BAA0B,EAAE,CAAC;IAC1C,eAAe,EAAE,wBAAwB,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,wBAAgB,iCAAiC,CAAC,EAC9C,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,UAAkB,EAClB,cAAc,EACjB,EAAE,uCAAuC,
|
|
1
|
+
{"version":3,"file":"InsightWidgetWarningPartialResult.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/widget/widget/warningPartialResult/InsightWidgetWarningPartialResult.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAItE,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,mDAAmD,CAAC;AAElG,UAAU,uCAAuC;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,0BAA0B,EAAE,CAAC;IAC1C,eAAe,EAAE,wBAAwB,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,wBAAgB,iCAAiC,CAAC,EAC9C,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,UAAkB,EAClB,cAAc,EACjB,EAAE,uCAAuC,2CAyDzC"}
|
package/esm/presentation/widget/widget/warningPartialResult/InsightWidgetWarningPartialResult.js
CHANGED
|
@@ -19,5 +19,5 @@ export function InsightWidgetWarningPartialResult({ className, limitBreaks, isLo
|
|
|
19
19
|
event.preventDefault();
|
|
20
20
|
onExportRawCSV?.();
|
|
21
21
|
};
|
|
22
|
-
return (_jsx(_Fragment, { children: isOpen && isLoading === false ? (_jsx(DialogBase, { className: className, onMouseUp: noop, submitOnEnterKey: false, isModal: false, autofocusOnOpen: false, children: _jsx(WidgetNotice, { type: "warning", message: _jsx(FormattedMessage, { id: "partial_data_warning.title" }), detail: _jsx(FormattedMessage, { ...detailMessage }), detailAction: isExportRawVisible && !isEditMode ? (_jsx(UiLink, { isDisabled: isExporting, variant: "primary", href: "#", onClick: exportFullResult, children: _jsx(FormattedMessage, { id: "partial_data_warning.export_raw" }) })) : undefined, expandLabel: _jsx(FormattedMessage, { id: "partial_data_warning.show_details" }), collapseLabel: _jsx(FormattedMessage, { id: "partial_data_warning.hide_details" }), onClose: handleCloseOverlay, closeButtonLabel: intl.formatMessage(defineMessage({ id: "partial_data_warning.close" })) }) })) : null }));
|
|
22
|
+
return (_jsx(_Fragment, { children: isOpen && isLoading === false ? (_jsx(DialogBase, { className: className, onMouseUp: noop, submitOnEnterKey: false, isModal: false, autofocusOnOpen: false, children: _jsx(WidgetNotice, { dataTestId: "partial-data-warning", type: "warning", message: _jsx(FormattedMessage, { id: "partial_data_warning.title" }), detail: _jsx(FormattedMessage, { ...detailMessage }), detailAction: isExportRawVisible && !isEditMode ? (_jsx(UiLink, { isDisabled: isExporting, variant: "primary", href: "#", onClick: exportFullResult, children: _jsx(FormattedMessage, { id: "partial_data_warning.export_raw" }) })) : undefined, expandLabel: _jsx(FormattedMessage, { id: "partial_data_warning.show_details" }), collapseLabel: _jsx(FormattedMessage, { id: "partial_data_warning.hide_details" }), onClose: handleCloseOverlay, closeButtonLabel: intl.formatMessage(defineMessage({ id: "partial_data_warning.close" })) }) })) : null }));
|
|
23
23
|
}
|
|
@@ -5826,7 +5826,7 @@ export declare interface IAttributesDropdownProps extends IDashboardAttributeFil
|
|
|
5826
5826
|
}
|
|
5827
5827
|
|
|
5828
5828
|
/**
|
|
5829
|
-
* Automation filters grouped by tab.
|
|
5829
|
+
* Automation filters grouped by tab, returned by {@link selectAutomationFiltersByTab}.
|
|
5830
5830
|
* @alpha
|
|
5831
5831
|
*/
|
|
5832
5832
|
export declare interface IAutomationFiltersTab {
|
|
@@ -5843,7 +5843,8 @@ export declare interface IAutomationFiltersTab {
|
|
|
5843
5843
|
*/
|
|
5844
5844
|
availableFilters: FilterContextItem[];
|
|
5845
5845
|
/**
|
|
5846
|
-
* Default selected filters for the tab
|
|
5846
|
+
* Default selected filters for the tab
|
|
5847
|
+
* (no-op filters removed: "all values" attribute filters and "all" measure value filters).
|
|
5847
5848
|
*/
|
|
5848
5849
|
defaultSelectedFilters: FilterContextItem[];
|
|
5849
5850
|
/**
|
|
@@ -24656,6 +24657,14 @@ export declare const selectFiltersWithInvalidSelection: DashboardSelector<string
|
|
|
24656
24657
|
*/
|
|
24657
24658
|
export declare const selectFilterValidationIncompatibleDefaultFiltersOverride: DashboardSelector<boolean>;
|
|
24658
24659
|
|
|
24660
|
+
/**
|
|
24661
|
+
* Returns the active tab's parameters in the shape persisted by a filter view.
|
|
24662
|
+
* Runtime overrides become persisted `value`; existing parameter values are kept when no runtime value exists.
|
|
24663
|
+
*
|
|
24664
|
+
* @internal
|
|
24665
|
+
*/
|
|
24666
|
+
export declare const selectFilterViewParameters: DashboardSelector<IDashboardParameter[] | undefined>;
|
|
24667
|
+
|
|
24659
24668
|
/**
|
|
24660
24669
|
* @alpha
|
|
24661
24670
|
*/
|
package/esm/tsdoc-metadata.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddata/sdk-ui-dashboard",
|
|
3
|
-
"version": "11.43.0-alpha.
|
|
3
|
+
"version": "11.43.0-alpha.2",
|
|
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.1",
|
|
63
|
-
"@gooddata/sdk-backend-base": "11.43.0-alpha.
|
|
64
|
-
"@gooddata/sdk-backend-spi": "11.43.0-alpha.
|
|
65
|
-
"@gooddata/sdk-model": "11.43.0-alpha.
|
|
66
|
-
"@gooddata/sdk-ui": "11.43.0-alpha.
|
|
67
|
-
"@gooddata/sdk-ui-charts": "11.43.0-alpha.
|
|
68
|
-
"@gooddata/sdk-ui-ext": "11.43.0-alpha.
|
|
69
|
-
"@gooddata/sdk-ui-filters": "11.43.0-alpha.
|
|
70
|
-
"@gooddata/sdk-ui-
|
|
71
|
-
"@gooddata/sdk-ui-
|
|
72
|
-
"@gooddata/sdk-ui-
|
|
73
|
-
"@gooddata/sdk-ui-vis-commons": "11.43.0-alpha.
|
|
74
|
-
"@gooddata/
|
|
75
|
-
"@gooddata/
|
|
63
|
+
"@gooddata/sdk-backend-base": "11.43.0-alpha.2",
|
|
64
|
+
"@gooddata/sdk-backend-spi": "11.43.0-alpha.2",
|
|
65
|
+
"@gooddata/sdk-model": "11.43.0-alpha.2",
|
|
66
|
+
"@gooddata/sdk-ui": "11.43.0-alpha.2",
|
|
67
|
+
"@gooddata/sdk-ui-charts": "11.43.0-alpha.2",
|
|
68
|
+
"@gooddata/sdk-ui-ext": "11.43.0-alpha.2",
|
|
69
|
+
"@gooddata/sdk-ui-filters": "11.43.0-alpha.2",
|
|
70
|
+
"@gooddata/sdk-ui-kit": "11.43.0-alpha.2",
|
|
71
|
+
"@gooddata/sdk-ui-pivot": "11.43.0-alpha.2",
|
|
72
|
+
"@gooddata/sdk-ui-theme-provider": "11.43.0-alpha.2",
|
|
73
|
+
"@gooddata/sdk-ui-vis-commons": "11.43.0-alpha.2",
|
|
74
|
+
"@gooddata/sdk-ui-geo": "11.43.0-alpha.2",
|
|
75
|
+
"@gooddata/util": "11.43.0-alpha.2"
|
|
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.8",
|
|
120
120
|
"vitest-dom": "0.1.1",
|
|
121
|
-
"@gooddata/eslint-config": "11.43.0-alpha.
|
|
122
|
-
"@gooddata/
|
|
123
|
-
"@gooddata/
|
|
124
|
-
"@gooddata/
|
|
125
|
-
"@gooddata/
|
|
126
|
-
"@gooddata/
|
|
121
|
+
"@gooddata/eslint-config": "11.43.0-alpha.2",
|
|
122
|
+
"@gooddata/i18n-toolkit": "11.43.0-alpha.2",
|
|
123
|
+
"@gooddata/oxlint-config": "11.43.0-alpha.2",
|
|
124
|
+
"@gooddata/sdk-backend-mockingbird": "11.43.0-alpha.2",
|
|
125
|
+
"@gooddata/stylelint-config": "11.43.0-alpha.2",
|
|
126
|
+
"@gooddata/reference-workspace": "11.43.0-alpha.2"
|
|
127
127
|
},
|
|
128
128
|
"peerDependencies": {
|
|
129
129
|
"react": "^18.0.0 || ^19.0.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useCreateAlert.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/_staging/alerting/DefaultAlertingDialog/hooks/useCreateAlert.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EAC3C,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACH,KAAK,uBAAuB,EAE/B,MAAM,gEAAgE,CAAC;AAExE,eAAO,MAAM,cAAc;;;;;;;CAsC1B,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useSaveAlertToBackend.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/_staging/alerting/DefaultAlertingDialog/hooks/useSaveAlertToBackend.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,KAAK,yBAAyB,EAC9B,KAAK,mCAAmC,EAG3C,MAAM,qBAAqB,CAAC;AAK7B;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,EAClC,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,EACf,aAAa,EAChB,EAAE;IACC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC7D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACvC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC7D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACvC,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACtC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAC;IAC7D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC1C;;;;;;EA0DA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useUpdateAlert.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/automations/_staging/alerting/DefaultAlertingDialog/hooks/useUpdateAlert.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAIrE,OAAO,EACH,KAAK,uBAAuB,EAE/B,MAAM,gEAAgE,CAAC;AAExE,eAAO,MAAM,cAAc;;;;;;;CAsC1B,CAAC"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|