@gooddata/sdk-ui-dashboard 11.65.0-alpha.8 → 11.65.0

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 (343) hide show
  1. package/NOTICE +622 -2311
  2. package/README.md +1 -1
  3. package/esm/__version.d.ts +1 -1
  4. package/esm/__version.d.ts.map +1 -1
  5. package/esm/__version.js +1 -1
  6. package/esm/index.d.ts +8 -5
  7. package/esm/index.d.ts.map +1 -1
  8. package/esm/index.js +3 -2
  9. package/esm/model/commandHandlers/dashboard/common/filterViews.d.ts +36 -3
  10. package/esm/model/commandHandlers/dashboard/common/filterViews.d.ts.map +1 -1
  11. package/esm/model/commandHandlers/dashboard/common/filterViews.js +138 -26
  12. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.d.ts +15 -4
  13. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.d.ts.map +1 -1
  14. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.js +55 -11
  15. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/preloadAttributeFiltersData.d.ts +6 -1
  16. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/preloadAttributeFiltersData.d.ts.map +1 -1
  17. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/preloadAttributeFiltersData.js +14 -6
  18. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.d.ts.map +1 -1
  19. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/resolveDashboardConfig.js +1 -0
  20. package/esm/model/commandHandlers/dashboard/resetDashboardHandler.d.ts.map +1 -1
  21. package/esm/model/commandHandlers/dashboard/resetDashboardHandler.js +21 -8
  22. package/esm/model/commandHandlers/filterContext/attributeFilter/changeAttributeDisplayFormHandler.d.ts.map +1 -1
  23. package/esm/model/commandHandlers/filterContext/attributeFilter/changeAttributeDisplayFormHandler.js +8 -7
  24. package/esm/model/commandHandlers/filterContext/attributeFilter/changeAttributeFilterSelectionHandler.d.ts.map +1 -1
  25. package/esm/model/commandHandlers/filterContext/attributeFilter/changeAttributeFilterSelectionHandler.js +19 -28
  26. package/esm/model/commandHandlers/filterContext/attributeFilter/removeAttributeFiltersHandler.d.ts.map +1 -1
  27. package/esm/model/commandHandlers/filterContext/attributeFilter/removeAttributeFiltersHandler.js +4 -5
  28. package/esm/model/commandHandlers/filterContext/attributeFilter/replaceAttributeFilterItemSelectionHandler.d.ts.map +1 -1
  29. package/esm/model/commandHandlers/filterContext/attributeFilter/replaceAttributeFilterItemSelectionHandler.js +14 -15
  30. package/esm/model/commandHandlers/filterContext/attributeFilter/resolveDisplayFormMetadata.d.ts +4 -1
  31. package/esm/model/commandHandlers/filterContext/attributeFilter/resolveDisplayFormMetadata.d.ts.map +1 -1
  32. package/esm/model/commandHandlers/filterContext/attributeFilter/resolveDisplayFormMetadata.js +11 -2
  33. package/esm/model/commandHandlers/filterContext/changeFilterContextSelectionHandler.d.ts.map +1 -1
  34. package/esm/model/commandHandlers/filterContext/changeFilterContextSelectionHandler.js +28 -44
  35. package/esm/model/commandHandlers/filterContext/common.d.ts +6 -5
  36. package/esm/model/commandHandlers/filterContext/common.d.ts.map +1 -1
  37. package/esm/model/commandHandlers/filterContext/common.js +12 -18
  38. package/esm/model/commandHandlers/filterContext/dateFilter/changeDateFilterSelectionHandler.d.ts.map +1 -1
  39. package/esm/model/commandHandlers/filterContext/dateFilter/changeDateFilterSelectionHandler.js +30 -36
  40. package/esm/model/commandHandlers/filterContext/filterViewHandler.d.ts +10 -0
  41. package/esm/model/commandHandlers/filterContext/filterViewHandler.d.ts.map +1 -1
  42. package/esm/model/commandHandlers/filterContext/filterViewHandler.js +79 -24
  43. package/esm/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterConditionHandler.d.ts.map +1 -1
  44. package/esm/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterConditionHandler.js +11 -17
  45. package/esm/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterDimensionalityHandler.d.ts.map +1 -1
  46. package/esm/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterDimensionalityHandler.js +7 -10
  47. package/esm/model/commandHandlers/filterContext/tabSync/expandActionsForTabSync.d.ts +15 -0
  48. package/esm/model/commandHandlers/filterContext/tabSync/expandActionsForTabSync.d.ts.map +1 -0
  49. package/esm/model/commandHandlers/filterContext/tabSync/expandActionsForTabSync.js +88 -0
  50. package/esm/model/commandHandlers/filterContext/tabSync/tabSyncRules.d.ts +11 -0
  51. package/esm/model/commandHandlers/filterContext/tabSync/tabSyncRules.d.ts.map +1 -0
  52. package/esm/model/commandHandlers/filterContext/tabSync/tabSyncRules.js +335 -0
  53. package/esm/model/commandHandlers/filterContext/tabSync/tabSyncSaga.d.ts +52 -0
  54. package/esm/model/commandHandlers/filterContext/tabSync/tabSyncSaga.d.ts.map +1 -0
  55. package/esm/model/commandHandlers/filterContext/tabSync/tabSyncSaga.js +60 -0
  56. package/esm/model/commandHandlers/filterContext/tabSync/tabSyncScope.d.ts +69 -0
  57. package/esm/model/commandHandlers/filterContext/tabSync/tabSyncScope.d.ts.map +1 -0
  58. package/esm/model/commandHandlers/filterContext/tabSync/tabSyncScope.js +2 -0
  59. package/esm/model/commandHandlers/filterContext/tabSync/writtenTargets.d.ts +17 -0
  60. package/esm/model/commandHandlers/filterContext/tabSync/writtenTargets.d.ts.map +1 -0
  61. package/esm/model/commandHandlers/filterContext/tabSync/writtenTargets.js +79 -0
  62. package/esm/model/commandHandlers/parameters/changeParameterValuesHandler.d.ts +2 -1
  63. package/esm/model/commandHandlers/parameters/changeParameterValuesHandler.d.ts.map +1 -1
  64. package/esm/model/commandHandlers/parameters/changeParameterValuesHandler.js +44 -9
  65. package/esm/model/commandHandlers/tabs/switchDashboardTabHandler.d.ts.map +1 -1
  66. package/esm/model/commandHandlers/tabs/switchDashboardTabHandler.js +3 -1
  67. package/esm/model/commands/filters.d.ts +16 -1
  68. package/esm/model/commands/filters.d.ts.map +1 -1
  69. package/esm/model/commands/filters.js +2 -1
  70. package/esm/model/commands/parameters.d.ts +20 -1
  71. package/esm/model/commands/parameters.d.ts.map +1 -1
  72. package/esm/model/commands/parameters.js +3 -1
  73. package/esm/model/events/base.d.ts +1 -1
  74. package/esm/model/events/base.d.ts.map +1 -1
  75. package/esm/model/events/index.d.ts +2 -1
  76. package/esm/model/events/index.d.ts.map +1 -1
  77. package/esm/model/events/insightEditor.d.ts +128 -0
  78. package/esm/model/events/insightEditor.d.ts.map +1 -0
  79. package/esm/model/events/insightEditor.js +74 -0
  80. package/esm/model/store/config/configSelectors.d.ts +12 -0
  81. package/esm/model/store/config/configSelectors.d.ts.map +1 -1
  82. package/esm/model/store/config/configSelectors.js +12 -0
  83. package/esm/model/store/filterViews/filterViewsReducers.d.ts +8 -0
  84. package/esm/model/store/filterViews/filterViewsReducers.d.ts.map +1 -1
  85. package/esm/model/store/filterViews/filterViewsReducers.js +11 -0
  86. package/esm/model/store/filterViews/filterViewsReducersSelectors.d.ts +6 -0
  87. package/esm/model/store/filterViews/filterViewsReducersSelectors.d.ts.map +1 -1
  88. package/esm/model/store/filterViews/filterViewsReducersSelectors.js +6 -0
  89. package/esm/model/store/filterViews/filterViewsState.d.ts +6 -0
  90. package/esm/model/store/filterViews/filterViewsState.d.ts.map +1 -1
  91. package/esm/model/store/filterViews/index.d.ts +2 -0
  92. package/esm/model/store/filterViews/index.d.ts.map +1 -1
  93. package/esm/model/store/meta/metaSelectors.d.ts +7 -0
  94. package/esm/model/store/meta/metaSelectors.d.ts.map +1 -1
  95. package/esm/model/store/meta/metaSelectors.js +10 -0
  96. package/esm/model/store/tabs/attributeFilterConfigs/attributeFilterConfigsReducers.d.ts +75 -5
  97. package/esm/model/store/tabs/attributeFilterConfigs/attributeFilterConfigsReducers.d.ts.map +1 -1
  98. package/esm/model/store/tabs/attributeFilterConfigs/attributeFilterConfigsReducers.js +35 -60
  99. package/esm/model/store/tabs/dateFilterConfigs/dateFilterConfigsReducers.js +1 -1
  100. package/esm/model/store/tabs/filterContext/filterContextReducers.d.ts +163 -31
  101. package/esm/model/store/tabs/filterContext/filterContextReducers.d.ts.map +1 -1
  102. package/esm/model/store/tabs/filterContext/filterContextReducers.js +389 -529
  103. package/esm/model/store/tabs/filterContext/filterSync.d.ts +35 -13
  104. package/esm/model/store/tabs/filterContext/filterSync.d.ts.map +1 -1
  105. package/esm/model/store/tabs/filterContext/filterSync.js +79 -58
  106. package/esm/model/store/tabs/index.d.ts +18 -12
  107. package/esm/model/store/tabs/index.d.ts.map +1 -1
  108. package/esm/model/store/tabs/layout/layoutReducers.d.ts +1 -0
  109. package/esm/model/store/tabs/layout/layoutReducers.d.ts.map +1 -1
  110. package/esm/model/store/tabs/measureValueFilterConfigs/measureValueFilterConfigsReducers.d.ts.map +1 -1
  111. package/esm/model/store/tabs/parameters/parametersReducers.d.ts +16 -5
  112. package/esm/model/store/tabs/parameters/parametersReducers.d.ts.map +1 -1
  113. package/esm/model/store/tabs/parameters/parametersReducers.js +33 -7
  114. package/esm/model/store/tabs/parameters/parametersSelectors.d.ts +7 -0
  115. package/esm/model/store/tabs/parameters/parametersSelectors.d.ts.map +1 -1
  116. package/esm/model/store/tabs/parameters/parametersSelectors.js +16 -0
  117. package/esm/model/store/tabs/tabsReducers.d.ts +8 -4
  118. package/esm/model/store/tabs/tabsReducers.d.ts.map +1 -1
  119. package/esm/model/store/tabs/tabsReducers.js +15 -18
  120. package/esm/model/store/tabs/tabsState.d.ts +0 -10
  121. package/esm/model/store/tabs/tabsState.d.ts.map +1 -1
  122. package/esm/model/store/tabs/tabsState.js +0 -20
  123. package/esm/model/store/ui/index.d.ts +2 -0
  124. package/esm/model/store/ui/index.d.ts.map +1 -1
  125. package/esm/model/store/ui/uiReducers.d.ts +6 -0
  126. package/esm/model/store/ui/uiReducers.d.ts.map +1 -1
  127. package/esm/model/store/ui/uiReducers.js +8 -0
  128. package/esm/model/store/ui/uiSelectors.d.ts +7 -0
  129. package/esm/model/store/ui/uiSelectors.d.ts.map +1 -1
  130. package/esm/model/store/ui/uiSelectors.js +6 -0
  131. package/esm/model/store/ui/uiState.d.ts +5 -0
  132. package/esm/model/store/ui/uiState.d.ts.map +1 -1
  133. package/esm/model/store/ui/uiState.js +1 -0
  134. package/esm/model/types/commonTypes.d.ts +18 -0
  135. package/esm/model/types/commonTypes.d.ts.map +1 -1
  136. package/esm/model/types/insightEditorTypes.d.ts +43 -0
  137. package/esm/model/types/insightEditorTypes.d.ts.map +1 -0
  138. package/esm/model/types/insightEditorTypes.js +2 -0
  139. package/esm/model/utils/attributeFilterMatching.d.ts +10 -0
  140. package/esm/model/utils/attributeFilterMatching.d.ts.map +1 -1
  141. package/esm/model/utils/attributeFilterMatching.js +14 -3
  142. package/esm/model/utils/attributeFilterSelectionTypeCompatibility.d.ts +8 -0
  143. package/esm/model/utils/attributeFilterSelectionTypeCompatibility.d.ts.map +1 -1
  144. package/esm/model/utils/attributeFilterSelectionTypeCompatibility.js +14 -4
  145. package/esm/presentation/automations/alerting/DefaultAlertingManagementDialog/DefaultAlertingManagementDialogContent.d.ts.map +1 -1
  146. package/esm/presentation/automations/alerting/DefaultAlertingManagementDialog/DefaultAlertingManagementDialogContent.js +1 -4
  147. package/esm/presentation/automations/connectors/hooks/useAutomationManagementEditRouting.d.ts.map +1 -1
  148. package/esm/presentation/automations/connectors/hooks/useAutomationManagementEditRouting.js +2 -6
  149. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.d.ts.map +1 -1
  150. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailDialog/components/RecipientsSelect/RecipientsSelectRenderer.js +6 -1
  151. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialogContent.d.ts.map +1 -1
  152. package/esm/presentation/automations/scheduledEmail/DefaultScheduledEmailManagementDialog/DefaultScheduledEmailManagementDialogContent.js +2 -5
  153. package/esm/presentation/automations/shared/automationFilters/utils.d.ts +4 -0
  154. package/esm/presentation/automations/shared/automationFilters/utils.d.ts.map +1 -1
  155. package/esm/presentation/automations/shared/automationFilters/utils.js +12 -5
  156. package/esm/presentation/automations/shared/utils/automationUtils.d.ts +1 -2
  157. package/esm/presentation/automations/shared/utils/automationUtils.d.ts.map +1 -1
  158. package/esm/presentation/automations/shared/utils/automationUtils.js +0 -1
  159. package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.d.ts +1 -1
  160. package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.d.ts.map +1 -1
  161. package/esm/presentation/dashboard/DashboardHeader/DashboardHeader.js +0 -10
  162. package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.d.ts.map +1 -1
  163. package/esm/presentation/dashboard/DashboardSidebar/CreationPanel.js +10 -1
  164. package/esm/presentation/dashboard/DefaultDashboardContent/DashboardContentLoader.d.ts +5 -0
  165. package/esm/presentation/dashboard/DefaultDashboardContent/DashboardContentLoader.d.ts.map +1 -0
  166. package/esm/presentation/dashboard/DefaultDashboardContent/DashboardContentLoader.js +27 -0
  167. package/esm/presentation/dashboard/DefaultDashboardContent/DefaultDashboardMainContent.d.ts.map +1 -1
  168. package/esm/presentation/dashboard/DefaultDashboardContent/DefaultDashboardMainContent.js +7 -2
  169. package/esm/presentation/dashboard/components/DashboardInner.d.ts.map +1 -1
  170. package/esm/presentation/dashboard/components/DashboardInner.js +13 -9
  171. package/esm/presentation/dashboard/components/DashboardInteractionComposing.d.ts +2 -1
  172. package/esm/presentation/dashboard/components/DashboardInteractionComposing.d.ts.map +1 -1
  173. package/esm/presentation/dashboard/components/DashboardInteractionComposing.js +9 -4
  174. package/esm/presentation/dashboard/hooks/useDashboard.d.ts.map +1 -1
  175. package/esm/presentation/dashboard/hooks/useDashboard.js +3 -2
  176. package/esm/presentation/dashboard/types.d.ts +5 -0
  177. package/esm/presentation/dashboard/types.d.ts.map +1 -1
  178. package/esm/presentation/filterBar/filterBar/hooks/useResetFiltersButton.d.ts.map +1 -1
  179. package/esm/presentation/filterBar/filterBar/hooks/useResetFiltersButton.js +4 -1
  180. package/esm/presentation/insightEditor/InsightEditorContent.d.ts +26 -0
  181. package/esm/presentation/insightEditor/InsightEditorContent.d.ts.map +1 -0
  182. package/esm/presentation/insightEditor/InsightEditorContent.js +179 -0
  183. package/esm/presentation/insightEditor/InsightEditorCreatePanelItem.d.ts +7 -0
  184. package/esm/presentation/insightEditor/InsightEditorCreatePanelItem.d.ts.map +1 -0
  185. package/esm/presentation/insightEditor/InsightEditorCreatePanelItem.js +25 -0
  186. package/esm/presentation/insightEditor/InsightEditorOverlay.d.ts +6 -0
  187. package/esm/presentation/insightEditor/InsightEditorOverlay.d.ts.map +1 -0
  188. package/esm/presentation/insightEditor/InsightEditorOverlay.js +110 -0
  189. package/esm/presentation/insightEditor/InsightEditorPermissionsContext.d.ts +10 -0
  190. package/esm/presentation/insightEditor/InsightEditorPermissionsContext.d.ts.map +1 -0
  191. package/esm/presentation/insightEditor/InsightEditorPermissionsContext.js +18 -0
  192. package/esm/presentation/insightEditor/InsightEditorPlaceholder.d.ts +7 -0
  193. package/esm/presentation/insightEditor/InsightEditorPlaceholder.d.ts.map +1 -0
  194. package/esm/presentation/insightEditor/InsightEditorPlaceholder.js +15 -0
  195. package/esm/presentation/insightEditor/filterContext/attributeFilters.d.ts +4 -0
  196. package/esm/presentation/insightEditor/filterContext/attributeFilters.d.ts.map +1 -0
  197. package/esm/presentation/insightEditor/filterContext/attributeFilters.js +115 -0
  198. package/esm/presentation/insightEditor/filterContext/dateFilters.d.ts +5 -0
  199. package/esm/presentation/insightEditor/filterContext/dateFilters.d.ts.map +1 -0
  200. package/esm/presentation/insightEditor/filterContext/dateFilters.js +117 -0
  201. package/esm/presentation/insightEditor/filterContext/filterIntersection.d.ts +7 -0
  202. package/esm/presentation/insightEditor/filterContext/filterIntersection.d.ts.map +1 -0
  203. package/esm/presentation/insightEditor/filterContext/filterIntersection.js +149 -0
  204. package/esm/presentation/insightEditor/filterContext/insightFilterContext.d.ts +26 -0
  205. package/esm/presentation/insightEditor/filterContext/insightFilterContext.d.ts.map +1 -0
  206. package/esm/presentation/insightEditor/filterContext/insightFilterContext.js +72 -0
  207. package/esm/presentation/insightEditor/filterContext/measureValueFilters.d.ts +20 -0
  208. package/esm/presentation/insightEditor/filterContext/measureValueFilters.d.ts.map +1 -0
  209. package/esm/presentation/insightEditor/filterContext/measureValueFilters.js +76 -0
  210. package/esm/presentation/insightEditor/filterContext/objQualifiers.d.ts +11 -0
  211. package/esm/presentation/insightEditor/filterContext/objQualifiers.d.ts.map +1 -0
  212. package/esm/presentation/insightEditor/filterContext/objQualifiers.js +18 -0
  213. package/esm/presentation/insightEditor/insightEditorEscapeGuard.d.ts +18 -0
  214. package/esm/presentation/insightEditor/insightEditorEscapeGuard.d.ts.map +1 -0
  215. package/esm/presentation/insightEditor/insightEditorEscapeGuard.js +24 -0
  216. package/esm/presentation/insightEditor/insightEditorRoute.d.ts +34 -0
  217. package/esm/presentation/insightEditor/insightEditorRoute.d.ts.map +1 -0
  218. package/esm/presentation/insightEditor/insightEditorRoute.js +48 -0
  219. package/esm/presentation/insightEditor/types.d.ts +7 -0
  220. package/esm/presentation/insightEditor/types.d.ts.map +1 -0
  221. package/esm/presentation/insightEditor/types.js +2 -0
  222. package/esm/presentation/insightEditor/useCanCreateInsightInEditor.d.ts +5 -0
  223. package/esm/presentation/insightEditor/useCanCreateInsightInEditor.d.ts.map +1 -0
  224. package/esm/presentation/insightEditor/useCanCreateInsightInEditor.js +14 -0
  225. package/esm/presentation/insightEditor/useExploreFilterTransfer.d.ts +23 -0
  226. package/esm/presentation/insightEditor/useExploreFilterTransfer.d.ts.map +1 -0
  227. package/esm/presentation/insightEditor/useExploreFilterTransfer.js +194 -0
  228. package/esm/presentation/insightEditor/useInsightEditPermissions.d.ts +17 -0
  229. package/esm/presentation/insightEditor/useInsightEditPermissions.d.ts.map +1 -0
  230. package/esm/presentation/insightEditor/useInsightEditPermissions.js +42 -0
  231. package/esm/presentation/insightEditor/useInsightEditorMenuItems.d.ts +23 -0
  232. package/esm/presentation/insightEditor/useInsightEditorMenuItems.d.ts.map +1 -0
  233. package/esm/presentation/insightEditor/useInsightEditorMenuItems.js +126 -0
  234. package/esm/presentation/insightEditor/useInsightEditorSession.d.ts +19 -0
  235. package/esm/presentation/insightEditor/useInsightEditorSession.d.ts.map +1 -0
  236. package/esm/presentation/insightEditor/useInsightEditorSession.js +141 -0
  237. package/esm/presentation/insightList/InsightList.d.ts.map +1 -1
  238. package/esm/presentation/insightList/InsightList.js +10 -5
  239. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts +10 -0
  240. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
  241. package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +11 -1
  242. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +10 -0
  243. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
  244. package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +11 -1
  245. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +10 -0
  246. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
  247. package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +16 -6
  248. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +36 -0
  249. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  250. package/esm/presentation/localization/bundles/en-US.localization-bundle.js +36 -0
  251. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +10 -0
  252. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
  253. package/esm/presentation/localization/bundles/es-419.localization-bundle.js +11 -1
  254. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +10 -0
  255. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
  256. package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +50 -40
  257. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +10 -0
  258. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
  259. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +11 -1
  260. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +10 -0
  261. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
  262. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +12 -2
  263. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +10 -0
  264. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
  265. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +186 -176
  266. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +10 -0
  267. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
  268. package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +11 -1
  269. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +10 -0
  270. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
  271. package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +11 -1
  272. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +10 -0
  273. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
  274. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +11 -1
  275. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +10 -0
  276. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
  277. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +11 -1
  278. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +10 -0
  279. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
  280. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +11 -1
  281. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +10 -0
  282. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
  283. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +11 -1
  284. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +10 -0
  285. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
  286. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +11 -1
  287. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +10 -0
  288. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
  289. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +11 -1
  290. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +10 -0
  291. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
  292. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +11 -1
  293. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +10 -0
  294. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
  295. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +11 -1
  296. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +10 -0
  297. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
  298. package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +11 -1
  299. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +10 -0
  300. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
  301. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +11 -1
  302. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +10 -0
  303. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
  304. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +11 -1
  305. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +10 -0
  306. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
  307. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +11 -1
  308. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +10 -0
  309. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
  310. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +11 -1
  311. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +10 -0
  312. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
  313. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +11 -1
  314. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +10 -0
  315. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
  316. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +11 -1
  317. package/esm/presentation/shareDialog/DefaultShareDialog.d.ts.map +1 -1
  318. package/esm/presentation/shareDialog/DefaultShareDialog.js +2 -5
  319. package/esm/presentation/topBar/title/EditableTitle.d.ts.map +1 -1
  320. package/esm/presentation/topBar/title/EditableTitle.js +6 -0
  321. package/esm/presentation/widget/insight/DefaultDashboardInsightComponentSetFactory.d.ts +1 -1
  322. package/esm/presentation/widget/insight/DefaultDashboardInsightComponentSetFactory.d.ts.map +1 -1
  323. package/esm/presentation/widget/insight/DefaultDashboardInsightComponentSetFactory.js +13 -1
  324. package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/index.d.ts.map +1 -1
  325. package/esm/presentation/widget/insightMenu/DefaultDashboardInsightMenu/DashboardInsightMenu/index.js +10 -1
  326. package/esm/presentation/widget/widget/InsightWidget/useEditableInsightMenu.d.ts.map +1 -1
  327. package/esm/presentation/widget/widget/InsightWidget/useEditableInsightMenu.js +5 -1
  328. package/esm/presentation/widget/widget/InsightWidget/useInsightMenu.d.ts.map +1 -1
  329. package/esm/presentation/widget/widget/InsightWidget/useInsightMenu.js +4 -1
  330. package/esm/sdk-ui-dashboard.d.ts +562 -47
  331. package/package.json +23 -21
  332. package/styles/css/dashboard.css +50 -3
  333. package/styles/css/dashboard.css.map +1 -1
  334. package/styles/css/dashboardContentLoader.css +45 -0
  335. package/styles/css/dashboardContentLoader.css.map +1 -0
  336. package/styles/css/insightEditor.css +46 -0
  337. package/styles/css/insightEditor.css.map +1 -0
  338. package/styles/css/main.css +96 -3
  339. package/styles/css/main.css.map +1 -1
  340. package/styles/scss/dashboard.scss +13 -3
  341. package/styles/scss/dashboardContentLoader.scss +45 -0
  342. package/styles/scss/insightEditor.scss +53 -0
  343. package/styles/scss/main.scss +1 -0
@@ -0,0 +1,117 @@
1
+ // (C) 2020-2026 GoodData Corporation
2
+ import { absoluteDateFilterValues, areObjRefsEqual, filterObjRef, insightFilters, isAbsoluteDateFilter, isAllTimeDateFilter, isDateFilter, isRelativeDateFilter, relativeDateFilterValues, } from "@gooddata/sdk-model";
3
+ const ALL_TIME_GRANULARITY = "ALL_TIME_GRANULARITY";
4
+ function getDateFilterItem(dataSet, dateFilterContextItem) {
5
+ if (dateFilterContextItem) {
6
+ if (dateFilterContextItem.dateFilter.type === "absolute") {
7
+ return {
8
+ absoluteDateFilter: {
9
+ dataSet,
10
+ from: String(dateFilterContextItem.dateFilter.from),
11
+ to: String(dateFilterContextItem.dateFilter.to),
12
+ },
13
+ };
14
+ }
15
+ else {
16
+ const boundedFilter = dateFilterContextItem.dateFilter.boundedFilter;
17
+ return {
18
+ relativeDateFilter: {
19
+ dataSet,
20
+ granularity: dateFilterContextItem.dateFilter.granularity,
21
+ from: Number(dateFilterContextItem.dateFilter.from),
22
+ to: Number(dateFilterContextItem.dateFilter.to),
23
+ ...(boundedFilter ? { boundedFilter } : {}),
24
+ },
25
+ };
26
+ }
27
+ }
28
+ else {
29
+ return {
30
+ relativeDateFilter: {
31
+ dataSet,
32
+ granularity: ALL_TIME_GRANULARITY,
33
+ from: -1,
34
+ to: 1,
35
+ },
36
+ };
37
+ }
38
+ }
39
+ export function getWidgetDateFilterItem(widget, dateFilterContextItem) {
40
+ if (!widget?.dateDataSet) {
41
+ return undefined;
42
+ }
43
+ return getDateFilterItem(widget.dateDataSet, dateFilterContextItem);
44
+ }
45
+ const sanitizeCorruptedAllTimeFilters = (appliedDateFilter) => {
46
+ if (!isRelativeDateFilter(appliedDateFilter)) {
47
+ return appliedDateFilter;
48
+ }
49
+ // A corrupted all time filter misses its bounds, although the type requires them.
50
+ const { from, to, dataSet } = appliedDateFilter.relativeDateFilter;
51
+ if (from === undefined || to === undefined) {
52
+ const relativeAllTimeDateFilter = {
53
+ relativeDateFilter: {
54
+ dataSet,
55
+ granularity: ALL_TIME_GRANULARITY,
56
+ from: 0,
57
+ to: 0,
58
+ },
59
+ };
60
+ return relativeAllTimeDateFilter;
61
+ }
62
+ else {
63
+ return appliedDateFilter;
64
+ }
65
+ };
66
+ function getDateFilterContext(dateFilter) {
67
+ const includeDataSet = true;
68
+ if (isAllTimeDateFilter(dateFilter)) {
69
+ const { dataSet } = relativeDateFilterValues(dateFilter, includeDataSet);
70
+ return {
71
+ relativeDateFilter: {
72
+ dataSet,
73
+ granularity: ALL_TIME_GRANULARITY,
74
+ from: -1,
75
+ to: 1,
76
+ },
77
+ };
78
+ }
79
+ else if (isAbsoluteDateFilter(dateFilter)) {
80
+ const { dataSet, from, to } = absoluteDateFilterValues(dateFilter, includeDataSet);
81
+ return {
82
+ absoluteDateFilter: {
83
+ dataSet,
84
+ from,
85
+ to,
86
+ },
87
+ };
88
+ }
89
+ else {
90
+ const { dataSet, from, to, granularity, boundedFilter } = relativeDateFilterValues(dateFilter, includeDataSet);
91
+ return {
92
+ relativeDateFilter: {
93
+ dataSet,
94
+ granularity,
95
+ from,
96
+ to,
97
+ ...(boundedFilter ? { boundedFilter } : {}),
98
+ },
99
+ };
100
+ }
101
+ }
102
+ export function getDateFilterItems(appliedFilters, insight) {
103
+ const sanitizedAppliedDateFilters = appliedFilters
104
+ .filter(isDateFilter)
105
+ .map(sanitizeCorruptedAllTimeFilters);
106
+ const insightDateFilters = insightFilters(insight).filter(isDateFilter);
107
+ return getDateFilterItemsFromAppliedFilters(sanitizedAppliedDateFilters, insightDateFilters);
108
+ }
109
+ function getDateFilterItemsFromAppliedFilters(appliedFilters, insightDateFilters) {
110
+ const uniqueInsightDateFilters = insightDateFilters.filter((insightDateFilter) => {
111
+ return !appliedFilters.some((appliedFilter) => {
112
+ return areObjRefsEqual(filterObjRef(appliedFilter), filterObjRef(insightDateFilter));
113
+ });
114
+ });
115
+ const allDateFilters = [...appliedFilters, ...uniqueInsightDateFilters];
116
+ return allDateFilters.map((dateFilter) => getDateFilterContext(dateFilter));
117
+ }
@@ -0,0 +1,7 @@
1
+ import { type INegativeAttributeFilter as IEmbedNegativeAttributeFilter, type IPositiveAttributeFilter as IEmbedPositiveAttributeFilter } from "@gooddata/sdk-embedding";
2
+ import { type IAttributeFilterWithSelection, type INegativeAttributeFilter, type IPositiveAttributeFilter } from "@gooddata/sdk-model";
3
+ export declare function intersectPositiveWithNegativeAttrFilters(positiveAttrFilter: IPositiveAttributeFilter, negativeAttrFilter: IEmbedNegativeAttributeFilter): IEmbedPositiveAttributeFilter;
4
+ export declare function intersectPositiveWithNegativeAttrFilters2(positiveAttrFilter: IEmbedPositiveAttributeFilter, negativeAttrFilter: INegativeAttributeFilter): IEmbedPositiveAttributeFilter;
5
+ export declare function intersectFilters(insightAttrFilter: IAttributeFilterWithSelection, attrFilterContext: IEmbedPositiveAttributeFilter | IEmbedNegativeAttributeFilter): IEmbedPositiveAttributeFilter | IEmbedNegativeAttributeFilter;
6
+ export declare function areFiltersWithSameElements(insightAttrFilter: IAttributeFilterWithSelection, attrFilterContext: IEmbedPositiveAttributeFilter | IEmbedNegativeAttributeFilter): boolean;
7
+ //# sourceMappingURL=filterIntersection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterIntersection.d.ts","sourceRoot":"","sources":["../../../../src/presentation/insightEditor/filterContext/filterIntersection.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,KAAK,wBAAwB,IAAI,6BAA6B,EAC9D,KAAK,wBAAwB,IAAI,6BAA6B,EAGjE,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAEH,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAUhC,MAAM,qBAAqB,CAAC;AAQ7B,wBAAgB,wCAAwC,CACpD,kBAAkB,EAAE,wBAAwB,EAC5C,kBAAkB,EAAE,6BAA6B,GAClD,6BAA6B,CAiC/B;AAED,wBAAgB,yCAAyC,CACrD,kBAAkB,EAAE,6BAA6B,EACjD,kBAAkB,EAAE,wBAAwB,GAC7C,6BAA6B,CA0B/B;AACD,wBAAgB,gBAAgB,CAC5B,iBAAiB,EAAE,6BAA6B,EAChD,iBAAiB,EAAE,6BAA6B,GAAG,6BAA6B,GACjF,6BAA6B,GAAG,6BAA6B,CA+D/D;AAED,wBAAgB,0BAA0B,CACtC,iBAAiB,EAAE,6BAA6B,EAChD,iBAAiB,EAAE,6BAA6B,GAAG,6BAA6B,GACjF,OAAO,CAsDT"}
@@ -0,0 +1,149 @@
1
+ // (C) 2007-2026 GoodData Corporation
2
+ import { uniq } from "lodash-es";
3
+ import { isNegativeAttributeFilter as isEmbedNegativeAttributeFilter, isPositiveAttributeFilter as isEmbedPositiveAttributeFilter, } from "@gooddata/sdk-embedding";
4
+ import { filterAttributeElements, filterIsEmpty, isAttributeElementsByRef, isAttributeElementsByValue, isNegativeAttributeFilter, isObjRef, isPositiveAttributeFilter, newNegativeAttributeFilter, newPositiveAttributeFilter, } from "@gooddata/sdk-model";
5
+ // The embedding API types the element lists as strings. The null element (an empty value) passes
6
+ // through as it is.
7
+ function elementIds(elements) {
8
+ return (isAttributeElementsByRef(elements) ? elements.uris : elements.values);
9
+ }
10
+ export function intersectPositiveWithNegativeAttrFilters(positiveAttrFilter, negativeAttrFilter) {
11
+ const normalizedPositiveAttrFilter = normalizeEmptyFilterElements(positiveAttrFilter);
12
+ const attributeElements = normalizedPositiveAttrFilter.positiveAttributeFilter.in;
13
+ //NOTE: Currently in dashboard filters we are not support local identifiers, so we can safely assume that
14
+ // that displayForm is ObjRef
15
+ if (!isObjRef(normalizedPositiveAttrFilter.positiveAttributeFilter.displayForm)) {
16
+ throw new Error("Expected positive attribute filter display form to be ObjRef");
17
+ }
18
+ if (!isAttributeElementsByRef(attributeElements)) {
19
+ return {
20
+ positiveAttributeFilter: {
21
+ displayForm: normalizedPositiveAttrFilter.positiveAttributeFilter.displayForm,
22
+ in: elementIds(attributeElements).filter((identifier) => !negativeAttrFilter.negativeAttributeFilter.notIn.includes(identifier)),
23
+ },
24
+ };
25
+ }
26
+ return {
27
+ positiveAttributeFilter: {
28
+ displayForm: normalizedPositiveAttrFilter.positiveAttributeFilter.displayForm,
29
+ in: elementIds(attributeElements).filter((uri) => !negativeAttrFilter.negativeAttributeFilter.notIn.includes(uri)),
30
+ },
31
+ };
32
+ }
33
+ export function intersectPositiveWithNegativeAttrFilters2(positiveAttrFilter, negativeAttrFilter) {
34
+ const normalizedNegativeAttrFilter = normalizeEmptyFilterElements(negativeAttrFilter);
35
+ const attributeElements = normalizedNegativeAttrFilter.negativeAttributeFilter.notIn;
36
+ if (!isAttributeElementsByRef(attributeElements)) {
37
+ return {
38
+ positiveAttributeFilter: {
39
+ displayForm: positiveAttrFilter.positiveAttributeFilter.displayForm,
40
+ in: positiveAttrFilter.positiveAttributeFilter.in.filter((identifier) => !elementIds(attributeElements).includes(identifier)),
41
+ },
42
+ };
43
+ }
44
+ return {
45
+ positiveAttributeFilter: {
46
+ displayForm: positiveAttrFilter.positiveAttributeFilter.displayForm,
47
+ in: positiveAttrFilter.positiveAttributeFilter.in.filter((uri) => !elementIds(attributeElements).includes(uri)),
48
+ },
49
+ };
50
+ }
51
+ export function intersectFilters(insightAttrFilter, attrFilterContext) {
52
+ const normalizedInsightAttrFilter = normalizeEmptyFilterElements(insightAttrFilter);
53
+ const attributeElements = filterAttributeElements(normalizedInsightAttrFilter);
54
+ if (!isAttributeElementsByRef(attributeElements)) {
55
+ if (isPositiveAttributeFilter(normalizedInsightAttrFilter)) {
56
+ if (isEmbedPositiveAttributeFilter(attrFilterContext)) {
57
+ return {
58
+ positiveAttributeFilter: {
59
+ displayForm: attrFilterContext.positiveAttributeFilter.displayForm,
60
+ in: attrFilterContext.positiveAttributeFilter.in.filter((identifier) => elementIds(attributeElements).includes(identifier)),
61
+ },
62
+ };
63
+ }
64
+ return intersectPositiveWithNegativeAttrFilters(normalizedInsightAttrFilter, attrFilterContext);
65
+ }
66
+ else {
67
+ if (isEmbedNegativeAttributeFilter(attrFilterContext)) {
68
+ return {
69
+ negativeAttributeFilter: {
70
+ displayForm: attrFilterContext.negativeAttributeFilter.displayForm,
71
+ notIn: uniq(elementIds(attributeElements).concat(attrFilterContext.negativeAttributeFilter.notIn)),
72
+ },
73
+ };
74
+ }
75
+ return intersectPositiveWithNegativeAttrFilters2(attrFilterContext, normalizedInsightAttrFilter);
76
+ }
77
+ }
78
+ if (isPositiveAttributeFilter(normalizedInsightAttrFilter)) {
79
+ if (isEmbedPositiveAttributeFilter(attrFilterContext)) {
80
+ return {
81
+ positiveAttributeFilter: {
82
+ displayForm: attrFilterContext.positiveAttributeFilter.displayForm,
83
+ in: attrFilterContext.positiveAttributeFilter.in.filter((uri) => elementIds(attributeElements).includes(uri)),
84
+ },
85
+ };
86
+ }
87
+ return intersectPositiveWithNegativeAttrFilters(normalizedInsightAttrFilter, attrFilterContext);
88
+ }
89
+ else {
90
+ if (isEmbedNegativeAttributeFilter(attrFilterContext)) {
91
+ return {
92
+ negativeAttributeFilter: {
93
+ displayForm: attrFilterContext.negativeAttributeFilter.displayForm,
94
+ notIn: uniq(elementIds(attributeElements).concat(attrFilterContext.negativeAttributeFilter.notIn)),
95
+ },
96
+ };
97
+ }
98
+ return intersectPositiveWithNegativeAttrFilters2(attrFilterContext, normalizedInsightAttrFilter);
99
+ }
100
+ }
101
+ export function areFiltersWithSameElements(insightAttrFilter, attrFilterContext) {
102
+ const normalizedInsightAttrFilter = normalizeEmptyFilterElements(insightAttrFilter);
103
+ const attributeElements = filterAttributeElements(normalizedInsightAttrFilter);
104
+ if (!isAttributeElementsByRef(attributeElements)) {
105
+ if (isPositiveAttributeFilter(normalizedInsightAttrFilter) &&
106
+ isEmbedPositiveAttributeFilter(attrFilterContext)) {
107
+ return (elementIds(attributeElements).length ===
108
+ attrFilterContext.positiveAttributeFilter.in.length &&
109
+ elementIds(attributeElements).every((identifier) => attrFilterContext.positiveAttributeFilter.in.includes(identifier)));
110
+ }
111
+ else if (isNegativeAttributeFilter(normalizedInsightAttrFilter) &&
112
+ isEmbedNegativeAttributeFilter(attrFilterContext)) {
113
+ return (elementIds(attributeElements).length ===
114
+ attrFilterContext.negativeAttributeFilter.notIn.length &&
115
+ elementIds(attributeElements).every((identifier) => attrFilterContext.negativeAttributeFilter.notIn.includes(identifier)));
116
+ }
117
+ return false;
118
+ }
119
+ if (isPositiveAttributeFilter(normalizedInsightAttrFilter) &&
120
+ isEmbedPositiveAttributeFilter(attrFilterContext)) {
121
+ return (elementIds(attributeElements).length === attrFilterContext.positiveAttributeFilter.in.length &&
122
+ elementIds(attributeElements).every((uri) => attrFilterContext.positiveAttributeFilter.in.includes(uri)));
123
+ }
124
+ else if (isNegativeAttributeFilter(normalizedInsightAttrFilter) &&
125
+ isEmbedNegativeAttributeFilter(attrFilterContext)) {
126
+ return (elementIds(attributeElements).length === attrFilterContext.negativeAttributeFilter.notIn.length &&
127
+ elementIds(attributeElements).every((uri) => attrFilterContext.negativeAttributeFilter.notIn.includes(uri)));
128
+ }
129
+ return false;
130
+ }
131
+ /**
132
+ * Empty attribute filters by value and by uri are same, so we want to sometimes normalize them to uris.
133
+ * If filter is not empty it can't be normalized, so same filter is returned
134
+ * @param filter -
135
+ * @returns empty filter with uri elements or original filter
136
+ */
137
+ function normalizeEmptyFilterElements(filter) {
138
+ const attributeElements = filterAttributeElements(filter);
139
+ if (filterIsEmpty(filter) && isAttributeElementsByValue(attributeElements)) {
140
+ if (isPositiveAttributeFilter(filter) && isObjRef(filter.positiveAttributeFilter.displayForm)) {
141
+ return newPositiveAttributeFilter(filter.positiveAttributeFilter.displayForm, { uris: [] });
142
+ }
143
+ if (isNegativeAttributeFilter(filter) && isObjRef(filter.negativeAttributeFilter.displayForm)) {
144
+ return newNegativeAttributeFilter(filter.negativeAttributeFilter.displayForm, { uris: [] });
145
+ }
146
+ throw new Error("Invariant: expected positive or negative filter");
147
+ }
148
+ return filter;
149
+ }
@@ -0,0 +1,26 @@
1
+ import { type IAnalyticalBackend, type IBackendCapabilities } from "@gooddata/sdk-backend-spi";
2
+ import { type AttributeFilterItem, type DateFilterItem, type IMeasureValueFilter as IEmbeddingMeasureValueFilter } from "@gooddata/sdk-embedding";
3
+ import { type ICatalogAttribute, type IDashboardDateFilter, type IDashboardMeasureValueFilter, type IFilter, type IInsight, type IInsightWidget, type ObjRef } from "@gooddata/sdk-model";
4
+ export type InsightEditorFilterItem = DateFilterItem | AttributeFilterItem | IEmbeddingMeasureValueFilter;
5
+ export interface IInsightEditorFilterContextInput {
6
+ widget: IInsightWidget;
7
+ insight: IInsight;
8
+ appliedFilters: IFilter[];
9
+ availableAttributes: ICatalogAttribute[];
10
+ attributeFilterConfigsDisplayAsLabelMap: Map<string, ObjRef> | undefined;
11
+ capabilities: IBackendCapabilities;
12
+ dateFilter: IDashboardDateFilter | undefined;
13
+ isMeasureValueFilterEnabled: boolean;
14
+ measureValueFilters: IDashboardMeasureValueFilter[];
15
+ }
16
+ /**
17
+ * Builds the filters that the explore flow passes to Analytical Designer, so the explored insight
18
+ * shows the same data as the widget on the dashboard.
19
+ */
20
+ export declare function buildInsightEditorFilterContext(input: IInsightEditorFilterContextInput): InsightEditorFilterItem[];
21
+ /**
22
+ * Loads the attributes that can filter the insight. Dashboard filters on other attributes do not
23
+ * pass to Analytical Designer.
24
+ */
25
+ export declare function loadInsightAvailableAttributes(backend: IAnalyticalBackend, workspace: string, insight: IInsight, enableComputedAttributes: boolean): Promise<ICatalogAttribute[]>;
26
+ //# sourceMappingURL=insightFilterContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insightFilterContext.d.ts","sourceRoot":"","sources":["../../../../src/presentation/insightEditor/filterContext/insightFilterContext.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EACH,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,mBAAmB,IAAI,4BAA4B,EAC3D,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,OAAO,EACZ,KAAK,QAAQ,EAEb,KAAK,cAAc,EACnB,KAAK,MAAM,EAEd,MAAM,qBAAqB,CAAC;AAQ7B,MAAM,MAAM,uBAAuB,GAAG,cAAc,GAAG,mBAAmB,GAAG,4BAA4B,CAAC;AAE1G,MAAM,WAAW,gCAAgC;IAC7C,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,QAAQ,CAAC;IAClB,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;IACzC,uCAAuC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzE,YAAY,EAAE,oBAAoB,CAAC;IACnC,UAAU,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAC7C,2BAA2B,EAAE,OAAO,CAAC;IACrC,mBAAmB,EAAE,4BAA4B,EAAE,CAAC;CACvD;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC3C,KAAK,EAAE,gCAAgC,GACxC,uBAAuB,EAAE,CAoB3B;AAKD;;;GAGG;AACH,wBAAsB,8BAA8B,CAChD,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,QAAQ,EACjB,wBAAwB,EAAE,OAAO,GAClC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAa9B"}
@@ -0,0 +1,72 @@
1
+ // (C) 2020-2026 GoodData Corporation
2
+ import { compact } from "lodash-es";
3
+ import { catalogComputedAttributeAsCatalogAttribute, } from "@gooddata/sdk-model";
4
+ import { isComputedAttributesUnavailableError } from "../../../_staging/catalog/computedAttributes.js";
5
+ import { getAttributeFilterItems } from "./attributeFilters.js";
6
+ import { getDateFilterItems, getWidgetDateFilterItem } from "./dateFilters.js";
7
+ import { filterDashboardMvfsForWidget, toMeasureValueFilterItems } from "./measureValueFilters.js";
8
+ /**
9
+ * Builds the filters that the explore flow passes to Analytical Designer, so the explored insight
10
+ * shows the same data as the widget on the dashboard.
11
+ */
12
+ export function buildInsightEditorFilterContext(input) {
13
+ const { widget, insight, appliedFilters, capabilities } = input;
14
+ const attributeFilters = getAttributeFilterItems(appliedFilters, insight, input.availableAttributes, input.attributeFilterConfigsDisplayAsLabelMap, !!capabilities.supportsElementUris);
15
+ const measureValueFilters = input.isMeasureValueFilterEnabled
16
+ ? toMeasureValueFilterItems(filterDashboardMvfsForWidget(widget, input.measureValueFilters, insight))
17
+ : [];
18
+ const dateFilters = capabilities.supportsMultipleDateFilters
19
+ ? getDateFilterItems(appliedFilters, insight)
20
+ : compact([getWidgetDateFilterItem(widget, input.dateFilter)]);
21
+ return [...dateFilters, ...attributeFilters, ...measureValueFilters];
22
+ }
23
+ // The production dataset needs no ref. Its presence is represented by undefined.
24
+ const PRODUCTION_DATASET_REF = undefined;
25
+ /**
26
+ * Loads the attributes that can filter the insight. Dashboard filters on other attributes do not
27
+ * pass to Analytical Designer.
28
+ */
29
+ export async function loadInsightAvailableAttributes(backend, workspace, insight, enableComputedAttributes) {
30
+ const nonDateDataSetRefs = await getNonDateDataSetRefs(backend, workspace, insight);
31
+ // Computed attributes load separately, so they can never fail a plain attributes request.
32
+ // The listing is skipped when the setting is off: the backend then refuses it (400).
33
+ const loads = [
34
+ ...nonDateDataSetRefs.map((dataSetRef) => loadDataSetAttributes(backend, workspace, dataSetRef, insight)),
35
+ ...(enableComputedAttributes ? [loadComputedAttributes(backend, workspace, insight)] : []),
36
+ ];
37
+ const attributesPerDataSet = await Promise.all(loads);
38
+ return attributesPerDataSet.flat();
39
+ }
40
+ async function getNonDateDataSetRefs(backend, workspace, insight) {
41
+ if (!backend.capabilities.supportsNonProductionDatasets) {
42
+ return [PRODUCTION_DATASET_REF];
43
+ }
44
+ const referencedObjects = await backend
45
+ .workspace(workspace)
46
+ .insights()
47
+ .getInsightReferencedObjects(insight, ["dataSet"]);
48
+ const dataSetMeta = referencedObjects.dataSetMeta ?? [];
49
+ const nonProductionRefs = dataSetMeta.filter((meta) => !meta.production).map((meta) => meta.ref);
50
+ const containsProduction = dataSetMeta.some((meta) => meta.production);
51
+ return containsProduction ? [PRODUCTION_DATASET_REF, ...nonProductionRefs] : nonProductionRefs;
52
+ }
53
+ async function loadDataSetAttributes(backend, workspace, dataSetRef, insight) {
54
+ const loader = backend.workspace(workspace).catalog().forTypes(["attribute"]);
55
+ const catalog = await (dataSetRef ? loader.forDataset(dataSetRef) : loader.withOptions({ production: true })).load();
56
+ const availableItems = await catalog.availableItems().forInsight(insight).load();
57
+ return availableItems.availableAttributes();
58
+ }
59
+ async function loadComputedAttributes(backend, workspace, insight) {
60
+ try {
61
+ const catalog = await backend.workspace(workspace).catalog().forTypes(["computedAttribute"]).load();
62
+ const availableItems = await catalog.availableItems().forInsight(insight).load();
63
+ return availableItems.availableComputedAttributes().map(catalogComputedAttributeAsCatalogAttribute);
64
+ }
65
+ catch (error) {
66
+ // Degrade only when computed attributes are not available. A genuine failure propagates.
67
+ if (isComputedAttributesUnavailableError(error)) {
68
+ return [];
69
+ }
70
+ throw error;
71
+ }
72
+ }
@@ -0,0 +1,20 @@
1
+ import { type IMeasureValueFilter as IEmbeddingMeasureValueFilter } from "@gooddata/sdk-embedding";
2
+ import { type IDashboardMeasureValueFilter, type IInsight, type IInsightWidget } from "@gooddata/sdk-model";
3
+ /**
4
+ * Drops dashboard MVFs the widget is configured to ignore (mirrors `resolveDashboardMeasureValueFilters`
5
+ * in `queryWidgetFilters`) and emits a `console.warn` when the insight already has its own MVF on the
6
+ * same metric. The dashboard MVF is still emitted in the overlap case — both filters apply via logical
7
+ * AND at execution and warning keeps parity with that runtime behavior so the embedding caller can
8
+ * observe the clash without changing semantics.
9
+ */
10
+ export declare function filterDashboardMvfsForWidget(widget: IInsightWidget, dashboardMvfs: IDashboardMeasureValueFilter[], insight: IInsight | undefined): IDashboardMeasureValueFilter[];
11
+ /**
12
+ * Converts dashboard measure value filters to the embedding {@link IEmbeddingMeasureValueFilter}
13
+ * format used by the AD `SetFilterContext` command. The target measure is forwarded as the
14
+ * catalog identifier (Tiger; URI refs are unsupported and such MVFs are skipped). Each filter
15
+ * carries its dashboard `localIdentifier` so AD can disambiguate individual filter instances
16
+ * (currently the dashboard model permits at most one MVF per metric, but `localIdentifier`
17
+ * is part of the contract in preparation for multi-MVF-per-metric support).
18
+ */
19
+ export declare function toMeasureValueFilterItems(dashboardMvfs: IDashboardMeasureValueFilter[]): IEmbeddingMeasureValueFilter[];
20
+ //# sourceMappingURL=measureValueFilters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measureValueFilters.d.ts","sourceRoot":"","sources":["../../../../src/presentation/insightEditor/filterContext/measureValueFilters.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,mBAAmB,IAAI,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,EACH,KAAK,4BAA4B,EACjC,KAAK,QAAQ,EACb,KAAK,cAAc,EAetB,MAAM,qBAAqB,CAAC;AAkB7B;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CACxC,MAAM,EAAE,cAAc,EACtB,aAAa,EAAE,4BAA4B,EAAE,EAC7C,OAAO,EAAE,QAAQ,GAAG,SAAS,GAC9B,4BAA4B,EAAE,CAgChC;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACrC,aAAa,EAAE,4BAA4B,EAAE,GAC9C,4BAA4B,EAAE,CAmBhC"}
@@ -0,0 +1,76 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { areObjRefsEqual, dashboardFilterObjRef, insightFilters, insightMeasures, isDashboardMeasureValueFilterReference, isIdentifierRef, isLocalIdRef, isMeasureValueFilter, measureItem, measureLocalId, measureValueFilterMeasure, objRefToString, } from "@gooddata/sdk-model";
3
+ /**
4
+ * Resolves the metric ObjRef behind an insight MVF's measure reference. Insight MVFs reference
5
+ * their target measure either directly (`ObjRef`) or via a bucket-local id (`LocalIdRef`); the
6
+ * latter must be looked up in the insight's measures and mapped to the catalog `ObjRef` carried
7
+ * on the simple measure definition. Returns `undefined` when the local id does not resolve or
8
+ * the matched measure is non-simple (arithmetic, previous-period, …) and therefore has no LDM
9
+ * item to compare against.
10
+ */
11
+ function resolveInsightMvfMetric(ref, insight) {
12
+ if (!isLocalIdRef(ref)) {
13
+ return ref;
14
+ }
15
+ const matched = insightMeasures(insight).find((m) => measureLocalId(m) === ref.localIdentifier);
16
+ return matched ? measureItem(matched) : undefined;
17
+ }
18
+ /**
19
+ * Drops dashboard MVFs the widget is configured to ignore (mirrors `resolveDashboardMeasureValueFilters`
20
+ * in `queryWidgetFilters`) and emits a `console.warn` when the insight already has its own MVF on the
21
+ * same metric. The dashboard MVF is still emitted in the overlap case — both filters apply via logical
22
+ * AND at execution and warning keeps parity with that runtime behavior so the embedding caller can
23
+ * observe the clash without changing semantics.
24
+ */
25
+ export function filterDashboardMvfsForWidget(widget, dashboardMvfs, insight) {
26
+ const ignoredRefs = widget.ignoreDashboardFilters?.filter(isDashboardMeasureValueFilterReference) ?? [];
27
+ const widgetEffective = ignoredRefs.length === 0
28
+ ? dashboardMvfs
29
+ : dashboardMvfs.filter((mvf) => !ignoredRefs.some((ref) => areObjRefsEqual(ref.measure, dashboardFilterObjRef(mvf))));
30
+ // Insight MVFs may reference their measure by LocalIdRef (bucket-local) — resolve those to the
31
+ // catalog ObjRef via the insight's measures so we can compare against dashboard MVFs (which
32
+ // always reference the catalog metric directly).
33
+ const insightMvfMetrics = insight
34
+ ? insightFilters(insight)
35
+ .filter(isMeasureValueFilter)
36
+ .map((f) => resolveInsightMvfMetric(measureValueFilterMeasure(f), insight))
37
+ .filter((ref) => ref !== undefined)
38
+ : [];
39
+ if (insightMvfMetrics.length > 0) {
40
+ widgetEffective.forEach((mvf) => {
41
+ const dashMeasure = dashboardFilterObjRef(mvf);
42
+ if (insightMvfMetrics.some((m) => areObjRefsEqual(m, dashMeasure))) {
43
+ console.warn(`Dashboard MVF on metric ${objRefToString(dashMeasure)} overlaps with an insight-level MVF on the same metric; both will be transferred to AD and applied together.`);
44
+ }
45
+ });
46
+ }
47
+ return widgetEffective;
48
+ }
49
+ /**
50
+ * Converts dashboard measure value filters to the embedding {@link IEmbeddingMeasureValueFilter}
51
+ * format used by the AD `SetFilterContext` command. The target measure is forwarded as the
52
+ * catalog identifier (Tiger; URI refs are unsupported and such MVFs are skipped). Each filter
53
+ * carries its dashboard `localIdentifier` so AD can disambiguate individual filter instances
54
+ * (currently the dashboard model permits at most one MVF per metric, but `localIdentifier`
55
+ * is part of the contract in preparation for multi-MVF-per-metric support).
56
+ */
57
+ export function toMeasureValueFilterItems(dashboardMvfs) {
58
+ if (!dashboardMvfs.length) {
59
+ return [];
60
+ }
61
+ return dashboardMvfs.flatMap((mvf) => {
62
+ const { measure, localIdentifier, conditions } = mvf.dashboardMeasureValueFilter;
63
+ if (!isIdentifierRef(measure)) {
64
+ return [];
65
+ }
66
+ return [
67
+ {
68
+ measureValueFilter: {
69
+ measure: { identifier: measure.identifier },
70
+ localIdentifier,
71
+ ...(conditions && conditions.length > 0 ? { conditions } : {}),
72
+ },
73
+ },
74
+ ];
75
+ });
76
+ }
@@ -0,0 +1,11 @@
1
+ import { type IObjIdentifierQualifier } from "@gooddata/sdk-embedding";
2
+ import { type ObjRef } from "@gooddata/sdk-model";
3
+ /**
4
+ * Converts a model ref to the identifier qualifier of the embedding API.
5
+ *
6
+ * The ref type is kept: it is the only thing telling a computed attribute reference from a label
7
+ * reference (a computed attribute has no labels and is referenced directly), so dropping it would make
8
+ * a filter on a computed attribute indistinguishable from a filter on a label of the same identifier.
9
+ */
10
+ export declare function toObjIdentifierQualifier(ref: ObjRef): IObjIdentifierQualifier;
11
+ //# sourceMappingURL=objQualifiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objQualifiers.d.ts","sourceRoot":"","sources":["../../../../src/presentation/insightEditor/filterContext/objQualifiers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,KAAK,MAAM,EAAmB,MAAM,qBAAqB,CAAC;AAEnE;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAQ7E"}
@@ -0,0 +1,18 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { isIdentifierRef } from "@gooddata/sdk-model";
3
+ /**
4
+ * Converts a model ref to the identifier qualifier of the embedding API.
5
+ *
6
+ * The ref type is kept: it is the only thing telling a computed attribute reference from a label
7
+ * reference (a computed attribute has no labels and is referenced directly), so dropping it would make
8
+ * a filter on a computed attribute indistinguishable from a filter on a label of the same identifier.
9
+ */
10
+ export function toObjIdentifierQualifier(ref) {
11
+ if (isIdentifierRef(ref)) {
12
+ return {
13
+ identifier: ref.identifier,
14
+ ...(ref.type ? { type: ref.type } : {}),
15
+ };
16
+ }
17
+ throw new Error("Expected identifier ref");
18
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Tells whether the insight overlay is the TOPMOST open ui-kit overlay in the document.
3
+ *
4
+ * With AD running in-process, its nested UI (filter dropdowns, save dialogs, tooltips) portals
5
+ * into the same document as this overlay. Every ui-kit Overlay with closeOnEscape listens on
6
+ * window with no stack awareness, so a single Escape aimed at a nested AD dropdown would also
7
+ * cancel the whole editing session (the iframe transport used to shield this — AD key events
8
+ * never left the iframe document). That is why the insight overlay handles Escape itself, gated
9
+ * by this check.
10
+ *
11
+ * Overlay portals append to document.body in mount order, so the last .gd-overlay-content node is
12
+ * the topmost overlay; the insight overlay may only close itself when that node is its own.
13
+ * Nested overlays unmount asynchronously (React re-render), so during the very Escape press that
14
+ * closes a nested overlay this still sees its node and correctly skips — Escape peels one layer
15
+ * per press.
16
+ */
17
+ export declare function isInsightOverlayTopmost(doc?: Document): boolean;
18
+ //# sourceMappingURL=insightEditorEscapeGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insightEditorEscapeGuard.d.ts","sourceRoot":"","sources":["../../../src/presentation/insightEditor/insightEditorEscapeGuard.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,QAAmB,GAAG,OAAO,CAIzE"}
@@ -0,0 +1,24 @@
1
+ // (C) 2026 GoodData Corporation
2
+ const OVERLAY_CONTENT_SELECTOR = ".gd-overlay-content";
3
+ const INSIGHT_OVERLAY_CONTENT_SELECTOR = ".s-edit-insight-overlay-content";
4
+ /**
5
+ * Tells whether the insight overlay is the TOPMOST open ui-kit overlay in the document.
6
+ *
7
+ * With AD running in-process, its nested UI (filter dropdowns, save dialogs, tooltips) portals
8
+ * into the same document as this overlay. Every ui-kit Overlay with closeOnEscape listens on
9
+ * window with no stack awareness, so a single Escape aimed at a nested AD dropdown would also
10
+ * cancel the whole editing session (the iframe transport used to shield this — AD key events
11
+ * never left the iframe document). That is why the insight overlay handles Escape itself, gated
12
+ * by this check.
13
+ *
14
+ * Overlay portals append to document.body in mount order, so the last .gd-overlay-content node is
15
+ * the topmost overlay; the insight overlay may only close itself when that node is its own.
16
+ * Nested overlays unmount asynchronously (React re-render), so during the very Escape press that
17
+ * closes a nested overlay this still sees its node and correctly skips — Escape peels one layer
18
+ * per press.
19
+ */
20
+ export function isInsightOverlayTopmost(doc = document) {
21
+ const contents = doc.querySelectorAll(OVERLAY_CONTENT_SELECTOR);
22
+ const topmost = contents[contents.length - 1];
23
+ return !!topmost?.querySelector(INSIGHT_OVERLAY_CONTENT_SELECTOR);
24
+ }
@@ -0,0 +1,34 @@
1
+ import { type ObjRef } from "@gooddata/sdk-model";
2
+ import { type InsightEditorTarget } from "../../model/types/insightEditorTypes.js";
3
+ type HiddenAction = "open" | "clear" | "export" | "save" | "saveAs" | "openInAnalyticalDesigner";
4
+ export interface IInsightEditorRouteInput {
5
+ target: InsightEditorTarget;
6
+ /**
7
+ * The insight of the widget target. Undefined for the other targets, or when the widget has no
8
+ * insight.
9
+ */
10
+ widgetInsightRef: ObjRef | undefined;
11
+ isWidgetInsightLocked: boolean;
12
+ dashboardId: string | undefined;
13
+ isEditMode: boolean;
14
+ isEmbedded: boolean;
15
+ canManageWorkspace: boolean;
16
+ canCreateVisualization: boolean;
17
+ }
18
+ /**
19
+ * The part of the Analytical Designer props that selects the flow: edit, explore or create.
20
+ */
21
+ export interface IInsightEditorRoute {
22
+ insight: ObjRef | undefined;
23
+ config: {
24
+ isEmbedded: boolean;
25
+ hiddenActions: HiddenAction[];
26
+ displayedActions?: Array<"cancel">;
27
+ sourceDashboard?: string;
28
+ sourceInsight?: ObjRef;
29
+ allowDashboardLinks?: boolean;
30
+ };
31
+ }
32
+ export declare function getInsightEditorRoute(input: IInsightEditorRouteInput): IInsightEditorRoute;
33
+ export {};
34
+ //# sourceMappingURL=insightEditorRoute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insightEditorRoute.d.ts","sourceRoot":"","sources":["../../../src/presentation/insightEditor/insightEditorRoute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAEnF,KAAK,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,0BAA0B,CAAC;AAEjG,MAAM,WAAW,wBAAwB;IACrC,MAAM,EAAE,mBAAmB,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,MAAM,EAAE;QACJ,UAAU,EAAE,OAAO,CAAC;QACpB,aAAa,EAAE,YAAY,EAAE,CAAC;QAC9B,gBAAgB,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;KACjC,CAAC;CACL;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,GAAG,mBAAmB,CAiD1F"}