@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.
Files changed (323) hide show
  1. package/NOTICE +1 -1
  2. package/esm/__version.d.ts +1 -1
  3. package/esm/__version.js +1 -1
  4. package/esm/_staging/catalog/computedAttributes.d.ts +43 -0
  5. package/esm/_staging/catalog/computedAttributes.d.ts.map +1 -0
  6. package/esm/_staging/catalog/computedAttributes.js +93 -0
  7. package/esm/_staging/catalog/displayFormMap.d.ts +3 -2
  8. package/esm/_staging/catalog/displayFormMap.d.ts.map +1 -1
  9. package/esm/_staging/catalog/displayFormMap.js +9 -3
  10. package/esm/_staging/metadata/objRefMap.d.ts.map +1 -1
  11. package/esm/_staging/metadata/objRefMap.js +11 -1
  12. package/esm/index.d.ts +9 -5
  13. package/esm/index.d.ts.map +1 -1
  14. package/esm/index.js +7 -3
  15. package/esm/kdaDialog/composition/hooks/useKdaValidAttributes.js +2 -2
  16. package/esm/kdaDialog/dialog/hooks/useValidAttributes.d.ts.map +1 -1
  17. package/esm/kdaDialog/dialog/hooks/useValidAttributes.js +21 -6
  18. package/esm/kdaDialog/hooks/useAttribute.d.ts.map +1 -1
  19. package/esm/kdaDialog/hooks/useAttribute.js +16 -8
  20. package/esm/locales.d.ts +3 -0
  21. package/esm/locales.d.ts.map +1 -1
  22. package/esm/locales.js +3 -0
  23. package/esm/model/commandHandlers/dashboard/common/loadAvailableDisplayFormRefs.d.ts.map +1 -1
  24. package/esm/model/commandHandlers/dashboard/common/loadAvailableDisplayFormRefs.js +15 -6
  25. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.d.ts +2 -3
  26. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.d.ts.map +1 -1
  27. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.js +26 -17
  28. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.d.ts +6 -1
  29. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.d.ts.map +1 -1
  30. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadCatalog.js +37 -4
  31. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts +7 -2
  32. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts.map +1 -1
  33. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js +15 -3
  34. package/esm/model/commandHandlers/filterContext/attributeFilter/validation/filterDisplayFormValidation.d.ts.map +1 -1
  35. package/esm/model/commandHandlers/filterContext/attributeFilter/validation/filterDisplayFormValidation.js +10 -3
  36. package/esm/model/commandHandlers/filterContext/attributeFilter/validation/uniqueFiltersValidation.d.ts.map +1 -1
  37. package/esm/model/commandHandlers/filterContext/attributeFilter/validation/uniqueFiltersValidation.js +24 -14
  38. package/esm/model/commandHandlers/scheduledEmail/createScheduledEmailHandler.js +2 -2
  39. package/esm/model/commandHandlers/scheduledEmail/saveScheduledEmailHandler.js +2 -2
  40. package/esm/model/commandHandlers/widgets/attributeHierarchyModifiedHandler.d.ts.map +1 -1
  41. package/esm/model/commandHandlers/widgets/attributeHierarchyModifiedHandler.js +6 -0
  42. package/esm/model/commandHandlers/widgets/exportInsightWidgetHandler.d.ts.map +1 -1
  43. package/esm/model/commandHandlers/widgets/exportInsightWidgetHandler.js +2 -2
  44. package/esm/model/commandHandlers/widgets/exportRawInsightWidgetHandler.js +2 -2
  45. package/esm/model/queries/base.d.ts +1 -1
  46. package/esm/model/queries/base.d.ts.map +1 -1
  47. package/esm/model/queries/base.js +1 -1
  48. package/esm/model/queries/computedAttributeExpression.d.ts +27 -0
  49. package/esm/model/queries/computedAttributeExpression.d.ts.map +1 -0
  50. package/esm/model/queries/computedAttributeExpression.js +21 -0
  51. package/esm/model/queries/connectedAttributes.d.ts +19 -1
  52. package/esm/model/queries/connectedAttributes.d.ts.map +1 -1
  53. package/esm/model/queries/connectedAttributes.js +3 -1
  54. package/esm/model/queries/index.d.ts +2 -1
  55. package/esm/model/queries/index.d.ts.map +1 -1
  56. package/esm/model/queryServices/index.d.ts +1 -1
  57. package/esm/model/queryServices/index.d.ts.map +1 -1
  58. package/esm/model/queryServices/index.js +2 -0
  59. package/esm/model/queryServices/queryAttributeByDisplayForm.d.ts.map +1 -1
  60. package/esm/model/queryServices/queryAttributeByDisplayForm.js +12 -3
  61. package/esm/model/queryServices/queryAttributeDataset.d.ts.map +1 -1
  62. package/esm/model/queryServices/queryAttributeDataset.js +9 -1
  63. package/esm/model/queryServices/queryComputedAttributeExpression.d.ts +4 -0
  64. package/esm/model/queryServices/queryComputedAttributeExpression.d.ts.map +1 -0
  65. package/esm/model/queryServices/queryComputedAttributeExpression.js +17 -0
  66. package/esm/model/queryServices/queryConnectedAttributes.d.ts.map +1 -1
  67. package/esm/model/queryServices/queryConnectedAttributes.js +20 -5
  68. package/esm/model/queryServices/queryInsightAttributesMeta.d.ts.map +1 -1
  69. package/esm/model/queryServices/queryInsightAttributesMeta.js +20 -11
  70. package/esm/model/react/useIsWidgetRestricted.d.ts +9 -0
  71. package/esm/model/react/useIsWidgetRestricted.d.ts.map +1 -0
  72. package/esm/model/react/useIsWidgetRestricted.js +14 -0
  73. package/esm/model/store/catalog/catalogReducers.d.ts +2 -1
  74. package/esm/model/store/catalog/catalogReducers.d.ts.map +1 -1
  75. package/esm/model/store/catalog/catalogReducers.js +2 -1
  76. package/esm/model/store/catalog/catalogSelectors.d.ts +21 -1
  77. package/esm/model/store/catalog/catalogSelectors.d.ts.map +1 -1
  78. package/esm/model/store/catalog/catalogSelectors.js +26 -2
  79. package/esm/model/store/catalog/catalogState.d.ts +8 -1
  80. package/esm/model/store/catalog/catalogState.d.ts.map +1 -1
  81. package/esm/model/store/catalog/catalogState.js +1 -0
  82. package/esm/model/store/config/configSelectors.d.ts +11 -0
  83. package/esm/model/store/config/configSelectors.d.ts.map +1 -1
  84. package/esm/model/store/config/configSelectors.js +13 -0
  85. package/esm/model/store/insights/insightsSelectors.js +3 -3
  86. package/esm/model/store/tabs/filterContext/filterContextSelectors.d.ts.map +1 -1
  87. package/esm/model/store/tabs/filterContext/filterContextSelectors.js +8 -4
  88. package/esm/model/store/unavailableObjects/unavailableObjectsSelectors.d.ts +8 -0
  89. package/esm/model/store/unavailableObjects/unavailableObjectsSelectors.d.ts.map +1 -1
  90. package/esm/model/store/unavailableObjects/unavailableObjectsSelectors.js +8 -0
  91. package/esm/model/utils/displayFormResolver.d.ts.map +1 -1
  92. package/esm/model/utils/displayFormResolver.js +11 -1
  93. package/esm/plugins/customizationApis/customizationBuilder.d.ts.map +1 -1
  94. package/esm/plugins/customizationApis/customizationBuilder.js +1 -0
  95. package/esm/plugins/customizationApis/insightCustomizer.d.ts +4 -2
  96. package/esm/plugins/customizationApis/insightCustomizer.d.ts.map +1 -1
  97. package/esm/plugins/customizationApis/insightCustomizer.js +43 -3
  98. package/esm/plugins/customizer.d.ts +14 -1
  99. package/esm/plugins/customizer.d.ts.map +1 -1
  100. package/esm/presentation/automations/alerting/AlertingDialog.d.ts +2 -0
  101. package/esm/presentation/automations/alerting/AlertingDialog.d.ts.map +1 -1
  102. package/esm/presentation/automations/alerting/AlertingDialog.js +12 -2
  103. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.d.ts.map +1 -1
  104. package/esm/presentation/automations/alerting/DefaultAlertingDialog/DefaultAlertingDialog.js +1 -1
  105. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.d.ts.map +1 -1
  106. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.js +23 -58
  107. package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts +33 -0
  108. package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts.map +1 -0
  109. package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.js +61 -0
  110. package/esm/presentation/automations/alerting/state/useAlertFiltersModel.d.ts +3 -17
  111. package/esm/presentation/automations/alerting/state/useAlertFiltersModel.d.ts.map +1 -1
  112. package/esm/presentation/automations/alerting/state/useAlertFiltersModel.js +3 -52
  113. package/esm/presentation/automations/alerting/state/useAlertFormState.js +1 -1
  114. package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.js +2 -2
  115. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.d.ts.map +1 -1
  116. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/DefaultScheduledEmailDialog.js +1 -1
  117. package/esm/presentation/automations/scheduledEmail/ScheduledEmailDialog.d.ts +3 -1
  118. package/esm/presentation/automations/scheduledEmail/ScheduledEmailDialog.d.ts.map +1 -1
  119. package/esm/presentation/automations/scheduledEmail/ScheduledEmailDialog.js +13 -3
  120. package/esm/presentation/automations/scheduledEmail/blocks/ScheduledEmailDialogShell.js +2 -5
  121. package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.d.ts.map +1 -1
  122. package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.js +22 -40
  123. package/esm/presentation/automations/scheduledEmail/state/useSaveScheduledEmailToBackend.d.ts.map +1 -1
  124. package/esm/presentation/automations/scheduledEmail/state/useSaveScheduledEmailToBackend.js +14 -3
  125. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts +27 -0
  126. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts.map +1 -0
  127. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.js +142 -0
  128. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.d.ts +4 -6
  129. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.d.ts.map +1 -1
  130. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailFiltersModel.js +9 -151
  131. package/esm/presentation/automations/shared/filters/conversions.d.ts +4 -0
  132. package/esm/presentation/automations/shared/filters/conversions.d.ts.map +1 -1
  133. package/esm/presentation/automations/shared/filters/conversions.js +28 -24
  134. package/esm/presentation/automations/shared/hooks/useDecoratorContractCheck.d.ts +16 -0
  135. package/esm/presentation/automations/shared/hooks/useDecoratorContractCheck.d.ts.map +1 -0
  136. package/esm/presentation/automations/shared/hooks/useDecoratorContractCheck.js +38 -0
  137. package/esm/presentation/automations/shared/hooks/useShallowStable.d.ts +10 -0
  138. package/esm/presentation/automations/shared/hooks/useShallowStable.d.ts.map +1 -0
  139. package/esm/presentation/automations/shared/hooks/useShallowStable.js +18 -0
  140. package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.d.ts.map +1 -1
  141. package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.js +17 -4
  142. package/esm/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.d.ts +10 -0
  143. package/esm/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.d.ts.map +1 -0
  144. package/esm/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.js +19 -0
  145. package/esm/presentation/dashboard/DashboardSidebar/SidebarConfigurationPanel.d.ts.map +1 -1
  146. package/esm/presentation/dashboard/DashboardSidebar/SidebarConfigurationPanel.js +8 -2
  147. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeChrome.d.ts.map +1 -1
  148. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeChrome.js +4 -2
  149. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeContext.d.ts +8 -3
  150. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeContext.d.ts.map +1 -1
  151. package/esm/presentation/dashboard/DashboardSidebar/SidebarResizeContext.js +65 -25
  152. package/esm/presentation/dashboard/components/DashboardInner.d.ts.map +1 -1
  153. package/esm/presentation/dashboard/components/DashboardInner.js +4 -4
  154. package/esm/presentation/dashboard/components/DashboardRenderer.d.ts.map +1 -1
  155. package/esm/presentation/dashboard/components/DashboardRenderer.js +2 -2
  156. package/esm/presentation/dashboard/hooks/useDashboard.d.ts +2 -1
  157. package/esm/presentation/dashboard/hooks/useDashboard.d.ts.map +1 -1
  158. package/esm/presentation/dashboard/hooks/useDashboard.js +7 -1
  159. package/esm/presentation/dashboard/types.d.ts +14 -1
  160. package/esm/presentation/dashboard/types.d.ts.map +1 -1
  161. package/esm/presentation/dashboardContexts/DashboardComponentsContext.d.ts +2 -1
  162. package/esm/presentation/dashboardContexts/DashboardComponentsContext.d.ts.map +1 -1
  163. package/esm/presentation/dashboardContexts/DashboardComponentsContext.js +1 -0
  164. package/esm/presentation/dashboardContexts/types.d.ts +20 -0
  165. package/esm/presentation/dashboardContexts/types.d.ts.map +1 -1
  166. package/esm/presentation/dragAndDrop/draggableAttributeFilter/DefaultAttributeFilterDraggingComponent.d.ts.map +1 -1
  167. package/esm/presentation/dragAndDrop/draggableAttributeFilter/DefaultAttributeFilterDraggingComponent.js +4 -3
  168. package/esm/presentation/export/useExportData.js +2 -2
  169. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.d.ts.map +1 -1
  170. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltip.js +8 -2
  171. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts +12 -1
  172. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.d.ts.map +1 -1
  173. package/esm/presentation/filterBar/attributeFilter/addAttributeFilter/attributeListItemTooltip/AttributeListItemTooltipContent.js +19 -2
  174. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/displayForms/AttributeDisplayFormsDropdown.d.ts.map +1 -1
  175. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/displayForms/AttributeDisplayFormsDropdown.js +3 -2
  176. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.d.ts +14 -0
  177. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.d.ts.map +1 -0
  178. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useComputedAttributeExpression.js +28 -0
  179. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useDisplayFormConfiguration.js +2 -2
  180. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useValidNeighbourAttributes.d.ts.map +1 -1
  181. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/hooks/useValidNeighbourAttributes.js +12 -2
  182. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/limitValues/shared/limitingItemsHook.d.ts.map +1 -1
  183. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/limitValues/shared/limitingItemsHook.js +6 -5
  184. package/esm/presentation/filterBar/attributeFilter/dashboardDropdownBody/configuration/parentFilters/ParentFiltersDisabledItem.js +2 -2
  185. package/esm/presentation/filterBar/filterBar/DefaultFilterBarItem.js +2 -2
  186. package/esm/presentation/filterBar/filterBar/useFiltersWithAddedPlaceholder.js +2 -2
  187. package/esm/presentation/filterBar/measureValueFilter/useDashboardMeasureValueFilterData.d.ts.map +1 -1
  188. package/esm/presentation/filterBar/measureValueFilter/useDashboardMeasureValueFilterData.js +55 -17
  189. package/esm/presentation/flexibleLayout/DashboardLayoutWidget.d.ts.map +1 -1
  190. package/esm/presentation/flexibleLayout/DashboardLayoutWidget.js +6 -1
  191. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts +5 -4
  192. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
  193. package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +5 -4
  194. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +5 -4
  195. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
  196. package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +5 -4
  197. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +5 -4
  198. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
  199. package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +5 -4
  200. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +40 -0
  201. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  202. package/esm/presentation/localization/bundles/en-US.localization-bundle.js +40 -0
  203. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +5 -4
  204. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
  205. package/esm/presentation/localization/bundles/es-419.localization-bundle.js +5 -4
  206. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +5 -4
  207. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
  208. package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +5 -4
  209. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +5 -4
  210. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
  211. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +5 -4
  212. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +5 -4
  213. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
  214. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +5 -4
  215. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +5 -4
  216. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
  217. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +5 -4
  218. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +5 -4
  219. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
  220. package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +5 -4
  221. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +5 -4
  222. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
  223. package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +5 -4
  224. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +5 -4
  225. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
  226. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +33 -32
  227. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +5 -4
  228. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
  229. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +5 -4
  230. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +5 -4
  231. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
  232. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +5 -4
  233. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +5 -4
  234. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
  235. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +5 -4
  236. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +5 -4
  237. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
  238. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +5 -4
  239. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +5 -4
  240. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
  241. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +5 -4
  242. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +5 -4
  243. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
  244. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +5 -4
  245. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +5 -4
  246. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
  247. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +5 -4
  248. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +5 -4
  249. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
  250. package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +5 -4
  251. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +5 -4
  252. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
  253. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +5 -4
  254. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +5 -4
  255. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
  256. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +5 -4
  257. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +5 -4
  258. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
  259. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +5 -4
  260. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +5 -4
  261. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
  262. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +5 -4
  263. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +5 -4
  264. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
  265. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +5 -4
  266. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +5 -4
  267. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
  268. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +5 -4
  269. package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts +54 -0
  270. package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts.map +1 -0
  271. package/esm/presentation/widget/common/RestrictedPlaceholder.js +49 -0
  272. package/esm/presentation/widget/common/configuration/DateDatasetFilter.d.ts +6 -1
  273. package/esm/presentation/widget/common/configuration/DateDatasetFilter.d.ts.map +1 -1
  274. package/esm/presentation/widget/common/configuration/DateDatasetFilter.js +2 -2
  275. package/esm/presentation/widget/common/configuration/DateFilterCheckbox.d.ts +6 -1
  276. package/esm/presentation/widget/common/configuration/DateFilterCheckbox.d.ts.map +1 -1
  277. package/esm/presentation/widget/common/configuration/DateFilterCheckbox.js +10 -3
  278. package/esm/presentation/widget/insight/DefaultInsightBody/DefaultInsightBody.js +2 -2
  279. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.js +2 -2
  280. package/esm/presentation/widget/insight/configuration/InsightDateDataSetFilter.d.ts.map +1 -1
  281. package/esm/presentation/widget/insight/configuration/InsightDateDataSetFilter.js +1 -1
  282. package/esm/presentation/widget/insight/configuration/InsightDrillConfigList.d.ts +6 -1
  283. package/esm/presentation/widget/insight/configuration/InsightDrillConfigList.d.ts.map +1 -1
  284. package/esm/presentation/widget/insight/configuration/InsightDrillConfigList.js +13 -2
  285. package/esm/presentation/widget/insight/configuration/InsightDrillConfigPanel/InsightDrillConfigPanel.d.ts.map +1 -1
  286. package/esm/presentation/widget/insight/configuration/InsightDrillConfigPanel/InsightDrillConfigPanel.js +5 -1
  287. package/esm/presentation/widget/insight/configuration/useDrillTargetTypeItems.d.ts +1 -1
  288. package/esm/presentation/widget/insight/configuration/useDrillTargetTypeItems.d.ts.map +1 -1
  289. package/esm/presentation/widget/insight/configuration/useDrillTargetTypeItems.js +2 -2
  290. package/esm/presentation/widget/richText/configuration/RichTextDateDataSetFilter.d.ts.map +1 -1
  291. package/esm/presentation/widget/richText/configuration/RichTextDateDataSetFilter.js +1 -1
  292. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.d.ts.map +1 -1
  293. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.js +8 -0
  294. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcherRestricted.d.ts +16 -0
  295. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcherRestricted.d.ts.map +1 -0
  296. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcherRestricted.js +19 -0
  297. package/esm/presentation/widget/widget/InsightWidget/DashboardWidgetInsightGuard.d.ts.map +1 -1
  298. package/esm/presentation/widget/widget/InsightWidget/DashboardWidgetInsightGuard.js +11 -1
  299. package/esm/presentation/widget/widget/InsightWidget/DefaultDashboardInsightWidget.js +2 -2
  300. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/VisualizationSwitcherNavigationHeader.d.ts.map +1 -1
  301. package/esm/presentation/widget/widget/VisualizationSwitcherWidget/VisualizationSwitcherNavigationHeader.js +25 -12
  302. package/esm/sdk-ui-dashboard.d.ts +206 -4
  303. package/package.json +22 -22
  304. package/styles/css/alerting.css +3 -1
  305. package/styles/css/alerting.css.map +1 -1
  306. package/styles/css/configurationPanel.css +1 -5
  307. package/styles/css/configurationPanel.css.map +1 -1
  308. package/styles/css/dashboard.css +5 -3
  309. package/styles/css/dashboard.css.map +1 -1
  310. package/styles/css/export.css +10 -8
  311. package/styles/css/export.css.map +1 -1
  312. package/styles/css/filterBar.css +29 -0
  313. package/styles/css/filterBar.css.map +1 -1
  314. package/styles/css/main.css +230 -22
  315. package/styles/css/main.css.map +1 -1
  316. package/styles/css/sidebar.css +165 -0
  317. package/styles/css/sidebar.css.map +1 -1
  318. package/styles/css/visualizationSwitcherWidget.css +8 -0
  319. package/styles/css/visualizationSwitcherWidget.css.map +1 -1
  320. package/styles/scss/configurationPanel.scss +1 -7
  321. package/styles/scss/filterBar.scss +38 -0
  322. package/styles/scss/sidebar.scss +215 -0
  323. package/styles/scss/visualizationSwitcherWidget.scss +9 -0
@@ -66,18 +66,7 @@ export const getAppliedWidgetFilters = (selectedAutomationFilters, dashboardHidd
66
66
  // alert executions (which have empty attributes) don't contain dangling refs.
67
67
  const resolvedFilters = resolveFilterDimensionalityLocalRefs(filtersToUse, insight);
68
68
  // Strip noop filters - they have no effect on execution.
69
- return resolvedFilters.filter((filter) => {
70
- // Strip noop "All time" date filters (implicit default with no extra configuration).
71
- if (isDateFilter(filter)) {
72
- return !isNoopAllTimeDateFilterFixed(filter);
73
- }
74
- // Strip noop "All" measure value filters (no conditions).
75
- if (isMeasureValueFilter(filter)) {
76
- return hasMeasureValueFilterConditions(filter);
77
- }
78
- // Strip noop "All values" attribute filters (negative filter with empty exclusion list).
79
- return !isAllValuesAttributeFilter(filter);
80
- });
69
+ return resolvedFilters.filter((filter) => !isNoopExecutionFilter(filter));
81
70
  };
82
71
  /**
83
72
  * Get final filters for the dashboard scheduled export.
@@ -90,18 +79,7 @@ export const getAppliedDashboardFilters = (selectedAutomationFilters, dashboardH
90
79
  // but we need them to construct proper execution filters, so merge them.
91
80
  const selectedFiltersWithHiddenFilters = [...selectedAutomationFilters, ...dashboardHiddenFilters];
92
81
  // Strip noop filters - they have no effect on execution.
93
- return selectedFiltersWithHiddenFilters.filter((filter) => {
94
- // Strip noop "All time" date filters (implicit default with no extra configuration).
95
- if (isDashboardDateFilter(filter)) {
96
- return !isNoopAllTimeDashboardDateFilter(filter);
97
- }
98
- // Strip noop "All" measure value filters (no/empty conditions).
99
- if (isDashboardMeasureValueFilter(filter)) {
100
- return !isAllDashboardMeasureValueFilter(filter);
101
- }
102
- // Strip noop "All values" attribute filters.
103
- return !isAllValuesDashboardAttributeFilter(filter);
104
- });
82
+ return selectedFiltersWithHiddenFilters.filter((filter) => !isNoopDashboardFilter(filter));
105
83
  };
106
84
  export function dashboardFilterToFilterContextItem(filter, keepDatasets) {
107
85
  if (isAttributeFilterWithSelection(filter)) {
@@ -230,6 +208,32 @@ function resolveDimensionalityItems(dimensionality, attributeLocalIdToDisplayFor
230
208
  const changed = dimensionality.some((item, i) => item !== resolved[i]);
231
209
  return changed ? resolved : undefined;
232
210
  }
211
+ /** A filter with no effect on a widget execution: all-time date, condition-less MVF, all-values attribute. */
212
+ export function isNoopExecutionFilter(filter) {
213
+ // Strip noop "All time" date filters (implicit default with no extra configuration).
214
+ if (isDateFilter(filter)) {
215
+ return isNoopAllTimeDateFilterFixed(filter);
216
+ }
217
+ // Strip noop "All" measure value filters (no conditions).
218
+ if (isMeasureValueFilter(filter)) {
219
+ return !hasMeasureValueFilterConditions(filter);
220
+ }
221
+ // Strip noop "All values" attribute filters (negative filter with empty exclusion list).
222
+ return isAllValuesAttributeFilter(filter);
223
+ }
224
+ /** The FilterContextItem form of {@link isNoopExecutionFilter}. */
225
+ export function isNoopDashboardFilter(filter) {
226
+ // Strip noop "All time" date filters (implicit default with no extra configuration).
227
+ if (isDashboardDateFilter(filter)) {
228
+ return isNoopAllTimeDashboardDateFilter(filter);
229
+ }
230
+ // Strip noop "All" measure value filters (no/empty conditions).
231
+ if (isDashboardMeasureValueFilter(filter)) {
232
+ return isAllDashboardMeasureValueFilter(filter);
233
+ }
234
+ // Strip noop "All values" attribute filters.
235
+ return isAllValuesDashboardAttributeFilter(filter);
236
+ }
233
237
  /**
234
238
  * Matches all-time date filters that are *noop*, i.e. that have no effect on execution.
235
239
  *
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Warns once per violation kind per mount when a dialog context decorator breaks the decorator
3
+ * contract in a way that otherwise fails silently and far from its cause: forcing `isLoading`
4
+ * false while the connector still reports true (the state model seeds from the decorated value,
5
+ * corrupting the draft for the dialog's life), or dropping keys the connector provided (a fresh
6
+ * object instead of spreading the read value). Diagnostic only — nothing is prevented.
7
+ *
8
+ * The passthrough default re-renders the connector's own provider value, so `pristine` and
9
+ * `decorated` are identical and the checks short-circuit.
10
+ *
11
+ * @internal
12
+ */
13
+ export declare function useDecoratorContractCheck<T extends {
14
+ isLoading: boolean;
15
+ }>(pristine: T, decorated: T, seamName: string): void;
16
+ //# sourceMappingURL=useDecoratorContractCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDecoratorContractCheck.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/hooks/useDecoratorContractCheck.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,EACtE,QAAQ,EAAE,CAAC,EACX,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,MAAM,GACjB,IAAI,CA4BN"}
@@ -0,0 +1,38 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { useEffect, useRef } from "react";
3
+ /**
4
+ * Warns once per violation kind per mount when a dialog context decorator breaks the decorator
5
+ * contract in a way that otherwise fails silently and far from its cause: forcing `isLoading`
6
+ * false while the connector still reports true (the state model seeds from the decorated value,
7
+ * corrupting the draft for the dialog's life), or dropping keys the connector provided (a fresh
8
+ * object instead of spreading the read value). Diagnostic only — nothing is prevented.
9
+ *
10
+ * The passthrough default re-renders the connector's own provider value, so `pristine` and
11
+ * `decorated` are identical and the checks short-circuit.
12
+ *
13
+ * @internal
14
+ */
15
+ export function useDecoratorContractCheck(pristine, decorated, seamName) {
16
+ const warnedForcedFalse = useRef(false);
17
+ const warnedDroppedKeys = useRef(false);
18
+ useEffect(() => {
19
+ if (pristine === decorated) {
20
+ return;
21
+ }
22
+ if (!warnedForcedFalse.current && pristine.isLoading && !decorated.isLoading) {
23
+ warnedForcedFalse.current = true;
24
+ console.warn(`${seamName}: the decorated context reports isLoading: false while the connector reports true. ` +
25
+ "The dialog's state model seeds from the decorated value, so this can corrupt the draft for " +
26
+ "the dialog's life. Pass isLoading through untouched (see the decorator type's TSDoc).");
27
+ }
28
+ if (!warnedDroppedKeys.current) {
29
+ const droppedKeys = Object.keys(pristine).filter((key) => !(key in decorated));
30
+ if (droppedKeys.length > 0) {
31
+ warnedDroppedKeys.current = true;
32
+ console.warn(`${seamName}: the decorated context is missing keys the connector provided: ` +
33
+ `${droppedKeys.join(", ")}. Spread the value you read ({ ...ctx, member }) so the ` +
34
+ "other members pass through (see the decorator type's TSDoc).");
35
+ }
36
+ }
37
+ });
38
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Returns the previous object while every member keeps its identity, so a caller can hold a whole
3
+ * model stable without naming its members. Preferred over `useMemo` here because the roster is the
4
+ * hook's return shape: a dependency array would have to restate all of it, and a missed entry would
5
+ * serve a stale member rather than fail loudly.
6
+ *
7
+ * @internal
8
+ */
9
+ export declare function useShallowStable<T extends object>(value: T): T;
10
+ //# sourceMappingURL=useShallowStable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useShallowStable.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/automations/shared/hooks/useShallowStable.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAQ9D"}
@@ -0,0 +1,18 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { useRef } from "react";
3
+ import { shallowEqualObjects } from "@gooddata/util";
4
+ /**
5
+ * Returns the previous object while every member keeps its identity, so a caller can hold a whole
6
+ * model stable without naming its members. Preferred over `useMemo` here because the roster is the
7
+ * hook's return shape: a dependency array would have to restate all of it, and a missed entry would
8
+ * serve a stale member rather than fail loudly.
9
+ *
10
+ * @internal
11
+ */
12
+ export function useShallowStable(value) {
13
+ const previous = useRef(value);
14
+ if (!shallowEqualObjects(previous.current, value)) {
15
+ previous.current = value;
16
+ }
17
+ return previous.current;
18
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"CreationPanel.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/CreationPanel.tsx"],"names":[],"mappings":"AAcA,OAAO,EACH,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uCAAuC,EAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,KAAK,qCAAqC,EAC1C,KAAK,qCAAqC,EAC7C,MAAM,4BAA4B,CAAC;AAIpC,UAAU,mBAAmB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,uCAAuC,CAAC,EAAE,uCAAuC,CAAC;IAClF,iCAAiC,CAAC,EAAE,iCAAiC,CAAC;CACzE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,mBAAmB,2CAkEvD"}
1
+ {"version":3,"file":"CreationPanel.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/CreationPanel.tsx"],"names":[],"mappings":"AAcA,OAAO,EACH,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uCAAuC,EAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,KAAK,qCAAqC,EAC1C,KAAK,qCAAqC,EAC7C,MAAM,4BAA4B,CAAC;AAMpC,UAAU,mBAAmB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,oCAAoC,CAAC,EAAE,qCAAqC,CAAC;IAC7E,2BAA2B,CAAC,EAAE,2BAA2B,CAAC;IAC1D,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,uCAAuC,CAAC,EAAE,uCAAuC,CAAC;IAClF,iCAAiC,CAAC,EAAE,iCAAiC,CAAC;CACzE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,mBAAmB,2CAoGvD"}
@@ -1,20 +1,25 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // (C) 2007-2026 GoodData Corporation
3
- import { useMemo } from "react";
3
+ import { useMemo, useState } from "react";
4
4
  import cx from "classnames";
5
5
  import { compact, sortBy } from "lodash-es";
6
- import { FormattedMessage } from "react-intl";
7
- import { Typography } from "@gooddata/sdk-ui-kit";
6
+ import { FormattedMessage, useIntl } from "react-intl";
7
+ import { Typography, UiIconButton } from "@gooddata/sdk-ui-kit";
8
8
  import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
9
9
  import { selectSupportsRichTextWidgets } from "../../../model/store/backendCapabilities/backendCapabilitiesSelectors.js";
10
10
  import { selectIsAiGenerating } from "../../../model/store/config/configSelectors.js";
11
11
  import { selectIsNewDashboard } from "../../../model/store/meta/metaSelectors.js";
12
12
  import { DraggableInsightList } from "./DraggableInsightList/DraggableInsightList.js";
13
+ import { SidebarCollapseToggle } from "./SidebarCollapseToggle.js";
14
+ import { useResizableSidebar } from "./SidebarResizeContext.js";
13
15
  export function CreationPanel(props) {
14
16
  const { className, WrapCreatePanelItemWithDragComponent, WrapInsightListItemWithDragComponent } = props;
17
+ const intl = useIntl();
15
18
  const supportsRichText = useDashboardSelector(selectSupportsRichTextWidgets);
16
19
  const isNewDashboard = useDashboardSelector(selectIsNewDashboard);
17
20
  const isAiGenerating = useDashboardSelector(selectIsAiGenerating);
21
+ const { canCollapse, isCollapsed, setCollapsed } = useResizableSidebar();
22
+ const [focusSearch, setFocusSearch] = useState(undefined);
18
23
  const AttributeFilterComponentSet = props.AttributeFilterComponentSet;
19
24
  const InsightWidgetComponentSet = props.InsightWidgetComponentSet;
20
25
  const RichTextWidgetComponentSet = props.RichTextWidgetComponentSet;
@@ -41,5 +46,13 @@ export function CreationPanel(props) {
41
46
  WrapCreatePanelItemWithDragComponent,
42
47
  isAiGenerating,
43
48
  ]);
44
- return (_jsx("div", { className: cx("configuration-panel creation-panel", className), children: _jsxs("div", { className: "configuration-panel-content", children: [_jsx(Typography, { tagName: "h2", className: "flex-panel-item-nostretch", children: _jsx(FormattedMessage, { id: "visualizationsList.dragToAdd" }) }), _jsxs("div", { className: "configuration-category drag-to-add", children: [_jsx(Typography, { tagName: "h3", children: _jsx(FormattedMessage, { id: "addPanel.newItem" }) }), _jsx("div", { className: "add-item-panel", children: addItemPanelItems })] }), _jsxs("div", { className: "configuration-category configuration-category-vis drag-to-add flex-panel-item-stretch", children: [_jsx(Typography, { tagName: "h3", children: _jsx(FormattedMessage, { id: "visualizationsList.savedVisualizations" }) }), _jsx(DraggableInsightList, { WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, recalculateSizeReference: className, searchAutofocus: !isNewDashboard, disabled: isAiGenerating })] })] }) }));
49
+ return (_jsx("div", { className: cx("configuration-panel creation-panel", className), children: _jsxs("div", { className: "configuration-panel-content", children: [_jsxs("div", { className: "gd-creation-panel-header flex-panel-item-nostretch", children: [_jsx(Typography, { tagName: "h2", children: _jsx(FormattedMessage, { id: "visualizationsList.dragToAdd" }) }), canCollapse ? (_jsx(SidebarCollapseToggle, { isCollapsed: isCollapsed, onToggle: () => {
50
+ setFocusSearch(false);
51
+ setCollapsed(!isCollapsed);
52
+ } })) : null] }), _jsx("div", { className: "configuration-category drag-to-add", role: "group", "aria-label": intl.formatMessage({ id: "addPanel.newItem" }), children: _jsx("div", { className: "add-item-panel", children: addItemPanelItems }) }), _jsxs("div", { className: "configuration-category configuration-category-vis drag-to-add flex-panel-item-stretch", role: "group", "aria-label": intl.formatMessage({ id: "visualizationsList.savedVisualizations" }), children: [canCollapse ? (_jsx("div", { className: "gd-sidebar-rail-search", children: _jsx(UiIconButton, { icon: "search", label: intl.formatMessage({ id: "sidebar.search" }), size: "medium", variant: "tertiary", dataTestId: "s-dashboard-sidebar-rail-search", accessibilityConfig: {
53
+ ariaLabel: intl.formatMessage({ id: "sidebar.search" }),
54
+ }, onClick: () => {
55
+ setFocusSearch(true);
56
+ setCollapsed(false);
57
+ } }) })) : null, _jsx(DraggableInsightList, { WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, recalculateSizeReference: className, searchAutofocus: !isCollapsed && (focusSearch ?? !isNewDashboard), disabled: isAiGenerating })] })] }) }));
45
58
  }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Collapses the dashboard sidebar to the icon rail and expands it back.
3
+ *
4
+ * @internal
5
+ */
6
+ export declare function SidebarCollapseToggle({ isCollapsed, onToggle, }: {
7
+ isCollapsed: boolean;
8
+ onToggle: () => void;
9
+ }): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=SidebarCollapseToggle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SidebarCollapseToggle.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/SidebarCollapseToggle.tsx"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAClC,WAAW,EACX,QAAQ,GACX,EAAE;IACC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB,2CAsBA"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // (C) 2026 GoodData Corporation
3
+ import { useIntl } from "react-intl";
4
+ import { UiIconButton } from "@gooddata/sdk-ui-kit";
5
+ /**
6
+ * Collapses the dashboard sidebar to the icon rail and expands it back.
7
+ *
8
+ * @internal
9
+ */
10
+ export function SidebarCollapseToggle({ isCollapsed, onToggle, }) {
11
+ const intl = useIntl();
12
+ const label = isCollapsed
13
+ ? intl.formatMessage({ id: "sidebar.expand" })
14
+ : intl.formatMessage({ id: "sidebar.collapse" });
15
+ return (_jsx("div", { className: "gd-sidebar-collapse-toggle", children: _jsx(UiIconButton, { icon: isCollapsed ? "sidePanelExpand" : "sidePanelCollapse", label: label, size: "medium", variant: "tertiary", dataTestId: "s-dashboard-sidebar-collapse-toggle", accessibilityConfig: {
16
+ ariaLabel: label,
17
+ ariaExpanded: !isCollapsed,
18
+ }, onClick: onToggle }) }));
19
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarConfigurationPanel.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/SidebarConfigurationPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAS1C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,YAAY,GAAG,IAAI,CAgD3G"}
1
+ {"version":3,"file":"SidebarConfigurationPanel.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/SidebarConfigurationPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAa1C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,YAAY,GAAG,IAAI,CAmE3G"}
@@ -1,10 +1,13 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import cx from "classnames";
2
3
  import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
3
4
  import { useWidgetSelection } from "../../../model/react/useWidgetSelection.js";
4
5
  import { selectSettings } from "../../../model/store/config/configSelectors.js";
5
6
  import { CreationPanel } from "./CreationPanel.js";
6
7
  import { FloatingToolbar } from "./FloatingToolbar.js";
8
+ import { SidebarCollapseToggle } from "./SidebarCollapseToggle.js";
7
9
  import { SidebarResizeChrome } from "./SidebarResizeChrome.js";
10
+ import { useResizableSidebar } from "./SidebarResizeContext.js";
8
11
  /**
9
12
  * @internal
10
13
  */
@@ -15,12 +18,15 @@ export function SidebarConfigurationPanel(props) {
15
18
  const settings = useDashboardSelector(selectSettings);
16
19
  const enableEnhancedInsightPicker = settings?.enableEnhancedInsightPicker ?? false;
17
20
  const enableDashboardSidebarResize = settings?.enableDashboardSidebarResize ?? false;
21
+ const { isCollapsed, canCollapse, setCollapsed, expandedWidth } = useResizableSidebar();
18
22
  if (enableEnhancedInsightPicker) {
19
23
  return _jsx(FloatingToolbar, {});
20
24
  }
21
- const content = (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex-panel-full-height", children: _jsx(CreationPanel, { className: configurationPanelClassName, WrapCreatePanelItemWithDragComponent: WrapCreatePanelItemWithDragComponent, WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, AttributeFilterComponentSet: AttributeFilterComponentSet, InsightWidgetComponentSet: InsightWidgetComponentSet, RichTextWidgetComponentSet: RichTextWidgetComponentSet, VisualizationSwitcherWidgetComponentSet: VisualizationSwitcherWidgetComponentSet, DashboardLayoutWidgetComponentSet: DashboardLayoutWidgetComponentSet }) }), _jsx(DeleteDropZoneComponent, {})] }));
25
+ const content = (_jsxs(_Fragment, { children: [canCollapse ? (_jsx("div", { className: "gd-sidebar-rail", children: _jsx(SidebarCollapseToggle, { isCollapsed: isCollapsed, onToggle: () => setCollapsed(!isCollapsed) }) })) : null, _jsx("div", { className: cx("gd-sidebar-panel", { "gd-sidebar-panel--collapsible": canCollapse }), children: _jsx("div", { className: "flex-panel-full-height", style: canCollapse ? { width: expandedWidth } : undefined, children: _jsx(CreationPanel, { className: configurationPanelClassName, WrapCreatePanelItemWithDragComponent: WrapCreatePanelItemWithDragComponent, WrapInsightListItemWithDragComponent: WrapInsightListItemWithDragComponent, AttributeFilterComponentSet: AttributeFilterComponentSet, InsightWidgetComponentSet: InsightWidgetComponentSet, RichTextWidgetComponentSet: RichTextWidgetComponentSet, VisualizationSwitcherWidgetComponentSet: VisualizationSwitcherWidgetComponentSet, DashboardLayoutWidgetComponentSet: DashboardLayoutWidgetComponentSet }) }) }), _jsx(DeleteDropZoneComponent, {})] }));
22
26
  if (enableDashboardSidebarResize) {
23
27
  return _jsx(SidebarResizeChrome, { onContainerClick: deselectWidgets, children: content });
24
28
  }
25
- return (_jsx("div", { className: "col gd-flex-item gd-sidebar-container", onClick: deselectWidgets, children: content }));
29
+ return (_jsx("div", { className: cx("col gd-flex-item gd-sidebar-container", {
30
+ "gd-sidebar-container--collapsed": isCollapsed,
31
+ }), onClick: deselectWidgets, children: content }));
26
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarResizeChrome.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/SidebarResizeChrome.tsx"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,YAAY,EACjB,KAAK,SAAS,EAIjB,MAAM,OAAO,CAAC;AAkBf;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,EAChC,gBAAgB,EAChB,QAAQ,GACX,EAAE;IACC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,EAAE,SAAS,CAAC;CACvB,GAAG,YAAY,CAiHf"}
1
+ {"version":3,"file":"SidebarResizeChrome.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/SidebarResizeChrome.tsx"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,YAAY,EACjB,KAAK,SAAS,EAIjB,MAAM,OAAO,CAAC;AAkBf;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,EAChC,gBAAgB,EAChB,QAAQ,GACX,EAAE;IACC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,EAAE,SAAS,CAAC;CACvB,GAAG,YAAY,CAmHf"}
@@ -32,7 +32,7 @@ const handleSeparatorKeyboardNavigation = makeKeyboardNavigation({
32
32
  export function SidebarResizeChrome({ onContainerClick, children, }) {
33
33
  const [dragWidth, setDragWidth] = useState(null);
34
34
  const dragOriginRef = useRef(null);
35
- const { width, min, max, canResize, setWidth } = useResizableSidebar();
35
+ const { width, min, max, canResize, setWidth, isCollapsed } = useResizableSidebar();
36
36
  const isDragging = dragWidth !== null;
37
37
  // Tear down the drag without committing — used when the user presses Escape.
38
38
  const endDrag = () => {
@@ -85,7 +85,9 @@ export function SidebarResizeChrome({ onContainerClick, children, }) {
85
85
  return (_jsx("div", { className: cx("gd-resizable-sidebar", {
86
86
  "gd-resizable-sidebar--resizable": canResize,
87
87
  "gd-resizable-sidebar--dragging": isDragging,
88
- }), style: { width }, children: _jsxs("div", { className: "col gd-flex-item gd-sidebar-container gd-sidebar-container--resizable", onClick: onContainerClick, children: [children, _jsx("button", { type: "button", style: {
88
+ }), style: { width }, children: _jsxs("div", { className: cx("col gd-flex-item gd-sidebar-container gd-sidebar-container--resizable", {
89
+ "gd-sidebar-container--collapsed": isCollapsed,
90
+ }), onClick: onContainerClick, children: [children, _jsx("button", { type: "button", style: {
89
91
  "--drag-x": `${isDragging ? dragWidth : width}px`,
90
92
  }, className: cx("gd-resizable-sidebar__handle", {
91
93
  "gd-resizable-sidebar__handle--dragging": isDragging,
@@ -1,15 +1,20 @@
1
1
  import { type ReactNode } from "react";
2
2
  interface IResizableSidebar {
3
3
  width: number;
4
+ expandedWidth: number;
4
5
  min: number;
5
6
  max: number;
6
7
  canResize: boolean;
7
8
  setWidth: (width: number) => void;
9
+ canCollapse: boolean;
10
+ isCollapsed: boolean;
11
+ setCollapsed: (collapsed: boolean) => void;
8
12
  }
9
13
  /**
10
- * Computes the resizable-sidebar state. When the sidebar is not resizable (not edit mode, the feature
11
- * is off, or it is replaced by the enhanced insight picker) it returns the static
12
- * {@link NON_RESIZABLE_SIDEBAR} — no window resize listener, no width math.
14
+ * Computes the sidebar width state — both the drag-to-resize bounds and the collapsed/expanded
15
+ * state of the panel. When the sidebar is neither resizable nor collapsible (not edit mode, both
16
+ * features are off, or it is replaced by the enhanced insight picker) it returns the static
17
+ * {@link STATIC_SIDEBAR} — no window resize listener, no width math.
13
18
  *
14
19
  * Reads the config store, so it must be called below the dashboard loading gate where the config is
15
20
  * initialized.
@@ -1 +1 @@
1
- {"version":3,"file":"SidebarResizeContext.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/SidebarResizeContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAkD,MAAM,OAAO,CAAC;AAsCvF,UAAU,iBAAiB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAeD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,IAAI,iBAAiB,CA2B5D;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,EACrC,KAAK,EACL,QAAQ,GACX,EAAE;IACC,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,SAAS,CAAC;CACvB,2CAEA;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,iBAAiB,CAEvD"}
1
+ {"version":3,"file":"SidebarResizeContext.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/DashboardSidebar/SidebarResizeContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAA2D,MAAM,OAAO,CAAC;AAwChG,UAAU,iBAAiB;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAmBD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,IAAI,iBAAiB,CAiE5D;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,EACrC,KAAK,EACL,QAAQ,GACX,EAAE;IACC,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,SAAS,CAAC;CACvB,2CAEA;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,iBAAiB,CAEvD"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  // (C) 2026 GoodData Corporation
3
- import { createContext, useContext, useEffect, useState } from "react";
3
+ import { createContext, useContext, useEffect, useMemo, useState } from "react";
4
4
  import { clamp } from "lodash-es";
5
5
  import { useLocalStorage } from "@gooddata/sdk-ui";
6
6
  import { useDashboardSelector } from "../../../model/react/DashboardStoreProvider.js";
@@ -8,8 +8,10 @@ import { selectSettings } from "../../../model/store/config/configSelectors.js";
8
8
  import { selectIsInEditMode } from "../../../model/store/renderMode/renderModeSelectors.js";
9
9
  const SIDEBAR_MIN_WIDTH = 230;
10
10
  const SIDEBAR_MAX_WIDTH = 500;
11
+ const SIDEBAR_COLLAPSED_WIDTH = 48;
11
12
  const EDITOR_MIN_WIDTH = 960;
12
- const LOCAL_STORAGE_KEY = "gd-dashboard-sidebar-width";
13
+ const WIDTH_STORAGE_KEY = "gd-dashboard-sidebar-width";
14
+ const COLLAPSED_STORAGE_KEY = "gd-dashboard-sidebar-collapsed";
13
15
  /**
14
16
  * Returns the current `window.innerWidth`, kept in sync with the `resize` event. Only attaches the
15
17
  * listener while `active`, so a non-resizable sidebar triggers no resize-driven re-renders.
@@ -27,21 +29,26 @@ function useWindowWidth(active) {
27
29
  }, [active]);
28
30
  return width;
29
31
  }
30
- // Stable value used whenever the sidebar is not resizable: it is fixed at the minimum width, cannot
31
- // be resized, and ignores writes — so consumers never have to null-check.
32
- const NON_RESIZABLE_SIDEBAR = {
32
+ // Stable value used whenever the sidebar is neither resizable nor collapsible: it is fixed at the
33
+ // minimum width and ignores writes — so consumers never have to null-check.
34
+ const STATIC_SIDEBAR = {
33
35
  width: SIDEBAR_MIN_WIDTH,
36
+ expandedWidth: SIDEBAR_MIN_WIDTH,
34
37
  min: SIDEBAR_MIN_WIDTH,
35
38
  max: SIDEBAR_MIN_WIDTH,
36
39
  canResize: false,
37
40
  setWidth: () => { },
41
+ canCollapse: false,
42
+ isCollapsed: false,
43
+ setCollapsed: () => { },
38
44
  };
39
- const ResizableSidebarContext = createContext(NON_RESIZABLE_SIDEBAR);
45
+ const ResizableSidebarContext = createContext(STATIC_SIDEBAR);
40
46
  ResizableSidebarContext.displayName = "ResizableSidebarContext";
41
47
  /**
42
- * Computes the resizable-sidebar state. When the sidebar is not resizable (not edit mode, the feature
43
- * is off, or it is replaced by the enhanced insight picker) it returns the static
44
- * {@link NON_RESIZABLE_SIDEBAR} — no window resize listener, no width math.
48
+ * Computes the sidebar width state — both the drag-to-resize bounds and the collapsed/expanded
49
+ * state of the panel. When the sidebar is neither resizable nor collapsible (not edit mode, both
50
+ * features are off, or it is replaced by the enhanced insight picker) it returns the static
51
+ * {@link STATIC_SIDEBAR} — no window resize listener, no width math.
45
52
  *
46
53
  * Reads the config store, so it must be called below the dashboard loading gate where the config is
47
54
  * initialized.
@@ -53,23 +60,56 @@ export function useResizableSidebarState() {
53
60
  const isEditMode = useDashboardSelector(selectIsInEditMode);
54
61
  const isSidebarResizeEnabled = settings?.enableDashboardSidebarResize ?? false;
55
62
  const enableEnhancedInsightPicker = settings?.enableEnhancedInsightPicker ?? false;
56
- const isResizable = isEditMode && isSidebarResizeEnabled && !enableEnhancedInsightPicker;
63
+ const isGenAiRightPanelEnabled = settings?.enableGenAiRightPanel ?? false;
64
+ const hasCreationPanel = isEditMode && !enableEnhancedInsightPicker;
65
+ const isResizable = hasCreationPanel && isSidebarResizeEnabled;
66
+ const canCollapse = hasCreationPanel && isGenAiRightPanelEnabled;
57
67
  const containerWidth = useWindowWidth(isResizable);
58
- const [persistedWidth, setPersistedWidth] = useLocalStorage(LOCAL_STORAGE_KEY, SIDEBAR_MIN_WIDTH);
59
- if (!isResizable) {
60
- return NON_RESIZABLE_SIDEBAR;
61
- }
62
- const max = clamp(containerWidth - EDITOR_MIN_WIDTH, SIDEBAR_MIN_WIDTH, SIDEBAR_MAX_WIDTH);
63
- const width = clamp(persistedWidth, SIDEBAR_MIN_WIDTH, max);
64
- return {
65
- width,
66
- min: SIDEBAR_MIN_WIDTH,
67
- max,
68
- canResize: max > SIDEBAR_MIN_WIDTH,
69
- // Clamp every write to the current bounds, so callers can't persist an out-of-range width and
70
- // a non-resizable sidebar (max === min) collapses any value back to the minimum.
71
- setWidth: (next) => setPersistedWidth(clamp(next, SIDEBAR_MIN_WIDTH, max)),
72
- };
68
+ const [persistedWidth, setPersistedWidth] = useLocalStorage(WIDTH_STORAGE_KEY, SIDEBAR_MIN_WIDTH);
69
+ const [persistedCollapsed, setPersistedCollapsed] = useLocalStorage(COLLAPSED_STORAGE_KEY, false);
70
+ return useMemo(() => {
71
+ const max = clamp(containerWidth - EDITOR_MIN_WIDTH, SIDEBAR_MIN_WIDTH, SIDEBAR_MAX_WIDTH);
72
+ const expandedWidth = isResizable ? clamp(persistedWidth, SIDEBAR_MIN_WIDTH, max) : SIDEBAR_MIN_WIDTH;
73
+ if (canCollapse && persistedCollapsed) {
74
+ return {
75
+ width: SIDEBAR_COLLAPSED_WIDTH,
76
+ expandedWidth,
77
+ min: SIDEBAR_COLLAPSED_WIDTH,
78
+ max: SIDEBAR_COLLAPSED_WIDTH,
79
+ canResize: false,
80
+ setWidth: () => { },
81
+ canCollapse,
82
+ isCollapsed: true,
83
+ setCollapsed: setPersistedCollapsed,
84
+ };
85
+ }
86
+ if (!isResizable) {
87
+ return canCollapse
88
+ ? { ...STATIC_SIDEBAR, canCollapse, setCollapsed: setPersistedCollapsed }
89
+ : STATIC_SIDEBAR;
90
+ }
91
+ return {
92
+ width: expandedWidth,
93
+ expandedWidth,
94
+ min: SIDEBAR_MIN_WIDTH,
95
+ max,
96
+ canResize: max > SIDEBAR_MIN_WIDTH,
97
+ // Clamp every write to the current bounds, so callers can't persist an out-of-range width and
98
+ // a non-resizable sidebar (max === min) collapses any value back to the minimum.
99
+ setWidth: (next) => setPersistedWidth(clamp(next, SIDEBAR_MIN_WIDTH, max)),
100
+ canCollapse,
101
+ isCollapsed: false,
102
+ setCollapsed: setPersistedCollapsed,
103
+ };
104
+ }, [
105
+ canCollapse,
106
+ persistedCollapsed,
107
+ setPersistedCollapsed,
108
+ isResizable,
109
+ containerWidth,
110
+ persistedWidth,
111
+ setPersistedWidth,
112
+ ]);
73
113
  }
74
114
  /**
75
115
  * Shares the resize state produced by {@link useResizableSidebarState} with descendants such as the
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardInner.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/components/DashboardInner.tsx"],"names":[],"mappings":"AA4CA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAQnD,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,2CAwHpD"}
1
+ {"version":3,"file":"DashboardInner.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/components/DashboardInner.tsx"],"names":[],"mappings":"AA4CA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAQnD,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,2CAyHpD"}
@@ -60,10 +60,10 @@ export function DashboardInner(props) {
60
60
  "gd-dash-content--density-compact": density === "compact",
61
61
  });
62
62
  const resizableSidebar = useResizableSidebarState();
63
- // When the sidebar can be resized, expose its live width so the sibling content area can subtract
64
- // it (see `--gd-dashboard-sidebar-width` in sdk-dashboard.scss). Otherwise leave it unset so the
65
- // content falls back to the static sidebar width.
66
- const dashboardsRootStyle = resizableSidebar.canResize
63
+ // When the sidebar can be resized or is collapsed to the icon rail, expose its live width so the
64
+ // sibling content area can subtract it (see `--gd-dashboard-sidebar-width` in sdk-dashboard.scss).
65
+ // Otherwise leave it unset so the content falls back to the static per-breakpoint sidebar width.
66
+ const dashboardsRootStyle = resizableSidebar.canResize || resizableSidebar.isCollapsed
67
67
  ? {
68
68
  "--gd-dashboard-sidebar-width": `${resizableSidebar.width}px`,
69
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DashboardRenderer.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/components/DashboardRenderer.tsx"],"names":[],"mappings":"AA8CA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAqEnD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,2CAsMvD"}
1
+ {"version":3,"file":"DashboardRenderer.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/components/DashboardRenderer.tsx"],"names":[],"mappings":"AA8CA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAqEnD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,2CA0MvD"}
@@ -92,9 +92,9 @@ function shouldUseThemeProvider(props, hasThemeProvider) {
92
92
  * @internal
93
93
  */
94
94
  export function DashboardRenderer(props) {
95
- const { backend, workspace, hasThemeProvider, dashboardOrRef, attributeFilterProvider, dateFilterProvider, measureValueFilterProvider, filterGroupProvider, widgetProvider, insightProvider, insightBodyProvider, insightMenuButtonProvider, dashboardContentProvider, insightMenuProvider, richTextMenuProvider, richTextMenuTitleProvider, insightMenuTitleProvider, insightWidgetComponentSet, attributeFilterComponentSet, dateFilterComponentSet, richTextProvider, visualizationSwitcherProvider, richTextWidgetComponentSet, visualizationSwitcherWidgetComponentSet, visualizationSwitcherToolbarComponentProvider, dashboardLayoutWidgetComponentSet, showAsTableButtonComponentProvider, drillDialogExportDropdownProvider, } = useDashboard(props);
95
+ const { backend, workspace, hasThemeProvider, dashboardOrRef, attributeFilterProvider, dateFilterProvider, measureValueFilterProvider, filterGroupProvider, widgetProvider, insightProvider, insightBodyProvider, insightMenuButtonProvider, dashboardContentProvider, insightMenuProvider, richTextMenuProvider, richTextMenuTitleProvider, insightMenuTitleProvider, insightWidgetComponentSet, attributeFilterComponentSet, dateFilterComponentSet, richTextProvider, restrictedPlaceholderProvider, visualizationSwitcherProvider, richTextWidgetComponentSet, visualizationSwitcherWidgetComponentSet, visualizationSwitcherToolbarComponentProvider, dashboardLayoutWidgetComponentSet, showAsTableButtonComponentProvider, drillDialogExportDropdownProvider, } = useDashboard(props);
96
96
  const components = resolveComponentsWithDefaults(props);
97
- const dashboardRender = (_jsx(BackendProvider, { backend: backend, children: _jsx(WorkspaceProvider, { workspace: workspace, children: _jsx(OverlayControllerProvider, { overlayController: overlayController, children: _jsx(DashboardStoreProvider, { backend: props.backend, workspace: props.workspace, dashboard: dashboardOrRef, persistedDashboard: props.persistedDashboard, filterContextRef: props.filterContextRef, eventHandlers: props.eventHandlers, config: props.config, permissions: props.permissions, onStateChange: props.onStateChange, onEventingInitialized: props.onEventingInitialized, additionalReduxContext: props.additionalReduxContext, customizationFns: props.customizationFns, widgetsOverlayFn: props.widgetsOverlayFn, initialTabId: props.initialTabId, children: _jsx(ExportTemplateDialogContextProvider, { children: _jsx(ExportXlsxDialogContextProvider, { children: _jsx(ExportCsvDialogContextProvider, { children: _jsx(ExportTabularPdfDialogContextProvider, { children: _jsx(DashboardCustomizationsProvider, { insightMenuItemsProvider: props.insightMenuItemsProvider, richTextMenuItemsProvider: props.richTextMenuItemsProvider, existingExportTransformFn: props.customizationFns?.existingExportTransformFn, slideConfig: props.config?.slideConfig, children: _jsx(DashboardComponentsProvider, { ErrorComponent: components.ErrorComponent, LoadingComponent: components.LoadingComponent, LayoutComponent: components.LayoutComponent, InsightComponentProvider: insightProvider, InsightBodyComponentProvider: insightBodyProvider, InsightMenuButtonComponentProvider: insightMenuButtonProvider, InsightMenuTitleComponentProvider: insightMenuTitleProvider, InsightMenuComponentProvider: insightMenuProvider, VisualizationSwitcherToolbarComponentProvider: visualizationSwitcherToolbarComponentProvider, RichTextComponentProvider: richTextProvider, RichTextMenuComponentProvider: richTextMenuProvider, RichTextMenuTitleComponentProvider: richTextMenuTitleProvider, VisualizationSwitcherComponentProvider: visualizationSwitcherProvider, WidgetComponentProvider: widgetProvider, ButtonBarComponent: components.ButtonBarComponent, MenuButtonComponent: components.MenuButtonComponent, TopBarComponent: components.TopBarComponent, ToolbarComponent: components.ToolbarComponent, TitleComponent: components.TitleComponent, ScheduledEmailDialogComponent: components.ScheduledEmailDialogComponent, ScheduledEmailDialogContextDecoratorComponent: components.ScheduledEmailDialogContextDecoratorComponent, ScheduledEmailManagementDialogComponent: components.ScheduledEmailManagementDialogComponent, ScheduledEmailManagementDialogContextDecoratorComponent: components.ScheduledEmailManagementDialogContextDecoratorComponent, ShareDialogComponent: components.ShareDialogComponent, AlertingManagementDialogComponent: components.AlertingManagementDialogComponent, AlertingManagementDialogContextDecoratorComponent: components.AlertingManagementDialogContextDecoratorComponent, AutomationsContextDecoratorComponent: components.AutomationsContextDecoratorComponent, AlertingDialogComponent: components.AlertingDialogComponent, AlertingDialogContextDecoratorComponent: components.AlertingDialogContextDecoratorComponent, SaveAsDialogComponent: components.SaveAsDialogComponent, DashboardAttributeFilterComponentProvider: attributeFilterProvider, DashboardDateFilterComponentProvider: dateFilterProvider, DashboardMeasureValueFilterComponentProvider: measureValueFilterProvider, DashboardFilterGroupComponentProvider: filterGroupProvider, FilterBarComponent: components.FilterBarComponent, SidebarComponent: components.SidebarComponent, InsightWidgetComponentSet: insightWidgetComponentSet, RichTextWidgetComponentSet: richTextWidgetComponentSet, VisualizationSwitcherWidgetComponentSet: visualizationSwitcherWidgetComponentSet, DashboardLayoutWidgetComponentSet: dashboardLayoutWidgetComponentSet, AttributeFilterComponentSet: attributeFilterComponentSet, DateFilterComponentSet: dateFilterComponentSet, EmptyLayoutDropZoneBodyComponent: components.EmptyLayoutDropZoneBodyComponent, SaveButtonComponent: components.SaveButtonComponent, DashboardContentComponentProvider: dashboardContentProvider, SettingButtonComponent: components.SettingButtonComponent, DashboardSettingsDialogComponent: components.DashboardSettingsDialogComponent, ShowAsTableButtonComponentProvider: showAsTableButtonComponentProvider, DrillDialogExportDropdownComponentProvider: drillDialogExportDropdownProvider, children: _jsx(DashboardConfigProvider, { menuButtonConfig: props.menuButtonConfig, children: _jsx(DndProvider, { backend: HTML5Backend, children: _jsx(LayoutResizeStateProvider, { children: _jsx(DashboardItemPathAndSizeProvider, { children: _jsxs(HoveredWidgetProvider, { children: [_jsx(DensityInitializer, {}), _jsx(DashboardLoading, { ...props })] }) }) }) }) }) }) }) }) }) }) }) }) }) }) }));
97
+ const dashboardRender = (_jsx(BackendProvider, { backend: backend, children: _jsx(WorkspaceProvider, { workspace: workspace, children: _jsx(OverlayControllerProvider, { overlayController: overlayController, children: _jsx(DashboardStoreProvider, { backend: props.backend, workspace: props.workspace, dashboard: dashboardOrRef, persistedDashboard: props.persistedDashboard, filterContextRef: props.filterContextRef, eventHandlers: props.eventHandlers, config: props.config, permissions: props.permissions, onStateChange: props.onStateChange, onEventingInitialized: props.onEventingInitialized, additionalReduxContext: props.additionalReduxContext, customizationFns: props.customizationFns, widgetsOverlayFn: props.widgetsOverlayFn, initialTabId: props.initialTabId, children: _jsx(ExportTemplateDialogContextProvider, { children: _jsx(ExportXlsxDialogContextProvider, { children: _jsx(ExportCsvDialogContextProvider, { children: _jsx(ExportTabularPdfDialogContextProvider, { children: _jsx(DashboardCustomizationsProvider, { insightMenuItemsProvider: props.insightMenuItemsProvider, richTextMenuItemsProvider: props.richTextMenuItemsProvider, existingExportTransformFn: props.customizationFns?.existingExportTransformFn, slideConfig: props.config?.slideConfig, children: _jsx(DashboardComponentsProvider, { ErrorComponent: components.ErrorComponent, LoadingComponent: components.LoadingComponent, LayoutComponent: components.LayoutComponent, InsightComponentProvider: insightProvider, InsightBodyComponentProvider: insightBodyProvider, InsightMenuButtonComponentProvider: insightMenuButtonProvider, InsightMenuTitleComponentProvider: insightMenuTitleProvider, InsightMenuComponentProvider: insightMenuProvider, VisualizationSwitcherToolbarComponentProvider: visualizationSwitcherToolbarComponentProvider, RichTextComponentProvider: richTextProvider, RestrictedPlaceholderComponentProvider: restrictedPlaceholderProvider, RichTextMenuComponentProvider: richTextMenuProvider, RichTextMenuTitleComponentProvider: richTextMenuTitleProvider, VisualizationSwitcherComponentProvider: visualizationSwitcherProvider, WidgetComponentProvider: widgetProvider, ButtonBarComponent: components.ButtonBarComponent, MenuButtonComponent: components.MenuButtonComponent, TopBarComponent: components.TopBarComponent, ToolbarComponent: components.ToolbarComponent, TitleComponent: components.TitleComponent, ScheduledEmailDialogComponent: components.ScheduledEmailDialogComponent, ScheduledEmailDialogContextDecoratorComponent: components.ScheduledEmailDialogContextDecoratorComponent, ScheduledEmailManagementDialogComponent: components.ScheduledEmailManagementDialogComponent, ScheduledEmailManagementDialogContextDecoratorComponent: components.ScheduledEmailManagementDialogContextDecoratorComponent, ShareDialogComponent: components.ShareDialogComponent, AlertingManagementDialogComponent: components.AlertingManagementDialogComponent, AlertingManagementDialogContextDecoratorComponent: components.AlertingManagementDialogContextDecoratorComponent, AutomationsContextDecoratorComponent: components.AutomationsContextDecoratorComponent, AlertingDialogComponent: components.AlertingDialogComponent, AlertingDialogContextDecoratorComponent: components.AlertingDialogContextDecoratorComponent, SaveAsDialogComponent: components.SaveAsDialogComponent, DashboardAttributeFilterComponentProvider: attributeFilterProvider, DashboardDateFilterComponentProvider: dateFilterProvider, DashboardMeasureValueFilterComponentProvider: measureValueFilterProvider, DashboardFilterGroupComponentProvider: filterGroupProvider, FilterBarComponent: components.FilterBarComponent, SidebarComponent: components.SidebarComponent, InsightWidgetComponentSet: insightWidgetComponentSet, RichTextWidgetComponentSet: richTextWidgetComponentSet, VisualizationSwitcherWidgetComponentSet: visualizationSwitcherWidgetComponentSet, DashboardLayoutWidgetComponentSet: dashboardLayoutWidgetComponentSet, AttributeFilterComponentSet: attributeFilterComponentSet, DateFilterComponentSet: dateFilterComponentSet, EmptyLayoutDropZoneBodyComponent: components.EmptyLayoutDropZoneBodyComponent, SaveButtonComponent: components.SaveButtonComponent, DashboardContentComponentProvider: dashboardContentProvider, SettingButtonComponent: components.SettingButtonComponent, DashboardSettingsDialogComponent: components.DashboardSettingsDialogComponent, ShowAsTableButtonComponentProvider: showAsTableButtonComponentProvider, DrillDialogExportDropdownComponentProvider: drillDialogExportDropdownProvider, children: _jsx(DashboardConfigProvider, { menuButtonConfig: props.menuButtonConfig, children: _jsx(DndProvider, { backend: HTML5Backend, children: _jsx(LayoutResizeStateProvider, { children: _jsx(DashboardItemPathAndSizeProvider, { children: _jsxs(HoveredWidgetProvider, { children: [_jsx(DensityInitializer, {}), _jsx(DashboardLoading, { ...props })] }) }) }) }) }) }) }) }) }) }) }) }) }) }) }));
98
98
  if (shouldUseThemeProvider(props, hasThemeProvider)) {
99
99
  return (_jsx(ThemeProvider, { theme: props.theme, modifier: props.themeModifier ?? defaultDashboardThemeModifier, backend: backend, workspace: workspace,
100
100
  // Do not remove global theme styles on unmount, if the theme is provided as a prop,
@@ -1,7 +1,7 @@
1
1
  import { type IAnalyticalBackend } from "@gooddata/sdk-backend-spi";
2
2
  import { type IdentifierRef, type UriRef } from "@gooddata/sdk-model";
3
3
  import { type AttributeFilterComponentSet, type DashboardLayoutWidgetComponentSet, type DateFilterComponentSet, type InsightWidgetComponentSet, type RichTextWidgetComponentSet, type VisualizationSwitcherWidgetComponentSet } from "../../componentDefinition/types.js";
4
- import { type AttributeFilterComponentProvider, type DashboardContentComponentProvider, type DashboardLayoutComponentProvider, type DateFilterComponentProvider, type DrillDialogExportDropdownComponentProvider, type FilterGroupComponentProvider, type InsightBodyComponentProvider, type InsightComponentProvider, type InsightMenuButtonComponentProvider, type InsightMenuComponentProvider, type InsightMenuTitleComponentProvider, type MeasureValueFilterComponentProvider, type RichTextComponentProvider, type RichTextMenuComponentProvider, type RichTextMenuTitleComponentProvider, type ShowAsTableButtonComponentProvider, type VisualizationSwitcherComponentProvider, type VisualizationSwitcherToolbarComponentProvider, type WidgetComponentProvider } from "../../dashboardContexts/types.js";
4
+ import { type AttributeFilterComponentProvider, type DashboardContentComponentProvider, type DashboardLayoutComponentProvider, type DateFilterComponentProvider, type DrillDialogExportDropdownComponentProvider, type FilterGroupComponentProvider, type InsightBodyComponentProvider, type InsightComponentProvider, type InsightMenuButtonComponentProvider, type InsightMenuComponentProvider, type InsightMenuTitleComponentProvider, type MeasureValueFilterComponentProvider, type RestrictedPlaceholderComponentProvider, type RichTextComponentProvider, type RichTextMenuComponentProvider, type RichTextMenuTitleComponentProvider, type ShowAsTableButtonComponentProvider, type VisualizationSwitcherComponentProvider, type VisualizationSwitcherToolbarComponentProvider, type WidgetComponentProvider } from "../../dashboardContexts/types.js";
5
5
  import { type IDashboardProps } from "../types.js";
6
6
  interface IUseDashboardResult {
7
7
  backend: IAnalyticalBackend;
@@ -25,6 +25,7 @@ interface IUseDashboardResult {
25
25
  attributeFilterComponentSet: AttributeFilterComponentSet;
26
26
  dateFilterComponentSet: DateFilterComponentSet;
27
27
  richTextProvider: RichTextComponentProvider;
28
+ restrictedPlaceholderProvider: RestrictedPlaceholderComponentProvider;
28
29
  richTextWidgetComponentSet: RichTextWidgetComponentSet;
29
30
  visualizationSwitcherProvider: VisualizationSwitcherComponentProvider;
30
31
  visualizationSwitcherWidgetComponentSet: VisualizationSwitcherWidgetComponentSet;
@@ -1 +1 @@
1
- {"version":3,"file":"useDashboard.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/hooks/useDashboard.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAS,MAAM,qBAAqB,CAAC;AAI7E,OAAO,EACH,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uCAAuC,EAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,KAAK,gCAAgC,EACrC,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,KAAK,0CAA0C,EAC/C,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EACvC,KAAK,4BAA4B,EACjC,KAAK,iCAAiC,EACtC,KAAK,mCAAmC,EACxC,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,kCAAkC,EACvC,KAAK,kCAAkC,EACvC,KAAK,sCAAsC,EAC3C,KAAK,6CAA6C,EAClD,KAAK,uBAAuB,EAC/B,MAAM,kCAAkC,CAAC;AA0B1C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,UAAU,mBAAmB;IACzB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IACnD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,gCAAgC,CAAC;IAC1D,mBAAmB,EAAE,4BAA4B,CAAC;IAClD,kBAAkB,EAAE,2BAA2B,CAAC;IAChD,0BAA0B,EAAE,mCAAmC,CAAC;IAChE,cAAc,EAAE,uBAAuB,CAAC;IACxC,eAAe,EAAE,wBAAwB,CAAC;IAC1C,mBAAmB,EAAE,4BAA4B,CAAC;IAClD,yBAAyB,EAAE,kCAAkC,CAAC;IAC9D,mBAAmB,EAAE,4BAA4B,CAAC;IAClD,oBAAoB,EAAE,6BAA6B,CAAC;IACpD,wBAAwB,EAAE,iCAAiC,CAAC;IAC5D,yBAAyB,EAAE,kCAAkC,CAAC;IAC9D,wBAAwB,EAAE,iCAAiC,CAAC;IAC5D,yBAAyB,EAAE,yBAAyB,CAAC;IACrD,2BAA2B,EAAE,2BAA2B,CAAC;IACzD,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,0BAA0B,EAAE,0BAA0B,CAAC;IACvD,6BAA6B,EAAE,sCAAsC,CAAC;IACtE,uCAAuC,EAAE,uCAAuC,CAAC;IACjF,6CAA6C,EAAE,6CAA6C,CAAC;IAC7F,uBAAuB,EAAE,gCAAgC,CAAC;IAC1D,iCAAiC,EAAE,iCAAiC,CAAC;IACrE,kCAAkC,EAAE,kCAAkC,CAAC;IACvE,iCAAiC,EAAE,0CAA0C,CAAC;CACjF;AAED,eAAO,MAAM,YAAY,UAAW,eAAe,KAAG,mBA2PrD,CAAC"}
1
+ {"version":3,"file":"useDashboard.d.ts","sourceRoot":"","sources":["../../../../src/presentation/dashboard/hooks/useDashboard.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,MAAM,EAAS,MAAM,qBAAqB,CAAC;AAI7E,OAAO,EACH,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,EACtC,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,uCAAuC,EAC/C,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACH,KAAK,gCAAgC,EACrC,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,KAAK,0CAA0C,EAC/C,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,KAAK,kCAAkC,EACvC,KAAK,4BAA4B,EACjC,KAAK,iCAAiC,EACtC,KAAK,mCAAmC,EACxC,KAAK,sCAAsC,EAC3C,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,kCAAkC,EACvC,KAAK,kCAAkC,EACvC,KAAK,sCAAsC,EAC3C,KAAK,6CAA6C,EAClD,KAAK,uBAAuB,EAC/B,MAAM,kCAAkC,CAAC;AA2B1C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,UAAU,mBAAmB;IACzB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IACnD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,gCAAgC,CAAC;IAC1D,mBAAmB,EAAE,4BAA4B,CAAC;IAClD,kBAAkB,EAAE,2BAA2B,CAAC;IAChD,0BAA0B,EAAE,mCAAmC,CAAC;IAChE,cAAc,EAAE,uBAAuB,CAAC;IACxC,eAAe,EAAE,wBAAwB,CAAC;IAC1C,mBAAmB,EAAE,4BAA4B,CAAC;IAClD,yBAAyB,EAAE,kCAAkC,CAAC;IAC9D,mBAAmB,EAAE,4BAA4B,CAAC;IAClD,oBAAoB,EAAE,6BAA6B,CAAC;IACpD,wBAAwB,EAAE,iCAAiC,CAAC;IAC5D,yBAAyB,EAAE,kCAAkC,CAAC;IAC9D,wBAAwB,EAAE,iCAAiC,CAAC;IAC5D,yBAAyB,EAAE,yBAAyB,CAAC;IACrD,2BAA2B,EAAE,2BAA2B,CAAC;IACzD,sBAAsB,EAAE,sBAAsB,CAAC;IAC/C,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,6BAA6B,EAAE,sCAAsC,CAAC;IACtE,0BAA0B,EAAE,0BAA0B,CAAC;IACvD,6BAA6B,EAAE,sCAAsC,CAAC;IACtE,uCAAuC,EAAE,uCAAuC,CAAC;IACjF,6CAA6C,EAAE,6CAA6C,CAAC;IAC7F,uBAAuB,EAAE,gCAAgC,CAAC;IAC1D,iCAAiC,EAAE,iCAAiC,CAAC;IACrE,kCAAkC,EAAE,kCAAkC,CAAC;IACvE,iCAAiC,EAAE,0CAA0C,CAAC;CACjF;AAED,eAAO,MAAM,YAAY,UAAW,eAAe,KAAG,mBAqQrD,CAAC"}