@gooddata/sdk-ui-dashboard 11.58.0-alpha.2 → 11.58.0-alpha.4

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 (274) hide show
  1. package/NOTICE +8 -8
  2. package/esm/__version.d.ts +1 -1
  3. package/esm/__version.js +1 -1
  4. package/esm/index.d.ts +5 -5
  5. package/esm/index.d.ts.map +1 -1
  6. package/esm/index.js +3 -3
  7. package/esm/internal.d.ts +1 -0
  8. package/esm/internal.d.ts.map +1 -1
  9. package/esm/internal.js +1 -0
  10. package/esm/model/DashboardTester.d.ts.map +1 -1
  11. package/esm/model/DashboardTester.js +7 -1
  12. package/esm/model/commandHandlers/common/validateDrillToCustomUrlParams.d.ts.map +1 -1
  13. package/esm/model/commandHandlers/common/validateDrillToCustomUrlParams.js +6 -1
  14. package/esm/model/commandHandlers/common/validateDrills.d.ts.map +1 -1
  15. package/esm/model/commandHandlers/common/validateDrills.js +12 -3
  16. package/esm/model/commandHandlers/dashboard/dashboardDrillReferences.d.ts +4 -0
  17. package/esm/model/commandHandlers/dashboard/dashboardDrillReferences.d.ts.map +1 -0
  18. package/esm/model/commandHandlers/dashboard/dashboardDrillReferences.js +53 -0
  19. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.d.ts.map +1 -1
  20. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/index.js +13 -6
  21. package/esm/model/commandHandlers/dashboard/saveAsDashboardHandler.d.ts.map +1 -1
  22. package/esm/model/commandHandlers/dashboard/saveAsDashboardHandler.js +4 -1
  23. package/esm/model/commandHandlers/dashboard/saveDashboardHandler.d.ts.map +1 -1
  24. package/esm/model/commandHandlers/dashboard/saveDashboardHandler.js +30 -6
  25. package/esm/model/commandHandlers/drill/drillToAttributeUrlHandler.d.ts.map +1 -1
  26. package/esm/model/commandHandlers/drill/drillToAttributeUrlHandler.js +2 -0
  27. package/esm/model/commandHandlers/drill/drillToCustomUrlHandler.d.ts.map +1 -1
  28. package/esm/model/commandHandlers/drill/drillToCustomUrlHandler.js +2 -0
  29. package/esm/model/commandHandlers/drill/drillToDashboardHandler.d.ts.map +1 -1
  30. package/esm/model/commandHandlers/drill/drillToDashboardHandler.js +2 -0
  31. package/esm/model/commandHandlers/drill/drillToInsightHandler.d.ts.map +1 -1
  32. package/esm/model/commandHandlers/drill/drillToInsightHandler.js +3 -1
  33. package/esm/model/commandHandlers/drill/resolveDrillToCustomUrl.d.ts.map +1 -1
  34. package/esm/model/commandHandlers/drill/resolveDrillToCustomUrl.js +30 -29
  35. package/esm/model/commandHandlers/drill/validateDrillAccess.d.ts +6 -0
  36. package/esm/model/commandHandlers/drill/validateDrillAccess.d.ts.map +1 -0
  37. package/esm/model/commandHandlers/drill/validateDrillAccess.js +10 -0
  38. package/esm/model/commandHandlers/parameters/filterParameterDependenciesWorker.d.ts +45 -0
  39. package/esm/model/commandHandlers/parameters/filterParameterDependenciesWorker.d.ts.map +1 -0
  40. package/esm/model/commandHandlers/parameters/filterParameterDependenciesWorker.js +99 -0
  41. package/esm/model/commandHandlers/parameters/insightParameterDependenciesWorker.d.ts +11 -0
  42. package/esm/model/commandHandlers/parameters/insightParameterDependenciesWorker.d.ts.map +1 -0
  43. package/esm/model/commandHandlers/parameters/insightParameterDependenciesWorker.js +71 -0
  44. package/esm/model/commandHandlers/parameters/loadFilterParameterDependencies.d.ts +22 -0
  45. package/esm/model/commandHandlers/parameters/loadFilterParameterDependencies.d.ts.map +1 -0
  46. package/esm/model/commandHandlers/parameters/loadFilterParameterDependencies.js +39 -0
  47. package/esm/model/commandHandlers/parameters/loadInsightParameterDependencies.d.ts +21 -0
  48. package/esm/model/commandHandlers/parameters/loadInsightParameterDependencies.d.ts.map +1 -0
  49. package/esm/model/commandHandlers/parameters/loadInsightParameterDependencies.js +86 -0
  50. package/esm/model/react/useInitializeDashboardStore.d.ts.map +1 -1
  51. package/esm/model/react/useInitializeDashboardStore.js +4 -0
  52. package/esm/model/react/useWidgetExecConfig.d.ts +4 -4
  53. package/esm/model/react/useWidgetExecConfig.d.ts.map +1 -1
  54. package/esm/model/react/useWidgetExecConfig.js +2 -2
  55. package/esm/model/store/catalog/catalogReducers.d.ts +16 -4
  56. package/esm/model/store/catalog/catalogReducers.d.ts.map +1 -1
  57. package/esm/model/store/catalog/catalogReducers.js +15 -3
  58. package/esm/model/store/catalog/catalogSelectors.d.ts +47 -7
  59. package/esm/model/store/catalog/catalogSelectors.d.ts.map +1 -1
  60. package/esm/model/store/catalog/catalogSelectors.js +33 -7
  61. package/esm/model/store/catalog/catalogState.d.ts +30 -9
  62. package/esm/model/store/catalog/catalogState.d.ts.map +1 -1
  63. package/esm/model/store/catalog/catalogState.js +2 -1
  64. package/esm/model/store/catalog/index.d.ts +4 -1
  65. package/esm/model/store/catalog/index.d.ts.map +1 -1
  66. package/esm/model/store/filtering/dashboardFilterSelectors.d.ts +8 -2
  67. package/esm/model/store/filtering/dashboardFilterSelectors.d.ts.map +1 -1
  68. package/esm/model/store/filtering/dashboardFilterSelectors.js +41 -25
  69. package/esm/model/store/filtering/types.d.ts +5 -0
  70. package/esm/model/store/filtering/types.d.ts.map +1 -1
  71. package/esm/model/store/tabs/layout/layoutSelectors.d.ts.map +1 -1
  72. package/esm/model/store/tabs/layout/layoutSelectors.js +2 -1
  73. package/esm/model/store/tabs/parameters/parametersHelpers.d.ts +42 -8
  74. package/esm/model/store/tabs/parameters/parametersHelpers.d.ts.map +1 -1
  75. package/esm/model/store/tabs/parameters/parametersHelpers.js +88 -19
  76. package/esm/model/store/tabs/parameters/parametersSelectors.d.ts +13 -6
  77. package/esm/model/store/tabs/parameters/parametersSelectors.d.ts.map +1 -1
  78. package/esm/model/store/tabs/parameters/parametersSelectors.js +24 -13
  79. package/esm/model/store/ui/index.d.ts +1 -0
  80. package/esm/model/store/ui/index.d.ts.map +1 -1
  81. package/esm/model/store/ui/uiReducers.d.ts +5 -1
  82. package/esm/model/store/ui/uiReducers.d.ts.map +1 -1
  83. package/esm/model/store/ui/uiReducers.js +8 -4
  84. package/esm/model/store/ui/uiSelectors.d.ts +5 -1
  85. package/esm/model/store/ui/uiSelectors.d.ts.map +1 -1
  86. package/esm/model/store/ui/uiSelectors.js +4 -0
  87. package/esm/model/store/ui/uiState.d.ts +2 -1
  88. package/esm/model/store/ui/uiState.d.ts.map +1 -1
  89. package/esm/model/store/ui/uiState.js +1 -0
  90. package/esm/model/store/widgetDrills/drillRestrictionSelectors.d.ts +23 -0
  91. package/esm/model/store/widgetDrills/drillRestrictionSelectors.d.ts.map +1 -0
  92. package/esm/model/store/widgetDrills/drillRestrictionSelectors.js +5 -0
  93. package/esm/model/store/widgetDrills/drillRestrictionUtils.d.ts +5 -0
  94. package/esm/model/store/widgetDrills/drillRestrictionUtils.d.ts.map +1 -0
  95. package/esm/model/store/widgetDrills/drillRestrictionUtils.js +27 -0
  96. package/esm/model/store/widgetDrills/widgetDrillSelectors.d.ts.map +1 -1
  97. package/esm/model/store/widgetDrills/widgetDrillSelectors.js +9 -5
  98. package/esm/presentation/automations/alerting/state/AlertingDialogStateProvider.js +1 -0
  99. package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts +4 -2
  100. package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.d.ts.map +1 -1
  101. package/esm/presentation/automations/alerting/state/useAlertDraftFilterWrites.js +12 -3
  102. package/esm/presentation/automations/alerting/utils/items.js +8 -14
  103. package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.d.ts.map +1 -1
  104. package/esm/presentation/automations/connectors/hooks/useBuildAutomationsContext.js +8 -2
  105. package/esm/presentation/automations/contexts/AutomationsContext.d.ts +4 -2
  106. package/esm/presentation/automations/contexts/AutomationsContext.d.ts.map +1 -1
  107. package/esm/presentation/automations/scheduledEmail/hooks/useExportTimezones.js +1 -1
  108. package/esm/presentation/automations/scheduledEmail/state/ScheduledEmailDialogStateProvider.js +1 -0
  109. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts +4 -2
  110. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.d.ts.map +1 -1
  111. package/esm/presentation/automations/scheduledEmail/state/useScheduledEmailDraftFilterWrites.js +25 -6
  112. package/esm/presentation/automations/shared/automationFilters/components/AutomationAttributeFilter.d.ts.map +1 -1
  113. package/esm/presentation/automations/shared/automationFilters/components/AutomationAttributeFilter.js +16 -2
  114. package/esm/presentation/automations/shared/automationFilters/components/AutomationFiltersSelect.d.ts.map +1 -1
  115. package/esm/presentation/automations/shared/automationFilters/components/AutomationFiltersSelect.js +16 -11
  116. package/esm/presentation/automations/shared/automationFilters/components/AutomationRestrictedFilters.d.ts +9 -0
  117. package/esm/presentation/automations/shared/automationFilters/components/AutomationRestrictedFilters.d.ts.map +1 -0
  118. package/esm/presentation/automations/shared/automationFilters/components/AutomationRestrictedFilters.js +22 -0
  119. package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.d.ts +2 -2
  120. package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.d.ts.map +1 -1
  121. package/esm/presentation/automations/shared/automationFilters/hooks/useDefaultSelectedFiltersForExistingAutomation.js +17 -5
  122. package/esm/presentation/automations/shared/automationFilters/useAutomationFilters.d.ts +8 -0
  123. package/esm/presentation/automations/shared/automationFilters/useAutomationFilters.d.ts.map +1 -1
  124. package/esm/presentation/automations/shared/automationFilters/useAutomationFilters.js +54 -10
  125. package/esm/presentation/automations/shared/automationFilters/useAutomationFiltersSelect.d.ts.map +1 -1
  126. package/esm/presentation/automations/shared/automationFilters/useAutomationFiltersSelect.js +3 -2
  127. package/esm/presentation/automations/shared/filters/conversions.d.ts +10 -2
  128. package/esm/presentation/automations/shared/filters/conversions.d.ts.map +1 -1
  129. package/esm/presentation/automations/shared/filters/conversions.js +15 -6
  130. package/esm/presentation/dashboardSettingsDialog/DefaultDashboardSettingsDialog.d.ts.map +1 -1
  131. package/esm/presentation/dashboardSettingsDialog/DefaultDashboardSettingsDialog.js +3 -4
  132. package/esm/presentation/dashboardSettingsDialog/TimezoneOption.d.ts.map +1 -1
  133. package/esm/presentation/dashboardSettingsDialog/TimezoneOption.js +20 -7
  134. package/esm/presentation/dialogs/ExportCsvDialog.d.ts.map +1 -1
  135. package/esm/presentation/dialogs/ExportCsvDialog.js +2 -1
  136. package/esm/presentation/drill/DrillConfigPanel/DrillToUrl/CustomUrlEditorParametersSections/IdentifierParametersSection.js +1 -1
  137. package/esm/presentation/drill/DrillSelect/DrillSelectDropdown.d.ts +2 -1
  138. package/esm/presentation/drill/DrillSelect/DrillSelectDropdown.d.ts.map +1 -1
  139. package/esm/presentation/drill/DrillSelect/DrillSelectDropdown.js +19 -1
  140. package/esm/presentation/drill/DrillSelect/WithDrillSelect.d.ts.map +1 -1
  141. package/esm/presentation/drill/DrillSelect/WithDrillSelect.js +12 -4
  142. package/esm/presentation/drill/DrillSelect/types.d.ts +1 -0
  143. package/esm/presentation/drill/DrillSelect/types.d.ts.map +1 -1
  144. package/esm/presentation/drill/hooks/useDrillSelectDropdownMenuItems.d.ts.map +1 -1
  145. package/esm/presentation/drill/hooks/useDrillSelectDropdownMenuItems.js +4 -2
  146. package/esm/presentation/insightNotSavedDialog/InsightNotSavedDialog.d.ts.map +1 -1
  147. package/esm/presentation/insightNotSavedDialog/InsightNotSavedDialog.js +4 -5
  148. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts +3 -0
  149. package/esm/presentation/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
  150. package/esm/presentation/localization/bundles/de-DE.localization-bundle.js +5 -2
  151. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts +3 -0
  152. package/esm/presentation/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
  153. package/esm/presentation/localization/bundles/en-AU.localization-bundle.js +5 -2
  154. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts +3 -0
  155. package/esm/presentation/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
  156. package/esm/presentation/localization/bundles/en-GB.localization-bundle.js +5 -2
  157. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts +21 -1
  158. package/esm/presentation/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  159. package/esm/presentation/localization/bundles/en-US.localization-bundle.js +27 -7
  160. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts +3 -0
  161. package/esm/presentation/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
  162. package/esm/presentation/localization/bundles/es-419.localization-bundle.js +5 -2
  163. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts +3 -0
  164. package/esm/presentation/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
  165. package/esm/presentation/localization/bundles/es-ES.localization-bundle.js +5 -2
  166. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts +3 -0
  167. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
  168. package/esm/presentation/localization/bundles/fi-FI.localization-bundle.js +5 -2
  169. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts +3 -0
  170. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
  171. package/esm/presentation/localization/bundles/fr-CA.localization-bundle.js +5 -2
  172. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts +3 -0
  173. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
  174. package/esm/presentation/localization/bundles/fr-FR.localization-bundle.js +5 -2
  175. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts +3 -0
  176. package/esm/presentation/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
  177. package/esm/presentation/localization/bundles/id-ID.localization-bundle.js +5 -2
  178. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts +3 -0
  179. package/esm/presentation/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
  180. package/esm/presentation/localization/bundles/it-IT.localization-bundle.js +5 -2
  181. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts +3 -0
  182. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
  183. package/esm/presentation/localization/bundles/ja-JP.localization-bundle.js +5 -2
  184. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts +3 -0
  185. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
  186. package/esm/presentation/localization/bundles/ko-KR.localization-bundle.js +5 -2
  187. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts +3 -0
  188. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
  189. package/esm/presentation/localization/bundles/nl-NL.localization-bundle.js +5 -2
  190. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts +3 -0
  191. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
  192. package/esm/presentation/localization/bundles/pl-PL.localization-bundle.js +5 -2
  193. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts +3 -0
  194. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
  195. package/esm/presentation/localization/bundles/pt-BR.localization-bundle.js +5 -2
  196. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts +3 -0
  197. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
  198. package/esm/presentation/localization/bundles/pt-PT.localization-bundle.js +5 -2
  199. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts +3 -0
  200. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
  201. package/esm/presentation/localization/bundles/ru-RU.localization-bundle.js +5 -2
  202. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts +3 -0
  203. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
  204. package/esm/presentation/localization/bundles/sl-SI.localization-bundle.js +5 -2
  205. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts +3 -0
  206. package/esm/presentation/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
  207. package/esm/presentation/localization/bundles/th-TH.localization-bundle.js +5 -2
  208. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts +3 -0
  209. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
  210. package/esm/presentation/localization/bundles/tr-TR.localization-bundle.js +5 -2
  211. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts +3 -0
  212. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
  213. package/esm/presentation/localization/bundles/uk-UA.localization-bundle.js +5 -2
  214. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts +3 -0
  215. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
  216. package/esm/presentation/localization/bundles/vi-VN.localization-bundle.js +5 -2
  217. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts +3 -0
  218. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
  219. package/esm/presentation/localization/bundles/zh-HK.localization-bundle.js +5 -2
  220. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts +3 -0
  221. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
  222. package/esm/presentation/localization/bundles/zh-Hans.localization-bundle.js +5 -2
  223. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts +3 -0
  224. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
  225. package/esm/presentation/localization/bundles/zh-Hant.localization-bundle.js +5 -2
  226. package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts +4 -8
  227. package/esm/presentation/widget/common/RestrictedPlaceholder.d.ts.map +1 -1
  228. package/esm/presentation/widget/common/RestrictedPlaceholder.js +16 -23
  229. package/esm/presentation/widget/insight/DefaultInsightBody/DefaultInsightBody.d.ts.map +1 -1
  230. package/esm/presentation/widget/insight/DefaultInsightBody/DefaultInsightBody.js +2 -4
  231. package/esm/presentation/widget/insight/LayeredTableView.d.ts +1 -1
  232. package/esm/presentation/widget/insight/LayeredTableView.d.ts.map +1 -1
  233. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.d.ts.map +1 -1
  234. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/DrillDialogInsight.js +2 -3
  235. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.d.ts.map +1 -1
  236. package/esm/presentation/widget/insight/ViewModeDashboardInsight/InsightDrillDialog/InsightDrillDialog.js +1 -1
  237. package/esm/presentation/widget/insight/types.d.ts +1 -1
  238. package/esm/presentation/widget/insight/types.d.ts.map +1 -1
  239. package/esm/presentation/widget/richText/RestrictedReferencesDialog.d.ts.map +1 -1
  240. package/esm/presentation/widget/richText/RestrictedReferencesDialog.js +5 -6
  241. package/esm/presentation/widget/visualizationSwitcher/ViewModeDashboardVisualizationSwitcher.js +1 -1
  242. package/esm/presentation/widget/visualizationSwitcher/configuration/VisualizationsList/VisualizationListItem.d.ts.map +1 -1
  243. package/esm/presentation/widget/visualizationSwitcher/configuration/VisualizationsList/VisualizationListItem.js +1 -4
  244. package/esm/presentation/widget/widget/InsightWidget/DefaultDashboardInsightWidget.js +2 -3
  245. package/esm/sdk-ui-dashboard.d.ts +88 -61
  246. package/package.json +21 -21
  247. package/styles/css/dashboard.css +1 -7
  248. package/styles/css/dashboard.css.map +1 -1
  249. package/styles/css/dashboardSettingsDialog.css +4 -0
  250. package/styles/css/dashboardSettingsDialog.css.map +1 -1
  251. package/styles/css/export.css +0 -6
  252. package/styles/css/export.css.map +1 -1
  253. package/styles/css/main.css +13 -20
  254. package/styles/css/main.css.map +1 -1
  255. package/styles/css/notifications_channels_dialog.css +1 -7
  256. package/styles/css/notifications_channels_dialog.css.map +1 -1
  257. package/styles/css/richTextWidget.css +4 -0
  258. package/styles/css/richTextWidget.css.map +1 -1
  259. package/styles/scss/dashboardSettingsDialog.scss +5 -0
  260. package/styles/scss/export.scss +0 -9
  261. package/styles/scss/notifications_channels_dialog.scss +1 -10
  262. package/styles/scss/richTextWidget.scss +5 -1
  263. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.d.ts +0 -13
  264. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.d.ts.map +0 -1
  265. package/esm/model/commandHandlers/dashboard/initializeDashboardHandler/loadMeasureParameterDependencies.js +0 -98
  266. package/esm/model/types/drillTypes.d.ts +0 -13
  267. package/esm/model/types/drillTypes.d.ts.map +0 -1
  268. package/esm/model/types/drillTypes.js +0 -14
  269. package/esm/presentation/widget/insight/geoDefaultDisplayFormRefs.d.ts +0 -5
  270. package/esm/presentation/widget/insight/geoDefaultDisplayFormRefs.d.ts.map +0 -1
  271. package/esm/presentation/widget/insight/geoDefaultDisplayFormRefs.js +0 -28
  272. package/esm/presentation/widget/insight/insightToTable.d.ts +0 -74
  273. package/esm/presentation/widget/insight/insightToTable.d.ts.map +0 -1
  274. package/esm/presentation/widget/insight/insightToTable.js +0 -482
@@ -0,0 +1,53 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { areObjRefsEqual, insightRef, isDashboardLayout, isDrillToCustomUrl, isInsightWidget, isInsightWidgetDefinition, isVisualizationSwitcherWidget, isVisualizationSwitcherWidgetDefinition, } from "@gooddata/sdk-model";
3
+ import { getDrillToCustomUrlReferenceMap } from "@gooddata/sdk-model/internal";
4
+ /** Refresh dependencies at the save boundary, including untouched drills on existing dashboards. */
5
+ export function dashboardWithDrillReferences(dashboard, insights) {
6
+ function updateWidget(widget) {
7
+ if (isDashboardLayout(widget)) {
8
+ return updateLayout(widget);
9
+ }
10
+ if (isVisualizationSwitcherWidget(widget) || isVisualizationSwitcherWidgetDefinition(widget)) {
11
+ return { ...widget, visualizations: widget.visualizations.map(updateInsightWidget) };
12
+ }
13
+ return updateInsightWidget(widget);
14
+ }
15
+ function updateInsightWidget(widget) {
16
+ if (!isInsightWidget(widget) && !isInsightWidgetDefinition(widget)) {
17
+ return widget;
18
+ }
19
+ const insight = insights.find((candidate) => areObjRefsEqual(insightRef(candidate), widget.insight));
20
+ return {
21
+ ...widget,
22
+ drills: widget.drills.map((drill) => isDrillToCustomUrl(drill)
23
+ ? {
24
+ ...drill,
25
+ target: {
26
+ ...drill.target,
27
+ references: getDrillToCustomUrlReferenceMap(drill.target, insight),
28
+ },
29
+ }
30
+ : drill),
31
+ };
32
+ }
33
+ function updateLayout(layout) {
34
+ return {
35
+ ...layout,
36
+ sections: layout.sections.map((section) => ({
37
+ ...section,
38
+ items: section.items.map((item) => ({
39
+ ...item,
40
+ widget: item.widget ? updateWidget(item.widget) : item.widget,
41
+ })),
42
+ })),
43
+ };
44
+ }
45
+ return {
46
+ ...dashboard,
47
+ layout: dashboard.layout ? updateLayout(dashboard.layout) : undefined,
48
+ tabs: dashboard.tabs?.map((tab) => ({
49
+ ...tab,
50
+ layout: tab.layout ? updateLayout(tab.layout) : undefined,
51
+ })),
52
+ };
53
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/initializeDashboardHandler/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EACH,KAAK,UAAU,EAIf,KAAK,sBAAsB,EAW9B,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAyB1E,OAAO,EACH,KAAK,gBAAgB,EAGxB,MAAM,+BAA+B,CAAC;AAmevC,wBAAiB,cAAc,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB;;;uIAyB9E;AAkCD,wBAAiB,2BAA2B,CAAC,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU;;;6LAOxF;AAED,wBAAiB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,sNAW3D;AAoCD,wBAAiB,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,GAAG,YAAY,CAoCzG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/model/commandHandlers/dashboard/initializeDashboardHandler/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EACH,KAAK,UAAU,EAIf,KAAK,sBAAsB,EAW9B,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAyB1E,OAAO,EACH,KAAK,gBAAgB,EAGxB,MAAM,+BAA+B,CAAC;AAqfvC,wBAAiB,cAAc,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB;;;uIAyB9E;AAkCD,wBAAiB,2BAA2B,CAAC,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU;;;6LAOxF;AAED,wBAAiB,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,sNAW3D;AAoCD,wBAAiB,0BAA0B,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE,mBAAmB,GAAG,YAAY,CAoCzG"}
@@ -30,6 +30,8 @@ import { uiActions } from "../../../store/ui/index.js";
30
30
  import { unavailableObjectsActions } from "../../../store/unavailableObjects/index.js";
31
31
  import { selectUnavailableObjects } from "../../../store/unavailableObjects/unavailableObjectsSelectors.js";
32
32
  import { userActions } from "../../../store/user/index.js";
33
+ import { collectDashboardFilterContextItems, loadFilterParameterDependencies, } from "../../parameters/loadFilterParameterDependencies.js";
34
+ import { loadInsightParameterDependencies } from "../../parameters/loadInsightParameterDependencies.js";
33
35
  import { changeDashboardTimezoneOverrideHandler } from "../../timezone/changeDashboardTimezoneOverrideHandler.js";
34
36
  import { applyDefaultFilterView } from "../common/filterViews.js";
35
37
  import { actionsToInitializeExistingDashboard, actionsToInitializeNewDashboard, } from "../common/stateInitializers.js";
@@ -41,7 +43,6 @@ import { loadDashboardPermissions } from "./loadDashboardPermissions.js";
41
43
  import { loadDateHierarchyTemplates } from "./loadDateHierarchyTemplates.js";
42
44
  import { loadExportTimezone } from "./loadExportTimezone.js";
43
45
  import { loadFilterViews } from "./loadFilterViews.js";
44
- import { loadMeasureParameterDependencies } from "./loadMeasureParameterDependencies.js";
45
46
  import { dashboardLoadReferenceTypes, loadUnavailableReferences } from "./loadUnavailableReferences.js";
46
47
  import { loadUser } from "./loadUser.js";
47
48
  import { mergeDateFilterConfigWithOverrides } from "./mergeDateFilterConfigs.js";
@@ -194,10 +195,11 @@ function* loadExistingDashboard(ctx, cmd, dashboardRef) {
194
195
  // Note: activeTabLocalIdentifier is app state only, NOT persisted to/read from dashboard MD
195
196
  const resolvedActiveTabId = resolveActiveTabId(dashboardWithFilterView.tabs, cmd.payload.initialTabId, undefined);
196
197
  const dashboard = dashboardWithFilterView;
197
- const [{ tabsAttributeFilterConfigs, tabsDateFilterConfig, tabsDateFilterConfigSource }, workspaceParameters, measureParameterDependencies,] = yield all([
198
+ const [{ tabsAttributeFilterConfigs, tabsDateFilterConfig, tabsDateFilterConfigSource }, workspaceParameters, insightParameterDependencies, filterParameterDependencies,] = yield all([
198
199
  call(getTabsFilterConfigs, dashboard, config, ctx, cmd),
199
200
  call(loadWorkspaceParametersWithStatus, ctx, config.settings),
200
- call(loadMeasureParameterDependencies, ctx, insights, config.settings?.enableParameters ?? false),
201
+ call(loadInsightParameterDependencies, ctx, insights, config.settings?.enableParameters ?? false),
202
+ call(loadFilterParameterDependencies, ctx, collectDashboardFilterContextItems(dashboard), config.settings?.enableParameters ?? false),
201
203
  ]);
202
204
  const workspaceParametersList = Array.isArray(workspaceParameters) ? workspaceParameters : [];
203
205
  const initActions = yield call(actionsToInitializeExistingDashboard, ctx, dashboard, insights, config.settings, config.settings.enableImmediateAttributeFilterDisplayAsLabelMigration ?? false, undefined, undefined, tabsAttributeFilterConfigs, tabsDateFilterConfig, tabsDateFilterConfigSource, createDisplayFormMap([], []), cmd.payload.persistedDashboard, resolvedActiveTabId, workspaceParametersList);
@@ -212,7 +214,8 @@ function* loadExistingDashboard(ctx, cmd, dashboardRef) {
212
214
  permissionsActions.setPermissions(permissions),
213
215
  catalogActions.setCatalogItems(catalogPayload),
214
216
  catalogActions.setCatalogParameters(makeCatalogParametersPayload(workspaceParameters)),
215
- catalogActions.setCatalogMeasureParameters(measureParameterDependencies),
217
+ catalogActions.setCatalogInsightParameters(insightParameterDependencies),
218
+ catalogActions.setCatalogFilterParameters(filterParameterDependencies),
216
219
  ...initActions,
217
220
  // NOTE: Tab configs (dateFilterConfig, dateFilterConfigs, attributeFilterConfigs, filterContext)
218
221
  // are now initialized as part of the tabs state in initActions via setTabs action
@@ -256,7 +259,10 @@ function* initializeNewDashboard(ctx, cmd) {
256
259
  const { initActions, dashboard, insights } = yield call(actionsToInitializeNewDashboard, ctx, config.settings, dateFilterConfig, loadedCatalog
257
260
  ? createDisplayFormMapFromCatalog(loadedCatalog.catalog, loadedCatalog.computedAttributes)
258
261
  : createDisplayFormMap([], []), cmd.payload.initialTabId, workspaceParametersList);
259
- const measureParameterDependencies = yield call(loadMeasureParameterDependencies, ctx, insights, config.settings?.enableParameters ?? false);
262
+ const insightParameterDependencies = yield call(loadInsightParameterDependencies, ctx, insights, config.settings?.enableParameters ?? false);
263
+ // a new dashboard starts with the default (date-only) filter context, so there is nothing to
264
+ // resolve yet; this only records the status so the widgets do not wait for a load that never comes
265
+ const filterParameterDependencies = yield call(loadFilterParameterDependencies, ctx, [], config.settings?.enableParameters ?? false);
260
266
  const batch = batchActions([
261
267
  backendCapabilitiesActions.setBackendCapabilities(backend.capabilities),
262
268
  configActions.setConfig(config),
@@ -273,7 +279,8 @@ function* initializeNewDashboard(ctx, cmd) {
273
279
  dateHierarchyTemplates: dateHierarchyTemplates,
274
280
  }),
275
281
  catalogActions.setCatalogParameters(makeCatalogParametersPayload(workspaceParameters)),
276
- catalogActions.setCatalogMeasureParameters(measureParameterDependencies),
282
+ catalogActions.setCatalogInsightParameters(insightParameterDependencies),
283
+ catalogActions.setCatalogFilterParameters(filterParameterDependencies),
277
284
  listedDashboardsActions.setListedDashboards(listedDashboards),
278
285
  accessibleDashboardsActions.setAccessibleDashboards(listedDashboards),
279
286
  executionResultsActions.clearAllExecutionResults(),
@@ -1 +1 @@
1
- {"version":3,"file":"saveAsDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAqB/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,2BAA2B,CAAC;AA4BxF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAiUnE,wBAAiB,sBAAsB,CACnC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,eAAe,GACrB,YAAY,CAAC,kBAAkB,CAAC,CA2ClC"}
1
+ {"version":3,"file":"saveAsDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/dashboard/saveAsDashboardHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAqB/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,2BAA2B,CAAC;AA6BxF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAoUnE,wBAAiB,sBAAsB,CACnC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,eAAe,GACrB,YAAY,CAAC,kBAAkB,CAAC,CA2ClC"}
@@ -11,6 +11,7 @@ import { accessibleDashboardsActions } from "../../store/accessibleDashboards/in
11
11
  import { selectBackendCapabilities } from "../../store/backendCapabilities/backendCapabilitiesSelectors.js";
12
12
  import { selectEnableImmediateAttributeFilterDisplayAsLabelMigration } from "../../store/config/configSelectors.js";
13
13
  import { selectCrossFilteringFiltersLocalIdentifiers } from "../../store/drill/drillSelectors.js";
14
+ import { selectInsights } from "../../store/insights/insightsSelectors.js";
14
15
  import { listedDashboardsActions } from "../../store/listedDashboards/index.js";
15
16
  import { metaActions } from "../../store/meta/index.js";
16
17
  import { selectDashboardDescriptor, selectPersistedDashboard, selectPersistedDashboardFilterContextAsFilterContextDefinition, } from "../../store/meta/metaSelectors.js";
@@ -28,6 +29,7 @@ import { selectTabs } from "../../store/tabs/tabsSelectors.js";
28
29
  import { selectCurrentUser } from "../../store/user/userSelectors.js";
29
30
  import { changeRenderModeHandler } from "../renderMode/changeRenderModeHandler.js";
30
31
  import { getMigratedAttributeFilters, mergedMigratedAttributeFilters, } from "./common/migratedAttributeFilters.js";
32
+ import { dashboardWithDrillReferences } from "./dashboardDrillReferences.js";
31
33
  import { processLayout } from "./saveDashboardHandler.js";
32
34
  function createDashboard(ctx, saveAsCtx) {
33
35
  return ctx.backend.workspace(ctx.workspace).dashboards().createDashboard(saveAsCtx.dashboardToSave);
@@ -159,10 +161,11 @@ function* createDashboardSaveAsContext(cmd) {
159
161
  ...shareProp,
160
162
  ...pluginsProp,
161
163
  };
164
+ const insights = yield select(selectInsights);
162
165
  return {
163
166
  cmd,
164
167
  dashboardFromState,
165
- dashboardToSave,
168
+ dashboardToSave: dashboardWithDrillReferences(dashboardToSave, insights),
166
169
  };
167
170
  }
168
171
  function* saveAs(ctx, saveAsCtx) {
@@ -1 +1 @@
1
- {"version":3,"file":"saveDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/dashboard/saveDashboardHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,OAAO,EAGH,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAWxB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,2BAA2B,CAAC;AAkChF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AA2J1E,wBAAgB,uBAAuB,CACnC,SAAS,EAAE,oBAAoB,EAC/B,gBAAgB,EAAE,OAAO,YAAO,EAChC,cAAc,EAAE,OAAO,GACxB,oBAAoB,CAkBtB;AAyED,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAEjG;AAoUD,wBAAiB,oBAAoB,CACjC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,cAAc,GACpB,YAAY,CAAC,cAAc,GAAG,SAAS,CAAC,CA+F1C"}
1
+ {"version":3,"file":"saveDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/dashboard/saveDashboardHandler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,OAAO,EAGH,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAWxB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,2BAA2B,CAAC;AAkChF,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AA2L1E,wBAAgB,uBAAuB,CACnC,SAAS,EAAE,oBAAoB,EAC/B,gBAAgB,EAAE,OAAO,YAAO,EAChC,cAAc,EAAE,OAAO,GACxB,oBAAoB,CAkBtB;AAyED,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAEjG;AAsUD,wBAAiB,oBAAoB,CACjC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,cAAc,GACpB,YAAY,CAAC,cAAc,GAAG,SAAS,CAAC,CAsG1C"}
@@ -1,6 +1,6 @@
1
1
  // (C) 2021-2026 GoodData Corporation
2
2
  import { batchActions } from "redux-batched-actions";
3
- import { call, put, select, take } from "redux-saga/effects";
3
+ import { all, call, put, select, take } from "redux-saga/effects";
4
4
  import { invariant } from "ts-invariant";
5
5
  import { isUnexpectedResponseError } from "@gooddata/sdk-backend-spi";
6
6
  import { areObjRefsEqual, insightRef, isTempFilterContext, } from "@gooddata/sdk-model";
@@ -38,6 +38,7 @@ import { isTemporaryIdentity } from "../../utils/dashboardItemUtils.js";
38
38
  import { generateTabLocalIdentifier } from "../../utils/tabLocalIdentifier.js";
39
39
  import { changeRenderModeHandler } from "../renderMode/changeRenderModeHandler.js";
40
40
  import { switchDashboardTabHandler } from "../tabs/switchDashboardTabHandler.js";
41
+ import { dashboardWithDrillReferences } from "./dashboardDrillReferences.js";
41
42
  function* persistDraftInsights(ctx, cmd, insights) {
42
43
  for (const draftInsight of insights) {
43
44
  const persistedInsight = yield call(async () => {
@@ -73,6 +74,26 @@ function* persistDraftInsights(ctx, cmd, insights) {
73
74
  yield put(insightsActions.setInsights(updatedInsights));
74
75
  }
75
76
  }
77
+ async function draftInsightExistsOnBackend(ctx, draftInsight) {
78
+ const ref = insightRef(draftInsight);
79
+ if (!ref) {
80
+ return false;
81
+ }
82
+ try {
83
+ await ctx.backend.workspace(ctx.workspace).insights().getInsight(ref);
84
+ return true;
85
+ }
86
+ catch (error) {
87
+ if (isUnexpectedResponseError(error) && error.httpStatus === 404) {
88
+ return false;
89
+ }
90
+ throw error;
91
+ }
92
+ }
93
+ function* getDraftInsightsToPersist(ctx, draftInsightsOnDashboard) {
94
+ const draftInsightsExistenceOnBackend = yield all(draftInsightsOnDashboard.map((draftInsight) => call(draftInsightExistsOnBackend, ctx, draftInsight)));
95
+ return draftInsightsOnDashboard.filter((_, index) => !draftInsightsExistenceOnBackend[index]);
96
+ }
76
97
  function createDashboard(ctx, saveCtx) {
77
98
  return ctx.backend
78
99
  .workspace(ctx.workspace)
@@ -160,7 +181,7 @@ function processExistingTabs(tabs, parametersByTab, defaultTabNewLocalIdentifier
160
181
  const tabLayout = tab.layout?.layout;
161
182
  const filterContext = tab.filterContext?.filterContextDefinition
162
183
  ? {
163
- ...(tab.filterContext?.filterContextIdentity || {}),
184
+ ...tab.filterContext?.filterContextIdentity,
164
185
  ...tab.filterContext.filterContextDefinition,
165
186
  }
166
187
  : undefined;
@@ -300,11 +321,12 @@ function* createDashboardSaveContext(cmd, isNewDashboard) {
300
321
  ...dashboardFromState,
301
322
  layout: layout ? dashboardLayoutRemoveIdentity(layout, isTemporaryIdentity) : undefined,
302
323
  };
324
+ const insights = yield select(selectInsights);
303
325
  return {
304
326
  cmd,
305
327
  persistedDashboard,
306
328
  dashboardFromState,
307
- dashboardToSave: getDashboardWithSharing(dashboardToSave, capabilities.supportsAccessControl, isNewDashboard),
329
+ dashboardToSave: getDashboardWithSharing(dashboardWithDrillReferences(dashboardToSave, insights), capabilities.supportsAccessControl, isNewDashboard),
308
330
  defaultTabNewLocalIdentifier,
309
331
  };
310
332
  }
@@ -390,8 +412,10 @@ export function* saveDashboardHandler(ctx, cmd) {
390
412
  try {
391
413
  const isInsightNotSavedDialogSaveConfirmed = yield select(selectIsInsightNotSavedDialogSaveConfirmed);
392
414
  const draftInsightsOnDashboard = yield select(selectDraftInsightsUsedOnDashboard);
415
+ const draftInsightsToPersist = yield call(getDraftInsightsToPersist, ctx, draftInsightsOnDashboard);
393
416
  let shouldPersistDraftInsights = isInsightNotSavedDialogSaveConfirmed;
394
- if (draftInsightsOnDashboard.length > 0 && !shouldPersistDraftInsights) {
417
+ if (draftInsightsToPersist.length > 0 && !shouldPersistDraftInsights) {
418
+ yield put(uiActions.setInsightNotSavedDialogDraftInsightsToPersist(draftInsightsToPersist));
395
419
  yield put(uiActions.openInsightNotSavedDialog());
396
420
  const draftInsightDialogAction = yield take([
397
421
  uiActions.confirmInsightNotSavedDialogSubmit.type,
@@ -407,8 +431,8 @@ export function* saveDashboardHandler(ctx, cmd) {
407
431
  if (isInsightNotSavedDialogOpen) {
408
432
  yield put(uiActions.closeInsightNotSavedDialog());
409
433
  }
410
- if (shouldPersistDraftInsights && draftInsightsOnDashboard.length > 0) {
411
- yield call(persistDraftInsights, ctx, cmd, draftInsightsOnDashboard);
434
+ if (shouldPersistDraftInsights && draftInsightsToPersist.length > 0) {
435
+ yield call(persistDraftInsights, ctx, cmd, draftInsightsToPersist);
412
436
  }
413
437
  const persistedDashboard = yield select(selectPersistedDashboard);
414
438
  const isNewDashboard = persistedDashboard === undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"drillToAttributeUrlHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToAttributeUrlHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EACH,KAAK,qCAAqC,EAG7C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,wBAAiB,0BAA0B,CACvC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,oBAAoB,GAC1B,YAAY,CAAC,qCAAqC,CAAC,CAgCrD"}
1
+ {"version":3,"file":"drillToAttributeUrlHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToAttributeUrlHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EACH,KAAK,qCAAqC,EAG7C,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,wBAAiB,0BAA0B,CACvC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,oBAAoB,GAC1B,YAAY,CAAC,qCAAqC,CAAC,CAiCrD"}
@@ -5,7 +5,9 @@ import { drillToAttributeUrlRequested, drillToAttributeUrlResolved, } from "../.
5
5
  import { selectWidgetDrills } from "../../store/tabs/layout/layoutSelectors.js";
6
6
  import { getDrillToUrlFiltersWithResolvedValues } from "./getDrillToUrlFilters.js";
7
7
  import { resolveDrillToAttributeUrl } from "./resolveDrillToAttributeUrl.js";
8
+ import { validateDrillAccess } from "./validateDrillAccess.js";
8
9
  export function* drillToAttributeUrlHandler(ctx, cmd) {
10
+ yield call(validateDrillAccess, ctx, cmd, cmd.payload.drillDefinition);
9
11
  yield put(drillToAttributeUrlRequested(ctx, cmd.payload.drillDefinition, cmd.payload.drillEvent, cmd.correlationId));
10
12
  const [resolvedUrl, filtersInfo] = yield all([
11
13
  call(resolveDrillToAttributeUrl, cmd.payload.drillDefinition, cmd.payload.drillEvent, ctx),
@@ -1 +1 @@
1
- {"version":3,"file":"drillToCustomUrlHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToCustomUrlHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACH,KAAK,kCAAkC,EAG1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,wBAAiB,uBAAuB,CACpC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,GACvB,YAAY,CAAC,kCAAkC,CAAC,CAiClD"}
1
+ {"version":3,"file":"drillToCustomUrlHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToCustomUrlHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACH,KAAK,kCAAkC,EAG1C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAMnE,wBAAiB,uBAAuB,CACpC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,GACvB,YAAY,CAAC,kCAAkC,CAAC,CAkClD"}
@@ -3,7 +3,9 @@ import { all, call, put } from "redux-saga/effects";
3
3
  import { drillToCustomUrlRequested, drillToCustomUrlResolved, } from "../../events/drill.js";
4
4
  import { getDrillToUrlFiltersWithResolvedValues } from "./getDrillToUrlFilters.js";
5
5
  import { resolveDrillToCustomUrl } from "./resolveDrillToCustomUrl.js";
6
+ import { validateDrillAccess } from "./validateDrillAccess.js";
6
7
  export function* drillToCustomUrlHandler(ctx, cmd) {
8
+ yield call(validateDrillAccess, ctx, cmd, cmd.payload.drillDefinition);
7
9
  yield put(drillToCustomUrlRequested(ctx, cmd.payload.drillDefinition, cmd.payload.drillEvent, cmd.correlationId));
8
10
  const [resolvedUrl, filtersInfo] = yield all([
9
11
  call(resolveDrillToCustomUrl, cmd.payload.drillDefinition, cmd.payload.drillEvent.widgetRef, cmd.payload.drillEvent, ctx, cmd),
@@ -1 +1 @@
1
- {"version":3,"file":"drillToDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToDashboardHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAiC/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EACH,KAAK,kCAAkC,EAG1C,MAAM,uBAAuB,CAAC;AAkB/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAUnE,wBAAiB,uBAAuB,CACpC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,GACvB,YAAY,CAAC,kCAAkC,CAAC,CA8HlD"}
1
+ {"version":3,"file":"drillToDashboardHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToDashboardHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAiC/C,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EACH,KAAK,kCAAkC,EAG1C,MAAM,uBAAuB,CAAC;AAkB/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAWnE,wBAAiB,uBAAuB,CACpC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,GACvB,YAAY,CAAC,kCAAkC,CAAC,CA+HlD"}
@@ -16,7 +16,9 @@ import { selectActiveTabDrillParameters } from "../../store/tabs/parameters/para
16
16
  import { convertIntersectionToAttributeFilters, removeIgnoredValuesFromDrillIntersection, } from "./common/intersectionUtils.js";
17
17
  import { mergeDashboardAndSourceFilters } from "./common/mergeFilters.js";
18
18
  import { getIncludedSourceFiltersForDashboard } from "./common/sourceDrillFilters.js";
19
+ import { validateDrillAccess } from "./validateDrillAccess.js";
19
20
  export function* drillToDashboardHandler(ctx, cmd) {
21
+ yield call(validateDrillAccess, ctx, cmd, cmd.payload.drillDefinition);
20
22
  // put start event
21
23
  yield put(drillToDashboardRequested(ctx, cmd.payload.drillDefinition, cmd.payload.drillEvent, cmd.correlationId));
22
24
  // decide if we should use date filter (only if enabled and connected to a dataset)
@@ -1 +1 @@
1
- {"version":3,"file":"drillToInsightHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToInsightHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACH,KAAK,gCAAgC,EAGxC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAInE,wBAAiB,qBAAqB,CAClC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,eAAe,GACrB,YAAY,CAAC,gCAAgC,CAAC,CAuBhD"}
1
+ {"version":3,"file":"drillToInsightHandler.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/drillToInsightHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EACH,KAAK,gCAAgC,EAGxC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,wBAAiB,qBAAqB,CAClC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,eAAe,GACrB,YAAY,CAAC,gCAAgC,CAAC,CAwBhD"}
@@ -1,9 +1,11 @@
1
1
  // (C) 2021-2026 GoodData Corporation
2
- import { put, select } from "redux-saga/effects";
2
+ import { call, put, select } from "redux-saga/effects";
3
3
  import { drillToInsightRequested, drillToInsightResolved, } from "../../events/drill.js";
4
4
  import { selectInsightByRef, selectInsightByWidgetRef } from "../../store/insights/insightsSelectors.js";
5
5
  import { addDrillFiltersToInsight } from "./drillToInsightUtils.js";
6
+ import { validateDrillAccess } from "./validateDrillAccess.js";
6
7
  export function* drillToInsightHandler(ctx, cmd) {
8
+ yield call(validateDrillAccess, ctx, cmd, cmd.payload.drillDefinition);
7
9
  const { drillDefinition, drillEvent } = cmd.payload;
8
10
  const insight = yield select(selectInsightByRef(drillDefinition.target));
9
11
  yield put(drillToInsightRequested(ctx, insight, drillDefinition, drillEvent, cmd.correlationId));
@@ -1 +1 @@
1
- {"version":3,"file":"resolveDrillToCustomUrl.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/resolveDrillToCustomUrl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolveDrillToCustomUrl.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/resolveDrillToCustomUrl.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import stringify from "json-stable-stringify";
3
3
  import { groupBy } from "lodash-es";
4
4
  import { all, call, select } from "redux-saga/effects";
5
5
  import { areObjRefsEqual, dashboardAttributeFilterItemDisplayForm, dashboardFilterObjRef, filterAttributeElements, filterObjRef, insightFilters as insightDefinitionFilters, insightId, isArbitraryAttributeFilter, isAttributeDescriptor, isAttributeElementsByValue, isAttributeFilter, isComparisonCondition, isDashboardArbitraryAttributeFilter, isDashboardAttributeFilter, isDashboardTextAttributeFilter, isIdentifierRef, isMeasureValueFilter, isNegativeAttributeFilter, isRangeCondition, isTextAttributeFilter, isUriRef, measureValueFilterConditions, measureValueFilterMeasure, } from "@gooddata/sdk-model";
6
- import { displayFormPlaceholderRef, getAttributeIdentifiersPlaceholdersFromUrl, getDashboardAttributeFilterPlaceholdersFromUrl, getDashboardMeasureValueFilterPlaceholdersFromUrl, getInsightAttributeFilterPlaceholdersFromUrl, getInsightMeasureValueFilterPlaceholdersFromUrl, } from "@gooddata/sdk-model/internal";
6
+ import { DRILL_TO_URL_PLACEHOLDER, displayFormPlaceholderRef, getAttributeIdentifiersPlaceholdersFromUrl, getDashboardAttributeFilterPlaceholdersFromUrl, getDashboardMeasureValueFilterPlaceholdersFromUrl, getDrillUrlPlaceholderTypes, getInsightAttributeFilterPlaceholdersFromUrl, getInsightMeasureValueFilterPlaceholdersFromUrl, } from "@gooddata/sdk-model/internal";
7
7
  import { isDrillIntersectionAttributeItem, } from "@gooddata/sdk-ui";
8
8
  import { invalidArgumentsProvided } from "../../events/general.js";
9
9
  import { selectAllCatalogDisplayFormsMap, selectAllCatalogMeasuresMap, selectCatalogDateAttributes, } from "../../store/catalog/catalogSelectors.js";
@@ -13,7 +13,6 @@ import { selectDashboardId } from "../../store/meta/metaSelectors.js";
13
13
  import { selectAttributeFilterConfigsOverrides } from "../../store/tabs/attributeFilterConfigs/attributeFilterConfigsSelectors.js";
14
14
  import { selectFilterContextAttributeFilterItems, selectFilterContextMeasureValueFilters, } from "../../store/tabs/filterContext/filterContextSelectors.js";
15
15
  import { selectAnalyticalWidgetByRef } from "../../store/tabs/layout/layoutSelectors.js";
16
- import { DRILL_TO_URL_PLACEHOLDER } from "../../types/drillTypes.js";
17
16
  import { resolveDisplayFormMetadata } from "../../utils/displayFormResolver.js";
18
17
  import { dashboardMeasureValueFilterMatchesIdentifier, insightMeasureValueFilterMatchesIdentifier, } from "../../utils/measureValueFilterUtils.js";
19
18
  import { getElementTitle, getElementsSecondaryTitles } from "./getElementTitle.js";
@@ -340,24 +339,35 @@ export function* getInsightIdentifiersReplacements(customUrl, widgetRef, ctx) {
340
339
  const applyReplacements = (url, replacements) => replacements.reduce((customUrlWithReplacedPlaceholders, { toBeReplaced, replacement, replaceGlobally }) => customUrlWithReplacedPlaceholders.replace(replaceGlobally ? new RegExp(toBeReplaced, "g") : toBeReplaced, replacement), url);
341
340
  export function* resolveDrillToCustomUrl(drillConfig, widgetRef, event, ctx, cmd) {
342
341
  const customUrl = drillConfig.target.url;
343
- const attributeIdentifiersReplacements = yield call(getAttributeIdentifiersReplacements, customUrl, event.drillContext.intersection, ctx);
344
- const dashboardAttributeFilterReplacements = yield call(getDashboardAttributeFilterReplacements, customUrl, ctx);
345
- const insightAttributeFilterReplacements = yield call(getInsightAttributeFilterReplacements, customUrl, widgetRef);
346
- const dashboardMeasureValueFilterReplacements = yield call(getDashboardMeasureValueFilterReplacements, customUrl);
347
- const enableMeasureValueFilterKD = yield select(selectEnableMeasureValueFilterKD);
348
- const insightMeasureValueFilterReplacements = enableMeasureValueFilterKD
349
- ? yield call(getInsightMeasureValueFilterReplacements, customUrl, widgetRef)
350
- : getInsightMeasureValueFilterPlaceholdersFromUrl(customUrl).map(({ placeholder }) => ({
351
- toBeReplaced: placeholder,
352
- replacement: undefined,
353
- }));
354
- const missingReplacements = [
355
- ...attributeIdentifiersReplacements,
356
- ...dashboardAttributeFilterReplacements,
357
- ...insightAttributeFilterReplacements,
358
- ...dashboardMeasureValueFilterReplacements,
359
- ...insightMeasureValueFilterReplacements,
360
- ].filter(({ replacement }) => replacement === undefined);
342
+ const resolveContext = () => getInsightIdentifiersReplacements(customUrl, widgetRef, ctx);
343
+ const resolvers = {
344
+ attribute_title: () => getAttributeIdentifiersReplacements(customUrl, event.drillContext.intersection, ctx),
345
+ dash_attribute_filter_selection: () => getDashboardAttributeFilterReplacements(customUrl, ctx),
346
+ attribute_filter_selection: () => getInsightAttributeFilterReplacements(customUrl, widgetRef),
347
+ dash_mvf_condition: () => getDashboardMeasureValueFilterReplacements(customUrl),
348
+ mvf_condition: function* () {
349
+ const enabled = yield select(selectEnableMeasureValueFilterKD);
350
+ return enabled
351
+ ? yield call(getInsightMeasureValueFilterReplacements, customUrl, widgetRef)
352
+ : getInsightMeasureValueFilterPlaceholdersFromUrl(customUrl).map(({ placeholder }) => ({
353
+ toBeReplaced: placeholder,
354
+ replacement: undefined,
355
+ }));
356
+ },
357
+ [DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_PROJECT_ID]: resolveContext,
358
+ [DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_WORKSPACE_ID]: resolveContext,
359
+ [DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_INSIGHT_ID]: resolveContext,
360
+ [DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_WIDGET_ID]: resolveContext,
361
+ [DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_DASHBOARD_ID]: resolveContext,
362
+ [DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_CLIENT_ID]: resolveContext,
363
+ [DRILL_TO_URL_PLACEHOLDER.DRILL_TO_URL_PLACEHOLDER_DATA_PRODUCT_ID]: resolveContext,
364
+ };
365
+ const replacements = [];
366
+ for (const resolve of new Set(getDrillUrlPlaceholderTypes(customUrl).map((type) => resolvers[type]))) {
367
+ const resolved = yield call(resolve);
368
+ replacements.push(...resolved);
369
+ }
370
+ const missingReplacements = replacements.filter(({ replacement }) => replacement === undefined);
361
371
  if (missingReplacements.length > 0) {
362
372
  // Surface every unresolved placeholder (not just the first) and the URL, so a "Failed to load
363
373
  // URL" is diagnosable from the console without a debugger.
@@ -366,15 +376,6 @@ export function* resolveDrillToCustomUrl(drillConfig, widgetRef, event, ctx, cmd
366
376
  .join(", ")} in URL "${customUrl}". The drill cannot open.`);
367
377
  throw invalidArgumentsProvided(ctx, cmd, `Drill to custom URL unable to resolve missing parameter ${missingReplacements[0].toBeReplaced}`);
368
378
  }
369
- const insightIdentifiersReplacements = yield call(getInsightIdentifiersReplacements, customUrl, widgetRef, ctx);
370
- const replacements = [
371
- ...attributeIdentifiersReplacements,
372
- ...dashboardAttributeFilterReplacements,
373
- ...insightAttributeFilterReplacements,
374
- ...dashboardMeasureValueFilterReplacements,
375
- ...insightMeasureValueFilterReplacements,
376
- ...insightIdentifiersReplacements,
377
- ];
378
379
  return applyReplacements(customUrl, replacements);
379
380
  }
380
381
  function stringifyAttributeFilterSelection(selection, isNegative) {
@@ -0,0 +1,6 @@
1
+ import { type SagaIterator } from "redux-saga";
2
+ import { type DashboardDrillDefinition } from "../../../types.js";
3
+ import { type IDashboardCommand } from "../../commands/base.js";
4
+ import { type DashboardContext } from "../../types/commonTypes.js";
5
+ export declare function validateDrillAccess(ctx: DashboardContext, cmd: IDashboardCommand, drill: DashboardDrillDefinition): SagaIterator<void>;
6
+ //# sourceMappingURL=validateDrillAccess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateDrillAccess.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/drill/validateDrillAccess.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,wBAAiB,mBAAmB,CAChC,GAAG,EAAE,gBAAgB,EACrB,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,wBAAwB,GAChC,YAAY,CAAC,IAAI,CAAC,CAKpB"}
@@ -0,0 +1,10 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { select } from "redux-saga/effects";
3
+ import { invalidArgumentsProvided } from "../../events/general.js";
4
+ import { selectIsDrillRestricted } from "../../store/widgetDrills/drillRestrictionSelectors.js";
5
+ export function* validateDrillAccess(ctx, cmd, drill) {
6
+ const isRestricted = yield select(selectIsDrillRestricted);
7
+ if (isRestricted(drill)) {
8
+ throw invalidArgumentsProvided(ctx, cmd, "The drill target is restricted.");
9
+ }
10
+ }
@@ -0,0 +1,45 @@
1
+ import { type SagaIterator } from "redux-saga";
2
+ import { type DashboardContext } from "../../types/commonTypes.js";
3
+ /**
4
+ * Keeps the dashboard-filter → parameter dependency map complete as the filter contexts change.
5
+ *
6
+ * @remarks
7
+ * Counterpart of {@link newInsightParameterDependenciesWorker} for dashboard filters. After any write
8
+ * to the tabs slice it collects the objects the current filters of every tab read and loads the ones
9
+ * the map does not know yet, so a widget picks up a parameter it now depends on through a filter added
10
+ * or changed after initialization (edit mode, an applied filter view, a new tab). Removing a filter
11
+ * needs nothing: the map is keyed by the object a filter reads, not by the filter, and a widget only
12
+ * consults the entries of the filters it currently has. A failed load leaves the map as it is, so the
13
+ * dependencies known so far stay in effect; the failed roots are not retried until the map is
14
+ * initialized again (a dashboard reload), so a filter on an object the graph rejects does not trigger a
15
+ * request on every later write.
16
+ */
17
+ export declare function newFilterParameterDependenciesWorker(): (ctx: DashboardContext) => SagaIterator<void>;
18
+ /**
19
+ * The roots one store has already requested but that are not in the map: those in flight and those whose
20
+ * request failed. Neither is requested again until {@link IFilterParameterRootTracker.reset}, which also
21
+ * starts a new generation so that a request still in flight from before the reset is discarded on
22
+ * completion instead of writing into the freshly initialized map.
23
+ *
24
+ * @internal
25
+ */
26
+ export interface IFilterParameterRootTracker {
27
+ pending: Set<string>;
28
+ failed: Set<string>;
29
+ generation: number;
30
+ reset(): void;
31
+ }
32
+ /**
33
+ * @internal
34
+ */
35
+ export declare function newFilterParameterRootTracker(): IFilterParameterRootTracker;
36
+ /**
37
+ * Loads the dependencies of the filter roots the map does not know yet. A root is requested at most once
38
+ * between two initializations of the map: one in flight is skipped by the handlers that run meanwhile,
39
+ * and one the graph rejected (a deleted or forbidden object, typically) is remembered by the tracker
40
+ * rather than retried on every later write to the tabs slice. Only real results reach the map.
41
+ *
42
+ * @internal
43
+ */
44
+ export declare function registerFilterParameterDependencies(ctx: DashboardContext, tracker: IFilterParameterRootTracker): SagaIterator<void>;
45
+ //# sourceMappingURL=filterParameterDependenciesWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterParameterDependenciesWorker.d.ts","sourceRoot":"","sources":["../../../../src/model/commandHandlers/parameters/filterParameterDependenciesWorker.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AASnE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oCAAoC,UACQ,gBAAgB,KAAG,YAAY,CAAC,IAAI,CAAC,CAShG;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,2BAA2B;IACxC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,2BAA2B,CAa3E;AAED;;;;;;;GAOG;AACH,wBAAiB,mCAAmC,CAChD,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,2BAA2B,GACrC,YAAY,CAAC,IAAI,CAAC,CAuCpB"}
@@ -0,0 +1,99 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { call, put, select, takeEvery } from "redux-saga/effects";
3
+ import { serializeObjRef } from "@gooddata/sdk-model";
4
+ import { selectCatalogFilterParameters, selectCatalogFilterParametersStatus, } from "../../store/catalog/catalogSelectors.js";
5
+ import { catalogActions } from "../../store/catalog/index.js";
6
+ import { selectFiltersByTab } from "../../store/tabs/filterContext/filterContextSelectors.js";
7
+ import { tabsActions } from "../../store/tabs/index.js";
8
+ import { collectFilterParameterRoots } from "../../store/tabs/parameters/parametersHelpers.js";
9
+ import { unbatched } from "./insightParameterDependenciesWorker.js";
10
+ import { loadReachableParameterMap } from "./loadInsightParameterDependencies.js";
11
+ // every filter context write is a `tabs/*` action (the filter contexts live in the tabs slice)
12
+ const TABS_ACTION_PREFIX = `${tabsActions.setTabs.type.split("/")[0]}/`;
13
+ /**
14
+ * Keeps the dashboard-filter → parameter dependency map complete as the filter contexts change.
15
+ *
16
+ * @remarks
17
+ * Counterpart of {@link newInsightParameterDependenciesWorker} for dashboard filters. After any write
18
+ * to the tabs slice it collects the objects the current filters of every tab read and loads the ones
19
+ * the map does not know yet, so a widget picks up a parameter it now depends on through a filter added
20
+ * or changed after initialization (edit mode, an applied filter view, a new tab). Removing a filter
21
+ * needs nothing: the map is keyed by the object a filter reads, not by the filter, and a widget only
22
+ * consults the entries of the filters it currently has. A failed load leaves the map as it is, so the
23
+ * dependencies known so far stay in effect; the failed roots are not retried until the map is
24
+ * initialized again (a dashboard reload), so a filter on an object the graph rejects does not trigger a
25
+ * request on every later write.
26
+ */
27
+ export function newFilterParameterDependenciesWorker() {
28
+ return function* filterParameterDependenciesWorker(ctx) {
29
+ const tracker = newFilterParameterRootTracker();
30
+ yield takeEvery(catalogActions.setCatalogFilterParameters.match, function onMapReset() {
31
+ tracker.reset();
32
+ });
33
+ yield takeEvery(writesTabs, function* onTabsWritten() {
34
+ yield call(registerFilterParameterDependencies, ctx, tracker);
35
+ });
36
+ };
37
+ }
38
+ /**
39
+ * @internal
40
+ */
41
+ export function newFilterParameterRootTracker() {
42
+ const pending = new Set();
43
+ const failed = new Set();
44
+ return {
45
+ pending,
46
+ failed,
47
+ generation: 0,
48
+ reset() {
49
+ pending.clear();
50
+ failed.clear();
51
+ this.generation += 1;
52
+ },
53
+ };
54
+ }
55
+ /**
56
+ * Loads the dependencies of the filter roots the map does not know yet. A root is requested at most once
57
+ * between two initializations of the map: one in flight is skipped by the handlers that run meanwhile,
58
+ * and one the graph rejected (a deleted or forbidden object, typically) is remembered by the tracker
59
+ * rather than retried on every later write to the tabs slice. Only real results reach the map.
60
+ *
61
+ * @internal
62
+ */
63
+ export function* registerFilterParameterDependencies(ctx, tracker) {
64
+ const status = yield select(selectCatalogFilterParametersStatus);
65
+ if (status !== "loaded") {
66
+ return;
67
+ }
68
+ const filtersByTab = yield select(selectFiltersByTab);
69
+ const known = yield select(selectCatalogFilterParameters);
70
+ const unknownRoots = collectFilterParameterRoots(Object.values(filtersByTab).flat()).filter((root) => {
71
+ const key = serializeObjRef(root);
72
+ return !(key in known) && !tracker.pending.has(key) && !tracker.failed.has(key);
73
+ });
74
+ if (unknownRoots.length === 0) {
75
+ return;
76
+ }
77
+ const keys = unknownRoots.map(serializeObjRef);
78
+ const generation = tracker.generation;
79
+ keys.forEach((key) => tracker.pending.add(key));
80
+ try {
81
+ const byRef = yield call(loadReachableParameterMap, ctx, unknownRoots);
82
+ if (tracker.generation === generation) {
83
+ yield put(catalogActions.mergeCatalogFilterParameters(byRef));
84
+ }
85
+ }
86
+ catch {
87
+ if (tracker.generation === generation) {
88
+ keys.forEach((key) => tracker.failed.add(key));
89
+ }
90
+ }
91
+ finally {
92
+ if (tracker.generation === generation) {
93
+ keys.forEach((key) => tracker.pending.delete(key));
94
+ }
95
+ }
96
+ }
97
+ function writesTabs(action) {
98
+ return unbatched(action).some((item) => item.type.startsWith(TABS_ACTION_PREFIX));
99
+ }
@@ -0,0 +1,11 @@
1
+ import { type Action } from "@reduxjs/toolkit";
2
+ import { type SagaIterator } from "redux-saga";
3
+ import { type DashboardContext } from "../../types/commonTypes.js";
4
+ export declare function newInsightParameterDependenciesWorker(): (ctx: DashboardContext) => SagaIterator<void>;
5
+ /**
6
+ * The plain actions an action stands for: itself, or the (recursively unbatched) members of a batch.
7
+ *
8
+ * @internal
9
+ */
10
+ export declare function unbatched(action: Action): Action[];
11
+ //# sourceMappingURL=insightParameterDependenciesWorker.d.ts.map