@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,15 +1,15 @@
1
1
  // (C) 2021-2026 GoodData Corporation
2
- import { all, 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 { attributeFilterSelectionChanged } from "../../../events/filters.js";
5
5
  import { invalidArgumentsProvided } from "../../../events/general.js";
6
6
  import { dispatchDashboardEvent } from "../../../store/_infra/eventDispatcher.js";
7
7
  import { selectEnableImmediateAttributeFilterDisplayAsLabelMigration, selectIsApplyFiltersAllAtOnceEnabledAndSet, } from "../../../store/config/configSelectors.js";
8
- import { selectCrossFilteringFiltersLocalIdentifiersByTab, selectIsCrossFiltering, selectIsFilterFromCrossFilteringByLocalIdentifier, } from "../../../store/drill/drillSelectors.js";
9
- import { selectEnablePersistentFiltersAcrossTabs } from "../../../store/meta/metaSelectors.js";
8
+ import { selectIsCrossFiltering, selectIsFilterFromCrossFilteringByLocalIdentifier, } from "../../../store/drill/drillSelectors.js";
10
9
  import { selectAttributeFilterDescendants, selectFilterContextAttributeFilterByLocalId, } from "../../../store/tabs/filterContext/filterContextSelectors.js";
11
10
  import { tabsActions } from "../../../store/tabs/index.js";
12
- import { captureFilterContextByTabSnapshot, dispatchFilterContextChanged, dispatchFilterContextChangedForMutatedTabs, resetCrossFiltering, } from "../common.js";
11
+ import { resetCrossFiltering } from "../common.js";
12
+ import { beginTabSync, endTabSync, putTabSynced } from "../tabSync/tabSyncSaga.js";
13
13
  export function* changeAttributeFilterSelectionHandler(ctx, cmd) {
14
14
  const { elements, filterLocalId, selectionType, isWorkingSelectionChange, isResultOfMigration, isSelectionInvalid, } = cmd.payload;
15
15
  // validate filterLocalId
@@ -19,34 +19,30 @@ export function* changeAttributeFilterSelectionHandler(ctx, cmd) {
19
19
  }
20
20
  const isApplyAllAtOnceEnabledAndSet = yield select(selectIsApplyFiltersAllAtOnceEnabledAndSet);
21
21
  const enableImmediateAttributeFilterDisplayAsLabelMigration = yield select(selectEnableImmediateAttributeFilterDisplayAsLabelMigration);
22
- const crossFilteringLocalIdsByTab = yield select(selectCrossFilteringFiltersLocalIdentifiersByTab);
23
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
24
- const filterContextSnapshot = yield call(captureFilterContextByTabSnapshot);
25
- yield put(tabsActions.updateAttributeFilterSelection({
26
- elements,
27
- filterLocalId,
28
- negativeSelection: selectionType === "NOT_IN",
29
- isWorkingSelectionChange: isWorkingSelectionChange && isApplyAllAtOnceEnabledAndSet,
30
- enableImmediateAttributeFilterDisplayAsLabelMigration,
31
- isResultOfMigration,
32
- isSelectionInvalid,
33
- crossFilteringLocalIdsByTab,
34
- enablePersistentFiltersAcrossTabs,
35
- }));
22
+ const session = yield call(beginTabSync, { enabled: !isResultOfMigration });
23
+ yield call(putTabSynced, session, [
24
+ tabsActions.updateAttributeFilterSelection({
25
+ elements,
26
+ filterLocalId,
27
+ negativeSelection: selectionType === "NOT_IN",
28
+ isWorkingSelectionChange: isWorkingSelectionChange && isApplyAllAtOnceEnabledAndSet,
29
+ enableImmediateAttributeFilterDisplayAsLabelMigration,
30
+ isResultOfMigration,
31
+ isSelectionInvalid,
32
+ }),
33
+ ]);
36
34
  const changedFilter = yield select(selectFilterContextAttributeFilterByLocalId(cmd.payload.filterLocalId));
37
35
  invariant(changedFilter, "Inconsistent state in attributeFilterChangeSelectionCommandHandler");
38
36
  if (!ctx.backend.capabilities.supportsKeepingDependentFiltersSelection) {
39
37
  const childFiltersIds = yield select(selectAttributeFilterDescendants(changedFilter.attributeFilter.localIdentifier));
40
- yield all(childFiltersIds.map((childFilterId) => put(tabsActions.updateAttributeFilterSelection({
38
+ yield call(putTabSynced, session, childFiltersIds.map((childFilterId) => tabsActions.updateAttributeFilterSelection({
41
39
  filterLocalId: childFilterId,
42
40
  elements: {
43
41
  uris: [],
44
42
  },
45
43
  negativeSelection: true,
46
44
  isWorkingSelectionChange: isWorkingSelectionChange && isApplyAllAtOnceEnabledAndSet,
47
- crossFilteringLocalIdsByTab,
48
- enablePersistentFiltersAcrossTabs,
49
- }))));
45
+ })));
50
46
  }
51
47
  const isCrossFiltering = yield select(selectIsCrossFiltering);
52
48
  const isCurrentFilterCrossFiltering = yield select(selectIsFilterFromCrossFilteringByLocalIdentifier(filterLocalId));
@@ -56,10 +52,5 @@ export function* changeAttributeFilterSelectionHandler(ctx, cmd) {
56
52
  yield call(resetCrossFiltering, cmd);
57
53
  }
58
54
  yield dispatchDashboardEvent(attributeFilterSelectionChanged(ctx, changedFilter, cmd.correlationId));
59
- if (enablePersistentFiltersAcrossTabs) {
60
- yield call(dispatchFilterContextChangedForMutatedTabs, ctx, cmd, filterContextSnapshot);
61
- }
62
- else {
63
- yield call(dispatchFilterContextChanged, ctx, cmd);
64
- }
55
+ yield call(endTabSync, ctx, cmd, session);
65
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"removeAttributeFiltersHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/attributeFilter/removeAttributeFiltersHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAW/C,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAO5E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,wBAAiB,6BAA6B,CAC1C,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,uBAAuB,GAC7B,YAAY,CAAC,IAAI,CAAC,CAoFpB"}
1
+ {"version":3,"file":"removeAttributeFiltersHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/attributeFilter/removeAttributeFiltersHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAW/C,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAO5E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,wBAAiB,6BAA6B,CAC1C,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,uBAAuB,GAC7B,YAAY,CAAC,IAAI,CAAC,CAmFpB"}
@@ -1,5 +1,5 @@
1
1
  // (C) 2021-2026 GoodData Corporation
2
- import { compact, difference, partition } from "lodash-es";
2
+ import { difference, partition } from "lodash-es";
3
3
  import { batchActions } from "redux-batched-actions";
4
4
  import { call, put, select } from "redux-saga/effects";
5
5
  import { areObjRefsEqual, dashboardAttributeFilterItemDisplayForm, dashboardAttributeFilterItemFilterElementsBy, dashboardAttributeFilterItemLocalIdentifier, isInsightWidget, } from "@gooddata/sdk-model";
@@ -39,7 +39,7 @@ export function* removeAttributeFiltersHandler(ctx, cmd) {
39
39
  displayFormRefs: [removedDisplayForm],
40
40
  }),
41
41
  ];
42
- const batch = batchActions(compact([
42
+ yield put(batchActions([
43
43
  // remove filter from parents for all affected children (standard and arbitrary filters)
44
44
  ...affectedChildren.map((item) => tabsActions.setAttributeFilterParents({
45
45
  filterLocalId: dashboardAttributeFilterItemLocalIdentifier(item),
@@ -51,13 +51,12 @@ export function* removeAttributeFiltersHandler(ctx, cmd) {
51
51
  filterLocalId: removedLocalId,
52
52
  }),
53
53
  // remove filter's display form metadata object
54
- tabsActions.removeAttributeFilterDisplayForms(removedDisplayForm),
54
+ tabsActions.removeAttributeFilterDisplayForms({ displayForm: removedDisplayForm }),
55
55
  // remove reflect dashboard attribute filter config
56
- tabsActions.removeAttributeFilterConfig(removedLocalId),
56
+ tabsActions.removeAttributeFilterConfig({ localIdentifier: removedLocalId }),
57
57
  // house-keeping: ensure the removed attribute filter disappears from widget ignore lists
58
58
  ...removeIgnoredAttributeFilterActionArray,
59
59
  ]));
60
- yield put(batch);
61
60
  yield dispatchDashboardEvent(attributeFilterRemoved(ctx, removedFilter, affectedChildren, cmd.correlationId));
62
61
  }
63
62
  yield call(dispatchFilterContextChanged, ctx, cmd);
@@ -1 +1 @@
1
- {"version":3,"file":"replaceAttributeFilterItemSelectionHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/attributeFilter/replaceAttributeFilterItemSelectionHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,OAAO,EAAE,KAAK,mCAAmC,EAAE,MAAM,8BAA8B,CAAC;AAaxF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAKtE,wBAAiB,0CAA0C,CACvD,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,mCAAmC,GACzC,YAAY,CAAC,IAAI,CAAC,CA0DpB"}
1
+ {"version":3,"file":"replaceAttributeFilterItemSelectionHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/attributeFilter/replaceAttributeFilterItemSelectionHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,OAAO,EAAE,KAAK,mCAAmC,EAAE,MAAM,8BAA8B,CAAC;AAWxF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAMtE,wBAAiB,0CAA0C,CACvD,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,mCAAmC,GACzC,YAAY,CAAC,IAAI,CAAC,CAqDpB"}
@@ -1,15 +1,15 @@
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 { dashboardAttributeFilterItemDisplayForm } from "@gooddata/sdk-model";
4
4
  import { attributeFilterItemSelectionReplaced } from "../../../events/filters.js";
5
5
  import { invalidArgumentsProvided } from "../../../events/general.js";
6
6
  import { dispatchDashboardEvent } from "../../../store/_infra/eventDispatcher.js";
7
7
  import { selectIsApplyFiltersAllAtOnceEnabledAndSet } from "../../../store/config/configSelectors.js";
8
- import { selectCrossFilteringFiltersLocalIdentifiersByTab, selectIsCrossFiltering, selectIsFilterFromCrossFilteringByLocalIdentifier, } from "../../../store/drill/drillSelectors.js";
9
- import { selectEnablePersistentFiltersAcrossTabs } from "../../../store/meta/metaSelectors.js";
8
+ import { selectIsCrossFiltering, selectIsFilterFromCrossFilteringByLocalIdentifier, } from "../../../store/drill/drillSelectors.js";
10
9
  import { selectFilterContextAttributeFilterItemByLocalId } from "../../../store/tabs/filterContext/filterContextSelectors.js";
11
10
  import { tabsActions } from "../../../store/tabs/index.js";
12
- import { dispatchFilterContextChanged, resetCrossFiltering } from "../common.js";
11
+ import { resetCrossFiltering } from "../common.js";
12
+ import { beginTabSync, endTabSync, putTabSynced } from "../tabSync/tabSyncSaga.js";
13
13
  import { resolveAndRegisterDisplayFormMetadata } from "./resolveDisplayFormMetadata.js";
14
14
  export function* replaceAttributeFilterItemSelectionHandler(ctx, cmd) {
15
15
  const { filterLocalId, filter, isWorkingSelectionChange, isSelectionInvalid } = cmd.payload;
@@ -19,16 +19,15 @@ export function* replaceAttributeFilterItemSelectionHandler(ctx, cmd) {
19
19
  throw invalidArgumentsProvided(ctx, cmd, `Filter with filterLocalId ${filterLocalId} not found.`);
20
20
  }
21
21
  const isApplyAllAtOnceEnabledAndSet = yield select(selectIsApplyFiltersAllAtOnceEnabledAndSet);
22
- const crossFilteringLocalIdsByTab = yield select(selectCrossFilteringFiltersLocalIdentifiersByTab);
23
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
24
- yield put(tabsActions.replaceAttributeFilterItem({
25
- filterLocalId,
26
- filter,
27
- isWorkingSelectionChange: isWorkingSelectionChange && isApplyAllAtOnceEnabledAndSet,
28
- isSelectionInvalid,
29
- crossFilteringLocalIdsByTab,
30
- enablePersistentFiltersAcrossTabs,
31
- }));
22
+ const session = yield call(beginTabSync);
23
+ yield call(putTabSynced, session, [
24
+ tabsActions.replaceAttributeFilterItem({
25
+ filterLocalId,
26
+ filter,
27
+ isWorkingSelectionChange: isWorkingSelectionChange && isApplyAllAtOnceEnabledAndSet,
28
+ isSelectionInvalid,
29
+ }),
30
+ ]);
32
31
  // Ensure the new filter's displayForm is registered in the displayFormsMap.
33
32
  // This is needed for cross-type migration (e.g. text→list) where the new filter's
34
33
  // displayForm (primary label) may not have been registered previously.
@@ -46,5 +45,5 @@ export function* replaceAttributeFilterItemSelectionHandler(ctx, cmd) {
46
45
  (!isWorkingSelectionChange || !isApplyAllAtOnceEnabledAndSet)) {
47
46
  yield call(resetCrossFiltering, cmd);
48
47
  }
49
- yield call(dispatchFilterContextChanged, ctx, cmd);
48
+ yield call(endTabSync, ctx, cmd, session);
50
49
  }
@@ -1,10 +1,13 @@
1
1
  import { type SagaIterator } from "redux-saga";
2
2
  import { type IAttributeDisplayFormMetadataObject, type ObjRef } from "@gooddata/sdk-model";
3
+ import { type ITabSyncSession } from "../tabSync/tabSyncSaga.js";
3
4
  /**
4
5
  * Resolves display form metadata for the given ObjRef and registers it in the store
5
6
  * so that selectors like selectAttributeFilterDisplayFormsMap can resolve it.
6
7
  *
8
+ * With a tab sync `session`, the display form is registered on the synced tabs too.
9
+ *
7
10
  * @returns the resolved display form metadata, or undefined if not found
8
11
  */
9
- export declare function resolveAndRegisterDisplayFormMetadata(displayForm: ObjRef): SagaIterator<IAttributeDisplayFormMetadataObject | undefined>;
12
+ export declare function resolveAndRegisterDisplayFormMetadata(displayForm: ObjRef, session?: ITabSyncSession): SagaIterator<IAttributeDisplayFormMetadataObject | undefined>;
10
13
  //# sourceMappingURL=resolveDisplayFormMetadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveDisplayFormMetadata.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/attributeFilter/resolveDisplayFormMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EACH,KAAK,mCAAmC,EAExC,KAAK,MAAM,EACd,MAAM,qBAAqB,CAAC;AAQ7B;;;;;GAKG;AACH,wBAAiB,qCAAqC,CAClD,WAAW,EAAE,MAAM,GACpB,YAAY,CAAC,mCAAmC,GAAG,SAAS,CAAC,CAoB/D"}
1
+ {"version":3,"file":"resolveDisplayFormMetadata.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/attributeFilter/resolveDisplayFormMetadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EACH,KAAK,mCAAmC,EAExC,KAAK,MAAM,EACd,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,KAAK,eAAe,EAAgB,MAAM,2BAA2B,CAAC;AAE/E;;;;;;;GAOG;AACH,wBAAiB,qCAAqC,CAClD,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,eAAe,GAC1B,YAAY,CAAC,mCAAmC,GAAG,SAAS,CAAC,CAyB/D"}
@@ -5,13 +5,16 @@ import { queryAttributeByDisplayForm } from "../../../queries/attributes.js";
5
5
  import { query } from "../../../store/_infra/queryCall.js";
6
6
  import { selectAllCatalogDisplayFormsMap } from "../../../store/catalog/catalogSelectors.js";
7
7
  import { tabsActions } from "../../../store/tabs/index.js";
8
+ import { putTabSynced } from "../tabSync/tabSyncSaga.js";
8
9
  /**
9
10
  * Resolves display form metadata for the given ObjRef and registers it in the store
10
11
  * so that selectors like selectAttributeFilterDisplayFormsMap can resolve it.
11
12
  *
13
+ * With a tab sync `session`, the display form is registered on the synced tabs too.
14
+ *
12
15
  * @returns the resolved display form metadata, or undefined if not found
13
16
  */
14
- export function* resolveAndRegisterDisplayFormMetadata(displayForm) {
17
+ export function* resolveAndRegisterDisplayFormMetadata(displayForm, session) {
15
18
  const catalogDisplayFormsMap = yield select(selectAllCatalogDisplayFormsMap);
16
19
  let displayFormData = catalogDisplayFormsMap.get(displayForm);
17
20
  if (!displayFormData) {
@@ -20,7 +23,13 @@ export function* resolveAndRegisterDisplayFormMetadata(displayForm) {
20
23
  displayFormData = attributeDisplayFormsMap.get(displayForm);
21
24
  }
22
25
  if (displayFormData) {
23
- yield put(tabsActions.addAttributeFilterDisplayForm(displayFormData));
26
+ const action = tabsActions.addAttributeFilterDisplayForm(displayFormData);
27
+ if (session) {
28
+ yield call(putTabSynced, session, [action]);
29
+ }
30
+ else {
31
+ yield put(action);
32
+ }
24
33
  }
25
34
  return displayFormData;
26
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"changeFilterContextSelectionHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/filterContext/changeFilterContextSelectionHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAyC/C,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAyC9E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAyNnE,wBAAiB,mCAAmC,CAChD,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,4BAA4B,GAClC,YAAY,CAAC,IAAI,CAAC,CA4OpB"}
1
+ {"version":3,"file":"changeFilterContextSelectionHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/filterContext/changeFilterContextSelectionHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAyC/C,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAuC9E,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAiOnE,wBAAiB,mCAAmC,CAChD,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,4BAA4B,GAClC,YAAY,CAAC,IAAI,CAAC,CA4OpB"}
@@ -1,16 +1,13 @@
1
1
  // (C) 2021-2026 GoodData Corporation
2
2
  import { compact, partition, uniqBy } from "lodash-es";
3
- import { batchActions } from "redux-batched-actions";
4
3
  import { all, call, put, select } from "redux-saga/effects";
5
4
  import { NotSupported } from "@gooddata/sdk-backend-spi";
6
5
  import { areObjRefsEqual, attributeElementsIsEmpty, dashboardAttributeFilterItemDisplayForm, dashboardAttributeFilterItemFilterElementsBy, dashboardAttributeFilterItemFilterElementsByDate, dashboardAttributeFilterItemLocalIdentifier, dashboardAttributeFilterItemValidateElementsBy, dashboardFilterLocalIdentifier, dashboardFilterObjRef, dashboardMeasureValueFilterLocalIdentifier, getAttributeElementsItems, isAllTimeDashboardDateFilter, isDashboardArbitraryAttributeFilter, isDashboardAttributeFilter, isDashboardAttributeFilterItem, isDashboardCommonDateFilter, isDashboardDateFilter, isDashboardMeasureValueFilter, isDashboardTextAttributeFilter, isSingleSelectionFilter, isUriRef, objRefToString, serializeObjRef, updateAttributeElementsItems, } from "@gooddata/sdk-model";
7
6
  import { dashboardFilterToFilterContextItem } from "../../../_staging/dashboard/dashboardFilterContext.js";
8
7
  import { invalidArgumentsProvided } from "../../events/general.js";
9
8
  import { dispatchDashboardEvent } from "../../store/_infra/eventDispatcher.js";
10
- import { selectCrossFilteringFiltersLocalIdentifiersByTab } from "../../store/drill/drillSelectors.js";
11
9
  import { selectRestrictedDashboardFilterLocalIdentifiers, selectRestrictedDashboardFilterLocalIdentifiersForTab, } from "../../store/filtering/dashboardFilterSelectors.js";
12
10
  import { isDashboardFilterUsingRestrictedObject } from "../../store/filtering/restrictedFilterUtils.js";
13
- import { selectEnablePersistentFiltersAcrossTabs } from "../../store/meta/metaSelectors.js";
14
11
  import { selectAttributeFilterConfigsOverrides, selectAttributeFilterConfigsOverridesByTab, selectAttributeFilterConfigsSelectionTypeMap, selectAttributeFilterConfigsSelectionTypeMapByTab, } from "../../store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
15
12
  import { isDisplayFormRefOf, selectAttributeFilterDisplayFormsMap, selectFilterContextAttributeFilterItems, selectFilterContextAttributeFilterItemsForTab, selectFilterContextDateFilterByDataSet, selectFilterContextDateFilterByDataSetForTab, selectFilterContextDateFiltersWithDimension, selectFilterContextDateFiltersWithDimensionForTab, selectFilterContextFilters, selectFilterContextMeasureValueFilters, selectFiltersForTab, } from "../../store/tabs/filterContext/filterContextSelectors.js";
16
13
  import { tabsActions } from "../../store/tabs/index.js";
@@ -21,7 +18,9 @@ import { resolveAttributeMetadata } from "../../utils/attributeResolver.js";
21
18
  import { resolveDisplayFormMetadata, } from "../../utils/displayFormResolver.js";
22
19
  import { resolveAndRegisterDisplayFormMetadata } from "./attributeFilter/resolveDisplayFormMetadata.js";
23
20
  import { computedAttributesDisabledMessage, findDisabledComputedAttributeRef, } from "./attributeFilter/validation/computedAttributesEnabledValidation.js";
24
- import { canApplyDateFilter, captureFilterContextByTabSnapshot, dispatchFilterContextChanged, dispatchFilterContextChangedForMutatedTabs, } from "./common.js";
21
+ import { canApplyDateFilter } from "./common.js";
22
+ import { beginTabSync, endTabSync, putTabSynced } from "./tabSync/tabSyncSaga.js";
23
+ import { writtenFiltersOf } from "./tabSync/writtenTargets.js";
25
24
  function classifyRestore(type, restoresOriginal) {
26
25
  // A computed key is not inferred as a single-property mapped type.
27
26
  return { [type]: restoresOriginal };
@@ -34,8 +33,8 @@ const RESTORE_TARGET_ORIGINAL = {
34
33
  ...classifyRestore(tabsActions.changeMeasureValueFilterCondition.type, true),
35
34
  ...classifyRestore(tabsActions.setMeasureValueFilterDimensionality.type, true),
36
35
  ...classifyRestore(tabsActions.addAttributeFilterDisplayForm.type, false),
37
- ...classifyRestore(tabsActions.changeAttributeDisplayForm.type, false),
38
- ...classifyRestore(tabsActions.changeDisplayAsLabel.type, false),
36
+ ...classifyRestore(tabsActions.changeAttributeDisplayForm.type, true),
37
+ ...classifyRestore(tabsActions.changeDisplayAsLabel.type, true),
39
38
  };
40
39
  /**
41
40
  * Reset persists one payload (the active tab's saved values). Mark the value-writing actions so
@@ -108,6 +107,13 @@ function* selectFilterContextDateFiltersWithDimensionTabAware(tabLocalIdentifier
108
107
  ? yield select(selectFilterContextDateFiltersWithDimensionForTab(tabLocalIdentifier))
109
108
  : yield select(selectFilterContextDateFiltersWithDimension);
110
109
  }
110
+ function* selectFilterContextMeasureValueFiltersTabAware(tabLocalIdentifier) {
111
+ if (tabLocalIdentifier) {
112
+ const filters = yield select(selectFiltersForTab(tabLocalIdentifier));
113
+ return filters.filter(isDashboardMeasureValueFilter);
114
+ }
115
+ return yield select(selectFilterContextMeasureValueFilters);
116
+ }
111
117
  function* selectAttributeFilterConfigsSelectionTypeMapTabAware(tabLocalIdentifier) {
112
118
  if (tabLocalIdentifier) {
113
119
  const byTab = yield select(selectAttributeFilterConfigsSelectionTypeMapByTab);
@@ -116,7 +122,7 @@ function* selectAttributeFilterConfigsSelectionTypeMapTabAware(tabLocalIdentifie
116
122
  return yield select(selectAttributeFilterConfigsSelectionTypeMap);
117
123
  }
118
124
  export function* changeFilterContextSelectionHandler(ctx, cmd) {
119
- const { filters, resetOthers, attributeFilterConfigs = [], tabLocalIdentifier, matchByLocalIdentifier = false, restorePerTabOriginals = false, } = cmd.payload;
125
+ const { filters, resetOthers, attributeFilterConfigs = [], tabLocalIdentifier, matchByLocalIdentifier = false, restorePerTabOriginals = false, adoptAsOriginal = false, } = cmd.payload;
120
126
  // Validate that the target tab exists if tabLocalIdentifier is provided
121
127
  if (tabLocalIdentifier) {
122
128
  const tabs = yield select(selectTabs);
@@ -214,10 +220,9 @@ export function* changeFilterContextSelectionHandler(ctx, cmd) {
214
220
  call(getAttributeFiltersUpdateActions, [...attributeFilters].reverse(), textAttributeFilters, attributeFilterConfigs, resetOthers, ctx, tabLocalIdentifier, selectionTypeMap, matchByLocalIdentifier),
215
221
  call(getDateFilterUpdateActions, commonDateFilter, resetOthers, tabLocalIdentifier),
216
222
  call(getDateFiltersUpdateActions, dateFiltersWithDimension, resetOthers, tabLocalIdentifier),
217
- call(getMeasureValueFiltersUpdateActions, measureValueFilters, resetOthers),
223
+ call(getMeasureValueFiltersUpdateActions, measureValueFilters, resetOthers, tabLocalIdentifier),
218
224
  ]);
219
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
220
- const filterContextSnapshot = yield call(captureFilterContextByTabSnapshot);
225
+ const session = yield call(beginTabSync, { tabLocalIdentifier });
221
226
  // Ensure display form metadata is loaded for filters that will actually be applied.
222
227
  // This handles the case where a default saved view changed filter types (e.g., list→text)
223
228
  // and then local storage restores original types whose display forms weren't loaded during init.
@@ -229,17 +234,17 @@ export function* changeFilterContextSelectionHandler(ctx, cmd) {
229
234
  }
230
235
  }
231
236
  }
232
- yield put(batchActions(markRestoreTargetOriginal([
237
+ const dispatchedActions = yield call(putTabSynced, session, markRestoreTargetOriginal([
233
238
  ...attributeFilterResult.actions,
234
239
  ...commonDateFilterUpdateActions,
235
240
  ...dateFiltersUpdateActions,
236
241
  ...measureValueFilterUpdateActions,
237
- ], restorePerTabOriginals)));
238
- if (enablePersistentFiltersAcrossTabs) {
239
- yield call(dispatchFilterContextChangedForMutatedTabs, ctx, cmd, filterContextSnapshot);
240
- }
241
- else {
242
- yield call(dispatchFilterContextChanged, ctx, cmd, tabLocalIdentifier);
242
+ ], restorePerTabOriginals));
243
+ yield call(endTabSync, ctx, cmd, session, tabLocalIdentifier);
244
+ // A default filter view initializes the shared state. The values it wrote are that initial state,
245
+ // on this tab and on every tab they were synced to, so a reset restores them.
246
+ if (adoptAsOriginal) {
247
+ yield put(tabsActions.adoptAppliedFiltersAsOriginal(writtenFiltersOf(dispatchedActions)));
243
248
  }
244
249
  }
245
250
  function* getDashboardFilterByAttributeMatching(filterRef, resolvedDisplayForms, ctx, tabLocalIdentifier, isFilterExcluded, areDisplayFormsEquivalent = areObjRefsEqual) {
@@ -326,9 +331,7 @@ function* getAttributeFiltersUpdateActions(attributeFilters, textAttributeFilter
326
331
  const updateActions = [];
327
332
  const displayFormsToResolve = [];
328
333
  const handledLocalIds = new Set();
329
- const crossFilteringLocalIdsByTab = yield select(selectCrossFilteringFiltersLocalIdentifiersByTab);
330
334
  const resolvedDisplayForms = yield call(resolveDisplayFormMetadata, ctx, attributeFilters.map((af) => dashboardAttributeFilterItemDisplayForm(af)));
331
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
332
335
  // A payload can give a display form as a URI ref, and the dashboard can store it as an
333
336
  // identifier ref. The two refs are equal when they point to the same display form metadata.
334
337
  const displayFormsMap = yield select(selectAttributeFilterDisplayFormsMap);
@@ -483,8 +486,6 @@ function* getAttributeFiltersUpdateActions(attributeFilters, textAttributeFilter
483
486
  updateActions.push(tabsActions.updateAttributeFilterSelection({
484
487
  ...getAttributeFilterSelectionPayload(attributeFilter, dashboardFilter),
485
488
  tabLocalIdentifier,
486
- crossFilteringLocalIdsByTab,
487
- enablePersistentFiltersAcrossTabs,
488
489
  }));
489
490
  handledLocalIds.add(dashboardFilterLocalId);
490
491
  }
@@ -529,8 +530,6 @@ function* getAttributeFiltersUpdateActions(attributeFilters, textAttributeFilter
529
530
  filterLocalId: targetLocalId,
530
531
  filter: normalizedListFilter,
531
532
  tabLocalIdentifier,
532
- crossFilteringLocalIdsByTab,
533
- enablePersistentFiltersAcrossTabs,
534
533
  }), tabsActions.changeDisplayAsLabel({
535
534
  localIdentifier: targetLocalId,
536
535
  displayAsLabel: dashboardAttributeFilterItemDisplayForm(targetTextFilter),
@@ -588,8 +587,6 @@ function* getAttributeFiltersUpdateActions(attributeFilters, textAttributeFilter
588
587
  filterLocalId: targetLocalId,
589
588
  filter: normalizedTextFilter,
590
589
  tabLocalIdentifier,
591
- crossFilteringLocalIdsByTab,
592
- enablePersistentFiltersAcrossTabs,
593
590
  }));
594
591
  const textDisplayForm = dashboardAttributeFilterItemDisplayForm(textFilter);
595
592
  // List → text: update displayAsLabel to match the text filter's displayForm
@@ -613,8 +610,6 @@ function* getAttributeFiltersUpdateActions(attributeFilters, textAttributeFilter
613
610
  updateActions.push(tabsActions.clearAttributeFiltersSelection({
614
611
  filterLocalIds: unhandledFilters.map((filter) => dashboardAttributeFilterItemLocalIdentifier(filter)),
615
612
  tabLocalIdentifier,
616
- crossFilteringLocalIdsByTab,
617
- enablePersistentFiltersAcrossTabs,
618
613
  }));
619
614
  }
620
615
  // for text filters (arbitrary/match) that have not been handled, reset to All state
@@ -639,15 +634,12 @@ function* getAttributeFiltersUpdateActions(attributeFilters, textAttributeFilter
639
634
  filterLocalId: localId,
640
635
  filter: resetFilter,
641
636
  tabLocalIdentifier,
642
- crossFilteringLocalIdsByTab,
643
- enablePersistentFiltersAcrossTabs,
644
637
  }));
645
638
  }
646
639
  }
647
640
  return { actions: updateActions, displayFormsToResolve };
648
641
  }
649
642
  function* getDateFilterUpdateActions(dateFilter, resetOthers, tabLocalIdentifier) {
650
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
651
643
  if (dateFilter) {
652
644
  const canApply = yield call(canApplyDateFilter, dateFilter);
653
645
  if (!canApply) {
@@ -666,7 +658,6 @@ function* getDateFilterUpdateActions(dateFilter, resetOthers, tabLocalIdentifier
666
658
  ...localIdentifierObj,
667
659
  ...emptyValueHandlingObj,
668
660
  tabLocalIdentifier,
669
- enablePersistentFiltersAcrossTabs,
670
661
  }
671
662
  : {
672
663
  type: dateFilter.dateFilter.type,
@@ -680,7 +671,6 @@ function* getDateFilterUpdateActions(dateFilter, resetOthers, tabLocalIdentifier
680
671
  : {}),
681
672
  ...emptyValueHandlingObj,
682
673
  tabLocalIdentifier,
683
- enablePersistentFiltersAcrossTabs,
684
674
  };
685
675
  return [tabsActions.upsertDateFilter(upsertPayload)];
686
676
  }
@@ -689,21 +679,19 @@ function* getDateFilterUpdateActions(dateFilter, resetOthers, tabLocalIdentifier
689
679
  tabsActions.upsertDateFilter({
690
680
  type: "allTime",
691
681
  tabLocalIdentifier,
692
- enablePersistentFiltersAcrossTabs,
693
682
  }),
694
683
  ];
695
684
  }
696
685
  return [];
697
686
  }
698
- function* getMeasureValueFiltersUpdateActions(measureValueFilters, resetOthers) {
687
+ function* getMeasureValueFiltersUpdateActions(measureValueFilters, resetOthers, tabLocalIdentifier) {
699
688
  const updateActions = [];
700
689
  const handledLocalIds = new Set();
701
690
  // a restricted filter keeps its stored conditions: it is neither matched nor reset
702
- const allMeasureValueFilters = yield select(selectFilterContextMeasureValueFilters);
703
- const restrictedLocalIdentifiers = yield select(selectRestrictedDashboardFilterLocalIdentifiers);
691
+ const allMeasureValueFilters = yield call(selectFilterContextMeasureValueFiltersTabAware, tabLocalIdentifier);
692
+ const restrictedLocalIdentifiers = yield call(selectRestrictedDashboardFilterLocalIdentifiersTabAware, tabLocalIdentifier);
704
693
  const currentMeasureValueFilters = allMeasureValueFilters.filter((filter) => !restrictedLocalIdentifiers.has(dashboardMeasureValueFilterLocalIdentifier(filter)));
705
694
  const currentByLocalId = new Map(currentMeasureValueFilters.map((f) => [dashboardMeasureValueFilterLocalIdentifier(f), f]));
706
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
707
695
  for (const incoming of measureValueFilters) {
708
696
  const incomingLocalIdentifier = dashboardMeasureValueFilterLocalIdentifier(incoming);
709
697
  const currentFilter = currentByLocalId.get(incomingLocalIdentifier) ??
@@ -719,13 +707,13 @@ function* getMeasureValueFiltersUpdateActions(measureValueFilters, resetOthers)
719
707
  updateActions.push(tabsActions.changeMeasureValueFilterCondition({
720
708
  localIdentifier,
721
709
  conditions: incoming.dashboardMeasureValueFilter.conditions,
722
- enablePersistentFiltersAcrossTabs,
710
+ tabLocalIdentifier,
723
711
  }));
724
712
  if ("dimensionality" in incoming.dashboardMeasureValueFilter) {
725
713
  updateActions.push(tabsActions.setMeasureValueFilterDimensionality({
726
714
  localIdentifier,
727
715
  dimensionality: incoming.dashboardMeasureValueFilter.dimensionality,
728
- enablePersistentFiltersAcrossTabs,
716
+ tabLocalIdentifier,
729
717
  }));
730
718
  }
731
719
  }
@@ -740,7 +728,7 @@ function* getMeasureValueFiltersUpdateActions(measureValueFilters, resetOthers)
740
728
  updateActions.push(tabsActions.changeMeasureValueFilterCondition({
741
729
  localIdentifier,
742
730
  conditions: undefined,
743
- enablePersistentFiltersAcrossTabs,
731
+ tabLocalIdentifier,
744
732
  }));
745
733
  }
746
734
  }
@@ -749,7 +737,6 @@ function* getMeasureValueFiltersUpdateActions(measureValueFilters, resetOthers)
749
737
  function* getDateFiltersUpdateActions(dateFilters, resetOthers, tabLocalIdentifier) {
750
738
  const updateActions = [];
751
739
  const handledDataSets = new Set();
752
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
753
740
  for (const dateFilter of dateFilters) {
754
741
  const filterRef = dateFilter.dateFilter.dataSet;
755
742
  const dashboardFilter = yield call(selectFilterContextDateFilterByDataSetTabAware, filterRef, tabLocalIdentifier);
@@ -768,7 +755,6 @@ function* getDateFiltersUpdateActions(dateFilters, resetOthers, tabLocalIdentifi
768
755
  ...localIdentifierObj,
769
756
  ...emptyValueHandlingObj,
770
757
  tabLocalIdentifier,
771
- enablePersistentFiltersAcrossTabs,
772
758
  }
773
759
  : {
774
760
  type: dateFilter.dateFilter.type,
@@ -782,7 +768,6 @@ function* getDateFiltersUpdateActions(dateFilters, resetOthers, tabLocalIdentifi
782
768
  : {}),
783
769
  ...emptyValueHandlingObj,
784
770
  tabLocalIdentifier,
785
- enablePersistentFiltersAcrossTabs,
786
771
  };
787
772
  updateActions.push(tabsActions.upsertDateFilter(upsertPayload));
788
773
  }
@@ -801,7 +786,6 @@ function* getDateFiltersUpdateActions(dateFilters, resetOthers, tabLocalIdentifi
801
786
  dataSet: dateFilter.dateFilter.dataSet,
802
787
  ...localIdentifierObj,
803
788
  tabLocalIdentifier,
804
- enablePersistentFiltersAcrossTabs,
805
789
  }));
806
790
  }
807
791
  }
@@ -3,6 +3,7 @@ import { type IDashboardAttributeFilterConfig, type IDashboardDateFilter, type I
3
3
  import { type IDashboardCommand } from "../../commands/base.js";
4
4
  import { type IWorkingFilterContextDefinition } from "../../store/tabs/filterContext/filterContextState.js";
5
5
  import { type DashboardContext } from "../../types/commonTypes.js";
6
+ import { type ITabSyncSession } from "./tabSync/tabSyncSaga.js";
6
7
  /**
7
8
  * Applied filter context and attribute filter configs of every tab, taken before a write.
8
9
  * Compared with the store afterwards so a mirrored change emits one event per tab updated.
@@ -13,17 +14,17 @@ export interface IFilterContextByTabSnapshot {
13
14
  readonly attributeFilterConfigs: Record<string, IDashboardAttributeFilterConfig[]>;
14
15
  }
15
16
  export declare function captureFilterContextByTabSnapshot(): SagaIterator<IFilterContextByTabSnapshot>;
16
- export declare function dispatchFilterContextChangedForMutatedTabs(ctx: DashboardContext, cmd: IDashboardCommand, snapshot: IFilterContextByTabSnapshot): SagaIterator<void>;
17
+ /**
18
+ * Emits a filter context changed event for every tab that differs from `snapshot`, except `skippedTabId`.
19
+ */
20
+ export declare function dispatchFilterContextChangedForMutatedTabs(ctx: DashboardContext, cmd: IDashboardCommand, snapshot: IFilterContextByTabSnapshot, skippedTabId?: string): SagaIterator<void>;
17
21
  export declare function dispatchFilterContextChanged(ctx: DashboardContext, cmd: IDashboardCommand, tabLocalIdentifier?: string): SagaIterator<void>;
18
22
  export declare function canApplyDateFilter(dateFilter: IDashboardDateFilter): SagaIterator<boolean>;
19
23
  export declare function resetCrossFiltering(cmd: IDashboardCommand): Generator<import("redux-saga/effects").PutEffect<import("../../commands/filters.js").IRemoveAttributeFilters> | import("redux-saga/effects").PutEffect<{
20
24
  payload: string | undefined;
21
25
  type: "drill/resetCrossFiltering";
22
26
  }> | import("redux-saga/effects").SelectEffect, void, string[] & string>;
23
- export declare function applyWorkingSelectionHandler(ctx: DashboardContext, cmd: IDashboardCommand): Generator<import("redux-saga/effects").CallEffect<void> | import("redux-saga/effects").CallEffect<IFilterContextByTabSnapshot> | import("redux-saga/effects").PutEffect<{
24
- payload: import("../../../index.js").IApplyWorkingSelectionPayload;
25
- type: "tabs/applyWorkingSelection";
26
- }> | import("redux-saga/effects").PutEffect<import("../../events/base.js").ICustomDashboardEvent<any> | import("../../events/base.js").IDashboardEvent<any>> | import("redux-saga/effects").SelectEffect, void, never>;
27
+ export declare function applyWorkingSelectionHandler(ctx: DashboardContext, cmd: IDashboardCommand): Generator<import("redux-saga/effects").CallEffect<void> | import("redux-saga/effects").CallEffect<import("redux").Action[]> | import("redux-saga/effects").CallEffect<ITabSyncSession> | import("redux-saga/effects").PutEffect<import("../../events/base.js").ICustomDashboardEvent<any> | import("../../events/base.js").IDashboardEvent<any>> | import("redux-saga/effects").SelectEffect, void, never>;
27
28
  export declare function resetWorkingSelectionHandler(): Generator<import("redux-saga/effects").PutEffect<{
28
29
  payload: undefined;
29
30
  type: "tabs/resetWorkingSelection";
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/filterContext/common.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EACH,KAAK,+BAA+B,EACpC,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAChC,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAuBhE,OAAO,EAAE,KAAK,+BAA+B,EAAE,MAAM,sDAAsD,CAAC;AAI5G,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC,CAAC;IAC9E,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,+BAA+B,GAAG,SAAS,CAAC,CAAC;IAC5F,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,+BAA+B,EAAE,CAAC,CAAC;CACtF;AAED,wBAAiB,iCAAiC,IAAI,YAAY,CAAC,2BAA2B,CAAC,CAU9F;AAED,wBAAiB,0CAA0C,CACvD,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,2BAA2B,GACtC,YAAY,CAAC,IAAI,CAAC,CAwBpB;AAED,wBAAiB,4BAA4B,CACzC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,EACtB,kBAAkB,CAAC,EAAE,MAAM,GAC5B,YAAY,CAAC,IAAI,CAAC,CAkCpB;AAED,wBAAiB,kBAAkB,CAAC,UAAU,EAAE,oBAAoB,GAAG,YAAY,CAAC,OAAO,CAAC,CAuB3F;AAED,wBAAiB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB;;;yEAU1D;AAED,wBAAiB,4BAA4B,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB;;;uNAwC1F;AAED,wBAAiB,4BAA4B;;;mBAE5C"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/filterContext/common.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EACH,KAAK,+BAA+B,EACpC,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAChC,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAqBhE,OAAO,EAAE,KAAK,+BAA+B,EAAE,MAAM,sDAAsD,CAAC;AAI5G,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAAE,KAAK,eAAe,EAA0C,MAAM,0BAA0B,CAAC;AAExG;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC,CAAC;IAC9E,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,+BAA+B,GAAG,SAAS,CAAC,CAAC;IAC5F,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,+BAA+B,EAAE,CAAC,CAAC;CACtF;AAED,wBAAiB,iCAAiC,IAAI,YAAY,CAAC,2BAA2B,CAAC,CAU9F;AAED;;GAEG;AACH,wBAAiB,0CAA0C,CACvD,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,2BAA2B,EACrC,YAAY,CAAC,EAAE,MAAM,GACtB,YAAY,CAAC,IAAI,CAAC,CAwBpB;AAED,wBAAiB,4BAA4B,CACzC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,EACtB,kBAAkB,CAAC,EAAE,MAAM,GAC5B,YAAY,CAAC,IAAI,CAAC,CAkCpB;AAED,wBAAiB,kBAAkB,CAAC,UAAU,EAAE,oBAAoB,GAAG,YAAY,CAAC,OAAO,CAAC,CAuB3F;AAED,wBAAiB,mBAAmB,CAAC,GAAG,EAAE,iBAAiB;;;yEAU1D;AAED,wBAAiB,4BAA4B,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,iBAAiB,8YA4B1F;AAED,wBAAiB,4BAA4B;;;mBAE5C"}
@@ -7,9 +7,8 @@ import { removeAttributeFilters } from "../../commands/filters.js";
7
7
  import { filterContextChanged, filterContextWorkingSelectionApplied } from "../../events/filters.js";
8
8
  import { dispatchDashboardEvent } from "../../store/_infra/eventDispatcher.js";
9
9
  import { selectEnableImmediateAttributeFilterDisplayAsLabelMigration } from "../../store/config/configSelectors.js";
10
- import { selectCrossFilteringFiltersLocalIdentifiers, selectCrossFilteringFiltersLocalIdentifiersByTab, selectIsCrossFiltering, } from "../../store/drill/drillSelectors.js";
10
+ import { selectCrossFilteringFiltersLocalIdentifiers, selectIsCrossFiltering, } from "../../store/drill/drillSelectors.js";
11
11
  import { drillActions } from "../../store/drill/index.js";
12
- import { selectEnablePersistentFiltersAcrossTabs } from "../../store/meta/metaSelectors.js";
13
12
  import { selectAttributeFilterConfigsOverrides, selectAttributeFilterConfigsOverridesByTab, } from "../../store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
14
13
  import { selectEffectiveDateFilterOptions } from "../../store/tabs/dateFilterConfig/dateFilterConfigSelectors.js";
15
14
  import { selectFilterContextDefinition, selectFilterContextDefinitionsByTab, selectIsWorkingFilterContextChanged, selectWorkingFilterContextDefinitionsByTab, } from "../../store/tabs/filterContext/filterContextSelectors.js";
@@ -17,18 +16,22 @@ import { tabsActions } from "../../store/tabs/index.js";
17
16
  import { selectParameterValuesByTab } from "../../store/tabs/parameters/parametersSelectors.js";
18
17
  import { selectActiveOrDefaultTabLocalIdentifier } from "../../store/tabs/tabsSelectors.js";
19
18
  import { dispatchParametersChangedForAffectedTabs } from "../parameters/changeParameterValuesHandler.js";
19
+ import { beginTabSync, endTabSync, putTabSynced } from "./tabSync/tabSyncSaga.js";
20
20
  export function* captureFilterContextByTabSnapshot() {
21
21
  const filterContexts = yield select(selectFilterContextDefinitionsByTab);
22
22
  const workingFilterContexts = yield select(selectWorkingFilterContextDefinitionsByTab);
23
23
  const attributeFilterConfigs = yield select(selectAttributeFilterConfigsOverridesByTab);
24
24
  return { filterContexts, workingFilterContexts, attributeFilterConfigs };
25
25
  }
26
- export function* dispatchFilterContextChangedForMutatedTabs(ctx, cmd, snapshot) {
26
+ /**
27
+ * Emits a filter context changed event for every tab that differs from `snapshot`, except `skippedTabId`.
28
+ */
29
+ export function* dispatchFilterContextChangedForMutatedTabs(ctx, cmd, snapshot, skippedTabId) {
27
30
  const filterContexts = yield select(selectFilterContextDefinitionsByTab);
28
31
  const attributeFilterConfigs = yield select(selectAttributeFilterConfigsOverridesByTab);
29
32
  const workingFilterContexts = yield select(selectWorkingFilterContextDefinitionsByTab);
30
33
  for (const tabId of Object.keys(filterContexts)) {
31
- if (!filterContexts[tabId]) {
34
+ if (!filterContexts[tabId] || tabId === skippedTabId) {
32
35
  continue;
33
36
  }
34
37
  const configs = attributeFilterConfigs[tabId] ?? [];
@@ -89,25 +92,16 @@ export function* applyWorkingSelectionHandler(ctx, cmd) {
89
92
  const isWorkingFilterContextChanged = yield select(selectIsWorkingFilterContextChanged);
90
93
  const tabId = yield select(selectActiveOrDefaultTabLocalIdentifier);
91
94
  const valuesBefore = yield select(selectParameterValuesByTab);
92
- const crossFilteringLocalIdsByTab = yield select(selectCrossFilteringFiltersLocalIdentifiersByTab);
93
- const enablePersistentFiltersAcrossTabs = yield select(selectEnablePersistentFiltersAcrossTabs);
94
- const filterContextSnapshot = yield call(captureFilterContextByTabSnapshot);
95
- yield put(tabsActions.applyWorkingSelection({
96
- enableImmediateAttributeFilterDisplayAsLabelMigration,
97
- crossFilteringLocalIdsByTab,
98
- enablePersistentFiltersAcrossTabs,
99
- }));
95
+ const session = yield call(beginTabSync);
96
+ yield call(putTabSynced, session, [
97
+ tabsActions.applyWorkingSelection({ enableImmediateAttributeFilterDisplayAsLabelMigration }),
98
+ ]);
100
99
  const isCrossFiltering = yield select(selectIsCrossFiltering);
101
100
  if (isWorkingFilterContextChanged && isCrossFiltering) {
102
101
  yield call(resetCrossFiltering, cmd);
103
102
  }
104
103
  yield dispatchDashboardEvent(filterContextWorkingSelectionApplied(ctx, cmd.correlationId));
105
- if (enablePersistentFiltersAcrossTabs) {
106
- yield call(dispatchFilterContextChangedForMutatedTabs, ctx, cmd, filterContextSnapshot);
107
- }
108
- else {
109
- yield call(dispatchFilterContextChanged, ctx, cmd);
110
- }
104
+ yield call(endTabSync, ctx, cmd, session);
111
105
  yield call(dispatchParametersChangedForAffectedTabs, ctx, cmd, valuesBefore, tabId);
112
106
  }
113
107
  export function* resetWorkingSelectionHandler() {
@@ -1 +1 @@
1
- {"version":3,"file":"changeDateFilterSelectionHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/dateFilter/changeDateFilterSelectionHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C,OAAO,EAAE,KAAK,yBAAyB,EAA4B,MAAM,8BAA8B,CAAC;AAYxG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAUtE,wBAAiB,gCAAgC,CAC7C,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,yBAAyB,GAC/B,YAAY,CAAC,IAAI,CAAC,CA8EpB"}
1
+ {"version":3,"file":"changeDateFilterSelectionHandler.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/filterContext/dateFilter/changeDateFilterSelectionHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C,OAAO,EAAE,KAAK,yBAAyB,EAA4B,MAAM,8BAA8B,CAAC;AAWxG,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,wBAAiB,gCAAgC,CAC7C,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,yBAAyB,GAC/B,YAAY,CAAC,IAAI,CAAC,CAsEpB"}