@strapi/admin 5.8.1 → 5.10.0
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.
- package/dist/_internal.js +86 -30
- package/dist/_internal.js.map +1 -1
- package/dist/_internal.mjs +85 -31
- package/dist/_internal.mjs.map +1 -1
- package/dist/admin/chunks/AdminSeatInfo-BfPqdNN0.js +116 -0
- package/dist/admin/chunks/AdminSeatInfo-BfPqdNN0.js.map +1 -0
- package/dist/admin/chunks/AdminSeatInfo-Cw1ujAsZ.mjs +114 -0
- package/dist/admin/chunks/AdminSeatInfo-Cw1ujAsZ.mjs.map +1 -0
- package/dist/admin/chunks/ApplicationInfoPage-Ch6hKH4Y.mjs +932 -0
- package/dist/admin/chunks/ApplicationInfoPage-Ch6hKH4Y.mjs.map +1 -0
- package/dist/admin/chunks/ApplicationInfoPage-DIiAE-tT.js +953 -0
- package/dist/admin/chunks/ApplicationInfoPage-DIiAE-tT.js.map +1 -0
- package/dist/admin/chunks/AuthResponse-DFS6gVO4.mjs +87 -0
- package/dist/admin/chunks/AuthResponse-DFS6gVO4.mjs.map +1 -0
- package/dist/admin/chunks/AuthResponse-DI-Q1kQL.js +108 -0
- package/dist/admin/chunks/AuthResponse-DI-Q1kQL.js.map +1 -0
- package/dist/admin/chunks/AuthenticatedLayout-BNWCtSH2.mjs +1223 -0
- package/dist/admin/chunks/AuthenticatedLayout-BNWCtSH2.mjs.map +1 -0
- package/dist/admin/chunks/AuthenticatedLayout-D067wUoO.js +1245 -0
- package/dist/admin/chunks/AuthenticatedLayout-D067wUoO.js.map +1 -0
- package/dist/admin/chunks/CreateActionEE-CSZxFkrZ.js +74 -0
- package/dist/admin/chunks/CreateActionEE-CSZxFkrZ.js.map +1 -0
- package/dist/admin/chunks/CreateActionEE-DZ6ApqOF.mjs +53 -0
- package/dist/admin/chunks/CreateActionEE-DZ6ApqOF.mjs.map +1 -0
- package/dist/admin/chunks/CreatePage-0PdN9Fyc.mjs +355 -0
- package/dist/admin/chunks/CreatePage-0PdN9Fyc.mjs.map +1 -0
- package/dist/admin/chunks/CreatePage-BK_ivKDk.js +378 -0
- package/dist/admin/chunks/CreatePage-BK_ivKDk.js.map +1 -0
- package/dist/admin/chunks/CreatePage-C8PMNi_P.js +57 -0
- package/dist/admin/chunks/CreatePage-C8PMNi_P.js.map +1 -0
- package/dist/admin/chunks/CreatePage-DojcQqvH.mjs +54 -0
- package/dist/admin/chunks/CreatePage-DojcQqvH.mjs.map +1 -0
- package/dist/admin/chunks/CreateView-BuN2a7bo.mjs +57 -0
- package/dist/admin/chunks/CreateView-BuN2a7bo.mjs.map +1 -0
- package/dist/admin/chunks/CreateView-DB0xD4f5.mjs +62 -0
- package/dist/admin/chunks/CreateView-DB0xD4f5.mjs.map +1 -0
- package/dist/admin/chunks/CreateView-DtccbWiR.js +59 -0
- package/dist/admin/chunks/CreateView-DtccbWiR.js.map +1 -0
- package/dist/admin/chunks/CreateView-ITRNGoQ6.js +64 -0
- package/dist/admin/chunks/CreateView-ITRNGoQ6.js.map +1 -0
- package/dist/admin/chunks/EditPage-BNZ90ISm.mjs +986 -0
- package/dist/admin/chunks/EditPage-BNZ90ISm.mjs.map +1 -0
- package/dist/admin/chunks/EditPage-BazkPM17.mjs +351 -0
- package/dist/admin/chunks/EditPage-BazkPM17.mjs.map +1 -0
- package/dist/admin/chunks/EditPage-DiDSR0tz.js +1010 -0
- package/dist/admin/chunks/EditPage-DiDSR0tz.js.map +1 -0
- package/dist/admin/chunks/EditPage-LRn1-C88.mjs +397 -0
- package/dist/admin/chunks/EditPage-LRn1-C88.mjs.map +1 -0
- package/dist/admin/chunks/EditPage-ibh8EtSv.js +420 -0
- package/dist/admin/chunks/EditPage-ibh8EtSv.js.map +1 -0
- package/dist/admin/chunks/EditPage-r043NYgB.js +374 -0
- package/dist/admin/chunks/EditPage-r043NYgB.js.map +1 -0
- package/dist/admin/chunks/EditView-CgMgqsza.mjs +398 -0
- package/dist/admin/chunks/EditView-CgMgqsza.mjs.map +1 -0
- package/dist/admin/chunks/EditView-DxmJI6e0.js +421 -0
- package/dist/admin/chunks/EditView-DxmJI6e0.js.map +1 -0
- package/dist/admin/chunks/EditViewPage-BE_u8pQP.mjs +1039 -0
- package/dist/admin/chunks/EditViewPage-BE_u8pQP.mjs.map +1 -0
- package/dist/admin/chunks/EditViewPage-Bz4GEIsc.js +1062 -0
- package/dist/admin/chunks/EditViewPage-Bz4GEIsc.js.map +1 -0
- package/dist/admin/chunks/EventsTable-CZY0aI5G.js +97 -0
- package/dist/admin/chunks/EventsTable-CZY0aI5G.js.map +1 -0
- package/dist/admin/chunks/EventsTable-CsFf4rOj.mjs +95 -0
- package/dist/admin/chunks/EventsTable-CsFf4rOj.mjs.map +1 -0
- package/dist/admin/chunks/HomePage-C2Sue0eX.mjs +55 -0
- package/dist/admin/chunks/HomePage-C2Sue0eX.mjs.map +1 -0
- package/dist/admin/chunks/HomePage-CFTx_SgI.mjs +567 -0
- package/dist/admin/chunks/HomePage-CFTx_SgI.mjs.map +1 -0
- package/dist/admin/chunks/HomePage-Df0YSqNE.js +589 -0
- package/dist/admin/chunks/HomePage-Df0YSqNE.js.map +1 -0
- package/dist/admin/chunks/HomePage-ebJLhO6a.js +57 -0
- package/dist/admin/chunks/HomePage-ebJLhO6a.js.map +1 -0
- package/dist/admin/chunks/InstalledPlugins-B4gyKUHh.mjs +174 -0
- package/dist/admin/chunks/InstalledPlugins-B4gyKUHh.mjs.map +1 -0
- package/dist/admin/chunks/InstalledPlugins-BtwwVsQ_.js +196 -0
- package/dist/admin/chunks/InstalledPlugins-BtwwVsQ_.js.map +1 -0
- package/dist/admin/chunks/Layout-BZTqa7oj.js +296 -0
- package/dist/admin/chunks/Layout-BZTqa7oj.js.map +1 -0
- package/dist/admin/chunks/Layout-B_xkPr1q.mjs +275 -0
- package/dist/admin/chunks/Layout-B_xkPr1q.mjs.map +1 -0
- package/dist/admin/chunks/ListPage-Beh8uBDE.mjs +610 -0
- package/dist/admin/chunks/ListPage-Beh8uBDE.mjs.map +1 -0
- package/dist/admin/chunks/ListPage-BtMdu1eQ.mjs +696 -0
- package/dist/admin/chunks/ListPage-BtMdu1eQ.mjs.map +1 -0
- package/dist/admin/chunks/ListPage-CENQarKY.mjs +452 -0
- package/dist/admin/chunks/ListPage-CENQarKY.mjs.map +1 -0
- package/dist/admin/chunks/ListPage-Czwak48Z.mjs +373 -0
- package/dist/admin/chunks/ListPage-Czwak48Z.mjs.map +1 -0
- package/dist/admin/chunks/ListPage-DgmOJv7H.js +632 -0
- package/dist/admin/chunks/ListPage-DgmOJv7H.js.map +1 -0
- package/dist/admin/chunks/ListPage-Du6Jt5wY.js +721 -0
- package/dist/admin/chunks/ListPage-Du6Jt5wY.js.map +1 -0
- package/dist/admin/chunks/ListPage-LqcmQd_Q.js +474 -0
- package/dist/admin/chunks/ListPage-LqcmQd_Q.js.map +1 -0
- package/dist/admin/chunks/ListPage-YW-UVjk3.js +57 -0
- package/dist/admin/chunks/ListPage-YW-UVjk3.js.map +1 -0
- package/dist/admin/chunks/ListPage-gKsEm3Px.js +395 -0
- package/dist/admin/chunks/ListPage-gKsEm3Px.js.map +1 -0
- package/dist/admin/chunks/ListPage-r9rW__R8.mjs +55 -0
- package/dist/admin/chunks/ListPage-r9rW__R8.mjs.map +1 -0
- package/dist/admin/chunks/ListView-BfwBUxHL.js +276 -0
- package/dist/admin/chunks/ListView-BfwBUxHL.js.map +1 -0
- package/dist/admin/chunks/ListView-Bys8EN-y.js +278 -0
- package/dist/admin/chunks/ListView-Bys8EN-y.js.map +1 -0
- package/dist/admin/chunks/ListView-CajksON_.mjs +255 -0
- package/dist/admin/chunks/ListView-CajksON_.mjs.map +1 -0
- package/dist/admin/chunks/ListView-Q2AO0JSX.mjs +253 -0
- package/dist/admin/chunks/ListView-Q2AO0JSX.mjs.map +1 -0
- package/dist/admin/chunks/Login-5ByBaKI3.mjs +93 -0
- package/dist/admin/chunks/Login-5ByBaKI3.mjs.map +1 -0
- package/dist/admin/chunks/Login-BpEOnVbU.js +95 -0
- package/dist/admin/chunks/Login-BpEOnVbU.js.map +1 -0
- package/dist/admin/chunks/MagicLinkEE-CiQG7NL3.mjs +66 -0
- package/dist/admin/chunks/MagicLinkEE-CiQG7NL3.mjs.map +1 -0
- package/dist/admin/chunks/MagicLinkEE-a-AbOB4s.js +68 -0
- package/dist/admin/chunks/MagicLinkEE-a-AbOB4s.js.map +1 -0
- package/dist/admin/chunks/MarketplacePage-BrHNQ8SG.mjs +1134 -0
- package/dist/admin/chunks/MarketplacePage-BrHNQ8SG.mjs.map +1 -0
- package/dist/admin/chunks/MarketplacePage-my1nDaHy.js +1158 -0
- package/dist/admin/chunks/MarketplacePage-my1nDaHy.js.map +1 -0
- package/dist/admin/chunks/ModalForm-Br-NALJ0.js +26 -0
- package/dist/admin/chunks/ModalForm-Br-NALJ0.js.map +1 -0
- package/dist/admin/chunks/ModalForm-CZ98aSC9.mjs +23 -0
- package/dist/admin/chunks/ModalForm-CZ98aSC9.mjs.map +1 -0
- package/dist/admin/chunks/Ornaments-CvdERnok.js +217 -0
- package/dist/admin/chunks/Ornaments-CvdERnok.js.map +1 -0
- package/dist/admin/chunks/Ornaments-DlP663hn.mjs +212 -0
- package/dist/admin/chunks/Ornaments-DlP663hn.mjs.map +1 -0
- package/dist/admin/chunks/Permissions-C7FA_7J9.js +2285 -0
- package/dist/admin/chunks/Permissions-C7FA_7J9.js.map +1 -0
- package/dist/admin/chunks/Permissions-CuLck8vw.mjs +2264 -0
- package/dist/admin/chunks/Permissions-CuLck8vw.mjs.map +1 -0
- package/dist/admin/chunks/PrivateRoute-BYKd2yE4.mjs +18 -0
- package/dist/admin/chunks/PrivateRoute-BYKd2yE4.mjs.map +1 -0
- package/dist/admin/chunks/PrivateRoute-BnxIlIDb.js +20 -0
- package/dist/admin/chunks/PrivateRoute-BnxIlIDb.js.map +1 -0
- package/dist/admin/chunks/ProfilePage-C8zWtYzY.js +520 -0
- package/dist/admin/chunks/ProfilePage-C8zWtYzY.js.map +1 -0
- package/dist/admin/chunks/ProfilePage-Do6nPMsx.mjs +498 -0
- package/dist/admin/chunks/ProfilePage-Do6nPMsx.mjs.map +1 -0
- package/dist/admin/chunks/PurchaseAuditLogs-BTAi887h.js +89 -0
- package/dist/admin/chunks/PurchaseAuditLogs-BTAi887h.js.map +1 -0
- package/dist/admin/chunks/PurchaseAuditLogs-McvZESGI.mjs +87 -0
- package/dist/admin/chunks/PurchaseAuditLogs-McvZESGI.mjs.map +1 -0
- package/dist/admin/chunks/PurchaseContentHistory-dfepsahq.js +89 -0
- package/dist/admin/chunks/PurchaseContentHistory-dfepsahq.js.map +1 -0
- package/dist/admin/chunks/PurchaseContentHistory-pb7RDvhZ.mjs +87 -0
- package/dist/admin/chunks/PurchaseContentHistory-pb7RDvhZ.mjs.map +1 -0
- package/dist/admin/chunks/PurchaseSingleSignOn-BUB9Irlt.mjs +87 -0
- package/dist/admin/chunks/PurchaseSingleSignOn-BUB9Irlt.mjs.map +1 -0
- package/dist/admin/chunks/PurchaseSingleSignOn-Dgal5RnY.js +89 -0
- package/dist/admin/chunks/PurchaseSingleSignOn-Dgal5RnY.js.map +1 -0
- package/dist/admin/chunks/RelativeTime-ChFKZs4z.js +76 -0
- package/dist/admin/chunks/RelativeTime-ChFKZs4z.js.map +1 -0
- package/dist/admin/chunks/RelativeTime-r7oMqUVy.mjs +55 -0
- package/dist/admin/chunks/RelativeTime-r7oMqUVy.mjs.map +1 -0
- package/dist/admin/chunks/SSOProviders-BC_OI8Id.js +107 -0
- package/dist/admin/chunks/SSOProviders-BC_OI8Id.js.map +1 -0
- package/dist/admin/chunks/SSOProviders-Dw_eYbX-.mjs +105 -0
- package/dist/admin/chunks/SSOProviders-Dw_eYbX-.mjs.map +1 -0
- package/dist/admin/chunks/SelectRoles-CG3Czm0u.mjs +124 -0
- package/dist/admin/chunks/SelectRoles-CG3Czm0u.mjs.map +1 -0
- package/dist/admin/chunks/SelectRoles-Clx1_4zB.js +128 -0
- package/dist/admin/chunks/SelectRoles-Clx1_4zB.js.map +1 -0
- package/dist/admin/chunks/SingleSignOnPage-Bqn13t3u.mjs +284 -0
- package/dist/admin/chunks/SingleSignOnPage-Bqn13t3u.mjs.map +1 -0
- package/dist/admin/chunks/SingleSignOnPage-DqHWnXWQ.js +306 -0
- package/dist/admin/chunks/SingleSignOnPage-DqHWnXWQ.js.map +1 -0
- package/dist/admin/chunks/Table-BHi0q5It.js +197 -0
- package/dist/admin/chunks/Table-BHi0q5It.js.map +1 -0
- package/dist/admin/chunks/Table-Ra6bYcx7.mjs +195 -0
- package/dist/admin/chunks/Table-Ra6bYcx7.mjs.map +1 -0
- package/dist/admin/chunks/Theme-CDaBfQ-7.mjs +1762 -0
- package/dist/admin/chunks/Theme-CDaBfQ-7.mjs.map +1 -0
- package/dist/admin/chunks/Theme-CFGbtvHi.js +1831 -0
- package/dist/admin/chunks/Theme-CFGbtvHi.js.map +1 -0
- package/dist/admin/chunks/TokenTypeSelect-BIRgChNx.mjs +367 -0
- package/dist/admin/chunks/TokenTypeSelect-BIRgChNx.mjs.map +1 -0
- package/dist/admin/chunks/TokenTypeSelect-EY1WftKo.js +394 -0
- package/dist/admin/chunks/TokenTypeSelect-EY1WftKo.js.map +1 -0
- package/dist/admin/chunks/UseCasePage-Dl-WfgYc.js +260 -0
- package/dist/admin/chunks/UseCasePage-Dl-WfgYc.js.map +1 -0
- package/dist/admin/chunks/UseCasePage-Y_h0Fbiv.mjs +237 -0
- package/dist/admin/chunks/UseCasePage-Y_h0Fbiv.mjs.map +1 -0
- package/dist/admin/chunks/admin-BBS7sDVu.mjs +407 -0
- package/dist/admin/chunks/admin-BBS7sDVu.mjs.map +1 -0
- package/dist/admin/chunks/admin-udBiOv2o.js +422 -0
- package/dist/admin/chunks/admin-udBiOv2o.js.map +1 -0
- package/dist/admin/chunks/apiTokens-Bl4j4xFt.mjs +79 -0
- package/dist/admin/chunks/apiTokens-Bl4j4xFt.mjs.map +1 -0
- package/dist/admin/chunks/apiTokens-C7CY0RRl.js +85 -0
- package/dist/admin/chunks/apiTokens-C7CY0RRl.js.map +1 -0
- package/dist/admin/chunks/ar-CKlv64GT.js +851 -0
- package/dist/admin/{ar-BX4l-gGG.js.map → chunks/ar-CKlv64GT.js.map} +1 -1
- package/dist/admin/chunks/ar-DIoaNhYi.mjs +832 -0
- package/dist/admin/{ar-7vbwrPth.mjs.map → chunks/ar-DIoaNhYi.mjs.map} +1 -1
- package/dist/admin/chunks/ca-CiTVrP0z.mjs +520 -0
- package/dist/admin/{ca-f06Q0InB.mjs.map → chunks/ca-CiTVrP0z.mjs.map} +1 -1
- package/dist/admin/chunks/ca-Dro6RjTq.js +536 -0
- package/dist/admin/{ml-CzFKbt9H.js.map → chunks/ca-Dro6RjTq.js.map} +1 -1
- package/dist/admin/chunks/constants-B8oOcJBB.mjs +5 -0
- package/dist/admin/chunks/constants-B8oOcJBB.mjs.map +1 -0
- package/dist/admin/chunks/constants-DClZ3JYF.js +163 -0
- package/dist/admin/chunks/constants-DClZ3JYF.js.map +1 -0
- package/dist/admin/chunks/constants-DoArvzRr.mjs +161 -0
- package/dist/admin/chunks/constants-DoArvzRr.mjs.map +1 -0
- package/dist/admin/chunks/constants-tbFuOuW4.js +8 -0
- package/dist/admin/chunks/constants-tbFuOuW4.js.map +1 -0
- package/dist/admin/chunks/cs-CrhAArjW.js +177 -0
- package/dist/admin/{cs-DeS9DzIq.js.map → chunks/cs-CrhAArjW.js.map} +1 -1
- package/dist/admin/chunks/cs-D7xysdyX.mjs +166 -0
- package/dist/admin/{cs-DrRkodPD.mjs.map → chunks/cs-D7xysdyX.mjs.map} +1 -1
- package/dist/admin/chunks/de--2g6Hiwv.js +530 -0
- package/dist/admin/{de-CxVS71Os.js.map → chunks/de--2g6Hiwv.js.map} +1 -1
- package/dist/admin/chunks/de-BWQ7SIyM.mjs +514 -0
- package/dist/admin/{de-D0NA2abW.mjs.map → chunks/de-BWQ7SIyM.mjs.map} +1 -1
- package/dist/admin/chunks/dk-7AZJZW29.mjs +434 -0
- package/dist/admin/{ja-Cc9Dg_QK.mjs.map → chunks/dk-7AZJZW29.mjs.map} +1 -1
- package/dist/admin/chunks/dk-DlX9Yc-Z.js +450 -0
- package/dist/admin/{ko-CS08pZ0z.js.map → chunks/dk-DlX9Yc-Z.js.map} +1 -1
- package/dist/admin/chunks/en-CJjqxA2Q.js +804 -0
- package/dist/admin/{en-BR2e5qX-.js.map → chunks/en-CJjqxA2Q.js.map} +1 -1
- package/dist/admin/chunks/en-CRu3-kTC.mjs +784 -0
- package/dist/admin/{en-CSPHZKTw.mjs.map → chunks/en-CRu3-kTC.mjs.map} +1 -1
- package/dist/admin/chunks/en-GB-CMP_CCZs.js +8 -0
- package/dist/admin/chunks/en-GB-CMP_CCZs.js.map +1 -0
- package/dist/admin/chunks/en-GB-DZyWkup_.mjs +6 -0
- package/dist/admin/chunks/en-GB-DZyWkup_.mjs.map +1 -0
- package/dist/admin/chunks/es-DlUN520X.mjs +602 -0
- package/dist/admin/{es-XEfESBGO.mjs.map → chunks/es-DlUN520X.mjs.map} +1 -1
- package/dist/admin/chunks/es-qJwzbuzj.js +620 -0
- package/dist/admin/{es-CeFZcM6R.js.map → chunks/es-qJwzbuzj.js.map} +1 -1
- package/dist/admin/chunks/eu-BjPzWjP-.mjs +625 -0
- package/dist/admin/{hu-DaDd6FHR.mjs.map → chunks/eu-BjPzWjP-.mjs.map} +1 -1
- package/dist/admin/chunks/eu-DLuO9QFa.js +643 -0
- package/dist/admin/chunks/eu-DLuO9QFa.js.map +1 -0
- package/dist/admin/chunks/fr-D-lfObnF.mjs +581 -0
- package/dist/admin/{fr-CndUnB7j.mjs.map → chunks/fr-D-lfObnF.mjs.map} +1 -1
- package/dist/admin/chunks/fr-l9CvkceZ.js +601 -0
- package/dist/admin/{fr-BMaOPAWr.js.map → chunks/fr-l9CvkceZ.js.map} +1 -1
- package/dist/admin/chunks/gu-BfN4U3Q0.js +436 -0
- package/dist/admin/{gu-Hc5YzUuw.js.map → chunks/gu-BfN4U3Q0.js.map} +1 -1
- package/dist/admin/chunks/gu-DMqR9PzV.mjs +429 -0
- package/dist/admin/{gu-CSS25C49.mjs.map → chunks/gu-DMqR9PzV.mjs.map} +1 -1
- package/dist/admin/chunks/he-DQnlLpI2.js +327 -0
- package/dist/admin/chunks/he-DQnlLpI2.js.map +1 -0
- package/dist/admin/chunks/he-DfIYPy4g.mjs +315 -0
- package/dist/admin/{he-C3w9omDw.mjs.map → chunks/he-DfIYPy4g.mjs.map} +1 -1
- package/dist/admin/chunks/hi-C1bRwQm3.mjs +519 -0
- package/dist/admin/{hi-DW2CutdA.mjs.map → chunks/hi-C1bRwQm3.mjs.map} +1 -1
- package/dist/admin/chunks/hi-CAYgw5fw.js +535 -0
- package/dist/admin/{pl-Bf4D5Q8_.js.map → chunks/hi-CAYgw5fw.js.map} +1 -1
- package/dist/admin/chunks/hu-CmA0pIab.js +643 -0
- package/dist/admin/chunks/hu-CmA0pIab.js.map +1 -0
- package/dist/admin/chunks/hu-DTUInqNe.mjs +625 -0
- package/dist/admin/{eu-CDMMTSys.mjs.map → chunks/hu-DTUInqNe.mjs.map} +1 -1
- package/dist/admin/chunks/id-C69myNeZ.js +301 -0
- package/dist/admin/{id-BX77nhRG.js.map → chunks/id-C69myNeZ.js.map} +1 -1
- package/dist/admin/chunks/id-CLj6OS01.mjs +290 -0
- package/dist/admin/{id-cH3Ovozx.mjs.map → chunks/id-CLj6OS01.mjs.map} +1 -1
- package/dist/admin/chunks/index-BUGouNML.mjs +7091 -0
- package/dist/admin/chunks/index-BUGouNML.mjs.map +1 -0
- package/dist/admin/chunks/index-D7OmC33R.js +7155 -0
- package/dist/admin/chunks/index-D7OmC33R.js.map +1 -0
- package/dist/admin/chunks/it-Bn9y0UG-.js +310 -0
- package/dist/admin/{it-Br3eqqDa.js.map → chunks/it-Bn9y0UG-.js.map} +1 -1
- package/dist/admin/chunks/it-CI4iXN-s.mjs +299 -0
- package/dist/admin/{it-T1rZP3NX.mjs.map → chunks/it-CI4iXN-s.mjs.map} +1 -1
- package/dist/admin/chunks/ja-DDL7fKfX.js +450 -0
- package/dist/admin/{dk-Dy9JFy9v.js.map → chunks/ja-DDL7fKfX.js.map} +1 -1
- package/dist/admin/chunks/ja-XD0qdvmh.mjs +434 -0
- package/dist/admin/{dk-Cv0jDfcZ.mjs.map → chunks/ja-XD0qdvmh.mjs.map} +1 -1
- package/dist/admin/chunks/ko-CAChQtgZ.mjs +433 -0
- package/dist/admin/{ko-D1e-SMHS.mjs.map → chunks/ko-CAChQtgZ.mjs.map} +1 -1
- package/dist/admin/chunks/ko-C_d9Ja0b.js +449 -0
- package/dist/admin/{ja-CmifbkZD.js.map → chunks/ko-C_d9Ja0b.js.map} +1 -1
- package/dist/admin/chunks/ml-BN6g97vL.js +535 -0
- package/dist/admin/chunks/ml-BN6g97vL.js.map +1 -0
- package/dist/admin/chunks/ml-OZdE-Rdf.mjs +519 -0
- package/dist/admin/{pl-B0hZgHvQ.mjs.map → chunks/ml-OZdE-Rdf.mjs.map} +1 -1
- package/dist/admin/chunks/ms-CWDO45lu.mjs +200 -0
- package/dist/admin/{pt-8dwKSOn3.mjs.map → chunks/ms-CWDO45lu.mjs.map} +1 -1
- package/dist/admin/chunks/ms-DSUp9TXl.js +211 -0
- package/dist/admin/{pt-CEcd6cjN.js.map → chunks/ms-DSUp9TXl.js.map} +1 -1
- package/dist/admin/chunks/nl-BRq2PB1q.mjs +621 -0
- package/dist/admin/{nl-CubaFTJw.mjs.map → chunks/nl-BRq2PB1q.mjs.map} +1 -1
- package/dist/admin/chunks/nl-Bc4mZOba.js +639 -0
- package/dist/admin/{sv-BqRXfruc.js.map → chunks/nl-Bc4mZOba.js.map} +1 -1
- package/dist/admin/chunks/no-BtzfHZUH.mjs +300 -0
- package/dist/admin/{no-9TbSG07o.mjs.map → chunks/no-BtzfHZUH.mjs.map} +1 -1
- package/dist/admin/chunks/no-D0VN_ZtA.js +311 -0
- package/dist/admin/{no-DU4xtEmk.js.map → chunks/no-D0VN_ZtA.js.map} +1 -1
- package/dist/admin/chunks/pl-BsvtDLRo.mjs +519 -0
- package/dist/admin/{ml-FLft_QIc.mjs.map → chunks/pl-BsvtDLRo.mjs.map} +1 -1
- package/dist/admin/chunks/pl-D7HFG_xo.js +535 -0
- package/dist/admin/chunks/pl-D7HFG_xo.js.map +1 -0
- package/dist/admin/chunks/pt-BR-B3KKuF2p.js +606 -0
- package/dist/admin/{pt-BR-BFq-a8-C.js.map → chunks/pt-BR-B3KKuF2p.js.map} +1 -1
- package/dist/admin/chunks/pt-BR-DBqHmqA5.mjs +588 -0
- package/dist/admin/{pt-BR-BDpWvCrQ.mjs.map → chunks/pt-BR-DBqHmqA5.mjs.map} +1 -1
- package/dist/admin/chunks/pt-DCyoSDGa.js +210 -0
- package/dist/admin/{ms-C-JB0-h1.js.map → chunks/pt-DCyoSDGa.js.map} +1 -1
- package/dist/admin/chunks/pt-wKaSOdHh.mjs +200 -0
- package/dist/admin/{ms-eMDSLvhl.mjs.map → chunks/pt-wKaSOdHh.mjs.map} +1 -1
- package/dist/admin/chunks/ru-C13N1yaO.mjs +745 -0
- package/dist/admin/{ru-C34i9wJx.mjs.map → chunks/ru-C13N1yaO.mjs.map} +1 -1
- package/dist/admin/chunks/ru-Dj1oAKC7.js +764 -0
- package/dist/admin/{ru-Dwf09uUc.js.map → chunks/ru-Dj1oAKC7.js.map} +1 -1
- package/dist/admin/chunks/sa-BS5xpa-V.mjs +519 -0
- package/dist/admin/chunks/sa-BS5xpa-V.mjs.map +1 -0
- package/dist/admin/chunks/sa-ftcoOyFZ.js +535 -0
- package/dist/admin/chunks/sa-ftcoOyFZ.js.map +1 -0
- package/dist/admin/chunks/selectors-2ohXQx5g.js +13 -0
- package/dist/admin/chunks/selectors-2ohXQx5g.js.map +1 -0
- package/dist/admin/chunks/selectors-PQdhPmzv.mjs +11 -0
- package/dist/admin/chunks/selectors-PQdhPmzv.mjs.map +1 -0
- package/dist/admin/chunks/sk-BkoiGl_d.js +501 -0
- package/dist/admin/{sk-CbJVofN-.js.map → chunks/sk-BkoiGl_d.js.map} +1 -1
- package/dist/admin/chunks/sk-Yv9s7dUn.mjs +483 -0
- package/dist/admin/{sk-DQ2qpsG2.mjs.map → chunks/sk-Yv9s7dUn.mjs.map} +1 -1
- package/dist/admin/chunks/sv-CYpSsbq3.js +638 -0
- package/dist/admin/{nl-gUEC_dKT.js.map → chunks/sv-CYpSsbq3.js.map} +1 -1
- package/dist/admin/chunks/sv-CaQpgtnl.mjs +620 -0
- package/dist/admin/{sv-D0vPVUAT.mjs.map → chunks/sv-CaQpgtnl.mjs.map} +1 -1
- package/dist/admin/chunks/th-D1Raa9T5.js +295 -0
- package/dist/admin/{th-CPx6wf0M.js.map → chunks/th-D1Raa9T5.js.map} +1 -1
- package/dist/admin/chunks/th-Mav5tUMF.mjs +284 -0
- package/dist/admin/{th-BG3IOCqV.mjs.map → chunks/th-Mav5tUMF.mjs.map} +1 -1
- package/dist/admin/chunks/tr-DZnC0Jye.mjs +581 -0
- package/dist/admin/{tr-Dq45DRRZ.mjs.map → chunks/tr-DZnC0Jye.mjs.map} +1 -1
- package/dist/admin/chunks/tr-KY2E7HZC.js +599 -0
- package/dist/admin/{tr-hC_m0V8Q.js.map → chunks/tr-KY2E7HZC.js.map} +1 -1
- package/dist/admin/chunks/transferTokens-9pdM-Bum.mjs +90 -0
- package/dist/admin/chunks/transferTokens-9pdM-Bum.mjs.map +1 -0
- package/dist/admin/chunks/transferTokens-oEFM8kkT.js +97 -0
- package/dist/admin/chunks/transferTokens-oEFM8kkT.js.map +1 -0
- package/dist/admin/chunks/uk-Cb6a0PAZ.mjs +201 -0
- package/dist/admin/{uk-Ud9QNfkB.mjs.map → chunks/uk-Cb6a0PAZ.mjs.map} +1 -1
- package/dist/admin/chunks/uk-gz16FlMw.js +212 -0
- package/dist/admin/chunks/uk-gz16FlMw.js.map +1 -0
- package/dist/admin/chunks/useAdminRoles-BEmkB0uj.mjs +32 -0
- package/dist/admin/chunks/useAdminRoles-BEmkB0uj.mjs.map +1 -0
- package/dist/admin/chunks/useAdminRoles-DwDqOIvp.js +53 -0
- package/dist/admin/chunks/useAdminRoles-DwDqOIvp.js.map +1 -0
- package/dist/admin/chunks/useEnterprise-Dy8wMNV5.mjs +38 -0
- package/dist/admin/chunks/useEnterprise-Dy8wMNV5.mjs.map +1 -0
- package/dist/admin/chunks/useEnterprise-IHd3AKd2.js +59 -0
- package/dist/admin/chunks/useEnterprise-IHd3AKd2.js.map +1 -0
- package/dist/admin/chunks/useLicenseLimitNotification-BMCQ8obE.js +96 -0
- package/dist/admin/chunks/useLicenseLimitNotification-BMCQ8obE.js.map +1 -0
- package/dist/admin/chunks/useLicenseLimitNotification-CGkazzao.mjs +75 -0
- package/dist/admin/chunks/useLicenseLimitNotification-CGkazzao.mjs.map +1 -0
- package/dist/admin/chunks/useLicenseLimits-D4XBewxi.mjs +29 -0
- package/dist/admin/chunks/useLicenseLimits-D4XBewxi.mjs.map +1 -0
- package/dist/admin/chunks/useLicenseLimits-JOHH8jfL.js +50 -0
- package/dist/admin/chunks/useLicenseLimits-JOHH8jfL.js.map +1 -0
- package/dist/admin/chunks/useOnce-CCEXokcy.js +28 -0
- package/dist/admin/chunks/useOnce-CCEXokcy.js.map +1 -0
- package/dist/admin/chunks/useOnce-EHSWW7FY.mjs +7 -0
- package/dist/admin/chunks/useOnce-EHSWW7FY.mjs.map +1 -0
- package/dist/admin/chunks/useWebhooks-CROc5Uno.js +117 -0
- package/dist/admin/chunks/useWebhooks-CROc5Uno.js.map +1 -0
- package/dist/admin/chunks/useWebhooks-DzJ3X-hd.mjs +115 -0
- package/dist/admin/chunks/useWebhooks-DzJ3X-hd.mjs.map +1 -0
- package/dist/admin/chunks/users-B3iOAYG-.mjs +39 -0
- package/dist/admin/chunks/users-B3iOAYG-.mjs.map +1 -0
- package/dist/admin/chunks/users-D-oKxjK9.js +42 -0
- package/dist/admin/chunks/users-D-oKxjK9.js.map +1 -0
- package/dist/admin/chunks/validation-DOQs6_Ay.mjs +52 -0
- package/dist/admin/chunks/validation-DOQs6_Ay.mjs.map +1 -0
- package/dist/admin/chunks/validation-ECrFbJ6K.js +73 -0
- package/dist/admin/chunks/validation-ECrFbJ6K.js.map +1 -0
- package/dist/admin/chunks/vi-BsRo_l_e.js +198 -0
- package/dist/admin/{vi-UeRpPdvI.js.map → chunks/vi-BsRo_l_e.js.map} +1 -1
- package/dist/admin/chunks/vi-r6WrFGyI.mjs +187 -0
- package/dist/admin/{vi-CGrr4ioy.mjs.map → chunks/vi-r6WrFGyI.mjs.map} +1 -1
- package/dist/admin/chunks/zh-B_FImn9T.js +640 -0
- package/dist/admin/{zh-Bhpup4vu.js.map → chunks/zh-B_FImn9T.js.map} +1 -1
- package/dist/admin/chunks/zh-CIjQrG_x.mjs +622 -0
- package/dist/admin/{zh-LqPg8hbL.mjs.map → chunks/zh-CIjQrG_x.mjs.map} +1 -1
- package/dist/admin/chunks/zh-Hans-BmHHqjob.mjs +716 -0
- package/dist/admin/{zh-Hans-C44LvcXE.mjs.map → chunks/zh-Hans-BmHHqjob.mjs.map} +1 -1
- package/dist/admin/chunks/zh-Hans-Bv055w0d.js +735 -0
- package/dist/admin/{zh-Hans-BlfT-iYf.js.map → chunks/zh-Hans-Bv055w0d.js.map} +1 -1
- package/dist/admin/ee.js +9 -4
- package/dist/admin/ee.js.map +1 -1
- package/dist/admin/ee.mjs +9 -2
- package/dist/admin/ee.mjs.map +1 -1
- package/dist/admin/index.js +41 -5
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +40 -3
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/App.d.ts +2 -2
- package/dist/admin/src/StrapiApp.d.ts +2 -2
- package/dist/admin/src/components/ConfirmDialog.d.ts +1 -1
- package/dist/admin/src/components/DragLayer.d.ts +1 -1
- package/dist/admin/src/components/Filters.d.ts +2 -2
- package/dist/admin/src/components/Form.d.ts +6 -5
- package/dist/admin/src/components/FormInputs/Boolean.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/Checkbox.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/Date.d.ts +1 -1
- package/dist/admin/src/components/FormInputs/DateTime.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/Email.d.ts +3 -2
- package/dist/admin/src/components/FormInputs/Enumeration.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/Json.d.ts +1 -1
- package/dist/admin/src/components/FormInputs/Number.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/Password.d.ts +3 -2
- package/dist/admin/src/components/FormInputs/Renderer.d.ts +3 -2
- package/dist/admin/src/components/FormInputs/String.d.ts +3 -2
- package/dist/admin/src/components/FormInputs/Textarea.d.ts +3 -2
- package/dist/admin/src/components/FormInputs/Time.d.ts +2 -1
- package/dist/admin/src/components/FormInputs/types.d.ts +2 -2
- package/dist/admin/src/components/Layouts/HeaderLayout.d.ts +1 -1
- package/dist/admin/src/components/Layouts/Layout.d.ts +5 -5
- package/dist/admin/src/components/MainNav/NavLink.d.ts +1 -1
- package/dist/admin/src/components/MainNav/NavUser.d.ts +1 -1
- package/dist/admin/src/components/PageHelpers.d.ts +2 -2
- package/dist/admin/src/components/Pagination.d.ts +1 -1
- package/dist/admin/src/components/Providers.d.ts +2 -2
- package/dist/admin/src/components/RelativeTime.d.ts +1 -1
- package/dist/admin/src/components/Table.d.ts +1 -1
- package/dist/admin/src/components/Theme.d.ts +1 -1
- package/dist/admin/src/constants/filters.d.ts +2 -2
- package/dist/admin/src/constants.d.ts +1 -1
- package/dist/admin/src/core/apis/CustomFields.d.ts +2 -2
- package/dist/admin/src/core/apis/Plugin.d.ts +2 -0
- package/dist/admin/src/core/apis/rbac.d.ts +1 -1
- package/dist/admin/src/core/apis/router.d.ts +2 -2
- package/dist/admin/src/core/store/configure.d.ts +5 -5
- package/dist/admin/src/core/store/hooks.d.ts +7 -10
- package/dist/admin/src/core/utils/createHook.d.ts +1 -1
- package/dist/admin/src/features/AppInfo.d.ts +1 -1
- package/dist/admin/src/features/Auth.d.ts +2 -2
- package/dist/admin/src/features/BackButton.d.ts +2 -2
- package/dist/admin/src/features/Configuration.d.ts +2 -2
- package/dist/admin/src/features/StrapiApp.d.ts +3 -2
- package/dist/admin/src/features/Tracking.d.ts +1 -1
- package/dist/admin/src/hooks/useAPIErrorHandler.d.ts +1 -3
- package/dist/admin/src/hooks/useAdminRoles.d.ts +3 -3
- package/dist/admin/src/hooks/useContentTypes.d.ts +1 -1
- package/dist/admin/src/hooks/useElementOnScreen.d.ts +7 -0
- package/dist/admin/src/hooks/useFetchClient.d.ts +1 -1
- package/dist/admin/src/hooks/usePersistentState.d.ts +1 -1
- package/dist/admin/src/hooks/useQueryParams.d.ts +1 -1
- package/dist/admin/src/hooks/useSettingsMenu.d.ts +1 -1
- package/dist/admin/src/hooks/useThrottledCallback.d.ts +2 -1
- package/dist/admin/src/index.d.ts +3 -2
- package/dist/admin/src/layouts/UnauthenticatedLayout.d.ts +2 -2
- package/dist/admin/src/pages/Auth/components/ForgotPassword.d.ts +1 -1
- package/dist/admin/src/pages/Auth/components/Login.d.ts +1 -1
- package/dist/admin/src/pages/Auth/constants.d.ts +1 -1
- package/dist/admin/src/pages/Home/components/Widget.d.ts +1 -1
- package/dist/admin/src/pages/Marketplace/components/NpmPackageCard.d.ts +2 -2
- package/dist/admin/src/pages/Marketplace/components/NpmPackagesFilters.d.ts +2 -2
- package/dist/admin/src/pages/Marketplace/components/NpmPackagesGrid.d.ts +1 -1
- package/dist/admin/src/pages/Marketplace/components/PageHeader.d.ts +1 -1
- package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +3 -3
- package/dist/admin/src/pages/Settings/components/Tokens/FormHead.d.ts +1 -1
- package/dist/admin/src/pages/Settings/components/Tokens/LifeSpanInput.d.ts +2 -2
- package/dist/admin/src/pages/Settings/components/Tokens/Table.d.ts +1 -1
- package/dist/admin/src/pages/Settings/constants.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/apiTokenPermissions.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/FormApiTokenContainer.d.ts +2 -2
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/constants.d.ts +12 -12
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/utils/files.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +4 -3
- package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.d.ts +2 -2
- package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.d.ts +2 -2
- package/dist/admin/src/pages/Settings/pages/Roles/components/HiddenAction.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/components/Permissions.d.ts +2 -2
- package/dist/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/components/RoleForm.d.ts +2 -2
- package/dist/admin/src/pages/Settings/pages/Roles/components/RoleRow.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/components/RowLabelWithCheckbox.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.d.ts +3 -2
- package/dist/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/utils/forms.d.ts +3 -3
- package/dist/admin/src/pages/Settings/pages/Roles/utils/permissions.d.ts +2 -2
- package/dist/admin/src/pages/Settings/pages/Roles/utils/removeConditionKeyFromData.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Users/components/CreateActionCE.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Users/components/NewUserForm.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Users/utils/validation.d.ts +3 -3
- package/dist/admin/src/pages/Settings/pages/Webhooks/components/Events.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +6 -6
- package/dist/admin/src/reducer.d.ts +2 -2
- package/dist/admin/src/render.d.ts +1 -1
- package/dist/admin/src/selectors.d.ts +6 -6
- package/dist/admin/src/services/admin.d.ts +6 -6
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/apiTokens.d.ts +1 -1
- package/dist/admin/src/services/auth.d.ts +22 -22
- package/dist/admin/src/services/contentApi.d.ts +1 -1
- package/dist/admin/src/services/contentManager.d.ts +6 -2
- package/dist/admin/src/services/homepage.d.ts +2 -2
- package/dist/admin/src/services/transferTokens.d.ts +1 -1
- package/dist/admin/src/services/users.d.ts +12 -12
- package/dist/admin/src/services/webhooks.d.ts +3 -3
- package/dist/admin/src/types/adminConfiguration.d.ts +1 -1
- package/dist/admin/src/types/forms.d.ts +3 -3
- package/dist/admin/src/types/permissions.d.ts +1 -1
- package/dist/admin/src/utils/arrays.d.ts +1 -1
- package/dist/admin/src/utils/baseQuery.d.ts +1 -2
- package/dist/admin/src/utils/getFetchClient.d.ts +2 -1
- package/dist/admin/src/utils/normalizeAPIError.d.ts +1 -1
- package/dist/admin/src/utils/users.d.ts +1 -1
- package/dist/admin/test.js +2288 -35360
- package/dist/admin/test.js.map +1 -1
- package/dist/admin/test.mjs +2254 -35313
- package/dist/admin/test.mjs.map +1 -1
- package/dist/admin/tests/server.d.ts +1 -1
- package/dist/admin/tests/utils.d.ts +6 -6
- package/dist/ee/admin/src/constants.d.ts +2 -2
- package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +2 -2
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.d.ts +1 -1
- package/dist/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.d.ts +1 -1
- package/dist/ee/admin/src/pages/SettingsPage/pages/Users/components/MagicLinkEE.d.ts +1 -1
- package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
- package/dist/ee/server/src/index.d.ts +1 -1
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/server/index.js +8567 -6648
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +8747 -6815
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/services/api-token.d.ts +2 -1
- package/dist/server/src/services/api-token.d.ts.map +1 -1
- package/dist/shared/contracts/admin.d.ts +1 -1
- package/dist/shared/contracts/api-token.d.ts +1 -1
- package/dist/shared/contracts/authentication.d.ts +2 -2
- package/dist/shared/contracts/content-api.d.ts +2 -2
- package/dist/shared/contracts/content-types.d.ts +1 -1
- package/dist/shared/contracts/homepage.d.ts +2 -2
- package/dist/shared/contracts/permissions.d.ts +1 -1
- package/dist/shared/contracts/roles.d.ts +2 -2
- package/dist/shared/contracts/shared.d.ts +1 -1
- package/dist/shared/contracts/user.d.ts +2 -2
- package/dist/shared/contracts/users.d.ts +2 -2
- package/dist/shared/contracts/webhooks.d.ts +1 -1
- package/package.json +18 -15
- package/dist/admin/AdminSeatInfo-Bpyschk4.mjs +0 -92
- package/dist/admin/AdminSeatInfo-Bpyschk4.mjs.map +0 -1
- package/dist/admin/AdminSeatInfo-DJY5XfV1.js +0 -96
- package/dist/admin/AdminSeatInfo-DJY5XfV1.js.map +0 -1
- package/dist/admin/ApplicationInfoPage-BNFbKMod.mjs +0 -646
- package/dist/admin/ApplicationInfoPage-BNFbKMod.mjs.map +0 -1
- package/dist/admin/ApplicationInfoPage-CxsCNlz3.js +0 -673
- package/dist/admin/ApplicationInfoPage-CxsCNlz3.js.map +0 -1
- package/dist/admin/AuthResponse-4S-gAOdq.js +0 -85
- package/dist/admin/AuthResponse-4S-gAOdq.js.map +0 -1
- package/dist/admin/AuthResponse-BI0D7fJC.mjs +0 -61
- package/dist/admin/AuthResponse-BI0D7fJC.mjs.map +0 -1
- package/dist/admin/AuthenticatedLayout-BQ6zs92s.mjs +0 -1166
- package/dist/admin/AuthenticatedLayout-BQ6zs92s.mjs.map +0 -1
- package/dist/admin/AuthenticatedLayout-Bibgqyfz.js +0 -1198
- package/dist/admin/AuthenticatedLayout-Bibgqyfz.js.map +0 -1
- package/dist/admin/CreateActionEE-CRTFGenF.js +0 -76
- package/dist/admin/CreateActionEE-CRTFGenF.js.map +0 -1
- package/dist/admin/CreateActionEE-JUvyeAny.mjs +0 -49
- package/dist/admin/CreateActionEE-JUvyeAny.mjs.map +0 -1
- package/dist/admin/CreatePage-BmRTDEX3.js +0 -268
- package/dist/admin/CreatePage-BmRTDEX3.js.map +0 -1
- package/dist/admin/CreatePage-C-0H2K5g.mjs +0 -13
- package/dist/admin/CreatePage-C-0H2K5g.mjs.map +0 -1
- package/dist/admin/CreatePage-CfCPPYGr.mjs +0 -242
- package/dist/admin/CreatePage-CfCPPYGr.mjs.map +0 -1
- package/dist/admin/CreatePage-DpKhGTvR.js +0 -18
- package/dist/admin/CreatePage-DpKhGTvR.js.map +0 -1
- package/dist/admin/CreateView-BdFf17_R.js +0 -17
- package/dist/admin/CreateView-BdFf17_R.js.map +0 -1
- package/dist/admin/CreateView-Bi-6vB0h.mjs +0 -13
- package/dist/admin/CreateView-Bi-6vB0h.mjs.map +0 -1
- package/dist/admin/CreateView-Dz-lQ9gG.js +0 -17
- package/dist/admin/CreateView-Dz-lQ9gG.js.map +0 -1
- package/dist/admin/CreateView-w-hcufyx.mjs +0 -13
- package/dist/admin/CreateView-w-hcufyx.mjs.map +0 -1
- package/dist/admin/EditPage-9xmFGD2A.js +0 -779
- package/dist/admin/EditPage-9xmFGD2A.js.map +0 -1
- package/dist/admin/EditPage-BBYkM2hO.js +0 -298
- package/dist/admin/EditPage-BBYkM2hO.js.map +0 -1
- package/dist/admin/EditPage-BRQERWrj.js +0 -359
- package/dist/admin/EditPage-BRQERWrj.js.map +0 -1
- package/dist/admin/EditPage-CtSQnW_9.mjs +0 -330
- package/dist/admin/EditPage-CtSQnW_9.mjs.map +0 -1
- package/dist/admin/EditPage-DxEBBqUH.mjs +0 -272
- package/dist/admin/EditPage-DxEBBqUH.mjs.map +0 -1
- package/dist/admin/EditPage-oamip13J.mjs +0 -754
- package/dist/admin/EditPage-oamip13J.mjs.map +0 -1
- package/dist/admin/EditView-BFkOmHoK.js +0 -357
- package/dist/admin/EditView-BFkOmHoK.js.map +0 -1
- package/dist/admin/EditView-Bgq7xkna.mjs +0 -331
- package/dist/admin/EditView-Bgq7xkna.mjs.map +0 -1
- package/dist/admin/EditViewPage-Ct7_0esK.js +0 -873
- package/dist/admin/EditViewPage-Ct7_0esK.js.map +0 -1
- package/dist/admin/EditViewPage-DwfsUz5e.mjs +0 -841
- package/dist/admin/EditViewPage-DwfsUz5e.mjs.map +0 -1
- package/dist/admin/EventsTable-CFc2X7Gu.mjs +0 -32
- package/dist/admin/EventsTable-CFc2X7Gu.mjs.map +0 -1
- package/dist/admin/EventsTable-Oc3pUQpI.js +0 -36
- package/dist/admin/EventsTable-Oc3pUQpI.js.map +0 -1
- package/dist/admin/HomePage-BWGS-AVh.mjs +0 -351
- package/dist/admin/HomePage-BWGS-AVh.mjs.map +0 -1
- package/dist/admin/HomePage-ClG3SLWJ.mjs +0 -11
- package/dist/admin/HomePage-ClG3SLWJ.mjs.map +0 -1
- package/dist/admin/HomePage-CzT2bcqG.js +0 -15
- package/dist/admin/HomePage-CzT2bcqG.js.map +0 -1
- package/dist/admin/HomePage-DDJaUkQv.js +0 -376
- package/dist/admin/HomePage-DDJaUkQv.js.map +0 -1
- package/dist/admin/InstalledPlugins-1a_nfRNU.mjs +0 -95
- package/dist/admin/InstalledPlugins-1a_nfRNU.mjs.map +0 -1
- package/dist/admin/InstalledPlugins-CEeH8nCT.js +0 -120
- package/dist/admin/InstalledPlugins-CEeH8nCT.js.map +0 -1
- package/dist/admin/Layout-BkiVSoVM.mjs +0 -215
- package/dist/admin/Layout-BkiVSoVM.mjs.map +0 -1
- package/dist/admin/Layout-Cz4fM6uC.js +0 -242
- package/dist/admin/Layout-Cz4fM6uC.js.map +0 -1
- package/dist/admin/ListPage-B4XxPT7g.mjs +0 -355
- package/dist/admin/ListPage-B4XxPT7g.mjs.map +0 -1
- package/dist/admin/ListPage-B5HILqUc.js +0 -380
- package/dist/admin/ListPage-B5HILqUc.js.map +0 -1
- package/dist/admin/ListPage-BG9wGseD.mjs +0 -11
- package/dist/admin/ListPage-BG9wGseD.mjs.map +0 -1
- package/dist/admin/ListPage-BuiNhhwD.js +0 -581
- package/dist/admin/ListPage-BuiNhhwD.js.map +0 -1
- package/dist/admin/ListPage-CLwCdNQh.mjs +0 -271
- package/dist/admin/ListPage-CLwCdNQh.mjs.map +0 -1
- package/dist/admin/ListPage-CWZ3JRp0.js +0 -15
- package/dist/admin/ListPage-CWZ3JRp0.js.map +0 -1
- package/dist/admin/ListPage-DpdV081q.js +0 -296
- package/dist/admin/ListPage-DpdV081q.js.map +0 -1
- package/dist/admin/ListPage-DwouFFiM.js +0 -505
- package/dist/admin/ListPage-DwouFFiM.js.map +0 -1
- package/dist/admin/ListPage-jlU2BRvA.mjs +0 -553
- package/dist/admin/ListPage-jlU2BRvA.mjs.map +0 -1
- package/dist/admin/ListPage-mHBjjWxk.mjs +0 -477
- package/dist/admin/ListPage-mHBjjWxk.mjs.map +0 -1
- package/dist/admin/ListView-B1Q51h0h.js +0 -237
- package/dist/admin/ListView-B1Q51h0h.js.map +0 -1
- package/dist/admin/ListView-BDpX6eAQ.mjs +0 -211
- package/dist/admin/ListView-BDpX6eAQ.mjs.map +0 -1
- package/dist/admin/ListView-BeQRnj-r.mjs +0 -200
- package/dist/admin/ListView-BeQRnj-r.mjs.map +0 -1
- package/dist/admin/ListView-OzgfbUQV.js +0 -226
- package/dist/admin/ListView-OzgfbUQV.js.map +0 -1
- package/dist/admin/Login-BCv1wfvK.mjs +0 -31
- package/dist/admin/Login-BCv1wfvK.mjs.map +0 -1
- package/dist/admin/Login-DhUOi3iK.js +0 -35
- package/dist/admin/Login-DhUOi3iK.js.map +0 -1
- package/dist/admin/MagicLinkEE-CDJs-_17.mjs +0 -27
- package/dist/admin/MagicLinkEE-CDJs-_17.mjs.map +0 -1
- package/dist/admin/MagicLinkEE-hIIxgUj5.js +0 -31
- package/dist/admin/MagicLinkEE-hIIxgUj5.js.map +0 -1
- package/dist/admin/MarketplacePage-Bu43TEkO.mjs +0 -978
- package/dist/admin/MarketplacePage-Bu43TEkO.mjs.map +0 -1
- package/dist/admin/MarketplacePage-DCOmTT67.js +0 -1008
- package/dist/admin/MarketplacePage-DCOmTT67.js.map +0 -1
- package/dist/admin/ModalForm-B9SUkQ1l.mjs +0 -23
- package/dist/admin/ModalForm-B9SUkQ1l.mjs.map +0 -1
- package/dist/admin/ModalForm-DukjfMMw.js +0 -28
- package/dist/admin/ModalForm-DukjfMMw.js.map +0 -1
- package/dist/admin/Ornaments-BFThxr2U.mjs +0 -209
- package/dist/admin/Ornaments-BFThxr2U.mjs.map +0 -1
- package/dist/admin/Ornaments-CID1aaLv.js +0 -214
- package/dist/admin/Ornaments-CID1aaLv.js.map +0 -1
- package/dist/admin/Permissions-Cmimrby0.js +0 -2063
- package/dist/admin/Permissions-Cmimrby0.js.map +0 -1
- package/dist/admin/Permissions-gB8QZDch.mjs +0 -2027
- package/dist/admin/Permissions-gB8QZDch.mjs.map +0 -1
- package/dist/admin/PrivateRoute-DIxYvSni.mjs +0 -20
- package/dist/admin/PrivateRoute-DIxYvSni.mjs.map +0 -1
- package/dist/admin/PrivateRoute-qahg_uiu.js +0 -22
- package/dist/admin/PrivateRoute-qahg_uiu.js.map +0 -1
- package/dist/admin/ProfilePage-XSJU4odV.js +0 -415
- package/dist/admin/ProfilePage-XSJU4odV.js.map +0 -1
- package/dist/admin/ProfilePage-YEeSFVCM.mjs +0 -387
- package/dist/admin/ProfilePage-YEeSFVCM.mjs.map +0 -1
- package/dist/admin/PurchaseAuditLogs-C9ATpq0U.mjs +0 -49
- package/dist/admin/PurchaseAuditLogs-C9ATpq0U.mjs.map +0 -1
- package/dist/admin/PurchaseAuditLogs-DwJextQY.js +0 -53
- package/dist/admin/PurchaseAuditLogs-DwJextQY.js.map +0 -1
- package/dist/admin/PurchaseContentHistory-Bo4cNL6e.js +0 -56
- package/dist/admin/PurchaseContentHistory-Bo4cNL6e.js.map +0 -1
- package/dist/admin/PurchaseContentHistory-CSlvXfkJ.mjs +0 -52
- package/dist/admin/PurchaseContentHistory-CSlvXfkJ.mjs.map +0 -1
- package/dist/admin/PurchaseSingleSignOn-CGpWKCKR.js +0 -56
- package/dist/admin/PurchaseSingleSignOn-CGpWKCKR.js.map +0 -1
- package/dist/admin/PurchaseSingleSignOn-ouZ_j9iQ.mjs +0 -52
- package/dist/admin/PurchaseSingleSignOn-ouZ_j9iQ.mjs.map +0 -1
- package/dist/admin/RelativeTime-BGJ1PWx_.mjs +0 -38
- package/dist/admin/RelativeTime-BGJ1PWx_.mjs.map +0 -1
- package/dist/admin/RelativeTime-DPLD3wf-.js +0 -60
- package/dist/admin/RelativeTime-DPLD3wf-.js.map +0 -1
- package/dist/admin/SSOProviders-BD7LHrkI.mjs +0 -58
- package/dist/admin/SSOProviders-BD7LHrkI.mjs.map +0 -1
- package/dist/admin/SSOProviders-nCeEldEQ.js +0 -60
- package/dist/admin/SSOProviders-nCeEldEQ.js.map +0 -1
- package/dist/admin/SelectRoles-CZmFcyVa.js +0 -115
- package/dist/admin/SelectRoles-CZmFcyVa.js.map +0 -1
- package/dist/admin/SelectRoles-CzMLJs9Y.mjs +0 -111
- package/dist/admin/SelectRoles-CzMLJs9Y.mjs.map +0 -1
- package/dist/admin/SingleSignOnPage-B3uoGuv6.js +0 -264
- package/dist/admin/SingleSignOnPage-B3uoGuv6.js.map +0 -1
- package/dist/admin/SingleSignOnPage-B9mLzjRi.mjs +0 -239
- package/dist/admin/SingleSignOnPage-B9mLzjRi.mjs.map +0 -1
- package/dist/admin/Table-BaOtQA2D.mjs +0 -145
- package/dist/admin/Table-BaOtQA2D.mjs.map +0 -1
- package/dist/admin/Table-DSGT_hBu.js +0 -147
- package/dist/admin/Table-DSGT_hBu.js.map +0 -1
- package/dist/admin/Theme-CTMU9Z8I.mjs +0 -1434
- package/dist/admin/Theme-CTMU9Z8I.mjs.map +0 -1
- package/dist/admin/Theme-DWGZX5tv.js +0 -1513
- package/dist/admin/Theme-DWGZX5tv.js.map +0 -1
- package/dist/admin/TokenTypeSelect-C3tCUMnJ.js +0 -402
- package/dist/admin/TokenTypeSelect-C3tCUMnJ.js.map +0 -1
- package/dist/admin/TokenTypeSelect-Yo2iuaB4.mjs +0 -374
- package/dist/admin/TokenTypeSelect-Yo2iuaB4.mjs.map +0 -1
- package/dist/admin/UseCasePage-CLhPiLE6.js +0 -161
- package/dist/admin/UseCasePage-CLhPiLE6.js.map +0 -1
- package/dist/admin/UseCasePage-eBhY0DSo.mjs +0 -135
- package/dist/admin/UseCasePage-eBhY0DSo.mjs.map +0 -1
- package/dist/admin/admin-DOzK8yjX.mjs +0 -322
- package/dist/admin/admin-DOzK8yjX.mjs.map +0 -1
- package/dist/admin/admin-DRnq5SAg.js +0 -343
- package/dist/admin/admin-DRnq5SAg.js.map +0 -1
- package/dist/admin/apiTokens-ByCd8ZnO.mjs +0 -57
- package/dist/admin/apiTokens-ByCd8ZnO.mjs.map +0 -1
- package/dist/admin/apiTokens-rbJHW5Y2.js +0 -63
- package/dist/admin/apiTokens-rbJHW5Y2.js.map +0 -1
- package/dist/admin/ar-7vbwrPth.mjs +0 -832
- package/dist/admin/ar-BX4l-gGG.js +0 -853
- package/dist/admin/ca-f06Q0InB.mjs +0 -520
- package/dist/admin/ca-lypqY0nt.js +0 -538
- package/dist/admin/ca-lypqY0nt.js.map +0 -1
- package/dist/admin/constants-CRj0ViV1.mjs +0 -5
- package/dist/admin/constants-CRj0ViV1.mjs.map +0 -1
- package/dist/admin/constants-D--w8C9k.js +0 -55
- package/dist/admin/constants-D--w8C9k.js.map +0 -1
- package/dist/admin/constants-DF68OPrs.js +0 -8
- package/dist/admin/constants-DF68OPrs.js.map +0 -1
- package/dist/admin/constants-DU7oNawe.mjs +0 -51
- package/dist/admin/constants-DU7oNawe.mjs.map +0 -1
- package/dist/admin/cs-DeS9DzIq.js +0 -179
- package/dist/admin/cs-DrRkodPD.mjs +0 -166
- package/dist/admin/de-CxVS71Os.js +0 -532
- package/dist/admin/de-D0NA2abW.mjs +0 -514
- package/dist/admin/dk-Cv0jDfcZ.mjs +0 -434
- package/dist/admin/dk-Dy9JFy9v.js +0 -452
- package/dist/admin/en-BR2e5qX-.js +0 -803
- package/dist/admin/en-CSPHZKTw.mjs +0 -781
- package/dist/admin/en-GB-Bke-WrFJ.js +0 -10
- package/dist/admin/en-GB-Bke-WrFJ.js.map +0 -1
- package/dist/admin/en-GB-Gv8lAy1p.mjs +0 -6
- package/dist/admin/en-GB-Gv8lAy1p.mjs.map +0 -1
- package/dist/admin/es-CeFZcM6R.js +0 -622
- package/dist/admin/es-XEfESBGO.mjs +0 -602
- package/dist/admin/eu-CDMMTSys.mjs +0 -625
- package/dist/admin/eu-CTGdmY94.js +0 -645
- package/dist/admin/eu-CTGdmY94.js.map +0 -1
- package/dist/admin/fr-BMaOPAWr.js +0 -601
- package/dist/admin/fr-CndUnB7j.mjs +0 -579
- package/dist/admin/gu-CSS25C49.mjs +0 -429
- package/dist/admin/gu-Hc5YzUuw.js +0 -438
- package/dist/admin/he-C3w9omDw.mjs +0 -315
- package/dist/admin/he-kuscdOPI.js +0 -329
- package/dist/admin/he-kuscdOPI.js.map +0 -1
- package/dist/admin/hi-ChZ-xy57.js +0 -537
- package/dist/admin/hi-ChZ-xy57.js.map +0 -1
- package/dist/admin/hi-DW2CutdA.mjs +0 -519
- package/dist/admin/hu-DaDd6FHR.mjs +0 -625
- package/dist/admin/hu-lwp6bYbA.js +0 -645
- package/dist/admin/hu-lwp6bYbA.js.map +0 -1
- package/dist/admin/id-BX77nhRG.js +0 -303
- package/dist/admin/id-cH3Ovozx.mjs +0 -290
- package/dist/admin/index-DLbx6g-v.js +0 -5465
- package/dist/admin/index-DLbx6g-v.js.map +0 -1
- package/dist/admin/index-DoNaXvrg.mjs +0 -5391
- package/dist/admin/index-DoNaXvrg.mjs.map +0 -1
- package/dist/admin/it-Br3eqqDa.js +0 -312
- package/dist/admin/it-T1rZP3NX.mjs +0 -299
- package/dist/admin/ja-Cc9Dg_QK.mjs +0 -434
- package/dist/admin/ja-CmifbkZD.js +0 -452
- package/dist/admin/ko-CS08pZ0z.js +0 -451
- package/dist/admin/ko-D1e-SMHS.mjs +0 -433
- package/dist/admin/ml-CzFKbt9H.js +0 -537
- package/dist/admin/ml-FLft_QIc.mjs +0 -519
- package/dist/admin/ms-C-JB0-h1.js +0 -213
- package/dist/admin/ms-eMDSLvhl.mjs +0 -200
- package/dist/admin/nl-CubaFTJw.mjs +0 -621
- package/dist/admin/nl-gUEC_dKT.js +0 -641
- package/dist/admin/no-9TbSG07o.mjs +0 -300
- package/dist/admin/no-DU4xtEmk.js +0 -313
- package/dist/admin/pl-B0hZgHvQ.mjs +0 -519
- package/dist/admin/pl-Bf4D5Q8_.js +0 -537
- package/dist/admin/pt-8dwKSOn3.mjs +0 -200
- package/dist/admin/pt-BR-BDpWvCrQ.mjs +0 -588
- package/dist/admin/pt-BR-BFq-a8-C.js +0 -608
- package/dist/admin/pt-CEcd6cjN.js +0 -212
- package/dist/admin/ru-C34i9wJx.mjs +0 -745
- package/dist/admin/ru-Dwf09uUc.js +0 -766
- package/dist/admin/sa--UlKNdfY.js +0 -537
- package/dist/admin/sa--UlKNdfY.js.map +0 -1
- package/dist/admin/sa-CHD-r_h-.mjs +0 -519
- package/dist/admin/sa-CHD-r_h-.mjs.map +0 -1
- package/dist/admin/selectors-BZApelK9.mjs +0 -6
- package/dist/admin/selectors-BZApelK9.mjs.map +0 -1
- package/dist/admin/selectors-BhMLvxvP.js +0 -8
- package/dist/admin/selectors-BhMLvxvP.js.map +0 -1
- package/dist/admin/sk-CbJVofN-.js +0 -503
- package/dist/admin/sk-DQ2qpsG2.mjs +0 -483
- package/dist/admin/sv-BqRXfruc.js +0 -640
- package/dist/admin/sv-D0vPVUAT.mjs +0 -620
- package/dist/admin/th-BG3IOCqV.mjs +0 -284
- package/dist/admin/th-CPx6wf0M.js +0 -297
- package/dist/admin/tr-Dq45DRRZ.mjs +0 -581
- package/dist/admin/tr-hC_m0V8Q.js +0 -601
- package/dist/admin/transferTokens-AcbwoJPr.js +0 -76
- package/dist/admin/transferTokens-AcbwoJPr.js.map +0 -1
- package/dist/admin/transferTokens-CQP13miB.mjs +0 -69
- package/dist/admin/transferTokens-CQP13miB.mjs.map +0 -1
- package/dist/admin/uk-DHmepDW6.js +0 -214
- package/dist/admin/uk-DHmepDW6.js.map +0 -1
- package/dist/admin/uk-Ud9QNfkB.mjs +0 -201
- package/dist/admin/useAdminRoles-DWhky7Ix.mjs +0 -28
- package/dist/admin/useAdminRoles-DWhky7Ix.mjs.map +0 -1
- package/dist/admin/useAdminRoles-rz3j-u2R.js +0 -50
- package/dist/admin/useAdminRoles-rz3j-u2R.js.map +0 -1
- package/dist/admin/useEnterprise-BGzVPL4w.mjs +0 -28
- package/dist/admin/useEnterprise-BGzVPL4w.mjs.map +0 -1
- package/dist/admin/useEnterprise-ijNnK53J.js +0 -50
- package/dist/admin/useEnterprise-ijNnK53J.js.map +0 -1
- package/dist/admin/useLicenseLimitNotification-CAQIrlP4.mjs +0 -80
- package/dist/admin/useLicenseLimitNotification-CAQIrlP4.mjs.map +0 -1
- package/dist/admin/useLicenseLimitNotification-bcc8RZRX.js +0 -105
- package/dist/admin/useLicenseLimitNotification-bcc8RZRX.js.map +0 -1
- package/dist/admin/useLicenseLimits-73hrs_pV.js +0 -45
- package/dist/admin/useLicenseLimits-73hrs_pV.js.map +0 -1
- package/dist/admin/useLicenseLimits-CcOoSJ8p.mjs +0 -23
- package/dist/admin/useLicenseLimits-CcOoSJ8p.mjs.map +0 -1
- package/dist/admin/useOnce-C7EQufL3.js +0 -29
- package/dist/admin/useOnce-C7EQufL3.js.map +0 -1
- package/dist/admin/useOnce-NHeEacbN.mjs +0 -7
- package/dist/admin/useOnce-NHeEacbN.mjs.map +0 -1
- package/dist/admin/useWebhooks-PMmtSF2F.mjs +0 -93
- package/dist/admin/useWebhooks-PMmtSF2F.mjs.map +0 -1
- package/dist/admin/useWebhooks-oYy_qRlY.js +0 -95
- package/dist/admin/useWebhooks-oYy_qRlY.js.map +0 -1
- package/dist/admin/users-8N93LH7R.mjs +0 -30
- package/dist/admin/users-8N93LH7R.mjs.map +0 -1
- package/dist/admin/users-DaPfjlwf.js +0 -33
- package/dist/admin/users-DaPfjlwf.js.map +0 -1
- package/dist/admin/validation-ABNr-9R6.js +0 -65
- package/dist/admin/validation-ABNr-9R6.js.map +0 -1
- package/dist/admin/validation-Zw14C1gy.mjs +0 -43
- package/dist/admin/validation-Zw14C1gy.mjs.map +0 -1
- package/dist/admin/vi-CGrr4ioy.mjs +0 -187
- package/dist/admin/vi-UeRpPdvI.js +0 -200
- package/dist/admin/zh-Bhpup4vu.js +0 -642
- package/dist/admin/zh-Hans-BlfT-iYf.js +0 -737
- package/dist/admin/zh-Hans-C44LvcXE.mjs +0 -716
- package/dist/admin/zh-LqPg8hbL.mjs +0 -622
- package/dist/package.json.d.ts +0 -193
|
@@ -0,0 +1,1762 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { useMemo, useCallback, useRef, useEffect } from 'react';
|
|
4
|
+
import { createContext as createContext$1 } from '@radix-ui/react-context';
|
|
5
|
+
import { useIntl, IntlProvider } from 'react-intl';
|
|
6
|
+
import { Flex, useCallbackRef, Alert, Link, Main, Loader, EmptyStateLayout, Box, DesignSystemProvider } from '@strapi/design-system';
|
|
7
|
+
import { WarningCircle } from '@strapi/icons';
|
|
8
|
+
import { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';
|
|
9
|
+
import { useLocation, useNavigate } from 'react-router-dom';
|
|
10
|
+
import { parse, stringify } from 'qs';
|
|
11
|
+
import { a as adminApi, e as useInitQuery, f as useTelemetryPropertiesQuery, g as useProjectSettingsQuery, h as useUpdateProjectSettingsMutation } from './admin-BBS7sDVu.mjs';
|
|
12
|
+
import clone from 'lodash/clone';
|
|
13
|
+
import toPath from 'lodash/toPath';
|
|
14
|
+
import isEqual from 'lodash/isEqual';
|
|
15
|
+
import axios from 'axios';
|
|
16
|
+
import { produce } from 'immer';
|
|
17
|
+
import get from 'lodash/get';
|
|
18
|
+
import set from 'lodash/set';
|
|
19
|
+
import * as ContextSelector from 'use-context-selector';
|
|
20
|
+
import defaultsDeep from 'lodash/defaultsDeep';
|
|
21
|
+
import { useStore, useDispatch, useSelector } from 'react-redux';
|
|
22
|
+
import { createGlobalStyle } from 'styled-components';
|
|
23
|
+
import { createSelector, createSlice } from '@reduxjs/toolkit';
|
|
24
|
+
|
|
25
|
+
class RBAC {
|
|
26
|
+
use(middleware) {
|
|
27
|
+
if (Array.isArray(middleware)) {
|
|
28
|
+
this.middlewares.push(...middleware);
|
|
29
|
+
} else {
|
|
30
|
+
this.middlewares.push(middleware);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
constructor(){
|
|
34
|
+
this.middlewares = [];
|
|
35
|
+
this.run = async (ctx, permissions)=>{
|
|
36
|
+
let index = 0;
|
|
37
|
+
const middlewaresToRun = this.middlewares.map((middleware)=>middleware(ctx));
|
|
38
|
+
const next = async (permissions)=>{
|
|
39
|
+
if (index < this.middlewares.length) {
|
|
40
|
+
return middlewaresToRun[index++](next)(permissions);
|
|
41
|
+
}
|
|
42
|
+
return permissions;
|
|
43
|
+
};
|
|
44
|
+
return next(permissions);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @experimental
|
|
51
|
+
* @description Create a context provider and a hook to consume the context.
|
|
52
|
+
*
|
|
53
|
+
* @warning this may be removed to the design-system instead of becoming stable.
|
|
54
|
+
*/ function createContext(rootComponentName, defaultContext) {
|
|
55
|
+
const Context = ContextSelector.createContext(defaultContext);
|
|
56
|
+
const Provider = (props)=>{
|
|
57
|
+
const { children, ...context } = props;
|
|
58
|
+
// Only re-memoize when prop values change
|
|
59
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
60
|
+
const value = React.useMemo(()=>context, Object.values(context));
|
|
61
|
+
return /*#__PURE__*/ jsx(Context.Provider, {
|
|
62
|
+
value: value,
|
|
63
|
+
children: children
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
function useContext(consumerName, selector) {
|
|
67
|
+
return ContextSelector.useContextSelector(Context, (ctx)=>{
|
|
68
|
+
if (ctx) return selector(ctx);
|
|
69
|
+
// it's a required context.
|
|
70
|
+
throw new Error(`\`${consumerName}\` must be used within \`${rootComponentName}\``);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
Provider.displayName = rootComponentName + 'Provider';
|
|
74
|
+
return [
|
|
75
|
+
Provider,
|
|
76
|
+
useContext
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const useTypedDispatch = useDispatch;
|
|
81
|
+
const useTypedStore = useStore;
|
|
82
|
+
const useTypedSelector = useSelector;
|
|
83
|
+
const createTypedSelector = (selector)=>createSelector((state)=>state, selector);
|
|
84
|
+
|
|
85
|
+
const [StrapiAppProvider, useStrapiApp] = createContext('StrapiApp');
|
|
86
|
+
|
|
87
|
+
const useQueryParams = (initialParams)=>{
|
|
88
|
+
const { search } = useLocation();
|
|
89
|
+
const navigate = useNavigate();
|
|
90
|
+
const query = useMemo(()=>{
|
|
91
|
+
// TODO: investigate why sometimes we're getting the search with a leading `?` and sometimes not.
|
|
92
|
+
const searchQuery = search.startsWith('?') ? search.slice(1) : search;
|
|
93
|
+
if (!search && initialParams) {
|
|
94
|
+
return initialParams;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
...initialParams,
|
|
98
|
+
...parse(searchQuery)
|
|
99
|
+
};
|
|
100
|
+
}, [
|
|
101
|
+
search,
|
|
102
|
+
initialParams
|
|
103
|
+
]);
|
|
104
|
+
const setQuery = useCallback((nextParams, method = 'push', replace = false)=>{
|
|
105
|
+
let nextQuery = {
|
|
106
|
+
...query
|
|
107
|
+
};
|
|
108
|
+
if (method === 'remove') {
|
|
109
|
+
Object.keys(nextParams).forEach((key)=>{
|
|
110
|
+
if (Object.prototype.hasOwnProperty.call(nextQuery, key)) {
|
|
111
|
+
// @ts-expect-error – this is fine, if you want to fix it, please do.
|
|
112
|
+
delete nextQuery[key];
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
} else {
|
|
116
|
+
nextQuery = {
|
|
117
|
+
...query,
|
|
118
|
+
...nextParams
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
navigate({
|
|
122
|
+
search: stringify(nextQuery, {
|
|
123
|
+
encode: false
|
|
124
|
+
})
|
|
125
|
+
}, {
|
|
126
|
+
replace
|
|
127
|
+
});
|
|
128
|
+
}, [
|
|
129
|
+
navigate,
|
|
130
|
+
query
|
|
131
|
+
]);
|
|
132
|
+
return [
|
|
133
|
+
{
|
|
134
|
+
query,
|
|
135
|
+
rawQuery: search
|
|
136
|
+
},
|
|
137
|
+
setQuery
|
|
138
|
+
];
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
const STORAGE_KEYS$1 = {
|
|
142
|
+
TOKEN: 'jwtToken',
|
|
143
|
+
USER: 'userInfo'
|
|
144
|
+
};
|
|
145
|
+
const THEME_LOCAL_STORAGE_KEY = 'STRAPI_THEME';
|
|
146
|
+
const LANGUAGE_LOCAL_STORAGE_KEY = 'strapi-admin-language';
|
|
147
|
+
const getStoredToken = ()=>{
|
|
148
|
+
const token = localStorage.getItem(STORAGE_KEYS$1.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS$1.TOKEN);
|
|
149
|
+
if (typeof token === 'string') {
|
|
150
|
+
return JSON.parse(token);
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
};
|
|
154
|
+
const adminSlice = createSlice({
|
|
155
|
+
name: 'admin',
|
|
156
|
+
initialState: ()=>{
|
|
157
|
+
return {
|
|
158
|
+
language: {
|
|
159
|
+
locale: 'en',
|
|
160
|
+
localeNames: {
|
|
161
|
+
en: 'English'
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
permissions: {},
|
|
165
|
+
theme: {
|
|
166
|
+
availableThemes: [],
|
|
167
|
+
currentTheme: localStorage.getItem(THEME_LOCAL_STORAGE_KEY) || 'system'
|
|
168
|
+
},
|
|
169
|
+
token: null
|
|
170
|
+
};
|
|
171
|
+
},
|
|
172
|
+
reducers: {
|
|
173
|
+
setAppTheme (state, action) {
|
|
174
|
+
state.theme.currentTheme = action.payload;
|
|
175
|
+
window.localStorage.setItem(THEME_LOCAL_STORAGE_KEY, action.payload);
|
|
176
|
+
},
|
|
177
|
+
setAvailableThemes (state, action) {
|
|
178
|
+
state.theme.availableThemes = action.payload;
|
|
179
|
+
},
|
|
180
|
+
setLocale (state, action) {
|
|
181
|
+
state.language.locale = action.payload;
|
|
182
|
+
window.localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, action.payload);
|
|
183
|
+
document.documentElement.setAttribute('lang', action.payload);
|
|
184
|
+
},
|
|
185
|
+
setToken (state, action) {
|
|
186
|
+
state.token = action.payload;
|
|
187
|
+
},
|
|
188
|
+
login (state, action) {
|
|
189
|
+
const { token, persist } = action.payload;
|
|
190
|
+
if (!persist) {
|
|
191
|
+
window.sessionStorage.setItem(STORAGE_KEYS$1.TOKEN, JSON.stringify(token));
|
|
192
|
+
} else {
|
|
193
|
+
window.localStorage.setItem(STORAGE_KEYS$1.TOKEN, JSON.stringify(token));
|
|
194
|
+
}
|
|
195
|
+
state.token = token;
|
|
196
|
+
},
|
|
197
|
+
logout (state) {
|
|
198
|
+
state.token = null;
|
|
199
|
+
window.localStorage.removeItem(STORAGE_KEYS$1.TOKEN);
|
|
200
|
+
window.localStorage.removeItem(STORAGE_KEYS$1.USER);
|
|
201
|
+
window.sessionStorage.removeItem(STORAGE_KEYS$1.TOKEN);
|
|
202
|
+
window.sessionStorage.removeItem(STORAGE_KEYS$1.USER);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
const reducer$1 = adminSlice.reducer;
|
|
207
|
+
const { setAppTheme, setAvailableThemes, setLocale, setToken, logout, login } = adminSlice.actions;
|
|
208
|
+
|
|
209
|
+
const authService = adminApi.enhanceEndpoints({
|
|
210
|
+
addTagTypes: [
|
|
211
|
+
'User',
|
|
212
|
+
'Me',
|
|
213
|
+
'ProvidersOptions'
|
|
214
|
+
]
|
|
215
|
+
}).injectEndpoints({
|
|
216
|
+
endpoints: (builder)=>({
|
|
217
|
+
/**
|
|
218
|
+
* ME
|
|
219
|
+
*/ getMe: builder.query({
|
|
220
|
+
query: ()=>({
|
|
221
|
+
method: 'GET',
|
|
222
|
+
url: '/admin/users/me'
|
|
223
|
+
}),
|
|
224
|
+
transformResponse (res) {
|
|
225
|
+
return res.data;
|
|
226
|
+
},
|
|
227
|
+
providesTags: (res)=>res ? [
|
|
228
|
+
'Me',
|
|
229
|
+
{
|
|
230
|
+
type: 'User',
|
|
231
|
+
id: res.id
|
|
232
|
+
}
|
|
233
|
+
] : [
|
|
234
|
+
'Me'
|
|
235
|
+
]
|
|
236
|
+
}),
|
|
237
|
+
getMyPermissions: builder.query({
|
|
238
|
+
query: ()=>({
|
|
239
|
+
method: 'GET',
|
|
240
|
+
url: '/admin/users/me/permissions'
|
|
241
|
+
}),
|
|
242
|
+
transformResponse (res) {
|
|
243
|
+
return res.data;
|
|
244
|
+
}
|
|
245
|
+
}),
|
|
246
|
+
updateMe: builder.mutation({
|
|
247
|
+
query: (body)=>({
|
|
248
|
+
method: 'PUT',
|
|
249
|
+
url: '/admin/users/me',
|
|
250
|
+
data: body
|
|
251
|
+
}),
|
|
252
|
+
transformResponse (res) {
|
|
253
|
+
return res.data;
|
|
254
|
+
},
|
|
255
|
+
invalidatesTags: [
|
|
256
|
+
'Me'
|
|
257
|
+
]
|
|
258
|
+
}),
|
|
259
|
+
/**
|
|
260
|
+
* Permissions
|
|
261
|
+
*/ checkPermissions: builder.query({
|
|
262
|
+
query: (permissions)=>({
|
|
263
|
+
method: 'POST',
|
|
264
|
+
url: '/admin/permissions/check',
|
|
265
|
+
data: permissions
|
|
266
|
+
})
|
|
267
|
+
}),
|
|
268
|
+
/**
|
|
269
|
+
* Auth methods
|
|
270
|
+
*/ login: builder.mutation({
|
|
271
|
+
query: (body)=>({
|
|
272
|
+
method: 'POST',
|
|
273
|
+
url: '/admin/login',
|
|
274
|
+
data: body
|
|
275
|
+
}),
|
|
276
|
+
transformResponse (res) {
|
|
277
|
+
return res.data;
|
|
278
|
+
},
|
|
279
|
+
invalidatesTags: [
|
|
280
|
+
'Me'
|
|
281
|
+
]
|
|
282
|
+
}),
|
|
283
|
+
logout: builder.mutation({
|
|
284
|
+
query: ()=>({
|
|
285
|
+
method: 'POST',
|
|
286
|
+
url: '/admin/logout'
|
|
287
|
+
})
|
|
288
|
+
}),
|
|
289
|
+
resetPassword: builder.mutation({
|
|
290
|
+
query: (body)=>({
|
|
291
|
+
method: 'POST',
|
|
292
|
+
url: '/admin/reset-password',
|
|
293
|
+
data: body
|
|
294
|
+
}),
|
|
295
|
+
transformResponse (res) {
|
|
296
|
+
return res.data;
|
|
297
|
+
}
|
|
298
|
+
}),
|
|
299
|
+
renewToken: builder.mutation({
|
|
300
|
+
query: (body)=>({
|
|
301
|
+
method: 'POST',
|
|
302
|
+
url: '/admin/renew-token',
|
|
303
|
+
data: body
|
|
304
|
+
}),
|
|
305
|
+
transformResponse (res) {
|
|
306
|
+
return res.data;
|
|
307
|
+
}
|
|
308
|
+
}),
|
|
309
|
+
getRegistrationInfo: builder.query({
|
|
310
|
+
query: (registrationToken)=>({
|
|
311
|
+
url: '/admin/registration-info',
|
|
312
|
+
method: 'GET',
|
|
313
|
+
config: {
|
|
314
|
+
params: {
|
|
315
|
+
registrationToken
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}),
|
|
319
|
+
transformResponse (res) {
|
|
320
|
+
return res.data;
|
|
321
|
+
}
|
|
322
|
+
}),
|
|
323
|
+
registerAdmin: builder.mutation({
|
|
324
|
+
query: (body)=>({
|
|
325
|
+
method: 'POST',
|
|
326
|
+
url: '/admin/register-admin',
|
|
327
|
+
data: body
|
|
328
|
+
}),
|
|
329
|
+
transformResponse (res) {
|
|
330
|
+
return res.data;
|
|
331
|
+
}
|
|
332
|
+
}),
|
|
333
|
+
registerUser: builder.mutation({
|
|
334
|
+
query: (body)=>({
|
|
335
|
+
method: 'POST',
|
|
336
|
+
url: '/admin/register',
|
|
337
|
+
data: body
|
|
338
|
+
}),
|
|
339
|
+
transformResponse (res) {
|
|
340
|
+
return res.data;
|
|
341
|
+
}
|
|
342
|
+
}),
|
|
343
|
+
forgotPassword: builder.mutation({
|
|
344
|
+
query: (body)=>({
|
|
345
|
+
url: '/admin/forgot-password',
|
|
346
|
+
method: 'POST',
|
|
347
|
+
data: body
|
|
348
|
+
})
|
|
349
|
+
}),
|
|
350
|
+
isSSOLocked: builder.query({
|
|
351
|
+
query: ()=>({
|
|
352
|
+
url: '/admin/providers/isSSOLocked',
|
|
353
|
+
method: 'GET'
|
|
354
|
+
}),
|
|
355
|
+
transformResponse (res) {
|
|
356
|
+
return res.data;
|
|
357
|
+
}
|
|
358
|
+
}),
|
|
359
|
+
getProviders: builder.query({
|
|
360
|
+
query: ()=>({
|
|
361
|
+
url: '/admin/providers',
|
|
362
|
+
method: 'GET'
|
|
363
|
+
})
|
|
364
|
+
}),
|
|
365
|
+
getProviderOptions: builder.query({
|
|
366
|
+
query: ()=>({
|
|
367
|
+
url: '/admin/providers/options',
|
|
368
|
+
method: 'GET'
|
|
369
|
+
}),
|
|
370
|
+
transformResponse (res) {
|
|
371
|
+
return res.data;
|
|
372
|
+
},
|
|
373
|
+
providesTags: [
|
|
374
|
+
'ProvidersOptions'
|
|
375
|
+
]
|
|
376
|
+
}),
|
|
377
|
+
updateProviderOptions: builder.mutation({
|
|
378
|
+
query: (body)=>({
|
|
379
|
+
url: '/admin/providers/options',
|
|
380
|
+
method: 'PUT',
|
|
381
|
+
data: body
|
|
382
|
+
}),
|
|
383
|
+
transformResponse (res) {
|
|
384
|
+
return res.data;
|
|
385
|
+
},
|
|
386
|
+
invalidatesTags: [
|
|
387
|
+
'ProvidersOptions'
|
|
388
|
+
]
|
|
389
|
+
})
|
|
390
|
+
}),
|
|
391
|
+
overrideExisting: false
|
|
392
|
+
});
|
|
393
|
+
const { useCheckPermissionsQuery, useLazyCheckPermissionsQuery, useGetMeQuery, useLoginMutation, useRenewTokenMutation, useLogoutMutation, useUpdateMeMutation, useResetPasswordMutation, useRegisterAdminMutation, useRegisterUserMutation, useGetRegistrationInfoQuery, useForgotPasswordMutation, useGetMyPermissionsQuery, useIsSSOLockedQuery, useGetProvidersQuery, useGetProviderOptionsQuery, useUpdateProviderOptionsMutation } = authService;
|
|
394
|
+
|
|
395
|
+
const [Provider, useAuth] = createContext('Auth');
|
|
396
|
+
const STORAGE_KEYS = {
|
|
397
|
+
TOKEN: 'jwtToken',
|
|
398
|
+
USER: 'userInfo'
|
|
399
|
+
};
|
|
400
|
+
const AuthProvider = ({ children, _defaultPermissions = [], _disableRenewToken = false })=>{
|
|
401
|
+
const dispatch = useTypedDispatch();
|
|
402
|
+
const runRbacMiddleware = useStrapiApp('AuthProvider', (state)=>state.rbac.run);
|
|
403
|
+
const location = useLocation();
|
|
404
|
+
const [{ rawQuery }] = useQueryParams();
|
|
405
|
+
const token = useTypedSelector((state)=>state.admin_app.token ?? null);
|
|
406
|
+
const { data: user, isLoading: isLoadingUser } = useGetMeQuery(undefined, {
|
|
407
|
+
/**
|
|
408
|
+
* If there's no token, we don't try to fetch
|
|
409
|
+
* the user data because it will fail.
|
|
410
|
+
*/ skip: !token
|
|
411
|
+
});
|
|
412
|
+
const { data: userPermissions = _defaultPermissions, refetch, isUninitialized, isLoading: isLoadingPermissions } = useGetMyPermissionsQuery(undefined, {
|
|
413
|
+
skip: !token
|
|
414
|
+
});
|
|
415
|
+
const navigate = useNavigate();
|
|
416
|
+
const [loginMutation] = useLoginMutation();
|
|
417
|
+
const [renewTokenMutation] = useRenewTokenMutation();
|
|
418
|
+
const [logoutMutation] = useLogoutMutation();
|
|
419
|
+
const clearStateAndLogout = React.useCallback(()=>{
|
|
420
|
+
dispatch(adminApi.util.resetApiState());
|
|
421
|
+
dispatch(logout());
|
|
422
|
+
navigate('/auth/login');
|
|
423
|
+
}, [
|
|
424
|
+
dispatch,
|
|
425
|
+
navigate
|
|
426
|
+
]);
|
|
427
|
+
/**
|
|
428
|
+
* Fetch data from storages on mount and store it in our state.
|
|
429
|
+
* It's not normally stored in session storage unless the user
|
|
430
|
+
* does click "remember me" when they login. We also need to renew the token.
|
|
431
|
+
*/ React.useEffect(()=>{
|
|
432
|
+
if (token && !_disableRenewToken) {
|
|
433
|
+
renewTokenMutation({
|
|
434
|
+
token
|
|
435
|
+
}).then((res)=>{
|
|
436
|
+
if ('data' in res) {
|
|
437
|
+
dispatch(login({
|
|
438
|
+
token: res.data.token
|
|
439
|
+
}));
|
|
440
|
+
} else {
|
|
441
|
+
clearStateAndLogout();
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
}, [
|
|
446
|
+
token,
|
|
447
|
+
dispatch,
|
|
448
|
+
renewTokenMutation,
|
|
449
|
+
clearStateAndLogout,
|
|
450
|
+
_disableRenewToken
|
|
451
|
+
]);
|
|
452
|
+
React.useEffect(()=>{
|
|
453
|
+
if (user) {
|
|
454
|
+
if (user.preferedLanguage) {
|
|
455
|
+
dispatch(setLocale(user.preferedLanguage));
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}, [
|
|
459
|
+
dispatch,
|
|
460
|
+
user
|
|
461
|
+
]);
|
|
462
|
+
React.useEffect(()=>{
|
|
463
|
+
/**
|
|
464
|
+
* This will log a user out of all tabs if they log out in one tab.
|
|
465
|
+
*/ const handleUserStorageChange = (event)=>{
|
|
466
|
+
if (event.key === STORAGE_KEYS.USER && event.newValue === null) {
|
|
467
|
+
clearStateAndLogout();
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
window.addEventListener('storage', handleUserStorageChange);
|
|
471
|
+
return ()=>{
|
|
472
|
+
window.removeEventListener('storage', handleUserStorageChange);
|
|
473
|
+
};
|
|
474
|
+
});
|
|
475
|
+
const login$1 = React.useCallback(async ({ rememberMe, ...body })=>{
|
|
476
|
+
const res = await loginMutation(body);
|
|
477
|
+
/**
|
|
478
|
+
* There will always be a `data` key in the response
|
|
479
|
+
* because if something fails, it will throw an error.
|
|
480
|
+
*/ if ('data' in res) {
|
|
481
|
+
const { token } = res.data;
|
|
482
|
+
dispatch(login({
|
|
483
|
+
token,
|
|
484
|
+
persist: rememberMe
|
|
485
|
+
}));
|
|
486
|
+
}
|
|
487
|
+
return res;
|
|
488
|
+
}, [
|
|
489
|
+
dispatch,
|
|
490
|
+
loginMutation
|
|
491
|
+
]);
|
|
492
|
+
const logout$1 = React.useCallback(async ()=>{
|
|
493
|
+
await logoutMutation();
|
|
494
|
+
clearStateAndLogout();
|
|
495
|
+
}, [
|
|
496
|
+
clearStateAndLogout,
|
|
497
|
+
logoutMutation
|
|
498
|
+
]);
|
|
499
|
+
const refetchPermissions = React.useCallback(async ()=>{
|
|
500
|
+
if (!isUninitialized) {
|
|
501
|
+
await refetch();
|
|
502
|
+
}
|
|
503
|
+
}, [
|
|
504
|
+
isUninitialized,
|
|
505
|
+
refetch
|
|
506
|
+
]);
|
|
507
|
+
const [checkPermissions] = useLazyCheckPermissionsQuery();
|
|
508
|
+
const checkUserHasPermissions = React.useCallback(async (permissions, passedPermissions, // TODO:
|
|
509
|
+
// Here we have parameterised checkUserHasPermissions in order to pass
|
|
510
|
+
// query context from elsewhere in the application.
|
|
511
|
+
// See packages/core/content-manager/admin/src/features/DocumentRBAC.tsx
|
|
512
|
+
// This is in order to calculate permissions on accurate query params.
|
|
513
|
+
// We should be able to rely on the query params in this provider
|
|
514
|
+
// If we need to pass additional context to the RBAC middleware
|
|
515
|
+
// we should define a better context type.
|
|
516
|
+
rawQueryContext)=>{
|
|
517
|
+
/**
|
|
518
|
+
* If there's no permissions to check, then we allow it to
|
|
519
|
+
* pass to preserve existing behaviours.
|
|
520
|
+
*
|
|
521
|
+
* TODO: should we review this? it feels more dangerous than useful.
|
|
522
|
+
*/ if (!permissions || permissions.length === 0) {
|
|
523
|
+
return [
|
|
524
|
+
{
|
|
525
|
+
action: '',
|
|
526
|
+
subject: ''
|
|
527
|
+
}
|
|
528
|
+
];
|
|
529
|
+
}
|
|
530
|
+
/**
|
|
531
|
+
* Given the provided permissions, return the permissions from either passedPermissions
|
|
532
|
+
* or userPermissions as this is expected to be the full permission entity.
|
|
533
|
+
*/ const actualUserPermissions = passedPermissions ?? userPermissions;
|
|
534
|
+
const matchingPermissions = actualUserPermissions.filter((permission)=>permissions.findIndex((perm)=>perm.action === permission.action && perm.subject === permission.subject) >= 0);
|
|
535
|
+
const middlewaredPermissions = await runRbacMiddleware({
|
|
536
|
+
user,
|
|
537
|
+
permissions: userPermissions,
|
|
538
|
+
pathname: location.pathname,
|
|
539
|
+
search: (rawQueryContext || rawQuery).split('?')[1] ?? ''
|
|
540
|
+
}, matchingPermissions);
|
|
541
|
+
const shouldCheckConditions = middlewaredPermissions.some((perm)=>Array.isArray(perm.conditions) && perm.conditions.length > 0);
|
|
542
|
+
if (!shouldCheckConditions) {
|
|
543
|
+
return middlewaredPermissions;
|
|
544
|
+
}
|
|
545
|
+
const { data, error } = await checkPermissions({
|
|
546
|
+
permissions: middlewaredPermissions.map((perm)=>({
|
|
547
|
+
action: perm.action,
|
|
548
|
+
subject: perm.subject
|
|
549
|
+
}))
|
|
550
|
+
});
|
|
551
|
+
if (error) {
|
|
552
|
+
throw error;
|
|
553
|
+
} else {
|
|
554
|
+
return middlewaredPermissions.filter((_, index)=>data?.data[index] === true);
|
|
555
|
+
}
|
|
556
|
+
}, [
|
|
557
|
+
checkPermissions,
|
|
558
|
+
location.pathname,
|
|
559
|
+
rawQuery,
|
|
560
|
+
runRbacMiddleware,
|
|
561
|
+
user,
|
|
562
|
+
userPermissions
|
|
563
|
+
]);
|
|
564
|
+
const isLoading = isLoadingUser || isLoadingPermissions;
|
|
565
|
+
return /*#__PURE__*/ jsx(Provider, {
|
|
566
|
+
token: token,
|
|
567
|
+
user: user,
|
|
568
|
+
login: login$1,
|
|
569
|
+
logout: logout$1,
|
|
570
|
+
permissions: userPermissions,
|
|
571
|
+
checkUserHasPermissions: checkUserHasPermissions,
|
|
572
|
+
refetchPermissions: refetchPermissions,
|
|
573
|
+
isLoading: isLoading,
|
|
574
|
+
children: children
|
|
575
|
+
});
|
|
576
|
+
};
|
|
577
|
+
|
|
578
|
+
const NotificationsContext = /*#__PURE__*/ React.createContext({
|
|
579
|
+
toggleNotification: ()=>{}
|
|
580
|
+
});
|
|
581
|
+
/**
|
|
582
|
+
* @internal
|
|
583
|
+
* @description DO NOT USE. This will be removed before stable release of v5.
|
|
584
|
+
*/ const NotificationsProvider = ({ children })=>{
|
|
585
|
+
const notificationIdRef = React.useRef(0);
|
|
586
|
+
const [notifications, setNotifications] = React.useState([]);
|
|
587
|
+
const toggleNotification = React.useCallback(({ type, message, link, timeout, blockTransition, onClose, title })=>{
|
|
588
|
+
setNotifications((s)=>[
|
|
589
|
+
...s,
|
|
590
|
+
{
|
|
591
|
+
id: notificationIdRef.current++,
|
|
592
|
+
type,
|
|
593
|
+
message,
|
|
594
|
+
link,
|
|
595
|
+
timeout,
|
|
596
|
+
blockTransition,
|
|
597
|
+
onClose,
|
|
598
|
+
title
|
|
599
|
+
}
|
|
600
|
+
]);
|
|
601
|
+
}, []);
|
|
602
|
+
const clearNotification = React.useCallback((id)=>{
|
|
603
|
+
setNotifications((s)=>s.filter((n)=>n.id !== id));
|
|
604
|
+
}, []);
|
|
605
|
+
const value = React.useMemo(()=>({
|
|
606
|
+
toggleNotification
|
|
607
|
+
}), [
|
|
608
|
+
toggleNotification
|
|
609
|
+
]);
|
|
610
|
+
return /*#__PURE__*/ jsxs(NotificationsContext.Provider, {
|
|
611
|
+
value: value,
|
|
612
|
+
children: [
|
|
613
|
+
/*#__PURE__*/ jsx(Flex, {
|
|
614
|
+
left: "50%",
|
|
615
|
+
marginLeft: "-250px",
|
|
616
|
+
position: "fixed",
|
|
617
|
+
direction: "column",
|
|
618
|
+
alignItems: "stretch",
|
|
619
|
+
gap: 2,
|
|
620
|
+
top: `4.6rem`,
|
|
621
|
+
width: `50rem`,
|
|
622
|
+
zIndex: "notification",
|
|
623
|
+
children: notifications.map((notification)=>{
|
|
624
|
+
return /*#__PURE__*/ jsx(Notification, {
|
|
625
|
+
...notification,
|
|
626
|
+
clearNotification: clearNotification
|
|
627
|
+
}, notification.id);
|
|
628
|
+
})
|
|
629
|
+
}),
|
|
630
|
+
children
|
|
631
|
+
]
|
|
632
|
+
});
|
|
633
|
+
};
|
|
634
|
+
const Notification = ({ clearNotification, blockTransition = false, id, link, message, onClose, timeout = 2500, title, type })=>{
|
|
635
|
+
const { formatMessage } = useIntl();
|
|
636
|
+
/**
|
|
637
|
+
* Chances are `onClose` won't be classed as stabilised,
|
|
638
|
+
* so we use `useCallbackRef` to avoid make it stable.
|
|
639
|
+
*/ const onCloseCallback = useCallbackRef(onClose);
|
|
640
|
+
const handleClose = React.useCallback(()=>{
|
|
641
|
+
onCloseCallback();
|
|
642
|
+
clearNotification(id);
|
|
643
|
+
}, [
|
|
644
|
+
clearNotification,
|
|
645
|
+
id,
|
|
646
|
+
onCloseCallback
|
|
647
|
+
]);
|
|
648
|
+
// eslint-disable-next-line consistent-return
|
|
649
|
+
React.useEffect(()=>{
|
|
650
|
+
if (!blockTransition) {
|
|
651
|
+
const timeoutReference = setTimeout(()=>{
|
|
652
|
+
handleClose();
|
|
653
|
+
}, timeout);
|
|
654
|
+
return ()=>{
|
|
655
|
+
clearTimeout(timeoutReference);
|
|
656
|
+
};
|
|
657
|
+
}
|
|
658
|
+
}, [
|
|
659
|
+
blockTransition,
|
|
660
|
+
handleClose,
|
|
661
|
+
timeout
|
|
662
|
+
]);
|
|
663
|
+
let variant;
|
|
664
|
+
let alertTitle;
|
|
665
|
+
if (type === 'info') {
|
|
666
|
+
variant = 'default';
|
|
667
|
+
alertTitle = formatMessage({
|
|
668
|
+
id: 'notification.default.title',
|
|
669
|
+
defaultMessage: 'Information:'
|
|
670
|
+
});
|
|
671
|
+
} else if (type === 'danger') {
|
|
672
|
+
variant = 'danger';
|
|
673
|
+
alertTitle = formatMessage({
|
|
674
|
+
id: 'notification.warning.title',
|
|
675
|
+
defaultMessage: 'Warning:'
|
|
676
|
+
});
|
|
677
|
+
} else if (type === 'warning') {
|
|
678
|
+
variant = 'warning';
|
|
679
|
+
alertTitle = formatMessage({
|
|
680
|
+
id: 'notification.warning.title',
|
|
681
|
+
defaultMessage: 'Warning:'
|
|
682
|
+
});
|
|
683
|
+
} else {
|
|
684
|
+
variant = 'success';
|
|
685
|
+
alertTitle = formatMessage({
|
|
686
|
+
id: 'notification.success.title',
|
|
687
|
+
defaultMessage: 'Success:'
|
|
688
|
+
});
|
|
689
|
+
}
|
|
690
|
+
if (title) {
|
|
691
|
+
alertTitle = title;
|
|
692
|
+
}
|
|
693
|
+
return /*#__PURE__*/ jsx(Alert, {
|
|
694
|
+
action: link ? /*#__PURE__*/ jsx(Link, {
|
|
695
|
+
href: link.url,
|
|
696
|
+
isExternal: true,
|
|
697
|
+
children: link.label
|
|
698
|
+
}) : undefined,
|
|
699
|
+
onClose: handleClose,
|
|
700
|
+
closeLabel: formatMessage({
|
|
701
|
+
id: 'global.close',
|
|
702
|
+
defaultMessage: 'Close'
|
|
703
|
+
}),
|
|
704
|
+
title: alertTitle,
|
|
705
|
+
variant: variant,
|
|
706
|
+
children: message
|
|
707
|
+
});
|
|
708
|
+
};
|
|
709
|
+
/* -------------------------------------------------------------------------------------------------
|
|
710
|
+
* Hook
|
|
711
|
+
* -----------------------------------------------------------------------------------------------*/ /**
|
|
712
|
+
* @preserve
|
|
713
|
+
* @description Returns an object to interact with the notification
|
|
714
|
+
* system. The callbacks are wrapped in `useCallback` for a stable
|
|
715
|
+
* identity.
|
|
716
|
+
*
|
|
717
|
+
* @example
|
|
718
|
+
* ```tsx
|
|
719
|
+
* import { useNotification } from '@strapi/strapi/admin';
|
|
720
|
+
*
|
|
721
|
+
* const MyComponent = () => {
|
|
722
|
+
* const { toggleNotification } = useNotification();
|
|
723
|
+
*
|
|
724
|
+
* return <button onClick={() => toggleNotification({ message: 'Hello world!' })}>Click me</button>;
|
|
725
|
+
*/ const useNotification = ()=>React.useContext(NotificationsContext);
|
|
726
|
+
|
|
727
|
+
/**
|
|
728
|
+
* Prefix message with 'apiError.'
|
|
729
|
+
*/ function getPrefixedId(message, callback) {
|
|
730
|
+
const prefixedMessage = `apiError.${message}`;
|
|
731
|
+
// if a prefix function has been passed in it is used to
|
|
732
|
+
// prefix the id, e.g. to allow an error message to be
|
|
733
|
+
// set only for a localization namespace
|
|
734
|
+
if (typeof callback === 'function') {
|
|
735
|
+
return callback(prefixedMessage);
|
|
736
|
+
}
|
|
737
|
+
return prefixedMessage;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
function normalizeError(error, { name, intlMessagePrefixCallback }) {
|
|
741
|
+
const { message } = error;
|
|
742
|
+
const normalizedError = {
|
|
743
|
+
id: getPrefixedId(message, intlMessagePrefixCallback),
|
|
744
|
+
defaultMessage: message,
|
|
745
|
+
name: error.name ?? name,
|
|
746
|
+
values: {}
|
|
747
|
+
};
|
|
748
|
+
if ('path' in error) {
|
|
749
|
+
normalizedError.values = {
|
|
750
|
+
path: error.path.join('.')
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
return normalizedError;
|
|
754
|
+
}
|
|
755
|
+
const validateErrorIsYupValidationError = (err)=>typeof err.details === 'object' && err.details !== null && 'errors' in err.details;
|
|
756
|
+
/**
|
|
757
|
+
* Normalize the format of `ResponseError`
|
|
758
|
+
* in places where the hook `useAPIErrorHandler` can not called
|
|
759
|
+
* (e.g. outside of a React component).
|
|
760
|
+
*/ function normalizeAPIError(apiError, intlMessagePrefixCallback) {
|
|
761
|
+
const error = apiError.response?.data?.error;
|
|
762
|
+
if (error) {
|
|
763
|
+
// some errors carry multiple errors (such as ValidationError)
|
|
764
|
+
if (validateErrorIsYupValidationError(error)) {
|
|
765
|
+
return {
|
|
766
|
+
name: error.name,
|
|
767
|
+
message: error?.message || null,
|
|
768
|
+
errors: error.details.errors.map((err)=>normalizeError(err, {
|
|
769
|
+
name: error.name,
|
|
770
|
+
intlMessagePrefixCallback
|
|
771
|
+
}))
|
|
772
|
+
};
|
|
773
|
+
}
|
|
774
|
+
return normalizeError(error, {
|
|
775
|
+
intlMessagePrefixCallback
|
|
776
|
+
});
|
|
777
|
+
}
|
|
778
|
+
return null;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
/**
|
|
782
|
+
* Deeply get a value from an object via its path.
|
|
783
|
+
*/ function getIn(obj, key, def, pathStartIndex = 0) {
|
|
784
|
+
const path = toPath(key);
|
|
785
|
+
while(obj && pathStartIndex < path.length){
|
|
786
|
+
obj = obj[path[pathStartIndex++]];
|
|
787
|
+
}
|
|
788
|
+
// check if path is not in the end
|
|
789
|
+
if (pathStartIndex !== path.length && !obj) {
|
|
790
|
+
return def;
|
|
791
|
+
}
|
|
792
|
+
return obj === undefined ? def : obj;
|
|
793
|
+
}
|
|
794
|
+
/** @internal is the given object an Object? */ const isObject = (obj)=>obj !== null && typeof obj === 'object' && !Array.isArray(obj);
|
|
795
|
+
/** @internal is the given object an integer? */ const isInteger = (obj)=>String(Math.floor(Number(obj))) === obj;
|
|
796
|
+
/**
|
|
797
|
+
* Deeply set a value from in object via its path. If the value at `path`
|
|
798
|
+
* has changed, return a shallow copy of obj with `value` set at `path`.
|
|
799
|
+
* If `value` has not changed, return the original `obj`.
|
|
800
|
+
*
|
|
801
|
+
* Existing objects / arrays along `path` are also shallow copied. Sibling
|
|
802
|
+
* objects along path retain the same internal js reference. Since new
|
|
803
|
+
* objects / arrays are only created along `path`, we can test if anything
|
|
804
|
+
* changed in a nested structure by comparing the object's reference in
|
|
805
|
+
* the old and new object, similar to how russian doll cache invalidation
|
|
806
|
+
* works.
|
|
807
|
+
*
|
|
808
|
+
* In earlier versions of this function, which used cloneDeep, there were
|
|
809
|
+
* issues whereby settings a nested value would mutate the parent
|
|
810
|
+
* instead of creating a new object. `clone` avoids that bug making a
|
|
811
|
+
* shallow copy of the objects along the update path
|
|
812
|
+
* so no object is mutated in place.
|
|
813
|
+
*
|
|
814
|
+
* Before changing this function, please read through the following
|
|
815
|
+
* discussions.
|
|
816
|
+
*
|
|
817
|
+
* @see https://github.com/developit/linkstate
|
|
818
|
+
* @see https://github.com/jaredpalmer/formik/pull/123
|
|
819
|
+
*/ function setIn(obj, path, value) {
|
|
820
|
+
const res = clone(obj); // this keeps inheritance when obj is a class
|
|
821
|
+
let resVal = res;
|
|
822
|
+
let i = 0;
|
|
823
|
+
const pathArray = toPath(path);
|
|
824
|
+
for(; i < pathArray.length - 1; i++){
|
|
825
|
+
const currentPath = pathArray[i];
|
|
826
|
+
const currentObj = getIn(obj, pathArray.slice(0, i + 1));
|
|
827
|
+
if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {
|
|
828
|
+
resVal = resVal[currentPath] = clone(currentObj);
|
|
829
|
+
} else {
|
|
830
|
+
const nextPath = pathArray[i + 1];
|
|
831
|
+
resVal = resVal[currentPath] = isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
// Return original object if new value is the same as current
|
|
835
|
+
if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {
|
|
836
|
+
return obj;
|
|
837
|
+
}
|
|
838
|
+
if (value === undefined) {
|
|
839
|
+
delete resVal[pathArray[i]];
|
|
840
|
+
} else {
|
|
841
|
+
resVal[pathArray[i]] = value;
|
|
842
|
+
}
|
|
843
|
+
// If the path array has a single element, the loop did not run.
|
|
844
|
+
// Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.
|
|
845
|
+
if (i === 0 && value === undefined) {
|
|
846
|
+
delete res[pathArray[i]];
|
|
847
|
+
}
|
|
848
|
+
return res;
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
/**
|
|
852
|
+
* @public
|
|
853
|
+
* @description The purpose of this hook is to offer a unified way to handle errors thrown by API endpoints, regardless of the type of error (`ValidationError`, `ApplicationErrror` ...)
|
|
854
|
+
that has been thrown.
|
|
855
|
+
* @example
|
|
856
|
+
* ```tsx
|
|
857
|
+
* import * as React from 'react';
|
|
858
|
+
* import { useFetchClient, useAPIErrorHandler, useNotification } from '@strapi/admin/admin';
|
|
859
|
+
*
|
|
860
|
+
* const MyComponent = () => {
|
|
861
|
+
* const { get } = useFetchClient();
|
|
862
|
+
* const { formatAPIError } = useAPIErrorHandler(getTrad);
|
|
863
|
+
* const { toggleNotification } = useNotification();
|
|
864
|
+
*
|
|
865
|
+
* const handleDeleteItem = async () => {
|
|
866
|
+
* try {
|
|
867
|
+
* return await get('/admin');
|
|
868
|
+
* } catch (error) {
|
|
869
|
+
* toggleNotification({
|
|
870
|
+
* type: 'danger',
|
|
871
|
+
* message: formatAPIError(error),
|
|
872
|
+
* });
|
|
873
|
+
* }
|
|
874
|
+
* };
|
|
875
|
+
* return <button onClick={handleDeleteItem}>Delete item</button>;
|
|
876
|
+
* };
|
|
877
|
+
* ```
|
|
878
|
+
*/ function useAPIErrorHandler(intlMessagePrefixCallback) {
|
|
879
|
+
const { formatMessage } = useIntl();
|
|
880
|
+
/**
|
|
881
|
+
* @description This method try to normalize the passed error
|
|
882
|
+
* and then call formatAPIError to stringify the ResponseObject
|
|
883
|
+
* into a string. If it fails it will call formatFetchError and
|
|
884
|
+
* return the error message.
|
|
885
|
+
*/ const formatError = React.useCallback((error)=>{
|
|
886
|
+
// Try to normalize the passed error first. This will fail for e.g. network
|
|
887
|
+
// errors which are thrown by fetchClient directly.
|
|
888
|
+
try {
|
|
889
|
+
const formattedErr = formatAPIError(error, {
|
|
890
|
+
intlMessagePrefixCallback,
|
|
891
|
+
formatMessage
|
|
892
|
+
});
|
|
893
|
+
if (!formattedErr) {
|
|
894
|
+
return formatFetchError(error, {
|
|
895
|
+
intlMessagePrefixCallback,
|
|
896
|
+
formatMessage
|
|
897
|
+
});
|
|
898
|
+
}
|
|
899
|
+
return formattedErr;
|
|
900
|
+
} catch (_) {
|
|
901
|
+
throw new Error('formatAPIError: Unknown error:', error);
|
|
902
|
+
}
|
|
903
|
+
}, [
|
|
904
|
+
formatMessage,
|
|
905
|
+
intlMessagePrefixCallback
|
|
906
|
+
]);
|
|
907
|
+
return {
|
|
908
|
+
/**
|
|
909
|
+
* @alpha
|
|
910
|
+
* Convert ValidationErrors from the API into an object that can be used by forms.
|
|
911
|
+
*/ _unstableFormatValidationErrors: React.useCallback((error)=>{
|
|
912
|
+
if (typeof error.details === 'object' && error.details !== null) {
|
|
913
|
+
if ('errors' in error.details && Array.isArray(error.details.errors)) {
|
|
914
|
+
const validationErrors = error.details.errors;
|
|
915
|
+
return validationErrors.reduce((acc, err)=>{
|
|
916
|
+
const { path, message } = err;
|
|
917
|
+
return setIn(acc, path.join('.'), message);
|
|
918
|
+
}, {});
|
|
919
|
+
} else {
|
|
920
|
+
const details = error.details;
|
|
921
|
+
return Object.keys(details).reduce((acc, key)=>{
|
|
922
|
+
const messages = details[key];
|
|
923
|
+
return {
|
|
924
|
+
...acc,
|
|
925
|
+
[key]: messages.join(', ')
|
|
926
|
+
};
|
|
927
|
+
}, {});
|
|
928
|
+
}
|
|
929
|
+
} else {
|
|
930
|
+
return {};
|
|
931
|
+
}
|
|
932
|
+
}, []),
|
|
933
|
+
/**
|
|
934
|
+
* @alpha
|
|
935
|
+
* This handles the errors given from `redux-toolkit`'s axios based baseQuery function.
|
|
936
|
+
*/ _unstableFormatAPIError: React.useCallback((error)=>{
|
|
937
|
+
const err = {
|
|
938
|
+
response: {
|
|
939
|
+
data: {
|
|
940
|
+
error
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
};
|
|
944
|
+
/**
|
|
945
|
+
* There's a chance with SerializedErrors that the message is not set.
|
|
946
|
+
* In that case we return a generic error message.
|
|
947
|
+
*/ if (!error.message) {
|
|
948
|
+
return 'Unknown error occured.';
|
|
949
|
+
}
|
|
950
|
+
return formatError(err);
|
|
951
|
+
}, [
|
|
952
|
+
formatError
|
|
953
|
+
]),
|
|
954
|
+
formatAPIError: formatError
|
|
955
|
+
};
|
|
956
|
+
}
|
|
957
|
+
function formatFetchError(error, { intlMessagePrefixCallback, formatMessage }) {
|
|
958
|
+
const { code, message } = error;
|
|
959
|
+
return formatMessage({
|
|
960
|
+
id: getPrefixedId(message, intlMessagePrefixCallback),
|
|
961
|
+
defaultMessage: message
|
|
962
|
+
}, {
|
|
963
|
+
code
|
|
964
|
+
});
|
|
965
|
+
}
|
|
966
|
+
/**
|
|
967
|
+
* @description This method stringifies the `ResponseObject` into
|
|
968
|
+
* a string. If multiple errors are thrown by the API, which
|
|
969
|
+
* happens e.g.in the case of a `ValidationError`, all errors
|
|
970
|
+
* will bo concatenated into a single string.
|
|
971
|
+
*/ function formatAPIError(error, { formatMessage, intlMessagePrefixCallback }) {
|
|
972
|
+
if (!formatMessage) {
|
|
973
|
+
throw new Error('The formatMessage callback is a mandatory argument.');
|
|
974
|
+
}
|
|
975
|
+
const normalizedError = normalizeAPIError(error, intlMessagePrefixCallback);
|
|
976
|
+
if (!normalizedError) {
|
|
977
|
+
return null;
|
|
978
|
+
}
|
|
979
|
+
if ('message' in normalizedError && normalizedError.message !== null) {
|
|
980
|
+
return normalizedError.message;
|
|
981
|
+
}
|
|
982
|
+
// stringify multiple errors
|
|
983
|
+
if ('errors' in normalizedError) {
|
|
984
|
+
return normalizedError.errors.map(({ id, defaultMessage, values })=>formatMessage({
|
|
985
|
+
id,
|
|
986
|
+
defaultMessage
|
|
987
|
+
}, values)).join('\n');
|
|
988
|
+
}
|
|
989
|
+
return formatMessage(normalizedError);
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
const PageMain = ({ children, ...restProps })=>{
|
|
993
|
+
return /*#__PURE__*/ jsx(Main, {
|
|
994
|
+
...restProps,
|
|
995
|
+
children: children
|
|
996
|
+
});
|
|
997
|
+
};
|
|
998
|
+
/**
|
|
999
|
+
* @public
|
|
1000
|
+
* @description A loading component that should be rendered as the page
|
|
1001
|
+
* whilst you load the content for the aforementioned page.
|
|
1002
|
+
*/ const Loading = ({ children = 'Loading content.' })=>{
|
|
1003
|
+
return /*#__PURE__*/ jsx(PageMain, {
|
|
1004
|
+
height: "100vh",
|
|
1005
|
+
"aria-busy": true,
|
|
1006
|
+
children: /*#__PURE__*/ jsx(Flex, {
|
|
1007
|
+
alignItems: "center",
|
|
1008
|
+
height: "100%",
|
|
1009
|
+
justifyContent: "center",
|
|
1010
|
+
children: /*#__PURE__*/ jsx(Loader, {
|
|
1011
|
+
children: children
|
|
1012
|
+
})
|
|
1013
|
+
})
|
|
1014
|
+
});
|
|
1015
|
+
};
|
|
1016
|
+
/**
|
|
1017
|
+
* TODO: should we start passing our errors here so they're persisted on the screen?
|
|
1018
|
+
* This could follow something similar to how the global app error works...?
|
|
1019
|
+
*/ /**
|
|
1020
|
+
* @public
|
|
1021
|
+
* @description An error component that should be rendered as the page
|
|
1022
|
+
* when an error occurs.
|
|
1023
|
+
*/ const Error$1 = (props)=>{
|
|
1024
|
+
const { formatMessage } = useIntl();
|
|
1025
|
+
return /*#__PURE__*/ jsx(PageMain, {
|
|
1026
|
+
height: "100%",
|
|
1027
|
+
children: /*#__PURE__*/ jsx(Flex, {
|
|
1028
|
+
alignItems: "center",
|
|
1029
|
+
height: "100%",
|
|
1030
|
+
justifyContent: "center",
|
|
1031
|
+
children: /*#__PURE__*/ jsx(EmptyStateLayout, {
|
|
1032
|
+
icon: /*#__PURE__*/ jsx(WarningCircle, {
|
|
1033
|
+
width: "16rem"
|
|
1034
|
+
}),
|
|
1035
|
+
content: formatMessage({
|
|
1036
|
+
id: 'anErrorOccurred',
|
|
1037
|
+
defaultMessage: 'Whoops! Something went wrong. Please, try again.'
|
|
1038
|
+
}),
|
|
1039
|
+
...props
|
|
1040
|
+
})
|
|
1041
|
+
})
|
|
1042
|
+
});
|
|
1043
|
+
};
|
|
1044
|
+
/**
|
|
1045
|
+
* @public
|
|
1046
|
+
* @description A component that should be rendered as the page
|
|
1047
|
+
* when the user does not have the permissions to access the content.
|
|
1048
|
+
* This component does not check any permissions, it's up to you to decide
|
|
1049
|
+
* when it should be rendered.
|
|
1050
|
+
*/ const NoPermissions = (props)=>{
|
|
1051
|
+
const { formatMessage } = useIntl();
|
|
1052
|
+
return /*#__PURE__*/ jsx(PageMain, {
|
|
1053
|
+
height: "100%",
|
|
1054
|
+
children: /*#__PURE__*/ jsx(Flex, {
|
|
1055
|
+
alignItems: "center",
|
|
1056
|
+
height: "100%",
|
|
1057
|
+
justifyContent: "center",
|
|
1058
|
+
children: /*#__PURE__*/ jsx(Box, {
|
|
1059
|
+
minWidth: "50%",
|
|
1060
|
+
children: /*#__PURE__*/ jsx(EmptyStateLayout, {
|
|
1061
|
+
icon: /*#__PURE__*/ jsx(EmptyPermissions, {
|
|
1062
|
+
width: "16rem"
|
|
1063
|
+
}),
|
|
1064
|
+
content: formatMessage({
|
|
1065
|
+
id: 'app.components.EmptyStateLayout.content-permissions',
|
|
1066
|
+
defaultMessage: "You don't have the permissions to access that content"
|
|
1067
|
+
}),
|
|
1068
|
+
...props
|
|
1069
|
+
})
|
|
1070
|
+
})
|
|
1071
|
+
})
|
|
1072
|
+
});
|
|
1073
|
+
};
|
|
1074
|
+
/**
|
|
1075
|
+
* @public
|
|
1076
|
+
* @description A component that should be rendered as the page
|
|
1077
|
+
* when there is no data available to display.
|
|
1078
|
+
* This component does not check any permissions, it's up to you to decide
|
|
1079
|
+
* when it should be rendered.
|
|
1080
|
+
*/ const NoData = (props)=>{
|
|
1081
|
+
const { formatMessage } = useIntl();
|
|
1082
|
+
return /*#__PURE__*/ jsx(PageMain, {
|
|
1083
|
+
height: "100%",
|
|
1084
|
+
background: "neutral100",
|
|
1085
|
+
children: /*#__PURE__*/ jsx(Flex, {
|
|
1086
|
+
alignItems: "center",
|
|
1087
|
+
height: "100%",
|
|
1088
|
+
width: "100%",
|
|
1089
|
+
justifyContent: "center",
|
|
1090
|
+
children: /*#__PURE__*/ jsx(Box, {
|
|
1091
|
+
minWidth: "50%",
|
|
1092
|
+
children: /*#__PURE__*/ jsx(EmptyStateLayout, {
|
|
1093
|
+
icon: /*#__PURE__*/ jsx(EmptyDocuments, {
|
|
1094
|
+
width: "16rem"
|
|
1095
|
+
}),
|
|
1096
|
+
action: props.action,
|
|
1097
|
+
content: formatMessage({
|
|
1098
|
+
id: 'app.components.EmptyStateLayout.content-document',
|
|
1099
|
+
defaultMessage: 'No content found'
|
|
1100
|
+
}),
|
|
1101
|
+
...props
|
|
1102
|
+
})
|
|
1103
|
+
})
|
|
1104
|
+
})
|
|
1105
|
+
});
|
|
1106
|
+
};
|
|
1107
|
+
/**
|
|
1108
|
+
* @public
|
|
1109
|
+
* @description A wrapper component that should be used to protect a page. It will check the permissions
|
|
1110
|
+
* you pass to it and render the children if the user has the required permissions. If a user does not have ALL
|
|
1111
|
+
* the required permissions, it will redirect the user to the home page. Whilst these checks happen it will render
|
|
1112
|
+
* the loading component and should the check fail it will render the error component with a notification.
|
|
1113
|
+
*/ const Protect = ({ permissions = [], children })=>{
|
|
1114
|
+
const userPermissions = useAuth('Protect', (state)=>state.permissions);
|
|
1115
|
+
const { toggleNotification } = useNotification();
|
|
1116
|
+
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
|
|
1117
|
+
const matchingPermissions = userPermissions.filter((permission)=>permissions.findIndex((perm)=>perm.action === permission.action && perm.subject === permission.subject) >= 0);
|
|
1118
|
+
const shouldCheckConditions = matchingPermissions.some((perm)=>Array.isArray(perm.conditions) && perm.conditions.length > 0);
|
|
1119
|
+
const { isLoading, error, data } = useCheckPermissionsQuery({
|
|
1120
|
+
permissions: matchingPermissions.map((perm)=>({
|
|
1121
|
+
action: perm.action,
|
|
1122
|
+
subject: perm.subject
|
|
1123
|
+
}))
|
|
1124
|
+
}, {
|
|
1125
|
+
skip: !shouldCheckConditions
|
|
1126
|
+
});
|
|
1127
|
+
React.useEffect(()=>{
|
|
1128
|
+
if (error) {
|
|
1129
|
+
toggleNotification({
|
|
1130
|
+
type: 'danger',
|
|
1131
|
+
message: formatAPIError(error)
|
|
1132
|
+
});
|
|
1133
|
+
}
|
|
1134
|
+
}, [
|
|
1135
|
+
error,
|
|
1136
|
+
formatAPIError,
|
|
1137
|
+
toggleNotification
|
|
1138
|
+
]);
|
|
1139
|
+
if (isLoading) {
|
|
1140
|
+
return /*#__PURE__*/ jsx(Loading, {});
|
|
1141
|
+
}
|
|
1142
|
+
if (error) {
|
|
1143
|
+
return /*#__PURE__*/ jsx(Error$1, {});
|
|
1144
|
+
}
|
|
1145
|
+
const { data: permissionsData } = data || {};
|
|
1146
|
+
const canAccess = shouldCheckConditions && permissionsData ? !permissionsData.includes(false) : matchingPermissions.length > 0;
|
|
1147
|
+
if (!canAccess) {
|
|
1148
|
+
return /*#__PURE__*/ jsx(NoPermissions, {});
|
|
1149
|
+
}
|
|
1150
|
+
return /*#__PURE__*/ jsx(Fragment, {
|
|
1151
|
+
children: typeof children === 'function' ? children({
|
|
1152
|
+
permissions: matchingPermissions
|
|
1153
|
+
}) : children
|
|
1154
|
+
});
|
|
1155
|
+
};
|
|
1156
|
+
/**
|
|
1157
|
+
* @public
|
|
1158
|
+
* @description This component takes the children (must be a string) and sets
|
|
1159
|
+
* it as the title of the html.
|
|
1160
|
+
*/ const Title = ({ children: title })=>{
|
|
1161
|
+
React.useEffect(()=>{
|
|
1162
|
+
document.title = `${title} | Strapi`;
|
|
1163
|
+
}, [
|
|
1164
|
+
title
|
|
1165
|
+
]);
|
|
1166
|
+
return null;
|
|
1167
|
+
};
|
|
1168
|
+
const Page = {
|
|
1169
|
+
Error: Error$1,
|
|
1170
|
+
Loading,
|
|
1171
|
+
NoPermissions,
|
|
1172
|
+
Protect,
|
|
1173
|
+
NoData,
|
|
1174
|
+
Main: PageMain,
|
|
1175
|
+
Title
|
|
1176
|
+
};
|
|
1177
|
+
|
|
1178
|
+
const once = (fn)=>{
|
|
1179
|
+
const func = fn;
|
|
1180
|
+
let called = false;
|
|
1181
|
+
if (typeof func !== 'function') {
|
|
1182
|
+
throw new TypeError(`once requires a function parameter`);
|
|
1183
|
+
}
|
|
1184
|
+
return (...args)=>{
|
|
1185
|
+
if (!called && process.env.NODE_ENV === 'development') {
|
|
1186
|
+
func(...args);
|
|
1187
|
+
called = true;
|
|
1188
|
+
}
|
|
1189
|
+
};
|
|
1190
|
+
};
|
|
1191
|
+
|
|
1192
|
+
const capitalise = (str)=>str.charAt(0).toUpperCase() + str.slice(1);
|
|
1193
|
+
|
|
1194
|
+
const usePrev = (value)=>{
|
|
1195
|
+
const ref = useRef();
|
|
1196
|
+
useEffect(()=>{
|
|
1197
|
+
ref.current = value;
|
|
1198
|
+
}, [
|
|
1199
|
+
value
|
|
1200
|
+
]);
|
|
1201
|
+
return ref.current;
|
|
1202
|
+
};
|
|
1203
|
+
|
|
1204
|
+
/**
|
|
1205
|
+
* @public
|
|
1206
|
+
* @description This hooks takes an object or array of permissions (the latter preferred) and
|
|
1207
|
+
* runs through them to match against the current user's permissions as well as the RBAC middleware
|
|
1208
|
+
* system checking any conditions that may be present. It returns the filtered permissions as the complete
|
|
1209
|
+
* object from the API and a set of actions that can be performed. An action is derived from the last part
|
|
1210
|
+
* of the permission action e.g. `admin::roles.create` would be `canCreate`. If there's a hyphen in the action
|
|
1211
|
+
* this is removed and capitalised e.g `admin::roles.create-draft` would be `canCreateDraft`.
|
|
1212
|
+
* @example
|
|
1213
|
+
* ```tsx
|
|
1214
|
+
* import { Page, useRBAC } from '@strapi/strapi/admin'
|
|
1215
|
+
*
|
|
1216
|
+
* const MyProtectedPage = () => {
|
|
1217
|
+
* const { allowedActions, isLoading, error, permissions } = useRBAC([{ action: 'admin::roles.create' }])
|
|
1218
|
+
*
|
|
1219
|
+
* if(isLoading) {
|
|
1220
|
+
* return <Page.Loading />
|
|
1221
|
+
* }
|
|
1222
|
+
*
|
|
1223
|
+
* if(error){
|
|
1224
|
+
* return <Page.Error />
|
|
1225
|
+
* }
|
|
1226
|
+
*
|
|
1227
|
+
* if(!allowedActions.canCreate) {
|
|
1228
|
+
* return null
|
|
1229
|
+
* }
|
|
1230
|
+
*
|
|
1231
|
+
* return <MyPage permissions={permissions} />
|
|
1232
|
+
* }
|
|
1233
|
+
* ```
|
|
1234
|
+
*/ const useRBAC = (permissionsToCheck = [], passedPermissions, rawQueryContext)=>{
|
|
1235
|
+
const isLoadingAuth = useAuth('useRBAC', (state)=>state.isLoading);
|
|
1236
|
+
const [isLoading, setIsLoading] = React.useState(true);
|
|
1237
|
+
const [error, setError] = React.useState();
|
|
1238
|
+
const [data, setData] = React.useState();
|
|
1239
|
+
const warnOnce = React.useMemo(()=>once(console.warn), []);
|
|
1240
|
+
const actualPermissionsToCheck = React.useMemo(()=>{
|
|
1241
|
+
if (Array.isArray(permissionsToCheck)) {
|
|
1242
|
+
return permissionsToCheck;
|
|
1243
|
+
} else {
|
|
1244
|
+
warnOnce('useRBAC: The first argument should be an array of permissions, not an object. This will be deprecated in the future.');
|
|
1245
|
+
return Object.values(permissionsToCheck).flat();
|
|
1246
|
+
}
|
|
1247
|
+
}, [
|
|
1248
|
+
permissionsToCheck,
|
|
1249
|
+
warnOnce
|
|
1250
|
+
]);
|
|
1251
|
+
/**
|
|
1252
|
+
* This is the default value we return until the queryResults[i].data
|
|
1253
|
+
* are all resolved with data. This preserves the original behaviour.
|
|
1254
|
+
*/ const defaultAllowedActions = React.useMemo(()=>{
|
|
1255
|
+
return actualPermissionsToCheck.reduce((acc, permission)=>{
|
|
1256
|
+
return {
|
|
1257
|
+
...acc,
|
|
1258
|
+
[getActionName(permission)]: false
|
|
1259
|
+
};
|
|
1260
|
+
}, {});
|
|
1261
|
+
}, [
|
|
1262
|
+
actualPermissionsToCheck
|
|
1263
|
+
]);
|
|
1264
|
+
const checkUserHasPermissions = useAuth('useRBAC', (state)=>state.checkUserHasPermissions);
|
|
1265
|
+
const permssionsChecked = usePrev(actualPermissionsToCheck);
|
|
1266
|
+
const contextChecked = usePrev(rawQueryContext);
|
|
1267
|
+
React.useEffect(()=>{
|
|
1268
|
+
if (!isEqual(permssionsChecked, actualPermissionsToCheck) || // TODO: also run this when the query context changes
|
|
1269
|
+
contextChecked !== rawQueryContext) {
|
|
1270
|
+
setIsLoading(true);
|
|
1271
|
+
setData(undefined);
|
|
1272
|
+
setError(undefined);
|
|
1273
|
+
checkUserHasPermissions(actualPermissionsToCheck, passedPermissions, rawQueryContext).then((res)=>{
|
|
1274
|
+
if (res) {
|
|
1275
|
+
setData(res.reduce((acc, permission)=>{
|
|
1276
|
+
return {
|
|
1277
|
+
...acc,
|
|
1278
|
+
[getActionName(permission)]: true
|
|
1279
|
+
};
|
|
1280
|
+
}, {}));
|
|
1281
|
+
}
|
|
1282
|
+
}).catch((err)=>{
|
|
1283
|
+
setError(err);
|
|
1284
|
+
}).finally(()=>{
|
|
1285
|
+
setIsLoading(false);
|
|
1286
|
+
});
|
|
1287
|
+
}
|
|
1288
|
+
}, [
|
|
1289
|
+
actualPermissionsToCheck,
|
|
1290
|
+
checkUserHasPermissions,
|
|
1291
|
+
passedPermissions,
|
|
1292
|
+
permissionsToCheck,
|
|
1293
|
+
permssionsChecked,
|
|
1294
|
+
contextChecked,
|
|
1295
|
+
rawQueryContext
|
|
1296
|
+
]);
|
|
1297
|
+
/**
|
|
1298
|
+
* This hook originally would not return allowedActions
|
|
1299
|
+
* until all the checks were complete.
|
|
1300
|
+
*/ const allowedActions = Object.entries({
|
|
1301
|
+
...defaultAllowedActions,
|
|
1302
|
+
...data
|
|
1303
|
+
}).reduce((acc, [name, allowed])=>{
|
|
1304
|
+
acc[`can${capitalise(name)}`] = allowed;
|
|
1305
|
+
return acc;
|
|
1306
|
+
}, {});
|
|
1307
|
+
return {
|
|
1308
|
+
allowedActions,
|
|
1309
|
+
permissions: actualPermissionsToCheck,
|
|
1310
|
+
isLoading: isLoading || isLoadingAuth,
|
|
1311
|
+
error
|
|
1312
|
+
};
|
|
1313
|
+
};
|
|
1314
|
+
const getActionName = (permission)=>{
|
|
1315
|
+
const [action = ''] = permission.action.split('.').slice(-1);
|
|
1316
|
+
return action.split('-').map(capitalise).join('');
|
|
1317
|
+
};
|
|
1318
|
+
|
|
1319
|
+
const [AppInfoProvider, useAppInfo] = createContext('AppInfo', {});
|
|
1320
|
+
|
|
1321
|
+
/* -------------------------------------------------------------------------------------------------
|
|
1322
|
+
* Context
|
|
1323
|
+
* -----------------------------------------------------------------------------------------------*/ const TrackingContext = /*#__PURE__*/ React.createContext({
|
|
1324
|
+
uuid: false
|
|
1325
|
+
});
|
|
1326
|
+
const TrackingProvider = ({ children })=>{
|
|
1327
|
+
const token = useAuth('App', (state)=>state.token);
|
|
1328
|
+
const { data: initData } = useInitQuery();
|
|
1329
|
+
const { uuid } = initData ?? {};
|
|
1330
|
+
const { data } = useTelemetryPropertiesQuery(undefined, {
|
|
1331
|
+
skip: !initData?.uuid || !token
|
|
1332
|
+
});
|
|
1333
|
+
React.useEffect(()=>{
|
|
1334
|
+
if (uuid && data) {
|
|
1335
|
+
const event = 'didInitializeAdministration';
|
|
1336
|
+
try {
|
|
1337
|
+
fetch('https://analytics.strapi.io/api/v2/track', {
|
|
1338
|
+
method: 'POST',
|
|
1339
|
+
body: JSON.stringify({
|
|
1340
|
+
// This event is anonymous
|
|
1341
|
+
event,
|
|
1342
|
+
userId: '',
|
|
1343
|
+
eventPropeties: {},
|
|
1344
|
+
groupProperties: {
|
|
1345
|
+
...data,
|
|
1346
|
+
projectId: uuid
|
|
1347
|
+
}
|
|
1348
|
+
}),
|
|
1349
|
+
headers: {
|
|
1350
|
+
'Content-Type': 'application/json',
|
|
1351
|
+
'X-Strapi-Event': event
|
|
1352
|
+
}
|
|
1353
|
+
});
|
|
1354
|
+
} catch {
|
|
1355
|
+
// silence is golden
|
|
1356
|
+
}
|
|
1357
|
+
}
|
|
1358
|
+
}, [
|
|
1359
|
+
data,
|
|
1360
|
+
uuid
|
|
1361
|
+
]);
|
|
1362
|
+
const value = React.useMemo(()=>({
|
|
1363
|
+
uuid,
|
|
1364
|
+
telemetryProperties: data
|
|
1365
|
+
}), [
|
|
1366
|
+
uuid,
|
|
1367
|
+
data
|
|
1368
|
+
]);
|
|
1369
|
+
return /*#__PURE__*/ jsx(TrackingContext.Provider, {
|
|
1370
|
+
value: value,
|
|
1371
|
+
children: children
|
|
1372
|
+
});
|
|
1373
|
+
};
|
|
1374
|
+
/**
|
|
1375
|
+
* @description Used to send amplitude events to the Strapi Tracking hub.
|
|
1376
|
+
*
|
|
1377
|
+
* @example
|
|
1378
|
+
* ```tsx
|
|
1379
|
+
* import { useTracking } from '@strapi/strapi/admin';
|
|
1380
|
+
*
|
|
1381
|
+
* const MyComponent = () => {
|
|
1382
|
+
* const { trackUsage } = useTracking();
|
|
1383
|
+
*
|
|
1384
|
+
* const handleClick = () => {
|
|
1385
|
+
* trackUsage('my-event', { myProperty: 'myValue' });
|
|
1386
|
+
* }
|
|
1387
|
+
*
|
|
1388
|
+
* return <button onClick={handleClick}>Send Event</button>
|
|
1389
|
+
* }
|
|
1390
|
+
* ```
|
|
1391
|
+
*/ const useTracking = ()=>{
|
|
1392
|
+
const { uuid, telemetryProperties } = React.useContext(TrackingContext);
|
|
1393
|
+
const userId = useAppInfo('useTracking', (state)=>state.userId);
|
|
1394
|
+
const trackUsage = React.useCallback(async (event, properties)=>{
|
|
1395
|
+
try {
|
|
1396
|
+
if (uuid && !window.strapi.telemetryDisabled) {
|
|
1397
|
+
const res = await axios.post('https://analytics.strapi.io/api/v2/track', {
|
|
1398
|
+
event,
|
|
1399
|
+
userId,
|
|
1400
|
+
eventProperties: {
|
|
1401
|
+
...properties
|
|
1402
|
+
},
|
|
1403
|
+
userProperties: {},
|
|
1404
|
+
groupProperties: {
|
|
1405
|
+
...telemetryProperties,
|
|
1406
|
+
projectId: uuid,
|
|
1407
|
+
projectType: window.strapi.projectType
|
|
1408
|
+
}
|
|
1409
|
+
}, {
|
|
1410
|
+
headers: {
|
|
1411
|
+
'Content-Type': 'application/json',
|
|
1412
|
+
'X-Strapi-Event': event
|
|
1413
|
+
}
|
|
1414
|
+
});
|
|
1415
|
+
return res;
|
|
1416
|
+
}
|
|
1417
|
+
} catch (err) {
|
|
1418
|
+
// Silence is golden
|
|
1419
|
+
}
|
|
1420
|
+
return null;
|
|
1421
|
+
}, [
|
|
1422
|
+
telemetryProperties,
|
|
1423
|
+
userId,
|
|
1424
|
+
uuid
|
|
1425
|
+
]);
|
|
1426
|
+
return {
|
|
1427
|
+
trackUsage
|
|
1428
|
+
};
|
|
1429
|
+
};
|
|
1430
|
+
|
|
1431
|
+
const [ConfigurationContextProvider, useConfiguration] = createContext$1('ConfigurationContext');
|
|
1432
|
+
const ConfigurationProvider = ({ children, defaultAuthLogo, defaultMenuLogo, showReleaseNotification = false, showTutorials = false })=>{
|
|
1433
|
+
const { trackUsage } = useTracking();
|
|
1434
|
+
const { formatMessage } = useIntl();
|
|
1435
|
+
const { toggleNotification } = useNotification();
|
|
1436
|
+
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
|
|
1437
|
+
const permissions = useTypedSelector((state)=>state.admin_app.permissions.settings?.['project-settings']);
|
|
1438
|
+
const token = useAuth('ConfigurationProvider', (state)=>state.token);
|
|
1439
|
+
const { allowedActions: { canRead } } = useRBAC(permissions);
|
|
1440
|
+
const { data: { authLogo: customAuthLogo, menuLogo: customMenuLogo } = {}, error, isLoading } = useInitQuery();
|
|
1441
|
+
React.useEffect(()=>{
|
|
1442
|
+
if (error) {
|
|
1443
|
+
toggleNotification({
|
|
1444
|
+
type: 'danger',
|
|
1445
|
+
message: formatMessage({
|
|
1446
|
+
id: 'app.containers.App.notification.error.init'
|
|
1447
|
+
})
|
|
1448
|
+
});
|
|
1449
|
+
}
|
|
1450
|
+
}, [
|
|
1451
|
+
error,
|
|
1452
|
+
formatMessage,
|
|
1453
|
+
toggleNotification
|
|
1454
|
+
]);
|
|
1455
|
+
const { data, isSuccess } = useProjectSettingsQuery(undefined, {
|
|
1456
|
+
skip: !token || !canRead
|
|
1457
|
+
});
|
|
1458
|
+
const [updateProjectSettingsMutation] = useUpdateProjectSettingsMutation();
|
|
1459
|
+
const updateProjectSettings = React.useCallback(async (body)=>{
|
|
1460
|
+
const formData = new FormData();
|
|
1461
|
+
/**
|
|
1462
|
+
* We either only send files or we send null values.
|
|
1463
|
+
* Null removes the logo. If you don't want to effect
|
|
1464
|
+
* an existing logo, don't send anything.
|
|
1465
|
+
*/ Object.entries(body).forEach(([key, value])=>{
|
|
1466
|
+
if (value?.rawFile) {
|
|
1467
|
+
formData.append(key, value.rawFile);
|
|
1468
|
+
} else if (value === null) {
|
|
1469
|
+
formData.append(key, JSON.stringify(value));
|
|
1470
|
+
}
|
|
1471
|
+
});
|
|
1472
|
+
const res = await updateProjectSettingsMutation(formData);
|
|
1473
|
+
if ('data' in res) {
|
|
1474
|
+
const updatedMenuLogo = !!res.data.menuLogo && !!body.menuLogo?.rawFile;
|
|
1475
|
+
const updatedAuthLogo = !!res.data.authLogo && !!body.authLogo?.rawFile;
|
|
1476
|
+
if (updatedMenuLogo) {
|
|
1477
|
+
trackUsage('didChangeLogo', {
|
|
1478
|
+
logo: 'menu'
|
|
1479
|
+
});
|
|
1480
|
+
}
|
|
1481
|
+
if (updatedAuthLogo) {
|
|
1482
|
+
trackUsage('didChangeLogo', {
|
|
1483
|
+
logo: 'auth'
|
|
1484
|
+
});
|
|
1485
|
+
}
|
|
1486
|
+
toggleNotification({
|
|
1487
|
+
type: 'success',
|
|
1488
|
+
message: formatMessage({
|
|
1489
|
+
id: 'app',
|
|
1490
|
+
defaultMessage: 'Saved'
|
|
1491
|
+
})
|
|
1492
|
+
});
|
|
1493
|
+
} else {
|
|
1494
|
+
toggleNotification({
|
|
1495
|
+
type: 'danger',
|
|
1496
|
+
message: formatAPIError(res.error)
|
|
1497
|
+
});
|
|
1498
|
+
}
|
|
1499
|
+
}, [
|
|
1500
|
+
formatAPIError,
|
|
1501
|
+
formatMessage,
|
|
1502
|
+
toggleNotification,
|
|
1503
|
+
trackUsage,
|
|
1504
|
+
updateProjectSettingsMutation
|
|
1505
|
+
]);
|
|
1506
|
+
if (isLoading) {
|
|
1507
|
+
return /*#__PURE__*/ jsx(Page.Loading, {});
|
|
1508
|
+
}
|
|
1509
|
+
return /*#__PURE__*/ jsx(ConfigurationContextProvider, {
|
|
1510
|
+
showReleaseNotification: showReleaseNotification,
|
|
1511
|
+
showTutorials: showTutorials,
|
|
1512
|
+
logos: {
|
|
1513
|
+
menu: {
|
|
1514
|
+
custom: isSuccess ? data?.menuLogo : {
|
|
1515
|
+
url: customMenuLogo ?? ''
|
|
1516
|
+
},
|
|
1517
|
+
default: defaultMenuLogo
|
|
1518
|
+
},
|
|
1519
|
+
auth: {
|
|
1520
|
+
custom: isSuccess ? data?.authLogo : {
|
|
1521
|
+
url: customAuthLogo ?? ''
|
|
1522
|
+
},
|
|
1523
|
+
default: defaultAuthLogo
|
|
1524
|
+
}
|
|
1525
|
+
},
|
|
1526
|
+
updateProjectSettings: updateProjectSettings,
|
|
1527
|
+
children: children
|
|
1528
|
+
});
|
|
1529
|
+
};
|
|
1530
|
+
|
|
1531
|
+
const GUIDED_TOUR_COMPLETED_STEPS = 'GUIDED_TOUR_COMPLETED_STEPS';
|
|
1532
|
+
const GUIDED_TOUR_CURRENT_STEP = 'GUIDED_TOUR_CURRENT_STEP';
|
|
1533
|
+
const GUIDED_TOUR_SKIPPED = 'GUIDED_TOUR_SKIPPED';
|
|
1534
|
+
const [GuidedTourProviderImpl, useGuidedTour] = createContext('GuidedTour');
|
|
1535
|
+
const GuidedTourProvider = ({ children })=>{
|
|
1536
|
+
const [{ currentStep, guidedTourState, isGuidedTourVisible, isSkipped }, dispatch] = React.useReducer(reducer, initialState, initialiseState);
|
|
1537
|
+
const setCurrentStep = (step)=>{
|
|
1538
|
+
// if step is null it is intentional, we need to dispatch it
|
|
1539
|
+
if (step !== null) {
|
|
1540
|
+
const isStepAlreadyDone = get(guidedTourState, step);
|
|
1541
|
+
const [sectionName, stepName] = step.split('.');
|
|
1542
|
+
const sectionArray = Object.entries(guidedTourState[sectionName]);
|
|
1543
|
+
const currentStepIndex = sectionArray.findIndex(([key])=>key === stepName);
|
|
1544
|
+
const previousSteps = sectionArray.slice(0, currentStepIndex);
|
|
1545
|
+
const isStepToShow = previousSteps.every(([, sectionValue])=>sectionValue);
|
|
1546
|
+
if (isStepAlreadyDone || isSkipped || !isStepToShow) {
|
|
1547
|
+
return null;
|
|
1548
|
+
}
|
|
1549
|
+
}
|
|
1550
|
+
window.localStorage.setItem(GUIDED_TOUR_CURRENT_STEP, JSON.stringify(null));
|
|
1551
|
+
return dispatch({
|
|
1552
|
+
type: 'SET_CURRENT_STEP',
|
|
1553
|
+
step
|
|
1554
|
+
});
|
|
1555
|
+
};
|
|
1556
|
+
const setGuidedTourVisibility = (value)=>{
|
|
1557
|
+
dispatch({
|
|
1558
|
+
type: 'SET_GUIDED_TOUR_VISIBILITY',
|
|
1559
|
+
value
|
|
1560
|
+
});
|
|
1561
|
+
};
|
|
1562
|
+
const setStepState = (currentStep, value)=>{
|
|
1563
|
+
addCompletedStep(currentStep);
|
|
1564
|
+
dispatch({
|
|
1565
|
+
type: 'SET_STEP_STATE',
|
|
1566
|
+
currentStep,
|
|
1567
|
+
value
|
|
1568
|
+
});
|
|
1569
|
+
};
|
|
1570
|
+
const startSection = (sectionName)=>{
|
|
1571
|
+
const sectionSteps = guidedTourState[sectionName];
|
|
1572
|
+
if (sectionSteps) {
|
|
1573
|
+
const guidedTourArray = Object.entries(guidedTourState);
|
|
1574
|
+
// Find current section position in the guidedTourArray
|
|
1575
|
+
// Get only previous sections based on current section position
|
|
1576
|
+
const currentSectionIndex = guidedTourArray.findIndex(([key])=>key === sectionName);
|
|
1577
|
+
const previousSections = guidedTourArray.slice(0, currentSectionIndex);
|
|
1578
|
+
// Check if every steps from previous section are done
|
|
1579
|
+
const isSectionToShow = previousSections.every(([, sectionValue])=>Object.values(sectionValue).every(Boolean));
|
|
1580
|
+
const [firstStep] = Object.keys(sectionSteps);
|
|
1581
|
+
const isFirstStepDone = sectionSteps[firstStep];
|
|
1582
|
+
if (isSectionToShow && !currentStep && !isFirstStepDone) {
|
|
1583
|
+
setCurrentStep(`${sectionName}.${firstStep}`);
|
|
1584
|
+
}
|
|
1585
|
+
}
|
|
1586
|
+
};
|
|
1587
|
+
const setSkipped = (value)=>{
|
|
1588
|
+
window.localStorage.setItem(GUIDED_TOUR_SKIPPED, JSON.stringify(value));
|
|
1589
|
+
dispatch({
|
|
1590
|
+
type: 'SET_SKIPPED',
|
|
1591
|
+
value
|
|
1592
|
+
});
|
|
1593
|
+
};
|
|
1594
|
+
return /*#__PURE__*/ jsx(GuidedTourProviderImpl, {
|
|
1595
|
+
guidedTourState: guidedTourState,
|
|
1596
|
+
currentStep: currentStep,
|
|
1597
|
+
setCurrentStep: setCurrentStep,
|
|
1598
|
+
setGuidedTourVisibility: setGuidedTourVisibility,
|
|
1599
|
+
setSkipped: setSkipped,
|
|
1600
|
+
setStepState: setStepState,
|
|
1601
|
+
startSection: startSection,
|
|
1602
|
+
isGuidedTourVisible: isGuidedTourVisible,
|
|
1603
|
+
isSkipped: isSkipped,
|
|
1604
|
+
children: children
|
|
1605
|
+
});
|
|
1606
|
+
};
|
|
1607
|
+
const initialState = {
|
|
1608
|
+
currentStep: null,
|
|
1609
|
+
guidedTourState: {
|
|
1610
|
+
contentTypeBuilder: {
|
|
1611
|
+
create: false,
|
|
1612
|
+
success: false
|
|
1613
|
+
},
|
|
1614
|
+
contentManager: {
|
|
1615
|
+
create: false,
|
|
1616
|
+
success: false
|
|
1617
|
+
},
|
|
1618
|
+
apiTokens: {
|
|
1619
|
+
create: false,
|
|
1620
|
+
success: false
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
isGuidedTourVisible: false,
|
|
1624
|
+
isSkipped: false
|
|
1625
|
+
};
|
|
1626
|
+
const reducer = (state = initialState, action)=>produce(state, (draftState)=>{
|
|
1627
|
+
switch(action.type){
|
|
1628
|
+
case 'SET_CURRENT_STEP':
|
|
1629
|
+
{
|
|
1630
|
+
draftState.currentStep = action.step;
|
|
1631
|
+
break;
|
|
1632
|
+
}
|
|
1633
|
+
case 'SET_STEP_STATE':
|
|
1634
|
+
{
|
|
1635
|
+
const [section, step] = action.currentStep.split('.');
|
|
1636
|
+
draftState.guidedTourState[section][step] = action.value;
|
|
1637
|
+
break;
|
|
1638
|
+
}
|
|
1639
|
+
case 'SET_SKIPPED':
|
|
1640
|
+
{
|
|
1641
|
+
draftState.isSkipped = action.value;
|
|
1642
|
+
break;
|
|
1643
|
+
}
|
|
1644
|
+
case 'SET_GUIDED_TOUR_VISIBILITY':
|
|
1645
|
+
{
|
|
1646
|
+
draftState.isGuidedTourVisible = action.value;
|
|
1647
|
+
break;
|
|
1648
|
+
}
|
|
1649
|
+
default:
|
|
1650
|
+
{
|
|
1651
|
+
return draftState;
|
|
1652
|
+
}
|
|
1653
|
+
}
|
|
1654
|
+
});
|
|
1655
|
+
const initialiseState = (initialState)=>{
|
|
1656
|
+
const copyInitialState = {
|
|
1657
|
+
...initialState
|
|
1658
|
+
};
|
|
1659
|
+
const guidedTourLocaleStorage = JSON.parse(window.localStorage.getItem(GUIDED_TOUR_COMPLETED_STEPS) ?? '[]');
|
|
1660
|
+
const currentStepLocaleStorage = JSON.parse(window.localStorage.getItem(GUIDED_TOUR_CURRENT_STEP) ?? 'null');
|
|
1661
|
+
const skippedLocaleStorage = JSON.parse(window.localStorage.getItem(GUIDED_TOUR_SKIPPED) ?? 'null');
|
|
1662
|
+
if (Array.isArray(guidedTourLocaleStorage)) {
|
|
1663
|
+
guidedTourLocaleStorage.forEach((step)=>{
|
|
1664
|
+
const [sectionName, stepName] = step.split('.');
|
|
1665
|
+
set(copyInitialState, [
|
|
1666
|
+
'guidedTourState',
|
|
1667
|
+
sectionName,
|
|
1668
|
+
stepName
|
|
1669
|
+
], true);
|
|
1670
|
+
});
|
|
1671
|
+
}
|
|
1672
|
+
// if current step when initializing mark it as done
|
|
1673
|
+
if (currentStepLocaleStorage) {
|
|
1674
|
+
const [sectionName, stepName] = currentStepLocaleStorage.split('.');
|
|
1675
|
+
set(copyInitialState, [
|
|
1676
|
+
'guidedTourState',
|
|
1677
|
+
sectionName,
|
|
1678
|
+
stepName
|
|
1679
|
+
], true);
|
|
1680
|
+
addCompletedStep(currentStepLocaleStorage);
|
|
1681
|
+
window.localStorage.setItem(GUIDED_TOUR_CURRENT_STEP, JSON.stringify(null));
|
|
1682
|
+
}
|
|
1683
|
+
if (skippedLocaleStorage !== null) {
|
|
1684
|
+
set(copyInitialState, 'isSkipped', skippedLocaleStorage);
|
|
1685
|
+
}
|
|
1686
|
+
return copyInitialState;
|
|
1687
|
+
};
|
|
1688
|
+
/**
|
|
1689
|
+
* @description Add a completed step to the local storage if it does not already exist.
|
|
1690
|
+
*/ const addCompletedStep = (completedStep)=>{
|
|
1691
|
+
const currentSteps = JSON.parse(window.localStorage.getItem(GUIDED_TOUR_COMPLETED_STEPS) ?? '[]');
|
|
1692
|
+
if (!Array.isArray(currentSteps)) {
|
|
1693
|
+
return;
|
|
1694
|
+
}
|
|
1695
|
+
const isAlreadyStored = currentSteps.includes(completedStep);
|
|
1696
|
+
if (isAlreadyStored) {
|
|
1697
|
+
return;
|
|
1698
|
+
}
|
|
1699
|
+
window.localStorage.setItem(GUIDED_TOUR_COMPLETED_STEPS, JSON.stringify([
|
|
1700
|
+
...currentSteps,
|
|
1701
|
+
completedStep
|
|
1702
|
+
]));
|
|
1703
|
+
};
|
|
1704
|
+
|
|
1705
|
+
const LanguageProvider = ({ children, messages })=>{
|
|
1706
|
+
const locale = useTypedSelector((state)=>state.admin_app.language.locale);
|
|
1707
|
+
const appMessages = defaultsDeep(messages[locale], messages.en);
|
|
1708
|
+
return /*#__PURE__*/ jsx(IntlProvider, {
|
|
1709
|
+
locale: locale,
|
|
1710
|
+
defaultLocale: "en",
|
|
1711
|
+
messages: appMessages,
|
|
1712
|
+
textComponent: "span",
|
|
1713
|
+
children: children
|
|
1714
|
+
});
|
|
1715
|
+
};
|
|
1716
|
+
|
|
1717
|
+
const Theme = ({ children, themes })=>{
|
|
1718
|
+
const { currentTheme } = useTypedSelector((state)=>state.admin_app.theme);
|
|
1719
|
+
const [systemTheme, setSystemTheme] = React.useState();
|
|
1720
|
+
const { locale } = useIntl();
|
|
1721
|
+
const dispatch = useDispatch();
|
|
1722
|
+
// Listen to changes in the system theme
|
|
1723
|
+
React.useEffect(()=>{
|
|
1724
|
+
const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');
|
|
1725
|
+
setSystemTheme(themeWatcher.matches ? 'dark' : 'light');
|
|
1726
|
+
const listener = (event)=>{
|
|
1727
|
+
setSystemTheme(event.matches ? 'dark' : 'light');
|
|
1728
|
+
};
|
|
1729
|
+
themeWatcher.addEventListener('change', listener);
|
|
1730
|
+
// Remove listener on cleanup
|
|
1731
|
+
return ()=>{
|
|
1732
|
+
themeWatcher.removeEventListener('change', listener);
|
|
1733
|
+
};
|
|
1734
|
+
}, []);
|
|
1735
|
+
React.useEffect(()=>{
|
|
1736
|
+
dispatch(setAvailableThemes(Object.keys(themes)));
|
|
1737
|
+
}, [
|
|
1738
|
+
dispatch,
|
|
1739
|
+
themes
|
|
1740
|
+
]);
|
|
1741
|
+
const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;
|
|
1742
|
+
return /*#__PURE__*/ jsxs(DesignSystemProvider, {
|
|
1743
|
+
locale: locale,
|
|
1744
|
+
/**
|
|
1745
|
+
* TODO: could we make this neater i.e. by setting up the context to throw
|
|
1746
|
+
* if it can't find it, that way the type is always fully defined and we're
|
|
1747
|
+
* not checking it all the time...
|
|
1748
|
+
*/ theme: themes?.[computedThemeName || 'light'],
|
|
1749
|
+
children: [
|
|
1750
|
+
children,
|
|
1751
|
+
/*#__PURE__*/ jsx(GlobalStyle, {})
|
|
1752
|
+
]
|
|
1753
|
+
});
|
|
1754
|
+
};
|
|
1755
|
+
const GlobalStyle = createGlobalStyle`
|
|
1756
|
+
body {
|
|
1757
|
+
background: ${({ theme })=>theme.colors.neutral100};
|
|
1758
|
+
}
|
|
1759
|
+
`;
|
|
1760
|
+
|
|
1761
|
+
export { AuthProvider as A, TrackingProvider as B, ConfigurationContextProvider as C, ConfigurationProvider as D, LANGUAGE_LOCAL_STORAGE_KEY as E, getIn as F, GuidedTourProvider as G, setIn as H, setLocale as I, useForgotPasswordMutation as J, useGetRegistrationInfoQuery as K, LanguageProvider as L, useRegisterAdminMutation as M, NotificationsProvider as N, useRegisterUserMutation as O, Page as P, useResetPasswordMutation as Q, RBAC as R, StrapiAppProvider as S, Theme as T, logout as U, THEME_LOCAL_STORAGE_KEY as V, useTypedStore as W, useNotification as a, useTypedSelector as b, useTracking as c, useTypedDispatch as d, useAPIErrorHandler as e, useUpdateMeMutation as f, useIsSSOLockedQuery as g, createTypedSelector as h, useGetProviderOptionsQuery as i, useUpdateProviderOptionsMutation as j, useRBAC as k, useGetProvidersQuery as l, useGuidedTour as m, useQueryParams as n, login as o, useAppInfo as p, useStrapiApp as q, getStoredToken as r, setAppTheme as s, reducer$1 as t, useAuth as u, AppInfoProvider as v, useConfiguration as w, capitalise as x, isObject as y, createContext as z };
|
|
1762
|
+
//# sourceMappingURL=Theme-CDaBfQ-7.mjs.map
|