@strapi/admin 5.0.0-beta.0 → 5.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1080) hide show
  1. package/dist/admin/AdminSeatInfo-KKTvi8LR.mjs +101 -0
  2. package/dist/admin/AdminSeatInfo-KKTvi8LR.mjs.map +1 -0
  3. package/dist/admin/AdminSeatInfo-pcU6Psg5.js +105 -0
  4. package/dist/admin/AdminSeatInfo-pcU6Psg5.js.map +1 -0
  5. package/dist/admin/ApplicationInfoPage-Ip1_DTk9.js +692 -0
  6. package/dist/admin/ApplicationInfoPage-Ip1_DTk9.js.map +1 -0
  7. package/dist/admin/ApplicationInfoPage-eFuntlx4.mjs +664 -0
  8. package/dist/admin/ApplicationInfoPage-eFuntlx4.mjs.map +1 -0
  9. package/dist/admin/AuthResponse-j4iu1hDd.js +70 -0
  10. package/dist/admin/AuthResponse-j4iu1hDd.js.map +1 -0
  11. package/dist/admin/AuthResponse-no1FFPpN.mjs +43 -0
  12. package/dist/admin/AuthResponse-no1FFPpN.mjs.map +1 -0
  13. package/dist/admin/AuthenticatedLayout-GD2XM4Xh.js +1142 -0
  14. package/dist/admin/AuthenticatedLayout-GD2XM4Xh.js.map +1 -0
  15. package/dist/admin/AuthenticatedLayout-mta84NQE.mjs +1109 -0
  16. package/dist/admin/AuthenticatedLayout-mta84NQE.mjs.map +1 -0
  17. package/dist/admin/CreateActionEE-9o2Mj6Ml.mjs +53 -0
  18. package/dist/admin/CreateActionEE-9o2Mj6Ml.mjs.map +1 -0
  19. package/dist/admin/CreateActionEE-j8NEQArt.js +61 -0
  20. package/dist/admin/CreateActionEE-j8NEQArt.js.map +1 -0
  21. package/dist/admin/CreatePage-FJXNWV-g.mjs +13 -0
  22. package/dist/admin/CreatePage-FJXNWV-g.mjs.map +1 -0
  23. package/dist/admin/CreatePage-P-JKk6La.mjs +240 -0
  24. package/dist/admin/CreatePage-P-JKk6La.mjs.map +1 -0
  25. package/dist/admin/CreatePage-V4cSRx8F.js +269 -0
  26. package/dist/admin/CreatePage-V4cSRx8F.js.map +1 -0
  27. package/dist/admin/CreatePage-ZcVRwog2.js +18 -0
  28. package/dist/admin/CreatePage-ZcVRwog2.js.map +1 -0
  29. package/dist/admin/CreateView-5zt3cfsd.js +17 -0
  30. package/dist/admin/CreateView-5zt3cfsd.js.map +1 -0
  31. package/dist/admin/CreateView-A1wdcygq.mjs +13 -0
  32. package/dist/admin/CreateView-A1wdcygq.mjs.map +1 -0
  33. package/dist/admin/CreateView-BKV0PWUL.mjs +13 -0
  34. package/dist/admin/CreateView-BKV0PWUL.mjs.map +1 -0
  35. package/dist/admin/CreateView-tQxib6Yo.js +17 -0
  36. package/dist/admin/CreateView-tQxib6Yo.js.map +1 -0
  37. package/dist/admin/EditPage-7LbHuqPq.js +281 -0
  38. package/dist/admin/EditPage-7LbHuqPq.js.map +1 -0
  39. package/dist/admin/EditPage-L3K_x3mo.js +818 -0
  40. package/dist/admin/EditPage-L3K_x3mo.js.map +1 -0
  41. package/dist/admin/EditPage-NKv-e2KT.mjs +255 -0
  42. package/dist/admin/EditPage-NKv-e2KT.mjs.map +1 -0
  43. package/dist/admin/EditPage-YUSwYkTW.js +350 -0
  44. package/dist/admin/EditPage-YUSwYkTW.js.map +1 -0
  45. package/dist/admin/EditPage-k_6aHRVf.mjs +321 -0
  46. package/dist/admin/EditPage-k_6aHRVf.mjs.map +1 -0
  47. package/dist/admin/EditPage-qN5pbP1W.mjs +790 -0
  48. package/dist/admin/EditPage-qN5pbP1W.mjs.map +1 -0
  49. package/dist/admin/EditView-HPIQBaUm.js +358 -0
  50. package/dist/admin/EditView-HPIQBaUm.js.map +1 -0
  51. package/dist/admin/EditView-NsG_ztE8.mjs +332 -0
  52. package/dist/admin/EditView-NsG_ztE8.mjs.map +1 -0
  53. package/dist/admin/EditViewPage-SORieV31.mjs +842 -0
  54. package/dist/admin/EditViewPage-SORieV31.mjs.map +1 -0
  55. package/dist/admin/EditViewPage-_RgRquw7.js +875 -0
  56. package/dist/admin/EditViewPage-_RgRquw7.js.map +1 -0
  57. package/dist/admin/EventsTable-ZGByQmYS.mjs +32 -0
  58. package/dist/admin/EventsTable-ZGByQmYS.mjs.map +1 -0
  59. package/dist/admin/EventsTable-lKzkleEo.js +36 -0
  60. package/dist/admin/EventsTable-lKzkleEo.js.map +1 -0
  61. package/dist/admin/HomePage-Gt7-reqY.mjs +563 -0
  62. package/dist/admin/HomePage-Gt7-reqY.mjs.map +1 -0
  63. package/dist/admin/HomePage-WL46uo6c.js +15 -0
  64. package/dist/admin/HomePage-WL46uo6c.js.map +1 -0
  65. package/dist/admin/HomePage-WNfhIqeG.mjs +11 -0
  66. package/dist/admin/HomePage-WNfhIqeG.mjs.map +1 -0
  67. package/dist/admin/HomePage-XsltwUHu.js +591 -0
  68. package/dist/admin/HomePage-XsltwUHu.js.map +1 -0
  69. package/dist/admin/InstalledPluginsPage--ZsKfXh4.mjs +96 -0
  70. package/dist/admin/InstalledPluginsPage--ZsKfXh4.mjs.map +1 -0
  71. package/dist/admin/InstalledPluginsPage-GYKMwvHv.js +121 -0
  72. package/dist/admin/InstalledPluginsPage-GYKMwvHv.js.map +1 -0
  73. package/dist/admin/Layout-Ojd0IVLT.js +232 -0
  74. package/dist/admin/Layout-Ojd0IVLT.js.map +1 -0
  75. package/dist/admin/Layout-fD9qm3jw.mjs +204 -0
  76. package/dist/admin/Layout-fD9qm3jw.mjs.map +1 -0
  77. package/dist/admin/ListPage-2KQUGpSp.js +15 -0
  78. package/dist/admin/ListPage-2KQUGpSp.js.map +1 -0
  79. package/dist/admin/ListPage-BjjqJKzh.js +514 -0
  80. package/dist/admin/ListPage-BjjqJKzh.js.map +1 -0
  81. package/dist/admin/ListPage-FjHi4ZGu.mjs +282 -0
  82. package/dist/admin/ListPage-FjHi4ZGu.mjs.map +1 -0
  83. package/dist/admin/ListPage-TQPuZR4V.mjs +535 -0
  84. package/dist/admin/ListPage-TQPuZR4V.mjs.map +1 -0
  85. package/dist/admin/ListPage-WozCiyeB.mjs +11 -0
  86. package/dist/admin/ListPage-WozCiyeB.mjs.map +1 -0
  87. package/dist/admin/ListPage-bixYhMBi.js +357 -0
  88. package/dist/admin/ListPage-bixYhMBi.js.map +1 -0
  89. package/dist/admin/ListPage-cdXKmKwt.mjs +486 -0
  90. package/dist/admin/ListPage-cdXKmKwt.mjs.map +1 -0
  91. package/dist/admin/ListPage-ddKZOtpb.js +563 -0
  92. package/dist/admin/ListPage-ddKZOtpb.js.map +1 -0
  93. package/dist/admin/ListPage-fjrFazMD.mjs +332 -0
  94. package/dist/admin/ListPage-fjrFazMD.mjs.map +1 -0
  95. package/dist/admin/ListPage-qABnTZzR.js +307 -0
  96. package/dist/admin/ListPage-qABnTZzR.js.map +1 -0
  97. package/dist/admin/ListView-9E8SVTSf.js +232 -0
  98. package/dist/admin/ListView-9E8SVTSf.js.map +1 -0
  99. package/dist/admin/ListView-T5y4ambL.mjs +197 -0
  100. package/dist/admin/ListView-T5y4ambL.mjs.map +1 -0
  101. package/dist/admin/ListView-ZC27Df9H.js +223 -0
  102. package/dist/admin/ListView-ZC27Df9H.js.map +1 -0
  103. package/dist/admin/ListView-jUavvOoD.mjs +206 -0
  104. package/dist/admin/ListView-jUavvOoD.mjs.map +1 -0
  105. package/dist/admin/Login-1AOrPSGD.js +39 -0
  106. package/dist/admin/Login-1AOrPSGD.js.map +1 -0
  107. package/dist/admin/Login-pnQ7v5vq.mjs +31 -0
  108. package/dist/admin/Login-pnQ7v5vq.mjs.map +1 -0
  109. package/dist/admin/MagicLinkEE-BpisXVzq.js +31 -0
  110. package/dist/admin/MagicLinkEE-BpisXVzq.js.map +1 -0
  111. package/dist/admin/MagicLinkEE-ahlmWLG6.mjs +27 -0
  112. package/dist/admin/MagicLinkEE-ahlmWLG6.mjs.map +1 -0
  113. package/dist/admin/MarketplacePage-Ogkt8lJq.js +1051 -0
  114. package/dist/admin/MarketplacePage-Ogkt8lJq.js.map +1 -0
  115. package/dist/admin/MarketplacePage-gDPY0phu.mjs +1020 -0
  116. package/dist/admin/MarketplacePage-gDPY0phu.mjs.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-RkPUHIVE.js +2086 -0
  120. package/dist/admin/Permissions-RkPUHIVE.js.map +1 -0
  121. package/dist/admin/Permissions-l8yWERDW.mjs +2050 -0
  122. package/dist/admin/Permissions-l8yWERDW.mjs.map +1 -0
  123. package/dist/admin/PrivateRoute-I8uiqYMc.js +22 -0
  124. package/dist/admin/PrivateRoute-I8uiqYMc.js.map +1 -0
  125. package/dist/admin/PrivateRoute-m7OeCfYA.mjs +20 -0
  126. package/dist/admin/PrivateRoute-m7OeCfYA.mjs.map +1 -0
  127. package/dist/admin/ProfilePage-mO3MQozZ.mjs +387 -0
  128. package/dist/admin/ProfilePage-mO3MQozZ.mjs.map +1 -0
  129. package/dist/admin/ProfilePage-yLYrmYfh.js +415 -0
  130. package/dist/admin/ProfilePage-yLYrmYfh.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-E27rLNXb.js +114 -0
  140. package/dist/admin/SelectRoles-E27rLNXb.js.map +1 -0
  141. package/dist/admin/SelectRoles-vs_GIRku.mjs +106 -0
  142. package/dist/admin/SelectRoles-vs_GIRku.mjs.map +1 -0
  143. package/dist/admin/SingleSignOnPage-EIJNDHZ1.js +259 -0
  144. package/dist/admin/SingleSignOnPage-EIJNDHZ1.js.map +1 -0
  145. package/dist/admin/SingleSignOnPage-rFbze2qS.mjs +234 -0
  146. package/dist/admin/SingleSignOnPage-rFbze2qS.mjs.map +1 -0
  147. package/dist/admin/Table-y_iVVRmo.js +221 -0
  148. package/dist/admin/Table-y_iVVRmo.js.map +1 -0
  149. package/dist/admin/Table-yt4e2psj.mjs +196 -0
  150. package/dist/admin/Table-yt4e2psj.mjs.map +1 -0
  151. package/dist/admin/Theme-Gult7t3_.mjs +1094 -0
  152. package/dist/admin/Theme-Gult7t3_.mjs.map +1 -0
  153. package/dist/admin/Theme-j7r62OPn.js +1159 -0
  154. package/dist/admin/Theme-j7r62OPn.js.map +1 -0
  155. package/dist/admin/TokenTypeSelect-6UaG68id.js +386 -0
  156. package/dist/admin/TokenTypeSelect-6UaG68id.js.map +1 -0
  157. package/dist/admin/TokenTypeSelect-FTMoBhn3.mjs +358 -0
  158. package/dist/admin/TokenTypeSelect-FTMoBhn3.mjs.map +1 -0
  159. package/dist/admin/UseCasePage-PzT7YQgK.js +175 -0
  160. package/dist/admin/UseCasePage-PzT7YQgK.js.map +1 -0
  161. package/dist/admin/UseCasePage-ifVOOcqK.mjs +146 -0
  162. package/dist/admin/UseCasePage-ifVOOcqK.mjs.map +1 -0
  163. package/dist/admin/admin-vcfA8Zox.js +263 -0
  164. package/dist/admin/admin-vcfA8Zox.js.map +1 -0
  165. package/dist/admin/admin-w3o7ePNm.mjs +246 -0
  166. package/dist/admin/admin-w3o7ePNm.mjs.map +1 -0
  167. package/dist/admin/apiTokens-75EXEvGS.mjs +56 -0
  168. package/dist/admin/apiTokens-75EXEvGS.mjs.map +1 -0
  169. package/dist/admin/apiTokens-wqQgdbcG.js +62 -0
  170. package/dist/admin/apiTokens-wqQgdbcG.js.map +1 -0
  171. package/dist/admin/ar-74XpZHjA.js +853 -0
  172. package/dist/admin/ar-74XpZHjA.js.map +1 -0
  173. package/dist/admin/ar-gTQs8p7A.mjs +832 -0
  174. package/dist/admin/ar-gTQs8p7A.mjs.map +1 -0
  175. package/dist/admin/ca-A-U5stlG.mjs +520 -0
  176. package/dist/admin/ca-A-U5stlG.mjs.map +1 -0
  177. package/dist/admin/ca-tfhzbe_0.js +538 -0
  178. package/dist/admin/ca-tfhzbe_0.js.map +1 -0
  179. package/dist/admin/constants-ORUQO0uh.mjs +52 -0
  180. package/dist/admin/constants-ORUQO0uh.mjs.map +1 -0
  181. package/dist/admin/constants-oTDk_K7z.js +60 -0
  182. package/dist/admin/constants-oTDk_K7z.js.map +1 -0
  183. package/dist/admin/cs-iYqoHUVt.mjs +166 -0
  184. package/dist/admin/cs-iYqoHUVt.mjs.map +1 -0
  185. package/dist/admin/cs-sS-228vY.js +179 -0
  186. package/dist/admin/cs-sS-228vY.js.map +1 -0
  187. package/dist/admin/de-og0YSnla.js +532 -0
  188. package/dist/admin/de-og0YSnla.js.map +1 -0
  189. package/dist/admin/de-uZBjRd6a.mjs +514 -0
  190. package/dist/admin/de-uZBjRd6a.mjs.map +1 -0
  191. package/dist/admin/dk-GtDhDxRc.js +452 -0
  192. package/dist/admin/dk-GtDhDxRc.js.map +1 -0
  193. package/dist/admin/dk-nXAO32DE.mjs +434 -0
  194. package/dist/admin/dk-nXAO32DE.mjs.map +1 -0
  195. package/dist/admin/ee.js +12 -0
  196. package/dist/admin/ee.js.map +1 -0
  197. package/dist/admin/ee.mjs +3 -0
  198. package/dist/admin/ee.mjs.map +1 -0
  199. package/dist/admin/en-2FB7x9Rq.js +804 -0
  200. package/dist/admin/en-2FB7x9Rq.js.map +1 -0
  201. package/dist/admin/en-qvX6GTOD.mjs +783 -0
  202. package/dist/admin/en-qvX6GTOD.mjs.map +1 -0
  203. package/dist/admin/es-TQtY4G8X.js +615 -0
  204. package/dist/admin/es-TQtY4G8X.js.map +1 -0
  205. package/dist/admin/es-i0dEHPPQ.mjs +595 -0
  206. package/dist/admin/es-i0dEHPPQ.mjs.map +1 -0
  207. package/dist/admin/eu-SRdPRyQu.js +645 -0
  208. package/dist/admin/eu-SRdPRyQu.js.map +1 -0
  209. package/dist/admin/eu-wFmYHERY.mjs +625 -0
  210. package/dist/admin/eu-wFmYHERY.mjs.map +1 -0
  211. package/dist/admin/fr-GW5-kEO9.js +571 -0
  212. package/dist/admin/fr-GW5-kEO9.js.map +1 -0
  213. package/dist/admin/fr-OI7VyC_k.mjs +550 -0
  214. package/dist/admin/fr-OI7VyC_k.mjs.map +1 -0
  215. package/dist/admin/gu-z6qqOLRh.js +438 -0
  216. package/dist/admin/gu-z6qqOLRh.js.map +1 -0
  217. package/dist/admin/gu-zSaMc-a6.mjs +429 -0
  218. package/dist/admin/gu-zSaMc-a6.mjs.map +1 -0
  219. package/dist/admin/he-CLdZZ_n1.js +329 -0
  220. package/dist/admin/he-CLdZZ_n1.js.map +1 -0
  221. package/dist/admin/he-YzAGShlQ.mjs +315 -0
  222. package/dist/admin/he-YzAGShlQ.mjs.map +1 -0
  223. package/dist/admin/hi-3pMoYe6q.js +537 -0
  224. package/dist/admin/hi-3pMoYe6q.js.map +1 -0
  225. package/dist/admin/hi-ZQ4t6UdY.mjs +519 -0
  226. package/dist/admin/hi-ZQ4t6UdY.mjs.map +1 -0
  227. package/dist/admin/hu-O1FJoY8c.mjs +625 -0
  228. package/dist/admin/hu-O1FJoY8c.mjs.map +1 -0
  229. package/dist/admin/hu-VxIqV1X0.js +645 -0
  230. package/dist/admin/hu-VxIqV1X0.js.map +1 -0
  231. package/dist/admin/id-Lb_0kPQU.mjs +290 -0
  232. package/dist/admin/id-Lb_0kPQU.mjs.map +1 -0
  233. package/dist/admin/id-cUUpuxZO.js +303 -0
  234. package/dist/admin/id-cUUpuxZO.js.map +1 -0
  235. package/dist/admin/index-PCKQWB49.mjs +5140 -0
  236. package/dist/admin/index-PCKQWB49.mjs.map +1 -0
  237. package/dist/admin/index-tmvI3DXu.js +5218 -0
  238. package/dist/admin/index-tmvI3DXu.js.map +1 -0
  239. package/dist/admin/index.js +26 -27
  240. package/dist/admin/index.js.map +1 -1
  241. package/dist/admin/index.mjs +3 -3
  242. package/dist/admin/it-136monzD.mjs +299 -0
  243. package/dist/admin/it-136monzD.mjs.map +1 -0
  244. package/dist/admin/it-m8H0rXTP.js +312 -0
  245. package/dist/admin/it-m8H0rXTP.js.map +1 -0
  246. package/dist/admin/ja-0-FUC0T4.mjs +434 -0
  247. package/dist/admin/ja-0-FUC0T4.mjs.map +1 -0
  248. package/dist/admin/ja-jhqUhh7F.js +452 -0
  249. package/dist/admin/ja-jhqUhh7F.js.map +1 -0
  250. package/dist/admin/ko-Fq49QS3z.js +451 -0
  251. package/dist/admin/ko-Fq49QS3z.js.map +1 -0
  252. package/dist/admin/ko-H3Y8GpnD.mjs +433 -0
  253. package/dist/admin/ko-H3Y8GpnD.mjs.map +1 -0
  254. package/dist/admin/ml-NPdcpJoN.mjs +519 -0
  255. package/dist/admin/ml-NPdcpJoN.mjs.map +1 -0
  256. package/dist/admin/ml-mLJM4sQP.js +537 -0
  257. package/dist/admin/ml-mLJM4sQP.js.map +1 -0
  258. package/dist/admin/ms-NDmpSkMY.js +213 -0
  259. package/dist/admin/ms-NDmpSkMY.js.map +1 -0
  260. package/dist/admin/ms-v9c434YI.mjs +200 -0
  261. package/dist/admin/ms-v9c434YI.mjs.map +1 -0
  262. package/dist/admin/nl-RREi1JAg.js +641 -0
  263. package/dist/admin/nl-RREi1JAg.js.map +1 -0
  264. package/dist/admin/nl-qHmOt3d1.mjs +621 -0
  265. package/dist/admin/nl-qHmOt3d1.mjs.map +1 -0
  266. package/dist/admin/no-2wT9Jd9n.js +313 -0
  267. package/dist/admin/no-2wT9Jd9n.js.map +1 -0
  268. package/dist/admin/no-XGZQN-Ji.mjs +300 -0
  269. package/dist/admin/no-XGZQN-Ji.mjs.map +1 -0
  270. package/dist/admin/pl-Id5YX-Pw.mjs +519 -0
  271. package/dist/admin/pl-Id5YX-Pw.mjs.map +1 -0
  272. package/dist/admin/pl-kU2npCRO.js +537 -0
  273. package/dist/admin/pl-kU2npCRO.js.map +1 -0
  274. package/dist/admin/pt-BR-0o0Gf-P8.mjs +588 -0
  275. package/dist/admin/pt-BR-0o0Gf-P8.mjs.map +1 -0
  276. package/dist/admin/pt-BR-R-dMJxPL.js +608 -0
  277. package/dist/admin/pt-BR-R-dMJxPL.js.map +1 -0
  278. package/dist/admin/pt-IygqsPYv.js +212 -0
  279. package/dist/admin/pt-IygqsPYv.js.map +1 -0
  280. package/dist/admin/pt-f52AXrxz.mjs +200 -0
  281. package/dist/admin/pt-f52AXrxz.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-1-hG3q3-.js +8 -0
  291. package/dist/admin/selectors-1-hG3q3-.js.map +1 -0
  292. package/dist/admin/selectors-i8UwQyuC.mjs +6 -0
  293. package/dist/admin/selectors-i8UwQyuC.mjs.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 +9 -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/FormInputs/types.d.ts +3 -3
  302. package/dist/admin/src/components/PageHelpers.d.ts +4 -0
  303. package/dist/admin/src/constants/filters.d.ts +2 -2
  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/StrapiApp.d.ts +1 -1
  308. package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
  309. package/dist/admin/src/hooks/useContentTypes.d.ts +3 -3
  310. package/dist/admin/src/index.d.ts +7 -3
  311. package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
  312. package/dist/admin/src/pages/Settings/components/Tokens/FormHead.d.ts +2 -2
  313. package/dist/admin/src/pages/Settings/components/Tokens/Table.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/Users/components/NewUserForm.d.ts +2 -2
  316. package/dist/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.d.ts +5 -5
  317. package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +5 -5
  318. package/dist/admin/src/render.d.ts +2 -2
  319. package/dist/admin/src/selectors.d.ts +4 -14
  320. package/dist/admin/src/services/admin.d.ts +5 -5
  321. package/dist/admin/src/services/api.d.ts +3 -3
  322. package/dist/admin/src/services/apiTokens.d.ts +1 -1
  323. package/dist/admin/src/services/auth.d.ts +10 -10
  324. package/dist/admin/src/services/contentApi.d.ts +1 -1
  325. package/dist/admin/src/services/contentManager.d.ts +2 -2
  326. package/dist/admin/src/services/transferTokens.d.ts +1 -1
  327. package/dist/admin/src/services/users.d.ts +14 -14
  328. package/dist/admin/src/services/webhooks.d.ts +2 -2
  329. package/dist/admin/src/utils/users.d.ts +1 -2
  330. package/dist/admin/sv-Uv9nW9cN.js +640 -0
  331. package/dist/admin/sv-Uv9nW9cN.js.map +1 -0
  332. package/dist/admin/sv-lzyY1dsz.mjs +620 -0
  333. package/dist/admin/sv-lzyY1dsz.mjs.map +1 -0
  334. package/dist/admin/test.js +136 -2615
  335. package/dist/admin/test.js.map +1 -1
  336. package/dist/admin/test.mjs +129 -2608
  337. package/dist/admin/test.mjs.map +1 -1
  338. package/dist/admin/tests/mockData.d.ts +0 -1065
  339. package/dist/admin/tests/store.d.ts +0 -169
  340. package/dist/admin/tests/utils.d.ts +2 -176
  341. package/dist/admin/th-7LJ9Y8EL.mjs +284 -0
  342. package/dist/admin/th-7LJ9Y8EL.mjs.map +1 -0
  343. package/dist/admin/th-SXQwWjv6.js +297 -0
  344. package/dist/admin/th-SXQwWjv6.js.map +1 -0
  345. package/dist/admin/tr-09v-DLMg.mjs +581 -0
  346. package/dist/admin/tr-09v-DLMg.mjs.map +1 -0
  347. package/dist/admin/tr-RBQM-Vq5.js +601 -0
  348. package/dist/admin/tr-RBQM-Vq5.js.map +1 -0
  349. package/dist/admin/transferTokens-Dibaubom.mjs +59 -0
  350. package/dist/admin/transferTokens-Dibaubom.mjs.map +1 -0
  351. package/dist/admin/transferTokens-GqOwfpHk.js +65 -0
  352. package/dist/admin/transferTokens-GqOwfpHk.js.map +1 -0
  353. package/dist/admin/uk-38IblmOr.mjs +201 -0
  354. package/dist/admin/uk-38IblmOr.mjs.map +1 -0
  355. package/dist/admin/uk-5T4XFIKm.js +214 -0
  356. package/dist/admin/uk-5T4XFIKm.js.map +1 -0
  357. package/dist/admin/useAdminRoles-XTNZhJh5.js +50 -0
  358. package/dist/admin/useAdminRoles-XTNZhJh5.js.map +1 -0
  359. package/dist/admin/useAdminRoles-iyGa9Xh9.mjs +28 -0
  360. package/dist/admin/useAdminRoles-iyGa9Xh9.mjs.map +1 -0
  361. package/dist/admin/useEnterprise-DUs6BYlP.js +50 -0
  362. package/dist/admin/useEnterprise-DUs6BYlP.js.map +1 -0
  363. package/dist/admin/useEnterprise-jpsYZWzn.mjs +28 -0
  364. package/dist/admin/useEnterprise-jpsYZWzn.mjs.map +1 -0
  365. package/dist/admin/useLicenseLimitNotification-d06Aex_I.mjs +80 -0
  366. package/dist/admin/useLicenseLimitNotification-d06Aex_I.mjs.map +1 -0
  367. package/dist/admin/useLicenseLimitNotification-qeIH3VJE.js +105 -0
  368. package/dist/admin/useLicenseLimitNotification-qeIH3VJE.js.map +1 -0
  369. package/dist/admin/useLicenseLimits-EyslHDFM.mjs +23 -0
  370. package/dist/admin/useLicenseLimits-EyslHDFM.mjs.map +1 -0
  371. package/dist/admin/useLicenseLimits-bLiwF5ah.js +45 -0
  372. package/dist/admin/useLicenseLimits-bLiwF5ah.js.map +1 -0
  373. package/dist/admin/useWebhooks-Dae71Az5.mjs +91 -0
  374. package/dist/admin/useWebhooks-Dae71Az5.mjs.map +1 -0
  375. package/dist/admin/useWebhooks-WyRAGIH5.js +93 -0
  376. package/dist/admin/useWebhooks-WyRAGIH5.js.map +1 -0
  377. package/dist/admin/users-BKmHEtNM.js +19 -0
  378. package/dist/admin/users-BKmHEtNM.js.map +1 -0
  379. package/dist/admin/users-P2ivP9Cm.mjs +17 -0
  380. package/dist/admin/users-P2ivP9Cm.mjs.map +1 -0
  381. package/dist/admin/validation-GUb7vvsl.mjs +43 -0
  382. package/dist/admin/validation-GUb7vvsl.mjs.map +1 -0
  383. package/dist/admin/validation-Tb5_X4v4.js +65 -0
  384. package/dist/admin/validation-Tb5_X4v4.js.map +1 -0
  385. package/dist/admin/vi-mj-Smy3d.js +200 -0
  386. package/dist/admin/vi-mj-Smy3d.js.map +1 -0
  387. package/dist/admin/vi-ryNZtXtk.mjs +187 -0
  388. package/dist/admin/vi-ryNZtXtk.mjs.map +1 -0
  389. package/dist/admin/zh-6qF5HCOo.js +642 -0
  390. package/dist/admin/zh-6qF5HCOo.js.map +1 -0
  391. package/dist/admin/zh-Hans-HlxDUeVA.mjs +716 -0
  392. package/dist/admin/zh-Hans-HlxDUeVA.mjs.map +1 -0
  393. package/dist/admin/zh-Hans-eWSoi9-X.js +737 -0
  394. package/dist/admin/zh-Hans-eWSoi9-X.js.map +1 -0
  395. package/dist/admin/zh-WEteLuNm.mjs +622 -0
  396. package/dist/admin/zh-WEteLuNm.mjs.map +1 -0
  397. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +1 -1
  398. package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
  399. package/dist/ee/server/index.js +10 -21
  400. package/dist/ee/server/index.js.map +1 -1
  401. package/dist/ee/server/index.mjs +12 -23
  402. package/dist/ee/server/index.mjs.map +1 -1
  403. package/dist/package.json.d.ts +20 -29
  404. package/dist/server/index.js +103 -99
  405. package/dist/server/index.js.map +1 -1
  406. package/dist/server/index.mjs +104 -100
  407. package/dist/server/index.mjs.map +1 -1
  408. package/dist/server/src/bootstrap.d.ts +2 -2
  409. package/dist/server/src/bootstrap.d.ts.map +1 -1
  410. package/dist/server/src/controllers/webhooks.d.ts.map +1 -1
  411. package/dist/server/src/domain/action/index.d.ts +21 -8
  412. package/dist/server/src/domain/action/index.d.ts.map +1 -1
  413. package/dist/server/src/domain/permission/index.d.ts +1 -1
  414. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  415. package/dist/server/src/domain/user.d.ts +1 -1
  416. package/dist/server/src/middlewares/index.d.ts +1 -1
  417. package/dist/server/src/middlewares/rateLimit.d.ts +2 -2
  418. package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
  419. package/dist/server/src/register.d.ts +2 -2
  420. package/dist/server/src/register.d.ts.map +1 -1
  421. package/dist/server/src/routes/serve-admin-panel.d.ts +2 -2
  422. package/dist/server/src/routes/serve-admin-panel.d.ts.map +1 -1
  423. package/dist/server/src/services/content-type.d.ts +5 -5
  424. package/dist/server/src/services/content-type.d.ts.map +1 -1
  425. package/dist/server/src/services/index.d.ts +9 -9
  426. package/dist/server/src/services/metrics.d.ts +3 -3
  427. package/dist/server/src/services/metrics.d.ts.map +1 -1
  428. package/dist/server/src/services/passport/local-strategy.d.ts +2 -2
  429. package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -1
  430. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
  431. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
  432. package/dist/server/src/services/permission/queries.d.ts +5 -6
  433. package/dist/server/src/services/permission/queries.d.ts.map +1 -1
  434. package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
  435. package/dist/server/src/services/permission/sections-builder/utils.d.ts +2 -1
  436. package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -1
  437. package/dist/server/src/services/permission.d.ts +6 -2
  438. package/dist/server/src/services/permission.d.ts.map +1 -1
  439. package/dist/server/src/services/role.d.ts +6 -6
  440. package/dist/server/src/services/role.d.ts.map +1 -1
  441. package/dist/server/src/services/user.d.ts +5 -5
  442. package/dist/server/src/services/user.d.ts.map +1 -1
  443. package/dist/server/src/validation/api-tokens.d.ts +27 -4
  444. package/dist/server/src/validation/api-tokens.d.ts.map +1 -1
  445. package/dist/server/src/validation/authentication/register.d.ts +8 -2
  446. package/dist/server/src/validation/authentication/register.d.ts.map +1 -1
  447. package/dist/server/src/validation/permission.d.ts +53 -4
  448. package/dist/server/src/validation/permission.d.ts.map +1 -1
  449. package/dist/server/src/validation/policies/hasPermissions.d.ts +7 -2
  450. package/dist/server/src/validation/policies/hasPermissions.d.ts.map +1 -1
  451. package/dist/server/src/validation/project-settings.d.ts +52 -6
  452. package/dist/server/src/validation/project-settings.d.ts.map +1 -1
  453. package/dist/server/src/validation/role.d.ts +23 -6
  454. package/dist/server/src/validation/role.d.ts.map +1 -1
  455. package/dist/server/src/validation/transfer/token.d.ts +23 -4
  456. package/dist/server/src/validation/transfer/token.d.ts.map +1 -1
  457. package/dist/server/src/validation/user.d.ts +56 -8
  458. package/dist/server/src/validation/user.d.ts.map +1 -1
  459. package/dist/shared/contracts/api-token.d.ts +5 -5
  460. package/dist/shared/contracts/api-token.d.ts.map +1 -1
  461. package/dist/shared/contracts/content-api.d.ts +2 -2
  462. package/dist/shared/contracts/content-api.d.ts.map +1 -1
  463. package/dist/shared/contracts/content-types.d.ts +5 -0
  464. package/dist/shared/contracts/content-types.d.ts.map +1 -0
  465. package/dist/shared/contracts/roles.d.ts +3 -3
  466. package/dist/shared/contracts/roles.d.ts.map +1 -1
  467. package/dist/shared/contracts/shared.d.ts +4 -4
  468. package/dist/shared/contracts/shared.d.ts.map +1 -1
  469. package/dist/shared/contracts/user.d.ts +6 -6
  470. package/dist/shared/contracts/user.d.ts.map +1 -1
  471. package/dist/shared/contracts/webhooks.d.ts +8 -8
  472. package/dist/shared/contracts/webhooks.d.ts.map +1 -1
  473. package/package.json +21 -30
  474. package/dist/admin/AdminSeatInfo-CcqY0G1v.mjs +0 -101
  475. package/dist/admin/AdminSeatInfo-CcqY0G1v.mjs.map +0 -1
  476. package/dist/admin/AdminSeatInfo-_XP-L7m2.js +0 -105
  477. package/dist/admin/AdminSeatInfo-_XP-L7m2.js.map +0 -1
  478. package/dist/admin/ApplicationInfoPage-RZ5VPA_M.mjs +0 -670
  479. package/dist/admin/ApplicationInfoPage-RZ5VPA_M.mjs.map +0 -1
  480. package/dist/admin/ApplicationInfoPage-dcW27-S0.js +0 -698
  481. package/dist/admin/ApplicationInfoPage-dcW27-S0.js.map +0 -1
  482. package/dist/admin/AuthResponse-829u1Bgr.mjs +0 -43
  483. package/dist/admin/AuthResponse-829u1Bgr.mjs.map +0 -1
  484. package/dist/admin/AuthResponse-jXbQnvQx.js +0 -70
  485. package/dist/admin/AuthResponse-jXbQnvQx.js.map +0 -1
  486. package/dist/admin/AuthenticatedLayout-a3vBuls_.mjs +0 -1115
  487. package/dist/admin/AuthenticatedLayout-a3vBuls_.mjs.map +0 -1
  488. package/dist/admin/AuthenticatedLayout-hl04NCFE.js +0 -1148
  489. package/dist/admin/AuthenticatedLayout-hl04NCFE.js.map +0 -1
  490. package/dist/admin/ComponentConfigurationPage-bbpuW93V.mjs +0 -237
  491. package/dist/admin/ComponentConfigurationPage-bbpuW93V.mjs.map +0 -1
  492. package/dist/admin/ComponentConfigurationPage-hNHSQ40m.js +0 -262
  493. package/dist/admin/ComponentConfigurationPage-hNHSQ40m.js.map +0 -1
  494. package/dist/admin/ComponentIcon-AkrHxAkm.mjs +0 -158
  495. package/dist/admin/ComponentIcon-AkrHxAkm.mjs.map +0 -1
  496. package/dist/admin/ComponentIcon-wcNWpdCz.js +0 -180
  497. package/dist/admin/ComponentIcon-wcNWpdCz.js.map +0 -1
  498. package/dist/admin/CreateActionEE-3ppNGqrP.js +0 -61
  499. package/dist/admin/CreateActionEE-3ppNGqrP.js.map +0 -1
  500. package/dist/admin/CreateActionEE-zqa6Hnzk.mjs +0 -53
  501. package/dist/admin/CreateActionEE-zqa6Hnzk.mjs.map +0 -1
  502. package/dist/admin/CreatePage-52sUoJpg.js +0 -274
  503. package/dist/admin/CreatePage-52sUoJpg.js.map +0 -1
  504. package/dist/admin/CreatePage-5GygA62E.mjs +0 -248
  505. package/dist/admin/CreatePage-5GygA62E.mjs.map +0 -1
  506. package/dist/admin/CreatePage-92_pj9pV.js +0 -18
  507. package/dist/admin/CreatePage-92_pj9pV.js.map +0 -1
  508. package/dist/admin/CreatePage-99wXBVyY.mjs +0 -13
  509. package/dist/admin/CreatePage-99wXBVyY.mjs.map +0 -1
  510. package/dist/admin/CreatePage-oegPjlEc.mjs +0 -245
  511. package/dist/admin/CreatePage-oegPjlEc.mjs.map +0 -1
  512. package/dist/admin/CreatePage-yBddklgC.js +0 -272
  513. package/dist/admin/CreatePage-yBddklgC.js.map +0 -1
  514. package/dist/admin/CreateView-4i8XqKqF.mjs +0 -13
  515. package/dist/admin/CreateView-4i8XqKqF.mjs.map +0 -1
  516. package/dist/admin/CreateView-Ic6HHrsX.mjs +0 -13
  517. package/dist/admin/CreateView-Ic6HHrsX.mjs.map +0 -1
  518. package/dist/admin/CreateView-nS-FdJkE.js +0 -17
  519. package/dist/admin/CreateView-nS-FdJkE.js.map +0 -1
  520. package/dist/admin/CreateView-vQmc3UBu.js +0 -17
  521. package/dist/admin/CreateView-vQmc3UBu.js.map +0 -1
  522. package/dist/admin/EditConfigurationPage-6doXCBmp.mjs +0 -130
  523. package/dist/admin/EditConfigurationPage-6doXCBmp.mjs.map +0 -1
  524. package/dist/admin/EditConfigurationPage-lpPR7rS-.js +0 -155
  525. package/dist/admin/EditConfigurationPage-lpPR7rS-.js.map +0 -1
  526. package/dist/admin/EditPage-4n8-yx0o.mjs +0 -325
  527. package/dist/admin/EditPage-4n8-yx0o.mjs.map +0 -1
  528. package/dist/admin/EditPage-Id--0zN8.js +0 -354
  529. package/dist/admin/EditPage-Id--0zN8.js.map +0 -1
  530. package/dist/admin/EditPage-LUNpO2Hs.mjs +0 -303
  531. package/dist/admin/EditPage-LUNpO2Hs.mjs.map +0 -1
  532. package/dist/admin/EditPage-WEpVsF5C.js +0 -822
  533. package/dist/admin/EditPage-WEpVsF5C.js.map +0 -1
  534. package/dist/admin/EditPage-YN3E4YNP.mjs +0 -260
  535. package/dist/admin/EditPage-YN3E4YNP.mjs.map +0 -1
  536. package/dist/admin/EditPage-d7F-x_Y0.js +0 -286
  537. package/dist/admin/EditPage-d7F-x_Y0.js.map +0 -1
  538. package/dist/admin/EditPage-foeIMKkr.mjs +0 -794
  539. package/dist/admin/EditPage-foeIMKkr.mjs.map +0 -1
  540. package/dist/admin/EditPage-qKcSRKvg.js +0 -327
  541. package/dist/admin/EditPage-qKcSRKvg.js.map +0 -1
  542. package/dist/admin/EditView-GXGcvgNt.mjs +0 -336
  543. package/dist/admin/EditView-GXGcvgNt.mjs.map +0 -1
  544. package/dist/admin/EditView-awLo_z9u.js +0 -362
  545. package/dist/admin/EditView-awLo_z9u.js.map +0 -1
  546. package/dist/admin/EditViewPage-1NY3YGcc.mjs +0 -198
  547. package/dist/admin/EditViewPage-1NY3YGcc.mjs.map +0 -1
  548. package/dist/admin/EditViewPage-1ZxYkrZ9.js +0 -879
  549. package/dist/admin/EditViewPage-1ZxYkrZ9.js.map +0 -1
  550. package/dist/admin/EditViewPage-QWb2DMRg.mjs +0 -846
  551. package/dist/admin/EditViewPage-QWb2DMRg.mjs.map +0 -1
  552. package/dist/admin/EditViewPage-cZsfhXI4.js +0 -226
  553. package/dist/admin/EditViewPage-cZsfhXI4.js.map +0 -1
  554. package/dist/admin/EventsTable-3Mp9Iad-.js +0 -36
  555. package/dist/admin/EventsTable-3Mp9Iad-.js.map +0 -1
  556. package/dist/admin/EventsTable-Iv41t-aJ.mjs +0 -32
  557. package/dist/admin/EventsTable-Iv41t-aJ.mjs.map +0 -1
  558. package/dist/admin/FieldTypeIcon--WKPFDG2.js +0 -52
  559. package/dist/admin/FieldTypeIcon--WKPFDG2.js.map +0 -1
  560. package/dist/admin/FieldTypeIcon-AibcTcXN.mjs +0 -50
  561. package/dist/admin/FieldTypeIcon-AibcTcXN.mjs.map +0 -1
  562. package/dist/admin/Filters-Jm3DRgjx.mjs +0 -489
  563. package/dist/admin/Filters-Jm3DRgjx.mjs.map +0 -1
  564. package/dist/admin/Filters-l2eZFcAk.js +0 -511
  565. package/dist/admin/Filters-l2eZFcAk.js.map +0 -1
  566. package/dist/admin/Form-V8XluZgD.js +0 -767
  567. package/dist/admin/Form-V8XluZgD.js.map +0 -1
  568. package/dist/admin/Form-f20Ab8pl.mjs +0 -739
  569. package/dist/admin/Form-f20Ab8pl.mjs.map +0 -1
  570. package/dist/admin/History-0MMslhUv.mjs +0 -430
  571. package/dist/admin/History-0MMslhUv.mjs.map +0 -1
  572. package/dist/admin/History-eZH2Aqa1.js +0 -456
  573. package/dist/admin/History-eZH2Aqa1.js.map +0 -1
  574. package/dist/admin/HomePage-HylT9MsA.js +0 -530
  575. package/dist/admin/HomePage-HylT9MsA.js.map +0 -1
  576. package/dist/admin/HomePage-Mt5yKmaK.mjs +0 -521
  577. package/dist/admin/HomePage-Mt5yKmaK.mjs.map +0 -1
  578. package/dist/admin/HomePage-PNJzW3TF.mjs +0 -11
  579. package/dist/admin/HomePage-PNJzW3TF.mjs.map +0 -1
  580. package/dist/admin/HomePage-Zoe67a6N.js +0 -15
  581. package/dist/admin/HomePage-Zoe67a6N.js.map +0 -1
  582. package/dist/admin/InputRenderer-89lhMw5B.js +0 -5347
  583. package/dist/admin/InputRenderer-89lhMw5B.js.map +0 -1
  584. package/dist/admin/InputRenderer-ddUokGFQ.mjs +0 -5306
  585. package/dist/admin/InputRenderer-ddUokGFQ.mjs.map +0 -1
  586. package/dist/admin/InstalledPluginsPage-4hUy0Kzu.js +0 -126
  587. package/dist/admin/InstalledPluginsPage-4hUy0Kzu.js.map +0 -1
  588. package/dist/admin/InstalledPluginsPage-F_LdmUvc.mjs +0 -101
  589. package/dist/admin/InstalledPluginsPage-F_LdmUvc.mjs.map +0 -1
  590. package/dist/admin/Layout-0VrIQ4NX.js +0 -97
  591. package/dist/admin/Layout-0VrIQ4NX.js.map +0 -1
  592. package/dist/admin/Layout-8VTNG14A.js +0 -237
  593. package/dist/admin/Layout-8VTNG14A.js.map +0 -1
  594. package/dist/admin/Layout-y3dNAJVd.mjs +0 -209
  595. package/dist/admin/Layout-y3dNAJVd.mjs.map +0 -1
  596. package/dist/admin/Layout-yOQ2mhrf.mjs +0 -89
  597. package/dist/admin/Layout-yOQ2mhrf.mjs.map +0 -1
  598. package/dist/admin/ListConfigurationPage-9EnV4loI.js +0 -679
  599. package/dist/admin/ListConfigurationPage-9EnV4loI.js.map +0 -1
  600. package/dist/admin/ListConfigurationPage-duFCwpIH.mjs +0 -651
  601. package/dist/admin/ListConfigurationPage-duFCwpIH.mjs.map +0 -1
  602. package/dist/admin/ListPage-0jv2yLPQ.mjs +0 -276
  603. package/dist/admin/ListPage-0jv2yLPQ.mjs.map +0 -1
  604. package/dist/admin/ListPage-2i4GNvMp.js +0 -520
  605. package/dist/admin/ListPage-2i4GNvMp.js.map +0 -1
  606. package/dist/admin/ListPage-Cq-wLIdK.mjs +0 -492
  607. package/dist/admin/ListPage-Cq-wLIdK.mjs.map +0 -1
  608. package/dist/admin/ListPage-EmtzWMVt.js +0 -15
  609. package/dist/admin/ListPage-EmtzWMVt.js.map +0 -1
  610. package/dist/admin/ListPage-ICxXUAUL.js +0 -313
  611. package/dist/admin/ListPage-ICxXUAUL.js.map +0 -1
  612. package/dist/admin/ListPage-Z663tCxD.mjs +0 -540
  613. package/dist/admin/ListPage-Z663tCxD.mjs.map +0 -1
  614. package/dist/admin/ListPage-gP4TzJZw.js +0 -568
  615. package/dist/admin/ListPage-gP4TzJZw.js.map +0 -1
  616. package/dist/admin/ListPage-hxaNrHLd.mjs +0 -11
  617. package/dist/admin/ListPage-hxaNrHLd.mjs.map +0 -1
  618. package/dist/admin/ListPage-i77Lk7qj.js +0 -363
  619. package/dist/admin/ListPage-i77Lk7qj.js.map +0 -1
  620. package/dist/admin/ListPage-v1vvnXr3.mjs +0 -338
  621. package/dist/admin/ListPage-v1vvnXr3.mjs.map +0 -1
  622. package/dist/admin/ListPage-v6SUIF_T.js +0 -304
  623. package/dist/admin/ListPage-v6SUIF_T.js.map +0 -1
  624. package/dist/admin/ListPage-wpMBvGVG.mjs +0 -288
  625. package/dist/admin/ListPage-wpMBvGVG.mjs.map +0 -1
  626. package/dist/admin/ListView-4givZ4Eb.mjs +0 -212
  627. package/dist/admin/ListView-4givZ4Eb.mjs.map +0 -1
  628. package/dist/admin/ListView-A1dYCFAI.mjs +0 -202
  629. package/dist/admin/ListView-A1dYCFAI.mjs.map +0 -1
  630. package/dist/admin/ListView-IqhnTHjC.js +0 -238
  631. package/dist/admin/ListView-IqhnTHjC.js.map +0 -1
  632. package/dist/admin/ListView-NPtyW54W.js +0 -228
  633. package/dist/admin/ListView-NPtyW54W.js.map +0 -1
  634. package/dist/admin/ListViewPage-67EL6F80.js +0 -957
  635. package/dist/admin/ListViewPage-67EL6F80.js.map +0 -1
  636. package/dist/admin/ListViewPage-rkQXnquk.mjs +0 -925
  637. package/dist/admin/ListViewPage-rkQXnquk.mjs.map +0 -1
  638. package/dist/admin/Login-69DnR_WO.js +0 -39
  639. package/dist/admin/Login-69DnR_WO.js.map +0 -1
  640. package/dist/admin/Login-IanfGhcK.mjs +0 -31
  641. package/dist/admin/Login-IanfGhcK.mjs.map +0 -1
  642. package/dist/admin/MagicLinkEE-pA-tsFIv.mjs +0 -27
  643. package/dist/admin/MagicLinkEE-pA-tsFIv.mjs.map +0 -1
  644. package/dist/admin/MagicLinkEE-uUVMUi92.js +0 -31
  645. package/dist/admin/MagicLinkEE-uUVMUi92.js.map +0 -1
  646. package/dist/admin/MarketplacePage-FFt5PPmM.mjs +0 -1014
  647. package/dist/admin/MarketplacePage-FFt5PPmM.mjs.map +0 -1
  648. package/dist/admin/MarketplacePage-io_-I4d2.js +0 -1045
  649. package/dist/admin/MarketplacePage-io_-I4d2.js.map +0 -1
  650. package/dist/admin/NoContentTypePage-6mgFtik-.mjs +0 -50
  651. package/dist/admin/NoContentTypePage-6mgFtik-.mjs.map +0 -1
  652. package/dist/admin/NoContentTypePage-7GuJBa-V.js +0 -54
  653. package/dist/admin/NoContentTypePage-7GuJBa-V.js.map +0 -1
  654. package/dist/admin/NoPermissionsPage-6oZ4iqff.mjs +0 -23
  655. package/dist/admin/NoPermissionsPage-6oZ4iqff.mjs.map +0 -1
  656. package/dist/admin/NoPermissionsPage-E2ro9iCX.js +0 -27
  657. package/dist/admin/NoPermissionsPage-E2ro9iCX.js.map +0 -1
  658. package/dist/admin/NotAllowed-9d8xvtvI.mjs +0 -36
  659. package/dist/admin/NotAllowed-9d8xvtvI.mjs.map +0 -1
  660. package/dist/admin/NotAllowed-FmDlK9I3.js +0 -42
  661. package/dist/admin/NotAllowed-FmDlK9I3.js.map +0 -1
  662. package/dist/admin/Ornaments-fHu7120M.js +0 -214
  663. package/dist/admin/Ornaments-fHu7120M.js.map +0 -1
  664. package/dist/admin/Permissions-VR9Rnqkr.js +0 -2082
  665. package/dist/admin/Permissions-VR9Rnqkr.js.map +0 -1
  666. package/dist/admin/Permissions-kvKR0BEy.mjs +0 -2046
  667. package/dist/admin/Permissions-kvKR0BEy.mjs.map +0 -1
  668. package/dist/admin/PrivateRoute-dcpEjhVL.js +0 -22
  669. package/dist/admin/PrivateRoute-dcpEjhVL.js.map +0 -1
  670. package/dist/admin/PrivateRoute-jEzBQwGq.mjs +0 -20
  671. package/dist/admin/PrivateRoute-jEzBQwGq.mjs.map +0 -1
  672. package/dist/admin/ProfilePage-5zMiyfq8.js +0 -419
  673. package/dist/admin/ProfilePage-5zMiyfq8.js.map +0 -1
  674. package/dist/admin/ProfilePage-vP1WwOSo.mjs +0 -391
  675. package/dist/admin/ProfilePage-vP1WwOSo.mjs.map +0 -1
  676. package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs +0 -48
  677. package/dist/admin/PurchaseAuditLogs-Rrl9r1j8.mjs.map +0 -1
  678. package/dist/admin/PurchaseAuditLogs-couRts7-.js +0 -52
  679. package/dist/admin/PurchaseAuditLogs-couRts7-.js.map +0 -1
  680. package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs +0 -51
  681. package/dist/admin/PurchaseReviewWorkflows--btlOW_J.mjs.map +0 -1
  682. package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js +0 -55
  683. package/dist/admin/PurchaseReviewWorkflows-iyB5BJRO.js.map +0 -1
  684. package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs +0 -51
  685. package/dist/admin/PurchaseSingleSignOn-L8l1HqSb.mjs.map +0 -1
  686. package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js +0 -55
  687. package/dist/admin/PurchaseSingleSignOn-oXrB5aDz.js.map +0 -1
  688. package/dist/admin/ReviewWorkflowsColumn--7xdU3EE.js +0 -39
  689. package/dist/admin/ReviewWorkflowsColumn--7xdU3EE.js.map +0 -1
  690. package/dist/admin/ReviewWorkflowsColumn-m0_IsejA.mjs +0 -34
  691. package/dist/admin/ReviewWorkflowsColumn-m0_IsejA.mjs.map +0 -1
  692. package/dist/admin/SelectRoles-3rrUCBYq.js +0 -114
  693. package/dist/admin/SelectRoles-3rrUCBYq.js.map +0 -1
  694. package/dist/admin/SelectRoles-6zNSDXAX.mjs +0 -106
  695. package/dist/admin/SelectRoles-6zNSDXAX.mjs.map +0 -1
  696. package/dist/admin/SingleSignOnPage-7AQ0D0BD.mjs +0 -238
  697. package/dist/admin/SingleSignOnPage-7AQ0D0BD.mjs.map +0 -1
  698. package/dist/admin/SingleSignOnPage-yqv1ULMO.js +0 -263
  699. package/dist/admin/SingleSignOnPage-yqv1ULMO.js.map +0 -1
  700. package/dist/admin/Table-9qwpBhgp.js +0 -190
  701. package/dist/admin/Table-9qwpBhgp.js.map +0 -1
  702. package/dist/admin/Table-hIWrkIyR.mjs +0 -165
  703. package/dist/admin/Table-hIWrkIyR.mjs.map +0 -1
  704. package/dist/admin/TokenTypeSelect-I0IiW8L9.mjs +0 -357
  705. package/dist/admin/TokenTypeSelect-I0IiW8L9.mjs.map +0 -1
  706. package/dist/admin/TokenTypeSelect-O5IkOZVo.js +0 -385
  707. package/dist/admin/TokenTypeSelect-O5IkOZVo.js.map +0 -1
  708. package/dist/admin/UseCasePage-BwOhufaK.mjs +0 -146
  709. package/dist/admin/UseCasePage-BwOhufaK.mjs.map +0 -1
  710. package/dist/admin/UseCasePage-vqdvr-uv.js +0 -175
  711. package/dist/admin/UseCasePage-vqdvr-uv.js.map +0 -1
  712. package/dist/admin/apiTokens-HBaRXE71.mjs +0 -56
  713. package/dist/admin/apiTokens-HBaRXE71.mjs.map +0 -1
  714. package/dist/admin/apiTokens-RqehzGhC.js +0 -62
  715. package/dist/admin/apiTokens-RqehzGhC.js.map +0 -1
  716. package/dist/admin/ar-i6ait0_Z.js +0 -939
  717. package/dist/admin/ar-i6ait0_Z.js.map +0 -1
  718. package/dist/admin/ar-lYsknZVT.mjs +0 -918
  719. package/dist/admin/ar-lYsknZVT.mjs.map +0 -1
  720. package/dist/admin/ca-1Cl4eOmr.js +0 -727
  721. package/dist/admin/ca-1Cl4eOmr.js.map +0 -1
  722. package/dist/admin/ca-ruPjUw52.mjs +0 -709
  723. package/dist/admin/ca-ruPjUw52.mjs.map +0 -1
  724. package/dist/admin/constants--j5MCV5y.mjs +0 -172
  725. package/dist/admin/constants--j5MCV5y.mjs.map +0 -1
  726. package/dist/admin/constants-AAeFmxXA.js +0 -60
  727. package/dist/admin/constants-AAeFmxXA.js.map +0 -1
  728. package/dist/admin/constants-DxpaZFhM.mjs +0 -10
  729. package/dist/admin/constants-DxpaZFhM.mjs.map +0 -1
  730. package/dist/admin/constants-ZPElfE3j.mjs +0 -52
  731. package/dist/admin/constants-ZPElfE3j.mjs.map +0 -1
  732. package/dist/admin/constants-gHOCp7wo.js +0 -197
  733. package/dist/admin/constants-gHOCp7wo.js.map +0 -1
  734. package/dist/admin/constants-wsN7Fj5H.js +0 -14
  735. package/dist/admin/constants-wsN7Fj5H.js.map +0 -1
  736. package/dist/admin/cs-MneRs5g8.js +0 -294
  737. package/dist/admin/cs-MneRs5g8.js.map +0 -1
  738. package/dist/admin/cs-cEW7Jgll.mjs +0 -281
  739. package/dist/admin/cs-cEW7Jgll.mjs.map +0 -1
  740. package/dist/admin/de-vPJQw5Tm.js +0 -719
  741. package/dist/admin/de-vPJQw5Tm.js.map +0 -1
  742. package/dist/admin/de-xZr3TXsT.mjs +0 -701
  743. package/dist/admin/de-xZr3TXsT.mjs.map +0 -1
  744. package/dist/admin/dk-_Fh6kypZ.js +0 -637
  745. package/dist/admin/dk-_Fh6kypZ.js.map +0 -1
  746. package/dist/admin/dk-nqK-ugFb.mjs +0 -619
  747. package/dist/admin/dk-nqK-ugFb.mjs.map +0 -1
  748. package/dist/admin/en-X84kQxpg.js +0 -1068
  749. package/dist/admin/en-X84kQxpg.js.map +0 -1
  750. package/dist/admin/en-qxG24n4z.mjs +0 -1047
  751. package/dist/admin/en-qxG24n4z.mjs.map +0 -1
  752. package/dist/admin/es-6dicYJQA.mjs +0 -779
  753. package/dist/admin/es-6dicYJQA.mjs.map +0 -1
  754. package/dist/admin/es-FC_8jlK7.js +0 -799
  755. package/dist/admin/es-FC_8jlK7.js.map +0 -1
  756. package/dist/admin/eu-Pzqod2VF.js +0 -835
  757. package/dist/admin/eu-Pzqod2VF.js.map +0 -1
  758. package/dist/admin/eu-l9nvfvQj.mjs +0 -815
  759. package/dist/admin/eu-l9nvfvQj.mjs.map +0 -1
  760. package/dist/admin/fr-8h2tzs3Z.js +0 -765
  761. package/dist/admin/fr-8h2tzs3Z.js.map +0 -1
  762. package/dist/admin/fr-97oVHDGZ.mjs +0 -744
  763. package/dist/admin/fr-97oVHDGZ.mjs.map +0 -1
  764. package/dist/admin/gu-YXP9LW1p.mjs +0 -617
  765. package/dist/admin/gu-YXP9LW1p.mjs.map +0 -1
  766. package/dist/admin/gu-fkXeW5oU.js +0 -626
  767. package/dist/admin/gu-fkXeW5oU.js.map +0 -1
  768. package/dist/admin/he-Rnd0orlz.mjs +0 -315
  769. package/dist/admin/he-Rnd0orlz.mjs.map +0 -1
  770. package/dist/admin/he-YNZzVWgP.js +0 -329
  771. package/dist/admin/he-YNZzVWgP.js.map +0 -1
  772. package/dist/admin/hi-42LJgJV1.mjs +0 -707
  773. package/dist/admin/hi-42LJgJV1.mjs.map +0 -1
  774. package/dist/admin/hi-ubgoUzQ0.js +0 -725
  775. package/dist/admin/hi-ubgoUzQ0.js.map +0 -1
  776. package/dist/admin/hu-oHJgjivB.js +0 -835
  777. package/dist/admin/hu-oHJgjivB.js.map +0 -1
  778. package/dist/admin/hu-xsansjmF.mjs +0 -815
  779. package/dist/admin/hu-xsansjmF.mjs.map +0 -1
  780. package/dist/admin/id-JurRr0gC.mjs +0 -438
  781. package/dist/admin/id-JurRr0gC.mjs.map +0 -1
  782. package/dist/admin/id-T2ge96wh.js +0 -451
  783. package/dist/admin/id-T2ge96wh.js.map +0 -1
  784. package/dist/admin/index-NzLAHRwx.mjs +0 -5908
  785. package/dist/admin/index-NzLAHRwx.mjs.map +0 -1
  786. package/dist/admin/index-dBY0pLkw.js +0 -6004
  787. package/dist/admin/index-dBY0pLkw.js.map +0 -1
  788. package/dist/admin/it-890_w-P3.mjs +0 -449
  789. package/dist/admin/it-890_w-P3.mjs.map +0 -1
  790. package/dist/admin/it-uWPMs24z.js +0 -462
  791. package/dist/admin/it-uWPMs24z.js.map +0 -1
  792. package/dist/admin/ja-F61alnK1.mjs +0 -618
  793. package/dist/admin/ja-F61alnK1.mjs.map +0 -1
  794. package/dist/admin/ja-pw-zE8MH.js +0 -636
  795. package/dist/admin/ja-pw-zE8MH.js.map +0 -1
  796. package/dist/admin/ko-DfQWK5T3.mjs +0 -616
  797. package/dist/admin/ko-DfQWK5T3.mjs.map +0 -1
  798. package/dist/admin/ko-XhK2FY3_.js +0 -634
  799. package/dist/admin/ko-XhK2FY3_.js.map +0 -1
  800. package/dist/admin/ml-EVaVYywL.mjs +0 -707
  801. package/dist/admin/ml-EVaVYywL.mjs.map +0 -1
  802. package/dist/admin/ml-hT2VI8JA.js +0 -725
  803. package/dist/admin/ml-hT2VI8JA.js.map +0 -1
  804. package/dist/admin/ms-CzgcVrsY.mjs +0 -332
  805. package/dist/admin/ms-CzgcVrsY.mjs.map +0 -1
  806. package/dist/admin/ms-DoMJCZ42.js +0 -345
  807. package/dist/admin/ms-DoMJCZ42.js.map +0 -1
  808. package/dist/admin/nl-LLi_sx9P.js +0 -831
  809. package/dist/admin/nl-LLi_sx9P.js.map +0 -1
  810. package/dist/admin/nl-XNqQYx_K.mjs +0 -811
  811. package/dist/admin/nl-XNqQYx_K.mjs.map +0 -1
  812. package/dist/admin/no-JwA1Lt4Y.mjs +0 -300
  813. package/dist/admin/no-JwA1Lt4Y.mjs.map +0 -1
  814. package/dist/admin/no-wmtVIVuz.js +0 -313
  815. package/dist/admin/no-wmtVIVuz.js.map +0 -1
  816. package/dist/admin/pl-05ncDTwZ.js +0 -724
  817. package/dist/admin/pl-05ncDTwZ.js.map +0 -1
  818. package/dist/admin/pl-euPz4n1g.mjs +0 -706
  819. package/dist/admin/pl-euPz4n1g.mjs.map +0 -1
  820. package/dist/admin/pt-BR-vpbGYSYw.mjs +0 -777
  821. package/dist/admin/pt-BR-vpbGYSYw.mjs.map +0 -1
  822. package/dist/admin/pt-BR-xA4J5pi2.js +0 -797
  823. package/dist/admin/pt-BR-xA4J5pi2.js.map +0 -1
  824. package/dist/admin/pt-RlnkaSdF.mjs +0 -287
  825. package/dist/admin/pt-RlnkaSdF.mjs.map +0 -1
  826. package/dist/admin/pt-yArB6nEx.js +0 -299
  827. package/dist/admin/pt-yArB6nEx.js.map +0 -1
  828. package/dist/admin/reducers-TOuLOGw_.mjs +0 -4615
  829. package/dist/admin/reducers-TOuLOGw_.mjs.map +0 -1
  830. package/dist/admin/reducers-uDxSALD_.js +0 -4762
  831. package/dist/admin/reducers-uDxSALD_.js.map +0 -1
  832. package/dist/admin/ru-4bDDGI3o.js +0 -996
  833. package/dist/admin/ru-4bDDGI3o.js.map +0 -1
  834. package/dist/admin/ru-tyoEF5X6.mjs +0 -975
  835. package/dist/admin/ru-tyoEF5X6.mjs.map +0 -1
  836. package/dist/admin/sa-OOEUNg5o.js +0 -725
  837. package/dist/admin/sa-OOEUNg5o.js.map +0 -1
  838. package/dist/admin/sa-s-WVHU-Y.mjs +0 -707
  839. package/dist/admin/sa-s-WVHU-Y.mjs.map +0 -1
  840. package/dist/admin/selectors-NvWWczps.mjs +0 -6
  841. package/dist/admin/selectors-NvWWczps.mjs.map +0 -1
  842. package/dist/admin/selectors-ka781RNf.js +0 -8
  843. package/dist/admin/selectors-ka781RNf.js.map +0 -1
  844. package/dist/admin/sk-1sQSF-r2.js +0 -693
  845. package/dist/admin/sk-1sQSF-r2.js.map +0 -1
  846. package/dist/admin/sk-5bIrjuCN.mjs +0 -673
  847. package/dist/admin/sk-5bIrjuCN.mjs.map +0 -1
  848. package/dist/admin/src/components/InjectionZone.d.ts +0 -59
  849. package/dist/admin/src/content-manager/components/ComponentIcon.d.ts +0 -8
  850. package/dist/admin/src/content-manager/components/ConfigurationForm/EditFieldForm.d.ts +0 -9
  851. package/dist/admin/src/content-manager/components/ConfigurationForm/Fields.d.ts +0 -21
  852. package/dist/admin/src/content-manager/components/ConfigurationForm/Form.d.ts +0 -32
  853. package/dist/admin/src/content-manager/components/DragPreviews/CardDragPreview.d.ts +0 -7
  854. package/dist/admin/src/content-manager/components/DragPreviews/ComponentDragPreview.d.ts +0 -6
  855. package/dist/admin/src/content-manager/components/DragPreviews/RelationDragPreview.d.ts +0 -11
  856. package/dist/admin/src/content-manager/components/FieldTypeIcon.d.ts +0 -9
  857. package/dist/admin/src/content-manager/components/LeftMenu.d.ts +0 -2
  858. package/dist/admin/src/content-manager/constants/attributes.d.ts +0 -14
  859. package/dist/admin/src/content-manager/constants/collections.d.ts +0 -3
  860. package/dist/admin/src/content-manager/constants/dragAndDrop.d.ts +0 -8
  861. package/dist/admin/src/content-manager/exports.d.ts +0 -10
  862. package/dist/admin/src/content-manager/features/DocumentRBAC.d.ts +0 -36
  863. package/dist/admin/src/content-manager/history/components/HistoryAction.d.ts +0 -3
  864. package/dist/admin/src/content-manager/history/components/VersionContent.d.ts +0 -2
  865. package/dist/admin/src/content-manager/history/components/VersionHeader.d.ts +0 -5
  866. package/dist/admin/src/content-manager/history/components/VersionsList.d.ts +0 -2
  867. package/dist/admin/src/content-manager/history/pages/History.d.ts +0 -25
  868. package/dist/admin/src/content-manager/history/routes.d.ts +0 -11
  869. package/dist/admin/src/content-manager/history/services/historyVersion.d.ts +0 -7
  870. package/dist/admin/src/content-manager/hooks/useContentManagerInitData.d.ts +0 -15
  871. package/dist/admin/src/content-manager/hooks/useContentTypeSchema.d.ts +0 -24
  872. package/dist/admin/src/content-manager/hooks/useDocument.d.ts +0 -89
  873. package/dist/admin/src/content-manager/hooks/useDocumentActions.d.ts +0 -102
  874. package/dist/admin/src/content-manager/hooks/useDocumentLayout.d.ts +0 -138
  875. package/dist/admin/src/content-manager/hooks/useDragAndDrop.d.ts +0 -51
  876. package/dist/admin/src/content-manager/hooks/useKeyboardDragAndDrop.d.ts +0 -14
  877. package/dist/admin/src/content-manager/hooks/useLazyComponents.d.ts +0 -13
  878. package/dist/admin/src/content-manager/hooks/useSyncRbac.d.ts +0 -15
  879. package/dist/admin/src/content-manager/layout.d.ts +0 -16
  880. package/dist/admin/src/content-manager/modules/rbac.d.ts +0 -14
  881. package/dist/admin/src/content-manager/modules/reducers.d.ts +0 -4
  882. package/dist/admin/src/content-manager/pages/ComponentConfigurationPage.d.ts +0 -3
  883. package/dist/admin/src/content-manager/pages/EditConfigurationPage.d.ts +0 -3
  884. package/dist/admin/src/content-manager/pages/EditView/EditViewPage.d.ts +0 -3
  885. package/dist/admin/src/content-manager/pages/EditView/components/DocumentActions.d.ts +0 -69
  886. package/dist/admin/src/content-manager/pages/EditView/components/DocumentStatus.d.ts +0 -16
  887. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +0 -3
  888. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Heading.d.ts +0 -3
  889. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.d.ts +0 -3
  890. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.d.ts +0 -3
  891. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.d.ts +0 -3
  892. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Paragraph.d.ts +0 -3
  893. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Blocks/Quote.d.ts +0 -3
  894. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.d.ts +0 -6
  895. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +0 -61
  896. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.d.ts +0 -10
  897. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.d.ts +0 -10
  898. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +0 -10
  899. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/Modifiers.d.ts +0 -16
  900. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withImages.d.ts +0 -11
  901. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withLinks.d.ts +0 -9
  902. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.d.ts +0 -8
  903. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +0 -13
  904. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/enterKey.d.ts +0 -6
  905. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/links.d.ts +0 -10
  906. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/BlocksInput/utils/types.d.ts +0 -10
  907. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Initializer.d.ts +0 -9
  908. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Input.d.ts +0 -9
  909. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +0 -6
  910. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +0 -6
  911. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/ComponentContext.d.ts +0 -42
  912. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.d.ts +0 -11
  913. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentCard.d.ts +0 -9
  914. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +0 -17
  915. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +0 -9
  916. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +0 -14
  917. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/DynamicZoneLabel.d.ts +0 -12
  918. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +0 -13
  919. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/NotAllowed.d.ts +0 -7
  920. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Relations.d.ts +0 -26
  921. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/UID.d.ts +0 -9
  922. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/Editor.d.ts +0 -18
  923. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +0 -59
  924. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/Field.d.ts +0 -11
  925. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.d.ts +0 -5
  926. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +0 -7
  927. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.d.ts +0 -17
  928. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +0 -54
  929. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.d.ts +0 -5
  930. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.d.ts +0 -4
  931. package/dist/admin/src/content-manager/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.d.ts +0 -16
  932. package/dist/admin/src/content-manager/pages/EditView/components/FormLayout.d.ts +0 -5
  933. package/dist/admin/src/content-manager/pages/EditView/components/Header.d.ts +0 -35
  934. package/dist/admin/src/content-manager/pages/EditView/components/InputRenderer.d.ts +0 -14
  935. package/dist/admin/src/content-manager/pages/EditView/components/Panels.d.ts +0 -10
  936. package/dist/admin/src/content-manager/pages/EditView/utils/data.d.ts +0 -20
  937. package/dist/admin/src/content-manager/pages/EditView/utils/forms.d.ts +0 -9
  938. package/dist/admin/src/content-manager/pages/ListConfiguration/ListConfigurationPage.d.ts +0 -10
  939. package/dist/admin/src/content-manager/pages/ListConfiguration/components/DraggableCard.d.ts +0 -12
  940. package/dist/admin/src/content-manager/pages/ListConfiguration/components/EditFieldForm.d.ts +0 -8
  941. package/dist/admin/src/content-manager/pages/ListConfiguration/components/Header.d.ts +0 -8
  942. package/dist/admin/src/content-manager/pages/ListConfiguration/components/Settings.d.ts +0 -5
  943. package/dist/admin/src/content-manager/pages/ListConfiguration/components/SortDisplayedFields.d.ts +0 -6
  944. package/dist/admin/src/content-manager/pages/ListView/ListViewPage.d.ts +0 -3
  945. package/dist/admin/src/content-manager/pages/ListView/components/AutoCloneFailureModal.d.ts +0 -8
  946. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/Buttons.d.ts +0 -12
  947. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.d.ts +0 -15
  948. package/dist/admin/src/content-manager/pages/ListView/components/BulkActions/SelectedEntriesModal.d.ts +0 -29
  949. package/dist/admin/src/content-manager/pages/ListView/components/Filters.d.ts +0 -8
  950. package/dist/admin/src/content-manager/pages/ListView/components/InjectionZoneList.d.ts +0 -7
  951. package/dist/admin/src/content-manager/pages/ListView/components/TableActions.d.ts +0 -8
  952. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellContent.d.ts +0 -9
  953. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/CellValue.d.ts +0 -8
  954. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Components.d.ts +0 -12
  955. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Media.d.ts +0 -23
  956. package/dist/admin/src/content-manager/pages/ListView/components/TableCells/Relations.d.ts +0 -12
  957. package/dist/admin/src/content-manager/pages/ListView/components/ViewSettingsMenu.d.ts +0 -10
  958. package/dist/admin/src/content-manager/pages/NoContentTypePage.d.ts +0 -2
  959. package/dist/admin/src/content-manager/pages/NoPermissionsPage.d.ts +0 -2
  960. package/dist/admin/src/content-manager/router.d.ts +0 -5
  961. package/dist/admin/src/content-manager/services/api.d.ts +0 -3
  962. package/dist/admin/src/content-manager/services/components.d.ts +0 -6
  963. package/dist/admin/src/content-manager/services/contentTypes.d.ts +0 -18
  964. package/dist/admin/src/content-manager/services/documents.d.ts +0 -89
  965. package/dist/admin/src/content-manager/services/init.d.ts +0 -10
  966. package/dist/admin/src/content-manager/services/relations.d.ts +0 -49
  967. package/dist/admin/src/content-manager/services/uid.d.ts +0 -32
  968. package/dist/admin/src/content-manager/utils/api.d.ts +0 -19
  969. package/dist/admin/src/content-manager/utils/attributes.d.ts +0 -19
  970. package/dist/admin/src/content-manager/utils/relations.d.ts +0 -12
  971. package/dist/admin/src/content-manager/utils/translations.d.ts +0 -2
  972. package/dist/admin/src/content-manager/utils/validation.d.ts +0 -7
  973. package/dist/admin/src/core/apis/content-manager.d.ts +0 -98
  974. package/dist/admin/src/hooks/useInjectionZone.d.ts +0 -2
  975. package/dist/admin/src/pages/Settings/pages/PurchaseReviewWorkflows.d.ts +0 -2
  976. package/dist/admin/src/utils/getYupInnerErrors.d.ts +0 -7
  977. package/dist/admin/sv-JVgQU2PS.mjs +0 -810
  978. package/dist/admin/sv-JVgQU2PS.mjs.map +0 -1
  979. package/dist/admin/sv-d0rqYiHZ.js +0 -830
  980. package/dist/admin/sv-d0rqYiHZ.js.map +0 -1
  981. package/dist/admin/th-er8qvbeL.mjs +0 -420
  982. package/dist/admin/th-er8qvbeL.mjs.map +0 -1
  983. package/dist/admin/th-mqExIzdv.js +0 -433
  984. package/dist/admin/th-mqExIzdv.js.map +0 -1
  985. package/dist/admin/tr-aYPucbUC.js +0 -788
  986. package/dist/admin/tr-aYPucbUC.js.map +0 -1
  987. package/dist/admin/tr-b2vrBJ49.mjs +0 -768
  988. package/dist/admin/tr-b2vrBJ49.mjs.map +0 -1
  989. package/dist/admin/transferTokens-HxKzbhZt.js +0 -65
  990. package/dist/admin/transferTokens-HxKzbhZt.js.map +0 -1
  991. package/dist/admin/transferTokens-QOZjk416.mjs +0 -59
  992. package/dist/admin/transferTokens-QOZjk416.mjs.map +0 -1
  993. package/dist/admin/uk-1c7KIaI6.js +0 -346
  994. package/dist/admin/uk-1c7KIaI6.js.map +0 -1
  995. package/dist/admin/uk-RfkbT49M.mjs +0 -333
  996. package/dist/admin/uk-RfkbT49M.mjs.map +0 -1
  997. package/dist/admin/useAdminRoles-PSfwOXiz.mjs +0 -28
  998. package/dist/admin/useAdminRoles-PSfwOXiz.mjs.map +0 -1
  999. package/dist/admin/useAdminRoles-eaHgHT8Y.js +0 -50
  1000. package/dist/admin/useAdminRoles-eaHgHT8Y.js.map +0 -1
  1001. package/dist/admin/useContentTypes-Or3rDVks.mjs +0 -51
  1002. package/dist/admin/useContentTypes-Or3rDVks.mjs.map +0 -1
  1003. package/dist/admin/useContentTypes-RJRHsheR.js +0 -73
  1004. package/dist/admin/useContentTypes-RJRHsheR.js.map +0 -1
  1005. package/dist/admin/useDebounce-OnUygPz6.mjs +0 -17
  1006. package/dist/admin/useDebounce-OnUygPz6.mjs.map +0 -1
  1007. package/dist/admin/useDebounce-tz5EMJbt.js +0 -39
  1008. package/dist/admin/useDebounce-tz5EMJbt.js.map +0 -1
  1009. package/dist/admin/useDocumentLayout-5UQF9Yls.mjs +0 -732
  1010. package/dist/admin/useDocumentLayout-5UQF9Yls.mjs.map +0 -1
  1011. package/dist/admin/useDocumentLayout-wBQQmFJL.js +0 -764
  1012. package/dist/admin/useDocumentLayout-wBQQmFJL.js.map +0 -1
  1013. package/dist/admin/useLicenseLimitNotification-kTCLbD6I.mjs +0 -80
  1014. package/dist/admin/useLicenseLimitNotification-kTCLbD6I.mjs.map +0 -1
  1015. package/dist/admin/useLicenseLimitNotification-mOmwgQuN.js +0 -105
  1016. package/dist/admin/useLicenseLimitNotification-mOmwgQuN.js.map +0 -1
  1017. package/dist/admin/useReviewWorkflows-Ji_rsoyJ.mjs +0 -27
  1018. package/dist/admin/useReviewWorkflows-Ji_rsoyJ.mjs.map +0 -1
  1019. package/dist/admin/useReviewWorkflows-ZcRZstgn.js +0 -29
  1020. package/dist/admin/useReviewWorkflows-ZcRZstgn.js.map +0 -1
  1021. package/dist/admin/useSyncRbac-Od0wrAnD.mjs +0 -45
  1022. package/dist/admin/useSyncRbac-Od0wrAnD.mjs.map +0 -1
  1023. package/dist/admin/useSyncRbac-fR63KADE.js +0 -67
  1024. package/dist/admin/useSyncRbac-fR63KADE.js.map +0 -1
  1025. package/dist/admin/useWebhooks-7Grr2wYu.mjs +0 -91
  1026. package/dist/admin/useWebhooks-7Grr2wYu.mjs.map +0 -1
  1027. package/dist/admin/useWebhooks-KtPvzcTB.js +0 -93
  1028. package/dist/admin/useWebhooks-KtPvzcTB.js.map +0 -1
  1029. package/dist/admin/validateWorkflow-cwVWZu1s.mjs +0 -1033
  1030. package/dist/admin/validateWorkflow-cwVWZu1s.mjs.map +0 -1
  1031. package/dist/admin/validateWorkflow-lzkdakmi.js +0 -1077
  1032. package/dist/admin/validateWorkflow-lzkdakmi.js.map +0 -1
  1033. package/dist/admin/validation-aKPvEh9F.js +0 -65
  1034. package/dist/admin/validation-aKPvEh9F.js.map +0 -1
  1035. package/dist/admin/validation-uxcqs4Uq.mjs +0 -43
  1036. package/dist/admin/validation-uxcqs4Uq.mjs.map +0 -1
  1037. package/dist/admin/vi-Rg9es0FD.js +0 -301
  1038. package/dist/admin/vi-Rg9es0FD.js.map +0 -1
  1039. package/dist/admin/vi-pyngavdo.mjs +0 -288
  1040. package/dist/admin/vi-pyngavdo.mjs.map +0 -1
  1041. package/dist/admin/zh-Hans-Gbpdme1Q.mjs +0 -939
  1042. package/dist/admin/zh-Hans-Gbpdme1Q.mjs.map +0 -1
  1043. package/dist/admin/zh-Hans-SgnidiuG.js +0 -960
  1044. package/dist/admin/zh-Hans-SgnidiuG.js.map +0 -1
  1045. package/dist/admin/zh-ONWhjzCj.js +0 -839
  1046. package/dist/admin/zh-ONWhjzCj.js.map +0 -1
  1047. package/dist/admin/zh-fMjW2qMl.mjs +0 -819
  1048. package/dist/admin/zh-fMjW2qMl.mjs.map +0 -1
  1049. package/dist/ee/admin/src/content-manager/pages/EditView/components/AssigneeSelect.d.ts +0 -2
  1050. package/dist/ee/admin/src/content-manager/pages/EditView/components/ReviewWorkflowsPanel.d.ts +0 -3
  1051. package/dist/ee/admin/src/content-manager/pages/EditView/components/StageSelect.d.ts +0 -1
  1052. package/dist/ee/admin/src/content-manager/pages/EditView/components/constants.d.ts +0 -2
  1053. package/dist/ee/admin/src/content-manager/pages/ListSettingsView/constants.d.ts +0 -7
  1054. package/dist/ee/admin/src/content-manager/pages/ListView/components/AssigneeFilter.d.ts +0 -7
  1055. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsAssigneeEE.d.ts +0 -7
  1056. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsColumn.d.ts +0 -2
  1057. package/dist/ee/admin/src/content-manager/pages/ListView/components/ReviewWorkflowsStageEE.d.ts +0 -7
  1058. package/dist/ee/admin/src/content-manager/pages/ListView/components/StageFilter.d.ts +0 -8
  1059. package/dist/ee/admin/src/content-manager/pages/ListView/constants.d.ts +0 -69
  1060. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/CreatePage.d.ts +0 -1
  1061. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/EditPage.d.ts +0 -1
  1062. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/ListPage.d.ts +0 -2
  1063. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/actions.d.ts +0 -86
  1064. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/AddStage.d.ts +0 -2
  1065. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Layout.d.ts +0 -12
  1066. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal.d.ts +0 -15
  1067. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stage.d.ts +0 -10
  1068. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/StageDragPreview.d.ts +0 -4
  1069. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/Stages.d.ts +0 -7
  1070. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/WorkflowAttributes.d.ts +0 -4
  1071. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/constants.d.ts +0 -20
  1072. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/hooks/useReviewWorkflows.d.ts +0 -15
  1073. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/reducer.d.ts +0 -38
  1074. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/selectors.d.ts +0 -62
  1075. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/colors.d.ts +0 -8
  1076. package/dist/ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/validateWorkflow.d.ts +0 -5
  1077. package/dist/ee/admin/src/services/reviewWorkflows.d.ts +0 -39
  1078. package/dist/shared/contracts/review-workflows.d.ts +0 -83
  1079. package/dist/shared/contracts/review-workflows.d.ts.map +0 -1
  1080. /package/dist/admin/src/{content-manager/hooks → hooks}/usePrev.d.ts +0 -0
@@ -1,4615 +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-0MMslhUv.mjs');
1696
- return {
1697
- Component: ProtectedHistoryPage
1698
- };
1699
- }
1700
- },
1701
- {
1702
- path: ":collectionType/:slug/history",
1703
- lazy: async () => {
1704
- const { ProtectedHistoryPage } = await import('./History-0MMslhUv.mjs');
1705
- return {
1706
- Component: ProtectedHistoryPage
1707
- };
1708
- }
1709
- }
1710
- ];
1711
- function useIsHistoryRoute() {
1712
- const location = useLocation();
1713
- const historyRoutes = routes.map((route) => ({ path: `content-manager/${route.path}` }));
1714
- const matches = matchRoutes(historyRoutes, location);
1715
- return Boolean(matches);
1716
- }
1717
-
1718
- const useQueryParams = (initialParams) => {
1719
- const { search } = useLocation();
1720
- const navigate = useNavigate();
1721
- const query = useMemo(() => {
1722
- const searchQuery = search.startsWith("?") ? search.slice(1) : search;
1723
- if (!search && initialParams) {
1724
- return initialParams;
1725
- }
1726
- return { ...initialParams, ...parse(searchQuery) };
1727
- }, [search, initialParams]);
1728
- const setQuery = useCallback(
1729
- (nextParams, method = "push", replace = false) => {
1730
- let nextQuery = { ...query };
1731
- if (method === "remove") {
1732
- Object.keys(nextParams).forEach((key) => {
1733
- if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {
1734
- delete nextQuery[key];
1735
- }
1736
- });
1737
- } else {
1738
- nextQuery = { ...query, ...nextParams };
1739
- }
1740
- navigate({ search: stringify(nextQuery, { encode: false }) }, { replace });
1741
- },
1742
- [navigate, query]
1743
- );
1744
- return [{ query, rawQuery: search }, setQuery];
1745
- };
1746
-
1747
- const extractValuesFromYupError = (errorType, errorParams) => {
1748
- if (!errorType || !errorParams) {
1749
- return {};
1750
- }
1751
- return {
1752
- [errorType]: errorParams[errorType]
1753
- };
1754
- };
1755
- const getYupInnerErrors = (error) => (error?.inner || []).reduce((acc, currentError) => {
1756
- if (currentError.path) {
1757
- acc[currentError.path.split("[").join(".").split("]").join("")] = {
1758
- id: currentError.message,
1759
- defaultMessage: currentError.message,
1760
- values: extractValuesFromYupError(currentError?.type, currentError?.params)
1761
- };
1762
- }
1763
- return acc;
1764
- }, {});
1765
-
1766
- const contentManagerApi = createApi({
1767
- reducerPath: "contentManagerApi",
1768
- baseQuery: axiosBaseQuery(),
1769
- tagTypes: [
1770
- "ComponentConfiguration",
1771
- "ContentTypesConfiguration",
1772
- "ContentTypeSettings",
1773
- "Document",
1774
- "InitialData",
1775
- "HistoryVersion",
1776
- "Relations"
1777
- ],
1778
- endpoints: () => ({})
1779
- });
1780
-
1781
- const documentApi = contentManagerApi.injectEndpoints({
1782
- endpoints: (builder) => ({
1783
- autoCloneDocument: builder.mutation({
1784
- query: ({ model, sourceId, query }) => ({
1785
- url: `/content-manager/collection-types/${model}/auto-clone/${sourceId}`,
1786
- method: "POST",
1787
- config: {
1788
- params: query
1789
- }
1790
- }),
1791
- invalidatesTags: (_result, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
1792
- }),
1793
- cloneDocument: builder.mutation({
1794
- query: ({ model, sourceId, data, params }) => ({
1795
- url: `/content-manager/collection-types/${model}/clone/${sourceId}`,
1796
- method: "POST",
1797
- data,
1798
- config: {
1799
- params
1800
- }
1801
- }),
1802
- invalidatesTags: (_result, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
1803
- }),
1804
- /**
1805
- * Creates a new collection-type document. This should ONLY be used for collection-types.
1806
- * single-types should always be using `updateDocument` since they always exist.
1807
- */
1808
- createDocument: builder.mutation({
1809
- query: ({ model, data, params }) => ({
1810
- url: `/content-manager/collection-types/${model}`,
1811
- method: "POST",
1812
- data,
1813
- config: {
1814
- params
1815
- }
1816
- }),
1817
- invalidatesTags: (result, _error, { model }) => [
1818
- { type: "Document", id: `${model}_LIST` },
1819
- "Relations"
1820
- ]
1821
- }),
1822
- deleteDocument: builder.mutation({
1823
- query: ({ collectionType, model, documentId, params }) => ({
1824
- url: `/content-manager/${collectionType}/${model}${collectionType !== SINGLE_TYPES && documentId ? `/${documentId}` : ""}`,
1825
- method: "DELETE",
1826
- config: {
1827
- params
1828
- }
1829
- }),
1830
- invalidatesTags: (_result, _error, { collectionType, model }) => [
1831
- { type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model }
1832
- ]
1833
- }),
1834
- deleteManyDocuments: builder.mutation({
1835
- query: ({ model, ...body }) => ({
1836
- url: `/content-manager/collection-types/${model}/actions/bulkDelete`,
1837
- method: "POST",
1838
- data: body
1839
- }),
1840
- invalidatesTags: (_res, _error, { model, documentIds }) => documentIds.map((id) => ({ type: "Document", id: `${model}_${id}` }))
1841
- }),
1842
- discardDocument: builder.mutation({
1843
- query: ({ collectionType, model, documentId, params }) => ({
1844
- url: documentId ? `/content-manager/${collectionType}/${model}/${documentId}/actions/discard` : `/content-manager/${collectionType}/${model}/actions/discard`,
1845
- method: "POST",
1846
- config: {
1847
- params
1848
- }
1849
- }),
1850
- invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {
1851
- return [
1852
- {
1853
- type: "Document",
1854
- id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
1855
- },
1856
- { type: "Document", id: `${model}_LIST` },
1857
- "Relations"
1858
- ];
1859
- }
1860
- }),
1861
- /**
1862
- * Gets all documents of a collection type or single type.
1863
- * By passing different params you can get different results e.g. only published documents or 'es' documents.
1864
- */
1865
- getAllDocuments: builder.query({
1866
- query: ({ model, params }) => ({
1867
- url: `/content-manager/collection-types/${model}`,
1868
- method: "GET",
1869
- config: {
1870
- params
1871
- }
1872
- }),
1873
- providesTags: (result, _error, arg) => {
1874
- return [
1875
- { type: "Document", id: `${arg.model}_LIST` },
1876
- ...result?.results.map(({ documentId }) => ({
1877
- type: "Document",
1878
- id: `${arg.model}_${documentId}`
1879
- })) ?? []
1880
- ];
1881
- }
1882
- }),
1883
- getDraftRelationCount: builder.query({
1884
- query: ({ collectionType, model, documentId, params }) => ({
1885
- url: documentId ? `/content-manager/${collectionType}/${model}/${documentId}/actions/countDraftRelations` : `/content-manager/${collectionType}/${model}/actions/countDraftRelations`,
1886
- method: "GET",
1887
- config: {
1888
- params
1889
- }
1890
- })
1891
- }),
1892
- getDocument: builder.query({
1893
- // @ts-expect-error – TODO: fix ts error where data unknown doesn't work with response via an assertion?
1894
- queryFn: async ({ collectionType, model, documentId, params }, _api, _extraOpts, baseQuery) => {
1895
- const res = await baseQuery({
1896
- url: `/content-manager/${collectionType}/${model}${documentId ? `/${documentId}` : ""}`,
1897
- method: "GET",
1898
- config: {
1899
- params
1900
- }
1901
- });
1902
- if (res.error && res.error.name === "NotFoundError" && collectionType === SINGLE_TYPES) {
1903
- return { data: { document: void 0 }, error: void 0 };
1904
- }
1905
- return res;
1906
- },
1907
- providesTags: (result, _error, { collectionType, model, documentId }) => {
1908
- return [
1909
- // we prefer the result's id because we don't fetch single-types with an ID.
1910
- {
1911
- type: "Document",
1912
- id: collectionType !== SINGLE_TYPES ? `${model}_${result && "documentId" in result ? result.documentId : documentId}` : model
1913
- }
1914
- ];
1915
- }
1916
- }),
1917
- getManyDraftRelationCount: builder.query({
1918
- query: ({ model, ...params }) => ({
1919
- url: `/content-manager/collection-types/${model}/actions/countManyEntriesDraftRelations`,
1920
- method: "GET",
1921
- config: {
1922
- params
1923
- }
1924
- }),
1925
- transformResponse: (response) => response.data
1926
- }),
1927
- /**
1928
- * This endpoint will either create or update documents at the same time as publishing.
1929
- */
1930
- publishDocument: builder.mutation({
1931
- query: ({ collectionType, model, documentId, params, data }) => ({
1932
- url: documentId ? `/content-manager/${collectionType}/${model}/${documentId}/actions/publish` : `/content-manager/${collectionType}/${model}/actions/publish`,
1933
- method: "POST",
1934
- data,
1935
- config: {
1936
- params
1937
- }
1938
- }),
1939
- invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {
1940
- return [
1941
- {
1942
- type: "Document",
1943
- id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
1944
- },
1945
- { type: "Document", id: `${model}_LIST` },
1946
- "Relations"
1947
- ];
1948
- }
1949
- }),
1950
- publishManyDocuments: builder.mutation({
1951
- query: ({ model, ...body }) => ({
1952
- url: `/content-manager/collection-types/${model}/actions/bulkPublish`,
1953
- method: "POST",
1954
- data: body
1955
- }),
1956
- invalidatesTags: (_res, _error, { model, documentIds }) => documentIds.map((id) => ({ type: "Document", id: `${model}_${id}` }))
1957
- }),
1958
- updateDocument: builder.mutation({
1959
- query: ({ collectionType, model, documentId, data, params }) => ({
1960
- url: `/content-manager/${collectionType}/${model}${documentId ? `/${documentId}` : ""}`,
1961
- method: "PUT",
1962
- data,
1963
- config: {
1964
- params
1965
- }
1966
- }),
1967
- invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {
1968
- return [
1969
- {
1970
- type: "Document",
1971
- id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
1972
- },
1973
- "Relations"
1974
- ];
1975
- }
1976
- }),
1977
- unpublishDocument: builder.mutation({
1978
- query: ({ collectionType, model, documentId, params, data }) => ({
1979
- url: documentId ? `/content-manager/${collectionType}/${model}/${documentId}/actions/unpublish` : `/content-manager/${collectionType}/${model}/actions/unpublish`,
1980
- method: "POST",
1981
- data,
1982
- config: {
1983
- params
1984
- }
1985
- }),
1986
- invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {
1987
- return [
1988
- {
1989
- type: "Document",
1990
- id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
1991
- }
1992
- ];
1993
- }
1994
- }),
1995
- unpublishManyDocuments: builder.mutation({
1996
- query: ({ model, ...body }) => ({
1997
- url: `/content-manager/collection-types/${model}/actions/bulkUnpublish`,
1998
- method: "POST",
1999
- data: body
2000
- }),
2001
- invalidatesTags: (_res, _error, { model, documentIds }) => documentIds.map((id) => ({ type: "Document", id: `${model}_${id}` }))
2002
- })
2003
- })
2004
- });
2005
- const {
2006
- useAutoCloneDocumentMutation,
2007
- useCloneDocumentMutation,
2008
- useCreateDocumentMutation,
2009
- useDeleteDocumentMutation,
2010
- useDeleteManyDocumentsMutation,
2011
- useDiscardDocumentMutation,
2012
- useGetAllDocumentsQuery,
2013
- useLazyGetDocumentQuery,
2014
- useGetDocumentQuery,
2015
- useLazyGetDraftRelationCountQuery,
2016
- useGetManyDraftRelationCountQuery,
2017
- usePublishDocumentMutation,
2018
- usePublishManyDocumentsMutation,
2019
- useUpdateDocumentMutation,
2020
- useUnpublishDocumentMutation,
2021
- useUnpublishManyDocumentsMutation
2022
- } = documentApi;
2023
-
2024
- const buildValidParams = (query) => {
2025
- if (!query)
2026
- return query;
2027
- const { plugins: _, ...validQueryParams } = {
2028
- ...query,
2029
- ...Object.values(query?.plugins ?? {}).reduce(
2030
- (acc, current) => Object.assign(acc, current),
2031
- {}
2032
- )
2033
- };
2034
- if ("_q" in validQueryParams) {
2035
- validQueryParams._q = encodeURIComponent(validQueryParams._q);
2036
- }
2037
- return validQueryParams;
2038
- };
2039
-
2040
- const errorsTrads = {
2041
- email: {
2042
- id: "components.Input.error.validation.email",
2043
- defaultMessage: "This is not a valid email."
2044
- },
2045
- json: {
2046
- id: "components.Input.error.validation.json",
2047
- defaultMessage: "This doesn't match the JSON format"
2048
- },
2049
- lowercase: {
2050
- id: "components.Input.error.validation.lowercase",
2051
- defaultMessage: "The value must be a lowercase string"
2052
- },
2053
- max: {
2054
- id: "components.Input.error.validation.max",
2055
- defaultMessage: "The value is too high (max: {max})."
2056
- },
2057
- maxLength: {
2058
- id: "components.Input.error.validation.maxLength",
2059
- defaultMessage: "The value is too long (max: {max})."
2060
- },
2061
- min: {
2062
- id: "components.Input.error.validation.min",
2063
- defaultMessage: "The value is too low (min: {min})."
2064
- },
2065
- minLength: {
2066
- id: "components.Input.error.validation.minLength",
2067
- defaultMessage: "The value is too short (min: {min})."
2068
- },
2069
- regex: {
2070
- id: "components.Input.error.validation.regex",
2071
- defaultMessage: "The value does not match the regex."
2072
- },
2073
- required: {
2074
- id: "components.Input.error.validation.required",
2075
- defaultMessage: "This value is required."
2076
- },
2077
- string: {
2078
- id: "components.Input.error.validation.string",
2079
- defaultMessage: "This is not a valid string."
2080
- },
2081
- unique: {
2082
- id: "components.Input.error.validation.unique",
2083
- defaultMessage: "This value is already used."
2084
- },
2085
- integer: {
2086
- id: "component.Input.error.validation.integer",
2087
- defaultMessage: "The value must be an integer"
2088
- }
2089
- };
2090
-
2091
- const ID = "id";
2092
- const CREATED_BY_ATTRIBUTE_NAME = "createdBy";
2093
- const UPDATED_BY_ATTRIBUTE_NAME = "updatedBy";
2094
- const CREATOR_FIELDS = [CREATED_BY_ATTRIBUTE_NAME, UPDATED_BY_ATTRIBUTE_NAME];
2095
- const PUBLISHED_BY_ATTRIBUTE_NAME = "publishedBy";
2096
- const CREATED_AT_ATTRIBUTE_NAME = "createdAt";
2097
- const UPDATED_AT_ATTRIBUTE_NAME = "updatedAt";
2098
- const PUBLISHED_AT_ATTRIBUTE_NAME = "publishedAt";
2099
- const DOCUMENT_META_FIELDS = [
2100
- ID,
2101
- ...CREATOR_FIELDS,
2102
- PUBLISHED_BY_ATTRIBUTE_NAME,
2103
- CREATED_AT_ATTRIBUTE_NAME,
2104
- UPDATED_AT_ATTRIBUTE_NAME,
2105
- PUBLISHED_AT_ATTRIBUTE_NAME
2106
- ];
2107
- const ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD = [
2108
- "dynamiczone",
2109
- "json",
2110
- "text",
2111
- "relation",
2112
- "component",
2113
- "boolean",
2114
- "media",
2115
- "password",
2116
- "richtext",
2117
- "timestamp",
2118
- "blocks"
2119
- ];
2120
-
2121
- const createYupSchema = (attributes = {}, components = {}) => {
2122
- const createModelSchema = (attributes2) => yup.object().shape(
2123
- Object.entries(attributes2).reduce((acc, [name, attribute]) => {
2124
- if (DOCUMENT_META_FIELDS.includes(name)) {
2125
- return acc;
2126
- }
2127
- const validations = [
2128
- addRequiredValidation,
2129
- addMinLengthValidation,
2130
- addMaxLengthValidation,
2131
- addMinValidation,
2132
- addMaxValidation,
2133
- addRegexValidation
2134
- ].map((fn) => fn(attribute));
2135
- const transformSchema = pipe(...validations);
2136
- switch (attribute.type) {
2137
- case "component": {
2138
- const { attributes: attributes3 } = components[attribute.component];
2139
- if (attribute.repeatable) {
2140
- return {
2141
- ...acc,
2142
- [name]: transformSchema(
2143
- yup.array().of(createModelSchema(attributes3).nullable(false))
2144
- )
2145
- };
2146
- } else {
2147
- return {
2148
- ...acc,
2149
- [name]: transformSchema(createModelSchema(attributes3))
2150
- };
2151
- }
2152
- }
2153
- case "dynamiczone":
2154
- return {
2155
- ...acc,
2156
- [name]: transformSchema(
2157
- yup.array().of(
2158
- yup.lazy((data) => {
2159
- const { attributes: attributes3 } = components[data.__component];
2160
- return yup.object().shape({
2161
- __component: yup.string().required().oneOf(Object.keys(components))
2162
- }).nullable(false).concat(createModelSchema(attributes3));
2163
- })
2164
- )
2165
- )
2166
- };
2167
- case "relation":
2168
- return {
2169
- ...acc,
2170
- [name]: transformSchema(
2171
- yup.array().of(
2172
- yup.object().shape({
2173
- id: yup.string().required()
2174
- })
2175
- )
2176
- )
2177
- };
2178
- default:
2179
- return {
2180
- ...acc,
2181
- [name]: transformSchema(createAttributeSchema(attribute))
2182
- };
2183
- }
2184
- }, {})
2185
- ).default(null);
2186
- return createModelSchema(attributes);
2187
- };
2188
- const createAttributeSchema = (attribute) => {
2189
- switch (attribute.type) {
2190
- case "biginteger":
2191
- return yup.string().matches(/^-?\d*$/);
2192
- case "boolean":
2193
- return yup.boolean();
2194
- case "blocks":
2195
- return yup.mixed().test("isBlocks", errorsTrads.json, (value) => {
2196
- if (!value || Array.isArray(value)) {
2197
- return true;
2198
- } else {
2199
- return false;
2200
- }
2201
- });
2202
- case "decimal":
2203
- case "float":
2204
- case "integer":
2205
- return yup.number();
2206
- case "email":
2207
- return yup.string().email(errorsTrads.email);
2208
- case "enumeration":
2209
- return yup.string().oneOf([...attribute.enum, null]);
2210
- case "json":
2211
- return yup.mixed().test("isJSON", errorsTrads.json, (value) => {
2212
- if (!value || typeof value === "string" && value.length === 0) {
2213
- return true;
2214
- }
2215
- try {
2216
- JSON.parse(value);
2217
- return true;
2218
- } catch (err) {
2219
- return false;
2220
- }
2221
- });
2222
- case "password":
2223
- case "richtext":
2224
- case "string":
2225
- case "text":
2226
- return yup.string();
2227
- case "uid":
2228
- return yup.string().matches(/^[A-Za-z0-9-_.~]*$/);
2229
- default:
2230
- return yup.mixed();
2231
- }
2232
- };
2233
- const addRequiredValidation = (attribute) => (schema) => {
2234
- if (attribute.required) {
2235
- return schema.required({
2236
- id: errorsTrads.required.id,
2237
- defaultMessage: "This field is required."
2238
- });
2239
- }
2240
- return schema.nullable();
2241
- };
2242
- const addMinLengthValidation = (attribute) => (schema) => {
2243
- if ("minLength" in attribute && attribute.minLength && Number.isInteger(attribute.minLength) && "min" in schema) {
2244
- return schema.min(attribute.minLength, {
2245
- ...errorsTrads.minLength,
2246
- values: {
2247
- min: attribute.minLength
2248
- }
2249
- });
2250
- }
2251
- return schema;
2252
- };
2253
- const addMaxLengthValidation = (attribute) => (schema) => {
2254
- if ("maxLength" in attribute && attribute.maxLength && Number.isInteger(attribute.maxLength) && "max" in schema) {
2255
- return schema.max(attribute.maxLength, {
2256
- ...errorsTrads.maxLength,
2257
- values: {
2258
- max: attribute.maxLength
2259
- }
2260
- });
2261
- }
2262
- return schema;
2263
- };
2264
- const addMinValidation = (attribute) => (schema) => {
2265
- if ("min" in attribute) {
2266
- const min = toInteger(attribute.min);
2267
- if ("min" in schema && min) {
2268
- return schema.min(min, {
2269
- ...errorsTrads.min,
2270
- values: {
2271
- min
2272
- }
2273
- });
2274
- }
2275
- }
2276
- return schema;
2277
- };
2278
- const addMaxValidation = (attribute) => (schema) => {
2279
- if ("max" in attribute) {
2280
- const max = toInteger(attribute.max);
2281
- if ("max" in schema && max) {
2282
- return schema.max(max, {
2283
- ...errorsTrads.max,
2284
- values: {
2285
- max
2286
- }
2287
- });
2288
- }
2289
- }
2290
- return schema;
2291
- };
2292
- const toInteger = (val) => {
2293
- if (typeof val === "number" || val === void 0) {
2294
- return val;
2295
- } else {
2296
- const num = Number(val);
2297
- return isNaN(num) ? void 0 : num;
2298
- }
2299
- };
2300
- const addRegexValidation = (attribute) => (schema) => {
2301
- if ("regex" in attribute && attribute.regex && "matches" in schema) {
2302
- return schema.matches(new RegExp(attribute.regex), {
2303
- message: {
2304
- id: errorsTrads.regex.id,
2305
- defaultMessage: "The value does not match the defined pattern."
2306
- },
2307
- excludeEmptyString: !attribute.required
2308
- });
2309
- }
2310
- return schema;
2311
- };
2312
-
2313
- const initApi = contentManagerApi.injectEndpoints({
2314
- endpoints: (builder) => ({
2315
- getInitialData: builder.query({
2316
- query: () => "/content-manager/init",
2317
- transformResponse: (response) => response.data,
2318
- providesTags: ["InitialData"]
2319
- })
2320
- })
2321
- });
2322
- const { useGetInitialDataQuery } = initApi;
2323
-
2324
- const useContentTypeSchema = (model) => {
2325
- const { toggleNotification } = useNotification();
2326
- const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
2327
- const { components, contentType, contentTypes, error, isLoading, isFetching } = useGetInitialDataQuery(void 0, {
2328
- selectFromResult: (res) => {
2329
- const contentType2 = res.data?.contentTypes.find((ct) => ct.uid === model);
2330
- const componentsByKey = res.data?.components.reduce(
2331
- (acc, component) => {
2332
- acc[component.uid] = component;
2333
- return acc;
2334
- },
2335
- {}
2336
- );
2337
- const components2 = extractContentTypeComponents(contentType2?.attributes, componentsByKey);
2338
- return {
2339
- isLoading: res.isLoading,
2340
- isFetching: res.isFetching,
2341
- error: res.error,
2342
- components: Object.keys(components2).length === 0 ? void 0 : components2,
2343
- contentType: contentType2,
2344
- contentTypes: res.data?.contentTypes ?? []
2345
- };
2346
- }
2347
- });
2348
- React.useEffect(() => {
2349
- if (error) {
2350
- toggleNotification({
2351
- type: "danger",
2352
- message: formatAPIError(error)
2353
- });
2354
- }
2355
- }, [toggleNotification, error, formatAPIError]);
2356
- return {
2357
- // This must be memoized to avoid inifiinite re-renders where the empty object is different everytime.
2358
- components: React.useMemo(() => components ?? {}, [components]),
2359
- schema: contentType,
2360
- schemas: contentTypes,
2361
- isLoading: isLoading || isFetching
2362
- };
2363
- };
2364
- const extractContentTypeComponents = (attributes = {}, allComponents = {}) => {
2365
- const getComponents = (attributes2) => {
2366
- return attributes2.reduce((acc, attribute) => {
2367
- if (attribute.type === "component") {
2368
- const componentAttributes = Object.values(
2369
- allComponents[attribute.component]?.attributes ?? {}
2370
- );
2371
- acc.push(attribute.component, ...getComponents(componentAttributes));
2372
- } else if (attribute.type === "dynamiczone") {
2373
- acc.push(
2374
- ...attribute.components,
2375
- ...attribute.components.flatMap((componentUid) => {
2376
- const componentAttributes = Object.values(
2377
- allComponents[componentUid]?.attributes ?? {}
2378
- );
2379
- return getComponents(componentAttributes);
2380
- })
2381
- );
2382
- }
2383
- return acc;
2384
- }, []);
2385
- };
2386
- const componentUids = getComponents(Object.values(attributes));
2387
- const uniqueComponentUids = [...new Set(componentUids)];
2388
- const componentsByKey = uniqueComponentUids.reduce((acc, uid) => {
2389
- acc[uid] = allComponents[uid];
2390
- return acc;
2391
- }, {});
2392
- return componentsByKey;
2393
- };
2394
-
2395
- const useDocument = (args, opts) => {
2396
- const { toggleNotification } = useNotification();
2397
- const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
2398
- const {
2399
- currentData: data,
2400
- isLoading: isLoadingDocument,
2401
- isFetching: isFetchingDocument,
2402
- error
2403
- } = useGetDocumentQuery(args, opts);
2404
- const { components, schema, isLoading: isLoadingSchema } = useContentTypeSchema(args.model);
2405
- React.useEffect(() => {
2406
- if (error) {
2407
- toggleNotification({
2408
- type: "danger",
2409
- message: formatAPIError(error)
2410
- });
2411
- }
2412
- }, [toggleNotification, error, formatAPIError, args.collectionType]);
2413
- const validationSchema = React.useMemo(() => {
2414
- if (!schema) {
2415
- return null;
2416
- }
2417
- return createYupSchema(schema.attributes, components);
2418
- }, [schema, components]);
2419
- const validate = React.useCallback(
2420
- (document) => {
2421
- if (!validationSchema) {
2422
- throw new Error(
2423
- "There is no validation schema generated, this is likely due to the schema not being loaded yet."
2424
- );
2425
- }
2426
- try {
2427
- validationSchema.validateSync(document, { abortEarly: false, strict: true });
2428
- return null;
2429
- } catch (error2) {
2430
- if (error2 instanceof ValidationError) {
2431
- return getYupInnerErrors(error2);
2432
- }
2433
- throw error2;
2434
- }
2435
- },
2436
- [validationSchema]
2437
- );
2438
- const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;
2439
- return {
2440
- components,
2441
- document: data?.data,
2442
- meta: data?.meta,
2443
- isLoading,
2444
- schema,
2445
- validate
2446
- };
2447
- };
2448
- const useDoc = () => {
2449
- const { id, slug, collectionType, origin } = useParams();
2450
- const [{ query }] = useQueryParams();
2451
- const params = React.useMemo(() => buildValidParams(query), [query]);
2452
- if (!collectionType) {
2453
- throw new Error("Could not find collectionType in url params");
2454
- }
2455
- if (!slug) {
2456
- throw new Error("Could not find model in url params");
2457
- }
2458
- return {
2459
- collectionType,
2460
- model: slug,
2461
- id: origin || id === "create" ? void 0 : id,
2462
- ...useDocument(
2463
- { documentId: origin || id, model: slug, collectionType, params },
2464
- {
2465
- skip: id === "create" || !origin && !id && collectionType !== SINGLE_TYPES
2466
- }
2467
- )
2468
- };
2469
- };
2470
-
2471
- function getIn(obj, key, def, pathStartIndex = 0) {
2472
- const path = toPath(key);
2473
- while (obj && pathStartIndex < path.length) {
2474
- obj = obj[path[pathStartIndex++]];
2475
- }
2476
- if (pathStartIndex !== path.length && !obj) {
2477
- return def;
2478
- }
2479
- return obj === void 0 ? def : obj;
2480
- }
2481
- const isObject = (obj) => obj !== null && typeof obj === "object" && !Array.isArray(obj);
2482
- const isInteger = (obj) => String(Math.floor(Number(obj))) === obj;
2483
- function setIn(obj, path, value) {
2484
- const res = clone(obj);
2485
- let resVal = res;
2486
- let i = 0;
2487
- const pathArray = toPath(path);
2488
- for (; i < pathArray.length - 1; i++) {
2489
- const currentPath = pathArray[i];
2490
- const currentObj = getIn(obj, pathArray.slice(0, i + 1));
2491
- if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {
2492
- resVal = resVal[currentPath] = clone(currentObj);
2493
- } else {
2494
- const nextPath = pathArray[i + 1];
2495
- resVal = resVal[currentPath] = isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};
2496
- }
2497
- }
2498
- if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {
2499
- return obj;
2500
- }
2501
- if (value === void 0) {
2502
- delete resVal[pathArray[i]];
2503
- } else {
2504
- resVal[pathArray[i]] = value;
2505
- }
2506
- if (i === 0 && value === void 0) {
2507
- delete res[pathArray[i]];
2508
- }
2509
- return res;
2510
- }
2511
-
2512
- const ERR_MSG = "The Form Component has not been initialised, ensure you are using this hook within a Form component";
2513
- const [FormProvider, useForm] = createContext("Form", {
2514
- disabled: false,
2515
- errors: {},
2516
- initialValues: {},
2517
- isSubmitting: false,
2518
- modified: false,
2519
- addFieldRow: () => {
2520
- throw new Error(ERR_MSG);
2521
- },
2522
- moveFieldRow: () => {
2523
- throw new Error(ERR_MSG);
2524
- },
2525
- onChange: () => {
2526
- throw new Error(ERR_MSG);
2527
- },
2528
- removeFieldRow: () => {
2529
- throw new Error(ERR_MSG);
2530
- },
2531
- resetForm: () => {
2532
- throw new Error(ERR_MSG);
2533
- },
2534
- setErrors: () => {
2535
- throw new Error(ERR_MSG);
2536
- },
2537
- setValues: () => {
2538
- throw new Error(ERR_MSG);
2539
- },
2540
- setSubmitting: () => {
2541
- throw new Error(ERR_MSG);
2542
- },
2543
- validate: async () => {
2544
- throw new Error(ERR_MSG);
2545
- },
2546
- values: {}
2547
- });
2548
- const Form = React.forwardRef(
2549
- ({ disabled = false, method, onSubmit, ...props }, ref) => {
2550
- const formRef = React.useRef(null);
2551
- const initialValues = React.useRef(props.initialValues ?? {});
2552
- const [state, dispatch] = React.useReducer(reducer$3, {
2553
- errors: {},
2554
- isSubmitting: false,
2555
- values: props.initialValues ?? {}
2556
- });
2557
- React.useEffect(() => {
2558
- if (!isEqual(initialValues.current, props.initialValues)) {
2559
- initialValues.current = props.initialValues ?? {};
2560
- dispatch({
2561
- type: "SET_INITIAL_VALUES",
2562
- payload: props.initialValues ?? {}
2563
- });
2564
- }
2565
- }, [props.initialValues]);
2566
- const setErrors = React.useCallback((errors) => {
2567
- dispatch({
2568
- type: "SET_ERRORS",
2569
- payload: errors
2570
- });
2571
- }, []);
2572
- const setValues = React.useCallback((values) => {
2573
- dispatch({
2574
- type: "SET_VALUES",
2575
- payload: values
2576
- });
2577
- }, []);
2578
- React.useEffect(() => {
2579
- if (Object.keys(state.errors).length === 0)
2580
- return;
2581
- const ref2 = setTimeout(() => {
2582
- const [firstError] = formRef.current.querySelectorAll("[data-strapi-field-error]");
2583
- if (firstError) {
2584
- const errorId = firstError.getAttribute("id");
2585
- const formElementInError = formRef.current.querySelector(
2586
- `[aria-describedby="${errorId}"]`
2587
- );
2588
- if (formElementInError && formElementInError instanceof HTMLElement) {
2589
- formElementInError.focus();
2590
- }
2591
- }
2592
- });
2593
- return () => clearTimeout(ref2);
2594
- }, [state.errors]);
2595
- const validate = React.useCallback(
2596
- async (shouldSetErrors = true) => {
2597
- setErrors({});
2598
- if (!props.validationSchema) {
2599
- return { data: state.values };
2600
- }
2601
- try {
2602
- const data = await props.validationSchema.validate(state.values, { abortEarly: false });
2603
- return { data };
2604
- } catch (err) {
2605
- if (isErrorYupValidationError(err)) {
2606
- let errors = {};
2607
- if (err.inner) {
2608
- if (err.inner.length === 0) {
2609
- return setIn(errors, err.path, err.message);
2610
- }
2611
- for (const error of err.inner) {
2612
- if (!getIn(errors, error.path)) {
2613
- errors = setIn(errors, error.path, error.message);
2614
- }
2615
- }
2616
- }
2617
- if (shouldSetErrors) {
2618
- setErrors(errors);
2619
- }
2620
- return { errors };
2621
- } else {
2622
- if (process.env.NODE_ENV !== "production") {
2623
- console.warn(
2624
- `Warning: An unhandled error was caught during validation in <Formik validationSchema />`,
2625
- err
2626
- );
2627
- }
2628
- throw err;
2629
- }
2630
- }
2631
- },
2632
- [props, setErrors, state.values]
2633
- );
2634
- const handleSubmit = async (e) => {
2635
- e.stopPropagation();
2636
- e.preventDefault();
2637
- if (!onSubmit) {
2638
- return;
2639
- }
2640
- dispatch({
2641
- type: "SUBMIT_ATTEMPT"
2642
- });
2643
- try {
2644
- const { data, errors } = await validate();
2645
- if (errors) {
2646
- setErrors(errors);
2647
- throw new Error("Submission failed");
2648
- }
2649
- await onSubmit(data, {
2650
- setErrors,
2651
- setValues,
2652
- resetForm
2653
- });
2654
- dispatch({
2655
- type: "SUBMIT_SUCCESS"
2656
- });
2657
- } catch (err) {
2658
- dispatch({
2659
- type: "SUBMIT_FAILURE"
2660
- });
2661
- if (err instanceof Error && err.message === "Submission failed") {
2662
- return;
2663
- }
2664
- }
2665
- };
2666
- const modified = React.useMemo(
2667
- () => !isEqual(initialValues.current, state.values),
2668
- [state.values]
2669
- );
2670
- const handleChange = useCallbackRef((eventOrPath, v) => {
2671
- if (typeof eventOrPath === "string") {
2672
- dispatch({
2673
- type: "SET_FIELD_VALUE",
2674
- payload: {
2675
- field: eventOrPath,
2676
- value: v
2677
- }
2678
- });
2679
- return;
2680
- }
2681
- const target = eventOrPath.target || eventOrPath.currentTarget;
2682
- const { type, name, id, value, options, multiple } = target;
2683
- const field = name || id;
2684
- if (!field && process.env.NODE_ENV !== "production") {
2685
- console.warn(
2686
- `\`onChange\` was called with an event, but you forgot to pass a \`name\` or \`id'\` attribute to your input. The field to update cannot be determined`
2687
- );
2688
- }
2689
- let val;
2690
- if (/number|range/.test(type)) {
2691
- const parsed = parseFloat(value);
2692
- val = isNaN(parsed) ? "" : parsed;
2693
- } else if (/checkbox/.test(type)) {
2694
- val = !getIn(state.values, field);
2695
- } else if (options && multiple) {
2696
- val = Array.from(options).filter((el) => el.selected).map((el) => el.value);
2697
- } else {
2698
- val = value;
2699
- }
2700
- if (field) {
2701
- dispatch({
2702
- type: "SET_FIELD_VALUE",
2703
- payload: {
2704
- field,
2705
- value: val
2706
- }
2707
- });
2708
- }
2709
- });
2710
- const addFieldRow = React.useCallback(
2711
- (field, value, addAtIndex) => {
2712
- dispatch({
2713
- type: "ADD_FIELD_ROW",
2714
- payload: {
2715
- field,
2716
- value,
2717
- addAtIndex
2718
- }
2719
- });
2720
- },
2721
- []
2722
- );
2723
- const removeFieldRow = React.useCallback(
2724
- (field, removeAtIndex) => {
2725
- dispatch({
2726
- type: "REMOVE_FIELD_ROW",
2727
- payload: {
2728
- field,
2729
- removeAtIndex
2730
- }
2731
- });
2732
- },
2733
- []
2734
- );
2735
- const moveFieldRow = React.useCallback(
2736
- (field, fromIndex, toIndex) => {
2737
- dispatch({
2738
- type: "MOVE_FIELD_ROW",
2739
- payload: {
2740
- field,
2741
- fromIndex,
2742
- toIndex
2743
- }
2744
- });
2745
- },
2746
- []
2747
- );
2748
- const resetForm = React.useCallback(() => {
2749
- dispatch({
2750
- type: "RESET_FORM",
2751
- payload: {
2752
- errors: {},
2753
- isSubmitting: false,
2754
- values: initialValues.current
2755
- }
2756
- });
2757
- }, []);
2758
- const setSubmitting = React.useCallback((isSubmitting) => {
2759
- dispatch({ type: "SET_ISSUBMITTING", payload: isSubmitting });
2760
- }, []);
2761
- const composedRefs = useComposedRefs(formRef, ref);
2762
- return /* @__PURE__ */ jsx("form", { ref: composedRefs, method, noValidate: true, onSubmit: handleSubmit, children: /* @__PURE__ */ jsx(
2763
- FormProvider,
2764
- {
2765
- disabled,
2766
- onChange: handleChange,
2767
- initialValues,
2768
- modified,
2769
- addFieldRow,
2770
- moveFieldRow,
2771
- removeFieldRow,
2772
- resetForm,
2773
- setErrors,
2774
- setValues,
2775
- setSubmitting,
2776
- validate,
2777
- ...state,
2778
- children: typeof props.children === "function" ? props.children({
2779
- modified,
2780
- disabled,
2781
- onChange: handleChange,
2782
- ...state,
2783
- resetForm
2784
- }) : props.children
2785
- }
2786
- ) });
2787
- }
2788
- );
2789
- const isErrorYupValidationError = (err) => typeof err === "object" && err !== null && "name" in err && typeof err.name === "string" && err.name === "ValidationError";
2790
- const reducer$3 = (state, action) => produce(state, (draft) => {
2791
- switch (action.type) {
2792
- case "SET_INITIAL_VALUES":
2793
- draft.values = action.payload;
2794
- break;
2795
- case "SET_VALUES":
2796
- draft.values = action.payload;
2797
- break;
2798
- case "SUBMIT_ATTEMPT":
2799
- draft.isSubmitting = true;
2800
- break;
2801
- case "SUBMIT_FAILURE":
2802
- draft.isSubmitting = false;
2803
- break;
2804
- case "SUBMIT_SUCCESS":
2805
- draft.isSubmitting = false;
2806
- break;
2807
- case "SET_FIELD_VALUE":
2808
- draft.values = setIn(state.values, action.payload.field, action.payload.value);
2809
- break;
2810
- case "ADD_FIELD_ROW": {
2811
- const currentField = getIn(state.values, action.payload.field, []);
2812
- let position = action.payload.addAtIndex;
2813
- if (position === void 0) {
2814
- position = currentField.length;
2815
- } else if (position < 0) {
2816
- position = 0;
2817
- }
2818
- const [key] = generateNKeysBetween(
2819
- currentField.at(position - 1)?.__temp_key__,
2820
- currentField.at(position)?.__temp_key__,
2821
- 1
2822
- );
2823
- draft.values = setIn(
2824
- state.values,
2825
- action.payload.field,
2826
- setIn(currentField, position.toString(), { ...action.payload.value, __temp_key__: key })
2827
- );
2828
- break;
2829
- }
2830
- case "MOVE_FIELD_ROW": {
2831
- const { field, fromIndex, toIndex } = action.payload;
2832
- const currentField = [...getIn(state.values, field, [])];
2833
- const currentRow = currentField[fromIndex];
2834
- const startKey = fromIndex > toIndex ? currentField[toIndex - 1]?.__temp_key__ : currentField[toIndex]?.__temp_key__;
2835
- const endKey = fromIndex > toIndex ? currentField[toIndex]?.__temp_key__ : currentField[toIndex + 1]?.__temp_key__;
2836
- const [newKey] = generateNKeysBetween(startKey, endKey, 1);
2837
- currentField.splice(fromIndex, 1);
2838
- currentField.splice(toIndex, 0, { ...currentRow, __temp_key__: newKey });
2839
- draft.values = setIn(state.values, field, currentField);
2840
- break;
2841
- }
2842
- case "REMOVE_FIELD_ROW": {
2843
- const currentField = getIn(state.values, action.payload.field, []);
2844
- let position = action.payload.removeAtIndex;
2845
- if (position === void 0) {
2846
- position = currentField.length - 1;
2847
- } else if (position < 0) {
2848
- position = 0;
2849
- }
2850
- const newValue = setIn(currentField, position.toString(), void 0).filter(
2851
- (val) => val
2852
- );
2853
- draft.values = setIn(
2854
- state.values,
2855
- action.payload.field,
2856
- newValue.length > 0 ? newValue : void 0
2857
- );
2858
- break;
2859
- }
2860
- case "SET_ERRORS":
2861
- if (!isEqual(state.errors, action.payload)) {
2862
- draft.errors = action.payload;
2863
- }
2864
- break;
2865
- case "SET_ISSUBMITTING":
2866
- draft.isSubmitting = action.payload;
2867
- break;
2868
- case "RESET_FORM":
2869
- draft.values = action.payload.values;
2870
- draft.errors = action.payload.errors;
2871
- draft.isSubmitting = action.payload.isSubmitting;
2872
- break;
2873
- }
2874
- });
2875
- const useField = (path) => {
2876
- const { formatMessage } = useIntl();
2877
- const initialValue = useForm(
2878
- "useField",
2879
- (state) => getIn(state.initialValues, path)
2880
- );
2881
- const value = useForm(
2882
- "useField",
2883
- (state) => getIn(state.values, path)
2884
- );
2885
- const handleChange = useForm("useField", (state) => state.onChange);
2886
- const error = useForm("useField", (state) => getIn(state.errors, path));
2887
- return {
2888
- initialValue,
2889
- /**
2890
- * Errors can be a string, or a MesaageDescriptor, so we need to handle both cases.
2891
- * If it's anything else, we don't return it.
2892
- */
2893
- error: isErrorMessageDescriptor(error) ? formatMessage(
2894
- {
2895
- id: error.id,
2896
- defaultMessage: error.defaultMessage
2897
- },
2898
- error.values
2899
- ) : typeof error === "string" ? error : void 0,
2900
- onChange: handleChange,
2901
- value
2902
- };
2903
- };
2904
- const isErrorMessageDescriptor = (object) => {
2905
- return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
2906
- };
2907
- const Blocker = () => {
2908
- const { formatMessage } = useIntl();
2909
- const modified = useForm("Blocker", (state) => state.modified);
2910
- const isSubmitting = useForm("Blocker", (state) => state.isSubmitting);
2911
- const blocker = useBlocker(
2912
- ({ currentLocation, nextLocation }) => !isSubmitting && modified && currentLocation.pathname !== nextLocation.pathname
2913
- );
2914
- if (blocker.state === "blocked") {
2915
- return /* @__PURE__ */ jsxs(
2916
- Dialog,
2917
- {
2918
- isOpen: true,
2919
- title: formatMessage({
2920
- id: "app.components.ConfirmDialog.title",
2921
- defaultMessage: "Confirmation"
2922
- }),
2923
- onClose: () => blocker.reset(),
2924
- children: [
2925
- /* @__PURE__ */ jsx(DialogBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 2, children: [
2926
- /* @__PURE__ */ jsx(Icon, { as: ExclamationMarkCircle, width: "24px", height: "24px", color: "danger600" }),
2927
- /* @__PURE__ */ jsx(Typography, { as: "p", variant: "omega", textAlign: "center", children: formatMessage({
2928
- id: "global.prompt.unsaved",
2929
- defaultMessage: "You have unsaved changes, are you sure you want to leave?"
2930
- }) })
2931
- ] }) }),
2932
- /* @__PURE__ */ jsx(
2933
- DialogFooter,
2934
- {
2935
- startAction: /* @__PURE__ */ jsx(Button, { onClick: () => blocker.reset(), variant: "tertiary", children: formatMessage({
2936
- id: "app.components.Button.cancel",
2937
- defaultMessage: "Cancel"
2938
- }) }),
2939
- endAction: /* @__PURE__ */ jsx(Button, { onClick: () => blocker.proceed(), variant: "danger", children: formatMessage({
2940
- id: "app.components.Button.confirm",
2941
- defaultMessage: "Confirm"
2942
- }) })
2943
- }
2944
- )
2945
- ]
2946
- }
2947
- );
2948
- }
2949
- return null;
2950
- };
2951
-
2952
- const getTranslation = (id) => `content-manager.${id}`;
2953
-
2954
- const DocumentStatus = ({ status = "draft", ...restProps }) => {
2955
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
2956
- return /* @__PURE__ */ jsx(Status, { ...restProps, showBullet: false, size: "S", variant: statusVariant, children: /* @__PURE__ */ jsx(Typography, { as: "span", variant: "omega", fontWeight: "bold", children: capitalise(status) }) });
2957
- };
2958
-
2959
- function getStyle(initialOffset, currentOffset, mouseOffset) {
2960
- if (!initialOffset || !currentOffset || !mouseOffset) {
2961
- return { display: "none" };
2962
- }
2963
- const { x, y } = mouseOffset;
2964
- return {
2965
- transform: `translate(${x}px, ${y}px)`
2966
- };
2967
- }
2968
- const DragLayer = ({ renderItem }) => {
2969
- const { itemType, isDragging, item, initialOffset, currentOffset, mouseOffset } = useDragLayer(
2970
- (monitor) => ({
2971
- item: monitor.getItem(),
2972
- itemType: monitor.getItemType(),
2973
- initialOffset: monitor.getInitialSourceClientOffset(),
2974
- currentOffset: monitor.getSourceClientOffset(),
2975
- isDragging: monitor.isDragging(),
2976
- mouseOffset: monitor.getClientOffset()
2977
- })
2978
- );
2979
- if (!isDragging) {
2980
- return null;
2981
- }
2982
- return /* @__PURE__ */ jsx(
2983
- Box,
2984
- {
2985
- height: "100%",
2986
- left: 0,
2987
- position: "fixed",
2988
- pointerEvents: "none",
2989
- top: 0,
2990
- zIndex: 100,
2991
- width: "100%",
2992
- children: /* @__PURE__ */ jsx(Box, { style: getStyle(initialOffset, currentOffset, mouseOffset), children: renderItem({ type: itemType, item }) })
2993
- }
2994
- );
2995
- };
2996
-
2997
- const CardDragPreview = ({ label, isSibling = false }) => {
2998
- return /* @__PURE__ */ jsxs(
2999
- FieldContainer,
3000
- {
3001
- background: isSibling ? "neutral100" : "primary100",
3002
- display: "inline-flex",
3003
- gap: 3,
3004
- hasRadius: true,
3005
- justifyContent: "space-between",
3006
- isSibling,
3007
- "max-height": `${32 / 16}rem`,
3008
- maxWidth: "min-content",
3009
- children: [
3010
- /* @__PURE__ */ jsxs(Flex, { gap: 3, children: [
3011
- /* @__PURE__ */ jsx(DragButton, { alignItems: "center", cursor: "all-scroll", padding: 3, children: /* @__PURE__ */ jsx(Drag, {}) }),
3012
- /* @__PURE__ */ jsx(
3013
- TypographyMaxWidth,
3014
- {
3015
- textColor: isSibling ? void 0 : "primary600",
3016
- fontWeight: "bold",
3017
- ellipsis: true,
3018
- children: label
3019
- }
3020
- )
3021
- ] }),
3022
- /* @__PURE__ */ jsxs(Flex, { children: [
3023
- /* @__PURE__ */ jsx(ActionBox, { alignItems: "center", children: /* @__PURE__ */ jsx(Pencil, {}) }),
3024
- /* @__PURE__ */ jsx(ActionBox, { alignItems: "center", children: /* @__PURE__ */ jsx(Cross, {}) })
3025
- ] })
3026
- ]
3027
- }
3028
- );
3029
- };
3030
- const ActionBox = styled(Flex)`
3031
- height: ${({ theme }) => theme.spaces[7]};
3032
-
3033
- &:last-child {
3034
- padding: 0 ${({ theme }) => theme.spaces[3]};
3035
- }
3036
- `;
3037
- const DragButton = styled(ActionBox)`
3038
- border-right: 1px solid ${({ theme }) => theme.colors.primary200};
3039
-
3040
- svg {
3041
- width: ${12 / 16}rem;
3042
- height: ${12 / 16}rem;
3043
- }
3044
- `;
3045
- const FieldContainer = styled(Flex)`
3046
- border: 1px solid
3047
- ${({ theme, isSibling }) => isSibling ? theme.colors.neutral150 : theme.colors.primary200};
3048
-
3049
- svg {
3050
- width: ${10 / 16}rem;
3051
- height: ${10 / 16}rem;
3052
-
3053
- path {
3054
- fill: ${({ theme, isSibling }) => isSibling ? void 0 : theme.colors.primary600};
3055
- }
3056
- }
3057
- `;
3058
- const TypographyMaxWidth = styled(Typography)`
3059
- max-width: ${72 / 16}rem;
3060
- `;
3061
-
3062
- const ComponentDragPreview = ({ displayedValue }) => {
3063
- return /* @__PURE__ */ jsxs(
3064
- Flex,
3065
- {
3066
- background: "neutral0",
3067
- borderColor: "neutral200",
3068
- justifyContent: "space-between",
3069
- gap: 3,
3070
- padding: 3,
3071
- width: `${300 / 16}rem`,
3072
- children: [
3073
- /* @__PURE__ */ jsx(ToggleButton, { type: "button", children: /* @__PURE__ */ jsxs(Flex, { gap: 6, children: [
3074
- /* @__PURE__ */ jsx(
3075
- DropdownIconWrapper,
3076
- {
3077
- alignItems: "center",
3078
- justifyContent: "center",
3079
- background: "neutral200",
3080
- height: `${32 / 16}rem`,
3081
- width: `${32 / 16}rem`,
3082
- children: /* @__PURE__ */ jsx(CarretDown, {})
3083
- }
3084
- ),
3085
- /* @__PURE__ */ jsx(Flex, { maxWidth: `${150 / 16}rem`, children: /* @__PURE__ */ jsx(Typography, { textColor: "neutral700", ellipsis: true, children: displayedValue }) })
3086
- ] }) }),
3087
- /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
3088
- /* @__PURE__ */ jsx(IconButton, { "aria-label": "", borderWidth: 0, children: /* @__PURE__ */ jsx(Trash, {}) }),
3089
- /* @__PURE__ */ jsx(IconButton, { "aria-label": "", borderWidth: 0, children: /* @__PURE__ */ jsx(Drag, {}) })
3090
- ] })
3091
- ]
3092
- }
3093
- );
3094
- };
3095
- const DropdownIconWrapper = styled(Flex)`
3096
- border-radius: 50%;
3097
-
3098
- svg {
3099
- height: ${6 / 16}rem;
3100
- width: ${11 / 16}rem;
3101
- > path {
3102
- fill: ${({ theme }) => theme.colors.neutral600};
3103
- }
3104
- }
3105
- `;
3106
- const ToggleButton = styled.button`
3107
- border: none;
3108
- background: transparent;
3109
- display: block;
3110
- width: 100%;
3111
- text-align: unset;
3112
- padding: 0;
3113
- `;
3114
-
3115
- const useFocusInputField = (name) => {
3116
- const { search: searchString } = useLocation();
3117
- const search = useMemo(() => new URLSearchParams(searchString), [searchString]);
3118
- const [field, setField] = useState(null);
3119
- useEffect(() => {
3120
- if (search.has("field") && search.get("field") === name && field) {
3121
- if ("input" in field) {
3122
- field.input.current.focus();
3123
- field.input.current.scrollIntoView({
3124
- block: "center"
3125
- });
3126
- } else {
3127
- field.focus();
3128
- field.scrollIntoView({
3129
- block: "center"
3130
- });
3131
- }
3132
- }
3133
- }, [search, name, field]);
3134
- return setField;
3135
- };
3136
-
3137
- const ItemTypes = {
3138
- COMPONENT: "component",
3139
- EDIT_FIELD: "editField",
3140
- FIELD: "field",
3141
- DYNAMIC_ZONE: "dynamicZone",
3142
- RELATION: "relation",
3143
- BLOCKS: "blocks"
3144
- };
3145
-
3146
- const useKeyboardDragAndDrop = (active, index, { onCancel, onDropItem, onGrabItem, onMoveItem }) => {
3147
- const [isSelected, setIsSelected] = React.useState(false);
3148
- const handleMove = (movement) => {
3149
- if (!isSelected) {
3150
- return;
3151
- }
3152
- if (typeof index === "number" && onMoveItem) {
3153
- if (movement === "UP") {
3154
- onMoveItem(index - 1, index);
3155
- } else if (movement === "DOWN") {
3156
- onMoveItem(index + 1, index);
3157
- }
3158
- }
3159
- };
3160
- const handleDragClick = () => {
3161
- if (isSelected) {
3162
- if (onDropItem) {
3163
- onDropItem(index);
3164
- }
3165
- setIsSelected(false);
3166
- } else {
3167
- if (onGrabItem) {
3168
- onGrabItem(index);
3169
- }
3170
- setIsSelected(true);
3171
- }
3172
- };
3173
- const handleCancel = () => {
3174
- if (isSelected) {
3175
- setIsSelected(false);
3176
- if (onCancel) {
3177
- onCancel(index);
3178
- }
3179
- }
3180
- };
3181
- const handleKeyDown = (e) => {
3182
- if (!active) {
3183
- return;
3184
- }
3185
- if (e.key === "Tab" && !isSelected) {
3186
- return;
3187
- }
3188
- e.preventDefault();
3189
- switch (e.key) {
3190
- case " ":
3191
- case "Enter":
3192
- handleDragClick();
3193
- break;
3194
- case "Escape":
3195
- handleCancel();
3196
- break;
3197
- case "ArrowDown":
3198
- case "ArrowRight":
3199
- handleMove("DOWN");
3200
- break;
3201
- case "ArrowUp":
3202
- case "ArrowLeft":
3203
- handleMove("UP");
3204
- break;
3205
- }
3206
- };
3207
- return handleKeyDown;
3208
- };
3209
-
3210
- const DIRECTIONS = {
3211
- UPWARD: "upward",
3212
- DOWNWARD: "downward"
3213
- };
3214
- const DROP_SENSITIVITY = {
3215
- REGULAR: "regular",
3216
- IMMEDIATE: "immediate"
3217
- };
3218
- const useDragAndDrop = (active, {
3219
- type = "STRAPI_DND",
3220
- index,
3221
- item,
3222
- onStart,
3223
- onEnd,
3224
- onGrabItem,
3225
- onDropItem,
3226
- onCancel,
3227
- onMoveItem,
3228
- dropSensitivity = DROP_SENSITIVITY.REGULAR
3229
- }) => {
3230
- const objectRef = React.useRef(null);
3231
- const [{ handlerId, isOver }, dropRef] = useDrop({
3232
- accept: type,
3233
- collect(monitor) {
3234
- return {
3235
- handlerId: monitor.getHandlerId(),
3236
- isOver: monitor.isOver({ shallow: true })
3237
- };
3238
- },
3239
- drop(item2) {
3240
- const draggedIndex = item2.index;
3241
- const newIndex = index;
3242
- if (isOver && onDropItem) {
3243
- onDropItem(draggedIndex, newIndex);
3244
- }
3245
- },
3246
- hover(item2, monitor) {
3247
- if (!objectRef.current || !onMoveItem) {
3248
- return;
3249
- }
3250
- const dragIndex = item2.index;
3251
- const newIndex = index;
3252
- const hoverBoundingRect = objectRef.current?.getBoundingClientRect();
3253
- const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;
3254
- const clientOffset = monitor.getClientOffset();
3255
- if (!clientOffset)
3256
- return;
3257
- const hoverClientY = clientOffset && clientOffset.y - hoverBoundingRect.top;
3258
- if (typeof dragIndex === "number" && typeof newIndex === "number") {
3259
- if (dragIndex === newIndex) {
3260
- return;
3261
- }
3262
- if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {
3263
- if (dragIndex < newIndex && hoverClientY < hoverMiddleY) {
3264
- return;
3265
- }
3266
- if (dragIndex > newIndex && hoverClientY > hoverMiddleY) {
3267
- return;
3268
- }
3269
- }
3270
- onMoveItem(newIndex, dragIndex);
3271
- item2.index = newIndex;
3272
- } else {
3273
- if (Array.isArray(dragIndex) && Array.isArray(newIndex)) {
3274
- const minLength = Math.min(dragIndex.length, newIndex.length);
3275
- let areEqual = true;
3276
- let isLessThan = false;
3277
- let isGreaterThan = false;
3278
- for (let i = 0; i < minLength; i++) {
3279
- if (dragIndex[i] < newIndex[i]) {
3280
- isLessThan = true;
3281
- areEqual = false;
3282
- break;
3283
- } else if (dragIndex[i] > newIndex[i]) {
3284
- isGreaterThan = true;
3285
- areEqual = false;
3286
- break;
3287
- }
3288
- }
3289
- if (areEqual && dragIndex.length === newIndex.length) {
3290
- return;
3291
- }
3292
- if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {
3293
- if (isLessThan && !isGreaterThan && hoverClientY < hoverMiddleY) {
3294
- return;
3295
- }
3296
- if (isGreaterThan && !isLessThan && hoverClientY > hoverMiddleY) {
3297
- return;
3298
- }
3299
- }
3300
- }
3301
- onMoveItem(newIndex, dragIndex);
3302
- item2.index = newIndex;
3303
- }
3304
- }
3305
- });
3306
- const getDragDirection = (monitor) => {
3307
- if (monitor && monitor.isDragging() && !monitor.didDrop() && monitor.getInitialClientOffset() && monitor.getClientOffset()) {
3308
- const deltaY = monitor.getInitialClientOffset().y - monitor.getClientOffset().y;
3309
- if (deltaY > 0)
3310
- return DIRECTIONS.UPWARD;
3311
- if (deltaY < 0)
3312
- return DIRECTIONS.DOWNWARD;
3313
- return null;
3314
- }
3315
- return null;
3316
- };
3317
- const [{ isDragging, direction }, dragRef, dragPreviewRef] = useDrag({
3318
- type,
3319
- item() {
3320
- if (onStart) {
3321
- onStart();
3322
- }
3323
- const { width } = objectRef.current?.getBoundingClientRect() ?? {};
3324
- return { index, width, ...item };
3325
- },
3326
- end() {
3327
- if (onEnd) {
3328
- onEnd();
3329
- }
3330
- },
3331
- canDrag: active,
3332
- /**
3333
- * This is useful when the item is in a virtualized list.
3334
- * However, if we don't have an ID then we want the libraries
3335
- * defaults to take care of this.
3336
- */
3337
- isDragging: item?.id ? (monitor) => {
3338
- return item.id === monitor.getItem().id;
3339
- } : void 0,
3340
- collect: (monitor) => ({
3341
- isDragging: monitor.isDragging(),
3342
- initialOffset: monitor.getInitialClientOffset(),
3343
- currentOffset: monitor.getClientOffset(),
3344
- direction: getDragDirection(monitor)
3345
- })
3346
- });
3347
- const handleKeyDown = useKeyboardDragAndDrop(active, index, {
3348
- onGrabItem,
3349
- onDropItem,
3350
- onCancel,
3351
- onMoveItem
3352
- });
3353
- return [
3354
- { handlerId, isDragging, handleKeyDown, isOverDropTarget: isOver, direction },
3355
- objectRef,
3356
- dropRef,
3357
- dragRef,
3358
- dragPreviewRef
3359
- ];
3360
- };
3361
-
3362
- const relationsApi = contentManagerApi.injectEndpoints({
3363
- endpoints: (build) => ({
3364
- getRelations: build.query({
3365
- query: ({ model, id, targetField, params }) => {
3366
- return {
3367
- url: `/content-manager/relations/${model}/${id}/${targetField}`,
3368
- method: "GET",
3369
- config: {
3370
- params
3371
- }
3372
- };
3373
- },
3374
- serializeQueryArgs: (args) => {
3375
- const { endpointName, queryArgs } = args;
3376
- return {
3377
- endpointName,
3378
- model: queryArgs.model,
3379
- id: queryArgs.id,
3380
- targetField: queryArgs.targetField,
3381
- locale: queryArgs.params?.locale,
3382
- status: queryArgs.params?.status
3383
- };
3384
- },
3385
- merge: (currentCache, newItems) => {
3386
- if (currentCache.pagination && newItems.pagination) {
3387
- if (currentCache.pagination.page < newItems.pagination.page) {
3388
- const existingIds = currentCache.results.map((item) => item.documentId);
3389
- const uniqueNewItems = newItems.results.filter(
3390
- (item) => !existingIds.includes(item.documentId)
3391
- );
3392
- currentCache.results.push(...prepareTempKeys(uniqueNewItems, currentCache.results));
3393
- currentCache.pagination = newItems.pagination;
3394
- } else if (newItems.pagination.page === 1) {
3395
- currentCache.results = prepareTempKeys(newItems.results);
3396
- currentCache.pagination = newItems.pagination;
3397
- }
3398
- }
3399
- },
3400
- forceRefetch({ currentArg, previousArg }) {
3401
- if (!currentArg?.params && !previousArg?.params) {
3402
- return false;
3403
- }
3404
- return currentArg?.params?.page !== previousArg?.params?.page || currentArg?.params?.pageSize !== previousArg?.params?.pageSize;
3405
- },
3406
- transformResponse: (response) => {
3407
- if ("results" in response && response.results) {
3408
- return {
3409
- ...response,
3410
- results: prepareTempKeys(response.results.toReversed())
3411
- };
3412
- } else {
3413
- return response;
3414
- }
3415
- },
3416
- providesTags: ["Relations"]
3417
- }),
3418
- searchRelations: build.query({
3419
- query: ({ model, targetField, params }) => {
3420
- return {
3421
- url: `/content-manager/relations/${model}/${targetField}`,
3422
- method: "GET",
3423
- config: {
3424
- params
3425
- }
3426
- };
3427
- },
3428
- serializeQueryArgs: (args) => {
3429
- const { endpointName, queryArgs } = args;
3430
- return {
3431
- endpointName,
3432
- model: queryArgs.model,
3433
- targetField: queryArgs.targetField,
3434
- _q: queryArgs.params?._q,
3435
- idsToOmit: queryArgs.params?.idsToOmit,
3436
- idsToInclude: queryArgs.params?.idsToInclude
3437
- };
3438
- },
3439
- merge: (currentCache, newItems) => {
3440
- if (currentCache.pagination && newItems.pagination) {
3441
- if (currentCache.pagination.page < newItems.pagination.page) {
3442
- const existingIds = currentCache.results.map((item) => item.documentId);
3443
- const uniqueNewItems = newItems.results.filter(
3444
- (item) => !existingIds.includes(item.documentId)
3445
- );
3446
- currentCache.results.push(...uniqueNewItems);
3447
- currentCache.pagination = newItems.pagination;
3448
- } else if (newItems.pagination.page === 1) {
3449
- currentCache.results = newItems.results;
3450
- currentCache.pagination = newItems.pagination;
3451
- }
3452
- }
3453
- },
3454
- forceRefetch({ currentArg, previousArg }) {
3455
- if (!currentArg?.params && !previousArg?.params) {
3456
- return false;
3457
- }
3458
- return currentArg?.params?.page !== previousArg?.params?.page || currentArg?.params?.pageSize !== previousArg?.params?.pageSize;
3459
- },
3460
- transformResponse: (response) => {
3461
- if (response.results) {
3462
- return {
3463
- ...response,
3464
- results: response.results
3465
- };
3466
- } else {
3467
- return response;
3468
- }
3469
- }
3470
- })
3471
- })
3472
- });
3473
- const prepareTempKeys = (relations, existingRelations = []) => {
3474
- const [firstItem] = existingRelations.slice(0);
3475
- const keys = generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);
3476
- return relations.map((datum, index) => ({
3477
- ...datum,
3478
- __temp_key__: keys[index]
3479
- }));
3480
- };
3481
- const { useGetRelationsQuery, useLazySearchRelationsQuery } = relationsApi;
3482
-
3483
- const getRelationLabel = (relation, mainField) => {
3484
- const label = mainField && relation[mainField.name] ? relation[mainField.name] : null;
3485
- if (typeof label === "string") {
3486
- return label;
3487
- }
3488
- return relation.documentId;
3489
- };
3490
-
3491
- const [ComponentProvider, useComponent] = createContext("ComponentContext", {
3492
- id: void 0,
3493
- level: -1,
3494
- uid: void 0,
3495
- type: void 0
3496
- });
3497
-
3498
- const RELATIONS_TO_DISPLAY = 5;
3499
- const ONE_WAY_RELATIONS = ["oneWay", "oneToOne", "manyToOne", "oneToManyMorph", "oneToOneMorph"];
3500
- const RelationsField = React.forwardRef(
3501
- ({ disabled, label, ...props }, ref) => {
3502
- const [currentPage, setCurrentPage] = React.useState(1);
3503
- const { document, model: documentModel } = useDoc();
3504
- const documentId = document?.documentId;
3505
- const { formatMessage } = useIntl();
3506
- const [{ query }] = useQueryParams();
3507
- const params = buildValidParams(query);
3508
- const isMorph = props.attribute.relation.toLowerCase().includes("morph");
3509
- const isDisabled = isMorph || disabled;
3510
- const { id: componentId, uid } = useComponent("RelationsField", ({ uid: uid2, id: id2 }) => ({ id: id2, uid: uid2 }));
3511
- const id = componentId ? componentId.toString() : documentId;
3512
- const model = uid ?? documentModel;
3513
- const [targetField] = props.name.split(".").slice(-1);
3514
- const { data, isLoading, isFetching } = useGetRelationsQuery(
3515
- {
3516
- model,
3517
- targetField,
3518
- // below we don't run the query if there is no id.
3519
- id,
3520
- params: {
3521
- ...params,
3522
- pageSize: RELATIONS_TO_DISPLAY,
3523
- page: currentPage
3524
- }
3525
- },
3526
- {
3527
- refetchOnMountOrArgChange: true,
3528
- skip: !id,
3529
- selectFromResult: (result) => {
3530
- return {
3531
- ...result,
3532
- data: {
3533
- ...result.data,
3534
- results: result.data?.results ? result.data.results : []
3535
- }
3536
- };
3537
- }
3538
- }
3539
- );
3540
- const handleLoadMore = () => {
3541
- setCurrentPage((prev) => prev + 1);
3542
- };
3543
- const field = useField(props.name);
3544
- const isFetchingMoreRelations = isLoading || isFetching;
3545
- const realServerRelationsCount = "pagination" in data && data.pagination ? data.pagination.total : 0;
3546
- const relationsConnected = (field.value?.connect ?? []).filter(
3547
- (rel) => data.results.findIndex((relation) => relation.id === rel.id) === -1
3548
- ).length ?? 0;
3549
- const relationsDisconnected = field.value?.disconnect?.length ?? 0;
3550
- const relationsCount = realServerRelationsCount + relationsConnected - relationsDisconnected;
3551
- const relations = React.useMemo(() => {
3552
- const ctx = {
3553
- field: field.value,
3554
- // @ts-expect-error – targetModel does exist on the attribute. But it's not typed.
3555
- href: `../${COLLECTION_TYPES}/${props.attribute.targetModel}`,
3556
- mainField: props.mainField
3557
- };
3558
- const transformations = pipe(
3559
- removeConnected(ctx),
3560
- removeDisconnected(ctx),
3561
- addLabelAndHref(ctx)
3562
- );
3563
- const transformedRels = transformations([...data.results]);
3564
- return [...transformedRels, ...field.value?.connect ?? []].sort((a, b) => {
3565
- if (a.__temp_key__ < b.__temp_key__)
3566
- return -1;
3567
- if (a.__temp_key__ > b.__temp_key__)
3568
- return 1;
3569
- return 0;
3570
- });
3571
- }, [
3572
- data.results,
3573
- field.value,
3574
- // @ts-expect-error – targetModel does exist on the attribute. But it's not typed.
3575
- props.attribute.targetModel,
3576
- props.mainField
3577
- ]);
3578
- const handleConnect = (relation) => {
3579
- const [lastItemInList] = relations.slice(-1);
3580
- const item = {
3581
- id: relation.id,
3582
- status: relation.status,
3583
- /**
3584
- * If there's a last item, that's the first key we use to generate out next one.
3585
- */
3586
- __temp_key__: generateNKeysBetween(lastItemInList?.__temp_key__ ?? null, null, 1)[0],
3587
- // Fallback to `id` if there is no `mainField` value, which will overwrite the above `id` property with the exact same data.
3588
- [props.mainField?.name ?? "documentId"]: relation[props.mainField?.name ?? "documentId"],
3589
- label: getRelationLabel(relation, props.mainField),
3590
- // @ts-expect-error – targetModel does exist on the attribute, but it's not typed.
3591
- href: `../${COLLECTION_TYPES}/${props.attribute.targetModel}/${relation.documentId}`
3592
- };
3593
- if (ONE_WAY_RELATIONS.includes(props.attribute.relation)) {
3594
- field.onChange(`${props.name}.connect`, [item]);
3595
- } else {
3596
- field.onChange(`${props.name}.connect`, [...field.value?.connect ?? [], item]);
3597
- }
3598
- };
3599
- return /* @__PURE__ */ jsxs(
3600
- Flex,
3601
- {
3602
- ref,
3603
- direction: "column",
3604
- gap: 3,
3605
- justifyContent: "space-between",
3606
- alignItems: "stretch",
3607
- wrap: "wrap",
3608
- children: [
3609
- /* @__PURE__ */ jsxs(StyledFlex, { direction: "column", alignItems: "start", gap: 2, width: "100%", children: [
3610
- /* @__PURE__ */ jsx(
3611
- RelationsInput,
3612
- {
3613
- disabled: isDisabled,
3614
- id,
3615
- label: `${label} ${relationsCount > 0 ? `(${relationsCount})` : ""}`,
3616
- model,
3617
- onChange: handleConnect,
3618
- ...props
3619
- }
3620
- ),
3621
- "pagination" in data && data.pagination && data.pagination.pageCount > data.pagination.page ? /* @__PURE__ */ jsx(
3622
- TextButton,
3623
- {
3624
- disabled: isFetchingMoreRelations,
3625
- onClick: handleLoadMore,
3626
- loading: isFetchingMoreRelations,
3627
- startIcon: /* @__PURE__ */ jsx(Refresh, {}),
3628
- shrink: 0,
3629
- children: formatMessage({
3630
- id: getTranslation("relation.loadMore"),
3631
- defaultMessage: "Load More"
3632
- })
3633
- }
3634
- ) : null
3635
- ] }),
3636
- /* @__PURE__ */ jsx(
3637
- RelationsList,
3638
- {
3639
- data: relations,
3640
- serverData: data.results,
3641
- disabled: isDisabled,
3642
- name: props.name,
3643
- isLoading: isFetchingMoreRelations,
3644
- relationType: props.attribute.relation
3645
- }
3646
- )
3647
- ]
3648
- }
3649
- );
3650
- }
3651
- );
3652
- const StyledFlex = styled(Flex)`
3653
- & > div {
3654
- width: 100%;
3655
- }
3656
- `;
3657
- const removeConnected = ({ field }) => (relations) => {
3658
- return relations.filter((relation) => {
3659
- const connectedRelations = field?.connect ?? [];
3660
- return connectedRelations.findIndex((rel) => rel.id === relation.id) === -1;
3661
- });
3662
- };
3663
- const removeDisconnected = ({ field }) => (relations) => relations.filter((relation) => {
3664
- const disconnectedRelations = field?.disconnect ?? [];
3665
- return disconnectedRelations.findIndex((rel) => rel.id === relation.id) === -1;
3666
- });
3667
- const addLabelAndHref = ({ mainField, href }) => (relations) => relations.map((relation) => {
3668
- return {
3669
- ...relation,
3670
- // Fallback to `id` if there is no `mainField` value, which will overwrite the above `documentId` property with the exact same data.
3671
- [mainField?.name ?? "documentId"]: relation[mainField?.name ?? "documentId"],
3672
- label: getRelationLabel(relation, mainField),
3673
- href: `${href}/${relation.documentId}`
3674
- };
3675
- });
3676
- const RelationsInput = ({
3677
- disabled,
3678
- hint,
3679
- id,
3680
- label,
3681
- model,
3682
- name,
3683
- mainField,
3684
- placeholder,
3685
- required,
3686
- onChange
3687
- }) => {
3688
- const [textValue, setTextValue] = React.useState("");
3689
- const [searchParams, setSearchParams] = React.useState({
3690
- _q: "",
3691
- page: 1
3692
- });
3693
- const { toggleNotification } = useNotification();
3694
- const [{ query }] = useQueryParams();
3695
- const { formatMessage } = useIntl();
3696
- const fieldRef = useFocusInputField(name);
3697
- const field = useField(name);
3698
- const [searchForTrigger, { data, isLoading }] = useLazySearchRelationsQuery();
3699
- React.useEffect(() => {
3700
- const [targetField] = name.split(".").slice(-1);
3701
- searchForTrigger({
3702
- model,
3703
- targetField,
3704
- params: {
3705
- ...buildValidParams(query),
3706
- id: id ?? "",
3707
- pageSize: 10,
3708
- idsToInclude: field.value?.disconnect?.map((rel) => rel.id.toString()) ?? [],
3709
- idsToOmit: field.value?.connect?.map((rel) => rel.id.toString()) ?? [],
3710
- ...searchParams
3711
- }
3712
- });
3713
- }, [
3714
- field.value?.connect,
3715
- field.value?.disconnect,
3716
- id,
3717
- model,
3718
- name,
3719
- query,
3720
- searchForTrigger,
3721
- searchParams
3722
- ]);
3723
- const handleSearch = async (search) => {
3724
- setSearchParams((s) => ({ ...s, _q: search, page: 1 }));
3725
- };
3726
- const hasNextPage = data?.pagination ? data.pagination.page < data.pagination.pageCount : false;
3727
- const options = data?.results ?? [];
3728
- const handleChange = (relationId) => {
3729
- if (!relationId) {
3730
- return;
3731
- }
3732
- const relation = options.find((opt) => opt.id.toString() === relationId);
3733
- if (!relation) {
3734
- console.error(
3735
- "You've tried to add a relation with an id that does not exist in the options you can see, this is likely a bug with Strapi. Please open an issue."
3736
- );
3737
- toggleNotification({
3738
- message: formatMessage({
3739
- id: getTranslation("relation.error-adding-relation"),
3740
- defaultMessage: "An error occurred while trying to add the relation."
3741
- }),
3742
- type: "danger"
3743
- });
3744
- return;
3745
- }
3746
- onChange(relation);
3747
- };
3748
- const handleLoadMore = () => {
3749
- if (!data || !data.pagination) {
3750
- return;
3751
- } else if (data.pagination.page < data.pagination.pageCount) {
3752
- setSearchParams((s) => ({ ...s, page: s.page + 1 }));
3753
- }
3754
- };
3755
- React.useLayoutEffect(() => {
3756
- setTextValue("");
3757
- }, [field.value]);
3758
- return /* @__PURE__ */ jsx(
3759
- Combobox,
3760
- {
3761
- ref: fieldRef,
3762
- autocomplete: "none",
3763
- error: field.error,
3764
- name,
3765
- hint,
3766
- required,
3767
- label,
3768
- disabled,
3769
- placeholder: placeholder || formatMessage({
3770
- id: getTranslation("relation.add"),
3771
- defaultMessage: "Add relation"
3772
- }),
3773
- hasMoreItems: hasNextPage,
3774
- loading: isLoading,
3775
- onOpenChange: () => {
3776
- handleSearch(textValue ?? "");
3777
- },
3778
- noOptionsMessage: () => formatMessage({
3779
- id: getTranslation("relation.notAvailable"),
3780
- defaultMessage: "No relations available"
3781
- }),
3782
- loadingMessage: formatMessage({
3783
- id: getTranslation("relation.isLoading"),
3784
- defaultMessage: "Relations are loading"
3785
- }),
3786
- onLoadMore: handleLoadMore,
3787
- textValue,
3788
- onChange: handleChange,
3789
- onTextValueChange: (text) => {
3790
- setTextValue(text);
3791
- },
3792
- onInputChange: (event) => {
3793
- handleSearch(event.currentTarget.value);
3794
- },
3795
- children: options.map((opt) => {
3796
- const textValue2 = getRelationLabel(opt, mainField);
3797
- return /* @__PURE__ */ jsx(ComboboxOption, { value: opt.id.toString(), textValue: textValue2, children: /* @__PURE__ */ jsxs(Flex, { gap: 2, justifyContent: "space-between", children: [
3798
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: textValue2 }),
3799
- opt.status ? /* @__PURE__ */ jsx(DocumentStatus, { status: opt.status }) : null
3800
- ] }) }, opt.id);
3801
- })
3802
- }
3803
- );
3804
- };
3805
- const RELATION_ITEM_HEIGHT = 50;
3806
- const RELATION_GUTTER = 4;
3807
- const RelationsList = ({
3808
- data,
3809
- serverData,
3810
- disabled,
3811
- name,
3812
- isLoading,
3813
- relationType
3814
- }) => {
3815
- const ariaDescriptionId = React.useId();
3816
- const { formatMessage } = useIntl();
3817
- const listRef = React.useRef(null);
3818
- const outerListRef = React.useRef(null);
3819
- const [overflow, setOverflow] = React.useState();
3820
- const [liveText, setLiveText] = React.useState("");
3821
- const field = useField(name);
3822
- const removeFieldRow = useForm("RelationsList", (state) => state.removeFieldRow);
3823
- const addFieldRow = useForm("RelationsList", (state) => state.addFieldRow);
3824
- React.useEffect(() => {
3825
- if (data.length <= RELATIONS_TO_DISPLAY) {
3826
- return setOverflow(void 0);
3827
- }
3828
- const handleNativeScroll = (e) => {
3829
- const el = e.target;
3830
- const parentScrollContainerHeight = el.parentNode.scrollHeight;
3831
- const maxScrollBottom = el.scrollHeight - el.scrollTop;
3832
- if (el.scrollTop === 0) {
3833
- return setOverflow("bottom");
3834
- }
3835
- if (maxScrollBottom === parentScrollContainerHeight) {
3836
- return setOverflow("top");
3837
- }
3838
- return setOverflow("top-bottom");
3839
- };
3840
- const outerListRefCurrent = outerListRef?.current;
3841
- if (!isLoading && data.length > 0 && outerListRefCurrent) {
3842
- outerListRef.current.addEventListener("scroll", handleNativeScroll);
3843
- }
3844
- return () => {
3845
- if (outerListRefCurrent) {
3846
- outerListRefCurrent.removeEventListener("scroll", handleNativeScroll);
3847
- }
3848
- };
3849
- }, [isLoading, data.length]);
3850
- const getItemPos = (index) => `${index + 1} of ${data.length}`;
3851
- const handleMoveItem = (newIndex, oldIndex) => {
3852
- const item = data[oldIndex];
3853
- setLiveText(
3854
- formatMessage(
3855
- {
3856
- id: getTranslation("dnd.reorder"),
3857
- defaultMessage: "{item}, moved. New position in list: {position}."
3858
- },
3859
- {
3860
- item: item.label ?? item.documentId,
3861
- position: getItemPos(newIndex)
3862
- }
3863
- )
3864
- );
3865
- const newData = [...data];
3866
- const currentRow = data[oldIndex];
3867
- const startKey = oldIndex > newIndex ? newData[newIndex - 1]?.__temp_key__ : newData[newIndex]?.__temp_key__;
3868
- const endKey = oldIndex > newIndex ? newData[newIndex]?.__temp_key__ : newData[newIndex + 1]?.__temp_key__;
3869
- const [newKey] = generateNKeysBetween(startKey, endKey, 1);
3870
- newData.splice(oldIndex, 1);
3871
- newData.splice(newIndex, 0, { ...currentRow, __temp_key__: newKey });
3872
- const connectedRelations = newData.reduce((acc, relation, currentIndex, array) => {
3873
- const relationOnServer = serverData.find(
3874
- (oldRelation) => oldRelation.documentId === relation.documentId
3875
- );
3876
- const relationInFront = array[currentIndex + 1];
3877
- if (!relationOnServer || relationOnServer.__temp_key__ !== relation.__temp_key__) {
3878
- const position = relationInFront ? {
3879
- before: relationInFront.documentId,
3880
- locale: relationInFront.locale,
3881
- status: relationInFront.status
3882
- } : { end: true };
3883
- const relationWithPosition = { ...relation, position };
3884
- return [...acc, relationWithPosition];
3885
- }
3886
- return acc;
3887
- }, []).toReversed();
3888
- field.onChange(`${name}.connect`, connectedRelations);
3889
- };
3890
- const handleGrabItem = (index) => {
3891
- const item = data[index];
3892
- setLiveText(
3893
- formatMessage(
3894
- {
3895
- id: getTranslation("dnd.grab-item"),
3896
- defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`
3897
- },
3898
- {
3899
- item: item.label ?? item.documentId,
3900
- position: getItemPos(index)
3901
- }
3902
- )
3903
- );
3904
- };
3905
- const handleDropItem = (index) => {
3906
- const { href: _href, label, ...item } = data[index];
3907
- setLiveText(
3908
- formatMessage(
3909
- {
3910
- id: getTranslation("dnd.drop-item"),
3911
- defaultMessage: `{item}, dropped. Final position in list: {position}.`
3912
- },
3913
- {
3914
- item: label ?? item.documentId,
3915
- position: getItemPos(index)
3916
- }
3917
- )
3918
- );
3919
- };
3920
- const handleCancel = (index) => {
3921
- const item = data[index];
3922
- setLiveText(
3923
- formatMessage(
3924
- {
3925
- id: getTranslation("dnd.cancel-item"),
3926
- defaultMessage: "{item}, dropped. Re-order cancelled."
3927
- },
3928
- {
3929
- item: item.label ?? item.documentId
3930
- }
3931
- )
3932
- );
3933
- };
3934
- const handleDisconnect = (relation) => {
3935
- if (field.value && field.value.connect) {
3936
- const indexOfRelationInConnectArray = field.value.connect.findIndex(
3937
- (rel) => rel.id === relation.id
3938
- );
3939
- if (indexOfRelationInConnectArray >= 0) {
3940
- removeFieldRow(`${name}.connect`, indexOfRelationInConnectArray);
3941
- return;
3942
- }
3943
- }
3944
- addFieldRow(`${name}.disconnect`, { id: relation.id });
3945
- };
3946
- const canReorder = !ONE_WAY_RELATIONS.includes(relationType);
3947
- const dynamicListHeight = data.length > RELATIONS_TO_DISPLAY ? Math.min(data.length, RELATIONS_TO_DISPLAY) * (RELATION_ITEM_HEIGHT + RELATION_GUTTER) + RELATION_ITEM_HEIGHT / 2 : Math.min(data.length, RELATIONS_TO_DISPLAY) * (RELATION_ITEM_HEIGHT + RELATION_GUTTER);
3948
- return /* @__PURE__ */ jsxs(ShadowBox, { overflowDirection: overflow, children: [
3949
- /* @__PURE__ */ jsx(VisuallyHidden, { id: ariaDescriptionId, children: formatMessage({
3950
- id: getTranslation("dnd.instructions"),
3951
- defaultMessage: `Press spacebar to grab and re-order`
3952
- }) }),
3953
- /* @__PURE__ */ jsx(VisuallyHidden, { "aria-live": "assertive", children: liveText }),
3954
- /* @__PURE__ */ jsx(
3955
- FixedSizeList,
3956
- {
3957
- height: dynamicListHeight,
3958
- ref: listRef,
3959
- outerRef: outerListRef,
3960
- itemCount: data.length,
3961
- itemSize: RELATION_ITEM_HEIGHT + RELATION_GUTTER,
3962
- itemData: {
3963
- ariaDescribedBy: ariaDescriptionId,
3964
- canDrag: canReorder,
3965
- disabled,
3966
- handleCancel,
3967
- handleDropItem,
3968
- handleGrabItem,
3969
- handleMoveItem,
3970
- name,
3971
- handleDisconnect,
3972
- relations: data
3973
- },
3974
- itemKey: (index) => data[index].id,
3975
- innerElementType: "ol",
3976
- children: ListItem
3977
- }
3978
- )
3979
- ] });
3980
- };
3981
- const ShadowBox = styled(Box)`
3982
- position: relative;
3983
- overflow: hidden;
3984
- flex: 1;
3985
-
3986
- &:before,
3987
- &:after {
3988
- position: absolute;
3989
- width: 100%;
3990
- height: 4px;
3991
- z-index: 1;
3992
- }
3993
-
3994
- &:before {
3995
- /* TODO: as for DS Table component we would need this to be handled by the DS theme */
3996
- content: '';
3997
- background: linear-gradient(rgba(3, 3, 5, 0.2) 0%, rgba(0, 0, 0, 0) 100%);
3998
- top: 0;
3999
- opacity: ${({ overflowDirection }) => overflowDirection === "top-bottom" || overflowDirection === "top" ? 1 : 0};
4000
- transition: opacity 0.2s ease-in-out;
4001
- }
4002
-
4003
- &:after {
4004
- /* TODO: as for DS Table component we would need this to be handled by the DS theme */
4005
- content: '';
4006
- background: linear-gradient(0deg, rgba(3, 3, 5, 0.2) 0%, rgba(0, 0, 0, 0) 100%);
4007
- bottom: 0;
4008
- opacity: ${({ overflowDirection }) => overflowDirection === "top-bottom" || overflowDirection === "bottom" ? 1 : 0};
4009
- transition: opacity 0.2s ease-in-out;
4010
- }
4011
- `;
4012
- const ListItem = ({ data, index, style }) => {
4013
- const {
4014
- ariaDescribedBy,
4015
- canDrag = false,
4016
- disabled = false,
4017
- handleCancel,
4018
- handleDisconnect,
4019
- handleDropItem,
4020
- handleGrabItem,
4021
- handleMoveItem,
4022
- name,
4023
- relations
4024
- } = data;
4025
- const { formatMessage } = useIntl();
4026
- const { href, documentId, label, status } = relations[index];
4027
- const [{ handlerId, isDragging, handleKeyDown }, relationRef, dropRef, dragRef, dragPreviewRef] = useDragAndDrop(
4028
- canDrag && !disabled,
4029
- {
4030
- type: `${ItemTypes.RELATION}_${name}`,
4031
- index,
4032
- item: {
4033
- displayedValue: label,
4034
- status,
4035
- id: documentId,
4036
- index
4037
- },
4038
- onMoveItem: handleMoveItem,
4039
- onDropItem: handleDropItem,
4040
- onGrabItem: handleGrabItem,
4041
- onCancel: handleCancel,
4042
- dropSensitivity: DROP_SENSITIVITY.REGULAR
4043
- }
4044
- );
4045
- const composedRefs = useComposedRefs(relationRef, dragRef);
4046
- React.useEffect(() => {
4047
- dragPreviewRef(getEmptyImage());
4048
- }, [dragPreviewRef]);
4049
- return /* @__PURE__ */ jsx(
4050
- Box,
4051
- {
4052
- style,
4053
- as: "li",
4054
- ref: dropRef,
4055
- "aria-describedby": ariaDescribedBy,
4056
- cursor: canDrag ? "all-scroll" : "default",
4057
- children: isDragging ? /* @__PURE__ */ jsx(RelationItemPlaceholder, {}) : /* @__PURE__ */ jsxs(
4058
- Flex,
4059
- {
4060
- paddingTop: 2,
4061
- paddingBottom: 2,
4062
- paddingLeft: canDrag ? 2 : 4,
4063
- paddingRight: 4,
4064
- hasRadius: true,
4065
- borderColor: "neutral200",
4066
- background: disabled ? "neutral150" : "neutral0",
4067
- justifyContent: "space-between",
4068
- ref: composedRefs,
4069
- "data-handler-id": handlerId,
4070
- children: [
4071
- /* @__PURE__ */ jsxs(FlexWrapper, { gap: 1, children: [
4072
- canDrag ? /* @__PURE__ */ jsx(
4073
- IconButton,
4074
- {
4075
- forwardedAs: "div",
4076
- role: "button",
4077
- tabIndex: 0,
4078
- "aria-label": formatMessage({
4079
- id: getTranslation("components.RelationInput.icon-button-aria-label"),
4080
- defaultMessage: "Drag"
4081
- }),
4082
- borderWidth: 0,
4083
- onKeyDown: handleKeyDown,
4084
- disabled,
4085
- children: /* @__PURE__ */ jsx(Drag, {})
4086
- }
4087
- ) : null,
4088
- /* @__PURE__ */ jsxs(Flex, { width: "100%", minWidth: 0, justifyContent: "space-between", children: [
4089
- /* @__PURE__ */ jsx(Box, { minWidth: 0, paddingTop: 1, paddingBottom: 1, paddingRight: 4, children: /* @__PURE__ */ jsx(Tooltip, { description: label, children: href ? /* @__PURE__ */ jsx(LinkEllipsis, { forwardedAs: NavLink, to: href, children: label }) : /* @__PURE__ */ jsx(Typography, { textColor: disabled ? "neutral600" : "primary600", ellipsis: true, children: label }) }) }),
4090
- status ? /* @__PURE__ */ jsx(DocumentStatus, { status }) : null
4091
- ] })
4092
- ] }),
4093
- /* @__PURE__ */ jsx(Box, { paddingLeft: 4, children: /* @__PURE__ */ jsx(
4094
- DisconnectButton,
4095
- {
4096
- disabled,
4097
- type: "button",
4098
- onClick: () => handleDisconnect(relations[index]),
4099
- "aria-label": formatMessage({
4100
- id: getTranslation("relation.disconnect"),
4101
- defaultMessage: "Remove"
4102
- }),
4103
- children: /* @__PURE__ */ jsx(Icon, { width: "12px", as: Cross })
4104
- }
4105
- ) })
4106
- ]
4107
- }
4108
- )
4109
- }
4110
- );
4111
- };
4112
- const FlexWrapper = styled(Flex)`
4113
- width: 100%;
4114
- /* Used to prevent endAction to be pushed out of container */
4115
- min-width: 0;
4116
-
4117
- & > div[role='button'] {
4118
- cursor: all-scroll;
4119
- }
4120
- `;
4121
- const DisconnectButton = styled.button`
4122
- svg path {
4123
- fill: ${({ theme, disabled }) => disabled ? theme.colors.neutral600 : theme.colors.neutral500};
4124
- }
4125
-
4126
- &:hover svg path,
4127
- &:focus svg path {
4128
- fill: ${({ theme, disabled }) => !disabled && theme.colors.neutral600};
4129
- }
4130
- `;
4131
- const LinkEllipsis = styled(Link)`
4132
- display: block;
4133
-
4134
- & > span {
4135
- white-space: nowrap;
4136
- overflow: hidden;
4137
- text-overflow: ellipsis;
4138
- display: block;
4139
- }
4140
- `;
4141
- const RelationItemPlaceholder = () => /* @__PURE__ */ jsx(
4142
- Box,
4143
- {
4144
- paddingTop: 2,
4145
- paddingBottom: 2,
4146
- paddingLeft: 4,
4147
- paddingRight: 4,
4148
- hasRadius: true,
4149
- borderStyle: "dashed",
4150
- borderColor: "primary600",
4151
- borderWidth: "1px",
4152
- background: "primary100",
4153
- height: `calc(100% - ${RELATION_GUTTER}px)`
4154
- }
4155
- );
4156
-
4157
- const RelationDragPreview = ({ status, displayedValue, width }) => {
4158
- return /* @__PURE__ */ jsx(Box, { style: { width }, children: /* @__PURE__ */ jsxs(
4159
- Flex,
4160
- {
4161
- paddingTop: 2,
4162
- paddingBottom: 2,
4163
- paddingLeft: 2,
4164
- paddingRight: 4,
4165
- hasRadius: true,
4166
- borderWidth: 1,
4167
- background: "neutral0",
4168
- borderColor: "neutral200",
4169
- justifyContent: "space-between",
4170
- children: [
4171
- /* @__PURE__ */ jsxs(FlexWrapper, { gap: 1, children: [
4172
- /* @__PURE__ */ jsx(IconButton, { "aria-label": "", borderWidth: 0, children: /* @__PURE__ */ jsx(Drag, {}) }),
4173
- /* @__PURE__ */ jsxs(Flex, { width: "100%", minWidth: 0, justifyContent: "space-between", children: [
4174
- /* @__PURE__ */ jsx(Box, { minWidth: 0, paddingTop: 1, paddingBottom: 1, paddingRight: 4, children: /* @__PURE__ */ jsx(LinkEllipsis, { href: "", children: /* @__PURE__ */ jsx(Typography, { textColor: "primary600", ellipsis: true, children: displayedValue }) }) }),
4175
- status ? /* @__PURE__ */ jsx(DocumentStatus, { status }) : null
4176
- ] })
4177
- ] }),
4178
- /* @__PURE__ */ jsx(Box, { paddingLeft: 4, children: /* @__PURE__ */ jsx(DisconnectButton, { type: "button", children: /* @__PURE__ */ jsx(Icon, { width: "12px", as: Cross }) }) })
4179
- ]
4180
- }
4181
- ) });
4182
- };
4183
-
4184
- const LeftMenu = () => {
4185
- const [search, setSearch] = React.useState("");
4186
- const [{ query }] = useQueryParams();
4187
- const { formatMessage, locale } = useIntl();
4188
- const collectionTypeLinks = useTypedSelector(
4189
- (state) => state["content-manager_app"].collectionTypeLinks
4190
- );
4191
- const singleTypeLinks = useTypedSelector((state) => state["content-manager_app"].singleTypeLinks);
4192
- const { startsWith } = useFilter(locale, {
4193
- sensitivity: "base"
4194
- });
4195
- const formatter = useCollator(locale, {
4196
- sensitivity: "base"
4197
- });
4198
- const menu = React.useMemo(
4199
- () => [
4200
- {
4201
- id: "collectionTypes",
4202
- title: formatMessage({
4203
- id: getTranslation("components.LeftMenu.collection-types"),
4204
- defaultMessage: "Collection Types"
4205
- }),
4206
- searchable: true,
4207
- links: collectionTypeLinks
4208
- },
4209
- {
4210
- id: "singleTypes",
4211
- title: formatMessage({
4212
- id: getTranslation("components.LeftMenu.single-types"),
4213
- defaultMessage: "Single Types"
4214
- }),
4215
- searchable: true,
4216
- links: singleTypeLinks
4217
- }
4218
- ].map((section) => ({
4219
- ...section,
4220
- links: section.links.filter((link) => startsWith(link.title, search)).sort((a, b) => formatter.compare(a.title, b.title)).map((link) => {
4221
- return {
4222
- ...link,
4223
- title: formatMessage({ id: link.title, defaultMessage: link.title })
4224
- };
4225
- })
4226
- })),
4227
- [collectionTypeLinks, search, singleTypeLinks, startsWith, formatMessage, formatter]
4228
- );
4229
- const handleClear = () => {
4230
- setSearch("");
4231
- };
4232
- const handleChangeSearch = ({ target: { value } }) => {
4233
- setSearch(value);
4234
- };
4235
- const label = formatMessage({
4236
- id: getTranslation("header.name"),
4237
- defaultMessage: "Content"
4238
- });
4239
- return /* @__PURE__ */ jsxs(SubNav, { ariaLabel: label, children: [
4240
- /* @__PURE__ */ jsx(
4241
- SubNavHeader,
4242
- {
4243
- label,
4244
- searchable: true,
4245
- value: search,
4246
- onChange: handleChangeSearch,
4247
- onClear: handleClear,
4248
- searchLabel: formatMessage({
4249
- id: "content-manager.components.LeftMenu.Search.label",
4250
- defaultMessage: "Search for a content type"
4251
- })
4252
- }
4253
- ),
4254
- /* @__PURE__ */ jsx(SubNavSections, { children: menu.map((section) => {
4255
- return /* @__PURE__ */ jsx(
4256
- SubNavSection,
4257
- {
4258
- label: section.title,
4259
- badgeLabel: section.links.length.toString(),
4260
- children: section.links.map((link) => {
4261
- return /* @__PURE__ */ jsx(
4262
- SubNavLink,
4263
- {
4264
- as: NavLink,
4265
- to: {
4266
- pathname: link.to,
4267
- /**
4268
- * We re-add the plugins query to the params available in the menu,
4269
- * this means once you've changed the locale in the app, you continue
4270
- * to see the same locale when changing content-type.
4271
- *
4272
- * NOTE: if you go to a content-type that does not have i18n enabled,
4273
- * we return the default documents anyway.
4274
- */
4275
- search: stringify({
4276
- ...parse(link.search ?? ""),
4277
- plugins: query.plugins
4278
- })
4279
- },
4280
- children: link.title
4281
- },
4282
- link.uid
4283
- );
4284
- })
4285
- },
4286
- section.id
4287
- );
4288
- }) })
4289
- ] });
4290
- };
4291
-
4292
- const contentTypesApi = contentManagerApi.injectEndpoints({
4293
- endpoints: (builder) => ({
4294
- getContentTypeConfiguration: builder.query({
4295
- query: (uid) => ({
4296
- url: `/content-manager/content-types/${uid}/configuration`,
4297
- method: "GET"
4298
- }),
4299
- transformResponse: (response) => response.data,
4300
- providesTags: (_result, _error, uid) => [
4301
- { type: "ContentTypesConfiguration", id: uid },
4302
- { type: "ContentTypeSettings", id: "LIST" }
4303
- ]
4304
- }),
4305
- getAllContentTypeSettings: builder.query({
4306
- query: () => "/content-manager/content-types-settings",
4307
- transformResponse: (response) => response.data,
4308
- providesTags: [{ type: "ContentTypeSettings", id: "LIST" }]
4309
- }),
4310
- updateContentTypeConfiguration: builder.mutation({
4311
- query: ({ uid, ...body }) => ({
4312
- url: `/content-manager/content-types/${uid}/configuration`,
4313
- method: "PUT",
4314
- data: body
4315
- }),
4316
- transformResponse: (response) => response.data,
4317
- invalidatesTags: (_result, _error, { uid }) => [
4318
- { type: "ContentTypesConfiguration", id: uid },
4319
- { type: "ContentTypeSettings", id: "LIST" },
4320
- // Is this necessary?
4321
- { type: "InitialData" }
4322
- ]
4323
- })
4324
- })
4325
- });
4326
- const {
4327
- useGetContentTypeConfigurationQuery,
4328
- useGetAllContentTypeSettingsQuery,
4329
- useUpdateContentTypeConfigurationMutation
4330
- } = contentTypesApi;
4331
-
4332
- const { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;
4333
- const useContentManagerInitData = () => {
4334
- const dispatch = useTypedDispatch();
4335
- const { toggleNotification } = useNotification();
4336
- const runHookWaterfall = useStrapiApp(
4337
- "useContentManagerInitData",
4338
- (state2) => state2.runHookWaterfall
4339
- );
4340
- const { notifyStatus } = useNotifyAT();
4341
- const { formatMessage } = useIntl();
4342
- const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);
4343
- const checkUserHasPermissions = useAuth(
4344
- "useContentManagerInitData",
4345
- (state2) => state2.checkUserHasPermissions
4346
- );
4347
- const state = useTypedSelector((state2) => state2["content-manager_app"]);
4348
- const initialDataQuery = useGetInitialDataQuery(void 0, {
4349
- /**
4350
- * TODO: remove this when the CTB has been refactored to use redux-toolkit-query
4351
- * and it can invalidate the cache on mutation
4352
- */
4353
- refetchOnMountOrArgChange: true
4354
- });
4355
- useEffect(() => {
4356
- if (initialDataQuery.data) {
4357
- notifyStatus(
4358
- formatMessage({
4359
- id: getTranslation("App.schemas.data-loaded"),
4360
- defaultMessage: "The schemas have been successfully loaded."
4361
- })
4362
- );
4363
- }
4364
- }, [formatMessage, initialDataQuery.data, notifyStatus]);
4365
- useEffect(() => {
4366
- if (initialDataQuery.error) {
4367
- toggleNotification({ type: "danger", message: formatAPIError(initialDataQuery.error) });
4368
- }
4369
- }, [formatAPIError, initialDataQuery.error, toggleNotification]);
4370
- const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();
4371
- useEffect(() => {
4372
- if (contentTypeSettingsQuery.error) {
4373
- toggleNotification({
4374
- type: "danger",
4375
- message: formatAPIError(contentTypeSettingsQuery.error)
4376
- });
4377
- }
4378
- }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);
4379
- const formatData = async (components, contentTypes, fieldSizes, contentTypeConfigurations) => {
4380
- const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } = contentTypes.reduce(
4381
- (acc, model) => {
4382
- acc[model.kind].push(model);
4383
- return acc;
4384
- },
4385
- {
4386
- collectionType: [],
4387
- singleType: []
4388
- }
4389
- );
4390
- const collectionTypeSectionLinks = generateLinks(
4391
- collectionTypeLinks,
4392
- "collectionTypes",
4393
- contentTypeConfigurations
4394
- );
4395
- const singleTypeSectionLinks = generateLinks(singleTypeLinks, "singleTypes");
4396
- const collectionTypeLinksPermissions = await Promise.all(
4397
- collectionTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))
4398
- );
4399
- const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter(
4400
- (_, index) => collectionTypeLinksPermissions[index]
4401
- );
4402
- const singleTypeLinksPermissions = await Promise.all(
4403
- singleTypeSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))
4404
- );
4405
- const authorizedSingleTypeLinks = singleTypeSectionLinks.filter(
4406
- (_, index) => singleTypeLinksPermissions[index]
4407
- );
4408
- const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {
4409
- ctLinks: authorizedCollectionTypeLinks,
4410
- models: contentTypes
4411
- });
4412
- const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {
4413
- stLinks: authorizedSingleTypeLinks,
4414
- models: contentTypes
4415
- });
4416
- dispatch({
4417
- type: SET_INIT_DATA,
4418
- authorizedCollectionTypeLinks: ctLinks,
4419
- authorizedSingleTypeLinks: stLinks,
4420
- contentTypeSchemas: contentTypes,
4421
- components,
4422
- fieldSizes
4423
- });
4424
- };
4425
- useEffect(() => {
4426
- if (initialDataQuery.data && contentTypeSettingsQuery.data) {
4427
- formatData(
4428
- initialDataQuery.data.components,
4429
- initialDataQuery.data.contentTypes,
4430
- initialDataQuery.data.fieldSizes,
4431
- contentTypeSettingsQuery.data
4432
- );
4433
- }
4434
- }, [initialDataQuery.data, contentTypeSettingsQuery.data]);
4435
- return { ...state };
4436
- };
4437
- const generateLinks = (links, type, configurations = []) => {
4438
- return links.filter((link) => link.isDisplayed).map((link) => {
4439
- const collectionTypesPermissions = [
4440
- { action: "plugin::content-manager.explorer.create", subject: link.uid },
4441
- { action: "plugin::content-manager.explorer.read", subject: link.uid }
4442
- ];
4443
- const singleTypesPermissions = [
4444
- { action: "plugin::content-manager.explorer.read", subject: link.uid }
4445
- ];
4446
- const permissions = type === "collectionTypes" ? collectionTypesPermissions : singleTypesPermissions;
4447
- const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);
4448
- let search = null;
4449
- if (currentContentTypeConfig) {
4450
- const searchParams = {
4451
- page: 1,
4452
- pageSize: currentContentTypeConfig.settings.pageSize,
4453
- sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`
4454
- };
4455
- search = stringify(searchParams, { encode: false });
4456
- }
4457
- return {
4458
- permissions,
4459
- search,
4460
- kind: link.kind,
4461
- title: link.info.displayName,
4462
- to: `/content-manager/${link.kind === "collectionType" ? COLLECTION_TYPES : SINGLE_TYPES}/${link.uid}`,
4463
- uid: link.uid,
4464
- // Used for the list item key in the helper plugin
4465
- name: link.uid,
4466
- isDisplayed: link.isDisplayed
4467
- };
4468
- });
4469
- };
4470
-
4471
- const Layout = () => {
4472
- const contentTypeMatch = useMatch("/content-manager/:kind/:uid/*");
4473
- const { isLoading, collectionTypeLinks, models, singleTypeLinks } = useContentManagerInitData();
4474
- const authorisedModels = [...collectionTypeLinks, ...singleTypeLinks].sort(
4475
- (a, b) => a.title.localeCompare(b.title)
4476
- );
4477
- const { pathname } = useLocation();
4478
- const { formatMessage } = useIntl();
4479
- const startSection = useGuidedTour("Layout", (state) => state.startSection);
4480
- const startSectionRef = React.useRef(startSection);
4481
- const isHistoryRoute = useIsHistoryRoute();
4482
- React.useEffect(() => {
4483
- if (startSectionRef.current) {
4484
- startSectionRef.current("contentManager");
4485
- }
4486
- }, []);
4487
- if (isLoading) {
4488
- return /* @__PURE__ */ jsxs(Fragment, { children: [
4489
- /* @__PURE__ */ jsx(
4490
- Helmet,
4491
- {
4492
- title: formatMessage({
4493
- id: getTranslation("plugin.name"),
4494
- defaultMessage: "Content Manager"
4495
- })
4496
- }
4497
- ),
4498
- /* @__PURE__ */ jsx(Page.Loading, {})
4499
- ] });
4500
- }
4501
- const supportedModelsToDisplay = models.filter(({ isDisplayed }) => isDisplayed);
4502
- if (authorisedModels.length === 0 && supportedModelsToDisplay.length > 0 && pathname !== "/content-manager/403") {
4503
- return /* @__PURE__ */ jsx(Navigate, { to: "/403" });
4504
- }
4505
- if (supportedModelsToDisplay.length === 0 && pathname !== "/no-content-types") {
4506
- return /* @__PURE__ */ jsx(Navigate, { to: "/no-content-types" });
4507
- }
4508
- if (!contentTypeMatch && authorisedModels.length > 0) {
4509
- return /* @__PURE__ */ jsx(
4510
- Navigate,
4511
- {
4512
- to: {
4513
- pathname: authorisedModels[0].to,
4514
- search: authorisedModels[0].search ?? ""
4515
- }
4516
- }
4517
- );
4518
- }
4519
- return /* @__PURE__ */ jsxs(Fragment, { children: [
4520
- /* @__PURE__ */ jsx(
4521
- Helmet,
4522
- {
4523
- title: formatMessage({
4524
- id: getTranslation("plugin.name"),
4525
- defaultMessage: "Content Manager"
4526
- })
4527
- }
4528
- ),
4529
- isHistoryRoute ? /* @__PURE__ */ jsx(Outlet, {}) : /* @__PURE__ */ jsxs(Layout$1, { sideNav: /* @__PURE__ */ jsx(LeftMenu, {}), children: [
4530
- /* @__PURE__ */ jsx(DragLayer, { renderItem: renderDraglayerItem }),
4531
- /* @__PURE__ */ jsx(Outlet, {})
4532
- ] })
4533
- ] });
4534
- };
4535
- function renderDraglayerItem({ type, item }) {
4536
- if (!type || type && typeof type !== "string") {
4537
- return null;
4538
- }
4539
- const [actualType] = type.split("_");
4540
- switch (actualType) {
4541
- case ItemTypes.EDIT_FIELD:
4542
- case ItemTypes.FIELD:
4543
- return /* @__PURE__ */ jsx(CardDragPreview, { label: item.label });
4544
- case ItemTypes.COMPONENT:
4545
- case ItemTypes.DYNAMIC_ZONE:
4546
- return /* @__PURE__ */ jsx(ComponentDragPreview, { displayedValue: item.displayedValue });
4547
- case ItemTypes.RELATION:
4548
- return /* @__PURE__ */ jsx(RelationDragPreview, { ...item });
4549
- default:
4550
- return null;
4551
- }
4552
- }
4553
- const SET_INIT_DATA = "ContentManager/App/SET_INIT_DATA";
4554
- const initialState$1 = {
4555
- collectionTypeLinks: [],
4556
- components: [],
4557
- fieldSizes: {},
4558
- models: [],
4559
- singleTypeLinks: [],
4560
- isLoading: true
4561
- };
4562
- const reducer$2 = (state = initialState$1, action) => produce(state, (draftState) => {
4563
- switch (action.type) {
4564
- case SET_INIT_DATA: {
4565
- const initDataAction = action;
4566
- draftState.collectionTypeLinks = initDataAction.authorizedCollectionTypeLinks.filter(
4567
- ({ isDisplayed }) => isDisplayed
4568
- );
4569
- draftState.singleTypeLinks = initDataAction.authorizedSingleTypeLinks.filter(
4570
- ({ isDisplayed }) => isDisplayed
4571
- );
4572
- draftState.components = initDataAction.components;
4573
- draftState.models = initDataAction.contentTypeSchemas;
4574
- draftState.fieldSizes = initDataAction.fieldSizes;
4575
- draftState.isLoading = false;
4576
- break;
4577
- }
4578
- default:
4579
- return draftState;
4580
- }
4581
- });
4582
-
4583
- const layout = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
4584
- __proto__: null,
4585
- Layout,
4586
- SET_INIT_DATA,
4587
- reducer: reducer$2
4588
- }, Symbol.toStringTag, { value: 'Module' }));
4589
-
4590
- const initialState = {
4591
- permissions: void 0
4592
- };
4593
- const rbacSlice = createSlice({
4594
- name: "rbac",
4595
- initialState,
4596
- reducers: {
4597
- setPermissions(state, action) {
4598
- state.permissions = Object.values(action.payload.permissions).reduce((acc, current) => {
4599
- return [...acc, ...current];
4600
- }, []);
4601
- },
4602
- resetPermissions(state) {
4603
- state.permissions = void 0;
4604
- }
4605
- }
4606
- });
4607
- const { actions, reducer: reducer$1 } = rbacSlice;
4608
- const { setPermissions, resetPermissions } = actions;
4609
-
4610
- const reducer = combineReducers({
4611
- rbac: reducer$1
4612
- });
4613
-
4614
- export { useAuth as $, AuthProvider as A, useLazyGetDocumentQuery as B, ConfigurationProvider as C, buildValidParams as D, useForm as E, PUBLISHED_AT_ATTRIBUTE_NAME as F, GuidedTourProvider as G, isBaseQueryError as H, DocumentStatus as I, CREATED_BY_ATTRIBUTE_NAME as J, PUBLISHED_BY_ATTRIBUTE_NAME as K, LanguageProvider as L, UPDATED_AT_ATTRIBUTE_NAME as M, NotificationsProvider as N, CREATED_AT_ATTRIBUTE_NAME as O, Page as P, reducer$5 as Q, reducer$2 as R, StrapiAppProvider as S, Theme as T, UPDATED_BY_ATTRIBUTE_NAME as U, contentManagerApi as V, reducer as W, useConfiguration as X, useTypedDispatch as Y, setLocale as Z, errorsTrads as _, TrackingProvider as a, Form as a0, useForgotPasswordMutation as a1, useAppInfo as a2, useGuidedTour as a3, useGetRegistrationInfoQuery as a4, useRegisterAdminMutation as a5, useRegisterUserMutation as a6, useResetPasswordMutation as a7, useInitQuery as a8, ADMIN_PERMISSIONS_CE as a9, ItemTypes as aA, DOCUMENT_META_FIELDS as aB, useComponent as aC, ComponentProvider as aD, getIn as aE, RelationsField as aF, setPermissions as aG, resetPermissions as aH, CREATOR_FIELDS as aI, getRelationLabel as aJ, useGetRelationsQuery as aK, usePrev as aL, useGetAllDocumentsQuery as aM, capitalise as aN, CardDragPreview as aO, useUpdateContentTypeConfigurationMutation as aP, setIn as aQ, useGetInitialDataQuery as aR, extractContentTypeComponents as aS, ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD as aT, useGetProvidersQuery as aU, isObject as aV, useRegenerateTokenMutation as aW, layout as aX, THEME_LOCAL_STORAGE_KEY as aa, HOOKS as ab, getFetchClient as ac, useTypedStore as ad, Blocker as ae, useDocument as af, ConfigurationContextProvider as ag, AppInfoProvider as ah, useFocusInputField as ai, useContentTypeSchema as aj, useGetContentTypeConfigurationQuery as ak, useInformationQuery as al, useIsHistoryRoute as am, createTypedSelector as an, useUpdateMeMutation as ao, useIsSSOLockedQuery as ap, setAppTheme as aq, useGetPluginsQuery as ar, SETTINGS_LINKS_CE as as, DragLayer as at, useDragAndDrop as au, useGetProviderOptionsQuery as av, useUpdateProviderOptionsMutation as aw, createYupSchema as ax, prefixFileUrlWithBackendUrl as ay, DIRECTIONS as az, LANGUAGE_LOCAL_STORAGE_KEY as b, createContext as c, COLLECTION_TYPES as d, SINGLE_TYPES as e, adminApi as f, useDoc as g, useTypedSelector as h, useAPIErrorHandler as i, useNotification as j, useRBAC as k, useField as l, useGetLicenseLimitsQuery as m, useQueryParams as n, useTracking as o, useDeleteDocumentMutation as p, getTranslation as q, routes as r, useDiscardDocumentMutation as s, usePublishDocumentMutation as t, useStrapiApp as u, useUpdateDocumentMutation as v, useUnpublishDocumentMutation as w, useCreateDocumentMutation as x, useAutoCloneDocumentMutation as y, useCloneDocumentMutation as z };
4615
- //# sourceMappingURL=reducers-TOuLOGw_.mjs.map