@strapi/admin 5.50.0 → 5.50.2

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 (388) hide show
  1. package/dist/admin/admin/src/components/ConfirmDialog.js +2 -2
  2. package/dist/admin/admin/src/components/ConfirmDialog.js.map +1 -1
  3. package/dist/admin/admin/src/components/ContentBox.js +3 -3
  4. package/dist/admin/admin/src/components/ContentBox.js.map +1 -1
  5. package/dist/admin/admin/src/components/DescriptionComponentRenderer.js +8 -8
  6. package/dist/admin/admin/src/components/DescriptionComponentRenderer.js.map +1 -1
  7. package/dist/admin/admin/src/components/DescriptionComponentRenderer.mjs +8 -8
  8. package/dist/admin/admin/src/components/DescriptionComponentRenderer.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/ErrorElement.js +4 -4
  10. package/dist/admin/admin/src/components/ErrorElement.js.map +1 -1
  11. package/dist/admin/admin/src/components/Form.js +41 -27
  12. package/dist/admin/admin/src/components/Form.js.map +1 -1
  13. package/dist/admin/admin/src/components/Form.mjs +41 -27
  14. package/dist/admin/admin/src/components/Form.mjs.map +1 -1
  15. package/dist/admin/admin/src/components/FormInputs/Date.js +1 -1
  16. package/dist/admin/admin/src/components/FormInputs/Date.js.map +1 -1
  17. package/dist/admin/admin/src/components/FormInputs/Date.mjs +1 -1
  18. package/dist/admin/admin/src/components/FormInputs/Date.mjs.map +1 -1
  19. package/dist/admin/admin/src/components/FormInputs/Email.js.map +1 -1
  20. package/dist/admin/admin/src/components/FormInputs/Email.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/FormInputs/Enumeration.js +4 -1
  22. package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
  23. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +4 -1
  24. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/FormInputs/Json.js +2 -1
  26. package/dist/admin/admin/src/components/FormInputs/Json.js.map +1 -1
  27. package/dist/admin/admin/src/components/FormInputs/Json.mjs +2 -1
  28. package/dist/admin/admin/src/components/FormInputs/Json.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/FormInputs/Password.js.map +1 -1
  30. package/dist/admin/admin/src/components/FormInputs/Password.mjs.map +1 -1
  31. package/dist/admin/admin/src/components/FormInputs/Renderer.js +18 -26
  32. package/dist/admin/admin/src/components/FormInputs/Renderer.js.map +1 -1
  33. package/dist/admin/admin/src/components/FormInputs/Renderer.mjs +20 -28
  34. package/dist/admin/admin/src/components/FormInputs/Renderer.mjs.map +1 -1
  35. package/dist/admin/admin/src/components/FormInputs/String.js.map +1 -1
  36. package/dist/admin/admin/src/components/FormInputs/String.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/FormInputs/Textarea.js.map +1 -1
  38. package/dist/admin/admin/src/components/FormInputs/Textarea.mjs.map +1 -1
  39. package/dist/admin/admin/src/components/GapDropZone.js +2 -2
  40. package/dist/admin/admin/src/components/GapDropZone.js.map +1 -1
  41. package/dist/admin/admin/src/components/GradientBadge.js +3 -3
  42. package/dist/admin/admin/src/components/GradientBadge.js.map +1 -1
  43. package/dist/admin/admin/src/components/GuidedTour/Overview.js +8 -8
  44. package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
  45. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js +4 -4
  46. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -1
  47. package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs.map +1 -1
  48. package/dist/admin/admin/src/components/GuidedTour/Tours.js +2 -2
  49. package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -1
  50. package/dist/admin/admin/src/components/Layouts/ActionLayout.js +2 -2
  51. package/dist/admin/admin/src/components/Layouts/ActionLayout.js.map +1 -1
  52. package/dist/admin/admin/src/components/Layouts/GridLayout.js +2 -2
  53. package/dist/admin/admin/src/components/Layouts/GridLayout.js.map +1 -1
  54. package/dist/admin/admin/src/components/Layouts/Layout.js +4 -4
  55. package/dist/admin/admin/src/components/Layouts/Layout.js.map +1 -1
  56. package/dist/admin/admin/src/components/LeftMenu.js +3 -3
  57. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  58. package/dist/admin/admin/src/components/MainNav/MainNav.js +2 -2
  59. package/dist/admin/admin/src/components/MainNav/MainNav.js.map +1 -1
  60. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js +4 -4
  61. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js.map +1 -1
  62. package/dist/admin/admin/src/components/MainNav/NavBrand.js +2 -2
  63. package/dist/admin/admin/src/components/MainNav/NavBrand.js.map +1 -1
  64. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js +3 -3
  65. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js.map +1 -1
  66. package/dist/admin/admin/src/components/MainNav/NavLink.js +8 -8
  67. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  68. package/dist/admin/admin/src/components/MainNav/NavUser.js +7 -7
  69. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  70. package/dist/admin/admin/src/components/MainNav/TrialCountdown.js +3 -3
  71. package/dist/admin/admin/src/components/MainNav/TrialCountdown.js.map +1 -1
  72. package/dist/admin/admin/src/components/NpsSurvey.js +2 -2
  73. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  74. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  75. package/dist/admin/admin/src/components/ResizeIndicator.js +6 -6
  76. package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -1
  77. package/dist/admin/admin/src/components/SubNav.js +11 -9
  78. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  79. package/dist/admin/admin/src/components/SubNav.mjs +4 -2
  80. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  81. package/dist/admin/admin/src/components/Table.js +9 -5
  82. package/dist/admin/admin/src/components/Table.js.map +1 -1
  83. package/dist/admin/admin/src/components/Table.mjs +6 -2
  84. package/dist/admin/admin/src/components/Table.mjs.map +1 -1
  85. package/dist/admin/admin/src/components/Theme.js +2 -2
  86. package/dist/admin/admin/src/components/Theme.js.map +1 -1
  87. package/dist/admin/admin/src/components/UnauthenticatedLogo.js +2 -2
  88. package/dist/admin/admin/src/components/UnauthenticatedLogo.js.map +1 -1
  89. package/dist/admin/admin/src/components/UpsellBanner.js +3 -3
  90. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  91. package/dist/admin/admin/src/components/WidgetRoot.js +4 -7
  92. package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -1
  93. package/dist/admin/admin/src/components/WidgetRoot.mjs +1 -1
  94. package/dist/admin/admin/src/components/WidgetRoot.mjs.map +1 -1
  95. package/dist/admin/admin/src/components/Widgets.js +5 -5
  96. package/dist/admin/admin/src/components/Widgets.js.map +1 -1
  97. package/dist/admin/admin/src/core/apis/Plugin.js.map +1 -1
  98. package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
  99. package/dist/admin/admin/src/core/apis/Widgets.js +1 -1
  100. package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
  101. package/dist/admin/admin/src/core/apis/Widgets.mjs +1 -1
  102. package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -1
  103. package/dist/admin/admin/src/core/store/configure.js.map +1 -1
  104. package/dist/admin/admin/src/core/store/configure.mjs.map +1 -1
  105. package/dist/admin/admin/src/core/utils/createHook.js.map +1 -1
  106. package/dist/admin/admin/src/core/utils/createHook.mjs.map +1 -1
  107. package/dist/admin/admin/src/features/Tracking.js +3 -1
  108. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  109. package/dist/admin/admin/src/features/Tracking.mjs +3 -1
  110. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  111. package/dist/admin/admin/src/features/Widgets.js.map +1 -1
  112. package/dist/admin/admin/src/features/Widgets.mjs.map +1 -1
  113. package/dist/admin/admin/src/hooks/useMediaQuery.js +4 -4
  114. package/dist/admin/admin/src/hooks/useMediaQuery.js.map +1 -1
  115. package/dist/admin/admin/src/hooks/useMenu.js +6 -4
  116. package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
  117. package/dist/admin/admin/src/hooks/useMenu.mjs +6 -4
  118. package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
  119. package/dist/admin/admin/src/hooks/useQueryParams.js.map +1 -1
  120. package/dist/admin/admin/src/hooks/useQueryParams.mjs.map +1 -1
  121. package/dist/admin/admin/src/hooks/useRBAC.js +1 -1
  122. package/dist/admin/admin/src/hooks/useRBAC.js.map +1 -1
  123. package/dist/admin/admin/src/hooks/useRBAC.mjs +1 -1
  124. package/dist/admin/admin/src/hooks/useRBAC.mjs.map +1 -1
  125. package/dist/admin/admin/src/hooks/useThrottledCallback.js.map +1 -1
  126. package/dist/admin/admin/src/hooks/useThrottledCallback.mjs.map +1 -1
  127. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +1 -1
  128. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  129. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +1 -1
  130. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  131. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js +3 -3
  132. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js.map +1 -1
  133. package/dist/admin/admin/src/pages/Auth/components/Register.js +17 -9
  134. package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
  135. package/dist/admin/admin/src/pages/Auth/components/Register.mjs +15 -7
  136. package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
  137. package/dist/admin/admin/src/pages/Home/HomePage.js +2 -2
  138. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  139. package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js +3 -6
  140. package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js.map +1 -1
  141. package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs +1 -1
  142. package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs.map +1 -1
  143. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js +4 -8
  144. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
  145. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs +1 -1
  146. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
  147. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js +4 -8
  148. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js.map +1 -1
  149. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs +1 -1
  150. package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs.map +1 -1
  151. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +2 -2
  152. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  153. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  154. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +2 -2
  155. package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
  156. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +2 -2
  157. package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
  158. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +2 -2
  159. package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
  160. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js +2 -2
  161. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js.map +1 -1
  162. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +4 -4
  163. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
  164. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.js.map +1 -1
  165. package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.mjs.map +1 -1
  166. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +3 -11
  167. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  168. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +3 -11
  169. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  170. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js +2 -2
  171. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
  172. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +2 -2
  173. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
  174. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.js +2 -2
  175. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.js.map +1 -1
  176. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +10 -10
  177. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
  178. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.js +3 -3
  179. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.js.map +1 -1
  180. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +5 -5
  181. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
  182. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/HiddenAction.js +2 -2
  183. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/HiddenAction.js.map +1 -1
  184. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +3 -3
  185. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
  186. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.js.map +1 -1
  187. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.mjs.map +1 -1
  188. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
  189. package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
  190. package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.js +3 -3
  191. package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.js.map +1 -1
  192. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js +2 -2
  193. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js.map +1 -1
  194. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +2 -2
  195. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js.map +1 -1
  196. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs.map +1 -1
  197. package/dist/admin/admin/src/reducer.js +3 -3
  198. package/dist/admin/admin/src/reducer.js.map +1 -1
  199. package/dist/admin/admin/src/reducer.mjs +4 -4
  200. package/dist/admin/admin/src/reducer.mjs.map +1 -1
  201. package/dist/admin/admin/src/render.js +6 -2
  202. package/dist/admin/admin/src/render.js.map +1 -1
  203. package/dist/admin/admin/src/render.mjs +6 -2
  204. package/dist/admin/admin/src/render.mjs.map +1 -1
  205. package/dist/admin/admin/src/translations/en.json.js +1 -2
  206. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  207. package/dist/admin/admin/src/translations/en.json.mjs +1 -2
  208. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  209. package/dist/admin/admin/src/translations/ja.json.js +693 -687
  210. package/dist/admin/admin/src/translations/ja.json.js.map +1 -1
  211. package/dist/admin/admin/src/translations/ja.json.mjs +693 -687
  212. package/dist/admin/admin/src/translations/ja.json.mjs.map +1 -1
  213. package/dist/admin/admin/src/translations/ko.json.js +157 -1
  214. package/dist/admin/admin/src/translations/ko.json.js.map +1 -1
  215. package/dist/admin/admin/src/translations/ko.json.mjs +157 -1
  216. package/dist/admin/admin/src/translations/ko.json.mjs.map +1 -1
  217. package/dist/admin/admin/src/translations/pl.json.js +22 -0
  218. package/dist/admin/admin/src/translations/pl.json.js.map +1 -1
  219. package/dist/admin/admin/src/translations/pl.json.mjs +22 -0
  220. package/dist/admin/admin/src/translations/pl.json.mjs.map +1 -1
  221. package/dist/admin/admin/src/utils/arrays.js.map +1 -1
  222. package/dist/admin/admin/src/utils/arrays.mjs.map +1 -1
  223. package/dist/admin/admin/src/utils/baseQuery.js +1 -1
  224. package/dist/admin/admin/src/utils/baseQuery.js.map +1 -1
  225. package/dist/admin/admin/src/utils/baseQuery.mjs +1 -1
  226. package/dist/admin/admin/src/utils/baseQuery.mjs.map +1 -1
  227. package/dist/admin/admin/src/utils/cookies.js +7 -0
  228. package/dist/admin/admin/src/utils/cookies.js.map +1 -1
  229. package/dist/admin/admin/src/utils/cookies.mjs +7 -1
  230. package/dist/admin/admin/src/utils/cookies.mjs.map +1 -1
  231. package/dist/admin/admin/src/utils/getFetchClient.js +2 -2
  232. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  233. package/dist/admin/admin/src/utils/getFetchClient.mjs +3 -3
  234. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  235. package/dist/admin/admin/src/utils/getProjectType.js +22 -0
  236. package/dist/admin/admin/src/utils/getProjectType.js.map +1 -0
  237. package/dist/admin/admin/src/utils/getProjectType.mjs +20 -0
  238. package/dist/admin/admin/src/utils/getProjectType.mjs.map +1 -0
  239. package/dist/admin/admin/src/utils/objects.js +43 -11
  240. package/dist/admin/admin/src/utils/objects.js.map +1 -1
  241. package/dist/admin/admin/src/utils/objects.mjs +43 -11
  242. package/dist/admin/admin/src/utils/objects.mjs.map +1 -1
  243. package/dist/admin/admin/src/utils/once.js.map +1 -1
  244. package/dist/admin/admin/src/utils/once.mjs.map +1 -1
  245. package/dist/admin/admin/src/utils/rulesEngine.js +2 -1
  246. package/dist/admin/admin/src/utils/rulesEngine.js.map +1 -1
  247. package/dist/admin/admin/src/utils/rulesEngine.mjs +2 -1
  248. package/dist/admin/admin/src/utils/rulesEngine.mjs.map +1 -1
  249. package/dist/admin/admin/src/utils/shims.js.map +1 -1
  250. package/dist/admin/admin/src/utils/shims.mjs.map +1 -1
  251. package/dist/admin/admin/src/utils/widgetVisibility.js +16 -1
  252. package/dist/admin/admin/src/utils/widgetVisibility.js.map +1 -1
  253. package/dist/admin/admin/src/utils/widgetVisibility.mjs +14 -2
  254. package/dist/admin/admin/src/utils/widgetVisibility.mjs.map +1 -1
  255. package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js +2 -2
  256. package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js.map +1 -1
  257. package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js +2 -2
  258. package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js.map +1 -1
  259. package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.mjs +2 -2
  260. package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.mjs.map +1 -1
  261. package/dist/admin/ee/admin/src/pages/AuthPage/components/Login.js +2 -2
  262. package/dist/admin/ee/admin/src/pages/AuthPage/components/Login.js.map +1 -1
  263. package/dist/admin/ee/admin/src/pages/AuthPage/components/Providers.js +2 -2
  264. package/dist/admin/ee/admin/src/pages/AuthPage/components/Providers.js.map +1 -1
  265. package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.js +3 -3
  266. package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.js.map +1 -1
  267. package/dist/admin/ee/admin/src/pages/AuthResponse.js +1 -1
  268. package/dist/admin/ee/admin/src/pages/AuthResponse.js.map +1 -1
  269. package/dist/admin/ee/admin/src/pages/AuthResponse.mjs +2 -2
  270. package/dist/admin/ee/admin/src/pages/AuthResponse.mjs.map +1 -1
  271. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +3 -3
  272. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  273. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
  274. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
  275. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ComboboxFilter.js.map +1 -1
  276. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ComboboxFilter.mjs.map +1 -1
  277. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js +2 -2
  278. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js.map +1 -1
  279. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  280. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  281. package/dist/admin/shared/utils/auth-cookie-name.js +31 -0
  282. package/dist/admin/shared/utils/auth-cookie-name.js.map +1 -0
  283. package/dist/admin/shared/utils/auth-cookie-name.mjs +28 -0
  284. package/dist/admin/shared/utils/auth-cookie-name.mjs.map +1 -0
  285. package/dist/admin/src/StrapiApp.d.ts +2 -2
  286. package/dist/admin/src/components/DescriptionComponentRenderer.d.ts +2 -1
  287. package/dist/admin/src/components/Form.d.ts +14 -12
  288. package/dist/admin/src/components/FormInputs/Renderer.d.ts +1 -1
  289. package/dist/admin/src/components/GuidedTour/Steps/Step.d.ts +1 -1
  290. package/dist/admin/src/components/SubNav.d.ts +1 -1
  291. package/dist/admin/src/components/Table.d.ts +3 -2
  292. package/dist/admin/src/core/apis/Plugin.d.ts +1 -1
  293. package/dist/admin/src/core/utils/createHook.d.ts +6 -6
  294. package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
  295. package/dist/admin/src/hooks/useMenu.d.ts +1 -1
  296. package/dist/admin/src/hooks/useQueryParams.d.ts +2 -1
  297. package/dist/admin/src/hooks/useThrottledCallback.d.ts +1 -1
  298. package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.d.ts +1 -1
  299. package/dist/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.d.ts +1 -1
  300. package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +5 -5
  301. package/dist/admin/src/services/admin.d.ts +6 -6
  302. package/dist/admin/src/services/api.d.ts +1 -1
  303. package/dist/admin/src/services/apiTokens.d.ts +2 -2
  304. package/dist/admin/src/services/auth.d.ts +12 -12
  305. package/dist/admin/src/services/contentApi.d.ts +1 -1
  306. package/dist/admin/src/services/contentManager.d.ts +1 -1
  307. package/dist/admin/src/services/homepage.d.ts +3 -3
  308. package/dist/admin/src/services/transferTokens.d.ts +1 -1
  309. package/dist/admin/src/services/users.d.ts +8 -8
  310. package/dist/admin/src/services/webhooks.d.ts +3 -3
  311. package/dist/admin/src/utils/arrays.d.ts +1 -1
  312. package/dist/admin/src/utils/baseQuery.d.ts +1 -1
  313. package/dist/admin/src/utils/cookies.d.ts +5 -0
  314. package/dist/admin/src/utils/getFetchClient.d.ts +7 -7
  315. package/dist/admin/src/utils/getProjectType.d.ts +16 -0
  316. package/dist/admin/src/utils/objects.d.ts +6 -4
  317. package/dist/admin/src/utils/once.d.ts +1 -1
  318. package/dist/admin/src/utils/widgetVisibility.d.ts +11 -0
  319. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.d.ts +1 -1
  320. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/tableHeaders.d.ts +2 -1
  321. package/dist/ee/admin/src/services/ai.d.ts +3 -3
  322. package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
  323. package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts +1 -1
  324. package/dist/ee/server/src/controllers/admin.d.ts +2 -0
  325. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  326. package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
  327. package/dist/ee/server/src/controllers/index.d.ts +2 -0
  328. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  329. package/dist/ee/server/src/index.d.ts +2 -0
  330. package/dist/ee/server/src/index.d.ts.map +1 -1
  331. package/dist/ee/server/src/routes/index.d.ts +2 -2
  332. package/dist/ee/server/src/routes/sso.d.ts +2 -2
  333. package/dist/ee/server/src/services/index.d.ts +2 -2
  334. package/dist/server/ee/server/src/controllers/admin.js +1 -0
  335. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  336. package/dist/server/ee/server/src/controllers/admin.mjs +1 -0
  337. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  338. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +1 -1
  339. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
  340. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +2 -2
  341. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
  342. package/dist/server/server/src/services/permission/sections-builder/handlers.js +9 -2
  343. package/dist/server/server/src/services/permission/sections-builder/handlers.js.map +1 -1
  344. package/dist/server/server/src/services/permission/sections-builder/handlers.mjs +9 -2
  345. package/dist/server/server/src/services/permission/sections-builder/handlers.mjs.map +1 -1
  346. package/dist/server/server/src/services/role.js +5 -1
  347. package/dist/server/server/src/services/role.js.map +1 -1
  348. package/dist/server/server/src/services/role.mjs +5 -1
  349. package/dist/server/server/src/services/role.mjs.map +1 -1
  350. package/dist/server/server/src/validation/common-validators.js +19 -11
  351. package/dist/server/server/src/validation/common-validators.js.map +1 -1
  352. package/dist/server/server/src/validation/common-validators.mjs +19 -11
  353. package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
  354. package/dist/server/server/src/validation/permission.js +1 -1
  355. package/dist/server/server/src/validation/permission.js.map +1 -1
  356. package/dist/server/server/src/validation/permission.mjs +1 -1
  357. package/dist/server/server/src/validation/permission.mjs.map +1 -1
  358. package/dist/server/server/src/validation/role.js +2 -2
  359. package/dist/server/server/src/validation/role.js.map +1 -1
  360. package/dist/server/server/src/validation/role.mjs +2 -2
  361. package/dist/server/server/src/validation/role.mjs.map +1 -1
  362. package/dist/server/shared/utils/auth-cookie-name.js +31 -0
  363. package/dist/server/shared/utils/auth-cookie-name.js.map +1 -0
  364. package/dist/server/shared/utils/auth-cookie-name.mjs +28 -0
  365. package/dist/server/shared/utils/auth-cookie-name.mjs.map +1 -0
  366. package/dist/server/shared/utils/session-auth.js +6 -0
  367. package/dist/server/shared/utils/session-auth.js.map +1 -1
  368. package/dist/server/shared/utils/session-auth.mjs +6 -1
  369. package/dist/server/shared/utils/session-auth.mjs.map +1 -1
  370. package/dist/server/src/controllers/admin.d.ts +3 -3
  371. package/dist/server/src/controllers/index.d.ts +3 -3
  372. package/dist/server/src/domain/user.d.ts +1 -1
  373. package/dist/server/src/index.d.ts +19 -19
  374. package/dist/server/src/middlewares/index.d.ts +1 -1
  375. package/dist/server/src/services/index.d.ts +13 -13
  376. package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
  377. package/dist/server/src/services/role.d.ts.map +1 -1
  378. package/dist/server/src/validation/common-validators.d.ts.map +1 -1
  379. package/dist/server/src/validation/role.d.ts.map +1 -1
  380. package/dist/shared/utils/__tests__/auth-cookie-name.test.d.ts +1 -0
  381. package/dist/shared/utils/__tests__/auth-cookie-name.test.d.ts.map +1 -0
  382. package/dist/shared/utils/__tests__/session-auth.test.d.ts +1 -0
  383. package/dist/shared/utils/__tests__/session-auth.test.d.ts.map +1 -0
  384. package/dist/shared/utils/auth-cookie-name.d.ts +14 -0
  385. package/dist/shared/utils/auth-cookie-name.d.ts.map +1 -0
  386. package/dist/shared/utils/session-auth.d.ts +1 -0
  387. package/dist/shared/utils/session-auth.d.ts.map +1 -1
  388. package/package.json +20 -17
@@ -1 +1 @@
1
- {"version":3,"file":"Widgets.js","sources":["../../../../../admin/src/features/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useUpdateHomepageLayoutMutation } from '../services/homepage';\nimport {\n calculateWidgetRows,\n moveWidgetInArray,\n findRowContainingWidget,\n resizeRowAfterRemoval,\n resizeRowAfterAddition,\n isValidResizeOperation,\n canResizeBetweenWidgets,\n WIDGET_SIZING,\n} from '../utils/widgetLayout';\n\nimport { useNotification } from './Notifications';\n\nimport type { WidgetWithUID } from '../core/apis/Widgets';\nimport type { WidgetType } from '@strapi/admin/strapi-admin';\n\nexport interface WidgetInfo {\n widget: WidgetType | undefined;\n index: number;\n}\n\nexport type FindWidgetFunction = (id: string) => WidgetInfo;\nexport type WidgetIdFunction = (id: string) => void;\nexport type DragEndFunction = () => void;\n\ninterface BaseWidgetContext {\n filteredWidgets: WidgetWithUID[];\n columnWidths: Record<string, number>;\n}\n\ninterface MoveWidgetOptions extends BaseWidgetContext {\n widgetId: string;\n insertIndex: number;\n targetRowIndex?: number;\n isHorizontalDrop?: boolean;\n}\n\ninterface SaveLayoutOptions {\n widgets: WidgetWithUID[];\n widths: Record<string, number>;\n updateHomepageLayout: (data: {\n widgets: Array<{ uid: string; width: (typeof WIDGET_SIZING.DISCRETE_SIZES)[number] }>;\n }) => Promise<any>;\n toggleNotification: (config: { type: 'danger'; message: string }) => void;\n formatAPIError: (error: any) => string;\n formatMessage: (descriptor: { id: string; defaultMessage: string }) => string;\n}\n\ninterface HandleWidgetResizeOptions extends BaseWidgetContext {\n leftWidgetId: string;\n rightWidgetId: string;\n newLeftWidth: number;\n newRightWidth: number;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Widget Management\n * -----------------------------------------------------------------------------------------------*/\n\nconst findWidget = (filteredWidgets: WidgetWithUID[], widgetId: string): WidgetInfo => {\n const widget = filteredWidgets.find((c) => `${c.uid}` === widgetId);\n if (!widget) {\n return {\n widget: undefined,\n index: -1,\n };\n }\n return {\n widget,\n index: filteredWidgets.indexOf(widget),\n };\n};\n\nconst saveLayout = async ({\n widgets,\n widths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n}: SaveLayoutOptions) => {\n try {\n const layoutData = {\n widgets: widgets.map((widget) => ({\n uid: widget.uid,\n width: (widths[widget.uid] ||\n WIDGET_SIZING.TOTAL_COLUMNS) as (typeof WIDGET_SIZING.DISCRETE_SIZES)[number],\n })),\n };\n\n const res = await updateHomepageLayout(layoutData);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n};\n\nconst moveWidget = ({\n filteredWidgets,\n columnWidths,\n widgetId,\n insertIndex,\n targetRowIndex,\n isHorizontalDrop,\n}: MoveWidgetOptions) => {\n const widget = filteredWidgets.find((w) => w.uid === widgetId);\n if (!widget) return { newWidgets: filteredWidgets, newWidths: columnWidths };\n\n const widgetRows = calculateWidgetRows(filteredWidgets, columnWidths);\n\n // Move widget in the array\n const newWidgets = moveWidgetInArray(filteredWidgets, widgetId, insertIndex);\n\n // Calculate optimal widths for both source and target rows\n const newWidths = { ...columnWidths };\n\n // Find the source row (where the widget was removed from)\n const sourceRow = findRowContainingWidget(widgetRows, widgetId, filteredWidgets);\n\n if (isHorizontalDrop) {\n // This is a horizontal drop zone - widget gets full width in its own row\n newWidths[widgetId] = WIDGET_SIZING.TOTAL_COLUMNS;\n\n // Resize source row (after widget removal)\n const sourceRowResize = resizeRowAfterRemoval(sourceRow, widgetId, newWidths);\n Object.assign(newWidths, sourceRowResize);\n } else {\n // This is a vertical drop zone within a row\n const targetRow = widgetRows[targetRowIndex!];\n\n // Check if we're reordering within the same row\n const isSameRowReorder =\n sourceRow && targetRow && sourceRow.startIndex === targetRow.startIndex;\n\n if (isSameRowReorder) {\n // For same-row reordering, just preserve the existing widths\n return { newWidgets, newWidths };\n }\n\n // Different rows - resize both source and target rows\n // Resize source row (after widget removal)\n const sourceRowResize = resizeRowAfterRemoval(sourceRow, widgetId, newWidths);\n Object.assign(newWidths, sourceRowResize);\n\n // Resize target row (after widget addition)\n const targetRowResize = resizeRowAfterAddition(targetRow, widget, insertIndex, newWidths);\n Object.assign(newWidths, targetRowResize);\n }\n\n return { newWidgets, newWidths };\n};\n\nconst deleteWidget = (filteredWidgets: WidgetWithUID[], columnWidths: Record<string, number>) => {\n const widgetRows = calculateWidgetRows(filteredWidgets, columnWidths);\n\n return (widgetId: string) => {\n const { [widgetId]: _removed, ...newWidths } = columnWidths;\n\n // Find the row containing the deleted widget\n const deletedWidgetIndex = filteredWidgets.findIndex((w) => w.uid === widgetId);\n if (deletedWidgetIndex === -1) return { newWidgets: filteredWidgets, newWidths };\n const affectedRow = widgetRows.find(\n (row) => deletedWidgetIndex >= row.startIndex && deletedWidgetIndex <= row.endIndex\n );\n\n // Use resizeRowAfterRemoval to resize the affected row\n const finalWidths = resizeRowAfterRemoval(affectedRow, widgetId, newWidths);\n const newWidgets = filteredWidgets.filter((w) => w.uid !== widgetId);\n\n return { newWidgets, newWidths: finalWidths };\n };\n};\n\nconst addWidget = (filteredWidgets: WidgetWithUID[], columnWidths: Record<string, number>) => {\n return (widget: WidgetWithUID) => {\n // Check if widget is already added\n const index = filteredWidgets.findIndex((w) => w.uid === widget.uid);\n if (index !== -1) return { newWidgets: filteredWidgets, newWidths: columnWidths };\n\n const newWidgets = [...filteredWidgets, widget];\n const newWidths = { ...columnWidths };\n // New widget always takes full width in its own row\n newWidths[widget.uid] = WIDGET_SIZING.TOTAL_COLUMNS;\n\n return { newWidgets, newWidths };\n };\n};\n\nconst handleWidgetResize = ({\n filteredWidgets,\n columnWidths,\n leftWidgetId,\n rightWidgetId,\n newLeftWidth,\n newRightWidth,\n}: HandleWidgetResizeOptions) => {\n // Check if widgets can be resized (adjacent, same row, valid sizes)\n if (!canResizeBetweenWidgets(leftWidgetId, rightWidgetId, columnWidths, filteredWidgets)) {\n return columnWidths;\n }\n\n if (!isValidResizeOperation(newLeftWidth, newRightWidth)) {\n // Resize would violate constraints, don't allow it\n return columnWidths;\n }\n\n return {\n ...columnWidths,\n [leftWidgetId]: newLeftWidth,\n [rightWidgetId]: newRightWidth,\n };\n};\n\ninterface UseWidgetsOptions {\n filteredWidgets: WidgetWithUID[];\n setFilteredWidgets: (\n widgets: WidgetWithUID[] | ((prev: WidgetWithUID[]) => WidgetWithUID[])\n ) => void;\n}\n\nexport const useWidgets = ({ filteredWidgets, setFilteredWidgets }: UseWidgetsOptions) => {\n const [columnWidths, setColumnWidths] = React.useState<Record<string, number>>({});\n const [isDraggingWidget, setIsDraggingWidget] = React.useState(false);\n const [draggedWidgetId, setDraggedWidgetId] = React.useState<string | undefined>();\n\n const [updateHomepageLayout] = useUpdateHomepageLayoutMutation();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const findWidgetFn: FindWidgetFunction = (widgetId: string) =>\n findWidget(filteredWidgets, widgetId);\n\n const moveWidgetFn = (\n widgetId: string,\n insertIndex: number,\n targetRowIndex?: number,\n isHorizontalDrop?: boolean\n ) => {\n const result = moveWidget({\n filteredWidgets,\n columnWidths,\n widgetId,\n insertIndex,\n targetRowIndex,\n isHorizontalDrop,\n });\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const deleteWidgetFn: WidgetIdFunction = (widgetId: string) => {\n const deleteWidgetOperation = deleteWidget(filteredWidgets, columnWidths);\n const result = deleteWidgetOperation(widgetId);\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const addWidgetFn = (widget: WidgetWithUID) => {\n const addWidgetOperation = addWidget(filteredWidgets, columnWidths);\n const result = addWidgetOperation(widget);\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const handleWidgetResizeFn = (\n leftWidgetId: string,\n rightWidgetId: string,\n newLeftWidth: number,\n newRightWidth: number\n ) => {\n const newWidths = handleWidgetResize({\n filteredWidgets,\n columnWidths,\n leftWidgetId,\n rightWidgetId,\n newLeftWidth,\n newRightWidth,\n });\n\n setColumnWidths(newWidths);\n };\n\n const handleDragStart: WidgetIdFunction = React.useCallback((widgetId: string) => {\n setIsDraggingWidget(true);\n setDraggedWidgetId(widgetId);\n }, []);\n\n const handleDragEnd: DragEndFunction = React.useCallback(() => {\n setIsDraggingWidget(false);\n setDraggedWidgetId(undefined);\n }, []);\n\n const saveLayoutFn = () => {\n saveLayout({\n widgets: filteredWidgets,\n widths: columnWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n return {\n findWidget: findWidgetFn,\n deleteWidget: deleteWidgetFn,\n addWidget: addWidgetFn,\n moveWidget: moveWidgetFn,\n columnWidths,\n setColumnWidths,\n handleWidgetResize: handleWidgetResizeFn,\n saveLayout: saveLayoutFn,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n };\n};\n"],"names":["findWidget","filteredWidgets","widgetId","widget","find","c","uid","undefined","index","indexOf","saveLayout","widgets","widths","updateHomepageLayout","toggleNotification","formatAPIError","formatMessage","layoutData","map","width","WIDGET_SIZING","TOTAL_COLUMNS","res","type","message","error","id","defaultMessage","moveWidget","columnWidths","insertIndex","targetRowIndex","isHorizontalDrop","w","newWidgets","newWidths","widgetRows","calculateWidgetRows","moveWidgetInArray","sourceRow","findRowContainingWidget","sourceRowResize","resizeRowAfterRemoval","Object","assign","targetRow","isSameRowReorder","startIndex","targetRowResize","resizeRowAfterAddition","deleteWidget","_removed","deletedWidgetIndex","findIndex","affectedRow","row","endIndex","finalWidths","filter","addWidget","handleWidgetResize","leftWidgetId","rightWidgetId","newLeftWidth","newRightWidth","canResizeBetweenWidgets","isValidResizeOperation","useWidgets","setFilteredWidgets","setColumnWidths","React","useState","isDraggingWidget","setIsDraggingWidget","draggedWidgetId","setDraggedWidgetId","useUpdateHomepageLayoutMutation","useNotification","_unstableFormatAPIError","useAPIErrorHandler","useIntl","findWidgetFn","moveWidgetFn","result","deleteWidgetFn","deleteWidgetOperation","addWidgetFn","addWidgetOperation","handleWidgetResizeFn","handleDragStart","useCallback","handleDragEnd","saveLayoutFn"],"mappings":"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"}
1
+ {"version":3,"file":"Widgets.js","sources":["../../../../../admin/src/features/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useUpdateHomepageLayoutMutation } from '../services/homepage';\nimport {\n calculateWidgetRows,\n moveWidgetInArray,\n findRowContainingWidget,\n resizeRowAfterRemoval,\n resizeRowAfterAddition,\n isValidResizeOperation,\n canResizeBetweenWidgets,\n WIDGET_SIZING,\n} from '../utils/widgetLayout';\n\nimport { useNotification } from './Notifications';\n\nimport type { WidgetWithUID } from '../core/apis/Widgets';\nimport type { WidgetType } from '@strapi/admin/strapi-admin';\n\nexport interface WidgetInfo {\n widget: WidgetType | undefined;\n index: number;\n}\n\nexport type FindWidgetFunction = (id: string) => WidgetInfo;\nexport type WidgetIdFunction = (id: string) => void;\nexport type DragEndFunction = () => void;\n\ninterface BaseWidgetContext {\n filteredWidgets: WidgetWithUID[];\n columnWidths: Record<string, number>;\n}\n\ninterface MoveWidgetOptions extends BaseWidgetContext {\n widgetId: string;\n insertIndex: number;\n targetRowIndex?: number;\n isHorizontalDrop?: boolean;\n}\n\ninterface SaveLayoutOptions {\n widgets: WidgetWithUID[];\n widths: Record<string, number>;\n updateHomepageLayout: ReturnType<typeof useUpdateHomepageLayoutMutation>[0];\n toggleNotification: (config: { type: 'danger'; message: string }) => void;\n formatAPIError: ReturnType<typeof useAPIErrorHandler>['_unstableFormatAPIError'];\n formatMessage: (descriptor: { id: string; defaultMessage: string }) => string;\n}\n\ninterface HandleWidgetResizeOptions extends BaseWidgetContext {\n leftWidgetId: string;\n rightWidgetId: string;\n newLeftWidth: number;\n newRightWidth: number;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Widget Management\n * -----------------------------------------------------------------------------------------------*/\n\nconst findWidget = (filteredWidgets: WidgetWithUID[], widgetId: string): WidgetInfo => {\n const widget = filteredWidgets.find((c) => `${c.uid}` === widgetId);\n if (!widget) {\n return {\n widget: undefined,\n index: -1,\n };\n }\n return {\n widget,\n index: filteredWidgets.indexOf(widget),\n };\n};\n\nconst saveLayout = async ({\n widgets,\n widths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n}: SaveLayoutOptions) => {\n try {\n const layoutData = {\n widgets: widgets.map((widget) => ({\n uid: widget.uid,\n width: (widths[widget.uid] ||\n WIDGET_SIZING.TOTAL_COLUMNS) as (typeof WIDGET_SIZING.DISCRETE_SIZES)[number],\n })),\n };\n\n const res = await updateHomepageLayout(layoutData);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n};\n\nconst moveWidget = ({\n filteredWidgets,\n columnWidths,\n widgetId,\n insertIndex,\n targetRowIndex,\n isHorizontalDrop,\n}: MoveWidgetOptions) => {\n const widget = filteredWidgets.find((w) => w.uid === widgetId);\n if (!widget) return { newWidgets: filteredWidgets, newWidths: columnWidths };\n\n const widgetRows = calculateWidgetRows(filteredWidgets, columnWidths);\n\n // Move widget in the array\n const newWidgets = moveWidgetInArray(filteredWidgets, widgetId, insertIndex);\n\n // Calculate optimal widths for both source and target rows\n const newWidths = { ...columnWidths };\n\n // Find the source row (where the widget was removed from)\n const sourceRow = findRowContainingWidget(widgetRows, widgetId, filteredWidgets);\n\n if (isHorizontalDrop) {\n // This is a horizontal drop zone - widget gets full width in its own row\n newWidths[widgetId] = WIDGET_SIZING.TOTAL_COLUMNS;\n\n // Resize source row (after widget removal)\n const sourceRowResize = resizeRowAfterRemoval(sourceRow, widgetId, newWidths);\n Object.assign(newWidths, sourceRowResize);\n } else {\n // This is a vertical drop zone within a row\n const targetRow = widgetRows[targetRowIndex!];\n\n // Check if we're reordering within the same row\n const isSameRowReorder =\n sourceRow && targetRow && sourceRow.startIndex === targetRow.startIndex;\n\n if (isSameRowReorder) {\n // For same-row reordering, just preserve the existing widths\n return { newWidgets, newWidths };\n }\n\n // Different rows - resize both source and target rows\n // Resize source row (after widget removal)\n const sourceRowResize = resizeRowAfterRemoval(sourceRow, widgetId, newWidths);\n Object.assign(newWidths, sourceRowResize);\n\n // Resize target row (after widget addition)\n const targetRowResize = resizeRowAfterAddition(targetRow, widget, insertIndex, newWidths);\n Object.assign(newWidths, targetRowResize);\n }\n\n return { newWidgets, newWidths };\n};\n\nconst deleteWidget = (filteredWidgets: WidgetWithUID[], columnWidths: Record<string, number>) => {\n const widgetRows = calculateWidgetRows(filteredWidgets, columnWidths);\n\n return (widgetId: string) => {\n const { [widgetId]: _removed, ...newWidths } = columnWidths;\n\n // Find the row containing the deleted widget\n const deletedWidgetIndex = filteredWidgets.findIndex((w) => w.uid === widgetId);\n if (deletedWidgetIndex === -1) return { newWidgets: filteredWidgets, newWidths };\n const affectedRow = widgetRows.find(\n (row) => deletedWidgetIndex >= row.startIndex && deletedWidgetIndex <= row.endIndex\n );\n\n // Use resizeRowAfterRemoval to resize the affected row\n const finalWidths = resizeRowAfterRemoval(affectedRow, widgetId, newWidths);\n const newWidgets = filteredWidgets.filter((w) => w.uid !== widgetId);\n\n return { newWidgets, newWidths: finalWidths };\n };\n};\n\nconst addWidget = (filteredWidgets: WidgetWithUID[], columnWidths: Record<string, number>) => {\n return (widget: WidgetWithUID) => {\n // Check if widget is already added\n const index = filteredWidgets.findIndex((w) => w.uid === widget.uid);\n if (index !== -1) return { newWidgets: filteredWidgets, newWidths: columnWidths };\n\n const newWidgets = [...filteredWidgets, widget];\n const newWidths = { ...columnWidths };\n // New widget always takes full width in its own row\n newWidths[widget.uid] = WIDGET_SIZING.TOTAL_COLUMNS;\n\n return { newWidgets, newWidths };\n };\n};\n\nconst handleWidgetResize = ({\n filteredWidgets,\n columnWidths,\n leftWidgetId,\n rightWidgetId,\n newLeftWidth,\n newRightWidth,\n}: HandleWidgetResizeOptions) => {\n // Check if widgets can be resized (adjacent, same row, valid sizes)\n if (!canResizeBetweenWidgets(leftWidgetId, rightWidgetId, columnWidths, filteredWidgets)) {\n return columnWidths;\n }\n\n if (!isValidResizeOperation(newLeftWidth, newRightWidth)) {\n // Resize would violate constraints, don't allow it\n return columnWidths;\n }\n\n return {\n ...columnWidths,\n [leftWidgetId]: newLeftWidth,\n [rightWidgetId]: newRightWidth,\n };\n};\n\ninterface UseWidgetsOptions {\n filteredWidgets: WidgetWithUID[];\n setFilteredWidgets: (\n widgets: WidgetWithUID[] | ((prev: WidgetWithUID[]) => WidgetWithUID[])\n ) => void;\n}\n\nexport const useWidgets = ({ filteredWidgets, setFilteredWidgets }: UseWidgetsOptions) => {\n const [columnWidths, setColumnWidths] = React.useState<Record<string, number>>({});\n const [isDraggingWidget, setIsDraggingWidget] = React.useState(false);\n const [draggedWidgetId, setDraggedWidgetId] = React.useState<string | undefined>();\n\n const [updateHomepageLayout] = useUpdateHomepageLayoutMutation();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const findWidgetFn: FindWidgetFunction = (widgetId: string) =>\n findWidget(filteredWidgets, widgetId);\n\n const moveWidgetFn = (\n widgetId: string,\n insertIndex: number,\n targetRowIndex?: number,\n isHorizontalDrop?: boolean\n ) => {\n const result = moveWidget({\n filteredWidgets,\n columnWidths,\n widgetId,\n insertIndex,\n targetRowIndex,\n isHorizontalDrop,\n });\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const deleteWidgetFn: WidgetIdFunction = (widgetId: string) => {\n const deleteWidgetOperation = deleteWidget(filteredWidgets, columnWidths);\n const result = deleteWidgetOperation(widgetId);\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const addWidgetFn = (widget: WidgetWithUID) => {\n const addWidgetOperation = addWidget(filteredWidgets, columnWidths);\n const result = addWidgetOperation(widget);\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const handleWidgetResizeFn = (\n leftWidgetId: string,\n rightWidgetId: string,\n newLeftWidth: number,\n newRightWidth: number\n ) => {\n const newWidths = handleWidgetResize({\n filteredWidgets,\n columnWidths,\n leftWidgetId,\n rightWidgetId,\n newLeftWidth,\n newRightWidth,\n });\n\n setColumnWidths(newWidths);\n };\n\n const handleDragStart: WidgetIdFunction = React.useCallback((widgetId: string) => {\n setIsDraggingWidget(true);\n setDraggedWidgetId(widgetId);\n }, []);\n\n const handleDragEnd: DragEndFunction = React.useCallback(() => {\n setIsDraggingWidget(false);\n setDraggedWidgetId(undefined);\n }, []);\n\n const saveLayoutFn = () => {\n saveLayout({\n widgets: filteredWidgets,\n widths: columnWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n return {\n findWidget: findWidgetFn,\n deleteWidget: deleteWidgetFn,\n addWidget: addWidgetFn,\n moveWidget: moveWidgetFn,\n columnWidths,\n setColumnWidths,\n handleWidgetResize: handleWidgetResizeFn,\n saveLayout: saveLayoutFn,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n };\n};\n"],"names":["findWidget","filteredWidgets","widgetId","widget","find","c","uid","undefined","index","indexOf","saveLayout","widgets","widths","updateHomepageLayout","toggleNotification","formatAPIError","formatMessage","layoutData","map","width","WIDGET_SIZING","TOTAL_COLUMNS","res","type","message","error","id","defaultMessage","moveWidget","columnWidths","insertIndex","targetRowIndex","isHorizontalDrop","w","newWidgets","newWidths","widgetRows","calculateWidgetRows","moveWidgetInArray","sourceRow","findRowContainingWidget","sourceRowResize","resizeRowAfterRemoval","Object","assign","targetRow","isSameRowReorder","startIndex","targetRowResize","resizeRowAfterAddition","deleteWidget","_removed","deletedWidgetIndex","findIndex","affectedRow","row","endIndex","finalWidths","filter","addWidget","handleWidgetResize","leftWidgetId","rightWidgetId","newLeftWidth","newRightWidth","canResizeBetweenWidgets","isValidResizeOperation","useWidgets","setFilteredWidgets","setColumnWidths","React","useState","isDraggingWidget","setIsDraggingWidget","draggedWidgetId","setDraggedWidgetId","useUpdateHomepageLayoutMutation","useNotification","_unstableFormatAPIError","useAPIErrorHandler","useIntl","findWidgetFn","moveWidgetFn","result","deleteWidgetFn","deleteWidgetOperation","addWidgetFn","addWidgetOperation","handleWidgetResizeFn","handleDragStart","useCallback","handleDragEnd","saveLayoutFn"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Widgets.mjs","sources":["../../../../../admin/src/features/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useUpdateHomepageLayoutMutation } from '../services/homepage';\nimport {\n calculateWidgetRows,\n moveWidgetInArray,\n findRowContainingWidget,\n resizeRowAfterRemoval,\n resizeRowAfterAddition,\n isValidResizeOperation,\n canResizeBetweenWidgets,\n WIDGET_SIZING,\n} from '../utils/widgetLayout';\n\nimport { useNotification } from './Notifications';\n\nimport type { WidgetWithUID } from '../core/apis/Widgets';\nimport type { WidgetType } from '@strapi/admin/strapi-admin';\n\nexport interface WidgetInfo {\n widget: WidgetType | undefined;\n index: number;\n}\n\nexport type FindWidgetFunction = (id: string) => WidgetInfo;\nexport type WidgetIdFunction = (id: string) => void;\nexport type DragEndFunction = () => void;\n\ninterface BaseWidgetContext {\n filteredWidgets: WidgetWithUID[];\n columnWidths: Record<string, number>;\n}\n\ninterface MoveWidgetOptions extends BaseWidgetContext {\n widgetId: string;\n insertIndex: number;\n targetRowIndex?: number;\n isHorizontalDrop?: boolean;\n}\n\ninterface SaveLayoutOptions {\n widgets: WidgetWithUID[];\n widths: Record<string, number>;\n updateHomepageLayout: (data: {\n widgets: Array<{ uid: string; width: (typeof WIDGET_SIZING.DISCRETE_SIZES)[number] }>;\n }) => Promise<any>;\n toggleNotification: (config: { type: 'danger'; message: string }) => void;\n formatAPIError: (error: any) => string;\n formatMessage: (descriptor: { id: string; defaultMessage: string }) => string;\n}\n\ninterface HandleWidgetResizeOptions extends BaseWidgetContext {\n leftWidgetId: string;\n rightWidgetId: string;\n newLeftWidth: number;\n newRightWidth: number;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Widget Management\n * -----------------------------------------------------------------------------------------------*/\n\nconst findWidget = (filteredWidgets: WidgetWithUID[], widgetId: string): WidgetInfo => {\n const widget = filteredWidgets.find((c) => `${c.uid}` === widgetId);\n if (!widget) {\n return {\n widget: undefined,\n index: -1,\n };\n }\n return {\n widget,\n index: filteredWidgets.indexOf(widget),\n };\n};\n\nconst saveLayout = async ({\n widgets,\n widths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n}: SaveLayoutOptions) => {\n try {\n const layoutData = {\n widgets: widgets.map((widget) => ({\n uid: widget.uid,\n width: (widths[widget.uid] ||\n WIDGET_SIZING.TOTAL_COLUMNS) as (typeof WIDGET_SIZING.DISCRETE_SIZES)[number],\n })),\n };\n\n const res = await updateHomepageLayout(layoutData);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n};\n\nconst moveWidget = ({\n filteredWidgets,\n columnWidths,\n widgetId,\n insertIndex,\n targetRowIndex,\n isHorizontalDrop,\n}: MoveWidgetOptions) => {\n const widget = filteredWidgets.find((w) => w.uid === widgetId);\n if (!widget) return { newWidgets: filteredWidgets, newWidths: columnWidths };\n\n const widgetRows = calculateWidgetRows(filteredWidgets, columnWidths);\n\n // Move widget in the array\n const newWidgets = moveWidgetInArray(filteredWidgets, widgetId, insertIndex);\n\n // Calculate optimal widths for both source and target rows\n const newWidths = { ...columnWidths };\n\n // Find the source row (where the widget was removed from)\n const sourceRow = findRowContainingWidget(widgetRows, widgetId, filteredWidgets);\n\n if (isHorizontalDrop) {\n // This is a horizontal drop zone - widget gets full width in its own row\n newWidths[widgetId] = WIDGET_SIZING.TOTAL_COLUMNS;\n\n // Resize source row (after widget removal)\n const sourceRowResize = resizeRowAfterRemoval(sourceRow, widgetId, newWidths);\n Object.assign(newWidths, sourceRowResize);\n } else {\n // This is a vertical drop zone within a row\n const targetRow = widgetRows[targetRowIndex!];\n\n // Check if we're reordering within the same row\n const isSameRowReorder =\n sourceRow && targetRow && sourceRow.startIndex === targetRow.startIndex;\n\n if (isSameRowReorder) {\n // For same-row reordering, just preserve the existing widths\n return { newWidgets, newWidths };\n }\n\n // Different rows - resize both source and target rows\n // Resize source row (after widget removal)\n const sourceRowResize = resizeRowAfterRemoval(sourceRow, widgetId, newWidths);\n Object.assign(newWidths, sourceRowResize);\n\n // Resize target row (after widget addition)\n const targetRowResize = resizeRowAfterAddition(targetRow, widget, insertIndex, newWidths);\n Object.assign(newWidths, targetRowResize);\n }\n\n return { newWidgets, newWidths };\n};\n\nconst deleteWidget = (filteredWidgets: WidgetWithUID[], columnWidths: Record<string, number>) => {\n const widgetRows = calculateWidgetRows(filteredWidgets, columnWidths);\n\n return (widgetId: string) => {\n const { [widgetId]: _removed, ...newWidths } = columnWidths;\n\n // Find the row containing the deleted widget\n const deletedWidgetIndex = filteredWidgets.findIndex((w) => w.uid === widgetId);\n if (deletedWidgetIndex === -1) return { newWidgets: filteredWidgets, newWidths };\n const affectedRow = widgetRows.find(\n (row) => deletedWidgetIndex >= row.startIndex && deletedWidgetIndex <= row.endIndex\n );\n\n // Use resizeRowAfterRemoval to resize the affected row\n const finalWidths = resizeRowAfterRemoval(affectedRow, widgetId, newWidths);\n const newWidgets = filteredWidgets.filter((w) => w.uid !== widgetId);\n\n return { newWidgets, newWidths: finalWidths };\n };\n};\n\nconst addWidget = (filteredWidgets: WidgetWithUID[], columnWidths: Record<string, number>) => {\n return (widget: WidgetWithUID) => {\n // Check if widget is already added\n const index = filteredWidgets.findIndex((w) => w.uid === widget.uid);\n if (index !== -1) return { newWidgets: filteredWidgets, newWidths: columnWidths };\n\n const newWidgets = [...filteredWidgets, widget];\n const newWidths = { ...columnWidths };\n // New widget always takes full width in its own row\n newWidths[widget.uid] = WIDGET_SIZING.TOTAL_COLUMNS;\n\n return { newWidgets, newWidths };\n };\n};\n\nconst handleWidgetResize = ({\n filteredWidgets,\n columnWidths,\n leftWidgetId,\n rightWidgetId,\n newLeftWidth,\n newRightWidth,\n}: HandleWidgetResizeOptions) => {\n // Check if widgets can be resized (adjacent, same row, valid sizes)\n if (!canResizeBetweenWidgets(leftWidgetId, rightWidgetId, columnWidths, filteredWidgets)) {\n return columnWidths;\n }\n\n if (!isValidResizeOperation(newLeftWidth, newRightWidth)) {\n // Resize would violate constraints, don't allow it\n return columnWidths;\n }\n\n return {\n ...columnWidths,\n [leftWidgetId]: newLeftWidth,\n [rightWidgetId]: newRightWidth,\n };\n};\n\ninterface UseWidgetsOptions {\n filteredWidgets: WidgetWithUID[];\n setFilteredWidgets: (\n widgets: WidgetWithUID[] | ((prev: WidgetWithUID[]) => WidgetWithUID[])\n ) => void;\n}\n\nexport const useWidgets = ({ filteredWidgets, setFilteredWidgets }: UseWidgetsOptions) => {\n const [columnWidths, setColumnWidths] = React.useState<Record<string, number>>({});\n const [isDraggingWidget, setIsDraggingWidget] = React.useState(false);\n const [draggedWidgetId, setDraggedWidgetId] = React.useState<string | undefined>();\n\n const [updateHomepageLayout] = useUpdateHomepageLayoutMutation();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const findWidgetFn: FindWidgetFunction = (widgetId: string) =>\n findWidget(filteredWidgets, widgetId);\n\n const moveWidgetFn = (\n widgetId: string,\n insertIndex: number,\n targetRowIndex?: number,\n isHorizontalDrop?: boolean\n ) => {\n const result = moveWidget({\n filteredWidgets,\n columnWidths,\n widgetId,\n insertIndex,\n targetRowIndex,\n isHorizontalDrop,\n });\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const deleteWidgetFn: WidgetIdFunction = (widgetId: string) => {\n const deleteWidgetOperation = deleteWidget(filteredWidgets, columnWidths);\n const result = deleteWidgetOperation(widgetId);\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const addWidgetFn = (widget: WidgetWithUID) => {\n const addWidgetOperation = addWidget(filteredWidgets, columnWidths);\n const result = addWidgetOperation(widget);\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const handleWidgetResizeFn = (\n leftWidgetId: string,\n rightWidgetId: string,\n newLeftWidth: number,\n newRightWidth: number\n ) => {\n const newWidths = handleWidgetResize({\n filteredWidgets,\n columnWidths,\n leftWidgetId,\n rightWidgetId,\n newLeftWidth,\n newRightWidth,\n });\n\n setColumnWidths(newWidths);\n };\n\n const handleDragStart: WidgetIdFunction = React.useCallback((widgetId: string) => {\n setIsDraggingWidget(true);\n setDraggedWidgetId(widgetId);\n }, []);\n\n const handleDragEnd: DragEndFunction = React.useCallback(() => {\n setIsDraggingWidget(false);\n setDraggedWidgetId(undefined);\n }, []);\n\n const saveLayoutFn = () => {\n saveLayout({\n widgets: filteredWidgets,\n widths: columnWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n return {\n findWidget: findWidgetFn,\n deleteWidget: deleteWidgetFn,\n addWidget: addWidgetFn,\n moveWidget: moveWidgetFn,\n columnWidths,\n setColumnWidths,\n handleWidgetResize: handleWidgetResizeFn,\n saveLayout: saveLayoutFn,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n };\n};\n"],"names":["findWidget","filteredWidgets","widgetId","widget","find","c","uid","undefined","index","indexOf","saveLayout","widgets","widths","updateHomepageLayout","toggleNotification","formatAPIError","formatMessage","layoutData","map","width","WIDGET_SIZING","TOTAL_COLUMNS","res","type","message","error","id","defaultMessage","moveWidget","columnWidths","insertIndex","targetRowIndex","isHorizontalDrop","w","newWidgets","newWidths","widgetRows","calculateWidgetRows","moveWidgetInArray","sourceRow","findRowContainingWidget","sourceRowResize","resizeRowAfterRemoval","Object","assign","targetRow","isSameRowReorder","startIndex","targetRowResize","resizeRowAfterAddition","deleteWidget","_removed","deletedWidgetIndex","findIndex","affectedRow","row","endIndex","finalWidths","filter","addWidget","handleWidgetResize","leftWidgetId","rightWidgetId","newLeftWidth","newRightWidth","canResizeBetweenWidgets","isValidResizeOperation","useWidgets","setFilteredWidgets","setColumnWidths","React","useState","isDraggingWidget","setIsDraggingWidget","draggedWidgetId","setDraggedWidgetId","useUpdateHomepageLayoutMutation","useNotification","_unstableFormatAPIError","useAPIErrorHandler","useIntl","findWidgetFn","moveWidgetFn","result","deleteWidgetFn","deleteWidgetOperation","addWidgetFn","addWidgetOperation","handleWidgetResizeFn","handleDragStart","useCallback","handleDragEnd","saveLayoutFn"],"mappings":"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"}
1
+ {"version":3,"file":"Widgets.mjs","sources":["../../../../../admin/src/features/Widgets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useIntl } from 'react-intl';\n\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useUpdateHomepageLayoutMutation } from '../services/homepage';\nimport {\n calculateWidgetRows,\n moveWidgetInArray,\n findRowContainingWidget,\n resizeRowAfterRemoval,\n resizeRowAfterAddition,\n isValidResizeOperation,\n canResizeBetweenWidgets,\n WIDGET_SIZING,\n} from '../utils/widgetLayout';\n\nimport { useNotification } from './Notifications';\n\nimport type { WidgetWithUID } from '../core/apis/Widgets';\nimport type { WidgetType } from '@strapi/admin/strapi-admin';\n\nexport interface WidgetInfo {\n widget: WidgetType | undefined;\n index: number;\n}\n\nexport type FindWidgetFunction = (id: string) => WidgetInfo;\nexport type WidgetIdFunction = (id: string) => void;\nexport type DragEndFunction = () => void;\n\ninterface BaseWidgetContext {\n filteredWidgets: WidgetWithUID[];\n columnWidths: Record<string, number>;\n}\n\ninterface MoveWidgetOptions extends BaseWidgetContext {\n widgetId: string;\n insertIndex: number;\n targetRowIndex?: number;\n isHorizontalDrop?: boolean;\n}\n\ninterface SaveLayoutOptions {\n widgets: WidgetWithUID[];\n widths: Record<string, number>;\n updateHomepageLayout: ReturnType<typeof useUpdateHomepageLayoutMutation>[0];\n toggleNotification: (config: { type: 'danger'; message: string }) => void;\n formatAPIError: ReturnType<typeof useAPIErrorHandler>['_unstableFormatAPIError'];\n formatMessage: (descriptor: { id: string; defaultMessage: string }) => string;\n}\n\ninterface HandleWidgetResizeOptions extends BaseWidgetContext {\n leftWidgetId: string;\n rightWidgetId: string;\n newLeftWidth: number;\n newRightWidth: number;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Widget Management\n * -----------------------------------------------------------------------------------------------*/\n\nconst findWidget = (filteredWidgets: WidgetWithUID[], widgetId: string): WidgetInfo => {\n const widget = filteredWidgets.find((c) => `${c.uid}` === widgetId);\n if (!widget) {\n return {\n widget: undefined,\n index: -1,\n };\n }\n return {\n widget,\n index: filteredWidgets.indexOf(widget),\n };\n};\n\nconst saveLayout = async ({\n widgets,\n widths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n}: SaveLayoutOptions) => {\n try {\n const layoutData = {\n widgets: widgets.map((widget) => ({\n uid: widget.uid,\n width: (widths[widget.uid] ||\n WIDGET_SIZING.TOTAL_COLUMNS) as (typeof WIDGET_SIZING.DISCRETE_SIZES)[number],\n })),\n };\n\n const res = await updateHomepageLayout(layoutData);\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n};\n\nconst moveWidget = ({\n filteredWidgets,\n columnWidths,\n widgetId,\n insertIndex,\n targetRowIndex,\n isHorizontalDrop,\n}: MoveWidgetOptions) => {\n const widget = filteredWidgets.find((w) => w.uid === widgetId);\n if (!widget) return { newWidgets: filteredWidgets, newWidths: columnWidths };\n\n const widgetRows = calculateWidgetRows(filteredWidgets, columnWidths);\n\n // Move widget in the array\n const newWidgets = moveWidgetInArray(filteredWidgets, widgetId, insertIndex);\n\n // Calculate optimal widths for both source and target rows\n const newWidths = { ...columnWidths };\n\n // Find the source row (where the widget was removed from)\n const sourceRow = findRowContainingWidget(widgetRows, widgetId, filteredWidgets);\n\n if (isHorizontalDrop) {\n // This is a horizontal drop zone - widget gets full width in its own row\n newWidths[widgetId] = WIDGET_SIZING.TOTAL_COLUMNS;\n\n // Resize source row (after widget removal)\n const sourceRowResize = resizeRowAfterRemoval(sourceRow, widgetId, newWidths);\n Object.assign(newWidths, sourceRowResize);\n } else {\n // This is a vertical drop zone within a row\n const targetRow = widgetRows[targetRowIndex!];\n\n // Check if we're reordering within the same row\n const isSameRowReorder =\n sourceRow && targetRow && sourceRow.startIndex === targetRow.startIndex;\n\n if (isSameRowReorder) {\n // For same-row reordering, just preserve the existing widths\n return { newWidgets, newWidths };\n }\n\n // Different rows - resize both source and target rows\n // Resize source row (after widget removal)\n const sourceRowResize = resizeRowAfterRemoval(sourceRow, widgetId, newWidths);\n Object.assign(newWidths, sourceRowResize);\n\n // Resize target row (after widget addition)\n const targetRowResize = resizeRowAfterAddition(targetRow, widget, insertIndex, newWidths);\n Object.assign(newWidths, targetRowResize);\n }\n\n return { newWidgets, newWidths };\n};\n\nconst deleteWidget = (filteredWidgets: WidgetWithUID[], columnWidths: Record<string, number>) => {\n const widgetRows = calculateWidgetRows(filteredWidgets, columnWidths);\n\n return (widgetId: string) => {\n const { [widgetId]: _removed, ...newWidths } = columnWidths;\n\n // Find the row containing the deleted widget\n const deletedWidgetIndex = filteredWidgets.findIndex((w) => w.uid === widgetId);\n if (deletedWidgetIndex === -1) return { newWidgets: filteredWidgets, newWidths };\n const affectedRow = widgetRows.find(\n (row) => deletedWidgetIndex >= row.startIndex && deletedWidgetIndex <= row.endIndex\n );\n\n // Use resizeRowAfterRemoval to resize the affected row\n const finalWidths = resizeRowAfterRemoval(affectedRow, widgetId, newWidths);\n const newWidgets = filteredWidgets.filter((w) => w.uid !== widgetId);\n\n return { newWidgets, newWidths: finalWidths };\n };\n};\n\nconst addWidget = (filteredWidgets: WidgetWithUID[], columnWidths: Record<string, number>) => {\n return (widget: WidgetWithUID) => {\n // Check if widget is already added\n const index = filteredWidgets.findIndex((w) => w.uid === widget.uid);\n if (index !== -1) return { newWidgets: filteredWidgets, newWidths: columnWidths };\n\n const newWidgets = [...filteredWidgets, widget];\n const newWidths = { ...columnWidths };\n // New widget always takes full width in its own row\n newWidths[widget.uid] = WIDGET_SIZING.TOTAL_COLUMNS;\n\n return { newWidgets, newWidths };\n };\n};\n\nconst handleWidgetResize = ({\n filteredWidgets,\n columnWidths,\n leftWidgetId,\n rightWidgetId,\n newLeftWidth,\n newRightWidth,\n}: HandleWidgetResizeOptions) => {\n // Check if widgets can be resized (adjacent, same row, valid sizes)\n if (!canResizeBetweenWidgets(leftWidgetId, rightWidgetId, columnWidths, filteredWidgets)) {\n return columnWidths;\n }\n\n if (!isValidResizeOperation(newLeftWidth, newRightWidth)) {\n // Resize would violate constraints, don't allow it\n return columnWidths;\n }\n\n return {\n ...columnWidths,\n [leftWidgetId]: newLeftWidth,\n [rightWidgetId]: newRightWidth,\n };\n};\n\ninterface UseWidgetsOptions {\n filteredWidgets: WidgetWithUID[];\n setFilteredWidgets: (\n widgets: WidgetWithUID[] | ((prev: WidgetWithUID[]) => WidgetWithUID[])\n ) => void;\n}\n\nexport const useWidgets = ({ filteredWidgets, setFilteredWidgets }: UseWidgetsOptions) => {\n const [columnWidths, setColumnWidths] = React.useState<Record<string, number>>({});\n const [isDraggingWidget, setIsDraggingWidget] = React.useState(false);\n const [draggedWidgetId, setDraggedWidgetId] = React.useState<string | undefined>();\n\n const [updateHomepageLayout] = useUpdateHomepageLayoutMutation();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { formatMessage } = useIntl();\n\n const findWidgetFn: FindWidgetFunction = (widgetId: string) =>\n findWidget(filteredWidgets, widgetId);\n\n const moveWidgetFn = (\n widgetId: string,\n insertIndex: number,\n targetRowIndex?: number,\n isHorizontalDrop?: boolean\n ) => {\n const result = moveWidget({\n filteredWidgets,\n columnWidths,\n widgetId,\n insertIndex,\n targetRowIndex,\n isHorizontalDrop,\n });\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const deleteWidgetFn: WidgetIdFunction = (widgetId: string) => {\n const deleteWidgetOperation = deleteWidget(filteredWidgets, columnWidths);\n const result = deleteWidgetOperation(widgetId);\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const addWidgetFn = (widget: WidgetWithUID) => {\n const addWidgetOperation = addWidget(filteredWidgets, columnWidths);\n const result = addWidgetOperation(widget);\n\n setFilteredWidgets(result.newWidgets);\n setColumnWidths(result.newWidths);\n\n saveLayout({\n widgets: result.newWidgets,\n widths: result.newWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n const handleWidgetResizeFn = (\n leftWidgetId: string,\n rightWidgetId: string,\n newLeftWidth: number,\n newRightWidth: number\n ) => {\n const newWidths = handleWidgetResize({\n filteredWidgets,\n columnWidths,\n leftWidgetId,\n rightWidgetId,\n newLeftWidth,\n newRightWidth,\n });\n\n setColumnWidths(newWidths);\n };\n\n const handleDragStart: WidgetIdFunction = React.useCallback((widgetId: string) => {\n setIsDraggingWidget(true);\n setDraggedWidgetId(widgetId);\n }, []);\n\n const handleDragEnd: DragEndFunction = React.useCallback(() => {\n setIsDraggingWidget(false);\n setDraggedWidgetId(undefined);\n }, []);\n\n const saveLayoutFn = () => {\n saveLayout({\n widgets: filteredWidgets,\n widths: columnWidths,\n updateHomepageLayout,\n toggleNotification,\n formatAPIError,\n formatMessage,\n });\n };\n\n return {\n findWidget: findWidgetFn,\n deleteWidget: deleteWidgetFn,\n addWidget: addWidgetFn,\n moveWidget: moveWidgetFn,\n columnWidths,\n setColumnWidths,\n handleWidgetResize: handleWidgetResizeFn,\n saveLayout: saveLayoutFn,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n };\n};\n"],"names":["findWidget","filteredWidgets","widgetId","widget","find","c","uid","undefined","index","indexOf","saveLayout","widgets","widths","updateHomepageLayout","toggleNotification","formatAPIError","formatMessage","layoutData","map","width","WIDGET_SIZING","TOTAL_COLUMNS","res","type","message","error","id","defaultMessage","moveWidget","columnWidths","insertIndex","targetRowIndex","isHorizontalDrop","w","newWidgets","newWidths","widgetRows","calculateWidgetRows","moveWidgetInArray","sourceRow","findRowContainingWidget","sourceRowResize","resizeRowAfterRemoval","Object","assign","targetRow","isSameRowReorder","startIndex","targetRowResize","resizeRowAfterAddition","deleteWidget","_removed","deletedWidgetIndex","findIndex","affectedRow","row","endIndex","finalWidths","filter","addWidget","handleWidgetResize","leftWidgetId","rightWidgetId","newLeftWidth","newRightWidth","canResizeBetweenWidgets","isValidResizeOperation","useWidgets","setFilteredWidgets","setColumnWidths","React","useState","isDraggingWidget","setIsDraggingWidget","draggedWidgetId","setDraggedWidgetId","useUpdateHomepageLayoutMutation","useNotification","_unstableFormatAPIError","useAPIErrorHandler","useIntl","findWidgetFn","moveWidgetFn","result","deleteWidgetFn","deleteWidgetOperation","addWidgetFn","addWidgetOperation","handleWidgetResizeFn","handleDragStart","useCallback","handleDragEnd","saveLayoutFn"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
- var styled = require('styled-components');
4
+ var styledComponents = require('styled-components');
5
5
 
6
6
  function _interopNamespace(e) {
7
7
  if (e && e.__esModule) return e;
@@ -44,14 +44,14 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
44
44
  * Hook to detect if the current viewport is desktop size
45
45
  * Uses the theme's large breakpoint
46
46
  */ const useIsDesktop = ()=>{
47
- const theme = styled.useTheme();
47
+ const theme = styledComponents.useTheme();
48
48
  return useMediaQuery(theme.breakpoints.large);
49
49
  };
50
50
  /**
51
51
  * Hook to detect if the current viewport is tablet size
52
52
  * Uses the theme's medium breakpoint
53
53
  */ const useIsTablet = ()=>{
54
- const theme = styled.useTheme();
54
+ const theme = styledComponents.useTheme();
55
55
  const isTabletOrAbove = useMediaQuery(theme.breakpoints.medium);
56
56
  const isDesktop = useMediaQuery(theme.breakpoints.large);
57
57
  return isTabletOrAbove && !isDesktop;
@@ -60,7 +60,7 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
60
60
  * Hook to detect if the current viewport is mobile size
61
61
  * Uses the theme's medium breakpoint (inverted)
62
62
  */ const useIsMobile = ()=>{
63
- const theme = styled.useTheme();
63
+ const theme = styledComponents.useTheme();
64
64
  return !useMediaQuery(theme.breakpoints.medium);
65
65
  };
66
66
 
@@ -1 +1 @@
1
- {"version":3,"file":"useMediaQuery.js","sources":["../../../../../admin/src/hooks/useMediaQuery.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useTheme } from 'styled-components';\n\n/**\n * Hook to detect if a media query matches\n * @param query - Media query string (e.g., '(min-width: 768px)' or theme.breakpoints.large)\n * @returns boolean indicating if the media query matches\n */\nexport const useMediaQuery = (query: string): boolean => {\n const cleanQuery = query.replace('@media', '').trim();\n\n const [matches, setMatches] = React.useState(() => window.matchMedia(cleanQuery).matches);\n\n React.useEffect(() => {\n const mediaQuery = window.matchMedia(cleanQuery);\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [cleanQuery]);\n\n return matches;\n};\n\n/**\n * Hook to detect if the current viewport is desktop size\n * Uses the theme's large breakpoint\n */\nexport const useIsDesktop = (): boolean => {\n const theme = useTheme();\n return useMediaQuery(theme.breakpoints.large);\n};\n\n/**\n * Hook to detect if the current viewport is tablet size\n * Uses the theme's medium breakpoint\n */\nexport const useIsTablet = (): boolean => {\n const theme = useTheme();\n const isTabletOrAbove = useMediaQuery(theme.breakpoints.medium);\n const isDesktop = useMediaQuery(theme.breakpoints.large);\n return isTabletOrAbove && !isDesktop;\n};\n\n/**\n * Hook to detect if the current viewport is mobile size\n * Uses the theme's medium breakpoint (inverted)\n */\nexport const useIsMobile = (): boolean => {\n const theme = useTheme();\n return !useMediaQuery(theme.breakpoints.medium);\n};\n"],"names":["useMediaQuery","query","cleanQuery","replace","trim","matches","setMatches","React","useState","window","matchMedia","useEffect","mediaQuery","handler","e","addEventListener","removeEventListener","useIsDesktop","theme","useTheme","breakpoints","large","useIsTablet","isTabletOrAbove","medium","isDesktop","useIsMobile"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;;;IAKO,MAAMA,aAAAA,GAAgB,CAACC,KAAAA,GAAAA;AAC5B,IAAA,MAAMC,aAAaD,KAAAA,CAAME,OAAO,CAAC,QAAA,EAAU,IAAIC,IAAI,EAAA;AAEnD,IAAA,MAAM,CAACC,OAAAA,EAASC,UAAAA,CAAW,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,IAAMC,MAAAA,CAAOC,UAAU,CAACR,UAAAA,CAAAA,CAAYG,OAAO,CAAA;AAExFE,IAAAA,gBAAAA,CAAMI,SAAS,CAAC,IAAA;QACd,MAAMC,UAAAA,GAAaH,MAAAA,CAAOC,UAAU,CAACR,UAAAA,CAAAA;AACrC,QAAA,MAAMW,OAAAA,GAAU,CAACC,CAAAA,GAA2BR,UAAAA,CAAWQ,EAAET,OAAO,CAAA;QAEhEO,UAAAA,CAAWG,gBAAgB,CAAC,QAAA,EAAUF,OAAAA,CAAAA;AAEtC,QAAA,OAAO,IAAMD,UAAAA,CAAWI,mBAAmB,CAAC,QAAA,EAAUH,OAAAA,CAAAA;IACxD,CAAA,EAAG;AAACX,QAAAA;AAAW,KAAA,CAAA;IAEf,OAAOG,OAAAA;AACT;AAEA;;;UAIaY,YAAAA,GAAe,IAAA;AAC1B,IAAA,MAAMC,KAAAA,GAAQC,eAAAA,EAAAA;AACd,IAAA,OAAOnB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACC,KAAK,CAAA;AAC9C;AAEA;;;UAIaC,WAAAA,GAAc,IAAA;AACzB,IAAA,MAAMJ,KAAAA,GAAQC,eAAAA,EAAAA;AACd,IAAA,MAAMI,eAAAA,GAAkBvB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACI,MAAM,CAAA;AAC9D,IAAA,MAAMC,SAAAA,GAAYzB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACC,KAAK,CAAA;AACvD,IAAA,OAAOE,mBAAmB,CAACE,SAAAA;AAC7B;AAEA;;;UAIaC,WAAAA,GAAc,IAAA;AACzB,IAAA,MAAMR,KAAAA,GAAQC,eAAAA,EAAAA;AACd,IAAA,OAAO,CAACnB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACI,MAAM,CAAA;AAChD;;;;;;;"}
1
+ {"version":3,"file":"useMediaQuery.js","sources":["../../../../../admin/src/hooks/useMediaQuery.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useTheme } from 'styled-components';\n\n/**\n * Hook to detect if a media query matches\n * @param query - Media query string (e.g., '(min-width: 768px)' or theme.breakpoints.large)\n * @returns boolean indicating if the media query matches\n */\nexport const useMediaQuery = (query: string): boolean => {\n const cleanQuery = query.replace('@media', '').trim();\n\n const [matches, setMatches] = React.useState(() => window.matchMedia(cleanQuery).matches);\n\n React.useEffect(() => {\n const mediaQuery = window.matchMedia(cleanQuery);\n const handler = (e: MediaQueryListEvent) => setMatches(e.matches);\n\n mediaQuery.addEventListener('change', handler);\n\n return () => mediaQuery.removeEventListener('change', handler);\n }, [cleanQuery]);\n\n return matches;\n};\n\n/**\n * Hook to detect if the current viewport is desktop size\n * Uses the theme's large breakpoint\n */\nexport const useIsDesktop = (): boolean => {\n const theme = useTheme();\n return useMediaQuery(theme.breakpoints.large);\n};\n\n/**\n * Hook to detect if the current viewport is tablet size\n * Uses the theme's medium breakpoint\n */\nexport const useIsTablet = (): boolean => {\n const theme = useTheme();\n const isTabletOrAbove = useMediaQuery(theme.breakpoints.medium);\n const isDesktop = useMediaQuery(theme.breakpoints.large);\n return isTabletOrAbove && !isDesktop;\n};\n\n/**\n * Hook to detect if the current viewport is mobile size\n * Uses the theme's medium breakpoint (inverted)\n */\nexport const useIsMobile = (): boolean => {\n const theme = useTheme();\n return !useMediaQuery(theme.breakpoints.medium);\n};\n"],"names":["useMediaQuery","query","cleanQuery","replace","trim","matches","setMatches","React","useState","window","matchMedia","useEffect","mediaQuery","handler","e","addEventListener","removeEventListener","useIsDesktop","theme","useTheme","breakpoints","large","useIsTablet","isTabletOrAbove","medium","isDesktop","useIsMobile"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;;;IAKO,MAAMA,aAAAA,GAAgB,CAACC,KAAAA,GAAAA;AAC5B,IAAA,MAAMC,aAAaD,KAAAA,CAAME,OAAO,CAAC,QAAA,EAAU,IAAIC,IAAI,EAAA;AAEnD,IAAA,MAAM,CAACC,OAAAA,EAASC,UAAAA,CAAW,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,IAAMC,MAAAA,CAAOC,UAAU,CAACR,UAAAA,CAAAA,CAAYG,OAAO,CAAA;AAExFE,IAAAA,gBAAAA,CAAMI,SAAS,CAAC,IAAA;QACd,MAAMC,UAAAA,GAAaH,MAAAA,CAAOC,UAAU,CAACR,UAAAA,CAAAA;AACrC,QAAA,MAAMW,OAAAA,GAAU,CAACC,CAAAA,GAA2BR,UAAAA,CAAWQ,EAAET,OAAO,CAAA;QAEhEO,UAAAA,CAAWG,gBAAgB,CAAC,QAAA,EAAUF,OAAAA,CAAAA;AAEtC,QAAA,OAAO,IAAMD,UAAAA,CAAWI,mBAAmB,CAAC,QAAA,EAAUH,OAAAA,CAAAA;IACxD,CAAA,EAAG;AAACX,QAAAA;AAAW,KAAA,CAAA;IAEf,OAAOG,OAAAA;AACT;AAEA;;;UAIaY,YAAAA,GAAe,IAAA;AAC1B,IAAA,MAAMC,KAAAA,GAAQC,yBAAAA,EAAAA;AACd,IAAA,OAAOnB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACC,KAAK,CAAA;AAC9C;AAEA;;;UAIaC,WAAAA,GAAc,IAAA;AACzB,IAAA,MAAMJ,KAAAA,GAAQC,yBAAAA,EAAAA;AACd,IAAA,MAAMI,eAAAA,GAAkBvB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACI,MAAM,CAAA;AAC9D,IAAA,MAAMC,SAAAA,GAAYzB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACC,KAAK,CAAA;AACvD,IAAA,OAAOE,mBAAmB,CAACE,SAAAA;AAC7B;AAEA;;;UAIaC,WAAAA,GAAc,IAAA;AACzB,IAAA,MAAMR,KAAAA,GAAQC,yBAAAA,EAAAA;AACd,IAAA,OAAO,CAACnB,aAAAA,CAAckB,KAAAA,CAAME,WAAW,CAACI,MAAM,CAAA;AAChD;;;;;;;"}
@@ -6,6 +6,7 @@ var cloneDeep = require('lodash/cloneDeep');
6
6
  var hooks = require('../core/store/hooks.js');
7
7
  var Auth = require('../features/Auth.js');
8
8
  var StrapiApp = require('../features/StrapiApp.js');
9
+ var widgetVisibility = require('../utils/widgetVisibility.js');
9
10
 
10
11
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
12
 
@@ -30,8 +31,8 @@ function _interopNamespace(e) {
30
31
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
31
32
  var cloneDeep__default = /*#__PURE__*/_interopDefault(cloneDeep);
32
33
 
33
- const useMenu = (shouldUpdateStrapi)=>{
34
- const checkUserHasPermissions = Auth.useAuth('useMenu', (state)=>state.checkUserHasPermissions);
34
+ const useMenu = (shouldUpdateStrapi, currentEnvironment)=>{
35
+ const checkUserHasPermissions = Auth.useAuth('useMenu', (state)=>state.checkUserHasPermissions, true);
35
36
  const rawMenu = StrapiApp.useStrapiApp('useMenu', (state)=>state.menu);
36
37
  const menu = React__namespace.useMemo(()=>normalizeMenuLinks(rawMenu), [
37
38
  rawMenu
@@ -104,7 +105,7 @@ const useMenu = (shouldUpdateStrapi)=>{
104
105
  setMenuWithUserPermissions((state)=>({
105
106
  ...state,
106
107
  generalSectionLinks: authorizedGeneralSectionLinks,
107
- pluginsSectionLinks: authorizedPluginSectionLinks,
108
+ pluginsSectionLinks: widgetVisibility.hideCloudDeployMenuLinkInProduction(authorizedPluginSectionLinks, currentEnvironment),
108
109
  isLoading: false
109
110
  }));
110
111
  }
@@ -115,7 +116,8 @@ const useMenu = (shouldUpdateStrapi)=>{
115
116
  menu,
116
117
  permissions,
117
118
  shouldUpdateStrapi,
118
- checkUserHasPermissions
119
+ checkUserHasPermissions,
120
+ currentEnvironment
119
121
  ]);
120
122
  return menuWithUserPermissions;
121
123
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useMenu.js","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const rawMenu = useStrapiApp('useMenu', (state) => state.menu);\n const menu = React.useMemo(() => normalizeMenuLinks(rawMenu), [rawMenu]);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinks = normalizeMenuLinks(generalSectionRawLinks);\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinks = normalizeMenuLinks(pluginsSectionRawLinks);\n const pluginSectionLinksPermissions = await Promise.all(\n pluginSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginSectionLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nconst normalizeMenuLinks = (links: unknown): MenuItem[] => {\n if (!Array.isArray(links)) {\n return [];\n }\n\n const isValidIcon = (icon: unknown) => {\n if (typeof icon === 'string' || typeof icon === 'function' || React.isValidElement(icon)) {\n return true;\n }\n\n if (!icon || typeof icon !== 'object') {\n return false;\n }\n\n const reactType = (icon as { $$typeof?: symbol }).$$typeof;\n\n return (\n reactType === Symbol.for('react.forward_ref') ||\n reactType === Symbol.for('react.memo') ||\n reactType === Symbol.for('react.lazy')\n );\n };\n\n return links.reduce<MenuItem[]>((acc, link) => {\n if (!link || typeof link !== 'object') {\n return acc;\n }\n\n const candidate = link as Partial<MenuItem>;\n\n if (\n typeof candidate.to !== 'string' ||\n !isValidIcon(candidate.icon) ||\n typeof candidate.intlLabel?.id !== 'string' ||\n typeof candidate.intlLabel.defaultMessage !== 'string'\n ) {\n return acc;\n }\n\n acc.push({\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as MenuItem);\n\n return acc;\n }, []);\n};\n\nexport { useMenu, normalizeMenuLinks };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","rawMenu","useStrapiApp","menu","React","useMemo","normalizeMenuLinks","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinks","pluginSectionLinksPermissions","links","Array","isArray","isValidIcon","isValidElement","reactType","$$typeof","Symbol","for","reduce","acc","link","candidate","push"],"mappings":"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"}
1
+ {"version":3,"file":"useMenu.js","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\nimport { hideCloudDeployMenuLinkInProduction } from '../utils/widgetVisibility';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean, currentEnvironment?: string) => {\n const checkUserHasPermissions = useAuth(\n 'useMenu',\n (state) => state.checkUserHasPermissions,\n true\n );\n const rawMenu = useStrapiApp('useMenu', (state) => state.menu);\n const menu = React.useMemo(() => normalizeMenuLinks(rawMenu), [rawMenu]);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: hideCloudDeployMenuLinkInProduction(\n authorizedPluginSectionLinks,\n currentEnvironment\n ),\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n currentEnvironment,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinks = normalizeMenuLinks(generalSectionRawLinks);\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinks = normalizeMenuLinks(pluginsSectionRawLinks);\n const pluginSectionLinksPermissions = await Promise.all(\n pluginSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginSectionLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nconst normalizeMenuLinks = (links: unknown): MenuItem[] => {\n if (!Array.isArray(links)) {\n return [];\n }\n\n const isValidIcon = (icon: unknown) => {\n if (typeof icon === 'string' || typeof icon === 'function' || React.isValidElement(icon)) {\n return true;\n }\n\n if (!icon || typeof icon !== 'object') {\n return false;\n }\n\n const reactType = (icon as { $$typeof?: symbol }).$$typeof;\n\n return (\n reactType === Symbol.for('react.forward_ref') ||\n reactType === Symbol.for('react.memo') ||\n reactType === Symbol.for('react.lazy')\n );\n };\n\n return links.reduce<MenuItem[]>((acc, link) => {\n if (!link || typeof link !== 'object') {\n return acc;\n }\n\n const candidate = link as Partial<MenuItem>;\n\n if (\n typeof candidate.to !== 'string' ||\n !isValidIcon(candidate.icon) ||\n typeof candidate.intlLabel?.id !== 'string' ||\n typeof candidate.intlLabel.defaultMessage !== 'string'\n ) {\n return acc;\n }\n\n acc.push({\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as MenuItem);\n\n return acc;\n }, []);\n};\n\nexport { useMenu, normalizeMenuLinks };\n"],"names":["useMenu","shouldUpdateStrapi","currentEnvironment","checkUserHasPermissions","useAuth","state","rawMenu","useStrapiApp","menu","React","useMemo","normalizeMenuLinks","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","hideCloudDeployMenuLinkInProduction","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinks","pluginSectionLinksPermissions","links","Array","isArray","isValidIcon","isValidElement","reactType","$$typeof","Symbol","for","reduce","acc","link","candidate","push"],"mappings":"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"}
@@ -4,9 +4,10 @@ import cloneDeep from 'lodash/cloneDeep';
4
4
  import { useTypedSelector } from '../core/store/hooks.mjs';
5
5
  import { useAuth } from '../features/Auth.mjs';
6
6
  import { useStrapiApp } from '../features/StrapiApp.mjs';
7
+ import { hideCloudDeployMenuLinkInProduction } from '../utils/widgetVisibility.mjs';
7
8
 
8
- const useMenu = (shouldUpdateStrapi)=>{
9
- const checkUserHasPermissions = useAuth('useMenu', (state)=>state.checkUserHasPermissions);
9
+ const useMenu = (shouldUpdateStrapi, currentEnvironment)=>{
10
+ const checkUserHasPermissions = useAuth('useMenu', (state)=>state.checkUserHasPermissions, true);
10
11
  const rawMenu = useStrapiApp('useMenu', (state)=>state.menu);
11
12
  const menu = React.useMemo(()=>normalizeMenuLinks(rawMenu), [
12
13
  rawMenu
@@ -79,7 +80,7 @@ const useMenu = (shouldUpdateStrapi)=>{
79
80
  setMenuWithUserPermissions((state)=>({
80
81
  ...state,
81
82
  generalSectionLinks: authorizedGeneralSectionLinks,
82
- pluginsSectionLinks: authorizedPluginSectionLinks,
83
+ pluginsSectionLinks: hideCloudDeployMenuLinkInProduction(authorizedPluginSectionLinks, currentEnvironment),
83
84
  isLoading: false
84
85
  }));
85
86
  }
@@ -90,7 +91,8 @@ const useMenu = (shouldUpdateStrapi)=>{
90
91
  menu,
91
92
  permissions,
92
93
  shouldUpdateStrapi,
93
- checkUserHasPermissions
94
+ checkUserHasPermissions,
95
+ currentEnvironment
94
96
  ]);
95
97
  return menuWithUserPermissions;
96
98
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useMenu.mjs","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const rawMenu = useStrapiApp('useMenu', (state) => state.menu);\n const menu = React.useMemo(() => normalizeMenuLinks(rawMenu), [rawMenu]);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinks = normalizeMenuLinks(generalSectionRawLinks);\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinks = normalizeMenuLinks(pluginsSectionRawLinks);\n const pluginSectionLinksPermissions = await Promise.all(\n pluginSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginSectionLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nconst normalizeMenuLinks = (links: unknown): MenuItem[] => {\n if (!Array.isArray(links)) {\n return [];\n }\n\n const isValidIcon = (icon: unknown) => {\n if (typeof icon === 'string' || typeof icon === 'function' || React.isValidElement(icon)) {\n return true;\n }\n\n if (!icon || typeof icon !== 'object') {\n return false;\n }\n\n const reactType = (icon as { $$typeof?: symbol }).$$typeof;\n\n return (\n reactType === Symbol.for('react.forward_ref') ||\n reactType === Symbol.for('react.memo') ||\n reactType === Symbol.for('react.lazy')\n );\n };\n\n return links.reduce<MenuItem[]>((acc, link) => {\n if (!link || typeof link !== 'object') {\n return acc;\n }\n\n const candidate = link as Partial<MenuItem>;\n\n if (\n typeof candidate.to !== 'string' ||\n !isValidIcon(candidate.icon) ||\n typeof candidate.intlLabel?.id !== 'string' ||\n typeof candidate.intlLabel.defaultMessage !== 'string'\n ) {\n return acc;\n }\n\n acc.push({\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as MenuItem);\n\n return acc;\n }, []);\n};\n\nexport { useMenu, normalizeMenuLinks };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","rawMenu","useStrapiApp","menu","React","useMemo","normalizeMenuLinks","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinks","pluginSectionLinksPermissions","links","Array","isArray","isValidIcon","isValidElement","reactType","$$typeof","Symbol","for","reduce","acc","link","candidate","push"],"mappings":"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"}
1
+ {"version":3,"file":"useMenu.mjs","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\nimport { hideCloudDeployMenuLinkInProduction } from '../utils/widgetVisibility';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean, currentEnvironment?: string) => {\n const checkUserHasPermissions = useAuth(\n 'useMenu',\n (state) => state.checkUserHasPermissions,\n true\n );\n const rawMenu = useStrapiApp('useMenu', (state) => state.menu);\n const menu = React.useMemo(() => normalizeMenuLinks(rawMenu), [rawMenu]);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: hideCloudDeployMenuLinkInProduction(\n authorizedPluginSectionLinks,\n currentEnvironment\n ),\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n currentEnvironment,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinks = normalizeMenuLinks(generalSectionRawLinks);\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinks = normalizeMenuLinks(pluginsSectionRawLinks);\n const pluginSectionLinksPermissions = await Promise.all(\n pluginSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginSectionLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nconst normalizeMenuLinks = (links: unknown): MenuItem[] => {\n if (!Array.isArray(links)) {\n return [];\n }\n\n const isValidIcon = (icon: unknown) => {\n if (typeof icon === 'string' || typeof icon === 'function' || React.isValidElement(icon)) {\n return true;\n }\n\n if (!icon || typeof icon !== 'object') {\n return false;\n }\n\n const reactType = (icon as { $$typeof?: symbol }).$$typeof;\n\n return (\n reactType === Symbol.for('react.forward_ref') ||\n reactType === Symbol.for('react.memo') ||\n reactType === Symbol.for('react.lazy')\n );\n };\n\n return links.reduce<MenuItem[]>((acc, link) => {\n if (!link || typeof link !== 'object') {\n return acc;\n }\n\n const candidate = link as Partial<MenuItem>;\n\n if (\n typeof candidate.to !== 'string' ||\n !isValidIcon(candidate.icon) ||\n typeof candidate.intlLabel?.id !== 'string' ||\n typeof candidate.intlLabel.defaultMessage !== 'string'\n ) {\n return acc;\n }\n\n acc.push({\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as MenuItem);\n\n return acc;\n }, []);\n};\n\nexport { useMenu, normalizeMenuLinks };\n"],"names":["useMenu","shouldUpdateStrapi","currentEnvironment","checkUserHasPermissions","useAuth","state","rawMenu","useStrapiApp","menu","React","useMemo","normalizeMenuLinks","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","hideCloudDeployMenuLinkInProduction","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinks","pluginSectionLinksPermissions","links","Array","isArray","isValidIcon","isValidElement","reactType","$$typeof","Symbol","for","reduce","acc","link","candidate","push"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useQueryParams.js","sources":["../../../../../admin/src/hooks/useQueryParams.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nconst useSearch = () => {\n const { search } = useLocation();\n\n return useMemo(() => search, [search]);\n};\n\nconst useQueryParams = <TQuery extends object>(initialParams?: TQuery) => {\n const search = useSearch();\n const navigate = useNavigate();\n\n const query = useMemo(() => {\n // TODO: investigate why sometimes we're getting the search with a leading `?` and sometimes not.\n const searchQuery = search.startsWith('?') ? search.slice(1) : search;\n if (!search && initialParams) {\n return initialParams;\n }\n\n return { ...initialParams, ...parse(searchQuery) } as TQuery;\n }, [search, initialParams]);\n\n const setQuery = useCallback(\n (nextParams: TQuery, method: 'push' | 'remove' = 'push', replace = false) => {\n let nextQuery: Partial<TQuery> = { ...query };\n\n if (method === 'remove') {\n Object.keys(nextParams).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {\n delete nextQuery[key as keyof TQuery];\n }\n });\n } else {\n nextQuery = { ...query, ...nextParams };\n }\n\n navigate({ search: stringify(nextQuery, { encode: false }) }, { replace });\n },\n [navigate, query]\n );\n\n return [{ query, rawQuery: search }, setQuery] as const;\n};\n\nexport { useQueryParams };\n"],"names":["useSearch","search","useLocation","useMemo","useQueryParams","initialParams","navigate","useNavigate","query","searchQuery","startsWith","slice","parse","setQuery","useCallback","nextParams","method","replace","nextQuery","Object","keys","forEach","key","prototype","hasOwnProperty","call","stringify","encode","rawQuery"],"mappings":";;;;;;AAKA,MAAMA,SAAAA,GAAY,IAAA;IAChB,MAAM,EAAEC,MAAM,EAAE,GAAGC,0BAAAA,EAAAA;IAEnB,OAAOC,aAAAA,CAAQ,IAAMF,MAAAA,EAAQ;AAACA,QAAAA;AAAO,KAAA,CAAA;AACvC,CAAA;AAEA,MAAMG,iBAAiB,CAAwBC,aAAAA,GAAAA;AAC7C,IAAA,MAAMJ,MAAAA,GAASD,SAAAA,EAAAA;AACf,IAAA,MAAMM,QAAAA,GAAWC,0BAAAA,EAAAA;AAEjB,IAAA,MAAMC,QAAQL,aAAAA,CAAQ,IAAA;;QAEpB,MAAMM,WAAAA,GAAcR,OAAOS,UAAU,CAAC,OAAOT,MAAAA,CAAOU,KAAK,CAAC,CAAA,CAAA,GAAKV,MAAAA;QAC/D,IAAI,CAACA,UAAUI,aAAAA,EAAe;YAC5B,OAAOA,aAAAA;AACT,QAAA;QAEA,OAAO;AAAE,YAAA,GAAGA,aAAa;AAAE,YAAA,GAAGO,SAAMH,WAAAA;AAAa,SAAA;IACnD,CAAA,EAAG;AAACR,QAAAA,MAAAA;AAAQI,QAAAA;AAAc,KAAA,CAAA;IAE1B,MAAMQ,QAAAA,GAAWC,kBACf,CAACC,UAAAA,EAAoBC,SAA4B,MAAM,EAAEC,UAAU,KAAK,GAAA;AACtE,QAAA,IAAIC,SAAAA,GAA6B;AAAE,YAAA,GAAGV;AAAM,SAAA;AAE5C,QAAA,IAAIQ,WAAW,QAAA,EAAU;AACvBG,YAAAA,MAAAA,CAAOC,IAAI,CAACL,UAAAA,CAAAA,CAAYM,OAAO,CAAC,CAACC,GAAAA,GAAAA;gBAC/B,IAAIH,MAAAA,CAAOI,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,WAAWI,GAAAA,CAAAA,EAAM;oBACxD,OAAOJ,SAAS,CAACI,GAAAA,CAAoB;AACvC,gBAAA;AACF,YAAA,CAAA,CAAA;QACF,CAAA,MAAO;YACLJ,SAAAA,GAAY;AAAE,gBAAA,GAAGV,KAAK;AAAE,gBAAA,GAAGO;AAAW,aAAA;AACxC,QAAA;QAEAT,QAAAA,CAAS;AAAEL,YAAAA,MAAAA,EAAQyB,aAAUR,SAAAA,EAAW;gBAAES,MAAAA,EAAQ;AAAM,aAAA;SAAG,EAAG;AAAEV,YAAAA;AAAQ,SAAA,CAAA;IAC1E,CAAA,EACA;AAACX,QAAAA,QAAAA;AAAUE,QAAAA;AAAM,KAAA,CAAA;IAGnB,OAAO;AAAC,QAAA;AAAEA,YAAAA,KAAAA;YAAOoB,QAAAA,EAAU3B;AAAO,SAAA;AAAGY,QAAAA;AAAS,KAAA;AAChD;;;;"}
1
+ {"version":3,"file":"useQueryParams.js","sources":["../../../../../admin/src/hooks/useQueryParams.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\ntype QueryParams = Record<string, unknown>;\n\nconst useSearch = () => {\n const { search } = useLocation();\n\n return useMemo(() => search, [search]);\n};\n\nconst useQueryParams = <TQuery extends object = QueryParams>(initialParams?: TQuery) => {\n const search = useSearch();\n const navigate = useNavigate();\n\n const query = useMemo(() => {\n // TODO: investigate why sometimes we're getting the search with a leading `?` and sometimes not.\n const searchQuery = search.startsWith('?') ? search.slice(1) : search;\n if (!search && initialParams) {\n return initialParams;\n }\n\n return { ...initialParams, ...parse(searchQuery) } as TQuery;\n }, [search, initialParams]);\n\n const setQuery = useCallback(\n (nextParams: TQuery, method: 'push' | 'remove' = 'push', replace = false) => {\n let nextQuery: Partial<TQuery> = { ...query };\n\n if (method === 'remove') {\n Object.keys(nextParams).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {\n delete nextQuery[key as keyof TQuery];\n }\n });\n } else {\n nextQuery = { ...query, ...nextParams };\n }\n\n navigate({ search: stringify(nextQuery, { encode: false }) }, { replace });\n },\n [navigate, query]\n );\n\n return [{ query, rawQuery: search }, setQuery] as const;\n};\n\nexport { useQueryParams };\n"],"names":["useSearch","search","useLocation","useMemo","useQueryParams","initialParams","navigate","useNavigate","query","searchQuery","startsWith","slice","parse","setQuery","useCallback","nextParams","method","replace","nextQuery","Object","keys","forEach","key","prototype","hasOwnProperty","call","stringify","encode","rawQuery"],"mappings":";;;;;;AAOA,MAAMA,SAAAA,GAAY,IAAA;IAChB,MAAM,EAAEC,MAAM,EAAE,GAAGC,0BAAAA,EAAAA;IAEnB,OAAOC,aAAAA,CAAQ,IAAMF,MAAAA,EAAQ;AAACA,QAAAA;AAAO,KAAA,CAAA;AACvC,CAAA;AAEA,MAAMG,iBAAiB,CAAsCC,aAAAA,GAAAA;AAC3D,IAAA,MAAMJ,MAAAA,GAASD,SAAAA,EAAAA;AACf,IAAA,MAAMM,QAAAA,GAAWC,0BAAAA,EAAAA;AAEjB,IAAA,MAAMC,QAAQL,aAAAA,CAAQ,IAAA;;QAEpB,MAAMM,WAAAA,GAAcR,OAAOS,UAAU,CAAC,OAAOT,MAAAA,CAAOU,KAAK,CAAC,CAAA,CAAA,GAAKV,MAAAA;QAC/D,IAAI,CAACA,UAAUI,aAAAA,EAAe;YAC5B,OAAOA,aAAAA;AACT,QAAA;QAEA,OAAO;AAAE,YAAA,GAAGA,aAAa;AAAE,YAAA,GAAGO,SAAMH,WAAAA;AAAa,SAAA;IACnD,CAAA,EAAG;AAACR,QAAAA,MAAAA;AAAQI,QAAAA;AAAc,KAAA,CAAA;IAE1B,MAAMQ,QAAAA,GAAWC,kBACf,CAACC,UAAAA,EAAoBC,SAA4B,MAAM,EAAEC,UAAU,KAAK,GAAA;AACtE,QAAA,IAAIC,SAAAA,GAA6B;AAAE,YAAA,GAAGV;AAAM,SAAA;AAE5C,QAAA,IAAIQ,WAAW,QAAA,EAAU;AACvBG,YAAAA,MAAAA,CAAOC,IAAI,CAACL,UAAAA,CAAAA,CAAYM,OAAO,CAAC,CAACC,GAAAA,GAAAA;gBAC/B,IAAIH,MAAAA,CAAOI,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,WAAWI,GAAAA,CAAAA,EAAM;oBACxD,OAAOJ,SAAS,CAACI,GAAAA,CAAoB;AACvC,gBAAA;AACF,YAAA,CAAA,CAAA;QACF,CAAA,MAAO;YACLJ,SAAAA,GAAY;AAAE,gBAAA,GAAGV,KAAK;AAAE,gBAAA,GAAGO;AAAW,aAAA;AACxC,QAAA;QAEAT,QAAAA,CAAS;AAAEL,YAAAA,MAAAA,EAAQyB,aAAUR,SAAAA,EAAW;gBAAES,MAAAA,EAAQ;AAAM,aAAA;SAAG,EAAG;AAAEV,YAAAA;AAAQ,SAAA,CAAA;IAC1E,CAAA,EACA;AAACX,QAAAA,QAAAA;AAAUE,QAAAA;AAAM,KAAA,CAAA;IAGnB,OAAO;AAAC,QAAA;AAAEA,YAAAA,KAAAA;YAAOoB,QAAAA,EAAU3B;AAAO,SAAA;AAAGY,QAAAA;AAAS,KAAA;AAChD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useQueryParams.mjs","sources":["../../../../../admin/src/hooks/useQueryParams.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nconst useSearch = () => {\n const { search } = useLocation();\n\n return useMemo(() => search, [search]);\n};\n\nconst useQueryParams = <TQuery extends object>(initialParams?: TQuery) => {\n const search = useSearch();\n const navigate = useNavigate();\n\n const query = useMemo(() => {\n // TODO: investigate why sometimes we're getting the search with a leading `?` and sometimes not.\n const searchQuery = search.startsWith('?') ? search.slice(1) : search;\n if (!search && initialParams) {\n return initialParams;\n }\n\n return { ...initialParams, ...parse(searchQuery) } as TQuery;\n }, [search, initialParams]);\n\n const setQuery = useCallback(\n (nextParams: TQuery, method: 'push' | 'remove' = 'push', replace = false) => {\n let nextQuery: Partial<TQuery> = { ...query };\n\n if (method === 'remove') {\n Object.keys(nextParams).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {\n delete nextQuery[key as keyof TQuery];\n }\n });\n } else {\n nextQuery = { ...query, ...nextParams };\n }\n\n navigate({ search: stringify(nextQuery, { encode: false }) }, { replace });\n },\n [navigate, query]\n );\n\n return [{ query, rawQuery: search }, setQuery] as const;\n};\n\nexport { useQueryParams };\n"],"names":["useSearch","search","useLocation","useMemo","useQueryParams","initialParams","navigate","useNavigate","query","searchQuery","startsWith","slice","parse","setQuery","useCallback","nextParams","method","replace","nextQuery","Object","keys","forEach","key","prototype","hasOwnProperty","call","stringify","encode","rawQuery"],"mappings":";;;;AAKA,MAAMA,SAAAA,GAAY,IAAA;IAChB,MAAM,EAAEC,MAAM,EAAE,GAAGC,WAAAA,EAAAA;IAEnB,OAAOC,OAAAA,CAAQ,IAAMF,MAAAA,EAAQ;AAACA,QAAAA;AAAO,KAAA,CAAA;AACvC,CAAA;AAEA,MAAMG,iBAAiB,CAAwBC,aAAAA,GAAAA;AAC7C,IAAA,MAAMJ,MAAAA,GAASD,SAAAA,EAAAA;AACf,IAAA,MAAMM,QAAAA,GAAWC,WAAAA,EAAAA;AAEjB,IAAA,MAAMC,QAAQL,OAAAA,CAAQ,IAAA;;QAEpB,MAAMM,WAAAA,GAAcR,OAAOS,UAAU,CAAC,OAAOT,MAAAA,CAAOU,KAAK,CAAC,CAAA,CAAA,GAAKV,MAAAA;QAC/D,IAAI,CAACA,UAAUI,aAAAA,EAAe;YAC5B,OAAOA,aAAAA;AACT,QAAA;QAEA,OAAO;AAAE,YAAA,GAAGA,aAAa;AAAE,YAAA,GAAGO,MAAMH,WAAAA;AAAa,SAAA;IACnD,CAAA,EAAG;AAACR,QAAAA,MAAAA;AAAQI,QAAAA;AAAc,KAAA,CAAA;IAE1B,MAAMQ,QAAAA,GAAWC,YACf,CAACC,UAAAA,EAAoBC,SAA4B,MAAM,EAAEC,UAAU,KAAK,GAAA;AACtE,QAAA,IAAIC,SAAAA,GAA6B;AAAE,YAAA,GAAGV;AAAM,SAAA;AAE5C,QAAA,IAAIQ,WAAW,QAAA,EAAU;AACvBG,YAAAA,MAAAA,CAAOC,IAAI,CAACL,UAAAA,CAAAA,CAAYM,OAAO,CAAC,CAACC,GAAAA,GAAAA;gBAC/B,IAAIH,MAAAA,CAAOI,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,WAAWI,GAAAA,CAAAA,EAAM;oBACxD,OAAOJ,SAAS,CAACI,GAAAA,CAAoB;AACvC,gBAAA;AACF,YAAA,CAAA,CAAA;QACF,CAAA,MAAO;YACLJ,SAAAA,GAAY;AAAE,gBAAA,GAAGV,KAAK;AAAE,gBAAA,GAAGO;AAAW,aAAA;AACxC,QAAA;QAEAT,QAAAA,CAAS;AAAEL,YAAAA,MAAAA,EAAQyB,UAAUR,SAAAA,EAAW;gBAAES,MAAAA,EAAQ;AAAM,aAAA;SAAG,EAAG;AAAEV,YAAAA;AAAQ,SAAA,CAAA;IAC1E,CAAA,EACA;AAACX,QAAAA,QAAAA;AAAUE,QAAAA;AAAM,KAAA,CAAA;IAGnB,OAAO;AAAC,QAAA;AAAEA,YAAAA,KAAAA;YAAOoB,QAAAA,EAAU3B;AAAO,SAAA;AAAGY,QAAAA;AAAS,KAAA;AAChD;;;;"}
1
+ {"version":3,"file":"useQueryParams.mjs","sources":["../../../../../admin/src/hooks/useQueryParams.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\n\nimport { parse, stringify } from 'qs';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\ntype QueryParams = Record<string, unknown>;\n\nconst useSearch = () => {\n const { search } = useLocation();\n\n return useMemo(() => search, [search]);\n};\n\nconst useQueryParams = <TQuery extends object = QueryParams>(initialParams?: TQuery) => {\n const search = useSearch();\n const navigate = useNavigate();\n\n const query = useMemo(() => {\n // TODO: investigate why sometimes we're getting the search with a leading `?` and sometimes not.\n const searchQuery = search.startsWith('?') ? search.slice(1) : search;\n if (!search && initialParams) {\n return initialParams;\n }\n\n return { ...initialParams, ...parse(searchQuery) } as TQuery;\n }, [search, initialParams]);\n\n const setQuery = useCallback(\n (nextParams: TQuery, method: 'push' | 'remove' = 'push', replace = false) => {\n let nextQuery: Partial<TQuery> = { ...query };\n\n if (method === 'remove') {\n Object.keys(nextParams).forEach((key) => {\n if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {\n delete nextQuery[key as keyof TQuery];\n }\n });\n } else {\n nextQuery = { ...query, ...nextParams };\n }\n\n navigate({ search: stringify(nextQuery, { encode: false }) }, { replace });\n },\n [navigate, query]\n );\n\n return [{ query, rawQuery: search }, setQuery] as const;\n};\n\nexport { useQueryParams };\n"],"names":["useSearch","search","useLocation","useMemo","useQueryParams","initialParams","navigate","useNavigate","query","searchQuery","startsWith","slice","parse","setQuery","useCallback","nextParams","method","replace","nextQuery","Object","keys","forEach","key","prototype","hasOwnProperty","call","stringify","encode","rawQuery"],"mappings":";;;;AAOA,MAAMA,SAAAA,GAAY,IAAA;IAChB,MAAM,EAAEC,MAAM,EAAE,GAAGC,WAAAA,EAAAA;IAEnB,OAAOC,OAAAA,CAAQ,IAAMF,MAAAA,EAAQ;AAACA,QAAAA;AAAO,KAAA,CAAA;AACvC,CAAA;AAEA,MAAMG,iBAAiB,CAAsCC,aAAAA,GAAAA;AAC3D,IAAA,MAAMJ,MAAAA,GAASD,SAAAA,EAAAA;AACf,IAAA,MAAMM,QAAAA,GAAWC,WAAAA,EAAAA;AAEjB,IAAA,MAAMC,QAAQL,OAAAA,CAAQ,IAAA;;QAEpB,MAAMM,WAAAA,GAAcR,OAAOS,UAAU,CAAC,OAAOT,MAAAA,CAAOU,KAAK,CAAC,CAAA,CAAA,GAAKV,MAAAA;QAC/D,IAAI,CAACA,UAAUI,aAAAA,EAAe;YAC5B,OAAOA,aAAAA;AACT,QAAA;QAEA,OAAO;AAAE,YAAA,GAAGA,aAAa;AAAE,YAAA,GAAGO,MAAMH,WAAAA;AAAa,SAAA;IACnD,CAAA,EAAG;AAACR,QAAAA,MAAAA;AAAQI,QAAAA;AAAc,KAAA,CAAA;IAE1B,MAAMQ,QAAAA,GAAWC,YACf,CAACC,UAAAA,EAAoBC,SAA4B,MAAM,EAAEC,UAAU,KAAK,GAAA;AACtE,QAAA,IAAIC,SAAAA,GAA6B;AAAE,YAAA,GAAGV;AAAM,SAAA;AAE5C,QAAA,IAAIQ,WAAW,QAAA,EAAU;AACvBG,YAAAA,MAAAA,CAAOC,IAAI,CAACL,UAAAA,CAAAA,CAAYM,OAAO,CAAC,CAACC,GAAAA,GAAAA;gBAC/B,IAAIH,MAAAA,CAAOI,SAAS,CAACC,cAAc,CAACC,IAAI,CAACP,WAAWI,GAAAA,CAAAA,EAAM;oBACxD,OAAOJ,SAAS,CAACI,GAAAA,CAAoB;AACvC,gBAAA;AACF,YAAA,CAAA,CAAA;QACF,CAAA,MAAO;YACLJ,SAAAA,GAAY;AAAE,gBAAA,GAAGV,KAAK;AAAE,gBAAA,GAAGO;AAAW,aAAA;AACxC,QAAA;QAEAT,QAAAA,CAAS;AAAEL,YAAAA,MAAAA,EAAQyB,UAAUR,SAAAA,EAAW;gBAAES,MAAAA,EAAQ;AAAM,aAAA;SAAG,EAAG;AAAEV,YAAAA;AAAQ,SAAA,CAAA;IAC1E,CAAA,EACA;AAACX,QAAAA,QAAAA;AAAUE,QAAAA;AAAM,KAAA,CAAA;IAGnB,OAAO;AAAC,QAAA;AAAEA,YAAAA,KAAAA;YAAOoB,QAAAA,EAAU3B;AAAO,SAAA;AAAGY,QAAAA;AAAS,KAAA;AAChD;;;;"}
@@ -90,7 +90,7 @@ var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
90
90
  }, [
91
91
  actualPermissionsToCheck
92
92
  ]);
93
- const checkUserHasPermissions = Auth.useAuth('useRBAC', (state)=>state.checkUserHasPermissions);
93
+ const checkUserHasPermissions = Auth.useAuth('useRBAC', (state)=>state.checkUserHasPermissions, true);
94
94
  const permssionsChecked = usePrev.usePrev(actualPermissionsToCheck);
95
95
  const contextChecked = usePrev.usePrev(rawQueryContext);
96
96
  React__namespace.useEffect(()=>{
@@ -1 +1 @@
1
- {"version":3,"file":"useRBAC.js","sources":["../../../../../admin/src/hooks/useRBAC.ts"],"sourcesContent":["import * as React from 'react';\n\nimport isEqual from 'lodash/isEqual';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { once } from '../utils/once';\nimport { capitalise } from '../utils/strings';\n\nimport { usePrev } from './usePrev';\n\ntype AllowedActions = Record<string, boolean>;\n\n/**\n * @public\n * @description This hooks takes an object or array of permissions (the latter preferred) and\n * runs through them to match against the current user's permissions as well as the RBAC middleware\n * system checking any conditions that may be present. It returns the filtered permissions as the complete\n * object from the API and a set of actions that can be performed. An action is derived from the last part\n * of the permission action e.g. `admin::roles.create` would be `canCreate`. If there's a hyphen in the action\n * this is removed and capitalised e.g `admin::roles.create-draft` would be `canCreateDraft`.\n * @example\n * ```tsx\n * import { Page, useRBAC } from '@strapi/strapi/admin'\n *\n * const MyProtectedPage = () => {\n * const { allowedActions, isLoading, error, permissions } = useRBAC([{ action: 'admin::roles.create' }])\n *\n * if(isLoading) {\n * return <Page.Loading />\n * }\n *\n * if(error){\n * return <Page.Error />\n * }\n *\n * if(!allowedActions.canCreate) {\n * return null\n * }\n *\n * return <MyPage permissions={permissions} />\n * }\n * ```\n */\nconst useRBAC = (\n permissionsToCheck: Record<string, Permission[]> | Permission[] = [],\n passedPermissions?: Permission[],\n rawQueryContext?: string\n): {\n allowedActions: AllowedActions;\n isLoading: boolean;\n error?: unknown;\n permissions: Permission[];\n} => {\n const isLoadingAuth = useAuth('useRBAC', (state) => state.isLoading);\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>();\n const [data, setData] = React.useState<Record<string, boolean>>();\n\n const warnOnce = React.useMemo(() => once(console.warn), []);\n\n const actualPermissionsToCheck: Permission[] = React.useMemo(() => {\n if (Array.isArray(permissionsToCheck)) {\n return permissionsToCheck;\n } else {\n warnOnce(\n 'useRBAC: The first argument should be an array of permissions, not an object. This will be deprecated in the future.'\n );\n\n return Object.values(permissionsToCheck).flat();\n }\n }, [permissionsToCheck, warnOnce]);\n\n /**\n * This is the default value we return until the queryResults[i].data\n * are all resolved with data. This preserves the original behaviour.\n */\n const defaultAllowedActions = React.useMemo(() => {\n return actualPermissionsToCheck.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: false,\n };\n }, {});\n }, [actualPermissionsToCheck]);\n\n const checkUserHasPermissions = useAuth('useRBAC', (state) => state.checkUserHasPermissions);\n\n const permssionsChecked = usePrev(actualPermissionsToCheck);\n const contextChecked = usePrev(rawQueryContext);\n\n React.useEffect(() => {\n if (\n !isEqual(permssionsChecked, actualPermissionsToCheck) ||\n // TODO: also run this when the query context changes\n contextChecked !== rawQueryContext\n ) {\n setIsLoading(true);\n setData(undefined);\n setError(undefined);\n\n checkUserHasPermissions(actualPermissionsToCheck, passedPermissions, rawQueryContext)\n .then((res) => {\n if (res) {\n setData(\n res.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: true,\n };\n }, {})\n );\n }\n })\n .catch((err) => {\n setError(err);\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n }, [\n actualPermissionsToCheck,\n checkUserHasPermissions,\n passedPermissions,\n permissionsToCheck,\n permssionsChecked,\n contextChecked,\n rawQueryContext,\n ]);\n\n /**\n * This hook originally would not return allowedActions\n * until all the checks were complete.\n */\n const allowedActions = Object.entries({\n ...defaultAllowedActions,\n ...data,\n }).reduce((acc, [name, allowed]) => {\n acc[`can${capitalise(name)}`] = allowed;\n\n return acc;\n }, {} as AllowedActions);\n\n return {\n allowedActions,\n permissions: actualPermissionsToCheck,\n isLoading: isLoading || isLoadingAuth,\n error,\n };\n};\n\nconst getActionName = (permission: Permission): string => {\n const [action = ''] = permission.action.split('.').slice(-1);\n return action.split('-').map(capitalise).join('');\n};\n\nexport { useRBAC };\nexport type { AllowedActions };\n"],"names":["useRBAC","permissionsToCheck","passedPermissions","rawQueryContext","isLoadingAuth","useAuth","state","isLoading","setIsLoading","React","useState","error","setError","data","setData","warnOnce","useMemo","once","console","warn","actualPermissionsToCheck","Array","isArray","Object","values","flat","defaultAllowedActions","reduce","acc","permission","getActionName","checkUserHasPermissions","permssionsChecked","usePrev","contextChecked","useEffect","isEqual","undefined","then","res","catch","err","finally","allowedActions","entries","name","allowed","capitalise","permissions","action","split","slice","map","join"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BC,UACKA,OAAAA,GAAU,CACdC,kBAAAA,GAAkE,EAAE,EACpEC,iBAAAA,EACAC,eAAAA,GAAAA;AAOA,IAAA,MAAMC,gBAAgBC,YAAAA,CAAQ,SAAA,EAAW,CAACC,KAAAA,GAAUA,MAAMC,SAAS,CAAA;AACnE,IAAA,MAAM,CAACA,SAAAA,EAAWC,YAAAA,CAAa,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,IAAA,CAAA;AACjD,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGH,iBAAMC,QAAQ,EAAA;AACxC,IAAA,MAAM,CAACG,IAAAA,EAAMC,OAAAA,CAAQ,GAAGL,iBAAMC,QAAQ,EAAA;IAEtC,MAAMK,QAAAA,GAAWN,iBAAMO,OAAO,CAAC,IAAMC,SAAAA,CAAKC,OAAAA,CAAQC,IAAI,CAAA,EAAG,EAAE,CAAA;IAE3D,MAAMC,wBAAAA,GAAyCX,gBAAAA,CAAMO,OAAO,CAAC,IAAA;QAC3D,IAAIK,KAAAA,CAAMC,OAAO,CAACrB,kBAAAA,CAAAA,EAAqB;YACrC,OAAOA,kBAAAA;QACT,CAAA,MAAO;YACLc,QAAAA,CACE,sHAAA,CAAA;AAGF,YAAA,OAAOQ,MAAAA,CAAOC,MAAM,CAACvB,kBAAAA,CAAAA,CAAoBwB,IAAI,EAAA;AAC/C,QAAA;IACF,CAAA,EAAG;AAACxB,QAAAA,kBAAAA;AAAoBc,QAAAA;AAAS,KAAA,CAAA;AAEjC;;;AAGC,MACD,MAAMW,qBAAAA,GAAwBjB,gBAAAA,CAAMO,OAAO,CAAC,IAAA;AAC1C,QAAA,OAAOI,wBAAAA,CAAyBO,MAAM,CAA0B,CAACC,GAAAA,EAAKC,UAAAA,GAAAA;YACpE,OAAO;AACL,gBAAA,GAAGD,GAAG;gBACN,CAACE,aAAAA,CAAcD,cAAc;AAC/B,aAAA;AACF,QAAA,CAAA,EAAG,EAAC,CAAA;IACN,CAAA,EAAG;AAACT,QAAAA;AAAyB,KAAA,CAAA;AAE7B,IAAA,MAAMW,0BAA0B1B,YAAAA,CAAQ,SAAA,EAAW,CAACC,KAAAA,GAAUA,MAAMyB,uBAAuB,CAAA;AAE3F,IAAA,MAAMC,oBAAoBC,eAAAA,CAAQb,wBAAAA,CAAAA;AAClC,IAAA,MAAMc,iBAAiBD,eAAAA,CAAQ9B,eAAAA,CAAAA;AAE/BM,IAAAA,gBAAAA,CAAM0B,SAAS,CAAC,IAAA;AACd,QAAA,IACE,CAACC,wBAAAA,CAAQJ,iBAAAA,EAAmBZ,wBAAAA,CAAAA;AAE5Bc,QAAAA,cAAAA,KAAmB/B,eAAAA,EACnB;YACAK,YAAAA,CAAa,IAAA,CAAA;YACbM,OAAAA,CAAQuB,SAAAA,CAAAA;YACRzB,QAAAA,CAASyB,SAAAA,CAAAA;AAETN,YAAAA,uBAAAA,CAAwBX,wBAAAA,EAA0BlB,iBAAAA,EAAmBC,eAAAA,CAAAA,CAClEmC,IAAI,CAAC,CAACC,GAAAA,GAAAA;AACL,gBAAA,IAAIA,GAAAA,EAAK;AACPzB,oBAAAA,OAAAA,CACEyB,GAAAA,CAAIZ,MAAM,CAA0B,CAACC,GAAAA,EAAKC,UAAAA,GAAAA;wBACxC,OAAO;AACL,4BAAA,GAAGD,GAAG;4BACN,CAACE,aAAAA,CAAcD,cAAc;AAC/B,yBAAA;AACF,oBAAA,CAAA,EAAG,EAAC,CAAA,CAAA;AAER,gBAAA;YACF,CAAA,CAAA,CACCW,KAAK,CAAC,CAACC,GAAAA,GAAAA;gBACN7B,QAAAA,CAAS6B,GAAAA,CAAAA;AACX,YAAA,CAAA,CAAA,CACCC,OAAO,CAAC,IAAA;gBACPlC,YAAAA,CAAa,KAAA,CAAA;AACf,YAAA,CAAA,CAAA;AACJ,QAAA;IACF,CAAA,EAAG;AACDY,QAAAA,wBAAAA;AACAW,QAAAA,uBAAAA;AACA7B,QAAAA,iBAAAA;AACAD,QAAAA,kBAAAA;AACA+B,QAAAA,iBAAAA;AACAE,QAAAA,cAAAA;AACA/B,QAAAA;AACD,KAAA,CAAA;AAED;;;AAGC,MACD,MAAMwC,cAAAA,GAAiBpB,MAAAA,CAAOqB,OAAO,CAAC;AACpC,QAAA,GAAGlB,qBAAqB;AACxB,QAAA,GAAGb;AACL,KAAA,CAAA,CAAGc,MAAM,CAAC,CAACC,GAAAA,EAAK,CAACiB,MAAMC,OAAAA,CAAQ,GAAA;AAC7BlB,QAAAA,GAAG,CAAC,CAAC,GAAG,EAAEmB,kBAAAA,CAAWF,IAAAA,CAAAA,CAAAA,CAAO,CAAC,GAAGC,OAAAA;QAEhC,OAAOlB,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;IAEJ,OAAO;AACLe,QAAAA,cAAAA;QACAK,WAAAA,EAAa5B,wBAAAA;AACbb,QAAAA,SAAAA,EAAWA,SAAAA,IAAaH,aAAAA;AACxBO,QAAAA;AACF,KAAA;AACF;AAEA,MAAMmB,gBAAgB,CAACD,UAAAA,GAAAA;AACrB,IAAA,MAAM,CAACoB,MAAAA,GAAS,EAAE,CAAC,GAAGpB,UAAAA,CAAWoB,MAAM,CAACC,KAAK,CAAC,GAAA,CAAA,CAAKC,KAAK,CAAC,EAAC,CAAA;IAC1D,OAAOF,MAAAA,CAAOC,KAAK,CAAC,GAAA,CAAA,CAAKE,GAAG,CAACL,kBAAAA,CAAAA,CAAYM,IAAI,CAAC,EAAA,CAAA;AAChD,CAAA;;;;"}
1
+ {"version":3,"file":"useRBAC.js","sources":["../../../../../admin/src/hooks/useRBAC.ts"],"sourcesContent":["import * as React from 'react';\n\nimport isEqual from 'lodash/isEqual';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { once } from '../utils/once';\nimport { capitalise } from '../utils/strings';\n\nimport { usePrev } from './usePrev';\n\ntype AllowedActions = Record<string, boolean>;\n\n/**\n * @public\n * @description This hooks takes an object or array of permissions (the latter preferred) and\n * runs through them to match against the current user's permissions as well as the RBAC middleware\n * system checking any conditions that may be present. It returns the filtered permissions as the complete\n * object from the API and a set of actions that can be performed. An action is derived from the last part\n * of the permission action e.g. `admin::roles.create` would be `canCreate`. If there's a hyphen in the action\n * this is removed and capitalised e.g `admin::roles.create-draft` would be `canCreateDraft`.\n * @example\n * ```tsx\n * import { Page, useRBAC } from '@strapi/strapi/admin'\n *\n * const MyProtectedPage = () => {\n * const { allowedActions, isLoading, error, permissions } = useRBAC([{ action: 'admin::roles.create' }])\n *\n * if(isLoading) {\n * return <Page.Loading />\n * }\n *\n * if(error){\n * return <Page.Error />\n * }\n *\n * if(!allowedActions.canCreate) {\n * return null\n * }\n *\n * return <MyPage permissions={permissions} />\n * }\n * ```\n */\nconst useRBAC = (\n permissionsToCheck: Record<string, Permission[]> | Permission[] = [],\n passedPermissions?: Permission[],\n rawQueryContext?: string\n): {\n allowedActions: AllowedActions;\n isLoading: boolean;\n error?: unknown;\n permissions: Permission[];\n} => {\n const isLoadingAuth = useAuth('useRBAC', (state) => state.isLoading);\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>();\n const [data, setData] = React.useState<Record<string, boolean>>();\n\n const warnOnce = React.useMemo(() => once(console.warn), []);\n\n const actualPermissionsToCheck: Permission[] = React.useMemo(() => {\n if (Array.isArray(permissionsToCheck)) {\n return permissionsToCheck;\n } else {\n warnOnce(\n 'useRBAC: The first argument should be an array of permissions, not an object. This will be deprecated in the future.'\n );\n\n return Object.values(permissionsToCheck).flat();\n }\n }, [permissionsToCheck, warnOnce]);\n\n /**\n * This is the default value we return until the queryResults[i].data\n * are all resolved with data. This preserves the original behaviour.\n */\n const defaultAllowedActions = React.useMemo(() => {\n return actualPermissionsToCheck.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: false,\n };\n }, {});\n }, [actualPermissionsToCheck]);\n\n const checkUserHasPermissions = useAuth(\n 'useRBAC',\n (state) => state.checkUserHasPermissions,\n true\n );\n\n const permssionsChecked = usePrev(actualPermissionsToCheck);\n const contextChecked = usePrev(rawQueryContext);\n\n React.useEffect(() => {\n if (\n !isEqual(permssionsChecked, actualPermissionsToCheck) ||\n // TODO: also run this when the query context changes\n contextChecked !== rawQueryContext\n ) {\n setIsLoading(true);\n setData(undefined);\n setError(undefined);\n\n checkUserHasPermissions(actualPermissionsToCheck, passedPermissions, rawQueryContext)\n .then((res) => {\n if (res) {\n setData(\n res.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: true,\n };\n }, {})\n );\n }\n })\n .catch((err) => {\n setError(err);\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n }, [\n actualPermissionsToCheck,\n checkUserHasPermissions,\n passedPermissions,\n permissionsToCheck,\n permssionsChecked,\n contextChecked,\n rawQueryContext,\n ]);\n\n /**\n * This hook originally would not return allowedActions\n * until all the checks were complete.\n */\n const allowedActions = Object.entries({\n ...defaultAllowedActions,\n ...data,\n }).reduce((acc, [name, allowed]) => {\n acc[`can${capitalise(name)}`] = allowed;\n\n return acc;\n }, {} as AllowedActions);\n\n return {\n allowedActions,\n permissions: actualPermissionsToCheck,\n isLoading: isLoading || isLoadingAuth,\n error,\n };\n};\n\nconst getActionName = (permission: Permission): string => {\n const [action = ''] = permission.action.split('.').slice(-1);\n return action.split('-').map(capitalise).join('');\n};\n\nexport { useRBAC };\nexport type { AllowedActions };\n"],"names":["useRBAC","permissionsToCheck","passedPermissions","rawQueryContext","isLoadingAuth","useAuth","state","isLoading","setIsLoading","React","useState","error","setError","data","setData","warnOnce","useMemo","once","console","warn","actualPermissionsToCheck","Array","isArray","Object","values","flat","defaultAllowedActions","reduce","acc","permission","getActionName","checkUserHasPermissions","permssionsChecked","usePrev","contextChecked","useEffect","isEqual","undefined","then","res","catch","err","finally","allowedActions","entries","name","allowed","capitalise","permissions","action","split","slice","map","join"],"mappings":"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"}
@@ -65,7 +65,7 @@ import { usePrev } from './usePrev.mjs';
65
65
  }, [
66
66
  actualPermissionsToCheck
67
67
  ]);
68
- const checkUserHasPermissions = useAuth('useRBAC', (state)=>state.checkUserHasPermissions);
68
+ const checkUserHasPermissions = useAuth('useRBAC', (state)=>state.checkUserHasPermissions, true);
69
69
  const permssionsChecked = usePrev(actualPermissionsToCheck);
70
70
  const contextChecked = usePrev(rawQueryContext);
71
71
  React.useEffect(()=>{