@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
@@ -1,16 +1,16 @@
1
1
  // (C) 2021-2026 GoodData Corporation
2
2
  import { toNumber } from "lodash-es";
3
- import { call, put, select } from "redux-saga/effects";
3
+ import { call, select } from "redux-saga/effects";
4
4
  import { newAbsoluteDashboardDateFilter, newAllTimeDashboardDateFilter, newRelativeDashboardDateFilter, } from "@gooddata/sdk-model";
5
5
  import { dateFilterChanged } from "../../../events/filters.js";
6
6
  import { invalidArgumentsProvided } from "../../../events/general.js";
7
7
  import { dispatchDashboardEvent } from "../../../store/_infra/eventDispatcher.js";
8
8
  import { selectIsApplyFiltersAllAtOnceEnabledAndSet } from "../../../store/config/configSelectors.js";
9
9
  import { selectIsCrossFiltering } from "../../../store/drill/drillSelectors.js";
10
- import { selectEnablePersistentFiltersAcrossTabs } from "../../../store/meta/metaSelectors.js";
11
10
  import { selectFilterContextDateFilter, selectFilterContextDateFilterByDataSet, } from "../../../store/tabs/filterContext/filterContextSelectors.js";
12
11
  import { tabsActions } from "../../../store/tabs/index.js";
13
- import { canApplyDateFilter, captureFilterContextByTabSnapshot, dispatchFilterContextChanged, dispatchFilterContextChangedForMutatedTabs, resetCrossFiltering, } from "../common.js";
12
+ import { canApplyDateFilter, resetCrossFiltering } from "../common.js";
13
+ import { beginTabSync, endTabSync, putTabSynced } from "../tabSync/tabSyncSaga.js";
14
14
  export function* changeDateFilterSelectionHandler(ctx, cmd) {
15
15
  const isAllTime = cmd.payload.type === "relative" &&
16
16
  cmd.payload.granularity === "GDC.time.date" &&
@@ -20,38 +20,37 @@ export function* changeDateFilterSelectionHandler(ctx, cmd) {
20
20
  if (!canApply) {
21
21
  throw invalidArgumentsProvided(ctx, cmd, `Cannot apply a date filter that is invalid by the current dateFilterConfig.`);
22
22
  }
23
- const filterContextSnapshot = yield call(captureFilterContextByTabSnapshot);
24
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
23
+ const session = yield call(beginTabSync);
25
24
  const isApplyAllAtOnceEnabledAndSet = yield select(selectIsApplyFiltersAllAtOnceEnabledAndSet);
26
25
  const isWorkingSelectionChange = cmd.payload.isWorkingSelectionChange && isApplyAllAtOnceEnabledAndSet;
27
26
  const localIdentifierObj = cmd.payload.localIdentifier
28
27
  ? { localIdentifier: cmd.payload.localIdentifier }
29
28
  : {};
30
- yield put(tabsActions.upsertDateFilter(isAllTime
31
- ? {
32
- type: "allTime",
33
- dataSet: cmd.payload.dataSet,
34
- isWorkingSelectionChange,
35
- enablePersistentFiltersAcrossTabs,
36
- ...localIdentifierObj,
37
- ...(cmd.payload.emptyValueHandling
38
- ? { emptyValueHandling: cmd.payload.emptyValueHandling }
39
- : {}),
40
- }
41
- : {
42
- type: cmd.payload.type,
43
- granularity: cmd.payload.granularity,
44
- from: cmd.payload.from,
45
- to: cmd.payload.to,
46
- dataSet: cmd.payload.dataSet,
47
- isWorkingSelectionChange,
48
- enablePersistentFiltersAcrossTabs,
49
- ...localIdentifierObj,
50
- ...(cmd.payload.boundedFilter ? { boundedFilter: cmd.payload.boundedFilter } : {}),
51
- ...(cmd.payload.emptyValueHandling
52
- ? { emptyValueHandling: cmd.payload.emptyValueHandling }
53
- : {}),
54
- }));
29
+ yield call(putTabSynced, session, [
30
+ tabsActions.upsertDateFilter(isAllTime
31
+ ? {
32
+ type: "allTime",
33
+ dataSet: cmd.payload.dataSet,
34
+ isWorkingSelectionChange,
35
+ ...localIdentifierObj,
36
+ ...(cmd.payload.emptyValueHandling
37
+ ? { emptyValueHandling: cmd.payload.emptyValueHandling }
38
+ : {}),
39
+ }
40
+ : {
41
+ type: cmd.payload.type,
42
+ granularity: cmd.payload.granularity,
43
+ from: cmd.payload.from,
44
+ to: cmd.payload.to,
45
+ dataSet: cmd.payload.dataSet,
46
+ isWorkingSelectionChange,
47
+ ...localIdentifierObj,
48
+ ...(cmd.payload.boundedFilter ? { boundedFilter: cmd.payload.boundedFilter } : {}),
49
+ ...(cmd.payload.emptyValueHandling
50
+ ? { emptyValueHandling: cmd.payload.emptyValueHandling }
51
+ : {}),
52
+ }),
53
+ ]);
55
54
  if (!isWorkingSelectionChange) {
56
55
  const isCrossFiltering = yield select(selectIsCrossFiltering);
57
56
  if (isCrossFiltering) {
@@ -62,12 +61,7 @@ export function* changeDateFilterSelectionHandler(ctx, cmd) {
62
61
  ? yield select(selectFilterContextDateFilterByDataSet(cmd.payload.dataSet))
63
62
  : yield select(selectFilterContextDateFilter);
64
63
  yield dispatchDashboardEvent(dateFilterChanged(ctx, affectedFilter, cmd.payload.dateFilterOptionLocalId, cmd.correlationId));
65
- if (enablePersistentFiltersAcrossTabs) {
66
- yield call(dispatchFilterContextChangedForMutatedTabs, ctx, cmd, filterContextSnapshot);
67
- }
68
- else {
69
- yield call(dispatchFilterContextChanged, ctx, cmd);
70
- }
64
+ yield call(endTabSync, ctx, cmd, session);
71
65
  }
72
66
  function dateFilterSelectionToDateFilter(dateFilterSelection) {
73
67
  if (dateFilterSelection.type === "absolute" && dateFilterSelection.from && dateFilterSelection.to) {
@@ -1,9 +1,19 @@
1
1
  import { type SagaIterator } from "redux-saga";
2
2
  import { type IApplyFilterView, type IDeleteFilterView, type ISaveFilterView, type ISetFilterViewAsDefault } from "../../commands/filters.js";
3
+ import { type ISwitchDashboardTab } from "../../commands/tabs.js";
3
4
  import { type DashboardContext } from "../../types/commonTypes.js";
4
5
  export declare function saveFilterViewHandler(ctx: DashboardContext, cmd: ISaveFilterView): SagaIterator<void>;
5
6
  export declare function deleteFilterViewHandler(ctx: DashboardContext, cmd: IDeleteFilterView): SagaIterator<void>;
6
7
  export declare function applyFilterViewHandler(ctx: DashboardContext, cmd: IApplyFilterView): SagaIterator<void>;
8
+ /**
9
+ * While filters persist across tabs, the dashboard opens with the default view of its active tab as
10
+ * the shared state. Every other tab applies its own default view, to all tabs, on its first visit in
11
+ * the session. Later visits keep the shared state. A drill to the tab sets the shared state itself, so
12
+ * it counts as the first visit without applying the view.
13
+ *
14
+ * @internal
15
+ */
16
+ export declare function applyDefaultFilterViewOnFirstTabVisit(ctx: DashboardContext, cmd: ISwitchDashboardTab, tabLocalIdentifier: string): SagaIterator<void>;
7
17
  export declare function setFilterViewAsDefaultHandler(ctx: DashboardContext, cmd: ISetFilterViewAsDefault): SagaIterator<void>;
8
18
  export declare function reloadFilterViewsHandler(ctx: DashboardContext): SagaIterator<void>;
9
19
  //# sourceMappingURL=filterViewHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterViewHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/filterContext/filterViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAc/C,OAAO,EACH,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAE/B,MAAM,2BAA2B,CAAC;AA4BnC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAenE,wBAAiB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAqEtG;AAMD,wBAAiB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAAC,IAAI,CAAC,CAsB1G;AAOD,wBAAiB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAkDxG;AAMD,wBAAiB,6BAA6B,CAC1C,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,uBAAuB,GAC7B,YAAY,CAAC,IAAI,CAAC,CAuBpB;AAED,wBAAiB,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAcnF"}
1
+ {"version":3,"file":"filterViewHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/filterContext/filterViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAe/C,OAAO,EACH,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAE/B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAoClE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAiBnE,wBAAiB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAqEtG;AAMD,wBAAiB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,CAAC,IAAI,CAAC,CAsB1G;AAOD,wBAAiB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAYxG;AA6DD;;;;;;;GAOG;AACH,wBAAiB,qCAAqC,CAClD,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,mBAAmB,EACxB,kBAAkB,EAAE,MAAM,GAC3B,YAAY,CAAC,IAAI,CAAC,CAyCpB;AAMD,wBAAiB,6BAA6B,CAC1C,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,uBAAuB,GAC7B,YAAY,CAAC,IAAI,CAAC,CAuBpB;AAED,wBAAiB,wBAAwB,CAAC,GAAG,EAAE,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,CAcnF"}
@@ -8,16 +8,20 @@ import { filterViewApplicationFailed, filterViewApplicationSucceeded, filterView
8
8
  import { selectCatalogParameters } from "../../store/catalog/catalogSelectors.js";
9
9
  import { selectIsApplyFiltersAllAtOnceEnabledAndSet } from "../../store/config/configSelectors.js";
10
10
  import { selectCrossFilteringFiltersLocalIdentifiers } from "../../store/drill/drillSelectors.js";
11
- import { selectFilterViews } from "../../store/filterViews/filterViewsReducersSelectors.js";
11
+ import { selectDashboardFilterViews, selectDefaultFilterViewAppliedTabs, selectFilterViews, } from "../../store/filterViews/filterViewsReducersSelectors.js";
12
12
  import { filterViewsActions } from "../../store/filterViews/index.js";
13
+ import { selectEnablePersistentFiltersAcrossTabs } from "../../store/meta/metaSelectors.js";
14
+ import { selectIsInEditMode } from "../../store/renderMode/renderModeSelectors.js";
13
15
  import { selectAttributeFilterConfigsOverrides } from "../../store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
14
16
  import { selectFilterContextDefinition, selectWorkingFilterContextDefinition, } from "../../store/tabs/filterContext/filterContextSelectors.js";
15
17
  import { tabsActions } from "../../store/tabs/index.js";
16
18
  import { selectDashboardParameterEntries, selectFilterViewDisplayParameters, } from "../../store/tabs/parameters/parametersSelectors.js";
17
- import { selectActiveTabLocalIdentifier } from "../../store/tabs/tabsSelectors.js";
19
+ import { selectActiveTabLocalIdentifier, selectFirstTabLocalIdentifier, } from "../../store/tabs/tabsSelectors.js";
20
+ import { findTabDefaultFilterView } from "../dashboard/common/filterViews.js";
18
21
  import { resolveParameterValuesForFilterView } from "../dashboard/common/parameterHydration.js";
19
22
  import { loadFilterViews } from "../dashboard/initializeDashboardHandler/loadFilterViews.js";
20
23
  import { changeParameterValuesHandler } from "../parameters/changeParameterValuesHandler.js";
24
+ import { changeFilterContextSelectionHandler } from "./changeFilterContextSelectionHandler.js";
21
25
  import { resetCrossFiltering } from "./common.js";
22
26
  function createFilterView(ctx, filterView) {
23
27
  return ctx.backend.workspace(ctx.workspace).dashboards().createFilterView(filterView);
@@ -93,35 +97,86 @@ function* findFilterView(ref) {
93
97
  }
94
98
  export function* applyFilterViewHandler(ctx, cmd) {
95
99
  const filterView = yield call(findFilterView, cmd.payload.ref);
96
- const attributeFilterConfigs = yield select(selectAttributeFilterConfigsOverrides);
97
100
  if (filterView) {
98
- yield call(resetCrossFiltering, cmd);
99
- const isApplyAllAtOnceEnabledAndSet = yield select(selectIsApplyFiltersAllAtOnceEnabledAndSet);
100
- if (isApplyAllAtOnceEnabledAndSet) {
101
- yield put(tabsActions.resetWorkingSelection());
102
- }
103
- yield put(changeFilterContextSelectionByParams({
104
- filters: filterView.filterContext.filters,
105
- attributeFilterConfigs,
106
- resetOthers: true,
107
- correlationId: cmd.correlationId,
108
- // a filter view snapshots this dashboard's own filter context, so its localIdentifiers
109
- // are authoritative; display form matching alone cannot tell apart filters that share
110
- // a display form
111
- matchByLocalIdentifier: true,
112
- }));
113
- const parameterEntries = yield select(selectDashboardParameterEntries);
114
- const workspaceParameters = yield select(selectCatalogParameters);
115
- yield call(changeParameterValuesHandler, ctx, changeParameterValues({
116
- parameters: resolveParameterValuesForFilterView(parameterEntries, filterView.parameters ?? [], workspaceParameters),
117
- correlationId: cmd.correlationId,
118
- }));
101
+ yield call(applyFilterViewSelection, ctx, cmd, filterView);
119
102
  yield put(filterViewApplicationSucceeded(ctx, filterView, cmd.correlationId));
120
103
  }
121
104
  else {
122
105
  yield put(filterViewApplicationFailed(ctx));
123
106
  }
124
107
  }
108
+ /**
109
+ * Applies the filters and parameters of `filterView` to the active tab. While filters persist across
110
+ * tabs, the filter and parameter handlers mirror the values to every other tab, so the view sets the
111
+ * shared state.
112
+ */
113
+ function* applyFilterViewSelection(ctx, cmd, filterView, options) {
114
+ const attributeFilterConfigs = yield select(selectAttributeFilterConfigsOverrides);
115
+ yield call(resetCrossFiltering, cmd);
116
+ const isApplyAllAtOnceEnabledAndSet = yield select(selectIsApplyFiltersAllAtOnceEnabledAndSet);
117
+ if (isApplyAllAtOnceEnabledAndSet) {
118
+ yield put(tabsActions.resetWorkingSelection());
119
+ }
120
+ const parameterEntries = yield select(selectDashboardParameterEntries);
121
+ const workspaceParameters = yield select(selectCatalogParameters);
122
+ yield call(changeParameterValuesHandler, ctx, changeParameterValues({
123
+ parameters: resolveParameterValuesForFilterView(parameterEntries, filterView.parameters ?? [], workspaceParameters),
124
+ correlationId: cmd.correlationId,
125
+ adoptAsOriginal: options?.adoptAsOriginal,
126
+ }));
127
+ // inline, so the view is applied before the caller continues: a queued command would run after
128
+ // the caller's own filter changes (e.g. automation filters after a tab switch) and overwrite them
129
+ yield call(changeFilterContextSelectionHandler, ctx, changeFilterContextSelectionByParams({
130
+ filters: filterView.filterContext.filters,
131
+ attributeFilterConfigs,
132
+ resetOthers: true,
133
+ correlationId: cmd.correlationId,
134
+ // a default view initializes the shared state, so the applied values are what a reset restores
135
+ adoptAsOriginal: options?.adoptAsOriginal,
136
+ // a filter view snapshots this dashboard's own filter context, so its localIdentifiers
137
+ // are authoritative; display form matching alone cannot tell apart filters that share
138
+ // a display form
139
+ matchByLocalIdentifier: true,
140
+ }));
141
+ }
142
+ /**
143
+ * While filters persist across tabs, the dashboard opens with the default view of its active tab as
144
+ * the shared state. Every other tab applies its own default view, to all tabs, on its first visit in
145
+ * the session. Later visits keep the shared state. A drill to the tab sets the shared state itself, so
146
+ * it counts as the first visit without applying the view.
147
+ *
148
+ * @internal
149
+ */
150
+ export function* applyDefaultFilterViewOnFirstTabVisit(ctx, cmd, tabLocalIdentifier) {
151
+ const persistFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
152
+ // edit mode starts from the saved filters, same as on load
153
+ const isInEditMode = yield select(selectIsInEditMode);
154
+ if (!persistFiltersAcrossTabs || isInEditMode) {
155
+ return;
156
+ }
157
+ const appliedTabs = yield select(selectDefaultFilterViewAppliedTabs);
158
+ if (appliedTabs.includes(tabLocalIdentifier)) {
159
+ return;
160
+ }
161
+ if (cmd.payload.source === "drillToSelf") {
162
+ yield put(filterViewsActions.markDefaultFilterViewApplied(tabLocalIdentifier));
163
+ return;
164
+ }
165
+ const filterViews = yield select(selectDashboardFilterViews);
166
+ const firstTabLocalIdentifier = yield select(selectFirstTabLocalIdentifier);
167
+ const defaultFilterView = findTabDefaultFilterView(filterViews, tabLocalIdentifier, tabLocalIdentifier === firstTabLocalIdentifier);
168
+ // A failed view must not fail the caller (the tab is already switched, a save already persisted).
169
+ // The tab stays unmarked, so its next visit retries the view.
170
+ try {
171
+ if (defaultFilterView) {
172
+ yield call(applyFilterViewSelection, ctx, cmd, defaultFilterView, { adoptAsOriginal: true });
173
+ }
174
+ yield put(filterViewsActions.markDefaultFilterViewApplied(tabLocalIdentifier));
175
+ }
176
+ catch (error) {
177
+ defaultErrorHandler(error);
178
+ }
179
+ }
125
180
  function setFilterViewAsDefault(ctx, ref, isDefault) {
126
181
  return ctx.backend.workspace(ctx.workspace).dashboards().setFilterViewAsDefault(ref, isDefault);
127
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"changeMeasureValueFilterConditionHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterConditionHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EAAE,KAAK,kCAAkC,EAAE,MAAM,8BAA8B,CAAC;AAUvF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAQtE,wBAAiB,wCAAwC,CACrD,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,kCAAkC,GACxC,YAAY,CAAC,IAAI,CAAC,CAmDpB"}
1
+ {"version":3,"file":"changeMeasureValueFilterConditionHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterConditionHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EAAE,KAAK,kCAAkC,EAAE,MAAM,8BAA8B,CAAC;AASvF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,wBAAiB,wCAAwC,CACrD,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,kCAAkC,GACxC,YAAY,CAAC,IAAI,CAAC,CA2CpB"}
@@ -1,37 +1,31 @@
1
1
  // (C) 2026 GoodData Corporation
2
- import { call, put, select } from "redux-saga/effects";
2
+ import { call, select } from "redux-saga/effects";
3
3
  import { invariant } from "ts-invariant";
4
4
  import { measureValueFilterConditionChanged } from "../../../events/filters.js";
5
5
  import { invalidArgumentsProvided } from "../../../events/general.js";
6
6
  import { dispatchDashboardEvent } from "../../../store/_infra/eventDispatcher.js";
7
- import { selectEnablePersistentFiltersAcrossTabs } from "../../../store/meta/metaSelectors.js";
8
7
  import { selectFilterContextMeasureValueFilterByLocalId, selectWorkingFilterContextMeasureValueFilterByLocalId, } from "../../../store/tabs/filterContext/filterContextSelectors.js";
9
8
  import { tabsActions } from "../../../store/tabs/index.js";
10
- import { captureFilterContextByTabSnapshot, dispatchFilterContextChanged, dispatchFilterContextChangedForMutatedTabs, } from "../common.js";
9
+ import { beginTabSync, endTabSync, putTabSynced } from "../tabSync/tabSyncSaga.js";
11
10
  export function* changeMeasureValueFilterConditionHandler(ctx, cmd) {
12
11
  const { localIdentifier, conditions, isWorkingSelectionChange } = cmd.payload;
13
12
  const existingFilter = yield select(selectFilterContextMeasureValueFilterByLocalId(localIdentifier));
14
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
15
- const filterContextSnapshot = yield call(captureFilterContextByTabSnapshot);
13
+ const session = yield call(beginTabSync);
16
14
  if (!existingFilter) {
17
15
  throw invalidArgumentsProvided(ctx, cmd, `Attempting to change condition of measure value filter ${localIdentifier} that does not exist on the dashboard.`);
18
16
  }
19
- yield put(tabsActions.changeMeasureValueFilterCondition({
20
- localIdentifier,
21
- conditions,
22
- ...(isWorkingSelectionChange === undefined ? {} : { isWorkingSelectionChange }),
23
- enablePersistentFiltersAcrossTabs,
24
- }));
17
+ yield call(putTabSynced, session, [
18
+ tabsActions.changeMeasureValueFilterCondition({
19
+ localIdentifier,
20
+ conditions,
21
+ ...(isWorkingSelectionChange === undefined ? {} : { isWorkingSelectionChange }),
22
+ }),
23
+ ]);
25
24
  const updatedFilterSelector = isWorkingSelectionChange
26
25
  ? selectWorkingFilterContextMeasureValueFilterByLocalId(localIdentifier)
27
26
  : selectFilterContextMeasureValueFilterByLocalId(localIdentifier);
28
27
  const updatedFilter = yield select(updatedFilterSelector);
29
28
  invariant(updatedFilter, "Inconsistent state in changeMeasureValueFilterConditionHandler");
30
29
  yield dispatchDashboardEvent(measureValueFilterConditionChanged(ctx, localIdentifier, updatedFilter, conditions, cmd.correlationId));
31
- if (enablePersistentFiltersAcrossTabs) {
32
- yield call(dispatchFilterContextChangedForMutatedTabs, ctx, cmd, filterContextSnapshot);
33
- }
34
- else {
35
- yield call(dispatchFilterContextChanged, ctx, cmd);
36
- }
30
+ yield call(endTabSync, ctx, cmd, session);
37
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"changeMeasureValueFilterDimensionalityHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterDimensionalityHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EAAE,KAAK,oCAAoC,EAAE,MAAM,8BAA8B,CAAC;AAOzF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,wBAAiB,6CAA6C,CAC1D,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,oCAAoC,GAC1C,YAAY,CAAC,IAAI,CAAC,CAwCpB"}
1
+ {"version":3,"file":"changeMeasureValueFilterDimensionalityHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/measureValueFilter/changeMeasureValueFilterDimensionalityHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EAAE,KAAK,oCAAoC,EAAE,MAAM,8BAA8B,CAAC;AAMzF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGtE,wBAAiB,6CAA6C,CAC1D,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,oCAAoC,GAC1C,YAAY,CAAC,IAAI,CAAC,CAmCpB"}
@@ -1,27 +1,24 @@
1
1
  // (C) 2026 GoodData Corporation
2
- import { call, put, select } from "redux-saga/effects";
2
+ import { call, select } from "redux-saga/effects";
3
3
  import { invariant } from "ts-invariant";
4
4
  import { measureValueFilterDimensionalityChanged } from "../../../events/filters.js";
5
5
  import { invalidArgumentsProvided } from "../../../events/general.js";
6
6
  import { dispatchDashboardEvent } from "../../../store/_infra/eventDispatcher.js";
7
- import { selectEnablePersistentFiltersAcrossTabs } from "../../../store/meta/metaSelectors.js";
8
7
  import { selectFilterContextMeasureValueFilterByLocalId } from "../../../store/tabs/filterContext/filterContextSelectors.js";
9
8
  import { tabsActions } from "../../../store/tabs/index.js";
10
- import { dispatchFilterContextChanged } from "../common.js";
9
+ import { beginTabSync, endTabSync, putTabSynced } from "../tabSync/tabSyncSaga.js";
11
10
  export function* changeMeasureValueFilterDimensionalityHandler(ctx, cmd) {
12
11
  const { localIdentifier, dimensionality } = cmd.payload;
13
12
  const existingFilter = yield select(selectFilterContextMeasureValueFilterByLocalId(localIdentifier));
14
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
13
+ const session = yield call(beginTabSync);
15
14
  if (!existingFilter) {
16
15
  throw invalidArgumentsProvided(ctx, cmd, `Attempting to change dimensionality of measure value filter ${localIdentifier} that does not exist on the dashboard.`);
17
16
  }
18
- yield put(tabsActions.setMeasureValueFilterDimensionality({
19
- localIdentifier,
20
- dimensionality,
21
- enablePersistentFiltersAcrossTabs,
22
- }));
17
+ yield call(putTabSynced, session, [
18
+ tabsActions.setMeasureValueFilterDimensionality({ localIdentifier, dimensionality }),
19
+ ]);
23
20
  const updatedFilter = yield select(selectFilterContextMeasureValueFilterByLocalId(localIdentifier));
24
21
  invariant(updatedFilter, "Inconsistent state in changeMeasureValueFilterDimensionalityHandler");
25
22
  yield dispatchDashboardEvent(measureValueFilterDimensionalityChanged(ctx, localIdentifier, updatedFilter, dimensionality, cmd.correlationId));
26
- yield call(dispatchFilterContextChanged, ctx, cmd);
23
+ yield call(endTabSync, ctx, cmd, session);
27
24
  }
@@ -0,0 +1,15 @@
1
+ import { type Action } from "@reduxjs/toolkit";
2
+ import { type ITabsState } from "../../../store/tabs/tabsState.js";
3
+ import { type ITabSyncScope } from "./tabSyncScope.js";
4
+ /**
5
+ * Returns `actions` followed, after each one, by its copies for the other tabs.
6
+ *
7
+ * Every action is planned against the state that the preceding actions and their copies produce,
8
+ * so e.g. removing an ignore-list entry after removing the filter sees which tabs still use it.
9
+ * Actions with a sync rule but without a tab are addressed to the scope source tab, so that they
10
+ * are applied to the tab they are planned for. Nothing is mirrored when the scope is disabled.
11
+ *
12
+ * @internal
13
+ */
14
+ export declare function expandActionsForTabSync(state: ITabsState, actions: readonly Action[], scope: ITabSyncScope): Action[];
15
+ //# sourceMappingURL=expandActionsForTabSync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expandActionsForTabSync.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/tabSync/expandActionsForTabSync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAsB,MAAM,kBAAkB,CAAC;AAInE,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,kCAAkC,CAAC;AAGnF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACnC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,KAAK,EAAE,aAAa,GACrB,MAAM,EAAE,CAiBV"}
@@ -0,0 +1,88 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { BATCH } from "redux-batched-actions";
3
+ import { tabsActions, tabsSliceReducer } from "../../../store/tabs/index.js";
4
+ import { getTabOrActive } from "../../../store/tabs/tabsState.js";
5
+ import { tabSyncRules } from "./tabSyncRules.js";
6
+ /**
7
+ * Returns `actions` followed, after each one, by its copies for the other tabs.
8
+ *
9
+ * Every action is planned against the state that the preceding actions and their copies produce,
10
+ * so e.g. removing an ignore-list entry after removing the filter sees which tabs still use it.
11
+ * Actions with a sync rule but without a tab are addressed to the scope source tab, so that they
12
+ * are applied to the tab they are planned for. Nothing is mirrored when the scope is disabled.
13
+ *
14
+ * @internal
15
+ */
16
+ export function expandActionsForTabSync(state, actions, scope) {
17
+ const sourceActions = actions
18
+ .flatMap(unbatched)
19
+ .map((action) => addressedToSourceTab(action, scope.sourceTabLocalIdentifier));
20
+ if (!scope.enabled) {
21
+ return sourceActions;
22
+ }
23
+ const result = [];
24
+ let current = state;
25
+ for (const action of sourceActions) {
26
+ const after = tabsSliceReducer(current, action);
27
+ const mirrored = mirrorAction(current, after, action, scope);
28
+ result.push(action, ...mirrored);
29
+ current = mirrored.reduce(tabsSliceReducer, after);
30
+ }
31
+ return result;
32
+ }
33
+ function mirrorAction(state, after, action, scope) {
34
+ const rule = tabSyncRules.get(action.type);
35
+ if (!rule) {
36
+ return [];
37
+ }
38
+ const payload = action.payload;
39
+ const sourceTabLocalIdentifier = payload?.tabLocalIdentifier ?? scope.sourceTabLocalIdentifier;
40
+ const source = getTabOrActive(state, sourceTabLocalIdentifier);
41
+ const sourceAfter = getTabOrActive(after, sourceTabLocalIdentifier);
42
+ if (!source || !sourceAfter) {
43
+ return [];
44
+ }
45
+ const ctx = { scope, state, source, sourceAfter };
46
+ return (state.tabs ?? []).flatMap((target) => {
47
+ if (target.localIdentifier === source.localIdentifier) {
48
+ return [];
49
+ }
50
+ return rule(payload, target, ctx).map((targetAction) => ({
51
+ ...targetAction,
52
+ payload: { ...targetAction.payload, tabLocalIdentifier: target.localIdentifier },
53
+ }));
54
+ });
55
+ }
56
+ /**
57
+ * Reducers of actions without a tab apply them to the active tab, which is not the source tab
58
+ * when a handler works on another tab.
59
+ */
60
+ function addressedToSourceTab(action, sourceTabLocalIdentifier) {
61
+ if (!sourceTabLocalIdentifier || !tabSyncRules.has(action.type)) {
62
+ return action;
63
+ }
64
+ if (tabsActions.addAttributeFilterDisplayForm.match(action)) {
65
+ const { payload } = action;
66
+ return "displayForm" in payload
67
+ ? tabsActions.addAttributeFilterDisplayForm({
68
+ ...payload,
69
+ tabLocalIdentifier: payload.tabLocalIdentifier ?? sourceTabLocalIdentifier,
70
+ })
71
+ : tabsActions.addAttributeFilterDisplayForm({
72
+ displayForm: payload,
73
+ tabLocalIdentifier: sourceTabLocalIdentifier,
74
+ });
75
+ }
76
+ const payload = action.payload;
77
+ if (payload?.tabLocalIdentifier) {
78
+ return action;
79
+ }
80
+ return { ...action, payload: { ...payload, tabLocalIdentifier: sourceTabLocalIdentifier } };
81
+ }
82
+ /**
83
+ * The tabs slice reducer ignores batch actions, which the store unpacks, so planning
84
+ * works on their inner actions.
85
+ */
86
+ function unbatched(action) {
87
+ return action.type === BATCH ? action.payload.flatMap(unbatched) : [action];
88
+ }
@@ -0,0 +1,11 @@
1
+ import { type TabSyncActionsRule } from "./tabSyncScope.js";
2
+ type AnyTabSyncRule = TabSyncActionsRule<any>;
3
+ /**
4
+ * Tabs slice actions that are mirrored to other tabs when filters persist across tabs, keyed by action type.
5
+ * Actions without a rule apply to their own tab only, which includes every filter configuration change.
6
+ *
7
+ * @internal
8
+ */
9
+ export declare const tabSyncRules: ReadonlyMap<string, AnyTabSyncRule>;
10
+ export {};
11
+ //# sourceMappingURL=tabSyncRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabSyncRules.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/tabSync/tabSyncRules.ts"],"names":[],"mappings":"AAoCA,OAAO,EAA4B,KAAK,kBAAkB,EAAoB,MAAM,mBAAmB,CAAC;AAExG,KAAK,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;AAuZ9C;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAG3D,CAAC"}