@gooddata/sdk-ui-dashboard 11.56.0-alpha.6 → 11.56.0-alpha.8
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 +1 -1
- package/esm/__version.d.ts +1 -1
- package/esm/__version.js +1 -1
- package/esm/_staging/catalog/computedAttributes.d.ts +43 -0
- package/esm/_staging/catalog/computedAttributes.d.ts.map +1 -0
- package/esm/_staging/catalog/computedAttributes.js +93 -0
- package/esm/_staging/catalog/displayFormMap.d.ts +3 -2
- package/esm/_staging/catalog/displayFormMap.d.ts.map +1 -1
- package/esm/_staging/catalog/displayFormMap.js +9 -3
- package/esm/_staging/metadata/objRefMap.d.ts.map +1 -1
- package/esm/_staging/metadata/objRefMap.js +11 -1
- package/esm/index.d.ts +9 -5
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +7 -3
- package/esm/kdaDialog/composition/hooks/useKdaValidAttributes.js +2 -2
- package/esm/kdaDialog/dialog/hooks/useValidAttributes.d.ts.map +1 -1
- package/esm/kdaDialog/dialog/hooks/useValidAttributes.js +21 -6
- package/esm/kdaDialog/hooks/useAttribute.d.ts.map +1 -1
- package/esm/kdaDialog/hooks/useAttribute.js +16 -8
- package/esm/locales.d.ts +3 -0
- package/esm/locales.d.ts.map +1 -1
- package/esm/locales.js +3 -0
- package/esm/model/commandHandlers/dashboard/common/loadAvailableDisplayFormRefs.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/common/loadAvailableDisplayFormRefs.js +15 -6
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.d.ts +2 -3
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.js +26 -17
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.d.ts +6 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.js +37 -4
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts +7 -2
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts.map +1 -1
- package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js +15 -3
- package/esm/model/commandHandlers/filterContext/attributeFilter/validation/filterDisplayFormValidation.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/attributeFilter/validation/filterDisplayFormValidation.js +10 -3
- package/esm/model/commandHandlers/filterContext/attributeFilter/validation/uniqueFiltersValidation.d.ts.map +1 -1
- package/esm/model/commandHandlers/filterContext/attributeFilter/validation/uniqueFiltersValidation.js +24 -14
- package/esm/model/commandHandlers/scheduledEmail/createScheduledEmailHandler.js +2 -2
- package/esm/model/commandHandlers/scheduledEmail/saveScheduledEmailHandler.js +2 -2
- package/esm/model/commandHandlers/widgets/attributeHierarchyModifiedHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/widgets/attributeHierarchyModifiedHandler.js +6 -0
- package/esm/model/commandHandlers/widgets/exportInsightWidgetHandler.d.ts.map +1 -1
- package/esm/model/commandHandlers/widgets/exportInsightWidgetHandler.js +2 -2
- package/esm/model/commandHandlers/widgets/exportRawInsightWidgetHandler.js +2 -2
- package/esm/model/queries/base.d.ts +1 -1
- package/esm/model/queries/base.d.ts.map +1 -1
- package/esm/model/queries/base.js +1 -1
- package/esm/model/queries/computedAttributeExpression.d.ts +27 -0
- package/esm/model/queries/computedAttributeExpression.d.ts.map +1 -0
- package/esm/model/queries/computedAttributeExpression.js +21 -0
- package/esm/model/queries/connectedAttributes.d.ts +19 -1
- package/esm/model/queries/connectedAttributes.d.ts.map +1 -1
- package/esm/model/queries/connectedAttributes.js +3 -1
- package/esm/model/queries/index.d.ts +2 -1
- package/esm/model/queries/index.d.ts.map +1 -1
- package/esm/model/queryServices/index.d.ts +1 -1
- package/esm/model/queryServices/index.d.ts.map +1 -1
- package/esm/model/queryServices/index.js +2 -0
- package/esm/model/queryServices/queryAttributeByDisplayForm.d.ts.map +1 -1
- package/esm/model/queryServices/queryAttributeByDisplayForm.js +12 -3
- package/esm/model/queryServices/queryAttributeDataset.d.ts.map +1 -1
- package/esm/model/queryServices/queryAttributeDataset.js +9 -1
- package/esm/model/queryServices/queryComputedAttributeExpression.d.ts +4 -0
- package/esm/model/queryServices/queryComputedAttributeExpression.d.ts.map +1 -0
- package/esm/model/queryServices/queryComputedAttributeExpression.js +17 -0
- package/esm/model/queryServices/queryConnectedAttributes.d.ts.map +1 -1
- package/esm/model/queryServices/queryConnectedAttributes.js +20 -5
- package/esm/model/queryServices/queryInsightAttributesMeta.d.ts.map +1 -1
- package/esm/model/queryServices/queryInsightAttributesMeta.js +20 -11
- package/esm/model/react/useIsWidgetRestricted.d.ts +9 -0
- package/esm/model/react/useIsWidgetRestricted.d.ts.map +1 -0
- package/esm/model/react/useIsWidgetRestricted.js +14 -0
- package/esm/model/store/catalog/catalogReducers.d.ts +2 -1
- package/esm/model/store/catalog/catalogReducers.d.ts.map +1 -1
- package/esm/model/store/catalog/catalogReducers.js +2 -1
- package/esm/model/store/catalog/catalogSelectors.d.ts +21 -1
- package/esm/model/store/catalog/catalogSelectors.d.ts.map +1 -1
- package/esm/model/store/catalog/catalogSelectors.js +26 -2
- package/esm/model/store/catalog/catalogState.d.ts +8 -1
- package/esm/model/store/catalog/catalogState.d.ts.map +1 -1
- package/esm/model/store/catalog/catalogState.js +1 -0
- package/esm/model/store/config/configSelectors.d.ts +11 -0
- package/esm/model/store/config/configSelectors.d.ts.map +1 -1
- package/esm/model/store/config/configSelectors.js +13 -0
- package/esm/model/store/insights/insightsSelectors.js +3 -3
- package/esm/model/store/tabs/filterContext/filterContextSelectors.d.ts.map +1 -1
- package/esm/model/store/tabs/filterContext/filterContextSelectors.js +8 -4
- package/esm/model/store/unavailableObjects/unavailableObjectsSelectors.d.ts +8 -0
- package/esm/model/store/unavailableObjects/unavailableObjectsSelectors.d.ts.map +1 -1
- package/esm/model/store/unavailableObjects/unavailableObjectsSelectors.js +8 -0
- package/esm/model/utils/displayFormResolver.d.ts.map +1 -1
- package/esm/model/utils/displayFormResolver.js +11 -1
- package/esm/plugins/customizationApis/customizationBuilder.d.ts.map +1 -1
- package/esm/plugins/customizationApis/customizationBuilder.js +1 -0
- package/esm/plugins/customizationApis/insightCustomizer.d.ts +4 -2
- package/esm/plugins/customizationApis/insightCustomizer.d.ts.map +1 -1
- package/esm/plugins/customizationApis/insightCustomizer.js +43 -3
- package/esm/plugins/customizer.d.ts +14 -1
- package/esm/plugins/customizer.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/AlertingDialog.d.ts +2 -0
- package/esm/presentation/automations/alerting/AlertingDialog.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/AlertingDialog.js +12 -2
- package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.js +1 -1
- package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.js +23 -58
- package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts +33 -0
- package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts.map +1 -0
- package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.js +61 -0
- package/esm/presentation/automations/alerting/state/useAlertFiltersModel.d.ts +3 -17
- package/esm/presentation/automations/alerting/state/useAlertFiltersModel.d.ts.map +1 -1
- package/esm/presentation/automations/alerting/state/useAlertFiltersModel.js +3 -52
- package/esm/presentation/automations/alerting/state/useAlertFormState.js +1 -1
- package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.js +2 -2
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +1 -1
- package/esm/presentation/automations/scheduledEmail/ScheduledEmailDialog.d.ts +3 -1
- package/esm/presentation/automations/scheduledEmail/ScheduledEmailDialog.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/ScheduledEmailDialog.js +13 -3
- package/esm/presentation/automations/scheduledEmail/blocks/ScheduledEmailDialogShell.js +2 -5
- package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.js +22 -40
- package/esm/presentation/automations/scheduledEmail/state/useSaveScheduledEmailToBackend.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/state/useSaveScheduledEmailToBackend.js +14 -3
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts +27 -0
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts.map +1 -0
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.js +142 -0
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.d.ts +4 -6
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.d.ts.map +1 -1
- package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.js +9 -151
- package/esm/presentation/automations/shared/filters/conversions.d.ts +4 -0
- package/esm/presentation/automations/shared/filters/conversions.d.ts.map +1 -1
- package/esm/presentation/automations/shared/filters/conversions.js +28 -24
- package/esm/presentation/automations/shared/hooks/useDecoratorContractCheck.d.ts +16 -0
- package/esm/presentation/automations/shared/hooks/useDecoratorContractCheck.d.ts.map +1 -0
- package/esm/presentation/automations/shared/hooks/useDecoratorContractCheck.js +38 -0
- package/esm/presentation/automations/shared/hooks/useShallowStable.d.ts +10 -0
- package/esm/presentation/automations/shared/hooks/useShallowStable.d.ts.map +1 -0
- package/esm/presentation/automations/shared/hooks/useShallowStable.js +18 -0
- package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.js +17 -4
- package/esm/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.d.ts +10 -0
- package/esm/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.d.ts.map +1 -0
- package/esm/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.js +19 -0
- package/esm/presentation/dashboard/DashboardSidebar/SidebarConfigurationPanel.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/SidebarConfigurationPanel.js +8 -2
- package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeChrome.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeChrome.js +4 -2
- package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeContext.d.ts +8 -3
- package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeContext.d.ts.map +1 -1
- package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeContext.js +65 -25
- package/esm/presentation/dashboard/components/DashboardInner.d.ts.map +1 -1
- package/esm/presentation/dashboard/components/DashboardInner.js +4 -4
- package/esm/presentation/dashboard/components/DashboardRenderer.d.ts.map +1 -1
- package/esm/presentation/dashboard/components/DashboardRenderer.js +2 -2
- package/esm/presentation/dashboard/hooks/useDashboard.d.ts +2 -1
- package/esm/presentation/dashboard/hooks/useDashboard.d.ts.map +1 -1
- package/esm/presentation/dashboard/hooks/useDashboard.js +7 -1
- package/esm/presentation/dashboard/types.d.ts +14 -1
- package/esm/presentation/dashboard/types.d.ts.map +1 -1
- package/esm/presentation/dashboardContexts/DashboardComponentsContext.d.ts +2 -1
- package/esm/presentation/dashboardContexts/DashboardComponentsContext.d.ts.map +1 -1
- package/esm/presentation/dashboardContexts/DashboardComponentsContext.js +1 -0
- package/esm/presentation/dashboardContexts/types.d.ts +20 -0
- package/esm/presentation/dashboardContexts/types.d.ts.map +1 -1
- package/esm/presentation/dragAndDrop/draggableAttributeFilter/DefaultAttributeFilterDraggingComponent.d.ts.map +1 -1
- package/esm/presentation/dragAndDrop/draggableAttributeFilter/DefaultAttributeFilterDraggingComponent.js +4 -3
- package/esm/presentation/export/useExportData.js +2 -2
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.js +8 -2
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts +12 -1
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.js +19 -2
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/displayForms/AttributeDisplayFormsDropdown.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/displayForms/AttributeDisplayFormsDropdown.js +3 -2
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.d.ts +14 -0
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.d.ts.map +1 -0
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.js +28 -0
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useDisplayFormConfiguration.js +2 -2
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useValidNeighbourAttributes.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useValidNeighbourAttributes.js +12 -2
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/limitValues/shared/limitingItemsHook.d.ts.map +1 -1
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/limitValues/shared/limitingItemsHook.js +6 -5
- package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/parentFilters/ParentFiltersDisabledItem.js +2 -2
- package/esm/presentation/filterBar/filterBar/DefaultFilterBarItem.js +2 -2
- package/esm/presentation/filterBar/filterBar/useFiltersWithAddedPlaceholder.js +2 -2
- package/esm/presentation/filterBar/measureValueFilter/useDashboardMeasureValueFilterData.d.ts.map +1 -1
- package/esm/presentation/filterBar/measureValueFilter/useDashboardMeasureValueFilterData.js +55 -17
- package/esm/presentation/flexibleLayout/DashboardLayoutWidget.d.ts.map +1 -1
- package/esm/presentation/flexibleLayout/DashboardLayoutWidget.js +6 -1
- package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +40 -0
- package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/en-US.localization-bundle.js +40 -0
- package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +5 -4
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
- package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +33 -32
- package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +5 -4
- 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 -4
- package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts +54 -0
- package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts.map +1 -0
- package/esm/presentation/widget/common/RestrictedPlaceholder.js +49 -0
- package/esm/presentation/widget/common/configuration/DateDatasetFilter.d.ts +6 -1
- package/esm/presentation/widget/common/configuration/DateDatasetFilter.d.ts.map +1 -1
- package/esm/presentation/widget/common/configuration/DateDatasetFilter.js +2 -2
- package/esm/presentation/widget/common/configuration/DateFilterCheckbox.d.ts +6 -1
- package/esm/presentation/widget/common/configuration/DateFilterCheckbox.d.ts.map +1 -1
- package/esm/presentation/widget/common/configuration/DateFilterCheckbox.js +10 -3
- package/esm/presentation/widget/insight/DefaultInsightBody/DefaultInsightBody.js +2 -2
- package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.js +2 -2
- package/esm/presentation/widget/insight/configuration/InsightDateDataSetFilter.d.ts.map +1 -1
- package/esm/presentation/widget/insight/configuration/InsightDateDataSetFilter.js +1 -1
- package/esm/presentation/widget/insight/configuration/InsightDrillConfigList.d.ts +6 -1
- package/esm/presentation/widget/insight/configuration/InsightDrillConfigList.d.ts.map +1 -1
- package/esm/presentation/widget/insight/configuration/InsightDrillConfigList.js +13 -2
- package/esm/presentation/widget/insight/configuration/InsightDrillConfigPanel/InsightDrillConfigPanel.d.ts.map +1 -1
- package/esm/presentation/widget/insight/configuration/InsightDrillConfigPanel/InsightDrillConfigPanel.js +5 -1
- package/esm/presentation/widget/insight/configuration/useDrillTargetTypeItems.d.ts +1 -1
- package/esm/presentation/widget/insight/configuration/useDrillTargetTypeItems.d.ts.map +1 -1
- package/esm/presentation/widget/insight/configuration/useDrillTargetTypeItems.js +2 -2
- package/esm/presentation/widget/richText/configuration/RichTextDateDataSetFilter.d.ts.map +1 -1
- package/esm/presentation/widget/richText/configuration/RichTextDateDataSetFilter.js +1 -1
- package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.d.ts.map +1 -1
- package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.js +8 -0
- package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcherRestricted.d.ts +16 -0
- package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcherRestricted.d.ts.map +1 -0
- package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcherRestricted.js +19 -0
- package/esm/presentation/widget/widget/InsightWidget/DashboardWidgetInsightGuard.d.ts.map +1 -1
- package/esm/presentation/widget/widget/InsightWidget/DashboardWidgetInsightGuard.js +11 -1
- package/esm/presentation/widget/widget/InsightWidget/DefaultDashboardInsightWidget.js +2 -2
- package/esm/presentation/widget/widget/VisualizationSwitcherWidget/VisualizationSwitcherNavigationHeader.d.ts.map +1 -1
- package/esm/presentation/widget/widget/VisualizationSwitcherWidget/VisualizationSwitcherNavigationHeader.js +25 -12
- package/esm/sdk-ui-dashboard.d.ts +206 -4
- package/package.json +22 -22
- package/styles/css/alerting.css +3 -1
- package/styles/css/alerting.css.map +1 -1
- package/styles/css/configurationPanel.css +1 -5
- package/styles/css/configurationPanel.css.map +1 -1
- package/styles/css/dashboard.css +5 -3
- package/styles/css/dashboard.css.map +1 -1
- package/styles/css/export.css +10 -8
- package/styles/css/export.css.map +1 -1
- package/styles/css/filterBar.css +29 -0
- package/styles/css/filterBar.css.map +1 -1
- package/styles/css/main.css +230 -22
- package/styles/css/main.css.map +1 -1
- package/styles/css/sidebar.css +165 -0
- package/styles/css/sidebar.css.map +1 -1
- package/styles/css/visualizationSwitcherWidget.css +8 -0
- package/styles/css/visualizationSwitcherWidget.css.map +1 -1
- package/styles/scss/configurationPanel.scss +1 -7
- package/styles/scss/filterBar.scss +38 -0
- package/styles/scss/sidebar.scss +215 -0
- package/styles/scss/visualizationSwitcherWidget.scss +9 -0
package/esm/index.js
CHANGED
|
@@ -13,6 +13,8 @@ export { useDashboardCommandProcessing, } from "./model/react/useDashboardComman
|
|
|
13
13
|
export { useDashboardEventDispatch } from "./model/react/useDashboardEventDispatch.js";
|
|
14
14
|
export { useDashboardQueryProcessing, } from "./model/react/useDashboardQueryProcessing.js";
|
|
15
15
|
export { useDashboardUserInteraction } from "./model/react/useDashboardUserInteraction.js";
|
|
16
|
+
export { useIsWidgetRestricted } from "./model/react/useIsWidgetRestricted.js";
|
|
17
|
+
export { RestrictedPlaceholderContent, } from "./presentation/widget/common/RestrictedPlaceholder.js";
|
|
16
18
|
export { useDashboardAsyncRender, } from "./model/react/useDashboardAsyncRender.js";
|
|
17
19
|
export { useDispatchDashboardCommand } from "./model/react/useDispatchDashboardCommand.js";
|
|
18
20
|
export { useWidgetExecutionsHandler } from "./model/react/useWidgetExecutionsHandler.js";
|
|
@@ -73,15 +75,17 @@ export { queryDateDatasetsForMeasure, } from "./model/queries/kpis.js";
|
|
|
73
75
|
export { queryWidgetFilters, queryWidgetBrokenAlerts, queryWidgetAlertCount, } from "./model/queries/widgets.js";
|
|
74
76
|
export { queryConnectingAttributes, } from "./model/queries/connectingAttributes.js";
|
|
75
77
|
export { queryConnectedAttributes, } from "./model/queries/connectedAttributes.js";
|
|
78
|
+
export { isComputedAttributesUnavailableError } from "./_staging/catalog/computedAttributes.js";
|
|
76
79
|
export { queryAttributeByDisplayForm, } from "./model/queries/attributes.js";
|
|
77
80
|
export { queryAttributeDataSet } from "./model/queries/attributeDataSet.js";
|
|
78
81
|
export { queryAttributeElements } from "./model/queries/attributeElements.js";
|
|
82
|
+
export { queryComputedAttributeExpression, } from "./model/queries/computedAttributeExpression.js";
|
|
79
83
|
export { queryMetricsAndFacts, } from "./model/queries/metricsAndFacts.js";
|
|
80
84
|
export { queryAvailableDatasetsForItems, } from "./model/queries/availableDatasetsForItems.js";
|
|
81
85
|
export { selectDashboardLoading, selectIsDashboardLoading } from "./model/store/loading/loadingSelectors.js";
|
|
82
86
|
export { selectDashboardSaving, selectIsDashboardSaving } from "./model/store/saving/savingSelectors.js";
|
|
83
87
|
export { selectBackendCapabilities, selectSupportsElementsQueryParentFiltering, selectSupportsElementUris, selectSupportsKpiWidgetCapability, selectSupportsAccessControlCapability, selectSupportsHierarchicalWorkspacesCapability, selectSupportsObjectUris, selectSupportsSettingConnectingAttributes, selectSupportsKeepingDependentFiltersSelection, selectAllowMultipleInteractionsPerAttributeAndMeasure, selectSupportsAttributeHierarchies, selectSupportsSingleSelectDependentFilters, selectSupportsCrossFiltering, selectSupportsMultipleDateFilters, selectSupportsRichTextWidgets, } from "./model/store/backendCapabilities/backendCapabilitiesSelectors.js";
|
|
84
|
-
export { selectConfig, selectLocale, selectSeparators, selectSettings, selectColorPalette, selectDateFilterConfig, selectObjectAvailabilityConfig, selectIsReadOnly, selectMapboxToken, selectAgGridToken, selectDateFormat, selectIsEmbedded, selectIsExport, selectExportMetadata, selectPlatformEdition, selectDisableDefaultDrills, selectEnableFilterValuesResolutionInDrillEvents, selectDisableKpiDashboardHeadlineUnderline, selectIsWhiteLabeled, selectIsSaveAsNewButtonHidden, selectAllowUnfinishedFeatures, selectAllowCreateInsightRequest, selectIsAiMode, selectIsAiGenerating, selectIsKPIDashboardDependentFiltersEnabled, selectIsShareButtonHidden, selectWeekStart, selectTimezone, selectEnableUnavailableItemsVisibility, selectEnableKDDependentFilters, selectIsKDDependentFiltersEnabled, selectEnableMeasureValueFilterKD, selectEnableImmediateAttributeFilterDisplayAsLabelMigration, selectIsDisabledCrossFiltering, selectIsDisableUserFilterReset, selectEnableParameters, selectFocusObject, selectEnableDashboardDescriptionDynamicHeight, selectEnableSlideshowExports, selectEnableRichTextWidgetFilterConfiguration, selectEnableDashboardSectionHeadersDateDataSet, selectDashboardFiltersApplyMode, selectIsApplyFiltersAllAtOnceEnabledAndSet, selectEnableExecutionCancelling, selectEnableOrchestratedTabularExports, selectEnableDashboardTabularExport, selectEnableSnapshotExportAccessibility, selectEnableExportTimeoutFix, selectEnableExportToDocumentStorage, selectExternalRecipient, selectEnableDashboardShareDialogLink, selectEnableDashboardPartialRendering, selectEnableAutomationEvaluationMode, selectEnableSnapshotExport, selectEnableAccessibilityMode, selectIsAddTabButtonHidden, selectExportResultPollingTimeout, selectEnableAnomalyDetectionAlert, selectEnableFiscalCalendars, selectEnableSecondGranularities, selectEnableTimezoneChange, selectActiveCalendars, selectEnableDashboardFilterGroups, selectEnableDashboardDensitySetting, } from "./model/store/config/configSelectors.js";
|
|
88
|
+
export { selectConfig, selectLocale, selectSeparators, selectSettings, selectColorPalette, selectDateFilterConfig, selectObjectAvailabilityConfig, selectIsReadOnly, selectMapboxToken, selectAgGridToken, selectDateFormat, selectIsEmbedded, selectIsExport, selectExportMetadata, selectPlatformEdition, selectDisableDefaultDrills, selectEnableFilterValuesResolutionInDrillEvents, selectDisableKpiDashboardHeadlineUnderline, selectIsWhiteLabeled, selectIsSaveAsNewButtonHidden, selectAllowUnfinishedFeatures, selectAllowCreateInsightRequest, selectIsAiMode, selectIsAiGenerating, selectIsKPIDashboardDependentFiltersEnabled, selectIsShareButtonHidden, selectWeekStart, selectTimezone, selectEnableUnavailableItemsVisibility, selectEnableKDDependentFilters, selectIsKDDependentFiltersEnabled, selectEnableComputedAttributes, selectEnableMeasureValueFilterKD, selectEnableImmediateAttributeFilterDisplayAsLabelMigration, selectIsDisabledCrossFiltering, selectIsDisableUserFilterReset, selectEnableParameters, selectFocusObject, selectEnableDashboardDescriptionDynamicHeight, selectEnableSlideshowExports, selectEnableRichTextWidgetFilterConfiguration, selectEnableDashboardSectionHeadersDateDataSet, selectDashboardFiltersApplyMode, selectIsApplyFiltersAllAtOnceEnabledAndSet, selectEnableExecutionCancelling, selectEnableOrchestratedTabularExports, selectEnableDashboardTabularExport, selectEnableSnapshotExportAccessibility, selectEnableExportTimeoutFix, selectEnableExportToDocumentStorage, selectExternalRecipient, selectEnableDashboardShareDialogLink, selectEnableDashboardPartialRendering, selectEnableAutomationEvaluationMode, selectEnableSnapshotExport, selectEnableAccessibilityMode, selectIsAddTabButtonHidden, selectExportResultPollingTimeout, selectEnableAnomalyDetectionAlert, selectEnableFiscalCalendars, selectEnableSecondGranularities, selectEnableTimezoneChange, selectActiveCalendars, selectEnableDashboardFilterGroups, selectEnableDashboardDensitySetting, } from "./model/store/config/configSelectors.js";
|
|
85
89
|
export { selectEntitlementMaxAutomationRecipients, selectEntitlementMaxAutomations, selectEntitlementMinimumRecurrenceMinutes, selectEntitlementUnlimitedAutomations, selectEntitlementUnlimitedAutomationRecipients, selectMaxAutomationRecipients, } from "./model/store/entitlements/entitlementsSelectors.js";
|
|
86
90
|
export { selectPermissions, selectCanListUsersInWorkspace, selectCanManageWorkspace, selectCanExportReport, selectCanExportTabular, selectCanExportPdf, selectCanCreateAnalyticalDashboard, selectCanManageACL, selectCanManageAnalyticalDashboard, selectCanCreateScheduledMail, selectCanInitData, selectCanUploadNonProductionCSV, selectCanExecuteRaw, selectCanCreateVisualization, selectCanManageMetric, selectCanManageDomain, selectCanInviteUserToWorkspace, selectCanRefreshData, selectCanManageScheduledMail, selectCanManageAttributeHierarchy, selectCanCreateFilterView, selectCanCreateAutomation, selectCanUseAiAssistant, } from "./model/store/permissions/permissionsSelectors.js";
|
|
87
91
|
export { selectCanViewDashboardPermission, selectCanShareDashboardPermission, selectCanShareLockedDashboardPermission, selectCanEditDashboardPermission, selectCanEditLockedDashboardPermission, selectDashboardPermissions, } from "./model/store/dashboardPermissions/dashboardPermissionsSelectors.js";
|
|
@@ -101,7 +105,7 @@ export { DEFAULT_TAB_ID } from "./model/store/tabs/tabsState.js";
|
|
|
101
105
|
export { selectFilterGroupsConfig } from "./model/store/tabs/filterGroups/filterGroupsSelectors.js";
|
|
102
106
|
export { selectDateFilterConfigsOverrides, selectDateFilterConfigsOverridesByTab, selectDateFilterConfigsModeMap, selectEffectiveDateFiltersModeMap, selectDateFilterConfigsModeMapByTab, } from "./model/store/tabs/dateFilterConfigs/dateFilterConfigsSelectors.js";
|
|
103
107
|
export { selectInsights, selectInsightRefs, selectInsightsMap, selectInsightByRef, selectInsightByWidgetRef, selectRawExportOverridesForInsightByRef, } from "./model/store/insights/insightsSelectors.js";
|
|
104
|
-
export { selectCatalogIsLoaded, selectAttributesWithDrillDown, selectCatalogAttributes, selectCatalogAttributeDisplayForms, selectCatalogDateDatasets, selectCatalogFacts, selectCatalogMeasures, selectAllCatalogAttributesMap, selectAllCatalogDisplayFormsMap, selectAllCatalogDateDatasetsMap, selectAllCatalogMeasuresMap, selectHasCatalogAttributes, selectHasCatalogMeasures, selectHasCatalogDateDatasets, selectHasCatalogFacts, selectCatalogAttributeHierarchies, selectCatalogDateAttributes, selectDateHierarchyTemplates, selectAdhocDateHierarchies, selectAllCatalogAttributeHierarchies, selectCatalogAttributeDisplayFormsById, selectCatalogParameters, selectCatalogParametersStatus, selectCatalogParametersIsLoaded, selectCatalogMeasureParameters, selectCatalogMeasureParametersStatus, } from "./model/store/catalog/catalogSelectors.js";
|
|
108
|
+
export { selectCatalogIsLoaded, selectAttributesWithDrillDown, selectCatalogAttributes, selectCatalogAttributesWithComputed, selectCatalogComputedAttributes, selectCatalogAttributeDisplayForms, selectCatalogDateDatasets, selectCatalogFacts, selectCatalogMeasures, selectAllCatalogAttributesMap, selectAllCatalogDisplayFormsMap, selectAllCatalogDateDatasetsMap, selectAllCatalogMeasuresMap, selectHasCatalogAttributes, selectHasCatalogMeasures, selectHasCatalogDateDatasets, selectHasCatalogFacts, selectCatalogAttributeHierarchies, selectCatalogDateAttributes, selectDateHierarchyTemplates, selectAdhocDateHierarchies, selectAllCatalogAttributeHierarchies, selectCatalogAttributeDisplayFormsById, selectCatalogParameters, selectCatalogParametersStatus, selectCatalogParametersIsLoaded, selectCatalogMeasureParameters, selectCatalogMeasureParametersStatus, } from "./model/store/catalog/catalogSelectors.js";
|
|
105
109
|
export { catalogActions } from "./model/store/catalog/index.js";
|
|
106
110
|
export { selectDashboardParameterEntries, selectDashboardParameters, selectEffectiveParameterValuesForWidget, selectExportEffectiveParameters, selectFilterViewParameters, selectHasAnyResettableParameterOnActiveTab, selectIsParametersChanged, selectIsWorkingParametersChanged, selectParameterDisplayValueByRef, selectParameterRuntimeOverrideByRef, } from "./model/store/tabs/parameters/parametersSelectors.js";
|
|
107
111
|
export { drillActions } from "./model/store/drill/index.js";
|
|
@@ -112,7 +116,7 @@ export { metaActions } from "./model/store/meta/index.js";
|
|
|
112
116
|
export { selectListedDashboards, selectListedDashboardsMap, } from "./model/store/listedDashboards/listedDashboardsSelectors.js";
|
|
113
117
|
export { selectAccessibleDashboards, selectAccessibleDashboardsLoaded, selectAccessibleDashboardsMap, } from "./model/store/accessibleDashboards/accessibleDashboardsSelectors.js";
|
|
114
118
|
export { selectInaccessibleDashboards, selectInaccessibleDashboardsMap, } from "./model/store/inaccessibleDashboards/inaccessibleDashboardsSelectors.js";
|
|
115
|
-
export { selectUnavailableObjects, selectUnavailableObjectsMapByType, } from "./model/store/unavailableObjects/unavailableObjectsSelectors.js";
|
|
119
|
+
export { selectRestrictedInsightsMap, selectUnavailableObjects, selectUnavailableObjectsMapByType, } from "./model/store/unavailableObjects/unavailableObjectsSelectors.js";
|
|
116
120
|
export { selectDrillTargetsByWidgetRef, selectDrillTargets, } from "./model/store/drillTargets/drillTargetsSelectors.js";
|
|
117
121
|
export { selectExecutionResult, selectExecutionResultByRef, selectIsExecutionResultExportableToCsvByRef, selectIsExecutionResultExportableToXlsxByRef, selectIsExecutionResultExportableToPdfByRef, selectIsExecutionResultReadyForExportByRef, selectHasSomeExecutionResult, selectIsExecutionResultExportableToCsvRawByRef, selectExecutionResultLimitBreaksByRef, selectHasExecutionResultLimitBreaksByRef, selectHasAnyExecutionResultLimitBreaks, } from "./model/store/executionResults/executionResultsSelectors.js";
|
|
118
122
|
export { selectIsScheduleEmailDialogOpen, selectIsScheduleEmailManagementDialogOpen, selectIsScheduleEmailDialogContext, selectIsScheduleEmailManagementDialogContext, selectIsAlertingManagementDialogContext, selectIsSaveAsDialogOpen, selectIsShareDialogOpen, selectFilterBarExpanded, selectIsKpiAlertOpenedByWidgetRef, selectIsKpiAlertHighlightedByWidgetRef, selectMenuButtonItemsVisibility, selectScheduleEmailDialogReturnFocusTo, selectAlertingDialogReturnFocusTo, selectScheduleEmailDialogDefaultAttachment, selectSelectedWidgetRef, selectConfigurationPanelOpened, selectWidgetDateDatasetAutoSelect, selectIsDeleteDialogOpen, selectIsKpiDeleteDialogOpen, selectKpiDeleteDialogWidgetLayoutPath, selectKpiDeleteDialogWidgetCoordinates, selectInsightListLastUpdateRequested, selectIsWidgetLoadingAdditionalDataByWidgetRef, selectIsFilterAttributeSelectionOpen, selectSelectedFilterIndex, selectIsDraggingWidget, selectActiveSection, selectActiveSectionIndex, selectIsCancelEditModeDialogOpen, selectDraggingWidgetSource, selectDraggingWidgetTargetLayoutPath, selectDraggingWidgetTriggeringDropZoneType, selectDraggingWidgetTarget, selectWidgetsOverlay, selectWidgetsOverlayState, selectWidgetsModification, selectSectionModification, selectIsSectionInsertedByPlugin, selectInvalidDrillWidgetRefs, selectInvalidUrlDrillParameterDrillLocalIdsByWidgetRef, selectInvalidUrlDrillParameterWidgetRefs, selectInvalidUrlDrillParameterWidgetWarnings, selectFilterViewsDialogMode, selectIsFilterViewsDialogOpen, selectIsAlertingDialogOpen, selectIsAlertsManagementDialogOpen, selectIsWidgetDeleteDialogOpen, selectWidgetDeleteDialogWidgetRef, selectIgnoreExecutionTimestamp, selectExecutionTimestamp, selectIsSettingsDialogOpen, selectIsDensityDialogOpen, selectDashboardDensity, selectFilterValidationIncompatibleDefaultFiltersOverride, selectAutomationsInvalidationId, selectTimezoneOverride, selectVisualizationSwitcherActiveVisualizations, selectVisualizationSwitcherActiveVisualizationByWidgetRef, } from "./model/store/ui/uiSelectors.js";
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
import { useMemo } from "react";
|
|
3
3
|
import { areObjRefsEqual } from "@gooddata/sdk-model";
|
|
4
4
|
import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
|
|
5
|
-
import {
|
|
5
|
+
import { selectCatalogAttributesWithComputed } from "../../../model/store/catalog/catalogSelectors.js";
|
|
6
6
|
import { useSummaryDrivers } from "../../hooks/useSummaryDrivers.js";
|
|
7
7
|
import { useKdaState } from "../../providers/KdaState.js";
|
|
8
8
|
const SEARCH_BAR_THRESHOLD = 7;
|
|
9
9
|
export function useKdaValidAttributes() {
|
|
10
10
|
const { state } = useKdaState();
|
|
11
11
|
const list = useSummaryDrivers();
|
|
12
|
-
const allAttributes = useDashboardSelector(
|
|
12
|
+
const allAttributes = useDashboardSelector(selectCatalogAttributesWithComputed);
|
|
13
13
|
const { validAttributes, mapAttributes } = useMemo(() => {
|
|
14
14
|
const mapAttributes = new Map();
|
|
15
15
|
const validAttributes = allAttributes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useValidAttributes.d.ts","sourceRoot":"","sources":["../../../../src/kdaDialog/dialog/hooks/useValidAttributes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useValidAttributes.d.ts","sourceRoot":"","sources":["../../../../src/kdaDialog/dialog/hooks/useValidAttributes.ts"],"names":[],"mappings":"AAaA,wBAAgB,kBAAkB,SAYjC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { useEffect } from "react";
|
|
3
3
|
import { useBackendStrict, useCancelablePromise, useWorkspaceStrict } from "@gooddata/sdk-ui";
|
|
4
|
+
import { isComputedAttributesUnavailableError } from "../../../_staging/catalog/computedAttributes.js";
|
|
5
|
+
import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
|
|
6
|
+
import { selectEnableComputedAttributes } from "../../../model/store/config/configSelectors.js";
|
|
4
7
|
import { useKdaState } from "../../providers/KdaState.js";
|
|
5
8
|
export function useValidAttributes() {
|
|
6
9
|
const { state, setState } = useKdaState();
|
|
@@ -16,16 +19,28 @@ export function useValidAttributes() {
|
|
|
16
19
|
function useValidObjectsResults(definition) {
|
|
17
20
|
const backend = useBackendStrict();
|
|
18
21
|
const workspace = useWorkspaceStrict();
|
|
22
|
+
// asking for computed attributes is gated by the enableComputedAttributes setting because a
|
|
23
|
+
// backend with the setting off refuses the computed-attributes flavour of the request outright
|
|
24
|
+
const includeComputedAttributes = useDashboardSelector(selectEnableComputedAttributes);
|
|
19
25
|
const metric = definition?.metric;
|
|
20
26
|
const metrics = definition?.metrics;
|
|
21
27
|
return useCancelablePromise({
|
|
22
28
|
promise: metric
|
|
23
|
-
? () => {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
.
|
|
27
|
-
|
|
29
|
+
? async () => {
|
|
30
|
+
const measures = backend.workspace(workspace).measures();
|
|
31
|
+
try {
|
|
32
|
+
return await measures.getConnectedAttributes(metric, metrics, { includeComputedAttributes });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
// when the backend refuses computed attributes (a race with the setting
|
|
36
|
+
// being turned off, an older backend), fall back to plain attributes; a
|
|
37
|
+
// genuine failure propagates
|
|
38
|
+
if (!includeComputedAttributes || !isComputedAttributesUnavailableError(error)) {
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
return measures.getConnectedAttributes(metric, metrics);
|
|
42
|
+
}
|
|
28
43
|
}
|
|
29
44
|
: undefined,
|
|
30
|
-
}, [backend, workspace, metric, metrics]);
|
|
45
|
+
}, [backend, workspace, metric, metrics, includeComputedAttributes]);
|
|
31
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAttribute.d.ts","sourceRoot":"","sources":["../../../src/kdaDialog/hooks/useAttribute.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"useAttribute.d.ts","sourceRoot":"","sources":["../../../src/kdaDialog/hooks/useAttribute.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,MAAM,EAGd,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,YAAY,WAKb,MAAM,4DAmBpB"}
|
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { useCallback } from "react";
|
|
3
|
-
import { areObjRefsEqual } from "@gooddata/sdk-model";
|
|
3
|
+
import { areObjRefsEqual, catalogComputedAttributeAsCatalogAttribute, } from "@gooddata/sdk-model";
|
|
4
4
|
import { useDashboardSelector } from "../../model/react/DashboardStoreProvider.js";
|
|
5
|
-
import { selectCatalogAttributes } from "../../model/store/catalog/catalogSelectors.js";
|
|
5
|
+
import { selectCatalogAttributes, selectCatalogComputedAttributes, } from "../../model/store/catalog/catalogSelectors.js";
|
|
6
6
|
export function useAttribute() {
|
|
7
|
-
const
|
|
7
|
+
const attributes = useDashboardSelector(selectCatalogAttributes);
|
|
8
|
+
const computedAttributes = useDashboardSelector(selectCatalogComputedAttributes);
|
|
8
9
|
return useCallback((ref) => {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
if (!ref) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const matches = (a) => areObjRefsEqual(ref, a.attribute.ref) ||
|
|
14
|
+
a.attribute.displayForms.some((df) => areObjRefsEqual(df.ref, ref));
|
|
15
|
+
// Key driver refs come back untyped (the changeAnalysis response has no type
|
|
16
|
+
// discriminator), so an id shared by a label and a computed attribute is ambiguous.
|
|
17
|
+
// Plain attributes are matched first to make the resolution deterministic.
|
|
18
|
+
return (attributes.find(matches) ??
|
|
19
|
+
computedAttributes.map(catalogComputedAttributeAsCatalogAttribute).find(matches) ??
|
|
20
|
+
null);
|
|
21
|
+
}, [attributes, computedAttributes]);
|
|
14
22
|
}
|
package/esm/locales.d.ts
CHANGED
package/esm/locales.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../src/locales.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,uEAAsB,CAAC;AAEnD,eAAO,MAAM,QAAQ;;QACL,EAAE;;;QACkB,EAAE;;;QACH,EAAE;;;QACJ,EAAE;;;QACA,EAAE;;;QACM,EAAE;;;QACZ,EAAE;;;QACS,EAAE;;;QACN,EAAE;;;QACL,EAAE;;;QACJ,EAAE;;;QACN,EAAE;;;QACC,EAAE;;;QACD,EAAE;;;QACL,EAAE;;;QACA,EAAE;;;QACN,EAAE;;;QACA,EAAE;;;QACA,EAAE;;;QACD,EAAE;;;QACA,EAAE;;;QACF,EAAE;;;QACP,EAAE;;;QACC,EAAE;;;QACE,EAAE;;;QACN,EAAE;;;QACW,EAAE;;;QAE3B,EAAE;;;QACJ,EAAE;;;QACG,EAAE;;;QACJ,EAAE;;;QACS,EAAE;;;QACA,EAAE;;;QACJ,EAAE;;;QACH,EAAE;;;QACJ,EAAE;;;QACC,EAAE;;;QACR,EAAE;;;QACO,EAAE;;;QAED,EAAE;;;QACX,EAAE;;;QACF,EAAE;;;QACU,EAAE;;;QACV,EAAE;;;QACtB,EAAE;;;QACD,EAAE;;;QACc,EAAE;;;QACQ,EAAE;;;QACF,EAAE;;;QACT,EAAE;;;QACF,EAAE;;;QACI,EAAE;;;QACG,EAAE;;;QACN,EAAE;;;QAEhB,EAAE;;;QACU,EAAE;;;QACF,EAAE;;;QACC,EAAE;;;QACF,EAAE;;;QACA,EAAE;;;QACF,EAAE;;;QACF,EAAE;;;QACA,EAAE;;;QACZ,EAAE;;;QACD,EAAE;;;QACF,EAAE;;;QACM,EAAE;;;QACA,EAAE;;;QACA,EAAE;;;QACjB,EAAE;;;QACJ,EAAE;;;QACF,EAAE;;;QACG,EAAE;;;QACX,EAAE;;;QACoB,EAAE;;;QACN,EAAE;;;QACN,EAAE;;;QACF,EAAE;;;QACV,EAAE;;;QACR,EAAE;;;QACF,EAAE;;;QACJ,EAAE;;;QACF,EAAE;;;QACE,EAAE;;;QACJ,EAAE;;;QACA,EAAE;;;QACG,EAAE;;;QAEP,EAAE;;;QACR,EAAE;;;QACH,EAAE;;;QACD,EAAE;;;QACK,EAAE;;;
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../src/locales.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,uEAAsB,CAAC;AAEnD,eAAO,MAAM,QAAQ;;QACL,EAAE;;;QACkB,EAAE;;;QACH,EAAE;;;QACJ,EAAE;;;QACA,EAAE;;;QACM,EAAE;;;QACZ,EAAE;;;QACS,EAAE;;;QACN,EAAE;;;QACL,EAAE;;;QACJ,EAAE;;;QACN,EAAE;;;QACC,EAAE;;;QACD,EAAE;;;QACL,EAAE;;;QACA,EAAE;;;QACN,EAAE;;;QACA,EAAE;;;QACA,EAAE;;;QACD,EAAE;;;QACA,EAAE;;;QACF,EAAE;;;QACP,EAAE;;;QACC,EAAE;;;QACE,EAAE;;;QACN,EAAE;;;QACW,EAAE;;;QAE3B,EAAE;;;QACJ,EAAE;;;QACG,EAAE;;;QACJ,EAAE;;;QACS,EAAE;;;QACA,EAAE;;;QACJ,EAAE;;;QACH,EAAE;;;QACJ,EAAE;;;QACC,EAAE;;;QACR,EAAE;;;QACO,EAAE;;;QAED,EAAE;;;QACX,EAAE;;;QACF,EAAE;;;QACU,EAAE;;;QACV,EAAE;;;QACtB,EAAE;;;QACD,EAAE;;;QACc,EAAE;;;QACQ,EAAE;;;QACF,EAAE;;;QACT,EAAE;;;QACF,EAAE;;;QACI,EAAE;;;QACG,EAAE;;;QACN,EAAE;;;QAEhB,EAAE;;;QACU,EAAE;;;QACF,EAAE;;;QACC,EAAE;;;QACF,EAAE;;;QACA,EAAE;;;QACF,EAAE;;;QACF,EAAE;;;QACA,EAAE;;;QACZ,EAAE;;;QACD,EAAE;;;QACF,EAAE;;;QACM,EAAE;;;QACA,EAAE;;;QACA,EAAE;;;QACjB,EAAE;;;QACJ,EAAE;;;QACF,EAAE;;;QACG,EAAE;;;QACX,EAAE;;;QACoB,EAAE;;;QACN,EAAE;;;QACN,EAAE;;;QACF,EAAE;;;QACV,EAAE;;;QACR,EAAE;;;QACF,EAAE;;;QACJ,EAAE;;;QACF,EAAE;;;QACE,EAAE;;;QACJ,EAAE;;;QACA,EAAE;;;QACG,EAAE;;;QAEP,EAAE;;;QACR,EAAE;;;QACH,EAAE;;;QACD,EAAE;;;QACK,EAAE;;;QAEzB,EAAE;;;QAEyB,EAAE;;;QACF,EAAE;;;QACD,EAAE;;;QACT,EAAE;;;QACK,EAAE;;CACpC,CAAC"}
|
package/esm/locales.js
CHANGED
|
@@ -95,6 +95,9 @@ export const messages = defineMessages({
|
|
|
95
95
|
drillDownConfig: { id: "configurationPanel.drillConfig.drillDown" },
|
|
96
96
|
drillToUrlConfig: { id: "configurationPanel.drillConfig.drillIntoUrl" },
|
|
97
97
|
disableDrillDownToolTip: { id: "configurationPanel.drillConfig.disableDrillDownTooltip" },
|
|
98
|
+
computedAttributeDrillDownToolTip: {
|
|
99
|
+
id: "configurationPanel.drillConfig.computedAttributeDrillDownTooltip",
|
|
100
|
+
},
|
|
98
101
|
disableUsedDrillDownTooltip: { id: "configurationPanel.drillConfig.alreadyUsedTooltip" },
|
|
99
102
|
respectCrossFilteringConfig: { id: "configurationPanel.respectCrossFiltering" },
|
|
100
103
|
respectCrossFilteringTooltip: { id: "configurationPanel.respectCrossFiltering.tooltip" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadAvailableDisplayFormRefs.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/common/loadAvailableDisplayFormRefs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"loadAvailableDisplayFormRefs.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/common/loadAvailableDisplayFormRefs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAMlD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,wBAAsB,4BAA4B,CAC9C,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBnB"}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
import { loadComputedAttributesByRefs, partitionComputedAttributeRefs, } from "../../../../_staging/catalog/computedAttributes.js";
|
|
2
|
+
export async function loadAvailableDisplayFormRefs(ctx, displayForms) {
|
|
2
3
|
const { backend, workspace } = ctx;
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
// computed-attribute-typed display form refs never match labels; they are available exactly
|
|
5
|
+
// when the computed attribute itself resolves through the computedAttributes service
|
|
6
|
+
const { computedAttributeRefs, otherRefs } = partitionComputedAttributeRefs(displayForms);
|
|
7
|
+
const [computedAttributes, labels] = await Promise.all([
|
|
8
|
+
loadComputedAttributesByRefs(backend, workspace, computedAttributeRefs),
|
|
9
|
+
otherRefs.length
|
|
10
|
+
? backend.workspace(workspace).attributes().getAttributeDisplayForms(otherRefs)
|
|
11
|
+
: Promise.resolve([]),
|
|
12
|
+
]);
|
|
13
|
+
return [
|
|
14
|
+
...labels.map((df) => df.ref),
|
|
15
|
+
...computedAttributes.flatMap((ca) => ca.displayForms.map((df) => df.ref)),
|
|
16
|
+
];
|
|
8
17
|
}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { type BatchAction } from "redux-batched-actions";
|
|
2
2
|
import { type SagaIterator } from "redux-saga";
|
|
3
|
-
import { type IWorkspaceCatalog } from "@gooddata/sdk-backend-spi";
|
|
4
3
|
import { type IDashboard, type IDateHierarchyTemplate } from "@gooddata/sdk-model";
|
|
5
4
|
import { type InitializeDashboard } from "../../../commands/dashboard.js";
|
|
6
5
|
import { type DashboardContext } from "../../../types/commonTypes.js";
|
|
7
|
-
export declare function requestCatalog(ctx: DashboardContext, cmd: InitializeDashboard): Generator<import("redux-saga/effects").AllEffect<import("redux-saga/effects").CallEffect<IDateHierarchyTemplate[]> | import("redux-saga/effects").CallEffect<
|
|
6
|
+
export declare function requestCatalog(ctx: DashboardContext, cmd: InitializeDashboard): Generator<import("redux-saga/effects").AllEffect<import("redux-saga/effects").CallEffect<IDateHierarchyTemplate[]> | import("redux-saga/effects").CallEffect<import("./loadCatalog.js").ILoadedCatalog>> | import("redux-saga/effects").PutEffect<{
|
|
8
7
|
payload: import("../../../../index.js").SetCatalogItemsPayload;
|
|
9
8
|
type: "catalog/setCatalogItems";
|
|
10
|
-
}
|
|
9
|
+
}> | import("redux-saga/effects").SelectEffect, void, boolean & [import("./loadCatalog.js").ILoadedCatalog, IDateHierarchyTemplate[]]>;
|
|
11
10
|
export declare function preloadAttributeFiltersData(ctx: DashboardContext, dashboard: IDashboard): Generator<import("redux-saga/effects").CallEffect<import("@gooddata/sdk-backend-spi").IAttributeWithReferences[]> | import("redux-saga/effects").PutEffect<{
|
|
12
11
|
payload: import("@gooddata/sdk-backend-spi").IAttributeWithReferences[];
|
|
13
12
|
type: "tabs/setPreloadedAttributesWithReferences";
|
|
@@ -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;
|
|
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;AAwB1E,OAAO,EACH,KAAK,gBAAgB,EAGxB,MAAM,+BAA+B,CAAC;AAmevC,wBAAiB,cAAc,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB;;;uIAyB9E;AAkCD,wBAAiB,2BAA2B,CAAC,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU;;;0EAKxF;AAED,wBAAiB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,sNAW3D;AAoCD,wBAAiB,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,GAAG,YAAY,CAoCzG"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
2
|
import { uniqBy } from "lodash-es";
|
|
3
3
|
import { batchActions } from "redux-batched-actions";
|
|
4
|
-
import { all, call, put, spawn } from "redux-saga/effects";
|
|
4
|
+
import { all, call, put, select, spawn } from "redux-saga/effects";
|
|
5
5
|
import { walkLayout } from "@gooddata/sdk-backend-spi";
|
|
6
6
|
import { areObjRefsEqual, isDrillToInsight, isInsightWidget, isVisualizationSwitcherWidget, serializeObjRef, } from "@gooddata/sdk-model";
|
|
7
7
|
import { createDisplayFormMap, createDisplayFormMapFromCatalog, } from "../../../../_staging/catalog/displayFormMap.js";
|
|
@@ -13,6 +13,7 @@ import { accessibleDashboardsActions } from "../../../store/accessibleDashboards
|
|
|
13
13
|
import { automationsActions } from "../../../store/automations/index.js";
|
|
14
14
|
import { backendCapabilitiesActions } from "../../../store/backendCapabilities/index.js";
|
|
15
15
|
import { catalogActions } from "../../../store/catalog/index.js";
|
|
16
|
+
import { selectEnableComputedAttributes } from "../../../store/config/configSelectors.js";
|
|
16
17
|
import { configActions } from "../../../store/config/index.js";
|
|
17
18
|
import { dashboardPermissionsActions } from "../../../store/dashboardPermissions/index.js";
|
|
18
19
|
import { entitlementsActions } from "../../../store/entitlements/index.js";
|
|
@@ -236,11 +237,12 @@ function* loadExistingDashboard(ctx, cmd, dashboardRef) {
|
|
|
236
237
|
}
|
|
237
238
|
function* initializeNewDashboard(ctx, cmd) {
|
|
238
239
|
const { backend } = ctx;
|
|
239
|
-
const [{ resolvedConfig: config, additionalData: { notificationChannelsCount, workspaceAutomationsCount }, }, permissions, entitlements,
|
|
240
|
-
|
|
240
|
+
const [{ resolvedConfig: config, additionalData: { notificationChannelsCount, workspaceAutomationsCount }, loadedCatalog, }, permissions, entitlements, user, listedDashboards, dateHierarchyTemplates, , exportTimezone,] = yield all([
|
|
241
|
+
// the catalog load rides along with the config resolution because its computed-attributes
|
|
242
|
+
// part is feature-flag dependent - see resolveDashboardConfigAndFeatureFlagDependentCalls
|
|
243
|
+
call(resolveDashboardConfigAndFeatureFlagDependentCalls, ctx, cmd, { loadCatalog: true }),
|
|
241
244
|
call(resolvePermissions, ctx, cmd),
|
|
242
245
|
call(resolveEntitlements, ctx, cmd),
|
|
243
|
-
call(loadCatalog, ctx, cmd),
|
|
244
246
|
call(loadUser, ctx, cmd),
|
|
245
247
|
call(loadDashboardList, ctx),
|
|
246
248
|
call(loadDateHierarchyTemplates, ctx),
|
|
@@ -250,7 +252,9 @@ function* initializeNewDashboard(ctx, cmd) {
|
|
|
250
252
|
const workspaceParameters = yield call(loadWorkspaceParametersWithStatus, ctx, config.settings);
|
|
251
253
|
const workspaceParametersList = Array.isArray(workspaceParameters) ? workspaceParameters : [];
|
|
252
254
|
const dateFilterConfig = deriveAbsoluteFormGranularitiesFromRelativeForm(config.dateFilterConfig, !!config.settings.enableAbsoluteDateFilterGranularity);
|
|
253
|
-
const { initActions, dashboard, insights } = yield call(actionsToInitializeNewDashboard, ctx, config.settings, dateFilterConfig,
|
|
255
|
+
const { initActions, dashboard, insights } = yield call(actionsToInitializeNewDashboard, ctx, config.settings, dateFilterConfig, loadedCatalog
|
|
256
|
+
? createDisplayFormMapFromCatalog(loadedCatalog.catalog, loadedCatalog.computedAttributes)
|
|
257
|
+
: createDisplayFormMap([], []), cmd.payload.initialTabId, workspaceParametersList);
|
|
254
258
|
const measureParameterDependencies = yield call(loadMeasureParameterDependencies, ctx, insights, config.settings?.enableParameters ?? false);
|
|
255
259
|
const batch = batchActions([
|
|
256
260
|
backendCapabilitiesActions.setBackendCapabilities(backend.capabilities),
|
|
@@ -259,11 +263,12 @@ function* initializeNewDashboard(ctx, cmd) {
|
|
|
259
263
|
userActions.setUser(user),
|
|
260
264
|
permissionsActions.setPermissions(permissions),
|
|
261
265
|
catalogActions.setCatalogItems({
|
|
262
|
-
attributes: catalog.attributes(),
|
|
263
|
-
dateDatasets: catalog.dateDatasets(),
|
|
264
|
-
facts: catalog.facts(),
|
|
265
|
-
measures: catalog.measures(),
|
|
266
|
-
attributeHierarchies: catalog.attributeHierarchies(),
|
|
266
|
+
attributes: loadedCatalog?.catalog.attributes() ?? [],
|
|
267
|
+
dateDatasets: loadedCatalog?.catalog.dateDatasets() ?? [],
|
|
268
|
+
facts: loadedCatalog?.catalog.facts() ?? [],
|
|
269
|
+
measures: loadedCatalog?.catalog.measures() ?? [],
|
|
270
|
+
attributeHierarchies: loadedCatalog?.catalog.attributeHierarchies() ?? [],
|
|
271
|
+
computedAttributes: loadedCatalog?.computedAttributes ?? [],
|
|
267
272
|
dateHierarchyTemplates: dateHierarchyTemplates,
|
|
268
273
|
}),
|
|
269
274
|
catalogActions.setCatalogParameters(makeCatalogParametersPayload(workspaceParameters)),
|
|
@@ -298,16 +303,20 @@ function* initializeNewDashboard(ctx, cmd) {
|
|
|
298
303
|
};
|
|
299
304
|
}
|
|
300
305
|
export function* requestCatalog(ctx, cmd) {
|
|
301
|
-
|
|
302
|
-
|
|
306
|
+
// this deferred load runs after the init batch, so the resolved settings are already in the
|
|
307
|
+
// store - the computed-attributes part of the catalog load is gated by them
|
|
308
|
+
const enableComputedAttributes = yield select(selectEnableComputedAttributes);
|
|
309
|
+
const [loadedCatalog, dateHierarchyTemplates] = yield all([
|
|
310
|
+
call(loadCatalog, ctx, cmd, enableComputedAttributes),
|
|
303
311
|
call(loadDateHierarchyTemplates, ctx),
|
|
304
312
|
]);
|
|
305
313
|
yield put(catalogActions.setCatalogItems({
|
|
306
|
-
attributes: catalog.attributes(),
|
|
307
|
-
dateDatasets: catalog.dateDatasets(),
|
|
308
|
-
facts: catalog.facts(),
|
|
309
|
-
measures: catalog.measures(),
|
|
310
|
-
attributeHierarchies: catalog.attributeHierarchies(),
|
|
314
|
+
attributes: loadedCatalog.catalog.attributes(),
|
|
315
|
+
dateDatasets: loadedCatalog.catalog.dateDatasets(),
|
|
316
|
+
facts: loadedCatalog.catalog.facts(),
|
|
317
|
+
measures: loadedCatalog.catalog.measures(),
|
|
318
|
+
attributeHierarchies: loadedCatalog.catalog.attributeHierarchies(),
|
|
319
|
+
computedAttributes: loadedCatalog.computedAttributes,
|
|
311
320
|
dateHierarchyTemplates: dateHierarchyTemplates,
|
|
312
321
|
}));
|
|
313
322
|
}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { type IWorkspaceCatalog } from "@gooddata/sdk-backend-spi";
|
|
2
|
+
import { type ICatalogComputedAttribute } from "@gooddata/sdk-model";
|
|
2
3
|
import { type InitializeDashboard } from "../../../commands/dashboard.js";
|
|
3
4
|
import { type DashboardContext } from "../../../types/commonTypes.js";
|
|
4
|
-
export
|
|
5
|
+
export interface ILoadedCatalog {
|
|
6
|
+
catalog: IWorkspaceCatalog;
|
|
7
|
+
computedAttributes: ICatalogComputedAttribute[];
|
|
8
|
+
}
|
|
9
|
+
export declare function loadCatalog(ctx: DashboardContext, cmd: InitializeDashboard, includeComputedAttributes: boolean): Promise<ILoadedCatalog>;
|
|
5
10
|
//# sourceMappingURL=loadCatalog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loadCatalog.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAwC,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"loadCatalog.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAwC,MAAM,2BAA2B,CAAC;AACzG,OAAO,EAGH,KAAK,yBAAyB,EAEjC,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AActE,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,kBAAkB,EAAE,yBAAyB,EAAE,CAAC;CACnD;AAED,wBAAsB,WAAW,CAC7B,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,mBAAmB,EACxB,yBAAyB,EAAE,OAAO,GACnC,OAAO,CAAC,cAAc,CAAC,CAiDzB"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import { idRef } from "@gooddata/sdk-model";
|
|
2
|
+
import { idRef, } from "@gooddata/sdk-model";
|
|
3
|
+
import { isComputedAttributesUnavailableError } from "../../../../_staging/catalog/computedAttributes.js";
|
|
3
4
|
const SupportedCatalogGranularity = [
|
|
4
5
|
"GDC.time.day_in_week",
|
|
5
6
|
"GDC.time.day_in_month",
|
|
@@ -11,18 +12,50 @@ const SupportedCatalogGranularity = [
|
|
|
11
12
|
"GDC.time.month_in_year",
|
|
12
13
|
"GDC.time.quarter_in_year",
|
|
13
14
|
];
|
|
14
|
-
export function loadCatalog(ctx, cmd) {
|
|
15
|
+
export async function loadCatalog(ctx, cmd, includeComputedAttributes) {
|
|
15
16
|
const { backend, workspace } = ctx;
|
|
16
17
|
const availability = cmd.payload.config?.objectAvailability;
|
|
17
18
|
const metricTypes = backend.capabilities.supportsKpiWidget
|
|
18
19
|
? ["fact", "measure"]
|
|
19
20
|
: ["measure"];
|
|
20
|
-
const
|
|
21
|
+
const tagOptions = {
|
|
21
22
|
excludeTags: (availability?.excludeObjectsWithTags ?? []).map((tag) => idRef(tag)),
|
|
22
23
|
includeTags: (availability?.includeObjectsWithTags ?? []).map((tag) => idRef(tag)),
|
|
24
|
+
};
|
|
25
|
+
const options = {
|
|
26
|
+
...tagOptions,
|
|
23
27
|
types: ["attribute", ...metricTypes, "dateDataset", "attributeHierarchy"],
|
|
24
28
|
includeDateGranularities: SupportedCatalogGranularity,
|
|
25
29
|
loadGroups: false,
|
|
26
30
|
};
|
|
27
|
-
|
|
31
|
+
// The computed-attributes load is separate so it can never take the base catalog down with
|
|
32
|
+
// it. It is skipped when the enableComputedAttributes setting is off: the backend then
|
|
33
|
+
// refuses the listing outright (400), so nothing can be consumed anyway and asking would
|
|
34
|
+
// only produce console noise. With the setting on, only an "unavailable" refusal (a race
|
|
35
|
+
// with the setting being turned off, an older backend) degrades to none; a genuine failure
|
|
36
|
+
// is rethrown so it is not silenced as an empty catalog.
|
|
37
|
+
const loadComputedAttributes = async () => {
|
|
38
|
+
if (!includeComputedAttributes) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const computedAttributesCatalog = await backend
|
|
43
|
+
.workspace(workspace)
|
|
44
|
+
.catalog()
|
|
45
|
+
.withOptions({ ...tagOptions, types: ["computedAttribute"], loadGroups: false })
|
|
46
|
+
.load();
|
|
47
|
+
return computedAttributesCatalog.computedAttributes();
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (isComputedAttributesUnavailableError(error)) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
const [catalog, computedAttributes] = await Promise.all([
|
|
57
|
+
backend.workspace(workspace).catalog().withOptions(options).load(),
|
|
58
|
+
loadComputedAttributes(),
|
|
59
|
+
]);
|
|
60
|
+
return { catalog, computedAttributes };
|
|
28
61
|
}
|
package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type SagaIterator } from "redux-saga";
|
|
2
2
|
import { type InitializeDashboard } from "../../../commands/dashboard.js";
|
|
3
3
|
import { type DashboardContext, type ResolvedDashboardConfig } from "../../../types/commonTypes.js";
|
|
4
|
+
import { type ILoadedCatalog } from "./loadCatalog.js";
|
|
4
5
|
/**
|
|
5
6
|
* Loads all essential dashboard configuration from the backend if needed. The load command may specify their
|
|
6
7
|
* own inline config - if that is the case the config is bounced back immediately. Otherwise, the necessary
|
|
@@ -8,13 +9,17 @@ import { type DashboardContext, type ResolvedDashboardConfig } from "../../../ty
|
|
|
8
9
|
*/
|
|
9
10
|
export declare function resolveDashboardConfig(ctx: DashboardContext, cmd: InitializeDashboard): SagaIterator<ResolvedDashboardConfig>;
|
|
10
11
|
/**
|
|
11
|
-
* Resolves dashboard config
|
|
12
|
+
* Resolves dashboard config, followed by the backend calls whose shape depends on the resolved
|
|
13
|
+
* feature flags.
|
|
12
14
|
*/
|
|
13
|
-
export declare function resolveDashboardConfigAndFeatureFlagDependentCalls(ctx: DashboardContext, cmd: InitializeDashboard
|
|
15
|
+
export declare function resolveDashboardConfigAndFeatureFlagDependentCalls(ctx: DashboardContext, cmd: InitializeDashboard, options?: {
|
|
16
|
+
loadCatalog?: boolean;
|
|
17
|
+
}): SagaIterator<{
|
|
14
18
|
resolvedConfig: ResolvedDashboardConfig;
|
|
15
19
|
additionalData: {
|
|
16
20
|
notificationChannelsCount: number;
|
|
17
21
|
workspaceAutomationsCount: number;
|
|
18
22
|
};
|
|
23
|
+
loadedCatalog: ILoadedCatalog | undefined;
|
|
19
24
|
}>;
|
|
20
25
|
//# sourceMappingURL=resolveDashboardConfig.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveDashboardConfig.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAmB/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAEH,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAE/B,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"resolveDashboardConfig.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAmB/C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAEH,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAE/B,MAAM,+BAA+B,CAAC;AAIvC,OAAO,EAAE,KAAK,cAAc,EAAe,MAAM,kBAAkB,CAAC;AAwHpE;;;;GAIG;AACH,wBAAiB,sBAAsB,CACnC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,mBAAmB,GACzB,YAAY,CAAC,uBAAuB,CAAC,CAmEvC;AA0DD;;;GAGG;AACH,wBAAiB,kDAAkD,CAC/D,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,mBAAmB,EACxB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,YAAY,CAAC;IACZ,cAAc,EAAE,uBAAuB,CAAC;IACxC,cAAc,EAAE;QACZ,yBAAyB,EAAE,MAAM,CAAC;QAClC,yBAAyB,EAAE,MAAM,CAAC;KACrC,CAAC;IACF,aAAa,EAAE,cAAc,GAAG,SAAS,CAAC;CAC7C,CAAC,CAkBD"}
|
package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js
CHANGED
|
@@ -7,6 +7,7 @@ import { stripUserAndWorkspaceProps } from "../../../../_staging/settings/conver
|
|
|
7
7
|
import { tabsActions } from "../../../store/tabs/index.js";
|
|
8
8
|
import { isResolvedConfig, } from "../../../types/commonTypes.js";
|
|
9
9
|
import { loadAutomationsData } from "../common/loadAutomationsData.js";
|
|
10
|
+
import { loadCatalog } from "./loadCatalog.js";
|
|
10
11
|
import { onDateFilterConfigValidationError } from "./onDateFilterConfigValidationError.js";
|
|
11
12
|
import { sanitizeUnfinishedFeatureSettings } from "./sanitizeUnfinishedFeatureSettings.js";
|
|
12
13
|
function loadDateFilterConfig({ backend, workspace, }) {
|
|
@@ -168,13 +169,24 @@ function applyConfigDefaults(config) {
|
|
|
168
169
|
};
|
|
169
170
|
}
|
|
170
171
|
/**
|
|
171
|
-
* Resolves dashboard config
|
|
172
|
+
* Resolves dashboard config, followed by the backend calls whose shape depends on the resolved
|
|
173
|
+
* feature flags.
|
|
172
174
|
*/
|
|
173
|
-
export function* resolveDashboardConfigAndFeatureFlagDependentCalls(ctx, cmd) {
|
|
175
|
+
export function* resolveDashboardConfigAndFeatureFlagDependentCalls(ctx, cmd, options) {
|
|
174
176
|
const resolvedConfig = yield call(resolveDashboardConfig, ctx, cmd);
|
|
175
|
-
const additionalData = yield
|
|
177
|
+
const [additionalData, loadedCatalog] = yield all([
|
|
178
|
+
call(loadAutomationsData, ctx, resolvedConfig.settings),
|
|
179
|
+
// The catalog load sits here, after the config resolution, only because its
|
|
180
|
+
// computed-attributes part must know the enableComputedAttributes setting before issuing
|
|
181
|
+
// the request (a backend with the setting off refuses the listing with a 400). Once the
|
|
182
|
+
// setting is removed, move loadCatalog back to the init handler's parallel batch.
|
|
183
|
+
...(options?.loadCatalog
|
|
184
|
+
? [call(loadCatalog, ctx, cmd, resolvedConfig.settings?.enableComputedAttributes ?? false)]
|
|
185
|
+
: []),
|
|
186
|
+
]);
|
|
176
187
|
return {
|
|
177
188
|
resolvedConfig,
|
|
178
189
|
additionalData,
|
|
190
|
+
loadedCatalog,
|
|
179
191
|
};
|
|
180
192
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterDisplayFormValidation.d.ts","sourceRoot":"","sources":["../../../../../../src/model/commandHandlers/filterContext/attributeFilter/validation/filterDisplayFormValidation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"filterDisplayFormValidation.d.ts","sourceRoot":"","sources":["../../../../../../src/model/commandHandlers/filterContext/attributeFilter/validation/filterDisplayFormValidation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAA0D,MAAM,qBAAqB,CAAC;AAE1G,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,MAAM,MAAM,0CAA0C,GAChD,OAAO,GACP,0BAA0B,GAC1B,gCAAgC,CAAC;AAEvC,wBAAsB,yBAAyB,CAC3C,GAAG,EAAE,gBAAgB,EACrB,eAAe,EAAE,MAAM,GAAG,SAAS,EACnC,WAAW,EAAE,MAAM,GACpB,OAAO,CAAC,0CAA0C,CAAC,CAiCrD"}
|
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
// (C) 2022-
|
|
2
|
-
import { areObjRefsEqual, idRef, uriRef } from "@gooddata/sdk-model";
|
|
1
|
+
// (C) 2022-2026 GoodData Corporation
|
|
2
|
+
import { areObjRefsEqual, idRef, isComputedAttributeRef, uriRef } from "@gooddata/sdk-model";
|
|
3
3
|
export async function validateFilterDisplayForm(ctx, filterAttribute, displayForm) {
|
|
4
4
|
// validate if the filter attribute is available
|
|
5
5
|
if (!filterAttribute) {
|
|
6
6
|
return "INVALID_FILTER_ATTRIBUTE";
|
|
7
7
|
}
|
|
8
8
|
const { backend, workspace } = ctx;
|
|
9
|
+
// A computed attribute has exactly one fabricated display form that shares the computed
|
|
10
|
+
// attribute's own ref, so the validation needs no backend roundtrip - and the attributes
|
|
11
|
+
// service could not resolve such a ref anyway.
|
|
12
|
+
if (isComputedAttributeRef(filterAttribute)) {
|
|
13
|
+
return areObjRefsEqual(filterAttribute, displayForm) ? "VALID" : "INVALID_ATTRIBUTE_DISPLAY_FORM";
|
|
14
|
+
}
|
|
9
15
|
const attributeDisplayForms = (await backend.workspace(workspace).attributes().getAttribute(filterAttribute)).displayForms;
|
|
10
16
|
// validate if the display form is between attributes available display forms.
|
|
11
17
|
// try matching both uri and id in case the type of ref is different from what is in the ref field
|
|
12
|
-
if (attributeDisplayForms.some((df) => areObjRefsEqual(
|
|
18
|
+
if (attributeDisplayForms.some((df) => areObjRefsEqual(df.ref, displayForm) ||
|
|
19
|
+
areObjRefsEqual(idRef(df.id, "displayForm"), displayForm) ||
|
|
13
20
|
areObjRefsEqual(uriRef(df.uri), displayForm))) {
|
|
14
21
|
return "VALID";
|
|
15
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniqueFiltersValidation.d.ts","sourceRoot":"","sources":["../../../../../../src/model/commandHandlers/filterContext/attributeFilter/validation/uniqueFiltersValidation.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,4BAA4B,EACjC,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"uniqueFiltersValidation.d.ts","sourceRoot":"","sources":["../../../../../../src/model/commandHandlers/filterContext/attributeFilter/validation/uniqueFiltersValidation.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,4BAA4B,EACjC,KAAK,MAAM,EAId,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,wBAAsB,gBAAgB,CAClC,GAAG,EAAE,gBAAgB,EACrB,mBAAmB,EAAE,MAAM,EAC3B,UAAU,EAAE,4BAA4B,EAAE,GAC3C,OAAO,CAAC,OAAO,CAAC,CAsClB"}
|
|
@@ -1,24 +1,34 @@
|
|
|
1
1
|
// (C) 2021-2026 GoodData Corporation
|
|
2
|
-
import { areObjRefsEqual, dashboardAttributeFilterItemDisplayForm, } from "@gooddata/sdk-model";
|
|
2
|
+
import { areObjRefsEqual, dashboardAttributeFilterItemDisplayForm, isComputedAttributeRef, } from "@gooddata/sdk-model";
|
|
3
|
+
import { partitionComputedAttributeRefs } from "../../../../../_staging/catalog/computedAttributes.js";
|
|
3
4
|
export async function canFilterBeAdded(ctx, addedDisplayFormRef, allFilters) {
|
|
4
5
|
// first filter is always ok, save some useless work upfront
|
|
5
6
|
if (allFilters.length === 0) {
|
|
6
7
|
return true;
|
|
7
8
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
// A computed attribute's fabricated display form shares the computed attribute's own ref, so
|
|
10
|
+
// its attribute ref is known without a backend roundtrip - and the labels service would not
|
|
11
|
+
// find such a display form anyway.
|
|
12
|
+
const loadAddedAttributeRef = isComputedAttributeRef(addedDisplayFormRef)
|
|
13
|
+
? Promise.resolve(addedDisplayFormRef)
|
|
14
|
+
: ctx.backend
|
|
15
|
+
.workspace(ctx.workspace)
|
|
16
|
+
.attributes()
|
|
17
|
+
.getAttributeDisplayForm(addedDisplayFormRef)
|
|
18
|
+
.then((df) => df.attribute);
|
|
19
|
+
const { computedAttributeRefs, otherRefs } = partitionComputedAttributeRefs(allFilters.map((item) => dashboardAttributeFilterItemDisplayForm(item)));
|
|
20
|
+
const loadExistingAttributeRefs = otherRefs.length
|
|
21
|
+
? ctx.backend
|
|
22
|
+
.workspace(ctx.workspace)
|
|
23
|
+
.attributes()
|
|
24
|
+
.getAttributeDisplayForms(otherRefs)
|
|
25
|
+
.then((dfs) => dfs.map((df) => df.attribute))
|
|
26
|
+
: Promise.resolve([]);
|
|
27
|
+
const [attributeFilterRef, existingOtherAttributeRefs] = await Promise.all([
|
|
28
|
+
loadAddedAttributeRef,
|
|
29
|
+
loadExistingAttributeRefs,
|
|
19
30
|
]);
|
|
20
|
-
const
|
|
21
|
-
const existingAttributes = existingDisplayForms.map((df) => df.attribute);
|
|
31
|
+
const existingAttributes = [...existingOtherAttributeRefs, ...computedAttributeRefs];
|
|
22
32
|
// lookup has to be in existing Attributes array since we support only one DF for one Attribute
|
|
23
33
|
return !existingAttributes.some((existing) => areObjRefsEqual(existing, attributeFilterRef));
|
|
24
34
|
}
|