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