@gooddata/sdk-ui-dashboard 11.58.0-alpha.2 → 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/NOTICE +8 -8
- package/esm/__version.d.ts +1 -1
- package/esm/__version.js +1 -1
- package/esm/index.d.ts +5 -5
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +3 -3
- package/esm/internal.d.ts +1 -0
- package/esm/internal.d.ts.map +1 -1
- package/esm/internal.js +1 -0
- package/esm/model/DashboardTester.d.ts.map +1 -1
- package/esm/model/DashboardTester.js +7 -1
- 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/initializeDashboardHandler/index.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.js +13 -6
- 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/commandHandlers/parameters/filterParameterDependenciesWorker.d.ts +45 -0
- package/esm/model/commandHandlers/parameters/filterParameterDependenciesWorker.d.ts.map +1 -0
- package/esm/model/commandHandlers/parameters/filterParameterDependenciesWorker.js +99 -0
- package/esm/model/commandHandlers/parameters/insightParameterDependenciesWorker.d.ts +11 -0
- package/esm/model/commandHandlers/parameters/insightParameterDependenciesWorker.d.ts.map +1 -0
- package/esm/model/commandHandlers/parameters/insightParameterDependenciesWorker.js +71 -0
- package/esm/model/commandHandlers/parameters/loadFilterParameterDependencies.d.ts +22 -0
- package/esm/model/commandHandlers/parameters/loadFilterParameterDependencies.d.ts.map +1 -0
- package/esm/model/commandHandlers/parameters/loadFilterParameterDependencies.js +39 -0
- package/esm/model/commandHandlers/parameters/loadInsightParameterDependencies.d.ts +21 -0
- package/esm/model/commandHandlers/parameters/loadInsightParameterDependencies.d.ts.map +1 -0
- package/esm/model/commandHandlers/parameters/loadInsightParameterDependencies.js +86 -0
- package/esm/model/react/useInitializeDashboardStore.d.ts.map +1 -1
- package/esm/model/react/useInitializeDashboardStore.js +4 -0
- package/esm/model/react/useWidgetExecConfig.d.ts +4 -4
- package/esm/model/react/useWidgetExecConfig.d.ts.map +1 -1
- package/esm/model/react/useWidgetExecConfig.js +2 -2
- package/esm/model/store/catalog/catalogReducers.d.ts +16 -4
- package/esm/model/store/catalog/catalogReducers.d.ts.map +1 -1
- package/esm/model/store/catalog/catalogReducers.js +15 -3
- package/esm/model/store/catalog/catalogSelectors.d.ts +47 -7
- package/esm/model/store/catalog/catalogSelectors.d.ts.map +1 -1
- package/esm/model/store/catalog/catalogSelectors.js +33 -7
- package/esm/model/store/catalog/catalogState.d.ts +30 -9
- package/esm/model/store/catalog/catalogState.d.ts.map +1 -1
- package/esm/model/store/catalog/catalogState.js +2 -1
- package/esm/model/store/catalog/index.d.ts +4 -1
- package/esm/model/store/catalog/index.d.ts.map +1 -1
- 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/tabs/parameters/parametersHelpers.d.ts +42 -8
- package/esm/model/store/tabs/parameters/parametersHelpers.d.ts.map +1 -1
- package/esm/model/store/tabs/parameters/parametersHelpers.js +88 -19
- package/esm/model/store/tabs/parameters/parametersSelectors.d.ts +13 -6
- package/esm/model/store/tabs/parameters/parametersSelectors.d.ts.map +1 -1
- package/esm/model/store/tabs/parameters/parametersSelectors.js +24 -13
- 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/AutomationAttributeFilter.d.ts.map +1 -1
- package/esm/presentation/automations/shared/automationFilters/components/AutomationAttributeFilter.js +16 -2
- 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/de-DE.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +5 -2
- 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 +27 -7
- package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/es-419.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +5 -2
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +3 -0
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +5 -2
- package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts +4 -8
- package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts.map +1 -1
- package/esm/presentation/widget/common/RestrictedPlaceholder.js +16 -23
- package/esm/presentation/widget/insight/DefaultInsightBody/DefaultInsightBody.d.ts.map +1 -1
- package/esm/presentation/widget/insight/DefaultInsightBody/DefaultInsightBody.js +2 -4
- package/esm/presentation/widget/insight/LayeredTableView.d.ts +1 -1
- package/esm/presentation/widget/insight/LayeredTableView.d.ts.map +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.d.ts.map +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.js +2 -3
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.d.ts.map +1 -1
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.js +1 -1
- package/esm/presentation/widget/insight/types.d.ts +1 -1
- package/esm/presentation/widget/insight/types.d.ts.map +1 -1
- package/esm/presentation/widget/richText/RestrictedReferencesDialog.d.ts.map +1 -1
- package/esm/presentation/widget/richText/RestrictedReferencesDialog.js +5 -6
- package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.js +1 -1
- package/esm/presentation/widget/visualizationSwitcher/configuration/VisualizationsList/VisualizationListItem.d.ts.map +1 -1
- package/esm/presentation/widget/visualizationSwitcher/configuration/VisualizationsList/VisualizationListItem.js +1 -4
- package/esm/presentation/widget/widget/InsightWidget/DefaultDashboardInsightWidget.js +2 -3
- package/esm/sdk-ui-dashboard.d.ts +88 -61
- 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 +13 -20
- 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/css/richTextWidget.css +4 -0
- package/styles/css/richTextWidget.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/styles/scss/richTextWidget.scss +5 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.d.ts +0 -13
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.d.ts.map +0 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.js +0 -98
- 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
- package/esm/presentation/widget/insight/geoDefaultDisplayFormRefs.d.ts +0 -5
- package/esm/presentation/widget/insight/geoDefaultDisplayFormRefs.d.ts.map +0 -1
- package/esm/presentation/widget/insight/geoDefaultDisplayFormRefs.js +0 -28
- package/esm/presentation/widget/insight/insightToTable.d.ts +0 -74
- package/esm/presentation/widget/insight/insightToTable.d.ts.map +0 -1
- package/esm/presentation/widget/insight/insightToTable.js +0 -482
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { areObjRefsEqual, insightRef, isDashboardLayout, isDrillToCustomUrl, isInsightWidget, isInsightWidgetDefinition, isVisualizationSwitcherWidget, isVisualizationSwitcherWidgetDefinition, } from "@gooddata/sdk-model";
|
|
3
|
+
import { getDrillToCustomUrlReferenceMap } from "@gooddata/sdk-model/internal";
|
|
4
|
+
/** Refresh dependencies at the save boundary, including untouched drills on existing dashboards. */
|
|
5
|
+
export function dashboardWithDrillReferences(dashboard, insights) {
|
|
6
|
+
function updateWidget(widget) {
|
|
7
|
+
if (isDashboardLayout(widget)) {
|
|
8
|
+
return updateLayout(widget);
|
|
9
|
+
}
|
|
10
|
+
if (isVisualizationSwitcherWidget(widget) || isVisualizationSwitcherWidgetDefinition(widget)) {
|
|
11
|
+
return { ...widget, visualizations: widget.visualizations.map(updateInsightWidget) };
|
|
12
|
+
}
|
|
13
|
+
return updateInsightWidget(widget);
|
|
14
|
+
}
|
|
15
|
+
function updateInsightWidget(widget) {
|
|
16
|
+
if (!isInsightWidget(widget) && !isInsightWidgetDefinition(widget)) {
|
|
17
|
+
return widget;
|
|
18
|
+
}
|
|
19
|
+
const insight = insights.find((candidate) => areObjRefsEqual(insightRef(candidate), widget.insight));
|
|
20
|
+
return {
|
|
21
|
+
...widget,
|
|
22
|
+
drills: widget.drills.map((drill) => isDrillToCustomUrl(drill)
|
|
23
|
+
? {
|
|
24
|
+
...drill,
|
|
25
|
+
target: {
|
|
26
|
+
...drill.target,
|
|
27
|
+
references: getDrillToCustomUrlReferenceMap(drill.target, insight),
|
|
28
|
+
},
|
|
29
|
+
}
|
|
30
|
+
: drill),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function updateLayout(layout) {
|
|
34
|
+
return {
|
|
35
|
+
...layout,
|
|
36
|
+
sections: layout.sections.map((section) => ({
|
|
37
|
+
...section,
|
|
38
|
+
items: section.items.map((item) => ({
|
|
39
|
+
...item,
|
|
40
|
+
widget: item.widget ? updateWidget(item.widget) : item.widget,
|
|
41
|
+
})),
|
|
42
|
+
})),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
...dashboard,
|
|
47
|
+
layout: dashboard.layout ? updateLayout(dashboard.layout) : undefined,
|
|
48
|
+
tabs: dashboard.tabs?.map((tab) => ({
|
|
49
|
+
...tab,
|
|
50
|
+
layout: tab.layout ? updateLayout(tab.layout) : undefined,
|
|
51
|
+
})),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/initializeDashboardHandler/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EACH,KAAK,UAAU,EAIf,KAAK,sBAAsB,EAW9B,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAyB1E,OAAO,EACH,KAAK,gBAAgB,EAGxB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/initializeDashboardHandler/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EACH,KAAK,UAAU,EAIf,KAAK,sBAAsB,EAW9B,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAyB1E,OAAO,EACH,KAAK,gBAAgB,EAGxB,MAAM,+BAA+B,CAAC;AAqfvC,wBAAiB,cAAc,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB;;;uIAyB9E;AAkCD,wBAAiB,2BAA2B,CAAC,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU;;;6LAOxF;AAED,wBAAiB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,sNAW3D;AAoCD,wBAAiB,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,GAAG,YAAY,CAoCzG"}
|
|
@@ -30,6 +30,8 @@ import { uiActions } from "../../../store/ui/index.js";
|
|
|
30
30
|
import { unavailableObjectsActions } from "../../../store/unavailableObjects/index.js";
|
|
31
31
|
import { selectUnavailableObjects } from "../../../store/unavailableObjects/unavailableObjectsSelectors.js";
|
|
32
32
|
import { userActions } from "../../../store/user/index.js";
|
|
33
|
+
import { collectDashboardFilterContextItems, loadFilterParameterDependencies, } from "../../parameters/loadFilterParameterDependencies.js";
|
|
34
|
+
import { loadInsightParameterDependencies } from "../../parameters/loadInsightParameterDependencies.js";
|
|
33
35
|
import { changeDashboardTimezoneOverrideHandler } from "../../timezone/changeDashboardTimezoneOverrideHandler.js";
|
|
34
36
|
import { applyDefaultFilterView } from "../common/filterViews.js";
|
|
35
37
|
import { actionsToInitializeExistingDashboard, actionsToInitializeNewDashboard, } from "../common/stateInitializers.js";
|
|
@@ -41,7 +43,6 @@ import { loadDashboardPermissions } from "./loadDashboardPermissions.js";
|
|
|
41
43
|
import { loadDateHierarchyTemplates } from "./loadDateHierarchyTemplates.js";
|
|
42
44
|
import { loadExportTimezone } from "./loadExportTimezone.js";
|
|
43
45
|
import { loadFilterViews } from "./loadFilterViews.js";
|
|
44
|
-
import { loadMeasureParameterDependencies } from "./loadMeasureParameterDependencies.js";
|
|
45
46
|
import { dashboardLoadReferenceTypes, loadUnavailableReferences } from "./loadUnavailableReferences.js";
|
|
46
47
|
import { loadUser } from "./loadUser.js";
|
|
47
48
|
import { mergeDateFilterConfigWithOverrides } from "./mergeDateFilterConfigs.js";
|
|
@@ -194,10 +195,11 @@ function* loadExistingDashboard(ctx, cmd, dashboardRef) {
|
|
|
194
195
|
// Note: activeTabLocalIdentifier is app state only, NOT persisted to/read from dashboard MD
|
|
195
196
|
const resolvedActiveTabId = resolveActiveTabId(dashboardWithFilterView.tabs, cmd.payload.initialTabId, undefined);
|
|
196
197
|
const dashboard = dashboardWithFilterView;
|
|
197
|
-
const [{ tabsAttributeFilterConfigs, tabsDateFilterConfig, tabsDateFilterConfigSource }, workspaceParameters,
|
|
198
|
+
const [{ tabsAttributeFilterConfigs, tabsDateFilterConfig, tabsDateFilterConfigSource }, workspaceParameters, insightParameterDependencies, filterParameterDependencies,] = yield all([
|
|
198
199
|
call(getTabsFilterConfigs, dashboard, config, ctx, cmd),
|
|
199
200
|
call(loadWorkspaceParametersWithStatus, ctx, config.settings),
|
|
200
|
-
call(
|
|
201
|
+
call(loadInsightParameterDependencies, ctx, insights, config.settings?.enableParameters ?? false),
|
|
202
|
+
call(loadFilterParameterDependencies, ctx, collectDashboardFilterContextItems(dashboard), config.settings?.enableParameters ?? false),
|
|
201
203
|
]);
|
|
202
204
|
const workspaceParametersList = Array.isArray(workspaceParameters) ? workspaceParameters : [];
|
|
203
205
|
const initActions = yield call(actionsToInitializeExistingDashboard, ctx, dashboard, insights, config.settings, config.settings.enableImmediateAttributeFilterDisplayAsLabelMigration ?? false, undefined, undefined, tabsAttributeFilterConfigs, tabsDateFilterConfig, tabsDateFilterConfigSource, createDisplayFormMap([], []), cmd.payload.persistedDashboard, resolvedActiveTabId, workspaceParametersList);
|
|
@@ -212,7 +214,8 @@ function* loadExistingDashboard(ctx, cmd, dashboardRef) {
|
|
|
212
214
|
permissionsActions.setPermissions(permissions),
|
|
213
215
|
catalogActions.setCatalogItems(catalogPayload),
|
|
214
216
|
catalogActions.setCatalogParameters(makeCatalogParametersPayload(workspaceParameters)),
|
|
215
|
-
catalogActions.
|
|
217
|
+
catalogActions.setCatalogInsightParameters(insightParameterDependencies),
|
|
218
|
+
catalogActions.setCatalogFilterParameters(filterParameterDependencies),
|
|
216
219
|
...initActions,
|
|
217
220
|
// NOTE: Tab configs (dateFilterConfig, dateFilterConfigs, attributeFilterConfigs, filterContext)
|
|
218
221
|
// are now initialized as part of the tabs state in initActions via setTabs action
|
|
@@ -256,7 +259,10 @@ function* initializeNewDashboard(ctx, cmd) {
|
|
|
256
259
|
const { initActions, dashboard, insights } = yield call(actionsToInitializeNewDashboard, ctx, config.settings, dateFilterConfig, loadedCatalog
|
|
257
260
|
? createDisplayFormMapFromCatalog(loadedCatalog.catalog, loadedCatalog.computedAttributes)
|
|
258
261
|
: createDisplayFormMap([], []), cmd.payload.initialTabId, workspaceParametersList);
|
|
259
|
-
const
|
|
262
|
+
const insightParameterDependencies = yield call(loadInsightParameterDependencies, ctx, insights, config.settings?.enableParameters ?? false);
|
|
263
|
+
// a new dashboard starts with the default (date-only) filter context, so there is nothing to
|
|
264
|
+
// resolve yet; this only records the status so the widgets do not wait for a load that never comes
|
|
265
|
+
const filterParameterDependencies = yield call(loadFilterParameterDependencies, ctx, [], config.settings?.enableParameters ?? false);
|
|
260
266
|
const batch = batchActions([
|
|
261
267
|
backendCapabilitiesActions.setBackendCapabilities(backend.capabilities),
|
|
262
268
|
configActions.setConfig(config),
|
|
@@ -273,7 +279,8 @@ function* initializeNewDashboard(ctx, cmd) {
|
|
|
273
279
|
dateHierarchyTemplates: dateHierarchyTemplates,
|
|
274
280
|
}),
|
|
275
281
|
catalogActions.setCatalogParameters(makeCatalogParametersPayload(workspaceParameters)),
|
|
276
|
-
catalogActions.
|
|
282
|
+
catalogActions.setCatalogInsightParameters(insightParameterDependencies),
|
|
283
|
+
catalogActions.setCatalogFilterParameters(filterParameterDependencies),
|
|
277
284
|
listedDashboardsActions.setListedDashboards(listedDashboards),
|
|
278
285
|
accessibleDashboardsActions.setAccessibleDashboards(listedDashboards),
|
|
279
286
|
executionResultsActions.clearAllExecutionResults(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveAsDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAqB/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"saveAsDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAqB/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,2BAA2B,CAAC;AA6BxF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAoUnE,wBAAiB,sBAAsB,CACnC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,eAAe,GACrB,YAAY,CAAC,kBAAkB,CAAC,CA2ClC"}
|
|
@@ -11,6 +11,7 @@ import { accessibleDashboardsActions } from "../../store/accessibleDashboards/in
|
|
|
11
11
|
import { selectBackendCapabilities } from "../../store/backendCapabilities/backendCapabilitiesSelectors.js";
|
|
12
12
|
import { selectEnableImmediateAttributeFilterDisplayAsLabelMigration } from "../../store/config/configSelectors.js";
|
|
13
13
|
import { selectCrossFilteringFiltersLocalIdentifiers } from "../../store/drill/drillSelectors.js";
|
|
14
|
+
import { selectInsights } from "../../store/insights/insightsSelectors.js";
|
|
14
15
|
import { listedDashboardsActions } from "../../store/listedDashboards/index.js";
|
|
15
16
|
import { metaActions } from "../../store/meta/index.js";
|
|
16
17
|
import { selectDashboardDescriptor, selectPersistedDashboard, selectPersistedDashboardFilterContextAsFilterContextDefinition, } from "../../store/meta/metaSelectors.js";
|
|
@@ -28,6 +29,7 @@ import { selectTabs } from "../../store/tabs/tabsSelectors.js";
|
|
|
28
29
|
import { selectCurrentUser } from "../../store/user/userSelectors.js";
|
|
29
30
|
import { changeRenderModeHandler } from "../renderMode/changeRenderModeHandler.js";
|
|
30
31
|
import { getMigratedAttributeFilters, mergedMigratedAttributeFilters, } from "./common/migratedAttributeFilters.js";
|
|
32
|
+
import { dashboardWithDrillReferences } from "./dashboardDrillReferences.js";
|
|
31
33
|
import { processLayout } from "./saveDashboardHandler.js";
|
|
32
34
|
function createDashboard(ctx, saveAsCtx) {
|
|
33
35
|
return ctx.backend.workspace(ctx.workspace).dashboards().createDashboard(saveAsCtx.dashboardToSave);
|
|
@@ -159,10 +161,11 @@ function* createDashboardSaveAsContext(cmd) {
|
|
|
159
161
|
...shareProp,
|
|
160
162
|
...pluginsProp,
|
|
161
163
|
};
|
|
164
|
+
const insights = yield select(selectInsights);
|
|
162
165
|
return {
|
|
163
166
|
cmd,
|
|
164
167
|
dashboardFromState,
|
|
165
|
-
dashboardToSave,
|
|
168
|
+
dashboardToSave: dashboardWithDrillReferences(dashboardToSave, insights),
|
|
166
169
|
};
|
|
167
170
|
}
|
|
168
171
|
function* saveAs(ctx, saveAsCtx) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/dashboard/saveDashboardHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,OAAO,EAGH,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAWxB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,2BAA2B,CAAC;AAkChF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"saveDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/dashboard/saveDashboardHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,OAAO,EAGH,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAWxB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,2BAA2B,CAAC;AAkChF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AA2L1E,wBAAgB,uBAAuB,CACnC,SAAS,EAAE,oBAAoB,EAC/B,gBAAgB,EAAE,OAAO,YAAO,EAChC,cAAc,EAAE,OAAO,GACxB,oBAAoB,CAkBtB;AAyED,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAEjG;AAsUD,wBAAiB,oBAAoB,CACjC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,cAAc,GACpB,YAAY,CAAC,cAAc,GAAG,SAAS,CAAC,CAsG1C"}
|
|
@@ -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":"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;AAa7B,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,8BAA8B,EAEtC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAgBjE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAUnE,UAAU,iCAAiC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,kBAAkB;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,wBAAiB,gBAAgB,CAC7B,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,GAAG,EAAE,gBAAgB,GACtB,YAAY,CAAC,kBAAkB,CAAC,CAYlC;AAED,wBAAiB,0BAA0B,CACvC,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EACpC,GAAG,EAAE,gBAAgB,GACtB,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CASpC;AA4BD;;GAEG;AACH,wBAAgB,wCAAwC,CACpD,yBAAyB,EAAE,8BAA8B,EAAE,EAC3D,WAAW,EAAE,mCAAmC,wEA+DnD;AAED,wBAAiB,0BAA0B,CACvC,sBAAsB,EAAE,mCAAmC,EAAE,EAC7D,GAAG,EAAE,gBAAgB,GACtB,YAAY,CAAC;IACZ,2BAA2B,EAAE,mCAAmC,EAAE,CAAC;IACnE,uBAAuB,EAAE,mCAAmC,EAAE,CAAC;CAClE,CAAC,CAuBD;AAED,wBAAiB,yCAAyC,CACtD,yBAAyB,EAAE,8BAA8B,EAAE,EAC3D,sBAAsB,EAAE,mCAAmC,EAAE,EAC7D,GAAG,EAAE,gBAAgB,GACtB,YAAY,CAAC,kBAAkB,EAAE,CAAC,CAiDpC;AAKD,wBAAiB,mCAAmC,CAChD,GAAG,EAAE,MAAM,EACX,yBAAyB,EAAE,8BAA8B,EAAE,EAC3D,GAAG,EAAE,gBAAgB,GACtB,YAAY,CAAC,iCAAiC,EAAE,CAAC,CA8CnD;AAuED,wBAAiB,uCAAuC,CACpD,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,gBAAgB,GACtB,YAAY,CAAC,iCAAiC,EAAE,CAAC,CA8BnD;AAwBD,wBAAiB,0CAA0C,CACvD,GAAG,EAAE,MAAM,GACZ,YAAY,CAAC,iCAAiC,EAAE,CAAC,CAgBnD;AAsBD,wBAAiB,wCAAwC,CACrD,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAClB,YAAY,CAAC,iCAAiC,EAAE,CAAC,CAgBnD;AAED,wBAAiB,qCAAqC,CAClD,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAClB,YAAY,CAAC,iCAAiC,EAAE,CAAC,CAkDnD;AAOD,wBAAiB,iCAAiC,CAC9C,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,gBAAgB,GACtB,YAAY,CAAC,iCAAiC,EAAE,CAAC,CAwCnD;AAYD,wBAAiB,uBAAuB,CACpC,WAAW,EAAE,sBAAsB,EACnC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,GACvB,YAAY,CAAC,MAAM,CAAC,CAuDtB;AAMD;;GAEG;AACH,wBAAgB,4BAA4B,CACxC,MAAM,EAAE,4BAA4B,GAAG,mBAAmB,GAC3D,MAAM,CAOR;AAcD;;GAEG;AACH,wBAAgB,oCAAoC,CAChD,UAAU,EAAE,2BAA2B,EAAE,GAAG,SAAS,GACtD,MAAM,CAgBR"}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type SagaIterator } from "redux-saga";
|
|
2
|
+
import { type DashboardContext } from "../../types/commonTypes.js";
|
|
3
|
+
/**
|
|
4
|
+
* Keeps the dashboard-filter → parameter dependency map complete as the filter contexts change.
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Counterpart of {@link newInsightParameterDependenciesWorker} for dashboard filters. After any write
|
|
8
|
+
* to the tabs slice it collects the objects the current filters of every tab read and loads the ones
|
|
9
|
+
* the map does not know yet, so a widget picks up a parameter it now depends on through a filter added
|
|
10
|
+
* or changed after initialization (edit mode, an applied filter view, a new tab). Removing a filter
|
|
11
|
+
* needs nothing: the map is keyed by the object a filter reads, not by the filter, and a widget only
|
|
12
|
+
* consults the entries of the filters it currently has. A failed load leaves the map as it is, so the
|
|
13
|
+
* dependencies known so far stay in effect; the failed roots are not retried until the map is
|
|
14
|
+
* initialized again (a dashboard reload), so a filter on an object the graph rejects does not trigger a
|
|
15
|
+
* request on every later write.
|
|
16
|
+
*/
|
|
17
|
+
export declare function newFilterParameterDependenciesWorker(): (ctx: DashboardContext) => SagaIterator<void>;
|
|
18
|
+
/**
|
|
19
|
+
* The roots one store has already requested but that are not in the map: those in flight and those whose
|
|
20
|
+
* request failed. Neither is requested again until {@link IFilterParameterRootTracker.reset}, which also
|
|
21
|
+
* starts a new generation so that a request still in flight from before the reset is discarded on
|
|
22
|
+
* completion instead of writing into the freshly initialized map.
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export interface IFilterParameterRootTracker {
|
|
27
|
+
pending: Set<string>;
|
|
28
|
+
failed: Set<string>;
|
|
29
|
+
generation: number;
|
|
30
|
+
reset(): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
export declare function newFilterParameterRootTracker(): IFilterParameterRootTracker;
|
|
36
|
+
/**
|
|
37
|
+
* Loads the dependencies of the filter roots the map does not know yet. A root is requested at most once
|
|
38
|
+
* between two initializations of the map: one in flight is skipped by the handlers that run meanwhile,
|
|
39
|
+
* and one the graph rejected (a deleted or forbidden object, typically) is remembered by the tracker
|
|
40
|
+
* rather than retried on every later write to the tabs slice. Only real results reach the map.
|
|
41
|
+
*
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
export declare function registerFilterParameterDependencies(ctx: DashboardContext, tracker: IFilterParameterRootTracker): SagaIterator<void>;
|
|
45
|
+
//# sourceMappingURL=filterParameterDependenciesWorker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterParameterDependenciesWorker.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/parameters/filterParameterDependenciesWorker.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AASnE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oCAAoC,UACQ,gBAAgB,KAAG,YAAY,CAAC,IAAI,CAAC,CAShG;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,2BAA2B;IACxC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,2BAA2B,CAa3E;AAED;;;;;;;GAOG;AACH,wBAAiB,mCAAmC,CAChD,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,2BAA2B,GACrC,YAAY,CAAC,IAAI,CAAC,CAuCpB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// (C) 2026 GoodData Corporation
|
|
2
|
+
import { call, put, select, takeEvery } from "redux-saga/effects";
|
|
3
|
+
import { serializeObjRef } from "@gooddata/sdk-model";
|
|
4
|
+
import { selectCatalogFilterParameters, selectCatalogFilterParametersStatus, } from "../../store/catalog/catalogSelectors.js";
|
|
5
|
+
import { catalogActions } from "../../store/catalog/index.js";
|
|
6
|
+
import { selectFiltersByTab } from "../../store/tabs/filterContext/filterContextSelectors.js";
|
|
7
|
+
import { tabsActions } from "../../store/tabs/index.js";
|
|
8
|
+
import { collectFilterParameterRoots } from "../../store/tabs/parameters/parametersHelpers.js";
|
|
9
|
+
import { unbatched } from "./insightParameterDependenciesWorker.js";
|
|
10
|
+
import { loadReachableParameterMap } from "./loadInsightParameterDependencies.js";
|
|
11
|
+
// every filter context write is a `tabs/*` action (the filter contexts live in the tabs slice)
|
|
12
|
+
const TABS_ACTION_PREFIX = `${tabsActions.setTabs.type.split("/")[0]}/`;
|
|
13
|
+
/**
|
|
14
|
+
* Keeps the dashboard-filter → parameter dependency map complete as the filter contexts change.
|
|
15
|
+
*
|
|
16
|
+
* @remarks
|
|
17
|
+
* Counterpart of {@link newInsightParameterDependenciesWorker} for dashboard filters. After any write
|
|
18
|
+
* to the tabs slice it collects the objects the current filters of every tab read and loads the ones
|
|
19
|
+
* the map does not know yet, so a widget picks up a parameter it now depends on through a filter added
|
|
20
|
+
* or changed after initialization (edit mode, an applied filter view, a new tab). Removing a filter
|
|
21
|
+
* needs nothing: the map is keyed by the object a filter reads, not by the filter, and a widget only
|
|
22
|
+
* consults the entries of the filters it currently has. A failed load leaves the map as it is, so the
|
|
23
|
+
* dependencies known so far stay in effect; the failed roots are not retried until the map is
|
|
24
|
+
* initialized again (a dashboard reload), so a filter on an object the graph rejects does not trigger a
|
|
25
|
+
* request on every later write.
|
|
26
|
+
*/
|
|
27
|
+
export function newFilterParameterDependenciesWorker() {
|
|
28
|
+
return function* filterParameterDependenciesWorker(ctx) {
|
|
29
|
+
const tracker = newFilterParameterRootTracker();
|
|
30
|
+
yield takeEvery(catalogActions.setCatalogFilterParameters.match, function onMapReset() {
|
|
31
|
+
tracker.reset();
|
|
32
|
+
});
|
|
33
|
+
yield takeEvery(writesTabs, function* onTabsWritten() {
|
|
34
|
+
yield call(registerFilterParameterDependencies, ctx, tracker);
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
export function newFilterParameterRootTracker() {
|
|
42
|
+
const pending = new Set();
|
|
43
|
+
const failed = new Set();
|
|
44
|
+
return {
|
|
45
|
+
pending,
|
|
46
|
+
failed,
|
|
47
|
+
generation: 0,
|
|
48
|
+
reset() {
|
|
49
|
+
pending.clear();
|
|
50
|
+
failed.clear();
|
|
51
|
+
this.generation += 1;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Loads the dependencies of the filter roots the map does not know yet. A root is requested at most once
|
|
57
|
+
* between two initializations of the map: one in flight is skipped by the handlers that run meanwhile,
|
|
58
|
+
* and one the graph rejected (a deleted or forbidden object, typically) is remembered by the tracker
|
|
59
|
+
* rather than retried on every later write to the tabs slice. Only real results reach the map.
|
|
60
|
+
*
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
63
|
+
export function* registerFilterParameterDependencies(ctx, tracker) {
|
|
64
|
+
const status = yield select(selectCatalogFilterParametersStatus);
|
|
65
|
+
if (status !== "loaded") {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const filtersByTab = yield select(selectFiltersByTab);
|
|
69
|
+
const known = yield select(selectCatalogFilterParameters);
|
|
70
|
+
const unknownRoots = collectFilterParameterRoots(Object.values(filtersByTab).flat()).filter((root) => {
|
|
71
|
+
const key = serializeObjRef(root);
|
|
72
|
+
return !(key in known) && !tracker.pending.has(key) && !tracker.failed.has(key);
|
|
73
|
+
});
|
|
74
|
+
if (unknownRoots.length === 0) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const keys = unknownRoots.map(serializeObjRef);
|
|
78
|
+
const generation = tracker.generation;
|
|
79
|
+
keys.forEach((key) => tracker.pending.add(key));
|
|
80
|
+
try {
|
|
81
|
+
const byRef = yield call(loadReachableParameterMap, ctx, unknownRoots);
|
|
82
|
+
if (tracker.generation === generation) {
|
|
83
|
+
yield put(catalogActions.mergeCatalogFilterParameters(byRef));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
if (tracker.generation === generation) {
|
|
88
|
+
keys.forEach((key) => tracker.failed.add(key));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
if (tracker.generation === generation) {
|
|
93
|
+
keys.forEach((key) => tracker.pending.delete(key));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function writesTabs(action) {
|
|
98
|
+
return unbatched(action).some((item) => item.type.startsWith(TABS_ACTION_PREFIX));
|
|
99
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Action } from "@reduxjs/toolkit";
|
|
2
|
+
import { type SagaIterator } from "redux-saga";
|
|
3
|
+
import { type DashboardContext } from "../../types/commonTypes.js";
|
|
4
|
+
export declare function newInsightParameterDependenciesWorker(): (ctx: DashboardContext) => SagaIterator<void>;
|
|
5
|
+
/**
|
|
6
|
+
* The plain actions an action stands for: itself, or the (recursively unbatched) members of a batch.
|
|
7
|
+
*
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export declare function unbatched(action: Action): Action[];
|
|
11
|
+
//# sourceMappingURL=insightParameterDependenciesWorker.d.ts.map
|