@gooddata/sdk-ui-dashboard 11.56.0-alpha.7 → 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.
Files changed (307) hide show
  1. package/esm/__version.d.ts +1 -1
  2. package/esm/__version.js +1 -1
  3. package/esm/_staging/catalog/computedAttributes.d.ts +43 -0
  4. package/esm/_staging/catalog/computedAttributes.d.ts.map +1 -0
  5. package/esm/_staging/catalog/computedAttributes.js +93 -0
  6. package/esm/_staging/catalog/displayFormMap.d.ts +3 -2
  7. package/esm/_staging/catalog/displayFormMap.d.ts.map +1 -1
  8. package/esm/_staging/catalog/displayFormMap.js +9 -3
  9. package/esm/_staging/metadata/objRefMap.d.ts.map +1 -1
  10. package/esm/_staging/metadata/objRefMap.js +11 -1
  11. package/esm/index.d.ts +9 -5
  12. package/esm/index.d.ts.map +1 -1
  13. package/esm/index.js +7 -3
  14. package/esm/kdaDialog/composition/hooks/useKdaValidAttributes.js +2 -2
  15. package/esm/kdaDialog/dialog/hooks/useValidAttributes.d.ts.map +1 -1
  16. package/esm/kdaDialog/dialog/hooks/useValidAttributes.js +21 -6
  17. package/esm/kdaDialog/hooks/useAttribute.d.ts.map +1 -1
  18. package/esm/kdaDialog/hooks/useAttribute.js +16 -8
  19. package/esm/locales.d.ts +3 -0
  20. package/esm/locales.d.ts.map +1 -1
  21. package/esm/locales.js +3 -0
  22. package/esm/model/commandHandlers/dashboard/common/loadAvailableDisplayFormRefs.d.ts.map +1 -1
  23. package/esm/model/commandHandlers/dashboard/common/loadAvailableDisplayFormRefs.js +15 -6
  24. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.d.ts +2 -3
  25. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.d.ts.map +1 -1
  26. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.js +26 -17
  27. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.d.ts +6 -1
  28. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.d.ts.map +1 -1
  29. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.js +37 -4
  30. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts +7 -2
  31. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts.map +1 -1
  32. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js +15 -3
  33. package/esm/model/commandHandlers/filterContext/attributeFilter/validation/filterDisplayFormValidation.d.ts.map +1 -1
  34. package/esm/model/commandHandlers/filterContext/attributeFilter/validation/filterDisplayFormValidation.js +10 -3
  35. package/esm/model/commandHandlers/filterContext/attributeFilter/validation/uniqueFiltersValidation.d.ts.map +1 -1
  36. package/esm/model/commandHandlers/filterContext/attributeFilter/validation/uniqueFiltersValidation.js +24 -14
  37. package/esm/model/commandHandlers/scheduledEmail/createScheduledEmailHandler.js +2 -2
  38. package/esm/model/commandHandlers/scheduledEmail/saveScheduledEmailHandler.js +2 -2
  39. package/esm/model/commandHandlers/widgets/attributeHierarchyModifiedHandler.d.ts.map +1 -1
  40. package/esm/model/commandHandlers/widgets/attributeHierarchyModifiedHandler.js +6 -0
  41. package/esm/model/commandHandlers/widgets/exportInsightWidgetHandler.d.ts.map +1 -1
  42. package/esm/model/commandHandlers/widgets/exportInsightWidgetHandler.js +2 -2
  43. package/esm/model/commandHandlers/widgets/exportRawInsightWidgetHandler.js +2 -2
  44. package/esm/model/queries/base.d.ts +1 -1
  45. package/esm/model/queries/base.d.ts.map +1 -1
  46. package/esm/model/queries/base.js +1 -1
  47. package/esm/model/queries/computedAttributeExpression.d.ts +27 -0
  48. package/esm/model/queries/computedAttributeExpression.d.ts.map +1 -0
  49. package/esm/model/queries/computedAttributeExpression.js +21 -0
  50. package/esm/model/queries/connectedAttributes.d.ts +19 -1
  51. package/esm/model/queries/connectedAttributes.d.ts.map +1 -1
  52. package/esm/model/queries/connectedAttributes.js +3 -1
  53. package/esm/model/queries/index.d.ts +2 -1
  54. package/esm/model/queries/index.d.ts.map +1 -1
  55. package/esm/model/queryServices/index.d.ts +1 -1
  56. package/esm/model/queryServices/index.d.ts.map +1 -1
  57. package/esm/model/queryServices/index.js +2 -0
  58. package/esm/model/queryServices/queryAttributeByDisplayForm.d.ts.map +1 -1
  59. package/esm/model/queryServices/queryAttributeByDisplayForm.js +12 -3
  60. package/esm/model/queryServices/queryAttributeDataset.d.ts.map +1 -1
  61. package/esm/model/queryServices/queryAttributeDataset.js +9 -1
  62. package/esm/model/queryServices/queryComputedAttributeExpression.d.ts +4 -0
  63. package/esm/model/queryServices/queryComputedAttributeExpression.d.ts.map +1 -0
  64. package/esm/model/queryServices/queryComputedAttributeExpression.js +17 -0
  65. package/esm/model/queryServices/queryConnectedAttributes.d.ts.map +1 -1
  66. package/esm/model/queryServices/queryConnectedAttributes.js +20 -5
  67. package/esm/model/queryServices/queryInsightAttributesMeta.d.ts.map +1 -1
  68. package/esm/model/queryServices/queryInsightAttributesMeta.js +20 -11
  69. package/esm/model/react/useIsWidgetRestricted.d.ts +9 -0
  70. package/esm/model/react/useIsWidgetRestricted.d.ts.map +1 -0
  71. package/esm/model/react/useIsWidgetRestricted.js +14 -0
  72. package/esm/model/store/catalog/catalogReducers.d.ts +2 -1
  73. package/esm/model/store/catalog/catalogReducers.d.ts.map +1 -1
  74. package/esm/model/store/catalog/catalogReducers.js +2 -1
  75. package/esm/model/store/catalog/catalogSelectors.d.ts +21 -1
  76. package/esm/model/store/catalog/catalogSelectors.d.ts.map +1 -1
  77. package/esm/model/store/catalog/catalogSelectors.js +26 -2
  78. package/esm/model/store/catalog/catalogState.d.ts +8 -1
  79. package/esm/model/store/catalog/catalogState.d.ts.map +1 -1
  80. package/esm/model/store/catalog/catalogState.js +1 -0
  81. package/esm/model/store/config/configSelectors.d.ts +11 -0
  82. package/esm/model/store/config/configSelectors.d.ts.map +1 -1
  83. package/esm/model/store/config/configSelectors.js +13 -0
  84. package/esm/model/store/insights/insightsSelectors.js +3 -3
  85. package/esm/model/store/tabs/filterContext/filterContextSelectors.d.ts.map +1 -1
  86. package/esm/model/store/tabs/filterContext/filterContextSelectors.js +8 -4
  87. package/esm/model/store/unavailableObjects/unavailableObjectsSelectors.d.ts +8 -0
  88. package/esm/model/store/unavailableObjects/unavailableObjectsSelectors.d.ts.map +1 -1
  89. package/esm/model/store/unavailableObjects/unavailableObjectsSelectors.js +8 -0
  90. package/esm/model/utils/displayFormResolver.d.ts.map +1 -1
  91. package/esm/model/utils/displayFormResolver.js +11 -1
  92. package/esm/plugins/customizationApis/customizationBuilder.d.ts.map +1 -1
  93. package/esm/plugins/customizationApis/customizationBuilder.js +1 -0
  94. package/esm/plugins/customizationApis/insightCustomizer.d.ts +4 -2
  95. package/esm/plugins/customizationApis/insightCustomizer.d.ts.map +1 -1
  96. package/esm/plugins/customizationApis/insightCustomizer.js +43 -3
  97. package/esm/plugins/customizer.d.ts +14 -1
  98. package/esm/plugins/customizer.d.ts.map +1 -1
  99. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts.map +1 -1
  100. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.js +1 -1
  101. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.d.ts.map +1 -1
  102. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.js +23 -58
  103. package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts +33 -0
  104. package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts.map +1 -0
  105. package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.js +61 -0
  106. package/esm/presentation/automations/alerting/state/useAlertFiltersModel.d.ts +3 -17
  107. package/esm/presentation/automations/alerting/state/useAlertFiltersModel.d.ts.map +1 -1
  108. package/esm/presentation/automations/alerting/state/useAlertFiltersModel.js +3 -52
  109. package/esm/presentation/automations/alerting/state/useAlertFormState.js +1 -1
  110. package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.js +2 -2
  111. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts.map +1 -1
  112. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +1 -1
  113. package/esm/presentation/automations/scheduledEmail/blocks/ScheduledEmailDialogShell.js +2 -5
  114. package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.d.ts.map +1 -1
  115. package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.js +22 -40
  116. package/esm/presentation/automations/scheduledEmail/state/useSaveScheduledEmailToBackend.d.ts.map +1 -1
  117. package/esm/presentation/automations/scheduledEmail/state/useSaveScheduledEmailToBackend.js +14 -3
  118. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts +27 -0
  119. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts.map +1 -0
  120. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.js +142 -0
  121. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.d.ts +4 -6
  122. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.d.ts.map +1 -1
  123. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.js +9 -151
  124. package/esm/presentation/automations/shared/filters/conversions.d.ts +4 -0
  125. package/esm/presentation/automations/shared/filters/conversions.d.ts.map +1 -1
  126. package/esm/presentation/automations/shared/filters/conversions.js +28 -24
  127. package/esm/presentation/automations/shared/hooks/useShallowStable.d.ts +10 -0
  128. package/esm/presentation/automations/shared/hooks/useShallowStable.d.ts.map +1 -0
  129. package/esm/presentation/automations/shared/hooks/useShallowStable.js +18 -0
  130. package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.d.ts.map +1 -1
  131. package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.js +17 -4
  132. package/esm/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.d.ts +10 -0
  133. package/esm/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.d.ts.map +1 -0
  134. package/esm/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.js +19 -0
  135. package/esm/presentation/dashboard/DashboardSidebar/SidebarConfigurationPanel.d.ts.map +1 -1
  136. package/esm/presentation/dashboard/DashboardSidebar/SidebarConfigurationPanel.js +8 -2
  137. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeChrome.d.ts.map +1 -1
  138. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeChrome.js +4 -2
  139. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeContext.d.ts +8 -3
  140. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeContext.d.ts.map +1 -1
  141. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeContext.js +65 -25
  142. package/esm/presentation/dashboard/components/DashboardInner.d.ts.map +1 -1
  143. package/esm/presentation/dashboard/components/DashboardInner.js +4 -4
  144. package/esm/presentation/dashboard/components/DashboardRenderer.d.ts.map +1 -1
  145. package/esm/presentation/dashboard/components/DashboardRenderer.js +2 -2
  146. package/esm/presentation/dashboard/hooks/useDashboard.d.ts +2 -1
  147. package/esm/presentation/dashboard/hooks/useDashboard.d.ts.map +1 -1
  148. package/esm/presentation/dashboard/hooks/useDashboard.js +7 -1
  149. package/esm/presentation/dashboard/types.d.ts +14 -1
  150. package/esm/presentation/dashboard/types.d.ts.map +1 -1
  151. package/esm/presentation/dashboardContexts/DashboardComponentsContext.d.ts +2 -1
  152. package/esm/presentation/dashboardContexts/DashboardComponentsContext.d.ts.map +1 -1
  153. package/esm/presentation/dashboardContexts/DashboardComponentsContext.js +1 -0
  154. package/esm/presentation/dashboardContexts/types.d.ts +20 -0
  155. package/esm/presentation/dashboardContexts/types.d.ts.map +1 -1
  156. package/esm/presentation/dragAndDrop/draggableAttributeFilter/DefaultAttributeFilterDraggingComponent.d.ts.map +1 -1
  157. package/esm/presentation/dragAndDrop/draggableAttributeFilter/DefaultAttributeFilterDraggingComponent.js +4 -3
  158. package/esm/presentation/export/useExportData.js +2 -2
  159. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.d.ts.map +1 -1
  160. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.js +8 -2
  161. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts +12 -1
  162. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts.map +1 -1
  163. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.js +19 -2
  164. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/displayForms/AttributeDisplayFormsDropdown.d.ts.map +1 -1
  165. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/displayForms/AttributeDisplayFormsDropdown.js +3 -2
  166. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.d.ts +14 -0
  167. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.d.ts.map +1 -0
  168. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.js +28 -0
  169. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useDisplayFormConfiguration.js +2 -2
  170. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useValidNeighbourAttributes.d.ts.map +1 -1
  171. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useValidNeighbourAttributes.js +12 -2
  172. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/limitValues/shared/limitingItemsHook.d.ts.map +1 -1
  173. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/limitValues/shared/limitingItemsHook.js +6 -5
  174. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/parentFilters/ParentFiltersDisabledItem.js +2 -2
  175. package/esm/presentation/filterBar/filterBar/DefaultFilterBarItem.js +2 -2
  176. package/esm/presentation/filterBar/filterBar/useFiltersWithAddedPlaceholder.js +2 -2
  177. package/esm/presentation/filterBar/measureValueFilter/useDashboardMeasureValueFilterData.d.ts.map +1 -1
  178. package/esm/presentation/filterBar/measureValueFilter/useDashboardMeasureValueFilterData.js +55 -17
  179. package/esm/presentation/flexibleLayout/DashboardLayoutWidget.d.ts.map +1 -1
  180. package/esm/presentation/flexibleLayout/DashboardLayoutWidget.js +6 -1
  181. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts +5 -0
  182. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
  183. package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +5 -0
  184. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +5 -0
  185. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
  186. package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +5 -0
  187. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +5 -0
  188. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
  189. package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +5 -0
  190. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +40 -0
  191. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  192. package/esm/presentation/localization/bundles/en-US.localization-bundle.js +40 -0
  193. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +5 -0
  194. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
  195. package/esm/presentation/localization/bundles/es-419.localization-bundle.js +5 -0
  196. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +5 -0
  197. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
  198. package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +5 -0
  199. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +5 -0
  200. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
  201. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +5 -0
  202. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +5 -0
  203. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
  204. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +5 -0
  205. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +5 -0
  206. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
  207. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +5 -0
  208. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +5 -0
  209. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
  210. package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +5 -0
  211. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +5 -0
  212. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
  213. package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +5 -0
  214. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +5 -0
  215. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
  216. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +5 -0
  217. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +5 -0
  218. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
  219. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +5 -0
  220. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +5 -0
  221. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
  222. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +5 -0
  223. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +5 -0
  224. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
  225. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +5 -0
  226. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +5 -0
  227. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
  228. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +5 -0
  229. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +5 -0
  230. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
  231. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +5 -0
  232. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +5 -0
  233. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
  234. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +5 -0
  235. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +5 -0
  236. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
  237. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +5 -0
  238. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +5 -0
  239. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
  240. package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +5 -0
  241. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +5 -0
  242. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
  243. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +5 -0
  244. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +5 -0
  245. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
  246. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +5 -0
  247. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +5 -0
  248. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
  249. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +5 -0
  250. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +5 -0
  251. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
  252. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +5 -0
  253. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +5 -0
  254. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
  255. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +5 -0
  256. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +5 -0
  257. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
  258. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +5 -0
  259. package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts +54 -0
  260. package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts.map +1 -0
  261. package/esm/presentation/widget/common/RestrictedPlaceholder.js +49 -0
  262. package/esm/presentation/widget/common/configuration/DateDatasetFilter.d.ts +6 -1
  263. package/esm/presentation/widget/common/configuration/DateDatasetFilter.d.ts.map +1 -1
  264. package/esm/presentation/widget/common/configuration/DateDatasetFilter.js +2 -2
  265. package/esm/presentation/widget/common/configuration/DateFilterCheckbox.d.ts +6 -1
  266. package/esm/presentation/widget/common/configuration/DateFilterCheckbox.d.ts.map +1 -1
  267. package/esm/presentation/widget/common/configuration/DateFilterCheckbox.js +10 -3
  268. package/esm/presentation/widget/insight/DefaultInsightBody/DefaultInsightBody.js +2 -2
  269. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.js +2 -2
  270. package/esm/presentation/widget/insight/configuration/InsightDateDataSetFilter.d.ts.map +1 -1
  271. package/esm/presentation/widget/insight/configuration/InsightDateDataSetFilter.js +1 -1
  272. package/esm/presentation/widget/insight/configuration/InsightDrillConfigList.d.ts +6 -1
  273. package/esm/presentation/widget/insight/configuration/InsightDrillConfigList.d.ts.map +1 -1
  274. package/esm/presentation/widget/insight/configuration/InsightDrillConfigList.js +13 -2
  275. package/esm/presentation/widget/insight/configuration/InsightDrillConfigPanel/InsightDrillConfigPanel.d.ts.map +1 -1
  276. package/esm/presentation/widget/insight/configuration/InsightDrillConfigPanel/InsightDrillConfigPanel.js +5 -1
  277. package/esm/presentation/widget/insight/configuration/useDrillTargetTypeItems.d.ts +1 -1
  278. package/esm/presentation/widget/insight/configuration/useDrillTargetTypeItems.d.ts.map +1 -1
  279. package/esm/presentation/widget/insight/configuration/useDrillTargetTypeItems.js +2 -2
  280. package/esm/presentation/widget/richText/configuration/RichTextDateDataSetFilter.d.ts.map +1 -1
  281. package/esm/presentation/widget/richText/configuration/RichTextDateDataSetFilter.js +1 -1
  282. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.d.ts.map +1 -1
  283. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.js +8 -0
  284. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcherRestricted.d.ts +16 -0
  285. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcherRestricted.d.ts.map +1 -0
  286. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcherRestricted.js +19 -0
  287. package/esm/presentation/widget/widget/InsightWidget/DashboardWidgetInsightGuard.d.ts.map +1 -1
  288. package/esm/presentation/widget/widget/InsightWidget/DashboardWidgetInsightGuard.js +11 -1
  289. package/esm/presentation/widget/widget/InsightWidget/DefaultDashboardInsightWidget.js +2 -2
  290. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/VisualizationSwitcherNavigationHeader.d.ts.map +1 -1
  291. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/VisualizationSwitcherNavigationHeader.js +25 -12
  292. package/esm/sdk-ui-dashboard.d.ts +201 -3
  293. package/package.json +21 -21
  294. package/styles/css/configurationPanel.css +1 -5
  295. package/styles/css/configurationPanel.css.map +1 -1
  296. package/styles/css/filterBar.css +29 -0
  297. package/styles/css/filterBar.css.map +1 -1
  298. package/styles/css/main.css +203 -5
  299. package/styles/css/main.css.map +1 -1
  300. package/styles/css/sidebar.css +165 -0
  301. package/styles/css/sidebar.css.map +1 -1
  302. package/styles/css/visualizationSwitcherWidget.css +8 -0
  303. package/styles/css/visualizationSwitcherWidget.css.map +1 -1
  304. package/styles/scss/configurationPanel.scss +1 -7
  305. package/styles/scss/filterBar.scss +38 -0
  306. package/styles/scss/sidebar.scss +215 -0
  307. 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 { selectCatalogAttributes } from "../../../model/store/catalog/catalogSelectors.js";
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(selectCatalogAttributes);
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":"AAUA,wBAAgB,kBAAkB,SAYjC"}
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
- return backend
25
- .workspace(workspace)
26
- .measures()
27
- .getConnectedAttributes(metric, metrics);
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,EAAE,KAAK,MAAM,EAAmB,MAAM,qBAAqB,CAAC;AAKnE,wBAAgB,YAAY,WAIb,MAAM,4DAWpB"}
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 dateAttributes = useDashboardSelector(selectCatalogAttributes);
7
+ const attributes = useDashboardSelector(selectCatalogAttributes);
8
+ const computedAttributes = useDashboardSelector(selectCatalogComputedAttributes);
8
9
  return useCallback((ref) => {
9
- return ref
10
- ? (dateAttributes.find((a) => areObjRefsEqual(ref, a.attribute.ref) ||
11
- a.attribute.displayForms.some((df) => areObjRefsEqual(df.ref, ref))) ?? null)
12
- : null;
13
- }, [dateAttributes]);
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
@@ -276,6 +276,9 @@ export declare const messages: {
276
276
  disableDrillDownToolTip: {
277
277
  id: string;
278
278
  };
279
+ computedAttributeDrillDownToolTip: {
280
+ id: string;
281
+ };
279
282
  disableUsedDrillDownTooltip: {
280
283
  id: string;
281
284
  };
@@ -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;;;QACE,EAAE;;;QACF,EAAE;;;QACD,EAAE;;;QACT,EAAE;;;QACK,EAAE;;CACpC,CAAC"}
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;AAElD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,wBAAgB,4BAA4B,CACxC,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnB"}
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
- export function loadAvailableDisplayFormRefs(ctx, displayForms) {
1
+ import { loadComputedAttributesByRefs, partitionComputedAttributeRefs, } from "../../../../_staging/catalog/computedAttributes.js";
2
+ export async function loadAvailableDisplayFormRefs(ctx, displayForms) {
2
3
  const { backend, workspace } = ctx;
3
- return backend
4
- .workspace(workspace)
5
- .attributes()
6
- .getAttributeDisplayForms(displayForms)
7
- .then((references) => references.map((df) => df.ref));
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<IWorkspaceCatalog>> | import("redux-saga/effects").PutEffect<{
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
- }>, void, [IWorkspaceCatalog, IDateHierarchyTemplate[]]>;
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;AAG/C,OAAO,EAAiC,KAAK,iBAAiB,EAAc,MAAM,2BAA2B,CAAC;AAC9G,OAAO,EACH,KAAK,UAAU,EAIf,KAAK,sBAAsB,EAW9B,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAuB1E,OAAO,EACH,KAAK,gBAAgB,EAGxB,MAAM,+BAA+B,CAAC;AAgevC,wBAAiB,cAAc,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB;;;yDAgB9E;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
+ {"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, catalog, user, listedDashboards, dateHierarchyTemplates, , exportTimezone,] = yield all([
240
- call(resolveDashboardConfigAndFeatureFlagDependentCalls, ctx, cmd),
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, catalog ? createDisplayFormMapFromCatalog(catalog) : createDisplayFormMap([], []), cmd.payload.initialTabId, workspaceParametersList);
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
- const [catalog, dateHierarchyTemplates] = yield all([
302
- call(loadCatalog, ctx, cmd),
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 declare function loadCatalog(ctx: DashboardContext, cmd: InitializeDashboard): Promise<IWorkspaceCatalog>;
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;AAGzG,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AActE,wBAAgB,WAAW,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgBvG"}
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 options = {
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
- return backend.workspace(workspace).catalog().withOptions(options).load();
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
  }
@@ -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): SagaIterator<{
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;AA2HvC;;;;GAIG;AACH,wBAAiB,sBAAsB,CACnC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,mBAAmB,GACzB,YAAY,CAAC,uBAAuB,CAAC,CAmEvC;AA0DD;;GAEG;AACH,wBAAiB,kDAAkD,CAC/D,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,mBAAmB,GACzB,YAAY,CAAC;IACZ,cAAc,EAAE,uBAAuB,CAAC;IACxC,cAAc,EAAE;QACZ,yBAAyB,EAAE,MAAM,CAAC;QAClC,yBAAyB,EAAE,MAAM,CAAC;KACrC,CAAC;CACL,CAAC,CAQD"}
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"}
@@ -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 call(loadAutomationsData, ctx, resolvedConfig.settings);
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":"AACA,OAAO,EAAE,KAAK,MAAM,EAAkC,MAAM,qBAAqB,CAAC;AAElF,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,CAyBrD"}
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-2025 GoodData Corporation
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(idRef(df.id, "displayForm"), displayForm) ||
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,EAGd,MAAM,qBAAqB,CAAC;AAE7B,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,CA0BlB"}
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
- const loadAddedDisplayForm = ctx.backend
9
- .workspace(ctx.workspace)
10
- .attributes()
11
- .getAttributeDisplayForm(addedDisplayFormRef);
12
- const loadExistingDisplayForms = ctx.backend
13
- .workspace(ctx.workspace)
14
- .attributes()
15
- .getAttributeDisplayForms(allFilters.map((item) => dashboardAttributeFilterItemDisplayForm(item)));
16
- const [addedDisplayForm, existingDisplayForms] = await Promise.all([
17
- loadAddedDisplayForm,
18
- loadExistingDisplayForms,
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 attributeFilterRef = addedDisplayForm.attribute;
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
  }