@gooddata/sdk-ui-dashboard 11.41.0-alpha.1 → 11.41.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE +1294 -1498
- package/esm/__version.d.ts +1 -1
- package/esm/__version.js +1 -1
- package/esm/index.d.ts +2 -2
- package/esm/index.js +1 -1
- package/esm/model/commandHandlers/dashboard/exportDashboardToPdfHandler.js +4 -0
- package/esm/model/commandHandlers/dashboard/exportDashboardToPdfPresentationHandler.js +5 -0
- package/esm/model/commandHandlers/dashboard/exportDashboardToPptPresentationHandler.js +5 -0
- package/esm/model/commandHandlers/drill/drillToDashboardHandler.js +3 -1
- package/esm/model/commandHandlers/tabs/switchDashboardTabHandler.js +2 -2
- package/esm/model/commandHandlers/widgets/exportImageInsightWidgetHandler.js +5 -0
- package/esm/model/commandHandlers/widgets/exportSlidesInsightWidgetHandler.js +5 -0
- package/esm/model/commands/executionResults.d.ts +2 -2
- package/esm/model/commands/executionResults.js +5 -2
- package/esm/model/commands/tabs.d.ts +24 -1
- package/esm/model/commands/tabs.js +4 -1
- package/esm/model/events/tabs.d.ts +12 -1
- package/esm/model/events/tabs.js +4 -1
- package/esm/model/react/useWidgetExecutionsHandler.d.ts +2 -2
- package/esm/model/react/useWidgetExecutionsHandler.js +8 -3
- package/esm/model/store/config/configSelectors.js +1 -1
- package/esm/model/store/executionResults/executionResultsSelectors.d.ts +18 -1
- package/esm/model/store/executionResults/executionResultsSelectors.js +16 -0
- package/esm/model/store/executionResults/types.d.ts +7 -1
- package/esm/model/store/executionResults/types.js +1 -1
- package/esm/model/store/tabs/filterContext/filterContextUtils.js +5 -2
- package/esm/model/store/tabs/parameters/parametersHelpers.d.ts +4 -5
- package/esm/model/store/tabs/parameters/parametersSelectors.d.ts +2 -3
- package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/es-419.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +1 -1
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +1 -1
- package/esm/sdk-ui-dashboard.d.ts +67 -6
- package/esm/tsdoc-metadata.json +1 -1
- package/package.json +21 -21
- package/styles/css/main.css +0 -5
- package/styles/css/main.css.map +1 -1
- package/styles/css/sidebar.css +0 -5
- package/styles/css/sidebar.css.map +1 -1
- package/styles/scss/sidebar.scss +0 -8
package/esm/__version.d.ts
CHANGED
package/esm/__version.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// (C) 2021 GoodData Corporation
|
|
2
2
|
// DO NOT CHANGE THIS FILE, IT IS RE-GENERATED ON EVERY BUILD
|
|
3
|
-
export const LIB_VERSION = "11.41.0-alpha.
|
|
3
|
+
export const LIB_VERSION = "11.41.0-alpha.3";
|
|
4
4
|
export const LIB_DESCRIPTION = "GoodData SDK - Dashboard Component";
|
|
5
5
|
export const LIB_NAME = "@gooddata/sdk-ui-dashboard";
|
package/esm/index.d.ts
CHANGED
|
@@ -57,7 +57,7 @@ export { type IChangeRenderMode, type IChangeRenderModePayload, type IRenderMode
|
|
|
57
57
|
export { type IChangeDashboardDensity, type IChangeDashboardDensityPayload, changeDashboardDensity, type IRequestOpenDensityDialog, requestOpenDensityDialog, } from "./model/commands/density.js";
|
|
58
58
|
export { type IAddDrillTargets, type IAddDrillTargetsPayload, addDrillTargets, } from "./model/commands/drillTargets.js";
|
|
59
59
|
export { type ISetShowWidgetAsTable, type ISetShowWidgetAsTablePayload, setShowWidgetAsTable, } from "./model/commands/showWidgetAsTable.js";
|
|
60
|
-
export { type ISwitchDashboardTab, type ISwitchDashboardTabPayload, type ICreateDashboardTab, type ICreateDashboardTabPayload, type IRepositionDashboardTab, type IRepositionDashboardTabPayload, type IDeleteDashboardTab, type IDeleteDashboardTabPayload, type IStartRenamingDashboardTab, type IStartRenamingDashboardTabPayload, type ICancelRenamingDashboardTab, type ICancelRenamingDashboardTabPayload, type IRenameDashboardTab, type IRenameDashboardTabPayload, switchDashboardTab, repositionDashboardTab, createDashboardTab, deleteDashboardTab, startRenamingDashboardTab, cancelRenamingDashboardTab, renameDashboardTab, } from "./model/commands/tabs.js";
|
|
60
|
+
export { type ISwitchDashboardTab, type ISwitchDashboardTabPayload, type DashboardTabSwitchSource, type ICreateDashboardTab, type ICreateDashboardTabPayload, type IRepositionDashboardTab, type IRepositionDashboardTabPayload, type IDeleteDashboardTab, type IDeleteDashboardTabPayload, type IStartRenamingDashboardTab, type IStartRenamingDashboardTabPayload, type ICancelRenamingDashboardTab, type ICancelRenamingDashboardTabPayload, type IRenameDashboardTab, type IRenameDashboardTabPayload, switchDashboardTab, repositionDashboardTab, createDashboardTab, deleteDashboardTab, startRenamingDashboardTab, cancelRenamingDashboardTab, renameDashboardTab, } from "./model/commands/tabs.js";
|
|
61
61
|
export { type IChangeParameterValues, type IChangeParameterValuesPayload, type ChangeParameterValuesParams, changeParameterValues, } from "./model/commands/parameters.js";
|
|
62
62
|
export { type IDashboardEvent, type DashboardEventType, type ICustomDashboardEvent, type DashboardEventBody, isDashboardEvent, isCustomDashboardEvent, isDashboardEventOrCustomDashboardEvent, } from "./model/events/base.js";
|
|
63
63
|
export { type DateFilterValidationFailed, type DateFilterValidationFailedPayload, type DashboardInitialized, type DashboardInitializedPayload, type DashboardDeinitialized, type DashboardDeinitializedPayload, type DashboardSaved, type DashboardSavedPayload, type DashboardCopySaved, type DashboardCopySavedPayload, type IDashboardRenamed, type IDashboardRenamedPayload, type IDashboardWasReset, type IDashboardWasResetPayload, type IDashboardDeleted, type IDashboardDeletedPayload, type IDashboardExportToPdfRequested, type IDashboardExportToPdfResolved, type IDashboardExportToPdfResolvedPayload, type DashboardSharingChanged, type DashboardSharingChangedPayload, type IDashboardExportToExcelRequested, type IDashboardExportToExcelResolved, type IDashboardExportToPdfPresentationRequested, type IDashboardExportToPdfPresentationResolved, type IDashboardExportToPptPresentationRequested, type IDashboardExportToPptPresentationResolved, type IDashboardExportToExcelResolvedPayload, type IDashboardExportToPdfPresentationResolvedPayload, type IDashboardExportToPptPresentationResolvedPayload, type IDashboardIgnoreExecutionTimestampChanged, type IDashboardIgnoreExecutionTimestampChangedPayload, type IDashboardExportToImageRequested, type IDashboardExportToImageResolved, type IDashboardExportToImageResolvedPayload, isDashboardSaved, isDashboardCopySaved, isDashboardInitialized, isDashboardDeinitialized, isDashboardRenamed, isDashboardWasReset, isDashboardDeleted, isDateFilterValidationFailed, isDashboardExportToPdfRequested, isDashboardExportToPdfResolved, isDashboardSharingChanged, isDashboardExportToExcelRequested, isDashboardExportToExcelResolved, isDashboardExportToPdfPresentationRequested, isDashboardExportToPdfPresentationResolved, isDashboardExportToPptPresentationResolved, isDashboardExportToPptPresentationRequested, isDashboardExportToImageRequested, isDashboardExportToImageResolved, isDashboardIgnoreExecutionTimestampChanged, } from "./model/events/dashboard.js";
|
|
@@ -156,7 +156,7 @@ export { selectAccessibleDashboards, selectAccessibleDashboardsLoaded, selectAcc
|
|
|
156
156
|
export { selectInaccessibleDashboards, selectInaccessibleDashboardsMap, } from "./model/store/inaccessibleDashboards/inaccessibleDashboardsSelectors.js";
|
|
157
157
|
export { selectDrillTargetsByWidgetRef, selectDrillTargets, } from "./model/store/drillTargets/drillTargetsSelectors.js";
|
|
158
158
|
export type { IDrillTargets } from "./model/store/drillTargets/drillTargetsTypes.js";
|
|
159
|
-
export { selectExecutionResult, selectExecutionResultByRef, selectIsExecutionResultExportableToCsvByRef, selectIsExecutionResultExportableToXlsxByRef, selectIsExecutionResultExportableToPdfByRef, selectIsExecutionResultReadyForExportByRef, selectHasSomeExecutionResult, selectIsExecutionResultExportableToCsvRawByRef, } from "./model/store/executionResults/executionResultsSelectors.js";
|
|
159
|
+
export { selectExecutionResult, selectExecutionResultByRef, selectIsExecutionResultExportableToCsvByRef, selectIsExecutionResultExportableToXlsxByRef, selectIsExecutionResultExportableToPdfByRef, selectIsExecutionResultReadyForExportByRef, selectHasSomeExecutionResult, selectIsExecutionResultExportableToCsvRawByRef, selectExecutionResultLimitBreaksByRef, selectHasExecutionResultLimitBreaksByRef, } from "./model/store/executionResults/executionResultsSelectors.js";
|
|
160
160
|
export type { IExecutionResultEnvelope } from "./model/store/executionResults/types.js";
|
|
161
161
|
export type { IUiState, IInvalidCustomUrlDrillParameterInfo, FilterViewDialogMode, } from "./model/store/ui/uiState.js";
|
|
162
162
|
export { selectIsScheduleEmailDialogOpen, selectIsScheduleEmailManagementDialogOpen, selectIsScheduleEmailDialogContext, selectIsScheduleEmailManagementDialogContext, selectIsAlertingManagementDialogContext, selectIsSaveAsDialogOpen, selectIsShareDialogOpen, selectFilterBarExpanded, selectIsKpiAlertOpenedByWidgetRef, selectIsKpiAlertHighlightedByWidgetRef, selectMenuButtonItemsVisibility, selectScheduleEmailDialogReturnFocusTo, selectAlertingDialogReturnFocusTo, selectScheduleEmailDialogDefaultAttachment, selectSelectedWidgetRef, selectConfigurationPanelOpened, selectWidgetDateDatasetAutoSelect, selectIsDeleteDialogOpen, selectIsKpiDeleteDialogOpen, selectKpiDeleteDialogWidgetLayoutPath, selectKpiDeleteDialogWidgetCoordinates, selectInsightListLastUpdateRequested, selectIsWidgetLoadingAdditionalDataByWidgetRef, selectIsFilterAttributeSelectionOpen, selectSelectedFilterIndex, selectIsDraggingWidget, selectActiveSection, selectActiveSectionIndex, selectIsCancelEditModeDialogOpen, selectDraggingWidgetSource, selectDraggingWidgetTargetLayoutPath, selectDraggingWidgetTriggeringDropZoneType, selectDraggingWidgetTarget, selectWidgetsOverlay, selectWidgetsOverlayState, selectWidgetsModification, selectSectionModification, selectIsSectionInsertedByPlugin, selectInvalidDrillWidgetRefs, selectInvalidUrlDrillParameterDrillLocalIdsByWidgetRef, selectInvalidUrlDrillParameterWidgetRefs, selectInvalidUrlDrillParameterWidgetWarnings, selectFilterViewsDialogMode, selectIsFilterViewsDialogOpen, selectIsAlertingDialogOpen, selectIsAlertsManagementDialogOpen, selectIsWidgetDeleteDialogOpen, selectWidgetDeleteDialogWidgetRef, selectIgnoreExecutionTimestamp, selectExecutionTimestamp, selectIsSettingsDialogOpen, selectIsDensityDialogOpen, selectDashboardDensity, selectFilterValidationIncompatibleDefaultFiltersOverride, selectAutomationsInvalidationId, } from "./model/store/ui/uiSelectors.js";
|
package/esm/index.js
CHANGED
|
@@ -112,7 +112,7 @@ export { selectListedDashboards, selectListedDashboardsMap, } from "./model/stor
|
|
|
112
112
|
export { selectAccessibleDashboards, selectAccessibleDashboardsLoaded, selectAccessibleDashboardsMap, } from "./model/store/accessibleDashboards/accessibleDashboardsSelectors.js";
|
|
113
113
|
export { selectInaccessibleDashboards, selectInaccessibleDashboardsMap, } from "./model/store/inaccessibleDashboards/inaccessibleDashboardsSelectors.js";
|
|
114
114
|
export { selectDrillTargetsByWidgetRef, selectDrillTargets, } from "./model/store/drillTargets/drillTargetsSelectors.js";
|
|
115
|
-
export { selectExecutionResult, selectExecutionResultByRef, selectIsExecutionResultExportableToCsvByRef, selectIsExecutionResultExportableToXlsxByRef, selectIsExecutionResultExportableToPdfByRef, selectIsExecutionResultReadyForExportByRef, selectHasSomeExecutionResult, selectIsExecutionResultExportableToCsvRawByRef, } from "./model/store/executionResults/executionResultsSelectors.js";
|
|
115
|
+
export { selectExecutionResult, selectExecutionResultByRef, selectIsExecutionResultExportableToCsvByRef, selectIsExecutionResultExportableToXlsxByRef, selectIsExecutionResultExportableToPdfByRef, selectIsExecutionResultReadyForExportByRef, selectHasSomeExecutionResult, selectIsExecutionResultExportableToCsvRawByRef, selectExecutionResultLimitBreaksByRef, selectHasExecutionResultLimitBreaksByRef, } from "./model/store/executionResults/executionResultsSelectors.js";
|
|
116
116
|
export { selectIsScheduleEmailDialogOpen, selectIsScheduleEmailManagementDialogOpen, selectIsScheduleEmailDialogContext, selectIsScheduleEmailManagementDialogContext, selectIsAlertingManagementDialogContext, selectIsSaveAsDialogOpen, selectIsShareDialogOpen, selectFilterBarExpanded, selectIsKpiAlertOpenedByWidgetRef, selectIsKpiAlertHighlightedByWidgetRef, selectMenuButtonItemsVisibility, selectScheduleEmailDialogReturnFocusTo, selectAlertingDialogReturnFocusTo, selectScheduleEmailDialogDefaultAttachment, selectSelectedWidgetRef, selectConfigurationPanelOpened, selectWidgetDateDatasetAutoSelect, selectIsDeleteDialogOpen, selectIsKpiDeleteDialogOpen, selectKpiDeleteDialogWidgetLayoutPath, selectKpiDeleteDialogWidgetCoordinates, selectInsightListLastUpdateRequested, selectIsWidgetLoadingAdditionalDataByWidgetRef, selectIsFilterAttributeSelectionOpen, selectSelectedFilterIndex, selectIsDraggingWidget, selectActiveSection, selectActiveSectionIndex, selectIsCancelEditModeDialogOpen, selectDraggingWidgetSource, selectDraggingWidgetTargetLayoutPath, selectDraggingWidgetTriggeringDropZoneType, selectDraggingWidgetTarget, selectWidgetsOverlay, selectWidgetsOverlayState, selectWidgetsModification, selectSectionModification, selectIsSectionInsertedByPlugin, selectInvalidDrillWidgetRefs, selectInvalidUrlDrillParameterDrillLocalIdsByWidgetRef, selectInvalidUrlDrillParameterWidgetRefs, selectInvalidUrlDrillParameterWidgetWarnings, selectFilterViewsDialogMode, selectIsFilterViewsDialogOpen, selectIsAlertingDialogOpen, selectIsAlertsManagementDialogOpen, selectIsWidgetDeleteDialogOpen, selectWidgetDeleteDialogWidgetRef, selectIgnoreExecutionTimestamp, selectExecutionTimestamp, selectIsSettingsDialogOpen, selectIsDensityDialogOpen, selectDashboardDensity, selectFilterValidationIncompatibleDefaultFiltersOverride, selectAutomationsInvalidationId, } from "./model/store/ui/uiSelectors.js";
|
|
117
117
|
export { uiActions } from "./model/store/ui/index.js";
|
|
118
118
|
export { selectIsInEditMode, selectIsInExportMode, selectIsInViewMode, selectRenderMode, } from "./model/store/renderMode/renderModeSelectors.js";
|
|
@@ -6,6 +6,7 @@ import { invalidArgumentsProvided } from "../../events/general.js";
|
|
|
6
6
|
import { selectExportResultPollingTimeout } from "../../store/config/configSelectors.js";
|
|
7
7
|
import { selectDashboardRef } from "../../store/meta/metaSelectors.js";
|
|
8
8
|
import { selectFilterContextFilters, selectFiltersByTab, } from "../../store/tabs/filterContext/filterContextSelectors.js";
|
|
9
|
+
import { selectExportEffectiveParameters } from "../../store/tabs/parameters/parametersSelectors.js";
|
|
9
10
|
function exportDashboardToPdf(ctx, dashboardRef, filters, filtersByTab, options) {
|
|
10
11
|
const { backend, workspace } = ctx;
|
|
11
12
|
return backend
|
|
@@ -26,10 +27,13 @@ export function* exportDashboardToPdfHandler(ctx, cmd) {
|
|
|
26
27
|
acc[tabId] = ensureAllTimeFilterForExport(filters);
|
|
27
28
|
return acc;
|
|
28
29
|
}, {});
|
|
30
|
+
// dashboard-scoped export → per-tab parameter overrides (empty when the flag is off)
|
|
31
|
+
const parametersByTab = yield select(selectExportEffectiveParameters(undefined));
|
|
29
32
|
const timeout = yield select(selectExportResultPollingTimeout);
|
|
30
33
|
const options = {
|
|
31
34
|
timeout,
|
|
32
35
|
exportMetadata: cmd.payload?.exportMetadata,
|
|
36
|
+
parametersByTab,
|
|
33
37
|
};
|
|
34
38
|
const result = yield call(exportDashboardToPdf, ctx, dashboardRef, effectiveFilters, effectiveFiltersByTab, options);
|
|
35
39
|
// prepend hostname if provided so that the results are downloaded from there, not from where the app is hosted
|
|
@@ -6,6 +6,7 @@ import { invalidArgumentsProvided } from "../../events/general.js";
|
|
|
6
6
|
import { selectExportResultPollingTimeout } from "../../store/config/configSelectors.js";
|
|
7
7
|
import { selectDashboardRef } from "../../store/meta/metaSelectors.js";
|
|
8
8
|
import { selectFilterContextFilters, selectFiltersByTab, } from "../../store/tabs/filterContext/filterContextSelectors.js";
|
|
9
|
+
import { selectExportEffectiveParameters } from "../../store/tabs/parameters/parametersSelectors.js";
|
|
9
10
|
function exportDashboardToPdfPresentation(ctx, dashboardRef, filters, filtersByTab, options) {
|
|
10
11
|
const { backend, workspace } = ctx;
|
|
11
12
|
return backend
|
|
@@ -26,11 +27,15 @@ export function* exportDashboardToPdfPresentationHandler(ctx, cmd) {
|
|
|
26
27
|
acc[tabId] = ensureAllTimeFilterForExport(filters);
|
|
27
28
|
return acc;
|
|
28
29
|
}, {});
|
|
30
|
+
// dashboard-scoped export → per-tab parameter overrides (empty when the flag is off)
|
|
31
|
+
const parametersByTab = yield select(selectExportEffectiveParameters(undefined));
|
|
29
32
|
const timeout = yield select(selectExportResultPollingTimeout);
|
|
30
33
|
const options = {
|
|
31
34
|
...(cmd.payload?.options ?? {}),
|
|
32
35
|
exportMetadata: cmd.payload?.exportMetadata,
|
|
33
36
|
timeout,
|
|
37
|
+
// explicit caller-provided overrides win; otherwise fall back to the store-derived effective ones
|
|
38
|
+
parametersByTab: cmd.payload?.options?.parametersByTab ?? parametersByTab,
|
|
34
39
|
};
|
|
35
40
|
const result = yield call(exportDashboardToPdfPresentation, ctx, dashboardRef, effectiveFilters, effectiveFiltersByTab, options);
|
|
36
41
|
// prepend hostname if provided so that the results are downloaded from there, not from where the app is hosted
|
|
@@ -6,6 +6,7 @@ import { invalidArgumentsProvided } from "../../events/general.js";
|
|
|
6
6
|
import { selectExportResultPollingTimeout } from "../../store/config/configSelectors.js";
|
|
7
7
|
import { selectDashboardRef } from "../../store/meta/metaSelectors.js";
|
|
8
8
|
import { selectFilterContextFilters, selectFiltersByTab, } from "../../store/tabs/filterContext/filterContextSelectors.js";
|
|
9
|
+
import { selectExportEffectiveParameters } from "../../store/tabs/parameters/parametersSelectors.js";
|
|
9
10
|
function exportDashboardToPptPresentation(ctx, dashboardRef, filters, filtersByTab, options) {
|
|
10
11
|
const { backend, workspace } = ctx;
|
|
11
12
|
return backend
|
|
@@ -26,11 +27,15 @@ export function* exportDashboardToPptPresentationHandler(ctx, cmd) {
|
|
|
26
27
|
acc[tabId] = ensureAllTimeFilterForExport(filters);
|
|
27
28
|
return acc;
|
|
28
29
|
}, {});
|
|
30
|
+
// dashboard-scoped export → per-tab parameter overrides (empty when the flag is off)
|
|
31
|
+
const parametersByTab = yield select(selectExportEffectiveParameters(undefined));
|
|
29
32
|
const timeout = yield select(selectExportResultPollingTimeout);
|
|
30
33
|
const options = {
|
|
31
34
|
...(cmd.payload?.options ?? {}),
|
|
32
35
|
exportMetadata: cmd.payload?.exportMetadata,
|
|
33
36
|
timeout,
|
|
37
|
+
// explicit caller-provided overrides win; otherwise fall back to the store-derived effective ones
|
|
38
|
+
parametersByTab: cmd.payload?.options?.parametersByTab ?? parametersByTab,
|
|
34
39
|
};
|
|
35
40
|
const result = yield call(exportDashboardToPptPresentation, ctx, dashboardRef, effectiveFilters, effectiveFiltersByTab, options);
|
|
36
41
|
// prepend hostname if provided so that the results are downloaded from there, not from where the app is hosted
|
|
@@ -76,7 +76,9 @@ export function* drillToDashboardHandler(ctx, cmd) {
|
|
|
76
76
|
const parameters = collectChangedParameterValues(parameterEntries, workspaceParameters);
|
|
77
77
|
const targetTabLocalIdentifier = cmd.payload.drillDefinition.targetTabLocalIdentifier;
|
|
78
78
|
if (targetTabLocalIdentifier && isDrillingToSelf) {
|
|
79
|
-
|
|
79
|
+
// Mark the switch as drill-originated so saved filter state is not restored over the
|
|
80
|
+
// drill filters on the target tab.
|
|
81
|
+
yield put(switchDashboardTab(targetTabLocalIdentifier, cmd.correlationId, "drillToSelf"));
|
|
80
82
|
}
|
|
81
83
|
// put end event
|
|
82
84
|
return drillToDashboardResolved(ctx, resultingFilters, attributeFilterConfigs, parameters, cmd.payload.drillDefinition, cmd.payload.drillEvent, cmd.correlationId);
|
|
@@ -8,7 +8,7 @@ import { selectActiveTabLocalIdentifier, selectTabs } from "../../store/tabs/tab
|
|
|
8
8
|
* @internal
|
|
9
9
|
*/
|
|
10
10
|
export function* switchDashboardTabHandler(ctx, cmd) {
|
|
11
|
-
const { tabId } = cmd.payload;
|
|
11
|
+
const { tabId, source } = cmd.payload;
|
|
12
12
|
const currentActiveTabId = yield select(selectActiveTabLocalIdentifier);
|
|
13
13
|
const tabs = yield select(selectTabs);
|
|
14
14
|
const newTab = tabs?.find((t) => t.localIdentifier === tabId);
|
|
@@ -19,5 +19,5 @@ export function* switchDashboardTabHandler(ctx, cmd) {
|
|
|
19
19
|
actions.push(tabsActions.setActiveTabLocalIdentifier(newTab.localIdentifier));
|
|
20
20
|
actions.push(tabsActions.clearLayoutHistory());
|
|
21
21
|
yield put(batchActions(actions));
|
|
22
|
-
return dashboardTabSwitched(ctx, currentActiveTabId, tabId, cmd.correlationId);
|
|
22
|
+
return dashboardTabSwitched(ctx, currentActiveTabId, tabId, cmd.correlationId, source);
|
|
23
23
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// (C) 2024-2026 GoodData Corporation
|
|
2
2
|
import { call, select } from "redux-saga/effects";
|
|
3
|
+
import { objRefToString } from "@gooddata/sdk-model";
|
|
3
4
|
import { ensureAllTimeFilterForExport } from "../../../_staging/exportUtils/filterUtils.js";
|
|
4
5
|
import { invalidArgumentsProvided } from "../../events/general.js";
|
|
5
6
|
import { insightWidgetExportResolved, } from "../../events/insight.js";
|
|
6
7
|
import { selectExportResultPollingTimeout } from "../../store/config/configSelectors.js";
|
|
7
8
|
import { selectDashboardRef } from "../../store/meta/metaSelectors.js";
|
|
8
9
|
import { selectFilterContextFilters } from "../../store/tabs/filterContext/filterContextSelectors.js";
|
|
10
|
+
import { selectExportEffectiveParameters } from "../../store/tabs/parameters/parametersSelectors.js";
|
|
9
11
|
import { selectActiveTabLocalIdentifier } from "../../store/tabs/tabsSelectors.js";
|
|
10
12
|
export function* exportImageInsightWidgetHandler(ctx, cmd) {
|
|
11
13
|
const { ref, filename } = cmd.payload;
|
|
@@ -24,11 +26,14 @@ export function* exportImageInsightWidgetHandler(ctx, cmd) {
|
|
|
24
26
|
[activeTabLocalIdentifier]: effectiveFilters,
|
|
25
27
|
}
|
|
26
28
|
: undefined;
|
|
29
|
+
// widget-scoped export → per-tab parameter overrides for this widget (empty when the flag is off)
|
|
30
|
+
const parametersByTab = yield select(selectExportEffectiveParameters([objRefToString(ref)]));
|
|
27
31
|
const exportDashboardToImage = backend.workspace(workspace).dashboards().exportDashboardToImage;
|
|
28
32
|
const result = yield call(exportDashboardToImage, dashboardRef, effectiveFilters, effectiveFiltersByTab, {
|
|
29
33
|
widgetIds: [ref],
|
|
30
34
|
filename,
|
|
31
35
|
timeout,
|
|
36
|
+
parametersByTab,
|
|
32
37
|
});
|
|
33
38
|
// prepend hostname if provided so that the results are downloaded from there, not from where the app is hosted
|
|
34
39
|
const fullUri = ctx.backend.config.hostname
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// (C) 2024-2026 GoodData Corporation
|
|
2
2
|
import { call, select } from "redux-saga/effects";
|
|
3
|
+
import { objRefToString } from "@gooddata/sdk-model";
|
|
3
4
|
import { ensureAllTimeFilterForExport } from "../../../_staging/exportUtils/filterUtils.js";
|
|
4
5
|
import { invalidArgumentsProvided } from "../../events/general.js";
|
|
5
6
|
import { insightWidgetExportResolved, } from "../../events/insight.js";
|
|
6
7
|
import { selectExportResultPollingTimeout } from "../../store/config/configSelectors.js";
|
|
7
8
|
import { selectDashboardRef } from "../../store/meta/metaSelectors.js";
|
|
8
9
|
import { selectFilterContextFilters, selectFiltersByTab, } from "../../store/tabs/filterContext/filterContextSelectors.js";
|
|
10
|
+
import { selectExportEffectiveParameters } from "../../store/tabs/parameters/parametersSelectors.js";
|
|
9
11
|
export function* exportSlidesInsightWidgetHandler(ctx, cmd) {
|
|
10
12
|
const { ref, filename, exportType, templateId } = cmd.payload;
|
|
11
13
|
const { workspace, backend } = ctx;
|
|
@@ -20,6 +22,8 @@ export function* exportSlidesInsightWidgetHandler(ctx, cmd) {
|
|
|
20
22
|
acc[tabId] = ensureAllTimeFilterForExport(filters);
|
|
21
23
|
return acc;
|
|
22
24
|
}, {});
|
|
25
|
+
// widget-scoped export → per-tab parameter overrides for this widget (empty when the flag is off)
|
|
26
|
+
const parametersByTab = yield select(selectExportEffectiveParameters([objRefToString(ref)]));
|
|
23
27
|
const timeout = yield select(selectExportResultPollingTimeout);
|
|
24
28
|
const exportDashboardToPresentation = backend
|
|
25
29
|
.workspace(workspace)
|
|
@@ -29,6 +33,7 @@ export function* exportSlidesInsightWidgetHandler(ctx, cmd) {
|
|
|
29
33
|
filename,
|
|
30
34
|
timeout,
|
|
31
35
|
templateId,
|
|
36
|
+
parametersByTab,
|
|
32
37
|
});
|
|
33
38
|
// prepend hostname if provided so that the results are downloaded from there, not from where the app is hosted
|
|
34
39
|
const fullUri = ctx.backend.config.hostname
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type IExecutionResult } from "@gooddata/sdk-backend-spi";
|
|
2
|
-
import { type IResultWarning, type ObjRef } from "@gooddata/sdk-model";
|
|
2
|
+
import { type IExecutionResultLimitBreak, type IResultWarning, type ObjRef } from "@gooddata/sdk-model";
|
|
3
3
|
import { type GoodDataSdkError } from "@gooddata/sdk-ui";
|
|
4
4
|
import { type IExecutionResultEnvelope } from "../store/executionResults/types.js";
|
|
5
5
|
import { type IDashboardCommand } from "./base.js";
|
|
@@ -29,4 +29,4 @@ export declare function setExecutionResultError(id: ObjRef | string, error: Good
|
|
|
29
29
|
*
|
|
30
30
|
* @beta
|
|
31
31
|
*/
|
|
32
|
-
export declare function setExecutionResultData(id: ObjRef | string, executionResult: IExecutionResult, executionWarnings: IResultWarning[] | undefined, correlationId?: string): IUpsertExecutionResult;
|
|
32
|
+
export declare function setExecutionResultData(id: ObjRef | string, executionResult: IExecutionResult, executionWarnings: IResultWarning[] | undefined, limitBreaks: IExecutionResultLimitBreak[] | undefined, correlationId?: string): IUpsertExecutionResult;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import { serializeObjRef } from "@gooddata/sdk-model";
|
|
2
|
+
import { serializeObjRef, } from "@gooddata/sdk-model";
|
|
3
3
|
function upsertExecutionResult(id, envelopeData, correlationId) {
|
|
4
4
|
return {
|
|
5
5
|
type: "GDC.DASH/CMD.EXECUTION_RESULT.UPSERT",
|
|
@@ -21,6 +21,7 @@ export function setExecutionResultLoading(id, correlationId) {
|
|
|
21
21
|
executionResult: undefined,
|
|
22
22
|
error: undefined,
|
|
23
23
|
warnings: undefined,
|
|
24
|
+
limitBreaks: undefined,
|
|
24
25
|
}, correlationId);
|
|
25
26
|
}
|
|
26
27
|
/**
|
|
@@ -33,6 +34,7 @@ export function setExecutionResultError(id, error, correlationId) {
|
|
|
33
34
|
isLoading: false,
|
|
34
35
|
error,
|
|
35
36
|
warnings: undefined,
|
|
37
|
+
limitBreaks: undefined,
|
|
36
38
|
}, correlationId);
|
|
37
39
|
}
|
|
38
40
|
/**
|
|
@@ -40,11 +42,12 @@ export function setExecutionResultError(id, error, correlationId) {
|
|
|
40
42
|
*
|
|
41
43
|
* @beta
|
|
42
44
|
*/
|
|
43
|
-
export function setExecutionResultData(id, executionResult, executionWarnings, correlationId) {
|
|
45
|
+
export function setExecutionResultData(id, executionResult, executionWarnings, limitBreaks, correlationId) {
|
|
44
46
|
return upsertExecutionResult(id, {
|
|
45
47
|
isLoading: false,
|
|
46
48
|
error: undefined,
|
|
47
49
|
executionResult,
|
|
48
50
|
warnings: executionWarnings,
|
|
51
|
+
limitBreaks,
|
|
49
52
|
}, correlationId);
|
|
50
53
|
}
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import { type IDashboardCommand } from "./base.js";
|
|
2
|
+
/**
|
|
3
|
+
* What triggered a {@link ISwitchDashboardTab} command.
|
|
4
|
+
*
|
|
5
|
+
* Open-ended set of values that may grow over time; treat unknown values defensively. When
|
|
6
|
+
* omitted, the switch is a regular user-initiated tab switch.
|
|
7
|
+
*
|
|
8
|
+
* - `"drillToSelf"` - the switch is part of a drill to the same dashboard targeting a different
|
|
9
|
+
* tab. The drill owns the target tab's filter context, so consumers that restore per-tab filter
|
|
10
|
+
* state on switches (e.g. "Auto-save last state") should skip their restore for it.
|
|
11
|
+
*
|
|
12
|
+
* @alpha
|
|
13
|
+
*/
|
|
14
|
+
export type DashboardTabSwitchSource = "drillToSelf";
|
|
2
15
|
/**
|
|
3
16
|
* Payload of the {@link ISwitchDashboardTab} command.
|
|
4
17
|
* @alpha
|
|
@@ -8,6 +21,14 @@ export interface ISwitchDashboardTabPayload {
|
|
|
8
21
|
* Identifier of the tab to switch to.
|
|
9
22
|
*/
|
|
10
23
|
readonly tabId: string;
|
|
24
|
+
/**
|
|
25
|
+
* What triggered this tab switch.
|
|
26
|
+
*
|
|
27
|
+
* @remarks
|
|
28
|
+
* Omit for a regular user-initiated tab switch. See {@link DashboardTabSwitchSource} for the
|
|
29
|
+
* recognized values and their effect.
|
|
30
|
+
*/
|
|
31
|
+
readonly source?: DashboardTabSwitchSource;
|
|
11
32
|
}
|
|
12
33
|
/**
|
|
13
34
|
* Command to switch to a different dashboard tab.
|
|
@@ -29,11 +50,13 @@ export interface ISwitchDashboardTab extends IDashboardCommand {
|
|
|
29
50
|
*
|
|
30
51
|
* @param tabId - identifier of the tab to switch to
|
|
31
52
|
* @param correlationId - specify correlation id to use for this command
|
|
53
|
+
* @param source - what triggered the switch; omit for a regular user-initiated tab switch.
|
|
54
|
+
* See {@link DashboardTabSwitchSource}.
|
|
32
55
|
* @returns switch dashboard tab command
|
|
33
56
|
*
|
|
34
57
|
* @alpha
|
|
35
58
|
*/
|
|
36
|
-
export declare function switchDashboardTab(tabId: string, correlationId?: string): ISwitchDashboardTab;
|
|
59
|
+
export declare function switchDashboardTab(tabId: string, correlationId?: string, source?: DashboardTabSwitchSource): ISwitchDashboardTab;
|
|
37
60
|
/**
|
|
38
61
|
* Command to reposition a dashboard tab.
|
|
39
62
|
*
|
|
@@ -4,16 +4,19 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @param tabId - identifier of the tab to switch to
|
|
6
6
|
* @param correlationId - specify correlation id to use for this command
|
|
7
|
+
* @param source - what triggered the switch; omit for a regular user-initiated tab switch.
|
|
8
|
+
* See {@link DashboardTabSwitchSource}.
|
|
7
9
|
* @returns switch dashboard tab command
|
|
8
10
|
*
|
|
9
11
|
* @alpha
|
|
10
12
|
*/
|
|
11
|
-
export function switchDashboardTab(tabId, correlationId) {
|
|
13
|
+
export function switchDashboardTab(tabId, correlationId, source) {
|
|
12
14
|
return {
|
|
13
15
|
type: "GDC.DASH/CMD.TAB.SWITCH",
|
|
14
16
|
correlationId,
|
|
15
17
|
payload: {
|
|
16
18
|
tabId,
|
|
19
|
+
source,
|
|
17
20
|
},
|
|
18
21
|
};
|
|
19
22
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DashboardTabSwitchSource } from "../commands/tabs.js";
|
|
1
2
|
import { type DashboardContext } from "../types/commonTypes.js";
|
|
2
3
|
import { type IDashboardEvent } from "./base.js";
|
|
3
4
|
/**
|
|
@@ -13,6 +14,14 @@ export interface IDashboardTabSwitchedPayload {
|
|
|
13
14
|
* Identifier of the newly active tab.
|
|
14
15
|
*/
|
|
15
16
|
readonly newTabId: string;
|
|
17
|
+
/**
|
|
18
|
+
* What triggered this tab switch.
|
|
19
|
+
*
|
|
20
|
+
* @remarks
|
|
21
|
+
* Omit for a regular user-initiated tab switch. See {@link DashboardTabSwitchSource} for the
|
|
22
|
+
* recognized values and their effect.
|
|
23
|
+
*/
|
|
24
|
+
readonly source?: DashboardTabSwitchSource;
|
|
16
25
|
}
|
|
17
26
|
/**
|
|
18
27
|
* This event is emitted when the active dashboard tab is switched.
|
|
@@ -30,11 +39,13 @@ export interface IDashboardTabSwitched extends IDashboardEvent {
|
|
|
30
39
|
* @param previousTabId - identifier of the previously active tab
|
|
31
40
|
* @param newTabId - identifier of the newly active tab
|
|
32
41
|
* @param correlationId - correlation id to use for this event
|
|
42
|
+
* @param source - what triggered the switch; omit for a regular user-initiated tab switch.
|
|
43
|
+
* See {@link DashboardTabSwitchSource}.
|
|
33
44
|
* @returns dashboard tab switched event
|
|
34
45
|
*
|
|
35
46
|
* @alpha
|
|
36
47
|
*/
|
|
37
|
-
export declare function dashboardTabSwitched(ctx: DashboardContext, previousTabId: string | undefined, newTabId: string, correlationId?: string): IDashboardTabSwitched;
|
|
48
|
+
export declare function dashboardTabSwitched(ctx: DashboardContext, previousTabId: string | undefined, newTabId: string, correlationId?: string, source?: DashboardTabSwitchSource): IDashboardTabSwitched;
|
|
38
49
|
/**
|
|
39
50
|
* Type guard that checks if an event is a DashboardTabSwitched event.
|
|
40
51
|
*
|
package/esm/model/events/tabs.js
CHANGED
|
@@ -6,11 +6,13 @@
|
|
|
6
6
|
* @param previousTabId - identifier of the previously active tab
|
|
7
7
|
* @param newTabId - identifier of the newly active tab
|
|
8
8
|
* @param correlationId - correlation id to use for this event
|
|
9
|
+
* @param source - what triggered the switch; omit for a regular user-initiated tab switch.
|
|
10
|
+
* See {@link DashboardTabSwitchSource}.
|
|
9
11
|
* @returns dashboard tab switched event
|
|
10
12
|
*
|
|
11
13
|
* @alpha
|
|
12
14
|
*/
|
|
13
|
-
export function dashboardTabSwitched(ctx, previousTabId, newTabId, correlationId) {
|
|
15
|
+
export function dashboardTabSwitched(ctx, previousTabId, newTabId, correlationId, source) {
|
|
14
16
|
return {
|
|
15
17
|
type: "GDC.DASH/EVT.TAB.SWITCHED",
|
|
16
18
|
ctx,
|
|
@@ -18,6 +20,7 @@ export function dashboardTabSwitched(ctx, previousTabId, newTabId, correlationId
|
|
|
18
20
|
payload: {
|
|
19
21
|
previousTabId,
|
|
20
22
|
newTabId,
|
|
23
|
+
source,
|
|
21
24
|
},
|
|
22
25
|
};
|
|
23
26
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type IExecutionResult } from "@gooddata/sdk-backend-spi";
|
|
2
|
-
import { type IResultWarning, type ObjRef } from "@gooddata/sdk-model";
|
|
2
|
+
import { type IExecutionResultLimitBreak, type IResultWarning, type ObjRef } from "@gooddata/sdk-model";
|
|
3
3
|
import { type IPushData, type OnError, type OnLoadingChanged } from "@gooddata/sdk-ui";
|
|
4
4
|
/**
|
|
5
5
|
* Provides callbacks to integrate with the executionResults slice.
|
|
@@ -8,6 +8,6 @@ import { type IPushData, type OnError, type OnLoadingChanged } from "@gooddata/s
|
|
|
8
8
|
export declare function useWidgetExecutionsHandler(widgetRef: ObjRef): {
|
|
9
9
|
onLoadingChanged: OnLoadingChanged;
|
|
10
10
|
onError: OnError;
|
|
11
|
-
onSuccess: (executionResult: IExecutionResult, warnings: IResultWarning[] | undefined) => void;
|
|
11
|
+
onSuccess: (executionResult: IExecutionResult, warnings: IResultWarning[] | undefined, limitBreaks?: IExecutionResultLimitBreak<import("@gooddata/sdk-model").ExecutionResultLimitType | (string & {})>[] | undefined) => void;
|
|
12
12
|
onPushData: (data: IPushData) => void;
|
|
13
13
|
};
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
import { useCallback } from "react";
|
|
3
3
|
import { setExecutionResultData, setExecutionResultError, setExecutionResultLoading, } from "../commands/executionResults.js";
|
|
4
4
|
import { useDispatchDashboardCommand } from "./useDispatchDashboardCommand.js";
|
|
5
|
+
function getLimitBreaks(dataView) {
|
|
6
|
+
const limitBreaks = dataView.metadata?.limitBreaks;
|
|
7
|
+
return limitBreaks && limitBreaks.length > 0 ? [...limitBreaks] : undefined;
|
|
8
|
+
}
|
|
5
9
|
/**
|
|
6
10
|
* Provides callbacks to integrate with the executionResults slice.
|
|
7
11
|
* @internal
|
|
@@ -13,12 +17,13 @@ export function useWidgetExecutionsHandler(widgetRef) {
|
|
|
13
17
|
const onError = useCallback((error) => {
|
|
14
18
|
setError(widgetRef, error);
|
|
15
19
|
}, [setError, widgetRef]);
|
|
16
|
-
const onSuccess = useCallback((executionResult, warnings) => {
|
|
17
|
-
setData(widgetRef, executionResult, warnings);
|
|
20
|
+
const onSuccess = useCallback((executionResult, warnings, limitBreaks) => {
|
|
21
|
+
setData(widgetRef, executionResult, warnings, limitBreaks);
|
|
18
22
|
}, [setData, widgetRef]);
|
|
19
23
|
const onPushData = useCallback((data) => {
|
|
20
24
|
if (data.dataView) {
|
|
21
|
-
|
|
25
|
+
const limitBreaks = getLimitBreaks(data.dataView);
|
|
26
|
+
onSuccess(data.dataView.result, data.dataView.warnings, limitBreaks);
|
|
22
27
|
}
|
|
23
28
|
}, [onSuccess]);
|
|
24
29
|
const onLoadingChanged = useCallback(({ isLoading }) => {
|
|
@@ -415,7 +415,7 @@ export const selectEnableMatchFilterKD = createSelector(selectConfig, (state) =>
|
|
|
415
415
|
* @alpha
|
|
416
416
|
*/
|
|
417
417
|
export const selectEnableMeasureValueFilterKD = createSelector(selectConfig, (state) => {
|
|
418
|
-
return state.settings?.enableMeasureValueFilterKD ??
|
|
418
|
+
return state.settings?.enableMeasureValueFilterKD ?? true;
|
|
419
419
|
});
|
|
420
420
|
/**
|
|
421
421
|
* Returns available attribute filter modes based on feature flags.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ObjRef } from "@gooddata/sdk-model";
|
|
1
|
+
import { type IExecutionResultLimitBreak, type ObjRef } from "@gooddata/sdk-model";
|
|
2
2
|
import { type DashboardSelector, type DashboardState } from "../types.js";
|
|
3
3
|
import { type IExecutionResultEnvelope } from "./types.js";
|
|
4
4
|
/**
|
|
@@ -10,6 +10,7 @@ export declare const selectExecutionResult: (state: DashboardState, id: import("
|
|
|
10
10
|
executionResult?: import("@gooddata/sdk-backend-spi").IExecutionResult | undefined;
|
|
11
11
|
error?: import("@gooddata/sdk-ui").GoodDataSdkError | undefined;
|
|
12
12
|
warnings?: import("@gooddata/sdk-model").IResultWarning[] | undefined;
|
|
13
|
+
limitBreaks?: IExecutionResultLimitBreak<import("@gooddata/sdk-model").ExecutionResultLimitType | (string & {})>[] | undefined;
|
|
13
14
|
};
|
|
14
15
|
/**
|
|
15
16
|
* @alpha
|
|
@@ -19,6 +20,22 @@ export declare const selectHasSomeExecutionResult: DashboardSelector<boolean>;
|
|
|
19
20
|
* @alpha
|
|
20
21
|
*/
|
|
21
22
|
export declare const selectExecutionResultByRef: (ref: ObjRef | undefined) => DashboardSelector<IExecutionResultEnvelope | undefined>;
|
|
23
|
+
/**
|
|
24
|
+
* Selects the execution result limit breaks for the widget with the given ref.
|
|
25
|
+
*
|
|
26
|
+
* @remarks
|
|
27
|
+
* Limit breaks indicate that the widget's execution hit a row/column/cell limit and only partial
|
|
28
|
+
* data was returned. Returns an empty array when there are no limit breaks or the result is not available.
|
|
29
|
+
*
|
|
30
|
+
* @alpha
|
|
31
|
+
*/
|
|
32
|
+
export declare const selectExecutionResultLimitBreaksByRef: (ref: ObjRef | undefined) => DashboardSelector<IExecutionResultLimitBreak[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Selects whether the widget with the given ref returned partial data because an execution limit was reached.
|
|
35
|
+
*
|
|
36
|
+
* @alpha
|
|
37
|
+
*/
|
|
38
|
+
export declare const selectHasExecutionResultLimitBreaksByRef: (ref: ObjRef | undefined) => DashboardSelector<boolean>;
|
|
22
39
|
/**
|
|
23
40
|
* @alpha
|
|
24
41
|
*/
|
|
@@ -32,6 +32,22 @@ export const selectExecutionResultByRef = createMemoizedSelector((ref) => create
|
|
|
32
32
|
const key = serializeObjRef(ref);
|
|
33
33
|
return executionResults[key];
|
|
34
34
|
}));
|
|
35
|
+
/**
|
|
36
|
+
* Selects the execution result limit breaks for the widget with the given ref.
|
|
37
|
+
*
|
|
38
|
+
* @remarks
|
|
39
|
+
* Limit breaks indicate that the widget's execution hit a row/column/cell limit and only partial
|
|
40
|
+
* data was returned. Returns an empty array when there are no limit breaks or the result is not available.
|
|
41
|
+
*
|
|
42
|
+
* @alpha
|
|
43
|
+
*/
|
|
44
|
+
export const selectExecutionResultLimitBreaksByRef = createMemoizedSelector((ref) => createSelector(selectExecutionResultByRef(ref), (widgetExecution) => widgetExecution?.limitBreaks ?? []));
|
|
45
|
+
/**
|
|
46
|
+
* Selects whether the widget with the given ref returned partial data because an execution limit was reached.
|
|
47
|
+
*
|
|
48
|
+
* @alpha
|
|
49
|
+
*/
|
|
50
|
+
export const selectHasExecutionResultLimitBreaksByRef = createMemoizedSelector((ref) => createSelector(selectExecutionResultLimitBreaksByRef(ref), (limitBreaks) => limitBreaks.length > 0));
|
|
35
51
|
/**
|
|
36
52
|
* @alpha
|
|
37
53
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type IExecutionResult } from "@gooddata/sdk-backend-spi";
|
|
2
|
-
import { type IResultWarning } from "@gooddata/sdk-model";
|
|
2
|
+
import { type IExecutionResultLimitBreak, type IResultWarning } from "@gooddata/sdk-model";
|
|
3
3
|
import { type GoodDataSdkError } from "@gooddata/sdk-ui";
|
|
4
4
|
/**
|
|
5
5
|
* @beta
|
|
@@ -10,4 +10,10 @@ export interface IExecutionResultEnvelope {
|
|
|
10
10
|
executionResult?: IExecutionResult;
|
|
11
11
|
error?: GoodDataSdkError;
|
|
12
12
|
warnings?: IResultWarning[];
|
|
13
|
+
/**
|
|
14
|
+
* Limits broken during result computation, causing partial data to be returned for this widget.
|
|
15
|
+
*
|
|
16
|
+
* @alpha
|
|
17
|
+
*/
|
|
18
|
+
limitBreaks?: IExecutionResultLimitBreak[];
|
|
13
19
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
// (C) 2021-
|
|
1
|
+
// (C) 2021-2026 GoodData Corporation
|
|
2
2
|
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
2
|
import { partition } from "lodash-es";
|
|
3
|
-
import { areObjRefsEqual, dashboardAttributeFilterItemLocalIdentifier, dashboardFilterLocalIdentifier, dashboardMeasureValueFilterLocalIdentifier,
|
|
3
|
+
import { areObjRefsEqual, dashboardAttributeFilterItemLocalIdentifier, dashboardFilterLocalIdentifier, dashboardMeasureValueFilterLocalIdentifier, isDashboardArbitraryAttributeFilter, isDashboardAttributeFilter, isDashboardAttributeFilterItem, isDashboardCommonDateFilter, isDashboardDateFilter, isDashboardMatchAttributeFilter, isDashboardMeasureValueFilter, isNoopAllTimeDashboardDateFilter, objRefToString, } from "@gooddata/sdk-model";
|
|
4
4
|
import { generateFilterLocalIdentifier } from "../../_infra/generators.js";
|
|
5
5
|
/**
|
|
6
6
|
* Deeply merges partial working filter context into filter context definition.
|
|
@@ -97,7 +97,10 @@ export function applyFilterContext(filterContext, workingFilterContext, enableIm
|
|
|
97
97
|
const workingCommonDateFilter = workingFilterContext?.filters.find(isDashboardCommonDateFilter);
|
|
98
98
|
if (appliedCommonDateFilter ||
|
|
99
99
|
!workingCommonDateFilter ||
|
|
100
|
-
|
|
100
|
+
// Drop the working common date filter only when it is a true no-op All time filter.
|
|
101
|
+
// An All time filter that carries `emptyValueHandling` (the "Empty values" preset) is a
|
|
102
|
+
// meaningful change and must be kept, otherwise the dashboard would not detect it as changed.
|
|
103
|
+
(isNoopAllTimeDashboardDateFilter(workingCommonDateFilter) && !appliedCommonDateFilter)) {
|
|
101
104
|
return {
|
|
102
105
|
...filterContext,
|
|
103
106
|
filters,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type IDashboardParameter, type IDashboardTab, type IInsight, type IInsightDefinition, type IInsightParameterValue, type IParameterMetadataObject, type IdentifierRef } from "@gooddata/sdk-model";
|
|
1
|
+
import { type IDashboardExportParameter, type IDashboardParameter, type IDashboardTab, type IInsight, type IInsightDefinition, type IInsightParameterValue, type IParameterMetadataObject, type IdentifierRef } from "@gooddata/sdk-model";
|
|
3
2
|
import { type ObjRefMap } from "../../../../_staging/metadata/objRefMap.js";
|
|
4
3
|
import { type IInsightWidgetTabContext } from "../layout/layoutSelectors.js";
|
|
5
4
|
import { type ITabState } from "../tabsState.js";
|
|
@@ -7,7 +6,7 @@ import { type IDashboardParameterEntry } from "./parametersState.js";
|
|
|
7
6
|
/**
|
|
8
7
|
* @internal
|
|
9
8
|
*/
|
|
10
|
-
export declare const EMPTY_EXPORT_PARAMETERS: Record<string,
|
|
9
|
+
export declare const EMPTY_EXPORT_PARAMETERS: Record<string, IDashboardExportParameter[]>;
|
|
11
10
|
/**
|
|
12
11
|
* Walks the insight's metric buckets and returns the parameter refs they reference,
|
|
13
12
|
* deduped by ref string. The order matches the first occurrence in the measure traversal.
|
|
@@ -48,7 +47,7 @@ export declare function workspaceParametersByRef(workspaceParameters: IParameter
|
|
|
48
47
|
*
|
|
49
48
|
* @internal
|
|
50
49
|
*/
|
|
51
|
-
export declare function formatDashboardParameter(entry: IDashboardParameterEntry, workspaceParameter: IParameterMetadataObject | undefined):
|
|
50
|
+
export declare function formatDashboardParameter(entry: IDashboardParameterEntry, workspaceParameter: IParameterMetadataObject | undefined): IDashboardExportParameter | undefined;
|
|
52
51
|
/**
|
|
53
52
|
* Resolves the persisted shape of a parameter entry against its workspace catalog parameter.
|
|
54
53
|
* Drops `value` when it equals the workspace default; drops `label` when it equals the workspace title.
|
|
@@ -94,7 +93,7 @@ export declare function computeParameterResetTargets(entries: IDashboardParamete
|
|
|
94
93
|
export declare function collectExportOverrides(tabRefSelections: ReadonlyArray<{
|
|
95
94
|
tab: ITabState;
|
|
96
95
|
allowedRefs?: Set<string>;
|
|
97
|
-
}>, workspaceByRef: Map<string, IParameterMetadataObject>): Record<string,
|
|
96
|
+
}>, workspaceByRef: Map<string, IParameterMetadataObject>): Record<string, IDashboardExportParameter[]>;
|
|
98
97
|
/**
|
|
99
98
|
* Builds per-tab ref selections for a widget-scope export: each widget's owning tab is restricted
|
|
100
99
|
* to refs referenced by the widget's insight metrics. Multiple widgets on the same tab union their
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type IDashboardParameter, type IInsightParameterValue, type ObjRef } from "@gooddata/sdk-model";
|
|
1
|
+
import { type IDashboardExportParameter, type IDashboardParameter, type IInsightParameterValue, type ObjRef } from "@gooddata/sdk-model";
|
|
3
2
|
import { type DashboardSelector } from "../../types.js";
|
|
4
3
|
import { type IDashboardParameterEntry } from "./parametersState.js";
|
|
5
4
|
/**
|
|
@@ -130,4 +129,4 @@ export declare const selectEffectiveParameterValuesForWidget: (ref: ObjRef | und
|
|
|
130
129
|
*
|
|
131
130
|
* @alpha
|
|
132
131
|
*/
|
|
133
|
-
export declare const selectExportEffectiveParameters: (widgetIds: string[] | undefined) => DashboardSelector<Record<string,
|
|
132
|
+
export declare const selectExportEffectiveParameters: (widgetIds: string[] | undefined) => DashboardSelector<Record<string, IDashboardExportParameter[]>>;
|
|
@@ -439,7 +439,7 @@ export const de_DE = {
|
|
|
439
439
|
"configurationPanel.vizCantBeFilteredByMeasureValueFilter": "Filtern ist auf diese Visualisierung nicht anwendbar.",
|
|
440
440
|
"configurationPanel.mvfBlockedByRankingFilter": "Dieser Filter kann nicht angewendet werden, weil die Visualisierung einen Top-/Bottom-Werte-Filter verwendet. Entfernen Sie den Top-/Bottom-Werte-Filter, um diesen Filter anzuwenden.",
|
|
441
441
|
"configurationPanel.mvfMissingMeasure": "Die in diesem Filter verwendete Metrik existiert im workspace nicht mehr.",
|
|
442
|
-
"filters.mvf.missingMetric.tooltip": "Die in diesem Filter verwendete Metrik existiert im workspace nicht mehr.",
|
|
442
|
+
"filters.mvf.missingMetric.tooltip": "Fehler: Die in diesem Filter verwendete Metrik existiert im workspace nicht mehr.",
|
|
443
443
|
"configurationPanel.kpiCantBeFilteredByDate": "Leistungskennzahl kann nicht nach Datum gefiltert werden. Markierung des Kontrollfelds entfernen.",
|
|
444
444
|
"configurationPanel.unrelatedVizDateInfo": "\"{dateDataSet}\" kann nicht mehr auf die Visualisierung angewendet werden. Wählen Sie eine andere Dimension oder bearbeiten Sie die Visualisierung.",
|
|
445
445
|
"configurationPanel.unrelatedKpiDateInfo": "\"{dateDataSet}\" kann nicht mehr auf den Leistungskennzahl angewandt werden. Wählen Sie eine andere Dimension oder bearbeiten Sie den Leistungskennzahl.",
|