@strapi/admin 5.0.0-alpha.1 → 5.0.0-alpha.3

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 (1025) hide show
  1. package/dist/admin/AdminSeatInfo-RaHBmrod.mjs +101 -0
  2. package/dist/admin/AdminSeatInfo-RaHBmrod.mjs.map +1 -0
  3. package/dist/admin/AdminSeatInfo-TsCaWOLV.js +105 -0
  4. package/dist/admin/AdminSeatInfo-TsCaWOLV.js.map +1 -0
  5. package/dist/admin/ApplicationInfoPage-Q9wPZ3rv.mjs +670 -0
  6. package/dist/admin/ApplicationInfoPage-Q9wPZ3rv.mjs.map +1 -0
  7. package/dist/admin/ApplicationInfoPage-ma8gBkmC.js +698 -0
  8. package/dist/admin/ApplicationInfoPage-ma8gBkmC.js.map +1 -0
  9. package/dist/admin/AuthResponse-829u1Bgr.mjs +43 -0
  10. package/dist/admin/AuthResponse-829u1Bgr.mjs.map +1 -0
  11. package/dist/admin/AuthResponse-jXbQnvQx.js +70 -0
  12. package/dist/admin/AuthResponse-jXbQnvQx.js.map +1 -0
  13. package/dist/admin/AuthenticatedLayout--yP2CRIf.mjs +1115 -0
  14. package/dist/admin/AuthenticatedLayout--yP2CRIf.mjs.map +1 -0
  15. package/dist/admin/AuthenticatedLayout-xBpE8NA-.js +1148 -0
  16. package/dist/admin/AuthenticatedLayout-xBpE8NA-.js.map +1 -0
  17. package/dist/admin/ComponentConfigurationPage-KnpNn9te.mjs +237 -0
  18. package/dist/admin/ComponentConfigurationPage-KnpNn9te.mjs.map +1 -0
  19. package/dist/admin/ComponentConfigurationPage-hY2EaAYj.js +262 -0
  20. package/dist/admin/ComponentConfigurationPage-hY2EaAYj.js.map +1 -0
  21. package/dist/admin/ComponentIcon-AkrHxAkm.mjs +158 -0
  22. package/dist/admin/ComponentIcon-AkrHxAkm.mjs.map +1 -0
  23. package/dist/admin/ComponentIcon-wcNWpdCz.js +180 -0
  24. package/dist/admin/ComponentIcon-wcNWpdCz.js.map +1 -0
  25. package/dist/admin/ContentBox-PbS25I_4.mjs +40 -0
  26. package/dist/admin/ContentBox-PbS25I_4.mjs.map +1 -0
  27. package/dist/admin/ContentBox-xqJCP2BC.js +46 -0
  28. package/dist/admin/ContentBox-xqJCP2BC.js.map +1 -0
  29. package/dist/admin/CreateActionEE-MO4CwmTg.js +61 -0
  30. package/dist/admin/CreateActionEE-MO4CwmTg.js.map +1 -0
  31. package/dist/admin/CreateActionEE-MS5BO87T.mjs +53 -0
  32. package/dist/admin/CreateActionEE-MS5BO87T.mjs.map +1 -0
  33. package/dist/admin/CreatePage-TuxqMr0o.mjs +248 -0
  34. package/dist/admin/CreatePage-TuxqMr0o.mjs.map +1 -0
  35. package/dist/admin/CreatePage-WpCjH5Y_.js +272 -0
  36. package/dist/admin/CreatePage-WpCjH5Y_.js.map +1 -0
  37. package/dist/admin/CreatePage-atcxK0nv.mjs +245 -0
  38. package/dist/admin/CreatePage-atcxK0nv.mjs.map +1 -0
  39. package/dist/admin/CreatePage-nXCKqLfv.js +18 -0
  40. package/dist/admin/CreatePage-nXCKqLfv.js.map +1 -0
  41. package/dist/admin/CreatePage-qT-aQZxS.mjs +13 -0
  42. package/dist/admin/CreatePage-qT-aQZxS.mjs.map +1 -0
  43. package/dist/admin/CreatePage-rPWvvWs7.js +274 -0
  44. package/dist/admin/CreatePage-rPWvvWs7.js.map +1 -0
  45. package/dist/admin/CreateView-2p_vypXq.js +17 -0
  46. package/dist/admin/CreateView-2p_vypXq.js.map +1 -0
  47. package/dist/admin/CreateView-C1q22Lvk.mjs +13 -0
  48. package/dist/admin/CreateView-C1q22Lvk.mjs.map +1 -0
  49. package/dist/admin/CreateView-Tdx1lvOB.js +17 -0
  50. package/dist/admin/CreateView-Tdx1lvOB.js.map +1 -0
  51. package/dist/admin/CreateView-e7AQd7tP.mjs +13 -0
  52. package/dist/admin/CreateView-e7AQd7tP.mjs.map +1 -0
  53. package/dist/admin/EditConfigurationPage-elMqHM_A.mjs +130 -0
  54. package/dist/admin/EditConfigurationPage-elMqHM_A.mjs.map +1 -0
  55. package/dist/admin/EditConfigurationPage-lf0uG4_2.js +155 -0
  56. package/dist/admin/EditConfigurationPage-lf0uG4_2.js.map +1 -0
  57. package/dist/admin/EditPage-Ef0Fslnn.js +354 -0
  58. package/dist/admin/EditPage-Ef0Fslnn.js.map +1 -0
  59. package/dist/admin/EditPage-OeI53g45.mjs +260 -0
  60. package/dist/admin/EditPage-OeI53g45.mjs.map +1 -0
  61. package/dist/admin/EditPage-Pve0dLk9.js +327 -0
  62. package/dist/admin/EditPage-Pve0dLk9.js.map +1 -0
  63. package/dist/admin/EditPage-UJJ2TqBc.js +286 -0
  64. package/dist/admin/EditPage-UJJ2TqBc.js.map +1 -0
  65. package/dist/admin/EditPage-eR-YN8hj.mjs +794 -0
  66. package/dist/admin/EditPage-eR-YN8hj.mjs.map +1 -0
  67. package/dist/admin/EditPage-erGEYjBw.mjs +325 -0
  68. package/dist/admin/EditPage-erGEYjBw.mjs.map +1 -0
  69. package/dist/admin/EditPage-h8lmVUEA.mjs +303 -0
  70. package/dist/admin/EditPage-h8lmVUEA.mjs.map +1 -0
  71. package/dist/admin/EditPage-tC47Sw_P.js +822 -0
  72. package/dist/admin/EditPage-tC47Sw_P.js.map +1 -0
  73. package/dist/admin/EditView-eySlKWYf.js +362 -0
  74. package/dist/admin/EditView-eySlKWYf.js.map +1 -0
  75. package/dist/admin/EditView-x1qgWntY.mjs +336 -0
  76. package/dist/admin/EditView-x1qgWntY.mjs.map +1 -0
  77. package/dist/admin/EditViewPage--KlNP7xz.mjs +198 -0
  78. package/dist/admin/EditViewPage--KlNP7xz.mjs.map +1 -0
  79. package/dist/admin/EditViewPage-MF0jfabM.js +226 -0
  80. package/dist/admin/EditViewPage-MF0jfabM.js.map +1 -0
  81. package/dist/admin/EditViewPage-NC42P37Y.mjs +846 -0
  82. package/dist/admin/EditViewPage-NC42P37Y.mjs.map +1 -0
  83. package/dist/admin/EditViewPage-_9OVPk8U.js +879 -0
  84. package/dist/admin/EditViewPage-_9OVPk8U.js.map +1 -0
  85. package/dist/admin/EventsTable-FclswYEC.js +36 -0
  86. package/dist/admin/EventsTable-FclswYEC.js.map +1 -0
  87. package/dist/admin/EventsTable-sl9Ii-zk.mjs +32 -0
  88. package/dist/admin/EventsTable-sl9Ii-zk.mjs.map +1 -0
  89. package/dist/admin/FieldTypeIcon--WKPFDG2.js +52 -0
  90. package/dist/admin/FieldTypeIcon--WKPFDG2.js.map +1 -0
  91. package/dist/admin/FieldTypeIcon-AibcTcXN.mjs +50 -0
  92. package/dist/admin/FieldTypeIcon-AibcTcXN.mjs.map +1 -0
  93. package/dist/admin/Filters-WmczcUjA.mjs +489 -0
  94. package/dist/admin/Filters-WmczcUjA.mjs.map +1 -0
  95. package/dist/admin/Filters-xCY3Scq4.js +511 -0
  96. package/dist/admin/Filters-xCY3Scq4.js.map +1 -0
  97. package/dist/admin/Form-4WnSgaHv.mjs +739 -0
  98. package/dist/admin/Form-4WnSgaHv.mjs.map +1 -0
  99. package/dist/admin/Form-KkSKnRfU.js +767 -0
  100. package/dist/admin/Form-KkSKnRfU.js.map +1 -0
  101. package/dist/admin/History-0MMslhUv.mjs +430 -0
  102. package/dist/admin/History-0MMslhUv.mjs.map +1 -0
  103. package/dist/admin/History-eZH2Aqa1.js +456 -0
  104. package/dist/admin/History-eZH2Aqa1.js.map +1 -0
  105. package/dist/admin/HomePage-c066MxgP.mjs +521 -0
  106. package/dist/admin/HomePage-c066MxgP.mjs.map +1 -0
  107. package/dist/admin/HomePage-lw1r2If1.js +530 -0
  108. package/dist/admin/HomePage-lw1r2If1.js.map +1 -0
  109. package/dist/admin/HomePage-rnxrKLBm.js +15 -0
  110. package/dist/admin/HomePage-rnxrKLBm.js.map +1 -0
  111. package/dist/admin/HomePage-ruRmxUmi.mjs +11 -0
  112. package/dist/admin/HomePage-ruRmxUmi.mjs.map +1 -0
  113. package/dist/admin/InputRenderer-89lhMw5B.js +5347 -0
  114. package/dist/admin/InputRenderer-89lhMw5B.js.map +1 -0
  115. package/dist/admin/InputRenderer-ddUokGFQ.mjs +5306 -0
  116. package/dist/admin/InputRenderer-ddUokGFQ.mjs.map +1 -0
  117. package/dist/admin/InstalledPluginsPage-4hUy0Kzu.js +126 -0
  118. package/dist/admin/InstalledPluginsPage-4hUy0Kzu.js.map +1 -0
  119. package/dist/admin/InstalledPluginsPage-F_LdmUvc.mjs +101 -0
  120. package/dist/admin/InstalledPluginsPage-F_LdmUvc.mjs.map +1 -0
  121. package/dist/admin/Layout--4O1STTS.js +237 -0
  122. package/dist/admin/Layout--4O1STTS.js.map +1 -0
  123. package/dist/admin/Layout-12gUdjvi.mjs +89 -0
  124. package/dist/admin/Layout-12gUdjvi.mjs.map +1 -0
  125. package/dist/admin/Layout-IkzS-9jW.mjs +209 -0
  126. package/dist/admin/Layout-IkzS-9jW.mjs.map +1 -0
  127. package/dist/admin/Layout-LPeuunW1.js +97 -0
  128. package/dist/admin/Layout-LPeuunW1.js.map +1 -0
  129. package/dist/admin/ListConfigurationPage-Sj0Fbune.js +679 -0
  130. package/dist/admin/ListConfigurationPage-Sj0Fbune.js.map +1 -0
  131. package/dist/admin/ListConfigurationPage-aVwnEajq.mjs +651 -0
  132. package/dist/admin/ListConfigurationPage-aVwnEajq.mjs.map +1 -0
  133. package/dist/admin/ListPage-4-8fscdP.js +363 -0
  134. package/dist/admin/ListPage-4-8fscdP.js.map +1 -0
  135. package/dist/admin/ListPage-5Mv-pB4C.js +520 -0
  136. package/dist/admin/ListPage-5Mv-pB4C.js.map +1 -0
  137. package/dist/admin/ListPage-J7j1MewO.mjs +540 -0
  138. package/dist/admin/ListPage-J7j1MewO.mjs.map +1 -0
  139. package/dist/admin/ListPage-Umx66wz5.js +568 -0
  140. package/dist/admin/ListPage-Umx66wz5.js.map +1 -0
  141. package/dist/admin/ListPage-YQEYg_px.mjs +276 -0
  142. package/dist/admin/ListPage-YQEYg_px.mjs.map +1 -0
  143. package/dist/admin/ListPage-cjKaeLgt.mjs +338 -0
  144. package/dist/admin/ListPage-cjKaeLgt.mjs.map +1 -0
  145. package/dist/admin/ListPage-fgcVicZB.mjs +11 -0
  146. package/dist/admin/ListPage-fgcVicZB.mjs.map +1 -0
  147. package/dist/admin/ListPage-pbpYBzDZ.mjs +288 -0
  148. package/dist/admin/ListPage-pbpYBzDZ.mjs.map +1 -0
  149. package/dist/admin/ListPage-pcklRUos.js +304 -0
  150. package/dist/admin/ListPage-pcklRUos.js.map +1 -0
  151. package/dist/admin/ListPage-pvhgqLCH.js +313 -0
  152. package/dist/admin/ListPage-pvhgqLCH.js.map +1 -0
  153. package/dist/admin/ListPage-udzDwGlH.js +15 -0
  154. package/dist/admin/ListPage-udzDwGlH.js.map +1 -0
  155. package/dist/admin/ListPage-w59EHkU5.mjs +492 -0
  156. package/dist/admin/ListPage-w59EHkU5.mjs.map +1 -0
  157. package/dist/admin/ListView-j2r_9ISi.js +228 -0
  158. package/dist/admin/ListView-j2r_9ISi.js.map +1 -0
  159. package/dist/admin/ListView-kGivEizN.mjs +212 -0
  160. package/dist/admin/ListView-kGivEizN.mjs.map +1 -0
  161. package/dist/admin/ListView-n1aKpVDI.js +238 -0
  162. package/dist/admin/ListView-n1aKpVDI.js.map +1 -0
  163. package/dist/admin/ListView-r5ixmUC5.mjs +202 -0
  164. package/dist/admin/ListView-r5ixmUC5.mjs.map +1 -0
  165. package/dist/admin/ListViewPage-P945_1O5.js +957 -0
  166. package/dist/admin/ListViewPage-P945_1O5.js.map +1 -0
  167. package/dist/admin/ListViewPage-TJbHzMdV.mjs +925 -0
  168. package/dist/admin/ListViewPage-TJbHzMdV.mjs.map +1 -0
  169. package/dist/admin/Login-0X6MwipF.mjs +31 -0
  170. package/dist/admin/Login-0X6MwipF.mjs.map +1 -0
  171. package/dist/admin/Login-z6SxPtlF.js +39 -0
  172. package/dist/admin/Login-z6SxPtlF.js.map +1 -0
  173. package/dist/admin/MagicLinkEE-OoAnOb7G.mjs +27 -0
  174. package/dist/admin/MagicLinkEE-OoAnOb7G.mjs.map +1 -0
  175. package/dist/admin/MagicLinkEE-Y6HYUQfj.js +31 -0
  176. package/dist/admin/MagicLinkEE-Y6HYUQfj.js.map +1 -0
  177. package/dist/admin/MarketplacePage-7fNWKnG0.js +1045 -0
  178. package/dist/admin/MarketplacePage-7fNWKnG0.js.map +1 -0
  179. package/dist/admin/MarketplacePage-PYAB5VYz.mjs +1014 -0
  180. package/dist/admin/MarketplacePage-PYAB5VYz.mjs.map +1 -0
  181. package/dist/admin/ModalForm-Gh2063zZ.mjs +23 -0
  182. package/dist/admin/ModalForm-Gh2063zZ.mjs.map +1 -0
  183. package/dist/admin/ModalForm-wXXenEdW.js +28 -0
  184. package/dist/admin/ModalForm-wXXenEdW.js.map +1 -0
  185. package/dist/admin/NoContentTypePage-6mgFtik-.mjs +50 -0
  186. package/dist/admin/NoContentTypePage-6mgFtik-.mjs.map +1 -0
  187. package/dist/admin/NoContentTypePage-7GuJBa-V.js +54 -0
  188. package/dist/admin/NoContentTypePage-7GuJBa-V.js.map +1 -0
  189. package/dist/admin/NoPermissionsPage-6oZ4iqff.mjs +23 -0
  190. package/dist/admin/NoPermissionsPage-6oZ4iqff.mjs.map +1 -0
  191. package/dist/admin/NoPermissionsPage-E2ro9iCX.js +27 -0
  192. package/dist/admin/NoPermissionsPage-E2ro9iCX.js.map +1 -0
  193. package/dist/admin/NotAllowed-9d8xvtvI.mjs +36 -0
  194. package/dist/admin/NotAllowed-9d8xvtvI.mjs.map +1 -0
  195. package/dist/admin/NotAllowed-FmDlK9I3.js +42 -0
  196. package/dist/admin/NotAllowed-FmDlK9I3.js.map +1 -0
  197. package/dist/admin/Ornaments-fHu7120M.js +214 -0
  198. package/dist/admin/Ornaments-fHu7120M.js.map +1 -0
  199. package/dist/admin/Ornaments-izqdN6fh.mjs +209 -0
  200. package/dist/admin/Ornaments-izqdN6fh.mjs.map +1 -0
  201. package/dist/admin/Permissions-VR9Rnqkr.js +2082 -0
  202. package/dist/admin/Permissions-VR9Rnqkr.js.map +1 -0
  203. package/dist/admin/Permissions-kvKR0BEy.mjs +2046 -0
  204. package/dist/admin/Permissions-kvKR0BEy.mjs.map +1 -0
  205. package/dist/admin/PrivateRoute-dcpEjhVL.js +22 -0
  206. package/dist/admin/PrivateRoute-dcpEjhVL.js.map +1 -0
  207. package/dist/admin/PrivateRoute-jEzBQwGq.mjs +20 -0
  208. package/dist/admin/PrivateRoute-jEzBQwGq.mjs.map +1 -0
  209. package/dist/admin/ProfilePage-5zMiyfq8.js +419 -0
  210. package/dist/admin/ProfilePage-5zMiyfq8.js.map +1 -0
  211. package/dist/admin/ProfilePage-vP1WwOSo.mjs +391 -0
  212. package/dist/admin/ProfilePage-vP1WwOSo.mjs.map +1 -0
  213. package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs +48 -0
  214. package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs.map +1 -0
  215. package/dist/admin/PurchaseAuditLogs-couRts7-.js +52 -0
  216. package/dist/admin/PurchaseAuditLogs-couRts7-.js.map +1 -0
  217. package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs +51 -0
  218. package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs.map +1 -0
  219. package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js +55 -0
  220. package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js.map +1 -0
  221. package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs +51 -0
  222. package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs.map +1 -0
  223. package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js +55 -0
  224. package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js.map +1 -0
  225. package/dist/admin/ReviewWorkflowsColumn-6zZJluSU.mjs +34 -0
  226. package/dist/admin/ReviewWorkflowsColumn-6zZJluSU.mjs.map +1 -0
  227. package/dist/admin/ReviewWorkflowsColumn-NVi2rQul.js +39 -0
  228. package/dist/admin/ReviewWorkflowsColumn-NVi2rQul.js.map +1 -0
  229. package/dist/admin/SSOProviders-JTam8pNP.js +64 -0
  230. package/dist/admin/SSOProviders-JTam8pNP.js.map +1 -0
  231. package/dist/admin/SSOProviders-f1OPn1AH.mjs +58 -0
  232. package/dist/admin/SSOProviders-f1OPn1AH.mjs.map +1 -0
  233. package/dist/admin/SelectRoles-cVDrVL5d.mjs +106 -0
  234. package/dist/admin/SelectRoles-cVDrVL5d.mjs.map +1 -0
  235. package/dist/admin/SelectRoles-x4F6UwAi.js +114 -0
  236. package/dist/admin/SelectRoles-x4F6UwAi.js.map +1 -0
  237. package/dist/admin/SingleSignOnPage-MXM2dl1r.js +263 -0
  238. package/dist/admin/SingleSignOnPage-MXM2dl1r.js.map +1 -0
  239. package/dist/admin/SingleSignOnPage-qyob98fd.mjs +238 -0
  240. package/dist/admin/SingleSignOnPage-qyob98fd.mjs.map +1 -0
  241. package/dist/admin/Table-GO4n7QXV.mjs +165 -0
  242. package/dist/admin/Table-GO4n7QXV.mjs.map +1 -0
  243. package/dist/admin/Table-L9ox45fi.js +190 -0
  244. package/dist/admin/Table-L9ox45fi.js.map +1 -0
  245. package/dist/admin/TokenTypeSelect-IMMoVNb1.mjs +357 -0
  246. package/dist/admin/TokenTypeSelect-IMMoVNb1.mjs.map +1 -0
  247. package/dist/admin/TokenTypeSelect-mlkqk9MH.js +385 -0
  248. package/dist/admin/TokenTypeSelect-mlkqk9MH.js.map +1 -0
  249. package/dist/admin/UseCasePage-QSUB-KqK.mjs +146 -0
  250. package/dist/admin/UseCasePage-QSUB-KqK.mjs.map +1 -0
  251. package/dist/admin/UseCasePage-iGGqfq7-.js +175 -0
  252. package/dist/admin/UseCasePage-iGGqfq7-.js.map +1 -0
  253. package/dist/admin/apiTokens-HBaRXE71.mjs +56 -0
  254. package/dist/admin/apiTokens-HBaRXE71.mjs.map +1 -0
  255. package/dist/admin/apiTokens-RqehzGhC.js +62 -0
  256. package/dist/admin/apiTokens-RqehzGhC.js.map +1 -0
  257. package/dist/admin/ar-i6ait0_Z.js +939 -0
  258. package/dist/admin/ar-i6ait0_Z.js.map +1 -0
  259. package/dist/admin/ar-lYsknZVT.mjs +918 -0
  260. package/dist/admin/ar-lYsknZVT.mjs.map +1 -0
  261. package/dist/admin/ca-1Cl4eOmr.js +727 -0
  262. package/dist/admin/ca-1Cl4eOmr.js.map +1 -0
  263. package/dist/admin/ca-ruPjUw52.mjs +709 -0
  264. package/dist/admin/ca-ruPjUw52.mjs.map +1 -0
  265. package/dist/admin/constants-7TD-JFW-.mjs +52 -0
  266. package/dist/admin/constants-7TD-JFW-.mjs.map +1 -0
  267. package/dist/admin/constants-8PhEUZTR.js +8 -0
  268. package/dist/admin/constants-8PhEUZTR.js.map +1 -0
  269. package/dist/admin/constants-DxpaZFhM.mjs +10 -0
  270. package/dist/admin/constants-DxpaZFhM.mjs.map +1 -0
  271. package/dist/admin/constants-EoEtSd4i.mjs +5 -0
  272. package/dist/admin/constants-EoEtSd4i.mjs.map +1 -0
  273. package/dist/admin/constants-VMWcn5Dg.mjs +172 -0
  274. package/dist/admin/constants-VMWcn5Dg.mjs.map +1 -0
  275. package/dist/admin/constants-ePjaxS4h.js +60 -0
  276. package/dist/admin/constants-ePjaxS4h.js.map +1 -0
  277. package/dist/admin/constants-eV26e_2a.js +197 -0
  278. package/dist/admin/constants-eV26e_2a.js.map +1 -0
  279. package/dist/admin/constants-wsN7Fj5H.js +14 -0
  280. package/dist/admin/constants-wsN7Fj5H.js.map +1 -0
  281. package/dist/admin/cs-MneRs5g8.js +294 -0
  282. package/dist/admin/cs-MneRs5g8.js.map +1 -0
  283. package/dist/admin/cs-cEW7Jgll.mjs +281 -0
  284. package/dist/admin/cs-cEW7Jgll.mjs.map +1 -0
  285. package/dist/admin/de-vPJQw5Tm.js +719 -0
  286. package/dist/admin/de-vPJQw5Tm.js.map +1 -0
  287. package/dist/admin/de-xZr3TXsT.mjs +701 -0
  288. package/dist/admin/de-xZr3TXsT.mjs.map +1 -0
  289. package/dist/admin/dk-_Fh6kypZ.js +637 -0
  290. package/dist/admin/dk-_Fh6kypZ.js.map +1 -0
  291. package/dist/admin/dk-nqK-ugFb.mjs +619 -0
  292. package/dist/admin/dk-nqK-ugFb.mjs.map +1 -0
  293. package/dist/admin/en-X84kQxpg.js +1068 -0
  294. package/dist/admin/en-X84kQxpg.js.map +1 -0
  295. package/dist/admin/en-qxG24n4z.mjs +1047 -0
  296. package/dist/admin/en-qxG24n4z.mjs.map +1 -0
  297. package/dist/admin/es-6dicYJQA.mjs +779 -0
  298. package/dist/admin/es-6dicYJQA.mjs.map +1 -0
  299. package/dist/admin/es-FC_8jlK7.js +799 -0
  300. package/dist/admin/es-FC_8jlK7.js.map +1 -0
  301. package/dist/admin/eu-Pzqod2VF.js +835 -0
  302. package/dist/admin/eu-Pzqod2VF.js.map +1 -0
  303. package/dist/admin/eu-l9nvfvQj.mjs +815 -0
  304. package/dist/admin/eu-l9nvfvQj.mjs.map +1 -0
  305. package/dist/admin/fr-8h2tzs3Z.js +765 -0
  306. package/dist/admin/fr-8h2tzs3Z.js.map +1 -0
  307. package/dist/admin/fr-97oVHDGZ.mjs +744 -0
  308. package/dist/admin/fr-97oVHDGZ.mjs.map +1 -0
  309. package/dist/admin/gu-YXP9LW1p.mjs +617 -0
  310. package/dist/admin/gu-YXP9LW1p.mjs.map +1 -0
  311. package/dist/admin/gu-fkXeW5oU.js +626 -0
  312. package/dist/admin/gu-fkXeW5oU.js.map +1 -0
  313. package/dist/admin/he-Rnd0orlz.mjs +315 -0
  314. package/dist/admin/he-Rnd0orlz.mjs.map +1 -0
  315. package/dist/admin/he-YNZzVWgP.js +329 -0
  316. package/dist/admin/he-YNZzVWgP.js.map +1 -0
  317. package/dist/admin/hi-42LJgJV1.mjs +707 -0
  318. package/dist/admin/hi-42LJgJV1.mjs.map +1 -0
  319. package/dist/admin/hi-ubgoUzQ0.js +725 -0
  320. package/dist/admin/hi-ubgoUzQ0.js.map +1 -0
  321. package/dist/admin/hu-oHJgjivB.js +835 -0
  322. package/dist/admin/hu-oHJgjivB.js.map +1 -0
  323. package/dist/admin/hu-xsansjmF.mjs +815 -0
  324. package/dist/admin/hu-xsansjmF.mjs.map +1 -0
  325. package/dist/admin/id-JurRr0gC.mjs +438 -0
  326. package/dist/admin/id-JurRr0gC.mjs.map +1 -0
  327. package/dist/admin/id-T2ge96wh.js +451 -0
  328. package/dist/admin/id-T2ge96wh.js.map +1 -0
  329. package/dist/admin/index--h1ljeG8.mjs +5908 -0
  330. package/dist/admin/index--h1ljeG8.mjs.map +1 -0
  331. package/dist/admin/index-Xcv2DEB8.js +6004 -0
  332. package/dist/admin/index-Xcv2DEB8.js.map +1 -0
  333. package/dist/admin/index.js +33 -18
  334. package/dist/admin/index.js.map +1 -1
  335. package/dist/admin/index.mjs +3 -28
  336. package/dist/admin/index.mjs.map +1 -1
  337. package/dist/admin/it-890_w-P3.mjs +449 -0
  338. package/dist/admin/it-890_w-P3.mjs.map +1 -0
  339. package/dist/admin/it-uWPMs24z.js +462 -0
  340. package/dist/admin/it-uWPMs24z.js.map +1 -0
  341. package/dist/admin/ja-F61alnK1.mjs +618 -0
  342. package/dist/admin/ja-F61alnK1.mjs.map +1 -0
  343. package/dist/admin/ja-pw-zE8MH.js +636 -0
  344. package/dist/admin/ja-pw-zE8MH.js.map +1 -0
  345. package/dist/admin/ko-DfQWK5T3.mjs +616 -0
  346. package/dist/admin/ko-DfQWK5T3.mjs.map +1 -0
  347. package/dist/admin/ko-XhK2FY3_.js +634 -0
  348. package/dist/admin/ko-XhK2FY3_.js.map +1 -0
  349. package/dist/admin/ml-EVaVYywL.mjs +707 -0
  350. package/dist/admin/ml-EVaVYywL.mjs.map +1 -0
  351. package/dist/admin/ml-hT2VI8JA.js +725 -0
  352. package/dist/admin/ml-hT2VI8JA.js.map +1 -0
  353. package/dist/admin/ms-CzgcVrsY.mjs +332 -0
  354. package/dist/admin/ms-CzgcVrsY.mjs.map +1 -0
  355. package/dist/admin/ms-DoMJCZ42.js +345 -0
  356. package/dist/admin/ms-DoMJCZ42.js.map +1 -0
  357. package/dist/admin/nl-LLi_sx9P.js +831 -0
  358. package/dist/admin/nl-LLi_sx9P.js.map +1 -0
  359. package/dist/admin/nl-XNqQYx_K.mjs +811 -0
  360. package/dist/admin/nl-XNqQYx_K.mjs.map +1 -0
  361. package/dist/admin/no-JwA1Lt4Y.mjs +300 -0
  362. package/dist/admin/no-JwA1Lt4Y.mjs.map +1 -0
  363. package/dist/admin/no-wmtVIVuz.js +313 -0
  364. package/dist/admin/no-wmtVIVuz.js.map +1 -0
  365. package/dist/admin/pl-05ncDTwZ.js +724 -0
  366. package/dist/admin/pl-05ncDTwZ.js.map +1 -0
  367. package/dist/admin/pl-euPz4n1g.mjs +706 -0
  368. package/dist/admin/pl-euPz4n1g.mjs.map +1 -0
  369. package/dist/admin/pt-BR-vpbGYSYw.mjs +777 -0
  370. package/dist/admin/pt-BR-vpbGYSYw.mjs.map +1 -0
  371. package/dist/admin/pt-BR-xA4J5pi2.js +797 -0
  372. package/dist/admin/pt-BR-xA4J5pi2.js.map +1 -0
  373. package/dist/admin/pt-RlnkaSdF.mjs +287 -0
  374. package/dist/admin/pt-RlnkaSdF.mjs.map +1 -0
  375. package/dist/admin/pt-yArB6nEx.js +299 -0
  376. package/dist/admin/pt-yArB6nEx.js.map +1 -0
  377. package/dist/admin/reducers-TOuLOGw_.mjs +4615 -0
  378. package/dist/admin/reducers-TOuLOGw_.mjs.map +1 -0
  379. package/dist/admin/reducers-uDxSALD_.js +4762 -0
  380. package/dist/admin/reducers-uDxSALD_.js.map +1 -0
  381. package/dist/admin/ru-4bDDGI3o.js +996 -0
  382. package/dist/admin/ru-4bDDGI3o.js.map +1 -0
  383. package/dist/admin/ru-tyoEF5X6.mjs +975 -0
  384. package/dist/admin/ru-tyoEF5X6.mjs.map +1 -0
  385. package/dist/admin/sa-OOEUNg5o.js +725 -0
  386. package/dist/admin/sa-OOEUNg5o.js.map +1 -0
  387. package/dist/admin/sa-s-WVHU-Y.mjs +707 -0
  388. package/dist/admin/sa-s-WVHU-Y.mjs.map +1 -0
  389. package/dist/admin/selectors-NvWWczps.mjs +6 -0
  390. package/dist/admin/selectors-NvWWczps.mjs.map +1 -0
  391. package/dist/admin/selectors-ka781RNf.js +8 -0
  392. package/dist/admin/selectors-ka781RNf.js.map +1 -0
  393. package/dist/admin/sk-1sQSF-r2.js +693 -0
  394. package/dist/admin/sk-1sQSF-r2.js.map +1 -0
  395. package/dist/admin/sk-5bIrjuCN.mjs +673 -0
  396. package/dist/admin/sk-5bIrjuCN.mjs.map +1 -0
  397. package/dist/admin/src/StrapiApp.d.ts +2 -2
  398. package/dist/admin/src/components/PageHelpers.d.ts +7 -3
  399. package/dist/admin/src/content-manager/features/DocumentRBAC.d.ts +1 -1
  400. package/dist/admin/src/content-manager/history/services/historyVersion.d.ts +1 -1
  401. package/dist/admin/src/content-manager/hooks/useContentManagerInitData.d.ts +1 -1
  402. package/dist/admin/src/content-manager/hooks/useDocument.d.ts +7 -3
  403. package/dist/admin/src/content-manager/hooks/useSyncRbac.d.ts +1 -1
  404. package/dist/admin/src/content-manager/modules/rbac.d.ts +1 -1
  405. package/dist/admin/src/content-manager/pages/EditView/components/DocumentActions.d.ts +2 -1
  406. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +1 -1
  407. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +1 -1
  408. package/dist/admin/src/content-manager/services/api.d.ts +1 -1
  409. package/dist/admin/src/content-manager/services/components.d.ts +2 -2
  410. package/dist/admin/src/content-manager/services/contentTypes.d.ts +3 -3
  411. package/dist/admin/src/content-manager/services/documents.d.ts +17 -20
  412. package/dist/admin/src/content-manager/services/init.d.ts +1 -1
  413. package/dist/admin/src/content-manager/services/relations.d.ts +2 -2
  414. package/dist/admin/src/content-manager/services/uid.d.ts +3 -3
  415. package/dist/admin/src/core/store/configure.d.ts +3 -6
  416. package/dist/admin/src/core/store/hooks.d.ts +3 -6
  417. package/dist/admin/src/features/AppInfo.d.ts +22 -0
  418. package/dist/admin/src/features/Auth.d.ts +17 -3
  419. package/dist/admin/src/features/Notifications.d.ts +47 -0
  420. package/dist/admin/src/features/Tracking.d.ts +1 -1
  421. package/dist/admin/src/hooks/useAPIErrorHandler.d.ts +4 -3
  422. package/dist/admin/src/hooks/useClipboard.d.ts +4 -0
  423. package/dist/admin/src/hooks/useFetchClient.d.ts +43 -0
  424. package/dist/admin/src/hooks/useFocusInputField.d.ts +20 -0
  425. package/dist/admin/src/hooks/useMenu.d.ts +1 -2
  426. package/dist/admin/src/hooks/usePersistentState.d.ts +3 -0
  427. package/dist/admin/src/hooks/useQueryParams.d.ts +5 -0
  428. package/dist/admin/src/hooks/useRBAC.d.ts +9 -0
  429. package/dist/admin/src/index.d.ts +10 -4
  430. package/dist/admin/src/pages/Marketplace/components/NpmPackageCard.d.ts +1 -1
  431. package/dist/admin/src/pages/Marketplace/components/NpmPackagesGrid.d.ts +1 -1
  432. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
  433. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +1 -1
  434. package/dist/admin/src/selectors.d.ts +2 -4
  435. package/dist/admin/src/services/auth.d.ts +5 -1
  436. package/dist/admin/src/types/permissions.d.ts +1 -1
  437. package/dist/admin/src/utils/baseQuery.d.ts +1 -1
  438. package/dist/admin/src/utils/getFetchClient.d.ts +30 -0
  439. package/dist/admin/src/utils/getYupInnerErrors.d.ts +7 -0
  440. package/dist/admin/src/utils/normalizeAPIError.d.ts +2 -2
  441. package/dist/admin/src/utils/users.d.ts +1 -1
  442. package/dist/admin/sv-JVgQU2PS.mjs +810 -0
  443. package/dist/admin/sv-JVgQU2PS.mjs.map +1 -0
  444. package/dist/admin/sv-d0rqYiHZ.js +830 -0
  445. package/dist/admin/sv-d0rqYiHZ.js.map +1 -0
  446. package/dist/admin/test.js +4832 -0
  447. package/dist/admin/test.js.map +1 -0
  448. package/dist/admin/test.mjs +4787 -0
  449. package/dist/admin/test.mjs.map +1 -0
  450. package/dist/admin/tests/index.d.ts +1 -0
  451. package/dist/admin/tests/mockData.d.ts +2053 -0
  452. package/dist/admin/tests/server.d.ts +2 -0
  453. package/dist/admin/tests/setup.d.ts +1 -0
  454. package/dist/admin/tests/store.d.ts +395 -0
  455. package/dist/admin/tests/utils.d.ts +438 -0
  456. package/dist/admin/th-er8qvbeL.mjs +420 -0
  457. package/dist/admin/th-er8qvbeL.mjs.map +1 -0
  458. package/dist/admin/th-mqExIzdv.js +433 -0
  459. package/dist/admin/th-mqExIzdv.js.map +1 -0
  460. package/dist/admin/tr-aYPucbUC.js +788 -0
  461. package/dist/admin/tr-aYPucbUC.js.map +1 -0
  462. package/dist/admin/tr-b2vrBJ49.mjs +768 -0
  463. package/dist/admin/tr-b2vrBJ49.mjs.map +1 -0
  464. package/dist/admin/transferTokens-HxKzbhZt.js +65 -0
  465. package/dist/admin/transferTokens-HxKzbhZt.js.map +1 -0
  466. package/dist/admin/transferTokens-QOZjk416.mjs +59 -0
  467. package/dist/admin/transferTokens-QOZjk416.mjs.map +1 -0
  468. package/dist/admin/uk-1c7KIaI6.js +346 -0
  469. package/dist/admin/uk-1c7KIaI6.js.map +1 -0
  470. package/dist/admin/uk-RfkbT49M.mjs +333 -0
  471. package/dist/admin/uk-RfkbT49M.mjs.map +1 -0
  472. package/dist/admin/useAdminRoles-2R5oKMoO.js +50 -0
  473. package/dist/admin/useAdminRoles-2R5oKMoO.js.map +1 -0
  474. package/dist/admin/useAdminRoles-gR2hyMNd.mjs +28 -0
  475. package/dist/admin/useAdminRoles-gR2hyMNd.mjs.map +1 -0
  476. package/dist/admin/useContentTypes-Or3rDVks.mjs +51 -0
  477. package/dist/admin/useContentTypes-Or3rDVks.mjs.map +1 -0
  478. package/dist/admin/useContentTypes-RJRHsheR.js +73 -0
  479. package/dist/admin/useContentTypes-RJRHsheR.js.map +1 -0
  480. package/dist/admin/useDebounce-OnUygPz6.mjs +17 -0
  481. package/dist/admin/useDebounce-OnUygPz6.mjs.map +1 -0
  482. package/dist/admin/useDebounce-tz5EMJbt.js +39 -0
  483. package/dist/admin/useDebounce-tz5EMJbt.js.map +1 -0
  484. package/dist/admin/useDocumentLayout-5UQF9Yls.mjs +732 -0
  485. package/dist/admin/useDocumentLayout-5UQF9Yls.mjs.map +1 -0
  486. package/dist/admin/useDocumentLayout-wBQQmFJL.js +764 -0
  487. package/dist/admin/useDocumentLayout-wBQQmFJL.js.map +1 -0
  488. package/dist/admin/useLicenseLimitNotification-SSUn-Y_I.mjs +80 -0
  489. package/dist/admin/useLicenseLimitNotification-SSUn-Y_I.mjs.map +1 -0
  490. package/dist/admin/useLicenseLimitNotification-wFWLFjgU.js +105 -0
  491. package/dist/admin/useLicenseLimitNotification-wFWLFjgU.js.map +1 -0
  492. package/dist/admin/useOnce--ZSbXFh3.js +29 -0
  493. package/dist/admin/useOnce--ZSbXFh3.js.map +1 -0
  494. package/dist/admin/useOnce-GJ2Ta2mZ.mjs +7 -0
  495. package/dist/admin/useOnce-GJ2Ta2mZ.mjs.map +1 -0
  496. package/dist/admin/useReviewWorkflows-5xeAwxah.mjs +27 -0
  497. package/dist/admin/useReviewWorkflows-5xeAwxah.mjs.map +1 -0
  498. package/dist/admin/useReviewWorkflows-b64v93dC.js +29 -0
  499. package/dist/admin/useReviewWorkflows-b64v93dC.js.map +1 -0
  500. package/dist/admin/useSyncRbac-Od0wrAnD.mjs +45 -0
  501. package/dist/admin/useSyncRbac-Od0wrAnD.mjs.map +1 -0
  502. package/dist/admin/useSyncRbac-fR63KADE.js +67 -0
  503. package/dist/admin/useSyncRbac-fR63KADE.js.map +1 -0
  504. package/dist/admin/useWebhooks-7Grr2wYu.mjs +91 -0
  505. package/dist/admin/useWebhooks-7Grr2wYu.mjs.map +1 -0
  506. package/dist/admin/useWebhooks-KtPvzcTB.js +93 -0
  507. package/dist/admin/useWebhooks-KtPvzcTB.js.map +1 -0
  508. package/dist/admin/validateWorkflow-28G5p4rG.js +1077 -0
  509. package/dist/admin/validateWorkflow-28G5p4rG.js.map +1 -0
  510. package/dist/admin/validateWorkflow-nIbqjAha.mjs +1033 -0
  511. package/dist/admin/validateWorkflow-nIbqjAha.mjs.map +1 -0
  512. package/dist/admin/validation-aKPvEh9F.js +65 -0
  513. package/dist/admin/validation-aKPvEh9F.js.map +1 -0
  514. package/dist/admin/validation-uxcqs4Uq.mjs +43 -0
  515. package/dist/admin/validation-uxcqs4Uq.mjs.map +1 -0
  516. package/dist/admin/vi-Rg9es0FD.js +301 -0
  517. package/dist/admin/vi-Rg9es0FD.js.map +1 -0
  518. package/dist/admin/vi-pyngavdo.mjs +288 -0
  519. package/dist/admin/vi-pyngavdo.mjs.map +1 -0
  520. package/dist/admin/zh-Hans-Gbpdme1Q.mjs +939 -0
  521. package/dist/admin/zh-Hans-Gbpdme1Q.mjs.map +1 -0
  522. package/dist/admin/zh-Hans-SgnidiuG.js +960 -0
  523. package/dist/admin/zh-Hans-SgnidiuG.js.map +1 -0
  524. package/dist/admin/zh-ONWhjzCj.js +839 -0
  525. package/dist/admin/zh-ONWhjzCj.js.map +1 -0
  526. package/dist/admin/zh-fMjW2qMl.mjs +819 -0
  527. package/dist/admin/zh-fMjW2qMl.mjs.map +1 -0
  528. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.d.ts +1 -1
  529. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.d.ts +3 -3
  530. package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
  531. package/dist/ee/admin/src/services/reviewWorkflows.d.ts +6 -6
  532. package/dist/package.json.d.ts +201 -0
  533. package/dist/server/src/validation/api-tokens.d.ts +4 -27
  534. package/dist/server/src/validation/api-tokens.d.ts.map +1 -1
  535. package/dist/server/src/validation/authentication/register.d.ts +2 -8
  536. package/dist/server/src/validation/authentication/register.d.ts.map +1 -1
  537. package/dist/server/src/validation/permission.d.ts +4 -53
  538. package/dist/server/src/validation/permission.d.ts.map +1 -1
  539. package/dist/server/src/validation/policies/hasPermissions.d.ts +2 -7
  540. package/dist/server/src/validation/policies/hasPermissions.d.ts.map +1 -1
  541. package/dist/server/src/validation/role.d.ts +6 -23
  542. package/dist/server/src/validation/role.d.ts.map +1 -1
  543. package/dist/server/src/validation/transfer/token.d.ts +4 -23
  544. package/dist/server/src/validation/transfer/token.d.ts.map +1 -1
  545. package/dist/server/src/validation/user.d.ts +8 -56
  546. package/dist/server/src/validation/user.d.ts.map +1 -1
  547. package/dist/shared/contracts/admin.d.ts +0 -1
  548. package/dist/shared/contracts/api-token.d.ts +0 -1
  549. package/dist/shared/contracts/audit-logs.d.ts +0 -1
  550. package/dist/shared/contracts/authentication.d.ts +0 -1
  551. package/dist/shared/contracts/content-api/permissions.d.ts +0 -1
  552. package/dist/shared/contracts/content-api/routes.d.ts +0 -1
  553. package/dist/shared/contracts/content-api.d.ts +0 -1
  554. package/dist/shared/contracts/permissions.d.ts +0 -1
  555. package/dist/shared/contracts/providers.d.ts +0 -1
  556. package/dist/shared/contracts/review-workflows.d.ts +0 -1
  557. package/dist/shared/contracts/roles.d.ts +0 -1
  558. package/dist/shared/contracts/shared.d.ts +0 -1
  559. package/dist/shared/contracts/transfer.d.ts +0 -1
  560. package/dist/shared/contracts/user.d.ts +0 -1
  561. package/dist/shared/contracts/users.d.ts +0 -1
  562. package/dist/shared/contracts/webhooks.d.ts +0 -1
  563. package/package.json +26 -25
  564. package/dist/_chunks/AdminSeatInfo-20pkL95U.mjs +0 -101
  565. package/dist/_chunks/AdminSeatInfo-20pkL95U.mjs.map +0 -1
  566. package/dist/_chunks/AdminSeatInfo-TjK5LW2b.js +0 -101
  567. package/dist/_chunks/AdminSeatInfo-TjK5LW2b.js.map +0 -1
  568. package/dist/_chunks/ApplicationInfoPage-1OdKMDYH.js +0 -689
  569. package/dist/_chunks/ApplicationInfoPage-1OdKMDYH.js.map +0 -1
  570. package/dist/_chunks/ApplicationInfoPage-ed6y9Q-B.mjs +0 -667
  571. package/dist/_chunks/ApplicationInfoPage-ed6y9Q-B.mjs.map +0 -1
  572. package/dist/_chunks/AuthResponse-Hxop00n-.mjs +0 -43
  573. package/dist/_chunks/AuthResponse-Hxop00n-.mjs.map +0 -1
  574. package/dist/_chunks/AuthResponse-sca_wjIN.js +0 -64
  575. package/dist/_chunks/AuthResponse-sca_wjIN.js.map +0 -1
  576. package/dist/_chunks/AuthenticatedLayout-PPlOm7kb.js +0 -1132
  577. package/dist/_chunks/AuthenticatedLayout-PPlOm7kb.js.map +0 -1
  578. package/dist/_chunks/AuthenticatedLayout-knXNB2i2.mjs +0 -1105
  579. package/dist/_chunks/AuthenticatedLayout-knXNB2i2.mjs.map +0 -1
  580. package/dist/_chunks/ComponentConfigurationPage-okd3XovW.mjs +0 -235
  581. package/dist/_chunks/ComponentConfigurationPage-okd3XovW.mjs.map +0 -1
  582. package/dist/_chunks/ComponentConfigurationPage-xZMDjeVf.js +0 -254
  583. package/dist/_chunks/ComponentConfigurationPage-xZMDjeVf.js.map +0 -1
  584. package/dist/_chunks/ComponentIcon-49LyfYCX.js +0 -176
  585. package/dist/_chunks/ComponentIcon-49LyfYCX.js.map +0 -1
  586. package/dist/_chunks/ComponentIcon-J3aEhVgQ.mjs +0 -158
  587. package/dist/_chunks/ComponentIcon-J3aEhVgQ.mjs.map +0 -1
  588. package/dist/_chunks/ContentBox-4TRGOJYI.js +0 -41
  589. package/dist/_chunks/ContentBox-4TRGOJYI.js.map +0 -1
  590. package/dist/_chunks/ContentBox-EWvnSfCf.mjs +0 -40
  591. package/dist/_chunks/ContentBox-EWvnSfCf.mjs.map +0 -1
  592. package/dist/_chunks/CreateActionEE-E6YNdAVx.js +0 -55
  593. package/dist/_chunks/CreateActionEE-E6YNdAVx.js.map +0 -1
  594. package/dist/_chunks/CreateActionEE-PaZYJ410.mjs +0 -53
  595. package/dist/_chunks/CreateActionEE-PaZYJ410.mjs.map +0 -1
  596. package/dist/_chunks/CreatePage-1Oi4-aR6.js +0 -267
  597. package/dist/_chunks/CreatePage-1Oi4-aR6.js.map +0 -1
  598. package/dist/_chunks/CreatePage-6458K0l9.mjs +0 -14
  599. package/dist/_chunks/CreatePage-6458K0l9.mjs.map +0 -1
  600. package/dist/_chunks/CreatePage-DmNFNVN9.js +0 -268
  601. package/dist/_chunks/CreatePage-DmNFNVN9.js.map +0 -1
  602. package/dist/_chunks/CreatePage-P1F3dkB3.mjs +0 -248
  603. package/dist/_chunks/CreatePage-P1F3dkB3.mjs.map +0 -1
  604. package/dist/_chunks/CreatePage-PM_r99U5.mjs +0 -246
  605. package/dist/_chunks/CreatePage-PM_r99U5.mjs.map +0 -1
  606. package/dist/_chunks/CreatePage-hlkPO2Cv.js +0 -14
  607. package/dist/_chunks/CreatePage-hlkPO2Cv.js.map +0 -1
  608. package/dist/_chunks/CreateView-AWmN1xWJ.js +0 -13
  609. package/dist/_chunks/CreateView-AWmN1xWJ.js.map +0 -1
  610. package/dist/_chunks/CreateView-cTvLLIgu.mjs +0 -13
  611. package/dist/_chunks/CreateView-cTvLLIgu.mjs.map +0 -1
  612. package/dist/_chunks/CreateView-hUH4bf5k.js +0 -13
  613. package/dist/_chunks/CreateView-hUH4bf5k.js.map +0 -1
  614. package/dist/_chunks/CreateView-pBI75ZwZ.mjs +0 -13
  615. package/dist/_chunks/CreateView-pBI75ZwZ.mjs.map +0 -1
  616. package/dist/_chunks/EditConfigurationPage-LItt0mJo.mjs +0 -129
  617. package/dist/_chunks/EditConfigurationPage-LItt0mJo.mjs.map +0 -1
  618. package/dist/_chunks/EditConfigurationPage-PZ4yq1bM.js +0 -148
  619. package/dist/_chunks/EditConfigurationPage-PZ4yq1bM.js.map +0 -1
  620. package/dist/_chunks/EditPage--EPGgPNr.mjs +0 -260
  621. package/dist/_chunks/EditPage--EPGgPNr.mjs.map +0 -1
  622. package/dist/_chunks/EditPage-30rqjB1d.mjs +0 -303
  623. package/dist/_chunks/EditPage-30rqjB1d.mjs.map +0 -1
  624. package/dist/_chunks/EditPage-GRIZWtGz.mjs +0 -790
  625. package/dist/_chunks/EditPage-GRIZWtGz.mjs.map +0 -1
  626. package/dist/_chunks/EditPage-MPNLCYgQ.mjs +0 -326
  627. package/dist/_chunks/EditPage-MPNLCYgQ.mjs.map +0 -1
  628. package/dist/_chunks/EditPage-RpzlPkkU.js +0 -811
  629. package/dist/_chunks/EditPage-RpzlPkkU.js.map +0 -1
  630. package/dist/_chunks/EditPage-W6hncyNY.js +0 -322
  631. package/dist/_chunks/EditPage-W6hncyNY.js.map +0 -1
  632. package/dist/_chunks/EditPage-_N_lm93z.js +0 -348
  633. package/dist/_chunks/EditPage-_N_lm93z.js.map +0 -1
  634. package/dist/_chunks/EditPage-mU2WAH0F.js +0 -280
  635. package/dist/_chunks/EditPage-mU2WAH0F.js.map +0 -1
  636. package/dist/_chunks/EditView-0lXpbgG0.mjs +0 -339
  637. package/dist/_chunks/EditView-0lXpbgG0.mjs.map +0 -1
  638. package/dist/_chunks/EditView-wDP9PNQY.js +0 -359
  639. package/dist/_chunks/EditView-wDP9PNQY.js.map +0 -1
  640. package/dist/_chunks/EditViewPage-0Pd8zBi7.js +0 -865
  641. package/dist/_chunks/EditViewPage-0Pd8zBi7.js.map +0 -1
  642. package/dist/_chunks/EditViewPage-R6diW-gL.mjs +0 -197
  643. package/dist/_chunks/EditViewPage-R6diW-gL.mjs.map +0 -1
  644. package/dist/_chunks/EditViewPage-ed0-10GO.js +0 -218
  645. package/dist/_chunks/EditViewPage-ed0-10GO.js.map +0 -1
  646. package/dist/_chunks/EditViewPage-uWYR_o8w.mjs +0 -838
  647. package/dist/_chunks/EditViewPage-uWYR_o8w.mjs.map +0 -1
  648. package/dist/_chunks/EventsTable-CqN6AzV9.mjs +0 -32
  649. package/dist/_chunks/EventsTable-CqN6AzV9.mjs.map +0 -1
  650. package/dist/_chunks/EventsTable-R_AHW6Z4.js +0 -32
  651. package/dist/_chunks/EventsTable-R_AHW6Z4.js.map +0 -1
  652. package/dist/_chunks/FieldTypeIcon-1WDWx0cR.js +0 -49
  653. package/dist/_chunks/FieldTypeIcon-1WDWx0cR.js.map +0 -1
  654. package/dist/_chunks/FieldTypeIcon-rAK1gg9p.mjs +0 -50
  655. package/dist/_chunks/FieldTypeIcon-rAK1gg9p.mjs.map +0 -1
  656. package/dist/_chunks/Filters-f6ghLf0Z.js +0 -505
  657. package/dist/_chunks/Filters-f6ghLf0Z.js.map +0 -1
  658. package/dist/_chunks/Filters-rPaxqj4F.mjs +0 -487
  659. package/dist/_chunks/Filters-rPaxqj4F.mjs.map +0 -1
  660. package/dist/_chunks/Form-QOZA9Aq6.mjs +0 -737
  661. package/dist/_chunks/Form-QOZA9Aq6.mjs.map +0 -1
  662. package/dist/_chunks/Form-eqzCPjSo.js +0 -759
  663. package/dist/_chunks/Form-eqzCPjSo.js.map +0 -1
  664. package/dist/_chunks/History-Eq4_WQPf.mjs +0 -428
  665. package/dist/_chunks/History-Eq4_WQPf.mjs.map +0 -1
  666. package/dist/_chunks/History-j00hpmXV.js +0 -447
  667. package/dist/_chunks/History-j00hpmXV.js.map +0 -1
  668. package/dist/_chunks/HomePage-3IVOMrYf.js +0 -520
  669. package/dist/_chunks/HomePage-3IVOMrYf.js.map +0 -1
  670. package/dist/_chunks/HomePage-79fqDlve.js +0 -11
  671. package/dist/_chunks/HomePage-79fqDlve.js.map +0 -1
  672. package/dist/_chunks/HomePage-O-TRGX5T.mjs +0 -518
  673. package/dist/_chunks/HomePage-O-TRGX5T.mjs.map +0 -1
  674. package/dist/_chunks/HomePage-gTElgmEK.mjs +0 -11
  675. package/dist/_chunks/HomePage-gTElgmEK.mjs.map +0 -1
  676. package/dist/_chunks/InputRenderer-AVDw8MeU.js +0 -5274
  677. package/dist/_chunks/InputRenderer-AVDw8MeU.js.map +0 -1
  678. package/dist/_chunks/InputRenderer-bJwYq9ga.mjs +0 -5241
  679. package/dist/_chunks/InputRenderer-bJwYq9ga.mjs.map +0 -1
  680. package/dist/_chunks/InstalledPluginsPage-FkR2xkQz.js +0 -123
  681. package/dist/_chunks/InstalledPluginsPage-FkR2xkQz.js.map +0 -1
  682. package/dist/_chunks/InstalledPluginsPage-R2hVFPZl.mjs +0 -104
  683. package/dist/_chunks/InstalledPluginsPage-R2hVFPZl.mjs.map +0 -1
  684. package/dist/_chunks/Layout-G49-Vc5u.js +0 -219
  685. package/dist/_chunks/Layout-G49-Vc5u.js.map +0 -1
  686. package/dist/_chunks/Layout-cV6Se3U9.mjs +0 -197
  687. package/dist/_chunks/Layout-cV6Se3U9.mjs.map +0 -1
  688. package/dist/_chunks/Layout-jweb3cF3.js +0 -90
  689. package/dist/_chunks/Layout-jweb3cF3.js.map +0 -1
  690. package/dist/_chunks/Layout-omCNy92r.mjs +0 -89
  691. package/dist/_chunks/Layout-omCNy92r.mjs.map +0 -1
  692. package/dist/_chunks/ListConfigurationPage-70qtv4Ci.js +0 -667
  693. package/dist/_chunks/ListConfigurationPage-70qtv4Ci.js.map +0 -1
  694. package/dist/_chunks/ListConfigurationPage-PrJNO_6y.mjs +0 -646
  695. package/dist/_chunks/ListConfigurationPage-PrJNO_6y.mjs.map +0 -1
  696. package/dist/_chunks/ListPage-2lswUYQN.js +0 -561
  697. package/dist/_chunks/ListPage-2lswUYQN.js.map +0 -1
  698. package/dist/_chunks/ListPage-78Cv8Vfq.js +0 -507
  699. package/dist/_chunks/ListPage-78Cv8Vfq.js.map +0 -1
  700. package/dist/_chunks/ListPage-7dZ3nYvc.js +0 -299
  701. package/dist/_chunks/ListPage-7dZ3nYvc.js.map +0 -1
  702. package/dist/_chunks/ListPage-Cvn3WbMH.mjs +0 -340
  703. package/dist/_chunks/ListPage-Cvn3WbMH.mjs.map +0 -1
  704. package/dist/_chunks/ListPage-Ms6egnF5.js +0 -11
  705. package/dist/_chunks/ListPage-Ms6egnF5.js.map +0 -1
  706. package/dist/_chunks/ListPage-NmUS_cOz.mjs +0 -292
  707. package/dist/_chunks/ListPage-NmUS_cOz.mjs.map +0 -1
  708. package/dist/_chunks/ListPage-Pf5LxUYn.js +0 -313
  709. package/dist/_chunks/ListPage-Pf5LxUYn.js.map +0 -1
  710. package/dist/_chunks/ListPage-Q81SX0vA.mjs +0 -11
  711. package/dist/_chunks/ListPage-Q81SX0vA.mjs.map +0 -1
  712. package/dist/_chunks/ListPage-edro79m2.mjs +0 -486
  713. package/dist/_chunks/ListPage-edro79m2.mjs.map +0 -1
  714. package/dist/_chunks/ListPage-mAUCZIg8.mjs +0 -279
  715. package/dist/_chunks/ListPage-mAUCZIg8.mjs.map +0 -1
  716. package/dist/_chunks/ListPage-xFkcmM1b.mjs +0 -540
  717. package/dist/_chunks/ListPage-xFkcmM1b.mjs.map +0 -1
  718. package/dist/_chunks/ListPage-yymh17qi.js +0 -359
  719. package/dist/_chunks/ListPage-yymh17qi.js.map +0 -1
  720. package/dist/_chunks/ListView--43zLiHW.mjs +0 -205
  721. package/dist/_chunks/ListView--43zLiHW.mjs.map +0 -1
  722. package/dist/_chunks/ListView-YtMAQnXL.js +0 -225
  723. package/dist/_chunks/ListView-YtMAQnXL.js.map +0 -1
  724. package/dist/_chunks/ListView-nfA6o3qO.js +0 -235
  725. package/dist/_chunks/ListView-nfA6o3qO.js.map +0 -1
  726. package/dist/_chunks/ListView-qPiKeCxj.mjs +0 -215
  727. package/dist/_chunks/ListView-qPiKeCxj.mjs.map +0 -1
  728. package/dist/_chunks/ListViewPage-Ys7-G2XX.js +0 -965
  729. package/dist/_chunks/ListViewPage-Ys7-G2XX.js.map +0 -1
  730. package/dist/_chunks/ListViewPage-fPFonK_X.mjs +0 -941
  731. package/dist/_chunks/ListViewPage-fPFonK_X.mjs.map +0 -1
  732. package/dist/_chunks/Login-6kXI90Vy.mjs +0 -30
  733. package/dist/_chunks/Login-6kXI90Vy.mjs.map +0 -1
  734. package/dist/_chunks/Login-Ge3DZEpr.js +0 -32
  735. package/dist/_chunks/Login-Ge3DZEpr.js.map +0 -1
  736. package/dist/_chunks/MagicLinkEE-HXWaLr0K.mjs +0 -27
  737. package/dist/_chunks/MagicLinkEE-HXWaLr0K.mjs.map +0 -1
  738. package/dist/_chunks/MagicLinkEE-sXtA2gUK.js +0 -27
  739. package/dist/_chunks/MagicLinkEE-sXtA2gUK.js.map +0 -1
  740. package/dist/_chunks/MarketplacePage-hVOJ9_0k.mjs +0 -1003
  741. package/dist/_chunks/MarketplacePage-hVOJ9_0k.mjs.map +0 -1
  742. package/dist/_chunks/MarketplacePage-s8KDwNwK.js +0 -1027
  743. package/dist/_chunks/MarketplacePage-s8KDwNwK.js.map +0 -1
  744. package/dist/_chunks/ModalForm-K_BmPh4N.js +0 -25
  745. package/dist/_chunks/ModalForm-K_BmPh4N.js.map +0 -1
  746. package/dist/_chunks/ModalForm-ULuD5ODP.mjs +0 -25
  747. package/dist/_chunks/ModalForm-ULuD5ODP.mjs.map +0 -1
  748. package/dist/_chunks/NoContentTypePage-7YEcgsE3.js +0 -52
  749. package/dist/_chunks/NoContentTypePage-7YEcgsE3.js.map +0 -1
  750. package/dist/_chunks/NoContentTypePage-szvJnQKF.mjs +0 -52
  751. package/dist/_chunks/NoContentTypePage-szvJnQKF.mjs.map +0 -1
  752. package/dist/_chunks/NoPermissionsPage-UX-5msLb.js +0 -25
  753. package/dist/_chunks/NoPermissionsPage-UX-5msLb.js.map +0 -1
  754. package/dist/_chunks/NoPermissionsPage-pqQFFlXa.mjs +0 -25
  755. package/dist/_chunks/NoPermissionsPage-pqQFFlXa.mjs.map +0 -1
  756. package/dist/_chunks/NotAllowed-MohR5HGD.mjs +0 -36
  757. package/dist/_chunks/NotAllowed-MohR5HGD.mjs.map +0 -1
  758. package/dist/_chunks/NotAllowed-NhYUk6La.js +0 -37
  759. package/dist/_chunks/NotAllowed-NhYUk6La.js.map +0 -1
  760. package/dist/_chunks/Ornaments-Aq2xidN_.mjs +0 -211
  761. package/dist/_chunks/Ornaments-Aq2xidN_.mjs.map +0 -1
  762. package/dist/_chunks/Ornaments-_AXIwJ-m.js +0 -210
  763. package/dist/_chunks/Ornaments-_AXIwJ-m.js.map +0 -1
  764. package/dist/_chunks/Permissions-NUaDxULo.mjs +0 -2023
  765. package/dist/_chunks/Permissions-NUaDxULo.mjs.map +0 -1
  766. package/dist/_chunks/Permissions-a0IZJ8dM.js +0 -2055
  767. package/dist/_chunks/Permissions-a0IZJ8dM.js.map +0 -1
  768. package/dist/_chunks/PrivateRoute-KGxyTa5b.js +0 -19
  769. package/dist/_chunks/PrivateRoute-KGxyTa5b.js.map +0 -1
  770. package/dist/_chunks/PrivateRoute-eP4-pBby.mjs +0 -20
  771. package/dist/_chunks/PrivateRoute-eP4-pBby.mjs.map +0 -1
  772. package/dist/_chunks/ProfilePage-LXB-_EZ8.mjs +0 -392
  773. package/dist/_chunks/ProfilePage-LXB-_EZ8.mjs.map +0 -1
  774. package/dist/_chunks/ProfilePage-MBCGqbc_.js +0 -414
  775. package/dist/_chunks/ProfilePage-MBCGqbc_.js.map +0 -1
  776. package/dist/_chunks/PurchaseAuditLogs--hjsKHHW.js +0 -48
  777. package/dist/_chunks/PurchaseAuditLogs--hjsKHHW.js.map +0 -1
  778. package/dist/_chunks/PurchaseAuditLogs-zQio54Q3.mjs +0 -48
  779. package/dist/_chunks/PurchaseAuditLogs-zQio54Q3.mjs.map +0 -1
  780. package/dist/_chunks/PurchaseReviewWorkflows-P-FACd5s.js +0 -51
  781. package/dist/_chunks/PurchaseReviewWorkflows-P-FACd5s.js.map +0 -1
  782. package/dist/_chunks/PurchaseReviewWorkflows-zGnRRqrC.mjs +0 -51
  783. package/dist/_chunks/PurchaseReviewWorkflows-zGnRRqrC.mjs.map +0 -1
  784. package/dist/_chunks/PurchaseSingleSignOn-BQ5PU-6E.mjs +0 -51
  785. package/dist/_chunks/PurchaseSingleSignOn-BQ5PU-6E.mjs.map +0 -1
  786. package/dist/_chunks/PurchaseSingleSignOn-m2pnP9Ou.js +0 -51
  787. package/dist/_chunks/PurchaseSingleSignOn-m2pnP9Ou.js.map +0 -1
  788. package/dist/_chunks/ReviewWorkflowsColumn-Ancp7-x3.js +0 -33
  789. package/dist/_chunks/ReviewWorkflowsColumn-Ancp7-x3.js.map +0 -1
  790. package/dist/_chunks/ReviewWorkflowsColumn-WzYpj2O3.mjs +0 -33
  791. package/dist/_chunks/ReviewWorkflowsColumn-WzYpj2O3.mjs.map +0 -1
  792. package/dist/_chunks/SSOProviders-GvoeZh35.mjs +0 -58
  793. package/dist/_chunks/SSOProviders-GvoeZh35.mjs.map +0 -1
  794. package/dist/_chunks/SSOProviders-Z6IAEre2.js +0 -59
  795. package/dist/_chunks/SSOProviders-Z6IAEre2.js.map +0 -1
  796. package/dist/_chunks/SelectRoles-Dxz_rAaT.mjs +0 -103
  797. package/dist/_chunks/SelectRoles-Dxz_rAaT.mjs.map +0 -1
  798. package/dist/_chunks/SelectRoles-Pr2wqehq.js +0 -104
  799. package/dist/_chunks/SelectRoles-Pr2wqehq.js.map +0 -1
  800. package/dist/_chunks/SingleSignOnPage-4dK4id8H.js +0 -260
  801. package/dist/_chunks/SingleSignOnPage-4dK4id8H.js.map +0 -1
  802. package/dist/_chunks/SingleSignOnPage-gxgIeURz.mjs +0 -241
  803. package/dist/_chunks/SingleSignOnPage-gxgIeURz.mjs.map +0 -1
  804. package/dist/_chunks/Table-NiTkS4IC.mjs +0 -164
  805. package/dist/_chunks/Table-NiTkS4IC.mjs.map +0 -1
  806. package/dist/_chunks/Table-_9gVkGGi.js +0 -184
  807. package/dist/_chunks/Table-_9gVkGGi.js.map +0 -1
  808. package/dist/_chunks/TokenTypeSelect-3aWUm1cW.js +0 -373
  809. package/dist/_chunks/TokenTypeSelect-3aWUm1cW.js.map +0 -1
  810. package/dist/_chunks/TokenTypeSelect-jtfCyMMZ.mjs +0 -354
  811. package/dist/_chunks/TokenTypeSelect-jtfCyMMZ.mjs.map +0 -1
  812. package/dist/_chunks/UseCasePage-0qXYZ8kt.mjs +0 -148
  813. package/dist/_chunks/UseCasePage-0qXYZ8kt.mjs.map +0 -1
  814. package/dist/_chunks/UseCasePage-QK-B8FfM.js +0 -169
  815. package/dist/_chunks/UseCasePage-QK-B8FfM.js.map +0 -1
  816. package/dist/_chunks/apiTokens-DO6vkoyd.mjs +0 -60
  817. package/dist/_chunks/apiTokens-DO6vkoyd.mjs.map +0 -1
  818. package/dist/_chunks/apiTokens-TayNdk_V.js +0 -59
  819. package/dist/_chunks/apiTokens-TayNdk_V.js.map +0 -1
  820. package/dist/_chunks/ar-QC-k5ddo.js +0 -936
  821. package/dist/_chunks/ar-QC-k5ddo.js.map +0 -1
  822. package/dist/_chunks/ar-Z3BD7TXr.mjs +0 -936
  823. package/dist/_chunks/ar-Z3BD7TXr.mjs.map +0 -1
  824. package/dist/_chunks/ca-aXWlXG9g.mjs +0 -724
  825. package/dist/_chunks/ca-aXWlXG9g.mjs.map +0 -1
  826. package/dist/_chunks/ca-pKSR4Q9q.js +0 -724
  827. package/dist/_chunks/ca-pKSR4Q9q.js.map +0 -1
  828. package/dist/_chunks/constants-FEW7x2Od.mjs +0 -50
  829. package/dist/_chunks/constants-FEW7x2Od.mjs.map +0 -1
  830. package/dist/_chunks/constants-RMqZXSqh.js +0 -6
  831. package/dist/_chunks/constants-RMqZXSqh.js.map +0 -1
  832. package/dist/_chunks/constants-RZp8o_c4.js +0 -52
  833. package/dist/_chunks/constants-RZp8o_c4.js.map +0 -1
  834. package/dist/_chunks/constants-WbeIIlk3.js +0 -11
  835. package/dist/_chunks/constants-WbeIIlk3.js.map +0 -1
  836. package/dist/_chunks/constants-Xd-X3SCR.js +0 -188
  837. package/dist/_chunks/constants-Xd-X3SCR.js.map +0 -1
  838. package/dist/_chunks/constants-_8pVvG0H.mjs +0 -11
  839. package/dist/_chunks/constants-_8pVvG0H.mjs.map +0 -1
  840. package/dist/_chunks/constants-_T5uxsuv.mjs +0 -169
  841. package/dist/_chunks/constants-_T5uxsuv.mjs.map +0 -1
  842. package/dist/_chunks/constants-fJt30IoY.mjs +0 -7
  843. package/dist/_chunks/constants-fJt30IoY.mjs.map +0 -1
  844. package/dist/_chunks/cs-6sDi2LJs.js +0 -291
  845. package/dist/_chunks/cs-6sDi2LJs.js.map +0 -1
  846. package/dist/_chunks/cs-zUoPZI4s.mjs +0 -291
  847. package/dist/_chunks/cs-zUoPZI4s.mjs.map +0 -1
  848. package/dist/_chunks/de-MMN7NdI0.js +0 -716
  849. package/dist/_chunks/de-MMN7NdI0.js.map +0 -1
  850. package/dist/_chunks/de-ek6cDDK8.mjs +0 -716
  851. package/dist/_chunks/de-ek6cDDK8.mjs.map +0 -1
  852. package/dist/_chunks/dk-BdUx8cFW.js +0 -634
  853. package/dist/_chunks/dk-BdUx8cFW.js.map +0 -1
  854. package/dist/_chunks/dk-opXY5SME.mjs +0 -634
  855. package/dist/_chunks/dk-opXY5SME.mjs.map +0 -1
  856. package/dist/_chunks/en-9q9Qw4Vl.js +0 -1065
  857. package/dist/_chunks/en-9q9Qw4Vl.js.map +0 -1
  858. package/dist/_chunks/en-YVPg1Mvo.mjs +0 -1065
  859. package/dist/_chunks/en-YVPg1Mvo.mjs.map +0 -1
  860. package/dist/_chunks/es-9imfnBIU.js +0 -796
  861. package/dist/_chunks/es-9imfnBIU.js.map +0 -1
  862. package/dist/_chunks/es-qWS0DuB6.mjs +0 -796
  863. package/dist/_chunks/es-qWS0DuB6.mjs.map +0 -1
  864. package/dist/_chunks/eu-LBdMNPpr.mjs +0 -832
  865. package/dist/_chunks/eu-LBdMNPpr.mjs.map +0 -1
  866. package/dist/_chunks/eu-aAvfsPGu.js +0 -832
  867. package/dist/_chunks/eu-aAvfsPGu.js.map +0 -1
  868. package/dist/_chunks/fr-KXfw9S0F.js +0 -762
  869. package/dist/_chunks/fr-KXfw9S0F.js.map +0 -1
  870. package/dist/_chunks/fr-jPBjKfV_.mjs +0 -762
  871. package/dist/_chunks/fr-jPBjKfV_.mjs.map +0 -1
  872. package/dist/_chunks/gu-Y0z1LfFv.js +0 -623
  873. package/dist/_chunks/gu-Y0z1LfFv.js.map +0 -1
  874. package/dist/_chunks/gu-bURNBu5c.mjs +0 -623
  875. package/dist/_chunks/gu-bURNBu5c.mjs.map +0 -1
  876. package/dist/_chunks/he-RmtdSWtw.js +0 -326
  877. package/dist/_chunks/he-RmtdSWtw.js.map +0 -1
  878. package/dist/_chunks/he-SUOZnrPI.mjs +0 -326
  879. package/dist/_chunks/he-SUOZnrPI.mjs.map +0 -1
  880. package/dist/_chunks/hi-MbNfZZA_.js +0 -722
  881. package/dist/_chunks/hi-MbNfZZA_.js.map +0 -1
  882. package/dist/_chunks/hi-s7B600dI.mjs +0 -722
  883. package/dist/_chunks/hi-s7B600dI.mjs.map +0 -1
  884. package/dist/_chunks/hu-HZwWiL3b.mjs +0 -832
  885. package/dist/_chunks/hu-HZwWiL3b.mjs.map +0 -1
  886. package/dist/_chunks/hu-QV5uhOW9.js +0 -832
  887. package/dist/_chunks/hu-QV5uhOW9.js.map +0 -1
  888. package/dist/_chunks/id-bByqKITV.mjs +0 -448
  889. package/dist/_chunks/id-bByqKITV.mjs.map +0 -1
  890. package/dist/_chunks/id-kFCOSN99.js +0 -448
  891. package/dist/_chunks/id-kFCOSN99.js.map +0 -1
  892. package/dist/_chunks/index-ejSDPT-T.js +0 -10831
  893. package/dist/_chunks/index-ejSDPT-T.js.map +0 -1
  894. package/dist/_chunks/index-hjUhNUvw.mjs +0 -10795
  895. package/dist/_chunks/index-hjUhNUvw.mjs.map +0 -1
  896. package/dist/_chunks/it-7xUr74VQ.mjs +0 -459
  897. package/dist/_chunks/it-7xUr74VQ.mjs.map +0 -1
  898. package/dist/_chunks/it-XZ_jYkVh.js +0 -459
  899. package/dist/_chunks/it-XZ_jYkVh.js.map +0 -1
  900. package/dist/_chunks/ja-Thwj6BLp.js +0 -633
  901. package/dist/_chunks/ja-Thwj6BLp.js.map +0 -1
  902. package/dist/_chunks/ja-uYLwB0aQ.mjs +0 -633
  903. package/dist/_chunks/ja-uYLwB0aQ.mjs.map +0 -1
  904. package/dist/_chunks/ko-_jJKWFgE.js +0 -631
  905. package/dist/_chunks/ko-_jJKWFgE.js.map +0 -1
  906. package/dist/_chunks/ko-s0EMd2R_.mjs +0 -631
  907. package/dist/_chunks/ko-s0EMd2R_.mjs.map +0 -1
  908. package/dist/_chunks/ml-J8WVOGJw.mjs +0 -722
  909. package/dist/_chunks/ml-J8WVOGJw.mjs.map +0 -1
  910. package/dist/_chunks/ml-dV8cEwE9.js +0 -722
  911. package/dist/_chunks/ml-dV8cEwE9.js.map +0 -1
  912. package/dist/_chunks/ms--jlrw42b.js +0 -342
  913. package/dist/_chunks/ms--jlrw42b.js.map +0 -1
  914. package/dist/_chunks/ms-HMf2TlIb.mjs +0 -342
  915. package/dist/_chunks/ms-HMf2TlIb.mjs.map +0 -1
  916. package/dist/_chunks/nl-dZtP9mID.js +0 -828
  917. package/dist/_chunks/nl-dZtP9mID.js.map +0 -1
  918. package/dist/_chunks/nl-r6_qFslC.mjs +0 -828
  919. package/dist/_chunks/nl-r6_qFslC.mjs.map +0 -1
  920. package/dist/_chunks/no-9cS1N6hE.mjs +0 -310
  921. package/dist/_chunks/no-9cS1N6hE.mjs.map +0 -1
  922. package/dist/_chunks/no-l_d9yAQN.js +0 -310
  923. package/dist/_chunks/no-l_d9yAQN.js.map +0 -1
  924. package/dist/_chunks/pl-SIHRdWWc.js +0 -721
  925. package/dist/_chunks/pl-SIHRdWWc.js.map +0 -1
  926. package/dist/_chunks/pl-clhbpDNh.mjs +0 -721
  927. package/dist/_chunks/pl-clhbpDNh.mjs.map +0 -1
  928. package/dist/_chunks/pt-BR-hWKoFXkw.js +0 -794
  929. package/dist/_chunks/pt-BR-hWKoFXkw.js.map +0 -1
  930. package/dist/_chunks/pt-BR-punxoRa2.mjs +0 -794
  931. package/dist/_chunks/pt-BR-punxoRa2.mjs.map +0 -1
  932. package/dist/_chunks/pt-Cf1BVWpH.mjs +0 -296
  933. package/dist/_chunks/pt-Cf1BVWpH.mjs.map +0 -1
  934. package/dist/_chunks/pt-_KgwbYMU.js +0 -296
  935. package/dist/_chunks/pt-_KgwbYMU.js.map +0 -1
  936. package/dist/_chunks/ru-6Tk_GR-j.mjs +0 -993
  937. package/dist/_chunks/ru-6Tk_GR-j.mjs.map +0 -1
  938. package/dist/_chunks/ru-UwdNMjzX.js +0 -993
  939. package/dist/_chunks/ru-UwdNMjzX.js.map +0 -1
  940. package/dist/_chunks/sa--IWI9QIC.mjs +0 -722
  941. package/dist/_chunks/sa--IWI9QIC.mjs.map +0 -1
  942. package/dist/_chunks/sa-EHIMiiE5.js +0 -722
  943. package/dist/_chunks/sa-EHIMiiE5.js.map +0 -1
  944. package/dist/_chunks/selectors-T2YIN4Fb.js +0 -5
  945. package/dist/_chunks/selectors-T2YIN4Fb.js.map +0 -1
  946. package/dist/_chunks/selectors-uLWxH-jN.mjs +0 -6
  947. package/dist/_chunks/selectors-uLWxH-jN.mjs.map +0 -1
  948. package/dist/_chunks/sk-O6d4eSB_.mjs +0 -690
  949. package/dist/_chunks/sk-O6d4eSB_.mjs.map +0 -1
  950. package/dist/_chunks/sk-mQumWjau.js +0 -690
  951. package/dist/_chunks/sk-mQumWjau.js.map +0 -1
  952. package/dist/_chunks/sv-20Po9yTX.mjs +0 -827
  953. package/dist/_chunks/sv-20Po9yTX.mjs.map +0 -1
  954. package/dist/_chunks/sv-9DHr5qSx.js +0 -827
  955. package/dist/_chunks/sv-9DHr5qSx.js.map +0 -1
  956. package/dist/_chunks/th-D3uMSMTb.mjs +0 -430
  957. package/dist/_chunks/th-D3uMSMTb.mjs.map +0 -1
  958. package/dist/_chunks/th-R7ewxEfd.js +0 -430
  959. package/dist/_chunks/th-R7ewxEfd.js.map +0 -1
  960. package/dist/_chunks/tr-3lPrmNK_.js +0 -785
  961. package/dist/_chunks/tr-3lPrmNK_.js.map +0 -1
  962. package/dist/_chunks/tr-yKDN9Q8W.mjs +0 -785
  963. package/dist/_chunks/tr-yKDN9Q8W.mjs.map +0 -1
  964. package/dist/_chunks/transferTokens-T-kGMb3U.js +0 -62
  965. package/dist/_chunks/transferTokens-T-kGMb3U.js.map +0 -1
  966. package/dist/_chunks/transferTokens-jdkk-sPx.mjs +0 -63
  967. package/dist/_chunks/transferTokens-jdkk-sPx.mjs.map +0 -1
  968. package/dist/_chunks/uk-jXdJMxUf.mjs +0 -343
  969. package/dist/_chunks/uk-jXdJMxUf.mjs.map +0 -1
  970. package/dist/_chunks/uk-w5sI8yln.js +0 -343
  971. package/dist/_chunks/uk-w5sI8yln.js.map +0 -1
  972. package/dist/_chunks/useAdminRoles-QJQS1BCd.mjs +0 -28
  973. package/dist/_chunks/useAdminRoles-QJQS1BCd.mjs.map +0 -1
  974. package/dist/_chunks/useAdminRoles-SnzC_mvy.js +0 -46
  975. package/dist/_chunks/useAdminRoles-SnzC_mvy.js.map +0 -1
  976. package/dist/_chunks/useContentTypes-Lpg-eJmK.js +0 -69
  977. package/dist/_chunks/useContentTypes-Lpg-eJmK.js.map +0 -1
  978. package/dist/_chunks/useContentTypes-U-n1-lz0.mjs +0 -51
  979. package/dist/_chunks/useContentTypes-U-n1-lz0.mjs.map +0 -1
  980. package/dist/_chunks/useDebounce-GrNR3exx.mjs +0 -17
  981. package/dist/_chunks/useDebounce-GrNR3exx.mjs.map +0 -1
  982. package/dist/_chunks/useDebounce-nLQfrFAo.js +0 -35
  983. package/dist/_chunks/useDebounce-nLQfrFAo.js.map +0 -1
  984. package/dist/_chunks/useLicenseLimitNotification-Hjv_LKmp.js +0 -100
  985. package/dist/_chunks/useLicenseLimitNotification-Hjv_LKmp.js.map +0 -1
  986. package/dist/_chunks/useLicenseLimitNotification-yJHxF4YO.mjs +0 -80
  987. package/dist/_chunks/useLicenseLimitNotification-yJHxF4YO.mjs.map +0 -1
  988. package/dist/_chunks/useOnce-BuAUYuau.mjs +0 -7
  989. package/dist/_chunks/useOnce-BuAUYuau.mjs.map +0 -1
  990. package/dist/_chunks/useOnce-eIxJr0o-.js +0 -25
  991. package/dist/_chunks/useOnce-eIxJr0o-.js.map +0 -1
  992. package/dist/_chunks/useReviewWorkflows-0rQx2KxS.mjs +0 -27
  993. package/dist/_chunks/useReviewWorkflows-0rQx2KxS.mjs.map +0 -1
  994. package/dist/_chunks/useReviewWorkflows-QoSEilRp.js +0 -26
  995. package/dist/_chunks/useReviewWorkflows-QoSEilRp.js.map +0 -1
  996. package/dist/_chunks/useSyncRbac-hZJWbmmY.js +0 -57
  997. package/dist/_chunks/useSyncRbac-hZJWbmmY.js.map +0 -1
  998. package/dist/_chunks/useSyncRbac-wVgN6XIc.mjs +0 -39
  999. package/dist/_chunks/useSyncRbac-wVgN6XIc.mjs.map +0 -1
  1000. package/dist/_chunks/useWebhooks-1ZG0V0Mc.js +0 -89
  1001. package/dist/_chunks/useWebhooks-1ZG0V0Mc.js.map +0 -1
  1002. package/dist/_chunks/useWebhooks-WBwti5Jl.mjs +0 -90
  1003. package/dist/_chunks/useWebhooks-WBwti5Jl.mjs.map +0 -1
  1004. package/dist/_chunks/validateWorkflow-23kb45Oa.mjs +0 -1042
  1005. package/dist/_chunks/validateWorkflow-23kb45Oa.mjs.map +0 -1
  1006. package/dist/_chunks/validateWorkflow-MaEpFiHz.js +0 -1065
  1007. package/dist/_chunks/validateWorkflow-MaEpFiHz.js.map +0 -1
  1008. package/dist/_chunks/validation-7cD0kJHF.js +0 -61
  1009. package/dist/_chunks/validation-7cD0kJHF.js.map +0 -1
  1010. package/dist/_chunks/validation-rilbXPnt.mjs +0 -43
  1011. package/dist/_chunks/validation-rilbXPnt.mjs.map +0 -1
  1012. package/dist/_chunks/vi-kY-om6ai.mjs +0 -298
  1013. package/dist/_chunks/vi-kY-om6ai.mjs.map +0 -1
  1014. package/dist/_chunks/vi-t8uM5szE.js +0 -298
  1015. package/dist/_chunks/vi-t8uM5szE.js.map +0 -1
  1016. package/dist/_chunks/zh-Hans-RfPwVDfv.js +0 -957
  1017. package/dist/_chunks/zh-Hans-RfPwVDfv.js.map +0 -1
  1018. package/dist/_chunks/zh-Hans-xf4WJxoN.mjs +0 -957
  1019. package/dist/_chunks/zh-Hans-xf4WJxoN.mjs.map +0 -1
  1020. package/dist/_chunks/zh-NcXD6EU3.js +0 -836
  1021. package/dist/_chunks/zh-NcXD6EU3.js.map +0 -1
  1022. package/dist/_chunks/zh-fRA5e8rP.mjs +0 -836
  1023. package/dist/_chunks/zh-fRA5e8rP.mjs.map +0 -1
  1024. package/dist/admin/src/components/RBACProvider.d.ts +0 -27
  1025. package/dist/admin/src/types/errors.d.ts +0 -2
@@ -0,0 +1,4762 @@
1
+ 'use strict';
2
+
3
+ const jsxRuntime = require('react/jsx-runtime');
4
+ const React = require('react');
5
+ const reactContext = require('@radix-ui/react-context');
6
+ const reactIntl = require('react-intl');
7
+ const isEqual = require('lodash/isEqual');
8
+ const axios = require('axios');
9
+ const defaultsDeep = require('lodash/defaultsDeep');
10
+ const designSystem = require('@strapi/design-system');
11
+ const reactRedux = require('react-redux');
12
+ const styled = require('styled-components');
13
+ const immer = require('immer');
14
+ const reactHelmet = require('react-helmet');
15
+ const reactRouterDom = require('react-router-dom');
16
+ const reactDnd = require('react-dnd');
17
+ const get = require('lodash/get');
18
+ const set = require('lodash/set');
19
+ const ContextSelector = require('use-context-selector');
20
+ const Icons = require('@strapi/icons');
21
+ const toolkit = require('@reduxjs/toolkit');
22
+ const react = require('@reduxjs/toolkit/query/react');
23
+ const qs = require('qs');
24
+ const v2 = require('@strapi/design-system/v2');
25
+ const fractionalIndexing = require('fractional-indexing');
26
+ const pipe = require('lodash/fp/pipe');
27
+ const reactDndHtml5Backend = require('react-dnd-html5-backend');
28
+ const reactWindow = require('react-window');
29
+ const clone = require('lodash/clone');
30
+ const toPath = require('lodash/toPath');
31
+ const yup = require('yup');
32
+
33
+ const _interopDefault = e => e && e.__esModule ? e : { default: e };
34
+
35
+ function _interopNamespace(e) {
36
+ if (e && e.__esModule) return e;
37
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } });
38
+ if (e) {
39
+ for (const k in e) {
40
+ if (k !== 'default') {
41
+ const d = Object.getOwnPropertyDescriptor(e, k);
42
+ Object.defineProperty(n, k, d.get ? d : {
43
+ enumerable: true,
44
+ get: () => e[k]
45
+ });
46
+ }
47
+ }
48
+ }
49
+ n.default = e;
50
+ return Object.freeze(n);
51
+ }
52
+
53
+ const React__namespace = /*#__PURE__*/_interopNamespace(React);
54
+ const isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
55
+ const axios__default = /*#__PURE__*/_interopDefault(axios);
56
+ const defaultsDeep__default = /*#__PURE__*/_interopDefault(defaultsDeep);
57
+ const styled__default = /*#__PURE__*/_interopDefault(styled);
58
+ const get__default = /*#__PURE__*/_interopDefault(get);
59
+ const set__default = /*#__PURE__*/_interopDefault(set);
60
+ const ContextSelector__namespace = /*#__PURE__*/_interopNamespace(ContextSelector);
61
+ const qs__default = /*#__PURE__*/_interopDefault(qs);
62
+ const pipe__default = /*#__PURE__*/_interopDefault(pipe);
63
+ const clone__default = /*#__PURE__*/_interopDefault(clone);
64
+ const toPath__default = /*#__PURE__*/_interopDefault(toPath);
65
+ const yup__namespace = /*#__PURE__*/_interopNamespace(yup);
66
+
67
+ function createContext(rootComponentName, defaultContext) {
68
+ const Context = ContextSelector__namespace.createContext(defaultContext);
69
+ const Provider = (props) => {
70
+ const { children, ...context } = props;
71
+ const value = React__namespace.useMemo(() => context, Object.values(context));
72
+ return /* @__PURE__ */ jsxRuntime.jsx(Context.Provider, { value, children });
73
+ };
74
+ const useContext = (consumerName, selector) => ContextSelector__namespace.useContextSelector(Context, (ctx) => {
75
+ if (ctx)
76
+ return selector(ctx);
77
+ throw new Error(`\`${consumerName}\` must be used within \`${rootComponentName}\``);
78
+ });
79
+ Provider.displayName = rootComponentName + "Provider";
80
+ return [Provider, useContext];
81
+ }
82
+
83
+ const useTypedDispatch = reactRedux.useDispatch;
84
+ const useTypedStore = reactRedux.useStore;
85
+ const useTypedSelector = reactRedux.useSelector;
86
+ const createTypedSelector = (selector) => toolkit.createSelector((state) => state, selector);
87
+
88
+ const THEME_LOCAL_STORAGE_KEY = "STRAPI_THEME";
89
+ const LANGUAGE_LOCAL_STORAGE_KEY = "strapi-admin-language";
90
+ const adminSlice = toolkit.createSlice({
91
+ name: "admin",
92
+ initialState: () => {
93
+ return {
94
+ language: {
95
+ locale: "en",
96
+ localeNames: { en: "English" }
97
+ },
98
+ permissions: {},
99
+ theme: {
100
+ availableThemes: [],
101
+ currentTheme: localStorage.getItem(THEME_LOCAL_STORAGE_KEY) || "system"
102
+ }
103
+ };
104
+ },
105
+ reducers: {
106
+ setAppTheme(state, action) {
107
+ state.theme.currentTheme = action.payload;
108
+ window.localStorage.setItem(THEME_LOCAL_STORAGE_KEY, action.payload);
109
+ },
110
+ setAvailableThemes(state, action) {
111
+ state.theme.availableThemes = action.payload;
112
+ },
113
+ setLocale(state, action) {
114
+ state.language.locale = action.payload;
115
+ window.localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, action.payload);
116
+ document.documentElement.setAttribute("lang", action.payload);
117
+ }
118
+ }
119
+ });
120
+ const reducer$5 = adminSlice.reducer;
121
+ const { setAppTheme, setAvailableThemes, setLocale } = adminSlice.actions;
122
+
123
+ const fetchClient = () => {
124
+ const instance2 = axios__default.default.create({
125
+ headers: {
126
+ Accept: "application/json",
127
+ "Content-Type": "application/json"
128
+ },
129
+ paramsSerializer: (params) => {
130
+ return qs__default.default.stringify(params, { encode: false });
131
+ }
132
+ });
133
+ instance2.interceptors.request.use(
134
+ async (config) => {
135
+ config.headers.Authorization = `Bearer ${getToken()}`;
136
+ return config;
137
+ },
138
+ (error) => Promise.reject(error)
139
+ );
140
+ instance2.interceptors.response.use(
141
+ (response) => response,
142
+ (error) => {
143
+ if (error?.response?.status === 401) {
144
+ clearItem(STORAGE_KEYS.TOKEN);
145
+ clearItem(STORAGE_KEYS.USER);
146
+ window.location.reload();
147
+ }
148
+ throw error;
149
+ }
150
+ );
151
+ return instance2;
152
+ };
153
+ const clearItem = (key) => {
154
+ if (window.localStorage.getItem(key)) {
155
+ return window.localStorage.removeItem(key);
156
+ }
157
+ if (window.sessionStorage.getItem(key)) {
158
+ return window.sessionStorage.removeItem(key);
159
+ }
160
+ };
161
+ const getToken = () => JSON.parse(
162
+ localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN) ?? '""'
163
+ );
164
+ const instance = fetchClient();
165
+ const addPrependingSlash = (url) => url.charAt(0) !== "/" ? `/${url}` : url;
166
+ const hasProtocol = (url) => new RegExp("^(?:[a-z+]+:)?//", "i").test(url);
167
+ const normalizeUrl = (url) => hasProtocol(url) ? url : addPrependingSlash(url);
168
+ const getFetchClient = (defaultOptions = {}) => {
169
+ instance.defaults.baseURL = window.strapi.backendURL;
170
+ return {
171
+ get: (url, config) => instance.get(normalizeUrl(url), {
172
+ ...defaultOptions,
173
+ ...config
174
+ }),
175
+ put: (url, data, config) => instance.put(normalizeUrl(url), data, { ...defaultOptions, ...config }),
176
+ post: (url, data, config) => instance.post(normalizeUrl(url), data, { ...defaultOptions, ...config }),
177
+ del: (url, config) => instance.delete(normalizeUrl(url), { ...defaultOptions, ...config })
178
+ };
179
+ };
180
+
181
+ const axiosBaseQuery = () => async (query, { signal }) => {
182
+ try {
183
+ const { get, post, del, put } = getFetchClient();
184
+ if (typeof query === "string") {
185
+ const result = await get(query, { signal });
186
+ return { data: result.data };
187
+ } else {
188
+ const { url, method = "GET", data, config } = query;
189
+ if (method === "POST") {
190
+ const result2 = await post(url, data, { ...config, signal });
191
+ return { data: result2.data };
192
+ }
193
+ if (method === "DELETE") {
194
+ const result2 = await del(url, { ...config, signal });
195
+ return { data: result2.data };
196
+ }
197
+ if (method === "PUT") {
198
+ const result2 = await put(url, data, { ...config, signal });
199
+ return { data: result2.data };
200
+ }
201
+ const result = await get(url, { ...config, signal });
202
+ return { data: result.data };
203
+ }
204
+ } catch (err) {
205
+ if (axios.isAxiosError(err)) {
206
+ if (typeof err.response?.data === "object" && err.response?.data !== null && "error" in err.response?.data) {
207
+ return { data: void 0, error: err.response?.data.error };
208
+ } else {
209
+ return {
210
+ data: void 0,
211
+ error: {
212
+ name: "UnknownError",
213
+ message: "There was an unknown error response from the API",
214
+ details: err.response?.data,
215
+ status: err.response?.status
216
+ }
217
+ };
218
+ }
219
+ }
220
+ const error = err;
221
+ return {
222
+ data: void 0,
223
+ error: {
224
+ name: error.name,
225
+ message: error.message,
226
+ stack: error.stack
227
+ }
228
+ };
229
+ }
230
+ };
231
+ const isBaseQueryError = (error) => {
232
+ return error.name !== void 0;
233
+ };
234
+
235
+ const adminApi = react.createApi({
236
+ reducerPath: "adminApi",
237
+ baseQuery: axiosBaseQuery(),
238
+ tagTypes: [
239
+ "ApiToken",
240
+ "LicenseLimits",
241
+ "Me",
242
+ "ProjectSettings",
243
+ "ProvidersOptions",
244
+ "ReviewWorkflow",
245
+ "ReviewWorkflowStage",
246
+ "Role",
247
+ "RolePermissions",
248
+ "TransferToken",
249
+ "User",
250
+ "Webhook"
251
+ ],
252
+ endpoints: (builder) => ({
253
+ /**
254
+ * This is here because it's shared between the transfer-token routes & the api-tokens.
255
+ */
256
+ regenerateToken: builder.mutation({
257
+ query: (url) => ({
258
+ method: "POST",
259
+ url: `${url}/regenerate`
260
+ }),
261
+ transformResponse: (response) => response.data
262
+ })
263
+ })
264
+ });
265
+ const { useRegenerateTokenMutation } = adminApi;
266
+
267
+ const authService = adminApi.injectEndpoints({
268
+ endpoints: (builder) => ({
269
+ /**
270
+ * ME
271
+ */
272
+ getMe: builder.query({
273
+ query: () => ({
274
+ method: "GET",
275
+ url: "/admin/users/me"
276
+ }),
277
+ transformResponse(res) {
278
+ return res.data;
279
+ },
280
+ providesTags: (res) => res ? ["Me", { type: "User", id: res.id }] : ["Me"]
281
+ }),
282
+ getMyPermissions: builder.query({
283
+ query: () => ({
284
+ method: "GET",
285
+ url: "/admin/users/me/permissions"
286
+ }),
287
+ transformResponse(res) {
288
+ return res.data;
289
+ }
290
+ }),
291
+ updateMe: builder.mutation({
292
+ query: (body) => ({
293
+ method: "PUT",
294
+ url: "/admin/users/me",
295
+ data: body
296
+ }),
297
+ transformResponse(res) {
298
+ return res.data;
299
+ },
300
+ invalidatesTags: ["Me"]
301
+ }),
302
+ /**
303
+ * Permissions
304
+ */
305
+ checkPermissions: builder.query({
306
+ query: (permissions) => ({
307
+ method: "POST",
308
+ url: "/admin/permissions/check",
309
+ data: permissions
310
+ })
311
+ }),
312
+ /**
313
+ * Auth methods
314
+ */
315
+ login: builder.mutation({
316
+ query: (body) => ({
317
+ method: "POST",
318
+ url: "/admin/login",
319
+ data: body
320
+ }),
321
+ transformResponse(res) {
322
+ return res.data;
323
+ },
324
+ invalidatesTags: ["Me"]
325
+ }),
326
+ logout: builder.mutation({
327
+ query: () => ({
328
+ method: "POST",
329
+ url: "/admin/logout"
330
+ })
331
+ }),
332
+ resetPassword: builder.mutation({
333
+ query: (body) => ({
334
+ method: "POST",
335
+ url: "/admin/reset-password",
336
+ data: body
337
+ }),
338
+ transformResponse(res) {
339
+ return res.data;
340
+ }
341
+ }),
342
+ renewToken: builder.mutation({
343
+ query: (body) => ({
344
+ method: "POST",
345
+ url: "/admin/renew-token",
346
+ data: body
347
+ }),
348
+ transformResponse(res) {
349
+ return res.data;
350
+ }
351
+ }),
352
+ getRegistrationInfo: builder.query({
353
+ query: (registrationToken) => ({
354
+ url: "/admin/registration-info",
355
+ method: "GET",
356
+ config: {
357
+ params: {
358
+ registrationToken
359
+ }
360
+ }
361
+ }),
362
+ transformResponse(res) {
363
+ return res.data;
364
+ }
365
+ }),
366
+ registerAdmin: builder.mutation({
367
+ query: (body) => ({
368
+ method: "POST",
369
+ url: "/admin/register-admin",
370
+ data: body
371
+ }),
372
+ transformResponse(res) {
373
+ return res.data;
374
+ }
375
+ }),
376
+ registerUser: builder.mutation({
377
+ query: (body) => ({
378
+ method: "POST",
379
+ url: "/admin/register",
380
+ data: body
381
+ }),
382
+ transformResponse(res) {
383
+ return res.data;
384
+ }
385
+ }),
386
+ forgotPassword: builder.mutation({
387
+ query: (body) => ({
388
+ url: "/admin/forgot-password",
389
+ method: "POST",
390
+ data: body
391
+ })
392
+ }),
393
+ isSSOLocked: builder.query({
394
+ query: () => ({
395
+ url: "/admin/providers/isSSOLocked",
396
+ method: "GET"
397
+ }),
398
+ transformResponse(res) {
399
+ return res.data;
400
+ }
401
+ }),
402
+ getProviders: builder.query({
403
+ query: () => ({
404
+ url: "/admin/providers",
405
+ method: "GET"
406
+ })
407
+ }),
408
+ getProviderOptions: builder.query({
409
+ query: () => ({
410
+ url: "/admin/providers/options",
411
+ method: "GET"
412
+ }),
413
+ transformResponse(res) {
414
+ return res.data;
415
+ },
416
+ providesTags: ["ProvidersOptions"]
417
+ }),
418
+ updateProviderOptions: builder.mutation({
419
+ query: (body) => ({
420
+ url: "/admin/providers/options",
421
+ method: "PUT",
422
+ data: body
423
+ }),
424
+ transformResponse(res) {
425
+ return res.data;
426
+ },
427
+ invalidatesTags: ["ProvidersOptions"]
428
+ })
429
+ }),
430
+ overrideExisting: false
431
+ });
432
+ const {
433
+ useCheckPermissionsQuery,
434
+ useLazyCheckPermissionsQuery,
435
+ useGetMeQuery,
436
+ useLoginMutation,
437
+ useRenewTokenMutation,
438
+ useLogoutMutation,
439
+ useUpdateMeMutation,
440
+ useResetPasswordMutation,
441
+ useRegisterAdminMutation,
442
+ useRegisterUserMutation,
443
+ useGetRegistrationInfoQuery,
444
+ useForgotPasswordMutation,
445
+ useGetMyPermissionsQuery,
446
+ useIsSSOLockedQuery,
447
+ useGetProvidersQuery,
448
+ useGetProviderOptionsQuery,
449
+ useUpdateProviderOptionsMutation
450
+ } = authService;
451
+
452
+ const [Provider, useAuth] = createContext("Auth");
453
+ const STORAGE_KEYS = {
454
+ TOKEN: "jwtToken",
455
+ USER: "userInfo"
456
+ };
457
+ const AuthProvider = ({ children, _defaultPermissions = [] }) => {
458
+ const dispatch = useTypedDispatch();
459
+ const [token, setToken] = React__namespace.useState(() => {
460
+ const token2 = localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN);
461
+ if (typeof token2 === "string") {
462
+ return JSON.parse(token2);
463
+ }
464
+ return null;
465
+ });
466
+ const { data: user } = useGetMeQuery(void 0, {
467
+ /**
468
+ * If there's no token, we don't try to fetch
469
+ * the user data because it will fail.
470
+ */
471
+ skip: !token
472
+ });
473
+ const {
474
+ data: userPermissions = _defaultPermissions,
475
+ refetch,
476
+ isUninitialized
477
+ } = useGetMyPermissionsQuery(void 0, {
478
+ skip: !token
479
+ });
480
+ const navigate = reactRouterDom.useNavigate();
481
+ const [loginMutation] = useLoginMutation();
482
+ const [renewTokenMutation] = useRenewTokenMutation();
483
+ const [logoutMutation] = useLogoutMutation();
484
+ const clearStorage = React__namespace.useCallback(() => {
485
+ localStorage.removeItem(STORAGE_KEYS.TOKEN);
486
+ localStorage.removeItem(STORAGE_KEYS.USER);
487
+ sessionStorage.removeItem(STORAGE_KEYS.TOKEN);
488
+ sessionStorage.removeItem(STORAGE_KEYS.USER);
489
+ setToken(null);
490
+ }, []);
491
+ React__namespace.useEffect(() => {
492
+ const token2 = localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN);
493
+ if (token2) {
494
+ renewTokenMutation({ token: JSON.parse(token2) }).then((res) => {
495
+ if ("data" in res) {
496
+ setToken(res.data.token);
497
+ } else {
498
+ clearStorage();
499
+ navigate("/auth/login");
500
+ }
501
+ });
502
+ }
503
+ }, [renewTokenMutation, clearStorage, navigate]);
504
+ React__namespace.useEffect(() => {
505
+ if (user) {
506
+ if (user.preferedLanguage) {
507
+ dispatch(setLocale(user.preferedLanguage));
508
+ }
509
+ }
510
+ }, [dispatch, user]);
511
+ React__namespace.useEffect(() => {
512
+ if (token) {
513
+ storeToken(token, false);
514
+ }
515
+ }, [token]);
516
+ React__namespace.useEffect(() => {
517
+ const handleUserStorageChange = (event) => {
518
+ if (event.key === STORAGE_KEYS.USER && event.newValue === null) {
519
+ clearStorage();
520
+ navigate("/auth/login");
521
+ }
522
+ };
523
+ window.addEventListener("storage", handleUserStorageChange);
524
+ return () => {
525
+ window.removeEventListener("storage", handleUserStorageChange);
526
+ };
527
+ });
528
+ const login = React__namespace.useCallback(
529
+ async ({ rememberMe, ...body }) => {
530
+ const res = await loginMutation(body);
531
+ if ("data" in res) {
532
+ const { token: token2 } = res.data;
533
+ storeToken(token2, rememberMe);
534
+ setToken(token2);
535
+ }
536
+ return res;
537
+ },
538
+ [loginMutation]
539
+ );
540
+ const logout = React__namespace.useCallback(async () => {
541
+ await logoutMutation();
542
+ clearStorage();
543
+ navigate("/auth/login");
544
+ }, [clearStorage, logoutMutation, navigate]);
545
+ const refetchPermissions = React__namespace.useCallback(async () => {
546
+ if (!isUninitialized) {
547
+ await refetch();
548
+ }
549
+ }, [isUninitialized, refetch]);
550
+ const [checkPermissions] = useLazyCheckPermissionsQuery();
551
+ const checkUserHasPermissions = React__namespace.useCallback(
552
+ async (permissions, passedPermissions) => {
553
+ if (!permissions || !permissions.length) {
554
+ return true;
555
+ }
556
+ const matchingPermissions = permissions.filter(
557
+ (permission) => (passedPermissions || userPermissions).findIndex(
558
+ (perm) => perm.action === permission.action && perm.subject === permission.subject
559
+ ) >= 0
560
+ );
561
+ const shouldCheckConditions = matchingPermissions.some(
562
+ (perm) => Array.isArray(perm.conditions) && perm.conditions.length > 0
563
+ );
564
+ if (!shouldCheckConditions) {
565
+ return matchingPermissions.length > 0;
566
+ }
567
+ const { data, error } = await checkPermissions({
568
+ permissions: matchingPermissions.map((perm) => ({
569
+ action: perm.action,
570
+ subject: perm.subject
571
+ }))
572
+ });
573
+ if (error) {
574
+ throw error;
575
+ } else {
576
+ return data?.data.every((v) => v === true) ?? false;
577
+ }
578
+ },
579
+ [checkPermissions, userPermissions]
580
+ );
581
+ return /* @__PURE__ */ jsxRuntime.jsx(
582
+ Provider,
583
+ {
584
+ token,
585
+ user,
586
+ login,
587
+ logout,
588
+ permissions: userPermissions,
589
+ checkUserHasPermissions,
590
+ refetchPermissions,
591
+ setToken,
592
+ children
593
+ }
594
+ );
595
+ };
596
+ const storeToken = (token, persist) => {
597
+ if (!persist) {
598
+ return window.sessionStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));
599
+ }
600
+ return window.localStorage.setItem(STORAGE_KEYS.TOKEN, JSON.stringify(token));
601
+ };
602
+
603
+ const NotificationsContext = React__namespace.createContext({
604
+ toggleNotification: () => {
605
+ }
606
+ });
607
+ const NotificationsProvider = ({ children }) => {
608
+ const notificationIdRef = React__namespace.useRef(0);
609
+ const [notifications, setNotifications] = React__namespace.useState([]);
610
+ const toggleNotification = React__namespace.useCallback(
611
+ ({ type, message, link, timeout, blockTransition, onClose, title }) => {
612
+ setNotifications((s) => [
613
+ ...s,
614
+ {
615
+ id: notificationIdRef.current++,
616
+ type,
617
+ message,
618
+ link,
619
+ timeout,
620
+ blockTransition,
621
+ onClose,
622
+ title
623
+ }
624
+ ]);
625
+ },
626
+ []
627
+ );
628
+ const clearNotification = React__namespace.useCallback((id) => {
629
+ setNotifications((s) => s.filter((n) => n.id !== id));
630
+ }, []);
631
+ const value = React__namespace.useMemo(() => ({ toggleNotification }), [toggleNotification]);
632
+ return /* @__PURE__ */ jsxRuntime.jsxs(NotificationsContext.Provider, { value, children: [
633
+ /* @__PURE__ */ jsxRuntime.jsx(
634
+ designSystem.Flex,
635
+ {
636
+ left: "50%",
637
+ marginLeft: "-250px",
638
+ position: "fixed",
639
+ direction: "column",
640
+ alignItems: "stretch",
641
+ gap: 2,
642
+ top: `${46 / 16}rem`,
643
+ width: `${500 / 16}rem`,
644
+ zIndex: 10,
645
+ children: notifications.map((notification) => {
646
+ return /* @__PURE__ */ jsxRuntime.jsx(
647
+ Notification,
648
+ {
649
+ ...notification,
650
+ clearNotification
651
+ },
652
+ notification.id
653
+ );
654
+ })
655
+ }
656
+ ),
657
+ children
658
+ ] });
659
+ };
660
+ const Notification = ({
661
+ clearNotification,
662
+ blockTransition = false,
663
+ id,
664
+ link,
665
+ message,
666
+ onClose,
667
+ timeout = 2500,
668
+ title,
669
+ type
670
+ }) => {
671
+ const { formatMessage } = reactIntl.useIntl();
672
+ const onCloseCallback = designSystem.useCallbackRef(onClose);
673
+ const handleClose = React__namespace.useCallback(() => {
674
+ onCloseCallback();
675
+ clearNotification(id);
676
+ }, [clearNotification, id, onCloseCallback]);
677
+ React__namespace.useEffect(() => {
678
+ if (!blockTransition) {
679
+ const timeoutReference = setTimeout(() => {
680
+ handleClose();
681
+ }, timeout);
682
+ return () => {
683
+ clearTimeout(timeoutReference);
684
+ };
685
+ }
686
+ }, [blockTransition, handleClose, timeout]);
687
+ let variant;
688
+ let alertTitle;
689
+ if (type === "info") {
690
+ variant = "default";
691
+ alertTitle = formatMessage({
692
+ id: "notification.default.title",
693
+ defaultMessage: "Information:"
694
+ });
695
+ } else if (type === "danger") {
696
+ variant = "danger";
697
+ alertTitle = formatMessage({
698
+ id: "notification.warning.title",
699
+ defaultMessage: "Warning:"
700
+ });
701
+ } else if (type === "warning") {
702
+ variant = "warning";
703
+ alertTitle = formatMessage({
704
+ id: "notification.warning.title",
705
+ defaultMessage: "Warning:"
706
+ });
707
+ } else {
708
+ variant = "success";
709
+ alertTitle = formatMessage({
710
+ id: "notification.success.title",
711
+ defaultMessage: "Success:"
712
+ });
713
+ }
714
+ if (title) {
715
+ alertTitle = title;
716
+ }
717
+ return /* @__PURE__ */ jsxRuntime.jsx(
718
+ designSystem.Alert,
719
+ {
720
+ action: link ? /* @__PURE__ */ jsxRuntime.jsx(v2.Link, { href: link.url, isExternal: true, children: link.label }) : void 0,
721
+ onClose: handleClose,
722
+ closeLabel: formatMessage({
723
+ id: "global.close",
724
+ defaultMessage: "Close"
725
+ }),
726
+ title: alertTitle,
727
+ variant,
728
+ children: message
729
+ }
730
+ );
731
+ };
732
+ /**
733
+ * @preserve
734
+ * @description Returns an object to interact with the notification
735
+ * system. The callbacks are wrapped in `useCallback` for a stable
736
+ * identity.
737
+ *
738
+ * @example
739
+ * ```tsx
740
+ * import { useNotification } from '@strapi/strapi/admin';
741
+ *
742
+ * const MyComponent = () => {
743
+ * const { toggleNotification } = useNotification();
744
+ *
745
+ * return <button onClick={() => toggleNotification({ message: 'Hello world!' })}>Click me</button>;
746
+ */
747
+ const useNotification = () => React__namespace.useContext(NotificationsContext);
748
+
749
+ function getPrefixedId(message, callback) {
750
+ const prefixedMessage = `apiError.${message}`;
751
+ if (typeof callback === "function") {
752
+ return callback(prefixedMessage);
753
+ }
754
+ return prefixedMessage;
755
+ }
756
+
757
+ function normalizeError(error, { name, intlMessagePrefixCallback }) {
758
+ const { message } = error;
759
+ const normalizedError = {
760
+ id: getPrefixedId(message, intlMessagePrefixCallback),
761
+ defaultMessage: message,
762
+ name: error.name ?? name,
763
+ values: {}
764
+ };
765
+ if ("path" in error) {
766
+ normalizedError.values = { path: error.path.join(".") };
767
+ }
768
+ return normalizedError;
769
+ }
770
+ const validateErrorIsYupValidationError = (err) => typeof err.details === "object" && err.details !== null && "errors" in err.details;
771
+ function normalizeAPIError(apiError, intlMessagePrefixCallback) {
772
+ const error = apiError.response?.data.error;
773
+ if (error) {
774
+ if (validateErrorIsYupValidationError(error)) {
775
+ return {
776
+ name: error.name,
777
+ message: error?.message || null,
778
+ errors: error.details.errors.map(
779
+ (err) => normalizeError(err, { name: error.name, intlMessagePrefixCallback })
780
+ )
781
+ };
782
+ }
783
+ return normalizeError(error, { intlMessagePrefixCallback });
784
+ }
785
+ return null;
786
+ }
787
+
788
+ function useAPIErrorHandler(intlMessagePrefixCallback) {
789
+ const { formatMessage } = reactIntl.useIntl();
790
+ const formatError = React__namespace.useCallback(
791
+ (error) => {
792
+ try {
793
+ const formattedErr = formatAPIError(error, { intlMessagePrefixCallback, formatMessage });
794
+ if (!formattedErr) {
795
+ return formatAxiosError(error, { intlMessagePrefixCallback, formatMessage });
796
+ }
797
+ return formattedErr;
798
+ } catch (_) {
799
+ throw new Error("formatAPIError: Unknown error:", error);
800
+ }
801
+ },
802
+ [formatMessage, intlMessagePrefixCallback]
803
+ );
804
+ return {
805
+ /**
806
+ * @alpha
807
+ * Convert ValidationErrors from the API into an object that can be used by forms.
808
+ */
809
+ _unstableFormatValidationErrors: React__namespace.useCallback(
810
+ (error) => {
811
+ if (typeof error.details === "object" && error.details !== null) {
812
+ if ("errors" in error.details && Array.isArray(error.details.errors)) {
813
+ const validationErrors = error.details.errors;
814
+ return validationErrors.reduce((acc, err) => {
815
+ const { path, message } = err;
816
+ return {
817
+ ...acc,
818
+ [path.join(".")]: message
819
+ };
820
+ }, {});
821
+ } else {
822
+ const details = error.details;
823
+ return Object.keys(details).reduce((acc, key) => {
824
+ const messages = details[key];
825
+ return {
826
+ ...acc,
827
+ [key]: messages.join(", ")
828
+ };
829
+ }, {});
830
+ }
831
+ } else {
832
+ return {};
833
+ }
834
+ },
835
+ []
836
+ ),
837
+ /**
838
+ * @alpha
839
+ * This handles the errors given from `redux-toolkit`'s axios based baseQuery function.
840
+ */
841
+ _unstableFormatAPIError: React__namespace.useCallback(
842
+ (error) => {
843
+ const err = {
844
+ response: {
845
+ data: {
846
+ error
847
+ }
848
+ }
849
+ };
850
+ if (!error.message) {
851
+ return "Unknown error occured.";
852
+ }
853
+ return formatError(err);
854
+ },
855
+ [formatError]
856
+ ),
857
+ formatAPIError: formatError
858
+ };
859
+ }
860
+ function formatAxiosError(error, { intlMessagePrefixCallback, formatMessage }) {
861
+ const { code, message } = error;
862
+ return formatMessage(
863
+ {
864
+ id: getPrefixedId(message, intlMessagePrefixCallback),
865
+ defaultMessage: message
866
+ },
867
+ {
868
+ code
869
+ }
870
+ );
871
+ }
872
+ function formatAPIError(error, { formatMessage, intlMessagePrefixCallback }) {
873
+ if (!formatMessage) {
874
+ throw new Error("The formatMessage callback is a mandatory argument.");
875
+ }
876
+ const normalizedError = normalizeAPIError(error, intlMessagePrefixCallback);
877
+ if (!normalizedError) {
878
+ return null;
879
+ }
880
+ if ("message" in normalizedError && normalizedError.message !== null) {
881
+ return normalizedError.message;
882
+ }
883
+ if ("errors" in normalizedError) {
884
+ return normalizedError.errors.map(({ id, defaultMessage, values }) => formatMessage({ id, defaultMessage }, values)).join("\n");
885
+ }
886
+ return formatMessage(normalizedError);
887
+ }
888
+
889
+ const PageMain = ({ children, ...restProps }) => {
890
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Main, { ...restProps, children });
891
+ };
892
+ const Loading = ({ children = "Loading content." }) => {
893
+ return /* @__PURE__ */ jsxRuntime.jsx(PageMain, { height: "100vh", "aria-busy": true, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { alignItems: "center", height: "100%", justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Loader, { children }) }) });
894
+ };
895
+ const Error$1 = (props) => {
896
+ const { formatMessage } = reactIntl.useIntl();
897
+ return /* @__PURE__ */ jsxRuntime.jsx(PageMain, { height: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { alignItems: "center", height: "100%", justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(
898
+ designSystem.EmptyStateLayout,
899
+ {
900
+ icon: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: Icons.ExclamationMarkCircle, width: "10rem" }),
901
+ content: formatMessage({
902
+ id: "anErrorOccurred",
903
+ defaultMessage: "Woops! Something went wrong. Please, try again."
904
+ }),
905
+ ...props
906
+ }
907
+ ) }) });
908
+ };
909
+ const NoPermissions = (props) => {
910
+ const { formatMessage } = reactIntl.useIntl();
911
+ return /* @__PURE__ */ jsxRuntime.jsx(PageMain, { height: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { alignItems: "center", height: "100%", justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { minWidth: "50%", children: /* @__PURE__ */ jsxRuntime.jsx(
912
+ designSystem.EmptyStateLayout,
913
+ {
914
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.EmptyPermissions, { width: "10rem" }),
915
+ content: formatMessage({
916
+ id: "app.components.EmptyStateLayout.content-permissions",
917
+ defaultMessage: "You don't have the permissions to access that content"
918
+ }),
919
+ ...props
920
+ }
921
+ ) }) }) });
922
+ };
923
+ const NoData = (props) => {
924
+ const { formatMessage } = reactIntl.useIntl();
925
+ return /* @__PURE__ */ jsxRuntime.jsx(PageMain, { height: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { alignItems: "center", height: "100%", width: "100%", justifyContent: "center", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { minWidth: "50%", children: /* @__PURE__ */ jsxRuntime.jsx(
926
+ designSystem.EmptyStateLayout,
927
+ {
928
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.EmptyDocuments, { width: "10rem" }),
929
+ content: formatMessage({
930
+ id: "app.components.EmptyStateLayout.content-document",
931
+ defaultMessage: "No content found"
932
+ }),
933
+ ...props
934
+ }
935
+ ) }) }) });
936
+ };
937
+ const Protect = ({ permissions = [], children }) => {
938
+ const userPermissions = useAuth("Protect", (state) => state.permissions);
939
+ const { toggleNotification } = useNotification();
940
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
941
+ const matchingPermissions = userPermissions.filter(
942
+ (permission) => permissions.findIndex(
943
+ (perm) => perm.action === permission.action && perm.subject === permission.subject
944
+ ) >= 0
945
+ );
946
+ const shouldCheckConditions = matchingPermissions.some(
947
+ (perm) => Array.isArray(perm.conditions) && perm.conditions.length > 0
948
+ );
949
+ const { isLoading, error, data } = useCheckPermissionsQuery(
950
+ {
951
+ permissions: matchingPermissions.map((perm) => ({
952
+ action: perm.action,
953
+ subject: perm.subject
954
+ }))
955
+ },
956
+ {
957
+ skip: !shouldCheckConditions
958
+ }
959
+ );
960
+ React__namespace.useEffect(() => {
961
+ if (error) {
962
+ toggleNotification({
963
+ type: "danger",
964
+ message: formatAPIError(error)
965
+ });
966
+ }
967
+ }, [error, formatAPIError, toggleNotification]);
968
+ if (isLoading) {
969
+ return /* @__PURE__ */ jsxRuntime.jsx(Loading, {});
970
+ }
971
+ if (error) {
972
+ return /* @__PURE__ */ jsxRuntime.jsx(Error$1, {});
973
+ }
974
+ const { data: permissionsData } = data || {};
975
+ const canAccess = shouldCheckConditions && permissionsData ? !permissionsData.includes(false) : matchingPermissions.length > 0;
976
+ if (!canAccess) {
977
+ return /* @__PURE__ */ jsxRuntime.jsx(NoPermissions, {});
978
+ }
979
+ return typeof children === "function" ? children({ permissions: matchingPermissions }) : children;
980
+ };
981
+ const Page = {
982
+ Error: Error$1,
983
+ Loading,
984
+ NoPermissions,
985
+ Protect,
986
+ NoData,
987
+ Main: PageMain
988
+ };
989
+
990
+ const usePrev = (value) => {
991
+ const ref = React.useRef();
992
+ React.useEffect(() => {
993
+ ref.current = value;
994
+ }, [value]);
995
+ return ref.current;
996
+ };
997
+
998
+ const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
999
+
1000
+ const useRBAC = (permissionsToCheck = {}, passedPermissions) => {
1001
+ const userPermissions = useAuth("useRBAC", (state) => state.permissions);
1002
+ const [isLoading, setIsLoading] = React.useState(true);
1003
+ const [error, setError] = React.useState();
1004
+ const [data, setData] = React.useState();
1005
+ const defaultAllowedActions = React.useMemo(
1006
+ () => Object.keys(permissionsToCheck).reduce(
1007
+ (acc, name) => ({
1008
+ ...acc,
1009
+ [name]: false
1010
+ }),
1011
+ {}
1012
+ ),
1013
+ [permissionsToCheck]
1014
+ );
1015
+ const checkUserHasPermissions = useAuth("useRBAC", (state) => state.checkUserHasPermissions);
1016
+ const permssionsChecked = usePrev(permissionsToCheck);
1017
+ React.useEffect(() => {
1018
+ if (!isEqual__default.default(permssionsChecked, permissionsToCheck)) {
1019
+ setIsLoading(true);
1020
+ setData(void 0);
1021
+ setError(void 0);
1022
+ const permissionEntries = Object.entries(permissionsToCheck);
1023
+ for (const [name, permissions] of permissionEntries) {
1024
+ checkUserHasPermissions(permissions, passedPermissions).then((res) => {
1025
+ if (res) {
1026
+ setData((s) => ({
1027
+ ...s,
1028
+ [name]: res
1029
+ }));
1030
+ }
1031
+ }).catch((err) => {
1032
+ setError(err);
1033
+ }).finally(() => {
1034
+ setIsLoading(false);
1035
+ });
1036
+ }
1037
+ }
1038
+ }, [checkUserHasPermissions, passedPermissions, permissionsToCheck, permssionsChecked]);
1039
+ const actions = {
1040
+ ...defaultAllowedActions,
1041
+ ...data
1042
+ };
1043
+ const allowedActions = Object.entries(actions).reduce((acc, [name, allowed]) => {
1044
+ acc[`can${capitalise(name)}`] = allowed;
1045
+ return acc;
1046
+ }, {});
1047
+ return { allowedActions, isLoading: isLoading || userPermissions.length === 0, error };
1048
+ };
1049
+
1050
+ const prefixFileUrlWithBackendUrl = (fileURL) => {
1051
+ return !!fileURL && fileURL.startsWith("/") ? `${window.strapi.backendURL}${fileURL}` : fileURL;
1052
+ };
1053
+
1054
+ const admin = adminApi.injectEndpoints({
1055
+ endpoints: (builder) => ({
1056
+ init: builder.query({
1057
+ query: () => ({
1058
+ url: "/admin/init",
1059
+ method: "GET"
1060
+ }),
1061
+ transformResponse(res) {
1062
+ return res.data;
1063
+ }
1064
+ }),
1065
+ information: builder.query({
1066
+ query: () => ({
1067
+ url: "/admin/information",
1068
+ method: "GET"
1069
+ }),
1070
+ transformResponse(res) {
1071
+ return res.data;
1072
+ }
1073
+ }),
1074
+ telemetryProperties: builder.query({
1075
+ query: () => ({
1076
+ url: "/admin/telemetry-properties",
1077
+ method: "GET",
1078
+ config: {
1079
+ validateStatus: (status) => status < 500
1080
+ }
1081
+ }),
1082
+ transformResponse(res) {
1083
+ return res.data;
1084
+ }
1085
+ }),
1086
+ projectSettings: builder.query({
1087
+ query: () => ({
1088
+ url: "/admin/project-settings",
1089
+ method: "GET"
1090
+ }),
1091
+ providesTags: ["ProjectSettings"],
1092
+ transformResponse(data) {
1093
+ return {
1094
+ authLogo: data.authLogo ? {
1095
+ name: data.authLogo.name,
1096
+ url: prefixFileUrlWithBackendUrl(data.authLogo.url)
1097
+ } : void 0,
1098
+ menuLogo: data.menuLogo ? {
1099
+ name: data.menuLogo.name,
1100
+ url: prefixFileUrlWithBackendUrl(data.menuLogo.url)
1101
+ } : void 0
1102
+ };
1103
+ }
1104
+ }),
1105
+ updateProjectSettings: builder.mutation({
1106
+ query: (data) => ({
1107
+ url: "/admin/project-settings",
1108
+ method: "POST",
1109
+ data,
1110
+ config: {
1111
+ headers: {
1112
+ "Content-Type": "multipart/form-data"
1113
+ }
1114
+ }
1115
+ }),
1116
+ invalidatesTags: ["ProjectSettings"]
1117
+ }),
1118
+ getPlugins: builder.query({
1119
+ query: () => ({
1120
+ url: "/admin/plugins",
1121
+ method: "GET"
1122
+ })
1123
+ }),
1124
+ getLicenseLimits: builder.query({
1125
+ query: () => ({
1126
+ url: "/admin/license-limit-information",
1127
+ method: "GET"
1128
+ }),
1129
+ providesTags: ["LicenseLimits"]
1130
+ })
1131
+ }),
1132
+ overrideExisting: false
1133
+ });
1134
+ const {
1135
+ useInitQuery,
1136
+ useTelemetryPropertiesQuery,
1137
+ useInformationQuery,
1138
+ useProjectSettingsQuery,
1139
+ useUpdateProjectSettingsMutation,
1140
+ useGetPluginsQuery,
1141
+ useGetLicenseLimitsQuery
1142
+ } = admin;
1143
+
1144
+ const [AppInfoProvider, useAppInfo] = createContext("AppInfo", {});
1145
+
1146
+ const TrackingContext = React__namespace.createContext({
1147
+ uuid: false
1148
+ });
1149
+ const TrackingProvider = ({ children }) => {
1150
+ const token = useAuth("App", (state) => state.token);
1151
+ const { data: initData } = useInitQuery();
1152
+ const { uuid } = initData ?? {};
1153
+ const { data } = useTelemetryPropertiesQuery(void 0, {
1154
+ skip: !initData?.uuid || !token
1155
+ });
1156
+ React__namespace.useEffect(() => {
1157
+ if (uuid && data) {
1158
+ const event = "didInitializeAdministration";
1159
+ try {
1160
+ fetch("https://analytics.strapi.io/api/v2/track", {
1161
+ method: "POST",
1162
+ body: JSON.stringify({
1163
+ // This event is anonymous
1164
+ event,
1165
+ userId: "",
1166
+ eventPropeties: {},
1167
+ groupProperties: { ...data, projectId: uuid }
1168
+ }),
1169
+ headers: {
1170
+ "Content-Type": "application/json",
1171
+ "X-Strapi-Event": event
1172
+ }
1173
+ });
1174
+ } catch {
1175
+ }
1176
+ }
1177
+ }, [data, uuid]);
1178
+ const value = React__namespace.useMemo(
1179
+ () => ({
1180
+ uuid,
1181
+ telemetryProperties: data
1182
+ }),
1183
+ [uuid, data]
1184
+ );
1185
+ return /* @__PURE__ */ jsxRuntime.jsx(TrackingContext.Provider, { value, children });
1186
+ };
1187
+ const useTracking = () => {
1188
+ const { uuid, telemetryProperties } = React__namespace.useContext(TrackingContext);
1189
+ const userId = useAppInfo("useTracking", (state) => state.userId);
1190
+ const trackUsage = React__namespace.useCallback(
1191
+ async (event, properties) => {
1192
+ try {
1193
+ if (uuid && !window.strapi.telemetryDisabled) {
1194
+ const res = await axios__default.default.post(
1195
+ "https://analytics.strapi.io/api/v2/track",
1196
+ {
1197
+ event,
1198
+ userId,
1199
+ eventProperties: { ...properties },
1200
+ userProperties: {},
1201
+ groupProperties: {
1202
+ ...telemetryProperties,
1203
+ projectId: uuid,
1204
+ projectType: window.strapi.projectType
1205
+ }
1206
+ },
1207
+ {
1208
+ headers: {
1209
+ "Content-Type": "application/json",
1210
+ "X-Strapi-Event": event
1211
+ }
1212
+ }
1213
+ );
1214
+ return res;
1215
+ }
1216
+ } catch (err) {
1217
+ }
1218
+ return null;
1219
+ },
1220
+ [telemetryProperties, userId, uuid]
1221
+ );
1222
+ return { trackUsage };
1223
+ };
1224
+
1225
+ const [ConfigurationContextProvider, useConfiguration] = reactContext.createContext("ConfigurationContext");
1226
+ const ConfigurationProvider = ({
1227
+ children,
1228
+ defaultAuthLogo,
1229
+ defaultMenuLogo,
1230
+ showReleaseNotification = false,
1231
+ showTutorials = false
1232
+ }) => {
1233
+ const { trackUsage } = useTracking();
1234
+ const { formatMessage } = reactIntl.useIntl();
1235
+ const { toggleNotification } = useNotification();
1236
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
1237
+ const permissions = useTypedSelector(
1238
+ (state) => state.admin_app.permissions.settings?.["project-settings"]
1239
+ );
1240
+ const token = useAuth("ConfigurationProvider", (state) => state.token);
1241
+ const {
1242
+ allowedActions: { canRead }
1243
+ } = useRBAC(permissions);
1244
+ const {
1245
+ data: { authLogo: customAuthLogo, menuLogo: customMenuLogo } = {},
1246
+ error,
1247
+ isLoading
1248
+ } = useInitQuery();
1249
+ React__namespace.useEffect(() => {
1250
+ if (error) {
1251
+ toggleNotification({
1252
+ type: "danger",
1253
+ message: formatMessage({ id: "app.containers.App.notification.error.init" })
1254
+ });
1255
+ }
1256
+ }, [error, formatMessage, toggleNotification]);
1257
+ const { data, isSuccess } = useProjectSettingsQuery(void 0, {
1258
+ skip: !token || !canRead
1259
+ });
1260
+ const [updateProjectSettingsMutation] = useUpdateProjectSettingsMutation();
1261
+ const updateProjectSettings = React__namespace.useCallback(
1262
+ async (body) => {
1263
+ const formData = new FormData();
1264
+ Object.entries(body).forEach(([key, value]) => {
1265
+ if (value?.rawFile) {
1266
+ formData.append(key, value.rawFile);
1267
+ } else if (value === null) {
1268
+ formData.append(key, JSON.stringify(value));
1269
+ }
1270
+ });
1271
+ const res = await updateProjectSettingsMutation(formData);
1272
+ if ("data" in res) {
1273
+ const updatedMenuLogo = !!res.data.menuLogo && !!body.menuLogo?.rawFile;
1274
+ const updatedAuthLogo = !!res.data.authLogo && !!body.authLogo?.rawFile;
1275
+ if (updatedMenuLogo) {
1276
+ trackUsage("didChangeLogo", {
1277
+ logo: "menu"
1278
+ });
1279
+ }
1280
+ if (updatedAuthLogo) {
1281
+ trackUsage("didChangeLogo", {
1282
+ logo: "auth"
1283
+ });
1284
+ }
1285
+ toggleNotification({
1286
+ type: "success",
1287
+ message: formatMessage({ id: "app", defaultMessage: "Saved" })
1288
+ });
1289
+ } else {
1290
+ toggleNotification({
1291
+ type: "danger",
1292
+ message: formatAPIError(res.error)
1293
+ });
1294
+ }
1295
+ },
1296
+ [formatAPIError, formatMessage, toggleNotification, trackUsage, updateProjectSettingsMutation]
1297
+ );
1298
+ if (isLoading) {
1299
+ return /* @__PURE__ */ jsxRuntime.jsx(Page.Loading, {});
1300
+ }
1301
+ return /* @__PURE__ */ jsxRuntime.jsx(
1302
+ ConfigurationContextProvider,
1303
+ {
1304
+ showReleaseNotification,
1305
+ showTutorials,
1306
+ logos: {
1307
+ menu: {
1308
+ custom: isSuccess ? data?.menuLogo : {
1309
+ url: customMenuLogo ?? ""
1310
+ },
1311
+ default: defaultMenuLogo
1312
+ },
1313
+ auth: {
1314
+ custom: isSuccess ? data?.authLogo : {
1315
+ url: customAuthLogo ?? ""
1316
+ },
1317
+ default: defaultAuthLogo
1318
+ }
1319
+ },
1320
+ updateProjectSettings,
1321
+ children
1322
+ }
1323
+ );
1324
+ };
1325
+
1326
+ const [StrapiAppProvider, useStrapiApp] = createContext("StrapiApp");
1327
+
1328
+ const GUIDED_TOUR_COMPLETED_STEPS = "GUIDED_TOUR_COMPLETED_STEPS";
1329
+ const GUIDED_TOUR_CURRENT_STEP = "GUIDED_TOUR_CURRENT_STEP";
1330
+ const GUIDED_TOUR_SKIPPED = "GUIDED_TOUR_SKIPPED";
1331
+ const [GuidedTourProviderImpl, useGuidedTour] = createContext("GuidedTour");
1332
+ const GuidedTourProvider = ({ children }) => {
1333
+ const [{ currentStep, guidedTourState, isGuidedTourVisible, isSkipped }, dispatch] = React__namespace.useReducer(reducer$4, initialState$2, initialiseState);
1334
+ const setCurrentStep = (step) => {
1335
+ if (step !== null) {
1336
+ const isStepAlreadyDone = get__default.default(guidedTourState, step);
1337
+ const [sectionName, stepName] = step.split(".");
1338
+ const sectionArray = Object.entries(guidedTourState[sectionName]);
1339
+ const currentStepIndex = sectionArray.findIndex(([key]) => key === stepName);
1340
+ const previousSteps = sectionArray.slice(0, currentStepIndex);
1341
+ const isStepToShow = previousSteps.every(([, sectionValue]) => sectionValue);
1342
+ if (isStepAlreadyDone || isSkipped || !isStepToShow) {
1343
+ return null;
1344
+ }
1345
+ }
1346
+ window.localStorage.setItem(GUIDED_TOUR_CURRENT_STEP, JSON.stringify(null));
1347
+ return dispatch({
1348
+ type: "SET_CURRENT_STEP",
1349
+ step
1350
+ });
1351
+ };
1352
+ const setGuidedTourVisibility = (value) => {
1353
+ dispatch({
1354
+ type: "SET_GUIDED_TOUR_VISIBILITY",
1355
+ value
1356
+ });
1357
+ };
1358
+ const setStepState = (currentStep2, value) => {
1359
+ addCompletedStep(currentStep2);
1360
+ dispatch({
1361
+ type: "SET_STEP_STATE",
1362
+ currentStep: currentStep2,
1363
+ value
1364
+ });
1365
+ };
1366
+ const startSection = (sectionName) => {
1367
+ const sectionSteps = guidedTourState[sectionName];
1368
+ if (sectionSteps) {
1369
+ const guidedTourArray = Object.entries(guidedTourState);
1370
+ const currentSectionIndex = guidedTourArray.findIndex(([key]) => key === sectionName);
1371
+ const previousSections = guidedTourArray.slice(0, currentSectionIndex);
1372
+ const isSectionToShow = previousSections.every(
1373
+ ([, sectionValue]) => Object.values(sectionValue).every(Boolean)
1374
+ );
1375
+ const [firstStep] = Object.keys(sectionSteps);
1376
+ const isFirstStepDone = sectionSteps[firstStep];
1377
+ if (isSectionToShow && !currentStep && !isFirstStepDone) {
1378
+ setCurrentStep(`${sectionName}.${firstStep}`);
1379
+ }
1380
+ }
1381
+ };
1382
+ const setSkipped = (value) => {
1383
+ window.localStorage.setItem(GUIDED_TOUR_SKIPPED, JSON.stringify(value));
1384
+ dispatch({
1385
+ type: "SET_SKIPPED",
1386
+ value
1387
+ });
1388
+ };
1389
+ return /* @__PURE__ */ jsxRuntime.jsx(
1390
+ GuidedTourProviderImpl,
1391
+ {
1392
+ guidedTourState,
1393
+ currentStep,
1394
+ setCurrentStep,
1395
+ setGuidedTourVisibility,
1396
+ setSkipped,
1397
+ setStepState,
1398
+ startSection,
1399
+ isGuidedTourVisible,
1400
+ isSkipped,
1401
+ children
1402
+ }
1403
+ );
1404
+ };
1405
+ const initialState$2 = {
1406
+ currentStep: null,
1407
+ guidedTourState: {
1408
+ contentTypeBuilder: {
1409
+ create: false,
1410
+ success: false
1411
+ },
1412
+ contentManager: {
1413
+ create: false,
1414
+ success: false
1415
+ },
1416
+ apiTokens: {
1417
+ create: false,
1418
+ success: false
1419
+ },
1420
+ transferTokens: {
1421
+ create: false,
1422
+ success: false
1423
+ }
1424
+ },
1425
+ isGuidedTourVisible: false,
1426
+ isSkipped: false
1427
+ };
1428
+ const reducer$4 = (state = initialState$2, action) => immer.produce(state, (draftState) => {
1429
+ switch (action.type) {
1430
+ case "SET_CURRENT_STEP": {
1431
+ draftState.currentStep = action.step;
1432
+ break;
1433
+ }
1434
+ case "SET_STEP_STATE": {
1435
+ const [section, step] = action.currentStep.split(".");
1436
+ draftState.guidedTourState[section][step] = action.value;
1437
+ break;
1438
+ }
1439
+ case "SET_SKIPPED": {
1440
+ draftState.isSkipped = action.value;
1441
+ break;
1442
+ }
1443
+ case "SET_GUIDED_TOUR_VISIBILITY": {
1444
+ draftState.isGuidedTourVisible = action.value;
1445
+ break;
1446
+ }
1447
+ default: {
1448
+ return draftState;
1449
+ }
1450
+ }
1451
+ });
1452
+ const initialiseState = (initialState2) => {
1453
+ const copyInitialState = { ...initialState2 };
1454
+ const guidedTourLocaleStorage = JSON.parse(
1455
+ window.localStorage.getItem(GUIDED_TOUR_COMPLETED_STEPS) ?? "[]"
1456
+ );
1457
+ const currentStepLocaleStorage = JSON.parse(
1458
+ window.localStorage.getItem(GUIDED_TOUR_CURRENT_STEP) ?? "null"
1459
+ );
1460
+ const skippedLocaleStorage = JSON.parse(
1461
+ window.localStorage.getItem(GUIDED_TOUR_SKIPPED) ?? "false"
1462
+ );
1463
+ if (Array.isArray(guidedTourLocaleStorage)) {
1464
+ guidedTourLocaleStorage.forEach((step) => {
1465
+ const [sectionName, stepName] = step.split(".");
1466
+ set__default.default(copyInitialState, ["guidedTourState", sectionName, stepName], true);
1467
+ });
1468
+ }
1469
+ if (currentStepLocaleStorage) {
1470
+ const [sectionName, stepName] = currentStepLocaleStorage.split(".");
1471
+ set__default.default(copyInitialState, ["guidedTourState", sectionName, stepName], true);
1472
+ addCompletedStep(currentStepLocaleStorage);
1473
+ window.localStorage.setItem(GUIDED_TOUR_CURRENT_STEP, JSON.stringify(null));
1474
+ }
1475
+ if (skippedLocaleStorage !== null) {
1476
+ set__default.default(copyInitialState, "isSkipped", skippedLocaleStorage);
1477
+ }
1478
+ return copyInitialState;
1479
+ };
1480
+ const addCompletedStep = (completedStep) => {
1481
+ const currentSteps = JSON.parse(window.localStorage.getItem(GUIDED_TOUR_COMPLETED_STEPS) ?? "[]");
1482
+ if (!Array.isArray(currentSteps)) {
1483
+ return;
1484
+ }
1485
+ const isAlreadyStored = currentSteps.includes(completedStep);
1486
+ if (isAlreadyStored) {
1487
+ return;
1488
+ }
1489
+ window.localStorage.setItem(
1490
+ GUIDED_TOUR_COMPLETED_STEPS,
1491
+ JSON.stringify([...currentSteps, completedStep])
1492
+ );
1493
+ };
1494
+
1495
+ const LanguageProvider = ({ children, messages }) => {
1496
+ const locale = useTypedSelector((state) => state.admin_app.language.locale);
1497
+ const appMessages = defaultsDeep__default.default(messages[locale], messages.en);
1498
+ return /* @__PURE__ */ jsxRuntime.jsx(reactIntl.IntlProvider, { locale, defaultLocale: "en", messages: appMessages, textComponent: "span", children });
1499
+ };
1500
+
1501
+ const Theme = ({ children, themes }) => {
1502
+ const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);
1503
+ const [systemTheme, setSystemTheme] = React__namespace.useState();
1504
+ const { locale } = reactIntl.useIntl();
1505
+ const dispatch = reactRedux.useDispatch();
1506
+ React__namespace.useEffect(() => {
1507
+ const themeWatcher = window.matchMedia("(prefers-color-scheme: dark)");
1508
+ setSystemTheme(themeWatcher.matches ? "dark" : "light");
1509
+ const listener = (event) => {
1510
+ setSystemTheme(event.matches ? "dark" : "light");
1511
+ };
1512
+ themeWatcher.addEventListener("change", listener);
1513
+ return () => {
1514
+ themeWatcher.removeEventListener("change", listener);
1515
+ };
1516
+ }, []);
1517
+ React__namespace.useEffect(() => {
1518
+ dispatch(setAvailableThemes(Object.keys(themes)));
1519
+ }, [dispatch, themes]);
1520
+ const computedThemeName = currentTheme === "system" ? systemTheme : currentTheme;
1521
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1522
+ designSystem.DesignSystemProvider,
1523
+ {
1524
+ locale,
1525
+ theme: themes?.[computedThemeName || "light"],
1526
+ children: [
1527
+ children,
1528
+ /* @__PURE__ */ jsxRuntime.jsx(GlobalStyle, {})
1529
+ ]
1530
+ }
1531
+ );
1532
+ };
1533
+ const GlobalStyle = styled.createGlobalStyle`
1534
+ body {
1535
+ background: ${({ theme }) => theme.colors.neutral100};
1536
+ }
1537
+ `;
1538
+
1539
+ const ADMIN_PERMISSIONS_CE = {
1540
+ contentManager: {
1541
+ main: [],
1542
+ collectionTypesConfigurations: [
1543
+ {
1544
+ action: "plugin::content-manager.collection-types.configure-view",
1545
+ subject: null
1546
+ }
1547
+ ],
1548
+ componentsConfigurations: [
1549
+ {
1550
+ action: "plugin::content-manager.components.configure-layout",
1551
+ subject: null
1552
+ }
1553
+ ],
1554
+ singleTypesConfigurations: [
1555
+ {
1556
+ action: "plugin::content-manager.single-types.configure-view",
1557
+ subject: null
1558
+ }
1559
+ ]
1560
+ },
1561
+ marketplace: {
1562
+ main: [{ action: "admin::marketplace.read", subject: null }],
1563
+ read: [{ action: "admin::marketplace.read", subject: null }]
1564
+ },
1565
+ settings: {
1566
+ roles: {
1567
+ main: [
1568
+ { action: "admin::roles.create", subject: null },
1569
+ { action: "admin::roles.update", subject: null },
1570
+ { action: "admin::roles.read", subject: null },
1571
+ { action: "admin::roles.delete", subject: null }
1572
+ ],
1573
+ create: [{ action: "admin::roles.create", subject: null }],
1574
+ delete: [{ action: "admin::roles.delete", subject: null }],
1575
+ read: [{ action: "admin::roles.read", subject: null }],
1576
+ update: [{ action: "admin::roles.update", subject: null }]
1577
+ },
1578
+ users: {
1579
+ main: [
1580
+ { action: "admin::users.create", subject: null },
1581
+ { action: "admin::users.read", subject: null },
1582
+ { action: "admin::users.update", subject: null },
1583
+ { action: "admin::users.delete", subject: null }
1584
+ ],
1585
+ create: [{ action: "admin::users.create", subject: null }],
1586
+ delete: [{ action: "admin::users.delete", subject: null }],
1587
+ read: [{ action: "admin::users.read", subject: null }],
1588
+ update: [{ action: "admin::users.update", subject: null }]
1589
+ },
1590
+ webhooks: {
1591
+ main: [
1592
+ { action: "admin::webhooks.create", subject: null },
1593
+ { action: "admin::webhooks.read", subject: null },
1594
+ { action: "admin::webhooks.update", subject: null },
1595
+ { action: "admin::webhooks.delete", subject: null }
1596
+ ],
1597
+ create: [{ action: "admin::webhooks.create", subject: null }],
1598
+ delete: [{ action: "admin::webhooks.delete", subject: null }],
1599
+ read: [
1600
+ { action: "admin::webhooks.read", subject: null },
1601
+ // NOTE: We need to check with the API
1602
+ { action: "admin::webhooks.update", subject: null },
1603
+ { action: "admin::webhooks.delete", subject: null }
1604
+ ],
1605
+ update: [{ action: "admin::webhooks.update", subject: null }]
1606
+ },
1607
+ "api-tokens": {
1608
+ main: [{ action: "admin::api-tokens.access", subject: null }],
1609
+ create: [{ action: "admin::api-tokens.create", subject: null }],
1610
+ delete: [{ action: "admin::api-tokens.delete", subject: null }],
1611
+ read: [{ action: "admin::api-tokens.read", subject: null }],
1612
+ update: [{ action: "admin::api-tokens.update", subject: null }],
1613
+ regenerate: [{ action: "admin::api-tokens.regenerate", subject: null }]
1614
+ },
1615
+ "transfer-tokens": {
1616
+ main: [{ action: "admin::transfer.tokens.access", subject: null }],
1617
+ create: [{ action: "admin::transfer.tokens.create", subject: null }],
1618
+ delete: [{ action: "admin::transfer.tokens.delete", subject: null }],
1619
+ read: [{ action: "admin::transfer.tokens.read", subject: null }],
1620
+ update: [{ action: "admin::transfer.tokens.update", subject: null }],
1621
+ regenerate: [{ action: "admin::transfer.tokens.regenerate", subject: null }]
1622
+ },
1623
+ "project-settings": {
1624
+ read: [{ action: "admin::project-settings.read", subject: null }],
1625
+ update: [{ action: "admin::project-settings.update", subject: null }]
1626
+ }
1627
+ }
1628
+ };
1629
+ const HOOKS = {
1630
+ /**
1631
+ * Hook that allows to mutate the displayed headers of the list view table
1632
+ * @constant
1633
+ * @type {string}
1634
+ */
1635
+ INJECT_COLUMN_IN_TABLE: "Admin/CM/pages/ListView/inject-column-in-table",
1636
+ /**
1637
+ * Hook that allows to mutate the CM's collection types links pre-set filters
1638
+ * @constant
1639
+ * @type {string}
1640
+ */
1641
+ MUTATE_COLLECTION_TYPES_LINKS: "Admin/CM/pages/App/mutate-collection-types-links",
1642
+ /**
1643
+ * Hook that allows to mutate the CM's edit view layout
1644
+ * @constant
1645
+ * @type {string}
1646
+ */
1647
+ MUTATE_EDIT_VIEW_LAYOUT: "Admin/CM/pages/EditView/mutate-edit-view-layout",
1648
+ /**
1649
+ * Hook that allows to mutate the CM's single types links pre-set filters
1650
+ * @constant
1651
+ * @type {string}
1652
+ */
1653
+ MUTATE_SINGLE_TYPES_LINKS: "Admin/CM/pages/App/mutate-single-types-links"
1654
+ };
1655
+ const SETTINGS_LINKS_CE = () => ({
1656
+ global: [
1657
+ {
1658
+ intlLabel: { id: "Settings.application.title", defaultMessage: "Overview" },
1659
+ to: "/settings/application-infos",
1660
+ id: "000-application-infos"
1661
+ },
1662
+ {
1663
+ intlLabel: { id: "Settings.webhooks.title", defaultMessage: "Webhooks" },
1664
+ to: "/settings/webhooks",
1665
+ id: "webhooks"
1666
+ },
1667
+ {
1668
+ intlLabel: { id: "Settings.apiTokens.title", defaultMessage: "API Tokens" },
1669
+ to: "/settings/api-tokens?sort=name:ASC",
1670
+ id: "api-tokens"
1671
+ },
1672
+ {
1673
+ intlLabel: { id: "Settings.transferTokens.title", defaultMessage: "Transfer Tokens" },
1674
+ to: "/settings/transfer-tokens?sort=name:ASC",
1675
+ id: "transfer-tokens"
1676
+ },
1677
+ // If the Enterprise feature is not enabled and if the config doesn't disable it, we promote the Enterprise feature by displaying them in the settings menu.
1678
+ // Disable this by adding "promoteEE: false" to your `./config/admin.js` file
1679
+ ...!window.strapi.features.isEnabled(window.strapi.features.SSO) && window.strapi?.flags?.promoteEE ? [
1680
+ {
1681
+ intlLabel: { id: "Settings.sso.title", defaultMessage: "Single Sign-On" },
1682
+ to: "/settings/purchase-single-sign-on",
1683
+ id: "sso",
1684
+ lockIcon: true
1685
+ }
1686
+ ] : [],
1687
+ ...!window.strapi.features.isEnabled(window.strapi.features.REVIEW_WORKFLOWS) && window.strapi?.flags?.promoteEE ? [
1688
+ {
1689
+ intlLabel: {
1690
+ id: "Settings.review-workflows.page.title",
1691
+ defaultMessage: "Review Workflows"
1692
+ },
1693
+ to: "/settings/purchase-review-workflows",
1694
+ id: "review-workflows",
1695
+ lockIcon: true
1696
+ }
1697
+ ] : []
1698
+ ],
1699
+ admin: [
1700
+ {
1701
+ intlLabel: { id: "global.roles", defaultMessage: "Roles" },
1702
+ to: "/settings/roles",
1703
+ id: "roles"
1704
+ },
1705
+ {
1706
+ intlLabel: { id: "global.users", defaultMessage: "Users" },
1707
+ // Init the search params directly
1708
+ to: "/settings/users?pageSize=10&page=1&sort=firstname",
1709
+ id: "users"
1710
+ },
1711
+ ...!window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS) && window.strapi?.flags?.promoteEE ? [
1712
+ {
1713
+ intlLabel: { id: "global.auditLogs", defaultMessage: "Audit Logs" },
1714
+ to: "/settings/purchase-audit-logs",
1715
+ id: "auditLogs",
1716
+ lockIcon: true
1717
+ }
1718
+ ] : []
1719
+ ]
1720
+ });
1721
+
1722
+ const SINGLE_TYPES = "single-types";
1723
+ const COLLECTION_TYPES = "collection-types";
1724
+
1725
+ const routes = [
1726
+ {
1727
+ path: ":collectionType/:slug/:id/history",
1728
+ lazy: async () => {
1729
+ const { ProtectedHistoryPage } = await Promise.resolve().then(() => require('./History-eZH2Aqa1.js'));
1730
+ return {
1731
+ Component: ProtectedHistoryPage
1732
+ };
1733
+ }
1734
+ },
1735
+ {
1736
+ path: ":collectionType/:slug/history",
1737
+ lazy: async () => {
1738
+ const { ProtectedHistoryPage } = await Promise.resolve().then(() => require('./History-eZH2Aqa1.js'));
1739
+ return {
1740
+ Component: ProtectedHistoryPage
1741
+ };
1742
+ }
1743
+ }
1744
+ ];
1745
+ function useIsHistoryRoute() {
1746
+ const location = reactRouterDom.useLocation();
1747
+ const historyRoutes = routes.map((route) => ({ path: `content-manager/${route.path}` }));
1748
+ const matches = reactRouterDom.matchRoutes(historyRoutes, location);
1749
+ return Boolean(matches);
1750
+ }
1751
+
1752
+ const useQueryParams = (initialParams) => {
1753
+ const { search } = reactRouterDom.useLocation();
1754
+ const navigate = reactRouterDom.useNavigate();
1755
+ const query = React.useMemo(() => {
1756
+ const searchQuery = search.startsWith("?") ? search.slice(1) : search;
1757
+ if (!search && initialParams) {
1758
+ return initialParams;
1759
+ }
1760
+ return { ...initialParams, ...qs.parse(searchQuery) };
1761
+ }, [search, initialParams]);
1762
+ const setQuery = React.useCallback(
1763
+ (nextParams, method = "push", replace = false) => {
1764
+ let nextQuery = { ...query };
1765
+ if (method === "remove") {
1766
+ Object.keys(nextParams).forEach((key) => {
1767
+ if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {
1768
+ delete nextQuery[key];
1769
+ }
1770
+ });
1771
+ } else {
1772
+ nextQuery = { ...query, ...nextParams };
1773
+ }
1774
+ navigate({ search: qs.stringify(nextQuery, { encode: false }) }, { replace });
1775
+ },
1776
+ [navigate, query]
1777
+ );
1778
+ return [{ query, rawQuery: search }, setQuery];
1779
+ };
1780
+
1781
+ const extractValuesFromYupError = (errorType, errorParams) => {
1782
+ if (!errorType || !errorParams) {
1783
+ return {};
1784
+ }
1785
+ return {
1786
+ [errorType]: errorParams[errorType]
1787
+ };
1788
+ };
1789
+ const getYupInnerErrors = (error) => (error?.inner || []).reduce((acc, currentError) => {
1790
+ if (currentError.path) {
1791
+ acc[currentError.path.split("[").join(".").split("]").join("")] = {
1792
+ id: currentError.message,
1793
+ defaultMessage: currentError.message,
1794
+ values: extractValuesFromYupError(currentError?.type, currentError?.params)
1795
+ };
1796
+ }
1797
+ return acc;
1798
+ }, {});
1799
+
1800
+ const contentManagerApi = react.createApi({
1801
+ reducerPath: "contentManagerApi",
1802
+ baseQuery: axiosBaseQuery(),
1803
+ tagTypes: [
1804
+ "ComponentConfiguration",
1805
+ "ContentTypesConfiguration",
1806
+ "ContentTypeSettings",
1807
+ "Document",
1808
+ "InitialData",
1809
+ "HistoryVersion",
1810
+ "Relations"
1811
+ ],
1812
+ endpoints: () => ({})
1813
+ });
1814
+
1815
+ const documentApi = contentManagerApi.injectEndpoints({
1816
+ endpoints: (builder) => ({
1817
+ autoCloneDocument: builder.mutation({
1818
+ query: ({ model, sourceId, query }) => ({
1819
+ url: `/content-manager/collection-types/${model}/auto-clone/${sourceId}`,
1820
+ method: "POST",
1821
+ config: {
1822
+ params: query
1823
+ }
1824
+ }),
1825
+ invalidatesTags: (_result, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
1826
+ }),
1827
+ cloneDocument: builder.mutation({
1828
+ query: ({ model, sourceId, data, params }) => ({
1829
+ url: `/content-manager/collection-types/${model}/clone/${sourceId}`,
1830
+ method: "POST",
1831
+ data,
1832
+ config: {
1833
+ params
1834
+ }
1835
+ }),
1836
+ invalidatesTags: (_result, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
1837
+ }),
1838
+ /**
1839
+ * Creates a new collection-type document. This should ONLY be used for collection-types.
1840
+ * single-types should always be using `updateDocument` since they always exist.
1841
+ */
1842
+ createDocument: builder.mutation({
1843
+ query: ({ model, data, params }) => ({
1844
+ url: `/content-manager/collection-types/${model}`,
1845
+ method: "POST",
1846
+ data,
1847
+ config: {
1848
+ params
1849
+ }
1850
+ }),
1851
+ invalidatesTags: (result, _error, { model }) => [
1852
+ { type: "Document", id: `${model}_LIST` },
1853
+ "Relations"
1854
+ ]
1855
+ }),
1856
+ deleteDocument: builder.mutation({
1857
+ query: ({ collectionType, model, documentId, params }) => ({
1858
+ url: `/content-manager/${collectionType}/${model}${collectionType !== SINGLE_TYPES && documentId ? `/${documentId}` : ""}`,
1859
+ method: "DELETE",
1860
+ config: {
1861
+ params
1862
+ }
1863
+ }),
1864
+ invalidatesTags: (_result, _error, { collectionType, model }) => [
1865
+ { type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model }
1866
+ ]
1867
+ }),
1868
+ deleteManyDocuments: builder.mutation({
1869
+ query: ({ model, ...body }) => ({
1870
+ url: `/content-manager/collection-types/${model}/actions/bulkDelete`,
1871
+ method: "POST",
1872
+ data: body
1873
+ }),
1874
+ invalidatesTags: (_res, _error, { model, documentIds }) => documentIds.map((id) => ({ type: "Document", id: `${model}_${id}` }))
1875
+ }),
1876
+ discardDocument: builder.mutation({
1877
+ query: ({ collectionType, model, documentId, params }) => ({
1878
+ url: documentId ? `/content-manager/${collectionType}/${model}/${documentId}/actions/discard` : `/content-manager/${collectionType}/${model}/actions/discard`,
1879
+ method: "POST",
1880
+ config: {
1881
+ params
1882
+ }
1883
+ }),
1884
+ invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {
1885
+ return [
1886
+ {
1887
+ type: "Document",
1888
+ id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
1889
+ },
1890
+ { type: "Document", id: `${model}_LIST` },
1891
+ "Relations"
1892
+ ];
1893
+ }
1894
+ }),
1895
+ /**
1896
+ * Gets all documents of a collection type or single type.
1897
+ * By passing different params you can get different results e.g. only published documents or 'es' documents.
1898
+ */
1899
+ getAllDocuments: builder.query({
1900
+ query: ({ model, params }) => ({
1901
+ url: `/content-manager/collection-types/${model}`,
1902
+ method: "GET",
1903
+ config: {
1904
+ params
1905
+ }
1906
+ }),
1907
+ providesTags: (result, _error, arg) => {
1908
+ return [
1909
+ { type: "Document", id: `${arg.model}_LIST` },
1910
+ ...result?.results.map(({ documentId }) => ({
1911
+ type: "Document",
1912
+ id: `${arg.model}_${documentId}`
1913
+ })) ?? []
1914
+ ];
1915
+ }
1916
+ }),
1917
+ getDraftRelationCount: builder.query({
1918
+ query: ({ collectionType, model, documentId, params }) => ({
1919
+ url: documentId ? `/content-manager/${collectionType}/${model}/${documentId}/actions/countDraftRelations` : `/content-manager/${collectionType}/${model}/actions/countDraftRelations`,
1920
+ method: "GET",
1921
+ config: {
1922
+ params
1923
+ }
1924
+ })
1925
+ }),
1926
+ getDocument: builder.query({
1927
+ // @ts-expect-error – TODO: fix ts error where data unknown doesn't work with response via an assertion?
1928
+ queryFn: async ({ collectionType, model, documentId, params }, _api, _extraOpts, baseQuery) => {
1929
+ const res = await baseQuery({
1930
+ url: `/content-manager/${collectionType}/${model}${documentId ? `/${documentId}` : ""}`,
1931
+ method: "GET",
1932
+ config: {
1933
+ params
1934
+ }
1935
+ });
1936
+ if (res.error && res.error.name === "NotFoundError" && collectionType === SINGLE_TYPES) {
1937
+ return { data: { document: void 0 }, error: void 0 };
1938
+ }
1939
+ return res;
1940
+ },
1941
+ providesTags: (result, _error, { collectionType, model, documentId }) => {
1942
+ return [
1943
+ // we prefer the result's id because we don't fetch single-types with an ID.
1944
+ {
1945
+ type: "Document",
1946
+ id: collectionType !== SINGLE_TYPES ? `${model}_${result && "documentId" in result ? result.documentId : documentId}` : model
1947
+ }
1948
+ ];
1949
+ }
1950
+ }),
1951
+ getManyDraftRelationCount: builder.query({
1952
+ query: ({ model, ...params }) => ({
1953
+ url: `/content-manager/collection-types/${model}/actions/countManyEntriesDraftRelations`,
1954
+ method: "GET",
1955
+ config: {
1956
+ params
1957
+ }
1958
+ }),
1959
+ transformResponse: (response) => response.data
1960
+ }),
1961
+ /**
1962
+ * This endpoint will either create or update documents at the same time as publishing.
1963
+ */
1964
+ publishDocument: builder.mutation({
1965
+ query: ({ collectionType, model, documentId, params, data }) => ({
1966
+ url: documentId ? `/content-manager/${collectionType}/${model}/${documentId}/actions/publish` : `/content-manager/${collectionType}/${model}/actions/publish`,
1967
+ method: "POST",
1968
+ data,
1969
+ config: {
1970
+ params
1971
+ }
1972
+ }),
1973
+ invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {
1974
+ return [
1975
+ {
1976
+ type: "Document",
1977
+ id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
1978
+ },
1979
+ { type: "Document", id: `${model}_LIST` },
1980
+ "Relations"
1981
+ ];
1982
+ }
1983
+ }),
1984
+ publishManyDocuments: builder.mutation({
1985
+ query: ({ model, ...body }) => ({
1986
+ url: `/content-manager/collection-types/${model}/actions/bulkPublish`,
1987
+ method: "POST",
1988
+ data: body
1989
+ }),
1990
+ invalidatesTags: (_res, _error, { model, documentIds }) => documentIds.map((id) => ({ type: "Document", id: `${model}_${id}` }))
1991
+ }),
1992
+ updateDocument: builder.mutation({
1993
+ query: ({ collectionType, model, documentId, data, params }) => ({
1994
+ url: `/content-manager/${collectionType}/${model}${documentId ? `/${documentId}` : ""}`,
1995
+ method: "PUT",
1996
+ data,
1997
+ config: {
1998
+ params
1999
+ }
2000
+ }),
2001
+ invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {
2002
+ return [
2003
+ {
2004
+ type: "Document",
2005
+ id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
2006
+ },
2007
+ "Relations"
2008
+ ];
2009
+ }
2010
+ }),
2011
+ unpublishDocument: builder.mutation({
2012
+ query: ({ collectionType, model, documentId, params, data }) => ({
2013
+ url: documentId ? `/content-manager/${collectionType}/${model}/${documentId}/actions/unpublish` : `/content-manager/${collectionType}/${model}/actions/unpublish`,
2014
+ method: "POST",
2015
+ data,
2016
+ config: {
2017
+ params
2018
+ }
2019
+ }),
2020
+ invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {
2021
+ return [
2022
+ {
2023
+ type: "Document",
2024
+ id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
2025
+ }
2026
+ ];
2027
+ }
2028
+ }),
2029
+ unpublishManyDocuments: builder.mutation({
2030
+ query: ({ model, ...body }) => ({
2031
+ url: `/content-manager/collection-types/${model}/actions/bulkUnpublish`,
2032
+ method: "POST",
2033
+ data: body
2034
+ }),
2035
+ invalidatesTags: (_res, _error, { model, documentIds }) => documentIds.map((id) => ({ type: "Document", id: `${model}_${id}` }))
2036
+ })
2037
+ })
2038
+ });
2039
+ const {
2040
+ useAutoCloneDocumentMutation,
2041
+ useCloneDocumentMutation,
2042
+ useCreateDocumentMutation,
2043
+ useDeleteDocumentMutation,
2044
+ useDeleteManyDocumentsMutation,
2045
+ useDiscardDocumentMutation,
2046
+ useGetAllDocumentsQuery,
2047
+ useLazyGetDocumentQuery,
2048
+ useGetDocumentQuery,
2049
+ useLazyGetDraftRelationCountQuery,
2050
+ useGetManyDraftRelationCountQuery,
2051
+ usePublishDocumentMutation,
2052
+ usePublishManyDocumentsMutation,
2053
+ useUpdateDocumentMutation,
2054
+ useUnpublishDocumentMutation,
2055
+ useUnpublishManyDocumentsMutation
2056
+ } = documentApi;
2057
+
2058
+ const buildValidParams = (query) => {
2059
+ if (!query)
2060
+ return query;
2061
+ const { plugins: _, ...validQueryParams } = {
2062
+ ...query,
2063
+ ...Object.values(query?.plugins ?? {}).reduce(
2064
+ (acc, current) => Object.assign(acc, current),
2065
+ {}
2066
+ )
2067
+ };
2068
+ if ("_q" in validQueryParams) {
2069
+ validQueryParams._q = encodeURIComponent(validQueryParams._q);
2070
+ }
2071
+ return validQueryParams;
2072
+ };
2073
+
2074
+ const errorsTrads = {
2075
+ email: {
2076
+ id: "components.Input.error.validation.email",
2077
+ defaultMessage: "This is not a valid email."
2078
+ },
2079
+ json: {
2080
+ id: "components.Input.error.validation.json",
2081
+ defaultMessage: "This doesn't match the JSON format"
2082
+ },
2083
+ lowercase: {
2084
+ id: "components.Input.error.validation.lowercase",
2085
+ defaultMessage: "The value must be a lowercase string"
2086
+ },
2087
+ max: {
2088
+ id: "components.Input.error.validation.max",
2089
+ defaultMessage: "The value is too high (max: {max})."
2090
+ },
2091
+ maxLength: {
2092
+ id: "components.Input.error.validation.maxLength",
2093
+ defaultMessage: "The value is too long (max: {max})."
2094
+ },
2095
+ min: {
2096
+ id: "components.Input.error.validation.min",
2097
+ defaultMessage: "The value is too low (min: {min})."
2098
+ },
2099
+ minLength: {
2100
+ id: "components.Input.error.validation.minLength",
2101
+ defaultMessage: "The value is too short (min: {min})."
2102
+ },
2103
+ regex: {
2104
+ id: "components.Input.error.validation.regex",
2105
+ defaultMessage: "The value does not match the regex."
2106
+ },
2107
+ required: {
2108
+ id: "components.Input.error.validation.required",
2109
+ defaultMessage: "This value is required."
2110
+ },
2111
+ string: {
2112
+ id: "components.Input.error.validation.string",
2113
+ defaultMessage: "This is not a valid string."
2114
+ },
2115
+ unique: {
2116
+ id: "components.Input.error.validation.unique",
2117
+ defaultMessage: "This value is already used."
2118
+ },
2119
+ integer: {
2120
+ id: "component.Input.error.validation.integer",
2121
+ defaultMessage: "The value must be an integer"
2122
+ }
2123
+ };
2124
+
2125
+ const ID = "id";
2126
+ const CREATED_BY_ATTRIBUTE_NAME = "createdBy";
2127
+ const UPDATED_BY_ATTRIBUTE_NAME = "updatedBy";
2128
+ const CREATOR_FIELDS = [CREATED_BY_ATTRIBUTE_NAME, UPDATED_BY_ATTRIBUTE_NAME];
2129
+ const PUBLISHED_BY_ATTRIBUTE_NAME = "publishedBy";
2130
+ const CREATED_AT_ATTRIBUTE_NAME = "createdAt";
2131
+ const UPDATED_AT_ATTRIBUTE_NAME = "updatedAt";
2132
+ const PUBLISHED_AT_ATTRIBUTE_NAME = "publishedAt";
2133
+ const DOCUMENT_META_FIELDS = [
2134
+ ID,
2135
+ ...CREATOR_FIELDS,
2136
+ PUBLISHED_BY_ATTRIBUTE_NAME,
2137
+ CREATED_AT_ATTRIBUTE_NAME,
2138
+ UPDATED_AT_ATTRIBUTE_NAME,
2139
+ PUBLISHED_AT_ATTRIBUTE_NAME
2140
+ ];
2141
+ const ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD = [
2142
+ "dynamiczone",
2143
+ "json",
2144
+ "text",
2145
+ "relation",
2146
+ "component",
2147
+ "boolean",
2148
+ "media",
2149
+ "password",
2150
+ "richtext",
2151
+ "timestamp",
2152
+ "blocks"
2153
+ ];
2154
+
2155
+ const createYupSchema = (attributes = {}, components = {}) => {
2156
+ const createModelSchema = (attributes2) => yup__namespace.object().shape(
2157
+ Object.entries(attributes2).reduce((acc, [name, attribute]) => {
2158
+ if (DOCUMENT_META_FIELDS.includes(name)) {
2159
+ return acc;
2160
+ }
2161
+ const validations = [
2162
+ addRequiredValidation,
2163
+ addMinLengthValidation,
2164
+ addMaxLengthValidation,
2165
+ addMinValidation,
2166
+ addMaxValidation,
2167
+ addRegexValidation
2168
+ ].map((fn) => fn(attribute));
2169
+ const transformSchema = pipe__default.default(...validations);
2170
+ switch (attribute.type) {
2171
+ case "component": {
2172
+ const { attributes: attributes3 } = components[attribute.component];
2173
+ if (attribute.repeatable) {
2174
+ return {
2175
+ ...acc,
2176
+ [name]: transformSchema(
2177
+ yup__namespace.array().of(createModelSchema(attributes3).nullable(false))
2178
+ )
2179
+ };
2180
+ } else {
2181
+ return {
2182
+ ...acc,
2183
+ [name]: transformSchema(createModelSchema(attributes3))
2184
+ };
2185
+ }
2186
+ }
2187
+ case "dynamiczone":
2188
+ return {
2189
+ ...acc,
2190
+ [name]: transformSchema(
2191
+ yup__namespace.array().of(
2192
+ yup__namespace.lazy((data) => {
2193
+ const { attributes: attributes3 } = components[data.__component];
2194
+ return yup__namespace.object().shape({
2195
+ __component: yup__namespace.string().required().oneOf(Object.keys(components))
2196
+ }).nullable(false).concat(createModelSchema(attributes3));
2197
+ })
2198
+ )
2199
+ )
2200
+ };
2201
+ case "relation":
2202
+ return {
2203
+ ...acc,
2204
+ [name]: transformSchema(
2205
+ yup__namespace.array().of(
2206
+ yup__namespace.object().shape({
2207
+ id: yup__namespace.string().required()
2208
+ })
2209
+ )
2210
+ )
2211
+ };
2212
+ default:
2213
+ return {
2214
+ ...acc,
2215
+ [name]: transformSchema(createAttributeSchema(attribute))
2216
+ };
2217
+ }
2218
+ }, {})
2219
+ ).default(null);
2220
+ return createModelSchema(attributes);
2221
+ };
2222
+ const createAttributeSchema = (attribute) => {
2223
+ switch (attribute.type) {
2224
+ case "biginteger":
2225
+ return yup__namespace.string().matches(/^-?\d*$/);
2226
+ case "boolean":
2227
+ return yup__namespace.boolean();
2228
+ case "blocks":
2229
+ return yup__namespace.mixed().test("isBlocks", errorsTrads.json, (value) => {
2230
+ if (!value || Array.isArray(value)) {
2231
+ return true;
2232
+ } else {
2233
+ return false;
2234
+ }
2235
+ });
2236
+ case "decimal":
2237
+ case "float":
2238
+ case "integer":
2239
+ return yup__namespace.number();
2240
+ case "email":
2241
+ return yup__namespace.string().email(errorsTrads.email);
2242
+ case "enumeration":
2243
+ return yup__namespace.string().oneOf([...attribute.enum, null]);
2244
+ case "json":
2245
+ return yup__namespace.mixed().test("isJSON", errorsTrads.json, (value) => {
2246
+ if (!value || typeof value === "string" && value.length === 0) {
2247
+ return true;
2248
+ }
2249
+ try {
2250
+ JSON.parse(value);
2251
+ return true;
2252
+ } catch (err) {
2253
+ return false;
2254
+ }
2255
+ });
2256
+ case "password":
2257
+ case "richtext":
2258
+ case "string":
2259
+ case "text":
2260
+ return yup__namespace.string();
2261
+ case "uid":
2262
+ return yup__namespace.string().matches(/^[A-Za-z0-9-_.~]*$/);
2263
+ default:
2264
+ return yup__namespace.mixed();
2265
+ }
2266
+ };
2267
+ const addRequiredValidation = (attribute) => (schema) => {
2268
+ if (attribute.required) {
2269
+ return schema.required({
2270
+ id: errorsTrads.required.id,
2271
+ defaultMessage: "This field is required."
2272
+ });
2273
+ }
2274
+ return schema.nullable();
2275
+ };
2276
+ const addMinLengthValidation = (attribute) => (schema) => {
2277
+ if ("minLength" in attribute && attribute.minLength && Number.isInteger(attribute.minLength) && "min" in schema) {
2278
+ return schema.min(attribute.minLength, {
2279
+ ...errorsTrads.minLength,
2280
+ values: {
2281
+ min: attribute.minLength
2282
+ }
2283
+ });
2284
+ }
2285
+ return schema;
2286
+ };
2287
+ const addMaxLengthValidation = (attribute) => (schema) => {
2288
+ if ("maxLength" in attribute && attribute.maxLength && Number.isInteger(attribute.maxLength) && "max" in schema) {
2289
+ return schema.max(attribute.maxLength, {
2290
+ ...errorsTrads.maxLength,
2291
+ values: {
2292
+ max: attribute.maxLength
2293
+ }
2294
+ });
2295
+ }
2296
+ return schema;
2297
+ };
2298
+ const addMinValidation = (attribute) => (schema) => {
2299
+ if ("min" in attribute) {
2300
+ const min = toInteger(attribute.min);
2301
+ if ("min" in schema && min) {
2302
+ return schema.min(min, {
2303
+ ...errorsTrads.min,
2304
+ values: {
2305
+ min
2306
+ }
2307
+ });
2308
+ }
2309
+ }
2310
+ return schema;
2311
+ };
2312
+ const addMaxValidation = (attribute) => (schema) => {
2313
+ if ("max" in attribute) {
2314
+ const max = toInteger(attribute.max);
2315
+ if ("max" in schema && max) {
2316
+ return schema.max(max, {
2317
+ ...errorsTrads.max,
2318
+ values: {
2319
+ max
2320
+ }
2321
+ });
2322
+ }
2323
+ }
2324
+ return schema;
2325
+ };
2326
+ const toInteger = (val) => {
2327
+ if (typeof val === "number" || val === void 0) {
2328
+ return val;
2329
+ } else {
2330
+ const num = Number(val);
2331
+ return isNaN(num) ? void 0 : num;
2332
+ }
2333
+ };
2334
+ const addRegexValidation = (attribute) => (schema) => {
2335
+ if ("regex" in attribute && attribute.regex && "matches" in schema) {
2336
+ return schema.matches(new RegExp(attribute.regex), {
2337
+ message: {
2338
+ id: errorsTrads.regex.id,
2339
+ defaultMessage: "The value does not match the defined pattern."
2340
+ },
2341
+ excludeEmptyString: !attribute.required
2342
+ });
2343
+ }
2344
+ return schema;
2345
+ };
2346
+
2347
+ const initApi = contentManagerApi.injectEndpoints({
2348
+ endpoints: (builder) => ({
2349
+ getInitialData: builder.query({
2350
+ query: () => "/content-manager/init",
2351
+ transformResponse: (response) => response.data,
2352
+ providesTags: ["InitialData"]
2353
+ })
2354
+ })
2355
+ });
2356
+ const { useGetInitialDataQuery } = initApi;
2357
+
2358
+ const useContentTypeSchema = (model) => {
2359
+ const { toggleNotification } = useNotification();
2360
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
2361
+ const { components, contentType, contentTypes, error, isLoading, isFetching } = useGetInitialDataQuery(void 0, {
2362
+ selectFromResult: (res) => {
2363
+ const contentType2 = res.data?.contentTypes.find((ct) => ct.uid === model);
2364
+ const componentsByKey = res.data?.components.reduce(
2365
+ (acc, component) => {
2366
+ acc[component.uid] = component;
2367
+ return acc;
2368
+ },
2369
+ {}
2370
+ );
2371
+ const components2 = extractContentTypeComponents(contentType2?.attributes, componentsByKey);
2372
+ return {
2373
+ isLoading: res.isLoading,
2374
+ isFetching: res.isFetching,
2375
+ error: res.error,
2376
+ components: Object.keys(components2).length === 0 ? void 0 : components2,
2377
+ contentType: contentType2,
2378
+ contentTypes: res.data?.contentTypes ?? []
2379
+ };
2380
+ }
2381
+ });
2382
+ React__namespace.useEffect(() => {
2383
+ if (error) {
2384
+ toggleNotification({
2385
+ type: "danger",
2386
+ message: formatAPIError(error)
2387
+ });
2388
+ }
2389
+ }, [toggleNotification, error, formatAPIError]);
2390
+ return {
2391
+ // This must be memoized to avoid inifiinite re-renders where the empty object is different everytime.
2392
+ components: React__namespace.useMemo(() => components ?? {}, [components]),
2393
+ schema: contentType,
2394
+ schemas: contentTypes,
2395
+ isLoading: isLoading || isFetching
2396
+ };
2397
+ };
2398
+ const extractContentTypeComponents = (attributes = {}, allComponents = {}) => {
2399
+ const getComponents = (attributes2) => {
2400
+ return attributes2.reduce((acc, attribute) => {
2401
+ if (attribute.type === "component") {
2402
+ const componentAttributes = Object.values(
2403
+ allComponents[attribute.component]?.attributes ?? {}
2404
+ );
2405
+ acc.push(attribute.component, ...getComponents(componentAttributes));
2406
+ } else if (attribute.type === "dynamiczone") {
2407
+ acc.push(
2408
+ ...attribute.components,
2409
+ ...attribute.components.flatMap((componentUid) => {
2410
+ const componentAttributes = Object.values(
2411
+ allComponents[componentUid]?.attributes ?? {}
2412
+ );
2413
+ return getComponents(componentAttributes);
2414
+ })
2415
+ );
2416
+ }
2417
+ return acc;
2418
+ }, []);
2419
+ };
2420
+ const componentUids = getComponents(Object.values(attributes));
2421
+ const uniqueComponentUids = [...new Set(componentUids)];
2422
+ const componentsByKey = uniqueComponentUids.reduce((acc, uid) => {
2423
+ acc[uid] = allComponents[uid];
2424
+ return acc;
2425
+ }, {});
2426
+ return componentsByKey;
2427
+ };
2428
+
2429
+ const useDocument = (args, opts) => {
2430
+ const { toggleNotification } = useNotification();
2431
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
2432
+ const {
2433
+ currentData: data,
2434
+ isLoading: isLoadingDocument,
2435
+ isFetching: isFetchingDocument,
2436
+ error
2437
+ } = useGetDocumentQuery(args, opts);
2438
+ const { components, schema, isLoading: isLoadingSchema } = useContentTypeSchema(args.model);
2439
+ React__namespace.useEffect(() => {
2440
+ if (error) {
2441
+ toggleNotification({
2442
+ type: "danger",
2443
+ message: formatAPIError(error)
2444
+ });
2445
+ }
2446
+ }, [toggleNotification, error, formatAPIError, args.collectionType]);
2447
+ const validationSchema = React__namespace.useMemo(() => {
2448
+ if (!schema) {
2449
+ return null;
2450
+ }
2451
+ return createYupSchema(schema.attributes, components);
2452
+ }, [schema, components]);
2453
+ const validate = React__namespace.useCallback(
2454
+ (document) => {
2455
+ if (!validationSchema) {
2456
+ throw new Error(
2457
+ "There is no validation schema generated, this is likely due to the schema not being loaded yet."
2458
+ );
2459
+ }
2460
+ try {
2461
+ validationSchema.validateSync(document, { abortEarly: false, strict: true });
2462
+ return null;
2463
+ } catch (error2) {
2464
+ if (error2 instanceof yup.ValidationError) {
2465
+ return getYupInnerErrors(error2);
2466
+ }
2467
+ throw error2;
2468
+ }
2469
+ },
2470
+ [validationSchema]
2471
+ );
2472
+ const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;
2473
+ return {
2474
+ components,
2475
+ document: data?.data,
2476
+ meta: data?.meta,
2477
+ isLoading,
2478
+ schema,
2479
+ validate
2480
+ };
2481
+ };
2482
+ const useDoc = () => {
2483
+ const { id, slug, collectionType, origin } = reactRouterDom.useParams();
2484
+ const [{ query }] = useQueryParams();
2485
+ const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
2486
+ if (!collectionType) {
2487
+ throw new Error("Could not find collectionType in url params");
2488
+ }
2489
+ if (!slug) {
2490
+ throw new Error("Could not find model in url params");
2491
+ }
2492
+ return {
2493
+ collectionType,
2494
+ model: slug,
2495
+ id: origin || id === "create" ? void 0 : id,
2496
+ ...useDocument(
2497
+ { documentId: origin || id, model: slug, collectionType, params },
2498
+ {
2499
+ skip: id === "create" || !origin && !id && collectionType !== SINGLE_TYPES
2500
+ }
2501
+ )
2502
+ };
2503
+ };
2504
+
2505
+ function getIn(obj, key, def, pathStartIndex = 0) {
2506
+ const path = toPath__default.default(key);
2507
+ while (obj && pathStartIndex < path.length) {
2508
+ obj = obj[path[pathStartIndex++]];
2509
+ }
2510
+ if (pathStartIndex !== path.length && !obj) {
2511
+ return def;
2512
+ }
2513
+ return obj === void 0 ? def : obj;
2514
+ }
2515
+ const isObject = (obj) => obj !== null && typeof obj === "object" && !Array.isArray(obj);
2516
+ const isInteger = (obj) => String(Math.floor(Number(obj))) === obj;
2517
+ function setIn(obj, path, value) {
2518
+ const res = clone__default.default(obj);
2519
+ let resVal = res;
2520
+ let i = 0;
2521
+ const pathArray = toPath__default.default(path);
2522
+ for (; i < pathArray.length - 1; i++) {
2523
+ const currentPath = pathArray[i];
2524
+ const currentObj = getIn(obj, pathArray.slice(0, i + 1));
2525
+ if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {
2526
+ resVal = resVal[currentPath] = clone__default.default(currentObj);
2527
+ } else {
2528
+ const nextPath = pathArray[i + 1];
2529
+ resVal = resVal[currentPath] = isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};
2530
+ }
2531
+ }
2532
+ if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {
2533
+ return obj;
2534
+ }
2535
+ if (value === void 0) {
2536
+ delete resVal[pathArray[i]];
2537
+ } else {
2538
+ resVal[pathArray[i]] = value;
2539
+ }
2540
+ if (i === 0 && value === void 0) {
2541
+ delete res[pathArray[i]];
2542
+ }
2543
+ return res;
2544
+ }
2545
+
2546
+ const ERR_MSG = "The Form Component has not been initialised, ensure you are using this hook within a Form component";
2547
+ const [FormProvider, useForm] = createContext("Form", {
2548
+ disabled: false,
2549
+ errors: {},
2550
+ initialValues: {},
2551
+ isSubmitting: false,
2552
+ modified: false,
2553
+ addFieldRow: () => {
2554
+ throw new Error(ERR_MSG);
2555
+ },
2556
+ moveFieldRow: () => {
2557
+ throw new Error(ERR_MSG);
2558
+ },
2559
+ onChange: () => {
2560
+ throw new Error(ERR_MSG);
2561
+ },
2562
+ removeFieldRow: () => {
2563
+ throw new Error(ERR_MSG);
2564
+ },
2565
+ resetForm: () => {
2566
+ throw new Error(ERR_MSG);
2567
+ },
2568
+ setErrors: () => {
2569
+ throw new Error(ERR_MSG);
2570
+ },
2571
+ setValues: () => {
2572
+ throw new Error(ERR_MSG);
2573
+ },
2574
+ setSubmitting: () => {
2575
+ throw new Error(ERR_MSG);
2576
+ },
2577
+ validate: async () => {
2578
+ throw new Error(ERR_MSG);
2579
+ },
2580
+ values: {}
2581
+ });
2582
+ const Form = React__namespace.forwardRef(
2583
+ ({ disabled = false, method, onSubmit, ...props }, ref) => {
2584
+ const formRef = React__namespace.useRef(null);
2585
+ const initialValues = React__namespace.useRef(props.initialValues ?? {});
2586
+ const [state, dispatch] = React__namespace.useReducer(reducer$3, {
2587
+ errors: {},
2588
+ isSubmitting: false,
2589
+ values: props.initialValues ?? {}
2590
+ });
2591
+ React__namespace.useEffect(() => {
2592
+ if (!isEqual__default.default(initialValues.current, props.initialValues)) {
2593
+ initialValues.current = props.initialValues ?? {};
2594
+ dispatch({
2595
+ type: "SET_INITIAL_VALUES",
2596
+ payload: props.initialValues ?? {}
2597
+ });
2598
+ }
2599
+ }, [props.initialValues]);
2600
+ const setErrors = React__namespace.useCallback((errors) => {
2601
+ dispatch({
2602
+ type: "SET_ERRORS",
2603
+ payload: errors
2604
+ });
2605
+ }, []);
2606
+ const setValues = React__namespace.useCallback((values) => {
2607
+ dispatch({
2608
+ type: "SET_VALUES",
2609
+ payload: values
2610
+ });
2611
+ }, []);
2612
+ React__namespace.useEffect(() => {
2613
+ if (Object.keys(state.errors).length === 0)
2614
+ return;
2615
+ const ref2 = setTimeout(() => {
2616
+ const [firstError] = formRef.current.querySelectorAll("[data-strapi-field-error]");
2617
+ if (firstError) {
2618
+ const errorId = firstError.getAttribute("id");
2619
+ const formElementInError = formRef.current.querySelector(
2620
+ `[aria-describedby="${errorId}"]`
2621
+ );
2622
+ if (formElementInError && formElementInError instanceof HTMLElement) {
2623
+ formElementInError.focus();
2624
+ }
2625
+ }
2626
+ });
2627
+ return () => clearTimeout(ref2);
2628
+ }, [state.errors]);
2629
+ const validate = React__namespace.useCallback(
2630
+ async (shouldSetErrors = true) => {
2631
+ setErrors({});
2632
+ if (!props.validationSchema) {
2633
+ return { data: state.values };
2634
+ }
2635
+ try {
2636
+ const data = await props.validationSchema.validate(state.values, { abortEarly: false });
2637
+ return { data };
2638
+ } catch (err) {
2639
+ if (isErrorYupValidationError(err)) {
2640
+ let errors = {};
2641
+ if (err.inner) {
2642
+ if (err.inner.length === 0) {
2643
+ return setIn(errors, err.path, err.message);
2644
+ }
2645
+ for (const error of err.inner) {
2646
+ if (!getIn(errors, error.path)) {
2647
+ errors = setIn(errors, error.path, error.message);
2648
+ }
2649
+ }
2650
+ }
2651
+ if (shouldSetErrors) {
2652
+ setErrors(errors);
2653
+ }
2654
+ return { errors };
2655
+ } else {
2656
+ if (process.env.NODE_ENV !== "production") {
2657
+ console.warn(
2658
+ `Warning: An unhandled error was caught during validation in <Formik validationSchema />`,
2659
+ err
2660
+ );
2661
+ }
2662
+ throw err;
2663
+ }
2664
+ }
2665
+ },
2666
+ [props, setErrors, state.values]
2667
+ );
2668
+ const handleSubmit = async (e) => {
2669
+ e.stopPropagation();
2670
+ e.preventDefault();
2671
+ if (!onSubmit) {
2672
+ return;
2673
+ }
2674
+ dispatch({
2675
+ type: "SUBMIT_ATTEMPT"
2676
+ });
2677
+ try {
2678
+ const { data, errors } = await validate();
2679
+ if (errors) {
2680
+ setErrors(errors);
2681
+ throw new Error("Submission failed");
2682
+ }
2683
+ await onSubmit(data, {
2684
+ setErrors,
2685
+ setValues,
2686
+ resetForm
2687
+ });
2688
+ dispatch({
2689
+ type: "SUBMIT_SUCCESS"
2690
+ });
2691
+ } catch (err) {
2692
+ dispatch({
2693
+ type: "SUBMIT_FAILURE"
2694
+ });
2695
+ if (err instanceof Error && err.message === "Submission failed") {
2696
+ return;
2697
+ }
2698
+ }
2699
+ };
2700
+ const modified = React__namespace.useMemo(
2701
+ () => !isEqual__default.default(initialValues.current, state.values),
2702
+ [state.values]
2703
+ );
2704
+ const handleChange = designSystem.useCallbackRef((eventOrPath, v) => {
2705
+ if (typeof eventOrPath === "string") {
2706
+ dispatch({
2707
+ type: "SET_FIELD_VALUE",
2708
+ payload: {
2709
+ field: eventOrPath,
2710
+ value: v
2711
+ }
2712
+ });
2713
+ return;
2714
+ }
2715
+ const target = eventOrPath.target || eventOrPath.currentTarget;
2716
+ const { type, name, id, value, options, multiple } = target;
2717
+ const field = name || id;
2718
+ if (!field && process.env.NODE_ENV !== "production") {
2719
+ console.warn(
2720
+ `\`onChange\` was called with an event, but you forgot to pass a \`name\` or \`id'\` attribute to your input. The field to update cannot be determined`
2721
+ );
2722
+ }
2723
+ let val;
2724
+ if (/number|range/.test(type)) {
2725
+ const parsed = parseFloat(value);
2726
+ val = isNaN(parsed) ? "" : parsed;
2727
+ } else if (/checkbox/.test(type)) {
2728
+ val = !getIn(state.values, field);
2729
+ } else if (options && multiple) {
2730
+ val = Array.from(options).filter((el) => el.selected).map((el) => el.value);
2731
+ } else {
2732
+ val = value;
2733
+ }
2734
+ if (field) {
2735
+ dispatch({
2736
+ type: "SET_FIELD_VALUE",
2737
+ payload: {
2738
+ field,
2739
+ value: val
2740
+ }
2741
+ });
2742
+ }
2743
+ });
2744
+ const addFieldRow = React__namespace.useCallback(
2745
+ (field, value, addAtIndex) => {
2746
+ dispatch({
2747
+ type: "ADD_FIELD_ROW",
2748
+ payload: {
2749
+ field,
2750
+ value,
2751
+ addAtIndex
2752
+ }
2753
+ });
2754
+ },
2755
+ []
2756
+ );
2757
+ const removeFieldRow = React__namespace.useCallback(
2758
+ (field, removeAtIndex) => {
2759
+ dispatch({
2760
+ type: "REMOVE_FIELD_ROW",
2761
+ payload: {
2762
+ field,
2763
+ removeAtIndex
2764
+ }
2765
+ });
2766
+ },
2767
+ []
2768
+ );
2769
+ const moveFieldRow = React__namespace.useCallback(
2770
+ (field, fromIndex, toIndex) => {
2771
+ dispatch({
2772
+ type: "MOVE_FIELD_ROW",
2773
+ payload: {
2774
+ field,
2775
+ fromIndex,
2776
+ toIndex
2777
+ }
2778
+ });
2779
+ },
2780
+ []
2781
+ );
2782
+ const resetForm = React__namespace.useCallback(() => {
2783
+ dispatch({
2784
+ type: "RESET_FORM",
2785
+ payload: {
2786
+ errors: {},
2787
+ isSubmitting: false,
2788
+ values: initialValues.current
2789
+ }
2790
+ });
2791
+ }, []);
2792
+ const setSubmitting = React__namespace.useCallback((isSubmitting) => {
2793
+ dispatch({ type: "SET_ISSUBMITTING", payload: isSubmitting });
2794
+ }, []);
2795
+ const composedRefs = designSystem.useComposedRefs(formRef, ref);
2796
+ return /* @__PURE__ */ jsxRuntime.jsx("form", { ref: composedRefs, method, noValidate: true, onSubmit: handleSubmit, children: /* @__PURE__ */ jsxRuntime.jsx(
2797
+ FormProvider,
2798
+ {
2799
+ disabled,
2800
+ onChange: handleChange,
2801
+ initialValues,
2802
+ modified,
2803
+ addFieldRow,
2804
+ moveFieldRow,
2805
+ removeFieldRow,
2806
+ resetForm,
2807
+ setErrors,
2808
+ setValues,
2809
+ setSubmitting,
2810
+ validate,
2811
+ ...state,
2812
+ children: typeof props.children === "function" ? props.children({
2813
+ modified,
2814
+ disabled,
2815
+ onChange: handleChange,
2816
+ ...state,
2817
+ resetForm
2818
+ }) : props.children
2819
+ }
2820
+ ) });
2821
+ }
2822
+ );
2823
+ const isErrorYupValidationError = (err) => typeof err === "object" && err !== null && "name" in err && typeof err.name === "string" && err.name === "ValidationError";
2824
+ const reducer$3 = (state, action) => immer.produce(state, (draft) => {
2825
+ switch (action.type) {
2826
+ case "SET_INITIAL_VALUES":
2827
+ draft.values = action.payload;
2828
+ break;
2829
+ case "SET_VALUES":
2830
+ draft.values = action.payload;
2831
+ break;
2832
+ case "SUBMIT_ATTEMPT":
2833
+ draft.isSubmitting = true;
2834
+ break;
2835
+ case "SUBMIT_FAILURE":
2836
+ draft.isSubmitting = false;
2837
+ break;
2838
+ case "SUBMIT_SUCCESS":
2839
+ draft.isSubmitting = false;
2840
+ break;
2841
+ case "SET_FIELD_VALUE":
2842
+ draft.values = setIn(state.values, action.payload.field, action.payload.value);
2843
+ break;
2844
+ case "ADD_FIELD_ROW": {
2845
+ const currentField = getIn(state.values, action.payload.field, []);
2846
+ let position = action.payload.addAtIndex;
2847
+ if (position === void 0) {
2848
+ position = currentField.length;
2849
+ } else if (position < 0) {
2850
+ position = 0;
2851
+ }
2852
+ const [key] = fractionalIndexing.generateNKeysBetween(
2853
+ currentField.at(position - 1)?.__temp_key__,
2854
+ currentField.at(position)?.__temp_key__,
2855
+ 1
2856
+ );
2857
+ draft.values = setIn(
2858
+ state.values,
2859
+ action.payload.field,
2860
+ setIn(currentField, position.toString(), { ...action.payload.value, __temp_key__: key })
2861
+ );
2862
+ break;
2863
+ }
2864
+ case "MOVE_FIELD_ROW": {
2865
+ const { field, fromIndex, toIndex } = action.payload;
2866
+ const currentField = [...getIn(state.values, field, [])];
2867
+ const currentRow = currentField[fromIndex];
2868
+ const startKey = fromIndex > toIndex ? currentField[toIndex - 1]?.__temp_key__ : currentField[toIndex]?.__temp_key__;
2869
+ const endKey = fromIndex > toIndex ? currentField[toIndex]?.__temp_key__ : currentField[toIndex + 1]?.__temp_key__;
2870
+ const [newKey] = fractionalIndexing.generateNKeysBetween(startKey, endKey, 1);
2871
+ currentField.splice(fromIndex, 1);
2872
+ currentField.splice(toIndex, 0, { ...currentRow, __temp_key__: newKey });
2873
+ draft.values = setIn(state.values, field, currentField);
2874
+ break;
2875
+ }
2876
+ case "REMOVE_FIELD_ROW": {
2877
+ const currentField = getIn(state.values, action.payload.field, []);
2878
+ let position = action.payload.removeAtIndex;
2879
+ if (position === void 0) {
2880
+ position = currentField.length - 1;
2881
+ } else if (position < 0) {
2882
+ position = 0;
2883
+ }
2884
+ const newValue = setIn(currentField, position.toString(), void 0).filter(
2885
+ (val) => val
2886
+ );
2887
+ draft.values = setIn(
2888
+ state.values,
2889
+ action.payload.field,
2890
+ newValue.length > 0 ? newValue : void 0
2891
+ );
2892
+ break;
2893
+ }
2894
+ case "SET_ERRORS":
2895
+ if (!isEqual__default.default(state.errors, action.payload)) {
2896
+ draft.errors = action.payload;
2897
+ }
2898
+ break;
2899
+ case "SET_ISSUBMITTING":
2900
+ draft.isSubmitting = action.payload;
2901
+ break;
2902
+ case "RESET_FORM":
2903
+ draft.values = action.payload.values;
2904
+ draft.errors = action.payload.errors;
2905
+ draft.isSubmitting = action.payload.isSubmitting;
2906
+ break;
2907
+ }
2908
+ });
2909
+ const useField = (path) => {
2910
+ const { formatMessage } = reactIntl.useIntl();
2911
+ const initialValue = useForm(
2912
+ "useField",
2913
+ (state) => getIn(state.initialValues, path)
2914
+ );
2915
+ const value = useForm(
2916
+ "useField",
2917
+ (state) => getIn(state.values, path)
2918
+ );
2919
+ const handleChange = useForm("useField", (state) => state.onChange);
2920
+ const error = useForm("useField", (state) => getIn(state.errors, path));
2921
+ return {
2922
+ initialValue,
2923
+ /**
2924
+ * Errors can be a string, or a MesaageDescriptor, so we need to handle both cases.
2925
+ * If it's anything else, we don't return it.
2926
+ */
2927
+ error: isErrorMessageDescriptor(error) ? formatMessage(
2928
+ {
2929
+ id: error.id,
2930
+ defaultMessage: error.defaultMessage
2931
+ },
2932
+ error.values
2933
+ ) : typeof error === "string" ? error : void 0,
2934
+ onChange: handleChange,
2935
+ value
2936
+ };
2937
+ };
2938
+ const isErrorMessageDescriptor = (object) => {
2939
+ return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
2940
+ };
2941
+ const Blocker = () => {
2942
+ const { formatMessage } = reactIntl.useIntl();
2943
+ const modified = useForm("Blocker", (state) => state.modified);
2944
+ const isSubmitting = useForm("Blocker", (state) => state.isSubmitting);
2945
+ const blocker = reactRouterDom.useBlocker(
2946
+ ({ currentLocation, nextLocation }) => !isSubmitting && modified && currentLocation.pathname !== nextLocation.pathname
2947
+ );
2948
+ if (blocker.state === "blocked") {
2949
+ return /* @__PURE__ */ jsxRuntime.jsxs(
2950
+ designSystem.Dialog,
2951
+ {
2952
+ isOpen: true,
2953
+ title: formatMessage({
2954
+ id: "app.components.ConfirmDialog.title",
2955
+ defaultMessage: "Confirmation"
2956
+ }),
2957
+ onClose: () => blocker.reset(),
2958
+ children: [
2959
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.DialogBody, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 2, children: [
2960
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { as: Icons.ExclamationMarkCircle, width: "24px", height: "24px", color: "danger600" }),
2961
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { as: "p", variant: "omega", textAlign: "center", children: formatMessage({
2962
+ id: "global.prompt.unsaved",
2963
+ defaultMessage: "You have unsaved changes, are you sure you want to leave?"
2964
+ }) })
2965
+ ] }) }),
2966
+ /* @__PURE__ */ jsxRuntime.jsx(
2967
+ designSystem.DialogFooter,
2968
+ {
2969
+ startAction: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: () => blocker.reset(), variant: "tertiary", children: formatMessage({
2970
+ id: "app.components.Button.cancel",
2971
+ defaultMessage: "Cancel"
2972
+ }) }),
2973
+ endAction: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: () => blocker.proceed(), variant: "danger", children: formatMessage({
2974
+ id: "app.components.Button.confirm",
2975
+ defaultMessage: "Confirm"
2976
+ }) })
2977
+ }
2978
+ )
2979
+ ]
2980
+ }
2981
+ );
2982
+ }
2983
+ return null;
2984
+ };
2985
+
2986
+ const getTranslation = (id) => `content-manager.${id}`;
2987
+
2988
+ const DocumentStatus = ({ status = "draft", ...restProps }) => {
2989
+ const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
2990
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Status, { ...restProps, showBullet: false, size: "S", variant: statusVariant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { as: "span", variant: "omega", fontWeight: "bold", children: capitalise(status) }) });
2991
+ };
2992
+
2993
+ function getStyle(initialOffset, currentOffset, mouseOffset) {
2994
+ if (!initialOffset || !currentOffset || !mouseOffset) {
2995
+ return { display: "none" };
2996
+ }
2997
+ const { x, y } = mouseOffset;
2998
+ return {
2999
+ transform: `translate(${x}px, ${y}px)`
3000
+ };
3001
+ }
3002
+ const DragLayer = ({ renderItem }) => {
3003
+ const { itemType, isDragging, item, initialOffset, currentOffset, mouseOffset } = reactDnd.useDragLayer(
3004
+ (monitor) => ({
3005
+ item: monitor.getItem(),
3006
+ itemType: monitor.getItemType(),
3007
+ initialOffset: monitor.getInitialSourceClientOffset(),
3008
+ currentOffset: monitor.getSourceClientOffset(),
3009
+ isDragging: monitor.isDragging(),
3010
+ mouseOffset: monitor.getClientOffset()
3011
+ })
3012
+ );
3013
+ if (!isDragging) {
3014
+ return null;
3015
+ }
3016
+ return /* @__PURE__ */ jsxRuntime.jsx(
3017
+ designSystem.Box,
3018
+ {
3019
+ height: "100%",
3020
+ left: 0,
3021
+ position: "fixed",
3022
+ pointerEvents: "none",
3023
+ top: 0,
3024
+ zIndex: 100,
3025
+ width: "100%",
3026
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { style: getStyle(initialOffset, currentOffset, mouseOffset), children: renderItem({ type: itemType, item }) })
3027
+ }
3028
+ );
3029
+ };
3030
+
3031
+ const CardDragPreview = ({ label, isSibling = false }) => {
3032
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3033
+ FieldContainer,
3034
+ {
3035
+ background: isSibling ? "neutral100" : "primary100",
3036
+ display: "inline-flex",
3037
+ gap: 3,
3038
+ hasRadius: true,
3039
+ justifyContent: "space-between",
3040
+ isSibling,
3041
+ "max-height": `${32 / 16}rem`,
3042
+ maxWidth: "min-content",
3043
+ children: [
3044
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 3, children: [
3045
+ /* @__PURE__ */ jsxRuntime.jsx(DragButton, { alignItems: "center", cursor: "all-scroll", padding: 3, children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {}) }),
3046
+ /* @__PURE__ */ jsxRuntime.jsx(
3047
+ TypographyMaxWidth,
3048
+ {
3049
+ textColor: isSibling ? void 0 : "primary600",
3050
+ fontWeight: "bold",
3051
+ ellipsis: true,
3052
+ children: label
3053
+ }
3054
+ )
3055
+ ] }),
3056
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
3057
+ /* @__PURE__ */ jsxRuntime.jsx(ActionBox, { alignItems: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Pencil, {}) }),
3058
+ /* @__PURE__ */ jsxRuntime.jsx(ActionBox, { alignItems: "center", children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}) })
3059
+ ] })
3060
+ ]
3061
+ }
3062
+ );
3063
+ };
3064
+ const ActionBox = styled__default.default(designSystem.Flex)`
3065
+ height: ${({ theme }) => theme.spaces[7]};
3066
+
3067
+ &:last-child {
3068
+ padding: 0 ${({ theme }) => theme.spaces[3]};
3069
+ }
3070
+ `;
3071
+ const DragButton = styled__default.default(ActionBox)`
3072
+ border-right: 1px solid ${({ theme }) => theme.colors.primary200};
3073
+
3074
+ svg {
3075
+ width: ${12 / 16}rem;
3076
+ height: ${12 / 16}rem;
3077
+ }
3078
+ `;
3079
+ const FieldContainer = styled__default.default(designSystem.Flex)`
3080
+ border: 1px solid
3081
+ ${({ theme, isSibling }) => isSibling ? theme.colors.neutral150 : theme.colors.primary200};
3082
+
3083
+ svg {
3084
+ width: ${10 / 16}rem;
3085
+ height: ${10 / 16}rem;
3086
+
3087
+ path {
3088
+ fill: ${({ theme, isSibling }) => isSibling ? void 0 : theme.colors.primary600};
3089
+ }
3090
+ }
3091
+ `;
3092
+ const TypographyMaxWidth = styled__default.default(designSystem.Typography)`
3093
+ max-width: ${72 / 16}rem;
3094
+ `;
3095
+
3096
+ const ComponentDragPreview = ({ displayedValue }) => {
3097
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3098
+ designSystem.Flex,
3099
+ {
3100
+ background: "neutral0",
3101
+ borderColor: "neutral200",
3102
+ justifyContent: "space-between",
3103
+ gap: 3,
3104
+ padding: 3,
3105
+ width: `${300 / 16}rem`,
3106
+ children: [
3107
+ /* @__PURE__ */ jsxRuntime.jsx(ToggleButton, { type: "button", children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 6, children: [
3108
+ /* @__PURE__ */ jsxRuntime.jsx(
3109
+ DropdownIconWrapper,
3110
+ {
3111
+ alignItems: "center",
3112
+ justifyContent: "center",
3113
+ background: "neutral200",
3114
+ height: `${32 / 16}rem`,
3115
+ width: `${32 / 16}rem`,
3116
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.CarretDown, {})
3117
+ }
3118
+ ),
3119
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { maxWidth: `${150 / 16}rem`, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral700", ellipsis: true, children: displayedValue }) })
3120
+ ] }) }),
3121
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
3122
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { "aria-label": "", borderWidth: 0, children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Trash, {}) }),
3123
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { "aria-label": "", borderWidth: 0, children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {}) })
3124
+ ] })
3125
+ ]
3126
+ }
3127
+ );
3128
+ };
3129
+ const DropdownIconWrapper = styled__default.default(designSystem.Flex)`
3130
+ border-radius: 50%;
3131
+
3132
+ svg {
3133
+ height: ${6 / 16}rem;
3134
+ width: ${11 / 16}rem;
3135
+ > path {
3136
+ fill: ${({ theme }) => theme.colors.neutral600};
3137
+ }
3138
+ }
3139
+ `;
3140
+ const ToggleButton = styled__default.default.button`
3141
+ border: none;
3142
+ background: transparent;
3143
+ display: block;
3144
+ width: 100%;
3145
+ text-align: unset;
3146
+ padding: 0;
3147
+ `;
3148
+
3149
+ const useFocusInputField = (name) => {
3150
+ const { search: searchString } = reactRouterDom.useLocation();
3151
+ const search = React.useMemo(() => new URLSearchParams(searchString), [searchString]);
3152
+ const [field, setField] = React.useState(null);
3153
+ React.useEffect(() => {
3154
+ if (search.has("field") && search.get("field") === name && field) {
3155
+ if ("input" in field) {
3156
+ field.input.current.focus();
3157
+ field.input.current.scrollIntoView({
3158
+ block: "center"
3159
+ });
3160
+ } else {
3161
+ field.focus();
3162
+ field.scrollIntoView({
3163
+ block: "center"
3164
+ });
3165
+ }
3166
+ }
3167
+ }, [search, name, field]);
3168
+ return setField;
3169
+ };
3170
+
3171
+ const ItemTypes = {
3172
+ COMPONENT: "component",
3173
+ EDIT_FIELD: "editField",
3174
+ FIELD: "field",
3175
+ DYNAMIC_ZONE: "dynamicZone",
3176
+ RELATION: "relation",
3177
+ BLOCKS: "blocks"
3178
+ };
3179
+
3180
+ const useKeyboardDragAndDrop = (active, index, { onCancel, onDropItem, onGrabItem, onMoveItem }) => {
3181
+ const [isSelected, setIsSelected] = React__namespace.useState(false);
3182
+ const handleMove = (movement) => {
3183
+ if (!isSelected) {
3184
+ return;
3185
+ }
3186
+ if (typeof index === "number" && onMoveItem) {
3187
+ if (movement === "UP") {
3188
+ onMoveItem(index - 1, index);
3189
+ } else if (movement === "DOWN") {
3190
+ onMoveItem(index + 1, index);
3191
+ }
3192
+ }
3193
+ };
3194
+ const handleDragClick = () => {
3195
+ if (isSelected) {
3196
+ if (onDropItem) {
3197
+ onDropItem(index);
3198
+ }
3199
+ setIsSelected(false);
3200
+ } else {
3201
+ if (onGrabItem) {
3202
+ onGrabItem(index);
3203
+ }
3204
+ setIsSelected(true);
3205
+ }
3206
+ };
3207
+ const handleCancel = () => {
3208
+ if (isSelected) {
3209
+ setIsSelected(false);
3210
+ if (onCancel) {
3211
+ onCancel(index);
3212
+ }
3213
+ }
3214
+ };
3215
+ const handleKeyDown = (e) => {
3216
+ if (!active) {
3217
+ return;
3218
+ }
3219
+ if (e.key === "Tab" && !isSelected) {
3220
+ return;
3221
+ }
3222
+ e.preventDefault();
3223
+ switch (e.key) {
3224
+ case " ":
3225
+ case "Enter":
3226
+ handleDragClick();
3227
+ break;
3228
+ case "Escape":
3229
+ handleCancel();
3230
+ break;
3231
+ case "ArrowDown":
3232
+ case "ArrowRight":
3233
+ handleMove("DOWN");
3234
+ break;
3235
+ case "ArrowUp":
3236
+ case "ArrowLeft":
3237
+ handleMove("UP");
3238
+ break;
3239
+ }
3240
+ };
3241
+ return handleKeyDown;
3242
+ };
3243
+
3244
+ const DIRECTIONS = {
3245
+ UPWARD: "upward",
3246
+ DOWNWARD: "downward"
3247
+ };
3248
+ const DROP_SENSITIVITY = {
3249
+ REGULAR: "regular",
3250
+ IMMEDIATE: "immediate"
3251
+ };
3252
+ const useDragAndDrop = (active, {
3253
+ type = "STRAPI_DND",
3254
+ index,
3255
+ item,
3256
+ onStart,
3257
+ onEnd,
3258
+ onGrabItem,
3259
+ onDropItem,
3260
+ onCancel,
3261
+ onMoveItem,
3262
+ dropSensitivity = DROP_SENSITIVITY.REGULAR
3263
+ }) => {
3264
+ const objectRef = React__namespace.useRef(null);
3265
+ const [{ handlerId, isOver }, dropRef] = reactDnd.useDrop({
3266
+ accept: type,
3267
+ collect(monitor) {
3268
+ return {
3269
+ handlerId: monitor.getHandlerId(),
3270
+ isOver: monitor.isOver({ shallow: true })
3271
+ };
3272
+ },
3273
+ drop(item2) {
3274
+ const draggedIndex = item2.index;
3275
+ const newIndex = index;
3276
+ if (isOver && onDropItem) {
3277
+ onDropItem(draggedIndex, newIndex);
3278
+ }
3279
+ },
3280
+ hover(item2, monitor) {
3281
+ if (!objectRef.current || !onMoveItem) {
3282
+ return;
3283
+ }
3284
+ const dragIndex = item2.index;
3285
+ const newIndex = index;
3286
+ const hoverBoundingRect = objectRef.current?.getBoundingClientRect();
3287
+ const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;
3288
+ const clientOffset = monitor.getClientOffset();
3289
+ if (!clientOffset)
3290
+ return;
3291
+ const hoverClientY = clientOffset && clientOffset.y - hoverBoundingRect.top;
3292
+ if (typeof dragIndex === "number" && typeof newIndex === "number") {
3293
+ if (dragIndex === newIndex) {
3294
+ return;
3295
+ }
3296
+ if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {
3297
+ if (dragIndex < newIndex && hoverClientY < hoverMiddleY) {
3298
+ return;
3299
+ }
3300
+ if (dragIndex > newIndex && hoverClientY > hoverMiddleY) {
3301
+ return;
3302
+ }
3303
+ }
3304
+ onMoveItem(newIndex, dragIndex);
3305
+ item2.index = newIndex;
3306
+ } else {
3307
+ if (Array.isArray(dragIndex) && Array.isArray(newIndex)) {
3308
+ const minLength = Math.min(dragIndex.length, newIndex.length);
3309
+ let areEqual = true;
3310
+ let isLessThan = false;
3311
+ let isGreaterThan = false;
3312
+ for (let i = 0; i < minLength; i++) {
3313
+ if (dragIndex[i] < newIndex[i]) {
3314
+ isLessThan = true;
3315
+ areEqual = false;
3316
+ break;
3317
+ } else if (dragIndex[i] > newIndex[i]) {
3318
+ isGreaterThan = true;
3319
+ areEqual = false;
3320
+ break;
3321
+ }
3322
+ }
3323
+ if (areEqual && dragIndex.length === newIndex.length) {
3324
+ return;
3325
+ }
3326
+ if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {
3327
+ if (isLessThan && !isGreaterThan && hoverClientY < hoverMiddleY) {
3328
+ return;
3329
+ }
3330
+ if (isGreaterThan && !isLessThan && hoverClientY > hoverMiddleY) {
3331
+ return;
3332
+ }
3333
+ }
3334
+ }
3335
+ onMoveItem(newIndex, dragIndex);
3336
+ item2.index = newIndex;
3337
+ }
3338
+ }
3339
+ });
3340
+ const getDragDirection = (monitor) => {
3341
+ if (monitor && monitor.isDragging() && !monitor.didDrop() && monitor.getInitialClientOffset() && monitor.getClientOffset()) {
3342
+ const deltaY = monitor.getInitialClientOffset().y - monitor.getClientOffset().y;
3343
+ if (deltaY > 0)
3344
+ return DIRECTIONS.UPWARD;
3345
+ if (deltaY < 0)
3346
+ return DIRECTIONS.DOWNWARD;
3347
+ return null;
3348
+ }
3349
+ return null;
3350
+ };
3351
+ const [{ isDragging, direction }, dragRef, dragPreviewRef] = reactDnd.useDrag({
3352
+ type,
3353
+ item() {
3354
+ if (onStart) {
3355
+ onStart();
3356
+ }
3357
+ const { width } = objectRef.current?.getBoundingClientRect() ?? {};
3358
+ return { index, width, ...item };
3359
+ },
3360
+ end() {
3361
+ if (onEnd) {
3362
+ onEnd();
3363
+ }
3364
+ },
3365
+ canDrag: active,
3366
+ /**
3367
+ * This is useful when the item is in a virtualized list.
3368
+ * However, if we don't have an ID then we want the libraries
3369
+ * defaults to take care of this.
3370
+ */
3371
+ isDragging: item?.id ? (monitor) => {
3372
+ return item.id === monitor.getItem().id;
3373
+ } : void 0,
3374
+ collect: (monitor) => ({
3375
+ isDragging: monitor.isDragging(),
3376
+ initialOffset: monitor.getInitialClientOffset(),
3377
+ currentOffset: monitor.getClientOffset(),
3378
+ direction: getDragDirection(monitor)
3379
+ })
3380
+ });
3381
+ const handleKeyDown = useKeyboardDragAndDrop(active, index, {
3382
+ onGrabItem,
3383
+ onDropItem,
3384
+ onCancel,
3385
+ onMoveItem
3386
+ });
3387
+ return [
3388
+ { handlerId, isDragging, handleKeyDown, isOverDropTarget: isOver, direction },
3389
+ objectRef,
3390
+ dropRef,
3391
+ dragRef,
3392
+ dragPreviewRef
3393
+ ];
3394
+ };
3395
+
3396
+ const relationsApi = contentManagerApi.injectEndpoints({
3397
+ endpoints: (build) => ({
3398
+ getRelations: build.query({
3399
+ query: ({ model, id, targetField, params }) => {
3400
+ return {
3401
+ url: `/content-manager/relations/${model}/${id}/${targetField}`,
3402
+ method: "GET",
3403
+ config: {
3404
+ params
3405
+ }
3406
+ };
3407
+ },
3408
+ serializeQueryArgs: (args) => {
3409
+ const { endpointName, queryArgs } = args;
3410
+ return {
3411
+ endpointName,
3412
+ model: queryArgs.model,
3413
+ id: queryArgs.id,
3414
+ targetField: queryArgs.targetField,
3415
+ locale: queryArgs.params?.locale,
3416
+ status: queryArgs.params?.status
3417
+ };
3418
+ },
3419
+ merge: (currentCache, newItems) => {
3420
+ if (currentCache.pagination && newItems.pagination) {
3421
+ if (currentCache.pagination.page < newItems.pagination.page) {
3422
+ const existingIds = currentCache.results.map((item) => item.documentId);
3423
+ const uniqueNewItems = newItems.results.filter(
3424
+ (item) => !existingIds.includes(item.documentId)
3425
+ );
3426
+ currentCache.results.push(...prepareTempKeys(uniqueNewItems, currentCache.results));
3427
+ currentCache.pagination = newItems.pagination;
3428
+ } else if (newItems.pagination.page === 1) {
3429
+ currentCache.results = prepareTempKeys(newItems.results);
3430
+ currentCache.pagination = newItems.pagination;
3431
+ }
3432
+ }
3433
+ },
3434
+ forceRefetch({ currentArg, previousArg }) {
3435
+ if (!currentArg?.params && !previousArg?.params) {
3436
+ return false;
3437
+ }
3438
+ return currentArg?.params?.page !== previousArg?.params?.page || currentArg?.params?.pageSize !== previousArg?.params?.pageSize;
3439
+ },
3440
+ transformResponse: (response) => {
3441
+ if ("results" in response && response.results) {
3442
+ return {
3443
+ ...response,
3444
+ results: prepareTempKeys(response.results.toReversed())
3445
+ };
3446
+ } else {
3447
+ return response;
3448
+ }
3449
+ },
3450
+ providesTags: ["Relations"]
3451
+ }),
3452
+ searchRelations: build.query({
3453
+ query: ({ model, targetField, params }) => {
3454
+ return {
3455
+ url: `/content-manager/relations/${model}/${targetField}`,
3456
+ method: "GET",
3457
+ config: {
3458
+ params
3459
+ }
3460
+ };
3461
+ },
3462
+ serializeQueryArgs: (args) => {
3463
+ const { endpointName, queryArgs } = args;
3464
+ return {
3465
+ endpointName,
3466
+ model: queryArgs.model,
3467
+ targetField: queryArgs.targetField,
3468
+ _q: queryArgs.params?._q,
3469
+ idsToOmit: queryArgs.params?.idsToOmit,
3470
+ idsToInclude: queryArgs.params?.idsToInclude
3471
+ };
3472
+ },
3473
+ merge: (currentCache, newItems) => {
3474
+ if (currentCache.pagination && newItems.pagination) {
3475
+ if (currentCache.pagination.page < newItems.pagination.page) {
3476
+ const existingIds = currentCache.results.map((item) => item.documentId);
3477
+ const uniqueNewItems = newItems.results.filter(
3478
+ (item) => !existingIds.includes(item.documentId)
3479
+ );
3480
+ currentCache.results.push(...uniqueNewItems);
3481
+ currentCache.pagination = newItems.pagination;
3482
+ } else if (newItems.pagination.page === 1) {
3483
+ currentCache.results = newItems.results;
3484
+ currentCache.pagination = newItems.pagination;
3485
+ }
3486
+ }
3487
+ },
3488
+ forceRefetch({ currentArg, previousArg }) {
3489
+ if (!currentArg?.params && !previousArg?.params) {
3490
+ return false;
3491
+ }
3492
+ return currentArg?.params?.page !== previousArg?.params?.page || currentArg?.params?.pageSize !== previousArg?.params?.pageSize;
3493
+ },
3494
+ transformResponse: (response) => {
3495
+ if (response.results) {
3496
+ return {
3497
+ ...response,
3498
+ results: response.results
3499
+ };
3500
+ } else {
3501
+ return response;
3502
+ }
3503
+ }
3504
+ })
3505
+ })
3506
+ });
3507
+ const prepareTempKeys = (relations, existingRelations = []) => {
3508
+ const [firstItem] = existingRelations.slice(0);
3509
+ const keys = fractionalIndexing.generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);
3510
+ return relations.map((datum, index) => ({
3511
+ ...datum,
3512
+ __temp_key__: keys[index]
3513
+ }));
3514
+ };
3515
+ const { useGetRelationsQuery, useLazySearchRelationsQuery } = relationsApi;
3516
+
3517
+ const getRelationLabel = (relation, mainField) => {
3518
+ const label = mainField && relation[mainField.name] ? relation[mainField.name] : null;
3519
+ if (typeof label === "string") {
3520
+ return label;
3521
+ }
3522
+ return relation.documentId;
3523
+ };
3524
+
3525
+ const [ComponentProvider, useComponent] = createContext("ComponentContext", {
3526
+ id: void 0,
3527
+ level: -1,
3528
+ uid: void 0,
3529
+ type: void 0
3530
+ });
3531
+
3532
+ const RELATIONS_TO_DISPLAY = 5;
3533
+ const ONE_WAY_RELATIONS = ["oneWay", "oneToOne", "manyToOne", "oneToManyMorph", "oneToOneMorph"];
3534
+ const RelationsField = React__namespace.forwardRef(
3535
+ ({ disabled, label, ...props }, ref) => {
3536
+ const [currentPage, setCurrentPage] = React__namespace.useState(1);
3537
+ const { document, model: documentModel } = useDoc();
3538
+ const documentId = document?.documentId;
3539
+ const { formatMessage } = reactIntl.useIntl();
3540
+ const [{ query }] = useQueryParams();
3541
+ const params = buildValidParams(query);
3542
+ const isMorph = props.attribute.relation.toLowerCase().includes("morph");
3543
+ const isDisabled = isMorph || disabled;
3544
+ const { id: componentId, uid } = useComponent("RelationsField", ({ uid: uid2, id: id2 }) => ({ id: id2, uid: uid2 }));
3545
+ const id = componentId ? componentId.toString() : documentId;
3546
+ const model = uid ?? documentModel;
3547
+ const [targetField] = props.name.split(".").slice(-1);
3548
+ const { data, isLoading, isFetching } = useGetRelationsQuery(
3549
+ {
3550
+ model,
3551
+ targetField,
3552
+ // below we don't run the query if there is no id.
3553
+ id,
3554
+ params: {
3555
+ ...params,
3556
+ pageSize: RELATIONS_TO_DISPLAY,
3557
+ page: currentPage
3558
+ }
3559
+ },
3560
+ {
3561
+ refetchOnMountOrArgChange: true,
3562
+ skip: !id,
3563
+ selectFromResult: (result) => {
3564
+ return {
3565
+ ...result,
3566
+ data: {
3567
+ ...result.data,
3568
+ results: result.data?.results ? result.data.results : []
3569
+ }
3570
+ };
3571
+ }
3572
+ }
3573
+ );
3574
+ const handleLoadMore = () => {
3575
+ setCurrentPage((prev) => prev + 1);
3576
+ };
3577
+ const field = useField(props.name);
3578
+ const isFetchingMoreRelations = isLoading || isFetching;
3579
+ const realServerRelationsCount = "pagination" in data && data.pagination ? data.pagination.total : 0;
3580
+ const relationsConnected = (field.value?.connect ?? []).filter(
3581
+ (rel) => data.results.findIndex((relation) => relation.id === rel.id) === -1
3582
+ ).length ?? 0;
3583
+ const relationsDisconnected = field.value?.disconnect?.length ?? 0;
3584
+ const relationsCount = realServerRelationsCount + relationsConnected - relationsDisconnected;
3585
+ const relations = React__namespace.useMemo(() => {
3586
+ const ctx = {
3587
+ field: field.value,
3588
+ // @ts-expect-error – targetModel does exist on the attribute. But it's not typed.
3589
+ href: `../${COLLECTION_TYPES}/${props.attribute.targetModel}`,
3590
+ mainField: props.mainField
3591
+ };
3592
+ const transformations = pipe__default.default(
3593
+ removeConnected(ctx),
3594
+ removeDisconnected(ctx),
3595
+ addLabelAndHref(ctx)
3596
+ );
3597
+ const transformedRels = transformations([...data.results]);
3598
+ return [...transformedRels, ...field.value?.connect ?? []].sort((a, b) => {
3599
+ if (a.__temp_key__ < b.__temp_key__)
3600
+ return -1;
3601
+ if (a.__temp_key__ > b.__temp_key__)
3602
+ return 1;
3603
+ return 0;
3604
+ });
3605
+ }, [
3606
+ data.results,
3607
+ field.value,
3608
+ // @ts-expect-error – targetModel does exist on the attribute. But it's not typed.
3609
+ props.attribute.targetModel,
3610
+ props.mainField
3611
+ ]);
3612
+ const handleConnect = (relation) => {
3613
+ const [lastItemInList] = relations.slice(-1);
3614
+ const item = {
3615
+ id: relation.id,
3616
+ status: relation.status,
3617
+ /**
3618
+ * If there's a last item, that's the first key we use to generate out next one.
3619
+ */
3620
+ __temp_key__: fractionalIndexing.generateNKeysBetween(lastItemInList?.__temp_key__ ?? null, null, 1)[0],
3621
+ // Fallback to `id` if there is no `mainField` value, which will overwrite the above `id` property with the exact same data.
3622
+ [props.mainField?.name ?? "documentId"]: relation[props.mainField?.name ?? "documentId"],
3623
+ label: getRelationLabel(relation, props.mainField),
3624
+ // @ts-expect-error – targetModel does exist on the attribute, but it's not typed.
3625
+ href: `../${COLLECTION_TYPES}/${props.attribute.targetModel}/${relation.documentId}`
3626
+ };
3627
+ if (ONE_WAY_RELATIONS.includes(props.attribute.relation)) {
3628
+ field.onChange(`${props.name}.connect`, [item]);
3629
+ } else {
3630
+ field.onChange(`${props.name}.connect`, [...field.value?.connect ?? [], item]);
3631
+ }
3632
+ };
3633
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3634
+ designSystem.Flex,
3635
+ {
3636
+ ref,
3637
+ direction: "column",
3638
+ gap: 3,
3639
+ justifyContent: "space-between",
3640
+ alignItems: "stretch",
3641
+ wrap: "wrap",
3642
+ children: [
3643
+ /* @__PURE__ */ jsxRuntime.jsxs(StyledFlex, { direction: "column", alignItems: "start", gap: 2, width: "100%", children: [
3644
+ /* @__PURE__ */ jsxRuntime.jsx(
3645
+ RelationsInput,
3646
+ {
3647
+ disabled: isDisabled,
3648
+ id,
3649
+ label: `${label} ${relationsCount > 0 ? `(${relationsCount})` : ""}`,
3650
+ model,
3651
+ onChange: handleConnect,
3652
+ ...props
3653
+ }
3654
+ ),
3655
+ "pagination" in data && data.pagination && data.pagination.pageCount > data.pagination.page ? /* @__PURE__ */ jsxRuntime.jsx(
3656
+ designSystem.TextButton,
3657
+ {
3658
+ disabled: isFetchingMoreRelations,
3659
+ onClick: handleLoadMore,
3660
+ loading: isFetchingMoreRelations,
3661
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Refresh, {}),
3662
+ shrink: 0,
3663
+ children: formatMessage({
3664
+ id: getTranslation("relation.loadMore"),
3665
+ defaultMessage: "Load More"
3666
+ })
3667
+ }
3668
+ ) : null
3669
+ ] }),
3670
+ /* @__PURE__ */ jsxRuntime.jsx(
3671
+ RelationsList,
3672
+ {
3673
+ data: relations,
3674
+ serverData: data.results,
3675
+ disabled: isDisabled,
3676
+ name: props.name,
3677
+ isLoading: isFetchingMoreRelations,
3678
+ relationType: props.attribute.relation
3679
+ }
3680
+ )
3681
+ ]
3682
+ }
3683
+ );
3684
+ }
3685
+ );
3686
+ const StyledFlex = styled__default.default(designSystem.Flex)`
3687
+ & > div {
3688
+ width: 100%;
3689
+ }
3690
+ `;
3691
+ const removeConnected = ({ field }) => (relations) => {
3692
+ return relations.filter((relation) => {
3693
+ const connectedRelations = field?.connect ?? [];
3694
+ return connectedRelations.findIndex((rel) => rel.id === relation.id) === -1;
3695
+ });
3696
+ };
3697
+ const removeDisconnected = ({ field }) => (relations) => relations.filter((relation) => {
3698
+ const disconnectedRelations = field?.disconnect ?? [];
3699
+ return disconnectedRelations.findIndex((rel) => rel.id === relation.id) === -1;
3700
+ });
3701
+ const addLabelAndHref = ({ mainField, href }) => (relations) => relations.map((relation) => {
3702
+ return {
3703
+ ...relation,
3704
+ // Fallback to `id` if there is no `mainField` value, which will overwrite the above `documentId` property with the exact same data.
3705
+ [mainField?.name ?? "documentId"]: relation[mainField?.name ?? "documentId"],
3706
+ label: getRelationLabel(relation, mainField),
3707
+ href: `${href}/${relation.documentId}`
3708
+ };
3709
+ });
3710
+ const RelationsInput = ({
3711
+ disabled,
3712
+ hint,
3713
+ id,
3714
+ label,
3715
+ model,
3716
+ name,
3717
+ mainField,
3718
+ placeholder,
3719
+ required,
3720
+ onChange
3721
+ }) => {
3722
+ const [textValue, setTextValue] = React__namespace.useState("");
3723
+ const [searchParams, setSearchParams] = React__namespace.useState({
3724
+ _q: "",
3725
+ page: 1
3726
+ });
3727
+ const { toggleNotification } = useNotification();
3728
+ const [{ query }] = useQueryParams();
3729
+ const { formatMessage } = reactIntl.useIntl();
3730
+ const fieldRef = useFocusInputField(name);
3731
+ const field = useField(name);
3732
+ const [searchForTrigger, { data, isLoading }] = useLazySearchRelationsQuery();
3733
+ React__namespace.useEffect(() => {
3734
+ const [targetField] = name.split(".").slice(-1);
3735
+ searchForTrigger({
3736
+ model,
3737
+ targetField,
3738
+ params: {
3739
+ ...buildValidParams(query),
3740
+ id: id ?? "",
3741
+ pageSize: 10,
3742
+ idsToInclude: field.value?.disconnect?.map((rel) => rel.id.toString()) ?? [],
3743
+ idsToOmit: field.value?.connect?.map((rel) => rel.id.toString()) ?? [],
3744
+ ...searchParams
3745
+ }
3746
+ });
3747
+ }, [
3748
+ field.value?.connect,
3749
+ field.value?.disconnect,
3750
+ id,
3751
+ model,
3752
+ name,
3753
+ query,
3754
+ searchForTrigger,
3755
+ searchParams
3756
+ ]);
3757
+ const handleSearch = async (search) => {
3758
+ setSearchParams((s) => ({ ...s, _q: search, page: 1 }));
3759
+ };
3760
+ const hasNextPage = data?.pagination ? data.pagination.page < data.pagination.pageCount : false;
3761
+ const options = data?.results ?? [];
3762
+ const handleChange = (relationId) => {
3763
+ if (!relationId) {
3764
+ return;
3765
+ }
3766
+ const relation = options.find((opt) => opt.id.toString() === relationId);
3767
+ if (!relation) {
3768
+ console.error(
3769
+ "You've tried to add a relation with an id that does not exist in the options you can see, this is likely a bug with Strapi. Please open an issue."
3770
+ );
3771
+ toggleNotification({
3772
+ message: formatMessage({
3773
+ id: getTranslation("relation.error-adding-relation"),
3774
+ defaultMessage: "An error occurred while trying to add the relation."
3775
+ }),
3776
+ type: "danger"
3777
+ });
3778
+ return;
3779
+ }
3780
+ onChange(relation);
3781
+ };
3782
+ const handleLoadMore = () => {
3783
+ if (!data || !data.pagination) {
3784
+ return;
3785
+ } else if (data.pagination.page < data.pagination.pageCount) {
3786
+ setSearchParams((s) => ({ ...s, page: s.page + 1 }));
3787
+ }
3788
+ };
3789
+ React__namespace.useLayoutEffect(() => {
3790
+ setTextValue("");
3791
+ }, [field.value]);
3792
+ return /* @__PURE__ */ jsxRuntime.jsx(
3793
+ designSystem.Combobox,
3794
+ {
3795
+ ref: fieldRef,
3796
+ autocomplete: "none",
3797
+ error: field.error,
3798
+ name,
3799
+ hint,
3800
+ required,
3801
+ label,
3802
+ disabled,
3803
+ placeholder: placeholder || formatMessage({
3804
+ id: getTranslation("relation.add"),
3805
+ defaultMessage: "Add relation"
3806
+ }),
3807
+ hasMoreItems: hasNextPage,
3808
+ loading: isLoading,
3809
+ onOpenChange: () => {
3810
+ handleSearch(textValue ?? "");
3811
+ },
3812
+ noOptionsMessage: () => formatMessage({
3813
+ id: getTranslation("relation.notAvailable"),
3814
+ defaultMessage: "No relations available"
3815
+ }),
3816
+ loadingMessage: formatMessage({
3817
+ id: getTranslation("relation.isLoading"),
3818
+ defaultMessage: "Relations are loading"
3819
+ }),
3820
+ onLoadMore: handleLoadMore,
3821
+ textValue,
3822
+ onChange: handleChange,
3823
+ onTextValueChange: (text) => {
3824
+ setTextValue(text);
3825
+ },
3826
+ onInputChange: (event) => {
3827
+ handleSearch(event.currentTarget.value);
3828
+ },
3829
+ children: options.map((opt) => {
3830
+ const textValue2 = getRelationLabel(opt, mainField);
3831
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ComboboxOption, { value: opt.id.toString(), textValue: textValue2, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, justifyContent: "space-between", children: [
3832
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, children: textValue2 }),
3833
+ opt.status ? /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status: opt.status }) : null
3834
+ ] }) }, opt.id);
3835
+ })
3836
+ }
3837
+ );
3838
+ };
3839
+ const RELATION_ITEM_HEIGHT = 50;
3840
+ const RELATION_GUTTER = 4;
3841
+ const RelationsList = ({
3842
+ data,
3843
+ serverData,
3844
+ disabled,
3845
+ name,
3846
+ isLoading,
3847
+ relationType
3848
+ }) => {
3849
+ const ariaDescriptionId = React__namespace.useId();
3850
+ const { formatMessage } = reactIntl.useIntl();
3851
+ const listRef = React__namespace.useRef(null);
3852
+ const outerListRef = React__namespace.useRef(null);
3853
+ const [overflow, setOverflow] = React__namespace.useState();
3854
+ const [liveText, setLiveText] = React__namespace.useState("");
3855
+ const field = useField(name);
3856
+ const removeFieldRow = useForm("RelationsList", (state) => state.removeFieldRow);
3857
+ const addFieldRow = useForm("RelationsList", (state) => state.addFieldRow);
3858
+ React__namespace.useEffect(() => {
3859
+ if (data.length <= RELATIONS_TO_DISPLAY) {
3860
+ return setOverflow(void 0);
3861
+ }
3862
+ const handleNativeScroll = (e) => {
3863
+ const el = e.target;
3864
+ const parentScrollContainerHeight = el.parentNode.scrollHeight;
3865
+ const maxScrollBottom = el.scrollHeight - el.scrollTop;
3866
+ if (el.scrollTop === 0) {
3867
+ return setOverflow("bottom");
3868
+ }
3869
+ if (maxScrollBottom === parentScrollContainerHeight) {
3870
+ return setOverflow("top");
3871
+ }
3872
+ return setOverflow("top-bottom");
3873
+ };
3874
+ const outerListRefCurrent = outerListRef?.current;
3875
+ if (!isLoading && data.length > 0 && outerListRefCurrent) {
3876
+ outerListRef.current.addEventListener("scroll", handleNativeScroll);
3877
+ }
3878
+ return () => {
3879
+ if (outerListRefCurrent) {
3880
+ outerListRefCurrent.removeEventListener("scroll", handleNativeScroll);
3881
+ }
3882
+ };
3883
+ }, [isLoading, data.length]);
3884
+ const getItemPos = (index) => `${index + 1} of ${data.length}`;
3885
+ const handleMoveItem = (newIndex, oldIndex) => {
3886
+ const item = data[oldIndex];
3887
+ setLiveText(
3888
+ formatMessage(
3889
+ {
3890
+ id: getTranslation("dnd.reorder"),
3891
+ defaultMessage: "{item}, moved. New position in list: {position}."
3892
+ },
3893
+ {
3894
+ item: item.label ?? item.documentId,
3895
+ position: getItemPos(newIndex)
3896
+ }
3897
+ )
3898
+ );
3899
+ const newData = [...data];
3900
+ const currentRow = data[oldIndex];
3901
+ const startKey = oldIndex > newIndex ? newData[newIndex - 1]?.__temp_key__ : newData[newIndex]?.__temp_key__;
3902
+ const endKey = oldIndex > newIndex ? newData[newIndex]?.__temp_key__ : newData[newIndex + 1]?.__temp_key__;
3903
+ const [newKey] = fractionalIndexing.generateNKeysBetween(startKey, endKey, 1);
3904
+ newData.splice(oldIndex, 1);
3905
+ newData.splice(newIndex, 0, { ...currentRow, __temp_key__: newKey });
3906
+ const connectedRelations = newData.reduce((acc, relation, currentIndex, array) => {
3907
+ const relationOnServer = serverData.find(
3908
+ (oldRelation) => oldRelation.documentId === relation.documentId
3909
+ );
3910
+ const relationInFront = array[currentIndex + 1];
3911
+ if (!relationOnServer || relationOnServer.__temp_key__ !== relation.__temp_key__) {
3912
+ const position = relationInFront ? {
3913
+ before: relationInFront.documentId,
3914
+ locale: relationInFront.locale,
3915
+ status: relationInFront.status
3916
+ } : { end: true };
3917
+ const relationWithPosition = { ...relation, position };
3918
+ return [...acc, relationWithPosition];
3919
+ }
3920
+ return acc;
3921
+ }, []).toReversed();
3922
+ field.onChange(`${name}.connect`, connectedRelations);
3923
+ };
3924
+ const handleGrabItem = (index) => {
3925
+ const item = data[index];
3926
+ setLiveText(
3927
+ formatMessage(
3928
+ {
3929
+ id: getTranslation("dnd.grab-item"),
3930
+ defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
3931
+ },
3932
+ {
3933
+ item: item.label ?? item.documentId,
3934
+ position: getItemPos(index)
3935
+ }
3936
+ )
3937
+ );
3938
+ };
3939
+ const handleDropItem = (index) => {
3940
+ const { href: _href, label, ...item } = data[index];
3941
+ setLiveText(
3942
+ formatMessage(
3943
+ {
3944
+ id: getTranslation("dnd.drop-item"),
3945
+ defaultMessage: `{item}, dropped. Final position in list: {position}.`
3946
+ },
3947
+ {
3948
+ item: label ?? item.documentId,
3949
+ position: getItemPos(index)
3950
+ }
3951
+ )
3952
+ );
3953
+ };
3954
+ const handleCancel = (index) => {
3955
+ const item = data[index];
3956
+ setLiveText(
3957
+ formatMessage(
3958
+ {
3959
+ id: getTranslation("dnd.cancel-item"),
3960
+ defaultMessage: "{item}, dropped. Re-order cancelled."
3961
+ },
3962
+ {
3963
+ item: item.label ?? item.documentId
3964
+ }
3965
+ )
3966
+ );
3967
+ };
3968
+ const handleDisconnect = (relation) => {
3969
+ if (field.value && field.value.connect) {
3970
+ const indexOfRelationInConnectArray = field.value.connect.findIndex(
3971
+ (rel) => rel.id === relation.id
3972
+ );
3973
+ if (indexOfRelationInConnectArray >= 0) {
3974
+ removeFieldRow(`${name}.connect`, indexOfRelationInConnectArray);
3975
+ return;
3976
+ }
3977
+ }
3978
+ addFieldRow(`${name}.disconnect`, { id: relation.id });
3979
+ };
3980
+ const canReorder = !ONE_WAY_RELATIONS.includes(relationType);
3981
+ const dynamicListHeight = data.length > RELATIONS_TO_DISPLAY ? Math.min(data.length, RELATIONS_TO_DISPLAY) * (RELATION_ITEM_HEIGHT + RELATION_GUTTER) + RELATION_ITEM_HEIGHT / 2 : Math.min(data.length, RELATIONS_TO_DISPLAY) * (RELATION_ITEM_HEIGHT + RELATION_GUTTER);
3982
+ return /* @__PURE__ */ jsxRuntime.jsxs(ShadowBox, { overflowDirection: overflow, children: [
3983
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
3984
+ id: getTranslation("dnd.instructions"),
3985
+ defaultMessage: `Press spacebar to grab and re-order`
3986
+ }) }),
3987
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
3988
+ /* @__PURE__ */ jsxRuntime.jsx(
3989
+ reactWindow.FixedSizeList,
3990
+ {
3991
+ height: dynamicListHeight,
3992
+ ref: listRef,
3993
+ outerRef: outerListRef,
3994
+ itemCount: data.length,
3995
+ itemSize: RELATION_ITEM_HEIGHT + RELATION_GUTTER,
3996
+ itemData: {
3997
+ ariaDescribedBy: ariaDescriptionId,
3998
+ canDrag: canReorder,
3999
+ disabled,
4000
+ handleCancel,
4001
+ handleDropItem,
4002
+ handleGrabItem,
4003
+ handleMoveItem,
4004
+ name,
4005
+ handleDisconnect,
4006
+ relations: data
4007
+ },
4008
+ itemKey: (index) => data[index].id,
4009
+ innerElementType: "ol",
4010
+ children: ListItem
4011
+ }
4012
+ )
4013
+ ] });
4014
+ };
4015
+ const ShadowBox = styled__default.default(designSystem.Box)`
4016
+ position: relative;
4017
+ overflow: hidden;
4018
+ flex: 1;
4019
+
4020
+ &:before,
4021
+ &:after {
4022
+ position: absolute;
4023
+ width: 100%;
4024
+ height: 4px;
4025
+ z-index: 1;
4026
+ }
4027
+
4028
+ &:before {
4029
+ /* TODO: as for DS Table component we would need this to be handled by the DS theme */
4030
+ content: '';
4031
+ background: linear-gradient(rgba(3, 3, 5, 0.2) 0%, rgba(0, 0, 0, 0) 100%);
4032
+ top: 0;
4033
+ opacity: ${({ overflowDirection }) => overflowDirection === "top-bottom" || overflowDirection === "top" ? 1 : 0};
4034
+ transition: opacity 0.2s ease-in-out;
4035
+ }
4036
+
4037
+ &:after {
4038
+ /* TODO: as for DS Table component we would need this to be handled by the DS theme */
4039
+ content: '';
4040
+ background: linear-gradient(0deg, rgba(3, 3, 5, 0.2) 0%, rgba(0, 0, 0, 0) 100%);
4041
+ bottom: 0;
4042
+ opacity: ${({ overflowDirection }) => overflowDirection === "top-bottom" || overflowDirection === "bottom" ? 1 : 0};
4043
+ transition: opacity 0.2s ease-in-out;
4044
+ }
4045
+ `;
4046
+ const ListItem = ({ data, index, style }) => {
4047
+ const {
4048
+ ariaDescribedBy,
4049
+ canDrag = false,
4050
+ disabled = false,
4051
+ handleCancel,
4052
+ handleDisconnect,
4053
+ handleDropItem,
4054
+ handleGrabItem,
4055
+ handleMoveItem,
4056
+ name,
4057
+ relations
4058
+ } = data;
4059
+ const { formatMessage } = reactIntl.useIntl();
4060
+ const { href, documentId, label, status } = relations[index];
4061
+ const [{ handlerId, isDragging, handleKeyDown }, relationRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop(
4062
+ canDrag && !disabled,
4063
+ {
4064
+ type: `${ItemTypes.RELATION}_${name}`,
4065
+ index,
4066
+ item: {
4067
+ displayedValue: label,
4068
+ status,
4069
+ id: documentId,
4070
+ index
4071
+ },
4072
+ onMoveItem: handleMoveItem,
4073
+ onDropItem: handleDropItem,
4074
+ onGrabItem: handleGrabItem,
4075
+ onCancel: handleCancel,
4076
+ dropSensitivity: DROP_SENSITIVITY.REGULAR
4077
+ }
4078
+ );
4079
+ const composedRefs = designSystem.useComposedRefs(relationRef, dragRef);
4080
+ React__namespace.useEffect(() => {
4081
+ dragPreviewRef(reactDndHtml5Backend.getEmptyImage());
4082
+ }, [dragPreviewRef]);
4083
+ return /* @__PURE__ */ jsxRuntime.jsx(
4084
+ designSystem.Box,
4085
+ {
4086
+ style,
4087
+ as: "li",
4088
+ ref: dropRef,
4089
+ "aria-describedby": ariaDescribedBy,
4090
+ cursor: canDrag ? "all-scroll" : "default",
4091
+ children: isDragging ? /* @__PURE__ */ jsxRuntime.jsx(RelationItemPlaceholder, {}) : /* @__PURE__ */ jsxRuntime.jsxs(
4092
+ designSystem.Flex,
4093
+ {
4094
+ paddingTop: 2,
4095
+ paddingBottom: 2,
4096
+ paddingLeft: canDrag ? 2 : 4,
4097
+ paddingRight: 4,
4098
+ hasRadius: true,
4099
+ borderColor: "neutral200",
4100
+ background: disabled ? "neutral150" : "neutral0",
4101
+ justifyContent: "space-between",
4102
+ ref: composedRefs,
4103
+ "data-handler-id": handlerId,
4104
+ children: [
4105
+ /* @__PURE__ */ jsxRuntime.jsxs(FlexWrapper, { gap: 1, children: [
4106
+ canDrag ? /* @__PURE__ */ jsxRuntime.jsx(
4107
+ designSystem.IconButton,
4108
+ {
4109
+ forwardedAs: "div",
4110
+ role: "button",
4111
+ tabIndex: 0,
4112
+ "aria-label": formatMessage({
4113
+ id: getTranslation("components.RelationInput.icon-button-aria-label"),
4114
+ defaultMessage: "Drag"
4115
+ }),
4116
+ borderWidth: 0,
4117
+ onKeyDown: handleKeyDown,
4118
+ disabled,
4119
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {})
4120
+ }
4121
+ ) : null,
4122
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", minWidth: 0, justifyContent: "space-between", children: [
4123
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { minWidth: 0, paddingTop: 1, paddingBottom: 1, paddingRight: 4, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tooltip, { description: label, children: href ? /* @__PURE__ */ jsxRuntime.jsx(LinkEllipsis, { forwardedAs: reactRouterDom.NavLink, to: href, children: label }) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: disabled ? "neutral600" : "primary600", ellipsis: true, children: label }) }) }),
4124
+ status ? /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status }) : null
4125
+ ] })
4126
+ ] }),
4127
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 4, children: /* @__PURE__ */ jsxRuntime.jsx(
4128
+ DisconnectButton,
4129
+ {
4130
+ disabled,
4131
+ type: "button",
4132
+ onClick: () => handleDisconnect(relations[index]),
4133
+ "aria-label": formatMessage({
4134
+ id: getTranslation("relation.disconnect"),
4135
+ defaultMessage: "Remove"
4136
+ }),
4137
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { width: "12px", as: Icons.Cross })
4138
+ }
4139
+ ) })
4140
+ ]
4141
+ }
4142
+ )
4143
+ }
4144
+ );
4145
+ };
4146
+ const FlexWrapper = styled__default.default(designSystem.Flex)`
4147
+ width: 100%;
4148
+ /* Used to prevent endAction to be pushed out of container */
4149
+ min-width: 0;
4150
+
4151
+ & > div[role='button'] {
4152
+ cursor: all-scroll;
4153
+ }
4154
+ `;
4155
+ const DisconnectButton = styled__default.default.button`
4156
+ svg path {
4157
+ fill: ${({ theme, disabled }) => disabled ? theme.colors.neutral600 : theme.colors.neutral500};
4158
+ }
4159
+
4160
+ &:hover svg path,
4161
+ &:focus svg path {
4162
+ fill: ${({ theme, disabled }) => !disabled && theme.colors.neutral600};
4163
+ }
4164
+ `;
4165
+ const LinkEllipsis = styled__default.default(v2.Link)`
4166
+ display: block;
4167
+
4168
+ & > span {
4169
+ white-space: nowrap;
4170
+ overflow: hidden;
4171
+ text-overflow: ellipsis;
4172
+ display: block;
4173
+ }
4174
+ `;
4175
+ const RelationItemPlaceholder = () => /* @__PURE__ */ jsxRuntime.jsx(
4176
+ designSystem.Box,
4177
+ {
4178
+ paddingTop: 2,
4179
+ paddingBottom: 2,
4180
+ paddingLeft: 4,
4181
+ paddingRight: 4,
4182
+ hasRadius: true,
4183
+ borderStyle: "dashed",
4184
+ borderColor: "primary600",
4185
+ borderWidth: "1px",
4186
+ background: "primary100",
4187
+ height: `calc(100% - ${RELATION_GUTTER}px)`
4188
+ }
4189
+ );
4190
+
4191
+ const RelationDragPreview = ({ status, displayedValue, width }) => {
4192
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { style: { width }, children: /* @__PURE__ */ jsxRuntime.jsxs(
4193
+ designSystem.Flex,
4194
+ {
4195
+ paddingTop: 2,
4196
+ paddingBottom: 2,
4197
+ paddingLeft: 2,
4198
+ paddingRight: 4,
4199
+ hasRadius: true,
4200
+ borderWidth: 1,
4201
+ background: "neutral0",
4202
+ borderColor: "neutral200",
4203
+ justifyContent: "space-between",
4204
+ children: [
4205
+ /* @__PURE__ */ jsxRuntime.jsxs(FlexWrapper, { gap: 1, children: [
4206
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.IconButton, { "aria-label": "", borderWidth: 0, children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Drag, {}) }),
4207
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", minWidth: 0, justifyContent: "space-between", children: [
4208
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { minWidth: 0, paddingTop: 1, paddingBottom: 1, paddingRight: 4, children: /* @__PURE__ */ jsxRuntime.jsx(LinkEllipsis, { href: "", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "primary600", ellipsis: true, children: displayedValue }) }) }),
4209
+ status ? /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status }) : null
4210
+ ] })
4211
+ ] }),
4212
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingLeft: 4, children: /* @__PURE__ */ jsxRuntime.jsx(DisconnectButton, { type: "button", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { width: "12px", as: Icons.Cross }) }) })
4213
+ ]
4214
+ }
4215
+ ) });
4216
+ };
4217
+
4218
+ const LeftMenu = () => {
4219
+ const [search, setSearch] = React__namespace.useState("");
4220
+ const [{ query }] = useQueryParams();
4221
+ const { formatMessage, locale } = reactIntl.useIntl();
4222
+ const collectionTypeLinks = useTypedSelector(
4223
+ (state) => state["content-manager_app"].collectionTypeLinks
4224
+ );
4225
+ const singleTypeLinks = useTypedSelector((state) => state["content-manager_app"].singleTypeLinks);
4226
+ const { startsWith } = designSystem.useFilter(locale, {
4227
+ sensitivity: "base"
4228
+ });
4229
+ const formatter = designSystem.useCollator(locale, {
4230
+ sensitivity: "base"
4231
+ });
4232
+ const menu = React__namespace.useMemo(
4233
+ () => [
4234
+ {
4235
+ id: "collectionTypes",
4236
+ title: formatMessage({
4237
+ id: getTranslation("components.LeftMenu.collection-types"),
4238
+ defaultMessage: "Collection Types"
4239
+ }),
4240
+ searchable: true,
4241
+ links: collectionTypeLinks
4242
+ },
4243
+ {
4244
+ id: "singleTypes",
4245
+ title: formatMessage({
4246
+ id: getTranslation("components.LeftMenu.single-types"),
4247
+ defaultMessage: "Single Types"
4248
+ }),
4249
+ searchable: true,
4250
+ links: singleTypeLinks
4251
+ }
4252
+ ].map((section) => ({
4253
+ ...section,
4254
+ links: section.links.filter((link) => startsWith(link.title, search)).sort((a, b) => formatter.compare(a.title, b.title)).map((link) => {
4255
+ return {
4256
+ ...link,
4257
+ title: formatMessage({ id: link.title, defaultMessage: link.title })
4258
+ };
4259
+ })
4260
+ })),
4261
+ [collectionTypeLinks, search, singleTypeLinks, startsWith, formatMessage, formatter]
4262
+ );
4263
+ const handleClear = () => {
4264
+ setSearch("");
4265
+ };
4266
+ const handleChangeSearch = ({ target: { value } }) => {
4267
+ setSearch(value);
4268
+ };
4269
+ const label = formatMessage({
4270
+ id: getTranslation("header.name"),
4271
+ defaultMessage: "Content"
4272
+ });
4273
+ return /* @__PURE__ */ jsxRuntime.jsxs(v2.SubNav, { ariaLabel: label, children: [
4274
+ /* @__PURE__ */ jsxRuntime.jsx(
4275
+ v2.SubNavHeader,
4276
+ {
4277
+ label,
4278
+ searchable: true,
4279
+ value: search,
4280
+ onChange: handleChangeSearch,
4281
+ onClear: handleClear,
4282
+ searchLabel: formatMessage({
4283
+ id: "content-manager.components.LeftMenu.Search.label",
4284
+ defaultMessage: "Search for a content type"
4285
+ })
4286
+ }
4287
+ ),
4288
+ /* @__PURE__ */ jsxRuntime.jsx(v2.SubNavSections, { children: menu.map((section) => {
4289
+ return /* @__PURE__ */ jsxRuntime.jsx(
4290
+ v2.SubNavSection,
4291
+ {
4292
+ label: section.title,
4293
+ badgeLabel: section.links.length.toString(),
4294
+ children: section.links.map((link) => {
4295
+ return /* @__PURE__ */ jsxRuntime.jsx(
4296
+ v2.SubNavLink,
4297
+ {
4298
+ as: reactRouterDom.NavLink,
4299
+ to: {
4300
+ pathname: link.to,
4301
+ /**
4302
+ * We re-add the plugins query to the params available in the menu,
4303
+ * this means once you've changed the locale in the app, you continue
4304
+ * to see the same locale when changing content-type.
4305
+ *
4306
+ * NOTE: if you go to a content-type that does not have i18n enabled,
4307
+ * we return the default documents anyway.
4308
+ */
4309
+ search: qs.stringify({
4310
+ ...qs.parse(link.search ?? ""),
4311
+ plugins: query.plugins
4312
+ })
4313
+ },
4314
+ children: link.title
4315
+ },
4316
+ link.uid
4317
+ );
4318
+ })
4319
+ },
4320
+ section.id
4321
+ );
4322
+ }) })
4323
+ ] });
4324
+ };
4325
+
4326
+ const contentTypesApi = contentManagerApi.injectEndpoints({
4327
+ endpoints: (builder) => ({
4328
+ getContentTypeConfiguration: builder.query({
4329
+ query: (uid) => ({
4330
+ url: `/content-manager/content-types/${uid}/configuration`,
4331
+ method: "GET"
4332
+ }),
4333
+ transformResponse: (response) => response.data,
4334
+ providesTags: (_result, _error, uid) => [
4335
+ { type: "ContentTypesConfiguration", id: uid },
4336
+ { type: "ContentTypeSettings", id: "LIST" }
4337
+ ]
4338
+ }),
4339
+ getAllContentTypeSettings: builder.query({
4340
+ query: () => "/content-manager/content-types-settings",
4341
+ transformResponse: (response) => response.data,
4342
+ providesTags: [{ type: "ContentTypeSettings", id: "LIST" }]
4343
+ }),
4344
+ updateContentTypeConfiguration: builder.mutation({
4345
+ query: ({ uid, ...body }) => ({
4346
+ url: `/content-manager/content-types/${uid}/configuration`,
4347
+ method: "PUT",
4348
+ data: body
4349
+ }),
4350
+ transformResponse: (response) => response.data,
4351
+ invalidatesTags: (_result, _error, { uid }) => [
4352
+ { type: "ContentTypesConfiguration", id: uid },
4353
+ { type: "ContentTypeSettings", id: "LIST" },
4354
+ // Is this necessary?
4355
+ { type: "InitialData" }
4356
+ ]
4357
+ })
4358
+ })
4359
+ });
4360
+ const {
4361
+ useGetContentTypeConfigurationQuery,
4362
+ useGetAllContentTypeSettingsQuery,
4363
+ useUpdateContentTypeConfigurationMutation
4364
+ } = contentTypesApi;
4365
+
4366
+ const { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;
4367
+ const useContentManagerInitData = () => {
4368
+ const dispatch = useTypedDispatch();
4369
+ const { toggleNotification } = useNotification();
4370
+ const runHookWaterfall = useStrapiApp(
4371
+ "useContentManagerInitData",
4372
+ (state2) => state2.runHookWaterfall
4373
+ );
4374
+ const { notifyStatus } = designSystem.useNotifyAT();
4375
+ const { formatMessage } = reactIntl.useIntl();
4376
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);
4377
+ const checkUserHasPermissions = useAuth(
4378
+ "useContentManagerInitData",
4379
+ (state2) => state2.checkUserHasPermissions
4380
+ );
4381
+ const state = useTypedSelector((state2) => state2["content-manager_app"]);
4382
+ const initialDataQuery = useGetInitialDataQuery(void 0, {
4383
+ /**
4384
+ * TODO: remove this when the CTB has been refactored to use redux-toolkit-query
4385
+ * and it can invalidate the cache on mutation
4386
+ */
4387
+ refetchOnMountOrArgChange: true
4388
+ });
4389
+ React.useEffect(() => {
4390
+ if (initialDataQuery.data) {
4391
+ notifyStatus(
4392
+ formatMessage({
4393
+ id: getTranslation("App.schemas.data-loaded"),
4394
+ defaultMessage: "The schemas have been successfully loaded."
4395
+ })
4396
+ );
4397
+ }
4398
+ }, [formatMessage, initialDataQuery.data, notifyStatus]);
4399
+ React.useEffect(() => {
4400
+ if (initialDataQuery.error) {
4401
+ toggleNotification({ type: "danger", message: formatAPIError(initialDataQuery.error) });
4402
+ }
4403
+ }, [formatAPIError, initialDataQuery.error, toggleNotification]);
4404
+ const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();
4405
+ React.useEffect(() => {
4406
+ if (contentTypeSettingsQuery.error) {
4407
+ toggleNotification({
4408
+ type: "danger",
4409
+ message: formatAPIError(contentTypeSettingsQuery.error)
4410
+ });
4411
+ }
4412
+ }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);
4413
+ const formatData = async (components, contentTypes, fieldSizes, contentTypeConfigurations) => {
4414
+ const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } = contentTypes.reduce(
4415
+ (acc, model) => {
4416
+ acc[model.kind].push(model);
4417
+ return acc;
4418
+ },
4419
+ {
4420
+ collectionType: [],
4421
+ singleType: []
4422
+ }
4423
+ );
4424
+ const collectionTypeSectionLinks = generateLinks(
4425
+ collectionTypeLinks,
4426
+ "collectionTypes",
4427
+ contentTypeConfigurations
4428
+ );
4429
+ const singleTypeSectionLinks = generateLinks(singleTypeLinks, "singleTypes");
4430
+ const collectionTypeLinksPermissions = await Promise.all(
4431
+ collectionTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))
4432
+ );
4433
+ const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter(
4434
+ (_, index) => collectionTypeLinksPermissions[index]
4435
+ );
4436
+ const singleTypeLinksPermissions = await Promise.all(
4437
+ singleTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))
4438
+ );
4439
+ const authorizedSingleTypeLinks = singleTypeSectionLinks.filter(
4440
+ (_, index) => singleTypeLinksPermissions[index]
4441
+ );
4442
+ const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {
4443
+ ctLinks: authorizedCollectionTypeLinks,
4444
+ models: contentTypes
4445
+ });
4446
+ const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {
4447
+ stLinks: authorizedSingleTypeLinks,
4448
+ models: contentTypes
4449
+ });
4450
+ dispatch({
4451
+ type: SET_INIT_DATA,
4452
+ authorizedCollectionTypeLinks: ctLinks,
4453
+ authorizedSingleTypeLinks: stLinks,
4454
+ contentTypeSchemas: contentTypes,
4455
+ components,
4456
+ fieldSizes
4457
+ });
4458
+ };
4459
+ React.useEffect(() => {
4460
+ if (initialDataQuery.data && contentTypeSettingsQuery.data) {
4461
+ formatData(
4462
+ initialDataQuery.data.components,
4463
+ initialDataQuery.data.contentTypes,
4464
+ initialDataQuery.data.fieldSizes,
4465
+ contentTypeSettingsQuery.data
4466
+ );
4467
+ }
4468
+ }, [initialDataQuery.data, contentTypeSettingsQuery.data]);
4469
+ return { ...state };
4470
+ };
4471
+ const generateLinks = (links, type, configurations = []) => {
4472
+ return links.filter((link) => link.isDisplayed).map((link) => {
4473
+ const collectionTypesPermissions = [
4474
+ { action: "plugin::content-manager.explorer.create", subject: link.uid },
4475
+ { action: "plugin::content-manager.explorer.read", subject: link.uid }
4476
+ ];
4477
+ const singleTypesPermissions = [
4478
+ { action: "plugin::content-manager.explorer.read", subject: link.uid }
4479
+ ];
4480
+ const permissions = type === "collectionTypes" ? collectionTypesPermissions : singleTypesPermissions;
4481
+ const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);
4482
+ let search = null;
4483
+ if (currentContentTypeConfig) {
4484
+ const searchParams = {
4485
+ page: 1,
4486
+ pageSize: currentContentTypeConfig.settings.pageSize,
4487
+ sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`
4488
+ };
4489
+ search = qs.stringify(searchParams, { encode: false });
4490
+ }
4491
+ return {
4492
+ permissions,
4493
+ search,
4494
+ kind: link.kind,
4495
+ title: link.info.displayName,
4496
+ to: `/content-manager/${link.kind === "collectionType" ? COLLECTION_TYPES : SINGLE_TYPES}/${link.uid}`,
4497
+ uid: link.uid,
4498
+ // Used for the list item key in the helper plugin
4499
+ name: link.uid,
4500
+ isDisplayed: link.isDisplayed
4501
+ };
4502
+ });
4503
+ };
4504
+
4505
+ const Layout = () => {
4506
+ const contentTypeMatch = reactRouterDom.useMatch("/content-manager/:kind/:uid/*");
4507
+ const { isLoading, collectionTypeLinks, models, singleTypeLinks } = useContentManagerInitData();
4508
+ const authorisedModels = [...collectionTypeLinks, ...singleTypeLinks].sort(
4509
+ (a, b) => a.title.localeCompare(b.title)
4510
+ );
4511
+ const { pathname } = reactRouterDom.useLocation();
4512
+ const { formatMessage } = reactIntl.useIntl();
4513
+ const startSection = useGuidedTour("Layout", (state) => state.startSection);
4514
+ const startSectionRef = React__namespace.useRef(startSection);
4515
+ const isHistoryRoute = useIsHistoryRoute();
4516
+ React__namespace.useEffect(() => {
4517
+ if (startSectionRef.current) {
4518
+ startSectionRef.current("contentManager");
4519
+ }
4520
+ }, []);
4521
+ if (isLoading) {
4522
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4523
+ /* @__PURE__ */ jsxRuntime.jsx(
4524
+ reactHelmet.Helmet,
4525
+ {
4526
+ title: formatMessage({
4527
+ id: getTranslation("plugin.name"),
4528
+ defaultMessage: "Content Manager"
4529
+ })
4530
+ }
4531
+ ),
4532
+ /* @__PURE__ */ jsxRuntime.jsx(Page.Loading, {})
4533
+ ] });
4534
+ }
4535
+ const supportedModelsToDisplay = models.filter(({ isDisplayed }) => isDisplayed);
4536
+ if (authorisedModels.length === 0 && supportedModelsToDisplay.length > 0 && pathname !== "/content-manager/403") {
4537
+ return /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Navigate, { to: "/403" });
4538
+ }
4539
+ if (supportedModelsToDisplay.length === 0 && pathname !== "/no-content-types") {
4540
+ return /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Navigate, { to: "/no-content-types" });
4541
+ }
4542
+ if (!contentTypeMatch && authorisedModels.length > 0) {
4543
+ return /* @__PURE__ */ jsxRuntime.jsx(
4544
+ reactRouterDom.Navigate,
4545
+ {
4546
+ to: {
4547
+ pathname: authorisedModels[0].to,
4548
+ search: authorisedModels[0].search ?? ""
4549
+ }
4550
+ }
4551
+ );
4552
+ }
4553
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
4554
+ /* @__PURE__ */ jsxRuntime.jsx(
4555
+ reactHelmet.Helmet,
4556
+ {
4557
+ title: formatMessage({
4558
+ id: getTranslation("plugin.name"),
4559
+ defaultMessage: "Content Manager"
4560
+ })
4561
+ }
4562
+ ),
4563
+ isHistoryRoute ? /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Outlet, {}) : /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Layout, { sideNav: /* @__PURE__ */ jsxRuntime.jsx(LeftMenu, {}), children: [
4564
+ /* @__PURE__ */ jsxRuntime.jsx(DragLayer, { renderItem: renderDraglayerItem }),
4565
+ /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Outlet, {})
4566
+ ] })
4567
+ ] });
4568
+ };
4569
+ function renderDraglayerItem({ type, item }) {
4570
+ if (!type || type && typeof type !== "string") {
4571
+ return null;
4572
+ }
4573
+ const [actualType] = type.split("_");
4574
+ switch (actualType) {
4575
+ case ItemTypes.EDIT_FIELD:
4576
+ case ItemTypes.FIELD:
4577
+ return /* @__PURE__ */ jsxRuntime.jsx(CardDragPreview, { label: item.label });
4578
+ case ItemTypes.COMPONENT:
4579
+ case ItemTypes.DYNAMIC_ZONE:
4580
+ return /* @__PURE__ */ jsxRuntime.jsx(ComponentDragPreview, { displayedValue: item.displayedValue });
4581
+ case ItemTypes.RELATION:
4582
+ return /* @__PURE__ */ jsxRuntime.jsx(RelationDragPreview, { ...item });
4583
+ default:
4584
+ return null;
4585
+ }
4586
+ }
4587
+ const SET_INIT_DATA = "ContentManager/App/SET_INIT_DATA";
4588
+ const initialState$1 = {
4589
+ collectionTypeLinks: [],
4590
+ components: [],
4591
+ fieldSizes: {},
4592
+ models: [],
4593
+ singleTypeLinks: [],
4594
+ isLoading: true
4595
+ };
4596
+ const reducer$2 = (state = initialState$1, action) => immer.produce(state, (draftState) => {
4597
+ switch (action.type) {
4598
+ case SET_INIT_DATA: {
4599
+ const initDataAction = action;
4600
+ draftState.collectionTypeLinks = initDataAction.authorizedCollectionTypeLinks.filter(
4601
+ ({ isDisplayed }) => isDisplayed
4602
+ );
4603
+ draftState.singleTypeLinks = initDataAction.authorizedSingleTypeLinks.filter(
4604
+ ({ isDisplayed }) => isDisplayed
4605
+ );
4606
+ draftState.components = initDataAction.components;
4607
+ draftState.models = initDataAction.contentTypeSchemas;
4608
+ draftState.fieldSizes = initDataAction.fieldSizes;
4609
+ draftState.isLoading = false;
4610
+ break;
4611
+ }
4612
+ default:
4613
+ return draftState;
4614
+ }
4615
+ });
4616
+
4617
+ const layout = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
4618
+ __proto__: null,
4619
+ Layout,
4620
+ SET_INIT_DATA,
4621
+ reducer: reducer$2
4622
+ }, Symbol.toStringTag, { value: 'Module' }));
4623
+
4624
+ const initialState = {
4625
+ permissions: void 0
4626
+ };
4627
+ const rbacSlice = toolkit.createSlice({
4628
+ name: "rbac",
4629
+ initialState,
4630
+ reducers: {
4631
+ setPermissions(state, action) {
4632
+ state.permissions = Object.values(action.payload.permissions).reduce((acc, current) => {
4633
+ return [...acc, ...current];
4634
+ }, []);
4635
+ },
4636
+ resetPermissions(state) {
4637
+ state.permissions = void 0;
4638
+ }
4639
+ }
4640
+ });
4641
+ const { actions, reducer: reducer$1 } = rbacSlice;
4642
+ const { setPermissions, resetPermissions } = actions;
4643
+
4644
+ const reducer = toolkit.combineReducers({
4645
+ rbac: reducer$1
4646
+ });
4647
+
4648
+ exports.ADMIN_PERMISSIONS_CE = ADMIN_PERMISSIONS_CE;
4649
+ exports.ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD = ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD;
4650
+ exports.AppInfoProvider = AppInfoProvider;
4651
+ exports.AuthProvider = AuthProvider;
4652
+ exports.Blocker = Blocker;
4653
+ exports.COLLECTION_TYPES = COLLECTION_TYPES;
4654
+ exports.CREATED_AT_ATTRIBUTE_NAME = CREATED_AT_ATTRIBUTE_NAME;
4655
+ exports.CREATED_BY_ATTRIBUTE_NAME = CREATED_BY_ATTRIBUTE_NAME;
4656
+ exports.CREATOR_FIELDS = CREATOR_FIELDS;
4657
+ exports.CardDragPreview = CardDragPreview;
4658
+ exports.ComponentProvider = ComponentProvider;
4659
+ exports.ConfigurationContextProvider = ConfigurationContextProvider;
4660
+ exports.ConfigurationProvider = ConfigurationProvider;
4661
+ exports.DIRECTIONS = DIRECTIONS;
4662
+ exports.DOCUMENT_META_FIELDS = DOCUMENT_META_FIELDS;
4663
+ exports.DocumentStatus = DocumentStatus;
4664
+ exports.DragLayer = DragLayer;
4665
+ exports.Form = Form;
4666
+ exports.GuidedTourProvider = GuidedTourProvider;
4667
+ exports.HOOKS = HOOKS;
4668
+ exports.ItemTypes = ItemTypes;
4669
+ exports.LANGUAGE_LOCAL_STORAGE_KEY = LANGUAGE_LOCAL_STORAGE_KEY;
4670
+ exports.LanguageProvider = LanguageProvider;
4671
+ exports.NotificationsProvider = NotificationsProvider;
4672
+ exports.PUBLISHED_AT_ATTRIBUTE_NAME = PUBLISHED_AT_ATTRIBUTE_NAME;
4673
+ exports.PUBLISHED_BY_ATTRIBUTE_NAME = PUBLISHED_BY_ATTRIBUTE_NAME;
4674
+ exports.Page = Page;
4675
+ exports.RelationsField = RelationsField;
4676
+ exports.SETTINGS_LINKS_CE = SETTINGS_LINKS_CE;
4677
+ exports.SINGLE_TYPES = SINGLE_TYPES;
4678
+ exports.StrapiAppProvider = StrapiAppProvider;
4679
+ exports.THEME_LOCAL_STORAGE_KEY = THEME_LOCAL_STORAGE_KEY;
4680
+ exports.Theme = Theme;
4681
+ exports.TrackingProvider = TrackingProvider;
4682
+ exports.UPDATED_AT_ATTRIBUTE_NAME = UPDATED_AT_ATTRIBUTE_NAME;
4683
+ exports.UPDATED_BY_ATTRIBUTE_NAME = UPDATED_BY_ATTRIBUTE_NAME;
4684
+ exports.adminApi = adminApi;
4685
+ exports.buildValidParams = buildValidParams;
4686
+ exports.capitalise = capitalise;
4687
+ exports.contentManagerApi = contentManagerApi;
4688
+ exports.createContext = createContext;
4689
+ exports.createTypedSelector = createTypedSelector;
4690
+ exports.createYupSchema = createYupSchema;
4691
+ exports.errorsTrads = errorsTrads;
4692
+ exports.extractContentTypeComponents = extractContentTypeComponents;
4693
+ exports.getFetchClient = getFetchClient;
4694
+ exports.getIn = getIn;
4695
+ exports.getRelationLabel = getRelationLabel;
4696
+ exports.getTranslation = getTranslation;
4697
+ exports.isBaseQueryError = isBaseQueryError;
4698
+ exports.isObject = isObject;
4699
+ exports.layout = layout;
4700
+ exports.prefixFileUrlWithBackendUrl = prefixFileUrlWithBackendUrl;
4701
+ exports.reducer = reducer$5;
4702
+ exports.reducer$1 = reducer$2;
4703
+ exports.reducer$2 = reducer;
4704
+ exports.resetPermissions = resetPermissions;
4705
+ exports.routes = routes;
4706
+ exports.setAppTheme = setAppTheme;
4707
+ exports.setIn = setIn;
4708
+ exports.setLocale = setLocale;
4709
+ exports.setPermissions = setPermissions;
4710
+ exports.useAPIErrorHandler = useAPIErrorHandler;
4711
+ exports.useAppInfo = useAppInfo;
4712
+ exports.useAuth = useAuth;
4713
+ exports.useAutoCloneDocumentMutation = useAutoCloneDocumentMutation;
4714
+ exports.useCloneDocumentMutation = useCloneDocumentMutation;
4715
+ exports.useComponent = useComponent;
4716
+ exports.useConfiguration = useConfiguration;
4717
+ exports.useContentTypeSchema = useContentTypeSchema;
4718
+ exports.useCreateDocumentMutation = useCreateDocumentMutation;
4719
+ exports.useDeleteDocumentMutation = useDeleteDocumentMutation;
4720
+ exports.useDiscardDocumentMutation = useDiscardDocumentMutation;
4721
+ exports.useDoc = useDoc;
4722
+ exports.useDocument = useDocument;
4723
+ exports.useDragAndDrop = useDragAndDrop;
4724
+ exports.useField = useField;
4725
+ exports.useFocusInputField = useFocusInputField;
4726
+ exports.useForgotPasswordMutation = useForgotPasswordMutation;
4727
+ exports.useForm = useForm;
4728
+ exports.useGetAllDocumentsQuery = useGetAllDocumentsQuery;
4729
+ exports.useGetContentTypeConfigurationQuery = useGetContentTypeConfigurationQuery;
4730
+ exports.useGetInitialDataQuery = useGetInitialDataQuery;
4731
+ exports.useGetLicenseLimitsQuery = useGetLicenseLimitsQuery;
4732
+ exports.useGetPluginsQuery = useGetPluginsQuery;
4733
+ exports.useGetProviderOptionsQuery = useGetProviderOptionsQuery;
4734
+ exports.useGetProvidersQuery = useGetProvidersQuery;
4735
+ exports.useGetRegistrationInfoQuery = useGetRegistrationInfoQuery;
4736
+ exports.useGetRelationsQuery = useGetRelationsQuery;
4737
+ exports.useGuidedTour = useGuidedTour;
4738
+ exports.useInformationQuery = useInformationQuery;
4739
+ exports.useInitQuery = useInitQuery;
4740
+ exports.useIsHistoryRoute = useIsHistoryRoute;
4741
+ exports.useIsSSOLockedQuery = useIsSSOLockedQuery;
4742
+ exports.useLazyGetDocumentQuery = useLazyGetDocumentQuery;
4743
+ exports.useNotification = useNotification;
4744
+ exports.usePrev = usePrev;
4745
+ exports.usePublishDocumentMutation = usePublishDocumentMutation;
4746
+ exports.useQueryParams = useQueryParams;
4747
+ exports.useRBAC = useRBAC;
4748
+ exports.useRegenerateTokenMutation = useRegenerateTokenMutation;
4749
+ exports.useRegisterAdminMutation = useRegisterAdminMutation;
4750
+ exports.useRegisterUserMutation = useRegisterUserMutation;
4751
+ exports.useResetPasswordMutation = useResetPasswordMutation;
4752
+ exports.useStrapiApp = useStrapiApp;
4753
+ exports.useTracking = useTracking;
4754
+ exports.useTypedDispatch = useTypedDispatch;
4755
+ exports.useTypedSelector = useTypedSelector;
4756
+ exports.useTypedStore = useTypedStore;
4757
+ exports.useUnpublishDocumentMutation = useUnpublishDocumentMutation;
4758
+ exports.useUpdateContentTypeConfigurationMutation = useUpdateContentTypeConfigurationMutation;
4759
+ exports.useUpdateDocumentMutation = useUpdateDocumentMutation;
4760
+ exports.useUpdateMeMutation = useUpdateMeMutation;
4761
+ exports.useUpdateProviderOptionsMutation = useUpdateProviderOptionsMutation;
4762
+ //# sourceMappingURL=reducers-uDxSALD_.js.map