@gooddata/sdk-ui-dashboard 11.65.0-alpha.0 → 11.65.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/esm/__version.d.ts +1 -1
  2. package/esm/__version.js +1 -1
  3. package/esm/model/queryServices/queryAttributeElements.js +1 -0
  4. package/esm/model/types/attributeFilterTypes.d.ts +5 -0
  5. package/esm/model/types/attributeFilterTypes.d.ts.map +1 -1
  6. package/esm/model/types/attributeFilterTypes.js +1 -1
  7. package/esm/presentation/automations/alerting/hooks/useAttributeValuesFromExecResults.d.ts +33 -2
  8. package/esm/presentation/automations/alerting/hooks/useAttributeValuesFromExecResults.d.ts.map +1 -1
  9. package/esm/presentation/automations/alerting/hooks/useAttributeValuesFromExecResults.js +29 -13
  10. package/esm/presentation/automations/alerting/state/useAlertSupportedMetrics.d.ts.map +1 -1
  11. package/esm/presentation/automations/alerting/state/useAlertSupportedMetrics.js +3 -2
  12. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/DashboardAttachments.d.ts.map +1 -1
  13. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/DashboardAttachments.js +3 -3
  14. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/WidgetAttachments.d.ts.map +1 -1
  15. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/Attachments/WidgetAttachments.js +5 -4
  16. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/LiveRegionLastSelectContainer.d.ts +9 -0
  17. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/LiveRegionLastSelectContainer.d.ts.map +1 -0
  18. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/LiveRegionLastSelectContainer.js +12 -0
  19. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelect.d.ts.map +1 -1
  20. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelect.js +3 -3
  21. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.d.ts.map +1 -1
  22. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.js +14 -7
  23. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectionDescription.d.ts +12 -0
  24. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectionDescription.d.ts.map +1 -0
  25. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectionDescription.js +30 -0
  26. package/esm/presentation/automations/scheduledEmail/utils/users.d.ts +1 -0
  27. package/esm/presentation/automations/scheduledEmail/utils/users.d.ts.map +1 -1
  28. package/esm/presentation/automations/scheduledEmail/utils/users.js +3 -0
  29. package/esm/presentation/dashboard/components/DashboardScreenSizeContext.d.ts.map +1 -1
  30. package/esm/presentation/dashboard/components/DashboardScreenSizeContext.js +10 -7
  31. package/esm/presentation/dashboard/components/ToastMessages.d.ts.map +1 -1
  32. package/esm/presentation/dashboard/components/ToastMessages.js +6 -3
  33. package/esm/presentation/dashboard/components/useEditModeLayoutNoteMessages.d.ts +6 -0
  34. package/esm/presentation/dashboard/components/useEditModeLayoutNoteMessages.d.ts.map +1 -0
  35. package/esm/presentation/dashboard/components/useEditModeLayoutNoteMessages.js +48 -0
  36. package/esm/presentation/drill/utils/drillDownUtils.d.ts.map +1 -1
  37. package/esm/presentation/drill/utils/drillDownUtils.js +3 -2
  38. package/esm/presentation/export/hooks/useDashboardRelatedFilters.d.ts +8 -1
  39. package/esm/presentation/export/hooks/useDashboardRelatedFilters.d.ts.map +1 -1
  40. package/esm/presentation/export/hooks/useDashboardRelatedFilters.js +21 -5
  41. package/esm/presentation/filterBar/attributeFilter/DefaultDashboardAttributeFilter.d.ts.map +1 -1
  42. package/esm/presentation/filterBar/attributeFilter/DefaultDashboardAttributeFilter.js +3 -2
  43. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.d.ts.map +1 -1
  44. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.js +4 -1
  45. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts +6 -2
  46. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts.map +1 -1
  47. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.js +8 -4
  48. package/esm/presentation/filterBar/filterBar/filterViews/FilterViewDeleteConfirm.d.ts +2 -1
  49. package/esm/presentation/filterBar/filterBar/filterViews/FilterViewDeleteConfirm.d.ts.map +1 -1
  50. package/esm/presentation/filterBar/filterBar/filterViews/FilterViewDeleteConfirm.js +2 -2
  51. package/esm/presentation/filterBar/filterBar/filterViews/FilterViewsList.d.ts.map +1 -1
  52. package/esm/presentation/filterBar/filterBar/filterViews/FilterViewsList.js +11 -5
  53. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +24 -0
  54. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  55. package/esm/presentation/localization/bundles/en-US.localization-bundle.js +24 -0
  56. package/esm/presentation/topBar/buttonBar/button/editButton/DefaultEditButton.d.ts.map +1 -1
  57. package/esm/presentation/topBar/buttonBar/button/editButton/DefaultEditButton.js +2 -4
  58. package/esm/sdk-ui-dashboard.d.ts +5 -0
  59. package/package.json +21 -21
  60. package/styles/css/dashboard.css +9 -0
  61. package/styles/css/dashboard.css.map +1 -1
  62. package/styles/css/main.css +9 -0
  63. package/styles/css/main.css.map +1 -1
  64. package/styles/scss/dashboard.scss +11 -0
@@ -0,0 +1,6 @@
1
+ import { type IMessage } from "@gooddata/sdk-ui-kit";
2
+ export declare function useEditModeLayoutNoteMessages(): {
3
+ messages: IMessage[];
4
+ removeMessage: (id: string) => void;
5
+ };
6
+ //# sourceMappingURL=useEditModeLayoutNoteMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEditModeLayoutNoteMessages.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/components/useEditModeLayoutNoteMessages.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,QAAQ,EAAiB,MAAM,sBAAsB,CAAC;AAkBpE,wBAAgB,6BAA6B;;wBA0BhC,MAAM;EAalB"}
@@ -0,0 +1,48 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // (C) 2026 GoodData Corporation
3
+ import { useCallback, useMemo, useState } from "react";
4
+ import { defineMessages, useIntl } from "react-intl";
5
+ import { useMediaQuery } from "@gooddata/sdk-ui-kit";
6
+ import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
7
+ import { selectIsInEditMode } from "../../../model/store/renderMode/renderModeSelectors.js";
8
+ const localizationMessages = defineMessages({
9
+ editModeLayoutNote: { id: "messages.dashboard.editModeDesktopLayout.note" },
10
+ });
11
+ const replacements = {
12
+ b: (chunks) => _jsx("b", { children: chunks }),
13
+ };
14
+ const EDIT_MODE_LAYOUT_NOTE_MESSAGE_ID = "edit_mode_desktop_layout_note";
15
+ // Dismissal lasts until the page reloads and is deliberately never persisted.
16
+ let isDismissedInSession = false;
17
+ export function useEditModeLayoutNoteMessages() {
18
+ const intl = useIntl();
19
+ const isEditMode = useDashboardSelector(selectIsInEditMode);
20
+ const isNarrowerThanEditModeMinWidth = useMediaQuery("<=lg");
21
+ const [isDismissed, setIsDismissed] = useState(isDismissedInSession);
22
+ const isVisible = isEditMode && isNarrowerThanEditModeMinWidth && !isDismissed;
23
+ const messages = useMemo(() => {
24
+ if (!isVisible) {
25
+ return [];
26
+ }
27
+ return [
28
+ {
29
+ id: EDIT_MODE_LAYOUT_NOTE_MESSAGE_ID,
30
+ type: "progress",
31
+ node: intl.formatMessage(localizationMessages.editModeLayoutNote, replacements),
32
+ createdAt: new Date().getTime(),
33
+ duration: Infinity,
34
+ },
35
+ ];
36
+ }, [isVisible, intl]);
37
+ // The toasts interop also reports removals caused by the note no longer applying; only a visible note can be dismissed.
38
+ const removeMessage = useCallback((id) => {
39
+ if (id === EDIT_MODE_LAYOUT_NOTE_MESSAGE_ID && isVisible) {
40
+ isDismissedInSession = true;
41
+ setIsDismissed(true);
42
+ }
43
+ }, [isVisible]);
44
+ return {
45
+ messages,
46
+ removeMessage,
47
+ };
48
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"drillDownUtils.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/utils/drillDownUtils.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,mCAAmC,EACxC,KAAK,uCAAuC,EAG/C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,WAAW,EAAoC,MAAM,kBAAkB,CAAC;AAOtF,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAG7F;;GAEG;AACH,wBAAgB,iBAAiB,CAC7B,eAAe,EAAE,oBAAoB,EACrC,UAAU,EAAE,WAAW,EACvB,sCAAsC,CAAC,EAAE,uCAAuC,EAAE,EAClF,sBAAsB,CAAC,EAAE,mCAAmC,GAC7D,MAAM,GAAG,IAAI,CAoBf;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CAC/C,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,WAAW,GACxB,MAAM,GAAG,IAAI,CASf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,wBAAwB,EAAE,GAAG,MAAM,CAE3F;AAED;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAC9C,gBAAgB,EAAE,wBAAwB,EAAE,EAC5C,gBAAgB,GAAE,wBAAwB,EAAO,GAClD,wBAAwB,EAAE,CA0B5B"}
1
+ {"version":3,"file":"drillDownUtils.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/utils/drillDownUtils.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,mCAAmC,EACxC,KAAK,uCAAuC,EAG/C,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,WAAW,EAAoC,MAAM,kBAAkB,CAAC;AAOtF,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAG7F;;GAEG;AACH,wBAAgB,iBAAiB,CAC7B,eAAe,EAAE,oBAAoB,EACrC,UAAU,EAAE,WAAW,EACvB,sCAAsC,CAAC,EAAE,uCAAuC,EAAE,EAClF,sBAAsB,CAAC,EAAE,mCAAmC,GAC7D,MAAM,GAAG,IAAI,CAoBf;AAED;;GAEG;AACH,wBAAgB,mCAAmC,CAC/C,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,WAAW,GACxB,MAAM,GAAG,IAAI,CAaf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,eAAe,EAAE,wBAAwB,EAAE,GAAG,MAAM,CAE3F;AAED;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAC9C,gBAAgB,EAAE,wBAAwB,EAAE,EAC5C,gBAAgB,GAAE,wBAAwB,EAAO,GAClD,wBAAwB,EAAE,CA0B5B"}
@@ -1,4 +1,4 @@
1
- // (C) 2020-2025 GoodData Corporation
1
+ // (C) 2020-2026 GoodData Corporation
2
2
  import { compact, isEqual, uniqWith } from "lodash-es";
3
3
  import { isCrossFiltering, isDrillToLegacyDashboard, } from "@gooddata/sdk-model";
4
4
  import { isDrillIntersectionAttributeItem } from "@gooddata/sdk-ui";
@@ -28,7 +28,8 @@ export function getDrillOriginAttributeElementTitle(drillOriginLocalId, drillEve
28
28
  .map((intersectionElement) => intersectionElement.header)
29
29
  .filter(isDrillIntersectionAttributeItem)
30
30
  .filter((intersectionAttributeItem) => intersectionAttributeItem.attributeHeader.localIdentifier === drillOriginLocalId)
31
- .map((intersectionAttributeItem) => intersectionAttributeItem.attributeHeaderItem.name)[0];
31
+ .map((intersectionAttributeItem) => intersectionAttributeItem.attributeHeaderItem.formattedName ??
32
+ intersectionAttributeItem.attributeHeaderItem.name)[0];
32
33
  }
33
34
  /**
34
35
  * Get total number of IDrillToUrl
@@ -1,4 +1,4 @@
1
- import { type DashboardAttributeFilterConfigMode, type DashboardDateFilterConfigMode } from "@gooddata/sdk-model";
1
+ import { type DashboardAttributeFilterConfigMode, type DashboardDateFilterConfigMode, type IAttributeElement, type ISeparators } from "@gooddata/sdk-model";
2
2
  /**
3
3
  * @alpha
4
4
  */
@@ -19,4 +19,11 @@ export declare function useDashboardRelatedFilters(run: boolean): {
19
19
  isError: boolean;
20
20
  isSuccess: boolean;
21
21
  };
22
+ /**
23
+ * Titles to display for the elements: the raw titles, with the values of a numeric computed attribute
24
+ * formatted by the number format of the elements query result.
25
+ *
26
+ * @internal exported for tests
27
+ */
28
+ export declare function elementsDisplayTitles(elements: IAttributeElement[], numberFormat: string | undefined, separators: ISeparators | undefined): Array<string | null>;
22
29
  //# sourceMappingURL=useDashboardRelatedFilters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDashboardRelatedFilters.d.ts","sourceRoot":"","sources":["../../../../src/presentation/export/hooks/useDashboardRelatedFilters.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,KAAK,kCAAkC,EACvC,KAAK,6BAA6B,EAOrC,MAAM,qBAAqB,CAAC;AAW7B;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,IAAI,EAAE,iBAAiB,GAAG,YAAY,GAAG,oBAAoB,CAAC;IAC9D,GAAG,EAAE,OAAO,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,6BAA6B,GAAG,kCAAkC,CAAC;CAC5E,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG;IACtD,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;IAC3C,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;IAC9C,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACtB,CA2DA"}
1
+ {"version":3,"file":"useDashboardRelatedFilters.d.ts","sourceRoot":"","sources":["../../../../src/presentation/export/hooks/useDashboardRelatedFilters.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,KAAK,kCAAkC,EACvC,KAAK,6BAA6B,EAElC,KAAK,iBAAiB,EAEtB,KAAK,WAAW,EAInB,MAAM,qBAAqB,CAAC;AAkB7B;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,IAAI,EAAE,iBAAiB,GAAG,YAAY,GAAG,oBAAoB,CAAC;IAC9D,GAAG,EAAE,OAAO,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,6BAA6B,GAAG,kCAAkC,CAAC;CAC5E,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,OAAO,GAAG;IACtD,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;IAC3C,mBAAmB,EAAE,sBAAsB,EAAE,CAAC;IAC9C,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACtB,CA4DA;AA4CD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,UAAU,EAAE,WAAW,GAAG,SAAS,GACpC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAQtB"}
@@ -1,8 +1,9 @@
1
1
  // (C) 2022-2026 GoodData Corporation
2
2
  import { areObjRefsEqual, getAttributeElementsItems, isDashboardAttributeFilter, } from "@gooddata/sdk-model";
3
- import { useBackendStrict, useCancelablePromise, useWorkspaceStrict } from "@gooddata/sdk-ui";
3
+ import { createNumberFormatter, formatAttributeValue, useBackendStrict, useCancelablePromise, useWorkspaceStrict, } from "@gooddata/sdk-ui";
4
4
  import { useFiltersNamings } from "../../../_staging/sharedHooks/useFiltersNamings.js";
5
5
  import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
6
+ import { selectSeparators } from "../../../model/store/config/configSelectors.js";
6
7
  import { selectExecutableDashboardFilters } from "../../../model/store/filtering/dashboardFilterSelectors.js";
7
8
  import { selectAttributeFilterConfigsOverrides } from "../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
8
9
  import { selectDateFilterConfigOverrides } from "../../../model/store/tabs/dateFilterConfig/dateFilterConfigSelectors.js";
@@ -16,14 +17,15 @@ export function useDashboardRelatedFilters(run) {
16
17
  const dateFiltersConfig = useDashboardSelector(selectDateFilterConfigsOverrides);
17
18
  const attributeFiltersConfig = useDashboardSelector(selectAttributeFilterConfigsOverrides);
18
19
  const measureValueFiltersConfig = useDashboardSelector(selectMeasureValueFilterConfigsOverrides);
20
+ const separators = useDashboardSelector(selectSeparators);
19
21
  const { result, status } = useCancelablePromise({
20
22
  promise: async () => {
21
23
  if (!run) {
22
24
  return dashboardFilters;
23
25
  }
24
- return Promise.all(dashboardFilters.map((f) => updateLabelElements(backend, workspaceId, attributeFiltersConfig, f)));
26
+ return Promise.all(dashboardFilters.map((f) => updateLabelElements(backend, workspaceId, attributeFiltersConfig, separators, f)));
25
27
  },
26
- }, [run, dashboardFilters]);
28
+ }, [run, dashboardFilters, separators]);
27
29
  const filters = useFiltersNamings(result ?? []);
28
30
  const all = filters.filter((f) => f && !f.all).map((f) => {
29
31
  if (f?.common) {
@@ -58,7 +60,7 @@ export function useDashboardRelatedFilters(run) {
58
60
  measureValueFilters: all.filter((f) => f?.type === "measureValueFilter"),
59
61
  };
60
62
  }
61
- async function updateLabelElements(backend, workspaceId, attributeFiltersConfig, dashboardFilter) {
63
+ async function updateLabelElements(backend, workspaceId, attributeFiltersConfig, separators, dashboardFilter) {
62
64
  // Skip filters that are not attribute filters
63
65
  if (isDashboardAttributeFilter(dashboardFilter)) {
64
66
  const config = attributeFiltersConfig.find((c) => c.localIdentifier === dashboardFilter.attributeFilter.localIdentifier);
@@ -76,15 +78,29 @@ async function updateLabelElements(backend, workspaceId, attributeFiltersConfig,
76
78
  });
77
79
  const data = await query.query();
78
80
  const all = await data.all();
81
+ // the filter is only described to the user from here on, so it carries the titles to display
79
82
  return {
80
83
  ...dashboardFilter,
81
84
  attributeFilter: {
82
85
  ...dashboardFilter.attributeFilter,
83
86
  attributeElements: {
84
- values: all.map((a) => a.title),
87
+ values: elementsDisplayTitles(all, data.numberFormat, separators),
85
88
  },
86
89
  },
87
90
  };
88
91
  }
89
92
  return dashboardFilter;
90
93
  }
94
+ /**
95
+ * Titles to display for the elements: the raw titles, with the values of a numeric computed attribute
96
+ * formatted by the number format of the elements query result.
97
+ *
98
+ * @internal exported for tests
99
+ */
100
+ export function elementsDisplayTitles(elements, numberFormat, separators) {
101
+ if (!numberFormat) {
102
+ return elements.map((element) => element.title);
103
+ }
104
+ const formatter = createNumberFormatter(separators);
105
+ return elements.map((element) => formatAttributeValue(element.title, numberFormat, formatter));
106
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultDashboardAttributeFilter.d.ts","sourceRoot":"","sources":["../../../../src/presentation/filterBar/attributeFilter/DefaultDashboardAttributeFilter.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAkD,MAAM,OAAO,CAAC;AAwE1F,OAAO,EAAE,KAAK,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAKjE;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,8BAA8B,GAAG,YAAY,GAAG,IAAI,CAa1G;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAC9C,KAAK,EAAE,8BAA8B,GACtC,YAAY,GAAG,IAAI,CAErB"}
1
+ {"version":3,"file":"DefaultDashboardAttributeFilter.d.ts","sourceRoot":"","sources":["../../../../src/presentation/filterBar/attributeFilter/DefaultDashboardAttributeFilter.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAkD,MAAM,OAAO,CAAC;AAyE1F,OAAO,EAAE,KAAK,8BAA8B,EAAE,MAAM,YAAY,CAAC;AAKjE;;;;;;GAMG;AACH,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,8BAA8B,GAAG,YAAY,GAAG,IAAI,CAa1G;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAC9C,KAAK,EAAE,8BAA8B,GACtC,YAAY,GAAG,IAAI,CAErB"}
@@ -9,7 +9,7 @@ import { useAttributes } from "../../../_staging/sharedHooks/useAttributes.js";
9
9
  import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
10
10
  import { useDashboardUserInteraction } from "../../../model/react/useDashboardUserInteraction.js";
11
11
  import { selectBackendCapabilities } from "../../../model/store/backendCapabilities/backendCapabilitiesSelectors.js";
12
- import { selectAvailableAttributeFilterSelectionTypes, selectEnableImmediateAttributeFilterDisplayAsLabelMigration, selectIsApplyFiltersAllAtOnceEnabledAndSet, selectLocale, } from "../../../model/store/config/configSelectors.js";
12
+ import { selectAvailableAttributeFilterSelectionTypes, selectEnableImmediateAttributeFilterDisplayAsLabelMigration, selectIsApplyFiltersAllAtOnceEnabledAndSet, selectLocale, selectSeparators, } from "../../../model/store/config/configSelectors.js";
13
13
  import { selectIsFilterFromCrossFilteringByLocalIdentifier } from "../../../model/store/drill/drillSelectors.js";
14
14
  import { selectIsInEditMode } from "../../../model/store/renderMode/renderModeSelectors.js";
15
15
  import { selectAttributeFilterConfigsModeMap, selectAttributeFilterConfigsModeMapByTab, selectAttributeFilterConfigsSelectionTypeMap, selectAttributeFilterConfigsSelectionTypeMapByTab, } from "../../../model/store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
@@ -54,6 +54,7 @@ function DefaultDashboardAttributeFilterInner(props) {
54
54
  const locale = useDashboardSelector(selectLocale);
55
55
  const isEditMode = useDashboardSelector(selectIsInEditMode);
56
56
  const capabilities = useDashboardSelector(selectBackendCapabilities);
57
+ const separators = useDashboardSelector(selectSeparators);
57
58
  // Extract common properties using wide utilities; narrow props only for standard filters
58
59
  const filterLocalId = dashboardAttributeFilterItemLocalIdentifier(filter);
59
60
  const filterTitle = dashboardAttributeFilterItemTitle(filter);
@@ -325,7 +326,7 @@ function DefaultDashboardAttributeFilterInner(props) {
325
326
  isApplyAllAtOnceEnabledAndSet,
326
327
  ]);
327
328
  const AttributeFilterComponent = props.AttributeFilterComponent ?? AttributeFilterButton;
328
- const filterContent = (_jsx(AttributeFilterComponent, { title: filterTitle, resetOnParentFilterChange: false, filter: isApplyAllAtOnceEnabledAndSet ? workingAttributeFilter : attributeFilter, displayAsLabel: displayAsLabel, overlayPositionType: overlayPositionType, onApply: (newFilter, isInverted, selectionMode, selectionTitles, displayAsLabel, isResultOfMigration, additionalProps) => {
329
+ const filterContent = (_jsx(AttributeFilterComponent, { title: filterTitle, separators: separators, resetOnParentFilterChange: false, filter: isApplyAllAtOnceEnabledAndSet ? workingAttributeFilter : attributeFilter, displayAsLabel: displayAsLabel, overlayPositionType: overlayPositionType, onApply: (newFilter, isInverted, selectionMode, selectionTitles, displayAsLabel, isResultOfMigration, additionalProps) => {
329
330
  const isSelectionInvalid = additionalProps?.isSelectionInvalid ?? false;
330
331
  const applyToWorkingOnly = additionalProps?.applyToWorkingOnly ?? false;
331
332
  // Convert the SDK-level filter to a dashboard filter item.
@@ -1 +1 @@
1
- {"version":3,"file":"AttributeListItemTooltip.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,KAAK,iBAAiB,EAA0B,MAAM,qBAAqB,CAAC;AAgBrF,UAAU,8BAA8B;IACpC,IAAI,EAAE,iBAAiB,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,IAAI,EAAE,EAAE,8BAA8B,GAAG,SAAS,CAkD5F"}
1
+ {"version":3,"file":"AttributeListItemTooltip.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,KAAK,iBAAiB,EAA0B,MAAM,qBAAqB,CAAC;AAkBrF,UAAU,8BAA8B;IACpC,IAAI,EAAE,iBAAiB,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,IAAI,EAAE,EAAE,8BAA8B,GAAG,SAAS,CAoD5F"}
@@ -3,6 +3,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
4
  import { isComputedAttributeRef } from "@gooddata/sdk-model";
5
5
  import { Bubble, BubbleHoverTrigger } from "@gooddata/sdk-ui-kit";
6
+ import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
7
+ import { selectSeparators } from "../../../../../model/store/config/configSelectors.js";
6
8
  import { useAttributeDataSet } from "../../dashboardDropdownBody/configuration/hooks/useAttributeDataSet.js";
7
9
  import { useAttributeElements } from "../../dashboardDropdownBody/configuration/hooks/useAttributeElements.js";
8
10
  import { useComputedAttributeExpression } from "../../dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.js";
@@ -17,11 +19,12 @@ const bubbleAlignPoints = [
17
19
  */
18
20
  export function AttributeListItemTooltip({ item }) {
19
21
  const [isHover, setIsHover] = useState(false);
22
+ const separators = useDashboardSelector(selectSeparators);
20
23
  const { attributeElements, attributesElementsLoading } = useAttributeElements(item.defaultDisplayForm.ref, ATTR_ELEMENTS_LIMIT, isHover);
21
24
  // a computed attribute belongs to no dataset and additionally shows its MAQL definition,
22
25
  // after the values
23
26
  const isComputedAttribute = isComputedAttributeRef(item.attribute.ref);
24
27
  const { attributeDataSet, attributesDataSetLoading } = useAttributeDataSet(item.attribute.ref, isHover && !isComputedAttribute);
25
28
  const { expressionTokens, expressionTokensLoading } = useComputedAttributeExpression(item.attribute.ref, isHover && isComputedAttribute);
26
- return (_jsx("div", { children: _jsxs(BubbleHoverTrigger, { showDelay: 0, hideDelay: 0, eventsOnBubble: true, className: "gd-attribute-item-tooltip-icon", children: [_jsx("span", { onMouseEnter: () => setIsHover(true), className: "gd-icon-circle-question gd-list-item-tooltip-icon s-attribute-dropdown-list-item-tooltip" }), _jsx(Bubble, { className: "gd-attribute-dropdown-list-item-details s-attribute-filter-details-bubble", alignPoints: bubbleAlignPoints, arrowStyle: { display: "none" }, children: _jsx(AttributeListItemTooltipContent, { item: item, hideDataSet: isComputedAttribute, attributesDataSetLoading: attributesDataSetLoading, attributesElementsLoading: attributesElementsLoading, attributeDataSet: attributeDataSet, attributeElements: attributeElements, expressionTokens: isComputedAttribute ? expressionTokens : undefined, expressionTokensLoading: isComputedAttribute ? expressionTokensLoading : undefined }) })] }) }));
29
+ return (_jsx("div", { children: _jsxs(BubbleHoverTrigger, { showDelay: 0, hideDelay: 0, eventsOnBubble: true, className: "gd-attribute-item-tooltip-icon", children: [_jsx("span", { onMouseEnter: () => setIsHover(true), className: "gd-icon-circle-question gd-list-item-tooltip-icon s-attribute-dropdown-list-item-tooltip" }), _jsx(Bubble, { className: "gd-attribute-dropdown-list-item-details s-attribute-filter-details-bubble", alignPoints: bubbleAlignPoints, arrowStyle: { display: "none" }, children: _jsx(AttributeListItemTooltipContent, { item: item, hideDataSet: isComputedAttribute, attributesDataSetLoading: attributesDataSetLoading, attributesElementsLoading: attributesElementsLoading, attributeDataSet: attributeDataSet, attributeElements: attributeElements, separators: separators, expressionTokens: isComputedAttribute ? expressionTokens : undefined, expressionTokensLoading: isComputedAttribute ? expressionTokensLoading : undefined }) })] }) }));
27
30
  }
@@ -1,5 +1,5 @@
1
1
  import { type IMeasureExpressionToken } from "@gooddata/sdk-backend-spi";
2
- import { type ICatalogAttribute, type IDataSetMetadataObject } from "@gooddata/sdk-model";
2
+ import { type ICatalogAttribute, type IDataSetMetadataObject, type ISeparators } from "@gooddata/sdk-model";
3
3
  import type { IUseAttributeElements } from "../../../../../model/types/attributeFilterTypes.js";
4
4
  interface IAttributeListItemTooltipContentProps {
5
5
  item: ICatalogAttribute;
@@ -11,6 +11,10 @@ interface IAttributeListItemTooltipContentProps {
11
11
  attributesElementsLoading: boolean;
12
12
  attributeDataSet?: IDataSetMetadataObject;
13
13
  attributeElements?: IUseAttributeElements;
14
+ /**
15
+ * Separators to format the values of a numeric computed attribute with.
16
+ */
17
+ separators?: ISeparators;
14
18
  /**
15
19
  * Tokenized MAQL expression; provided only for computed attributes, rendered after the values
16
20
  * with the referenced objects resolved to their titles.
@@ -21,6 +25,6 @@ interface IAttributeListItemTooltipContentProps {
21
25
  /**
22
26
  * @internal
23
27
  */
24
- export declare function AttributeListItemTooltipContent({ item, hideDataSet, attributesDataSetLoading, attributesElementsLoading, attributeDataSet, attributeElements, expressionTokens, expressionTokensLoading, }: IAttributeListItemTooltipContentProps): import("react/jsx-runtime").JSX.Element;
28
+ export declare function AttributeListItemTooltipContent({ item, hideDataSet, attributesDataSetLoading, attributesElementsLoading, attributeDataSet, attributeElements, separators, expressionTokens, expressionTokensLoading, }: IAttributeListItemTooltipContentProps): import("react/jsx-runtime").JSX.Element;
25
29
  export {};
26
30
  //# sourceMappingURL=AttributeListItemTooltipContent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AttributeListItemTooltipContent.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE1F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AA4DhG,UAAU,qCAAqC;IAC3C,IAAI,EAAE,iBAAiB,CAAC;IACxB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wBAAwB,EAAE,OAAO,CAAC;IAClC,yBAAyB,EAAE,OAAO,CAAC;IACnC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;IAC1C;;;OAGG;IACH,gBAAgB,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC7C,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,EAC5C,IAAI,EACJ,WAAW,EACX,wBAAwB,EACxB,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,GAC1B,EAAE,qCAAqC,2CAiDvC"}
1
+ {"version":3,"file":"AttributeListItemTooltipContent.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oDAAoD,CAAC;AAqEhG,UAAU,qCAAqC;IAC3C,IAAI,EAAE,iBAAiB,CAAC;IACxB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wBAAwB,EAAE,OAAO,CAAC;IAClC,yBAAyB,EAAE,OAAO,CAAC;IACnC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAC1C,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;IAC1C;;OAEG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC7C,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,EAC5C,IAAI,EACJ,WAAW,EACX,wBAAwB,EACxB,yBAAyB,EACzB,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,uBAAuB,GAC1B,EAAE,qCAAqC,2CAmDvC"}
@@ -1,6 +1,7 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // (C) 2023-2026 GoodData Corporation
3
3
  import { FormattedMessage, useIntl } from "react-intl";
4
+ import { createNumberFormatter, formatAttributeValue } from "@gooddata/sdk-ui";
4
5
  const PLAIN_TOKEN_TYPES = ["text", "quoted_text", "number", "comment", "bracket"];
5
6
  function AttrTooltipExpression({ tokens }) {
6
7
  const intl = useIntl();
@@ -17,15 +18,18 @@ function AttrTooltipExpression({ tokens }) {
17
18
  return (_jsx("span", { className: `gd-maql-token-object gd-maql-token-${token.type}`, children: token.value }, idx));
18
19
  }) }));
19
20
  }
20
- function AttrTooltipElements({ elements, totalCount }) {
21
+ function AttrTooltipElements({ elements, totalCount, numberFormat, separators, }) {
21
22
  const intl = useIntl();
22
23
  const remainingElementsCount = totalCount - elements.length;
23
- return (_jsxs(_Fragment, { children: [elements.map((element, idx) => (_jsxs("span", { className: "gd-attribute-element s-attribute-element", children: [element.title || `(${intl.formatMessage({ id: "empty_value" })})`, _jsx("br", {})] }, idx))), remainingElementsCount > 0 && (_jsx("span", { className: "attribute-tooltip-elements-more", children: _jsx(FormattedMessage, { id: "attributesDropdown.details.shortening_decoration", values: { count: remainingElementsCount } }) }, elements.length))] }));
24
+ // the values of a numeric computed attribute are displayed formatted, like the filter displays them
25
+ const formatter = createNumberFormatter(separators);
26
+ const displayTitle = (title) => numberFormat ? formatAttributeValue(title, numberFormat, formatter) : title;
27
+ return (_jsxs(_Fragment, { children: [elements.map((element, idx) => (_jsxs("span", { className: "gd-attribute-element s-attribute-element", children: [displayTitle(element.title) || `(${intl.formatMessage({ id: "empty_value" })})`, _jsx("br", {})] }, idx))), remainingElementsCount > 0 && (_jsx("span", { className: "attribute-tooltip-elements-more", children: _jsx(FormattedMessage, { id: "attributesDropdown.details.shortening_decoration", values: { count: remainingElementsCount } }) }, elements.length))] }));
24
28
  }
25
29
  /**
26
30
  * @internal
27
31
  */
28
- export function AttributeListItemTooltipContent({ item, hideDataSet, attributesDataSetLoading, attributesElementsLoading, attributeDataSet, attributeElements, expressionTokens, expressionTokensLoading, }) {
32
+ export function AttributeListItemTooltipContent({ item, hideDataSet, attributesDataSetLoading, attributesElementsLoading, attributeDataSet, attributeElements, separators, expressionTokens, expressionTokensLoading, }) {
29
33
  const showExpression = expressionTokensLoading || expressionTokens !== undefined;
30
- return (_jsxs("div", { className: "gd-attribute-dropdown-list-tooltip-content s-attribute-dropdown-item-list-tooltip-content", children: [_jsx("h3", { className: "s-attribute-filter-tooltip-header", children: item.attribute.title }), hideDataSet ? null : (_jsxs(_Fragment, { children: [_jsx("h4", { children: _jsx(FormattedMessage, { id: "attributesDropdown.details.dataset" }) }), _jsx("p", { className: "s-attribute-filter-tooltip-item-dataset", children: attributesDataSetLoading ? (_jsx(FormattedMessage, { id: "loading" })) : (attributeDataSet?.title) })] })), _jsx("h4", { children: _jsx(FormattedMessage, { id: "attributesDropdown.details.values" }) }), _jsx("p", { className: "s-attribute-filter-tooltip-item-elements", children: attributesElementsLoading ? (_jsx(FormattedMessage, { id: "loading" })) : attributeElements ? (_jsx(AttrTooltipElements, { elements: attributeElements.elements, totalCount: attributeElements.totalCount })) : null }), showExpression ? (_jsxs(_Fragment, { children: [_jsx("h4", { children: _jsx(FormattedMessage, { id: "attributesDropdown.details.definedAs" }) }), _jsx("p", { className: "s-attribute-filter-tooltip-item-maql", children: expressionTokensLoading ? (_jsx(FormattedMessage, { id: "loading" })) : (_jsx(AttrTooltipExpression, { tokens: expressionTokens })) })] })) : null] }));
34
+ return (_jsxs("div", { className: "gd-attribute-dropdown-list-tooltip-content s-attribute-dropdown-item-list-tooltip-content", children: [_jsx("h3", { className: "s-attribute-filter-tooltip-header", children: item.attribute.title }), hideDataSet ? null : (_jsxs(_Fragment, { children: [_jsx("h4", { children: _jsx(FormattedMessage, { id: "attributesDropdown.details.dataset" }) }), _jsx("p", { className: "s-attribute-filter-tooltip-item-dataset", children: attributesDataSetLoading ? (_jsx(FormattedMessage, { id: "loading" })) : (attributeDataSet?.title) })] })), _jsx("h4", { children: _jsx(FormattedMessage, { id: "attributesDropdown.details.values" }) }), _jsx("p", { className: "s-attribute-filter-tooltip-item-elements", children: attributesElementsLoading ? (_jsx(FormattedMessage, { id: "loading" })) : attributeElements ? (_jsx(AttrTooltipElements, { elements: attributeElements.elements, totalCount: attributeElements.totalCount, numberFormat: attributeElements.numberFormat, separators: separators })) : null }), showExpression ? (_jsxs(_Fragment, { children: [_jsx("h4", { children: _jsx(FormattedMessage, { id: "attributesDropdown.details.definedAs" }) }), _jsx("p", { className: "s-attribute-filter-tooltip-item-maql", children: expressionTokensLoading ? (_jsx(FormattedMessage, { id: "loading" })) : (_jsx(AttrTooltipExpression, { tokens: expressionTokens })) })] })) : null] }));
31
35
  }
@@ -3,6 +3,7 @@ export interface IFilterViewDeleteConfirmProps {
3
3
  filterView: IDashboardFilterView;
4
4
  onConfirm: () => void;
5
5
  onCancel: () => void;
6
+ returnFocusTo?: string;
6
7
  }
7
- export declare function FilterViewDeleteConfirm({ filterView, onConfirm, onCancel }: IFilterViewDeleteConfirmProps): import("react/jsx-runtime").JSX.Element;
8
+ export declare function FilterViewDeleteConfirm({ filterView, onConfirm, onCancel, returnFocusTo, }: IFilterViewDeleteConfirmProps): import("react/jsx-runtime").JSX.Element;
8
9
  //# sourceMappingURL=FilterViewDeleteConfirm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterViewDeleteConfirm.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/filterBar/filterBar/filterViews/FilterViewDeleteConfirm.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,MAAM,WAAW,6BAA6B;IAC1C,UAAU,EAAE,oBAAoB,CAAC;IACjC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,6BAA6B,2CAyBzG"}
1
+ {"version":3,"file":"FilterViewDeleteConfirm.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/filterBar/filterBar/filterViews/FilterViewDeleteConfirm.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,MAAM,WAAW,6BAA6B;IAC1C,UAAU,EAAE,oBAAoB,CAAC;IACjC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,EACpC,UAAU,EACV,SAAS,EACT,QAAQ,EACR,aAAa,GAChB,EAAE,6BAA6B,2CA0B/B"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { FormattedMessage, useIntl } from "react-intl";
3
3
  import { ConfirmDialog, Typography } from "@gooddata/sdk-ui-kit";
4
- export function FilterViewDeleteConfirm({ filterView, onConfirm, onCancel }) {
4
+ export function FilterViewDeleteConfirm({ filterView, onConfirm, onCancel, returnFocusTo, }) {
5
5
  const intl = useIntl();
6
- return (_jsx(ConfirmDialog, { onSubmit: onConfirm, onCancel: onCancel, isPositive: false, className: "gd-filter-view__delete-dialog s-gd-filter-view__delete-dialog", headline: intl.formatMessage({ id: "filters.filterViews.delete.title" }), submitButtonText: intl.formatMessage({ id: "filters.filterViews.delete.deleteButton" }), cancelButtonText: intl.formatMessage({ id: "filters.filterViews.delete.cancelButton" }), children: _jsx(Typography, { tagName: "p", children: _jsx(FormattedMessage, { id: "filters.filterViews.delete.body", values: {
6
+ return (_jsx(ConfirmDialog, { onSubmit: onConfirm, onCancel: onCancel, returnFocusTo: returnFocusTo, isPositive: false, className: "gd-filter-view__delete-dialog s-gd-filter-view__delete-dialog", headline: intl.formatMessage({ id: "filters.filterViews.delete.title" }), submitButtonText: intl.formatMessage({ id: "filters.filterViews.delete.deleteButton" }), cancelButtonText: intl.formatMessage({ id: "filters.filterViews.delete.cancelButton" }), children: _jsx(Typography, { tagName: "p", children: _jsx(FormattedMessage, { id: "filters.filterViews.delete.body", values: {
7
7
  view: filterView.name,
8
8
  b: (chunks) => (_jsx("strong", { className: "gd-filter-view__delete-dialog__item", children: chunks })),
9
9
  } }) }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"FilterViewsList.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/filterBar/filterBar/filterViews/FilterViewsList.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,oBAAoB,EAAkB,MAAM,qBAAqB,CAAC;AAmMhF,MAAM,WAAW,6BAA6B;IAC1C,WAAW,EAAE,oBAAoB,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC5B,WAAgB,EAChB,QAAQ,EACR,OAAO,EACP,OAAO,EAAE,WAAW,GACvB,EAAE,6BAA6B,2CAwO/B"}
1
+ {"version":3,"file":"FilterViewsList.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/filterBar/filterBar/filterViews/FilterViewsList.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,oBAAoB,EAAkB,MAAM,qBAAqB,CAAC;AAmMhF,MAAM,WAAW,6BAA6B;IAC1C,WAAW,EAAE,oBAAoB,EAAE,GAAG,SAAS,CAAC;IAChD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAC5B,WAAgB,EAChB,QAAQ,EACR,OAAO,EACP,OAAO,EAAE,WAAW,GACvB,EAAE,6BAA6B,2CA4O/B"}
@@ -21,7 +21,7 @@ function SetAsDefaultButton({ isDefault, isFocused, onClick, title, id, }) {
21
21
  }
22
22
  function DeleteButton({ isFocused, onClick, title, id, }) {
23
23
  const { formatMessage } = useIntl();
24
- return (_jsx("div", { className: "gd-filter-view__item__delete-button-wrapper", role: "gridcell", children: _jsx(UiTooltip, { arrowPlacement: "top-end", triggerBy: isFocused ? [] : ["hover"], content: formatMessage({ id: "filters.filterViews.add.deleteTooltip" }), anchor: _jsx("div", { className: cx("gd-filter-view__item__button gd-filter-view__item__button--delete", {
24
+ return (_jsx("div", { className: "gd-filter-view__item__delete-button-wrapper", role: "gridcell", children: _jsx(UiTooltip, { arrowPlacement: "top-end", triggerBy: ["hover", "focus"], content: formatMessage({ id: "filters.filterViews.add.deleteTooltip" }), anchor: _jsx("div", { className: cx("gd-filter-view__item__button gd-filter-view__item__button--delete", {
25
25
  "gd-filter-view__item__button--isFocused": isFocused,
26
26
  }), role: "button", "aria-label": formatMessage({ id: "filters.filterViews.add.deleteTooltip.ariaLabel" }, { name: title }), onClick: onClick, id: id, tabIndex: isFocused ? 0 : -1, children: _jsx(UiIcon, { type: "trash", size: 12, layout: "block", color: "currentColor" }) }) }) }));
27
27
  }
@@ -75,16 +75,19 @@ export function FilterViewsList({ filterViews = [], onAddNew, onClose, titleId:
75
75
  onClose();
76
76
  };
77
77
  }, [createSetAsDefaultHandler, onClose]);
78
- const createDeleteHandler = useCallback((filterView) => {
78
+ function createDeleteHandler(filterView) {
79
79
  if (!canCreateFilterView) {
80
80
  return undefined;
81
81
  }
82
82
  return () => {
83
+ // Screen-reader activation can click an action without moving DOM focus.
84
+ setFocusedIndex(filterViews.indexOf(filterView));
85
+ setFocusedAction("delete");
83
86
  setFilterViewToDelete(filterView);
84
87
  };
85
- }, [canCreateFilterView]);
88
+ }
86
89
  const refocusKey = `${isLoading}`;
87
- const { onKeyboardNavigation, focusedItem, focusedAction, setFocusedAction } = useListWithActionsKeyboardNavigation({
90
+ const { onKeyboardNavigation, focusedItem, focusedAction, setFocusedAction, setFocusedIndex } = useListWithActionsKeyboardNavigation({
88
91
  items: filterViews,
89
92
  getItemAdditionalActions,
90
93
  actionHandlers: {
@@ -109,7 +112,10 @@ export function FilterViewsList({ filterViews = [], onAddNew, onClose, titleId:
109
112
  }
110
113
  setFocusedAction(SELECT_ITEM_ACTION);
111
114
  }, [containerRef, filterViewToDelete, setFocusedAction]);
112
- return (_jsxs(UiFocusManager, { enableFocusTrap: true, enableAutofocus: { refocusKey, initialFocus: infoButtonId }, children: [filterViewToDelete ? (_jsx(FilterViewDeleteConfirm, { filterView: filterViewToDelete, onConfirm: () => {
115
+ return (_jsxs(UiFocusManager, { enableFocusTrap: true, enableAutofocus: { refocusKey, initialFocus: infoButtonId }, children: [filterViewToDelete ? (_jsx(FilterViewDeleteConfirm, { filterView: filterViewToDelete, returnFocusTo: scopedIdStoreValue.makeId({
116
+ item: filterViewToDelete,
117
+ specifier: "delete",
118
+ }), onConfirm: () => {
113
119
  dispatch(deleteFilterView(filterViewToDelete.ref));
114
120
  setFilterViewToDelete(undefined);
115
121
  }, onCancel: () => {
@@ -127,6 +127,10 @@ export declare const en_US: {
127
127
  text: string;
128
128
  crowdinContext: string;
129
129
  };
130
+ "messages.dashboard.editModeDesktopLayout.note": {
131
+ text: string;
132
+ crowdinContext: string;
133
+ };
130
134
  "messages.drill.InteractionConfiguredSuccess": {
131
135
  text: string;
132
136
  crowdinContext: string;
@@ -859,6 +863,22 @@ export declare const en_US: {
859
863
  text: string;
860
864
  crowdinContext: string;
861
865
  };
866
+ "dialogs.schedule.email.recipients.selected.none": {
867
+ text: string;
868
+ crowdinContext: string;
869
+ };
870
+ "dialogs.schedule.email.recipients.selected.few": {
871
+ text: string;
872
+ crowdinContext: string;
873
+ };
874
+ "dialogs.schedule.email.recipients.selected.many": {
875
+ text: string;
876
+ crowdinContext: string;
877
+ };
878
+ "dialogs.schedule.email.recipients.navigationHint": {
879
+ text: string;
880
+ crowdinContext: string;
881
+ };
862
882
  "dialogs.schedule.email.filters": {
863
883
  text: string;
864
884
  crowdinContext: string;
@@ -1219,6 +1239,10 @@ export declare const en_US: {
1219
1239
  text: string;
1220
1240
  crowdinContext: string;
1221
1241
  };
1242
+ "scheduledEmail.attachments.noVisibleAttachments": {
1243
+ text: string;
1244
+ crowdinContext: string;
1245
+ };
1222
1246
  "scheduledEmail.attachments.warning.noAttachmentsSelected": {
1223
1247
  text: string;
1224
1248
  crowdinContext: string;