@gooddata/sdk-ui-dashboard 11.58.0-alpha.3 → 11.58.0-alpha.4
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.js +1 -1
- package/esm/index.d.ts +2 -2
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +2 -2
- package/esm/internal.d.ts +1 -0
- package/esm/internal.d.ts.map +1 -1
- package/esm/internal.js +1 -0
- package/esm/model/commandHandlers/common/validateDrillToCustomUrlParams.d.ts.map +1 -1
- package/esm/model/commandHandlers/common/validateDrillToCustomUrlParams.js +6 -1
- package/esm/model/commandHandlers/common/validateDrills.d.ts.map +1 -1
- package/esm/model/commandHandlers/common/validateDrills.js +12 -3
- package/esm/model/commandHandlers/dashboard/dashboardDrillReferences.d.ts +4 -0
- package/esm/model/commandHandlers/dashboard/dashboardDrillReferences.d.ts.map +1 -0
- package/esm/model/commandHandlers/dashboard/dashboardDrillReferences.js +53 -0
- package/esm/model/commandHandlers/dashboard/saveAsDashboardHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/saveAsDashboardHandler.js +4 -1
- package/esm/model/commandHandlers/dashboard/saveDashboardHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/saveDashboardHandler.js +30 -6
- package/esm/model/commandHandlers/drill/drillToAttributeUrlHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/drill/drillToAttributeUrlHandler.js +2 -0
- package/esm/model/commandHandlers/drill/drillToCustomUrlHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/drill/drillToCustomUrlHandler.js +2 -0
- package/esm/model/commandHandlers/drill/drillToDashboardHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/drill/drillToDashboardHandler.js +2 -0
- package/esm/model/commandHandlers/drill/drillToInsightHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/drill/drillToInsightHandler.js +3 -1
- package/esm/model/commandHandlers/drill/resolveDrillToCustomUrl.d.ts.map +1 -1
- package/esm/model/commandHandlers/drill/resolveDrillToCustomUrl.js +30 -29
- package/esm/model/commandHandlers/drill/validateDrillAccess.d.ts +6 -0
- package/esm/model/commandHandlers/drill/validateDrillAccess.d.ts.map +1 -0
- package/esm/model/commandHandlers/drill/validateDrillAccess.js +10 -0
- package/esm/model/store/catalog/catalogSelectors.d.ts +26 -1
- package/esm/model/store/catalog/catalogSelectors.d.ts.map +1 -1
- package/esm/model/store/catalog/catalogSelectors.js +13 -2
- package/esm/model/store/filtering/dashboardFilterSelectors.d.ts +8 -2
- package/esm/model/store/filtering/dashboardFilterSelectors.d.ts.map +1 -1
- package/esm/model/store/filtering/dashboardFilterSelectors.js +41 -25
- package/esm/model/store/filtering/types.d.ts +5 -0
- package/esm/model/store/filtering/types.d.ts.map +1 -1
- package/esm/model/store/tabs/layout/layoutSelectors.d.ts.map +1 -1
- package/esm/model/store/tabs/layout/layoutSelectors.js +2 -1
- package/esm/model/store/ui/index.d.ts +1 -0
- package/esm/model/store/ui/index.d.ts.map +1 -1
- package/esm/model/store/ui/uiReducers.d.ts +5 -1
- package/esm/model/store/ui/uiReducers.d.ts.map +1 -1
- package/esm/model/store/ui/uiReducers.js +8 -4
- package/esm/model/store/ui/uiSelectors.d.ts +5 -1
- package/esm/model/store/ui/uiSelectors.d.ts.map +1 -1
- package/esm/model/store/ui/uiSelectors.js +4 -0
- package/esm/model/store/ui/uiState.d.ts +2 -1
- package/esm/model/store/ui/uiState.d.ts.map +1 -1
- package/esm/model/store/ui/uiState.js +1 -0
- package/esm/model/store/widgetDrills/drillRestrictionSelectors.d.ts +23 -0
- package/esm/model/store/widgetDrills/drillRestrictionSelectors.d.ts.map +1 -0
- package/esm/model/store/widgetDrills/drillRestrictionSelectors.js +5 -0
- package/esm/model/store/widgetDrills/drillRestrictionUtils.d.ts +5 -0
- package/esm/model/store/widgetDrills/drillRestrictionUtils.d.ts.map +1 -0
- package/esm/model/store/widgetDrills/drillRestrictionUtils.js +27 -0
- package/esm/model/store/widgetDrills/widgetDrillSelectors.d.ts.map +1 -1
- package/esm/model/store/widgetDrills/widgetDrillSelectors.js +9 -5
- package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.js +1 -0
- package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts +4 -2
- package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.js +12 -3
- package/esm/presentation/automations/alerting/utils/items.js +8 -14
- package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.d.ts.map +1 -1
- package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.js +8 -2
- package/esm/presentation/automations/contexts/AutomationsContext.d.ts +4 -2
- package/esm/presentation/automations/contexts/AutomationsContext.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/hooks/useExportTimezones.js +1 -1
- package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.js +1 -0
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts +4 -2
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.js +25 -6
- package/esm/presentation/automations/shared/automationFilters/components/AutomationFiltersSelect.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/components/AutomationFiltersSelect.js +16 -11
- package/esm/presentation/automations/shared/automationFilters/components/AutomationRestrictedFilters.d.ts +9 -0
- package/esm/presentation/automations/shared/automationFilters/components/AutomationRestrictedFilters.d.ts.map +1 -0
- package/esm/presentation/automations/shared/automationFilters/components/AutomationRestrictedFilters.js +22 -0
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.d.ts +2 -2
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.js +17 -5
- package/esm/presentation/automations/shared/automationFilters/useAutomationFilters.d.ts +8 -0
- package/esm/presentation/automations/shared/automationFilters/useAutomationFilters.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/useAutomationFilters.js +54 -10
- package/esm/presentation/automations/shared/automationFilters/useAutomationFiltersSelect.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/useAutomationFiltersSelect.js +3 -2
- package/esm/presentation/automations/shared/filters/conversions.d.ts +10 -2
- package/esm/presentation/automations/shared/filters/conversions.d.ts.map +1 -1
- package/esm/presentation/automations/shared/filters/conversions.js +15 -6
- package/esm/presentation/dashboardSettingsDialog/DefaultDashboardSettingsDialog.d.ts.map +1 -1
- package/esm/presentation/dashboardSettingsDialog/DefaultDashboardSettingsDialog.js +3 -4
- package/esm/presentation/dashboardSettingsDialog/TimezoneOption.d.ts.map +1 -1
- package/esm/presentation/dashboardSettingsDialog/TimezoneOption.js +20 -7
- package/esm/presentation/dialogs/ExportCsvDialog.d.ts.map +1 -1
- package/esm/presentation/dialogs/ExportCsvDialog.js +2 -1
- package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParametersSections/IdentifierParametersSection.js +1 -1
- package/esm/presentation/drill/DrillSelect/DrillSelectDropdown.d.ts +2 -1
- package/esm/presentation/drill/DrillSelect/DrillSelectDropdown.d.ts.map +1 -1
- package/esm/presentation/drill/DrillSelect/DrillSelectDropdown.js +19 -1
- package/esm/presentation/drill/DrillSelect/WithDrillSelect.d.ts.map +1 -1
- package/esm/presentation/drill/DrillSelect/WithDrillSelect.js +12 -4
- package/esm/presentation/drill/DrillSelect/types.d.ts +1 -0
- package/esm/presentation/drill/DrillSelect/types.d.ts.map +1 -1
- package/esm/presentation/drill/hooks/useDrillSelectDropdownMenuItems.d.ts.map +1 -1
- package/esm/presentation/drill/hooks/useDrillSelectDropdownMenuItems.js +4 -2
- package/esm/presentation/insightNotSavedDialog/InsightNotSavedDialog.d.ts.map +1 -1
- package/esm/presentation/insightNotSavedDialog/InsightNotSavedDialog.js +4 -5
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +21 -1
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/en-US.localization-bundle.js +25 -5
- package/esm/sdk-ui-dashboard.d.ts +20 -19
- package/package.json +21 -21
- package/styles/css/dashboard.css +1 -7
- package/styles/css/dashboard.css.map +1 -1
- package/styles/css/dashboardSettingsDialog.css +4 -0
- package/styles/css/dashboardSettingsDialog.css.map +1 -1
- package/styles/css/export.css +0 -6
- package/styles/css/export.css.map +1 -1
- package/styles/css/main.css +5 -13
- package/styles/css/main.css.map +1 -1
- package/styles/css/notifications_channels_dialog.css +1 -7
- package/styles/css/notifications_channels_dialog.css.map +1 -1
- package/styles/scss/dashboardSettingsDialog.scss +5 -0
- package/styles/scss/export.scss +0 -9
- package/styles/scss/notifications_channels_dialog.scss +1 -10
- package/esm/model/types/drillTypes.d.ts +0 -13
- package/esm/model/types/drillTypes.d.ts.map +0 -1
- package/esm/model/types/drillTypes.js +0 -14
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
2
|
import { batchActions } from "redux-batched-actions";
|
|
3
|
-
import { call, put, select, take } from "redux-saga/effects";
|
|
3
|
+
import { all, call, put, select, take } from "redux-saga/effects";
|
|
4
4
|
import { invariant } from "ts-invariant";
|
|
5
5
|
import { isUnexpectedResponseError } from "@gooddata/sdk-backend-spi";
|
|
6
6
|
import { areObjRefsEqual, insightRef, isTempFilterContext, } from "@gooddata/sdk-model";
|
|
@@ -38,6 +38,7 @@ import { isTemporaryIdentity } from "../../utils/dashboardItemUtils.js";
|
|
|
38
38
|
import { generateTabLocalIdentifier } from "../../utils/tabLocalIdentifier.js";
|
|
39
39
|
import { changeRenderModeHandler } from "../renderMode/changeRenderModeHandler.js";
|
|
40
40
|
import { switchDashboardTabHandler } from "../tabs/switchDashboardTabHandler.js";
|
|
41
|
+
import { dashboardWithDrillReferences } from "./dashboardDrillReferences.js";
|
|
41
42
|
function* persistDraftInsights(ctx, cmd, insights) {
|
|
42
43
|
for (const draftInsight of insights) {
|
|
43
44
|
const persistedInsight = yield call(async () => {
|
|
@@ -73,6 +74,26 @@ function* persistDraftInsights(ctx, cmd, insights) {
|
|
|
73
74
|
yield put(insightsActions.setInsights(updatedInsights));
|
|
74
75
|
}
|
|
75
76
|
}
|
|
77
|
+
async function draftInsightExistsOnBackend(ctx, draftInsight) {
|
|
78
|
+
const ref = insightRef(draftInsight);
|
|
79
|
+
if (!ref) {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
await ctx.backend.workspace(ctx.workspace).insights().getInsight(ref);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (isUnexpectedResponseError(error) && error.httpStatus === 404) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function* getDraftInsightsToPersist(ctx, draftInsightsOnDashboard) {
|
|
94
|
+
const draftInsightsExistenceOnBackend = yield all(draftInsightsOnDashboard.map((draftInsight) => call(draftInsightExistsOnBackend, ctx, draftInsight)));
|
|
95
|
+
return draftInsightsOnDashboard.filter((_, index) => !draftInsightsExistenceOnBackend[index]);
|
|
96
|
+
}
|
|
76
97
|
function createDashboard(ctx, saveCtx) {
|
|
77
98
|
return ctx.backend
|
|
78
99
|
.workspace(ctx.workspace)
|
|
@@ -160,7 +181,7 @@ function processExistingTabs(tabs, parametersByTab, defaultTabNewLocalIdentifier
|
|
|
160
181
|
const tabLayout = tab.layout?.layout;
|
|
161
182
|
const filterContext = tab.filterContext?.filterContextDefinition
|
|
162
183
|
? {
|
|
163
|
-
...
|
|
184
|
+
...tab.filterContext?.filterContextIdentity,
|
|
164
185
|
...tab.filterContext.filterContextDefinition,
|
|
165
186
|
}
|
|
166
187
|
: undefined;
|
|
@@ -300,11 +321,12 @@ function* createDashboardSaveContext(cmd, isNewDashboard) {
|
|
|
300
321
|
...dashboardFromState,
|
|
301
322
|
layout: layout ? dashboardLayoutRemoveIdentity(layout, isTemporaryIdentity) : undefined,
|
|
302
323
|
};
|
|
324
|
+
const insights = yield select(selectInsights);
|
|
303
325
|
return {
|
|
304
326
|
cmd,
|
|
305
327
|
persistedDashboard,
|
|
306
328
|
dashboardFromState,
|
|
307
|
-
dashboardToSave: getDashboardWithSharing(dashboardToSave, capabilities.supportsAccessControl, isNewDashboard),
|
|
329
|
+
dashboardToSave: getDashboardWithSharing(dashboardWithDrillReferences(dashboardToSave, insights), capabilities.supportsAccessControl, isNewDashboard),
|
|
308
330
|
defaultTabNewLocalIdentifier,
|
|
309
331
|
};
|
|
310
332
|
}
|
|
@@ -390,8 +412,10 @@ export function* saveDashboardHandler(ctx, cmd) {
|
|
|
390
412
|
try {
|
|
391
413
|
const isInsightNotSavedDialogSaveConfirmed = yield select(selectIsInsightNotSavedDialogSaveConfirmed);
|
|
392
414
|
const draftInsightsOnDashboard = yield select(selectDraftInsightsUsedOnDashboard);
|
|
415
|
+
const draftInsightsToPersist = yield call(getDraftInsightsToPersist, ctx, draftInsightsOnDashboard);
|
|
393
416
|
let shouldPersistDraftInsights = isInsightNotSavedDialogSaveConfirmed;
|
|
394
|
-
if (
|
|
417
|
+
if (draftInsightsToPersist.length > 0 && !shouldPersistDraftInsights) {
|
|
418
|
+
yield put(uiActions.setInsightNotSavedDialogDraftInsightsToPersist(draftInsightsToPersist));
|
|
395
419
|
yield put(uiActions.openInsightNotSavedDialog());
|
|
396
420
|
const draftInsightDialogAction = yield take([
|
|
397
421
|
uiActions.confirmInsightNotSavedDialogSubmit.type,
|
|
@@ -407,8 +431,8 @@ export function* saveDashboardHandler(ctx, cmd) {
|
|
|
407
431
|
if (isInsightNotSavedDialogOpen) {
|
|
408
432
|
yield put(uiActions.closeInsightNotSavedDialog());
|
|
409
433
|
}
|
|
410
|
-
if (shouldPersistDraftInsights &&
|
|
411
|
-
yield call(persistDraftInsights, ctx, cmd,
|
|
434
|
+
if (shouldPersistDraftInsights && draftInsightsToPersist.length > 0) {
|
|
435
|
+
yield call(persistDraftInsights, ctx, cmd, draftInsightsToPersist);
|
|
412
436
|
}
|
|
413
437
|
const persistedDashboard = yield select(selectPersistedDashboard);
|
|
414
438
|
const isNewDashboard = persistedDashboard === undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drillToAttributeUrlHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToAttributeUrlHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EACH,KAAK,qCAAqC,EAG7C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"drillToAttributeUrlHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToAttributeUrlHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EACH,KAAK,qCAAqC,EAG7C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,wBAAiB,0BAA0B,CACvC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,oBAAoB,GAC1B,YAAY,CAAC,qCAAqC,CAAC,CAiCrD"}
|
|
@@ -5,7 +5,9 @@ import { drillToAttributeUrlRequested, drillToAttributeUrlResolved, } from "../.
|
|
|
5
5
|
import { selectWidgetDrills } from "../../store/tabs/layout/layoutSelectors.js";
|
|
6
6
|
import { getDrillToUrlFiltersWithResolvedValues } from "./getDrillToUrlFilters.js";
|
|
7
7
|
import { resolveDrillToAttributeUrl } from "./resolveDrillToAttributeUrl.js";
|
|
8
|
+
import { validateDrillAccess } from "./validateDrillAccess.js";
|
|
8
9
|
export function* drillToAttributeUrlHandler(ctx, cmd) {
|
|
10
|
+
yield call(validateDrillAccess, ctx, cmd, cmd.payload.drillDefinition);
|
|
9
11
|
yield put(drillToAttributeUrlRequested(ctx, cmd.payload.drillDefinition, cmd.payload.drillEvent, cmd.correlationId));
|
|
10
12
|
const [resolvedUrl, filtersInfo] = yield all([
|
|
11
13
|
call(resolveDrillToAttributeUrl, cmd.payload.drillDefinition, cmd.payload.drillEvent, ctx),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drillToCustomUrlHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToCustomUrlHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACH,KAAK,kCAAkC,EAG1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"drillToCustomUrlHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToCustomUrlHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACH,KAAK,kCAAkC,EAG1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,wBAAiB,uBAAuB,CACpC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,GACvB,YAAY,CAAC,kCAAkC,CAAC,CAkClD"}
|
|
@@ -3,7 +3,9 @@ import { all, call, put } from "redux-saga/effects";
|
|
|
3
3
|
import { drillToCustomUrlRequested, drillToCustomUrlResolved, } from "../../events/drill.js";
|
|
4
4
|
import { getDrillToUrlFiltersWithResolvedValues } from "./getDrillToUrlFilters.js";
|
|
5
5
|
import { resolveDrillToCustomUrl } from "./resolveDrillToCustomUrl.js";
|
|
6
|
+
import { validateDrillAccess } from "./validateDrillAccess.js";
|
|
6
7
|
export function* drillToCustomUrlHandler(ctx, cmd) {
|
|
8
|
+
yield call(validateDrillAccess, ctx, cmd, cmd.payload.drillDefinition);
|
|
7
9
|
yield put(drillToCustomUrlRequested(ctx, cmd.payload.drillDefinition, cmd.payload.drillEvent, cmd.correlationId));
|
|
8
10
|
const [resolvedUrl, filtersInfo] = yield all([
|
|
9
11
|
call(resolveDrillToCustomUrl, cmd.payload.drillDefinition, cmd.payload.drillEvent.widgetRef, cmd.payload.drillEvent, ctx, cmd),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drillToDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToDashboardHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAiC/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EACH,KAAK,kCAAkC,EAG1C,MAAM,uBAAuB,CAAC;AAkB/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"drillToDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToDashboardHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAiC/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EACH,KAAK,kCAAkC,EAG1C,MAAM,uBAAuB,CAAC;AAkB/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAWnE,wBAAiB,uBAAuB,CACpC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,GACvB,YAAY,CAAC,kCAAkC,CAAC,CA+HlD"}
|
|
@@ -16,7 +16,9 @@ import { selectActiveTabDrillParameters } from "../../store/tabs/parameters/para
|
|
|
16
16
|
import { convertIntersectionToAttributeFilters, removeIgnoredValuesFromDrillIntersection, } from "./common/intersectionUtils.js";
|
|
17
17
|
import { mergeDashboardAndSourceFilters } from "./common/mergeFilters.js";
|
|
18
18
|
import { getIncludedSourceFiltersForDashboard } from "./common/sourceDrillFilters.js";
|
|
19
|
+
import { validateDrillAccess } from "./validateDrillAccess.js";
|
|
19
20
|
export function* drillToDashboardHandler(ctx, cmd) {
|
|
21
|
+
yield call(validateDrillAccess, ctx, cmd, cmd.payload.drillDefinition);
|
|
20
22
|
// put start event
|
|
21
23
|
yield put(drillToDashboardRequested(ctx, cmd.payload.drillDefinition, cmd.payload.drillEvent, cmd.correlationId));
|
|
22
24
|
// decide if we should use date filter (only if enabled and connected to a dataset)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drillToInsightHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToInsightHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACH,KAAK,gCAAgC,EAGxC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"drillToInsightHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToInsightHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACH,KAAK,gCAAgC,EAGxC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,wBAAiB,qBAAqB,CAClC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,eAAe,GACrB,YAAY,CAAC,gCAAgC,CAAC,CAwBhD"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import { put, select } from "redux-saga/effects";
|
|
2
|
+
import { call, put, select } from "redux-saga/effects";
|
|
3
3
|
import { drillToInsightRequested, drillToInsightResolved, } from "../../events/drill.js";
|
|
4
4
|
import { selectInsightByRef, selectInsightByWidgetRef } from "../../store/insights/insightsSelectors.js";
|
|
5
5
|
import { addDrillFiltersToInsight } from "./drillToInsightUtils.js";
|
|
6
|
+
import { validateDrillAccess } from "./validateDrillAccess.js";
|
|
6
7
|
export function* drillToInsightHandler(ctx, cmd) {
|
|
8
|
+
yield call(validateDrillAccess, ctx, cmd, cmd.payload.drillDefinition);
|
|
7
9
|
const { drillDefinition, drillEvent } = cmd.payload;
|
|
8
10
|
const insight = yield select(selectInsightByRef(drillDefinition.target));
|
|
9
11
|
yield put(drillToInsightRequested(ctx, insight, drillDefinition, drillEvent, cmd.correlationId));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveDrillToCustomUrl.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/resolveDrillToCustomUrl.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAEH,KAAK,4BAA4B,EACjC,KAAK,mCAAmC,EAExC,KAAK,iBAAiB,IAAI,sBAAsB,EAIhD,KAAK,2BAA2B,EAChC,KAAK,MAAM,EACX,KAAK,mBAAmB,EAwB3B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolveDrillToCustomUrl.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/resolveDrillToCustomUrl.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import stringify from "json-stable-stringify";
|
|
|
3
3
|
import { groupBy } from "lodash-es";
|
|
4
4
|
import { all, call, select } from "redux-saga/effects";
|
|
5
5
|
import { areObjRefsEqual, dashboardAttributeFilterItemDisplayForm, dashboardFilterObjRef, filterAttributeElements, filterObjRef, insightFilters as insightDefinitionFilters, insightId, isArbitraryAttributeFilter, isAttributeDescriptor, isAttributeElementsByValue, isAttributeFilter, isComparisonCondition, isDashboardArbitraryAttributeFilter, isDashboardAttributeFilter, isDashboardTextAttributeFilter, isIdentifierRef, isMeasureValueFilter, isNegativeAttributeFilter, isRangeCondition, isTextAttributeFilter, isUriRef, measureValueFilterConditions, measureValueFilterMeasure, } from "@gooddata/sdk-model";
|
|
6
|
-
import { displayFormPlaceholderRef, getAttributeIdentifiersPlaceholdersFromUrl, getDashboardAttributeFilterPlaceholdersFromUrl, getDashboardMeasureValueFilterPlaceholdersFromUrl, getInsightAttributeFilterPlaceholdersFromUrl, getInsightMeasureValueFilterPlaceholdersFromUrl, } from "@gooddata/sdk-model/internal";
|
|
6
|
+
import { DRILL_TO_URL_PLACEHOLDER, displayFormPlaceholderRef, getAttributeIdentifiersPlaceholdersFromUrl, getDashboardAttributeFilterPlaceholdersFromUrl, getDashboardMeasureValueFilterPlaceholdersFromUrl, getDrillUrlPlaceholderTypes, getInsightAttributeFilterPlaceholdersFromUrl, getInsightMeasureValueFilterPlaceholdersFromUrl, } from "@gooddata/sdk-model/internal";
|
|
7
7
|
import { isDrillIntersectionAttributeItem, } from "@gooddata/sdk-ui";
|
|
8
8
|
import { invalidArgumentsProvided } from "../../events/general.js";
|
|
9
9
|
import { selectAllCatalogDisplayFormsMap, selectAllCatalogMeasuresMap, selectCatalogDateAttributes, } from "../../store/catalog/catalogSelectors.js";
|
|
@@ -13,7 +13,6 @@ import { selectDashboardId } from "../../store/meta/metaSelectors.js";
|
|
|
13
13
|
import { selectAttributeFilterConfigsOverrides } from "../../store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
|
|
14
14
|
import { selectFilterContextAttributeFilterItems, selectFilterContextMeasureValueFilters, } from "../../store/tabs/filterContext/filterContextSelectors.js";
|
|
15
15
|
import { selectAnalyticalWidgetByRef } from "../../store/tabs/layout/layoutSelectors.js";
|
|
16
|
-
import { DRILL_TO_URL_PLACEHOLDER } from "../../types/drillTypes.js";
|
|
17
16
|
import { resolveDisplayFormMetadata } from "../../utils/displayFormResolver.js";
|
|
18
17
|
import { dashboardMeasureValueFilterMatchesIdentifier, insightMeasureValueFilterMatchesIdentifier, } from "../../utils/measureValueFilterUtils.js";
|
|
19
18
|
import { getElementTitle, getElementsSecondaryTitles } from "./getElementTitle.js";
|
|
@@ -340,24 +339,35 @@ export function* getInsightIdentifiersReplacements(customUrl, widgetRef, ctx) {
|
|
|
340
339
|
const applyReplacements = (url, replacements) => replacements.reduce((customUrlWithReplacedPlaceholders, { toBeReplaced, replacement, replaceGlobally }) => customUrlWithReplacedPlaceholders.replace(replaceGlobally ? new RegExp(toBeReplaced, "g") : toBeReplaced, replacement), url);
|
|
341
340
|
export function* resolveDrillToCustomUrl(drillConfig, widgetRef, event, ctx, cmd) {
|
|
342
341
|
const customUrl = drillConfig.target.url;
|
|
343
|
-
const
|
|
344
|
-
const
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
342
|
+
const resolveContext = () => getInsightIdentifiersReplacements(customUrl, widgetRef, ctx);
|
|
343
|
+
const resolvers = {
|
|
344
|
+
attribute_title: () => getAttributeIdentifiersReplacements(customUrl, event.drillContext.intersection, ctx),
|
|
345
|
+
dash_attribute_filter_selection: () => getDashboardAttributeFilterReplacements(customUrl, ctx),
|
|
346
|
+
attribute_filter_selection: () => getInsightAttributeFilterReplacements(customUrl, widgetRef),
|
|
347
|
+
dash_mvf_condition: () => getDashboardMeasureValueFilterReplacements(customUrl),
|
|
348
|
+
mvf_condition: function* () {
|
|
349
|
+
const enabled = yield select(selectEnableMeasureValueFilterKD);
|
|
350
|
+
return enabled
|
|
351
|
+
? yield call(getInsightMeasureValueFilterReplacements, customUrl, widgetRef)
|
|
352
|
+
: getInsightMeasureValueFilterPlaceholdersFromUrl(customUrl).map(({ placeholder }) => ({
|
|
353
|
+
toBeReplaced: placeholder,
|
|
354
|
+
replacement: undefined,
|
|
355
|
+
}));
|
|
356
|
+
},
|
|
357
|
+
[DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_PROJECT_ID]: resolveContext,
|
|
358
|
+
[DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_WORKSPACE_ID]: resolveContext,
|
|
359
|
+
[DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_INSIGHT_ID]: resolveContext,
|
|
360
|
+
[DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_WIDGET_ID]: resolveContext,
|
|
361
|
+
[DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_DASHBOARD_ID]: resolveContext,
|
|
362
|
+
[DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_CLIENT_ID]: resolveContext,
|
|
363
|
+
[DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_DATA_PRODUCT_ID]: resolveContext,
|
|
364
|
+
};
|
|
365
|
+
const replacements = [];
|
|
366
|
+
for (const resolve of new Set(getDrillUrlPlaceholderTypes(customUrl).map((type) => resolvers[type]))) {
|
|
367
|
+
const resolved = yield call(resolve);
|
|
368
|
+
replacements.push(...resolved);
|
|
369
|
+
}
|
|
370
|
+
const missingReplacements = replacements.filter(({ replacement }) => replacement === undefined);
|
|
361
371
|
if (missingReplacements.length > 0) {
|
|
362
372
|
// Surface every unresolved placeholder (not just the first) and the URL, so a "Failed to load
|
|
363
373
|
// URL" is diagnosable from the console without a debugger.
|
|
@@ -366,15 +376,6 @@ export function* resolveDrillToCustomUrl(drillConfig, widgetRef, event, ctx, cmd
|
|
|
366
376
|
.join(", ")} in URL "${customUrl}". The drill cannot open.`);
|
|
367
377
|
throw invalidArgumentsProvided(ctx, cmd, `Drill to custom URL unable to resolve missing parameter ${missingReplacements[0].toBeReplaced}`);
|
|
368
378
|
}
|
|
369
|
-
const insightIdentifiersReplacements = yield call(getInsightIdentifiersReplacements, customUrl, widgetRef, ctx);
|
|
370
|
-
const replacements = [
|
|
371
|
-
...attributeIdentifiersReplacements,
|
|
372
|
-
...dashboardAttributeFilterReplacements,
|
|
373
|
-
...insightAttributeFilterReplacements,
|
|
374
|
-
...dashboardMeasureValueFilterReplacements,
|
|
375
|
-
...insightMeasureValueFilterReplacements,
|
|
376
|
-
...insightIdentifiersReplacements,
|
|
377
|
-
];
|
|
378
379
|
return applyReplacements(customUrl, replacements);
|
|
379
380
|
}
|
|
380
381
|
function stringifyAttributeFilterSelection(selection, isNegative) {
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type SagaIterator } from "redux-saga";
|
|
2
|
+
import { type DashboardDrillDefinition } from "../../../types.js";
|
|
3
|
+
import { type IDashboardCommand } from "../../commands/base.js";
|
|
4
|
+
import { type DashboardContext } from "../../types/commonTypes.js";
|
|
5
|
+
export declare function validateDrillAccess(ctx: DashboardContext, cmd: IDashboardCommand, drill: DashboardDrillDefinition): SagaIterator<void>;
|
|
6
|
+
//# sourceMappingURL=validateDrillAccess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateDrillAccess.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/validateDrillAccess.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,wBAAiB,mBAAmB,CAChC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,wBAAwB,GAChC,YAAY,CAAC,IAAI,CAAC,CAKpB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { select } from "redux-saga/effects";
|
|
3
|
+
import { invalidArgumentsProvided } from "../../events/general.js";
|
|
4
|
+
import { selectIsDrillRestricted } from "../../store/widgetDrills/drillRestrictionSelectors.js";
|
|
5
|
+
export function* validateDrillAccess(ctx, cmd, drill) {
|
|
6
|
+
const isRestricted = yield select(selectIsDrillRestricted);
|
|
7
|
+
if (isRestricted(drill)) {
|
|
8
|
+
throw invalidArgumentsProvided(ctx, cmd, "The drill target is restricted.");
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type IAttributeDisplayFormMetadataObject, type ICatalogAttribute, type ICatalogAttributeHierarchy, type ICatalogComputedAttribute, type ICatalogDateAttribute, type ICatalogDateAttributeHierarchy, type ICatalogDateDataset, type ICatalogFact, type ICatalogMeasure, type IDateHierarchyTemplate, type IParameterMetadataObject, type IdentifierRef, type ObjRef } from "@gooddata/sdk-model";
|
|
2
2
|
import { type CatalogDateAttributeWithDataset } from "../../../_staging/catalog/dateAttributeWithDatasetMap.js";
|
|
3
3
|
import { type ObjRefMap } from "../../../_staging/metadata/objRefMap.js";
|
|
4
|
-
import { type DashboardSelector } from "../types.js";
|
|
4
|
+
import { type DashboardSelector, type DashboardState } from "../types.js";
|
|
5
5
|
import { type CatalogFilterParametersStatus, type CatalogInsightParametersStatus, type CatalogParametersStatus } from "./catalogState.js";
|
|
6
6
|
/**
|
|
7
7
|
* @public
|
|
@@ -140,6 +140,31 @@ export declare const selectAdhocDateHierarchies: DashboardSelector<ICatalogDateA
|
|
|
140
140
|
* @alpha
|
|
141
141
|
*/
|
|
142
142
|
export declare const selectAllCatalogAttributeHierarchies: DashboardSelector<(ICatalogAttributeHierarchy | ICatalogDateAttributeHierarchy)[]>;
|
|
143
|
+
/**
|
|
144
|
+
* Hierarchies used for drilling must be readable in their entirety. Do not bridge a missing
|
|
145
|
+
* level, or offer an entry point that will encounter an inaccessible level later.
|
|
146
|
+
*/
|
|
147
|
+
export declare const selectDrillableAttributeHierarchies: ((state: DashboardState) => (ICatalogAttributeHierarchy | ICatalogDateAttributeHierarchy)[]) & {
|
|
148
|
+
clearCache: () => void;
|
|
149
|
+
resultsCount: () => number;
|
|
150
|
+
resetResultsCount: () => void;
|
|
151
|
+
} & {
|
|
152
|
+
resultFunc: (resultFuncArgs_0: (ICatalogAttributeHierarchy | ICatalogDateAttributeHierarchy)[], resultFuncArgs_1: ICatalogAttribute[], resultFuncArgs_2: ICatalogDateAttribute[], resultFuncArgs_3: boolean) => (ICatalogAttributeHierarchy | ICatalogDateAttributeHierarchy)[];
|
|
153
|
+
memoizedResultFunc: ((resultFuncArgs_0: (ICatalogAttributeHierarchy | ICatalogDateAttributeHierarchy)[], resultFuncArgs_1: ICatalogAttribute[], resultFuncArgs_2: ICatalogDateAttribute[], resultFuncArgs_3: boolean) => (ICatalogAttributeHierarchy | ICatalogDateAttributeHierarchy)[]) & {
|
|
154
|
+
clearCache: () => void;
|
|
155
|
+
resultsCount: () => number;
|
|
156
|
+
resetResultsCount: () => void;
|
|
157
|
+
};
|
|
158
|
+
lastResult: () => (ICatalogAttributeHierarchy | ICatalogDateAttributeHierarchy)[];
|
|
159
|
+
dependencies: [DashboardSelector<(ICatalogAttributeHierarchy | ICatalogDateAttributeHierarchy)[]>, DashboardSelector<ICatalogAttribute[]>, DashboardSelector<ICatalogDateAttribute[]>, DashboardSelector<boolean>];
|
|
160
|
+
recomputations: () => number;
|
|
161
|
+
resetRecomputations: () => void;
|
|
162
|
+
dependencyRecomputations: () => number;
|
|
163
|
+
resetDependencyRecomputations: () => void;
|
|
164
|
+
} & {
|
|
165
|
+
memoize: typeof import("@reduxjs/toolkit").weakMapMemoize;
|
|
166
|
+
argsMemoize: typeof import("@reduxjs/toolkit").weakMapMemoize;
|
|
167
|
+
};
|
|
143
168
|
/**
|
|
144
169
|
* @alpha
|
|
145
170
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogSelectors.d.ts","sourceRoot":"","sources":["../../../../src/model/store/catalog/catalogSelectors.ts"],"names":[],"mappings":"AAKA,OAAO,EACH,KAAK,mCAAmC,EACxC,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,EACnC,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,MAAM,EAMd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACH,KAAK,+BAA+B,EAEvC,MAAM,0DAA0D,CAAC;AAElE,OAAO,EACH,KAAK,SAAS,EAIjB,MAAM,yCAAyC,CAAC;AAOjD,OAAO,EAAE,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"catalogSelectors.d.ts","sourceRoot":"","sources":["../../../../src/model/store/catalog/catalogSelectors.ts"],"names":[],"mappings":"AAKA,OAAO,EACH,KAAK,mCAAmC,EACxC,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,EACnC,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,MAAM,EAMd,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACH,KAAK,+BAA+B,EAEvC,MAAM,0DAA0D,CAAC;AAElE,OAAO,EACH,KAAK,SAAS,EAIjB,MAAM,yCAAyC,CAAC;AAOjD,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1E,OAAO,EACH,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,EACnC,KAAK,uBAAuB,EAC/B,MAAM,mBAAmB,CAAC;AAO3B;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAK1E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,EAAE,iBAAiB,CAAC,yBAAyB,EAAE,CAK1F,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mCAAmC,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAItF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,iBAAiB,CAAC,wBAAwB,EAAE,CAGjF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,EAAE,CACtC,GAAG,EAAE,MAAM,KACV,iBAAiB,CAAC,wBAAwB,GAAG,SAAS,CAI1D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,iBAAiB,CAAC,uBAAuB,CAGpF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,EAAE,iBAAiB,CAAC,OAAO,CAGtE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,8BAA8B,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAClB,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,oCAAoC,EAAE,iBAAiB,CAAC,8BAA8B,CAC1B,CAAC;AAE1E;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CACtB,CAAC;AAExE;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,EAAE,iBAAiB,CAAC,6BAA6B,CACzB,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,iBAAiB,CAAC,OAAO,CAGjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kCAAkC,EAAE,iBAAiB,CAAC,mCAAmC,EAAE,CAMlG,CAAC;AAEP;;GAEG;AACH,eAAO,MAAM,sCAAsC,EAAE,iBAAiB,CAClE,MAAM,CAAC,MAAM,EAAE,mCAAmC,CAAC,CASrD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,iBAAiB,CAAC,eAAe,EAAE,CAKtE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,iBAAiB,CAAC,OAAO,CAG/D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,iBAAiB,CAAC,YAAY,EAAE,CAE/D,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,iBAAiB,CAAC,OAAO,CAG5D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,iBAAiB,CAAC,mBAAmB,EAAE,CAK9E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,iBAAiB,CAAC,OAAO,CAGnE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,iBAAiB,CAAC,OAAO,CAS3D,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,iBAAiB,CAAC,qBAAqB,EAAE,CAKlF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iCAAiC,EAAE,iBAAiB,CAAC,0BAA0B,EAAE,CAGxF,CAAC;AAEP;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,iBAAiB,CAAC,sBAAsB,EAAE,CAKpF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,EAAE,iBAAiB,CAAC,8BAA8B,EAAE,CAQ1F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oCAAoC,EAAE,iBAAiB,CAChE,CAAC,0BAA0B,GAAG,8BAA8B,CAAC,EAAE,CAMlE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;CAgB/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,6BAA6B,EAAE,iBAAiB,CAAC,CAAC,iBAAiB,GAAG,qBAAqB,CAAC,EAAE,CAMtG,CAAC;AAEN;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,iCAAiC,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAEtF;;GAEG;AACH,eAAO,MAAM,wCAAwC,EAAE,iBAAiB,CAAC,iCAAiC,CAMrG,CAAC;AAEN;;GAEG;AACH,eAAO,MAAM,mCAAmC,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAKtF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,EAAE,iBAAiB,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAGxF,CAAC;AAEP;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,EAAE,iBAAiB,CAC3D,SAAS,CAAC,mCAAmC,CAAC,CAMjD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,EAAE,iBAAiB,CACzD,SAAS,CAAC,iBAAiB,GAAG,qBAAqB,CAAC,CAWvD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,2BAA2B,EAAE,iBAAiB,CAAC,SAAS,CAAC,eAAe,CAAC,CAKrF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,EAAE,iBAAiB,CAC/D,SAAS,CAAC,+BAA+B,CAAC,CAe5C,CAAC"}
|
|
@@ -8,7 +8,7 @@ import { createDisplayFormMap } from "../../../_staging/catalog/displayFormMap.j
|
|
|
8
8
|
import { newCatalogAttributeMap, newCatalogDateDatasetMap, newCatalogMeasureMap, } from "../../../_staging/metadata/objRefMap.js";
|
|
9
9
|
import { createMemoizedSelector } from "../_infra/selectors.js";
|
|
10
10
|
import { selectBackendCapabilities, selectSupportsAttributeHierarchies, } from "../backendCapabilities/backendCapabilitiesSelectors.js";
|
|
11
|
-
import { selectLocale } from "../config/configSelectors.js";
|
|
11
|
+
import { selectEnableDashboardPartialRendering, selectLocale } from "../config/configSelectors.js";
|
|
12
12
|
const selectSelf = createSelector((state) => state, (state) => state.catalog);
|
|
13
13
|
/**
|
|
14
14
|
* @public
|
|
@@ -189,6 +189,17 @@ export const selectAdhocDateHierarchies = createSelector([selectDateHierarchyTem
|
|
|
189
189
|
export const selectAllCatalogAttributeHierarchies = createSelector([selectCatalogAttributeHierarchies, selectAdhocDateHierarchies], (catalogAttributeHierarchies, adhocDateHierarchies) => {
|
|
190
190
|
return [...catalogAttributeHierarchies, ...adhocDateHierarchies];
|
|
191
191
|
});
|
|
192
|
+
/**
|
|
193
|
+
* Hierarchies used for drilling must be readable in their entirety. Do not bridge a missing
|
|
194
|
+
* level, or offer an entry point that will encounter an inaccessible level later.
|
|
195
|
+
*/
|
|
196
|
+
export const selectDrillableAttributeHierarchies = createSelector(selectAllCatalogAttributeHierarchies, selectCatalogAttributes, selectCatalogDateAttributes, selectEnableDashboardPartialRendering, (hierarchies, attributes, dateAttributes, partialRendering) => {
|
|
197
|
+
if (!partialRendering) {
|
|
198
|
+
return hierarchies;
|
|
199
|
+
}
|
|
200
|
+
const readableAttributes = [...attributes, ...dateAttributes];
|
|
201
|
+
return hierarchies.filter((hierarchy) => getHierarchyAttributes(hierarchy).every((ref) => readableAttributes.some(({ attribute }) => areObjRefsEqual(attribute.ref, ref))));
|
|
202
|
+
});
|
|
192
203
|
/**
|
|
193
204
|
* @alpha
|
|
194
205
|
*/
|
|
@@ -198,7 +209,7 @@ export const selectAttributesWithDrillDown = createSelector([selectCatalogAttrib
|
|
|
198
209
|
/**
|
|
199
210
|
* @alpha
|
|
200
211
|
*/
|
|
201
|
-
export const selectAttributesWithHierarchyDescendants = createSelector([selectCatalogAttributes, selectCatalogDateAttributes,
|
|
212
|
+
export const selectAttributesWithHierarchyDescendants = createSelector([selectCatalogAttributes, selectCatalogDateAttributes, selectDrillableAttributeHierarchies], (attributes = [], dateAttributes = [], attributeHierarchies = []) => {
|
|
202
213
|
return getAttributesWithHierarchyDescendants(attributes, dateAttributes, attributeHierarchies);
|
|
203
214
|
});
|
|
204
215
|
/**
|
|
@@ -42,9 +42,16 @@ export declare const selectRestrictedDashboardFilterLocalIdentifiersForTab: (tab
|
|
|
42
42
|
*/
|
|
43
43
|
export declare const selectExecutableDashboardFiltersByTab: DashboardSelector<Record<string, FilterContextItem[]>>;
|
|
44
44
|
/**
|
|
45
|
+
* Dashboard filters safe to execute with: the ones the current user may not read are left out.
|
|
46
|
+
*
|
|
45
47
|
* @alpha
|
|
46
48
|
*/
|
|
47
|
-
export declare const
|
|
49
|
+
export declare const selectExecutableDashboardFiltersWithoutCrossFiltering: DashboardSelector<FilterContextItem[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Same as {@link selectExecutableDashboardFiltersWithoutCrossFiltering}, but keeping the filters the
|
|
52
|
+
* current user may not read, which an automation stores like any other.
|
|
53
|
+
*/
|
|
54
|
+
export declare const selectAllDashboardFiltersWithoutCrossFiltering: DashboardSelector<FilterContextItem[]>;
|
|
48
55
|
/**
|
|
49
56
|
* @alpha
|
|
50
57
|
*/
|
|
@@ -65,7 +72,6 @@ export declare const selectAutomationDefaultSelectedFilters: DashboardSelector<F
|
|
|
65
72
|
* @alpha
|
|
66
73
|
*/
|
|
67
74
|
export declare const selectAutomationCommonDateFilterId: DashboardSelector<string | undefined>;
|
|
68
|
-
export declare function removeEmptyDashboardFilters(filters?: FilterContextItem[]): FilterContextItem[];
|
|
69
75
|
export declare const isFilterContextItemHidden: (filter: FilterContextItem, filterConfigurations: {
|
|
70
76
|
commonDateFilterConfig?: IDashboardDateFilterConfig;
|
|
71
77
|
dateFilterWithDimensionConfigs: IDashboardDateFilterConfigItem[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboardFilterSelectors.d.ts","sourceRoot":"","sources":["../../../../src/model/store/filtering/dashboardFilterSelectors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dashboardFilterSelectors.d.ts","sourceRoot":"","sources":["../../../../src/model/store/filtering/dashboardFilterSelectors.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,+BAA+B,EACpC,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,EAYtC,MAAM,qBAAqB,CAAC;AAuB7B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAOxD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,CAMxF;AASD;;;;GAIG;AACH,eAAO,MAAM,+CAA+C,EAAE,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CACvB,CAAC;AAE7E;;;GAGG;AACH,eAAO,MAAM,wCAAwC,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CA0BvF,CAAC;AAEN;;;;GAIG;AACH,eAAO,MAAM,oCAAoC,EAAE,iBAAiB,CAAC,MAAM,CAG1E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAKnF,CAAC;AAYF;;;GAGG;AACH,eAAO,MAAM,mCAAmC,EAAE,iBAAiB,CAAC,OAAO,CAI1E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qDAAqD,EAAE,CAChE,kBAAkB,EAAE,MAAM,KACzB,iBAAiB,CAAC,WAAW,CAAC,MAAM,CAAC,CAIzC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAQpG,CAAC;AAaN;;;;GAIG;AACH,eAAO,MAAM,qDAAqD,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAKpG,CAAC;AAEN;;;GAGG;AACH,eAAO,MAAM,8CAA8C,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAK7F,CAAC;AAEN;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAmB/E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAmB/E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yCAAyC,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAwBxF,CAAC;AAEN;;GAEG;AACH,eAAO,MAAM,sCAAsC,EAAE,iBAAiB,CAAC,iBAAiB,EAAE,CAIzF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kCAAkC,EAAE,iBAAiB,CAAC,MAAM,GAAG,SAAS,CAMpF,CAAC;AAoEF,eAAO,MAAM,yBAAyB,WAC1B,iBAAiB,wBACH;IAClB,sBAAsB,CAAC,EAAE,0BAA0B,CAAC;IACpD,8BAA8B,EAAE,8BAA8B,EAAE,CAAC;IACjE,sBAAsB,EAAE,+BAA+B,EAAE,CAAC;CAC7D,KACF,OAyBF,CAAC;AAEF,eAAO,MAAM,yBAAyB,WAC1B,iBAAiB,wBACH;IAClB,sBAAsB,CAAC,EAAE,0BAA0B,CAAC;IACpD,8BAA8B,EAAE,8BAA8B,EAAE,CAAC;IACjE,sBAAsB,EAAE,+BAA+B,EAAE,CAAC;CAC7D,KACF,OAyBF,CAAC;AAMF;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,EAAE,iBAAiB,CAAC,qBAAqB,EAAE,CAwFnF,CAAC"}
|
|
@@ -73,19 +73,27 @@ export const selectExecutableDashboardFiltersByTab = createSelector(selectFilter
|
|
|
73
73
|
tabId,
|
|
74
74
|
filters.filter((filter) => !isDashboardFilterRestricted(filter, unavailableObjects)),
|
|
75
75
|
])));
|
|
76
|
-
|
|
77
|
-
* @alpha
|
|
78
|
-
*/
|
|
79
|
-
export const selectDashboardFiltersWithoutCrossFiltering = createSelector(selectExecutableDashboardFilters, selectCrossFilteringItems, (dashboardFilters, crossFilteringItems) => {
|
|
76
|
+
function withCommonDateFilterAndWithoutCrossFiltering(dashboardFilters, crossFilteringItems) {
|
|
80
77
|
const dashboardFiltersWithCommonDateFilter = dashboardFilters.some(isDashboardCommonDateFilter)
|
|
81
78
|
? dashboardFilters
|
|
82
79
|
: [commonDateFilter, ...dashboardFilters];
|
|
83
80
|
return removeCrossFilteringFilters(dashboardFiltersWithCommonDateFilter, crossFilteringItems);
|
|
84
|
-
}
|
|
81
|
+
}
|
|
85
82
|
/**
|
|
83
|
+
* Dashboard filters safe to execute with: the ones the current user may not read are left out.
|
|
84
|
+
*
|
|
86
85
|
* @alpha
|
|
87
86
|
*/
|
|
88
|
-
export const
|
|
87
|
+
export const selectExecutableDashboardFiltersWithoutCrossFiltering = createSelector(selectExecutableDashboardFilters, selectCrossFilteringItems, withCommonDateFilterAndWithoutCrossFiltering);
|
|
88
|
+
/**
|
|
89
|
+
* Same as {@link selectExecutableDashboardFiltersWithoutCrossFiltering}, but keeping the filters the
|
|
90
|
+
* current user may not read, which an automation stores like any other.
|
|
91
|
+
*/
|
|
92
|
+
export const selectAllDashboardFiltersWithoutCrossFiltering = createSelector(selectFilterContextFilters, selectCrossFilteringItems, withCommonDateFilterAndWithoutCrossFiltering);
|
|
93
|
+
/**
|
|
94
|
+
* @alpha
|
|
95
|
+
*/
|
|
96
|
+
export const selectDashboardHiddenFilters = createSelector(selectExecutableDashboardFiltersWithoutCrossFiltering, selectDateFilterConfigOverrides, selectDateFilterConfigsOverrides, selectAttributeFilterConfigsOverrides, (dashboardFiltersWithoutCrossFiltering, commonDateFilterConfig, dateFilterWithDimensionConfigs, attributeFilterConfigs) => {
|
|
89
97
|
return dashboardFiltersWithoutCrossFiltering.filter((filter) => isFilterContextItemHidden(filter, {
|
|
90
98
|
commonDateFilterConfig,
|
|
91
99
|
dateFilterWithDimensionConfigs,
|
|
@@ -95,7 +103,7 @@ export const selectDashboardHiddenFilters = createSelector(selectDashboardFilter
|
|
|
95
103
|
/**
|
|
96
104
|
* @alpha
|
|
97
105
|
*/
|
|
98
|
-
export const selectDashboardLockedFilters = createSelector(
|
|
106
|
+
export const selectDashboardLockedFilters = createSelector(selectExecutableDashboardFiltersWithoutCrossFiltering, selectDateFilterConfigOverrides, selectDateFilterConfigsOverrides, selectAttributeFilterConfigsOverrides, (dashboardFiltersWithoutCrossFiltering, commonDateFilterConfig, dateFilterWithDimensionConfigs, attributeFilterConfigs) => {
|
|
99
107
|
return dashboardFiltersWithoutCrossFiltering.filter((filter) => isFilterContextItemLocked(filter, {
|
|
100
108
|
commonDateFilterConfig,
|
|
101
109
|
dateFilterWithDimensionConfigs,
|
|
@@ -105,7 +113,7 @@ export const selectDashboardLockedFilters = createSelector(selectDashboardFilter
|
|
|
105
113
|
/**
|
|
106
114
|
* @alpha
|
|
107
115
|
*/
|
|
108
|
-
export const selectAutomationAvailableDashboardFilters = createSelector(
|
|
116
|
+
export const selectAutomationAvailableDashboardFilters = createSelector(selectAllDashboardFiltersWithoutCrossFiltering, selectDateFilterConfigOverrides, selectDateFilterConfigsOverrides, selectAttributeFilterConfigsOverrides, (dashboardFiltersWithoutCrossFiltering, commonDateFilterConfig, dateFilterWithDimensionConfigs, attributeFilterConfigs) => {
|
|
109
117
|
const withCommonDateFilter = dashboardFiltersWithoutCrossFiltering.some(isDashboardCommonDateFilter)
|
|
110
118
|
? dashboardFiltersWithoutCrossFiltering
|
|
111
119
|
: [commonDateFilter, ...dashboardFiltersWithoutCrossFiltering];
|
|
@@ -118,9 +126,7 @@ export const selectAutomationAvailableDashboardFilters = createSelector(selectDa
|
|
|
118
126
|
/**
|
|
119
127
|
* @alpha
|
|
120
128
|
*/
|
|
121
|
-
export const selectAutomationDefaultSelectedFilters = createSelector(selectAutomationAvailableDashboardFilters,
|
|
122
|
-
return removeEmptyDashboardFilters(availableDashboardFilters);
|
|
123
|
-
});
|
|
129
|
+
export const selectAutomationDefaultSelectedFilters = createSelector(selectAutomationAvailableDashboardFilters, selectUnavailableObjects, automationDefaultSelectedFilters);
|
|
124
130
|
/**
|
|
125
131
|
* @alpha
|
|
126
132
|
*/
|
|
@@ -143,16 +149,21 @@ const removeCrossFilteringFilters = (filters, crossFilteringItems) => {
|
|
|
143
149
|
return true;
|
|
144
150
|
});
|
|
145
151
|
};
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
152
|
+
function isEmptyDashboardFilter(filter) {
|
|
153
|
+
if (isDashboardAttributeFilterItem(filter)) {
|
|
154
|
+
return isAllValuesDashboardAttributeFilter(filter);
|
|
155
|
+
}
|
|
156
|
+
if (isDashboardMeasureValueFilter(filter)) {
|
|
157
|
+
return isAllDashboardMeasureValueFilter(filter);
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Preselects the filters a new automation starts with. A restricted filter is left out, because the
|
|
163
|
+
* user cannot review what it filters by.
|
|
164
|
+
*/
|
|
165
|
+
function automationDefaultSelectedFilters(filters, unavailableObjects) {
|
|
166
|
+
return filters.filter((filter) => !isEmptyDashboardFilter(filter) && !isDashboardFilterRestricted(filter, unavailableObjects));
|
|
156
167
|
}
|
|
157
168
|
function removeHiddenFilters(filters, filterConfigurations) {
|
|
158
169
|
return filters.filter((filter) => {
|
|
@@ -205,7 +216,7 @@ export const isFilterContextItemLocked = (filter, filterConfigurations) => {
|
|
|
205
216
|
*
|
|
206
217
|
* @alpha
|
|
207
218
|
*/
|
|
208
|
-
export const selectAutomationFiltersByTab = createSelector(selectTabs,
|
|
219
|
+
export const selectAutomationFiltersByTab = createSelector(selectTabs, selectFiltersByTab, selectUnavailableObjects, selectDateFilterConfigOverridesByTab, selectDateFilterConfigsOverridesByTab, selectAttributeFilterConfigsOverridesByTab, selectCrossFilteringItemsByTab, (tabs, filtersByTab, unavailableObjects, dateFilterConfigByTab, dateFilterConfigsByTab, attributeFilterConfigsByTab, crossFilteringItemsByTab) => {
|
|
209
220
|
if (!tabs || tabs.length === 0) {
|
|
210
221
|
return [];
|
|
211
222
|
}
|
|
@@ -232,16 +243,21 @@ export const selectAutomationFiltersByTab = createSelector(selectTabs, selectExe
|
|
|
232
243
|
};
|
|
233
244
|
// Get available filters (hidden removed)
|
|
234
245
|
const availableFilters = removeHiddenFilters(filtersWithCommonDate, filterConfigurations);
|
|
246
|
+
// A restricted filter cannot gate the user's automation, because they can neither see
|
|
247
|
+
// nor change it.
|
|
248
|
+
const unrestrictedFilters = filtersWithCommonDate.filter((filter) => !isDashboardFilterRestricted(filter, unavailableObjects));
|
|
249
|
+
const selectableFilters = removeHiddenFilters(unrestrictedFilters, filterConfigurations);
|
|
235
250
|
// Get locked filters
|
|
236
|
-
const lockedFilters =
|
|
251
|
+
const lockedFilters = unrestrictedFilters.filter((filter) => isFilterContextItemLocked(filter, filterConfigurations));
|
|
237
252
|
// Get hidden filters
|
|
238
|
-
const hiddenFilters =
|
|
253
|
+
const hiddenFilters = unrestrictedFilters.filter((filter) => isFilterContextItemHidden(filter, filterConfigurations));
|
|
239
254
|
// Get default selected filters (noop "All" filters removed — attribute and MVF)
|
|
240
|
-
const defaultSelectedFilters =
|
|
255
|
+
const defaultSelectedFilters = automationDefaultSelectedFilters(availableFilters, unavailableObjects);
|
|
241
256
|
return {
|
|
242
257
|
tabId,
|
|
243
258
|
tabTitle,
|
|
244
259
|
availableFilters,
|
|
260
|
+
selectableFilters,
|
|
245
261
|
defaultSelectedFilters,
|
|
246
262
|
lockedFilters,
|
|
247
263
|
hiddenFilters,
|
|
@@ -16,6 +16,11 @@ export interface IAutomationFiltersTab {
|
|
|
16
16
|
* Automation-available filters for the tab (hidden filters removed).
|
|
17
17
|
*/
|
|
18
18
|
availableFilters: FilterContextItem[];
|
|
19
|
+
/**
|
|
20
|
+
* Filters the add-filter dropdown may offer: {@link IAutomationFiltersTab.availableFilters} minus
|
|
21
|
+
* the ones the user is forbidden to read.
|
|
22
|
+
*/
|
|
23
|
+
selectableFilters: FilterContextItem[];
|
|
19
24
|
/**
|
|
20
25
|
* Default selected filters for the tab
|
|
21
26
|
* (no-op filters removed: "all values" attribute filters and "all" measure value filters).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/model/store/filtering/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC;;;OAGG;IACH,sBAAsB,EAAE,iBAAiB,EAAE,CAAC;IAC5C;;OAEG;IACH,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC;;OAEG;IACH,aAAa,EAAE,iBAAiB,EAAE,CAAC;CACtC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/model/store/filtering/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC;;;OAGG;IACH,iBAAiB,EAAE,iBAAiB,EAAE,CAAC;IACvC;;;OAGG;IACH,sBAAsB,EAAE,iBAAiB,EAAE,CAAC;IAC5C;;OAEG;IACH,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC;;OAEG;IACH,aAAa,EAAE,iBAAiB,EAAE,CAAC;CACtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layoutSelectors.d.ts","sourceRoot":"","sources":["../../../../../src/model/store/tabs/layout/layoutSelectors.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,KAAK,eAAe,EAEpB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,sBAAsB,EAC3B,KAAK,MAAM,EACX,KAAK,UAAU,EAWlB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,SAAS,EAA+B,MAAM,4CAA4C,CAAC;AACzG,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAM5G,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EACH,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAGrB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"layoutSelectors.d.ts","sourceRoot":"","sources":["../../../../../src/model/store/tabs/layout/layoutSelectors.ts"],"names":[],"mappings":"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"}
|