@gooddata/sdk-ui-dashboard 11.58.0-alpha.3 → 11.58.0-alpha.5
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/presentation/topBar/buttonBar/button/saveButton/DefaultSaveButton.d.ts.map +1 -1
- package/esm/presentation/topBar/buttonBar/button/saveButton/DefaultSaveButton.js +3 -2
- 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,12 +1,20 @@
|
|
|
1
1
|
import { type FilterContextItem, type IAutomationVisibleFilter, type IFilter, type IInsight } from "@gooddata/sdk-model";
|
|
2
2
|
import { type ExtendedDashboardWidget } from "../../../../model/types/layoutTypes.js";
|
|
3
3
|
import { type IDashboardFilter } from "../../../../types.js";
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* The automation's own stored entries, used to keep a restricted filter's name as it was saved.
|
|
6
|
+
* `TStored` is the flat list, or the per-tab record for {@link getVisibleFiltersByFiltersByTab}.
|
|
7
|
+
*/
|
|
8
|
+
export interface IRestrictedVisibleFiltersFallback<TStored = IAutomationVisibleFilter[]> {
|
|
9
|
+
storedVisibleFilters: TStored | undefined;
|
|
10
|
+
isFilterRestricted: (filter: FilterContextItem) => boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const getVisibleFiltersByFilters: (selectedFilters: FilterContextItem[] | undefined, visibleFiltersMetadata: IAutomationVisibleFilter[] | undefined, storeFilters?: boolean, restrictedFallback?: IRestrictedVisibleFiltersFallback) => IAutomationVisibleFilter[] | undefined;
|
|
5
13
|
/**
|
|
6
14
|
* Get visible filters metadata structured by tab.
|
|
7
15
|
* Applies the same logic as getVisibleFiltersByFilters to each tab's filters.
|
|
8
16
|
*/
|
|
9
|
-
export declare const getVisibleFiltersByFiltersByTab: (filtersByTab: Record<string, FilterContextItem[]> | undefined, visibleFiltersMetadata: Record<string, IAutomationVisibleFilter[]> | undefined, storeFilters?: boolean) => Record<string, IAutomationVisibleFilter[]> | undefined;
|
|
17
|
+
export declare const getVisibleFiltersByFiltersByTab: (filtersByTab: Record<string, FilterContextItem[]> | undefined, visibleFiltersMetadata: Record<string, IAutomationVisibleFilter[]> | undefined, storeFilters?: boolean, restrictedFallback?: IRestrictedVisibleFiltersFallback<Record<string, IAutomationVisibleFilter[]>>) => Record<string, IAutomationVisibleFilter[]> | undefined;
|
|
10
18
|
/**
|
|
11
19
|
* Get final execution filters for the widget alert or scheduled export.
|
|
12
20
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversions.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/filters/conversions.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,OAAO,EACZ,KAAK,QAAQ,EAoChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEtF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAO,MAAM,0BAA0B,oBAClB,iBAAiB,EAAE,GAAG,SAAS,0BACxB,wBAAwB,EAAE,GAAG,SAAS,iBAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"conversions.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/filters/conversions.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,OAAO,EACZ,KAAK,QAAQ,EAoChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEtF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D;;;GAGG;AACH,MAAM,WAAW,iCAAiC,CAAC,OAAO,GAAG,wBAAwB,EAAE;IACnF,oBAAoB,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1C,kBAAkB,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC;CAC9D;AASD,eAAO,MAAM,0BAA0B,oBAClB,iBAAiB,EAAE,GAAG,SAAS,0BACxB,wBAAwB,EAAE,GAAG,SAAS,iBAC/C,OAAO,uBACD,iCAAiC,KACvD,wBAAwB,EAAE,GAAG,SAmC/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,+BAA+B,iBAC1B,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAAG,SAAS,0BACrC,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,GAAG,SAAS,iBAC/D,OAAO,uBACD,iCAAiC,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,CAAC,KACnG,MAAM,CAAC,MAAM,EAAE,wBAAwB,EAAE,CAAC,GAAG,SAuB/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,8BACL,iBAAiB,EAAE,0BACtB,iBAAiB,EAAE,UACnC,uBAAuB,GAAG,SAAS,WAClC,QAAQ,GAAG,SAAS,sBACT,MAAM,GAAG,SAAS,wBACjB,OAAO,kBACb,OAAO,cA6BzB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,8BACR,iBAAiB,EAAE,0BACtB,iBAAiB,EAAE,iBAC5B,OAAO,oCAWzB,CAAC;AAEF,wBAAgB,kCAAkC,CAC9C,MAAM,EAAE,gBAAgB,EACxB,YAAY,EAAE,OAAO,GACtB,iBAAiB,GAAG,SAAS,CA8E/B;AAED;;;;;;;GAOG;AACH,wBAAgB,oCAAoC,CAChD,OAAO,EAAE,OAAO,EAAE,EAClB,OAAO,EAAE,QAAQ,GAAG,SAAS,GAC9B,OAAO,EAAE,CAiDX;AAyBD,8GAA8G;AAC9G,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAW9D;AAED,mEAAmE;AACnE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAWxE;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CA0BhE"}
|
|
@@ -3,7 +3,10 @@ import { compact } from "lodash-es";
|
|
|
3
3
|
import { NotSupported } from "@gooddata/sdk-backend-spi";
|
|
4
4
|
import { attributeLocalId, dashboardFilterLocalIdentifier, filterAttributeElements, filterContextItemsToDashboardFiltersByWidget, filterLocalIdentifier, filterObjRef, hasMeasureValueFilterConditions, insightAttributes, isAbsoluteDateFilter, isAllDashboardMeasureValueFilter, isAllTimeDateFilter, isAllValuesAttributeFilter, isAllValuesDashboardAttributeFilter, isArbitraryAttributeFilter, isAttributeFilterWithSelection, isDashboardDateFilter, isDashboardMeasureValueFilter, isDateFilter, isInsightWidget, isLocalIdRef, isMatchAttributeFilter, isMeasureValueFilter, isNegativeAttributeFilter, isNoopAllTimeDashboardDateFilter, isObjRef, isRankingFilter, isRelativeBoundedDateFilter, isRelativeDateFilter, measureValueFilterConditions, measureValueFilterMeasure, mergeFilters, newAbsoluteDashboardDateFilter, newAllTimeDashboardDateFilter, newRelativeDashboardDateFilter, } from "@gooddata/sdk-model";
|
|
5
5
|
import { removeIgnoredWidgetFilters } from "../../../../model/utils/widgetFilters.js";
|
|
6
|
-
|
|
6
|
+
function findVisibleFilter(localIdentifier, visibleFilters) {
|
|
7
|
+
return (visibleFilters ?? []).find((visibleFilter) => visibleFilter.localIdentifier === localIdentifier);
|
|
8
|
+
}
|
|
9
|
+
export const getVisibleFiltersByFilters = (selectedFilters, visibleFiltersMetadata, storeFilters, restrictedFallback) => {
|
|
7
10
|
if (!storeFilters) {
|
|
8
11
|
return undefined;
|
|
9
12
|
}
|
|
@@ -13,9 +16,12 @@ export const getVisibleFiltersByFilters = (selectedFilters, visibleFiltersMetada
|
|
|
13
16
|
.filter((filter) => !isAllValuesDashboardAttributeFilter(filter) && !isAllDashboardMeasureValueFilter(filter))
|
|
14
17
|
.map((selectedFilter) => {
|
|
15
18
|
const selectedLocalIdentifier = dashboardFilterLocalIdentifier(selectedFilter);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
// A restricted date or measure value filter still resolves a title from the dashboard, so
|
|
20
|
+
// the stored entry has to win or the saved name is replaced by that derived one.
|
|
21
|
+
const storedFilter = restrictedFallback?.isFilterRestricted(selectedFilter)
|
|
22
|
+
? findVisibleFilter(selectedLocalIdentifier, restrictedFallback.storedVisibleFilters)
|
|
23
|
+
: undefined;
|
|
24
|
+
const targetFilter = storedFilter ?? findVisibleFilter(selectedLocalIdentifier, visibleFiltersMetadata);
|
|
19
25
|
if (targetFilter && isDashboardDateFilter(selectedFilter)) {
|
|
20
26
|
return {
|
|
21
27
|
...targetFilter,
|
|
@@ -32,12 +38,15 @@ export const getVisibleFiltersByFilters = (selectedFilters, visibleFiltersMetada
|
|
|
32
38
|
* Get visible filters metadata structured by tab.
|
|
33
39
|
* Applies the same logic as getVisibleFiltersByFilters to each tab's filters.
|
|
34
40
|
*/
|
|
35
|
-
export const getVisibleFiltersByFiltersByTab = (filtersByTab, visibleFiltersMetadata, storeFilters) => {
|
|
41
|
+
export const getVisibleFiltersByFiltersByTab = (filtersByTab, visibleFiltersMetadata, storeFilters, restrictedFallback) => {
|
|
36
42
|
if (!storeFilters || !filtersByTab) {
|
|
37
43
|
return undefined;
|
|
38
44
|
}
|
|
39
45
|
return Object.entries(filtersByTab).reduce((acc, [tabId, tabFilters]) => {
|
|
40
|
-
const visibleFilters = getVisibleFiltersByFilters(tabFilters, visibleFiltersMetadata?.[tabId], true
|
|
46
|
+
const visibleFilters = getVisibleFiltersByFilters(tabFilters, visibleFiltersMetadata?.[tabId], true, restrictedFallback && {
|
|
47
|
+
storedVisibleFilters: restrictedFallback.storedVisibleFilters?.[tabId],
|
|
48
|
+
isFilterRestricted: restrictedFallback.isFilterRestricted,
|
|
49
|
+
});
|
|
41
50
|
if (visibleFilters && visibleFilters.length > 0) {
|
|
42
51
|
acc[tabId] = visibleFilters;
|
|
43
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultDashboardSettingsDialog.d.ts","sourceRoot":"","sources":["../../../src/presentation/dashboardSettingsDialog/DefaultDashboardSettingsDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAoD,MAAM,OAAO,CAAC;AA2C5F,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"DefaultDashboardSettingsDialog.d.ts","sourceRoot":"","sources":["../../../src/presentation/dashboardSettingsDialog/DefaultDashboardSettingsDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAoD,MAAM,OAAO,CAAC;AA2C5F,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAGhE;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,EAC3C,SAAS,EACT,OAAO,EACP,QAAQ,GACX,EAAE,6BAA6B,GAAG,YAAY,GAAG,IAAI,CAiRrD"}
|
|
@@ -11,7 +11,6 @@ import { selectDateFormat, selectEnableDashboardPersistentFiltersAcrossTabs, sel
|
|
|
11
11
|
import { selectCrossFilteringEnabledAndSupported } from "../../model/store/topBar/topBarSelectors.js";
|
|
12
12
|
import { TimezoneOption } from "./TimezoneOption.js";
|
|
13
13
|
import { useDialogData } from "./useDialogData.js";
|
|
14
|
-
const DASHBOARD_TIMEZONE_DOC_LINK = "https://www.gooddata.ai/docs/cloud/customize-appearance/manage-timezones/#change-the-time-zone-on-a-dashboard";
|
|
15
14
|
/**
|
|
16
15
|
* @alpha
|
|
17
16
|
*/
|
|
@@ -105,9 +104,9 @@ export function DefaultDashboardSettingsDialog({ isVisible, onApply, onCancel /*
|
|
|
105
104
|
strong: (chunks) => _jsx("strong", { children: chunks }),
|
|
106
105
|
} })) })] }), settings.enableTimezoneChange ? (_jsxs("div", { className: "gd-dashboard-settings-dialog-section s-dashboard-settings-timezone", children: [_jsx(DialogListHeader, { title: intl.formatMessage({ id: "settingsDashboardDialog.section.timezone" }), className: "gd-dashboard-settings-filters" }), _jsx(TimezoneOption, { label: intl.formatMessage({
|
|
107
106
|
id: "settingsDashboardDialog.section.timezone.defaultTimezone",
|
|
108
|
-
}), tooltip:
|
|
109
|
-
|
|
110
|
-
|
|
107
|
+
}), tooltip: intl.formatMessage({
|
|
108
|
+
id: "settingsDashboardDialog.section.timezone.defaultTimezone.tooltip",
|
|
109
|
+
}), timezoneConfig: currentData.timezoneConfig, onChange: (timezoneId) => {
|
|
111
110
|
setCurrentData({
|
|
112
111
|
...currentData,
|
|
113
112
|
timezoneConfig: normalizeDashboardTimezoneConfig({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimezoneOption.d.ts","sourceRoot":"","sources":["../../../src/presentation/dashboardSettingsDialog/TimezoneOption.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAIhD,OAAO,EAAoB,KAAK,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"TimezoneOption.d.ts","sourceRoot":"","sources":["../../../src/presentation/dashboardSettingsDialog/TimezoneOption.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAIhD,OAAO,EAAoB,KAAK,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAetF,UAAU,oBAAoB;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,SAAS,CAAC;IACnB,cAAc,EAAE,wBAAwB,GAAG,SAAS,CAAC;IACrD,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACtD;AAED,wBAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAmGhG"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
// (C) 2026 GoodData Corporation
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import { useIntl } from "react-intl";
|
|
5
5
|
import { BROWSER_DETECTED } from "@gooddata/sdk-model";
|
|
6
|
-
import { TimezoneSelect, UiTooltip, useIdPrefixed, } from "@gooddata/sdk-ui-kit";
|
|
6
|
+
import { TimezoneSelect, UiLink, UiTooltip, useIdPrefixed, } from "@gooddata/sdk-ui-kit";
|
|
7
|
+
import { useDashboardSelector } from "../../model/react/DashboardStoreProvider.js";
|
|
8
|
+
import { selectIsWhiteLabeled } from "../../model/store/config/configSelectors.js";
|
|
9
|
+
const DASHBOARD_TIMEZONE_DOC_LINK = "https://www.gooddata.ai/docs/cloud/customize-appearance/manage-timezones/#change-the-time-zone-on-a-dashboard";
|
|
7
10
|
export function TimezoneOption({ label, tooltip, timezoneConfig, onChange }) {
|
|
8
11
|
const intl = useIntl();
|
|
12
|
+
const isWhiteLabeled = useDashboardSelector(selectIsWhiteLabeled);
|
|
9
13
|
const helpTooltipId = useIdPrefixed("timezone-help-tooltip");
|
|
10
14
|
const specialItems = useMemo(() => {
|
|
11
15
|
const workspaceItemLabel = intl.formatMessage({
|
|
@@ -14,6 +18,10 @@ export function TimezoneOption({ label, tooltip, timezoneConfig, onChange }) {
|
|
|
14
18
|
const workspaceItemTooltip = intl.formatMessage({
|
|
15
19
|
id: "settingsDashboardDialog.section.timezone.defaultTimezone.workspace.tooltip",
|
|
16
20
|
});
|
|
21
|
+
// the docs link goes on its own line; it is left out of the plain-text tooltip read by screen readers
|
|
22
|
+
const workspaceItemTooltipContent = isWhiteLabeled ? undefined : (_jsxs(_Fragment, { children: [workspaceItemTooltip, _jsx("div", { className: "gd-timezone-option__tooltip-link", children: _jsx(UiLink, { variant: "inverse", href: DASHBOARD_TIMEZONE_DOC_LINK, rel: "noopener noreferrer", target: "_blank", dataTestId: "timezone-docs-link", children: intl.formatMessage({
|
|
23
|
+
id: "settingsDashboardDialog.section.timezone.defaultTimezone.workspace.tooltip.learnMore",
|
|
24
|
+
}) }) })] }));
|
|
17
25
|
const browserItemLabel = intl.formatMessage({
|
|
18
26
|
id: "settingsDashboardDialog.section.timezone.defaultTimezone.fromBrowser",
|
|
19
27
|
});
|
|
@@ -21,13 +29,18 @@ export function TimezoneOption({ label, tooltip, timezoneConfig, onChange }) {
|
|
|
21
29
|
id: "settingsDashboardDialog.section.timezone.defaultTimezone.fromBrowser.tooltip",
|
|
22
30
|
});
|
|
23
31
|
return [
|
|
24
|
-
{
|
|
32
|
+
{
|
|
33
|
+
id: undefined,
|
|
34
|
+
label: workspaceItemLabel,
|
|
35
|
+
tooltip: workspaceItemTooltip,
|
|
36
|
+
tooltipContent: workspaceItemTooltipContent,
|
|
37
|
+
},
|
|
25
38
|
{ id: BROWSER_DETECTED, label: browserItemLabel, tooltip: browserItemTooltip },
|
|
26
39
|
];
|
|
27
|
-
}, [intl]);
|
|
28
|
-
return (_jsxs("div", { className: "configuration-category-item", children: [
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
}, [intl, isWhiteLabeled]);
|
|
41
|
+
return (_jsxs("div", { className: "configuration-category-item", children: [_jsxs("span", { className: "input-label-text", children: [label, _jsx("span", { className: "configuration-category-item-tooltip-icon", children: _jsx(UiTooltip, { id: helpTooltipId, component: "span", inlineAnchor: true, anchor: _jsx("span", { role: "img", tabIndex: 0, "aria-label": intl.formatMessage({
|
|
42
|
+
id: "settingsDashboardDialog.section.timezone.defaultTimezone.help",
|
|
43
|
+
}), "aria-describedby": helpTooltipId, className: "gd-icon-circle-question gd-filter-configuration__help-icon" }), content: _jsx("div", { className: "gd-filter-configuration__help-tooltip", children: tooltip }), triggerBy: ["hover", "focus"], arrowPlacement: "left", optimalPlacement: true, width: 200 }) })] }), _jsx(TimezoneSelect, { value: timezoneConfig?.timezoneId, showTooltip: true, onChange: onChange, specialItems: specialItems, searchPlaceholder: intl.formatMessage({
|
|
31
44
|
id: "settingsDashboardDialog.section.timezone.select.searchPlaceholder",
|
|
32
45
|
}), ariaLabel: intl.formatMessage({
|
|
33
46
|
id: "settingsDashboardDialog.section.timezone.defaultTimezone",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportCsvDialog.d.ts","sourceRoot":"","sources":["../../../src/presentation/dialogs/ExportCsvDialog.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;
|
|
1
|
+
{"version":3,"file":"ExportCsvDialog.d.ts","sourceRoot":"","sources":["../../../src/presentation/dialogs/ExportCsvDialog.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,gDAAgD,CAAC;AAY3F,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;CAClD;AAED,eAAO,MAAM,eAAe,+DAAyD,qBAAqB,6CA8CxG,CAAC"}
|
|
@@ -11,6 +11,7 @@ const messages = defineMessages({
|
|
|
11
11
|
cancel: { id: "cancel" },
|
|
12
12
|
submit: { id: "dialogs.export.submit" },
|
|
13
13
|
delimiterLabel: { id: "dialogs.export.csv.delimiter", defaultMessage: "CSV delimiter" },
|
|
14
|
+
submitDisabledTooltip: { id: "dialogs.export.csv.submit.disabledTooltip" },
|
|
14
15
|
});
|
|
15
16
|
export const ExportCsvDialog = memo(function ExportCsvDialog({ onCancel, onSubmit }) {
|
|
16
17
|
const intl = useIntl();
|
|
@@ -22,5 +23,5 @@ export const ExportCsvDialog = memo(function ExportCsvDialog({ onCancel, onSubmi
|
|
|
22
23
|
const handleSubmit = () => {
|
|
23
24
|
onSubmit({ delimiter: selectedDelimiter });
|
|
24
25
|
};
|
|
25
|
-
return (_jsx(Overlay, { alignPoints: alignPoints, isModal: true, positionType: "fixed", children: _jsx(ValidationContextStore, { value: validationContextValue, children: _jsx(ConfirmDialogBase, { className: "gd-csv-export-dialog s-gd-csv-export-dialog", displayCloseButton: true, isPositive: true, isSubmitDisabled: isSubmitDisabled, headline: intl.formatMessage(messages.headline), cancelButtonText: intl.formatMessage(messages.cancel), submitButtonText: intl.formatMessage(messages.submit), onCancel: onCancel, onSubmit: handleSubmit, autofocusOnOpen: true, children: _jsx("div", { className: "gd-csv-export-dialog-item", children: _jsx(CsvDelimiterPicker, { value: value, onChange: setValue, validationError: validationError, label: intl.formatMessage(messages.delimiterLabel), onEnterKeyPress: isSubmitDisabled ? undefined : handleSubmit }) }) }) }) }));
|
|
26
|
+
return (_jsx(Overlay, { alignPoints: alignPoints, isModal: true, positionType: "fixed", children: _jsx(ValidationContextStore, { value: validationContextValue, children: _jsx(ConfirmDialogBase, { className: "gd-csv-export-dialog s-gd-csv-export-dialog", displayCloseButton: true, isPositive: true, isSubmitDisabled: isSubmitDisabled, submitButtonTooltipText: isSubmitDisabled ? intl.formatMessage(messages.submitDisabledTooltip) : undefined, headline: intl.formatMessage(messages.headline), cancelButtonText: intl.formatMessage(messages.cancel), submitButtonText: intl.formatMessage(messages.submit), onCancel: onCancel, onSubmit: handleSubmit, autofocusOnOpen: true, children: _jsx("div", { className: "gd-csv-export-dialog-item", children: _jsx(CsvDelimiterPicker, { value: value, onChange: setValue, validationError: validationError, label: intl.formatMessage(messages.delimiterLabel), onEnterKeyPress: isSubmitDisabled ? undefined : handleSubmit }) }) }) }) }));
|
|
26
27
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { FormattedMessage, defineMessages } from "react-intl";
|
|
3
|
-
import { DRILL_TO_URL_PLACEHOLDER } from "
|
|
3
|
+
import { DRILL_TO_URL_PLACEHOLDER } from "@gooddata/sdk-model/internal";
|
|
4
4
|
import { DropdownSectionHeader } from "../DropdownSectionHeader.js";
|
|
5
5
|
import { ClientIdParameterDetail } from "../ParameterDetails/ClientIdParameterDetail.js";
|
|
6
6
|
import { DashboardIdParameterDetail } from "../ParameterDetails/DashboardIdParameterDetail.js";
|
|
@@ -12,7 +12,8 @@ export interface IDrillSelectDropdownProps extends IDrillSelectContext {
|
|
|
12
12
|
onSelect: (item: DashboardDrillDefinition, context: unknown) => void;
|
|
13
13
|
}
|
|
14
14
|
export declare function DrillSelectDropdown({ isOpen, dropDownAnchorClass, onClose, onCloseReturnFocus, onSelect, drillDefinitions, drillEvent, }: IDrillSelectDropdownProps): import("react/jsx-runtime").JSX.Element | null;
|
|
15
|
-
export declare const createDrillSelectItems: ({ drillDefinitions, drillEvent, insights, dashboardList, dashboardTitle, intl, widget, attributeDisplayForms, enableSecondGranularities, }: {
|
|
15
|
+
export declare const createDrillSelectItems: ({ drillDefinitions, drillEvent, insights, dashboardList, dashboardTitle, intl, widget, attributeDisplayForms, enableSecondGranularities, isDrillRestricted, }: {
|
|
16
|
+
isDrillRestricted: (drill: DashboardDrillDefinition) => boolean;
|
|
16
17
|
drillDefinitions: DashboardDrillDefinition[];
|
|
17
18
|
drillEvent: IDrillEvent;
|
|
18
19
|
insights: ObjRefMap<IInsight>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DrillSelectDropdown.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/DrillSelect/DrillSelectDropdown.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,YAAY,CAAC;AAGrD,OAAO,EACH,KAAK,mCAAmC,EACxC,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,OAAO,EAcf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,WAAW,EAAsB,MAAM,kBAAkB,CAAC;AAIxE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"DrillSelectDropdown.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/DrillSelect/DrillSelectDropdown.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,YAAY,CAAC;AAGrD,OAAO,EACH,KAAK,mCAAmC,EACxC,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,OAAO,EAcf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,WAAW,EAAsB,MAAM,kBAAkB,CAAC;AAIxE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,OAAO,EAAE,KAAK,wBAAwB,EAAyB,MAAM,mBAAmB,CAAC;AAazF,OAAO,EAAa,KAAK,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAExF,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IAClE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxE;AAED,wBAAgB,mBAAmB,CAAC,EAChC,MAAM,EACN,mBAAmB,EACnB,OAAO,EACP,kBAAkB,EAClB,QAAQ,EACR,gBAAgB,EAChB,UAAU,GACb,EAAE,yBAAyB,kDA6K3B;AAqFD,eAAO,MAAM,sBAAsB,kKAWhC;IACC,iBAAiB,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,OAAO,CAAC;IAChE,gBAAgB,EAAE,wBAAwB,EAAE,CAAC;IAC7C,UAAU,EAAE,WAAW,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC9B,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,mCAAmC,CAAC,CAAC;IAC3E,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACvC,KAAG,gBAAgB,EAuJnB,CAAC"}
|
|
@@ -16,6 +16,7 @@ import { selectEnableSecondGranularities } from "../../../model/store/config/con
|
|
|
16
16
|
import { selectInsightsMap } from "../../../model/store/insights/insightsSelectors.js";
|
|
17
17
|
import { selectDashboardTitle } from "../../../model/store/meta/metaSelectors.js";
|
|
18
18
|
import { selectWidgetByRef } from "../../../model/store/tabs/layout/layoutSelectors.js";
|
|
19
|
+
import { selectIsDrillRestricted } from "../../../model/store/widgetDrills/drillRestrictionSelectors.js";
|
|
19
20
|
import { isDrillDownDefinition } from "../../../types.js";
|
|
20
21
|
import { useDrillSelectDropdownMenuItems } from "../hooks/useDrillSelectDropdownMenuItems.js";
|
|
21
22
|
import { isDrillToUrl } from "../types.js";
|
|
@@ -27,6 +28,7 @@ import { DrillSelectDropdownMenuItem } from "./DrillSelectDropdownMenuItem.js";
|
|
|
27
28
|
import { DrillType } from "./types.js";
|
|
28
29
|
export function DrillSelectDropdown({ isOpen, dropDownAnchorClass, onClose, onCloseReturnFocus, onSelect, drillDefinitions, drillEvent, }) {
|
|
29
30
|
const intl = useIntl();
|
|
31
|
+
const isDrillRestricted = useDashboardSelector(selectIsDrillRestricted);
|
|
30
32
|
const dashboardList = useDashboardSelector(selectAccessibleDashboards);
|
|
31
33
|
const dashboardTitle = useDashboardSelector(selectDashboardTitle);
|
|
32
34
|
const insights = useDashboardSelector(selectInsightsMap);
|
|
@@ -73,6 +75,7 @@ export function DrillSelectDropdown({ isOpen, dropDownAnchorClass, onClose, onCl
|
|
|
73
75
|
const drillSelectItems = useMemo(() => createDrillSelectItems({
|
|
74
76
|
drillDefinitions: deduplicateDrillIntoUrlItems(drillDefinitions),
|
|
75
77
|
drillEvent,
|
|
78
|
+
isDrillRestricted,
|
|
76
79
|
insights,
|
|
77
80
|
dashboardList,
|
|
78
81
|
dashboardTitle,
|
|
@@ -82,6 +85,7 @@ export function DrillSelectDropdown({ isOpen, dropDownAnchorClass, onClose, onCl
|
|
|
82
85
|
enableSecondGranularities,
|
|
83
86
|
}), [
|
|
84
87
|
drillDefinitions,
|
|
88
|
+
isDrillRestricted,
|
|
85
89
|
drillEvent,
|
|
86
90
|
insights,
|
|
87
91
|
dashboardList,
|
|
@@ -212,10 +216,24 @@ function calculateAlignPoints(anchorClass, drillEvent) {
|
|
|
212
216
|
},
|
|
213
217
|
];
|
|
214
218
|
}
|
|
215
|
-
export const createDrillSelectItems = ({ drillDefinitions, drillEvent, insights, dashboardList, dashboardTitle, intl, widget, attributeDisplayForms, enableSecondGranularities = false, }) => {
|
|
219
|
+
export const createDrillSelectItems = ({ drillDefinitions, drillEvent, insights, dashboardList, dashboardTitle, intl, widget, attributeDisplayForms, enableSecondGranularities = false, isDrillRestricted, }) => {
|
|
216
220
|
const totalDrillToUrls = getTotalDrillToUrlCount(drillDefinitions);
|
|
217
221
|
return drillDefinitions.flatMap((drillDefinition) => {
|
|
218
222
|
invariant(!isDrillToLegacyDashboard(drillDefinition), "Drill to pixel perfect dashboards from insight is not supported.");
|
|
223
|
+
if (isDrillRestricted(drillDefinition)) {
|
|
224
|
+
return {
|
|
225
|
+
type: isDrillToInsight(drillDefinition)
|
|
226
|
+
? DrillType.DRILL_TO_INSIGHT
|
|
227
|
+
: isDrillToDashboard(drillDefinition)
|
|
228
|
+
? DrillType.DRILL_TO_DASHBOARD
|
|
229
|
+
: DrillType.DRILL_TO_URL,
|
|
230
|
+
name: intl.formatMessage({ id: "drill_modal_picker.restricted" }),
|
|
231
|
+
drillDefinition,
|
|
232
|
+
id: stringify(drillDefinition) || "undefined",
|
|
233
|
+
isRestricted: true,
|
|
234
|
+
isDisabled: true,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
219
237
|
if (isDrillDownDefinition(drillDefinition)) {
|
|
220
238
|
const { title: drillTitle } = drillDefinition;
|
|
221
239
|
const drillTargetIdentifier = isIdentifierRef(drillDefinition.target)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WithDrillSelect.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/DrillSelect/WithDrillSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAA0C,MAAM,OAAO,CAAC;AAKlF,OAAO,EACH,KAAK,QAAQ,EACb,KAAK,MAAM,EAOd,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"WithDrillSelect.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/DrillSelect/WithDrillSelect.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAA0C,MAAM,OAAO,CAAC;AAKlF,OAAO,EACH,KAAK,QAAQ,EACb,KAAK,MAAM,EAOd,MAAM,qBAAqB,CAAC;AAsB7B,OAAO,EACH,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,KAAK,aAAa,EACrB,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,QAAQ,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,4BAA4B,CAAC,EAAE,4BAA4B,CAAC;IAC5D,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,aAAa,CAAA;KAAE,KAAK,YAAY,CAAC;CACjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC5B,SAAS,EACT,QAAQ,EACR,OAAO,EACP,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,4BAA4B,EAC5B,yBAAyB,EACzB,0BAA0B,EAC1B,OAAO,GACV,EAAE,qBAAqB,GAAG,YAAY,CAmLtC"}
|
|
@@ -9,8 +9,9 @@ import { OverlayController, OverlayControllerProvider } from "@gooddata/sdk-ui-k
|
|
|
9
9
|
import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
|
|
10
10
|
import { selectBackendCapabilities } from "../../../model/store/backendCapabilities/backendCapabilitiesSelectors.js";
|
|
11
11
|
import { selectDisableDefaultDrills, selectLocale } from "../../../model/store/config/configSelectors.js";
|
|
12
|
-
import {
|
|
12
|
+
import { selectExecutableDashboardFiltersWithoutCrossFiltering } from "../../../model/store/filtering/dashboardFilterSelectors.js";
|
|
13
13
|
import { selectWidgetDrills } from "../../../model/store/tabs/layout/layoutSelectors.js";
|
|
14
|
+
import { selectIsDrillRestricted } from "../../../model/store/widgetDrills/drillRestrictionSelectors.js";
|
|
14
15
|
import { isDrillDownDefinition, } from "../../../types.js";
|
|
15
16
|
import { DASHBOARD_DRILL_MENU_Z_INDEX } from "../../constants/zIndex.js";
|
|
16
17
|
import { IntlWrapper } from "../../localization/IntlWrapper.js";
|
|
@@ -26,7 +27,8 @@ export function WithDrillSelect({ widgetRef, children, insight, returnFocusToIns
|
|
|
26
27
|
const [isOpen, setIsOpen] = useState(true);
|
|
27
28
|
const locale = useDashboardSelector(selectLocale);
|
|
28
29
|
const disableDefaultDrills = useDashboardSelector(selectDisableDefaultDrills); // TODO: maybe remove?
|
|
29
|
-
const filters = useDashboardSelector(
|
|
30
|
+
const filters = useDashboardSelector(selectExecutableDashboardFiltersWithoutCrossFiltering);
|
|
31
|
+
const isDrillRestricted = useDashboardSelector(selectIsDrillRestricted);
|
|
30
32
|
const configuredDrills = useDashboardSelector(selectWidgetDrills(widgetRef));
|
|
31
33
|
const { supportsAttributeHierarchies } = useDashboardSelector(selectBackendCapabilities);
|
|
32
34
|
const drills = useDrills({
|
|
@@ -41,7 +43,9 @@ export function WithDrillSelect({ widgetRef, children, insight, returnFocusToIns
|
|
|
41
43
|
const validDrillDefinitions = supportsAttributeHierarchies
|
|
42
44
|
? drillDefinitions
|
|
43
45
|
: filterDrillFromAttributeByPriority(drillDefinitions, configuredDrills);
|
|
44
|
-
const type =
|
|
46
|
+
const type = validDrillDefinitions.some(isDrillRestricted)
|
|
47
|
+
? "multiple"
|
|
48
|
+
: getDrillDefinitionType(validDrillDefinitions);
|
|
45
49
|
if (type === "single") {
|
|
46
50
|
onSelect(validDrillDefinitions[0], undefined, drillEvent, s.correlationId, context);
|
|
47
51
|
}
|
|
@@ -74,10 +78,14 @@ export function WithDrillSelect({ widgetRef, children, insight, returnFocusToIns
|
|
|
74
78
|
drills,
|
|
75
79
|
dropdownProps: { correlationId: dropdownProps?.correlationId, drillEvent: dropdownProps?.drillEvent },
|
|
76
80
|
insight,
|
|
81
|
+
isDrillRestricted,
|
|
77
82
|
handleClose,
|
|
78
83
|
});
|
|
79
84
|
const onSelect = useCallback((drillDefinition, context, drillEvent, correlationId, drillContext) => {
|
|
80
|
-
const { drills, dropdownProps, insight, handleClose } = onSelectDepsRef.current;
|
|
85
|
+
const { drills, dropdownProps, insight, handleClose, isDrillRestricted } = onSelectDepsRef.current;
|
|
86
|
+
if (isDrillRestricted(drillDefinition)) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
81
89
|
const effectiveDrillEvent = drillEvent ?? dropdownProps?.drillEvent;
|
|
82
90
|
const effectiveCorrelationId = correlationId ?? dropdownProps?.correlationId;
|
|
83
91
|
const effectiveInsight = drillContext?.insight ?? insight;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/DrillSelect/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,8BAA8B,EAAE,KAAK,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAE1G,OAAO,EACH,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC5B,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,oBAAY,SAAS;IACjB,kBAAkB,uBAAuB;IACzC,gBAAgB,qBAAqB;IACrC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,eAAe,oBAAoB;IACnC,mBAAmB,wBAAwB;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,wBAAwB,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,gBAAgB,EAAE,wBAAwB,EAAE,CAAC;IAC7C,UAAU,EAAE,oBAAoB,CAAC;IACjC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,yBAAyB,GAAG,8BAA8B,GAAG,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/DrillSelect/types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,8BAA8B,EAAE,KAAK,4BAA4B,EAAE,MAAM,kBAAkB,CAAC;AAE1G,OAAO,EACH,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC5B,MAAM,mBAAmB,CAAC;AAE3B;;GAEG;AACH,oBAAY,SAAS;IACjB,kBAAkB,uBAAuB;IACzC,gBAAgB,qBAAqB;IACrC,YAAY,iBAAiB;IAC7B,UAAU,eAAe;IACzB,eAAe,oBAAoB;IACnC,mBAAmB,wBAAwB;CAC9C;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,wBAAwB,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAChC,gBAAgB,EAAE,wBAAwB,EAAE,CAAC;IAC7C,UAAU,EAAE,oBAAoB,CAAC;IACjC,YAAY,CAAC,EAAE,sBAAsB,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,yBAAyB,GAAG,8BAA8B,GAAG,4BAA4B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDrillSelectDropdownMenuItems.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/hooks/useDrillSelectDropdownMenuItems.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,WAAW,EAAyB,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAuB3E,MAAM,WAAW,gCAAgC;IAC7C,WAAW,EAAE;QACT,IAAI,EAAE,SAAS,CAAC;QAChB,eAAe,EAAE,wBAAwB,CAAC;QAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;KACxB,CAAC;CACL;AAED,MAAM,MAAM,oBAAoB,GAAG,WAAW,CAAC,gCAAgC,CAAC,CAAC;AAEjF,eAAO,MAAM,+BAA+B,4GAOzC;IACC,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,mBAAmB,EAAE,gBAAgB,EAAE,CAAC;IACxC,sBAAsB,EAAE,gBAAgB,EAAE,CAAC;IAC3C,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxE,KAAG,oBAAoB,
|
|
1
|
+
{"version":3,"file":"useDrillSelectDropdownMenuItems.d.ts","sourceRoot":"","sources":["../../../../src/presentation/drill/hooks/useDrillSelectDropdownMenuItems.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,WAAW,EAAyB,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAuB3E,MAAM,WAAW,gCAAgC;IAC7C,WAAW,EAAE;QACT,IAAI,EAAE,SAAS,CAAC;QAChB,eAAe,EAAE,wBAAwB,CAAC;QAC1C,QAAQ,EAAE,MAAM,IAAI,CAAC;KACxB,CAAC;CACL;AAED,MAAM,MAAM,oBAAoB,GAAG,WAAW,CAAC,gCAAgC,CAAC,CAAC;AAEjF,eAAO,MAAM,+BAA+B,4GAOzC;IACC,cAAc,EAAE,gBAAgB,EAAE,CAAC;IACnC,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,mBAAmB,EAAE,gBAAgB,EAAE,CAAC;IACxC,sBAAsB,EAAE,gBAAgB,EAAE,CAAC;IAC3C,eAAe,EAAE,gBAAgB,EAAE,CAAC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACxE,KAAG,oBAAoB,EA2FvB,CAAC"}
|
|
@@ -35,7 +35,7 @@ export const useDrillSelectDropdownMenuItems = ({ drillDownItems, drillItems, cr
|
|
|
35
35
|
type: "interactive",
|
|
36
36
|
id: `${groupId}-${index}`,
|
|
37
37
|
stringTitle: getMenuItemStringTitle(item),
|
|
38
|
-
iconLeft: _jsx(UiIcon, { type: DRILL_ICON_NAME[item.type], size: 16, color: "complementary-5" }),
|
|
38
|
+
iconLeft: (_jsx(UiIcon, { type: item.isRestricted ? "lock" : DRILL_ICON_NAME[item.type], size: 16, color: "complementary-5" })),
|
|
39
39
|
isDisabled: item.isDisabled,
|
|
40
40
|
tooltip: item.tooltipText,
|
|
41
41
|
ariaAttributes: {
|
|
@@ -47,7 +47,9 @@ export const useDrillSelectDropdownMenuItems = ({ drillDownItems, drillItems, cr
|
|
|
47
47
|
type: item.type,
|
|
48
48
|
drillDefinition: item.drillDefinition,
|
|
49
49
|
onSelect: () => {
|
|
50
|
-
|
|
50
|
+
if (!item.isDisabled) {
|
|
51
|
+
onSelect(item.drillDefinition, item.context);
|
|
52
|
+
}
|
|
51
53
|
},
|
|
52
54
|
},
|
|
53
55
|
})),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InsightNotSavedDialog.d.ts","sourceRoot":"","sources":["../../../src/presentation/insightNotSavedDialog/InsightNotSavedDialog.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InsightNotSavedDialog.d.ts","sourceRoot":"","sources":["../../../src/presentation/insightNotSavedDialog/InsightNotSavedDialog.tsx"],"names":[],"mappings":"AAeA;;GAEG;AACH,wBAAgB,qBAAqB,mDAwDpC"}
|
|
@@ -4,9 +4,8 @@ import { useCallback, useState } from "react";
|
|
|
4
4
|
import { useIntl } from "react-intl";
|
|
5
5
|
import { ConfirmDialog, Typography, UiButton, UiIcon } from "@gooddata/sdk-ui-kit";
|
|
6
6
|
import { useDashboardDispatch, useDashboardSelector } from "../../model/react/DashboardStoreProvider.js";
|
|
7
|
-
import { selectDraftInsightsUsedOnDashboard } from "../../model/store/insights/insightsSelectors.js";
|
|
8
7
|
import { uiActions } from "../../model/store/ui/index.js";
|
|
9
|
-
import { selectIsInsightNotSavedDialogOpen } from "../../model/store/ui/uiSelectors.js";
|
|
8
|
+
import { selectInsightNotSavedDialogDraftInsightsToPersist, selectIsInsightNotSavedDialogOpen, } from "../../model/store/ui/uiSelectors.js";
|
|
10
9
|
/**
|
|
11
10
|
* @internal
|
|
12
11
|
*/
|
|
@@ -19,11 +18,11 @@ export function InsightNotSavedDialog() {
|
|
|
19
18
|
dispatch(uiActions.confirmInsightNotSavedDialogSubmit());
|
|
20
19
|
}, [dispatch]);
|
|
21
20
|
const closeDialog = useCallback(() => dispatch(uiActions.closeInsightNotSavedDialog()), [dispatch]);
|
|
22
|
-
const unsavedInsights = useDashboardSelector(
|
|
21
|
+
const unsavedInsights = useDashboardSelector(selectInsightNotSavedDialogDraftInsightsToPersist);
|
|
23
22
|
if (!isInsightNotSavedDialogOpen) {
|
|
24
23
|
return null;
|
|
25
24
|
}
|
|
26
|
-
return (_jsx(ConfirmDialog, { isPositive: true, dataTestId: "s-insight-not-saved-dialog", headline: intl.formatMessage({ id: "insightNotSavedDialog.headline" }), submitButtonText: intl.formatMessage({ id: "insightNotSavedDialog.saveAll" }), cancelButtonText: intl.formatMessage({ id: "insightNotSavedDialog.
|
|
25
|
+
return (_jsx(ConfirmDialog, { isPositive: true, dataTestId: "s-insight-not-saved-dialog", headline: intl.formatMessage({ id: "insightNotSavedDialog.headline" }), submitButtonText: intl.formatMessage({ id: "insightNotSavedDialog.saveAll" }), cancelButtonText: intl.formatMessage({ id: "insightNotSavedDialog.cancel" }), onCancel: closeDialog, onSubmit: submitDialog, children: _jsxs("div", { className: "gdc-insight-not-saved-dialog", children: [_jsx(Typography, { tagName: "p", children: intl.formatMessage({ id: "insightNotSavedDialog.message" }) }), _jsx(UiButton, { iconBeforeSize: 12, variant: "dropdownInline", label: intl.formatMessage({ id: "insightNotSavedDialog.visualisations" }, {
|
|
27
26
|
count: unsavedInsights.length,
|
|
28
|
-
}), iconBefore: showVisualisationsList ? "navigateDown" : "navigateRight", onClick: () => setShowVisualisationsList(!showVisualisationsList) }), showVisualisationsList ? (_jsx("ul", { children: unsavedInsights.map((insight) => (_jsxs("li", { children: [_jsx(UiIcon, { type: "visualization", size: 18 }), " ", insight.insight.title] }, insight.insight.identifier))) })) : null] }) }));
|
|
27
|
+
}), iconBefore: showVisualisationsList ? "navigateDown" : "navigateRight", onClick: () => setShowVisualisationsList(!showVisualisationsList) }), showVisualisationsList ? (_jsx("ul", { children: unsavedInsights.map((insight) => (_jsxs("li", { children: [_jsx(UiIcon, { type: "visualization", size: 18, color: "complementary-5" }), " ", insight.insight.title] }, insight.insight.identifier))) })) : null] }) }));
|
|
29
28
|
}
|
|
@@ -83,7 +83,7 @@ export declare const en_US: {
|
|
|
83
83
|
text: string;
|
|
84
84
|
crowdinContext: string;
|
|
85
85
|
};
|
|
86
|
-
"insightNotSavedDialog.
|
|
86
|
+
"insightNotSavedDialog.cancel": {
|
|
87
87
|
text: string;
|
|
88
88
|
crowdinContext: string;
|
|
89
89
|
};
|
|
@@ -511,6 +511,10 @@ export declare const en_US: {
|
|
|
511
511
|
text: string;
|
|
512
512
|
crowdinContext: string;
|
|
513
513
|
};
|
|
514
|
+
"settingsDashboardDialog.section.timezone.defaultTimezone.workspace.tooltip.learnMore": {
|
|
515
|
+
text: string;
|
|
516
|
+
crowdinContext: string;
|
|
517
|
+
};
|
|
514
518
|
"settingsDashboardDialog.section.timezone.defaultTimezone.fromBrowser": {
|
|
515
519
|
text: string;
|
|
516
520
|
crowdinContext: string;
|
|
@@ -975,6 +979,10 @@ export declare const en_US: {
|
|
|
975
979
|
text: string;
|
|
976
980
|
crowdinContext: string;
|
|
977
981
|
};
|
|
982
|
+
"dialogs.automation.filters.restricted.deleteTooltip": {
|
|
983
|
+
text: string;
|
|
984
|
+
crowdinContext: string;
|
|
985
|
+
};
|
|
978
986
|
"dialogs.automation.filters.deleteTooltip": {
|
|
979
987
|
text: string;
|
|
980
988
|
crowdinContext: string;
|
|
@@ -1147,6 +1155,10 @@ export declare const en_US: {
|
|
|
1147
1155
|
text: string;
|
|
1148
1156
|
crowdinContext: string;
|
|
1149
1157
|
};
|
|
1158
|
+
"dialogs.export.csv.submit.disabledTooltip": {
|
|
1159
|
+
text: string;
|
|
1160
|
+
crowdinContext: string;
|
|
1161
|
+
};
|
|
1150
1162
|
"dialogs.export.pdf.headline": {
|
|
1151
1163
|
text: string;
|
|
1152
1164
|
crowdinContext: string;
|
|
@@ -2603,6 +2615,10 @@ export declare const en_US: {
|
|
|
2603
2615
|
text: string;
|
|
2604
2616
|
crowdinContext: string;
|
|
2605
2617
|
};
|
|
2618
|
+
"drill_modal_picker.restricted": {
|
|
2619
|
+
text: string;
|
|
2620
|
+
crowdinContext: string;
|
|
2621
|
+
};
|
|
2606
2622
|
"visualizationSwitcher.restrictedEntry": {
|
|
2607
2623
|
text: string;
|
|
2608
2624
|
crowdinContext: string;
|
|
@@ -3359,6 +3375,10 @@ export declare const en_US: {
|
|
|
3359
3375
|
text: string;
|
|
3360
3376
|
crowdinContext: string;
|
|
3361
3377
|
};
|
|
3378
|
+
"automationFilters.announcement.restrictedFiltersRemoved": {
|
|
3379
|
+
text: string;
|
|
3380
|
+
crowdinContext: string;
|
|
3381
|
+
};
|
|
3362
3382
|
"automationFilters.announcement.filterChanged": {
|
|
3363
3383
|
text: string;
|
|
3364
3384
|
crowdinContext: string;
|