@strapi/admin 5.0.0-beta.1 → 5.0.0-beta.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 (1022) hide show
  1. package/dist/admin/AdminSeatInfo-H5eNy3Gq.js +105 -0
  2. package/dist/admin/AdminSeatInfo-H5eNy3Gq.js.map +1 -0
  3. package/dist/admin/AdminSeatInfo-jPH1stsB.mjs +101 -0
  4. package/dist/admin/AdminSeatInfo-jPH1stsB.mjs.map +1 -0
  5. package/dist/admin/ApplicationInfoPage-QiVVy6LS.mjs +664 -0
  6. package/dist/admin/ApplicationInfoPage-QiVVy6LS.mjs.map +1 -0
  7. package/dist/admin/ApplicationInfoPage-leY1AEgo.js +692 -0
  8. package/dist/admin/ApplicationInfoPage-leY1AEgo.js.map +1 -0
  9. package/dist/admin/AuthResponse-5G-7aJDM.mjs +43 -0
  10. package/dist/admin/AuthResponse-5G-7aJDM.mjs.map +1 -0
  11. package/dist/admin/AuthResponse-kdo9DYPT.js +70 -0
  12. package/dist/admin/AuthResponse-kdo9DYPT.js.map +1 -0
  13. package/dist/admin/AuthenticatedLayout-1x0WC6c6.js +1121 -0
  14. package/dist/admin/AuthenticatedLayout-1x0WC6c6.js.map +1 -0
  15. package/dist/admin/AuthenticatedLayout-zaOd05gw.mjs +1088 -0
  16. package/dist/admin/AuthenticatedLayout-zaOd05gw.mjs.map +1 -0
  17. package/dist/admin/CreateActionEE-2DKYzbq_.js +61 -0
  18. package/dist/admin/CreateActionEE-2DKYzbq_.js.map +1 -0
  19. package/dist/admin/CreateActionEE-TcGdWjIN.mjs +53 -0
  20. package/dist/admin/CreateActionEE-TcGdWjIN.mjs.map +1 -0
  21. package/dist/admin/CreatePage-J84OUqE4.js +269 -0
  22. package/dist/admin/CreatePage-J84OUqE4.js.map +1 -0
  23. package/dist/admin/CreatePage-gSoe3n8A.mjs +13 -0
  24. package/dist/admin/CreatePage-gSoe3n8A.mjs.map +1 -0
  25. package/dist/admin/CreatePage-pniatTP-.mjs +240 -0
  26. package/dist/admin/CreatePage-pniatTP-.mjs.map +1 -0
  27. package/dist/admin/CreatePage-z4ERqv1R.js +18 -0
  28. package/dist/admin/CreatePage-z4ERqv1R.js.map +1 -0
  29. package/dist/admin/CreateView-BdO0Pvex.mjs +13 -0
  30. package/dist/admin/CreateView-BdO0Pvex.mjs.map +1 -0
  31. package/dist/admin/CreateView-JNmfRawb.js +17 -0
  32. package/dist/admin/CreateView-JNmfRawb.js.map +1 -0
  33. package/dist/admin/CreateView-NwMXZjDh.js +17 -0
  34. package/dist/admin/CreateView-NwMXZjDh.js.map +1 -0
  35. package/dist/admin/CreateView-sFb3ySEj.mjs +13 -0
  36. package/dist/admin/CreateView-sFb3ySEj.mjs.map +1 -0
  37. package/dist/admin/EditPage-3wx6NJgA.mjs +790 -0
  38. package/dist/admin/EditPage-3wx6NJgA.mjs.map +1 -0
  39. package/dist/admin/EditPage-IQRLHMer.mjs +322 -0
  40. package/dist/admin/EditPage-IQRLHMer.mjs.map +1 -0
  41. package/dist/admin/EditPage-dAyJwJfs.js +351 -0
  42. package/dist/admin/EditPage-dAyJwJfs.js.map +1 -0
  43. package/dist/admin/EditPage-eR6riBsR.js +818 -0
  44. package/dist/admin/EditPage-eR6riBsR.js.map +1 -0
  45. package/dist/admin/EditPage-rdOE18EC.js +281 -0
  46. package/dist/admin/EditPage-rdOE18EC.js.map +1 -0
  47. package/dist/admin/EditPage-yztdPcnM.mjs +255 -0
  48. package/dist/admin/EditPage-yztdPcnM.mjs.map +1 -0
  49. package/dist/admin/EditView-fbzip_S8.mjs +332 -0
  50. package/dist/admin/EditView-fbzip_S8.mjs.map +1 -0
  51. package/dist/admin/EditView-oyHNBKvL.js +358 -0
  52. package/dist/admin/EditView-oyHNBKvL.js.map +1 -0
  53. package/dist/admin/EditViewPage-LdDGNi6d.js +875 -0
  54. package/dist/admin/EditViewPage-LdDGNi6d.js.map +1 -0
  55. package/dist/admin/EditViewPage-rDgxiutd.mjs +842 -0
  56. package/dist/admin/EditViewPage-rDgxiutd.mjs.map +1 -0
  57. package/dist/admin/EventsTable--peC0Geq.js +36 -0
  58. package/dist/admin/EventsTable--peC0Geq.js.map +1 -0
  59. package/dist/admin/EventsTable-rNMPq-X1.mjs +32 -0
  60. package/dist/admin/EventsTable-rNMPq-X1.mjs.map +1 -0
  61. package/dist/admin/HomePage-14WM2hIE.js +15 -0
  62. package/dist/admin/HomePage-14WM2hIE.js.map +1 -0
  63. package/dist/admin/HomePage-e2Bs6Kar.js +591 -0
  64. package/dist/admin/HomePage-e2Bs6Kar.js.map +1 -0
  65. package/dist/admin/HomePage-qgAro8dS.mjs +563 -0
  66. package/dist/admin/HomePage-qgAro8dS.mjs.map +1 -0
  67. package/dist/admin/HomePage-zQ7HL9y6.mjs +11 -0
  68. package/dist/admin/HomePage-zQ7HL9y6.mjs.map +1 -0
  69. package/dist/admin/InstalledPluginsPage-ZIPyDrzh.js +121 -0
  70. package/dist/admin/InstalledPluginsPage-ZIPyDrzh.js.map +1 -0
  71. package/dist/admin/InstalledPluginsPage-s_PGIc3_.mjs +96 -0
  72. package/dist/admin/InstalledPluginsPage-s_PGIc3_.mjs.map +1 -0
  73. package/dist/admin/Layout-KAX2c8wc.js +232 -0
  74. package/dist/admin/Layout-KAX2c8wc.js.map +1 -0
  75. package/dist/admin/Layout-mEj5c1Bi.mjs +204 -0
  76. package/dist/admin/Layout-mEj5c1Bi.mjs.map +1 -0
  77. package/dist/admin/ListPage-AI8neqxV.mjs +332 -0
  78. package/dist/admin/ListPage-AI8neqxV.mjs.map +1 -0
  79. package/dist/admin/ListPage-ARW72ceH.js +357 -0
  80. package/dist/admin/ListPage-ARW72ceH.js.map +1 -0
  81. package/dist/admin/ListPage-AUimd0cK.js +563 -0
  82. package/dist/admin/ListPage-AUimd0cK.js.map +1 -0
  83. package/dist/admin/ListPage-BIpKdUdv.mjs +486 -0
  84. package/dist/admin/ListPage-BIpKdUdv.mjs.map +1 -0
  85. package/dist/admin/ListPage-DxI49fdQ.js +307 -0
  86. package/dist/admin/ListPage-DxI49fdQ.js.map +1 -0
  87. package/dist/admin/ListPage-MvgbZlgc.js +15 -0
  88. package/dist/admin/ListPage-MvgbZlgc.js.map +1 -0
  89. package/dist/admin/ListPage-ZDEeaYvm.mjs +11 -0
  90. package/dist/admin/ListPage-ZDEeaYvm.mjs.map +1 -0
  91. package/dist/admin/ListPage-asZ9aDzG.mjs +282 -0
  92. package/dist/admin/ListPage-asZ9aDzG.mjs.map +1 -0
  93. package/dist/admin/ListPage-romICg1Z.js +514 -0
  94. package/dist/admin/ListPage-romICg1Z.js.map +1 -0
  95. package/dist/admin/ListPage-tniramRN.mjs +535 -0
  96. package/dist/admin/ListPage-tniramRN.mjs.map +1 -0
  97. package/dist/admin/ListView-1VRmjfh8.js +232 -0
  98. package/dist/admin/ListView-1VRmjfh8.js.map +1 -0
  99. package/dist/admin/ListView-6hlTFx5H.mjs +197 -0
  100. package/dist/admin/ListView-6hlTFx5H.mjs.map +1 -0
  101. package/dist/admin/ListView-GYuN24HV.mjs +206 -0
  102. package/dist/admin/ListView-GYuN24HV.mjs.map +1 -0
  103. package/dist/admin/ListView-ph55AtDF.js +223 -0
  104. package/dist/admin/ListView-ph55AtDF.js.map +1 -0
  105. package/dist/admin/Login-LxE58baP.mjs +31 -0
  106. package/dist/admin/Login-LxE58baP.mjs.map +1 -0
  107. package/dist/admin/Login-WeDT3kAj.js +39 -0
  108. package/dist/admin/Login-WeDT3kAj.js.map +1 -0
  109. package/dist/admin/MagicLinkEE-AO_SBYi5.mjs +27 -0
  110. package/dist/admin/MagicLinkEE-AO_SBYi5.mjs.map +1 -0
  111. package/dist/admin/MagicLinkEE-_fUwHKdf.js +31 -0
  112. package/dist/admin/MagicLinkEE-_fUwHKdf.js.map +1 -0
  113. package/dist/admin/MarketplacePage-26cUn4e5.mjs +1020 -0
  114. package/dist/admin/MarketplacePage-26cUn4e5.mjs.map +1 -0
  115. package/dist/admin/MarketplacePage-m8Lf3adM.js +1051 -0
  116. package/dist/admin/MarketplacePage-m8Lf3adM.js.map +1 -0
  117. package/dist/admin/Ornaments-RhzFP9rf.js +214 -0
  118. package/dist/admin/Ornaments-RhzFP9rf.js.map +1 -0
  119. package/dist/admin/Permissions-NRzJqZEr.js +2086 -0
  120. package/dist/admin/Permissions-NRzJqZEr.js.map +1 -0
  121. package/dist/admin/Permissions-VzklM1ie.mjs +2050 -0
  122. package/dist/admin/Permissions-VzklM1ie.mjs.map +1 -0
  123. package/dist/admin/PrivateRoute-KAM10GGM.js +22 -0
  124. package/dist/admin/PrivateRoute-KAM10GGM.js.map +1 -0
  125. package/dist/admin/PrivateRoute-wDu6Vo0N.mjs +20 -0
  126. package/dist/admin/PrivateRoute-wDu6Vo0N.mjs.map +1 -0
  127. package/dist/admin/ProfilePage-0d-k7mtP.mjs +387 -0
  128. package/dist/admin/ProfilePage-0d-k7mtP.mjs.map +1 -0
  129. package/dist/admin/ProfilePage-oSih4pcL.js +415 -0
  130. package/dist/admin/ProfilePage-oSih4pcL.js.map +1 -0
  131. package/dist/admin/PurchaseAuditLogs-8_4PcW7P.mjs +48 -0
  132. package/dist/admin/PurchaseAuditLogs-8_4PcW7P.mjs.map +1 -0
  133. package/dist/admin/PurchaseAuditLogs-tS_tVSGI.js +52 -0
  134. package/dist/admin/PurchaseAuditLogs-tS_tVSGI.js.map +1 -0
  135. package/dist/admin/PurchaseSingleSignOn--gblfVu6.mjs +51 -0
  136. package/dist/admin/PurchaseSingleSignOn--gblfVu6.mjs.map +1 -0
  137. package/dist/admin/PurchaseSingleSignOn-9SV6-fYs.js +55 -0
  138. package/dist/admin/PurchaseSingleSignOn-9SV6-fYs.js.map +1 -0
  139. package/dist/admin/SelectRoles-V_PZUtVT.mjs +106 -0
  140. package/dist/admin/SelectRoles-V_PZUtVT.mjs.map +1 -0
  141. package/dist/admin/SelectRoles-ZsRUnSdr.js +114 -0
  142. package/dist/admin/SelectRoles-ZsRUnSdr.js.map +1 -0
  143. package/dist/admin/SingleSignOnPage-jtjy4_4U.js +259 -0
  144. package/dist/admin/SingleSignOnPage-jtjy4_4U.js.map +1 -0
  145. package/dist/admin/SingleSignOnPage-kbLz1A_y.mjs +234 -0
  146. package/dist/admin/SingleSignOnPage-kbLz1A_y.mjs.map +1 -0
  147. package/dist/admin/Table-ZFyORhH3.mjs +196 -0
  148. package/dist/admin/Table-ZFyORhH3.mjs.map +1 -0
  149. package/dist/admin/Table-kMt3jQ2g.js +221 -0
  150. package/dist/admin/Table-kMt3jQ2g.js.map +1 -0
  151. package/dist/admin/TokenTypeSelect-Ngz4ONEL.js +386 -0
  152. package/dist/admin/TokenTypeSelect-Ngz4ONEL.js.map +1 -0
  153. package/dist/admin/TokenTypeSelect-oOKwvsQ2.mjs +358 -0
  154. package/dist/admin/TokenTypeSelect-oOKwvsQ2.mjs.map +1 -0
  155. package/dist/admin/UseCasePage-2wum_xzS.mjs +146 -0
  156. package/dist/admin/UseCasePage-2wum_xzS.mjs.map +1 -0
  157. package/dist/admin/UseCasePage-qrhHiF5S.js +175 -0
  158. package/dist/admin/UseCasePage-qrhHiF5S.js.map +1 -0
  159. package/dist/admin/admin-DUKhYsmP.mjs +256 -0
  160. package/dist/admin/admin-DUKhYsmP.mjs.map +1 -0
  161. package/dist/admin/admin-vlKSOeHB.js +274 -0
  162. package/dist/admin/admin-vlKSOeHB.js.map +1 -0
  163. package/dist/admin/apiTokens-dBRuo1wd.mjs +56 -0
  164. package/dist/admin/apiTokens-dBRuo1wd.mjs.map +1 -0
  165. package/dist/admin/apiTokens-lXn03No3.js +62 -0
  166. package/dist/admin/apiTokens-lXn03No3.js.map +1 -0
  167. package/dist/admin/ar-74XpZHjA.js +853 -0
  168. package/dist/admin/ar-74XpZHjA.js.map +1 -0
  169. package/dist/admin/ar-gTQs8p7A.mjs +832 -0
  170. package/dist/admin/ar-gTQs8p7A.mjs.map +1 -0
  171. package/dist/admin/ca-A-U5stlG.mjs +520 -0
  172. package/dist/admin/ca-A-U5stlG.mjs.map +1 -0
  173. package/dist/admin/ca-tfhzbe_0.js +538 -0
  174. package/dist/admin/ca-tfhzbe_0.js.map +1 -0
  175. package/dist/admin/constants-enREoOEa.mjs +52 -0
  176. package/dist/admin/constants-enREoOEa.mjs.map +1 -0
  177. package/dist/admin/constants-jQFnBWVd.js +60 -0
  178. package/dist/admin/constants-jQFnBWVd.js.map +1 -0
  179. package/dist/admin/cs-iYqoHUVt.mjs +166 -0
  180. package/dist/admin/cs-iYqoHUVt.mjs.map +1 -0
  181. package/dist/admin/cs-sS-228vY.js +179 -0
  182. package/dist/admin/cs-sS-228vY.js.map +1 -0
  183. package/dist/admin/de-og0YSnla.js +532 -0
  184. package/dist/admin/de-og0YSnla.js.map +1 -0
  185. package/dist/admin/de-uZBjRd6a.mjs +514 -0
  186. package/dist/admin/de-uZBjRd6a.mjs.map +1 -0
  187. package/dist/admin/dk-GtDhDxRc.js +452 -0
  188. package/dist/admin/dk-GtDhDxRc.js.map +1 -0
  189. package/dist/admin/dk-nXAO32DE.mjs +434 -0
  190. package/dist/admin/dk-nXAO32DE.mjs.map +1 -0
  191. package/dist/admin/ee.js +12 -0
  192. package/dist/admin/ee.js.map +1 -0
  193. package/dist/admin/ee.mjs +3 -0
  194. package/dist/admin/ee.mjs.map +1 -0
  195. package/dist/admin/en-2FB7x9Rq.js +804 -0
  196. package/dist/admin/en-2FB7x9Rq.js.map +1 -0
  197. package/dist/admin/en-qvX6GTOD.mjs +783 -0
  198. package/dist/admin/en-qvX6GTOD.mjs.map +1 -0
  199. package/dist/admin/es-TQtY4G8X.js +615 -0
  200. package/dist/admin/es-TQtY4G8X.js.map +1 -0
  201. package/dist/admin/es-i0dEHPPQ.mjs +595 -0
  202. package/dist/admin/es-i0dEHPPQ.mjs.map +1 -0
  203. package/dist/admin/eu-SRdPRyQu.js +645 -0
  204. package/dist/admin/eu-SRdPRyQu.js.map +1 -0
  205. package/dist/admin/eu-wFmYHERY.mjs +625 -0
  206. package/dist/admin/eu-wFmYHERY.mjs.map +1 -0
  207. package/dist/admin/fr-GW5-kEO9.js +571 -0
  208. package/dist/admin/fr-GW5-kEO9.js.map +1 -0
  209. package/dist/admin/fr-OI7VyC_k.mjs +550 -0
  210. package/dist/admin/fr-OI7VyC_k.mjs.map +1 -0
  211. package/dist/admin/gu-z6qqOLRh.js +438 -0
  212. package/dist/admin/gu-z6qqOLRh.js.map +1 -0
  213. package/dist/admin/gu-zSaMc-a6.mjs +429 -0
  214. package/dist/admin/gu-zSaMc-a6.mjs.map +1 -0
  215. package/dist/admin/he-CLdZZ_n1.js +329 -0
  216. package/dist/admin/he-CLdZZ_n1.js.map +1 -0
  217. package/dist/admin/he-YzAGShlQ.mjs +315 -0
  218. package/dist/admin/he-YzAGShlQ.mjs.map +1 -0
  219. package/dist/admin/hi-3pMoYe6q.js +537 -0
  220. package/dist/admin/hi-3pMoYe6q.js.map +1 -0
  221. package/dist/admin/hi-ZQ4t6UdY.mjs +519 -0
  222. package/dist/admin/hi-ZQ4t6UdY.mjs.map +1 -0
  223. package/dist/admin/hu-O1FJoY8c.mjs +625 -0
  224. package/dist/admin/hu-O1FJoY8c.mjs.map +1 -0
  225. package/dist/admin/hu-VxIqV1X0.js +645 -0
  226. package/dist/admin/hu-VxIqV1X0.js.map +1 -0
  227. package/dist/admin/id-Lb_0kPQU.mjs +290 -0
  228. package/dist/admin/id-Lb_0kPQU.mjs.map +1 -0
  229. package/dist/admin/id-cUUpuxZO.js +303 -0
  230. package/dist/admin/id-cUUpuxZO.js.map +1 -0
  231. package/dist/admin/index-dcaxfEDi.js +5241 -0
  232. package/dist/admin/index-dcaxfEDi.js.map +1 -0
  233. package/dist/admin/index-oBxjGftZ.mjs +5163 -0
  234. package/dist/admin/index-oBxjGftZ.mjs.map +1 -0
  235. package/dist/admin/index.js +26 -27
  236. package/dist/admin/index.js.map +1 -1
  237. package/dist/admin/index.mjs +3 -3
  238. package/dist/admin/it-136monzD.mjs +299 -0
  239. package/dist/admin/it-136monzD.mjs.map +1 -0
  240. package/dist/admin/it-m8H0rXTP.js +312 -0
  241. package/dist/admin/it-m8H0rXTP.js.map +1 -0
  242. package/dist/admin/ja-0-FUC0T4.mjs +434 -0
  243. package/dist/admin/ja-0-FUC0T4.mjs.map +1 -0
  244. package/dist/admin/ja-jhqUhh7F.js +452 -0
  245. package/dist/admin/ja-jhqUhh7F.js.map +1 -0
  246. package/dist/admin/ko-Fq49QS3z.js +451 -0
  247. package/dist/admin/ko-Fq49QS3z.js.map +1 -0
  248. package/dist/admin/ko-H3Y8GpnD.mjs +433 -0
  249. package/dist/admin/ko-H3Y8GpnD.mjs.map +1 -0
  250. package/dist/admin/ml-NPdcpJoN.mjs +519 -0
  251. package/dist/admin/ml-NPdcpJoN.mjs.map +1 -0
  252. package/dist/admin/ml-mLJM4sQP.js +537 -0
  253. package/dist/admin/ml-mLJM4sQP.js.map +1 -0
  254. package/dist/admin/ms-NDmpSkMY.js +213 -0
  255. package/dist/admin/ms-NDmpSkMY.js.map +1 -0
  256. package/dist/admin/ms-v9c434YI.mjs +200 -0
  257. package/dist/admin/ms-v9c434YI.mjs.map +1 -0
  258. package/dist/admin/nl-RREi1JAg.js +641 -0
  259. package/dist/admin/nl-RREi1JAg.js.map +1 -0
  260. package/dist/admin/nl-qHmOt3d1.mjs +621 -0
  261. package/dist/admin/nl-qHmOt3d1.mjs.map +1 -0
  262. package/dist/admin/no-2wT9Jd9n.js +313 -0
  263. package/dist/admin/no-2wT9Jd9n.js.map +1 -0
  264. package/dist/admin/no-XGZQN-Ji.mjs +300 -0
  265. package/dist/admin/no-XGZQN-Ji.mjs.map +1 -0
  266. package/dist/admin/pl-Id5YX-Pw.mjs +519 -0
  267. package/dist/admin/pl-Id5YX-Pw.mjs.map +1 -0
  268. package/dist/admin/pl-kU2npCRO.js +537 -0
  269. package/dist/admin/pl-kU2npCRO.js.map +1 -0
  270. package/dist/admin/pt-BR-0o0Gf-P8.mjs +588 -0
  271. package/dist/admin/pt-BR-0o0Gf-P8.mjs.map +1 -0
  272. package/dist/admin/pt-BR-R-dMJxPL.js +608 -0
  273. package/dist/admin/pt-BR-R-dMJxPL.js.map +1 -0
  274. package/dist/admin/pt-IygqsPYv.js +212 -0
  275. package/dist/admin/pt-IygqsPYv.js.map +1 -0
  276. package/dist/admin/pt-f52AXrxz.mjs +200 -0
  277. package/dist/admin/pt-f52AXrxz.mjs.map +1 -0
  278. package/dist/admin/rbac-WZsv1761.js +1237 -0
  279. package/dist/admin/rbac-WZsv1761.js.map +1 -0
  280. package/dist/admin/rbac-sYT_mXH0.mjs +1171 -0
  281. package/dist/admin/rbac-sYT_mXH0.mjs.map +1 -0
  282. package/dist/admin/ru-5TBoMH_2.js +766 -0
  283. package/dist/admin/ru-5TBoMH_2.js.map +1 -0
  284. package/dist/admin/ru-FpmG9SEf.mjs +745 -0
  285. package/dist/admin/ru-FpmG9SEf.mjs.map +1 -0
  286. package/dist/admin/sa-KUwV8aRB.mjs +519 -0
  287. package/dist/admin/sa-KUwV8aRB.mjs.map +1 -0
  288. package/dist/admin/sa-KmwTiEO5.js +537 -0
  289. package/dist/admin/sa-KmwTiEO5.js.map +1 -0
  290. package/dist/admin/selectors-3gRe5pAj.mjs +6 -0
  291. package/dist/admin/selectors-3gRe5pAj.mjs.map +1 -0
  292. package/dist/admin/selectors-CiTVxP8O.js +8 -0
  293. package/dist/admin/selectors-CiTVxP8O.js.map +1 -0
  294. package/dist/admin/sk-IV2uPmXo.js +503 -0
  295. package/dist/admin/sk-IV2uPmXo.js.map +1 -0
  296. package/dist/admin/sk-g_1C955P.mjs +483 -0
  297. package/dist/admin/sk-g_1C955P.mjs.map +1 -0
  298. package/dist/admin/src/StrapiApp.d.ts +12 -41
  299. package/dist/admin/src/components/Context.d.ts +6 -0
  300. package/dist/admin/src/components/Filters.d.ts +6 -1
  301. package/dist/admin/src/components/Form.d.ts +10 -1
  302. package/dist/admin/src/components/PageHelpers.d.ts +4 -0
  303. package/dist/admin/src/core/apis/rbac.d.ts +24 -0
  304. package/dist/admin/src/core/store/configure.d.ts +7 -18
  305. package/dist/admin/src/core/store/hooks.d.ts +6 -21
  306. package/dist/admin/src/ee.d.ts +5 -0
  307. package/dist/admin/src/features/Auth.d.ts +14 -3
  308. package/dist/admin/src/features/StrapiApp.d.ts +3 -1
  309. package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
  310. package/dist/admin/src/hooks/useContentTypes.d.ts +3 -3
  311. package/dist/admin/src/hooks/useRBAC.d.ts +33 -1
  312. package/dist/admin/src/index.d.ts +8 -4
  313. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
  314. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +1 -1
  315. package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
  316. package/dist/admin/src/selectors.d.ts +4 -14
  317. package/dist/admin/src/services/admin.d.ts +5 -5
  318. package/dist/admin/src/services/api.d.ts +3 -3
  319. package/dist/admin/src/services/apiTokens.d.ts +1 -1
  320. package/dist/admin/src/services/auth.d.ts +10 -10
  321. package/dist/admin/src/services/contentApi.d.ts +1 -1
  322. package/dist/admin/src/services/contentManager.d.ts +2 -2
  323. package/dist/admin/src/services/transferTokens.d.ts +1 -1
  324. package/dist/admin/src/services/users.d.ts +8 -8
  325. package/dist/admin/src/services/webhooks.d.ts +2 -2
  326. package/dist/admin/src/utils/once.d.ts +1 -0
  327. package/dist/admin/src/utils/urls.d.ts +7 -1
  328. package/dist/admin/src/utils/users.d.ts +4 -4
  329. package/dist/admin/sv-Uv9nW9cN.js +640 -0
  330. package/dist/admin/sv-Uv9nW9cN.js.map +1 -0
  331. package/dist/admin/sv-lzyY1dsz.mjs +620 -0
  332. package/dist/admin/sv-lzyY1dsz.mjs.map +1 -0
  333. package/dist/admin/test.js +170 -2649
  334. package/dist/admin/test.js.map +1 -1
  335. package/dist/admin/test.mjs +166 -2645
  336. package/dist/admin/test.mjs.map +1 -1
  337. package/dist/admin/tests/mockData.d.ts +0 -1065
  338. package/dist/admin/tests/store.d.ts +0 -169
  339. package/dist/admin/tests/utils.d.ts +2 -176
  340. package/dist/admin/th-7LJ9Y8EL.mjs +284 -0
  341. package/dist/admin/th-7LJ9Y8EL.mjs.map +1 -0
  342. package/dist/admin/th-SXQwWjv6.js +297 -0
  343. package/dist/admin/th-SXQwWjv6.js.map +1 -0
  344. package/dist/admin/tr-09v-DLMg.mjs +581 -0
  345. package/dist/admin/tr-09v-DLMg.mjs.map +1 -0
  346. package/dist/admin/tr-RBQM-Vq5.js +601 -0
  347. package/dist/admin/tr-RBQM-Vq5.js.map +1 -0
  348. package/dist/admin/transferTokens-5qQjIKFd.js +65 -0
  349. package/dist/admin/transferTokens-5qQjIKFd.js.map +1 -0
  350. package/dist/admin/transferTokens-OLPKYcY_.mjs +59 -0
  351. package/dist/admin/transferTokens-OLPKYcY_.mjs.map +1 -0
  352. package/dist/admin/uk-38IblmOr.mjs +201 -0
  353. package/dist/admin/uk-38IblmOr.mjs.map +1 -0
  354. package/dist/admin/uk-5T4XFIKm.js +214 -0
  355. package/dist/admin/uk-5T4XFIKm.js.map +1 -0
  356. package/dist/admin/useAdminRoles-HWIbyk2Z.mjs +28 -0
  357. package/dist/admin/useAdminRoles-HWIbyk2Z.mjs.map +1 -0
  358. package/dist/admin/useAdminRoles-Q2BxHs4o.js +50 -0
  359. package/dist/admin/useAdminRoles-Q2BxHs4o.js.map +1 -0
  360. package/dist/admin/useEnterprise-DUs6BYlP.js +50 -0
  361. package/dist/admin/useEnterprise-DUs6BYlP.js.map +1 -0
  362. package/dist/admin/useEnterprise-jpsYZWzn.mjs +28 -0
  363. package/dist/admin/useEnterprise-jpsYZWzn.mjs.map +1 -0
  364. package/dist/admin/useLicenseLimitNotification-0UWeCY_u.js +105 -0
  365. package/dist/admin/useLicenseLimitNotification-0UWeCY_u.js.map +1 -0
  366. package/dist/admin/useLicenseLimitNotification-aTNbD3xK.mjs +80 -0
  367. package/dist/admin/useLicenseLimitNotification-aTNbD3xK.mjs.map +1 -0
  368. package/dist/admin/useLicenseLimits-F7K-YWAE.mjs +23 -0
  369. package/dist/admin/useLicenseLimits-F7K-YWAE.mjs.map +1 -0
  370. package/dist/admin/useLicenseLimits-m11DOu9p.js +45 -0
  371. package/dist/admin/useLicenseLimits-m11DOu9p.js.map +1 -0
  372. package/dist/admin/useWebhooks-7BXPSMHG.mjs +91 -0
  373. package/dist/admin/useWebhooks-7BXPSMHG.mjs.map +1 -0
  374. package/dist/admin/useWebhooks-oZ5DKtvz.js +93 -0
  375. package/dist/admin/useWebhooks-oZ5DKtvz.js.map +1 -0
  376. package/dist/admin/users-R5A0kUOV.js +33 -0
  377. package/dist/admin/users-R5A0kUOV.js.map +1 -0
  378. package/dist/admin/users-a4KTyEyc.mjs +30 -0
  379. package/dist/admin/users-a4KTyEyc.mjs.map +1 -0
  380. package/dist/admin/validation-2MGgF10o.js +65 -0
  381. package/dist/admin/validation-2MGgF10o.js.map +1 -0
  382. package/dist/admin/validation-gH-06ERZ.mjs +43 -0
  383. package/dist/admin/validation-gH-06ERZ.mjs.map +1 -0
  384. package/dist/admin/vi-mj-Smy3d.js +200 -0
  385. package/dist/admin/vi-mj-Smy3d.js.map +1 -0
  386. package/dist/admin/vi-ryNZtXtk.mjs +187 -0
  387. package/dist/admin/vi-ryNZtXtk.mjs.map +1 -0
  388. package/dist/admin/zh-6qF5HCOo.js +642 -0
  389. package/dist/admin/zh-6qF5HCOo.js.map +1 -0
  390. package/dist/admin/zh-Hans-HlxDUeVA.mjs +716 -0
  391. package/dist/admin/zh-Hans-HlxDUeVA.mjs.map +1 -0
  392. package/dist/admin/zh-Hans-eWSoi9-X.js +737 -0
  393. package/dist/admin/zh-Hans-eWSoi9-X.js.map +1 -0
  394. package/dist/admin/zh-WEteLuNm.mjs +622 -0
  395. package/dist/admin/zh-WEteLuNm.mjs.map +1 -0
  396. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +1 -1
  397. package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
  398. package/dist/ee/server/index.js +20 -31
  399. package/dist/ee/server/index.js.map +1 -1
  400. package/dist/ee/server/index.mjs +21 -32
  401. package/dist/ee/server/index.mjs.map +1 -1
  402. package/dist/package.json.d.ts +24 -33
  403. package/dist/server/index.js +51 -55
  404. package/dist/server/index.js.map +1 -1
  405. package/dist/server/index.mjs +52 -56
  406. package/dist/server/index.mjs.map +1 -1
  407. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  408. package/dist/server/src/controllers/webhooks.d.ts.map +1 -1
  409. package/dist/server/src/services/passport.d.ts.map +1 -1
  410. package/dist/server/src/validation/project-settings.d.ts +52 -6
  411. package/dist/server/src/validation/project-settings.d.ts.map +1 -1
  412. package/dist/shared/contracts/content-types.d.ts +5 -0
  413. package/dist/shared/contracts/content-types.d.ts.map +1 -0
  414. package/package.json +25 -34
  415. package/dist/admin/AdminSeatInfo-Gp4BFR1_.js +0 -105
  416. package/dist/admin/AdminSeatInfo-Gp4BFR1_.js.map +0 -1
  417. package/dist/admin/AdminSeatInfo-dDgFBcLY.mjs +0 -101
  418. package/dist/admin/AdminSeatInfo-dDgFBcLY.mjs.map +0 -1
  419. package/dist/admin/ApplicationInfoPage-GQLKLk5T.mjs +0 -670
  420. package/dist/admin/ApplicationInfoPage-GQLKLk5T.mjs.map +0 -1
  421. package/dist/admin/ApplicationInfoPage-e_sOqQMh.js +0 -698
  422. package/dist/admin/ApplicationInfoPage-e_sOqQMh.js.map +0 -1
  423. package/dist/admin/AuthResponse-gf-zZkxm.mjs +0 -43
  424. package/dist/admin/AuthResponse-gf-zZkxm.mjs.map +0 -1
  425. package/dist/admin/AuthResponse-l5QiAAK7.js +0 -70
  426. package/dist/admin/AuthResponse-l5QiAAK7.js.map +0 -1
  427. package/dist/admin/AuthenticatedLayout-3fYM18Xy.mjs +0 -1115
  428. package/dist/admin/AuthenticatedLayout-3fYM18Xy.mjs.map +0 -1
  429. package/dist/admin/AuthenticatedLayout-gGQYIisy.js +0 -1148
  430. package/dist/admin/AuthenticatedLayout-gGQYIisy.js.map +0 -1
  431. package/dist/admin/ComponentConfigurationPage-0kf7a5LK.mjs +0 -237
  432. package/dist/admin/ComponentConfigurationPage-0kf7a5LK.mjs.map +0 -1
  433. package/dist/admin/ComponentConfigurationPage-U7RcNJFs.js +0 -262
  434. package/dist/admin/ComponentConfigurationPage-U7RcNJFs.js.map +0 -1
  435. package/dist/admin/ComponentIcon-AkrHxAkm.mjs +0 -158
  436. package/dist/admin/ComponentIcon-AkrHxAkm.mjs.map +0 -1
  437. package/dist/admin/ComponentIcon-wcNWpdCz.js +0 -180
  438. package/dist/admin/ComponentIcon-wcNWpdCz.js.map +0 -1
  439. package/dist/admin/CreateActionEE-HO-FmNjw.js +0 -61
  440. package/dist/admin/CreateActionEE-HO-FmNjw.js.map +0 -1
  441. package/dist/admin/CreateActionEE-OscS6KZj.mjs +0 -53
  442. package/dist/admin/CreateActionEE-OscS6KZj.mjs.map +0 -1
  443. package/dist/admin/CreatePage-1a_Nb-RK.mjs +0 -248
  444. package/dist/admin/CreatePage-1a_Nb-RK.mjs.map +0 -1
  445. package/dist/admin/CreatePage-8rG8fSZv.mjs +0 -245
  446. package/dist/admin/CreatePage-8rG8fSZv.mjs.map +0 -1
  447. package/dist/admin/CreatePage-B0kLot_Q.js +0 -18
  448. package/dist/admin/CreatePage-B0kLot_Q.js.map +0 -1
  449. package/dist/admin/CreatePage-c92hDTE3.mjs +0 -13
  450. package/dist/admin/CreatePage-c92hDTE3.mjs.map +0 -1
  451. package/dist/admin/CreatePage-h9gJgINE.js +0 -274
  452. package/dist/admin/CreatePage-h9gJgINE.js.map +0 -1
  453. package/dist/admin/CreatePage-pN8WcSWM.js +0 -272
  454. package/dist/admin/CreatePage-pN8WcSWM.js.map +0 -1
  455. package/dist/admin/CreateView-Gd7sLphf.js +0 -17
  456. package/dist/admin/CreateView-Gd7sLphf.js.map +0 -1
  457. package/dist/admin/CreateView-PIPvgwa8.mjs +0 -13
  458. package/dist/admin/CreateView-PIPvgwa8.mjs.map +0 -1
  459. package/dist/admin/CreateView-kVD9MjAf.js +0 -17
  460. package/dist/admin/CreateView-kVD9MjAf.js.map +0 -1
  461. package/dist/admin/CreateView-nXkGgZTO.mjs +0 -13
  462. package/dist/admin/CreateView-nXkGgZTO.mjs.map +0 -1
  463. package/dist/admin/EditConfigurationPage-YAS-MAtE.js +0 -155
  464. package/dist/admin/EditConfigurationPage-YAS-MAtE.js.map +0 -1
  465. package/dist/admin/EditConfigurationPage-jugWslla.mjs +0 -130
  466. package/dist/admin/EditConfigurationPage-jugWslla.mjs.map +0 -1
  467. package/dist/admin/EditPage-6pGLGlrZ.mjs +0 -794
  468. package/dist/admin/EditPage-6pGLGlrZ.mjs.map +0 -1
  469. package/dist/admin/EditPage-I99-ASjb.mjs +0 -325
  470. package/dist/admin/EditPage-I99-ASjb.mjs.map +0 -1
  471. package/dist/admin/EditPage-NrM8ZRAf.mjs +0 -303
  472. package/dist/admin/EditPage-NrM8ZRAf.mjs.map +0 -1
  473. package/dist/admin/EditPage-ci9fcWte.js +0 -327
  474. package/dist/admin/EditPage-ci9fcWte.js.map +0 -1
  475. package/dist/admin/EditPage-fT6nuOwT.mjs +0 -260
  476. package/dist/admin/EditPage-fT6nuOwT.mjs.map +0 -1
  477. package/dist/admin/EditPage-hEDFGDcC.js +0 -822
  478. package/dist/admin/EditPage-hEDFGDcC.js.map +0 -1
  479. package/dist/admin/EditPage-m5HVhxC-.js +0 -286
  480. package/dist/admin/EditPage-m5HVhxC-.js.map +0 -1
  481. package/dist/admin/EditPage-um8Yysr-.js +0 -354
  482. package/dist/admin/EditPage-um8Yysr-.js.map +0 -1
  483. package/dist/admin/EditView-79rujo0b.mjs +0 -336
  484. package/dist/admin/EditView-79rujo0b.mjs.map +0 -1
  485. package/dist/admin/EditView-zEf-a-YM.js +0 -362
  486. package/dist/admin/EditView-zEf-a-YM.js.map +0 -1
  487. package/dist/admin/EditViewPage-BJdNfzBZ.mjs +0 -198
  488. package/dist/admin/EditViewPage-BJdNfzBZ.mjs.map +0 -1
  489. package/dist/admin/EditViewPage-Y67V7K7l.js +0 -226
  490. package/dist/admin/EditViewPage-Y67V7K7l.js.map +0 -1
  491. package/dist/admin/EditViewPage-iuq_KY3C.mjs +0 -846
  492. package/dist/admin/EditViewPage-iuq_KY3C.mjs.map +0 -1
  493. package/dist/admin/EditViewPage-vrE8FNb1.js +0 -879
  494. package/dist/admin/EditViewPage-vrE8FNb1.js.map +0 -1
  495. package/dist/admin/EventsTable-LOh2EX0N.mjs +0 -32
  496. package/dist/admin/EventsTable-LOh2EX0N.mjs.map +0 -1
  497. package/dist/admin/EventsTable-bm16Pj4a.js +0 -36
  498. package/dist/admin/EventsTable-bm16Pj4a.js.map +0 -1
  499. package/dist/admin/FieldTypeIcon-SCwhXPf6.mjs +0 -50
  500. package/dist/admin/FieldTypeIcon-SCwhXPf6.mjs.map +0 -1
  501. package/dist/admin/FieldTypeIcon-u9dTaLwb.js +0 -52
  502. package/dist/admin/FieldTypeIcon-u9dTaLwb.js.map +0 -1
  503. package/dist/admin/Filters-5FAHd62q.js +0 -511
  504. package/dist/admin/Filters-5FAHd62q.js.map +0 -1
  505. package/dist/admin/Filters-hYfcsahl.mjs +0 -489
  506. package/dist/admin/Filters-hYfcsahl.mjs.map +0 -1
  507. package/dist/admin/Form-7gccxUtH.mjs +0 -739
  508. package/dist/admin/Form-7gccxUtH.mjs.map +0 -1
  509. package/dist/admin/Form-m0qUJusG.js +0 -767
  510. package/dist/admin/Form-m0qUJusG.js.map +0 -1
  511. package/dist/admin/History-UVk6YZaL.js +0 -456
  512. package/dist/admin/History-UVk6YZaL.js.map +0 -1
  513. package/dist/admin/History-gNttF1-u.mjs +0 -430
  514. package/dist/admin/History-gNttF1-u.mjs.map +0 -1
  515. package/dist/admin/HomePage-2q7ngwX4.mjs +0 -11
  516. package/dist/admin/HomePage-2q7ngwX4.mjs.map +0 -1
  517. package/dist/admin/HomePage-_eHszm7N.mjs +0 -521
  518. package/dist/admin/HomePage-_eHszm7N.mjs.map +0 -1
  519. package/dist/admin/HomePage-jwm3AAzI.js +0 -530
  520. package/dist/admin/HomePage-jwm3AAzI.js.map +0 -1
  521. package/dist/admin/HomePage-ozwWqZdZ.js +0 -15
  522. package/dist/admin/HomePage-ozwWqZdZ.js.map +0 -1
  523. package/dist/admin/InputRenderer-tdeZayqM.js +0 -5345
  524. package/dist/admin/InputRenderer-tdeZayqM.js.map +0 -1
  525. package/dist/admin/InputRenderer-uXGu-VvL.mjs +0 -5304
  526. package/dist/admin/InputRenderer-uXGu-VvL.mjs.map +0 -1
  527. package/dist/admin/InstalledPluginsPage-rGp1BINi.mjs +0 -101
  528. package/dist/admin/InstalledPluginsPage-rGp1BINi.mjs.map +0 -1
  529. package/dist/admin/InstalledPluginsPage-relNbZiA.js +0 -126
  530. package/dist/admin/InstalledPluginsPage-relNbZiA.js.map +0 -1
  531. package/dist/admin/Layout-JSg7Wwnx.mjs +0 -89
  532. package/dist/admin/Layout-JSg7Wwnx.mjs.map +0 -1
  533. package/dist/admin/Layout-gqm-mRb2.mjs +0 -209
  534. package/dist/admin/Layout-gqm-mRb2.mjs.map +0 -1
  535. package/dist/admin/Layout-rp7YlCuF.js +0 -237
  536. package/dist/admin/Layout-rp7YlCuF.js.map +0 -1
  537. package/dist/admin/Layout-tPXv8ts4.js +0 -97
  538. package/dist/admin/Layout-tPXv8ts4.js.map +0 -1
  539. package/dist/admin/ListConfigurationPage-1JkDop6y.mjs +0 -651
  540. package/dist/admin/ListConfigurationPage-1JkDop6y.mjs.map +0 -1
  541. package/dist/admin/ListConfigurationPage-egv99PTx.js +0 -679
  542. package/dist/admin/ListConfigurationPage-egv99PTx.js.map +0 -1
  543. package/dist/admin/ListPage-5VIwPlnG.js +0 -520
  544. package/dist/admin/ListPage-5VIwPlnG.js.map +0 -1
  545. package/dist/admin/ListPage-85XB15gk.js +0 -305
  546. package/dist/admin/ListPage-85XB15gk.js.map +0 -1
  547. package/dist/admin/ListPage-NG7c9Zx-.js +0 -313
  548. package/dist/admin/ListPage-NG7c9Zx-.js.map +0 -1
  549. package/dist/admin/ListPage-Wf8HxliA.js +0 -15
  550. package/dist/admin/ListPage-Wf8HxliA.js.map +0 -1
  551. package/dist/admin/ListPage-Y0vGfxO1.mjs +0 -492
  552. package/dist/admin/ListPage-Y0vGfxO1.mjs.map +0 -1
  553. package/dist/admin/ListPage-_1MCPNWC.mjs +0 -11
  554. package/dist/admin/ListPage-_1MCPNWC.mjs.map +0 -1
  555. package/dist/admin/ListPage-bdblB4wE.mjs +0 -338
  556. package/dist/admin/ListPage-bdblB4wE.mjs.map +0 -1
  557. package/dist/admin/ListPage-d0uTS6lH.js +0 -363
  558. package/dist/admin/ListPage-d0uTS6lH.js.map +0 -1
  559. package/dist/admin/ListPage-e0975Wh-.js +0 -568
  560. package/dist/admin/ListPage-e0975Wh-.js.map +0 -1
  561. package/dist/admin/ListPage-eMKRFxzM.mjs +0 -288
  562. package/dist/admin/ListPage-eMKRFxzM.mjs.map +0 -1
  563. package/dist/admin/ListPage-tFqx6zb_.mjs +0 -540
  564. package/dist/admin/ListPage-tFqx6zb_.mjs.map +0 -1
  565. package/dist/admin/ListPage-v07yRAHk.mjs +0 -277
  566. package/dist/admin/ListPage-v07yRAHk.mjs.map +0 -1
  567. package/dist/admin/ListView-9shnR2xp.mjs +0 -212
  568. package/dist/admin/ListView-9shnR2xp.mjs.map +0 -1
  569. package/dist/admin/ListView-IaEe1_Uy.js +0 -238
  570. package/dist/admin/ListView-IaEe1_Uy.js.map +0 -1
  571. package/dist/admin/ListView-_EZZ571X.js +0 -228
  572. package/dist/admin/ListView-_EZZ571X.js.map +0 -1
  573. package/dist/admin/ListView-z9G1Eash.mjs +0 -202
  574. package/dist/admin/ListView-z9G1Eash.mjs.map +0 -1
  575. package/dist/admin/ListViewPage-FE12IpwT.mjs +0 -925
  576. package/dist/admin/ListViewPage-FE12IpwT.mjs.map +0 -1
  577. package/dist/admin/ListViewPage-u5WSF93L.js +0 -957
  578. package/dist/admin/ListViewPage-u5WSF93L.js.map +0 -1
  579. package/dist/admin/Login-9iKNSYCJ.mjs +0 -31
  580. package/dist/admin/Login-9iKNSYCJ.mjs.map +0 -1
  581. package/dist/admin/Login-ug0ICazL.js +0 -39
  582. package/dist/admin/Login-ug0ICazL.js.map +0 -1
  583. package/dist/admin/MagicLinkEE-3a4aj5bM.mjs +0 -27
  584. package/dist/admin/MagicLinkEE-3a4aj5bM.mjs.map +0 -1
  585. package/dist/admin/MagicLinkEE-TlpYCgSF.js +0 -31
  586. package/dist/admin/MagicLinkEE-TlpYCgSF.js.map +0 -1
  587. package/dist/admin/MarketplacePage-BBs4GMeX.mjs +0 -1014
  588. package/dist/admin/MarketplacePage-BBs4GMeX.mjs.map +0 -1
  589. package/dist/admin/MarketplacePage-GuZItQkJ.js +0 -1045
  590. package/dist/admin/MarketplacePage-GuZItQkJ.js.map +0 -1
  591. package/dist/admin/NoContentTypePage-MI-TNgDm.mjs +0 -50
  592. package/dist/admin/NoContentTypePage-MI-TNgDm.mjs.map +0 -1
  593. package/dist/admin/NoContentTypePage-WM9PSeKc.js +0 -54
  594. package/dist/admin/NoContentTypePage-WM9PSeKc.js.map +0 -1
  595. package/dist/admin/NoPermissionsPage-K6eIf5zl.mjs +0 -23
  596. package/dist/admin/NoPermissionsPage-K6eIf5zl.mjs.map +0 -1
  597. package/dist/admin/NoPermissionsPage-PP92ItBk.js +0 -27
  598. package/dist/admin/NoPermissionsPage-PP92ItBk.js.map +0 -1
  599. package/dist/admin/NotAllowed-9d8xvtvI.mjs +0 -36
  600. package/dist/admin/NotAllowed-9d8xvtvI.mjs.map +0 -1
  601. package/dist/admin/NotAllowed-FmDlK9I3.js +0 -42
  602. package/dist/admin/NotAllowed-FmDlK9I3.js.map +0 -1
  603. package/dist/admin/Ornaments-fHu7120M.js +0 -214
  604. package/dist/admin/Ornaments-fHu7120M.js.map +0 -1
  605. package/dist/admin/Permissions-jsl-R7bI.js +0 -2082
  606. package/dist/admin/Permissions-jsl-R7bI.js.map +0 -1
  607. package/dist/admin/Permissions-v99MLjbi.mjs +0 -2046
  608. package/dist/admin/Permissions-v99MLjbi.mjs.map +0 -1
  609. package/dist/admin/PrivateRoute-AFoVG5Bk.js +0 -22
  610. package/dist/admin/PrivateRoute-AFoVG5Bk.js.map +0 -1
  611. package/dist/admin/PrivateRoute-XiRz2oSq.mjs +0 -20
  612. package/dist/admin/PrivateRoute-XiRz2oSq.mjs.map +0 -1
  613. package/dist/admin/ProfilePage-HjJiMiTt.mjs +0 -391
  614. package/dist/admin/ProfilePage-HjJiMiTt.mjs.map +0 -1
  615. package/dist/admin/ProfilePage-wGM1mvXn.js +0 -419
  616. package/dist/admin/ProfilePage-wGM1mvXn.js.map +0 -1
  617. package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs +0 -48
  618. package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs.map +0 -1
  619. package/dist/admin/PurchaseAuditLogs-couRts7-.js +0 -52
  620. package/dist/admin/PurchaseAuditLogs-couRts7-.js.map +0 -1
  621. package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs +0 -51
  622. package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs.map +0 -1
  623. package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js +0 -55
  624. package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js.map +0 -1
  625. package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs +0 -51
  626. package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs.map +0 -1
  627. package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js +0 -55
  628. package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js.map +0 -1
  629. package/dist/admin/ReviewWorkflowsColumn-NUu47oVz.mjs +0 -34
  630. package/dist/admin/ReviewWorkflowsColumn-NUu47oVz.mjs.map +0 -1
  631. package/dist/admin/ReviewWorkflowsColumn-uIqJfjyd.js +0 -39
  632. package/dist/admin/ReviewWorkflowsColumn-uIqJfjyd.js.map +0 -1
  633. package/dist/admin/SelectRoles-5vr-vXOm.js +0 -114
  634. package/dist/admin/SelectRoles-5vr-vXOm.js.map +0 -1
  635. package/dist/admin/SelectRoles-ytHc3di2.mjs +0 -106
  636. package/dist/admin/SelectRoles-ytHc3di2.mjs.map +0 -1
  637. package/dist/admin/SingleSignOnPage-1Wqj_7y-.js +0 -263
  638. package/dist/admin/SingleSignOnPage-1Wqj_7y-.js.map +0 -1
  639. package/dist/admin/SingleSignOnPage-7oJES3UH.mjs +0 -238
  640. package/dist/admin/SingleSignOnPage-7oJES3UH.mjs.map +0 -1
  641. package/dist/admin/Table-LQhGojNx.mjs +0 -165
  642. package/dist/admin/Table-LQhGojNx.mjs.map +0 -1
  643. package/dist/admin/Table-M5UsBfFs.js +0 -190
  644. package/dist/admin/Table-M5UsBfFs.js.map +0 -1
  645. package/dist/admin/TokenTypeSelect-5o9mvFd7.mjs +0 -357
  646. package/dist/admin/TokenTypeSelect-5o9mvFd7.mjs.map +0 -1
  647. package/dist/admin/TokenTypeSelect-ZBDI26vJ.js +0 -385
  648. package/dist/admin/TokenTypeSelect-ZBDI26vJ.js.map +0 -1
  649. package/dist/admin/UseCasePage-e7rn-aW-.mjs +0 -146
  650. package/dist/admin/UseCasePage-e7rn-aW-.mjs.map +0 -1
  651. package/dist/admin/UseCasePage-q3u-xs7F.js +0 -175
  652. package/dist/admin/UseCasePage-q3u-xs7F.js.map +0 -1
  653. package/dist/admin/apiTokens-_gKUBKPQ.js +0 -62
  654. package/dist/admin/apiTokens-_gKUBKPQ.js.map +0 -1
  655. package/dist/admin/apiTokens-nD8zbNlc.mjs +0 -56
  656. package/dist/admin/apiTokens-nD8zbNlc.mjs.map +0 -1
  657. package/dist/admin/ar-i6ait0_Z.js +0 -939
  658. package/dist/admin/ar-i6ait0_Z.js.map +0 -1
  659. package/dist/admin/ar-lYsknZVT.mjs +0 -918
  660. package/dist/admin/ar-lYsknZVT.mjs.map +0 -1
  661. package/dist/admin/ca-1Cl4eOmr.js +0 -727
  662. package/dist/admin/ca-1Cl4eOmr.js.map +0 -1
  663. package/dist/admin/ca-ruPjUw52.mjs +0 -709
  664. package/dist/admin/ca-ruPjUw52.mjs.map +0 -1
  665. package/dist/admin/constants-6E1OwHx7.js +0 -197
  666. package/dist/admin/constants-6E1OwHx7.js.map +0 -1
  667. package/dist/admin/constants-AdKxCt0x.mjs +0 -52
  668. package/dist/admin/constants-AdKxCt0x.mjs.map +0 -1
  669. package/dist/admin/constants-D6NLEhwu.mjs +0 -172
  670. package/dist/admin/constants-D6NLEhwu.mjs.map +0 -1
  671. package/dist/admin/constants-DxpaZFhM.mjs +0 -10
  672. package/dist/admin/constants-DxpaZFhM.mjs.map +0 -1
  673. package/dist/admin/constants-ZZWbRAQT.js +0 -60
  674. package/dist/admin/constants-ZZWbRAQT.js.map +0 -1
  675. package/dist/admin/constants-wsN7Fj5H.js +0 -14
  676. package/dist/admin/constants-wsN7Fj5H.js.map +0 -1
  677. package/dist/admin/cs-MneRs5g8.js +0 -294
  678. package/dist/admin/cs-MneRs5g8.js.map +0 -1
  679. package/dist/admin/cs-cEW7Jgll.mjs +0 -281
  680. package/dist/admin/cs-cEW7Jgll.mjs.map +0 -1
  681. package/dist/admin/de-vPJQw5Tm.js +0 -719
  682. package/dist/admin/de-vPJQw5Tm.js.map +0 -1
  683. package/dist/admin/de-xZr3TXsT.mjs +0 -701
  684. package/dist/admin/de-xZr3TXsT.mjs.map +0 -1
  685. package/dist/admin/dk-_Fh6kypZ.js +0 -637
  686. package/dist/admin/dk-_Fh6kypZ.js.map +0 -1
  687. package/dist/admin/dk-nqK-ugFb.mjs +0 -619
  688. package/dist/admin/dk-nqK-ugFb.mjs.map +0 -1
  689. package/dist/admin/en-X84kQxpg.js +0 -1068
  690. package/dist/admin/en-X84kQxpg.js.map +0 -1
  691. package/dist/admin/en-qxG24n4z.mjs +0 -1047
  692. package/dist/admin/en-qxG24n4z.mjs.map +0 -1
  693. package/dist/admin/es-6dicYJQA.mjs +0 -779
  694. package/dist/admin/es-6dicYJQA.mjs.map +0 -1
  695. package/dist/admin/es-FC_8jlK7.js +0 -799
  696. package/dist/admin/es-FC_8jlK7.js.map +0 -1
  697. package/dist/admin/eu-Pzqod2VF.js +0 -835
  698. package/dist/admin/eu-Pzqod2VF.js.map +0 -1
  699. package/dist/admin/eu-l9nvfvQj.mjs +0 -815
  700. package/dist/admin/eu-l9nvfvQj.mjs.map +0 -1
  701. package/dist/admin/fr-8h2tzs3Z.js +0 -765
  702. package/dist/admin/fr-8h2tzs3Z.js.map +0 -1
  703. package/dist/admin/fr-97oVHDGZ.mjs +0 -744
  704. package/dist/admin/fr-97oVHDGZ.mjs.map +0 -1
  705. package/dist/admin/gu-YXP9LW1p.mjs +0 -617
  706. package/dist/admin/gu-YXP9LW1p.mjs.map +0 -1
  707. package/dist/admin/gu-fkXeW5oU.js +0 -626
  708. package/dist/admin/gu-fkXeW5oU.js.map +0 -1
  709. package/dist/admin/he-Rnd0orlz.mjs +0 -315
  710. package/dist/admin/he-Rnd0orlz.mjs.map +0 -1
  711. package/dist/admin/he-YNZzVWgP.js +0 -329
  712. package/dist/admin/he-YNZzVWgP.js.map +0 -1
  713. package/dist/admin/hi-42LJgJV1.mjs +0 -707
  714. package/dist/admin/hi-42LJgJV1.mjs.map +0 -1
  715. package/dist/admin/hi-ubgoUzQ0.js +0 -725
  716. package/dist/admin/hi-ubgoUzQ0.js.map +0 -1
  717. package/dist/admin/hu-oHJgjivB.js +0 -835
  718. package/dist/admin/hu-oHJgjivB.js.map +0 -1
  719. package/dist/admin/hu-xsansjmF.mjs +0 -815
  720. package/dist/admin/hu-xsansjmF.mjs.map +0 -1
  721. package/dist/admin/id-JurRr0gC.mjs +0 -438
  722. package/dist/admin/id-JurRr0gC.mjs.map +0 -1
  723. package/dist/admin/id-T2ge96wh.js +0 -451
  724. package/dist/admin/id-T2ge96wh.js.map +0 -1
  725. package/dist/admin/index-1NFAbkxM.mjs +0 -5927
  726. package/dist/admin/index-1NFAbkxM.mjs.map +0 -1
  727. package/dist/admin/index-mQQPK-ix.js +0 -6023
  728. package/dist/admin/index-mQQPK-ix.js.map +0 -1
  729. package/dist/admin/it-890_w-P3.mjs +0 -449
  730. package/dist/admin/it-890_w-P3.mjs.map +0 -1
  731. package/dist/admin/it-uWPMs24z.js +0 -462
  732. package/dist/admin/it-uWPMs24z.js.map +0 -1
  733. package/dist/admin/ja-F61alnK1.mjs +0 -618
  734. package/dist/admin/ja-F61alnK1.mjs.map +0 -1
  735. package/dist/admin/ja-pw-zE8MH.js +0 -636
  736. package/dist/admin/ja-pw-zE8MH.js.map +0 -1
  737. package/dist/admin/ko-DfQWK5T3.mjs +0 -616
  738. package/dist/admin/ko-DfQWK5T3.mjs.map +0 -1
  739. package/dist/admin/ko-XhK2FY3_.js +0 -634
  740. package/dist/admin/ko-XhK2FY3_.js.map +0 -1
  741. package/dist/admin/ml-EVaVYywL.mjs +0 -707
  742. package/dist/admin/ml-EVaVYywL.mjs.map +0 -1
  743. package/dist/admin/ml-hT2VI8JA.js +0 -725
  744. package/dist/admin/ml-hT2VI8JA.js.map +0 -1
  745. package/dist/admin/ms-CzgcVrsY.mjs +0 -332
  746. package/dist/admin/ms-CzgcVrsY.mjs.map +0 -1
  747. package/dist/admin/ms-DoMJCZ42.js +0 -345
  748. package/dist/admin/ms-DoMJCZ42.js.map +0 -1
  749. package/dist/admin/nl-LLi_sx9P.js +0 -831
  750. package/dist/admin/nl-LLi_sx9P.js.map +0 -1
  751. package/dist/admin/nl-XNqQYx_K.mjs +0 -811
  752. package/dist/admin/nl-XNqQYx_K.mjs.map +0 -1
  753. package/dist/admin/no-JwA1Lt4Y.mjs +0 -300
  754. package/dist/admin/no-JwA1Lt4Y.mjs.map +0 -1
  755. package/dist/admin/no-wmtVIVuz.js +0 -313
  756. package/dist/admin/no-wmtVIVuz.js.map +0 -1
  757. package/dist/admin/pl-05ncDTwZ.js +0 -724
  758. package/dist/admin/pl-05ncDTwZ.js.map +0 -1
  759. package/dist/admin/pl-euPz4n1g.mjs +0 -706
  760. package/dist/admin/pl-euPz4n1g.mjs.map +0 -1
  761. package/dist/admin/pt-BR-vpbGYSYw.mjs +0 -777
  762. package/dist/admin/pt-BR-vpbGYSYw.mjs.map +0 -1
  763. package/dist/admin/pt-BR-xA4J5pi2.js +0 -797
  764. package/dist/admin/pt-BR-xA4J5pi2.js.map +0 -1
  765. package/dist/admin/pt-RlnkaSdF.mjs +0 -287
  766. package/dist/admin/pt-RlnkaSdF.mjs.map +0 -1
  767. package/dist/admin/pt-yArB6nEx.js +0 -299
  768. package/dist/admin/pt-yArB6nEx.js.map +0 -1
  769. package/dist/admin/reducers-IQWvK_9L.mjs +0 -4617
  770. package/dist/admin/reducers-IQWvK_9L.mjs.map +0 -1
  771. package/dist/admin/reducers-wZUQqmNX.js +0 -4764
  772. package/dist/admin/reducers-wZUQqmNX.js.map +0 -1
  773. package/dist/admin/ru-4bDDGI3o.js +0 -996
  774. package/dist/admin/ru-4bDDGI3o.js.map +0 -1
  775. package/dist/admin/ru-tyoEF5X6.mjs +0 -975
  776. package/dist/admin/ru-tyoEF5X6.mjs.map +0 -1
  777. package/dist/admin/sa-OOEUNg5o.js +0 -725
  778. package/dist/admin/sa-OOEUNg5o.js.map +0 -1
  779. package/dist/admin/sa-s-WVHU-Y.mjs +0 -707
  780. package/dist/admin/sa-s-WVHU-Y.mjs.map +0 -1
  781. package/dist/admin/selectors-PTHjHMQi.js +0 -8
  782. package/dist/admin/selectors-PTHjHMQi.js.map +0 -1
  783. package/dist/admin/selectors-nn3C3YKE.mjs +0 -6
  784. package/dist/admin/selectors-nn3C3YKE.mjs.map +0 -1
  785. package/dist/admin/sk-1sQSF-r2.js +0 -693
  786. package/dist/admin/sk-1sQSF-r2.js.map +0 -1
  787. package/dist/admin/sk-5bIrjuCN.mjs +0 -673
  788. package/dist/admin/sk-5bIrjuCN.mjs.map +0 -1
  789. package/dist/admin/src/components/InjectionZone.d.ts +0 -59
  790. package/dist/admin/src/content-manager/components/ComponentIcon.d.ts +0 -8
  791. package/dist/admin/src/content-manager/components/ConfigurationForm/EditFieldForm.d.ts +0 -9
  792. package/dist/admin/src/content-manager/components/ConfigurationForm/Fields.d.ts +0 -21
  793. package/dist/admin/src/content-manager/components/ConfigurationForm/Form.d.ts +0 -32
  794. package/dist/admin/src/content-manager/components/DragPreviews/CardDragPreview.d.ts +0 -7
  795. package/dist/admin/src/content-manager/components/DragPreviews/ComponentDragPreview.d.ts +0 -6
  796. package/dist/admin/src/content-manager/components/DragPreviews/RelationDragPreview.d.ts +0 -11
  797. package/dist/admin/src/content-manager/components/FieldTypeIcon.d.ts +0 -9
  798. package/dist/admin/src/content-manager/components/LeftMenu.d.ts +0 -2
  799. package/dist/admin/src/content-manager/constants/attributes.d.ts +0 -14
  800. package/dist/admin/src/content-manager/constants/collections.d.ts +0 -3
  801. package/dist/admin/src/content-manager/constants/dragAndDrop.d.ts +0 -8
  802. package/dist/admin/src/content-manager/exports.d.ts +0 -10
  803. package/dist/admin/src/content-manager/features/DocumentRBAC.d.ts +0 -36
  804. package/dist/admin/src/content-manager/history/components/HistoryAction.d.ts +0 -3
  805. package/dist/admin/src/content-manager/history/components/VersionContent.d.ts +0 -2
  806. package/dist/admin/src/content-manager/history/components/VersionHeader.d.ts +0 -5
  807. package/dist/admin/src/content-manager/history/components/VersionsList.d.ts +0 -2
  808. package/dist/admin/src/content-manager/history/pages/History.d.ts +0 -25
  809. package/dist/admin/src/content-manager/history/routes.d.ts +0 -11
  810. package/dist/admin/src/content-manager/history/services/historyVersion.d.ts +0 -7
  811. package/dist/admin/src/content-manager/hooks/useContentManagerInitData.d.ts +0 -15
  812. package/dist/admin/src/content-manager/hooks/useContentTypeSchema.d.ts +0 -24
  813. package/dist/admin/src/content-manager/hooks/useDocument.d.ts +0 -89
  814. package/dist/admin/src/content-manager/hooks/useDocumentActions.d.ts +0 -102
  815. package/dist/admin/src/content-manager/hooks/useDocumentLayout.d.ts +0 -138
  816. package/dist/admin/src/content-manager/hooks/useDragAndDrop.d.ts +0 -51
  817. package/dist/admin/src/content-manager/hooks/useKeyboardDragAndDrop.d.ts +0 -14
  818. package/dist/admin/src/content-manager/hooks/useLazyComponents.d.ts +0 -13
  819. package/dist/admin/src/content-manager/hooks/useSyncRbac.d.ts +0 -15
  820. package/dist/admin/src/content-manager/layout.d.ts +0 -16
  821. package/dist/admin/src/content-manager/modules/rbac.d.ts +0 -14
  822. package/dist/admin/src/content-manager/modules/reducers.d.ts +0 -4
  823. package/dist/admin/src/content-manager/pages/ComponentConfigurationPage.d.ts +0 -3
  824. package/dist/admin/src/content-manager/pages/EditConfigurationPage.d.ts +0 -3
  825. package/dist/admin/src/content-manager/pages/EditView/EditViewPage.d.ts +0 -3
  826. package/dist/admin/src/content-manager/pages/EditView/components/DocumentActions.d.ts +0 -69
  827. package/dist/admin/src/content-manager/pages/EditView/components/DocumentStatus.d.ts +0 -16
  828. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +0 -3
  829. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.d.ts +0 -3
  830. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.d.ts +0 -3
  831. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.d.ts +0 -3
  832. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.d.ts +0 -3
  833. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.d.ts +0 -3
  834. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.d.ts +0 -3
  835. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.d.ts +0 -6
  836. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +0 -61
  837. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.d.ts +0 -10
  838. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.d.ts +0 -10
  839. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +0 -10
  840. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Modifiers.d.ts +0 -16
  841. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withImages.d.ts +0 -11
  842. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withLinks.d.ts +0 -9
  843. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.d.ts +0 -8
  844. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +0 -13
  845. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.d.ts +0 -6
  846. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/links.d.ts +0 -10
  847. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/types.d.ts +0 -10
  848. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Initializer.d.ts +0 -9
  849. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Input.d.ts +0 -9
  850. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +0 -6
  851. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +0 -6
  852. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/ComponentContext.d.ts +0 -42
  853. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.d.ts +0 -11
  854. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentCard.d.ts +0 -9
  855. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +0 -17
  856. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +0 -9
  857. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +0 -14
  858. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.d.ts +0 -12
  859. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +0 -13
  860. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/NotAllowed.d.ts +0 -7
  861. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Relations.d.ts +0 -26
  862. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/UID.d.ts +0 -9
  863. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/Editor.d.ts +0 -18
  864. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +0 -59
  865. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/Field.d.ts +0 -11
  866. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.d.ts +0 -5
  867. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +0 -7
  868. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.d.ts +0 -17
  869. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +0 -54
  870. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.d.ts +0 -5
  871. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.d.ts +0 -4
  872. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.d.ts +0 -16
  873. package/dist/admin/src/content-manager/pages/EditView/components/FormLayout.d.ts +0 -5
  874. package/dist/admin/src/content-manager/pages/EditView/components/Header.d.ts +0 -35
  875. package/dist/admin/src/content-manager/pages/EditView/components/InputRenderer.d.ts +0 -14
  876. package/dist/admin/src/content-manager/pages/EditView/components/Panels.d.ts +0 -10
  877. package/dist/admin/src/content-manager/pages/EditView/utils/data.d.ts +0 -20
  878. package/dist/admin/src/content-manager/pages/EditView/utils/forms.d.ts +0 -9
  879. package/dist/admin/src/content-manager/pages/ListConfiguration/ListConfigurationPage.d.ts +0 -10
  880. package/dist/admin/src/content-manager/pages/ListConfiguration/components/DraggableCard.d.ts +0 -12
  881. package/dist/admin/src/content-manager/pages/ListConfiguration/components/EditFieldForm.d.ts +0 -8
  882. package/dist/admin/src/content-manager/pages/ListConfiguration/components/Header.d.ts +0 -8
  883. package/dist/admin/src/content-manager/pages/ListConfiguration/components/Settings.d.ts +0 -5
  884. package/dist/admin/src/content-manager/pages/ListConfiguration/components/SortDisplayedFields.d.ts +0 -6
  885. package/dist/admin/src/content-manager/pages/ListView/ListViewPage.d.ts +0 -3
  886. package/dist/admin/src/content-manager/pages/ListView/components/AutoCloneFailureModal.d.ts +0 -8
  887. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/Actions.d.ts +0 -52
  888. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.d.ts +0 -15
  889. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/PublishAction.d.ts +0 -31
  890. package/dist/admin/src/content-manager/pages/ListView/components/Filters.d.ts +0 -8
  891. package/dist/admin/src/content-manager/pages/ListView/components/InjectionZoneList.d.ts +0 -7
  892. package/dist/admin/src/content-manager/pages/ListView/components/TableActions.d.ts +0 -8
  893. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellContent.d.ts +0 -9
  894. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellValue.d.ts +0 -8
  895. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Components.d.ts +0 -12
  896. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Media.d.ts +0 -23
  897. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Relations.d.ts +0 -12
  898. package/dist/admin/src/content-manager/pages/ListView/components/ViewSettingsMenu.d.ts +0 -10
  899. package/dist/admin/src/content-manager/pages/NoContentTypePage.d.ts +0 -2
  900. package/dist/admin/src/content-manager/pages/NoPermissionsPage.d.ts +0 -2
  901. package/dist/admin/src/content-manager/router.d.ts +0 -5
  902. package/dist/admin/src/content-manager/services/api.d.ts +0 -3
  903. package/dist/admin/src/content-manager/services/components.d.ts +0 -6
  904. package/dist/admin/src/content-manager/services/contentTypes.d.ts +0 -18
  905. package/dist/admin/src/content-manager/services/documents.d.ts +0 -94
  906. package/dist/admin/src/content-manager/services/init.d.ts +0 -10
  907. package/dist/admin/src/content-manager/services/relations.d.ts +0 -49
  908. package/dist/admin/src/content-manager/services/uid.d.ts +0 -32
  909. package/dist/admin/src/content-manager/utils/api.d.ts +0 -19
  910. package/dist/admin/src/content-manager/utils/attributes.d.ts +0 -19
  911. package/dist/admin/src/content-manager/utils/relations.d.ts +0 -12
  912. package/dist/admin/src/content-manager/utils/translations.d.ts +0 -2
  913. package/dist/admin/src/content-manager/utils/validation.d.ts +0 -7
  914. package/dist/admin/src/core/apis/content-manager.d.ts +0 -126
  915. package/dist/admin/src/hooks/useInjectionZone.d.ts +0 -2
  916. package/dist/admin/src/pages/Settings/pages/PurchaseReviewWorkflows.d.ts +0 -2
  917. package/dist/admin/src/utils/getYupInnerErrors.d.ts +0 -7
  918. package/dist/admin/src/utils/hashAdminUserEmail.d.ts +0 -6
  919. package/dist/admin/sv-JVgQU2PS.mjs +0 -810
  920. package/dist/admin/sv-JVgQU2PS.mjs.map +0 -1
  921. package/dist/admin/sv-d0rqYiHZ.js +0 -830
  922. package/dist/admin/sv-d0rqYiHZ.js.map +0 -1
  923. package/dist/admin/th-er8qvbeL.mjs +0 -420
  924. package/dist/admin/th-er8qvbeL.mjs.map +0 -1
  925. package/dist/admin/th-mqExIzdv.js +0 -433
  926. package/dist/admin/th-mqExIzdv.js.map +0 -1
  927. package/dist/admin/tr-aYPucbUC.js +0 -788
  928. package/dist/admin/tr-aYPucbUC.js.map +0 -1
  929. package/dist/admin/tr-b2vrBJ49.mjs +0 -768
  930. package/dist/admin/tr-b2vrBJ49.mjs.map +0 -1
  931. package/dist/admin/transferTokens-P5z1yVh2.js +0 -65
  932. package/dist/admin/transferTokens-P5z1yVh2.js.map +0 -1
  933. package/dist/admin/transferTokens-PlBVZdw3.mjs +0 -59
  934. package/dist/admin/transferTokens-PlBVZdw3.mjs.map +0 -1
  935. package/dist/admin/uk-1c7KIaI6.js +0 -346
  936. package/dist/admin/uk-1c7KIaI6.js.map +0 -1
  937. package/dist/admin/uk-RfkbT49M.mjs +0 -333
  938. package/dist/admin/uk-RfkbT49M.mjs.map +0 -1
  939. package/dist/admin/useAdminRoles-BG7b996L.mjs +0 -28
  940. package/dist/admin/useAdminRoles-BG7b996L.mjs.map +0 -1
  941. package/dist/admin/useAdminRoles-THWXour6.js +0 -50
  942. package/dist/admin/useAdminRoles-THWXour6.js.map +0 -1
  943. package/dist/admin/useContentTypes-PEGh0Cg-.mjs +0 -51
  944. package/dist/admin/useContentTypes-PEGh0Cg-.mjs.map +0 -1
  945. package/dist/admin/useContentTypes-RoSvxizj.js +0 -73
  946. package/dist/admin/useContentTypes-RoSvxizj.js.map +0 -1
  947. package/dist/admin/useDebounce-OnUygPz6.mjs +0 -17
  948. package/dist/admin/useDebounce-OnUygPz6.mjs.map +0 -1
  949. package/dist/admin/useDebounce-tz5EMJbt.js +0 -39
  950. package/dist/admin/useDebounce-tz5EMJbt.js.map +0 -1
  951. package/dist/admin/useDocumentLayout-4trWL6Jz.mjs +0 -732
  952. package/dist/admin/useDocumentLayout-4trWL6Jz.mjs.map +0 -1
  953. package/dist/admin/useDocumentLayout-V_N5dUwQ.js +0 -764
  954. package/dist/admin/useDocumentLayout-V_N5dUwQ.js.map +0 -1
  955. package/dist/admin/useLicenseLimitNotification-9DqSZuyc.mjs +0 -80
  956. package/dist/admin/useLicenseLimitNotification-9DqSZuyc.mjs.map +0 -1
  957. package/dist/admin/useLicenseLimitNotification-SiWQ5LGo.js +0 -105
  958. package/dist/admin/useLicenseLimitNotification-SiWQ5LGo.js.map +0 -1
  959. package/dist/admin/useReviewWorkflows-0ty4mwQd.js +0 -29
  960. package/dist/admin/useReviewWorkflows-0ty4mwQd.js.map +0 -1
  961. package/dist/admin/useReviewWorkflows-HwyFyit7.mjs +0 -27
  962. package/dist/admin/useReviewWorkflows-HwyFyit7.mjs.map +0 -1
  963. package/dist/admin/useSyncRbac-LNOzRXJ5.mjs +0 -45
  964. package/dist/admin/useSyncRbac-LNOzRXJ5.mjs.map +0 -1
  965. package/dist/admin/useSyncRbac-vkWgDJTE.js +0 -67
  966. package/dist/admin/useSyncRbac-vkWgDJTE.js.map +0 -1
  967. package/dist/admin/useWebhooks-DmGNXCdi.js +0 -93
  968. package/dist/admin/useWebhooks-DmGNXCdi.js.map +0 -1
  969. package/dist/admin/useWebhooks-dOVyaYlw.mjs +0 -91
  970. package/dist/admin/useWebhooks-dOVyaYlw.mjs.map +0 -1
  971. package/dist/admin/validateWorkflow-99y3bkNx.js +0 -1077
  972. package/dist/admin/validateWorkflow-99y3bkNx.js.map +0 -1
  973. package/dist/admin/validateWorkflow-ubLwZqCK.mjs +0 -1033
  974. package/dist/admin/validateWorkflow-ubLwZqCK.mjs.map +0 -1
  975. package/dist/admin/validation-cpJKCQz1.mjs +0 -43
  976. package/dist/admin/validation-cpJKCQz1.mjs.map +0 -1
  977. package/dist/admin/validation-lIVymZ0n.js +0 -65
  978. package/dist/admin/validation-lIVymZ0n.js.map +0 -1
  979. package/dist/admin/vi-Rg9es0FD.js +0 -301
  980. package/dist/admin/vi-Rg9es0FD.js.map +0 -1
  981. package/dist/admin/vi-pyngavdo.mjs +0 -288
  982. package/dist/admin/vi-pyngavdo.mjs.map +0 -1
  983. package/dist/admin/zh-Hans-Gbpdme1Q.mjs +0 -939
  984. package/dist/admin/zh-Hans-Gbpdme1Q.mjs.map +0 -1
  985. package/dist/admin/zh-Hans-SgnidiuG.js +0 -960
  986. package/dist/admin/zh-Hans-SgnidiuG.js.map +0 -1
  987. package/dist/admin/zh-ONWhjzCj.js +0 -839
  988. package/dist/admin/zh-ONWhjzCj.js.map +0 -1
  989. package/dist/admin/zh-fMjW2qMl.mjs +0 -819
  990. package/dist/admin/zh-fMjW2qMl.mjs.map +0 -1
  991. package/dist/ee/admin/src/content-manager/pages/EditView/components/AssigneeSelect.d.ts +0 -2
  992. package/dist/ee/admin/src/content-manager/pages/EditView/components/ReviewWorkflowsPanel.d.ts +0 -3
  993. package/dist/ee/admin/src/content-manager/pages/EditView/components/StageSelect.d.ts +0 -1
  994. package/dist/ee/admin/src/content-manager/pages/EditView/components/constants.d.ts +0 -2
  995. package/dist/ee/admin/src/content-manager/pages/ListSettingsView/constants.d.ts +0 -7
  996. package/dist/ee/admin/src/content-manager/pages/ListView/components/AssigneeFilter.d.ts +0 -7
  997. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsAssigneeEE.d.ts +0 -7
  998. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsColumn.d.ts +0 -2
  999. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsStageEE.d.ts +0 -7
  1000. package/dist/ee/admin/src/content-manager/pages/ListView/components/StageFilter.d.ts +0 -8
  1001. package/dist/ee/admin/src/content-manager/pages/ListView/constants.d.ts +0 -69
  1002. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/CreatePage.d.ts +0 -1
  1003. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/EditPage.d.ts +0 -1
  1004. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/ListPage.d.ts +0 -2
  1005. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/actions.d.ts +0 -86
  1006. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage.d.ts +0 -2
  1007. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Layout.d.ts +0 -12
  1008. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal.d.ts +0 -15
  1009. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stage.d.ts +0 -10
  1010. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/StageDragPreview.d.ts +0 -4
  1011. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stages.d.ts +0 -7
  1012. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes.d.ts +0 -4
  1013. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/constants.d.ts +0 -20
  1014. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.d.ts +0 -15
  1015. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/reducer.d.ts +0 -38
  1016. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/selectors.d.ts +0 -62
  1017. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/colors.d.ts +0 -8
  1018. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/validateWorkflow.d.ts +0 -5
  1019. package/dist/ee/admin/src/services/reviewWorkflows.d.ts +0 -39
  1020. package/dist/shared/contracts/review-workflows.d.ts +0 -83
  1021. package/dist/shared/contracts/review-workflows.d.ts.map +0 -1
  1022. /package/dist/admin/src/{content-manager/hooks → hooks}/usePrev.d.ts +0 -0
@@ -1,4617 +0,0 @@
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-gNttF1-u.mjs');
1696
- return {
1697
- Component: ProtectedHistoryPage
1698
- };
1699
- }
1700
- },
1701
- {
1702
- path: ":collectionType/:slug/history",
1703
- lazy: async () => {
1704
- const { ProtectedHistoryPage } = await import('./History-gNttF1-u.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(
2159
- (data) => {
2160
- const { attributes: attributes3 } = components[data.__component];
2161
- return yup.object().shape({
2162
- __component: yup.string().required().oneOf(Object.keys(components))
2163
- }).nullable(false).concat(createModelSchema(attributes3));
2164
- }
2165
- )
2166
- )
2167
- )
2168
- };
2169
- case "relation":
2170
- return {
2171
- ...acc,
2172
- [name]: transformSchema(
2173
- yup.array().of(
2174
- yup.object().shape({
2175
- id: yup.string().required()
2176
- })
2177
- )
2178
- )
2179
- };
2180
- default:
2181
- return {
2182
- ...acc,
2183
- [name]: transformSchema(createAttributeSchema(attribute))
2184
- };
2185
- }
2186
- }, {})
2187
- ).default(null);
2188
- return createModelSchema(attributes);
2189
- };
2190
- const createAttributeSchema = (attribute) => {
2191
- switch (attribute.type) {
2192
- case "biginteger":
2193
- return yup.string().matches(/^-?\d*$/);
2194
- case "boolean":
2195
- return yup.boolean();
2196
- case "blocks":
2197
- return yup.mixed().test("isBlocks", errorsTrads.json, (value) => {
2198
- if (!value || Array.isArray(value)) {
2199
- return true;
2200
- } else {
2201
- return false;
2202
- }
2203
- });
2204
- case "decimal":
2205
- case "float":
2206
- case "integer":
2207
- return yup.number();
2208
- case "email":
2209
- return yup.string().email(errorsTrads.email);
2210
- case "enumeration":
2211
- return yup.string().oneOf([...attribute.enum, null]);
2212
- case "json":
2213
- return yup.mixed().test("isJSON", errorsTrads.json, (value) => {
2214
- if (!value || typeof value === "string" && value.length === 0) {
2215
- return true;
2216
- }
2217
- try {
2218
- JSON.parse(value);
2219
- return true;
2220
- } catch (err) {
2221
- return false;
2222
- }
2223
- });
2224
- case "password":
2225
- case "richtext":
2226
- case "string":
2227
- case "text":
2228
- return yup.string();
2229
- case "uid":
2230
- return yup.string().matches(/^[A-Za-z0-9-_.~]*$/);
2231
- default:
2232
- return yup.mixed();
2233
- }
2234
- };
2235
- const addRequiredValidation = (attribute) => (schema) => {
2236
- if (attribute.required) {
2237
- return schema.required({
2238
- id: errorsTrads.required.id,
2239
- defaultMessage: "This field is required."
2240
- });
2241
- }
2242
- return schema.nullable();
2243
- };
2244
- const addMinLengthValidation = (attribute) => (schema) => {
2245
- if ("minLength" in attribute && attribute.minLength && Number.isInteger(attribute.minLength) && "min" in schema) {
2246
- return schema.min(attribute.minLength, {
2247
- ...errorsTrads.minLength,
2248
- values: {
2249
- min: attribute.minLength
2250
- }
2251
- });
2252
- }
2253
- return schema;
2254
- };
2255
- const addMaxLengthValidation = (attribute) => (schema) => {
2256
- if ("maxLength" in attribute && attribute.maxLength && Number.isInteger(attribute.maxLength) && "max" in schema) {
2257
- return schema.max(attribute.maxLength, {
2258
- ...errorsTrads.maxLength,
2259
- values: {
2260
- max: attribute.maxLength
2261
- }
2262
- });
2263
- }
2264
- return schema;
2265
- };
2266
- const addMinValidation = (attribute) => (schema) => {
2267
- if ("min" in attribute) {
2268
- const min = toInteger(attribute.min);
2269
- if ("min" in schema && min) {
2270
- return schema.min(min, {
2271
- ...errorsTrads.min,
2272
- values: {
2273
- min
2274
- }
2275
- });
2276
- }
2277
- }
2278
- return schema;
2279
- };
2280
- const addMaxValidation = (attribute) => (schema) => {
2281
- if ("max" in attribute) {
2282
- const max = toInteger(attribute.max);
2283
- if ("max" in schema && max) {
2284
- return schema.max(max, {
2285
- ...errorsTrads.max,
2286
- values: {
2287
- max
2288
- }
2289
- });
2290
- }
2291
- }
2292
- return schema;
2293
- };
2294
- const toInteger = (val) => {
2295
- if (typeof val === "number" || val === void 0) {
2296
- return val;
2297
- } else {
2298
- const num = Number(val);
2299
- return isNaN(num) ? void 0 : num;
2300
- }
2301
- };
2302
- const addRegexValidation = (attribute) => (schema) => {
2303
- if ("regex" in attribute && attribute.regex && "matches" in schema) {
2304
- return schema.matches(new RegExp(attribute.regex), {
2305
- message: {
2306
- id: errorsTrads.regex.id,
2307
- defaultMessage: "The value does not match the defined pattern."
2308
- },
2309
- excludeEmptyString: !attribute.required
2310
- });
2311
- }
2312
- return schema;
2313
- };
2314
-
2315
- const initApi = contentManagerApi.injectEndpoints({
2316
- endpoints: (builder) => ({
2317
- getInitialData: builder.query({
2318
- query: () => "/content-manager/init",
2319
- transformResponse: (response) => response.data,
2320
- providesTags: ["InitialData"]
2321
- })
2322
- })
2323
- });
2324
- const { useGetInitialDataQuery } = initApi;
2325
-
2326
- const useContentTypeSchema = (model) => {
2327
- const { toggleNotification } = useNotification();
2328
- const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
2329
- const { components, contentType, contentTypes, error, isLoading, isFetching } = useGetInitialDataQuery(void 0, {
2330
- selectFromResult: (res) => {
2331
- const contentType2 = res.data?.contentTypes.find((ct) => ct.uid === model);
2332
- const componentsByKey = res.data?.components.reduce(
2333
- (acc, component) => {
2334
- acc[component.uid] = component;
2335
- return acc;
2336
- },
2337
- {}
2338
- );
2339
- const components2 = extractContentTypeComponents(contentType2?.attributes, componentsByKey);
2340
- return {
2341
- isLoading: res.isLoading,
2342
- isFetching: res.isFetching,
2343
- error: res.error,
2344
- components: Object.keys(components2).length === 0 ? void 0 : components2,
2345
- contentType: contentType2,
2346
- contentTypes: res.data?.contentTypes ?? []
2347
- };
2348
- }
2349
- });
2350
- React.useEffect(() => {
2351
- if (error) {
2352
- toggleNotification({
2353
- type: "danger",
2354
- message: formatAPIError(error)
2355
- });
2356
- }
2357
- }, [toggleNotification, error, formatAPIError]);
2358
- return {
2359
- // This must be memoized to avoid inifiinite re-renders where the empty object is different everytime.
2360
- components: React.useMemo(() => components ?? {}, [components]),
2361
- schema: contentType,
2362
- schemas: contentTypes,
2363
- isLoading: isLoading || isFetching
2364
- };
2365
- };
2366
- const extractContentTypeComponents = (attributes = {}, allComponents = {}) => {
2367
- const getComponents = (attributes2) => {
2368
- return attributes2.reduce((acc, attribute) => {
2369
- if (attribute.type === "component") {
2370
- const componentAttributes = Object.values(
2371
- allComponents[attribute.component]?.attributes ?? {}
2372
- );
2373
- acc.push(attribute.component, ...getComponents(componentAttributes));
2374
- } else if (attribute.type === "dynamiczone") {
2375
- acc.push(
2376
- ...attribute.components,
2377
- ...attribute.components.flatMap((componentUid) => {
2378
- const componentAttributes = Object.values(
2379
- allComponents[componentUid]?.attributes ?? {}
2380
- );
2381
- return getComponents(componentAttributes);
2382
- })
2383
- );
2384
- }
2385
- return acc;
2386
- }, []);
2387
- };
2388
- const componentUids = getComponents(Object.values(attributes));
2389
- const uniqueComponentUids = [...new Set(componentUids)];
2390
- const componentsByKey = uniqueComponentUids.reduce((acc, uid) => {
2391
- acc[uid] = allComponents[uid];
2392
- return acc;
2393
- }, {});
2394
- return componentsByKey;
2395
- };
2396
-
2397
- const useDocument = (args, opts) => {
2398
- const { toggleNotification } = useNotification();
2399
- const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
2400
- const {
2401
- currentData: data,
2402
- isLoading: isLoadingDocument,
2403
- isFetching: isFetchingDocument,
2404
- error
2405
- } = useGetDocumentQuery(args, opts);
2406
- const { components, schema, isLoading: isLoadingSchema } = useContentTypeSchema(args.model);
2407
- React.useEffect(() => {
2408
- if (error) {
2409
- toggleNotification({
2410
- type: "danger",
2411
- message: formatAPIError(error)
2412
- });
2413
- }
2414
- }, [toggleNotification, error, formatAPIError, args.collectionType]);
2415
- const validationSchema = React.useMemo(() => {
2416
- if (!schema) {
2417
- return null;
2418
- }
2419
- return createYupSchema(schema.attributes, components);
2420
- }, [schema, components]);
2421
- const validate = React.useCallback(
2422
- (document) => {
2423
- if (!validationSchema) {
2424
- throw new Error(
2425
- "There is no validation schema generated, this is likely due to the schema not being loaded yet."
2426
- );
2427
- }
2428
- try {
2429
- validationSchema.validateSync(document, { abortEarly: false, strict: true });
2430
- return null;
2431
- } catch (error2) {
2432
- if (error2 instanceof ValidationError) {
2433
- return getYupInnerErrors(error2);
2434
- }
2435
- throw error2;
2436
- }
2437
- },
2438
- [validationSchema]
2439
- );
2440
- const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;
2441
- return {
2442
- components,
2443
- document: data?.data,
2444
- meta: data?.meta,
2445
- isLoading,
2446
- schema,
2447
- validate
2448
- };
2449
- };
2450
- const useDoc = () => {
2451
- const { id, slug, collectionType, origin } = useParams();
2452
- const [{ query }] = useQueryParams();
2453
- const params = React.useMemo(() => buildValidParams(query), [query]);
2454
- if (!collectionType) {
2455
- throw new Error("Could not find collectionType in url params");
2456
- }
2457
- if (!slug) {
2458
- throw new Error("Could not find model in url params");
2459
- }
2460
- return {
2461
- collectionType,
2462
- model: slug,
2463
- id: origin || id === "create" ? void 0 : id,
2464
- ...useDocument(
2465
- { documentId: origin || id, model: slug, collectionType, params },
2466
- {
2467
- skip: id === "create" || !origin && !id && collectionType !== SINGLE_TYPES
2468
- }
2469
- )
2470
- };
2471
- };
2472
-
2473
- function getIn(obj, key, def, pathStartIndex = 0) {
2474
- const path = toPath(key);
2475
- while (obj && pathStartIndex < path.length) {
2476
- obj = obj[path[pathStartIndex++]];
2477
- }
2478
- if (pathStartIndex !== path.length && !obj) {
2479
- return def;
2480
- }
2481
- return obj === void 0 ? def : obj;
2482
- }
2483
- const isObject = (obj) => obj !== null && typeof obj === "object" && !Array.isArray(obj);
2484
- const isInteger = (obj) => String(Math.floor(Number(obj))) === obj;
2485
- function setIn(obj, path, value) {
2486
- const res = clone(obj);
2487
- let resVal = res;
2488
- let i = 0;
2489
- const pathArray = toPath(path);
2490
- for (; i < pathArray.length - 1; i++) {
2491
- const currentPath = pathArray[i];
2492
- const currentObj = getIn(obj, pathArray.slice(0, i + 1));
2493
- if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {
2494
- resVal = resVal[currentPath] = clone(currentObj);
2495
- } else {
2496
- const nextPath = pathArray[i + 1];
2497
- resVal = resVal[currentPath] = isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};
2498
- }
2499
- }
2500
- if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {
2501
- return obj;
2502
- }
2503
- if (value === void 0) {
2504
- delete resVal[pathArray[i]];
2505
- } else {
2506
- resVal[pathArray[i]] = value;
2507
- }
2508
- if (i === 0 && value === void 0) {
2509
- delete res[pathArray[i]];
2510
- }
2511
- return res;
2512
- }
2513
-
2514
- const ERR_MSG = "The Form Component has not been initialised, ensure you are using this hook within a Form component";
2515
- const [FormProvider, useForm] = createContext("Form", {
2516
- disabled: false,
2517
- errors: {},
2518
- initialValues: {},
2519
- isSubmitting: false,
2520
- modified: false,
2521
- addFieldRow: () => {
2522
- throw new Error(ERR_MSG);
2523
- },
2524
- moveFieldRow: () => {
2525
- throw new Error(ERR_MSG);
2526
- },
2527
- onChange: () => {
2528
- throw new Error(ERR_MSG);
2529
- },
2530
- removeFieldRow: () => {
2531
- throw new Error(ERR_MSG);
2532
- },
2533
- resetForm: () => {
2534
- throw new Error(ERR_MSG);
2535
- },
2536
- setErrors: () => {
2537
- throw new Error(ERR_MSG);
2538
- },
2539
- setValues: () => {
2540
- throw new Error(ERR_MSG);
2541
- },
2542
- setSubmitting: () => {
2543
- throw new Error(ERR_MSG);
2544
- },
2545
- validate: async () => {
2546
- throw new Error(ERR_MSG);
2547
- },
2548
- values: {}
2549
- });
2550
- const Form = React.forwardRef(
2551
- ({ disabled = false, method, onSubmit, ...props }, ref) => {
2552
- const formRef = React.useRef(null);
2553
- const initialValues = React.useRef(props.initialValues ?? {});
2554
- const [state, dispatch] = React.useReducer(reducer$3, {
2555
- errors: {},
2556
- isSubmitting: false,
2557
- values: props.initialValues ?? {}
2558
- });
2559
- React.useEffect(() => {
2560
- if (!isEqual(initialValues.current, props.initialValues)) {
2561
- initialValues.current = props.initialValues ?? {};
2562
- dispatch({
2563
- type: "SET_INITIAL_VALUES",
2564
- payload: props.initialValues ?? {}
2565
- });
2566
- }
2567
- }, [props.initialValues]);
2568
- const setErrors = React.useCallback((errors) => {
2569
- dispatch({
2570
- type: "SET_ERRORS",
2571
- payload: errors
2572
- });
2573
- }, []);
2574
- const setValues = React.useCallback((values) => {
2575
- dispatch({
2576
- type: "SET_VALUES",
2577
- payload: values
2578
- });
2579
- }, []);
2580
- React.useEffect(() => {
2581
- if (Object.keys(state.errors).length === 0)
2582
- return;
2583
- const ref2 = setTimeout(() => {
2584
- const [firstError] = formRef.current.querySelectorAll("[data-strapi-field-error]");
2585
- if (firstError) {
2586
- const errorId = firstError.getAttribute("id");
2587
- const formElementInError = formRef.current.querySelector(
2588
- `[aria-describedby="${errorId}"]`
2589
- );
2590
- if (formElementInError && formElementInError instanceof HTMLElement) {
2591
- formElementInError.focus();
2592
- }
2593
- }
2594
- });
2595
- return () => clearTimeout(ref2);
2596
- }, [state.errors]);
2597
- const validate = React.useCallback(
2598
- async (shouldSetErrors = true) => {
2599
- setErrors({});
2600
- if (!props.validationSchema) {
2601
- return { data: state.values };
2602
- }
2603
- try {
2604
- const data = await props.validationSchema.validate(state.values, { abortEarly: false });
2605
- return { data };
2606
- } catch (err) {
2607
- if (isErrorYupValidationError(err)) {
2608
- let errors = {};
2609
- if (err.inner) {
2610
- if (err.inner.length === 0) {
2611
- return setIn(errors, err.path, err.message);
2612
- }
2613
- for (const error of err.inner) {
2614
- if (!getIn(errors, error.path)) {
2615
- errors = setIn(errors, error.path, error.message);
2616
- }
2617
- }
2618
- }
2619
- if (shouldSetErrors) {
2620
- setErrors(errors);
2621
- }
2622
- return { errors };
2623
- } else {
2624
- if (process.env.NODE_ENV !== "production") {
2625
- console.warn(
2626
- `Warning: An unhandled error was caught during validation in <Formik validationSchema />`,
2627
- err
2628
- );
2629
- }
2630
- throw err;
2631
- }
2632
- }
2633
- },
2634
- [props, setErrors, state.values]
2635
- );
2636
- const handleSubmit = async (e) => {
2637
- e.stopPropagation();
2638
- e.preventDefault();
2639
- if (!onSubmit) {
2640
- return;
2641
- }
2642
- dispatch({
2643
- type: "SUBMIT_ATTEMPT"
2644
- });
2645
- try {
2646
- const { data, errors } = await validate();
2647
- if (errors) {
2648
- setErrors(errors);
2649
- throw new Error("Submission failed");
2650
- }
2651
- await onSubmit(data, {
2652
- setErrors,
2653
- setValues,
2654
- resetForm
2655
- });
2656
- dispatch({
2657
- type: "SUBMIT_SUCCESS"
2658
- });
2659
- } catch (err) {
2660
- dispatch({
2661
- type: "SUBMIT_FAILURE"
2662
- });
2663
- if (err instanceof Error && err.message === "Submission failed") {
2664
- return;
2665
- }
2666
- }
2667
- };
2668
- const modified = React.useMemo(
2669
- () => !isEqual(initialValues.current, state.values),
2670
- [state.values]
2671
- );
2672
- const handleChange = useCallbackRef((eventOrPath, v) => {
2673
- if (typeof eventOrPath === "string") {
2674
- dispatch({
2675
- type: "SET_FIELD_VALUE",
2676
- payload: {
2677
- field: eventOrPath,
2678
- value: v
2679
- }
2680
- });
2681
- return;
2682
- }
2683
- const target = eventOrPath.target || eventOrPath.currentTarget;
2684
- const { type, name, id, value, options, multiple } = target;
2685
- const field = name || id;
2686
- if (!field && process.env.NODE_ENV !== "production") {
2687
- console.warn(
2688
- `\`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`
2689
- );
2690
- }
2691
- let val;
2692
- if (/number|range/.test(type)) {
2693
- const parsed = parseFloat(value);
2694
- val = isNaN(parsed) ? "" : parsed;
2695
- } else if (/checkbox/.test(type)) {
2696
- val = !getIn(state.values, field);
2697
- } else if (options && multiple) {
2698
- val = Array.from(options).filter((el) => el.selected).map((el) => el.value);
2699
- } else {
2700
- val = value;
2701
- }
2702
- if (field) {
2703
- dispatch({
2704
- type: "SET_FIELD_VALUE",
2705
- payload: {
2706
- field,
2707
- value: val
2708
- }
2709
- });
2710
- }
2711
- });
2712
- const addFieldRow = React.useCallback(
2713
- (field, value, addAtIndex) => {
2714
- dispatch({
2715
- type: "ADD_FIELD_ROW",
2716
- payload: {
2717
- field,
2718
- value,
2719
- addAtIndex
2720
- }
2721
- });
2722
- },
2723
- []
2724
- );
2725
- const removeFieldRow = React.useCallback(
2726
- (field, removeAtIndex) => {
2727
- dispatch({
2728
- type: "REMOVE_FIELD_ROW",
2729
- payload: {
2730
- field,
2731
- removeAtIndex
2732
- }
2733
- });
2734
- },
2735
- []
2736
- );
2737
- const moveFieldRow = React.useCallback(
2738
- (field, fromIndex, toIndex) => {
2739
- dispatch({
2740
- type: "MOVE_FIELD_ROW",
2741
- payload: {
2742
- field,
2743
- fromIndex,
2744
- toIndex
2745
- }
2746
- });
2747
- },
2748
- []
2749
- );
2750
- const resetForm = React.useCallback(() => {
2751
- dispatch({
2752
- type: "RESET_FORM",
2753
- payload: {
2754
- errors: {},
2755
- isSubmitting: false,
2756
- values: initialValues.current
2757
- }
2758
- });
2759
- }, []);
2760
- const setSubmitting = React.useCallback((isSubmitting) => {
2761
- dispatch({ type: "SET_ISSUBMITTING", payload: isSubmitting });
2762
- }, []);
2763
- const composedRefs = useComposedRefs(formRef, ref);
2764
- return /* @__PURE__ */ jsx("form", { ref: composedRefs, method, noValidate: true, onSubmit: handleSubmit, children: /* @__PURE__ */ jsx(
2765
- FormProvider,
2766
- {
2767
- disabled,
2768
- onChange: handleChange,
2769
- initialValues,
2770
- modified,
2771
- addFieldRow,
2772
- moveFieldRow,
2773
- removeFieldRow,
2774
- resetForm,
2775
- setErrors,
2776
- setValues,
2777
- setSubmitting,
2778
- validate,
2779
- ...state,
2780
- children: typeof props.children === "function" ? props.children({
2781
- modified,
2782
- disabled,
2783
- onChange: handleChange,
2784
- ...state,
2785
- resetForm
2786
- }) : props.children
2787
- }
2788
- ) });
2789
- }
2790
- );
2791
- const isErrorYupValidationError = (err) => typeof err === "object" && err !== null && "name" in err && typeof err.name === "string" && err.name === "ValidationError";
2792
- const reducer$3 = (state, action) => produce(state, (draft) => {
2793
- switch (action.type) {
2794
- case "SET_INITIAL_VALUES":
2795
- draft.values = action.payload;
2796
- break;
2797
- case "SET_VALUES":
2798
- draft.values = action.payload;
2799
- break;
2800
- case "SUBMIT_ATTEMPT":
2801
- draft.isSubmitting = true;
2802
- break;
2803
- case "SUBMIT_FAILURE":
2804
- draft.isSubmitting = false;
2805
- break;
2806
- case "SUBMIT_SUCCESS":
2807
- draft.isSubmitting = false;
2808
- break;
2809
- case "SET_FIELD_VALUE":
2810
- draft.values = setIn(state.values, action.payload.field, action.payload.value);
2811
- break;
2812
- case "ADD_FIELD_ROW": {
2813
- const currentField = getIn(state.values, action.payload.field, []);
2814
- let position = action.payload.addAtIndex;
2815
- if (position === void 0) {
2816
- position = currentField.length;
2817
- } else if (position < 0) {
2818
- position = 0;
2819
- }
2820
- const [key] = generateNKeysBetween(
2821
- currentField.at(position - 1)?.__temp_key__,
2822
- currentField.at(position)?.__temp_key__,
2823
- 1
2824
- );
2825
- draft.values = setIn(
2826
- state.values,
2827
- action.payload.field,
2828
- setIn(currentField, position.toString(), { ...action.payload.value, __temp_key__: key })
2829
- );
2830
- break;
2831
- }
2832
- case "MOVE_FIELD_ROW": {
2833
- const { field, fromIndex, toIndex } = action.payload;
2834
- const currentField = [...getIn(state.values, field, [])];
2835
- const currentRow = currentField[fromIndex];
2836
- const startKey = fromIndex > toIndex ? currentField[toIndex - 1]?.__temp_key__ : currentField[toIndex]?.__temp_key__;
2837
- const endKey = fromIndex > toIndex ? currentField[toIndex]?.__temp_key__ : currentField[toIndex + 1]?.__temp_key__;
2838
- const [newKey] = generateNKeysBetween(startKey, endKey, 1);
2839
- currentField.splice(fromIndex, 1);
2840
- currentField.splice(toIndex, 0, { ...currentRow, __temp_key__: newKey });
2841
- draft.values = setIn(state.values, field, currentField);
2842
- break;
2843
- }
2844
- case "REMOVE_FIELD_ROW": {
2845
- const currentField = getIn(state.values, action.payload.field, []);
2846
- let position = action.payload.removeAtIndex;
2847
- if (position === void 0) {
2848
- position = currentField.length - 1;
2849
- } else if (position < 0) {
2850
- position = 0;
2851
- }
2852
- const newValue = setIn(currentField, position.toString(), void 0).filter(
2853
- (val) => val
2854
- );
2855
- draft.values = setIn(
2856
- state.values,
2857
- action.payload.field,
2858
- newValue.length > 0 ? newValue : void 0
2859
- );
2860
- break;
2861
- }
2862
- case "SET_ERRORS":
2863
- if (!isEqual(state.errors, action.payload)) {
2864
- draft.errors = action.payload;
2865
- }
2866
- break;
2867
- case "SET_ISSUBMITTING":
2868
- draft.isSubmitting = action.payload;
2869
- break;
2870
- case "RESET_FORM":
2871
- draft.values = action.payload.values;
2872
- draft.errors = action.payload.errors;
2873
- draft.isSubmitting = action.payload.isSubmitting;
2874
- break;
2875
- }
2876
- });
2877
- const useField = (path) => {
2878
- const { formatMessage } = useIntl();
2879
- const initialValue = useForm(
2880
- "useField",
2881
- (state) => getIn(state.initialValues, path)
2882
- );
2883
- const value = useForm(
2884
- "useField",
2885
- (state) => getIn(state.values, path)
2886
- );
2887
- const handleChange = useForm("useField", (state) => state.onChange);
2888
- const error = useForm("useField", (state) => getIn(state.errors, path));
2889
- return {
2890
- initialValue,
2891
- /**
2892
- * Errors can be a string, or a MesaageDescriptor, so we need to handle both cases.
2893
- * If it's anything else, we don't return it.
2894
- */
2895
- error: isErrorMessageDescriptor(error) ? formatMessage(
2896
- {
2897
- id: error.id,
2898
- defaultMessage: error.defaultMessage
2899
- },
2900
- error.values
2901
- ) : typeof error === "string" ? error : void 0,
2902
- onChange: handleChange,
2903
- value
2904
- };
2905
- };
2906
- const isErrorMessageDescriptor = (object) => {
2907
- return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
2908
- };
2909
- const Blocker = () => {
2910
- const { formatMessage } = useIntl();
2911
- const modified = useForm("Blocker", (state) => state.modified);
2912
- const isSubmitting = useForm("Blocker", (state) => state.isSubmitting);
2913
- const blocker = useBlocker(
2914
- ({ currentLocation, nextLocation }) => !isSubmitting && modified && currentLocation.pathname !== nextLocation.pathname
2915
- );
2916
- if (blocker.state === "blocked") {
2917
- return /* @__PURE__ */ jsxs(
2918
- Dialog,
2919
- {
2920
- isOpen: true,
2921
- title: formatMessage({
2922
- id: "app.components.ConfirmDialog.title",
2923
- defaultMessage: "Confirmation"
2924
- }),
2925
- onClose: () => blocker.reset(),
2926
- children: [
2927
- /* @__PURE__ */ jsx(DialogBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
2928
- /* @__PURE__ */ jsx(Icon, { as: ExclamationMarkCircle, width: "24px", height: "24px", color: "danger600" }),
2929
- /* @__PURE__ */ jsx(Typography, { as: "p", variant: "omega", textAlign: "center", children: formatMessage({
2930
- id: "global.prompt.unsaved",
2931
- defaultMessage: "You have unsaved changes, are you sure you want to leave?"
2932
- }) })
2933
- ] }) }),
2934
- /* @__PURE__ */ jsx(
2935
- DialogFooter,
2936
- {
2937
- startAction: /* @__PURE__ */ jsx(Button, { onClick: () => blocker.reset(), variant: "tertiary", children: formatMessage({
2938
- id: "app.components.Button.cancel",
2939
- defaultMessage: "Cancel"
2940
- }) }),
2941
- endAction: /* @__PURE__ */ jsx(Button, { onClick: () => blocker.proceed(), variant: "danger", children: formatMessage({
2942
- id: "app.components.Button.confirm",
2943
- defaultMessage: "Confirm"
2944
- }) })
2945
- }
2946
- )
2947
- ]
2948
- }
2949
- );
2950
- }
2951
- return null;
2952
- };
2953
-
2954
- const getTranslation = (id) => `content-manager.${id}`;
2955
-
2956
- const DocumentStatus = ({ status = "draft", ...restProps }) => {
2957
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
2958
- return /* @__PURE__ */ jsx(Status, { ...restProps, showBullet: false, size: "S", variant: statusVariant, children: /* @__PURE__ */ jsx(Typography, { as: "span", variant: "omega", fontWeight: "bold", children: capitalise(status) }) });
2959
- };
2960
-
2961
- function getStyle(initialOffset, currentOffset, mouseOffset) {
2962
- if (!initialOffset || !currentOffset || !mouseOffset) {
2963
- return { display: "none" };
2964
- }
2965
- const { x, y } = mouseOffset;
2966
- return {
2967
- transform: `translate(${x}px, ${y}px)`
2968
- };
2969
- }
2970
- const DragLayer = ({ renderItem }) => {
2971
- const { itemType, isDragging, item, initialOffset, currentOffset, mouseOffset } = useDragLayer(
2972
- (monitor) => ({
2973
- item: monitor.getItem(),
2974
- itemType: monitor.getItemType(),
2975
- initialOffset: monitor.getInitialSourceClientOffset(),
2976
- currentOffset: monitor.getSourceClientOffset(),
2977
- isDragging: monitor.isDragging(),
2978
- mouseOffset: monitor.getClientOffset()
2979
- })
2980
- );
2981
- if (!isDragging) {
2982
- return null;
2983
- }
2984
- return /* @__PURE__ */ jsx(
2985
- Box,
2986
- {
2987
- height: "100%",
2988
- left: 0,
2989
- position: "fixed",
2990
- pointerEvents: "none",
2991
- top: 0,
2992
- zIndex: 100,
2993
- width: "100%",
2994
- children: /* @__PURE__ */ jsx(Box, { style: getStyle(initialOffset, currentOffset, mouseOffset), children: renderItem({ type: itemType, item }) })
2995
- }
2996
- );
2997
- };
2998
-
2999
- const CardDragPreview = ({ label, isSibling = false }) => {
3000
- return /* @__PURE__ */ jsxs(
3001
- FieldContainer,
3002
- {
3003
- background: isSibling ? "neutral100" : "primary100",
3004
- display: "inline-flex",
3005
- gap: 3,
3006
- hasRadius: true,
3007
- justifyContent: "space-between",
3008
- isSibling,
3009
- "max-height": `${32 / 16}rem`,
3010
- maxWidth: "min-content",
3011
- children: [
3012
- /* @__PURE__ */ jsxs(Flex, { gap: 3, children: [
3013
- /* @__PURE__ */ jsx(DragButton, { alignItems: "center", cursor: "all-scroll", padding: 3, children: /* @__PURE__ */ jsx(Drag, {}) }),
3014
- /* @__PURE__ */ jsx(
3015
- TypographyMaxWidth,
3016
- {
3017
- textColor: isSibling ? void 0 : "primary600",
3018
- fontWeight: "bold",
3019
- ellipsis: true,
3020
- children: label
3021
- }
3022
- )
3023
- ] }),
3024
- /* @__PURE__ */ jsxs(Flex, { children: [
3025
- /* @__PURE__ */ jsx(ActionBox, { alignItems: "center", children: /* @__PURE__ */ jsx(Pencil, {}) }),
3026
- /* @__PURE__ */ jsx(ActionBox, { alignItems: "center", children: /* @__PURE__ */ jsx(Cross, {}) })
3027
- ] })
3028
- ]
3029
- }
3030
- );
3031
- };
3032
- const ActionBox = styled(Flex)`
3033
- height: ${({ theme }) => theme.spaces[7]};
3034
-
3035
- &:last-child {
3036
- padding: 0 ${({ theme }) => theme.spaces[3]};
3037
- }
3038
- `;
3039
- const DragButton = styled(ActionBox)`
3040
- border-right: 1px solid ${({ theme }) => theme.colors.primary200};
3041
-
3042
- svg {
3043
- width: ${12 / 16}rem;
3044
- height: ${12 / 16}rem;
3045
- }
3046
- `;
3047
- const FieldContainer = styled(Flex)`
3048
- border: 1px solid
3049
- ${({ theme, isSibling }) => isSibling ? theme.colors.neutral150 : theme.colors.primary200};
3050
-
3051
- svg {
3052
- width: ${10 / 16}rem;
3053
- height: ${10 / 16}rem;
3054
-
3055
- path {
3056
- fill: ${({ theme, isSibling }) => isSibling ? void 0 : theme.colors.primary600};
3057
- }
3058
- }
3059
- `;
3060
- const TypographyMaxWidth = styled(Typography)`
3061
- max-width: ${72 / 16}rem;
3062
- `;
3063
-
3064
- const ComponentDragPreview = ({ displayedValue }) => {
3065
- return /* @__PURE__ */ jsxs(
3066
- Flex,
3067
- {
3068
- background: "neutral0",
3069
- borderColor: "neutral200",
3070
- justifyContent: "space-between",
3071
- gap: 3,
3072
- padding: 3,
3073
- width: `${300 / 16}rem`,
3074
- children: [
3075
- /* @__PURE__ */ jsx(ToggleButton, { type: "button", children: /* @__PURE__ */ jsxs(Flex, { gap: 6, children: [
3076
- /* @__PURE__ */ jsx(
3077
- DropdownIconWrapper,
3078
- {
3079
- alignItems: "center",
3080
- justifyContent: "center",
3081
- background: "neutral200",
3082
- height: `${32 / 16}rem`,
3083
- width: `${32 / 16}rem`,
3084
- children: /* @__PURE__ */ jsx(CarretDown, {})
3085
- }
3086
- ),
3087
- /* @__PURE__ */ jsx(Flex, { maxWidth: `${150 / 16}rem`, children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral700", ellipsis: true, children: displayedValue }) })
3088
- ] }) }),
3089
- /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
3090
- /* @__PURE__ */ jsx(IconButton, { "aria-label": "", borderWidth: 0, children: /* @__PURE__ */ jsx(Trash, {}) }),
3091
- /* @__PURE__ */ jsx(IconButton, { "aria-label": "", borderWidth: 0, children: /* @__PURE__ */ jsx(Drag, {}) })
3092
- ] })
3093
- ]
3094
- }
3095
- );
3096
- };
3097
- const DropdownIconWrapper = styled(Flex)`
3098
- border-radius: 50%;
3099
-
3100
- svg {
3101
- height: ${6 / 16}rem;
3102
- width: ${11 / 16}rem;
3103
- > path {
3104
- fill: ${({ theme }) => theme.colors.neutral600};
3105
- }
3106
- }
3107
- `;
3108
- const ToggleButton = styled.button`
3109
- border: none;
3110
- background: transparent;
3111
- display: block;
3112
- width: 100%;
3113
- text-align: unset;
3114
- padding: 0;
3115
- `;
3116
-
3117
- const useFocusInputField = (name) => {
3118
- const { search: searchString } = useLocation();
3119
- const search = useMemo(() => new URLSearchParams(searchString), [searchString]);
3120
- const [field, setField] = useState(null);
3121
- useEffect(() => {
3122
- if (search.has("field") && search.get("field") === name && field) {
3123
- if ("input" in field) {
3124
- field.input.current.focus();
3125
- field.input.current.scrollIntoView({
3126
- block: "center"
3127
- });
3128
- } else {
3129
- field.focus();
3130
- field.scrollIntoView({
3131
- block: "center"
3132
- });
3133
- }
3134
- }
3135
- }, [search, name, field]);
3136
- return setField;
3137
- };
3138
-
3139
- const ItemTypes = {
3140
- COMPONENT: "component",
3141
- EDIT_FIELD: "editField",
3142
- FIELD: "field",
3143
- DYNAMIC_ZONE: "dynamicZone",
3144
- RELATION: "relation",
3145
- BLOCKS: "blocks"
3146
- };
3147
-
3148
- const useKeyboardDragAndDrop = (active, index, { onCancel, onDropItem, onGrabItem, onMoveItem }) => {
3149
- const [isSelected, setIsSelected] = React.useState(false);
3150
- const handleMove = (movement) => {
3151
- if (!isSelected) {
3152
- return;
3153
- }
3154
- if (typeof index === "number" && onMoveItem) {
3155
- if (movement === "UP") {
3156
- onMoveItem(index - 1, index);
3157
- } else if (movement === "DOWN") {
3158
- onMoveItem(index + 1, index);
3159
- }
3160
- }
3161
- };
3162
- const handleDragClick = () => {
3163
- if (isSelected) {
3164
- if (onDropItem) {
3165
- onDropItem(index);
3166
- }
3167
- setIsSelected(false);
3168
- } else {
3169
- if (onGrabItem) {
3170
- onGrabItem(index);
3171
- }
3172
- setIsSelected(true);
3173
- }
3174
- };
3175
- const handleCancel = () => {
3176
- if (isSelected) {
3177
- setIsSelected(false);
3178
- if (onCancel) {
3179
- onCancel(index);
3180
- }
3181
- }
3182
- };
3183
- const handleKeyDown = (e) => {
3184
- if (!active) {
3185
- return;
3186
- }
3187
- if (e.key === "Tab" && !isSelected) {
3188
- return;
3189
- }
3190
- e.preventDefault();
3191
- switch (e.key) {
3192
- case " ":
3193
- case "Enter":
3194
- handleDragClick();
3195
- break;
3196
- case "Escape":
3197
- handleCancel();
3198
- break;
3199
- case "ArrowDown":
3200
- case "ArrowRight":
3201
- handleMove("DOWN");
3202
- break;
3203
- case "ArrowUp":
3204
- case "ArrowLeft":
3205
- handleMove("UP");
3206
- break;
3207
- }
3208
- };
3209
- return handleKeyDown;
3210
- };
3211
-
3212
- const DIRECTIONS = {
3213
- UPWARD: "upward",
3214
- DOWNWARD: "downward"
3215
- };
3216
- const DROP_SENSITIVITY = {
3217
- REGULAR: "regular",
3218
- IMMEDIATE: "immediate"
3219
- };
3220
- const useDragAndDrop = (active, {
3221
- type = "STRAPI_DND",
3222
- index,
3223
- item,
3224
- onStart,
3225
- onEnd,
3226
- onGrabItem,
3227
- onDropItem,
3228
- onCancel,
3229
- onMoveItem,
3230
- dropSensitivity = DROP_SENSITIVITY.REGULAR
3231
- }) => {
3232
- const objectRef = React.useRef(null);
3233
- const [{ handlerId, isOver }, dropRef] = useDrop({
3234
- accept: type,
3235
- collect(monitor) {
3236
- return {
3237
- handlerId: monitor.getHandlerId(),
3238
- isOver: monitor.isOver({ shallow: true })
3239
- };
3240
- },
3241
- drop(item2) {
3242
- const draggedIndex = item2.index;
3243
- const newIndex = index;
3244
- if (isOver && onDropItem) {
3245
- onDropItem(draggedIndex, newIndex);
3246
- }
3247
- },
3248
- hover(item2, monitor) {
3249
- if (!objectRef.current || !onMoveItem) {
3250
- return;
3251
- }
3252
- const dragIndex = item2.index;
3253
- const newIndex = index;
3254
- const hoverBoundingRect = objectRef.current?.getBoundingClientRect();
3255
- const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;
3256
- const clientOffset = monitor.getClientOffset();
3257
- if (!clientOffset)
3258
- return;
3259
- const hoverClientY = clientOffset && clientOffset.y - hoverBoundingRect.top;
3260
- if (typeof dragIndex === "number" && typeof newIndex === "number") {
3261
- if (dragIndex === newIndex) {
3262
- return;
3263
- }
3264
- if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {
3265
- if (dragIndex < newIndex && hoverClientY < hoverMiddleY) {
3266
- return;
3267
- }
3268
- if (dragIndex > newIndex && hoverClientY > hoverMiddleY) {
3269
- return;
3270
- }
3271
- }
3272
- onMoveItem(newIndex, dragIndex);
3273
- item2.index = newIndex;
3274
- } else {
3275
- if (Array.isArray(dragIndex) && Array.isArray(newIndex)) {
3276
- const minLength = Math.min(dragIndex.length, newIndex.length);
3277
- let areEqual = true;
3278
- let isLessThan = false;
3279
- let isGreaterThan = false;
3280
- for (let i = 0; i < minLength; i++) {
3281
- if (dragIndex[i] < newIndex[i]) {
3282
- isLessThan = true;
3283
- areEqual = false;
3284
- break;
3285
- } else if (dragIndex[i] > newIndex[i]) {
3286
- isGreaterThan = true;
3287
- areEqual = false;
3288
- break;
3289
- }
3290
- }
3291
- if (areEqual && dragIndex.length === newIndex.length) {
3292
- return;
3293
- }
3294
- if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {
3295
- if (isLessThan && !isGreaterThan && hoverClientY < hoverMiddleY) {
3296
- return;
3297
- }
3298
- if (isGreaterThan && !isLessThan && hoverClientY > hoverMiddleY) {
3299
- return;
3300
- }
3301
- }
3302
- }
3303
- onMoveItem(newIndex, dragIndex);
3304
- item2.index = newIndex;
3305
- }
3306
- }
3307
- });
3308
- const getDragDirection = (monitor) => {
3309
- if (monitor && monitor.isDragging() && !monitor.didDrop() && monitor.getInitialClientOffset() && monitor.getClientOffset()) {
3310
- const deltaY = monitor.getInitialClientOffset().y - monitor.getClientOffset().y;
3311
- if (deltaY > 0)
3312
- return DIRECTIONS.UPWARD;
3313
- if (deltaY < 0)
3314
- return DIRECTIONS.DOWNWARD;
3315
- return null;
3316
- }
3317
- return null;
3318
- };
3319
- const [{ isDragging, direction }, dragRef, dragPreviewRef] = useDrag({
3320
- type,
3321
- item() {
3322
- if (onStart) {
3323
- onStart();
3324
- }
3325
- const { width } = objectRef.current?.getBoundingClientRect() ?? {};
3326
- return { index, width, ...item };
3327
- },
3328
- end() {
3329
- if (onEnd) {
3330
- onEnd();
3331
- }
3332
- },
3333
- canDrag: active,
3334
- /**
3335
- * This is useful when the item is in a virtualized list.
3336
- * However, if we don't have an ID then we want the libraries
3337
- * defaults to take care of this.
3338
- */
3339
- isDragging: item?.id ? (monitor) => {
3340
- return item.id === monitor.getItem().id;
3341
- } : void 0,
3342
- collect: (monitor) => ({
3343
- isDragging: monitor.isDragging(),
3344
- initialOffset: monitor.getInitialClientOffset(),
3345
- currentOffset: monitor.getClientOffset(),
3346
- direction: getDragDirection(monitor)
3347
- })
3348
- });
3349
- const handleKeyDown = useKeyboardDragAndDrop(active, index, {
3350
- onGrabItem,
3351
- onDropItem,
3352
- onCancel,
3353
- onMoveItem
3354
- });
3355
- return [
3356
- { handlerId, isDragging, handleKeyDown, isOverDropTarget: isOver, direction },
3357
- objectRef,
3358
- dropRef,
3359
- dragRef,
3360
- dragPreviewRef
3361
- ];
3362
- };
3363
-
3364
- const relationsApi = contentManagerApi.injectEndpoints({
3365
- endpoints: (build) => ({
3366
- getRelations: build.query({
3367
- query: ({ model, id, targetField, params }) => {
3368
- return {
3369
- url: `/content-manager/relations/${model}/${id}/${targetField}`,
3370
- method: "GET",
3371
- config: {
3372
- params
3373
- }
3374
- };
3375
- },
3376
- serializeQueryArgs: (args) => {
3377
- const { endpointName, queryArgs } = args;
3378
- return {
3379
- endpointName,
3380
- model: queryArgs.model,
3381
- id: queryArgs.id,
3382
- targetField: queryArgs.targetField,
3383
- locale: queryArgs.params?.locale,
3384
- status: queryArgs.params?.status
3385
- };
3386
- },
3387
- merge: (currentCache, newItems) => {
3388
- if (currentCache.pagination && newItems.pagination) {
3389
- if (currentCache.pagination.page < newItems.pagination.page) {
3390
- const existingIds = currentCache.results.map((item) => item.documentId);
3391
- const uniqueNewItems = newItems.results.filter(
3392
- (item) => !existingIds.includes(item.documentId)
3393
- );
3394
- currentCache.results.push(...prepareTempKeys(uniqueNewItems, currentCache.results));
3395
- currentCache.pagination = newItems.pagination;
3396
- } else if (newItems.pagination.page === 1) {
3397
- currentCache.results = prepareTempKeys(newItems.results);
3398
- currentCache.pagination = newItems.pagination;
3399
- }
3400
- }
3401
- },
3402
- forceRefetch({ currentArg, previousArg }) {
3403
- if (!currentArg?.params && !previousArg?.params) {
3404
- return false;
3405
- }
3406
- return currentArg?.params?.page !== previousArg?.params?.page || currentArg?.params?.pageSize !== previousArg?.params?.pageSize;
3407
- },
3408
- transformResponse: (response) => {
3409
- if ("results" in response && response.results) {
3410
- return {
3411
- ...response,
3412
- results: prepareTempKeys(response.results.toReversed())
3413
- };
3414
- } else {
3415
- return response;
3416
- }
3417
- },
3418
- providesTags: ["Relations"]
3419
- }),
3420
- searchRelations: build.query({
3421
- query: ({ model, targetField, params }) => {
3422
- return {
3423
- url: `/content-manager/relations/${model}/${targetField}`,
3424
- method: "GET",
3425
- config: {
3426
- params
3427
- }
3428
- };
3429
- },
3430
- serializeQueryArgs: (args) => {
3431
- const { endpointName, queryArgs } = args;
3432
- return {
3433
- endpointName,
3434
- model: queryArgs.model,
3435
- targetField: queryArgs.targetField,
3436
- _q: queryArgs.params?._q,
3437
- idsToOmit: queryArgs.params?.idsToOmit,
3438
- idsToInclude: queryArgs.params?.idsToInclude
3439
- };
3440
- },
3441
- merge: (currentCache, newItems) => {
3442
- if (currentCache.pagination && newItems.pagination) {
3443
- if (currentCache.pagination.page < newItems.pagination.page) {
3444
- const existingIds = currentCache.results.map((item) => item.documentId);
3445
- const uniqueNewItems = newItems.results.filter(
3446
- (item) => !existingIds.includes(item.documentId)
3447
- );
3448
- currentCache.results.push(...uniqueNewItems);
3449
- currentCache.pagination = newItems.pagination;
3450
- } else if (newItems.pagination.page === 1) {
3451
- currentCache.results = newItems.results;
3452
- currentCache.pagination = newItems.pagination;
3453
- }
3454
- }
3455
- },
3456
- forceRefetch({ currentArg, previousArg }) {
3457
- if (!currentArg?.params && !previousArg?.params) {
3458
- return false;
3459
- }
3460
- return currentArg?.params?.page !== previousArg?.params?.page || currentArg?.params?.pageSize !== previousArg?.params?.pageSize;
3461
- },
3462
- transformResponse: (response) => {
3463
- if (response.results) {
3464
- return {
3465
- ...response,
3466
- results: response.results
3467
- };
3468
- } else {
3469
- return response;
3470
- }
3471
- }
3472
- })
3473
- })
3474
- });
3475
- const prepareTempKeys = (relations, existingRelations = []) => {
3476
- const [firstItem] = existingRelations.slice(0);
3477
- const keys = generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);
3478
- return relations.map((datum, index) => ({
3479
- ...datum,
3480
- __temp_key__: keys[index]
3481
- }));
3482
- };
3483
- const { useGetRelationsQuery, useLazySearchRelationsQuery } = relationsApi;
3484
-
3485
- const getRelationLabel = (relation, mainField) => {
3486
- const label = mainField && relation[mainField.name] ? relation[mainField.name] : null;
3487
- if (typeof label === "string") {
3488
- return label;
3489
- }
3490
- return relation.documentId;
3491
- };
3492
-
3493
- const [ComponentProvider, useComponent] = createContext("ComponentContext", {
3494
- id: void 0,
3495
- level: -1,
3496
- uid: void 0,
3497
- type: void 0
3498
- });
3499
-
3500
- const RELATIONS_TO_DISPLAY = 5;
3501
- const ONE_WAY_RELATIONS = ["oneWay", "oneToOne", "manyToOne", "oneToManyMorph", "oneToOneMorph"];
3502
- const RelationsField = React.forwardRef(
3503
- ({ disabled, label, ...props }, ref) => {
3504
- const [currentPage, setCurrentPage] = React.useState(1);
3505
- const { document, model: documentModel } = useDoc();
3506
- const documentId = document?.documentId;
3507
- const { formatMessage } = useIntl();
3508
- const [{ query }] = useQueryParams();
3509
- const params = buildValidParams(query);
3510
- const isMorph = props.attribute.relation.toLowerCase().includes("morph");
3511
- const isDisabled = isMorph || disabled;
3512
- const { id: componentId, uid } = useComponent("RelationsField", ({ uid: uid2, id: id2 }) => ({ id: id2, uid: uid2 }));
3513
- const id = componentId ? componentId.toString() : documentId;
3514
- const model = uid ?? documentModel;
3515
- const [targetField] = props.name.split(".").slice(-1);
3516
- const { data, isLoading, isFetching } = useGetRelationsQuery(
3517
- {
3518
- model,
3519
- targetField,
3520
- // below we don't run the query if there is no id.
3521
- id,
3522
- params: {
3523
- ...params,
3524
- pageSize: RELATIONS_TO_DISPLAY,
3525
- page: currentPage
3526
- }
3527
- },
3528
- {
3529
- refetchOnMountOrArgChange: true,
3530
- skip: !id,
3531
- selectFromResult: (result) => {
3532
- return {
3533
- ...result,
3534
- data: {
3535
- ...result.data,
3536
- results: result.data?.results ? result.data.results : []
3537
- }
3538
- };
3539
- }
3540
- }
3541
- );
3542
- const handleLoadMore = () => {
3543
- setCurrentPage((prev) => prev + 1);
3544
- };
3545
- const field = useField(props.name);
3546
- const isFetchingMoreRelations = isLoading || isFetching;
3547
- const realServerRelationsCount = "pagination" in data && data.pagination ? data.pagination.total : 0;
3548
- const relationsConnected = (field.value?.connect ?? []).filter(
3549
- (rel) => data.results.findIndex((relation) => relation.id === rel.id) === -1
3550
- ).length ?? 0;
3551
- const relationsDisconnected = field.value?.disconnect?.length ?? 0;
3552
- const relationsCount = realServerRelationsCount + relationsConnected - relationsDisconnected;
3553
- const relations = React.useMemo(() => {
3554
- const ctx = {
3555
- field: field.value,
3556
- // @ts-expect-error – targetModel does exist on the attribute. But it's not typed.
3557
- href: `../${COLLECTION_TYPES}/${props.attribute.targetModel}`,
3558
- mainField: props.mainField
3559
- };
3560
- const transformations = pipe(
3561
- removeConnected(ctx),
3562
- removeDisconnected(ctx),
3563
- addLabelAndHref(ctx)
3564
- );
3565
- const transformedRels = transformations([...data.results]);
3566
- return [...transformedRels, ...field.value?.connect ?? []].sort((a, b) => {
3567
- if (a.__temp_key__ < b.__temp_key__)
3568
- return -1;
3569
- if (a.__temp_key__ > b.__temp_key__)
3570
- return 1;
3571
- return 0;
3572
- });
3573
- }, [
3574
- data.results,
3575
- field.value,
3576
- // @ts-expect-error – targetModel does exist on the attribute. But it's not typed.
3577
- props.attribute.targetModel,
3578
- props.mainField
3579
- ]);
3580
- const handleConnect = (relation) => {
3581
- const [lastItemInList] = relations.slice(-1);
3582
- const item = {
3583
- id: relation.id,
3584
- status: relation.status,
3585
- /**
3586
- * If there's a last item, that's the first key we use to generate out next one.
3587
- */
3588
- __temp_key__: generateNKeysBetween(lastItemInList?.__temp_key__ ?? null, null, 1)[0],
3589
- // Fallback to `id` if there is no `mainField` value, which will overwrite the above `id` property with the exact same data.
3590
- [props.mainField?.name ?? "documentId"]: relation[props.mainField?.name ?? "documentId"],
3591
- label: getRelationLabel(relation, props.mainField),
3592
- // @ts-expect-error – targetModel does exist on the attribute, but it's not typed.
3593
- href: `../${COLLECTION_TYPES}/${props.attribute.targetModel}/${relation.documentId}`
3594
- };
3595
- if (ONE_WAY_RELATIONS.includes(props.attribute.relation)) {
3596
- field.onChange(`${props.name}.connect`, [item]);
3597
- } else {
3598
- field.onChange(`${props.name}.connect`, [...field.value?.connect ?? [], item]);
3599
- }
3600
- };
3601
- return /* @__PURE__ */ jsxs(
3602
- Flex,
3603
- {
3604
- ref,
3605
- direction: "column",
3606
- gap: 3,
3607
- justifyContent: "space-between",
3608
- alignItems: "stretch",
3609
- wrap: "wrap",
3610
- children: [
3611
- /* @__PURE__ */ jsxs(StyledFlex, { direction: "column", alignItems: "start", gap: 2, width: "100%", children: [
3612
- /* @__PURE__ */ jsx(
3613
- RelationsInput,
3614
- {
3615
- disabled: isDisabled,
3616
- id,
3617
- label: `${label} ${relationsCount > 0 ? `(${relationsCount})` : ""}`,
3618
- model,
3619
- onChange: handleConnect,
3620
- ...props
3621
- }
3622
- ),
3623
- "pagination" in data && data.pagination && data.pagination.pageCount > data.pagination.page ? /* @__PURE__ */ jsx(
3624
- TextButton,
3625
- {
3626
- disabled: isFetchingMoreRelations,
3627
- onClick: handleLoadMore,
3628
- loading: isFetchingMoreRelations,
3629
- startIcon: /* @__PURE__ */ jsx(Refresh, {}),
3630
- shrink: 0,
3631
- children: formatMessage({
3632
- id: getTranslation("relation.loadMore"),
3633
- defaultMessage: "Load More"
3634
- })
3635
- }
3636
- ) : null
3637
- ] }),
3638
- /* @__PURE__ */ jsx(
3639
- RelationsList,
3640
- {
3641
- data: relations,
3642
- serverData: data.results,
3643
- disabled: isDisabled,
3644
- name: props.name,
3645
- isLoading: isFetchingMoreRelations,
3646
- relationType: props.attribute.relation
3647
- }
3648
- )
3649
- ]
3650
- }
3651
- );
3652
- }
3653
- );
3654
- const StyledFlex = styled(Flex)`
3655
- & > div {
3656
- width: 100%;
3657
- }
3658
- `;
3659
- const removeConnected = ({ field }) => (relations) => {
3660
- return relations.filter((relation) => {
3661
- const connectedRelations = field?.connect ?? [];
3662
- return connectedRelations.findIndex((rel) => rel.id === relation.id) === -1;
3663
- });
3664
- };
3665
- const removeDisconnected = ({ field }) => (relations) => relations.filter((relation) => {
3666
- const disconnectedRelations = field?.disconnect ?? [];
3667
- return disconnectedRelations.findIndex((rel) => rel.id === relation.id) === -1;
3668
- });
3669
- const addLabelAndHref = ({ mainField, href }) => (relations) => relations.map((relation) => {
3670
- return {
3671
- ...relation,
3672
- // Fallback to `id` if there is no `mainField` value, which will overwrite the above `documentId` property with the exact same data.
3673
- [mainField?.name ?? "documentId"]: relation[mainField?.name ?? "documentId"],
3674
- label: getRelationLabel(relation, mainField),
3675
- href: `${href}/${relation.documentId}`
3676
- };
3677
- });
3678
- const RelationsInput = ({
3679
- disabled,
3680
- hint,
3681
- id,
3682
- label,
3683
- model,
3684
- name,
3685
- mainField,
3686
- placeholder,
3687
- required,
3688
- onChange
3689
- }) => {
3690
- const [textValue, setTextValue] = React.useState("");
3691
- const [searchParams, setSearchParams] = React.useState({
3692
- _q: "",
3693
- page: 1
3694
- });
3695
- const { toggleNotification } = useNotification();
3696
- const [{ query }] = useQueryParams();
3697
- const { formatMessage } = useIntl();
3698
- const fieldRef = useFocusInputField(name);
3699
- const field = useField(name);
3700
- const [searchForTrigger, { data, isLoading }] = useLazySearchRelationsQuery();
3701
- React.useEffect(() => {
3702
- const [targetField] = name.split(".").slice(-1);
3703
- searchForTrigger({
3704
- model,
3705
- targetField,
3706
- params: {
3707
- ...buildValidParams(query),
3708
- id: id ?? "",
3709
- pageSize: 10,
3710
- idsToInclude: field.value?.disconnect?.map((rel) => rel.id.toString()) ?? [],
3711
- idsToOmit: field.value?.connect?.map((rel) => rel.id.toString()) ?? [],
3712
- ...searchParams
3713
- }
3714
- });
3715
- }, [
3716
- field.value?.connect,
3717
- field.value?.disconnect,
3718
- id,
3719
- model,
3720
- name,
3721
- query,
3722
- searchForTrigger,
3723
- searchParams
3724
- ]);
3725
- const handleSearch = async (search) => {
3726
- setSearchParams((s) => ({ ...s, _q: search, page: 1 }));
3727
- };
3728
- const hasNextPage = data?.pagination ? data.pagination.page < data.pagination.pageCount : false;
3729
- const options = data?.results ?? [];
3730
- const handleChange = (relationId) => {
3731
- if (!relationId) {
3732
- return;
3733
- }
3734
- const relation = options.find((opt) => opt.id.toString() === relationId);
3735
- if (!relation) {
3736
- console.error(
3737
- "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."
3738
- );
3739
- toggleNotification({
3740
- message: formatMessage({
3741
- id: getTranslation("relation.error-adding-relation"),
3742
- defaultMessage: "An error occurred while trying to add the relation."
3743
- }),
3744
- type: "danger"
3745
- });
3746
- return;
3747
- }
3748
- onChange(relation);
3749
- };
3750
- const handleLoadMore = () => {
3751
- if (!data || !data.pagination) {
3752
- return;
3753
- } else if (data.pagination.page < data.pagination.pageCount) {
3754
- setSearchParams((s) => ({ ...s, page: s.page + 1 }));
3755
- }
3756
- };
3757
- React.useLayoutEffect(() => {
3758
- setTextValue("");
3759
- }, [field.value]);
3760
- return /* @__PURE__ */ jsx(
3761
- Combobox,
3762
- {
3763
- ref: fieldRef,
3764
- autocomplete: "none",
3765
- error: field.error,
3766
- name,
3767
- hint,
3768
- required,
3769
- label,
3770
- disabled,
3771
- placeholder: placeholder || formatMessage({
3772
- id: getTranslation("relation.add"),
3773
- defaultMessage: "Add relation"
3774
- }),
3775
- hasMoreItems: hasNextPage,
3776
- loading: isLoading,
3777
- onOpenChange: () => {
3778
- handleSearch(textValue ?? "");
3779
- },
3780
- noOptionsMessage: () => formatMessage({
3781
- id: getTranslation("relation.notAvailable"),
3782
- defaultMessage: "No relations available"
3783
- }),
3784
- loadingMessage: formatMessage({
3785
- id: getTranslation("relation.isLoading"),
3786
- defaultMessage: "Relations are loading"
3787
- }),
3788
- onLoadMore: handleLoadMore,
3789
- textValue,
3790
- onChange: handleChange,
3791
- onTextValueChange: (text) => {
3792
- setTextValue(text);
3793
- },
3794
- onInputChange: (event) => {
3795
- handleSearch(event.currentTarget.value);
3796
- },
3797
- children: options.map((opt) => {
3798
- const textValue2 = getRelationLabel(opt, mainField);
3799
- return /* @__PURE__ */ jsx(ComboboxOption, { value: opt.id.toString(), textValue: textValue2, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, justifyContent: "space-between", children: [
3800
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: textValue2 }),
3801
- opt.status ? /* @__PURE__ */ jsx(DocumentStatus, { status: opt.status }) : null
3802
- ] }) }, opt.id);
3803
- })
3804
- }
3805
- );
3806
- };
3807
- const RELATION_ITEM_HEIGHT = 50;
3808
- const RELATION_GUTTER = 4;
3809
- const RelationsList = ({
3810
- data,
3811
- serverData,
3812
- disabled,
3813
- name,
3814
- isLoading,
3815
- relationType
3816
- }) => {
3817
- const ariaDescriptionId = React.useId();
3818
- const { formatMessage } = useIntl();
3819
- const listRef = React.useRef(null);
3820
- const outerListRef = React.useRef(null);
3821
- const [overflow, setOverflow] = React.useState();
3822
- const [liveText, setLiveText] = React.useState("");
3823
- const field = useField(name);
3824
- const removeFieldRow = useForm("RelationsList", (state) => state.removeFieldRow);
3825
- const addFieldRow = useForm("RelationsList", (state) => state.addFieldRow);
3826
- React.useEffect(() => {
3827
- if (data.length <= RELATIONS_TO_DISPLAY) {
3828
- return setOverflow(void 0);
3829
- }
3830
- const handleNativeScroll = (e) => {
3831
- const el = e.target;
3832
- const parentScrollContainerHeight = el.parentNode.scrollHeight;
3833
- const maxScrollBottom = el.scrollHeight - el.scrollTop;
3834
- if (el.scrollTop === 0) {
3835
- return setOverflow("bottom");
3836
- }
3837
- if (maxScrollBottom === parentScrollContainerHeight) {
3838
- return setOverflow("top");
3839
- }
3840
- return setOverflow("top-bottom");
3841
- };
3842
- const outerListRefCurrent = outerListRef?.current;
3843
- if (!isLoading && data.length > 0 && outerListRefCurrent) {
3844
- outerListRef.current.addEventListener("scroll", handleNativeScroll);
3845
- }
3846
- return () => {
3847
- if (outerListRefCurrent) {
3848
- outerListRefCurrent.removeEventListener("scroll", handleNativeScroll);
3849
- }
3850
- };
3851
- }, [isLoading, data.length]);
3852
- const getItemPos = (index) => `${index + 1} of ${data.length}`;
3853
- const handleMoveItem = (newIndex, oldIndex) => {
3854
- const item = data[oldIndex];
3855
- setLiveText(
3856
- formatMessage(
3857
- {
3858
- id: getTranslation("dnd.reorder"),
3859
- defaultMessage: "{item}, moved. New position in list: {position}."
3860
- },
3861
- {
3862
- item: item.label ?? item.documentId,
3863
- position: getItemPos(newIndex)
3864
- }
3865
- )
3866
- );
3867
- const newData = [...data];
3868
- const currentRow = data[oldIndex];
3869
- const startKey = oldIndex > newIndex ? newData[newIndex - 1]?.__temp_key__ : newData[newIndex]?.__temp_key__;
3870
- const endKey = oldIndex > newIndex ? newData[newIndex]?.__temp_key__ : newData[newIndex + 1]?.__temp_key__;
3871
- const [newKey] = generateNKeysBetween(startKey, endKey, 1);
3872
- newData.splice(oldIndex, 1);
3873
- newData.splice(newIndex, 0, { ...currentRow, __temp_key__: newKey });
3874
- const connectedRelations = newData.reduce((acc, relation, currentIndex, array) => {
3875
- const relationOnServer = serverData.find(
3876
- (oldRelation) => oldRelation.documentId === relation.documentId
3877
- );
3878
- const relationInFront = array[currentIndex + 1];
3879
- if (!relationOnServer || relationOnServer.__temp_key__ !== relation.__temp_key__) {
3880
- const position = relationInFront ? {
3881
- before: relationInFront.documentId,
3882
- locale: relationInFront.locale,
3883
- status: relationInFront.status
3884
- } : { end: true };
3885
- const relationWithPosition = { ...relation, position };
3886
- return [...acc, relationWithPosition];
3887
- }
3888
- return acc;
3889
- }, []).toReversed();
3890
- field.onChange(`${name}.connect`, connectedRelations);
3891
- };
3892
- const handleGrabItem = (index) => {
3893
- const item = data[index];
3894
- setLiveText(
3895
- formatMessage(
3896
- {
3897
- id: getTranslation("dnd.grab-item"),
3898
- defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
3899
- },
3900
- {
3901
- item: item.label ?? item.documentId,
3902
- position: getItemPos(index)
3903
- }
3904
- )
3905
- );
3906
- };
3907
- const handleDropItem = (index) => {
3908
- const { href: _href, label, ...item } = data[index];
3909
- setLiveText(
3910
- formatMessage(
3911
- {
3912
- id: getTranslation("dnd.drop-item"),
3913
- defaultMessage: `{item}, dropped. Final position in list: {position}.`
3914
- },
3915
- {
3916
- item: label ?? item.documentId,
3917
- position: getItemPos(index)
3918
- }
3919
- )
3920
- );
3921
- };
3922
- const handleCancel = (index) => {
3923
- const item = data[index];
3924
- setLiveText(
3925
- formatMessage(
3926
- {
3927
- id: getTranslation("dnd.cancel-item"),
3928
- defaultMessage: "{item}, dropped. Re-order cancelled."
3929
- },
3930
- {
3931
- item: item.label ?? item.documentId
3932
- }
3933
- )
3934
- );
3935
- };
3936
- const handleDisconnect = (relation) => {
3937
- if (field.value && field.value.connect) {
3938
- const indexOfRelationInConnectArray = field.value.connect.findIndex(
3939
- (rel) => rel.id === relation.id
3940
- );
3941
- if (indexOfRelationInConnectArray >= 0) {
3942
- removeFieldRow(`${name}.connect`, indexOfRelationInConnectArray);
3943
- return;
3944
- }
3945
- }
3946
- addFieldRow(`${name}.disconnect`, { id: relation.id });
3947
- };
3948
- const canReorder = !ONE_WAY_RELATIONS.includes(relationType);
3949
- 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);
3950
- return /* @__PURE__ */ jsxs(ShadowBox, { overflowDirection: overflow, children: [
3951
- /* @__PURE__ */ jsx(VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
3952
- id: getTranslation("dnd.instructions"),
3953
- defaultMessage: `Press spacebar to grab and re-order`
3954
- }) }),
3955
- /* @__PURE__ */ jsx(VisuallyHidden, { "aria-live": "assertive", children: liveText }),
3956
- /* @__PURE__ */ jsx(
3957
- FixedSizeList,
3958
- {
3959
- height: dynamicListHeight,
3960
- ref: listRef,
3961
- outerRef: outerListRef,
3962
- itemCount: data.length,
3963
- itemSize: RELATION_ITEM_HEIGHT + RELATION_GUTTER,
3964
- itemData: {
3965
- ariaDescribedBy: ariaDescriptionId,
3966
- canDrag: canReorder,
3967
- disabled,
3968
- handleCancel,
3969
- handleDropItem,
3970
- handleGrabItem,
3971
- handleMoveItem,
3972
- name,
3973
- handleDisconnect,
3974
- relations: data
3975
- },
3976
- itemKey: (index) => data[index].id,
3977
- innerElementType: "ol",
3978
- children: ListItem
3979
- }
3980
- )
3981
- ] });
3982
- };
3983
- const ShadowBox = styled(Box)`
3984
- position: relative;
3985
- overflow: hidden;
3986
- flex: 1;
3987
-
3988
- &:before,
3989
- &:after {
3990
- position: absolute;
3991
- width: 100%;
3992
- height: 4px;
3993
- z-index: 1;
3994
- }
3995
-
3996
- &:before {
3997
- /* TODO: as for DS Table component we would need this to be handled by the DS theme */
3998
- content: '';
3999
- background: linear-gradient(rgba(3, 3, 5, 0.2) 0%, rgba(0, 0, 0, 0) 100%);
4000
- top: 0;
4001
- opacity: ${({ overflowDirection }) => overflowDirection === "top-bottom" || overflowDirection === "top" ? 1 : 0};
4002
- transition: opacity 0.2s ease-in-out;
4003
- }
4004
-
4005
- &:after {
4006
- /* TODO: as for DS Table component we would need this to be handled by the DS theme */
4007
- content: '';
4008
- background: linear-gradient(0deg, rgba(3, 3, 5, 0.2) 0%, rgba(0, 0, 0, 0) 100%);
4009
- bottom: 0;
4010
- opacity: ${({ overflowDirection }) => overflowDirection === "top-bottom" || overflowDirection === "bottom" ? 1 : 0};
4011
- transition: opacity 0.2s ease-in-out;
4012
- }
4013
- `;
4014
- const ListItem = ({ data, index, style }) => {
4015
- const {
4016
- ariaDescribedBy,
4017
- canDrag = false,
4018
- disabled = false,
4019
- handleCancel,
4020
- handleDisconnect,
4021
- handleDropItem,
4022
- handleGrabItem,
4023
- handleMoveItem,
4024
- name,
4025
- relations
4026
- } = data;
4027
- const { formatMessage } = useIntl();
4028
- const { href, documentId, label, status } = relations[index];
4029
- const [{ handlerId, isDragging, handleKeyDown }, relationRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop(
4030
- canDrag && !disabled,
4031
- {
4032
- type: `${ItemTypes.RELATION}_${name}`,
4033
- index,
4034
- item: {
4035
- displayedValue: label,
4036
- status,
4037
- id: documentId,
4038
- index
4039
- },
4040
- onMoveItem: handleMoveItem,
4041
- onDropItem: handleDropItem,
4042
- onGrabItem: handleGrabItem,
4043
- onCancel: handleCancel,
4044
- dropSensitivity: DROP_SENSITIVITY.REGULAR
4045
- }
4046
- );
4047
- const composedRefs = useComposedRefs(relationRef, dragRef);
4048
- React.useEffect(() => {
4049
- dragPreviewRef(getEmptyImage());
4050
- }, [dragPreviewRef]);
4051
- return /* @__PURE__ */ jsx(
4052
- Box,
4053
- {
4054
- style,
4055
- as: "li",
4056
- ref: dropRef,
4057
- "aria-describedby": ariaDescribedBy,
4058
- cursor: canDrag ? "all-scroll" : "default",
4059
- children: isDragging ? /* @__PURE__ */ jsx(RelationItemPlaceholder, {}) : /* @__PURE__ */ jsxs(
4060
- Flex,
4061
- {
4062
- paddingTop: 2,
4063
- paddingBottom: 2,
4064
- paddingLeft: canDrag ? 2 : 4,
4065
- paddingRight: 4,
4066
- hasRadius: true,
4067
- borderColor: "neutral200",
4068
- background: disabled ? "neutral150" : "neutral0",
4069
- justifyContent: "space-between",
4070
- ref: composedRefs,
4071
- "data-handler-id": handlerId,
4072
- children: [
4073
- /* @__PURE__ */ jsxs(FlexWrapper, { gap: 1, children: [
4074
- canDrag ? /* @__PURE__ */ jsx(
4075
- IconButton,
4076
- {
4077
- forwardedAs: "div",
4078
- role: "button",
4079
- tabIndex: 0,
4080
- "aria-label": formatMessage({
4081
- id: getTranslation("components.RelationInput.icon-button-aria-label"),
4082
- defaultMessage: "Drag"
4083
- }),
4084
- borderWidth: 0,
4085
- onKeyDown: handleKeyDown,
4086
- disabled,
4087
- children: /* @__PURE__ */ jsx(Drag, {})
4088
- }
4089
- ) : null,
4090
- /* @__PURE__ */ jsxs(Flex, { width: "100%", minWidth: 0, justifyContent: "space-between", children: [
4091
- /* @__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 }) }) }),
4092
- status ? /* @__PURE__ */ jsx(DocumentStatus, { status }) : null
4093
- ] })
4094
- ] }),
4095
- /* @__PURE__ */ jsx(Box, { paddingLeft: 4, children: /* @__PURE__ */ jsx(
4096
- DisconnectButton,
4097
- {
4098
- disabled,
4099
- type: "button",
4100
- onClick: () => handleDisconnect(relations[index]),
4101
- "aria-label": formatMessage({
4102
- id: getTranslation("relation.disconnect"),
4103
- defaultMessage: "Remove"
4104
- }),
4105
- children: /* @__PURE__ */ jsx(Icon, { width: "12px", as: Cross })
4106
- }
4107
- ) })
4108
- ]
4109
- }
4110
- )
4111
- }
4112
- );
4113
- };
4114
- const FlexWrapper = styled(Flex)`
4115
- width: 100%;
4116
- /* Used to prevent endAction to be pushed out of container */
4117
- min-width: 0;
4118
-
4119
- & > div[role='button'] {
4120
- cursor: all-scroll;
4121
- }
4122
- `;
4123
- const DisconnectButton = styled.button`
4124
- svg path {
4125
- fill: ${({ theme, disabled }) => disabled ? theme.colors.neutral600 : theme.colors.neutral500};
4126
- }
4127
-
4128
- &:hover svg path,
4129
- &:focus svg path {
4130
- fill: ${({ theme, disabled }) => !disabled && theme.colors.neutral600};
4131
- }
4132
- `;
4133
- const LinkEllipsis = styled(Link)`
4134
- display: block;
4135
-
4136
- & > span {
4137
- white-space: nowrap;
4138
- overflow: hidden;
4139
- text-overflow: ellipsis;
4140
- display: block;
4141
- }
4142
- `;
4143
- const RelationItemPlaceholder = () => /* @__PURE__ */ jsx(
4144
- Box,
4145
- {
4146
- paddingTop: 2,
4147
- paddingBottom: 2,
4148
- paddingLeft: 4,
4149
- paddingRight: 4,
4150
- hasRadius: true,
4151
- borderStyle: "dashed",
4152
- borderColor: "primary600",
4153
- borderWidth: "1px",
4154
- background: "primary100",
4155
- height: `calc(100% - ${RELATION_GUTTER}px)`
4156
- }
4157
- );
4158
-
4159
- const RelationDragPreview = ({ status, displayedValue, width }) => {
4160
- return /* @__PURE__ */ jsx(Box, { style: { width }, children: /* @__PURE__ */ jsxs(
4161
- Flex,
4162
- {
4163
- paddingTop: 2,
4164
- paddingBottom: 2,
4165
- paddingLeft: 2,
4166
- paddingRight: 4,
4167
- hasRadius: true,
4168
- borderWidth: 1,
4169
- background: "neutral0",
4170
- borderColor: "neutral200",
4171
- justifyContent: "space-between",
4172
- children: [
4173
- /* @__PURE__ */ jsxs(FlexWrapper, { gap: 1, children: [
4174
- /* @__PURE__ */ jsx(IconButton, { "aria-label": "", borderWidth: 0, children: /* @__PURE__ */ jsx(Drag, {}) }),
4175
- /* @__PURE__ */ jsxs(Flex, { width: "100%", minWidth: 0, justifyContent: "space-between", children: [
4176
- /* @__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 }) }) }),
4177
- status ? /* @__PURE__ */ jsx(DocumentStatus, { status }) : null
4178
- ] })
4179
- ] }),
4180
- /* @__PURE__ */ jsx(Box, { paddingLeft: 4, children: /* @__PURE__ */ jsx(DisconnectButton, { type: "button", children: /* @__PURE__ */ jsx(Icon, { width: "12px", as: Cross }) }) })
4181
- ]
4182
- }
4183
- ) });
4184
- };
4185
-
4186
- const LeftMenu = () => {
4187
- const [search, setSearch] = React.useState("");
4188
- const [{ query }] = useQueryParams();
4189
- const { formatMessage, locale } = useIntl();
4190
- const collectionTypeLinks = useTypedSelector(
4191
- (state) => state["content-manager_app"].collectionTypeLinks
4192
- );
4193
- const singleTypeLinks = useTypedSelector((state) => state["content-manager_app"].singleTypeLinks);
4194
- const { startsWith } = useFilter(locale, {
4195
- sensitivity: "base"
4196
- });
4197
- const formatter = useCollator(locale, {
4198
- sensitivity: "base"
4199
- });
4200
- const menu = React.useMemo(
4201
- () => [
4202
- {
4203
- id: "collectionTypes",
4204
- title: formatMessage({
4205
- id: getTranslation("components.LeftMenu.collection-types"),
4206
- defaultMessage: "Collection Types"
4207
- }),
4208
- searchable: true,
4209
- links: collectionTypeLinks
4210
- },
4211
- {
4212
- id: "singleTypes",
4213
- title: formatMessage({
4214
- id: getTranslation("components.LeftMenu.single-types"),
4215
- defaultMessage: "Single Types"
4216
- }),
4217
- searchable: true,
4218
- links: singleTypeLinks
4219
- }
4220
- ].map((section) => ({
4221
- ...section,
4222
- links: section.links.filter((link) => startsWith(link.title, search)).sort((a, b) => formatter.compare(a.title, b.title)).map((link) => {
4223
- return {
4224
- ...link,
4225
- title: formatMessage({ id: link.title, defaultMessage: link.title })
4226
- };
4227
- })
4228
- })),
4229
- [collectionTypeLinks, search, singleTypeLinks, startsWith, formatMessage, formatter]
4230
- );
4231
- const handleClear = () => {
4232
- setSearch("");
4233
- };
4234
- const handleChangeSearch = ({ target: { value } }) => {
4235
- setSearch(value);
4236
- };
4237
- const label = formatMessage({
4238
- id: getTranslation("header.name"),
4239
- defaultMessage: "Content"
4240
- });
4241
- return /* @__PURE__ */ jsxs(SubNav, { ariaLabel: label, children: [
4242
- /* @__PURE__ */ jsx(
4243
- SubNavHeader,
4244
- {
4245
- label,
4246
- searchable: true,
4247
- value: search,
4248
- onChange: handleChangeSearch,
4249
- onClear: handleClear,
4250
- searchLabel: formatMessage({
4251
- id: "content-manager.components.LeftMenu.Search.label",
4252
- defaultMessage: "Search for a content type"
4253
- })
4254
- }
4255
- ),
4256
- /* @__PURE__ */ jsx(SubNavSections, { children: menu.map((section) => {
4257
- return /* @__PURE__ */ jsx(
4258
- SubNavSection,
4259
- {
4260
- label: section.title,
4261
- badgeLabel: section.links.length.toString(),
4262
- children: section.links.map((link) => {
4263
- return /* @__PURE__ */ jsx(
4264
- SubNavLink,
4265
- {
4266
- as: NavLink,
4267
- to: {
4268
- pathname: link.to,
4269
- /**
4270
- * We re-add the plugins query to the params available in the menu,
4271
- * this means once you've changed the locale in the app, you continue
4272
- * to see the same locale when changing content-type.
4273
- *
4274
- * NOTE: if you go to a content-type that does not have i18n enabled,
4275
- * we return the default documents anyway.
4276
- */
4277
- search: stringify({
4278
- ...parse(link.search ?? ""),
4279
- plugins: query.plugins
4280
- })
4281
- },
4282
- children: link.title
4283
- },
4284
- link.uid
4285
- );
4286
- })
4287
- },
4288
- section.id
4289
- );
4290
- }) })
4291
- ] });
4292
- };
4293
-
4294
- const contentTypesApi = contentManagerApi.injectEndpoints({
4295
- endpoints: (builder) => ({
4296
- getContentTypeConfiguration: builder.query({
4297
- query: (uid) => ({
4298
- url: `/content-manager/content-types/${uid}/configuration`,
4299
- method: "GET"
4300
- }),
4301
- transformResponse: (response) => response.data,
4302
- providesTags: (_result, _error, uid) => [
4303
- { type: "ContentTypesConfiguration", id: uid },
4304
- { type: "ContentTypeSettings", id: "LIST" }
4305
- ]
4306
- }),
4307
- getAllContentTypeSettings: builder.query({
4308
- query: () => "/content-manager/content-types-settings",
4309
- transformResponse: (response) => response.data,
4310
- providesTags: [{ type: "ContentTypeSettings", id: "LIST" }]
4311
- }),
4312
- updateContentTypeConfiguration: builder.mutation({
4313
- query: ({ uid, ...body }) => ({
4314
- url: `/content-manager/content-types/${uid}/configuration`,
4315
- method: "PUT",
4316
- data: body
4317
- }),
4318
- transformResponse: (response) => response.data,
4319
- invalidatesTags: (_result, _error, { uid }) => [
4320
- { type: "ContentTypesConfiguration", id: uid },
4321
- { type: "ContentTypeSettings", id: "LIST" },
4322
- // Is this necessary?
4323
- { type: "InitialData" }
4324
- ]
4325
- })
4326
- })
4327
- });
4328
- const {
4329
- useGetContentTypeConfigurationQuery,
4330
- useGetAllContentTypeSettingsQuery,
4331
- useUpdateContentTypeConfigurationMutation
4332
- } = contentTypesApi;
4333
-
4334
- const { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;
4335
- const useContentManagerInitData = () => {
4336
- const dispatch = useTypedDispatch();
4337
- const { toggleNotification } = useNotification();
4338
- const runHookWaterfall = useStrapiApp(
4339
- "useContentManagerInitData",
4340
- (state2) => state2.runHookWaterfall
4341
- );
4342
- const { notifyStatus } = useNotifyAT();
4343
- const { formatMessage } = useIntl();
4344
- const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);
4345
- const checkUserHasPermissions = useAuth(
4346
- "useContentManagerInitData",
4347
- (state2) => state2.checkUserHasPermissions
4348
- );
4349
- const state = useTypedSelector((state2) => state2["content-manager_app"]);
4350
- const initialDataQuery = useGetInitialDataQuery(void 0, {
4351
- /**
4352
- * TODO: remove this when the CTB has been refactored to use redux-toolkit-query
4353
- * and it can invalidate the cache on mutation
4354
- */
4355
- refetchOnMountOrArgChange: true
4356
- });
4357
- useEffect(() => {
4358
- if (initialDataQuery.data) {
4359
- notifyStatus(
4360
- formatMessage({
4361
- id: getTranslation("App.schemas.data-loaded"),
4362
- defaultMessage: "The schemas have been successfully loaded."
4363
- })
4364
- );
4365
- }
4366
- }, [formatMessage, initialDataQuery.data, notifyStatus]);
4367
- useEffect(() => {
4368
- if (initialDataQuery.error) {
4369
- toggleNotification({ type: "danger", message: formatAPIError(initialDataQuery.error) });
4370
- }
4371
- }, [formatAPIError, initialDataQuery.error, toggleNotification]);
4372
- const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();
4373
- useEffect(() => {
4374
- if (contentTypeSettingsQuery.error) {
4375
- toggleNotification({
4376
- type: "danger",
4377
- message: formatAPIError(contentTypeSettingsQuery.error)
4378
- });
4379
- }
4380
- }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);
4381
- const formatData = async (components, contentTypes, fieldSizes, contentTypeConfigurations) => {
4382
- const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } = contentTypes.reduce(
4383
- (acc, model) => {
4384
- acc[model.kind].push(model);
4385
- return acc;
4386
- },
4387
- {
4388
- collectionType: [],
4389
- singleType: []
4390
- }
4391
- );
4392
- const collectionTypeSectionLinks = generateLinks(
4393
- collectionTypeLinks,
4394
- "collectionTypes",
4395
- contentTypeConfigurations
4396
- );
4397
- const singleTypeSectionLinks = generateLinks(singleTypeLinks, "singleTypes");
4398
- const collectionTypeLinksPermissions = await Promise.all(
4399
- collectionTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))
4400
- );
4401
- const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter(
4402
- (_, index) => collectionTypeLinksPermissions[index]
4403
- );
4404
- const singleTypeLinksPermissions = await Promise.all(
4405
- singleTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))
4406
- );
4407
- const authorizedSingleTypeLinks = singleTypeSectionLinks.filter(
4408
- (_, index) => singleTypeLinksPermissions[index]
4409
- );
4410
- const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {
4411
- ctLinks: authorizedCollectionTypeLinks,
4412
- models: contentTypes
4413
- });
4414
- const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {
4415
- stLinks: authorizedSingleTypeLinks,
4416
- models: contentTypes
4417
- });
4418
- dispatch({
4419
- type: SET_INIT_DATA,
4420
- authorizedCollectionTypeLinks: ctLinks,
4421
- authorizedSingleTypeLinks: stLinks,
4422
- contentTypeSchemas: contentTypes,
4423
- components,
4424
- fieldSizes
4425
- });
4426
- };
4427
- useEffect(() => {
4428
- if (initialDataQuery.data && contentTypeSettingsQuery.data) {
4429
- formatData(
4430
- initialDataQuery.data.components,
4431
- initialDataQuery.data.contentTypes,
4432
- initialDataQuery.data.fieldSizes,
4433
- contentTypeSettingsQuery.data
4434
- );
4435
- }
4436
- }, [initialDataQuery.data, contentTypeSettingsQuery.data]);
4437
- return { ...state };
4438
- };
4439
- const generateLinks = (links, type, configurations = []) => {
4440
- return links.filter((link) => link.isDisplayed).map((link) => {
4441
- const collectionTypesPermissions = [
4442
- { action: "plugin::content-manager.explorer.create", subject: link.uid },
4443
- { action: "plugin::content-manager.explorer.read", subject: link.uid }
4444
- ];
4445
- const singleTypesPermissions = [
4446
- { action: "plugin::content-manager.explorer.read", subject: link.uid }
4447
- ];
4448
- const permissions = type === "collectionTypes" ? collectionTypesPermissions : singleTypesPermissions;
4449
- const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);
4450
- let search = null;
4451
- if (currentContentTypeConfig) {
4452
- const searchParams = {
4453
- page: 1,
4454
- pageSize: currentContentTypeConfig.settings.pageSize,
4455
- sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`
4456
- };
4457
- search = stringify(searchParams, { encode: false });
4458
- }
4459
- return {
4460
- permissions,
4461
- search,
4462
- kind: link.kind,
4463
- title: link.info.displayName,
4464
- to: `/content-manager/${link.kind === "collectionType" ? COLLECTION_TYPES : SINGLE_TYPES}/${link.uid}`,
4465
- uid: link.uid,
4466
- // Used for the list item key in the helper plugin
4467
- name: link.uid,
4468
- isDisplayed: link.isDisplayed
4469
- };
4470
- });
4471
- };
4472
-
4473
- const Layout = () => {
4474
- const contentTypeMatch = useMatch("/content-manager/:kind/:uid/*");
4475
- const { isLoading, collectionTypeLinks, models, singleTypeLinks } = useContentManagerInitData();
4476
- const authorisedModels = [...collectionTypeLinks, ...singleTypeLinks].sort(
4477
- (a, b) => a.title.localeCompare(b.title)
4478
- );
4479
- const { pathname } = useLocation();
4480
- const { formatMessage } = useIntl();
4481
- const startSection = useGuidedTour("Layout", (state) => state.startSection);
4482
- const startSectionRef = React.useRef(startSection);
4483
- const isHistoryRoute = useIsHistoryRoute();
4484
- React.useEffect(() => {
4485
- if (startSectionRef.current) {
4486
- startSectionRef.current("contentManager");
4487
- }
4488
- }, []);
4489
- if (isLoading) {
4490
- return /* @__PURE__ */ jsxs(Fragment, { children: [
4491
- /* @__PURE__ */ jsx(
4492
- Helmet,
4493
- {
4494
- title: formatMessage({
4495
- id: getTranslation("plugin.name"),
4496
- defaultMessage: "Content Manager"
4497
- })
4498
- }
4499
- ),
4500
- /* @__PURE__ */ jsx(Page.Loading, {})
4501
- ] });
4502
- }
4503
- const supportedModelsToDisplay = models.filter(({ isDisplayed }) => isDisplayed);
4504
- if (authorisedModels.length === 0 && supportedModelsToDisplay.length > 0 && pathname !== "/content-manager/403") {
4505
- return /* @__PURE__ */ jsx(Navigate, { to: "/403" });
4506
- }
4507
- if (supportedModelsToDisplay.length === 0 && pathname !== "/no-content-types") {
4508
- return /* @__PURE__ */ jsx(Navigate, { to: "/no-content-types" });
4509
- }
4510
- if (!contentTypeMatch && authorisedModels.length > 0) {
4511
- return /* @__PURE__ */ jsx(
4512
- Navigate,
4513
- {
4514
- to: {
4515
- pathname: authorisedModels[0].to,
4516
- search: authorisedModels[0].search ?? ""
4517
- }
4518
- }
4519
- );
4520
- }
4521
- return /* @__PURE__ */ jsxs(Fragment, { children: [
4522
- /* @__PURE__ */ jsx(
4523
- Helmet,
4524
- {
4525
- title: formatMessage({
4526
- id: getTranslation("plugin.name"),
4527
- defaultMessage: "Content Manager"
4528
- })
4529
- }
4530
- ),
4531
- isHistoryRoute ? /* @__PURE__ */ jsx(Outlet, {}) : /* @__PURE__ */ jsxs(Layout$1, { sideNav: /* @__PURE__ */ jsx(LeftMenu, {}), children: [
4532
- /* @__PURE__ */ jsx(DragLayer, { renderItem: renderDraglayerItem }),
4533
- /* @__PURE__ */ jsx(Outlet, {})
4534
- ] })
4535
- ] });
4536
- };
4537
- function renderDraglayerItem({ type, item }) {
4538
- if (!type || type && typeof type !== "string") {
4539
- return null;
4540
- }
4541
- const [actualType] = type.split("_");
4542
- switch (actualType) {
4543
- case ItemTypes.EDIT_FIELD:
4544
- case ItemTypes.FIELD:
4545
- return /* @__PURE__ */ jsx(CardDragPreview, { label: item.label });
4546
- case ItemTypes.COMPONENT:
4547
- case ItemTypes.DYNAMIC_ZONE:
4548
- return /* @__PURE__ */ jsx(ComponentDragPreview, { displayedValue: item.displayedValue });
4549
- case ItemTypes.RELATION:
4550
- return /* @__PURE__ */ jsx(RelationDragPreview, { ...item });
4551
- default:
4552
- return null;
4553
- }
4554
- }
4555
- const SET_INIT_DATA = "ContentManager/App/SET_INIT_DATA";
4556
- const initialState$1 = {
4557
- collectionTypeLinks: [],
4558
- components: [],
4559
- fieldSizes: {},
4560
- models: [],
4561
- singleTypeLinks: [],
4562
- isLoading: true
4563
- };
4564
- const reducer$2 = (state = initialState$1, action) => produce(state, (draftState) => {
4565
- switch (action.type) {
4566
- case SET_INIT_DATA: {
4567
- const initDataAction = action;
4568
- draftState.collectionTypeLinks = initDataAction.authorizedCollectionTypeLinks.filter(
4569
- ({ isDisplayed }) => isDisplayed
4570
- );
4571
- draftState.singleTypeLinks = initDataAction.authorizedSingleTypeLinks.filter(
4572
- ({ isDisplayed }) => isDisplayed
4573
- );
4574
- draftState.components = initDataAction.components;
4575
- draftState.models = initDataAction.contentTypeSchemas;
4576
- draftState.fieldSizes = initDataAction.fieldSizes;
4577
- draftState.isLoading = false;
4578
- break;
4579
- }
4580
- default:
4581
- return draftState;
4582
- }
4583
- });
4584
-
4585
- const layout = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
4586
- __proto__: null,
4587
- Layout,
4588
- SET_INIT_DATA,
4589
- reducer: reducer$2
4590
- }, Symbol.toStringTag, { value: 'Module' }));
4591
-
4592
- const initialState = {
4593
- permissions: void 0
4594
- };
4595
- const rbacSlice = createSlice({
4596
- name: "rbac",
4597
- initialState,
4598
- reducers: {
4599
- setPermissions(state, action) {
4600
- state.permissions = Object.values(action.payload.permissions).reduce((acc, current) => {
4601
- return [...acc, ...current];
4602
- }, []);
4603
- },
4604
- resetPermissions(state) {
4605
- state.permissions = void 0;
4606
- }
4607
- }
4608
- });
4609
- const { actions, reducer: reducer$1 } = rbacSlice;
4610
- const { setPermissions, resetPermissions } = actions;
4611
-
4612
- const reducer = combineReducers({
4613
- rbac: reducer$1
4614
- });
4615
-
4616
- 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 };
4617
- //# sourceMappingURL=reducers-IQWvK_9L.mjs.map