@gooddata/sdk-ui-dashboard 11.41.0 → 11.42.0-alpha.1

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 (51) hide show
  1. package/esm/__version.d.ts +1 -1
  2. package/esm/__version.d.ts.map +1 -1
  3. package/esm/__version.js +1 -1
  4. package/esm/index.d.ts +1 -1
  5. package/esm/index.d.ts.map +1 -1
  6. package/esm/index.js +1 -1
  7. package/esm/model/store/executionResults/constants.d.ts +7 -0
  8. package/esm/model/store/executionResults/constants.d.ts.map +1 -0
  9. package/esm/model/store/executionResults/constants.js +8 -0
  10. package/esm/model/store/executionResults/executionResultsSelectors.d.ts +12 -0
  11. package/esm/model/store/executionResults/executionResultsSelectors.d.ts.map +1 -1
  12. package/esm/model/store/executionResults/executionResultsSelectors.js +16 -1
  13. package/esm/presentation/automations/alerting/DefaultAlertingManagementDialog/DefaultAlertingManagementDialogContentEnhanced.d.ts.map +1 -1
  14. package/esm/presentation/automations/alerting/DefaultAlertingManagementDialog/DefaultAlertingManagementDialogContentEnhanced.js +5 -2
  15. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialog.d.ts.map +1 -1
  16. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialog.js +13 -2
  17. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialogContentEnhanced.d.ts.map +1 -1
  18. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialogContentEnhanced.js +5 -2
  19. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +8 -44
  20. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  21. package/esm/presentation/localization/bundles/en-US.localization-bundle.js +8 -44
  22. package/esm/presentation/shareDialog/DefaultShareDialog.d.ts.map +1 -1
  23. package/esm/presentation/shareDialog/DefaultShareDialog.js +6 -2
  24. package/esm/presentation/topBar/menuButton/DefaultMenuButton.d.ts.map +1 -1
  25. package/esm/presentation/topBar/menuButton/DefaultMenuButton.js +39 -16
  26. package/esm/presentation/topBar/menuButton/types.d.ts +6 -0
  27. package/esm/presentation/topBar/menuButton/types.d.ts.map +1 -1
  28. package/esm/presentation/topBar/menuButton/types.js +1 -0
  29. package/esm/presentation/topBar/menuButton/useDefaultMenuItems.d.ts.map +1 -1
  30. package/esm/presentation/topBar/menuButton/useDefaultMenuItems.js +7 -0
  31. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogExportDropdown.js +1 -1
  32. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.d.ts.map +1 -1
  33. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.js +14 -10
  34. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogExportItems.d.ts +0 -1
  35. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogExportItems.d.ts.map +1 -1
  36. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogExportItems.js +23 -8
  37. package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/DashboardInsightMenuItemButton.js +1 -1
  38. package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/getDefaultInsightMenuItems.d.ts.map +1 -1
  39. package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/getDefaultInsightMenuItems.js +56 -27
  40. package/esm/presentation/widget/widget/warningPartialResult/InsightWidgetWarningPartialResult.d.ts.map +1 -1
  41. package/esm/presentation/widget/widget/warningPartialResult/InsightWidgetWarningPartialResult.js +4 -89
  42. package/esm/sdk-ui-dashboard.d.ts +19 -0
  43. package/package.json +20 -20
  44. package/styles/css/dashboard.css +3 -1
  45. package/styles/css/dashboard.css.map +1 -1
  46. package/styles/css/main.css +28 -5
  47. package/styles/css/main.css.map +1 -1
  48. package/styles/css/warningPartialResult.css +1 -0
  49. package/styles/css/warningPartialResult.css.map +1 -1
  50. package/styles/scss/dashboard.scss +5 -1
  51. package/styles/scss/warningPartialResult.scss +1 -0
@@ -169,6 +169,14 @@ export const en_US = {
169
169
  "text": "Data (.xlsx)",
170
170
  "crowdinContext": "Export option for saving dashboard data as an Excel file"
171
171
  },
172
+ "options.menu.export.partialResults.exportDisabled": {
173
+ "text": "Cannot export, because visualization exceeds result limits.",
174
+ "crowdinContext": "Tooltip on a disabled formatted export option (XLSX, formatted CSV, formatted PDF) in the widget or drill dialog menu, shown when the visualization reached a result limit"
175
+ },
176
+ "options.menu.export.partialResults.warning.dashboard": {
177
+ "text": "Some visualizations exceed result limits and won’t be included in the XLSX export.",
178
+ "crowdinContext": "Tooltip on a warning icon next to the dashboard-level XLSX export option, shown when at least one visualization on the dashboard reached a result limit and the export will contain only partial data"
179
+ },
172
180
  "options.menu.export.presentation.PPTX": {
173
181
  "text": "Slide Deck (.pptx)",
174
182
  "crowdinContext": "Export option for saving dashboard as a PowerPoint presentation"
@@ -1281,50 +1289,6 @@ export const en_US = {
1281
1289
  "text": "Export full result as Raw (.csv)",
1282
1290
  "crowdinContext": "Action link in partial data warning that exports the full raw CSV result."
1283
1291
  },
1284
- "partial_data_warning.description": {
1285
- "text": "The result exceeds a result size limit.",
1286
- "crowdinContext": "Generic detail text for partial data warning."
1287
- },
1288
- "partial_data_warning.rows.description": {
1289
- "text": "The result exceeds the {rowLimit} row limit by {rowOverflow} rows.",
1290
- "crowdinContext": "Partial data warning detail when the row limit is exceeded."
1291
- },
1292
- "partial_data_warning.rows.description.unknown_total": {
1293
- "text": "The result exceeds the {rowLimit} row limit.",
1294
- "crowdinContext": "Partial data warning detail when the row limit is exceeded and the exact total is unknown."
1295
- },
1296
- "partial_data_warning.columns.description": {
1297
- "text": "The result exceeds the {columnLimit} columns limit by {columnOverflow} columns.",
1298
- "crowdinContext": "Partial data warning detail when the column limit is exceeded."
1299
- },
1300
- "partial_data_warning.columns.description.unknown_total": {
1301
- "text": "The result exceeds the {columnLimit} columns limit.",
1302
- "crowdinContext": "Partial data warning detail when the column limit is exceeded and the exact total is unknown."
1303
- },
1304
- "partial_data_warning.rows_columns.description": {
1305
- "text": "The result exceeds both the {columnLimit} columns and the {rowLimit} row limit by {columnOverflow} columns and {rowOverflow} rows.",
1306
- "crowdinContext": "Partial data warning detail when both row and column limits are exceeded."
1307
- },
1308
- "partial_data_warning.rows_columns.description.unknown_column_total": {
1309
- "text": "The result exceeds both the {columnLimit} columns and the {rowLimit} row limit. It exceeds the row limit by {rowOverflow} rows.",
1310
- "crowdinContext": "Partial data warning detail when both row and column limits are exceeded, but only the row overflow is known."
1311
- },
1312
- "partial_data_warning.rows_columns.description.unknown_row_total": {
1313
- "text": "The result exceeds both the {columnLimit} columns and the {rowLimit} row limit. It exceeds the columns limit by {columnOverflow} columns.",
1314
- "crowdinContext": "Partial data warning detail when both row and column limits are exceeded, but only the column overflow is known."
1315
- },
1316
- "partial_data_warning.rows_columns.description.unknown_total": {
1317
- "text": "The result exceeds both the {columnLimit} columns and the {rowLimit} row limit.",
1318
- "crowdinContext": "Partial data warning detail when both row and column limits are exceeded and exact totals are unknown."
1319
- },
1320
- "partial_data_warning.cells.description": {
1321
- "text": "The result exceeds the {cellLimit} datapoint limit by {cellOverflow} datapoints.",
1322
- "crowdinContext": "Partial data warning detail when the datapoint limit is exceeded."
1323
- },
1324
- "partial_data_warning.cells.description.unknown_total": {
1325
- "text": "The result exceeds the {cellLimit} datapoint limit.",
1326
- "crowdinContext": "Partial data warning detail when the datapoint limit is exceeded and the exact total is unknown."
1327
- },
1328
1292
  "export_unsupported.disabled": {
1329
1293
  "text": "Export is not supported",
1330
1294
  "crowdinContext": "Export to the file not supported."
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultShareDialog.d.ts","sourceRoot":"","sources":["../../../src/presentation/shareDialog/DefaultShareDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAW,MAAM,OAAO,CAAC;AASnD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAC/B,SAAS,EACT,OAAO,EACP,SAAS,EACT,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,OAAO,EACP,QAAQ,EACR,OAAO,EACP,aAAa,EACb,eAAe,EAClB,EAAE,iBAAiB,GAAG,YAAY,GAAG,IAAI,CA+CzC"}
1
+ {"version":3,"file":"DefaultShareDialog.d.ts","sourceRoot":"","sources":["../../../src/presentation/shareDialog/DefaultShareDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAW,MAAM,OAAO,CAAC;AASnD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAC/B,SAAS,EACT,OAAO,EACP,SAAS,EACT,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,OAAO,EACP,QAAQ,EACR,OAAO,EACP,aAAa,EACb,eAAe,EAClB,EAAE,iBAAiB,GAAG,YAAY,GAAG,IAAI,CAoDzC"}
@@ -4,12 +4,16 @@ import { useMemo } from "react";
4
4
  import { useIntl } from "react-intl";
5
5
  import { ShareDialog } from "@gooddata/sdk-ui-kit";
6
6
  import { useDashboardSelector } from "../../model/react/DashboardStoreProvider.js";
7
- import { selectLocale } from "../../model/store/config/configSelectors.js";
7
+ import { selectLocale, selectSettings } from "../../model/store/config/configSelectors.js";
8
8
  /**
9
9
  * @alpha
10
10
  */
11
11
  export function DefaultShareDialog({ workspace, backend, isVisible, sharedObject, currentUser, isLockingSupported, isCurrentUserWorkspaceManager, currentUserPermissions, dashboardFilters, dashboardParameters, isShareGrantHidden, applyShareGrantOnSelect, showDashboardShareLink, isGranteeShareLoading, onApply, onCancel, onError, onInteraction, onShareLinkCopy, }) {
12
12
  const locale = useDashboardSelector(selectLocale);
13
+ const settings = useDashboardSelector(selectSettings);
14
+ const dashboardLinkBasePath = settings.enableShellApplication_dashboards
15
+ ? `/workspace/${workspace}/dashboards/`
16
+ : undefined;
13
17
  const intl = useIntl();
14
18
  const labels = useMemo(() => ({
15
19
  accessTypeLabel: intl.formatMessage({ id: "dashboard.shareDialog.lock.label" }),
@@ -26,5 +30,5 @@ export function DefaultShareDialog({ workspace, backend, isVisible, sharedObject
26
30
  if (!isVisible) {
27
31
  return null;
28
32
  }
29
- return (_jsx(ShareDialog, { locale: locale, backend: backend, workspace: workspace, sharedObject: sharedObject, currentUser: currentUser, onApply: onApply, onCancel: onCancel, onError: onError, isLockingSupported: isLockingSupported, labels: labels, isCurrentUserWorkspaceManager: isCurrentUserWorkspaceManager, currentUserPermissions: currentUserPermissions, dashboardFilters: dashboardFilters, dashboardParameters: dashboardParameters, isShareGrantHidden: isShareGrantHidden, applyShareGrantOnSelect: applyShareGrantOnSelect, showDashboardShareLink: showDashboardShareLink, isGranteeShareLoading: isGranteeShareLoading, onInteraction: onInteraction, onShareLinkCopy: onShareLinkCopy }));
33
+ return (_jsx(ShareDialog, { locale: locale, backend: backend, workspace: workspace, sharedObject: sharedObject, currentUser: currentUser, onApply: onApply, onCancel: onCancel, onError: onError, isLockingSupported: isLockingSupported, labels: labels, isCurrentUserWorkspaceManager: isCurrentUserWorkspaceManager, currentUserPermissions: currentUserPermissions, dashboardFilters: dashboardFilters, dashboardParameters: dashboardParameters, dashboardLinkBasePath: dashboardLinkBasePath, isShareGrantHidden: isShareGrantHidden, applyShareGrantOnSelect: applyShareGrantOnSelect, showDashboardShareLink: showDashboardShareLink, isGranteeShareLoading: isGranteeShareLoading, onInteraction: onInteraction, onShareLinkCopy: onShareLinkCopy }));
30
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultMenuButton.d.ts","sourceRoot":"","sources":["../../../../src/presentation/topBar/menuButton/DefaultMenuButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEH,KAAK,YAAY,EAMpB,MAAM,OAAO,CAAC;AAyBf,OAAO,EAIH,KAAK,gBAAgB,EACxB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CA0OtF"}
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;AA0Bf,OAAO,EAIH,KAAK,gBAAgB,EACxB,MAAM,YAAY,CAAC;AAIpB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,EAAE,gBAAgB,GAAG,YAAY,GAAG,IAAI,CA0OtF"}
@@ -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, UiTooltip, getFocusableElements, isActionKey, makeMenuKeyboardNavigation, useId, useIdPrefixed, } from "@gooddata/sdk-ui-kit";
6
+ import { Button, ItemsWrapper, Overlay, SingleSelectListItem, UiFocusManager, UiIcon, UiTooltip, 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";
@@ -159,6 +159,10 @@ export function DefaultMenuButton({ menuItems }) {
159
159
  }
160
160
  function MenuItem({ menuItem, selectedMenuItem, setMenuItemRef, setSelectedMenuItem, setParentItemId, setAutofocusSubmenu, setIsOpen, }) {
161
161
  const tooltipId = useIdPrefixed(`menu-tooltip-${menuItem.itemId}`);
162
+ const warningTooltipId = useIdPrefixed(`menu-warning-${menuItem.itemId}`);
163
+ // Tracks whether the item-level (focus-triggered) warning tooltip is open, so the icon's hover tooltip can
164
+ // be suppressed while the item is focused - avoids both tooltips showing at once.
165
+ const [isWarningFocusTooltipOpen, setIsWarningFocusTooltipOpen] = useState(false);
162
166
  const renderWithOptionalTooltip = (menuItem, children) => {
163
167
  const selectorClassName = `gd-menu-item-${menuItem.itemId}`;
164
168
  const hasTooltip = !!menuItem.tooltip;
@@ -199,19 +203,38 @@ function MenuItem({ menuItem, selectedMenuItem, setMenuItemRef, setSelectedMenuI
199
203
  ariaDescribedBy: menuItem.disabled ? tooltipId : undefined,
200
204
  } }, menuItem.itemId)));
201
205
  }
202
- return renderWithOptionalTooltip(menuItem, ({ selectorClassName, tooltipId }) => (_jsx(SingleSelectListItem, { ref: setMenuItemRef(menuItem.itemId), className: cx("gd-menu-item", menuItem.className, `s-${menuItem.itemId}`, {
203
- [selectorClassName]: menuItem.tooltip,
204
- "is-disabled": menuItem.disabled,
205
- }), title: menuItem.itemName, icon: menuItem.icon, onClick: menuItem.disabled
206
- ? undefined
207
- : () => {
208
- menuItem.onClick?.();
209
- setIsOpen(false);
210
- setSelectedMenuItem(null);
211
- }, elementType: "button", accessibilityConfig: {
212
- role: "menuitem",
213
- ariaDisabled: menuItem.disabled,
214
- ariaHasPopup: menuItem.opensDialog ? "dialog" : undefined,
215
- ariaDescribedBy: menuItem.disabled ? tooltipId : undefined,
216
- } }, menuItem.itemId)));
206
+ return renderWithOptionalTooltip(menuItem, ({ selectorClassName, tooltipId }) => {
207
+ const hasWarning = !!menuItem.warning;
208
+ const item = (_jsx(SingleSelectListItem, { ref: setMenuItemRef(menuItem.itemId), className: cx("gd-menu-item", menuItem.className, `s-${menuItem.itemId}`, {
209
+ [selectorClassName]: menuItem.tooltip,
210
+ "is-disabled": menuItem.disabled,
211
+ }), title: menuItem.itemName, icon: menuItem.icon, info: menuItem.warning ?? undefined, infoRenderer: hasWarning ? (info) => renderMenuItemWarning(info, isWarningFocusTooltipOpen) : undefined, onClick: menuItem.disabled
212
+ ? undefined
213
+ : () => {
214
+ menuItem.onClick?.();
215
+ setIsOpen(false);
216
+ setSelectedMenuItem(null);
217
+ }, elementType: "button", accessibilityConfig: {
218
+ role: "menuitem",
219
+ ariaDisabled: menuItem.disabled,
220
+ ariaHasPopup: menuItem.opensDialog ? "dialog" : undefined,
221
+ // The warning icon is not focusable and is hidden from AT, so describe the whole item by
222
+ // the warning text for screen-reader users (disabled tooltip takes precedence when present).
223
+ ariaDescribedBy: menuItem.disabled
224
+ ? tooltipId
225
+ : hasWarning
226
+ ? warningTooltipId
227
+ : undefined,
228
+ } }, menuItem.itemId));
229
+ // Keyboard accessibility: the warning icon has its own hover-only tooltip for mouse users, but it is
230
+ // not focusable. Add a second, focus-triggered tooltip anchored to the whole (focusable) menu item so
231
+ // keyboard users see the warning too. Skip it when a disabled tooltip already takes over on focus.
232
+ if (!hasWarning || menuItem.tooltip) {
233
+ return item;
234
+ }
235
+ return (_jsx(UiTooltip, { id: warningTooltipId, triggerBy: ["focus"], arrowPlacement: "left", optimalPlacement: true, content: menuItem.warning, anchor: item, onOpen: () => setIsWarningFocusTooltipOpen(true), onClose: () => setIsWarningFocusTooltipOpen(false) }));
236
+ });
237
+ }
238
+ 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 } }) }) }));
217
240
  }
@@ -18,6 +18,12 @@ export interface IMenuButtonItemButton extends IMenuItemCommonProps {
18
18
  * If specified, the value is shown on hover of the item as a tooltip.
19
19
  */
20
20
  tooltip?: string | ReactNode;
21
+ /**
22
+ * If specified, a warning indicator is rendered on the trailing side of the item, shown regardless of
23
+ * the item's disabled state. The value is the content shown on hover of the warning indicator. Used e.g.
24
+ * to flag that an export will contain partial results because an execution reached a result limit.
25
+ */
26
+ warning?: ReactNode;
21
27
  disabled?: boolean;
22
28
  icon?: string | ReactNode;
23
29
  opensDialog?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/presentation/topBar/menuButton/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAC/D,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE;QACH,qBAAqB,GAAG,wBAAwB,GAAG,qBAAqB;QACxE,GAAG,CAAC,qBAAqB,GAAG,wBAAwB,GAAG,qBAAqB,CAAC,EAAE;KAClF,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,oBAAoB;IAClE,IAAI,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAC/D,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACrB,qBAAqB,GACrB,wBAAwB,GACxB,qBAAqB,GACrB,mBAAmB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;OAEG;IACH,SAAS,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAE1C,iBAAiB,EAAE,yBAAyB,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAE3C;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;CAClE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/presentation/topBar/menuButton/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAC/D,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,oBAAoB;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,KAAK,EAAE;QACH,qBAAqB,GAAG,wBAAwB,GAAG,qBAAqB;QACxE,GAAG,CAAC,qBAAqB,GAAG,wBAAwB,GAAG,qBAAqB,CAAC,EAAE;KAClF,CAAC;CACL;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,oBAAoB;IAClE,IAAI,EAAE,WAAW,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAC/D,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACrB,qBAAqB,GACrB,wBAAwB,GACxB,qBAAqB,GACrB,mBAAmB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;OAEG;IACH,SAAS,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAE1C,iBAAiB,EAAE,yBAAyB,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAE3C;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,aAAa,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;CAClE"}
@@ -1 +1,2 @@
1
+ // (C) 2021-2026 GoodData Corporation
1
2
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"useDefaultMenuItems.d.ts","sourceRoot":"","sources":["../../../../src/presentation/topBar/menuButton/useDefaultMenuItems.tsx"],"names":[],"mappings":"AAwCA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AA8BlD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CA2bvD"}
1
+ {"version":3,"file":"useDefaultMenuItems.d.ts","sourceRoot":"","sources":["../../../../src/presentation/topBar/menuButton/useDefaultMenuItems.tsx"],"names":[],"mappings":"AAyCA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AA8BlD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAicvD"}
@@ -8,6 +8,7 @@ import { useDashboardDispatch, useDashboardSelector } from "../../../model/react
8
8
  import { useDashboardScheduledEmails } from "../../../model/react/useDasboardScheduledEmails/useDashboardScheduledEmails.js";
9
9
  import { useDashboardAlerts } from "../../../model/react/useDashboardAlerting/useDashboardAlerts.js";
10
10
  import { selectEnableAutomationManagement, selectEnableDashboardDensitySetting, selectEnableDashboardTabularExport, selectEnableSnapshotExport, selectIsReadOnly, selectSettings, } from "../../../model/store/config/configSelectors.js";
11
+ import { selectHasAnyExecutionResultLimitBreaks } from "../../../model/store/executionResults/executionResultsSelectors.js";
11
12
  import { selectDashboardTitle, selectIsNewDashboard } from "../../../model/store/meta/metaSelectors.js";
12
13
  import { selectCanCreateAutomation, selectCanExportPdf, selectCanExportTabular, } from "../../../model/store/permissions/permissionsSelectors.js";
13
14
  import { selectIsInEditMode } from "../../../model/store/renderMode/renderModeSelectors.js";
@@ -52,6 +53,10 @@ export function useDefaultMenuItems() {
52
53
  const isEmptyLayout = !useDashboardSelector(selectLayoutHasAnalyticalWidgets); // we need at least one non-custom widget there
53
54
  const settings = useDashboardSelector(selectSettings);
54
55
  const dashboardTitle = useDashboardSelector(selectDashboardTitle);
56
+ const hasAnyLimitBreaks = useDashboardSelector(selectHasAnyExecutionResultLimitBreaks);
57
+ const xlsxPartialResultsWarning = hasAnyLimitBreaks
58
+ ? intl.formatMessage({ id: "options.menu.export.partialResults.warning.dashboard" })
59
+ : undefined;
55
60
  const { isScheduledEmailingVisible, isScheduledManagementEmailingVisible, numberOfAvailableDestinations, defaultOnScheduleEmailing, defaultOnScheduleEmailingManagement, } = useDashboardScheduledEmails();
56
61
  const { defaultOnAlertingManagement: defaultOnAlertsManagement, isAlertManagementVisible: isAlertsManagementVisible, } = useDashboardAlerts();
57
62
  const dispatch = useDashboardDispatch();
@@ -355,6 +360,7 @@ export function useDefaultMenuItems() {
355
360
  visible: isXlsxExportVisible,
356
361
  disabled: isInProgress,
357
362
  tooltip: disabledTooltip,
363
+ warning: xlsxPartialResultsWarning,
358
364
  icon: "gd-icon-type-sheet",
359
365
  },
360
366
  ],
@@ -414,5 +420,6 @@ export function useDefaultMenuItems() {
414
420
  isXlsxExportVisible,
415
421
  isAutomationManagementEnabled,
416
422
  enableSnapshotExport,
423
+ xlsxPartialResultsWarning,
417
424
  ]);
418
425
  }
@@ -62,7 +62,7 @@ function DrillModalExportMenuItem(props) {
62
62
  const { item, isFocused } = props;
63
63
  const tooltip = item.data.disabledTooltip;
64
64
  return item.isDisabled && tooltip !== undefined ? (_jsxs(_Fragment, { children: [
65
- _jsx(UiTooltip, { triggerBy: isFocused ? [] : ["hover", "focus"], arrowPlacement: "right", optimalPlacement: true, content: tooltip, anchor: _jsx(InteractiveItemWithIcon, { ...props }) }), _jsx("div", { className: "sr-only", "aria-live": "polite", children: tooltip })
65
+ _jsx(UiTooltip, { triggerBy: isFocused ? [] : ["hover", "focus"], arrowPlacement: "left", optimalPlacement: true, content: tooltip, anchor: _jsx(InteractiveItemWithIcon, { ...props }) }), _jsx("div", { className: "sr-only", "aria-live": "polite", children: tooltip })
66
66
  ] })) : (_jsx(InteractiveItemWithIcon, { ...props }));
67
67
  }
68
68
  function DropdownTriggerButton({ toggleDropdown, buttonRef, accessibilityConfig, isDisabled, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"InsightDrillDialog.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,YAAY,EAAyB,MAAM,OAAO,CAAC;AAKrF,OAAO,EAEH,KAAK,QAAQ,EACb,KAAK,cAAc,EAMtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,kBAAkB,CAAC;AA0BvE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAc7G;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC,sBAAsB,EAAE,OAAO,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,QAAQ,CAAC;IAClB,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,oBAAoB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACnC;AAoCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,wBAAwB,GAAG,YAAY,CA8LhF"}
1
+ {"version":3,"file":"InsightDrillDialog.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,YAAY,EAAyB,MAAM,OAAO,CAAC;AAKrF,OAAO,EAEH,KAAK,QAAQ,EACb,KAAK,cAAc,EAKtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,OAAO,EAAyB,MAAM,kBAAkB,CAAC;AA2BvE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAgB7G;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC,sBAAsB,EAAE,OAAO,CAAC;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,QAAQ,CAAC;IAClB,SAAS,EAAE,UAAU,CAAC;IACtB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,oBAAoB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACnC;AAkCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,wBAAwB,GAAG,YAAY,CA2MhF"}
@@ -3,12 +3,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useState } from "react";
4
4
  import cx from "classnames";
5
5
  import { useIntl } from "react-intl";
6
- import { idRef, insightTitle, insightVisualizationType, isInsight, } from "@gooddata/sdk-model";
6
+ import { insightTitle, insightVisualizationType, isInsight, } from "@gooddata/sdk-model";
7
7
  import { Button, FullScreenOverlay, Overlay, OverlayController, OverlayControllerProvider, RichText, UiIcon, UiTooltip, isNotDocumentFocused, useIdPrefixed, useMediaQuery, } from "@gooddata/sdk-ui-kit";
8
8
  import { DOWNLOADER_ID } from "../../../../../_staging/fileUtils/downloadFile.js";
9
9
  import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
10
10
  import { useWidgetExecutionsHandler } from "../../../../../model/react/useWidgetExecutionsHandler.js";
11
11
  import { selectEnableRichTextDynamicReferences, selectSeparators, } from "../../../../../model/store/config/configSelectors.js";
12
+ import { DRILL_MODAL_EXECUTION_PSEUDO_REF } from "../../../../../model/store/executionResults/constants.js";
12
13
  import { selectExecutionTimestamp } from "../../../../../model/store/ui/uiSelectors.js";
13
14
  import { DASHBOARD_HEADER_OVERLAYS_Z_INDEX } from "../../../../constants/zIndex.js";
14
15
  import { useDashboardComponentsContext } from "../../../../dashboardContexts/DashboardComponentsContext.js";
@@ -17,6 +18,8 @@ import { IntlWrapper } from "../../../../localization/IntlWrapper.js";
17
18
  import { ThemedLoadingEqualizer } from "../../../../presentationComponents/ThemedLoadingEqualizer.js";
18
19
  import { useInsightExport } from "../../../common/useInsightExport.js";
19
20
  import { useShowAsTable } from "../../../showAsTableButton/useShowAsTable.js";
21
+ import { useInsightWarning } from "../../../widget/InsightWidget/useInsightWarning.js";
22
+ import { InsightWidgetWarningPartialResult } from "../../../widget/warningPartialResult/InsightWidgetWarningPartialResult.js";
20
23
  import { supportsShowAsTable } from "../../insightToTable.js";
21
24
  import { DrillDialog } from "./DrillDialog.js";
22
25
  import { DrillDialogInsight } from "./DrillDialogInsight.js";
@@ -48,7 +51,6 @@ const getInsightWidgetDescription = (descriptionConfig, widget, insight) => {
48
51
  // If widget is not insight or insight is not same as insight in dialog, we will use insight summary as default
49
52
  return insight?.summary;
50
53
  };
51
- const DRILL_MODAL_EXECUTION_PSEUDO_REF = idRef("@@GDC_DRILL_MODAL");
52
54
  export function InsightDrillDialog(props) {
53
55
  const { widget, locale, breadcrumbs, insight, enableDrillDescription, drillStep, returnFocusToInsight, onClose, onBackButtonClick, onDrillDown, onDrillStart, } = props;
54
56
  const isMobileDevice = useMediaQuery("mobileDevice");
@@ -94,16 +96,18 @@ export function InsightDrillDialog(props) {
94
96
  const onCloseDialog = () => {
95
97
  onClose();
96
98
  };
99
+ const { limitBreaks, executionResult } = useInsightWarning(DRILL_MODAL_EXECUTION_PSEUDO_REF);
97
100
  const isShowAsTableVisible = supportsShowAsTable(insightVisualizationType(insight));
98
- return (_jsx(OverlayControllerProvider, { overlayController: overlayController, children: _jsx(OverlayComponent, { className: "gd-drill-modal-overlay", isModal: true, closeOnEscape: true, closeOnOutsideClick: true, ignoreClicksOnByClass: overlayIgnoredClasses, onClose: onCloseDialog, positionType: "fixed", children: _jsx(IntlWrapper, { locale: locale, children: _jsx(DrillDialog, { insight: insight, widget: widget, insightTitle: baseInsightTitle, isBackButtonVisible: breadcrumbs.length > 1, onBackButtonClick: onBackButtonClick, onCloseDialog: onCloseDialog, breadcrumbs: breadcrumbs, exportAvailable: exportXLSXEnabled || exportCSVEnabled, exportXLSXEnabled: exportXLSXEnabled, exportCSVEnabled: exportCSVEnabled, exportCSVRawEnabled: exportCSVRawEnabled, exportPDFEnabled: exportPdfTabularEnabled, exportPDFVisible: isExportPdfTabularVisible, enableDrillDescription: enableDrillDescription, onExportXLSX: onExportXLSX, onExportCSV: onExportCSV, onExportCSVRaw: onExportRawCSV, onExportPDF: onExportPdfTabular, isLoading: isLoading, isExporting: isExporting, isExportRawVisible: isExportRawVisible, isShowAsTableVisible: isShowAsTableVisible, isWidgetAsTable: drillDialogIsAsTable, onShowAsTable: toggleWidgetAsTable, focusCheckFn: isNotDocumentFocused, accessibilityConfig: {
101
+ return (_jsx(OverlayControllerProvider, { overlayController: overlayController, children: _jsx(OverlayComponent, { className: "gd-drill-modal-overlay", isModal: true, closeOnEscape: true, closeOnOutsideClick: true, ignoreClicksOnByClass: overlayIgnoredClasses, onClose: onCloseDialog, positionType: "fixed", children: _jsx(IntlWrapper, { locale: locale, children: _jsxs(DrillDialog, { insight: insight, widget: widget, insightTitle: baseInsightTitle, isBackButtonVisible: breadcrumbs.length > 1, onBackButtonClick: onBackButtonClick, onCloseDialog: onCloseDialog, breadcrumbs: breadcrumbs, exportAvailable: exportXLSXEnabled || exportCSVEnabled, exportXLSXEnabled: exportXLSXEnabled, exportCSVEnabled: exportCSVEnabled, exportCSVRawEnabled: exportCSVRawEnabled, exportPDFEnabled: exportPdfTabularEnabled, exportPDFVisible: isExportPdfTabularVisible, enableDrillDescription: enableDrillDescription, onExportXLSX: onExportXLSX, onExportCSV: onExportCSV, onExportCSVRaw: onExportRawCSV, onExportPDF: onExportPdfTabular, isLoading: isLoading, isExporting: isExporting, isExportRawVisible: isExportRawVisible, isShowAsTableVisible: isShowAsTableVisible, isWidgetAsTable: drillDialogIsAsTable, onShowAsTable: toggleWidgetAsTable, focusCheckFn: isNotDocumentFocused, accessibilityConfig: {
99
102
  dialogId,
100
- }, children: _jsx(WithDrillSelect, { widgetRef: widget.ref, insight: props.insight, returnFocusToInsight: returnFocusToInsight, onDrillStart: onDrillStart, onDrillDownSuccess: onDrillDown, children: ({ onDrill }) => {
101
- return description && enableDrillDescription ? (_jsxs("div", { className: "drill-dialog-insight-container", children: [
102
- _jsxs("div", { className: "drill-dialog-insight-container-insight", children: [
103
- _jsx(InsightDrillDialogDescriptionButton, { isOpen: isOpen, isMobileDevice: isMobileDevice, setIsOpen: setIsOpen, descriptionId: descriptionId }), _jsx(DrillDialogInsight, { ...props, onDrill: onDrill, onLoadingChanged: handleLoadingChanged, onError: executionsHandler.onError, onWidgetFiltersReady: handleFiltersReady, pushData: executionsHandler.onPushData, ErrorComponent: ErrorComponent, LoadingComponent: LoadingComponent, drillStep: drillStep, isWidgetAsTable: drillDialogIsAsTable })
104
- ] }), _jsx(InsightDrillDialogDescriptionContent, { id: descriptionId, isOpen: isOpen, isMobileDevice: isMobileDevice, description: description, widgetFilters: widgetFilters, LoadingComponent: LoadingComponent })
105
- ] })) : (_jsx(DrillDialogInsight, { ...props, onDrill: onDrill, onLoadingChanged: handleLoadingChanged, onError: executionsHandler.onError, pushData: executionsHandler.onPushData, ErrorComponent: ErrorComponent, LoadingComponent: LoadingComponent, drillStep: drillStep, isWidgetAsTable: drillDialogIsAsTable }));
106
- } }) }) }) }) }));
103
+ }, children: [
104
+ _jsx(WithDrillSelect, { widgetRef: widget.ref, insight: props.insight, returnFocusToInsight: returnFocusToInsight, onDrillStart: onDrillStart, onDrillDownSuccess: onDrillDown, children: ({ onDrill }) => {
105
+ return description && enableDrillDescription ? (_jsxs("div", { className: "drill-dialog-insight-container", children: [
106
+ _jsxs("div", { className: "drill-dialog-insight-container-insight", children: [
107
+ _jsx(InsightDrillDialogDescriptionButton, { isOpen: isOpen, isMobileDevice: isMobileDevice, setIsOpen: setIsOpen, descriptionId: descriptionId }), _jsx(DrillDialogInsight, { ...props, onDrill: onDrill, onLoadingChanged: handleLoadingChanged, onError: executionsHandler.onError, onWidgetFiltersReady: handleFiltersReady, pushData: executionsHandler.onPushData, ErrorComponent: ErrorComponent, LoadingComponent: LoadingComponent, drillStep: drillStep, isWidgetAsTable: drillDialogIsAsTable })
108
+ ] }), _jsx(InsightDrillDialogDescriptionContent, { id: descriptionId, isOpen: isOpen, isMobileDevice: isMobileDevice, description: description, widgetFilters: widgetFilters, LoadingComponent: LoadingComponent })
109
+ ] })) : (_jsx(DrillDialogInsight, { ...props, onDrill: onDrill, onLoadingChanged: handleLoadingChanged, onError: executionsHandler.onError, pushData: executionsHandler.onPushData, ErrorComponent: ErrorComponent, LoadingComponent: LoadingComponent, drillStep: drillStep, isWidgetAsTable: drillDialogIsAsTable }));
110
+ } }), limitBreaks.length > 0 && executionResult ? (_jsx(InsightWidgetWarningPartialResult, { className: "gd-warning-partial-result", limitBreaks: limitBreaks, onExportRawCSV: onExportRawCSV, isExporting: isExporting, isExportRawVisible: isExportRawVisible, isLoading: executionResult?.isLoading, executionResult: executionResult })) : null] }) }) }) }));
107
111
  }
108
112
  function InsightDrillDialogDescriptionButton({ isOpen, isMobileDevice, setIsOpen, descriptionId, }) {
109
113
  const { formatMessage } = useIntl();
@@ -13,7 +13,6 @@ export interface IMenuItemData {
13
13
  }
14
14
  export type IMenuItem = IUiMenuItem<IMenuItemData>;
15
15
  export type IMenuInteractiveItem = IUiMenuInteractiveItem<IMenuItemData>;
16
- export declare const DRILL_MODAL_EXECUTION_PSEUDO_REF: import("@gooddata/sdk-model").IdentifierRef;
17
16
  export declare const itemMessages: {
18
17
  xlsx: {
19
18
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useDrillDialogExportItems.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogExportItems.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAOpG,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE;QACT,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB;;WAEG;QACH,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,QAAQ,CAAC;KAClB,CAAC;CACL;AAED,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;AACnD,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;AAEzE,eAAO,MAAM,gCAAgC,6CAA6B,CAAC;AAE3E,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAKvB,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;4BA6HrC,CAAC"}
1
+ {"version":3,"file":"useDrillDialogExportItems.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogExportItems.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,sBAAsB,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQpG,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE;QACT,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB;;WAEG;QACH,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,QAAQ,CAAC;KAClB,CAAC;CACL;AAED,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,CAAC;AACnD,MAAM,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;AAEzE,eAAO,MAAM,YAAY;;;;;;;;;;;;;CAKvB,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;4BAgJrC,CAAC"}
@@ -1,12 +1,11 @@
1
1
  // (C) 2025-2026 GoodData Corporation
2
2
  import { useMemo } from "react";
3
3
  import { defineMessages, useIntl } from "react-intl";
4
- import { idRef } from "@gooddata/sdk-model";
5
4
  import { useDashboardSelector } from "../../../../../model/react/DashboardStoreProvider.js";
6
5
  import { selectSettings } from "../../../../../model/store/config/configSelectors.js";
6
+ import { DRILL_MODAL_EXECUTION_PSEUDO_REF } from "../../../../../model/store/executionResults/constants.js";
7
7
  import { selectExecutionResultByRef } from "../../../../../model/store/executionResults/executionResultsSelectors.js";
8
8
  import { getExportTooltipId } from "../../../insightMenu/DefaultDashboardInsightMenu/getExportTooltips.js";
9
- export const DRILL_MODAL_EXECUTION_PSEUDO_REF = idRef("@@GDC_DRILL_MODAL");
10
9
  export const itemMessages = defineMessages({
11
10
  xlsx: { id: "widget.drill.dialog.exportToXLSX" },
12
11
  csvFormatted: { id: "widget.drill.dialog.exportToCSV.formatted" },
@@ -20,6 +19,14 @@ export const useDrillDialogExportItems = ({ isExporting, isDropdownDisabled, isE
20
19
  const disabledTooltip = formatMessage({
21
20
  id: getExportTooltipId({ execution, isExporting, isRawExportsEnabled: settings?.enableRawExports }),
22
21
  });
22
+ // When the drilled execution reached a result limit, formatted exports (XLSX, formatted CSV, PDF) can
23
+ // only contain partial data and are disabled with an explanatory tooltip. Raw CSV is unaffected (it runs
24
+ // a separate full execution). An in-progress export takes priority over the limit message (disabledTooltip
25
+ // already resolves to the in-progress reason while exporting).
26
+ const hasLimitBreaks = (execution?.limitBreaks?.length ?? 0) > 0;
27
+ const formattedExportTooltip = !isExporting && hasLimitBreaks
28
+ ? formatMessage({ id: "options.menu.export.partialResults.exportDisabled" })
29
+ : disabledTooltip;
23
30
  return useMemo(() => {
24
31
  const allItems = [
25
32
  {
@@ -28,12 +35,12 @@ export const useDrillDialogExportItems = ({ isExporting, isDropdownDisabled, isE
28
35
  action: onExportXLSX,
29
36
  className: "s-export-drilled-insight-xlsx gd-icon-type-sheet",
30
37
  dataTestId: "s-export-drilled-insight-xlsx",
31
- disabledTooltip,
38
+ disabledTooltip: formattedExportTooltip,
32
39
  icon: "fileXlsx",
33
40
  },
34
41
  id: "xlsx",
35
42
  stringTitle: formatMessage({ id: itemMessages.xlsx.id }),
36
- isDisabled: !isExportXLSXEnabled,
43
+ isDisabled: !isExportXLSXEnabled || hasLimitBreaks,
37
44
  },
38
45
  ...(isExportPDFVisible
39
46
  ? [
@@ -43,12 +50,12 @@ export const useDrillDialogExportItems = ({ isExporting, isDropdownDisabled, isE
43
50
  action: onExportPDF,
44
51
  className: "s-export-drilled-insight-pdf gd-icon-type-pdf",
45
52
  dataTestId: "s-export-drilled-insight-pdf",
46
- disabledTooltip,
53
+ disabledTooltip: formattedExportTooltip,
47
54
  icon: "filePdf",
48
55
  },
49
56
  id: "pdf",
50
57
  stringTitle: formatMessage({ id: itemMessages.pdf.id }),
51
- isDisabled: !isExportPDFEnabled,
58
+ isDisabled: !isExportPDFEnabled || hasLimitBreaks,
52
59
  },
53
60
  ]
54
61
  : []),
@@ -58,12 +65,12 @@ export const useDrillDialogExportItems = ({ isExporting, isDropdownDisabled, isE
58
65
  action: onExportCSV,
59
66
  className: "s-export-drilled-insight-csv-formatted gd-icon-type-csv-formatted",
60
67
  dataTestId: "s-export-drilled-insight-csv-formatted",
61
- disabledTooltip,
68
+ disabledTooltip: formattedExportTooltip,
62
69
  icon: "fileCsvFormatted",
63
70
  },
64
71
  id: "csv-formatted",
65
72
  stringTitle: formatMessage({ id: itemMessages.csvFormatted.id }),
66
- isDisabled: !isExportCSVEnabled,
73
+ isDisabled: !isExportCSVEnabled || hasLimitBreaks,
67
74
  },
68
75
  {
69
76
  type: "interactive",
@@ -85,6 +92,12 @@ export const useDrillDialogExportItems = ({ isExporting, isDropdownDisabled, isE
85
92
  if (isDropdownDisabled) {
86
93
  return [];
87
94
  }
95
+ // When the execution reached a result limit, keep the (disabled) formatted export items in the menu
96
+ // so the user sees they are unavailable because of the limit, instead of hiding them.
97
+ if (hasLimitBreaks) {
98
+ return allItems;
99
+ }
100
+ // Otherwise, when raw exports are not shown, disabled items are hidden as usual.
88
101
  return allItems.filter((item) => !item.isDisabled);
89
102
  }, [
90
103
  formatMessage,
@@ -100,5 +113,7 @@ export const useDrillDialogExportItems = ({ isExporting, isDropdownDisabled, isE
100
113
  isExportRawVisible,
101
114
  isDropdownDisabled,
102
115
  disabledTooltip,
116
+ formattedExportTooltip,
117
+ hasLimitBreaks,
103
118
  ]);
104
119
  };
@@ -9,7 +9,7 @@ export const DashboardInsightMenuItemButton = (props) => {
9
9
  function renderButtonWithTooltip(button, disabled, tooltip, isFocused) {
10
10
  if (tooltip && disabled) {
11
11
  return (_jsxs(_Fragment, { children: [
12
- _jsx(UiTooltip, { triggerBy: isFocused ? [] : ["hover", "focus"], arrowPlacement: "right", optimalPlacement: true, content: tooltip, anchor: button }), _jsx("div", { className: "sr-only", "aria-live": "polite", children: tooltip })
12
+ _jsx(UiTooltip, { triggerBy: isFocused ? [] : ["hover", "focus"], arrowPlacement: "left", optimalPlacement: true, content: tooltip, anchor: button }), _jsx("div", { className: "sr-only", "aria-live": "polite", children: tooltip })
13
13
  ] }));
14
14
  }
15
15
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"getDefaultInsightMenuItems.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/widget/insightMenu/DefaultDashboardInsightMenu/getDefaultInsightMenuItems.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,mDAAmD,CAAC;AAElG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAuKxD;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,qBAAqB,EAC7B,SAAS,CAAC,EAAE,wBAAwB,GACrC,gBAAgB,EAAE,CA2MpB"}
1
+ {"version":3,"file":"getDefaultInsightMenuItems.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/widget/insightMenu/DefaultDashboardInsightMenu/getDefaultInsightMenuItems.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,mDAAmD,CAAC;AAElG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AA8MxD;;GAEG;AACH,wBAAgB,0BAA0B,CACtC,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,qBAAqB,EAC7B,SAAS,CAAC,EAAE,wBAAwB,GACrC,gBAAgB,EAAE,CAuOpB"}