@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.
- package/esm/__version.d.ts +1 -1
- package/esm/__version.d.ts.map +1 -1
- package/esm/__version.js +1 -1
- package/esm/index.d.ts +1 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -1
- package/esm/model/store/executionResults/constants.d.ts +7 -0
- package/esm/model/store/executionResults/constants.d.ts.map +1 -0
- package/esm/model/store/executionResults/constants.js +8 -0
- package/esm/model/store/executionResults/executionResultsSelectors.d.ts +12 -0
- package/esm/model/store/executionResults/executionResultsSelectors.d.ts.map +1 -1
- package/esm/model/store/executionResults/executionResultsSelectors.js +16 -1
- package/esm/presentation/automations/alerting/DefaultAlertingManagementDialog/DefaultAlertingManagementDialogContentEnhanced.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/DefaultAlertingManagementDialog/DefaultAlertingManagementDialogContentEnhanced.js +5 -2
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialog.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialog.js +13 -2
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialogContentEnhanced.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialogContentEnhanced.js +5 -2
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +8 -44
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/en-US.localization-bundle.js +8 -44
- package/esm/presentation/shareDialog/DefaultShareDialog.d.ts.map +1 -1
- package/esm/presentation/shareDialog/DefaultShareDialog.js +6 -2
- package/esm/presentation/topBar/menuButton/DefaultMenuButton.d.ts.map +1 -1
- package/esm/presentation/topBar/menuButton/DefaultMenuButton.js +39 -16
- package/esm/presentation/topBar/menuButton/types.d.ts +6 -0
- package/esm/presentation/topBar/menuButton/types.d.ts.map +1 -1
- package/esm/presentation/topBar/menuButton/types.js +1 -0
- package/esm/presentation/topBar/menuButton/useDefaultMenuItems.d.ts.map +1 -1
- package/esm/presentation/topBar/menuButton/useDefaultMenuItems.js +7 -0
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogExportDropdown.js +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.d.ts.map +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.js +14 -10
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogExportItems.d.ts +0 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogExportItems.d.ts.map +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/useDrillDialogExportItems.js +23 -8
- package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/DashboardInsightMenuItemButton.js +1 -1
- package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/getDefaultInsightMenuItems.d.ts.map +1 -1
- package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/getDefaultInsightMenuItems.js +56 -27
- package/esm/presentation/widget/widget/warningPartialResult/InsightWidgetWarningPartialResult.d.ts.map +1 -1
- package/esm/presentation/widget/widget/warningPartialResult/InsightWidgetWarningPartialResult.js +4 -89
- package/esm/sdk-ui-dashboard.d.ts +19 -0
- package/package.json +20 -20
- package/styles/css/dashboard.css +3 -1
- package/styles/css/dashboard.css.map +1 -1
- package/styles/css/main.css +28 -5
- package/styles/css/main.css.map +1 -1
- package/styles/css/warningPartialResult.css +1 -0
- package/styles/css/warningPartialResult.css.map +1 -1
- package/styles/scss/dashboard.scss +5 -1
- 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,
|
|
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,
|
|
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 }) =>
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
: () =>
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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":"
|
|
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 @@
|
|
|
1
|
-
{"version":3,"file":"useDefaultMenuItems.d.ts","sourceRoot":"","sources":["../../../../src/presentation/topBar/menuButton/useDefaultMenuItems.tsx"],"names":[],"mappings":"
|
|
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: "
|
|
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,
|
|
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 {
|
|
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:
|
|
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:
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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":"
|
|
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: "
|
|
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;
|
|
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"}
|