@strapi/admin 5.0.0-alpha.0 → 5.0.0-alpha.1
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/_chunks/{AdminSeatInfo-l78lfIiY.mjs → AdminSeatInfo-20pkL95U.mjs} +3 -3
- package/dist/_chunks/{AdminSeatInfo-l78lfIiY.mjs.map → AdminSeatInfo-20pkL95U.mjs.map} +1 -1
- package/dist/_chunks/{AdminSeatInfo-YaA1q_2d.js → AdminSeatInfo-TjK5LW2b.js} +3 -3
- package/dist/_chunks/{AdminSeatInfo-YaA1q_2d.js.map → AdminSeatInfo-TjK5LW2b.js.map} +1 -1
- package/dist/_chunks/{ApplicationInfoPage-PHLA1Ysy.js → ApplicationInfoPage-1OdKMDYH.js} +11 -12
- package/dist/_chunks/ApplicationInfoPage-1OdKMDYH.js.map +1 -0
- package/dist/_chunks/{ApplicationInfoPage-Zn5JU2zd.mjs → ApplicationInfoPage-ed6y9Q-B.mjs} +12 -13
- package/dist/_chunks/ApplicationInfoPage-ed6y9Q-B.mjs.map +1 -0
- package/dist/_chunks/{AuthResponse-1aYRF7_3.mjs → AuthResponse-Hxop00n-.mjs} +2 -2
- package/dist/_chunks/{AuthResponse-1aYRF7_3.mjs.map → AuthResponse-Hxop00n-.mjs.map} +1 -1
- package/dist/_chunks/{AuthResponse-7NG3smr6.js → AuthResponse-sca_wjIN.js} +2 -2
- package/dist/_chunks/{AuthResponse-7NG3smr6.js.map → AuthResponse-sca_wjIN.js.map} +1 -1
- package/dist/_chunks/{AuthenticatedLayout-5r4rzKeb.js → AuthenticatedLayout-PPlOm7kb.js} +14 -11
- package/dist/_chunks/AuthenticatedLayout-PPlOm7kb.js.map +1 -0
- package/dist/_chunks/{AuthenticatedLayout-a7KNOdln.mjs → AuthenticatedLayout-knXNB2i2.mjs} +11 -9
- package/dist/_chunks/AuthenticatedLayout-knXNB2i2.mjs.map +1 -0
- package/dist/_chunks/{ComponentConfigurationPage-pb8HhFAg.mjs → ComponentConfigurationPage-okd3XovW.mjs} +11 -12
- package/dist/_chunks/ComponentConfigurationPage-okd3XovW.mjs.map +1 -0
- package/dist/_chunks/{ComponentConfigurationPage-R3qV_iCR.js → ComponentConfigurationPage-xZMDjeVf.js} +11 -12
- package/dist/_chunks/ComponentConfigurationPage-xZMDjeVf.js.map +1 -0
- package/dist/_chunks/{CreateActionEE-a2zWCIpQ.js → CreateActionEE-E6YNdAVx.js} +2 -2
- package/dist/_chunks/{CreateActionEE-a2zWCIpQ.js.map → CreateActionEE-E6YNdAVx.js.map} +1 -1
- package/dist/_chunks/{CreateActionEE-hb4Pr-SD.mjs → CreateActionEE-PaZYJ410.mjs} +2 -2
- package/dist/_chunks/{CreateActionEE-hb4Pr-SD.mjs.map → CreateActionEE-PaZYJ410.mjs.map} +1 -1
- package/dist/_chunks/{CreatePage-nl6zKkKT.js → CreatePage-1Oi4-aR6.js} +17 -16
- package/dist/_chunks/CreatePage-1Oi4-aR6.js.map +1 -0
- package/dist/_chunks/{CreatePage-UC4uBFUR.mjs → CreatePage-6458K0l9.mjs} +3 -3
- package/dist/_chunks/{CreatePage-UC4uBFUR.mjs.map → CreatePage-6458K0l9.mjs.map} +1 -1
- package/dist/_chunks/{CreatePage-NSKUL8l4.js → CreatePage-DmNFNVN9.js} +10 -9
- package/dist/_chunks/CreatePage-DmNFNVN9.js.map +1 -0
- package/dist/_chunks/{CreatePage-Bil0egZ1.mjs → CreatePage-P1F3dkB3.mjs} +17 -16
- package/dist/_chunks/CreatePage-P1F3dkB3.mjs.map +1 -0
- package/dist/_chunks/{CreatePage-h5L6QP47.mjs → CreatePage-PM_r99U5.mjs} +10 -9
- package/dist/_chunks/CreatePage-PM_r99U5.mjs.map +1 -0
- package/dist/_chunks/{CreatePage-MAI6XyNg.js → CreatePage-hlkPO2Cv.js} +3 -3
- package/dist/_chunks/{CreatePage-MAI6XyNg.js.map → CreatePage-hlkPO2Cv.js.map} +1 -1
- package/dist/_chunks/{CreateView-kc0iM0LS.js → CreateView-AWmN1xWJ.js} +3 -3
- package/dist/_chunks/{CreateView-kc0iM0LS.js.map → CreateView-AWmN1xWJ.js.map} +1 -1
- package/dist/_chunks/{CreateView-RVrFxAFt.mjs → CreateView-cTvLLIgu.mjs} +3 -3
- package/dist/_chunks/{CreateView-RVrFxAFt.mjs.map → CreateView-cTvLLIgu.mjs.map} +1 -1
- package/dist/_chunks/{CreateView-3DMhoCPN.js → CreateView-hUH4bf5k.js} +3 -3
- package/dist/_chunks/{CreateView-3DMhoCPN.js.map → CreateView-hUH4bf5k.js.map} +1 -1
- package/dist/_chunks/{CreateView-DuSt3AcE.mjs → CreateView-pBI75ZwZ.mjs} +3 -3
- package/dist/_chunks/{CreateView-DuSt3AcE.mjs.map → CreateView-pBI75ZwZ.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-y_TvxjZM.mjs → EditConfigurationPage-LItt0mJo.mjs} +10 -11
- package/dist/_chunks/EditConfigurationPage-LItt0mJo.mjs.map +1 -0
- package/dist/_chunks/{EditConfigurationPage-OpEZOvAG.js → EditConfigurationPage-PZ4yq1bM.js} +10 -11
- package/dist/_chunks/EditConfigurationPage-PZ4yq1bM.js.map +1 -0
- package/dist/_chunks/{EditPage-_swY0Hy-.mjs → EditPage--EPGgPNr.mjs} +11 -10
- package/dist/_chunks/EditPage--EPGgPNr.mjs.map +1 -0
- package/dist/_chunks/{EditPage-fDVAYmuS.mjs → EditPage-30rqjB1d.mjs} +16 -16
- package/dist/_chunks/EditPage-30rqjB1d.mjs.map +1 -0
- package/dist/_chunks/{EditPage-wfPrhkA7.mjs → EditPage-GRIZWtGz.mjs} +19 -18
- package/dist/_chunks/{EditPage-wfPrhkA7.mjs.map → EditPage-GRIZWtGz.mjs.map} +1 -1
- package/dist/_chunks/{EditPage-VoRR5DCQ.mjs → EditPage-MPNLCYgQ.mjs} +14 -14
- package/dist/_chunks/EditPage-MPNLCYgQ.mjs.map +1 -0
- package/dist/_chunks/{EditPage-QoDSqYYq.js → EditPage-RpzlPkkU.js} +19 -18
- package/dist/_chunks/{EditPage-QoDSqYYq.js.map → EditPage-RpzlPkkU.js.map} +1 -1
- package/dist/_chunks/{EditPage-9aK8IFXY.js → EditPage-W6hncyNY.js} +15 -15
- package/dist/_chunks/EditPage-W6hncyNY.js.map +1 -0
- package/dist/_chunks/{EditPage-A6olBfVm.js → EditPage-_N_lm93z.js} +13 -13
- package/dist/_chunks/EditPage-_N_lm93z.js.map +1 -0
- package/dist/_chunks/{EditPage-PpBP7TBo.js → EditPage-mU2WAH0F.js} +11 -10
- package/dist/_chunks/EditPage-mU2WAH0F.js.map +1 -0
- package/dist/_chunks/{EditView-EuUw_2zc.mjs → EditView-0lXpbgG0.mjs} +12 -12
- package/dist/_chunks/EditView-0lXpbgG0.mjs.map +1 -0
- package/dist/_chunks/{EditView-C_ynfmtW.js → EditView-wDP9PNQY.js} +11 -11
- package/dist/_chunks/EditView-wDP9PNQY.js.map +1 -0
- package/dist/_chunks/{EditViewPage-Z_e1dpbU.js → EditViewPage-0Pd8zBi7.js} +16 -15
- package/dist/_chunks/EditViewPage-0Pd8zBi7.js.map +1 -0
- package/dist/_chunks/{EditViewPage-xYzUSAwS.mjs → EditViewPage-R6diW-gL.mjs} +7 -7
- package/dist/_chunks/EditViewPage-R6diW-gL.mjs.map +1 -0
- package/dist/_chunks/{EditViewPage-XtJmgPi5.js → EditViewPage-ed0-10GO.js} +6 -6
- package/dist/_chunks/EditViewPage-ed0-10GO.js.map +1 -0
- package/dist/_chunks/{EditViewPage-8uPO5GWR.mjs → EditViewPage-uWYR_o8w.mjs} +15 -15
- package/dist/_chunks/EditViewPage-uWYR_o8w.mjs.map +1 -0
- package/dist/_chunks/{EventsTable-WP7PUujH.mjs → EventsTable-CqN6AzV9.mjs} +2 -2
- package/dist/_chunks/{EventsTable-WP7PUujH.mjs.map → EventsTable-CqN6AzV9.mjs.map} +1 -1
- package/dist/_chunks/{EventsTable-hI0aV29K.js → EventsTable-R_AHW6Z4.js} +2 -2
- package/dist/_chunks/{EventsTable-hI0aV29K.js.map → EventsTable-R_AHW6Z4.js.map} +1 -1
- package/dist/_chunks/{FieldTypeIcon-OeDSkshr.js → FieldTypeIcon-1WDWx0cR.js} +2 -2
- package/dist/_chunks/{FieldTypeIcon-OeDSkshr.js.map → FieldTypeIcon-1WDWx0cR.js.map} +1 -1
- package/dist/_chunks/{FieldTypeIcon-Is5Qjngf.mjs → FieldTypeIcon-rAK1gg9p.mjs} +2 -2
- package/dist/_chunks/{FieldTypeIcon-Is5Qjngf.mjs.map → FieldTypeIcon-rAK1gg9p.mjs.map} +1 -1
- package/dist/_chunks/{Filters-xVuf1kg6.js → Filters-f6ghLf0Z.js} +2 -2
- package/dist/_chunks/{Filters-xVuf1kg6.js.map → Filters-f6ghLf0Z.js.map} +1 -1
- package/dist/_chunks/{Filters-tMd2Q5jg.mjs → Filters-rPaxqj4F.mjs} +2 -2
- package/dist/_chunks/{Filters-tMd2Q5jg.mjs.map → Filters-rPaxqj4F.mjs.map} +1 -1
- package/dist/_chunks/{Form-sZKjSFQC.mjs → Form-QOZA9Aq6.mjs} +6 -5
- package/dist/_chunks/Form-QOZA9Aq6.mjs.map +1 -0
- package/dist/_chunks/{Form-EiK_H9BI.js → Form-eqzCPjSo.js} +6 -5
- package/dist/_chunks/Form-eqzCPjSo.js.map +1 -0
- package/dist/_chunks/{History-1AF4LH3c.mjs → History-Eq4_WQPf.mjs} +4 -4
- package/dist/_chunks/{History-1AF4LH3c.mjs.map → History-Eq4_WQPf.mjs.map} +1 -1
- package/dist/_chunks/{History-V_ik1IL0.js → History-j00hpmXV.js} +4 -4
- package/dist/_chunks/{History-V_ik1IL0.js.map → History-j00hpmXV.js.map} +1 -1
- package/dist/_chunks/{HomePage-yrIp1-eG.js → HomePage-3IVOMrYf.js} +6 -5
- package/dist/_chunks/HomePage-3IVOMrYf.js.map +1 -0
- package/dist/_chunks/{HomePage-zL7HPV7A.js → HomePage-79fqDlve.js} +3 -3
- package/dist/_chunks/{HomePage-zL7HPV7A.js.map → HomePage-79fqDlve.js.map} +1 -1
- package/dist/_chunks/{HomePage-C6Ivli1q.mjs → HomePage-O-TRGX5T.mjs} +6 -5
- package/dist/_chunks/HomePage-O-TRGX5T.mjs.map +1 -0
- package/dist/_chunks/{HomePage-7Xva17wM.mjs → HomePage-gTElgmEK.mjs} +3 -3
- package/dist/_chunks/{HomePage-7Xva17wM.mjs.map → HomePage-gTElgmEK.mjs.map} +1 -1
- package/dist/_chunks/{InputRenderer-RMnWnPI4.js → InputRenderer-AVDw8MeU.js} +12 -19
- package/dist/_chunks/InputRenderer-AVDw8MeU.js.map +1 -0
- package/dist/_chunks/{InputRenderer-iP1kRki4.mjs → InputRenderer-bJwYq9ga.mjs} +13 -20
- package/dist/_chunks/InputRenderer-bJwYq9ga.mjs.map +1 -0
- package/dist/_chunks/{InstalledPluginsPage-PrMyistN.js → InstalledPluginsPage-FkR2xkQz.js} +5 -5
- package/dist/_chunks/InstalledPluginsPage-FkR2xkQz.js.map +1 -0
- package/dist/_chunks/{InstalledPluginsPage-7m_FfOGl.mjs → InstalledPluginsPage-R2hVFPZl.mjs} +6 -6
- package/dist/_chunks/InstalledPluginsPage-R2hVFPZl.mjs.map +1 -0
- package/dist/_chunks/{Layout-9Li8e-qi.js → Layout-G49-Vc5u.js} +5 -5
- package/dist/_chunks/Layout-G49-Vc5u.js.map +1 -0
- package/dist/_chunks/{Layout-EDS3Yv8X.mjs → Layout-cV6Se3U9.mjs} +6 -6
- package/dist/_chunks/Layout-cV6Se3U9.mjs.map +1 -0
- package/dist/_chunks/{Layout-DC68R0Fa.js → Layout-jweb3cF3.js} +2 -2
- package/dist/_chunks/{Layout-DC68R0Fa.js.map → Layout-jweb3cF3.js.map} +1 -1
- package/dist/_chunks/{Layout-tDfvrUZo.mjs → Layout-omCNy92r.mjs} +2 -2
- package/dist/_chunks/{Layout-tDfvrUZo.mjs.map → Layout-omCNy92r.mjs.map} +1 -1
- package/dist/_chunks/{ListConfigurationPage-Gl8AA-2t.js → ListConfigurationPage-70qtv4Ci.js} +11 -10
- package/dist/_chunks/ListConfigurationPage-70qtv4Ci.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-7O7HiJjG.mjs → ListConfigurationPage-PrJNO_6y.mjs} +11 -10
- package/dist/_chunks/ListConfigurationPage-PrJNO_6y.mjs.map +1 -0
- package/dist/_chunks/{ListPage-em8KMoKx.js → ListPage-2lswUYQN.js} +14 -14
- package/dist/_chunks/ListPage-2lswUYQN.js.map +1 -0
- package/dist/_chunks/{ListPage-_i7RNkUF.js → ListPage-78Cv8Vfq.js} +8 -8
- package/dist/_chunks/ListPage-78Cv8Vfq.js.map +1 -0
- package/dist/_chunks/{ListPage-skKuhRrN.js → ListPage-7dZ3nYvc.js} +12 -11
- package/dist/_chunks/ListPage-7dZ3nYvc.js.map +1 -0
- package/dist/_chunks/{ListPage-DZBRIMkE.mjs → ListPage-Cvn3WbMH.mjs} +14 -14
- package/dist/_chunks/ListPage-Cvn3WbMH.mjs.map +1 -0
- package/dist/_chunks/{ListPage-0eDZZ7Zw.js → ListPage-Ms6egnF5.js} +3 -3
- package/dist/_chunks/{ListPage-0eDZZ7Zw.js.map → ListPage-Ms6egnF5.js.map} +1 -1
- package/dist/_chunks/{ListPage-Ky2tG2bd.mjs → ListPage-NmUS_cOz.mjs} +9 -9
- package/dist/_chunks/ListPage-NmUS_cOz.mjs.map +1 -0
- package/dist/_chunks/{ListPage-NdzVJ_Ed.js → ListPage-Pf5LxUYn.js} +11 -9
- package/dist/_chunks/ListPage-Pf5LxUYn.js.map +1 -0
- package/dist/_chunks/{ListPage-cBvO_gYR.mjs → ListPage-Q81SX0vA.mjs} +3 -3
- package/dist/_chunks/{ListPage-cBvO_gYR.mjs.map → ListPage-Q81SX0vA.mjs.map} +1 -1
- package/dist/_chunks/{ListPage-RlY1nro4.mjs → ListPage-edro79m2.mjs} +9 -9
- package/dist/_chunks/ListPage-edro79m2.mjs.map +1 -0
- package/dist/_chunks/{ListPage-1q5Fi4W9.mjs → ListPage-mAUCZIg8.mjs} +14 -13
- package/dist/_chunks/ListPage-mAUCZIg8.mjs.map +1 -0
- package/dist/_chunks/{ListPage-God7L19W.mjs → ListPage-xFkcmM1b.mjs} +15 -15
- package/dist/_chunks/ListPage-xFkcmM1b.mjs.map +1 -0
- package/dist/_chunks/{ListPage-aElBcYPH.js → ListPage-yymh17qi.js} +13 -13
- package/dist/_chunks/ListPage-yymh17qi.js.map +1 -0
- package/dist/_chunks/{ListView-hm-mjZ8N.mjs → ListView--43zLiHW.mjs} +11 -11
- package/dist/_chunks/ListView--43zLiHW.mjs.map +1 -0
- package/dist/_chunks/{ListView--mxDKrnG.js → ListView-YtMAQnXL.js} +10 -10
- package/dist/_chunks/ListView-YtMAQnXL.js.map +1 -0
- package/dist/_chunks/{ListView-vP-PjR4p.js → ListView-nfA6o3qO.js} +9 -9
- package/dist/_chunks/ListView-nfA6o3qO.js.map +1 -0
- package/dist/_chunks/{ListView-QEgFV6dm.mjs → ListView-qPiKeCxj.mjs} +10 -10
- package/dist/_chunks/ListView-qPiKeCxj.mjs.map +1 -0
- package/dist/_chunks/{ListViewPage-NiwpwxBR.js → ListViewPage-Ys7-G2XX.js} +9 -9
- package/dist/_chunks/ListViewPage-Ys7-G2XX.js.map +1 -0
- package/dist/_chunks/{ListViewPage-xOVa04T_.mjs → ListViewPage-fPFonK_X.mjs} +10 -10
- package/dist/_chunks/ListViewPage-fPFonK_X.mjs.map +1 -0
- package/dist/_chunks/{Login-IFCsIrab.mjs → Login-6kXI90Vy.mjs} +2 -2
- package/dist/_chunks/{Login-IFCsIrab.mjs.map → Login-6kXI90Vy.mjs.map} +1 -1
- package/dist/_chunks/{Login-0FtP5Ck_.js → Login-Ge3DZEpr.js} +2 -2
- package/dist/_chunks/{Login-0FtP5Ck_.js.map → Login-Ge3DZEpr.js.map} +1 -1
- package/dist/_chunks/{MagicLinkEE-eaU4kQ6o.mjs → MagicLinkEE-HXWaLr0K.mjs} +3 -3
- package/dist/_chunks/{MagicLinkEE-eaU4kQ6o.mjs.map → MagicLinkEE-HXWaLr0K.mjs.map} +1 -1
- package/dist/_chunks/{MagicLinkEE-S7dXBaH0.js → MagicLinkEE-sXtA2gUK.js} +3 -3
- package/dist/_chunks/{MagicLinkEE-S7dXBaH0.js.map → MagicLinkEE-sXtA2gUK.js.map} +1 -1
- package/dist/_chunks/{MarketplacePage-f0ZrC_p8.mjs → MarketplacePage-hVOJ9_0k.mjs} +15 -20
- package/dist/_chunks/MarketplacePage-hVOJ9_0k.mjs.map +1 -0
- package/dist/_chunks/{MarketplacePage-zSQ_GRnZ.js → MarketplacePage-s8KDwNwK.js} +14 -19
- package/dist/_chunks/MarketplacePage-s8KDwNwK.js.map +1 -0
- package/dist/_chunks/{NoContentTypePage-_XU8B8oQ.js → NoContentTypePage-7YEcgsE3.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-_XU8B8oQ.js.map → NoContentTypePage-7YEcgsE3.js.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-ER4yVLjV.mjs → NoContentTypePage-szvJnQKF.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-ER4yVLjV.mjs.map → NoContentTypePage-szvJnQKF.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-5A4Hwjad.js → NoPermissionsPage-UX-5msLb.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-5A4Hwjad.js.map → NoPermissionsPage-UX-5msLb.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-DcFRsCHz.mjs → NoPermissionsPage-pqQFFlXa.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-DcFRsCHz.mjs.map → NoPermissionsPage-pqQFFlXa.mjs.map} +1 -1
- package/dist/_chunks/{Permissions-Ke5fqSQ2.mjs → Permissions-NUaDxULo.mjs} +3 -3
- package/dist/_chunks/Permissions-NUaDxULo.mjs.map +1 -0
- package/dist/_chunks/{Permissions--rdF1ZKQ.js → Permissions-a0IZJ8dM.js} +6 -5
- package/dist/_chunks/Permissions-a0IZJ8dM.js.map +1 -0
- package/dist/_chunks/{PrivateRoute-GLTcdbu8.js → PrivateRoute-KGxyTa5b.js} +2 -2
- package/dist/_chunks/{PrivateRoute-GLTcdbu8.js.map → PrivateRoute-KGxyTa5b.js.map} +1 -1
- package/dist/_chunks/{PrivateRoute-dWrZb-9J.mjs → PrivateRoute-eP4-pBby.mjs} +2 -2
- package/dist/_chunks/{PrivateRoute-dWrZb-9J.mjs.map → PrivateRoute-eP4-pBby.mjs.map} +1 -1
- package/dist/_chunks/{ProfilePage-bE7txhNu.mjs → ProfilePage-LXB-_EZ8.mjs} +14 -14
- package/dist/_chunks/ProfilePage-LXB-_EZ8.mjs.map +1 -0
- package/dist/_chunks/{ProfilePage-EEcNKnGH.js → ProfilePage-MBCGqbc_.js} +13 -13
- package/dist/_chunks/ProfilePage-MBCGqbc_.js.map +1 -0
- package/dist/_chunks/{ReviewWorkflowsColumn-hJRkAN5a.js → ReviewWorkflowsColumn-Ancp7-x3.js} +2 -2
- package/dist/_chunks/{ReviewWorkflowsColumn-hJRkAN5a.js.map → ReviewWorkflowsColumn-Ancp7-x3.js.map} +1 -1
- package/dist/_chunks/{ReviewWorkflowsColumn-FDxVKdto.mjs → ReviewWorkflowsColumn-WzYpj2O3.mjs} +2 -2
- package/dist/_chunks/{ReviewWorkflowsColumn-FDxVKdto.mjs.map → ReviewWorkflowsColumn-WzYpj2O3.mjs.map} +1 -1
- package/dist/_chunks/{SelectRoles-Iih1yeTu.mjs → SelectRoles-Dxz_rAaT.mjs} +6 -9
- package/dist/_chunks/SelectRoles-Dxz_rAaT.mjs.map +1 -0
- package/dist/_chunks/{SelectRoles-XK5HcBdP.js → SelectRoles-Pr2wqehq.js} +5 -8
- package/dist/_chunks/SelectRoles-Pr2wqehq.js.map +1 -0
- package/dist/_chunks/{SingleSignOnPage-uURRsIxP.js → SingleSignOnPage-4dK4id8H.js} +9 -9
- package/dist/_chunks/SingleSignOnPage-4dK4id8H.js.map +1 -0
- package/dist/_chunks/{SingleSignOnPage-vOeDxBfa.mjs → SingleSignOnPage-gxgIeURz.mjs} +10 -10
- package/dist/_chunks/SingleSignOnPage-gxgIeURz.mjs.map +1 -0
- package/dist/_chunks/{Table-k6gVR2KH.mjs → Table-NiTkS4IC.mjs} +2 -2
- package/dist/_chunks/{Table-k6gVR2KH.mjs.map → Table-NiTkS4IC.mjs.map} +1 -1
- package/dist/_chunks/{Table-VsNr4Mha.js → Table-_9gVkGGi.js} +2 -2
- package/dist/_chunks/{Table-VsNr4Mha.js.map → Table-_9gVkGGi.js.map} +1 -1
- package/dist/_chunks/{TokenTypeSelect-QN_bDdss.js → TokenTypeSelect-3aWUm1cW.js} +10 -10
- package/dist/_chunks/TokenTypeSelect-3aWUm1cW.js.map +1 -0
- package/dist/_chunks/{TokenTypeSelect-Z9iyoteG.mjs → TokenTypeSelect-jtfCyMMZ.mjs} +10 -10
- package/dist/_chunks/TokenTypeSelect-jtfCyMMZ.mjs.map +1 -0
- package/dist/_chunks/{UseCasePage-qJwKBweD.mjs → UseCasePage-0qXYZ8kt.mjs} +7 -6
- package/dist/_chunks/UseCasePage-0qXYZ8kt.mjs.map +1 -0
- package/dist/_chunks/{UseCasePage-xAlTWOcX.js → UseCasePage-QK-B8FfM.js} +7 -6
- package/dist/_chunks/UseCasePage-QK-B8FfM.js.map +1 -0
- package/dist/_chunks/{apiTokens-dGGyJI-w.mjs → apiTokens-DO6vkoyd.mjs} +2 -2
- package/dist/_chunks/{apiTokens-dGGyJI-w.mjs.map → apiTokens-DO6vkoyd.mjs.map} +1 -1
- package/dist/_chunks/{apiTokens-b3w4qO8B.js → apiTokens-TayNdk_V.js} +2 -2
- package/dist/_chunks/{apiTokens-b3w4qO8B.js.map → apiTokens-TayNdk_V.js.map} +1 -1
- package/dist/_chunks/{constants-ruIkLWCb.mjs → constants-FEW7x2Od.mjs} +2 -2
- package/dist/_chunks/{constants-ruIkLWCb.mjs.map → constants-FEW7x2Od.mjs.map} +1 -1
- package/dist/_chunks/{constants-PHXhIuUs.js → constants-RZp8o_c4.js} +2 -2
- package/dist/_chunks/{constants-PHXhIuUs.js.map → constants-RZp8o_c4.js.map} +1 -1
- package/dist/_chunks/{constants-IZEgEoW9.js → constants-Xd-X3SCR.js} +3 -3
- package/dist/_chunks/{constants-IZEgEoW9.js.map → constants-Xd-X3SCR.js.map} +1 -1
- package/dist/_chunks/{constants-WjN6I3sL.mjs → constants-_T5uxsuv.mjs} +3 -3
- package/dist/_chunks/{constants-WjN6I3sL.mjs.map → constants-_T5uxsuv.mjs.map} +1 -1
- package/dist/_chunks/{index-ibtz273H.js → index-ejSDPT-T.js} +151 -326
- package/dist/_chunks/index-ejSDPT-T.js.map +1 -0
- package/dist/_chunks/{index-5ZvCaCyY.mjs → index-hjUhNUvw.mjs} +279 -455
- package/dist/_chunks/index-hjUhNUvw.mjs.map +1 -0
- package/dist/_chunks/{selectors-TFKI8arF.js → selectors-T2YIN4Fb.js} +2 -2
- package/dist/_chunks/{selectors-TFKI8arF.js.map → selectors-T2YIN4Fb.js.map} +1 -1
- package/dist/_chunks/{selectors-JBxTdRJK.mjs → selectors-uLWxH-jN.mjs} +2 -2
- package/dist/_chunks/{selectors-JBxTdRJK.mjs.map → selectors-uLWxH-jN.mjs.map} +1 -1
- package/dist/_chunks/{transferTokens-G-suI4pp.js → transferTokens-T-kGMb3U.js} +2 -2
- package/dist/_chunks/{transferTokens-G-suI4pp.js.map → transferTokens-T-kGMb3U.js.map} +1 -1
- package/dist/_chunks/{transferTokens-4KlyXDql.mjs → transferTokens-jdkk-sPx.mjs} +2 -2
- package/dist/_chunks/{transferTokens-4KlyXDql.mjs.map → transferTokens-jdkk-sPx.mjs.map} +1 -1
- package/dist/_chunks/{useAdminRoles-7_YWhmkQ.mjs → useAdminRoles-QJQS1BCd.mjs} +2 -2
- package/dist/_chunks/{useAdminRoles-7_YWhmkQ.mjs.map → useAdminRoles-QJQS1BCd.mjs.map} +1 -1
- package/dist/_chunks/{useAdminRoles-o4dxsCcY.js → useAdminRoles-SnzC_mvy.js} +2 -2
- package/dist/_chunks/{useAdminRoles-o4dxsCcY.js.map → useAdminRoles-SnzC_mvy.js.map} +1 -1
- package/dist/_chunks/{useContentTypes-dRoMxL8c.js → useContentTypes-Lpg-eJmK.js} +5 -4
- package/dist/_chunks/useContentTypes-Lpg-eJmK.js.map +1 -0
- package/dist/_chunks/{useContentTypes-x6OLbsWe.mjs → useContentTypes-U-n1-lz0.mjs} +5 -4
- package/dist/_chunks/useContentTypes-U-n1-lz0.mjs.map +1 -0
- package/dist/_chunks/{useLicenseLimitNotification-BaSsY40x.js → useLicenseLimitNotification-Hjv_LKmp.js} +6 -5
- package/dist/_chunks/useLicenseLimitNotification-Hjv_LKmp.js.map +1 -0
- package/dist/_chunks/{useLicenseLimitNotification-wzvrsJoL.mjs → useLicenseLimitNotification-yJHxF4YO.mjs} +6 -5
- package/dist/_chunks/useLicenseLimitNotification-yJHxF4YO.mjs.map +1 -0
- package/dist/_chunks/{useReviewWorkflows-PAvhwNm3.mjs → useReviewWorkflows-0rQx2KxS.mjs} +2 -2
- package/dist/_chunks/{useReviewWorkflows-PAvhwNm3.mjs.map → useReviewWorkflows-0rQx2KxS.mjs.map} +1 -1
- package/dist/_chunks/{useReviewWorkflows-3SKYABe_.js → useReviewWorkflows-QoSEilRp.js} +2 -2
- package/dist/_chunks/{useReviewWorkflows-3SKYABe_.js.map → useReviewWorkflows-QoSEilRp.js.map} +1 -1
- package/dist/_chunks/{useSyncRbac-f7CCq_yt.js → useSyncRbac-hZJWbmmY.js} +2 -2
- package/dist/_chunks/{useSyncRbac-f7CCq_yt.js.map → useSyncRbac-hZJWbmmY.js.map} +1 -1
- package/dist/_chunks/{useSyncRbac-Kt8Li0Yf.mjs → useSyncRbac-wVgN6XIc.mjs} +2 -2
- package/dist/_chunks/{useSyncRbac-Kt8Li0Yf.mjs.map → useSyncRbac-wVgN6XIc.mjs.map} +1 -1
- package/dist/_chunks/{useWebhooks-Fhm21I_2.js → useWebhooks-1ZG0V0Mc.js} +2 -2
- package/dist/_chunks/{useWebhooks-Fhm21I_2.js.map → useWebhooks-1ZG0V0Mc.js.map} +1 -1
- package/dist/_chunks/{useWebhooks-6rWM4vzd.mjs → useWebhooks-WBwti5Jl.mjs} +2 -2
- package/dist/_chunks/{useWebhooks-6rWM4vzd.mjs.map → useWebhooks-WBwti5Jl.mjs.map} +1 -1
- package/dist/_chunks/{validateWorkflow-DlwU9a4N.mjs → validateWorkflow-23kb45Oa.mjs} +6 -5
- package/dist/_chunks/validateWorkflow-23kb45Oa.mjs.map +1 -0
- package/dist/_chunks/{validateWorkflow-1g4fl4e7.js → validateWorkflow-MaEpFiHz.js} +9 -8
- package/dist/_chunks/validateWorkflow-MaEpFiHz.js.map +1 -0
- package/dist/_chunks/{validation-NckIpCgz.js → validation-7cD0kJHF.js} +2 -2
- package/dist/_chunks/{validation-NckIpCgz.js.map → validation-7cD0kJHF.js.map} +1 -1
- package/dist/_chunks/{validation-aaWzg0nE.mjs → validation-rilbXPnt.mjs} +2 -2
- package/dist/_chunks/{validation-aaWzg0nE.mjs.map → validation-rilbXPnt.mjs.map} +1 -1
- package/dist/admin/index.js +1 -4
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +22 -25
- package/dist/admin/src/content-manager/pages/EditView/components/DocumentActions.d.ts +1 -2
- package/dist/admin/src/hooks/useAPIErrorHandler.d.ts +2 -2
- package/dist/admin/src/index.d.ts +0 -2
- package/dist/admin/src/pages/Marketplace/components/NpmPackageCard.d.ts +1 -1
- package/dist/admin/src/pages/Marketplace/components/NpmPackagesGrid.d.ts +1 -1
- package/dist/admin/src/pages/Marketplace/hooks/useMarketplaceData.d.ts +2 -2
- package/dist/admin/src/utils/users.d.ts +1 -1
- package/dist/server/src/validation/api-tokens.d.ts +27 -4
- package/dist/server/src/validation/api-tokens.d.ts.map +1 -1
- package/dist/server/src/validation/authentication/register.d.ts +8 -2
- package/dist/server/src/validation/authentication/register.d.ts.map +1 -1
- package/dist/server/src/validation/permission.d.ts +53 -4
- package/dist/server/src/validation/permission.d.ts.map +1 -1
- package/dist/server/src/validation/policies/hasPermissions.d.ts +7 -2
- package/dist/server/src/validation/policies/hasPermissions.d.ts.map +1 -1
- package/dist/server/src/validation/role.d.ts +23 -6
- package/dist/server/src/validation/role.d.ts.map +1 -1
- package/dist/server/src/validation/transfer/token.d.ts +23 -4
- package/dist/server/src/validation/transfer/token.d.ts.map +1 -1
- package/dist/server/src/validation/user.d.ts +56 -8
- package/dist/server/src/validation/user.d.ts.map +1 -1
- package/package.json +19 -12
- package/dist/_chunks/ApplicationInfoPage-PHLA1Ysy.js.map +0 -1
- package/dist/_chunks/ApplicationInfoPage-Zn5JU2zd.mjs.map +0 -1
- package/dist/_chunks/AuthenticatedLayout-5r4rzKeb.js.map +0 -1
- package/dist/_chunks/AuthenticatedLayout-a7KNOdln.mjs.map +0 -1
- package/dist/_chunks/ComponentConfigurationPage-R3qV_iCR.js.map +0 -1
- package/dist/_chunks/ComponentConfigurationPage-pb8HhFAg.mjs.map +0 -1
- package/dist/_chunks/CreatePage-Bil0egZ1.mjs.map +0 -1
- package/dist/_chunks/CreatePage-NSKUL8l4.js.map +0 -1
- package/dist/_chunks/CreatePage-h5L6QP47.mjs.map +0 -1
- package/dist/_chunks/CreatePage-nl6zKkKT.js.map +0 -1
- package/dist/_chunks/EditConfigurationPage-OpEZOvAG.js.map +0 -1
- package/dist/_chunks/EditConfigurationPage-y_TvxjZM.mjs.map +0 -1
- package/dist/_chunks/EditPage-9aK8IFXY.js.map +0 -1
- package/dist/_chunks/EditPage-A6olBfVm.js.map +0 -1
- package/dist/_chunks/EditPage-PpBP7TBo.js.map +0 -1
- package/dist/_chunks/EditPage-VoRR5DCQ.mjs.map +0 -1
- package/dist/_chunks/EditPage-_swY0Hy-.mjs.map +0 -1
- package/dist/_chunks/EditPage-fDVAYmuS.mjs.map +0 -1
- package/dist/_chunks/EditView-C_ynfmtW.js.map +0 -1
- package/dist/_chunks/EditView-EuUw_2zc.mjs.map +0 -1
- package/dist/_chunks/EditViewPage-8uPO5GWR.mjs.map +0 -1
- package/dist/_chunks/EditViewPage-XtJmgPi5.js.map +0 -1
- package/dist/_chunks/EditViewPage-Z_e1dpbU.js.map +0 -1
- package/dist/_chunks/EditViewPage-xYzUSAwS.mjs.map +0 -1
- package/dist/_chunks/Form-EiK_H9BI.js.map +0 -1
- package/dist/_chunks/Form-sZKjSFQC.mjs.map +0 -1
- package/dist/_chunks/HomePage-C6Ivli1q.mjs.map +0 -1
- package/dist/_chunks/HomePage-yrIp1-eG.js.map +0 -1
- package/dist/_chunks/InputRenderer-RMnWnPI4.js.map +0 -1
- package/dist/_chunks/InputRenderer-iP1kRki4.mjs.map +0 -1
- package/dist/_chunks/InstalledPluginsPage-7m_FfOGl.mjs.map +0 -1
- package/dist/_chunks/InstalledPluginsPage-PrMyistN.js.map +0 -1
- package/dist/_chunks/Layout-9Li8e-qi.js.map +0 -1
- package/dist/_chunks/Layout-EDS3Yv8X.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-7O7HiJjG.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-Gl8AA-2t.js.map +0 -1
- package/dist/_chunks/ListPage-1q5Fi4W9.mjs.map +0 -1
- package/dist/_chunks/ListPage-DZBRIMkE.mjs.map +0 -1
- package/dist/_chunks/ListPage-God7L19W.mjs.map +0 -1
- package/dist/_chunks/ListPage-Ky2tG2bd.mjs.map +0 -1
- package/dist/_chunks/ListPage-NdzVJ_Ed.js.map +0 -1
- package/dist/_chunks/ListPage-RlY1nro4.mjs.map +0 -1
- package/dist/_chunks/ListPage-_i7RNkUF.js.map +0 -1
- package/dist/_chunks/ListPage-aElBcYPH.js.map +0 -1
- package/dist/_chunks/ListPage-em8KMoKx.js.map +0 -1
- package/dist/_chunks/ListPage-skKuhRrN.js.map +0 -1
- package/dist/_chunks/ListView--mxDKrnG.js.map +0 -1
- package/dist/_chunks/ListView-QEgFV6dm.mjs.map +0 -1
- package/dist/_chunks/ListView-hm-mjZ8N.mjs.map +0 -1
- package/dist/_chunks/ListView-vP-PjR4p.js.map +0 -1
- package/dist/_chunks/ListViewPage-NiwpwxBR.js.map +0 -1
- package/dist/_chunks/ListViewPage-xOVa04T_.mjs.map +0 -1
- package/dist/_chunks/MarketplacePage-f0ZrC_p8.mjs.map +0 -1
- package/dist/_chunks/MarketplacePage-zSQ_GRnZ.js.map +0 -1
- package/dist/_chunks/Permissions--rdF1ZKQ.js.map +0 -1
- package/dist/_chunks/Permissions-Ke5fqSQ2.mjs.map +0 -1
- package/dist/_chunks/ProfilePage-EEcNKnGH.js.map +0 -1
- package/dist/_chunks/ProfilePage-bE7txhNu.mjs.map +0 -1
- package/dist/_chunks/SelectRoles-Iih1yeTu.mjs.map +0 -1
- package/dist/_chunks/SelectRoles-XK5HcBdP.js.map +0 -1
- package/dist/_chunks/SingleSignOnPage-uURRsIxP.js.map +0 -1
- package/dist/_chunks/SingleSignOnPage-vOeDxBfa.mjs.map +0 -1
- package/dist/_chunks/TokenTypeSelect-QN_bDdss.js.map +0 -1
- package/dist/_chunks/TokenTypeSelect-Z9iyoteG.mjs.map +0 -1
- package/dist/_chunks/UseCasePage-qJwKBweD.mjs.map +0 -1
- package/dist/_chunks/UseCasePage-xAlTWOcX.js.map +0 -1
- package/dist/_chunks/index-5ZvCaCyY.mjs.map +0 -1
- package/dist/_chunks/index-ibtz273H.js.map +0 -1
- package/dist/_chunks/useContentTypes-dRoMxL8c.js.map +0 -1
- package/dist/_chunks/useContentTypes-x6OLbsWe.mjs.map +0 -1
- package/dist/_chunks/useLicenseLimitNotification-BaSsY40x.js.map +0 -1
- package/dist/_chunks/useLicenseLimitNotification-wzvrsJoL.mjs.map +0 -1
- package/dist/_chunks/validateWorkflow-1g4fl4e7.js.map +0 -1
- package/dist/_chunks/validateWorkflow-DlwU9a4N.mjs.map +0 -1
- package/dist/admin/src/features/AppInfo.d.ts +0 -22
- package/dist/admin/src/features/Notifications.d.ts +0 -47
- package/dist/admin/src/utils/getYupInnerErrors.d.ts +0 -7
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-ibtz273H.js","sources":["../../ee/admin/src/constants.ts","../../ee/admin/src/pages/SettingsPage/constants.ts","../../admin/src/features/Notifications.tsx","../../admin/src/utils/getPrefixedId.ts","../../admin/src/utils/normalizeAPIError.ts","../../admin/src/hooks/useAPIErrorHandler.ts","../../admin/src/utils/baseQuery.ts","../../admin/src/services/api.ts","../../admin/src/services/auth.ts","../../admin/src/components/PageHelpers.tsx","../../admin/src/components/Context.tsx","../../admin/src/core/store/hooks.ts","../../admin/src/reducer.ts","../../admin/src/features/Auth.tsx","../../admin/src/features/BackButton.tsx","../../admin/src/utils/urls.ts","../../admin/src/services/admin.ts","../../admin/src/features/AppInfo.tsx","../../admin/src/features/Tracking.tsx","../../admin/src/features/Configuration.tsx","../../admin/src/features/StrapiApp.tsx","../../admin/src/components/GuidedTour/Provider.tsx","../../admin/src/components/LanguageProvider.tsx","../../admin/src/components/Theme.tsx","../../admin/src/components/Providers.tsx","../../admin/src/App.tsx","../../admin/src/assets/images/logo-strapi-2022.svg","../../admin/src/components/ErrorElement.tsx","../../admin/src/hooks/useInjectionZone.ts","../../admin/src/components/InjectionZone.tsx","../../admin/src/constants.ts","../../admin/src/content-manager/constants/collections.ts","../../admin/src/content-manager/history/routes.tsx","../../admin/src/content-manager/router.tsx","../../admin/src/utils/getYupInnerErrors.ts","../../admin/src/content-manager/services/api.ts","../../admin/src/content-manager/services/documents.ts","../../admin/src/content-manager/utils/api.ts","../../admin/src/utils/translatedErrors.ts","../../admin/src/content-manager/constants/attributes.ts","../../admin/src/content-manager/utils/validation.ts","../../admin/src/content-manager/services/init.ts","../../admin/src/content-manager/hooks/useContentTypeSchema.ts","../../admin/src/content-manager/hooks/useDocument.ts","../../admin/src/utils/objects.ts","../../admin/src/components/Form.tsx","../../admin/src/services/users.ts","../../admin/src/utils/users.ts","../../ee/admin/src/services/reviewWorkflows.ts","../../ee/admin/src/content-manager/pages/EditView/components/constants.ts","../../ee/admin/src/content-manager/pages/EditView/components/AssigneeSelect.tsx","../../ee/admin/src/hooks/useLicenseLimits.ts","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/assets/balloon.png","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal.tsx","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/constants.ts","../../ee/admin/src/pages/SettingsPage/pages/ReviewWorkflows/utils/colors.ts","../../ee/admin/src/content-manager/pages/EditView/components/StageSelect.tsx","../../ee/admin/src/content-manager/pages/EditView/components/ReviewWorkflowsPanel.tsx","../../admin/src/content-manager/history/components/HistoryAction.tsx","../../admin/src/content-manager/features/DocumentRBAC.tsx","../../admin/src/content-manager/utils/translations.ts","../../admin/src/content-manager/hooks/useDocumentActions.ts","../../admin/src/content-manager/pages/EditView/components/DocumentActions.tsx","../../admin/src/hooks/useIsMounted.ts","../../admin/src/hooks/useForceUpdate.ts","../../admin/src/hooks/useThrottledCallback.ts","../../admin/src/utils/shims.ts","../../admin/src/components/DescriptionComponentRenderer.tsx","../../admin/src/components/RelativeTime.tsx","../../admin/src/utils/strings.ts","../../admin/src/content-manager/pages/EditView/components/DocumentStatus.tsx","../../admin/src/content-manager/pages/EditView/components/Header.tsx","../../admin/src/content-manager/pages/EditView/components/Panels.tsx","../../admin/src/content-manager/pages/ListView/components/AutoCloneFailureModal.tsx","../../admin/src/content-manager/pages/ListView/components/TableActions.tsx","../../admin/src/core/apis/content-manager.ts","../../admin/src/core/apis/CustomFields.ts","../../admin/src/core/apis/Plugin.ts","../../admin/src/components/RBACProvider.tsx","../../admin/src/components/DragLayer.tsx","../../admin/src/content-manager/components/DragPreviews/CardDragPreview.tsx","../../admin/src/content-manager/components/DragPreviews/ComponentDragPreview.tsx","../../admin/src/content-manager/constants/dragAndDrop.ts","../../admin/src/content-manager/hooks/useKeyboardDragAndDrop.ts","../../admin/src/content-manager/hooks/useDragAndDrop.ts","../../admin/src/content-manager/services/relations.ts","../../admin/src/content-manager/utils/relations.ts","../../admin/src/content-manager/pages/EditView/components/FormInputs/ComponentContext.tsx","../../admin/src/content-manager/pages/EditView/components/FormInputs/Relations.tsx","../../admin/src/content-manager/components/DragPreviews/RelationDragPreview.tsx","../../admin/src/content-manager/components/LeftMenu.tsx","../../admin/src/content-manager/services/contentTypes.ts","../../admin/src/content-manager/hooks/useContentManagerInitData.ts","../../admin/src/content-manager/layout.tsx","../../admin/src/content-manager/modules/rbac.ts","../../admin/src/content-manager/modules/reducers.ts","../../admin/src/core/store/configure.ts","../../admin/src/core/utils/basename.ts","../../admin/src/core/utils/createHook.ts","../../admin/src/hooks/useEnterprise.ts","../../admin/src/components/FormInputs/Boolean.tsx","../../admin/src/components/FormInputs/Checkbox.tsx","../../admin/src/components/FormInputs/Date.tsx","../../admin/src/components/FormInputs/DateTime.tsx","../../admin/src/components/FormInputs/Email.tsx","../../admin/src/components/FormInputs/Enumeration.tsx","../../admin/src/components/FormInputs/Json.tsx","../../admin/src/components/FormInputs/Number.tsx","../../admin/src/components/FormInputs/Password.tsx","../../admin/src/components/FormInputs/String.tsx","../../admin/src/components/FormInputs/Textarea.tsx","../../admin/src/components/FormInputs/Time.tsx","../../admin/src/components/FormInputs/Renderer.tsx","../../admin/src/components/UnauthenticatedLogo.tsx","../../admin/src/layouts/UnauthenticatedLayout.tsx","../../admin/src/pages/Auth/components/Login.tsx","../../admin/src/pages/Auth/components/ForgotPassword.tsx","../../admin/src/pages/Auth/components/ForgotPasswordSuccess.tsx","../../admin/src/pages/Auth/components/Oops.tsx","../../admin/src/components/NpsSurvey.tsx","../../admin/src/pages/Auth/components/Register.tsx","../../admin/src/pages/Auth/components/ResetPassword.tsx","../../admin/src/pages/Auth/constants.ts","../../admin/src/pages/Auth/AuthPage.tsx","../../admin/src/pages/NotFoundPage.tsx","../../admin/src/pages/Settings/constants.ts","../../admin/src/translations/languageNativeNames.ts","../../admin/src/StrapiApp.tsx","../../admin/src/render.ts","../../admin/src/components/ConfirmDialog.tsx","../../admin/src/components/Pagination.tsx","../../admin/src/components/SearchInput.tsx","../../admin/src/hooks/useControllableState.ts","../../admin/src/components/Table.tsx","../../admin/src/hooks/useInjectReducer.ts","../../admin/src/content-manager/utils/attributes.ts","../../admin/src/content-manager/hooks/useDocumentLayout.ts"],"sourcesContent":["import type { SettingsMenu } from '../../../admin/src/constants';\nimport type { PermissionMap } from '../../../admin/src/types/permissions';\nimport type { RouteObject } from 'react-router-dom';\n\nexport const ADMIN_PERMISSIONS_EE = {\n settings: {\n auditLogs: {\n main: [{ action: 'admin::audit-logs.read', subject: null }],\n read: [{ action: 'admin::audit-logs.read', subject: null }],\n update: [{ action: 'admin::audit-logs.update', subject: null }],\n },\n 'review-workflows': {\n main: [{ action: 'admin::review-workflows.read', subject: null }],\n read: [{ action: 'admin::review-workflows.read', subject: null }],\n create: [{ action: 'admin::review-workflows.create', subject: null }],\n delete: [{ action: 'admin::review-workflows.delete', subject: null }],\n update: [{ action: 'admin::review-workflows.update', subject: null }],\n },\n sso: {\n main: [{ action: 'admin::provider-login.read', subject: null }],\n read: [{ action: 'admin::provider-login.read', subject: null }],\n update: [{ action: 'admin::provider-login.update', subject: null }],\n },\n },\n} satisfies {\n settings: Pick<PermissionMap['settings'], 'auditLogs' | 'review-workflows' | 'sso'>;\n};\n\n/**\n * Base EE routes, these are relative to the `root` of the app.\n * We use a function to get them so we're not looking at window\n * during build time.\n */\nexport const getEERoutes = (): RouteObject[] =>\n window.strapi.isEE\n ? [\n {\n path: 'auth/login/:authResponse',\n lazy: async () => {\n const { AuthResponse } = await import('./pages/AuthResponse');\n\n return {\n Component: AuthResponse,\n };\n },\n },\n ]\n : [];\n\n// TODO: the constants.js file is imported before the React application is setup and\n// therefore `window.strapi` might not exist at import-time. We should probably define\n// which constant is available at which stage of the application lifecycle.\nexport const SETTINGS_LINKS_EE = (): SettingsMenu => ({\n global: [\n ...(window.strapi.features.isEnabled(window.strapi.features.SSO)\n ? [\n {\n intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' },\n to: '/settings/single-sign-on',\n id: 'sso',\n },\n ]\n : []),\n\n ...(window.strapi.features.isEnabled(window.strapi.features.REVIEW_WORKFLOWS)\n ? [\n {\n intlLabel: {\n id: 'Settings.review-workflows.page.title',\n defaultMessage: 'Review Workflows',\n },\n to: '/settings/review-workflows',\n id: 'review-workflows',\n },\n ]\n : []),\n ],\n\n admin: [\n ...(window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS)\n ? [\n {\n intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' },\n to: '/settings/audit-logs?pageSize=50&page=1&sort=date:DESC',\n id: 'auditLogs',\n },\n ]\n : []),\n ],\n});\n","import { RouteObject } from 'react-router-dom';\n\n/**\n * All these routes are relative to the `/admin/settings/*` route\n * as such their path should not start with a `/` or include the `/settings` prefix.\n */\nexport const getEERoutes = (): RouteObject[] => [\n ...(window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS)\n ? [\n {\n path: 'audit-logs',\n lazy: async () => {\n const { ProtectedListPage } = await import('./pages/AuditLogs/ListPage');\n\n return {\n Component: ProtectedListPage,\n };\n },\n },\n ]\n : []),\n ...(window.strapi.features.isEnabled(window.strapi.features.REVIEW_WORKFLOWS)\n ? [\n {\n path: 'review-workflows',\n lazy: async () => {\n const { ProtectedReviewWorkflowsPage } = await import(\n './pages/ReviewWorkflows/ListPage'\n );\n\n return {\n Component: ProtectedReviewWorkflowsPage,\n };\n },\n },\n {\n path: 'review-workflows/create',\n lazy: async () => {\n const { ReviewWorkflowsCreatePage } = await import(\n './pages/ReviewWorkflows/CreatePage'\n );\n\n return {\n Component: ReviewWorkflowsCreatePage,\n };\n },\n },\n {\n path: 'review-workflows/:workflowId',\n lazy: async () => {\n const { ReviewWorkflowsEditPage } = await import('./pages/ReviewWorkflows/EditPage');\n\n return {\n Component: ReviewWorkflowsEditPage,\n };\n },\n },\n ]\n : []),\n ...(window.strapi.features.isEnabled(window.strapi.features.SSO)\n ? [\n {\n path: 'single-sign-on',\n lazy: async () => {\n const { ProtectedSSO } = await import('./pages/SingleSignOnPage');\n\n return {\n Component: ProtectedSSO,\n };\n },\n },\n ]\n : []),\n];\n","import * as React from 'react';\n\nimport { Alert, AlertVariant, Flex, useCallbackRef } from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport { useIntl } from 'react-intl';\n\ninterface NotificationLink {\n label: string;\n target?: string;\n url: string;\n}\n\ninterface NotificationConfig {\n blockTransition?: boolean;\n link?: NotificationLink;\n message?: string;\n onClose?: () => void;\n timeout?: number;\n title?: string;\n type?: 'info' | 'warning' | 'danger' | 'success';\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsContextValue {\n /**\n * Toggles a notification, wrapped in `useCallback` for a stable identity.\n */\n toggleNotification: (config: NotificationConfig) => void;\n}\n\nconst NotificationsContext = React.createContext<NotificationsContextValue>({\n toggleNotification: () => {},\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface NotificationsProviderProps {\n children: React.ReactNode;\n}\ninterface Notification extends NotificationConfig {\n id: number;\n}\n\n/**\n * @internal\n * @description DO NOT USE. This will be removed before stable release of v5.\n */\nconst NotificationsProvider = ({ children }: NotificationsProviderProps) => {\n const notificationIdRef = React.useRef(0);\n\n const [notifications, setNotifications] = React.useState<Notification[]>([]);\n\n const toggleNotification = React.useCallback(\n ({ type, message, link, timeout, blockTransition, onClose, title }: NotificationConfig) => {\n setNotifications((s) => [\n ...s,\n {\n id: notificationIdRef.current++,\n type,\n message,\n link,\n timeout,\n blockTransition,\n onClose,\n title,\n },\n ]);\n },\n []\n );\n\n const clearNotification = React.useCallback((id: number) => {\n setNotifications((s) => s.filter((n) => n.id !== id));\n }, []);\n\n const value = React.useMemo(() => ({ toggleNotification }), [toggleNotification]);\n\n return (\n <NotificationsContext.Provider value={value}>\n <Flex\n left=\"50%\"\n marginLeft=\"-250px\"\n position=\"fixed\"\n direction=\"column\"\n alignItems=\"stretch\"\n gap={2}\n top={`${46 / 16}rem`}\n width={`${500 / 16}rem`}\n zIndex={10}\n >\n {notifications.map((notification) => {\n return (\n <Notification\n key={notification.id}\n {...notification}\n clearNotification={clearNotification}\n />\n );\n })}\n </Flex>\n {children}\n </NotificationsContext.Provider>\n );\n};\n\ninterface NotificationProps extends Notification {\n clearNotification: (id: number) => void;\n}\n\nconst Notification = ({\n clearNotification,\n blockTransition = false,\n id,\n link,\n message,\n onClose,\n timeout = 2500,\n title,\n type,\n}: NotificationProps) => {\n const { formatMessage } = useIntl();\n /**\n * Chances are `onClose` won't be classed as stabilised,\n * so we use `useCallbackRef` to avoid make it stable.\n */\n const onCloseCallback = useCallbackRef(onClose);\n\n const handleClose = React.useCallback(() => {\n onCloseCallback();\n\n clearNotification(id);\n }, [clearNotification, id, onCloseCallback]);\n\n // eslint-disable-next-line consistent-return\n React.useEffect(() => {\n if (!blockTransition) {\n const timeoutReference = setTimeout(() => {\n handleClose();\n }, timeout);\n\n return () => {\n clearTimeout(timeoutReference);\n };\n }\n }, [blockTransition, handleClose, timeout]);\n\n let variant: AlertVariant;\n let alertTitle: string;\n\n if (type === 'info') {\n variant = 'default';\n alertTitle = formatMessage({\n id: 'notification.default.title',\n defaultMessage: 'Information:',\n });\n } else if (type === 'danger') {\n variant = 'danger';\n alertTitle = formatMessage({\n id: 'notification.warning.title',\n defaultMessage: 'Warning:',\n });\n } else if (type === 'warning') {\n variant = 'warning';\n alertTitle = formatMessage({\n id: 'notification.warning.title',\n defaultMessage: 'Warning:',\n });\n } else {\n variant = 'success';\n alertTitle = formatMessage({\n id: 'notification.success.title',\n defaultMessage: 'Success:',\n });\n }\n\n if (title) {\n alertTitle = title;\n }\n\n return (\n <Alert\n action={\n link ? (\n <Link href={link.url} isExternal>\n {link.label}\n </Link>\n ) : undefined\n }\n onClose={handleClose}\n closeLabel={formatMessage({\n id: 'global.close',\n defaultMessage: 'Close',\n })}\n title={alertTitle}\n variant={variant}\n >\n {message}\n </Alert>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @preserve\n * @description Returns an object to interact with the notification\n * system. The callbacks are wrapped in `useCallback` for a stable\n * identity.\n *\n * @example\n * ```tsx\n * import { useNotification } from '@strapi/helper-plugin';\n *\n * const MyComponent = () => {\n * const { toggleNotification } = useNotification();\n *\n * return <button onClick={() => toggleNotification({ message: 'Hello world!' })}>Click me</button>;\n */\nconst useNotification = () => React.useContext(NotificationsContext);\n\nexport { NotificationsProvider, useNotification };\nexport type { NotificationConfig, NotificationsContextValue };\n","/**\n * Prefix message with 'apiError.'\n */\nexport function getPrefixedId(message: string, callback?: (prefixedMessage: string) => string) {\n const prefixedMessage = `apiError.${message}`;\n\n // if a prefix function has been passed in it is used to\n // prefix the id, e.g. to allow an error message to be\n // set only for a localization namespace\n if (typeof callback === 'function') {\n return callback(prefixedMessage);\n }\n\n return prefixedMessage;\n}\n","import { AxiosError } from 'axios';\n\nimport { getPrefixedId } from './getPrefixedId';\n\nimport type { ApiError } from '../types/errors';\nimport type { errors } from '@strapi/utils';\n\nexport interface NormalizeErrorOptions {\n name?: string;\n intlMessagePrefixCallback?: (id: string) => string;\n}\n\ninterface NormalizeErrorReturn {\n id: string;\n defaultMessage: string;\n name?: string;\n values: Record<'path', string> | Record<string, never>;\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n}\n\nfunction normalizeError(\n error: ApiError | YupFormattedError,\n { name, intlMessagePrefixCallback }: NormalizeErrorOptions\n): NormalizeErrorReturn {\n const { message } = error;\n\n const normalizedError = {\n id: getPrefixedId(message, intlMessagePrefixCallback),\n defaultMessage: message,\n name: error.name ?? name,\n values: {},\n };\n\n if ('path' in error) {\n normalizedError.values = { path: error.path.join('.') };\n }\n\n return normalizedError;\n}\n\nconst validateErrorIsYupValidationError = (\n err: ApiError\n): err is errors.YupValidationError & { details: { errors: YupFormattedError[] } } =>\n typeof err.details === 'object' && err.details !== null && 'errors' in err.details;\n\n/**\n * Normalize the format of `ResponseError`\n * in places where the hook `useAPIErrorHandler` can not called\n * (e.g. outside of a React component).\n */\nexport function normalizeAPIError(\n apiError: AxiosError<{ error: ApiError }>,\n intlMessagePrefixCallback?: NormalizeErrorOptions['intlMessagePrefixCallback']\n):\n | NormalizeErrorReturn\n | { name: string; message: string | null; errors: NormalizeErrorReturn[] }\n | null {\n const error = apiError.response?.data.error;\n\n if (error) {\n // some errors carry multiple errors (such as ValidationError)\n if (validateErrorIsYupValidationError(error)) {\n return {\n name: error.name,\n message: error?.message || null,\n errors: error.details.errors.map((err) =>\n normalizeError(err, { name: error.name, intlMessagePrefixCallback })\n ),\n };\n }\n\n return normalizeError(error, { intlMessagePrefixCallback });\n }\n\n return null;\n}\n","import * as React from 'react';\n\nimport { AxiosError } from 'axios';\nimport { IntlFormatters, useIntl } from 'react-intl';\n\nimport { getPrefixedId } from '../utils/getPrefixedId';\nimport { NormalizeErrorOptions, normalizeAPIError } from '../utils/normalizeAPIError';\n\nimport type { ApiError } from '../types/errors';\n\ninterface UnknownApiError {\n /**\n * The name of the ApiError, is always a static value.\n */\n name: 'UnknownError';\n /**\n * The error message.\n */\n message: string;\n /**\n * The error details.\n */\n details?: unknown;\n /**\n * The HTTP status code of the error.\n */\n status?: number;\n}\n\n/**\n * The last item is the fallback error SerializedError which\n * typically comes from redux-toolkit itself.\n */\ninterface SerializedError {\n /**\n * The name of the error.\n */\n name?: string;\n /**\n * The error message that explains what went wrong.\n */\n message?: string;\n /**\n * The stack trace of the error.\n */\n stack?: string;\n /**\n * A specific error code associated with the error.\n */\n code?: string;\n}\n\n/**\n * These are the types or errors we return\n * from the redux-toolkit data-fetching setup.\n */\ntype BaseQueryError = ApiError | UnknownApiError | SerializedError;\n\ninterface YupFormattedError {\n /**\n * An array representing the path to the field where the validation error occurred.\n */\n path: string[];\n /**\n * The error message describing the validation failure.\n */\n message: string;\n /**\n * The name of the error, typically identifies the type of validation error that occurred.\n */\n name: string;\n}\n\n/**\n * @public\n * @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` ...)\nthat has been thrown.\n * @example\n * ```tsx\n * import * as React from 'react';\n * import { useFetchClient, useAPIErrorHandler, useNotification } from '@strapi/admin/admin';\n *\n * const MyComponent = () => {\n * const { get } = useFetchClient();\n * const { formatAPIError } = useAPIErrorHandler(getTrad);\n * const { toggleNotification } = useNotification();\n * \n * const handleDeleteItem = async () => {\n * try {\n * return await get('/admin');\n * } catch (error) {\n * toggleNotification({\n * type: 'danger',\n * message: formatAPIError(error),\n * });\n * }\n * };\n * return <button onClick={handleDeleteItem}>Delete item</button>;\n * };\n * ```\n */\nexport function useAPIErrorHandler(\n intlMessagePrefixCallback?: FormatAPIErrorOptions['intlMessagePrefixCallback']\n) {\n const { formatMessage } = useIntl();\n\n /**\n * @description This method try to normalize the passed error\n * and then call formatAPIError to stringify the ResponseObject\n * into a string. If it fails it will call formatAxiosError and\n * return the error message.\n */\n const formatError = React.useCallback(\n (error: AxiosError<{ error: ApiError }>) => {\n // Try to normalize the passed error first. This will fail for e.g. network\n // errors which are thrown by Axios directly.\n try {\n const formattedErr = formatAPIError(error, { intlMessagePrefixCallback, formatMessage });\n\n if (!formattedErr) {\n return formatAxiosError(error, { intlMessagePrefixCallback, formatMessage });\n }\n\n return formattedErr;\n } catch (_) {\n throw new Error('formatAPIError: Unknown error:', error);\n }\n },\n [formatMessage, intlMessagePrefixCallback]\n );\n\n return {\n /**\n * @alpha\n * Convert ValidationErrors from the API into an object that can be used by forms.\n */\n _unstableFormatValidationErrors: React.useCallback(\n (error: Extract<BaseQueryError, { name: 'ValidationError' }>): Record<string, string> => {\n if (typeof error.details === 'object' && error.details !== null) {\n if ('errors' in error.details && Array.isArray(error.details.errors)) {\n const validationErrors = error.details.errors as YupFormattedError[];\n\n return validationErrors.reduce((acc, err) => {\n const { path, message } = err;\n\n return {\n ...acc,\n [path.join('.')]: message,\n };\n }, {});\n } else {\n const details = error.details as Record<string, string[]>;\n\n return Object.keys(details).reduce((acc, key) => {\n const messages = details[key];\n\n return {\n ...acc,\n [key]: messages.join(', '),\n };\n }, {});\n }\n } else {\n return {};\n }\n },\n []\n ),\n /**\n * @alpha\n * This handles the errors given from `redux-toolkit`'s axios based baseQuery function.\n */\n _unstableFormatAPIError: React.useCallback(\n (error: BaseQueryError) => {\n const err = {\n response: {\n data: {\n error,\n },\n },\n } as AxiosError<{ error: BaseQueryError }>;\n\n /**\n * There's a chance with SerializedErrors that the message is not set.\n * In that case we return a generic error message.\n */\n if (!error.message) {\n return 'Unknown error occured.';\n }\n\n // @ts-expect-error – UnknownApiError is in the same shape as ApiError, but we don't want to expose this to users yet.\n return formatError(err);\n },\n [formatError]\n ),\n formatAPIError: formatError,\n };\n}\n\nfunction formatAxiosError(\n error: AxiosError<unknown>,\n { intlMessagePrefixCallback, formatMessage }: FormatAPIErrorOptions\n) {\n const { code, message } = error;\n\n return formatMessage(\n {\n id: getPrefixedId(message, intlMessagePrefixCallback),\n defaultMessage: message,\n },\n {\n code,\n }\n );\n}\n\ntype FormatAPIErrorOptions = Partial<Pick<NormalizeErrorOptions, 'intlMessagePrefixCallback'>> &\n Pick<IntlFormatters, 'formatMessage'>;\n\n/**\n * @description This method stringifies the `ResponseObject` into\n * a string. If multiple errors are thrown by the API, which\n * happens e.g.in the case of a `ValidationError`, all errors\n * will bo concatenated into a single string.\n */\nfunction formatAPIError(\n error: AxiosError<{ error: ApiError }>,\n { formatMessage, intlMessagePrefixCallback }: FormatAPIErrorOptions\n) {\n if (!formatMessage) {\n throw new Error('The formatMessage callback is a mandatory argument.');\n }\n\n const normalizedError = normalizeAPIError(error, intlMessagePrefixCallback);\n\n if (!normalizedError) {\n return null;\n }\n\n if ('message' in normalizedError && normalizedError.message !== null) {\n return normalizedError.message;\n }\n\n // stringify multiple errors\n if ('errors' in normalizedError) {\n return normalizedError.errors\n .map(({ id, defaultMessage, values }) => formatMessage({ id, defaultMessage }, values))\n .join('\\n');\n }\n\n return formatMessage(normalizedError);\n}\n\nexport type { ApiError };\n","import { SerializedError } from '@reduxjs/toolkit';\nimport { BaseQueryFn } from '@reduxjs/toolkit/query';\nimport { getFetchClient } from '@strapi/helper-plugin';\nimport { isAxiosError, type AxiosRequestConfig } from 'axios';\n\nimport type { ApiError } from '../types/errors';\n\n/* -------------------------------------------------------------------------------------------------\n * Axios data\n * -----------------------------------------------------------------------------------------------*/\nexport interface QueryArguments {\n url: string;\n method?: AxiosRequestConfig['method'];\n data?: AxiosRequestConfig['data'];\n config?: AxiosRequestConfig;\n}\n\nexport interface UnknownApiError {\n name: 'UnknownError';\n message: string;\n details?: unknown;\n status?: number;\n}\n\nexport type BaseQueryError = ApiError | UnknownApiError;\n\nconst axiosBaseQuery =\n (): BaseQueryFn<string | QueryArguments, unknown, BaseQueryError> =>\n async (query, { signal }) => {\n try {\n const { get, post, del, put } = getFetchClient();\n\n if (typeof query === 'string') {\n const result = await get(query, { signal });\n return { data: result.data };\n } else {\n const { url, method = 'GET', data, config } = query;\n\n if (method === 'POST') {\n const result = await post(url, data, { ...config, signal });\n return { data: result.data };\n }\n\n if (method === 'DELETE') {\n const result = await del(url, { ...config, signal });\n return { data: result.data };\n }\n\n if (method === 'PUT') {\n const result = await put(url, data, { ...config, signal });\n return { data: result.data };\n }\n\n /**\n * Default is GET.\n */\n const result = await get(url, { ...config, signal });\n return { data: result.data };\n }\n } catch (err) {\n /**\n * Handle error of type AxiosError\n *\n * This format mimics what we want from an AxiosError which is what the\n * rest of the app works with, except this format is \"serializable\" since\n * it goes into the redux store.\n *\n * NOTE – passing the whole response will highlight this \"serializability\" issue.\n */\n\n if (isAxiosError(err)) {\n if (\n typeof err.response?.data === 'object' &&\n err.response?.data !== null &&\n 'error' in err.response?.data\n ) {\n /**\n * This will most likely be ApiError\n */\n return { data: undefined, error: err.response?.data.error };\n } else {\n return {\n data: undefined,\n error: {\n name: 'UnknownError',\n message: 'There was an unknown error response from the API',\n details: err.response?.data,\n status: err.response?.status,\n } as UnknownApiError,\n };\n }\n }\n\n const error = err as Error;\n return {\n data: undefined,\n error: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n } satisfies SerializedError,\n };\n }\n };\n\nconst isBaseQueryError = (error: BaseQueryError | SerializedError): error is BaseQueryError => {\n return error.name !== undefined;\n};\n\nexport { axiosBaseQuery, isBaseQueryError };\n","import { createApi } from '@reduxjs/toolkit/query/react';\n\nimport { TokenRegenerate } from '../../../shared/contracts/transfer';\nimport { axiosBaseQuery, type UnknownApiError } from '../utils/baseQuery';\n\nconst adminApi = createApi({\n reducerPath: 'adminApi',\n baseQuery: axiosBaseQuery(),\n tagTypes: [\n 'ApiToken',\n 'LicenseLimits',\n 'Me',\n 'ProjectSettings',\n 'ProvidersOptions',\n 'ReviewWorkflow',\n 'ReviewWorkflowStage',\n 'Role',\n 'RolePermissions',\n 'TransferToken',\n 'User',\n 'Webhook',\n ],\n endpoints: (builder) => ({\n /**\n * This is here because it's shared between the transfer-token routes & the api-tokens.\n */\n regenerateToken: builder.mutation<TokenRegenerate.Response['data'], string>({\n query: (url) => ({\n method: 'POST',\n url: `${url}/regenerate`,\n }),\n transformResponse: (response: TokenRegenerate.Response) => response.data,\n }),\n }),\n});\n\nconst { useRegenerateTokenMutation } = adminApi;\n\nexport { adminApi, type UnknownApiError, useRegenerateTokenMutation };\n","import { ProvidersOptions } from '../../../shared/contracts/admin';\nimport {\n type RenewToken,\n type Login,\n type ResetPassword,\n type RegisterAdmin,\n type Register,\n type RegistrationInfo,\n ForgotPassword,\n} from '../../../shared/contracts/authentication';\nimport { Check } from '../../../shared/contracts/permissions';\nimport { GetProviders, IsSSOLocked } from '../../../shared/contracts/providers';\nimport { type GetOwnPermissions, type GetMe, type UpdateMe } from '../../../shared/contracts/users';\n\nimport { adminApi } from './api';\n\nconst authService = adminApi.injectEndpoints({\n endpoints: (builder) => ({\n /**\n * ME\n */\n getMe: builder.query<GetMe.Response['data'], void>({\n query: () => ({\n method: 'GET',\n url: '/admin/users/me',\n }),\n transformResponse(res: GetMe.Response) {\n return res.data;\n },\n providesTags: (res) => (res ? ['Me', { type: 'User', id: res.id }] : ['Me']),\n }),\n getMyPermissions: builder.query<GetOwnPermissions.Response['data'], void>({\n query: () => ({\n method: 'GET',\n url: '/admin/users/me/permissions',\n }),\n transformResponse(res: GetOwnPermissions.Response) {\n return res.data;\n },\n }),\n updateMe: builder.mutation<UpdateMe.Response['data'], UpdateMe.Request['body']>({\n query: (body) => ({\n method: 'PUT',\n url: '/admin/users/me',\n data: body,\n }),\n transformResponse(res: UpdateMe.Response) {\n return res.data;\n },\n invalidatesTags: ['Me'],\n }),\n /**\n * Permissions\n */\n checkPermissions: builder.query<Check.Response, Check.Request['body']>({\n query: (permissions) => ({\n method: 'POST',\n url: '/admin/permissions/check',\n data: permissions,\n }),\n }),\n /**\n * Auth methods\n */\n login: builder.mutation<Login.Response['data'], Login.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/login',\n data: body,\n }),\n transformResponse(res: Login.Response) {\n return res.data;\n },\n invalidatesTags: ['Me'],\n }),\n logout: builder.mutation<void, void>({\n query: () => ({\n method: 'POST',\n url: '/admin/logout',\n }),\n }),\n resetPassword: builder.mutation<ResetPassword.Response['data'], ResetPassword.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/reset-password',\n data: body,\n }),\n transformResponse(res: ResetPassword.Response) {\n return res.data;\n },\n }),\n renewToken: builder.mutation<RenewToken.Response['data'], RenewToken.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/renew-token',\n data: body,\n }),\n transformResponse(res: RenewToken.Response) {\n return res.data;\n },\n }),\n getRegistrationInfo: builder.query<\n RegistrationInfo.Response['data'],\n RegistrationInfo.Request['query']['registrationToken']\n >({\n query: (registrationToken) => ({\n url: '/admin/registration-info',\n method: 'GET',\n config: {\n params: {\n registrationToken,\n },\n },\n }),\n transformResponse(res: RegistrationInfo.Response) {\n return res.data;\n },\n }),\n registerAdmin: builder.mutation<RegisterAdmin.Response['data'], RegisterAdmin.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/register-admin',\n data: body,\n }),\n transformResponse(res: RegisterAdmin.Response) {\n return res.data;\n },\n }),\n registerUser: builder.mutation<Register.Response['data'], Register.Request['body']>({\n query: (body) => ({\n method: 'POST',\n url: '/admin/register',\n data: body,\n }),\n transformResponse(res: Register.Response) {\n return res.data;\n },\n }),\n forgotPassword: builder.mutation<ForgotPassword.Response, ForgotPassword.Request['body']>({\n query: (body) => ({\n url: '/admin/forgot-password',\n method: 'POST',\n data: body,\n }),\n }),\n isSSOLocked: builder.query<IsSSOLocked.Response['data'], void>({\n query: () => ({\n url: '/admin/providers/isSSOLocked',\n method: 'GET',\n }),\n transformResponse(res: IsSSOLocked.Response) {\n return res.data;\n },\n }),\n getProviders: builder.query<GetProviders.Response, void>({\n query: () => ({\n url: '/admin/providers',\n method: 'GET',\n }),\n }),\n getProviderOptions: builder.query<ProvidersOptions.Response['data'], void>({\n query: () => ({\n url: '/admin/providers/options',\n method: 'GET',\n }),\n transformResponse(res: ProvidersOptions.Response) {\n return res.data;\n },\n providesTags: ['ProvidersOptions'],\n }),\n updateProviderOptions: builder.mutation<\n ProvidersOptions.Response['data'],\n ProvidersOptions.Request['body']\n >({\n query: (body) => ({\n url: '/admin/providers/options',\n method: 'PUT',\n data: body,\n }),\n transformResponse(res: ProvidersOptions.Response) {\n return res.data;\n },\n invalidatesTags: ['ProvidersOptions'],\n }),\n }),\n overrideExisting: false,\n});\n\nconst {\n useCheckPermissionsQuery,\n useGetMeQuery,\n useLoginMutation,\n useRenewTokenMutation,\n useLogoutMutation,\n useUpdateMeMutation,\n useResetPasswordMutation,\n useRegisterAdminMutation,\n useRegisterUserMutation,\n useGetRegistrationInfoQuery,\n useForgotPasswordMutation,\n useGetMyPermissionsQuery,\n useIsSSOLockedQuery,\n useGetProvidersQuery,\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n} = authService;\n\nexport {\n useCheckPermissionsQuery,\n useGetMeQuery,\n useLoginMutation,\n useRenewTokenMutation,\n useLogoutMutation,\n useUpdateMeMutation,\n useResetPasswordMutation,\n useRegisterAdminMutation,\n useRegisterUserMutation,\n useGetRegistrationInfoQuery,\n useForgotPasswordMutation,\n useGetMyPermissionsQuery,\n useIsSSOLockedQuery,\n useGetProvidersQuery,\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n};\n","import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Icon,\n Loader,\n Main,\n} from '@strapi/design-system';\nimport { useRBACProvider } from '@strapi/helper-plugin';\nimport { EmptyPermissions, ExclamationMarkCircle, EmptyDocuments } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { Permission } from '../../../shared/contracts/shared';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <Main height=\"100vh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Main height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<Icon as={ExclamationMarkCircle} width=\"10rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Woops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Main height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"10rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Main height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"10rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if the user has the required permissions. If a user does not have ALL\n * the required permissions, it will redirect the user to the home page. Whilst these checks happen it will render\n * the loading component and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = [], children }: ProtectProps) => {\n const { allPermissions } = useRBACProvider();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = allPermissions.filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const shouldCheckConditions = matchingPermissions.some(\n (perm) => Array.isArray(perm.conditions) && perm.conditions.length > 0\n );\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const canAccess =\n shouldCheckConditions && permissionsData\n ? !permissionsData.includes(false)\n : matchingPermissions.length > 0;\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n // @ts-expect-error this error comes from the fact we have permissions defined in the helper-plugin & admin, this will be resolved soon.\n return typeof children === 'function' ? children({ permissions: matchingPermissions }) : children;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps };\n","import * as React from 'react';\n\nimport * as ContextSelector from 'use-context-selector';\n\nfunction createContext<ContextValueType extends object | null>(\n rootComponentName: string,\n defaultContext?: ContextValueType\n) {\n const Context = ContextSelector.createContext<ContextValueType | undefined>(defaultContext);\n\n const Provider = (props: ContextValueType & { children: React.ReactNode }) => {\n const { children, ...context } = props;\n // Only re-memoize when prop values change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const value = React.useMemo(() => context, Object.values(context)) as ContextValueType;\n return <Context.Provider value={value}>{children}</Context.Provider>;\n };\n\n const useContext = <Selected,>(\n consumerName: string,\n selector: (value: ContextValueType) => Selected\n ): Selected =>\n ContextSelector.useContextSelector(Context, (ctx) => {\n if (ctx) return selector(ctx);\n // it's a required context.\n throw new Error(`\\`${consumerName}\\` must be used within \\`${rootComponentName}\\``);\n });\n\n Provider.displayName = rootComponentName + 'Provider';\n\n return [Provider, useContext] as const;\n}\n\nexport { createContext };\n","import { createSelector, Selector } from '@reduxjs/toolkit';\nimport { useDispatch, useStore, TypedUseSelectorHook, useSelector } from 'react-redux';\n\nimport type { RootState, Store } from './configure';\n\ntype AppDispatch = Store['dispatch'];\n\nconst useTypedDispatch: () => AppDispatch = useDispatch;\nconst useTypedStore = useStore as () => Store;\nconst useTypedSelector: TypedUseSelectorHook<RootState> = useSelector;\n\nconst createTypedSelector = <TResult>(selector: Selector<RootState, TResult>) =>\n createSelector((state: RootState) => state, selector);\n\nexport { useTypedDispatch, useTypedStore, useTypedSelector, createTypedSelector };\n","import { createSlice } from '@reduxjs/toolkit';\n\nimport { PermissionMap } from './types/permissions';\n\nimport type { PayloadAction } from '@reduxjs/toolkit';\n\ntype ThemeName = 'light' | 'dark' | 'system';\n\ninterface AppState {\n language: {\n locale: string;\n localeNames: Record<string, string>;\n };\n permissions: Partial<PermissionMap>;\n theme: {\n currentTheme: ThemeName;\n availableThemes: string[];\n };\n}\n\nconst THEME_LOCAL_STORAGE_KEY = 'STRAPI_THEME';\nconst LANGUAGE_LOCAL_STORAGE_KEY = 'strapi-admin-language';\n\nconst adminSlice = createSlice({\n name: 'admin',\n initialState: () => {\n return {\n language: {\n locale: 'en',\n localeNames: { en: 'English' },\n },\n permissions: {},\n theme: {\n availableThemes: [],\n currentTheme: localStorage.getItem(THEME_LOCAL_STORAGE_KEY) || 'system',\n },\n } as AppState;\n },\n reducers: {\n setAppTheme(state, action: PayloadAction<ThemeName>) {\n state.theme.currentTheme = action.payload;\n window.localStorage.setItem(THEME_LOCAL_STORAGE_KEY, action.payload);\n },\n setAvailableThemes(state, action: PayloadAction<AppState['theme']['availableThemes']>) {\n state.theme.availableThemes = action.payload;\n },\n setLocale(state, action: PayloadAction<string>) {\n state.language.locale = action.payload;\n\n window.localStorage.setItem(LANGUAGE_LOCAL_STORAGE_KEY, action.payload);\n document.documentElement.setAttribute('lang', action.payload);\n },\n },\n});\n\nconst reducer = adminSlice.reducer;\n\nconst { setAppTheme, setAvailableThemes, setLocale } = adminSlice.actions;\n\nexport {\n reducer,\n setAppTheme,\n setAvailableThemes,\n setLocale,\n THEME_LOCAL_STORAGE_KEY,\n LANGUAGE_LOCAL_STORAGE_KEY,\n};\nexport type { AppState, ThemeName };\n","import * as React from 'react';\n\nimport { auth } from '@strapi/helper-plugin';\nimport { useNavigate } from 'react-router-dom';\n\nimport { Login } from '../../../shared/contracts/authentication';\nimport { createContext } from '../components/Context';\nimport { useTypedDispatch } from '../core/store/hooks';\nimport { setLocale } from '../reducer';\nimport {\n useGetMeQuery,\n useLoginMutation,\n useLogoutMutation,\n useRenewTokenMutation,\n} from '../services/auth';\n\nimport type { SanitizedAdminUser } from '../../../shared/contracts/shared';\n\ninterface AuthContextValue {\n login: (\n body: Login.Request['body'] & { rememberMe: boolean }\n ) => Promise<Awaited<ReturnType<ReturnType<typeof useLoginMutation>[0]>>>;\n logout: () => Promise<void>;\n setToken: (token: string | null) => void;\n token: string | null;\n user?: SanitizedAdminUser;\n}\n\nconst [Provider, useAuth] = createContext<AuthContextValue>('Auth');\n\ninterface AuthProviderProps {\n children: React.ReactNode;\n}\n\nconst STORAGE_KEYS = {\n TOKEN: 'jwtToken',\n USER: 'userInfo',\n};\n\nconst AuthProvider = ({ children }: AuthProviderProps) => {\n const dispatch = useTypedDispatch();\n const [token, setToken] = React.useState<string | null>(() => {\n const token =\n localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN);\n\n if (typeof token === 'string') {\n return JSON.parse(token);\n }\n\n return null;\n });\n\n const { data: user } = useGetMeQuery(undefined, {\n /**\n * If there's no token, we don't try to fetch\n * the user data because it will fail.\n */\n skip: !token,\n });\n const navigate = useNavigate();\n\n const [loginMutation] = useLoginMutation();\n const [renewTokenMutation] = useRenewTokenMutation();\n const [logoutMutation] = useLogoutMutation();\n\n const clearStorage = React.useCallback(() => {\n localStorage.removeItem(STORAGE_KEYS.TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n sessionStorage.removeItem(STORAGE_KEYS.TOKEN);\n sessionStorage.removeItem(STORAGE_KEYS.USER);\n setToken(null);\n }, []);\n\n /**\n * Fetch data from storages on mount and store it in our state.\n * It's not normally stored in session storage unless the user\n * does click \"remember me\" when they login. We also need to renew the token.\n */\n React.useEffect(() => {\n const token =\n localStorage.getItem(STORAGE_KEYS.TOKEN) ?? sessionStorage.getItem(STORAGE_KEYS.TOKEN);\n\n if (token) {\n renewTokenMutation({ token: JSON.parse(token) }).then((res) => {\n if ('data' in res) {\n setToken(res.data.token);\n } else {\n clearStorage();\n navigate('/auth/login');\n }\n });\n }\n }, [renewTokenMutation, clearStorage, navigate]);\n\n /**\n * Backwards compat – store the user info in the session storage\n *\n * TODO: V5 remove this and only explicitly set it when required.\n */\n React.useEffect(() => {\n auth.setUserInfo(user, true);\n if (user) {\n if (user.preferedLanguage) {\n dispatch(setLocale(user.preferedLanguage));\n }\n }\n }, [dispatch, user]);\n\n /**\n * Backwards compat – store the token in the session storage\n *\n * TODO: V5 remove this and only explicitly set it when required.\n */\n React.useEffect(() => {\n auth.setToken(token, false);\n }, [token]);\n\n React.useEffect(() => {\n /**\n * This will log a user out of all tabs if they log out in one tab.\n */\n const handleUserStorageChange = (event: StorageEvent) => {\n if (event.key === STORAGE_KEYS.USER && event.newValue === null) {\n clearStorage();\n navigate('/auth/login');\n }\n };\n\n window.addEventListener('storage', handleUserStorageChange);\n\n return () => {\n window.removeEventListener('storage', handleUserStorageChange);\n };\n });\n\n const login = React.useCallback<AuthContextValue['login']>(\n async ({ rememberMe, ...body }) => {\n const res = await loginMutation(body);\n\n /**\n * There will always be a `data` key in the response\n * because if something fails, it will throw an error.\n */\n if ('data' in res) {\n const { token } = res.data;\n\n auth.setToken(token, rememberMe);\n setToken(token);\n }\n\n return res;\n },\n [loginMutation]\n );\n\n const logout = React.useCallback(async () => {\n await logoutMutation();\n clearStorage();\n navigate('/auth/login');\n }, [clearStorage, logoutMutation, navigate]);\n\n return (\n <Provider token={token} user={user} login={login} logout={logout} setToken={setToken}>\n {children}\n </Provider>\n );\n};\n\nexport { AuthProvider, useAuth };\n","import * as React from 'react';\n\nimport { Link, LinkProps } from '@strapi/design-system/v2';\nimport { ArrowLeft } from '@strapi/icons';\nimport { produce } from 'immer';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useLocation, useNavigate } from 'react-router-dom';\n\nimport { createContext } from '../components/Context';\n\n/* -------------------------------------------------------------------------------------------------\n * HistoryProvider\n * -----------------------------------------------------------------------------------------------*/\ninterface HistoryState {\n /**\n * The history of the user's navigation within our application\n * during their current session.\n */\n history: string[];\n /**\n * The index of the current location in the history array.\n */\n currentLocationIndex: number;\n /**\n * The current location of the user within our application.\n */\n currentLocation: string;\n /**\n * Whether the user can go back in the history.\n */\n canGoBack: boolean;\n}\n\ninterface HistoryContextValue extends HistoryState {\n /**\n * @description Push a new state to the history. You can\n * either pass a string or an object.\n */\n pushState: (\n path:\n | {\n to: string;\n search: string;\n }\n | string\n ) => void;\n /**\n * @description Go back in the history. This calls `navigate(-1)` internally\n * to keep the browser in sync with the application state.\n */\n goBack: () => void;\n}\n\nconst [Provider, useHistory] = createContext<HistoryContextValue>('History', {\n history: [],\n currentLocationIndex: 0,\n currentLocation: '',\n canGoBack: false,\n pushState: () => {\n throw new Error('You must use the `HistoryProvider` to access the `pushState` function.');\n },\n goBack: () => {\n throw new Error('You must use the `HistoryProvider` to access the `goBack` function.');\n },\n});\n\ninterface HistoryProviderProps {\n children: React.ReactNode;\n}\n\nconst HistoryProvider = ({ children }: HistoryProviderProps) => {\n const location = useLocation();\n const navigate = useNavigate();\n const [state, dispatch] = React.useReducer(reducer, {\n history: [],\n currentLocationIndex: 0,\n currentLocation: '',\n canGoBack: false,\n });\n\n const isGoingBack = React.useRef(false);\n\n const pushState: HistoryContextValue['pushState'] = React.useCallback((path) => {\n dispatch({\n type: 'PUSH_STATE',\n payload: typeof path === 'string' ? { to: path, search: '' } : path,\n });\n }, []);\n\n const goBack: HistoryContextValue['goBack'] = React.useCallback(() => {\n /**\n * Perform the browser back action\n * dispatch the goBack action to keep redux in sync\n * and set the ref to avoid an infinite loop and incorrect state pushing\n */\n navigate(-1);\n dispatch({ type: 'GO_BACK' });\n isGoingBack.current = true;\n }, [navigate]);\n\n /**\n * This is a semi-listener pattern to keep the `canGoBack` state in sync.\n */\n const prevIndex = React.useRef(state.currentLocationIndex);\n React.useEffect(() => {\n if (state.currentLocationIndex !== prevIndex.current) {\n dispatch({\n type: 'SET_CAN_GO_BACK',\n payload: state.currentLocationIndex > 1 && state.history.length > 1,\n });\n prevIndex.current = state.currentLocationIndex;\n }\n }, [prevIndex, state.currentLocationIndex, state.history.length]);\n\n /**\n * This effect is responsible for pushing the new state to the history\n * when the user navigates to a new location assuming they're not going back.\n */\n React.useLayoutEffect(() => {\n if (isGoingBack.current) {\n isGoingBack.current = false;\n } else {\n // this should only occur on link movements, not back/forward clicks\n dispatch({\n type: 'PUSH_STATE',\n payload: { to: location.pathname, search: location.search },\n });\n }\n }, [dispatch, location.pathname, location.search]);\n\n return (\n <Provider pushState={pushState} goBack={goBack} {...state}>\n {children}\n </Provider>\n );\n};\n\ntype HistoryActions =\n | {\n type: 'PUSH_STATE';\n payload: {\n to: string;\n search: string;\n };\n }\n | {\n type: 'GO_BACK';\n }\n | {\n type: 'SET_CAN_GO_BACK';\n payload: boolean;\n };\n\nconst reducer = (state: HistoryState, action: HistoryActions) =>\n produce(state, (draft) => {\n switch (action.type) {\n case 'PUSH_STATE': {\n const path = `${action.payload.to}${action.payload.search}`;\n if (state.currentLocationIndex === state.history.length) {\n // add the new place\n draft.history = [...state.history, path];\n } else {\n // delete all the history after the current place and then add the new place\n draft.history = [...state.history.slice(0, state.currentLocationIndex), path];\n }\n\n draft.currentLocation = path;\n draft.currentLocationIndex += 1;\n\n break;\n }\n case 'GO_BACK': {\n const newIndex = state.currentLocationIndex - 1;\n\n draft.currentLocation = state.history[newIndex - 1];\n draft.currentLocationIndex = newIndex;\n break;\n }\n case 'SET_CAN_GO_BACK': {\n draft.canGoBack = action.payload;\n break;\n }\n default:\n break;\n }\n });\n\n/* -------------------------------------------------------------------------------------------------\n * BackButton\n * -----------------------------------------------------------------------------------------------*/\ninterface BackButtonProps extends Pick<LinkProps, 'disabled'> {}\n\n/**\n * @beta\n * @description The universal back button for the Strapi application. This uses the internal history\n * context to navigate the user back to the previous location. It can be completely disabled in a\n * specific user case.\n */\nconst BackButton = React.forwardRef<HTMLAnchorElement, BackButtonProps>(({ disabled }, ref) => {\n const { formatMessage } = useIntl();\n\n const canGoBack = useHistory('BackButton', (state) => state.canGoBack);\n const goBack = useHistory('BackButton', (state) => state.goBack);\n const history = useHistory('BackButton', (state) => state.history);\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n e.preventDefault();\n goBack();\n };\n\n return (\n <Link\n ref={ref}\n as={NavLink}\n // @ts-expect-error – the DS does not infer the props from the `as` prop to the component.\n to={history.at(-1)}\n onClick={handleClick}\n disabled={disabled || !canGoBack}\n aria-disabled={disabled || !canGoBack}\n startIcon={<ArrowLeft />}\n >\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n );\n});\n\nexport { BackButton, HistoryProvider };\nexport type { BackButtonProps, HistoryProviderProps, HistoryContextValue, HistoryState };\n","const prefixFileUrlWithBackendUrl = (fileURL?: string): string | undefined => {\n return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;\n};\n\nexport { prefixFileUrlWithBackendUrl };\n","import {\n type TelemetryProperties,\n type Init,\n type Information,\n type GetProjectSettings,\n type UpdateProjectSettings,\n type Plugins,\n type GetLicenseLimitInformation,\n} from '../../../shared/contracts/admin';\nimport { prefixFileUrlWithBackendUrl } from '../utils/urls';\n\nimport { adminApi } from './api';\n\ninterface ConfigurationLogo {\n custom?: {\n name?: string;\n url?: string;\n };\n default: string;\n}\n\nconst admin = adminApi.injectEndpoints({\n endpoints: (builder) => ({\n init: builder.query<Init.Response['data'], void>({\n query: () => ({\n url: '/admin/init',\n method: 'GET',\n }),\n transformResponse(res: Init.Response) {\n return res.data;\n },\n }),\n information: builder.query<Information.Response['data'], void>({\n query: () => ({\n url: '/admin/information',\n method: 'GET',\n }),\n transformResponse(res: Information.Response) {\n return res.data;\n },\n }),\n telemetryProperties: builder.query<TelemetryProperties.Response['data'], void>({\n query: () => ({\n url: '/admin/telemetry-properties',\n method: 'GET',\n config: {\n validateStatus: (status) => status < 500,\n },\n }),\n transformResponse(res: TelemetryProperties.Response) {\n return res.data;\n },\n }),\n projectSettings: builder.query<\n { authLogo?: ConfigurationLogo['custom']; menuLogo?: ConfigurationLogo['custom'] },\n void\n >({\n query: () => ({\n url: '/admin/project-settings',\n method: 'GET',\n }),\n providesTags: ['ProjectSettings'],\n transformResponse(data: GetProjectSettings.Response) {\n return {\n authLogo: data.authLogo\n ? {\n name: data.authLogo.name,\n url: prefixFileUrlWithBackendUrl(data.authLogo.url),\n }\n : undefined,\n menuLogo: data.menuLogo\n ? {\n name: data.menuLogo.name,\n url: prefixFileUrlWithBackendUrl(data.menuLogo.url),\n }\n : undefined,\n };\n },\n }),\n updateProjectSettings: builder.mutation<UpdateProjectSettings.Response, FormData>({\n query: (data) => ({\n url: '/admin/project-settings',\n method: 'POST',\n data,\n config: {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n },\n }),\n invalidatesTags: ['ProjectSettings'],\n }),\n getPlugins: builder.query<Plugins.Response, void>({\n query: () => ({\n url: '/admin/plugins',\n method: 'GET',\n }),\n }),\n getLicenseLimits: builder.query<GetLicenseLimitInformation.Response, void>({\n query: () => ({\n url: '/admin/license-limit-information',\n method: 'GET',\n }),\n providesTags: ['LicenseLimits'],\n }),\n }),\n overrideExisting: false,\n});\n\nconst {\n useInitQuery,\n useTelemetryPropertiesQuery,\n useInformationQuery,\n useProjectSettingsQuery,\n useUpdateProjectSettingsMutation,\n useGetPluginsQuery,\n useGetLicenseLimitsQuery,\n} = admin;\n\nexport {\n useInitQuery,\n useTelemetryPropertiesQuery,\n useInformationQuery,\n useProjectSettingsQuery,\n useUpdateProjectSettingsMutation,\n useGetPluginsQuery,\n useGetLicenseLimitsQuery,\n};\n\nexport type { ConfigurationLogo };\n","import { createContext } from '../components/Context';\n\ninterface AppInfoContextValue {\n autoReload?: boolean;\n communityEdition?: boolean;\n currentEnvironment?: string;\n dependencies?: Record<string, string>;\n latestStrapiReleaseTag?: string;\n nodeVersion?: string;\n projectId?: string | null;\n shouldUpdateStrapi?: boolean;\n strapiVersion?: string | null;\n useYarn?: boolean;\n userId?: string;\n}\n\nconst [AppInfoProvider, useAppInfo] = createContext<AppInfoContextValue>('AppInfo', {});\n\nexport { AppInfoProvider, useAppInfo };\n\nexport type { AppInfoContextValue };\n","import * as React from 'react';\n\nimport axios, { AxiosResponse } from 'axios';\n\nimport { useInitQuery, useTelemetryPropertiesQuery } from '../services/admin';\n\nimport { useAppInfo } from './AppInfo';\nimport { useAuth } from './Auth';\n\nexport interface TelemetryProperties {\n useTypescriptOnServer?: boolean;\n useTypescriptOnAdmin?: boolean;\n isHostedOnStrapiCloud?: boolean;\n numberOfAllContentTypes?: number;\n numberOfComponents?: number;\n numberOfDynamicZones?: number;\n}\n\nexport interface TrackingContextValue {\n uuid?: string | boolean;\n telemetryProperties?: TelemetryProperties;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Context\n * -----------------------------------------------------------------------------------------------*/\n\nconst TrackingContext = React.createContext<TrackingContextValue>({\n uuid: false,\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Provider\n * -----------------------------------------------------------------------------------------------*/\n\nexport interface TrackingProviderProps {\n children: React.ReactNode;\n}\n\nconst TrackingProvider = ({ children }: TrackingProviderProps) => {\n const token = useAuth('App', (state) => state.token);\n const { data: initData } = useInitQuery();\n const { uuid } = initData ?? {};\n\n const { data } = useTelemetryPropertiesQuery(undefined, {\n skip: !initData?.uuid || !token,\n });\n\n React.useEffect(() => {\n if (uuid && data) {\n const event = 'didInitializeAdministration';\n try {\n fetch('https://analytics.strapi.io/api/v2/track', {\n method: 'POST',\n body: JSON.stringify({\n // This event is anonymous\n event,\n userId: '',\n eventPropeties: {},\n groupProperties: { ...data, projectId: uuid },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // silence is golden\n }\n }\n }, [data, uuid]);\n\n const value = React.useMemo(\n () => ({\n uuid,\n telemetryProperties: data,\n }),\n [uuid, data]\n );\n\n return <TrackingContext.Provider value={value}>{children}</TrackingContext.Provider>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Hook\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * We can group these events together because none have properties so there's no benefit\n * to having them as separate types.\n *\n * Meanwhile those with properties have different property shapes corresponding to the specific\n * event so understanding which properties go with which event is very helpful.\n */\ninterface EventWithoutProperties {\n name:\n | 'changeComponentsOrder'\n | 'didAccessAuthenticatedAdministration'\n | 'didAddComponentToDynamicZone'\n | 'didBulkDeleteEntries'\n | 'didChangeDisplayedFields'\n | 'didCheckDraftRelations'\n | 'didClickGuidedTourHomepageApiTokens'\n | 'didClickGuidedTourHomepageContentManager'\n | 'didClickGuidedTourHomepageContentTypeBuilder'\n | 'didClickGuidedTourStep1CollectionType'\n | 'didClickGuidedTourStep2ContentManager'\n | 'didClickGuidedTourStep3ApiTokens'\n | 'didClickonBlogSection'\n | 'didClickonCodeExampleSection'\n | 'didClickonReadTheDocumentationSection'\n | 'didClickOnTryStrapiCloudSection'\n | 'didClickonTutorialSection'\n | 'didCreateGuidedTourCollectionType'\n | 'didCreateGuidedTourEntry'\n | 'didCreateNewRole'\n | 'didCreateRole'\n | 'didDeleteToken'\n | 'didDuplicateRole'\n | 'didEditEditSettings'\n | 'didEditEmailTemplates'\n | 'didEditFieldNameOnContentType'\n | 'didEditListSettings'\n | 'didEditMediaLibraryConfig'\n | 'didEditNameOfContentType'\n | 'didGenerateGuidedTourApiTokens'\n | 'didGoToMarketplace'\n | 'didLaunchGuidedtour'\n | 'didMissMarketplacePlugin'\n | 'didNotCreateFirstAdmin'\n | 'didNotSaveComponent'\n | 'didPluginLearnMore'\n | 'didPublishEntry'\n | 'didUnpublishEntry'\n | 'didSaveComponent'\n | 'didSaveContentType'\n | 'didSearch'\n | 'didSkipGuidedtour'\n | 'didSubmitPlugin'\n | 'didSubmitProvider'\n | 'didUpdateConditions'\n | 'didSelectAllMediaLibraryElements'\n | 'didSelectContentTypeFieldSettings'\n | 'didSelectContentTypeSettings'\n | 'didEditAuthenticationProvider'\n | 'hasClickedCTBAddFieldBanner'\n | 'removeComponentFromDynamicZone'\n | 'willAddMoreFieldToContentType'\n | 'willBulkDeleteEntries'\n | 'willBulkUnpublishEntries'\n | 'willChangeNumberOfEntriesPerPage'\n | 'willCheckDraftRelations'\n | 'willCreateComponent'\n | 'willCreateComponentFromAttributesModal'\n | 'willCreateContentType'\n | 'willCreateFirstAdmin'\n | 'willCreateNewRole'\n | 'willCreateRole'\n | 'willCreateSingleType'\n | 'willCreateStage'\n | 'willCreateWorkflow'\n | 'willDeleteEntryFromList'\n | 'willDeleteFieldOfContentType'\n | 'willDuplicateRole'\n | 'willEditEditLayout'\n | 'willEditEmailTemplates'\n | 'willEditEntryFromButton'\n | 'willEditEntryFromList'\n | 'willEditFieldOfContentType'\n | 'willEditMediaLibraryConfig'\n | 'willEditNameOfContentType'\n | 'willEditNameOfSingleType'\n | 'willEditAuthenticationProvider'\n | 'willEditFieldNameOnContentType'\n | 'willEditStage'\n | 'willFilterEntries'\n | 'willInstallPlugin'\n | 'willPublishEntry'\n | 'willUnpublishEntry'\n | 'willSaveComponent'\n | 'willSaveContentType'\n | 'willSaveContentTypeLayout'\n | 'didEditFieldNameOnContentType'\n | 'didCreateRelease';\n properties?: never;\n}\n\ninterface DidFilterMediaLibraryElementsEvent {\n name: 'didFilterMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n filter: string;\n };\n}\n\ninterface DidSortMediaLibraryElementsEvent {\n name: 'didSortMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n sort: string;\n };\n}\n\ninterface DidCropFileEvent {\n name: 'didCropFile';\n properties: MediaEvents['properties'] & {\n duplicatedFile: null | boolean;\n };\n}\n\ninterface DidSelectFile {\n name: 'didSelectFile';\n properties: MediaEvents['properties'] & {\n source: 'url' | 'computer';\n };\n}\n\ninterface DidEditMediaLibraryElementsEvent {\n name: 'didEditMediaLibraryElements';\n properties: MediaEvents['properties'] & {\n type: string;\n changeLocation: string;\n };\n}\n\ninterface MediaEvents {\n name:\n | 'didSearchMediaLibraryElements'\n | 'didReplaceMedia'\n | 'didAddMediaLibraryFolders'\n | 'willAddMediaLibraryAssets';\n properties: {\n location: string;\n };\n}\n\ninterface DidSelectContentTypeFieldTypeEvent {\n name: 'didSelectContentTypeFieldType';\n properties: {\n type?: string;\n };\n}\n\ninterface DidChangeModeEvent {\n name: 'didChangeMode';\n properties: {\n newMode: string;\n };\n}\ninterface DidSubmitWithErrorsFirstAdminEvent {\n name: 'didSubmitWithErrorsFirstAdmin';\n properties: {\n count: string;\n };\n}\n\ninterface WillNavigateEvent {\n name: 'willNavigate';\n properties: {\n from: string;\n to: string;\n };\n}\n\ninterface DidAccessTokenListEvent {\n name: 'didAccessTokenList';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n number: number;\n };\n}\ninterface LogoEvent {\n name: 'didChangeLogo' | 'didClickResetLogo';\n properties: {\n logo: 'menu' | 'auth';\n };\n}\n\ninterface TokenEvents {\n name:\n | 'didCopyTokenKey'\n | 'didAddTokenFromList'\n | 'didEditTokenFromList'\n | 'willAccessTokenList'\n | 'willAddTokenFromList'\n | 'willCreateToken'\n | 'willDeleteToken'\n | 'willEditToken'\n | 'willEditTokenFromList';\n properties: {\n tokenType: 'api-token' | 'transfer-token';\n };\n}\n\ninterface WillModifyTokenEvent {\n name: 'didCreateToken' | 'didEditToken';\n properties: {\n tokenType: TokenEvents['properties']['tokenType'];\n type: 'custom' | 'full-access' | 'read-only' | Array<'push' | 'pull' | 'push-pull'>;\n };\n}\n\ninterface DeleteEntryEvents {\n name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface CreateEntryEvents {\n name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface UpdateEntryEvents {\n name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry';\n properties: {\n status?: string;\n error?: unknown;\n };\n}\n\ninterface DidFilterEntriesEvent {\n name: 'didFilterEntries';\n properties: {\n useRelation: boolean;\n };\n}\n\ninterface DidPublishRelease {\n name: 'didPublishRelease';\n properties: {\n totalEntries: number;\n totalPublishedEntries: number;\n totalUnpublishedEntries: number;\n };\n}\n\ntype EventsWithProperties =\n | CreateEntryEvents\n | DidAccessTokenListEvent\n | DidChangeModeEvent\n | DidCropFileEvent\n | DeleteEntryEvents\n | DidEditMediaLibraryElementsEvent\n | DidFilterMediaLibraryElementsEvent\n | DidFilterEntriesEvent\n | DidSelectContentTypeFieldTypeEvent\n | DidSelectFile\n | DidSortMediaLibraryElementsEvent\n | DidSubmitWithErrorsFirstAdminEvent\n | LogoEvent\n | TokenEvents\n | UpdateEntryEvents\n | WillModifyTokenEvent\n | WillNavigateEvent\n | DidPublishRelease;\n\nexport type TrackingEvent = EventWithoutProperties | EventsWithProperties;\nexport interface UseTrackingReturn {\n /**\n * This type helps show all the available event names before you start typing,\n * however autocomplete isn't great.\n */\n trackUsage<TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n trackUsage<TEvent extends Extract<TrackingEvent, { properties?: never }>>(\n event: TEvent['name'],\n properties?: never\n ): Promise<null | AxiosResponse<string>>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n trackUsage<TEvent extends Extract<TrackingEvent, { properties: object }>>(\n event: TEvent['name'],\n properties: TEvent['properties']\n ): Promise<null | AxiosResponse<string>>;\n}\n\n/**\n * @description Used to send amplitude events to the Strapi Tracking hub.\n *\n * @example\n * ```tsx\n * import { useTracking } from '@strapi/helper-plugin';\n *\n * const MyComponent = () => {\n * const { trackUsage } = useTracking();\n *\n * const handleClick = () => {\n * trackUsage('my-event', { myProperty: 'myValue' });\n * }\n *\n * return <button onClick={handleClick}>Send Event</button>\n * }\n * ```\n */\nconst useTracking = (): UseTrackingReturn => {\n const { uuid, telemetryProperties } = React.useContext(TrackingContext);\n const userId = useAppInfo('useTracking', (state) => state.userId);\n const trackUsage = React.useCallback(\n async <TEvent extends TrackingEvent>(\n event: TEvent['name'],\n properties?: TEvent['properties']\n ) => {\n try {\n if (uuid && !window.strapi.telemetryDisabled) {\n const res = await axios.post<string>(\n 'https://analytics.strapi.io/api/v2/track',\n {\n event,\n userId,\n eventProperties: { ...properties },\n userProperties: {},\n groupProperties: {\n ...telemetryProperties,\n projectId: uuid,\n projectType: window.strapi.projectType,\n },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n }\n );\n\n return res;\n }\n } catch (err) {\n // Silence is golden\n }\n\n return null;\n },\n [telemetryProperties, userId, uuid]\n );\n\n return { trackUsage };\n};\n\nexport { TrackingProvider, useTracking };\n","import * as React from 'react';\n\nimport { createContext } from '@radix-ui/react-context';\nimport { useRBAC } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { UpdateProjectSettings } from '../../../shared/contracts/admin';\nimport { Page } from '../components/PageHelpers';\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport {\n ConfigurationLogo,\n useInitQuery,\n useProjectSettingsQuery,\n useUpdateProjectSettingsMutation,\n} from '../services/admin';\n\nimport { useAuth } from './Auth';\nimport { useNotification } from './Notifications';\nimport { useTracking } from './Tracking';\n\nimport type { StrapiApp } from '../StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * Configuration Context\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UpdateProjectSettingsBody {\n authLogo:\n | ((UpdateProjectSettings.Request['body']['authLogo'] | ConfigurationLogo['custom']) & {\n rawFile?: File;\n })\n | null;\n menuLogo:\n | ((UpdateProjectSettings.Request['body']['menuLogo'] | ConfigurationLogo['custom']) & {\n rawFile?: File;\n })\n | null;\n}\n\ninterface ConfigurationContextValue {\n logos: {\n auth: ConfigurationLogo;\n menu: ConfigurationLogo;\n };\n showTutorials: boolean;\n showReleaseNotification: boolean;\n updateProjectSettings: (body: UpdateProjectSettingsBody) => Promise<void>;\n}\n\nconst [ConfigurationContextProvider, useConfiguration] =\n createContext<ConfigurationContextValue>('ConfigurationContext');\n\n/* -------------------------------------------------------------------------------------------------\n * ConfigurationProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ConfigurationProviderProps {\n children: React.ReactNode;\n defaultAuthLogo: StrapiApp['configurations']['authLogo'];\n defaultMenuLogo: StrapiApp['configurations']['menuLogo'];\n showReleaseNotification?: boolean;\n showTutorials?: boolean;\n}\n\nconst ConfigurationProvider = ({\n children,\n defaultAuthLogo,\n defaultMenuLogo,\n showReleaseNotification = false,\n showTutorials = false,\n}: ConfigurationProviderProps) => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.settings?.['project-settings']\n );\n const token = useAuth('ConfigurationProvider', (state) => state.token);\n const {\n allowedActions: { canRead },\n } = useRBAC(permissions);\n\n const {\n data: { authLogo: customAuthLogo, menuLogo: customMenuLogo } = {},\n error,\n isLoading,\n } = useInitQuery();\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'app.containers.App.notification.error.init' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n const { data, isSuccess } = useProjectSettingsQuery(undefined, {\n skip: !token || !canRead,\n });\n\n const [updateProjectSettingsMutation] = useUpdateProjectSettingsMutation();\n\n const updateProjectSettings = React.useCallback(\n async (body: UpdateProjectSettingsBody) => {\n const formData = new FormData();\n\n /**\n * We either only send files or we send null values.\n * Null removes the logo. If you don't want to effect\n * an existing logo, don't send anything.\n */\n Object.entries(body).forEach(([key, value]) => {\n if (value?.rawFile) {\n formData.append(key, value.rawFile);\n } else if (value === null) {\n formData.append(key, JSON.stringify(value));\n }\n });\n\n const res = await updateProjectSettingsMutation(formData);\n\n if ('data' in res) {\n const updatedMenuLogo = !!res.data.menuLogo && !!body.menuLogo?.rawFile;\n const updatedAuthLogo = !!res.data.authLogo && !!body.authLogo?.rawFile;\n\n if (updatedMenuLogo) {\n trackUsage('didChangeLogo', {\n logo: 'menu',\n });\n }\n\n if (updatedAuthLogo) {\n trackUsage('didChangeLogo', {\n logo: 'auth',\n });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'app', defaultMessage: 'Saved' }),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n },\n [formatAPIError, formatMessage, toggleNotification, trackUsage, updateProjectSettingsMutation]\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <ConfigurationContextProvider\n showReleaseNotification={showReleaseNotification}\n showTutorials={showTutorials}\n logos={{\n menu: {\n custom: isSuccess\n ? data?.menuLogo\n : {\n url: customMenuLogo ?? '',\n },\n default: defaultMenuLogo,\n },\n auth: {\n custom: isSuccess\n ? data?.authLogo\n : {\n url: customAuthLogo ?? '',\n },\n default: defaultAuthLogo,\n },\n }}\n updateProjectSettings={updateProjectSettings}\n >\n {children}\n </ConfigurationContextProvider>\n );\n};\n\nexport {\n ConfigurationContextProvider as _internalConfigurationContextProvider,\n ConfigurationProvider,\n useConfiguration,\n};\nexport type {\n ConfigurationProviderProps,\n ConfigurationContextValue,\n ConfigurationLogo,\n UpdateProjectSettingsBody,\n};\n","import { createContext } from '../components/Context';\n\nimport type { StrapiApp } from '../StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * StrapiApp\n * -----------------------------------------------------------------------------------------------*/\ninterface StrapiAppContextValue\n extends Pick<\n StrapiApp,\n | 'customFields'\n | 'menu'\n | 'getAdminInjectedComponents'\n | 'getPlugin'\n | 'plugins'\n | 'runHookParallel'\n | 'runHookSeries'\n | 'settings'\n > {\n components: StrapiApp['library']['components'];\n fields: StrapiApp['library']['fields'];\n runHookWaterfall: <TData>(\n name: Parameters<StrapiApp['runHookWaterfall']>[0],\n initialValue: TData\n ) => TData;\n}\n\nconst [StrapiAppProvider, useStrapiApp] = createContext<StrapiAppContextValue>('StrapiApp');\n\nexport { StrapiAppProvider, useStrapiApp };\nexport type { StrapiAppContextValue };\n","import * as React from 'react';\n\nimport { auth } from '@strapi/helper-plugin';\nimport { produce } from 'immer';\nimport get from 'lodash/get';\nimport set from 'lodash/set';\n\nconst GUIDED_TOUR_COMPLETED_STEPS = 'GUIDED_TOUR_COMPLETED_STEPS';\nconst GUIDED_TOUR_CURRENT_STEP = 'GUIDED_TOUR_CURRENT_STEP';\nconst GUIDED_TOUR_SKIPPED = 'GUIDED_TOUR_SKIPPED';\n\nconst GUIDED_TOUR_KEYS = {\n GUIDED_TOUR_COMPLETED_STEPS,\n GUIDED_TOUR_CURRENT_STEP,\n GUIDED_TOUR_SKIPPED,\n} as const;\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\nimport { createContext } from '../Context';\n\ntype SectionKey = keyof GuidedTourContextValue['guidedTourState'];\ntype StepKey = keyof GuidedTourContextValue['guidedTourState'][SectionKey];\ntype Step = `${SectionKey}.${StepKey}`;\ninterface GuidedTourContextValue {\n currentStep: Step | null;\n guidedTourState: {\n contentTypeBuilder: {\n create: boolean;\n success: boolean;\n };\n contentManager: {\n create: boolean;\n success: boolean;\n };\n apiTokens: {\n create: boolean;\n success: boolean;\n };\n transferTokens: {\n create: boolean;\n success: boolean;\n };\n };\n isGuidedTourVisible: boolean;\n isSkipped: boolean;\n setCurrentStep: (step: Step | null) => void | null;\n setGuidedTourVisibility: (isVisible: boolean) => void;\n setSkipped: (isSkipped: boolean) => void;\n setStepState: (step: Step, state: boolean) => void;\n startSection: (section: SectionKey) => void;\n}\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<GuidedTourContextValue>('GuidedTour');\n\ninterface GuidedTourProviderProps {\n children: React.ReactNode;\n}\n\nconst GuidedTourProvider = ({ children }: GuidedTourProviderProps) => {\n const [{ currentStep, guidedTourState, isGuidedTourVisible, isSkipped }, dispatch] =\n React.useReducer(reducer, initialState, initialiseState);\n\n const setCurrentStep = (step: SetCurrentStepAction['step']) => {\n // if step is null it is intentional, we need to dispatch it\n if (step !== null) {\n const isStepAlreadyDone = get(guidedTourState, step);\n const [sectionName, stepName] = step.split('.') as [SectionKey, StepKey];\n const sectionArray = Object.entries(guidedTourState[sectionName]);\n\n const currentStepIndex = sectionArray.findIndex(([key]) => key === stepName);\n const previousSteps = sectionArray.slice(0, currentStepIndex);\n\n const isStepToShow = previousSteps.every(([, sectionValue]) => sectionValue);\n\n if (isStepAlreadyDone || isSkipped || !isStepToShow) {\n return null;\n }\n }\n\n auth.set(null, GUIDED_TOUR_KEYS.GUIDED_TOUR_CURRENT_STEP, true);\n\n return dispatch({\n type: 'SET_CURRENT_STEP',\n step,\n });\n };\n\n const setGuidedTourVisibility = (value: SetGuidedTourVisibilityAction['value']) => {\n dispatch({\n type: 'SET_GUIDED_TOUR_VISIBILITY',\n value,\n });\n };\n\n const setStepState = (currentStep: Step, value: SetStepStateAction['value']) => {\n addCompletedStep(currentStep);\n\n dispatch({\n type: 'SET_STEP_STATE',\n currentStep,\n value,\n });\n };\n\n const startSection = (sectionName: SectionKey) => {\n const sectionSteps = guidedTourState[sectionName];\n\n if (sectionSteps) {\n const guidedTourArray = Object.entries(guidedTourState);\n\n // Find current section position in the guidedTourArray\n // Get only previous sections based on current section position\n const currentSectionIndex = guidedTourArray.findIndex(([key]) => key === sectionName);\n const previousSections = guidedTourArray.slice(0, currentSectionIndex);\n\n // Check if every steps from previous section are done\n const isSectionToShow = previousSections.every(([, sectionValue]) =>\n Object.values(sectionValue).every(Boolean)\n );\n\n const [firstStep] = Object.keys(sectionSteps) as [StepKey];\n const isFirstStepDone = sectionSteps[firstStep];\n\n if (isSectionToShow && !currentStep && !isFirstStepDone) {\n setCurrentStep(`${sectionName}.${firstStep}`);\n }\n }\n };\n\n const setSkipped = (value: SetSkippedAction['value']) => {\n auth.set(value, GUIDED_TOUR_KEYS.GUIDED_TOUR_SKIPPED, true);\n\n dispatch({\n type: 'SET_SKIPPED',\n value,\n });\n };\n\n return (\n <GuidedTourProviderImpl\n guidedTourState={guidedTourState}\n currentStep={currentStep}\n setCurrentStep={setCurrentStep}\n setGuidedTourVisibility={setGuidedTourVisibility}\n setSkipped={setSkipped}\n setStepState={setStepState}\n startSection={startSection}\n isGuidedTourVisible={isGuidedTourVisible}\n isSkipped={isSkipped}\n >\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\ntype State = Pick<\n GuidedTourContextValue,\n 'guidedTourState' | 'currentStep' | 'isGuidedTourVisible' | 'isSkipped'\n>;\n\nconst initialState = {\n currentStep: null,\n guidedTourState: {\n contentTypeBuilder: {\n create: false,\n success: false,\n },\n contentManager: {\n create: false,\n success: false,\n },\n apiTokens: {\n create: false,\n success: false,\n },\n transferTokens: {\n create: false,\n success: false,\n },\n },\n isGuidedTourVisible: false,\n isSkipped: false,\n} satisfies State;\n\ninterface SetCurrentStepAction {\n type: 'SET_CURRENT_STEP';\n step: Step | null;\n}\n\ninterface SetStepStateAction {\n type: 'SET_STEP_STATE';\n currentStep: Step;\n value: boolean;\n}\n\ninterface SetSkippedAction {\n type: 'SET_SKIPPED';\n value: boolean;\n}\n\ninterface SetGuidedTourVisibilityAction {\n type: 'SET_GUIDED_TOUR_VISIBILITY';\n value: boolean;\n}\n\ntype Action =\n | SetCurrentStepAction\n | SetStepStateAction\n | SetSkippedAction\n | SetGuidedTourVisibilityAction;\n\nconst reducer: React.Reducer<State, Action> = (state: State = initialState, action: Action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'SET_CURRENT_STEP': {\n draftState.currentStep = action.step;\n break;\n }\n case 'SET_STEP_STATE': {\n const [section, step] = action.currentStep.split('.') as [SectionKey, StepKey];\n draftState.guidedTourState[section][step] = action.value;\n break;\n }\n case 'SET_SKIPPED': {\n draftState.isSkipped = action.value;\n break;\n }\n case 'SET_GUIDED_TOUR_VISIBILITY': {\n draftState.isGuidedTourVisible = action.value;\n break;\n }\n default: {\n return draftState;\n }\n }\n });\n\nconst initialiseState = (initialState: State) => {\n const copyInitialState = { ...initialState };\n const guidedTourLocaleStorage = auth.get(GUIDED_TOUR_KEYS.GUIDED_TOUR_COMPLETED_STEPS);\n const currentStepLocaleStorage = auth.get(GUIDED_TOUR_KEYS.GUIDED_TOUR_CURRENT_STEP);\n const skippedLocaleStorage = auth.get(GUIDED_TOUR_KEYS.GUIDED_TOUR_SKIPPED);\n\n if (Array.isArray(guidedTourLocaleStorage)) {\n guidedTourLocaleStorage.forEach((step) => {\n const [sectionName, stepName] = step.split('.');\n set(copyInitialState, ['guidedTourState', sectionName, stepName], true);\n });\n }\n\n // if current step when initializing mark it as done\n if (currentStepLocaleStorage) {\n const [sectionName, stepName] = currentStepLocaleStorage.split('.') as [SectionKey, StepKey];\n set(copyInitialState, ['guidedTourState', sectionName, stepName], true);\n\n addCompletedStep(currentStepLocaleStorage as Step);\n\n auth.set(null, GUIDED_TOUR_KEYS.GUIDED_TOUR_CURRENT_STEP, true);\n }\n\n if (skippedLocaleStorage !== null) {\n set(copyInitialState, 'isSkipped', skippedLocaleStorage);\n }\n\n return copyInitialState;\n};\n\n/**\n * @description Add a completed step to the local storage if it does not already exist.\n */\nconst addCompletedStep = (completedStep: Step) => {\n const currentSteps = auth.get(GUIDED_TOUR_KEYS.GUIDED_TOUR_COMPLETED_STEPS) ?? [];\n\n if (!Array.isArray(currentSteps)) {\n return;\n }\n\n const isAlreadyStored = currentSteps.includes(completedStep);\n\n if (isAlreadyStored) {\n return;\n }\n\n auth.set([...currentSteps, completedStep], GUIDED_TOUR_KEYS.GUIDED_TOUR_COMPLETED_STEPS, true);\n};\n\nexport { GuidedTourProvider, useGuidedTour, GuidedTourContextValue, GUIDED_TOUR_KEYS };\n","import * as React from 'react';\n\nimport defaultsDeep from 'lodash/defaultsDeep';\nimport { IntlProvider } from 'react-intl';\n\nimport { useTypedSelector } from '../core/store/hooks';\n\n/* -------------------------------------------------------------------------------------------------\n * LanguageProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LanguageProviderProps {\n children: React.ReactNode;\n messages: Record<string, Record<string, string>>;\n}\n\nconst LanguageProvider = ({ children, messages }: LanguageProviderProps) => {\n const locale = useTypedSelector((state) => state.admin_app.language.locale);\n const appMessages = defaultsDeep(messages[locale], messages.en);\n\n return (\n <IntlProvider locale={locale} defaultLocale=\"en\" messages={appMessages} textComponent=\"span\">\n {children}\n </IntlProvider>\n );\n};\n\nexport { LanguageProvider };\nexport type { LanguageProviderProps };\n","import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle`\n body {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n`;\n\nexport { Theme };\nexport type { ThemeProps };\n","import * as React from 'react';\n\nimport { QueryClient, QueryClientProvider } from 'react-query';\nimport { Provider } from 'react-redux';\n\nimport { AuthProvider } from '../features/Auth';\nimport { HistoryProvider } from '../features/BackButton';\nimport { ConfigurationProvider } from '../features/Configuration';\nimport { NotificationsProvider } from '../features/Notifications';\nimport { StrapiAppProvider } from '../features/StrapiApp';\nimport { TrackingProvider } from '../features/Tracking';\n\nimport { GuidedTourProvider } from './GuidedTour/Provider';\nimport { LanguageProvider } from './LanguageProvider';\nimport { Theme } from './Theme';\n\nimport type { Store } from '../core/store/configure';\nimport type { StrapiApp } from '../StrapiApp';\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n },\n },\n});\n\ninterface ProvidersProps {\n children: React.ReactNode;\n strapi: StrapiApp;\n store: Store;\n}\n\nconst Providers = ({ children, strapi, store }: ProvidersProps) => {\n return (\n <Provider store={store}>\n <HistoryProvider>\n <AuthProvider>\n <LanguageProvider messages={strapi.configurations.translations}>\n <Theme themes={strapi.configurations.themes}>\n <QueryClientProvider client={queryClient}>\n <StrapiAppProvider\n components={strapi.library.components}\n customFields={strapi.customFields}\n fields={strapi.library.fields}\n menu={strapi.menu}\n getAdminInjectedComponents={strapi.getAdminInjectedComponents}\n getPlugin={strapi.getPlugin}\n plugins={strapi.plugins}\n runHookParallel={strapi.runHookParallel}\n runHookWaterfall={(name, initialValue) => {\n return strapi.runHookWaterfall(name, initialValue, store);\n }}\n runHookSeries={strapi.runHookSeries}\n settings={strapi.settings}\n >\n <NotificationsProvider>\n <TrackingProvider>\n <GuidedTourProvider>\n <ConfigurationProvider\n defaultAuthLogo={strapi.configurations.authLogo}\n defaultMenuLogo={strapi.configurations.menuLogo}\n showTutorials={strapi.configurations.tutorials}\n showReleaseNotification={strapi.configurations.notifications.releases}\n >\n {children}\n </ConfigurationProvider>\n </GuidedTourProvider>\n </TrackingProvider>\n </NotificationsProvider>\n </StrapiAppProvider>\n </QueryClientProvider>\n </Theme>\n </LanguageProvider>\n </AuthProvider>\n </HistoryProvider>\n </Provider>\n );\n};\n\nexport { Providers };\n","/**\n *\n * App.js\n *\n */\nimport { Suspense } from 'react';\n\nimport { Helmet } from 'react-helmet';\nimport { Outlet } from 'react-router-dom';\n\nimport { Page } from './components/PageHelpers';\nimport { Providers } from './components/Providers';\nimport { LANGUAGE_LOCAL_STORAGE_KEY } from './reducer';\n\nimport type { Store } from './core/store/configure';\nimport type { StrapiApp } from './StrapiApp';\n\ninterface AppProps {\n strapi: StrapiApp;\n store: Store;\n}\n\nconst App = ({ strapi, store }: AppProps) => {\n return (\n <Providers strapi={strapi} store={store}>\n <Suspense fallback={<Page.Loading />}>\n <Helmet\n htmlAttributes={{ lang: localStorage.getItem(LANGUAGE_LOCAL_STORAGE_KEY) || 'en' }}\n />\n <Outlet />\n </Suspense>\n </Providers>\n );\n};\n\nexport { App };\nexport type { AppProps };\n","export default \"data:image/svg+xml,%3csvg%20width='800'%20height='800'%20viewBox='0%200%20800%20800'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M39%20282c0-118%200-176.9%2036.6-213.5C112.2%2032%20171.1%2032%20288.9%2032h221.2c117.8%200%20176.7%200%20213.3%2036.6C760%20105.2%20760%20164.1%20760%20281.9v221.2c0%20117.8%200%20176.7-36.6%20213.3C686.8%20753%20627.9%20753%20510.1%20753H288.9c-117.8%200-176.7%200-213.3-36.6C39%20679.8%2039%20620.9%2039%20503.1V281.9Z'%20fill='%234945FF'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M536.4%20250.7H293.7v123.8h123.8v123.7h123.8V255.5c0-2.6-2.2-4.8-4.9-4.8Z'%20fill='%23fff'/%3e%3cpath%20fill='%23fff'%20d='M412.7%20374.5h4.8v4.8h-4.8z'/%3e%3cpath%20d='M293.8%20374.5h119c2.6%200%204.8%202.1%204.8%204.8v119h-119a4.8%204.8%200%200%201-4.8-4.9v-119Z'%20fill='%239593FF'/%3e%3cpath%20d='M417.5%20498.2h123.8L421.6%20618a2.4%202.4%200%200%201-4-1.7v-118ZM293.8%20374.5h-118a2.4%202.4%200%200%201-1.7-4.1l119.7-119.7v123.8Z'%20fill='%239593FF'/%3e%3c/svg%3e\"","import { Alert, Button, Flex, Icon, Main, Typography } from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport { useClipboard } from '@strapi/helper-plugin';\nimport { Duplicate, ExclamationMarkCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useRouteError } from 'react-router-dom';\nimport styled from 'styled-components';\n\n/**\n * @description this stops the app from going white, and instead shows the error message.\n * But it could be improved for sure.\n */\nconst ErrorElement = () => {\n const error = useRouteError();\n const { formatMessage } = useIntl();\n const { copy } = useClipboard();\n\n if (error instanceof Error) {\n console.error(error);\n\n const handleClick = async () => {\n await copy(`\n\\`\\`\\`\n${error.stack}\n\\`\\`\\`\n `);\n };\n\n return (\n <Main height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Flex\n gap={7}\n padding={7}\n direction=\"column\"\n width=\"35%\"\n shadow=\"tableShadow\"\n borderColor=\"neutral150\"\n background=\"neutral0\"\n hasRadius\n maxWidth=\"512px\"\n >\n <Flex direction=\"column\" gap={2}>\n <Icon as={ExclamationMarkCircle} width=\"32px\" height=\"32px\" color=\"danger600\" />\n <Typography fontSize={4} fontWeight=\"bold\" textAlign=\"center\">\n {formatMessage({\n id: 'app.error',\n defaultMessage: 'Something went wrong',\n })}\n </Typography>\n <Typography variant=\"omega\" textAlign=\"center\">\n {formatMessage(\n {\n id: 'app.error.message',\n defaultMessage: `It seems like there is a bug in your instance, but we've got you covered. Please notify your technical team so they can investigate the source of the problem and report the issue to us by opening a bug report on {link}.`,\n },\n {\n link: (\n <Link\n isExternal\n // hack to get rid of the current endIcon, which should be removable by using `null`.\n endIcon\n href=\"https://github.com/strapi/strapi/issues/new?assignees=&labels=&projects=&template=BUG_REPORT.md\"\n >{`Strapi's GitHub`}</Link>\n ),\n }\n )}\n </Typography>\n </Flex>\n {/* the Alert component needs to make its close button optional as well as the icon. */}\n <Flex gap={4} direction=\"column\" width=\"100%\">\n <StyledAlert onClose={() => {}} width=\"100%\" closeLabel=\"\" variant=\"danger\">\n <ErrorType>{error.message}</ErrorType>\n </StyledAlert>\n <Button onClick={handleClick} variant=\"tertiary\" startIcon={<Duplicate />}>\n {formatMessage({\n id: 'app.error.copy',\n defaultMessage: 'Copy to clipboard',\n })}\n </Button>\n </Flex>\n </Flex>\n </Flex>\n </Main>\n );\n }\n\n throw error;\n};\n\nconst StyledAlert = styled(Alert)`\n & > div:first-child {\n display: none;\n }\n\n & > button {\n display: none;\n }\n`;\n\nconst ErrorType = styled(Typography)`\n word-break: break-all;\n color: ${({ theme }) => theme.colors.danger600};\n`;\n\nexport { ErrorElement };\n","import {\n InjectionZoneArea,\n InjectionZoneBlock,\n InjectionZoneContainer,\n InjectionZoneModule,\n} from '../components/InjectionZone';\nimport { useStrapiApp } from '../features/StrapiApp';\n\nexport const useInjectionZone = (area: InjectionZoneArea) => {\n const getAdminInjectedComponents = useStrapiApp(\n 'useInjectioneZone',\n (state) => state.getAdminInjectedComponents\n );\n\n const [moduleName, page, position] = area.split('.') as [\n InjectionZoneModule,\n InjectionZoneContainer,\n InjectionZoneBlock\n ];\n\n return getAdminInjectedComponents(moduleName, page, position);\n};\n","import * as React from 'react';\n\nimport { useInjectionZone } from '../hooks/useInjectionZone';\n\nconst INJECTION_ZONES = {\n admin: {\n // Temporary injection zone, support for the react-tour plugin in foodadvisor\n tutorials: {\n links: [],\n },\n },\n contentManager: {\n editView: { informations: [], 'right-links': [] },\n listView: {\n actions: [],\n deleteModalAdditionalInfos: [],\n publishModalAdditionalInfos: [],\n unpublishModalAdditionalInfos: [],\n },\n },\n} satisfies InjectionZones;\n\ninterface InjectionZoneComponent {\n Component: React.ComponentType;\n name: string;\n // TODO: in theory this could receive and forward any React component prop\n // but in practice there only seems to be once instance, where `slug` is\n // forwarded. The type needs to become either more generic or we disallow\n // prop spreading and offer a different way to access context data.\n slug: string;\n}\n\ninterface InjectionZones {\n admin: {\n tutorials: {\n links: InjectionZoneComponent[];\n };\n };\n contentManager: {\n editView: {\n informations: InjectionZoneComponent[];\n 'right-links': InjectionZoneComponent[];\n };\n listView: {\n actions: InjectionZoneComponent[];\n deleteModalAdditionalInfos: InjectionZoneComponent[];\n publishModalAdditionalInfos: InjectionZoneComponent[];\n unpublishModalAdditionalInfos: InjectionZoneComponent[];\n };\n };\n}\n\ntype InjectionZoneArea =\n | 'admin.tutorials.links'\n | 'contentManager.editView.informations'\n | 'contentManager.editView.right-links'\n | 'contentManager.listView.actions'\n | 'contentManager.listView.unpublishModalAdditionalInfos'\n | 'contentManager.listView.deleteModalAdditionalInfos'\n | 'contentManager.listView.publishModalAdditionalInfos'\n | 'contentManager.listView.deleteModalAdditionalInfos';\n\ntype InjectionZoneModule = InjectionZoneArea extends `${infer Word}.${string}` ? Word : never;\ntype InjectionZoneContainer = InjectionZoneArea extends `${string}.${infer Word}.${string}`\n ? Word\n : never;\ntype InjectionZoneBlock = InjectionZoneArea extends `${string}.${string}.${infer Word}`\n ? Word\n : never;\n\n/**\n * You can't know what this component props will be because it's generic and used everywhere\n * e.g. content-manager edit view, we just send the slug but we might not in the listView,\n * therefore, people should type it themselves on the components they render.\n */\nconst InjectionZone = ({ area, ...props }: { area: InjectionZoneArea; [key: string]: unknown }) => {\n const components = useInjectionZone(area);\n\n return (\n <>\n {components.map((component) => (\n <component.Component key={component.name} {...props} />\n ))}\n </>\n );\n};\n\nexport { InjectionZone, INJECTION_ZONES };\n\nexport type {\n InjectionZoneArea,\n InjectionZoneComponent,\n InjectionZones,\n InjectionZoneModule,\n InjectionZoneContainer,\n InjectionZoneBlock,\n};\n","import { PermissionMap } from './types/permissions';\n\nimport type { StrapiAppSettingLink } from './StrapiApp';\n\nexport const ADMIN_PERMISSIONS_CE = {\n contentManager: {\n main: [],\n collectionTypesConfigurations: [\n {\n action: 'plugin::content-manager.collection-types.configure-view',\n subject: null,\n },\n ],\n componentsConfigurations: [\n {\n action: 'plugin::content-manager.components.configure-layout',\n subject: null,\n },\n ],\n singleTypesConfigurations: [\n {\n action: 'plugin::content-manager.single-types.configure-view',\n subject: null,\n },\n ],\n },\n marketplace: {\n main: [{ action: 'admin::marketplace.read', subject: null }],\n read: [{ action: 'admin::marketplace.read', subject: null }],\n },\n settings: {\n roles: {\n main: [\n { action: 'admin::roles.create', subject: null },\n { action: 'admin::roles.update', subject: null },\n { action: 'admin::roles.read', subject: null },\n { action: 'admin::roles.delete', subject: null },\n ],\n create: [{ action: 'admin::roles.create', subject: null }],\n delete: [{ action: 'admin::roles.delete', subject: null }],\n read: [{ action: 'admin::roles.read', subject: null }],\n update: [{ action: 'admin::roles.update', subject: null }],\n },\n users: {\n main: [\n { action: 'admin::users.create', subject: null },\n { action: 'admin::users.read', subject: null },\n { action: 'admin::users.update', subject: null },\n { action: 'admin::users.delete', subject: null },\n ],\n create: [{ action: 'admin::users.create', subject: null }],\n delete: [{ action: 'admin::users.delete', subject: null }],\n read: [{ action: 'admin::users.read', subject: null }],\n update: [{ action: 'admin::users.update', subject: null }],\n },\n webhooks: {\n main: [\n { action: 'admin::webhooks.create', subject: null },\n { action: 'admin::webhooks.read', subject: null },\n { action: 'admin::webhooks.update', subject: null },\n { action: 'admin::webhooks.delete', subject: null },\n ],\n create: [{ action: 'admin::webhooks.create', subject: null }],\n delete: [{ action: 'admin::webhooks.delete', subject: null }],\n read: [\n { action: 'admin::webhooks.read', subject: null },\n // NOTE: We need to check with the API\n { action: 'admin::webhooks.update', subject: null },\n { action: 'admin::webhooks.delete', subject: null },\n ],\n update: [{ action: 'admin::webhooks.update', subject: null }],\n },\n 'api-tokens': {\n main: [{ action: 'admin::api-tokens.access', subject: null }],\n create: [{ action: 'admin::api-tokens.create', subject: null }],\n delete: [{ action: 'admin::api-tokens.delete', subject: null }],\n read: [{ action: 'admin::api-tokens.read', subject: null }],\n update: [{ action: 'admin::api-tokens.update', subject: null }],\n regenerate: [{ action: 'admin::api-tokens.regenerate', subject: null }],\n },\n 'transfer-tokens': {\n main: [{ action: 'admin::transfer.tokens.access', subject: null }],\n create: [{ action: 'admin::transfer.tokens.create', subject: null }],\n delete: [{ action: 'admin::transfer.tokens.delete', subject: null }],\n read: [{ action: 'admin::transfer.tokens.read', subject: null }],\n update: [{ action: 'admin::transfer.tokens.update', subject: null }],\n regenerate: [{ action: 'admin::transfer.tokens.regenerate', subject: null }],\n },\n 'project-settings': {\n read: [{ action: 'admin::project-settings.read', subject: null }],\n update: [{ action: 'admin::project-settings.update', subject: null }],\n },\n },\n} satisfies Partial<PermissionMap>;\n\nexport const HOOKS = {\n /**\n * Hook that allows to mutate the displayed headers of the list view table\n * @constant\n * @type {string}\n */\n INJECT_COLUMN_IN_TABLE: 'Admin/CM/pages/ListView/inject-column-in-table',\n\n /**\n * Hook that allows to mutate the CM's collection types links pre-set filters\n * @constant\n * @type {string}\n */\n MUTATE_COLLECTION_TYPES_LINKS: 'Admin/CM/pages/App/mutate-collection-types-links',\n\n /**\n * Hook that allows to mutate the CM's edit view layout\n * @constant\n * @type {string}\n */\n MUTATE_EDIT_VIEW_LAYOUT: 'Admin/CM/pages/EditView/mutate-edit-view-layout',\n\n /**\n * Hook that allows to mutate the CM's single types links pre-set filters\n * @constant\n * @type {string}\n */\n MUTATE_SINGLE_TYPES_LINKS: 'Admin/CM/pages/App/mutate-single-types-links',\n};\n\nexport interface SettingsMenuLink\n extends Omit<StrapiAppSettingLink, 'Component' | 'permissions' | 'lockIcon'> {\n lockIcon?: boolean;\n}\n\nexport type SettingsMenu = {\n admin: SettingsMenuLink[];\n global: SettingsMenuLink[];\n};\n\nexport const SETTINGS_LINKS_CE = (): SettingsMenu => ({\n global: [\n {\n intlLabel: { id: 'Settings.application.title', defaultMessage: 'Overview' },\n to: '/settings/application-infos',\n id: '000-application-infos',\n },\n {\n intlLabel: { id: 'Settings.webhooks.title', defaultMessage: 'Webhooks' },\n to: '/settings/webhooks',\n id: 'webhooks',\n },\n {\n intlLabel: { id: 'Settings.apiTokens.title', defaultMessage: 'API Tokens' },\n to: '/settings/api-tokens?sort=name:ASC',\n id: 'api-tokens',\n },\n {\n intlLabel: { id: 'Settings.transferTokens.title', defaultMessage: 'Transfer Tokens' },\n to: '/settings/transfer-tokens?sort=name:ASC',\n id: 'transfer-tokens',\n },\n // If the Enterprise feature is not enabled and if the config doesn't disable it, we promote the Enterprise feature by displaying them in the settings menu.\n // Disable this by adding \"promoteEE: false\" to your `./config/admin.js` file\n ...(!window.strapi.features.isEnabled(window.strapi.features.SSO) &&\n window.strapi?.flags?.promoteEE\n ? [\n {\n intlLabel: { id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' },\n to: '/settings/purchase-single-sign-on',\n id: 'sso',\n lockIcon: true,\n },\n ]\n : []),\n\n ...(!window.strapi.features.isEnabled(window.strapi.features.REVIEW_WORKFLOWS) &&\n window.strapi?.flags?.promoteEE\n ? [\n {\n intlLabel: {\n id: 'Settings.review-workflows.page.title',\n defaultMessage: 'Review Workflows',\n },\n to: '/settings/purchase-review-workflows',\n id: 'review-workflows',\n lockIcon: true,\n },\n ]\n : []),\n ],\n\n admin: [\n {\n intlLabel: { id: 'global.roles', defaultMessage: 'Roles' },\n to: '/settings/roles',\n id: 'roles',\n },\n {\n intlLabel: { id: 'global.users', defaultMessage: 'Users' },\n // Init the search params directly\n to: '/settings/users?pageSize=10&page=1&sort=firstname',\n id: 'users',\n },\n ...(!window.strapi.features.isEnabled(window.strapi.features.AUDIT_LOGS) &&\n window.strapi?.flags?.promoteEE\n ? [\n {\n intlLabel: { id: 'global.auditLogs', defaultMessage: 'Audit Logs' },\n to: '/settings/purchase-audit-logs',\n id: 'auditLogs',\n lockIcon: true,\n },\n ]\n : []),\n ],\n});\n","const SINGLE_TYPES = 'single-types';\nconst COLLECTION_TYPES = 'collection-types';\n\nexport { SINGLE_TYPES, COLLECTION_TYPES };\n","/* eslint-disable check-file/filename-naming-convention */\nimport { useLocation, type RouteObject, matchRoutes } from 'react-router-dom';\n\n/**\n * These routes will be merged with the rest of the Content Manager routes\n */\nconst routes: RouteObject[] = [\n {\n path: ':collectionType/:slug/:id/history',\n lazy: async () => {\n const { ProtectedHistoryPage } = await import('./pages/History');\n\n return {\n Component: ProtectedHistoryPage,\n };\n },\n },\n {\n path: ':collectionType/:slug/history',\n lazy: async () => {\n const { ProtectedHistoryPage } = await import('./pages/History');\n\n return {\n Component: ProtectedHistoryPage,\n };\n },\n },\n];\n\n/**\n * Used to determine if we're on a history route from the admin and the content manager,\n * so that we can hide the left menus on all history routes\n */\nfunction useIsHistoryRoute() {\n const location = useLocation();\n const historyRoutes = routes.map((route) => ({ path: `content-manager/${route.path}` }));\n const matches = matchRoutes(historyRoutes, location);\n\n return Boolean(matches);\n}\n\nexport { routes, useIsHistoryRoute };\n","/* eslint-disable check-file/filename-naming-convention */\nimport { lazy } from 'react';\n\nimport { Navigate, RouteObject, useLoaderData, useParams } from 'react-router-dom';\n\nimport { COLLECTION_TYPES, SINGLE_TYPES } from './constants/collections';\nimport { routes as historyRoutes } from './history/routes';\n\nconst Redirect = () => {\n const pathname = useLoaderData() as string;\n\n return (\n <Navigate\n to={{\n pathname,\n }}\n />\n );\n};\n\nconst ProtectedEditViewPage = lazy(() =>\n import('./pages/EditView/EditViewPage').then((mod) => ({ default: mod.ProtectedEditViewPage }))\n);\nconst ProtectedListViewPage = lazy(() =>\n import('./pages/ListView/ListViewPage').then((mod) => ({ default: mod.ProtectedListViewPage }))\n);\n\nconst CollectionTypePages = () => {\n const { collectionType } = useParams<{ collectionType: string }>();\n\n /**\n * We only support two types of collections.\n */\n if (collectionType !== COLLECTION_TYPES && collectionType !== SINGLE_TYPES) {\n return <Navigate to=\"/404\" />;\n }\n\n return collectionType === COLLECTION_TYPES ? (\n <ProtectedListViewPage />\n ) : (\n <ProtectedEditViewPage />\n );\n};\n\nconst CLONE_RELATIVE_PATH = ':collectionType/:slug/clone/:origin';\nconst CLONE_PATH = `/content-manager/${CLONE_RELATIVE_PATH}`;\nconst LIST_RELATIVE_PATH = ':collectionType/:slug';\nconst LIST_PATH = `/content-manager/${LIST_RELATIVE_PATH}`;\n\nconst routes: RouteObject[] = [\n {\n path: 'content-manager/*',\n lazy: async () => {\n const { Layout } = await import('./layout');\n\n return {\n Component: Layout,\n };\n },\n children: [\n /**\n * These redirects exist because we've changed to use\n * the same term in `:collectionType` as the admin API\n * for simplicity\n */\n {\n path: 'collectionType/:slug',\n loader: ({ params }) => {\n const slug = params.slug;\n\n return `/content-manager/collection-types/${slug}`;\n },\n element: <Redirect />,\n },\n {\n path: 'singleType/:slug',\n loader: ({ params }) => {\n const slug = params.slug;\n\n return `/content-manager/single-types/${slug}`;\n },\n element: <Redirect />,\n },\n {\n path: LIST_RELATIVE_PATH,\n lazy: async () => {\n return {\n Component: CollectionTypePages,\n };\n },\n },\n {\n path: ':collectionType/:slug/:id',\n lazy: async () => {\n const { ProtectedEditViewPage } = await import('./pages/EditView/EditViewPage');\n\n return {\n Component: ProtectedEditViewPage,\n };\n },\n },\n {\n path: CLONE_RELATIVE_PATH,\n lazy: async () => {\n const { ProtectedEditViewPage } = await import('./pages/EditView/EditViewPage');\n\n return {\n Component: ProtectedEditViewPage,\n };\n },\n },\n {\n path: ':collectionType/:slug/configurations/list',\n lazy: async () => {\n const { ProtectedListConfiguration } = await import(\n './pages/ListConfiguration/ListConfigurationPage'\n );\n\n return {\n Component: ProtectedListConfiguration,\n };\n },\n },\n {\n path: 'components/:slug/configurations/edit',\n lazy: async () => {\n const { ProtectedComponentConfigurationPage } = await import(\n './pages/ComponentConfigurationPage'\n );\n\n return {\n Component: ProtectedComponentConfigurationPage,\n };\n },\n },\n {\n path: ':collectionType/:slug/configurations/edit',\n lazy: async () => {\n const { ProtectedEditConfigurationPage } = await import('./pages/EditConfigurationPage');\n\n return {\n Component: ProtectedEditConfigurationPage,\n };\n },\n },\n {\n path: '403',\n lazy: async () => {\n const { NoPermissions } = await import('./pages/NoPermissionsPage');\n\n return {\n Component: NoPermissions,\n };\n },\n },\n {\n path: 'no-content-types',\n lazy: async () => {\n const { NoContentType } = await import('./pages/NoContentTypePage');\n\n return {\n Component: NoContentType,\n };\n },\n },\n ...historyRoutes,\n ],\n },\n];\n\nexport { routes, CLONE_PATH, LIST_PATH };\n","import type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { ValidationError } from 'yup';\n\ninterface TranslationMessage extends MessageDescriptor {\n values?: Record<string, PrimitiveType>;\n}\n\nconst extractValuesFromYupError = (\n errorType?: string | undefined,\n errorParams?: Record<string, any> | undefined\n) => {\n if (!errorType || !errorParams) {\n return {};\n }\n\n return {\n [errorType]: errorParams[errorType],\n };\n};\n\nconst getYupInnerErrors = (error: ValidationError) =>\n (error?.inner || []).reduce<Record<string, TranslationMessage>>((acc, currentError) => {\n if (currentError.path) {\n acc[currentError.path.split('[').join('.').split(']').join('')] = {\n id: currentError.message,\n defaultMessage: currentError.message,\n values: extractValuesFromYupError(currentError?.type, currentError?.params),\n };\n }\n\n return acc;\n }, {});\n\nexport { getYupInnerErrors };\n","import { createApi } from '@reduxjs/toolkit/query/react';\n\nimport { axiosBaseQuery, type UnknownApiError } from '../../utils/baseQuery';\n\nconst contentManagerApi = createApi({\n reducerPath: 'contentManagerApi',\n baseQuery: axiosBaseQuery(),\n tagTypes: [\n 'ComponentConfiguration',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'Document',\n 'InitialData',\n 'HistoryVersion',\n ],\n endpoints: () => ({}),\n});\n\nexport { contentManagerApi, type UnknownApiError };\n","/**\n * Related to fetching the actual content of a collection type or single type.\n */\n\nimport { SINGLE_TYPES } from '../constants/collections';\n\nimport { contentManagerApi } from './api';\n\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\nconst documentApi = contentManagerApi.injectEndpoints({\n endpoints: (builder) => ({\n autoCloneDocument: builder.mutation<\n Contracts.CollectionTypes.Clone.Response,\n Contracts.CollectionTypes.Clone.Params & { query?: string }\n >({\n query: ({ model, sourceId, query }) => ({\n url: `/content-manager/collection-types/${model}/auto-clone/${sourceId}`,\n method: 'POST',\n config: {\n params: query,\n },\n }),\n invalidatesTags: (_result, _error, { model }) => [{ type: 'Document', id: `${model}_LIST` }],\n }),\n cloneDocument: builder.mutation<\n Contracts.CollectionTypes.Clone.Response,\n Contracts.CollectionTypes.Clone.Params & {\n data: Contracts.CollectionTypes.Clone.Request['body'];\n params?: Contracts.CollectionTypes.Clone.Request['query'];\n }\n >({\n query: ({ model, sourceId, data, params }) => ({\n url: `/content-manager/collection-types/${model}/clone/${sourceId}`,\n method: 'POST',\n data,\n config: {\n params,\n },\n }),\n invalidatesTags: (_result, _error, { model }) => [{ type: 'Document', id: `${model}_LIST` }],\n }),\n /**\n * Creates a new collection-type document. This should ONLY be used for collection-types.\n * single-types should always be using `updateDocument` since they always exist.\n */\n createDocument: builder.mutation<\n Contracts.CollectionTypes.Create.Response,\n Contracts.CollectionTypes.Create.Params & {\n data: Contracts.CollectionTypes.Create.Request['body'];\n params?: Contracts.CollectionTypes.Create.Request['query'];\n }\n >({\n query: ({ model, data, params }) => ({\n url: `/content-manager/collection-types/${model}`,\n method: 'POST',\n data,\n config: {\n params,\n },\n }),\n invalidatesTags: (_result, _error, { model }) => [{ type: 'Document', id: `${model}_LIST` }],\n }),\n deleteDocument: builder.mutation<\n Contracts.CollectionTypes.Delete.Response,\n Pick<Contracts.CollectionTypes.Delete.Params, 'model'> &\n Pick<Partial<Contracts.CollectionTypes.Delete.Params>, 'documentId'> & {\n collectionType: string;\n params?: Contracts.CollectionTypes.Find.Request['query'];\n }\n >({\n query: ({ collectionType, model, documentId, params }) => ({\n url: `/content-manager/${collectionType}/${model}${\n collectionType !== SINGLE_TYPES && documentId ? `/${documentId}` : ''\n }`,\n method: 'DELETE',\n config: {\n params,\n },\n }),\n invalidatesTags: (_result, _error, { collectionType, model }) => [\n { type: 'Document', id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model },\n ],\n }),\n deleteManyDocuments: builder.mutation<\n Contracts.CollectionTypes.BulkDelete.Response,\n Contracts.CollectionTypes.BulkDelete.Params &\n Contracts.CollectionTypes.BulkDelete.Request['body']\n >({\n query: ({ model, ...body }) => ({\n url: `/content-manager/collection-types/${model}/actions/bulkDelete`,\n method: 'POST',\n data: body,\n }),\n invalidatesTags: (_res, _error, { model, documentIds }) =>\n documentIds.map((id) => ({ type: 'Document', id: `${model}_${id}` })),\n }),\n discardDocument: builder.mutation<\n Contracts.CollectionTypes.Discard.Response,\n Pick<Contracts.CollectionTypes.Discard.Params, 'model'> &\n Partial<Pick<Contracts.CollectionTypes.Discard.Params, 'documentId'>> & {\n collectionType: string;\n params?: Contracts.CollectionTypes.Find.Request['query'] & {\n [key: string]: any;\n };\n }\n >({\n query: ({ collectionType, model, documentId, params }) => ({\n url: documentId\n ? `/content-manager/${collectionType}/${model}/${documentId}/actions/discard`\n : `/content-manager/${collectionType}/${model}/actions/discard`,\n method: 'POST',\n config: {\n params,\n },\n }),\n invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {\n return [\n {\n type: 'Document',\n id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model,\n },\n { type: 'Document', id: `${model}_LIST` },\n ];\n },\n }),\n /**\n * Gets all documents of a collection type or single type.\n * By passing different params you can get different results e.g. only published documents or 'es' documents.\n */\n getAllDocuments: builder.query<\n Contracts.CollectionTypes.Find.Response,\n Contracts.CollectionTypes.Find.Params & {\n params?: Contracts.CollectionTypes.Find.Request['query'] & {\n [key: string]: any;\n };\n }\n >({\n query: ({ model, params }) => ({\n url: `/content-manager/collection-types/${model}`,\n method: 'GET',\n config: {\n params,\n },\n }),\n providesTags: (result, _error, arg) => {\n return [\n { type: 'Document', id: `${arg.model}_LIST` },\n ...(result?.results.map(({ documentId }) => ({\n type: 'Document' as const,\n id: `${arg.model}_${documentId}`,\n })) ?? []),\n ];\n },\n }),\n getDraftRelationCount: builder.query<\n Contracts.CollectionTypes.CountDraftRelations.Response,\n {\n collectionType: string;\n model: string;\n /**\n * You don't pass the documentId if the document is a single-type\n */\n documentId?: string;\n params?: Contracts.CollectionTypes.CountDraftRelations.Request['query'];\n }\n >({\n query: ({ collectionType, model, documentId, params }) => ({\n url: documentId\n ? `/content-manager/${collectionType}/${model}/${documentId}/actions/countDraftRelations`\n : `/content-manager/${collectionType}/${model}/actions/countDraftRelations`,\n method: 'GET',\n config: {\n params,\n },\n }),\n }),\n getDocument: builder.query<\n Contracts.CollectionTypes.FindOne.Response,\n Pick<Contracts.CollectionTypes.FindOne.Params, 'model'> &\n Partial<Pick<Contracts.CollectionTypes.FindOne.Params, 'documentId'>> & {\n collectionType: string;\n params?: Contracts.CollectionTypes.FindOne.Request['query'];\n }\n >({\n // @ts-expect-error – TODO: fix ts error where data unknown doesn't work with response via an assertion?\n queryFn: async (\n { collectionType, model, documentId, params },\n _api,\n _extraOpts,\n baseQuery\n ) => {\n const res = await baseQuery({\n url: `/content-manager/${collectionType}/${model}${documentId ? `/${documentId}` : ''}`,\n method: 'GET',\n config: {\n params,\n },\n });\n\n /**\n * To stop the query from locking itself in multiple retries, we intercept the error here and manage correctly.\n * This is because single-types don't have a list view and fetching them with the route `/single-types/:model`\n * never returns a list, just a single document but this won't exist if you've not made one before.\n */\n if (res.error && res.error.name === 'NotFoundError' && collectionType === SINGLE_TYPES) {\n return { data: { document: undefined }, error: undefined };\n }\n\n return res;\n },\n providesTags: (result, _error, { collectionType, model, documentId }) => {\n return [\n // we prefer the result's id because we don't fetch single-types with an ID.\n {\n type: 'Document',\n id:\n collectionType !== SINGLE_TYPES\n ? `${model}_${result && 'documentId' in result ? result.documentId : documentId}`\n : model,\n },\n ];\n },\n }),\n getManyDraftRelationCount: builder.query<\n Contracts.CollectionTypes.CountManyEntriesDraftRelations.Response['data'],\n Contracts.CollectionTypes.CountManyEntriesDraftRelations.Request['query'] & {\n model: string;\n }\n >({\n query: ({ model, ...params }) => ({\n url: `/content-manager/collection-types/${model}/actions/countManyEntriesDraftRelations`,\n method: 'GET',\n config: {\n params,\n },\n }),\n transformResponse: (\n response: Contracts.CollectionTypes.CountManyEntriesDraftRelations.Response\n ) => response.data,\n }),\n /**\n * This endpoint will either create or update documents at the same time as publishing.\n */\n publishDocument: builder.mutation<\n Contracts.CollectionTypes.Publish.Response,\n Pick<Contracts.CollectionTypes.Publish.Params, 'model'> &\n Partial<Pick<Contracts.CollectionTypes.Publish.Params, 'documentId'>> & {\n collectionType: string;\n data: Contracts.CollectionTypes.Publish.Request['body'];\n params?: Contracts.CollectionTypes.Publish.Request['query'];\n }\n >({\n query: ({ collectionType, model, documentId, params, data }) => ({\n url: documentId\n ? `/content-manager/${collectionType}/${model}/${documentId}/actions/publish`\n : `/content-manager/${collectionType}/${model}/actions/publish`,\n method: 'POST',\n data,\n config: {\n params,\n },\n }),\n invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {\n return [\n {\n type: 'Document',\n id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model,\n },\n { type: 'Document', id: `${model}_LIST` },\n ];\n },\n }),\n publishManyDocuments: builder.mutation<\n Contracts.CollectionTypes.BulkPublish.Response,\n Contracts.CollectionTypes.BulkPublish.Params &\n Contracts.CollectionTypes.BulkPublish.Request['body']\n >({\n query: ({ model, ...body }) => ({\n url: `/content-manager/collection-types/${model}/actions/bulkPublish`,\n method: 'POST',\n data: body,\n }),\n invalidatesTags: (_res, _error, { model, documentIds }) =>\n documentIds.map((id) => ({ type: 'Document', id: `${model}_${id}` })),\n }),\n updateDocument: builder.mutation<\n Contracts.CollectionTypes.Update.Response,\n Pick<Contracts.CollectionTypes.Update.Params, 'model'> &\n Partial<Pick<Contracts.CollectionTypes.Update.Params, 'documentId'>> & {\n collectionType: string;\n data: Contracts.CollectionTypes.Update.Request['body'];\n params?: Contracts.CollectionTypes.Update.Request['query'];\n }\n >({\n query: ({ collectionType, model, documentId, data, params }) => ({\n url: `/content-manager/${collectionType}/${model}${documentId ? `/${documentId}` : ''}`,\n method: 'PUT',\n data,\n config: {\n params,\n },\n }),\n invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {\n return [\n {\n type: 'Document',\n id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model,\n },\n ];\n },\n }),\n unpublishDocument: builder.mutation<\n Contracts.CollectionTypes.Unpublish.Response,\n Pick<Contracts.CollectionTypes.Unpublish.Params, 'model'> &\n Partial<Pick<Contracts.CollectionTypes.Unpublish.Params, 'documentId'>> & {\n collectionType: string;\n params?: Contracts.CollectionTypes.Unpublish.Request['query'];\n data: Contracts.CollectionTypes.Unpublish.Request['body'];\n }\n >({\n query: ({ collectionType, model, documentId, params, data }) => ({\n url: documentId\n ? `/content-manager/${collectionType}/${model}/${documentId}/actions/unpublish`\n : `/content-manager/${collectionType}/${model}/actions/unpublish`,\n method: 'POST',\n data,\n config: {\n params,\n },\n }),\n invalidatesTags: (_result, _error, { collectionType, model, documentId }) => {\n return [\n {\n type: 'Document',\n id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model,\n },\n ];\n },\n }),\n unpublishManyDocuments: builder.mutation<\n Contracts.CollectionTypes.BulkUnpublish.Response,\n Contracts.CollectionTypes.BulkUnpublish.Params &\n Contracts.CollectionTypes.BulkUnpublish.Request['body']\n >({\n query: ({ model, ...body }) => ({\n url: `/content-manager/collection-types/${model}/actions/bulkUnpublish`,\n method: 'POST',\n data: body,\n }),\n invalidatesTags: (_res, _error, { model, documentIds }) =>\n documentIds.map((id) => ({ type: 'Document', id: `${model}_${id}` })),\n }),\n }),\n});\n\nconst {\n useAutoCloneDocumentMutation,\n useCloneDocumentMutation,\n useCreateDocumentMutation,\n useDeleteDocumentMutation,\n useDeleteManyDocumentsMutation,\n useDiscardDocumentMutation,\n useGetAllDocumentsQuery,\n useLazyGetDocumentQuery,\n useGetDocumentQuery,\n useLazyGetDraftRelationCountQuery,\n useGetManyDraftRelationCountQuery,\n usePublishDocumentMutation,\n usePublishManyDocumentsMutation,\n useUpdateDocumentMutation,\n useUnpublishDocumentMutation,\n useUnpublishManyDocumentsMutation,\n} = documentApi;\n\nexport {\n useAutoCloneDocumentMutation,\n useCloneDocumentMutation,\n useCreateDocumentMutation,\n useDeleteDocumentMutation,\n useDeleteManyDocumentsMutation,\n useDiscardDocumentMutation,\n useGetAllDocumentsQuery,\n useLazyGetDocumentQuery,\n useGetDocumentQuery,\n useLazyGetDraftRelationCountQuery as useGetDraftRelationCountQuery,\n useGetManyDraftRelationCountQuery,\n usePublishDocumentMutation,\n usePublishManyDocumentsMutation,\n useUpdateDocumentMutation,\n useUnpublishDocumentMutation,\n useUnpublishManyDocumentsMutation,\n};\n","interface Query {\n plugins?: Record<string, unknown>;\n _q?: string;\n [key: string]: any;\n}\n\n/**\n * This type extracts the plugin options from the query\n * and appends them to the root of the query\n */\ntype TransformedQuery<TQuery extends Query> = Omit<TQuery, 'plugins'> & {\n [key: string]: string;\n};\n\n/**\n * @description\n * Creates a valid query params object for get requests\n * ie. plugins[18n][locale]=en becomes locale=en\n */\nconst buildValidParams = <TQuery extends Query>(query: TQuery): TransformedQuery<TQuery> => {\n if (!query) return query;\n\n // Extract pluginOptions from the query, they shouldn't be part of the URL\n const { plugins: _, ...validQueryParams } = {\n ...query,\n ...Object.values(query?.plugins ?? {}).reduce<Record<string, string>>(\n (acc, current) => Object.assign(acc, current),\n {}\n ),\n };\n\n if ('_q' in validQueryParams) {\n // Encode the search query here since the paramsSerializer will not\n // @ts-expect-error – TODO: fix this type error\n validQueryParams._q = encodeURIComponent(validQueryParams._q);\n }\n\n return validQueryParams;\n};\n\nexport { buildValidParams };\n","/**\n * Object containing error messages for input validations.\n * @property {Object} email - Error message for invalid email.\n * @property {string} email.id - Identifier for the error message.\n * @property {string} email.defaultMessage - Default error message for invalid email.\n * @property {Object} json - Error message for invalid JSON format.\n * @property {string} json.id - Identifier for the error message.\n * @property {string} json.defaultMessage - Default error message for invalid JSON format.\n * @property {Object} lowercase - Error message for non-lowercase string.\n * @property {string} lowercase.id - Identifier for the error message.\n * @property {string} lowercase.defaultMessage - Default error message for non-lowercase string.\n * @property {Object} max - Error message for value exceeding maximum.\n * @property {string} max.id - Identifier for the error message.\n * @property {string} max.defaultMessage - Default error message for value exceeding maximum.\n * @property {Object} maxLength - Error message for string length exceeding maximum.\n * @property {string} maxLength.id - Identifier for the error message.\n * @property {string} maxLength.defaultMessage - Default error message for string length exceeding maximum.\n * @property {Object} min - Error message for value less than minimum.\n * @property {string} min.id - Identifier for the error message.\n * @property {string} min.defaultMessage - Default error message for value less than minimum.\n * @property {Object} minLength - Error message for string length less than minimum.\n * @property {string} minLength.id - Identifier for the error message.\n * @property {string} minLength.defaultMessage - Default error message for string length less than minimum.\n * @property {Object} regex - Error message for value not matching regex pattern.\n * @property {string} regex.id - Identifier for the error message.\n * @property {string} regex.defaultMessage - Default error message for value not matching regex pattern.\n * @property {Object} required - Error message for required value.\n * @property {string} required.id - Identifier for the error message.\n * @property {string} required.defaultMessage - Default error message for required value.\n * @property {Object} string - Error message for non-string value.\n * @property {string} string.id - Identifier for the error message.\n * @property {string} string.defaultMessage - Default error message for non-string value.\n * @property {Object} unique - Error message for non-unique value.\n * @property {string} unique.id - Identifier for the error message.\n * @property {string} unique.defaultMessage - Default error message for non-unique value.\n * @property {Object} integer - Error message for non-integer value.\n * @property {string} integer.id - Identifier for the error message.\n * @property {string} integer.defaultMessage - Default error message for non-integer value.\n */\n\nconst errorsTrads = {\n email: {\n id: 'components.Input.error.validation.email',\n defaultMessage: 'This is not a valid email.',\n },\n json: {\n id: 'components.Input.error.validation.json',\n defaultMessage: \"This doesn't match the JSON format\",\n },\n lowercase: {\n id: 'components.Input.error.validation.lowercase',\n defaultMessage: 'The value must be a lowercase string',\n },\n max: {\n id: 'components.Input.error.validation.max',\n defaultMessage: 'The value is too high (max: {max}).',\n },\n maxLength: {\n id: 'components.Input.error.validation.maxLength',\n defaultMessage: 'The value is too long (max: {max}).',\n },\n min: {\n id: 'components.Input.error.validation.min',\n defaultMessage: 'The value is too low (min: {min}).',\n },\n minLength: {\n id: 'components.Input.error.validation.minLength',\n defaultMessage: 'The value is too short (min: {min}).',\n },\n regex: {\n id: 'components.Input.error.validation.regex',\n defaultMessage: 'The value does not match the regex.',\n },\n required: {\n id: 'components.Input.error.validation.required',\n defaultMessage: 'This value is required.',\n },\n string: {\n id: 'components.Input.error.validation.string',\n defaultMessage: 'This is not a valid string.',\n },\n unique: {\n id: 'components.Input.error.validation.unique',\n defaultMessage: 'This value is already used.',\n },\n integer: {\n id: 'component.Input.error.validation.integer',\n defaultMessage: 'The value must be an integer',\n },\n} as const;\n\nexport { errorsTrads as translatedErrors };\n","const ID = 'id';\n\nconst CREATED_BY_ATTRIBUTE_NAME = 'createdBy';\nconst UPDATED_BY_ATTRIBUTE_NAME = 'updatedBy';\n\nconst CREATOR_FIELDS = [CREATED_BY_ATTRIBUTE_NAME, UPDATED_BY_ATTRIBUTE_NAME];\n\nconst PUBLISHED_BY_ATTRIBUTE_NAME = 'publishedBy';\nconst CREATED_AT_ATTRIBUTE_NAME = 'createdAt';\nconst UPDATED_AT_ATTRIBUTE_NAME = 'updatedAt';\nconst PUBLISHED_AT_ATTRIBUTE_NAME = 'publishedAt';\n\nconst DOCUMENT_META_FIELDS = [\n ID,\n ...CREATOR_FIELDS,\n PUBLISHED_BY_ATTRIBUTE_NAME,\n CREATED_AT_ATTRIBUTE_NAME,\n UPDATED_AT_ATTRIBUTE_NAME,\n PUBLISHED_AT_ATTRIBUTE_NAME,\n];\n\n/**\n * List of attribute types that cannot be used as the main field.\n * Not sure the name could be any clearer.\n */\nconst ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD = [\n 'dynamiczone',\n 'json',\n 'text',\n 'relation',\n 'component',\n 'boolean',\n 'media',\n 'password',\n 'richtext',\n 'timestamp',\n 'blocks',\n];\n\nexport {\n ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD,\n CREATED_AT_ATTRIBUTE_NAME,\n UPDATED_AT_ATTRIBUTE_NAME,\n PUBLISHED_AT_ATTRIBUTE_NAME,\n CREATED_BY_ATTRIBUTE_NAME,\n UPDATED_BY_ATTRIBUTE_NAME,\n PUBLISHED_BY_ATTRIBUTE_NAME,\n CREATOR_FIELDS,\n DOCUMENT_META_FIELDS,\n};\n","import pipe from 'lodash/fp/pipe';\nimport * as yup from 'yup';\n\nimport { translatedErrors } from '../../utils/translatedErrors';\nimport { DOCUMENT_META_FIELDS } from '../constants/attributes';\n\nimport type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Attribute } from '@strapi/types';\nimport type { ObjectShape } from 'yup/lib/object';\n\ntype AnySchema =\n | yup.StringSchema\n | yup.NumberSchema\n | yup.BooleanSchema\n | yup.DateSchema\n | yup.ArraySchema<any>\n | yup.ObjectSchema<any>;\n\n/* -------------------------------------------------------------------------------------------------\n * createYupSchema\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * TODO: should we create a Map to store these based on the hash of the schema?\n */\nconst createYupSchema = (\n attributes: Schema['attributes'] = {},\n components: ComponentsDictionary = {}\n): yup.ObjectSchema<any> => {\n const createModelSchema = (attributes: Schema['attributes']): yup.ObjectSchema<any> =>\n yup\n .object()\n .shape(\n Object.entries(attributes).reduce<ObjectShape>((acc, [name, attribute]) => {\n if (DOCUMENT_META_FIELDS.includes(name)) {\n return acc;\n }\n\n /**\n * These validations won't apply to every attribute\n * and that's okay, in that case we just return the\n * schema as it was passed.\n */\n const validations = [\n addRequiredValidation,\n addMinLengthValidation,\n addMaxLengthValidation,\n addMinValidation,\n addMaxValidation,\n addRegexValidation,\n ].map((fn) => fn(attribute));\n\n const transformSchema = pipe(...validations);\n\n switch (attribute.type) {\n case 'component': {\n const { attributes } = components[attribute.component];\n\n if (attribute.repeatable) {\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(createModelSchema(attributes).nullable(false))\n ),\n };\n } else {\n return {\n ...acc,\n [name]: transformSchema(createModelSchema(attributes)),\n };\n }\n }\n case 'dynamiczone':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.lazy((data: Attribute.GetValue<Attribute.DynamicZone>[number]) => {\n const { attributes } = components[data.__component];\n\n return yup\n .object()\n .shape({\n __component: yup.string().required().oneOf(Object.keys(components)),\n })\n .nullable(false)\n .concat(createModelSchema(attributes));\n }) as unknown as yup.ObjectSchema<any>\n )\n ),\n };\n case 'relation':\n return {\n ...acc,\n [name]: transformSchema(\n yup.array().of(\n yup.object().shape({\n id: yup.string().required(),\n })\n )\n ),\n };\n default:\n return {\n ...acc,\n [name]: transformSchema(createAttributeSchema(attribute)),\n };\n }\n }, {})\n )\n /**\n * TODO: investigate why an undefined object fails a check of `nullable`.\n */\n .default(null);\n\n return createModelSchema(attributes);\n};\n\nconst createAttributeSchema = (\n attribute: Exclude<\n Attribute.Any,\n { type: 'dynamiczone' } | { type: 'component' } | { type: 'relation' }\n >\n) => {\n switch (attribute.type) {\n case 'biginteger':\n return yup.string().matches(/^-?\\d*$/);\n case 'boolean':\n return yup.boolean();\n case 'blocks':\n return yup.mixed().test('isBlocks', translatedErrors.json, (value) => {\n if (!value || Array.isArray(value)) {\n return true;\n } else {\n return false;\n }\n });\n case 'decimal':\n case 'float':\n case 'integer':\n return yup.number();\n case 'email':\n return yup.string().email(translatedErrors.email);\n case 'enumeration':\n return yup.string().oneOf([...attribute.enum, null]);\n case 'json':\n return yup.mixed().test('isJSON', translatedErrors.json, (value) => {\n /**\n * We don't want to validate the JSON field if it's empty.\n */\n if (!value || (typeof value === 'string' && value.length === 0)) {\n return true;\n }\n\n try {\n JSON.parse(value);\n\n return true;\n } catch (err) {\n return false;\n }\n });\n case 'password':\n case 'richtext':\n case 'string':\n case 'text':\n return yup.string();\n case 'uid':\n return yup.string().matches(/^[A-Za-z0-9-_.~]*$/);\n default:\n /**\n * This allows any value.\n */\n return yup.mixed();\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Validators\n * -----------------------------------------------------------------------------------------------*/\n/**\n * Our validator functions can be preped with the\n * attribute and then have the schema piped through them.\n */\ntype ValidationFn = (\n attribute: Schema['attributes'][string]\n) => <TSchema extends AnySchema>(schema: TSchema) => TSchema;\n\nconst addRequiredValidation: ValidationFn = (attribute) => (schema) => {\n if (attribute.required) {\n return schema.required({\n id: translatedErrors.required.id,\n defaultMessage: 'This field is required.',\n });\n }\n\n return schema.nullable();\n};\n\nconst addMinLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'minLength' in attribute &&\n attribute.minLength &&\n Number.isInteger(attribute.minLength) &&\n 'min' in schema\n ) {\n return schema.min(attribute.minLength, {\n ...translatedErrors.minLength,\n values: {\n min: attribute.minLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMaxLengthValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if (\n 'maxLength' in attribute &&\n attribute.maxLength &&\n Number.isInteger(attribute.maxLength) &&\n 'max' in schema\n ) {\n return schema.max(attribute.maxLength, {\n ...translatedErrors.maxLength,\n values: {\n max: attribute.maxLength,\n },\n }) as TSchema;\n }\n\n return schema;\n };\n\nconst addMinValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('min' in attribute) {\n const min = toInteger(attribute.min);\n\n if ('min' in schema && min) {\n return schema.min(min, {\n ...translatedErrors.min,\n values: {\n min,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst addMaxValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('max' in attribute) {\n const max = toInteger(attribute.max);\n\n if ('max' in schema && max) {\n return schema.max(max, {\n ...translatedErrors.max,\n values: {\n max,\n },\n }) as TSchema;\n }\n }\n\n return schema;\n };\n\nconst toInteger = (val?: string | number): number | undefined => {\n if (typeof val === 'number' || val === undefined) {\n return val;\n } else {\n const num = Number(val);\n return isNaN(num) ? undefined : num;\n }\n};\n\nconst addRegexValidation: ValidationFn =\n (attribute) =>\n <TSchema extends AnySchema>(schema: TSchema): TSchema => {\n if ('regex' in attribute && attribute.regex && 'matches' in schema) {\n return schema.matches(new RegExp(attribute.regex), {\n message: {\n id: translatedErrors.regex.id,\n defaultMessage: 'The value does not match the defined pattern.',\n },\n\n excludeEmptyString: !attribute.required,\n }) as TSchema;\n }\n\n return schema;\n };\n\nexport { createYupSchema };\n","import { contentManagerApi } from './api';\n\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\nconst initApi = contentManagerApi.injectEndpoints({\n endpoints: (builder) => ({\n getInitialData: builder.query<Contracts.Init.GetInitData.Response['data'], void>({\n query: () => '/content-manager/init',\n transformResponse: (response: Contracts.Init.GetInitData.Response) => response.data,\n providesTags: ['InitialData'],\n }),\n }),\n});\n\nconst { useGetInitialDataQuery } = initApi;\n\nexport { useGetInitialDataQuery };\n","import * as React from 'react';\n\nimport { useNotification } from '../../features/Notifications';\nimport { useAPIErrorHandler } from '../../hooks/useAPIErrorHandler';\nimport { useGetInitialDataQuery } from '../services/init';\n\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\nimport type { Attribute } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * useContentTypeSchema\n * -----------------------------------------------------------------------------------------------*/\ntype ComponentsDictionary = Record<string, Contracts.Components.Component>;\n\n/**\n * @internal\n * @description Given a model UID, return the schema and the schemas\n * of the associated components within said model's schema. A wrapper\n * implementation around the `useGetInitialDataQuery` with a unique\n * `selectFromResult` function to memoize the calculation.\n *\n * If no model is provided, the hook will return all the schemas.\n */\nconst useContentTypeSchema = (model?: string) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const { components, contentType, contentTypes, error, isLoading, isFetching } =\n useGetInitialDataQuery(undefined, {\n selectFromResult: (res) => {\n const contentType = res.data?.contentTypes.find((ct) => ct.uid === model);\n\n const componentsByKey = res.data?.components.reduce<ComponentsDictionary>(\n (acc, component) => {\n acc[component.uid] = component;\n\n return acc;\n },\n {}\n );\n\n const components = extractContentTypeComponents(contentType?.attributes, componentsByKey);\n\n return {\n isLoading: res.isLoading,\n isFetching: res.isFetching,\n error: res.error,\n components: Object.keys(components).length === 0 ? undefined : components,\n contentType,\n contentTypes: res.data?.contentTypes ?? [],\n };\n },\n });\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError]);\n\n return {\n // This must be memoized to avoid inifiinite re-renders where the empty object is different everytime.\n components: React.useMemo(() => components ?? {}, [components]),\n schema: contentType,\n schemas: contentTypes,\n isLoading: isLoading || isFetching,\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * extractContentTypeComponents\n * -----------------------------------------------------------------------------------------------*/\n/**\n * @internal\n * @description Extracts the components used in a content type's attributes recursively.\n */\nconst extractContentTypeComponents = (\n attributes: Contracts.ContentTypes.ContentType['attributes'] = {},\n allComponents: ComponentsDictionary = {}\n): ComponentsDictionary => {\n const getComponents = (attributes: Attribute.Any[]) => {\n return attributes.reduce<string[]>((acc, attribute) => {\n /**\n * If the attribute is a component or dynamiczone, we need to recursively\n * extract the component UIDs from its attributes.\n */\n if (attribute.type === 'component') {\n const componentAttributes = Object.values(\n allComponents[attribute.component]?.attributes ?? {}\n );\n\n acc.push(attribute.component, ...getComponents(componentAttributes));\n } else if (attribute.type === 'dynamiczone') {\n acc.push(\n ...attribute.components,\n /**\n * Dynamic zones have an array of components, so we flatMap over them\n * performing the same search as above.\n */\n ...attribute.components.flatMap((componentUid) => {\n const componentAttributes = Object.values(\n allComponents[componentUid]?.attributes ?? {}\n );\n\n return getComponents(componentAttributes);\n })\n );\n }\n\n return acc;\n }, []);\n };\n\n const componentUids = getComponents(Object.values(attributes));\n\n const uniqueComponentUids = [...new Set(componentUids)];\n\n const componentsByKey = uniqueComponentUids.reduce<ComponentsDictionary>((acc, uid) => {\n acc[uid] = allComponents[uid];\n\n return acc;\n }, {});\n\n return componentsByKey;\n};\n\nexport { useContentTypeSchema, extractContentTypeComponents };\nexport type { ComponentsDictionary };\n","/**\n * This hook doesn't use a context provider because we fetch directly from the server,\n * this sounds expensive but actually, it's really not. Because we have redux-toolkit-query\n * being a cache layer so if nothing invalidates the cache, we don't fetch again.\n */\n\nimport * as React from 'react';\n\nimport { TranslationMessage, useQueryParams } from '@strapi/helper-plugin';\nimport { useParams } from 'react-router-dom';\nimport { ValidationError } from 'yup';\n\nimport { useNotification } from '../../features/Notifications';\nimport { useAPIErrorHandler } from '../../hooks/useAPIErrorHandler';\nimport { getYupInnerErrors } from '../../utils/getYupInnerErrors';\nimport { SINGLE_TYPES } from '../constants/collections';\nimport { useGetDocumentQuery } from '../services/documents';\nimport { buildValidParams } from '../utils/api';\nimport { createYupSchema } from '../utils/validation';\n\nimport { useContentTypeSchema, ComponentsDictionary } from './useContentTypeSchema';\n\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\ninterface UseDocumentArgs {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n}\n\ntype UseDocumentOpts = Parameters<typeof useGetDocumentQuery>[1];\n\ntype Document = Contracts.CollectionTypes.FindOne.Response['data'];\n\ntype Schema = Contracts.ContentTypes.ContentType;\n\ntype UseDocument = (\n args: UseDocumentArgs,\n opts?: UseDocumentOpts\n) => {\n /**\n * These are the schemas of the components used in the content type, organised\n * by their uid.\n */\n components: ComponentsDictionary;\n document?: Document;\n meta?: Contracts.CollectionTypes.FindOne.Response['meta'];\n isLoading: boolean;\n /**\n * This is the schema of the content type, it is not the same as the layout.\n */\n schema?: Schema;\n validate: (document: Document) => null | Record<string, TranslationMessage>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocument\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha\n * @public\n * @description Returns a document based on the model, collection type & id passed as arguments.\n * Also extracts its schema from the redux cache to be used for creating a validation schema.\n * @example\n * ```tsx\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n *\n * if(!model || !collectionType) return null;\n *\n * const { document, isLoading, validate } = useDocument({ documentId: id, model, collectionType, params: { locale: 'en-GB' } })\n * const { update } = useDocumentActions()\n *\n * const onSubmit = async (document: Document) => {\n * const errors = validate(document);\n *\n * if(errors) {\n * // handle errors\n * }\n *\n * await update({ collectionType, model, id }, document)\n * }\n * ```\n *\n * @see {@link https://contributor.strapi.io/docs/core/content-manager/hooks/use-document} for more information\n */\nconst useDocument: UseDocument = (args, opts) => {\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const {\n currentData: data,\n isLoading: isLoadingDocument,\n isFetching: isFetchingDocument,\n error,\n } = useGetDocumentQuery(args, opts);\n\n const { components, schema, isLoading: isLoadingSchema } = useContentTypeSchema(args.model);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [toggleNotification, error, formatAPIError, args.collectionType]);\n\n const validationSchema = React.useMemo(() => {\n if (!schema) {\n return null;\n }\n\n return createYupSchema(schema.attributes, components);\n }, [schema, components]);\n\n const validate = React.useCallback(\n (document: Document) => {\n if (!validationSchema) {\n throw new Error(\n 'There is no validation schema generated, this is likely due to the schema not being loaded yet.'\n );\n }\n\n try {\n validationSchema.validateSync(document, { abortEarly: false, strict: true });\n\n return null;\n } catch (error) {\n if (error instanceof ValidationError) {\n return getYupInnerErrors(error);\n }\n\n throw error;\n }\n },\n [validationSchema]\n );\n\n const isLoading = isLoadingDocument || isFetchingDocument || isLoadingSchema;\n\n return {\n components,\n document: data?.data,\n meta: data?.meta,\n isLoading,\n schema,\n validate,\n } satisfies ReturnType<UseDocument>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDoc\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the router to extract the model, collection type & id from the url.\n * therefore, it shouldn't be used outside of the content-manager because it won't work as intended.\n */\nconst useDoc = () => {\n const { id, slug, collectionType, origin } = useParams<{\n id: string;\n origin: string;\n slug: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!slug) {\n throw new Error('Could not find model in url params');\n }\n\n return {\n collectionType,\n model: slug,\n id: origin || id === 'create' ? undefined : id,\n ...useDocument(\n { documentId: origin || id, model: slug, collectionType, params },\n {\n skip: id === 'create' || (!origin && !id && collectionType !== SINGLE_TYPES),\n }\n ),\n };\n};\n\nexport { useDocument, useDoc };\nexport type { UseDocument, UseDocumentArgs, Document, Schema, ComponentsDictionary };\n","import clone from 'lodash/clone';\nimport toPath from 'lodash/toPath';\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(obj: any, key: string | string[], def?: any, pathStartIndex: number = 0) {\n const path = toPath(key);\n while (obj && pathStartIndex < path.length) {\n obj = obj[path[pathStartIndex++]];\n }\n\n // check if path is not in the end\n if (pathStartIndex !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\n/** @internal is the given object an Object? */\nexport const isObject = (obj: any): obj is object =>\n obj !== null && typeof obj === 'object' && !Array.isArray(obj);\n\n/** @internal is the given object an integer? */\nexport const isInteger = (obj: any): boolean => String(Math.floor(Number(obj))) === obj;\n\n/**\n * Deeply set a value from in object via its path. If the value at `path`\n * has changed, return a shallow copy of obj with `value` set at `path`.\n * If `value` has not changed, return the original `obj`.\n *\n * Existing objects / arrays along `path` are also shallow copied. Sibling\n * objects along path retain the same internal js reference. Since new\n * objects / arrays are only created along `path`, we can test if anything\n * changed in a nested structure by comparing the object's reference in\n * the old and new object, similar to how russian doll cache invalidation\n * works.\n *\n * In earlier versions of this function, which used cloneDeep, there were\n * issues whereby settings a nested value would mutate the parent\n * instead of creating a new object. `clone` avoids that bug making a\n * shallow copy of the objects along the update path\n * so no object is mutated in place.\n *\n * Before changing this function, please read through the following\n * discussions.\n *\n * @see https://github.com/developit/linkstate\n * @see https://github.com/jaredpalmer/formik/pull/123\n */\nexport function setIn(obj: any, path: string, value: any): any {\n const res: any = clone(obj); // this keeps inheritance when obj is a class\n let resVal: any = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj: any = getIn(obj, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj);\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] = isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {};\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res;\n}\n","import * as React from 'react';\n\nimport {\n Button,\n Dialog,\n DialogBody,\n DialogFooter,\n Flex,\n Icon,\n Typography,\n useCallbackRef,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { TranslationMessage } from '@strapi/helper-plugin';\nimport { ExclamationMarkCircle } from '@strapi/icons';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport { produce } from 'immer';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { useBlocker } from 'react-router-dom';\n\nimport { getIn, setIn } from '../utils/objects';\n\nimport { createContext } from './Context';\n\nimport type {\n InputProps as InputPropsImpl,\n StringProps,\n EnumerationProps,\n} from './FormInputs/types';\nimport type * as Yup from 'yup';\n\n/* -------------------------------------------------------------------------------------------------\n * FormContext\n * -----------------------------------------------------------------------------------------------*/\ntype InputProps = InputPropsImpl | StringProps | EnumerationProps;\n\ninterface FormValues {\n [field: string]: any;\n}\n\ninterface FormContextValue<TFormValues extends FormValues = FormValues>\n extends FormState<TFormValues> {\n disabled: boolean;\n initialValues: TFormValues;\n modified: boolean;\n /**\n * The default behaviour is to add the row to the end of the array, if you want to add it to a\n * specific index you can pass the index.\n */\n addFieldRow: (field: string, value: any, addAtIndex?: number) => void;\n moveFieldRow: (field: string, fromIndex: number, toIndex: number) => void;\n onChange: (eventOrPath: React.ChangeEvent<any> | string, value?: any) => void;\n /*\n * The default behaviour is to remove the last row, if you want to remove a specific index you can\n * pass the index.\n */\n removeFieldRow: (field: string, removeAtIndex?: number) => void;\n resetForm: () => void;\n setErrors: (errors: FormErrors<TFormValues>) => void;\n setSubmitting: (isSubmitting: boolean) => void;\n setValues: (values: TFormValues) => void;\n validate: () => Promise<\n { data: TFormValues; errors?: never } | { data?: never; errors: FormErrors<TFormValues> }\n >;\n}\n\n/**\n * @internal\n * @description We use this just to warn people that they're using the useForm\n * methods outside of a Form component, but we don't want to throw an error\n * because otherwise the DocumentActions list cannot be rendered in our list-view.\n */\nconst ERR_MSG =\n 'The Form Component has not been initialised, ensure you are using this hook within a Form component';\n\nconst [FormProvider, useForm] = createContext<FormContextValue>('Form', {\n disabled: false,\n errors: {},\n initialValues: {},\n isSubmitting: false,\n modified: false,\n addFieldRow: () => {\n throw new Error(ERR_MSG);\n },\n moveFieldRow: () => {\n throw new Error(ERR_MSG);\n },\n onChange: () => {\n throw new Error(ERR_MSG);\n },\n removeFieldRow: () => {\n throw new Error(ERR_MSG);\n },\n resetForm: () => {\n throw new Error(ERR_MSG);\n },\n setErrors: () => {\n throw new Error(ERR_MSG);\n },\n setValues: () => {\n throw new Error(ERR_MSG);\n },\n setSubmitting: () => {\n throw new Error(ERR_MSG);\n },\n validate: async () => {\n throw new Error(ERR_MSG);\n },\n values: {},\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Form\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FormHelpers<TFormValues extends FormValues = FormValues>\n extends Pick<FormContextValue<TFormValues>, 'setErrors' | 'setValues' | 'resetForm'> {}\n\ninterface FormProps<TFormValues extends FormValues = FormValues>\n extends Partial<Pick<FormContextValue<TFormValues>, 'disabled' | 'initialValues'>> {\n children:\n | React.ReactNode\n | ((\n props: Pick<\n FormContextValue<TFormValues>,\n 'disabled' | 'errors' | 'isSubmitting' | 'modified' | 'values' | 'resetForm' | 'onChange'\n >\n ) => React.ReactNode);\n method: 'POST' | 'PUT';\n onSubmit?: (values: TFormValues, helpers: FormHelpers<TFormValues>) => Promise<void> | void;\n // TODO: type the return value for a validation schema func from Yup.\n validationSchema?: Yup.AnySchema;\n}\n\n/**\n * @alpha\n * @description A form component that handles form state, validation and submission.\n * It can additionally handle nested fields and arrays. To access the data you can either\n * use the generic useForm hook or the useField hook when providing the name of your field.\n */\nconst Form = React.forwardRef<HTMLFormElement, FormProps>(\n ({ disabled = false, method, onSubmit, ...props }, ref) => {\n const formRef = React.useRef<HTMLFormElement>(null!);\n const initialValues = React.useRef(props.initialValues ?? {});\n const [state, dispatch] = React.useReducer(reducer, {\n errors: {},\n isSubmitting: false,\n values: props.initialValues ?? {},\n });\n\n React.useEffect(() => {\n /**\n * ONLY update the initialValues if the prop has changed.\n */\n if (!isEqual(initialValues.current, props.initialValues)) {\n initialValues.current = props.initialValues ?? {};\n\n dispatch({\n type: 'SET_INITIAL_VALUES',\n payload: props.initialValues ?? {},\n });\n }\n }, [props.initialValues]);\n\n const setErrors = React.useCallback((errors: FormErrors) => {\n dispatch({\n type: 'SET_ERRORS',\n payload: errors,\n });\n }, []);\n\n const setValues = React.useCallback((values: FormValues) => {\n dispatch({\n type: 'SET_VALUES',\n payload: values,\n });\n }, []);\n\n React.useEffect(() => {\n if (Object.keys(state.errors).length === 0) return;\n\n /**\n * Small timeout to ensure the form has been\n * rendered before we try to focus on the first\n */\n const ref = setTimeout(() => {\n const [firstError] = formRef.current.querySelectorAll('[data-strapi-field-error]');\n\n if (firstError) {\n const errorId = firstError.getAttribute('id');\n const formElementInError = formRef.current.querySelector(\n `[aria-describedby=\"${errorId}\"]`\n );\n\n if (formElementInError && formElementInError instanceof HTMLElement) {\n formElementInError.focus();\n }\n }\n });\n\n return () => clearTimeout(ref);\n }, [state.errors]);\n\n /**\n * Uses the provided validation schema\n */\n const validate: FormContextValue['validate'] = React.useCallback(\n async (shouldSetErrors: boolean = true) => {\n setErrors({});\n\n if (!props.validationSchema) {\n return { data: state.values };\n }\n\n try {\n const data = await props.validationSchema.validate(state.values, { abortEarly: false });\n\n return { data };\n } catch (err) {\n if (isErrorYupValidationError(err)) {\n let errors: FormErrors = {};\n\n if (err.inner) {\n if (err.inner.length === 0) {\n return setIn(errors, err.path!, err.message);\n }\n for (const error of err.inner) {\n if (!getIn(errors, error.path!)) {\n errors = setIn(errors, error.path!, error.message);\n }\n }\n }\n\n if (shouldSetErrors) {\n setErrors(errors);\n }\n\n return { errors };\n } else {\n // We throw any other errors\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `Warning: An unhandled error was caught during validation in <Formik validationSchema />`,\n err\n );\n }\n\n throw err;\n }\n }\n },\n [props, setErrors, state.values]\n );\n\n const handleSubmit: React.FormEventHandler<HTMLFormElement> = async (e) => {\n e.stopPropagation();\n e.preventDefault();\n\n if (!onSubmit) {\n return;\n }\n\n dispatch({\n type: 'SUBMIT_ATTEMPT',\n });\n\n try {\n const { data, errors } = await validate();\n\n if (errors) {\n setErrors(errors);\n\n throw new Error('Submission failed');\n }\n\n await onSubmit(data, {\n setErrors,\n setValues,\n resetForm,\n });\n\n dispatch({\n type: 'SUBMIT_SUCCESS',\n });\n } catch (err) {\n dispatch({\n type: 'SUBMIT_FAILURE',\n });\n\n if (err instanceof Error && err.message === 'Submission failed') {\n return;\n }\n }\n };\n\n const modified = React.useMemo(\n () => !isEqual(initialValues.current, state.values),\n [state.values]\n );\n\n const handleChange: FormContextValue['onChange'] = useCallbackRef((eventOrPath, v) => {\n if (typeof eventOrPath === 'string') {\n dispatch({\n type: 'SET_FIELD_VALUE',\n payload: {\n field: eventOrPath,\n value: v,\n },\n });\n\n return;\n }\n\n const target = eventOrPath.target || eventOrPath.currentTarget;\n\n const { type, name, id, value, options, multiple } = target;\n\n const field = name || id;\n\n if (!field && process.env.NODE_ENV !== 'production') {\n console.warn(\n `\\`onChange\\` was called with an event, but you forgot to pass a \\`name\\` or \\`id'\\` attribute to your input. The field to update cannot be determined`\n );\n }\n\n /**\n * Because we handle any field from this function, we run through a series\n * of checks to understand how to use the value.\n */\n let val;\n\n if (/number|range/.test(type)) {\n const parsed = parseFloat(value);\n // If the value isn't a number for whatever reason, don't let it through because that will break the API.\n val = isNaN(parsed) ? '' : parsed;\n } else if (/checkbox/.test(type)) {\n // Get & invert the current value of the checkbox.\n val = !getIn(state.values, field);\n } else if (options && multiple) {\n // This will handle native select elements incl. ones with mulitple options.\n val = Array.from<HTMLOptionElement>(options)\n .filter((el) => el.selected)\n .map((el) => el.value);\n } else {\n val = value;\n }\n\n if (field) {\n dispatch({\n type: 'SET_FIELD_VALUE',\n payload: {\n field,\n value: val,\n },\n });\n }\n });\n\n const addFieldRow: FormContextValue['addFieldRow'] = React.useCallback(\n (field, value, addAtIndex) => {\n dispatch({\n type: 'ADD_FIELD_ROW',\n payload: {\n field,\n value,\n addAtIndex,\n },\n });\n },\n []\n );\n\n const removeFieldRow: FormContextValue['removeFieldRow'] = React.useCallback(\n (field, removeAtIndex) => {\n dispatch({\n type: 'REMOVE_FIELD_ROW',\n payload: {\n field,\n removeAtIndex,\n },\n });\n },\n []\n );\n\n const moveFieldRow: FormContextValue['moveFieldRow'] = React.useCallback(\n (field, fromIndex, toIndex) => {\n dispatch({\n type: 'MOVE_FIELD_ROW',\n payload: {\n field,\n fromIndex,\n toIndex,\n },\n });\n },\n []\n );\n\n const resetForm: FormContextValue['resetForm'] = React.useCallback(() => {\n dispatch({\n type: 'RESET_FORM',\n payload: {\n errors: {},\n isSubmitting: false,\n values: initialValues.current,\n },\n });\n }, []);\n\n const setSubmitting = React.useCallback((isSubmitting: boolean) => {\n dispatch({ type: 'SET_ISSUBMITTING', payload: isSubmitting });\n }, []);\n\n const composedRefs = useComposedRefs(formRef, ref);\n\n return (\n <form ref={composedRefs} method={method} noValidate onSubmit={handleSubmit}>\n <FormProvider\n disabled={disabled}\n onChange={handleChange}\n initialValues={initialValues}\n modified={modified}\n addFieldRow={addFieldRow}\n moveFieldRow={moveFieldRow}\n removeFieldRow={removeFieldRow}\n resetForm={resetForm}\n setErrors={setErrors}\n setValues={setValues}\n setSubmitting={setSubmitting}\n validate={validate}\n {...state}\n >\n {typeof props.children === 'function'\n ? props.children({\n modified,\n disabled,\n onChange: handleChange,\n ...state,\n resetForm,\n })\n : props.children}\n </FormProvider>\n </form>\n );\n }\n) as <TFormValues extends FormValues>(\n p: FormProps<TFormValues> & { ref?: React.Ref<HTMLFormElement> }\n) => React.ReactElement; // we've cast this because we need the generic to infer the type of the form values.\n\n/**\n * @internal\n * @description Checks if the error is a Yup validation error.\n */\nconst isErrorYupValidationError = (err: any): err is Yup.ValidationError =>\n typeof err === 'object' &&\n err !== null &&\n 'name' in err &&\n typeof err.name === 'string' &&\n err.name === 'ValidationError';\n\n/* -------------------------------------------------------------------------------------------------\n * reducer\n * -----------------------------------------------------------------------------------------------*/\n\ntype FormErrors<TFormValues extends FormValues = FormValues> = {\n // is it a repeatable component or dynamic zone?\n [Key in keyof TFormValues]?: TFormValues[Key] extends any[]\n ? TFormValues[Key][number] extends object\n ? FormErrors<TFormValues[Key][number]>[] | string | string[]\n : string // this would let us support errors for the dynamic zone or repeatable component not the components within.\n : TFormValues[Key] extends object // is it a regular component?\n ? FormErrors<TFormValues[Key]> // handles nested components\n : string; // otherwise its just a field.\n};\n\ninterface FormState<TFormValues extends FormValues = FormValues> {\n /**\n * TODO: make this a better type explaining errors could be nested because it follows the same\n * structure as the values.\n */\n errors: FormErrors<TFormValues>;\n isSubmitting: boolean;\n values: TFormValues;\n}\n\ntype FormActions<TFormValues extends FormValues = FormValues> =\n | { type: 'SUBMIT_ATTEMPT' }\n | { type: 'SUBMIT_FAILURE' }\n | { type: 'SUBMIT_SUCCESS' }\n | { type: 'SET_FIELD_VALUE'; payload: { field: string; value: any } }\n | { type: 'ADD_FIELD_ROW'; payload: { field: string; value: any; addAtIndex?: number } }\n | { type: 'REMOVE_FIELD_ROW'; payload: { field: string; removeAtIndex?: number } }\n | { type: 'MOVE_FIELD_ROW'; payload: { field: string; fromIndex: number; toIndex: number } }\n | { type: 'SET_ERRORS'; payload: FormErrors<TFormValues> }\n | { type: 'SET_ISSUBMITTING'; payload: boolean }\n | { type: 'SET_INITIAL_VALUES'; payload: TFormValues }\n | { type: 'SET_VALUES'; payload: TFormValues }\n | { type: 'RESET_FORM'; payload: FormState<TFormValues> };\n\nconst reducer = <TFormValues extends FormValues = FormValues>(\n state: FormState<TFormValues>,\n action: FormActions<TFormValues>\n) =>\n produce(state, (draft) => {\n switch (action.type) {\n case 'SET_INITIAL_VALUES':\n // @ts-expect-error – TODO: figure out why this fails ts.\n draft.values = action.payload;\n break;\n case 'SET_VALUES':\n // @ts-expect-error – TODO: figure out why this fails ts.\n draft.values = action.payload;\n break;\n case 'SUBMIT_ATTEMPT':\n draft.isSubmitting = true;\n break;\n case 'SUBMIT_FAILURE':\n draft.isSubmitting = false;\n break;\n case 'SUBMIT_SUCCESS':\n draft.isSubmitting = false;\n break;\n case 'SET_FIELD_VALUE':\n draft.values = setIn(state.values, action.payload.field, action.payload.value);\n break;\n case 'ADD_FIELD_ROW': {\n /**\n * TODO: add check for if the field is an array?\n */\n const currentField = getIn(state.values, action.payload.field, []) as Array<any>;\n\n let position = action.payload.addAtIndex;\n\n if (position === undefined) {\n position = currentField.length;\n } else if (position < 0) {\n position = 0;\n }\n\n const [key] = generateNKeysBetween(\n currentField.at(position - 1)?.__temp_key__,\n currentField.at(position)?.__temp_key__,\n 1\n );\n\n draft.values = setIn(\n state.values,\n action.payload.field,\n setIn(currentField, position.toString(), { ...action.payload.value, __temp_key__: key })\n );\n\n break;\n }\n case 'MOVE_FIELD_ROW': {\n const { field, fromIndex, toIndex } = action.payload;\n /**\n * TODO: add check for if the field is an array?\n */\n const currentField = [...(getIn(state.values, field, []) as Array<any>)];\n const currentRow = currentField[fromIndex];\n\n const startKey =\n fromIndex > toIndex\n ? currentField[toIndex - 1]?.__temp_key__\n : currentField[toIndex]?.__temp_key__;\n const endKey =\n fromIndex > toIndex\n ? currentField[toIndex]?.__temp_key__\n : currentField[toIndex + 1]?.__temp_key__;\n const [newKey] = generateNKeysBetween(startKey, endKey, 1);\n\n currentField.splice(fromIndex, 1);\n currentField.splice(toIndex, 0, { ...currentRow, __temp_key__: newKey });\n\n draft.values = setIn(state.values, field, currentField);\n\n break;\n }\n case 'REMOVE_FIELD_ROW': {\n /**\n * TODO: add check for if the field is an array?\n */\n const currentField = getIn(state.values, action.payload.field, []) as Array<any>;\n\n let position = action.payload.removeAtIndex;\n\n if (position === undefined) {\n position = currentField.length - 1;\n } else if (position < 0) {\n position = 0;\n }\n\n /**\n * filter out empty values from the array, the setIn function only deletes the value\n * when we pass undefined as opposed to \"removing\" it from said array.\n */\n const newValue = setIn(currentField, position.toString(), undefined).filter(\n (val: unknown) => val\n );\n\n draft.values = setIn(\n state.values,\n action.payload.field,\n newValue.length > 0 ? newValue : undefined\n );\n\n break;\n }\n case 'SET_ERRORS':\n if (!isEqual(state.errors, action.payload)) {\n // @ts-expect-error – TODO: figure out why this fails a TS check.\n draft.errors = action.payload;\n }\n break;\n case 'SET_ISSUBMITTING':\n draft.isSubmitting = action.payload;\n break;\n case 'RESET_FORM':\n // @ts-expect-error – TODO: figure out why this fails ts.\n draft.values = action.payload.values;\n // @ts-expect-error – TODO: figure out why this fails ts.\n draft.errors = action.payload.errors;\n draft.isSubmitting = action.payload.isSubmitting;\n break;\n default:\n break;\n }\n });\n\n/* -------------------------------------------------------------------------------------------------\n * useField\n * -----------------------------------------------------------------------------------------------*/\ninterface FieldValue<TValue = any> {\n error?: string;\n initialValue: TValue;\n onChange: (eventOrPath: React.ChangeEvent<any> | string, value?: TValue) => void;\n value: TValue;\n}\n\nconst useField = <TValue = any,>(path: string): FieldValue<TValue | undefined> => {\n const { formatMessage } = useIntl();\n\n const initialValue = useForm(\n 'useField',\n (state) => getIn(state.initialValues, path) as FieldValue<TValue>['initialValue']\n );\n\n const value = useForm(\n 'useField',\n (state) => getIn(state.values, path) as FieldValue<TValue>['value']\n );\n\n const handleChange = useForm('useField', (state) => state.onChange);\n\n const error = useForm('useField', (state) => getIn(state.errors, path));\n\n return {\n initialValue,\n /**\n * Errors can be a string, or a MesaageDescriptor, so we need to handle both cases.\n * If it's anything else, we don't return it.\n */\n error: isErrorMessageDescriptor(error)\n ? formatMessage(\n {\n id: error.id,\n defaultMessage: error.defaultMessage,\n },\n error.values\n )\n : typeof error === 'string'\n ? error\n : undefined,\n onChange: handleChange,\n value: value,\n };\n};\n\nconst isErrorMessageDescriptor = (object?: string | object): object is TranslationMessage => {\n return (\n typeof object === 'object' && object !== null && 'id' in object && 'defaultMessage' in object\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Blocker\n * -----------------------------------------------------------------------------------------------*/\nconst Blocker = () => {\n const { formatMessage } = useIntl();\n const modified = useForm('Blocker', (state) => state.modified);\n const isSubmitting = useForm('Blocker', (state) => state.isSubmitting);\n\n const blocker = useBlocker(\n ({ currentLocation, nextLocation }) =>\n !isSubmitting && modified && currentLocation.pathname !== nextLocation.pathname\n );\n\n if (blocker.state === 'blocked') {\n return (\n <Dialog\n isOpen\n title={formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n })}\n onClose={() => blocker.reset()}\n >\n <DialogBody>\n <Flex direction=\"column\" gap={2}>\n <Icon as={ExclamationMarkCircle} width=\"24px\" height=\"24px\" color=\"danger600\" />\n <Typography as=\"p\" variant=\"omega\" textAlign=\"center\">\n {formatMessage({\n id: 'global.prompt.unsaved',\n defaultMessage: 'You have unsaved changes, are you sure you want to leave?',\n })}\n </Typography>\n </Flex>\n </DialogBody>\n <DialogFooter\n startAction={\n <Button onClick={() => blocker.reset()} variant=\"tertiary\">\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n endAction={\n <Button onClick={() => blocker.proceed()} variant=\"danger\">\n {formatMessage({\n id: 'app.components.Button.confirm',\n defaultMessage: 'Confirm',\n })}\n </Button>\n }\n />\n </Dialog>\n );\n }\n\n return null;\n};\n\nexport { Form, Blocker, useField, useForm };\nexport type {\n FormHelpers,\n FormProps,\n FormValues,\n FormContextValue,\n FormState,\n FieldValue,\n InputProps,\n};\n","import { Entity } from '@strapi/types';\n\nimport * as Permissions from '../../../shared/contracts/permissions';\nimport * as Roles from '../../../shared/contracts/roles';\nimport * as Users from '../../../shared/contracts/user';\n\nimport { adminApi } from './api';\n\nconst usersService = adminApi.injectEndpoints({\n endpoints: (builder) => ({\n /**\n * users\n */\n createUser: builder.mutation<Users.Create.Response['data'], Users.Create.Request['body']>({\n query: (body) => ({\n url: '/admin/users',\n method: 'POST',\n data: body,\n }),\n transformResponse: (response: Users.Create.Response) => response.data,\n invalidatesTags: ['LicenseLimits', { type: 'User', id: 'LIST' }],\n }),\n updateUser: builder.mutation<\n Users.Update.Response['data'],\n Omit<Users.Update.Request['body'] & Users.Update.Params, 'blocked'>\n >({\n query: ({ id, ...body }) => ({\n url: `/admin/users/${id}`,\n method: 'PUT',\n data: body,\n }),\n invalidatesTags: (_res, _err, { id }) => [\n { type: 'User', id },\n { type: 'User', id: 'LIST' },\n ],\n }),\n getUsers: builder.query<\n {\n users: Users.FindAll.Response['data']['results'];\n pagination: Users.FindAll.Response['data']['pagination'] | null;\n },\n GetUsersParams\n >({\n query: ({ id, ...params } = {}) => ({\n url: `/admin/users/${id ?? ''}`,\n method: 'GET',\n config: {\n params,\n },\n }),\n transformResponse: (res: Users.FindAll.Response | Users.FindOne.Response) => {\n let users: Users.FindAll.Response['data']['results'] = [];\n\n if (res.data) {\n if ('results' in res.data) {\n if (Array.isArray(res.data.results)) {\n users = res.data.results;\n }\n } else {\n users = [res.data];\n }\n }\n\n return {\n users,\n pagination: 'pagination' in res.data ? res.data.pagination : null,\n };\n },\n providesTags: (res, _err, arg) => {\n if (typeof arg === 'object' && 'id' in arg) {\n return [{ type: 'User' as const, id: arg.id }];\n } else {\n return [\n ...(res?.users.map(({ id }) => ({ type: 'User' as const, id })) ?? []),\n { type: 'User' as const, id: 'LIST' },\n ];\n }\n },\n }),\n deleteManyUsers: builder.mutation<\n Users.DeleteMany.Response['data'],\n Users.DeleteMany.Request['body']\n >({\n query: (body) => ({\n url: '/admin/users/batch-delete',\n method: 'POST',\n data: body,\n }),\n transformResponse: (res: Users.DeleteMany.Response) => res.data,\n invalidatesTags: ['LicenseLimits', { type: 'User', id: 'LIST' }],\n }),\n /**\n * roles\n */\n createRole: builder.mutation<Roles.Create.Response['data'], Roles.Create.Request['body']>({\n query: (body) => ({\n url: '/admin/roles',\n method: 'POST',\n data: body,\n }),\n transformResponse: (res: Roles.Create.Response) => res.data,\n invalidatesTags: [{ type: 'Role', id: 'LIST' }],\n }),\n getRoles: builder.query<Roles.FindRoles.Response['data'], GetRolesParams | void>({\n query: ({ id, ...params } = {}) => ({\n url: `/admin/roles/${id ?? ''}`,\n method: 'GET',\n config: {\n params,\n },\n }),\n transformResponse: (res: Roles.FindRole.Response | Roles.FindRoles.Response) => {\n let roles: Roles.FindRoles.Response['data'] = [];\n\n if (res.data) {\n if (Array.isArray(res.data)) {\n roles = res.data;\n } else {\n roles = [res.data];\n }\n }\n\n return roles;\n },\n providesTags: (res, _err, arg) => {\n if (typeof arg === 'object' && 'id' in arg) {\n return [{ type: 'Role' as const, id: arg.id }];\n } else {\n return [\n ...(res?.map(({ id }) => ({ type: 'Role' as const, id })) ?? []),\n { type: 'Role' as const, id: 'LIST' },\n ];\n }\n },\n }),\n updateRole: builder.mutation<\n Roles.Update.Response['data'],\n Roles.Update.Request['body'] & Roles.Update.Request['params']\n >({\n query: ({ id, ...body }) => ({\n url: `/admin/roles/${id}`,\n method: 'PUT',\n data: body,\n }),\n transformResponse: (res: Roles.Create.Response) => res.data,\n invalidatesTags: (_res, _err, { id }) => [{ type: 'Role' as const, id }],\n }),\n getRolePermissions: builder.query<\n Roles.GetPermissions.Response['data'],\n GetRolePermissionsParams\n >({\n query: ({ id, ...params }) => ({\n url: `/admin/roles/${id}/permissions`,\n method: 'GET',\n config: {\n params,\n },\n }),\n transformResponse: (res: Roles.GetPermissions.Response) => res.data,\n providesTags: (_res, _err, { id }) => [{ type: 'RolePermissions' as const, id }],\n }),\n updateRolePermissions: builder.mutation<\n Roles.UpdatePermissions.Response['data'],\n Roles.UpdatePermissions.Request['body'] & Roles.UpdatePermissions.Request['params']\n >({\n query: ({ id, ...body }) => ({\n url: `/admin/roles/${id}/permissions`,\n method: 'PUT',\n data: body,\n }),\n transformResponse: (res: Roles.UpdatePermissions.Response) => res.data,\n invalidatesTags: (_res, _err, { id }) => [{ type: 'RolePermissions' as const, id }],\n }),\n /**\n * Permissions\n */\n getRolePermissionLayout: builder.query<\n Permissions.GetAll.Response['data'],\n Permissions.GetAll.Request['params']\n >({\n query: (params) => ({\n url: '/admin/permissions',\n method: 'GET',\n config: {\n params,\n },\n }),\n transformResponse: (res: Permissions.GetAll.Response) => res.data,\n }),\n }),\n overrideExisting: false,\n});\n\ntype GetUsersParams =\n | Users.FindOne.Params\n | (Users.FindAll.Request['query'] & { id?: never })\n | void;\ntype GetRolesParams =\n | Roles.FindRole.Request['params']\n | (Roles.FindRoles.Request['query'] & { id?: never });\ninterface GetRolePermissionsParams {\n id: Entity.ID;\n}\n\nconst {\n useCreateUserMutation,\n useGetUsersQuery,\n useUpdateUserMutation,\n useDeleteManyUsersMutation,\n useGetRolesQuery,\n useCreateRoleMutation,\n useUpdateRoleMutation,\n useGetRolePermissionsQuery,\n useGetRolePermissionLayoutQuery,\n useUpdateRolePermissionsMutation,\n} = usersService;\n\nconst useAdminUsers = useGetUsersQuery;\n\nexport {\n useUpdateUserMutation,\n useGetRolesQuery,\n useAdminUsers,\n useDeleteManyUsersMutation,\n useCreateUserMutation,\n useGetRolePermissionsQuery,\n useGetRolePermissionLayoutQuery,\n useCreateRoleMutation,\n useUpdateRolePermissionsMutation,\n useUpdateRoleMutation,\n};\nexport type { GetRolesParams, GetUsersParams, GetRolePermissionsParams };\n","import type { SanitizedAdminUser } from '../../../shared/contracts/shared';\nimport type { IntlShape } from 'react-intl';\n\n/**\n * Retrieves the display name of an admin panel user\n */\nconst getDisplayName = (\n {\n firstname,\n lastname,\n username,\n email,\n }: Pick<SanitizedAdminUser, 'firstname' | 'lastname' | 'username' | 'email'> = {},\n formatMessage: IntlShape['formatMessage']\n): string => {\n if (username) {\n return username;\n }\n\n // firstname is not required if the user is created with a username\n if (firstname) {\n return formatMessage(\n {\n id: 'global.fullname',\n defaultMessage: '{firstname} {lastname}',\n },\n {\n firstname,\n lastname,\n }\n ).trim();\n }\n\n return email ?? '';\n};\n\nexport { getDisplayName };\n","import { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\nimport { adminApi } from '../../../../admin/src/services/api';\nimport * as ReviewWorkflows from '../../../../shared/contracts/review-workflows';\n\nconst reviewWorkflowsApi = adminApi.injectEndpoints({\n endpoints: (builder) => ({\n getWorkflows: builder.query<\n {\n workflows: ReviewWorkflows.GetAll.Response['data'];\n meta?: ReviewWorkflows.GetAll.Response['meta'];\n },\n GetWorkflowsParams | void\n >({\n query: (args) => {\n const { id, ...params } = args ?? {};\n\n return {\n url: `/admin/review-workflows/workflows/${id ?? ''}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n transformResponse: (res: ReviewWorkflows.GetAll.Response | ReviewWorkflows.Get.Response) => {\n let workflows: ReviewWorkflows.GetAll.Response['data'] = [];\n\n if (Array.isArray(res.data)) {\n workflows = res.data;\n } else {\n workflows = [res.data];\n }\n\n return {\n workflows,\n meta: 'meta' in res ? res.meta : undefined,\n };\n },\n providesTags: (res, _err, arg) => {\n if (typeof arg === 'object' && 'id' in arg && arg.id !== '') {\n return [{ type: 'ReviewWorkflow' as const, id: arg.id }];\n } else {\n return [\n ...(res?.workflows.map(({ id }) => ({ type: 'ReviewWorkflow' as const, id })) ?? []),\n { type: 'ReviewWorkflow' as const, id: 'LIST' },\n ];\n }\n },\n }),\n createWorkflow: builder.mutation<\n ReviewWorkflows.Create.Response['data'],\n ReviewWorkflows.Create.Request['body']\n >({\n query: (data) => ({\n url: '/admin/review-workflows/workflows',\n method: 'POST',\n data,\n }),\n transformResponse: (res: ReviewWorkflows.Create.Response) => res.data,\n invalidatesTags: [{ type: 'ReviewWorkflow' as const, id: 'LIST' }],\n }),\n updateWorkflow: builder.mutation<\n ReviewWorkflows.Update.Response['data'],\n ReviewWorkflows.Update.Request['body'] & ReviewWorkflows.Update.Params\n >({\n query: ({ id, ...data }) => ({\n url: `/admin/review-workflows/workflows/${id}`,\n method: 'PUT',\n data,\n }),\n transformResponse: (res: ReviewWorkflows.Update.Response) => res.data,\n invalidatesTags: (res, _err, arg) => [{ type: 'ReviewWorkflow' as const, id: arg.id }],\n }),\n deleteWorkflow: builder.mutation<\n ReviewWorkflows.Delete.Response['data'],\n ReviewWorkflows.Delete.Params\n >({\n query: ({ id }) => ({\n url: `/admin/review-workflows/workflows/${id}`,\n method: 'DELETE',\n }),\n transformResponse: (res: ReviewWorkflows.Delete.Response) => res.data,\n invalidatesTags: (res, _err, arg) => [{ type: 'ReviewWorkflow' as const, id: arg.id }],\n }),\n getStages: builder.query<\n {\n stages: NonNullable<Contracts.ReviewWorkflows.GetStages.Response['data']>;\n meta: NonNullable<Contracts.ReviewWorkflows.GetStages.Response['meta']>;\n },\n Contracts.ReviewWorkflows.GetStages.Params & { slug: string }\n >({\n query: ({ model, slug, id }) => ({\n url: `/admin/content-manager/${slug}/${model}/${id}/stages`,\n method: 'GET',\n }),\n transformResponse: (res: Contracts.ReviewWorkflows.GetStages.Response) => {\n return {\n meta: res.meta ?? { workflowCount: 0 },\n stages: res.data ?? [],\n };\n },\n providesTags: (_res, _err, arg) => {\n return [{ type: 'ReviewWorkflowStage' as const, id: arg.id }];\n },\n }),\n updateStage: builder.mutation<\n Contracts.ReviewWorkflows.UpdateStage.Response['data'],\n Contracts.ReviewWorkflows.UpdateStage.Request['body'] &\n Contracts.ReviewWorkflows.UpdateStage.Params & { slug: string }\n >({\n query: ({ model, slug, id, ...data }) => ({\n url: `/admin/content-manager/${slug}/${model}/${id}/stage`,\n method: 'PUT',\n data,\n }),\n transformResponse: (res: Contracts.ReviewWorkflows.UpdateStage.Response) => res.data,\n invalidatesTags: (res, _err, arg) => [{ type: 'ReviewWorkflowStage' as const, id: arg.id }],\n }),\n updateAssignee: builder.mutation<\n Contracts.ReviewWorkflows.UpdateAssignee.Response['data'],\n Contracts.ReviewWorkflows.UpdateAssignee.Request['body'] &\n Contracts.ReviewWorkflows.UpdateAssignee.Params & { slug: string }\n >({\n query: ({ model, slug, id, ...data }) => ({\n url: `/admin/content-manager/${slug}/${model}/${id}/assignee`,\n method: 'PUT',\n data,\n }),\n transformResponse: (res: Contracts.ReviewWorkflows.UpdateAssignee.Response) => res.data,\n }),\n }),\n overrideExisting: false,\n});\n\ntype GetWorkflowsParams =\n | ReviewWorkflows.Get.Params\n | (ReviewWorkflows.GetAll.Request['query'] & { id?: never });\n\nconst {\n useGetWorkflowsQuery,\n useCreateWorkflowMutation,\n useDeleteWorkflowMutation,\n useUpdateWorkflowMutation,\n useGetStagesQuery,\n useUpdateStageMutation,\n useUpdateAssigneeMutation,\n} = reviewWorkflowsApi;\n\nexport {\n useGetWorkflowsQuery,\n useCreateWorkflowMutation,\n useDeleteWorkflowMutation,\n useUpdateWorkflowMutation,\n useGetStagesQuery,\n useUpdateStageMutation,\n useUpdateAssigneeMutation,\n type GetWorkflowsParams,\n};\n","export const STAGE_ATTRIBUTE_NAME = 'strapi_stage';\nexport const ASSIGNEE_ATTRIBUTE_NAME = 'strapi_assignee';\n","import { Combobox, ComboboxOption, Field, Flex } from '@strapi/design-system';\nimport { useRBAC } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { useField } from '../../../../../../../admin/src/components/Form';\nimport { useDoc } from '../../../../../../../admin/src/content-manager/hooks/useDocument';\nimport { useTypedSelector } from '../../../../../../../admin/src/core/store/hooks';\nimport { useNotification } from '../../../../../../../admin/src/features/Notifications';\nimport { useAPIErrorHandler } from '../../../../../../../admin/src/hooks/useAPIErrorHandler';\nimport { useAdminUsers } from '../../../../../../../admin/src/services/users';\nimport { getDisplayName } from '../../../../../../../admin/src/utils/users';\nimport { useUpdateAssigneeMutation } from '../../../../services/reviewWorkflows';\n\nimport { ASSIGNEE_ATTRIBUTE_NAME } from './constants';\n\nconst AssigneeSelect = () => {\n const { collectionType, model, id } = useDoc();\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { toggleNotification } = useNotification();\n const {\n allowedActions: { canRead },\n isLoading: isLoadingPermissions,\n } = useRBAC(permissions.settings?.users);\n const { data, isLoading, isError } = useAdminUsers(\n { id },\n {\n skip: isLoadingPermissions || !canRead || !id,\n }\n );\n\n const users = data?.users || [];\n\n /**\n * TODO: type this value when we can test it.\n */\n const field = useField(ASSIGNEE_ATTRIBUTE_NAME);\n\n const currentAssignee = field.value ?? null;\n\n const [updateAssignee, { error, isLoading: isMutating }] = useUpdateAssigneeMutation();\n\n const handleChange = async (assigneeId: string | null) => {\n const res = await updateAssignee({\n slug: collectionType,\n model: model,\n id: id!,\n data: {\n id: assigneeId ? parseInt(assigneeId, 10) : null,\n },\n });\n\n if ('data' in res) {\n // initialData and modifiedData have to stay in sync, otherwise the entity would be flagged\n // as modified, which is what the boolean flag is for\n field.onChange(ASSIGNEE_ATTRIBUTE_NAME, res.data[ASSIGNEE_ATTRIBUTE_NAME]);\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-manager.reviewWorkflows.assignee.notification.saved',\n defaultMessage: 'Assignee updated',\n }),\n });\n }\n };\n\n return (\n <Field name={ASSIGNEE_ATTRIBUTE_NAME} id={ASSIGNEE_ATTRIBUTE_NAME}>\n <Flex direction=\"column\" gap={2} alignItems=\"stretch\">\n <Combobox\n clearLabel={formatMessage({\n id: 'content-manager.reviewWorkflows.assignee.clear',\n defaultMessage: 'Clear assignee',\n })}\n error={\n ((isError &&\n canRead &&\n formatMessage({\n id: 'content-manager.reviewWorkflows.assignee.error',\n defaultMessage: 'An error occurred while fetching users',\n })) ||\n (error && formatAPIError(error))) ??\n undefined\n }\n disabled={(!isLoadingPermissions && !isLoading && users.length === 0) || !id}\n name={ASSIGNEE_ATTRIBUTE_NAME}\n id={ASSIGNEE_ATTRIBUTE_NAME}\n value={currentAssignee ? currentAssignee.id.toString() : null}\n // @ts-expect-error - DS Combobox wants to return number or string, this will be fixed in V2.\n onChange={handleChange}\n onClear={() => handleChange(null)}\n placeholder={formatMessage({\n id: 'content-manager.reviewWorkflows.assignee.placeholder',\n defaultMessage: 'Select…',\n })}\n label={formatMessage({\n id: 'content-manager.reviewWorkflows.assignee.label',\n defaultMessage: 'Assignee',\n })}\n loading={isLoading || isLoadingPermissions || isMutating}\n >\n {users.map((user) => {\n return (\n <ComboboxOption\n key={user.id}\n value={user.id.toString()}\n textValue={getDisplayName(user, formatMessage)}\n >\n {getDisplayName(user, formatMessage)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n </Flex>\n </Field>\n );\n};\n\nexport { AssigneeSelect };\n","import * as React from 'react';\n\nimport { useGetLicenseLimitsQuery } from '../../../../admin/src/services/admin';\nimport { GetLicenseLimitInformation } from '../../../../shared/contracts/admin';\n\ninterface UseLicenseLimitsArgs {\n enabled?: boolean;\n}\n\nfunction useLicenseLimits({ enabled }: UseLicenseLimitsArgs = { enabled: true }) {\n const { data, isError, isLoading } = useGetLicenseLimitsQuery(undefined, {\n skip: !enabled,\n });\n\n type FeatureNames = GetLicenseLimitInformation.Response['data']['features'][number]['name'];\n\n type GetFeatureType = <T>(name: FeatureNames) => Record<string, T> | undefined;\n\n const getFeature = React.useCallback<GetFeatureType>(\n (name) => {\n const feature = data?.data?.features.find((feature) => feature.name === name);\n\n if (feature && 'options' in feature) {\n return feature.options;\n } else {\n return {};\n }\n },\n [data]\n );\n\n return { license: data?.data, getFeature, isError, isLoading };\n}\n\nexport { useLicenseLimits };\nexport type { UseLicenseLimitsArgs };\n","export default \"data:image/png;base64,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\"","import * as React from 'react';\n\nimport { Box, Flex, IconButton, ModalLayout, ModalBody, Typography } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport { Cross } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport balloonImageSrc from './assets/balloon.png';\n\nconst TITLE_ID = 'limits-title';\n\nconst CTA_LEARN_MORE_HREF = 'https://strapi.io/pricing-cloud';\nconst CTA_SALES_HREF = 'https://strapi.io/contact-sales';\n\nconst Title: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <Typography variant=\"alpha\" id={TITLE_ID}>\n {children}\n </Typography>\n );\n};\n\nconst Body: React.FC<React.PropsWithChildren> = ({ children }) => {\n return <Typography variant=\"omega\">{children}</Typography>;\n};\n\nconst CallToActions = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex gap={2} paddingTop={4}>\n <LinkButton variant=\"default\" isExternal href={CTA_LEARN_MORE_HREF}>\n {formatMessage({\n id: 'Settings.review-workflows.limit.cta.learn',\n defaultMessage: 'Learn more',\n })}\n </LinkButton>\n\n <LinkButton variant=\"tertiary\" isExternal href={CTA_SALES_HREF}>\n {formatMessage({\n id: 'Settings.review-workflows.limit.cta.sales',\n defaultMessage: 'Contact Sales',\n })}\n </LinkButton>\n </Flex>\n );\n};\n\nconst BalloonImage = styled.img`\n // Margin top|right reverse the padding of ModalBody\n margin-right: ${({ theme }) => `-${theme.spaces[7]}`};\n margin-top: ${({ theme }) => `-${theme.spaces[7]}`};\n width: 360px;\n`;\n\nexport type LimitsModalProps = {\n isOpen?: boolean;\n onClose: () => void;\n};\n\nconst Root: React.FC<React.PropsWithChildren<LimitsModalProps>> = ({\n children,\n isOpen = false,\n onClose,\n}) => {\n const { formatMessage } = useIntl();\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <ModalLayout onClose={onClose} labelledBy={TITLE_ID}>\n <ModalBody>\n <Flex gap={2} paddingLeft={7} position=\"relative\">\n <Flex alignItems=\"start\" direction=\"column\" gap={2} width=\"60%\">\n {children}\n\n <CallToActions />\n </Flex>\n\n <Flex justifyContent=\"end\" height=\"100%\" width=\"40%\">\n <BalloonImage src={balloonImageSrc} aria-hidden alt=\"\" loading=\"lazy\" />\n\n <Box display=\"flex\" position=\"absolute\" right={0} top={0}>\n <IconButton\n icon={<Cross />}\n aria-label={formatMessage({\n id: 'global.close',\n defaultMessage: 'Close',\n })}\n onClick={onClose}\n />\n </Box>\n </Flex>\n </Flex>\n </ModalBody>\n </ModalLayout>\n );\n};\n\nconst LimitsModal = {\n Title,\n Body,\n Root,\n};\n\nexport { LimitsModal };\n","import { lightTheme } from '@strapi/design-system';\n\nexport const REDUX_NAMESPACE = 'settings_review-workflows';\n\nexport const ACTION_RESET_WORKFLOW = `Settings/Review_Workflows/RESET_WORKFLOW`;\nexport const ACTION_SET_CONTENT_TYPES = `Settings/Review_Workflows/SET_CONTENT_TYPES`;\nexport const ACTION_SET_IS_LOADING = `Settings/Review_Workflows/SET_IS_LOADING`;\nexport const ACTION_SET_ROLES = `Settings/Review_Workflows/SET_ROLES`;\nexport const ACTION_SET_WORKFLOW = `Settings/Review_Workflows/SET_WORKFLOW`;\nexport const ACTION_SET_WORKFLOWS = `Settings/Review_Workflows/SET_WORKFLOWS`;\nexport const ACTION_DELETE_STAGE = `Settings/Review_Workflows/WORKFLOW_DELETE_STAGE`;\nexport const ACTION_ADD_STAGE = `Settings/Review_Workflows/WORKFLOW_ADD_STAGE`;\nexport const ACTION_CLONE_STAGE = `Settings/Review_Workflows/WORKFLOW_CLONE_STAGE`;\nexport const ACTION_UPDATE_STAGE = `Settings/Review_Workflows/WORKFLOW_UPDATE_STAGE`;\nexport const ACTION_UPDATE_STAGES = `Settings/Review_Workflows/WORKFLOW_UPDATE_STAGES`;\nexport const ACTION_UPDATE_STAGE_POSITION = `Settings/Review_Workflows/WORKFLOW_UPDATE_STAGE_POSITION`;\nexport const ACTION_UPDATE_WORKFLOW = `Settings/Review_Workflows/WORKFLOW_UPDATE`;\n\nexport const STAGE_COLORS: Record<string, string> = {\n primary600: 'Blue',\n primary200: 'Lilac',\n alternative600: 'Violet',\n alternative200: 'Lavender',\n success600: 'Green',\n success200: 'Pale Green',\n danger500: 'Cherry',\n danger200: 'Pink',\n warning600: 'Orange',\n warning200: 'Yellow',\n secondary600: 'Teal',\n secondary200: 'Baby Blue',\n neutral400: 'Gray',\n neutral0: 'White',\n};\n\nexport const STAGE_COLOR_DEFAULT = lightTheme.colors.primary600;\n\nexport type DragDropTypes = 'stage';\n\nexport const DRAG_DROP_TYPES: Record<Uppercase<DragDropTypes>, DragDropTypes> = {\n STAGE: 'stage',\n};\n\nexport const CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME = 'numberOfWorkflows';\nexport const CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME = 'stagesPerWorkflow';\n","import { lightTheme } from '@strapi/design-system';\nimport { DefaultTheme } from 'styled-components';\n\nimport { STAGE_COLORS } from '../constants';\n\nexport function getStageColorByHex(hex: string) {\n if (!hex) {\n return null;\n }\n\n // there are multiple colors with the same hex code in the design tokens. In order to find\n // the correct one we have to find all matching colors and then check, which ones are usable\n // for stages.\n const themeColors: [string, (keyof typeof STAGE_COLORS)[]][] = Object.entries(\n lightTheme.colors\n ).filter(([, value]) => value.toUpperCase() === hex.toUpperCase());\n\n const themeColorName = themeColors.reduce((acc, [name]) => {\n if (STAGE_COLORS?.[name]) {\n acc = name;\n }\n\n return acc;\n }, null as keyof typeof STAGE_COLORS | null);\n\n if (!themeColorName) {\n return null;\n }\n\n return {\n themeColorName,\n name: STAGE_COLORS[themeColorName],\n };\n}\n\nexport function getAvailableStageColors() {\n return Object.entries(STAGE_COLORS).map(([themeColorName, name]) => ({\n hex: lightTheme.colors[themeColorName as keyof DefaultTheme['colors']].toUpperCase(),\n name,\n }));\n}\n","import * as React from 'react';\n\nimport {\n SingleSelect,\n SingleSelectOption,\n Field,\n FieldError,\n FieldHint,\n Flex,\n Loader,\n Typography,\n} from '@strapi/design-system';\nimport { Entity } from '@strapi/types';\nimport { useIntl } from 'react-intl';\n\nimport { useField } from '../../../../../../../admin/src/components/Form';\nimport { useDoc } from '../../../../../../../admin/src/content-manager/hooks/useDocument';\nimport { useNotification } from '../../../../../../../admin/src/features/Notifications';\nimport { useAPIErrorHandler } from '../../../../../../../admin/src/hooks/useAPIErrorHandler';\nimport { useLicenseLimits } from '../../../../hooks/useLicenseLimits';\nimport { LimitsModal } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/components/LimitsModal';\nimport {\n CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME,\n CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME,\n} from '../../../../pages/SettingsPage/pages/ReviewWorkflows/constants';\nimport { getStageColorByHex } from '../../../../pages/SettingsPage/pages/ReviewWorkflows/utils/colors';\nimport { useGetStagesQuery, useUpdateStageMutation } from '../../../../services/reviewWorkflows';\n\nimport { STAGE_ATTRIBUTE_NAME } from './constants';\n\nexport const StageSelect = () => {\n const { collectionType, model, id } = useDoc();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { toggleNotification } = useNotification();\n const { data, isLoading } = useGetStagesQuery(\n {\n slug: collectionType,\n model: model,\n id: id!,\n },\n {\n skip: !id,\n }\n );\n\n const { meta, stages = [] } = data ?? {};\n\n const { getFeature } = useLicenseLimits();\n const [showLimitModal, setShowLimitModal] = React.useState<'stage' | 'workflow' | null>(null);\n\n const limits = getFeature<string>('review-workflows') ?? {};\n // it is possible to rely on initialData here, because it always will\n // be updated at the same time when modifiedData is updated, otherwise\n // the entity is flagged as modified\n const field = useField(STAGE_ATTRIBUTE_NAME);\n\n const activeWorkflowStage = field.value ?? null;\n\n const [updateStage, { error }] = useUpdateStageMutation();\n\n const handleChange = async (stageId: Entity.ID) => {\n try {\n /**\n * If the current license has a limit:\n * check if the total count of workflows exceeds that limit and display\n * the limits modal.\n *\n * If the current license does not have a limit (e.g. offline license):\n * do nothing (for now).\n *\n */\n\n if (\n limits?.[CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME] &&\n parseInt(limits[CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME], 10) < (meta?.workflowCount ?? 0)\n ) {\n setShowLimitModal('workflow');\n\n /**\n * If the current license has a limit:\n * check if the total count of stages exceeds that limit and display\n * the limits modal.\n *\n * If the current license does not have a limit (e.g. offline license):\n * do nothing (for now).\n *\n */\n } else if (\n limits?.[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME] &&\n parseInt(limits[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME], 10) < stages.length\n ) {\n setShowLimitModal('stage');\n } else {\n if (id) {\n const res = await updateStage({\n model,\n id,\n slug: collectionType,\n data: { id: stageId },\n });\n\n if ('data' in res) {\n // initialData and modifiedData have to stay in sync, otherwise the entity would be flagged\n // as modified, which is what the boolean flag is for\n field.onChange(STAGE_ATTRIBUTE_NAME, res.data[STAGE_ATTRIBUTE_NAME]);\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-manager.reviewWorkflows.stage.notification.saved',\n defaultMessage: 'Review stage updated',\n }),\n });\n }\n }\n }\n } catch (error) {\n // react-query@v3: the error doesn't have to be handled here\n // see: https://github.com/TanStack/query/issues/121\n }\n };\n\n const { themeColorName } = getStageColorByHex(activeWorkflowStage?.color) ?? {};\n\n return (\n <>\n <Field\n hint={\n stages.length === 0 &&\n formatMessage({\n id: 'content-manager.reviewWorkflows.stages.no-transition',\n defaultMessage: 'You don’t have the permission to update this stage.',\n })\n }\n name={STAGE_ATTRIBUTE_NAME}\n id={STAGE_ATTRIBUTE_NAME}\n >\n <Flex direction=\"column\" gap={2} alignItems=\"stretch\">\n <SingleSelect\n disabled={stages.length === 0}\n error={(error && formatAPIError(error)) || undefined}\n name={STAGE_ATTRIBUTE_NAME}\n id={STAGE_ATTRIBUTE_NAME}\n value={activeWorkflowStage?.id}\n onChange={handleChange}\n label={formatMessage({\n id: 'content-manager.reviewWorkflows.stage.label',\n defaultMessage: 'Review stage',\n })}\n placeholder={formatMessage({\n id: 'content-manager.reviewWorkflows.assignee.placeholder',\n defaultMessage: 'Select…',\n })}\n startIcon={\n activeWorkflowStage && (\n <Flex\n as=\"span\"\n height={2}\n background={activeWorkflowStage?.color}\n borderColor={themeColorName === 'neutral0' ? 'neutral150' : undefined}\n hasRadius\n shrink={0}\n width={2}\n marginRight=\"-3px\"\n />\n )\n }\n // @ts-expect-error – `customizeContent` is not correctly typed in the DS.\n customizeContent={() => (\n <Flex as=\"span\" justifyContent=\"space-between\" alignItems=\"center\" width=\"100%\">\n <Typography textColor=\"neutral800\" ellipsis>\n {activeWorkflowStage?.name ?? ''}\n </Typography>\n {isLoading ? (\n <Loader small style={{ display: 'flex' }} data-testid=\"loader\" />\n ) : null}\n </Flex>\n )}\n >\n {stages.map(({ id, color, name }) => {\n const { themeColorName } = getStageColorByHex(color) ?? {};\n\n return (\n <SingleSelectOption\n key={id}\n startIcon={\n <Flex\n height={2}\n background={color}\n borderColor={themeColorName === 'neutral0' ? 'neutral150' : undefined}\n hasRadius\n shrink={0}\n width={2}\n />\n }\n value={id}\n textValue={name}\n >\n {name}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n <FieldHint />\n <FieldError />\n </Flex>\n </Field>\n\n <LimitsModal.Root\n isOpen={showLimitModal === 'workflow'}\n onClose={() => setShowLimitModal(null)}\n >\n <LimitsModal.Title>\n {formatMessage({\n id: 'content-manager.reviewWorkflows.workflows.limit.title',\n defaultMessage: 'You’ve reached the limit of workflows in your plan',\n })}\n </LimitsModal.Title>\n\n <LimitsModal.Body>\n {formatMessage({\n id: 'content-manager.reviewWorkflows.workflows.limit.body',\n defaultMessage: 'Delete a workflow or contact Sales to enable more workflows.',\n })}\n </LimitsModal.Body>\n </LimitsModal.Root>\n\n <LimitsModal.Root isOpen={showLimitModal === 'stage'} onClose={() => setShowLimitModal(null)}>\n <LimitsModal.Title>\n {formatMessage({\n id: 'content-manager.reviewWorkflows.stages.limit.title',\n defaultMessage: 'You have reached the limit of stages for this workflow in your plan',\n })}\n </LimitsModal.Title>\n\n <LimitsModal.Body>\n {formatMessage({\n id: 'content-manager.reviewWorkflows.stages.limit.body',\n defaultMessage: 'Try deleting some stages or contact Sales to enable more stages.',\n })}\n </LimitsModal.Body>\n </LimitsModal.Root>\n </>\n );\n};\n","import * as React from 'react';\n\nimport { Flex } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../../../../../admin/src/content-manager/hooks/useDocument';\n\nimport { AssigneeSelect } from './AssigneeSelect';\nimport { StageSelect } from './StageSelect';\n\nimport type { PanelComponent } from '../../../../../../../admin/src/core/apis/content-manager';\n\nconst ReviewWorkflowsPanel: PanelComponent = () => {\n const { schema } = useDoc();\n const { formatMessage } = useIntl();\n\n if (!window.strapi.isEE || !schema?.options?.reviewWorkflows) {\n return null;\n }\n\n return {\n title: formatMessage({\n id: 'content-manager.containers.edit.panels.review-workflows.title',\n defaultMessage: 'Review Workflows',\n }),\n content: (\n <Flex direction=\"column\" gap={2} alignItems=\"stretch\" width=\"100%\">\n <AssigneeSelect />\n <StageSelect />\n </Flex>\n ),\n };\n};\n\nReviewWorkflowsPanel.type = 'review-workflows';\n\nexport { ReviewWorkflowsPanel };\n","import * as React from 'react';\n\nimport { useQueryParams } from '@strapi/helper-plugin';\nimport { History } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport type { DocumentActionComponent } from '../../../core/apis/content-manager';\n\nconst StyledHistory = styled(History)`\n path {\n fill: currentColor;\n }\n`;\n\nconst HistoryAction: DocumentActionComponent = ({ model, document }) => {\n const { formatMessage } = useIntl();\n const [{ query }] = useQueryParams<{ plugins?: Record<string, unknown> }>();\n const navigate = useNavigate();\n const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });\n\n // TODO: also check license before adding history action\n if (!window.strapi.future.isEnabled('history')) {\n return null;\n }\n\n return {\n icon: <StyledHistory />,\n label: formatMessage({\n id: 'content-manager.history.document-action',\n defaultMessage: 'Content History',\n }),\n onClick: () => navigate({ pathname: 'history', search: pluginsQueryParams }),\n disabled:\n /**\n * The user is creating a new document.\n * It hasn't been saved yet, so there's no history to go to\n */\n !document ||\n /**\n * The document has been created but the current dimension has never been saved.\n * For example, the user is creating a new locale in an existing document,\n * so there's no history for the document in that locale\n */\n !document.id ||\n /**\n * History is only available for content types created by the user.\n * These have the `api::` prefix, as opposed to the ones created by Strapi or plugins,\n * which start with `admin::` or `plugin::`\n */\n !model.startsWith('api::'),\n position: 'header',\n };\n};\n\nHistoryAction.type = 'history';\n\nexport { HistoryAction };\n","import * as React from 'react';\n\nimport { createSelector } from '@reduxjs/toolkit';\nimport { useRBAC, type Permission } from '@strapi/helper-plugin';\nimport { useParams } from 'react-router-dom';\n\nimport { createContext } from '../../components/Context';\nimport { RootState } from '../../core/store/configure';\nimport { useTypedSelector } from '../../core/store/hooks';\n\nimport type { Attribute } from '@strapi/types';\n\n/**\n * The boolean values indicate the global actions a user can perform on the document.\n * The `string[]` values tell us specifically which fields the actions can be performed on,\n * for example, if the `canReadFields` array is empty, than no fields can be read by the user.\n * This can happen even if the user can read the document.\n */\ninterface DocumentRBACContextValue {\n canCreate?: boolean;\n canCreateFields: string[];\n canDelete?: boolean;\n canPublish?: boolean;\n canRead?: boolean;\n canReadFields: string[];\n canUpdate?: boolean;\n canUpdateFields: string[];\n canUserAction: (\n fieldName: string,\n fieldsUserCanAction: string[],\n fieldType: Attribute.Kind\n ) => boolean;\n isLoading: boolean;\n}\n\nconst [DocumentRBACProvider, useDocumentRBAC] = createContext<DocumentRBACContextValue>(\n 'DocumentRBAC',\n {\n canCreate: false,\n canCreateFields: [],\n canDelete: false,\n canPublish: false,\n canRead: false,\n canReadFields: [],\n canUpdate: false,\n canUpdateFields: [],\n canUserAction: () => false,\n isLoading: false,\n }\n);\n\ninterface DocumentRBACProps {\n children: React.ReactNode;\n permissions: Permission[] | null;\n}\n\nconst selectContentTypePermissionsOrganisedByAction = createSelector(\n [\n (state: RootState) => state.rbacProvider.collectionTypesRelatedPermissions,\n (_, slug: string) => slug,\n ],\n (allContentTypePermissions, slug) => {\n const contentTypePermissions = allContentTypePermissions[slug];\n\n return Object.entries(contentTypePermissions).reduce<Record<string, Permission[]>>(\n (acc, [action, permissions]) => {\n /**\n * The original action is in the format `plugins::content-manager.explorer.{ACTION}`,\n * we only want the last part of the string so our actions form properties like can{ACTION}\n */\n const [actionShorthand] = action.split('.').slice(-1);\n\n return {\n ...acc,\n [actionShorthand]: permissions,\n };\n },\n {}\n );\n }\n);\n\n/**\n * @internal This component is not meant to be used outside of the Content Manager plugin.\n * It depends on knowing the slug/model of the content-type using the params of the URL.\n * If you do use the hook outside of the context, we default to `false` for all actions.\n *\n * It then creates an list of `can{Action}` that are passed to the context for consumption\n * within the app to enforce RBAC.\n */\nconst DocumentRBAC = ({ children, permissions }: DocumentRBACProps) => {\n const { slug } = useParams<{ slug: string }>();\n\n if (!slug) {\n throw new Error('Cannot find the slug param in the URL');\n }\n\n const contentTypePermissions = useTypedSelector((state) =>\n selectContentTypePermissionsOrganisedByAction(state, slug)\n );\n const { isLoading, allowedActions } = useRBAC(contentTypePermissions, permissions ?? []);\n\n const canCreateFields =\n !isLoading && allowedActions.canCreate\n ? extractAndDedupeFields(contentTypePermissions.create)\n : [];\n\n const canReadFields =\n !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];\n\n const canUpdateFields =\n !isLoading && allowedActions.canUpdate\n ? extractAndDedupeFields(contentTypePermissions.update)\n : [];\n\n /**\n * @description Checks if the user can perform an action on a field based on the field names\n * provided as the second argument.\n */\n const canUserAction: DocumentRBACContextValue['canUserAction'] = React.useCallback(\n (fieldName, fieldsUserCanAction, fieldType) => {\n const name = removeNumericalStrings(fieldName.split('.'));\n\n const componentFieldNames = fieldsUserCanAction\n // filter out fields that aren't components (components are dot separated)\n .filter((field) => field.split('.').length > 1);\n\n if (fieldType === 'component') {\n const componentOrDynamicZoneFields = componentFieldNames\n // then map to give us the dot separate path as an array\n .map((field) => field.split('.'));\n // check if the field name is within any of those arrays\n return componentOrDynamicZoneFields.some((field) => {\n return field.includes(fieldName);\n });\n }\n\n /**\n * The field is within a component.\n */\n if (name.length > 1) {\n return componentFieldNames.includes(name.join('.'));\n }\n\n /**\n * just a regular field\n */\n return fieldsUserCanAction.includes(fieldName);\n },\n []\n );\n\n return (\n <DocumentRBACProvider\n isLoading={isLoading}\n canCreateFields={canCreateFields}\n canReadFields={canReadFields}\n canUpdateFields={canUpdateFields}\n canUserAction={canUserAction}\n {...allowedActions}\n >\n {children}\n </DocumentRBACProvider>\n );\n};\n\n/**\n * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.\n */\nconst extractAndDedupeFields = (permissions: Permission[] = []) =>\n permissions\n .flatMap((permission) => permission.properties?.fields)\n .filter(\n (field, index, arr): field is string =>\n arr.indexOf(field) === index && typeof field === 'string'\n );\n\n/**\n * @internal removes numerical strings from arrays.\n * @example\n * ```ts\n * const name = 'a.0.b';\n * const res = removeNumericalStrings(name.split('.'));\n * console.log(res); // ['a', 'b']\n * ```\n */\nconst removeNumericalStrings = (arr: string[]) => arr.filter((item) => isNaN(Number(item)));\n\nexport { DocumentRBAC, useDocumentRBAC, DocumentRBACContextValue, DocumentRBACProps };\n","const getTranslation = (id: string) => `content-manager.${id}`;\n\nexport { getTranslation };\n","import * as React from 'react';\n\nimport { SerializedError } from '@reduxjs/toolkit';\nimport { useIntl, type MessageDescriptor } from 'react-intl';\n\nimport { useNotification } from '../../features/Notifications';\nimport { TrackingEvent, useTracking } from '../../features/Tracking';\nimport { useAPIErrorHandler } from '../../hooks/useAPIErrorHandler';\nimport { BaseQueryError } from '../../utils/baseQuery';\nimport {\n useAutoCloneDocumentMutation,\n useCloneDocumentMutation,\n useCreateDocumentMutation,\n useDeleteDocumentMutation,\n useDiscardDocumentMutation,\n useLazyGetDocumentQuery,\n usePublishDocumentMutation,\n useUnpublishDocumentMutation,\n useUpdateDocumentMutation,\n} from '../services/documents';\nimport { getTranslation } from '../utils/translations';\n\nimport type { Document } from './useDocument';\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\nconst DEFAULT_UNEXPECTED_ERROR_MSG = {\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again',\n} satisfies MessageDescriptor;\n\ntype OperationResponse<TResponse extends { data: any; meta: any; error?: any }> =\n | Pick<TResponse, 'data' | 'meta'>\n | { error: BaseQueryError | SerializedError };\n\ntype UseDocumentActions = () => {\n /**\n * @description Attempts to clone a document based on the provided sourceId.\n * This will return a list of the fields as an error if it's unable to clone.\n * You most likely want to use the `clone` action instead.\n */\n autoClone: (args: {\n model: string;\n sourceId: string;\n }) => Promise<OperationResponse<Contracts.CollectionTypes.AutoClone.Response>>;\n clone: (\n args: {\n model: string;\n documentId: string;\n params?: object;\n },\n document: Omit<Document, 'id'>,\n trackerProperty?: Extract<\n TrackingEvent,\n { name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry' }\n >['properties']\n ) => Promise<OperationResponse<Contracts.CollectionTypes.Clone.Response>>;\n create: (\n args: {\n model: string;\n params?: object;\n },\n document: Omit<Document, 'id'>,\n trackerProperty?: Extract<\n TrackingEvent,\n { name: 'willCreateEntry' | 'didCreateEntry' | 'didNotCreateEntry' }\n >['properties']\n ) => Promise<OperationResponse<Contracts.CollectionTypes.Create.Response>>;\n delete: (\n args: {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n },\n trackerProperty?: Extract<\n TrackingEvent,\n { name: 'willDeleteEntry' | 'didDeleteEntry' | 'didNotDeleteEntry' }\n >['properties']\n ) => Promise<OperationResponse<Contracts.CollectionTypes.Delete.Response>>;\n discard: (args: {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n }) => Promise<OperationResponse<Contracts.CollectionTypes.Discard.Response>>;\n getDocument: (args: {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n }) => Promise<Contracts.CollectionTypes.FindOne.Response | undefined>;\n publish: (\n args: {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n },\n document: Partial<Document>\n ) => Promise<OperationResponse<Contracts.CollectionTypes.Publish.Response>>;\n update: (\n args: {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n },\n document: Partial<Document>,\n trackerProperty?: Extract<\n TrackingEvent,\n { name: 'willEditEntry' | 'didEditEntry' | 'didNotEditEntry' }\n >['properties']\n ) => Promise<OperationResponse<Contracts.CollectionTypes.Update.Response>>;\n unpublish: (\n args: {\n collectionType: string;\n model: string;\n documentId?: string;\n params?: object;\n },\n discardDraft?: boolean\n ) => Promise<OperationResponse<Contracts.CollectionTypes.Unpublish.Response>>;\n};\n\ntype IUseDocumentActs = ReturnType<UseDocumentActions>;\n\n/**\n * @alpha\n * @public\n * @description Contains all the operations that can be performed on a single document.\n * Designed to be able to be used anywhere within a Strapi app. The hooks will handle\n * notifications should the operation fail, however the response is always returned incase\n * the user needs to handle side-effects.\n * @example\n * ```tsx\n * import { Form } from '@strapi/admin/admin';\n *\n * const { id, model, collectionType } = useParams<{ id: string; model: string; collectionType: string }>();\n * const { update } = useDocumentActions();\n *\n * const handleSubmit = async (data) => {\n * await update({ collectionType, model, documentId: id }, data);\n * }\n *\n * return <Form method=\"PUT\" onSubmit={handleSubmit} />\n * ```\n *\n * @see {@link https://contributor.strapi.io/docs/core/content-manager/hooks/use-document-operations} for more information\n */\nconst useDocumentActions: UseDocumentActions = () => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [deleteDocument] = useDeleteDocumentMutation();\n const _delete: IUseDocumentActs['delete'] = React.useCallback(\n async ({ collectionType, model, documentId, params }, trackerProperty) => {\n try {\n trackUsage('willDeleteEntry', trackerProperty);\n\n const res = await deleteDocument({\n collectionType,\n model,\n documentId,\n params,\n });\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return { error: res.error };\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('success.record.delete'),\n defaultMessage: 'Deleted document',\n }),\n });\n\n trackUsage('didDeleteEntry', trackerProperty);\n\n return res.data;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n trackUsage('didNotDeleteEntry', { error: err, ...trackerProperty });\n\n throw err;\n }\n },\n [trackUsage, deleteDocument, toggleNotification, formatMessage, formatAPIError]\n );\n\n const [discardDocument] = useDiscardDocumentMutation();\n const discard: IUseDocumentActs['discard'] = React.useCallback(\n async ({ collectionType, model, documentId }) => {\n try {\n const res = await discardDocument({\n collectionType,\n model,\n documentId,\n });\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return { error: res.error };\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-manager.success.record.discard',\n defaultMessage: 'Changes discarded',\n }),\n });\n\n return res.data;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [discardDocument, formatAPIError, formatMessage, toggleNotification]\n );\n\n const [publishDocument] = usePublishDocumentMutation();\n const publish: IUseDocumentActs['publish'] = React.useCallback(\n async ({ collectionType, model, documentId, params }, data) => {\n try {\n trackUsage('willPublishEntry');\n\n const res = await publishDocument({\n collectionType,\n model,\n documentId,\n data,\n params,\n });\n\n if ('error' in res) {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n return { error: res.error };\n }\n\n trackUsage('didPublishEntry');\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('success.record.publish'),\n defaultMessage: 'Published document',\n }),\n });\n\n return res.data;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [trackUsage, publishDocument, toggleNotification, formatMessage, formatAPIError]\n );\n\n const [updateDocument] = useUpdateDocumentMutation();\n const update: IUseDocumentActs['update'] = React.useCallback(\n async ({ collectionType, model, documentId, params }, data, trackerProperty) => {\n try {\n trackUsage('willEditEntry', trackerProperty);\n\n const res = await updateDocument({\n collectionType,\n model,\n documentId,\n data,\n params,\n });\n\n if ('error' in res) {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n\n trackUsage('didNotEditEntry', { error: res.error, ...trackerProperty });\n\n return { error: res.error };\n }\n\n trackUsage('didEditEntry', trackerProperty);\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('success.record.save'),\n defaultMessage: 'Saved document',\n }),\n });\n\n return res.data;\n } catch (err) {\n trackUsage('didNotEditEntry', { error: err, ...trackerProperty });\n\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [trackUsage, updateDocument, toggleNotification, formatMessage, formatAPIError]\n );\n\n const [unpublishDocument] = useUnpublishDocumentMutation();\n const unpublish: IUseDocumentActs['unpublish'] = React.useCallback(\n async ({ collectionType, model, documentId, params }, discardDraft = false) => {\n try {\n trackUsage('willUnpublishEntry');\n\n const res = await unpublishDocument({\n collectionType,\n model,\n documentId,\n params,\n data: {\n discardDraft,\n },\n });\n\n if ('error' in res) {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n\n return { error: res.error };\n }\n\n trackUsage('didUnpublishEntry');\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('success.record.unpublish'),\n defaultMessage: 'Unpublished document',\n }),\n });\n\n return res.data;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [trackUsage, unpublishDocument, toggleNotification, formatMessage, formatAPIError]\n );\n\n const [createDocument] = useCreateDocumentMutation();\n const create: IUseDocumentActs['create'] = React.useCallback(\n async ({ model, params }, data, trackerProperty) => {\n try {\n const res = await createDocument({\n model,\n data,\n params,\n });\n\n if ('error' in res) {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n\n trackUsage('didNotCreateEntry', { error: res.error, ...trackerProperty });\n\n return { error: res.error };\n }\n\n trackUsage('didCreateEntry', trackerProperty);\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('success.record.save'),\n defaultMessage: 'Saved document',\n }),\n });\n\n return res.data;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n trackUsage('didNotCreateEntry', { error: err, ...trackerProperty });\n\n throw err;\n }\n },\n [createDocument, formatAPIError, formatMessage, toggleNotification, trackUsage]\n );\n\n const [autoCloneDocument] = useAutoCloneDocumentMutation();\n const autoClone: IUseDocumentActs['autoClone'] = React.useCallback(\n async ({ model, sourceId }) => {\n try {\n const res = await autoCloneDocument({\n model,\n sourceId,\n });\n\n if ('error' in res) {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n\n return { error: res.error };\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('success.record.clone'),\n defaultMessage: 'Cloned document',\n }),\n });\n\n return res.data;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [autoCloneDocument, formatAPIError, formatMessage, toggleNotification]\n );\n\n const [cloneDocument] = useCloneDocumentMutation();\n const clone: IUseDocumentActs['clone'] = React.useCallback(\n async ({ model, documentId, params }, body, trackerProperty) => {\n try {\n const { id: _id, ...restBody } = body;\n\n /**\n * If we're cloning we want to post directly to this endpoint\n * so that the relations even if they're not listed in the EditView\n * are correctly attached to the entry.\n */\n const res = await cloneDocument({\n model,\n sourceId: documentId,\n data: restBody,\n params,\n });\n\n if ('error' in res) {\n toggleNotification({ type: 'danger', message: formatAPIError(res.error) });\n\n trackUsage('didNotCreateEntry', { error: res.error, ...trackerProperty });\n\n return { error: res.error };\n }\n\n trackUsage('didCreateEntry', trackerProperty);\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTranslation('success.record.clone'),\n defaultMessage: 'Cloned document',\n }),\n });\n\n return res.data;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n trackUsage('didNotCreateEntry', { error: err, ...trackerProperty });\n\n throw err;\n }\n },\n [cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError]\n );\n\n const [getDoc] = useLazyGetDocumentQuery();\n const getDocument: IUseDocumentActs['getDocument'] = React.useCallback(\n async (args) => {\n const { data } = await getDoc(args);\n\n return data;\n },\n [getDoc]\n );\n\n return {\n autoClone,\n clone,\n create,\n delete: _delete,\n discard,\n getDocument,\n publish,\n unpublish,\n update,\n } satisfies IUseDocumentActs;\n};\n\nexport { useDocumentActions };\nexport type { UseDocumentActions, OperationResponse };\n","import * as React from 'react';\n\nimport {\n Box,\n Button,\n Dialog,\n DialogBody,\n DialogFooter,\n DialogProps,\n Flex,\n Icon,\n ModalBody,\n ModalHeader,\n ModalLayout,\n Radio,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Menu } from '@strapi/design-system/v2';\nimport { useQueryParams } from '@strapi/helper-plugin';\nimport { CrossCircle, ExclamationMarkCircle, More } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMatch, useNavigate } from 'react-router-dom';\nimport styled, { DefaultTheme } from 'styled-components';\n\nimport { useForm } from '../../../../components/Form';\nimport { DocumentActionComponent } from '../../../../core/apis/content-manager';\nimport { NotificationConfig, useNotification } from '../../../../features/Notifications';\nimport { useAPIErrorHandler } from '../../../../hooks/useAPIErrorHandler';\nimport { isBaseQueryError } from '../../../../utils/baseQuery';\nimport { PUBLISHED_AT_ATTRIBUTE_NAME } from '../../../constants/attributes';\nimport { SINGLE_TYPES } from '../../../constants/collections';\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { useDocumentActions } from '../../../hooks/useDocumentActions';\nimport { CLONE_PATH } from '../../../router';\nimport { buildValidParams } from '../../../utils/api';\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\ntype DocumentActionPosition = 'panel' | 'header' | 'table-row';\n\ninterface DocumentActionDescription {\n label: string;\n onClick?: (event: React.SyntheticEvent) => Promise<boolean | void> | boolean | void;\n icon?: React.ReactNode;\n /**\n * @default false\n */\n disabled?: boolean;\n /**\n * @default 'panel'\n * @description Where the action should be rendered.\n */\n position?: DocumentActionPosition | DocumentActionPosition[];\n dialog?: DialogOptions | NotificationOptions | ModalOptions;\n /**\n * @default 'secondary'\n */\n variant?: 'default' | 'secondary' | 'danger' | 'success';\n}\n\ninterface DialogOptions {\n type: 'dialog';\n title: string;\n content?: React.ReactNode;\n onConfirm?: () => void | Promise<void>;\n onCancel?: () => void | Promise<void>;\n}\n\ninterface NotificationOptions {\n type: 'notification';\n title: string;\n link?: {\n label: string;\n url: string;\n target?: string;\n };\n content?: string;\n onClose?: () => void;\n status?: NotificationConfig['type'];\n timeout?: number;\n}\n\ninterface ModalOptions {\n type: 'modal';\n title: string;\n content: React.ReactNode;\n footer: React.ComponentType<{ onClose: () => void }> | React.ReactNode;\n onClose?: () => void;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * DocumentActions\n * -----------------------------------------------------------------------------------------------*/\n\ninterface Action extends DocumentActionDescription {\n id: string;\n}\n\ninterface DocumentActionsProps {\n actions: Action[];\n}\n\nconst DocumentActions = ({ actions }: DocumentActionsProps) => {\n const { formatMessage } = useIntl();\n const [primaryAction, secondaryAction, ...restActions] = actions.filter((action) => {\n if (action.position === undefined) {\n return true;\n }\n\n const positions = Array.isArray(action.position) ? action.position : [action.position];\n return positions.includes('panel');\n });\n\n if (!primaryAction) {\n return null;\n }\n\n return (\n <Flex direction=\"column\" gap={2} alignItems=\"stretch\" width=\"100%\">\n <Flex gap={2}>\n <DocumentActionButton {...primaryAction} variant={primaryAction.variant || 'default'} />\n {restActions.length > 0 ? (\n <DocumentActionsMenu\n actions={restActions}\n label={formatMessage({\n id: 'content-manager.containers.edit.panels.default.more-actions',\n defaultMessage: 'More document actions',\n })}\n />\n ) : null}\n </Flex>\n {secondaryAction ? (\n <DocumentActionButton\n {...secondaryAction}\n variant={secondaryAction.variant || 'secondary'}\n />\n ) : null}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DocumentActionButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DocumentActionButtonProps extends Action {}\n\nconst DocumentActionButton = (action: DocumentActionButtonProps) => {\n const [dialogId, setDialogId] = React.useState<string | null>(null);\n const { toggleNotification } = useNotification();\n\n const handleClick = (action: Action) => async (e: React.MouseEvent) => {\n const { onClick = () => false, dialog, id } = action;\n\n const muteDialog = await onClick(e);\n\n if (dialog && !muteDialog) {\n switch (dialog.type) {\n case 'notification':\n toggleNotification({\n title: dialog.title,\n message: dialog.content,\n type: dialog.status,\n timeout: dialog.timeout,\n onClose: dialog.onClose,\n });\n break;\n case 'dialog':\n case 'modal':\n e.preventDefault();\n setDialogId(id);\n }\n }\n };\n\n const handleClose = () => {\n setDialogId(null);\n };\n\n return (\n <>\n <Button\n flex={1}\n startIcon={action.icon}\n disabled={action.disabled}\n onClick={handleClick(action)}\n justifyContent=\"center\"\n variant={action.variant || 'default'}\n >\n {action.label}\n </Button>\n {action.dialog?.type === 'dialog' ? (\n <DocumentActionConfirmDialog\n {...action.dialog}\n variant={action.variant}\n isOpen={dialogId === action.id}\n onClose={handleClose}\n />\n ) : null}\n {action.dialog?.type === 'modal' ? (\n <DocumentActionModal\n {...action.dialog}\n onModalClose={handleClose}\n isOpen={dialogId === action.id}\n />\n ) : null}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DocumentActionMenu\n * -----------------------------------------------------------------------------------------------*/\ninterface DocumentActionsMenuProps {\n actions: Action[];\n children?: React.ReactNode;\n label?: string;\n variant?: 'ghost' | 'tertiary';\n}\n\nconst DocumentActionsMenu = ({\n actions,\n children,\n label,\n variant = 'tertiary',\n}: DocumentActionsMenuProps) => {\n const [isOpen, setIsOpen] = React.useState(false);\n const [dialogId, setDialogId] = React.useState<string | null>(null);\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const isDisabled = actions.every((action) => action.disabled) || actions.length === 0;\n\n const handleClick = (action: Action) => async (e: React.SyntheticEvent) => {\n const { onClick = () => false, dialog, id } = action;\n\n const muteDialog = await onClick(e);\n\n if (dialog && !muteDialog) {\n switch (dialog.type) {\n case 'notification':\n toggleNotification({\n title: dialog.title,\n message: dialog.content,\n type: dialog.status,\n timeout: dialog.timeout,\n onClose: dialog.onClose,\n });\n break;\n case 'dialog':\n case 'modal':\n setDialogId(id);\n }\n }\n };\n\n const handleClose = () => {\n setDialogId(null);\n setIsOpen(false);\n };\n\n return (\n <Menu.Root open={isOpen} onOpenChange={setIsOpen}>\n <Menu.Trigger\n disabled={isDisabled}\n size=\"S\"\n endIcon={null}\n paddingTop=\"7px\"\n paddingLeft=\"9px\"\n paddingRight=\"9px\"\n variant={variant}\n >\n <More aria-hidden focusable={false} />\n <VisuallyHidden as=\"span\">\n {label ||\n formatMessage({\n id: 'content-manager.containers.edit.panels.default.more-actions',\n defaultMessage: 'More document actions',\n })}\n </VisuallyHidden>\n </Menu.Trigger>\n <Menu.Content top=\"4px\" maxHeight={undefined} popoverPlacement=\"bottom-end\">\n {actions.map((action) => {\n return (\n <Menu.Item\n disabled={action.disabled}\n /* @ts-expect-error – TODO: this is an error in the DS where it is most likely a synthetic event, not regular. */\n onSelect={handleClick(action)}\n display=\"block\"\n key={action.id}\n >\n <Flex justifyContent=\"space-between\" gap={4}>\n <Flex color={convertActionVariantToColor(action.variant)} gap={2} as=\"span\">\n {action.icon}\n {action.label}\n </Flex>\n {/* TODO: remove this in 5.1 release */}\n {action.id.startsWith('HistoryAction') && (\n <Flex\n alignItems=\"center\"\n background=\"alternative100\"\n borderStyle=\"solid\"\n borderColor=\"alternative200\"\n borderWidth=\"1px\"\n height={5}\n paddingLeft={2}\n paddingRight={2}\n hasRadius\n color=\"alternative600\"\n >\n <Typography variant=\"sigma\" fontWeight=\"bold\" lineHeight={1}>\n {formatMessage({ id: 'global.new', defaultMessage: 'New' })}\n </Typography>\n </Flex>\n )}\n </Flex>\n </Menu.Item>\n );\n })}\n {children}\n </Menu.Content>\n {actions.map((action) => {\n return (\n <React.Fragment key={action.id}>\n {action.dialog?.type === 'dialog' ? (\n <DocumentActionConfirmDialog\n {...action.dialog}\n variant={action.variant}\n isOpen={dialogId === action.id}\n onClose={handleClose}\n />\n ) : null}\n {action.dialog?.type === 'modal' ? (\n <DocumentActionModal\n {...action.dialog}\n onModalClose={handleClose}\n isOpen={dialogId === action.id}\n />\n ) : null}\n </React.Fragment>\n );\n })}\n </Menu.Root>\n );\n};\n\nconst convertActionVariantToColor = (\n variant: DocumentActionDescription['variant'] = 'secondary'\n): keyof DefaultTheme['colors'] | undefined => {\n switch (variant) {\n case 'danger':\n return 'danger600';\n case 'secondary':\n return undefined;\n case 'success':\n return 'success600';\n default:\n return 'primary600';\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DocumentActionConfirmDialog\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DocumentActionConfirmDialogProps\n extends DialogOptions,\n Pick<DialogProps, 'onClose' | 'isOpen'>,\n Pick<Action, 'variant'> {}\n\nconst DocumentActionConfirmDialog = ({\n onClose,\n onCancel,\n onConfirm,\n title,\n content,\n isOpen,\n variant = 'secondary',\n}: DocumentActionConfirmDialogProps) => {\n const { formatMessage } = useIntl();\n\n const handleClose = async () => {\n if (onCancel) {\n await onCancel();\n }\n\n onClose();\n };\n\n const handleConfirm = async () => {\n if (onConfirm) {\n await onConfirm();\n }\n\n onClose();\n };\n\n return (\n <Dialog isOpen={isOpen} title={title} onClose={handleClose}>\n <DialogBody>{content}</DialogBody>\n <DialogFooter\n startAction={\n <Button onClick={handleClose} variant=\"tertiary\">\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n endAction={\n <Button onClick={handleConfirm} variant={variant}>\n {formatMessage({\n id: 'app.components.Button.confirm',\n defaultMessage: 'Confirm',\n })}\n </Button>\n }\n />\n </Dialog>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DocumentActionModal\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DocumentActionModalProps extends ModalOptions {\n onModalClose: () => void;\n isOpen?: boolean;\n}\n\nconst DocumentActionModal = ({\n isOpen,\n title,\n onClose,\n footer: Footer,\n content,\n onModalClose,\n}: DocumentActionModalProps) => {\n const id = React.useId();\n\n if (!isOpen) {\n return null;\n }\n\n const handleClose = () => {\n if (onClose) {\n onClose();\n }\n\n onModalClose();\n };\n\n return (\n <ModalLayout borderRadius=\"4px\" overflow=\"hidden\" onClose={handleClose} labelledBy={id}>\n <ModalHeader>\n <Typography fontWeight=\"bold\" textColor=\"neutral800\" as=\"h2\" id={id}>\n {title}\n </Typography>\n </ModalHeader>\n <ModalBody>{content}</ModalBody>\n <Box\n paddingTop={4}\n paddingBottom={4}\n paddingLeft={5}\n paddingRight={5}\n borderWidth=\"1px 0 0 0\"\n borderStyle=\"solid\"\n borderColor=\"neutral150\"\n background=\"neutral100\"\n >\n {typeof Footer === 'function' ? <Footer onClose={handleClose} /> : Footer}\n </Box>\n </ModalLayout>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DocumentActionComponents\n * -----------------------------------------------------------------------------------------------*/\n\nconst PublishAction: DocumentActionComponent = ({\n activeTab,\n documentId,\n model,\n collectionType,\n meta,\n document,\n}) => {\n const { schema } = useDoc();\n const navigate = useNavigate();\n const { toggleNotification } = useNotification();\n const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();\n const isCloning = useMatch(CLONE_PATH) !== null;\n const { formatMessage } = useIntl();\n const { canPublish, canCreate, canUpdate } = useDocumentRBAC(\n 'PublishAction',\n ({ canPublish, canCreate, canUpdate }) => ({ canPublish, canCreate, canUpdate })\n );\n const { publish } = useDocumentActions();\n const [{ query, rawQuery }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n const modified = useForm('PublishAction', ({ modified }) => modified);\n const setSubmitting = useForm('PublishAction', ({ setSubmitting }) => setSubmitting);\n const isSubmitting = useForm('PublishAction', ({ isSubmitting }) => isSubmitting);\n const validate = useForm('PublishAction', (state) => state.validate);\n const setErrors = useForm('PublishAction', (state) => state.setErrors);\n const formValues = useForm('PublishAction', ({ values }) => values);\n\n const isDocumentPublished =\n (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] ||\n meta?.availableStatus.some((doc) => doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) &&\n document?.status !== 'modified';\n\n if (!schema?.options?.draftAndPublish) {\n return null;\n }\n\n return {\n /**\n * Disabled when:\n * - currently if you're cloning a document we don't support publish & clone at the same time.\n * - the form is submitting\n * - the active tab is the published tab\n * - the document is already published & not modified\n * - the document is being created & not modified\n * - the user doesn't have the permission to publish\n * - the user doesn't have the permission to create a new document\n * - the user doesn't have the permission to update the document\n */\n disabled:\n isCloning ||\n isSubmitting ||\n activeTab === 'published' ||\n (!modified && isDocumentPublished) ||\n (!modified && !document?.documentId) ||\n !canPublish ||\n Boolean((!document?.documentId && !canCreate) || (document?.documentId && !canUpdate)),\n label: formatMessage({\n id: 'app.utils.publish',\n defaultMessage: 'Publish',\n }),\n onClick: async () => {\n setSubmitting(true);\n\n try {\n const { errors } = await validate();\n\n if (errors) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.validation.error',\n defaultMessage:\n 'There are validation errors in your document. Please fix them before saving.',\n }),\n });\n\n return;\n }\n\n const res = await publish(\n {\n collectionType,\n model,\n documentId,\n params,\n },\n formValues\n );\n\n if ('data' in res && collectionType !== SINGLE_TYPES) {\n /**\n * TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this.\n */\n navigate({\n pathname: `../${collectionType}/${model}/${res.data.documentId}`,\n search: rawQuery,\n });\n } else if (\n 'error' in res &&\n isBaseQueryError(res.error) &&\n res.error.name === 'ValidationError'\n ) {\n setErrors(formatValidationErrors(res.error));\n }\n } finally {\n setSubmitting(false);\n }\n },\n };\n};\n\nPublishAction.type = 'publish';\n\nconst UpdateAction: DocumentActionComponent = ({\n activeTab,\n documentId,\n model,\n collectionType,\n}) => {\n const navigate = useNavigate();\n const { toggleNotification } = useNotification();\n const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();\n const cloneMatch = useMatch(CLONE_PATH);\n const isCloning = cloneMatch !== null;\n const { formatMessage } = useIntl();\n const { canCreate, canUpdate } = useDocumentRBAC('UpdateAction', ({ canCreate, canUpdate }) => ({\n canCreate,\n canUpdate,\n }));\n const { create, update, clone } = useDocumentActions();\n const [{ query, rawQuery }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n const isSubmitting = useForm('UpdateAction', ({ isSubmitting }) => isSubmitting);\n const modified = useForm('UpdateAction', ({ modified }) => modified);\n const setSubmitting = useForm('UpdateAction', ({ setSubmitting }) => setSubmitting);\n const document = useForm('UpdateAction', ({ values }) => values);\n const validate = useForm('UpdateAction', (state) => state.validate);\n const setErrors = useForm('UpdateAction', (state) => state.setErrors);\n\n return {\n /**\n * Disabled when:\n * - the form is submitting\n * - the document is not modified & we're not cloning (you can save a clone entity straight away)\n * - the active tab is the published tab\n * - the user doesn't have the permission to create a new document\n * - the user doesn't have the permission to update the document\n */\n disabled:\n isSubmitting ||\n (!modified && !isCloning) ||\n activeTab === 'published' ||\n Boolean((!documentId && !canCreate) || (documentId && !canUpdate)),\n label: formatMessage({\n id: 'content-manager.containers.Edit.save',\n defaultMessage: 'Save',\n }),\n onClick: async () => {\n setSubmitting(true);\n\n try {\n const { errors } = await validate();\n\n if (errors) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'content-manager.validation.error',\n defaultMessage:\n 'There are validation errors in your document. Please fix them before saving.',\n }),\n });\n\n return;\n }\n\n if (isCloning) {\n const res = await clone(\n {\n model,\n documentId: cloneMatch.params.origin!,\n params,\n },\n document\n );\n\n if ('data' in res) {\n /**\n * TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this.\n */\n navigate({\n pathname: `../${collectionType}/${model}/${res.data.documentId}`,\n search: rawQuery,\n });\n } else if (\n 'error' in res &&\n isBaseQueryError(res.error) &&\n res.error.name === 'ValidationError'\n ) {\n setErrors(formatValidationErrors(res.error));\n }\n } else if (documentId || collectionType === SINGLE_TYPES) {\n const res = await update(\n {\n collectionType,\n model,\n documentId,\n params,\n },\n document\n );\n\n if (\n 'error' in res &&\n isBaseQueryError(res.error) &&\n res.error.name === 'ValidationError'\n ) {\n setErrors(formatValidationErrors(res.error));\n }\n } else {\n const res = await create(\n {\n model,\n params,\n },\n document\n );\n\n if ('data' in res && collectionType !== SINGLE_TYPES) {\n /**\n * TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this.\n */\n navigate({\n pathname: `../${collectionType}/${model}/${res.data.documentId}`,\n search: rawQuery,\n });\n } else if (\n 'error' in res &&\n isBaseQueryError(res.error) &&\n res.error.name === 'ValidationError'\n ) {\n setErrors(formatValidationErrors(res.error));\n }\n }\n } finally {\n setSubmitting(false);\n }\n },\n };\n};\n\nUpdateAction.type = 'update';\n\nconst UNPUBLISH_DRAFT_OPTIONS = {\n KEEP: 'keep',\n DISCARD: 'discard',\n};\n\nconst UnpublishAction: DocumentActionComponent = ({\n activeTab,\n documentId,\n model,\n collectionType,\n document,\n}) => {\n const { formatMessage } = useIntl();\n const { schema } = useDoc();\n const canPublish = useDocumentRBAC('UnpublishAction', ({ canPublish }) => canPublish);\n const { unpublish } = useDocumentActions();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n const { toggleNotification } = useNotification();\n const [shouldKeepDraft, setShouldKeepDraft] = React.useState(true);\n\n const isDocumentModified = document?.status === 'modified';\n\n const handleChange: React.FormEventHandler<HTMLFieldSetElement> &\n React.FormEventHandler<HTMLDivElement> = (e) => {\n if ('value' in e.target) {\n setShouldKeepDraft(e.target.value === UNPUBLISH_DRAFT_OPTIONS.KEEP);\n }\n };\n\n if (!schema?.options?.draftAndPublish) {\n return null;\n }\n\n return {\n disabled:\n !canPublish ||\n activeTab === 'published' ||\n (document?.status !== 'published' && document?.status !== 'modified'),\n label: formatMessage({\n id: 'app.utils.unpublish',\n defaultMessage: 'Unpublish',\n }),\n icon: <StyledCrossCircle />,\n onClick: async () => {\n /**\n * return if there's no id & we're in a collection type, or the status modified\n * for either collection type because we use a dialog to handle the process in\n * the latter case.\n */\n if ((!documentId && collectionType !== SINGLE_TYPES) || isDocumentModified) {\n if (!documentId) {\n // This should never, ever, happen.\n console.error(\n \"You're trying to unpublish a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.unpublish.error',\n defaultMessage: 'An error occurred while trying to unpublish the document.',\n }),\n type: 'danger',\n });\n }\n\n return;\n }\n\n await unpublish({\n collectionType,\n model,\n documentId,\n params,\n });\n },\n dialog: isDocumentModified\n ? {\n type: 'dialog',\n title: formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n }),\n content: (\n <Flex alignItems=\"flex-start\" direction=\"column\" gap={6}>\n <Flex width=\"100%\" direction=\"column\" gap={2}>\n <Icon as={ExclamationMarkCircle} width=\"24px\" height=\"24px\" color=\"danger600\" />\n <Typography as=\"p\" variant=\"omega\" textAlign=\"center\">\n {formatMessage({\n id: 'content-manager.actions.unpublish.dialog.body',\n defaultMessage: 'Are you sure?',\n })}\n </Typography>\n </Flex>\n <Flex\n onChange={handleChange}\n direction=\"column\"\n alignItems=\"flex-start\"\n as=\"fieldset\"\n gap={3}\n >\n <VisuallyHidden as=\"legend\"></VisuallyHidden>\n <Radio\n checked={shouldKeepDraft}\n value={UNPUBLISH_DRAFT_OPTIONS.KEEP}\n name=\"discard-options\"\n >\n {formatMessage({\n id: 'content-manager.actions.unpublish.dialog.option.keep-draft',\n defaultMessage: 'Keep draft',\n })}\n </Radio>\n <Radio\n checked={!shouldKeepDraft}\n value={UNPUBLISH_DRAFT_OPTIONS.DISCARD}\n name=\"discard-options\"\n >\n {formatMessage({\n id: 'content-manager.actions.unpublish.dialog.option.replace-draft',\n defaultMessage: 'Replace draft',\n })}\n </Radio>\n </Flex>\n </Flex>\n ),\n onConfirm: async () => {\n if (!documentId && collectionType !== SINGLE_TYPES) {\n // This should never, ever, happen.\n console.error(\n \"You're trying to unpublish a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.unpublish.error',\n defaultMessage: 'An error occurred while trying to unpublish the document.',\n }),\n type: 'danger',\n });\n }\n\n await unpublish(\n {\n collectionType,\n model,\n documentId,\n params,\n },\n !shouldKeepDraft\n );\n },\n }\n : undefined,\n variant: 'danger',\n position: ['panel', 'table-row'],\n };\n};\n\nUnpublishAction.type = 'unpublish';\n\nconst DiscardAction: DocumentActionComponent = ({\n activeTab,\n documentId,\n model,\n collectionType,\n document,\n}) => {\n const { formatMessage } = useIntl();\n const { schema } = useDoc();\n const canUpdate = useDocumentRBAC('DiscardAction', ({ canUpdate }) => canUpdate);\n const { discard } = useDocumentActions();\n const [{ query }] = useQueryParams();\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!schema?.options?.draftAndPublish) {\n return null;\n }\n\n return {\n disabled: !canUpdate || activeTab === 'published' || document?.status !== 'modified',\n label: formatMessage({\n id: 'content-manager.actions.discard.label',\n defaultMessage: 'Discard changes',\n }),\n icon: <StyledCrossCircle />,\n position: ['panel', 'table-row'],\n variant: 'danger',\n dialog: {\n type: 'dialog',\n title: formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n }),\n content: (\n <Flex direction=\"column\" gap={2}>\n <Icon as={ExclamationMarkCircle} width=\"24px\" height=\"24px\" color=\"danger600\" />\n <Typography as=\"p\" variant=\"omega\" textAlign=\"center\">\n {formatMessage({\n id: 'content-manager.actions.discard.dialog.body',\n defaultMessage: 'Are you sure?',\n })}\n </Typography>\n </Flex>\n ),\n onConfirm: async () => {\n await discard({\n collectionType,\n model,\n documentId,\n params,\n });\n },\n },\n };\n};\n\nDiscardAction.type = 'discard';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledCrossCircle = styled(CrossCircle)`\n path {\n fill: currentColor;\n }\n`;\n\nconst DEFAULT_ACTIONS = [PublishAction, UpdateAction, UnpublishAction, DiscardAction];\n\nexport { DocumentActions, DocumentActionsMenu, DEFAULT_ACTIONS };\nexport type { DocumentActionDescription, DialogOptions, NotificationOptions, ModalOptions };\n","import * as React from 'react';\n\nconst useIsMounted = () => {\n const isMounted = React.useRef(false);\n\n React.useLayoutEffect(() => {\n isMounted.current = true;\n\n return () => {\n isMounted.current = false;\n };\n }, []);\n\n return isMounted;\n};\n\nexport { useIsMounted };\n","import * as React from 'react';\n\nimport { useIsMounted } from './useIsMounted';\n\n/**\n * @internal\n * @description Return a function that re-renders this component, if still mounted\n * @warning DO NOT USE EXCEPT SPECIAL CASES.\n */\nconst useForceUpdate = () => {\n const [tick, update] = React.useState<number>();\n const isMounted = useIsMounted();\n\n const forceUpdate = React.useCallback(() => {\n if (isMounted.current) {\n update(Math.random());\n }\n }, [isMounted, update]);\n\n return [tick, forceUpdate] as const;\n};\n\nexport { useForceUpdate };\n","import { useMemo } from 'react';\n\nimport throttle from 'lodash/throttle';\n\ntype ThrottleSettings = Parameters<typeof throttle>[2];\n\n/**\n * @internal\n * @description Create a throttled version of a callback\n * @example\n * ```tsx\n * // First create a callback using React’s `useCallback` hook\n * const myCallback = useCallback(() => {\n * // this is not throttled\n * }, [])\n *\n * // Then make a throttled version using the `useThrottledCallback` hook\n * const myThrottledCallback = useThrottledCallback(myCallback, 100)\n *\n * // Call the throttled callback\n * <Button onClick={myThrottledCallback} />\n * ```\n */\nconst useThrottledCallback = <T extends (...args: any[]) => any>(\n callback: T,\n wait: number,\n options: ThrottleSettings\n): T => {\n const throttledCallback = useMemo(\n () => throttle(callback, wait, options) as unknown as T,\n [callback, options, wait]\n );\n\n return throttledCallback;\n};\n\nexport { useThrottledCallback };\n","/* -------------------------------------------------------------------------------------------------\n * requestIdleCallbackShim\n * -----------------------------------------------------------------------------------------------*/\nconst requestIdleCallbackShim: Window['requestIdleCallback'] = (callback) => {\n const start = Date.now();\n\n return setTimeout(() => {\n callback({\n didTimeout: false,\n timeRemaining() {\n return Math.max(0, Date.now() - start);\n },\n });\n }, 1) as unknown as ReturnType<Window['requestIdleCallback']>;\n};\n\nconst _requestIdleCallback =\n typeof requestIdleCallback === 'undefined' ? requestIdleCallbackShim : requestIdleCallback;\n\n/* -------------------------------------------------------------------------------------------------\n * cancelIdleCallbackShim\n * -----------------------------------------------------------------------------------------------*/\nconst cancelIdleCallbackShim: Window['cancelIdleCallback'] = (handle: unknown) => {\n return clearTimeout(handle as any);\n};\n\nconst _cancelIdleCallback =\n typeof cancelIdleCallback === 'undefined' ? cancelIdleCallbackShim : cancelIdleCallback;\n\nexport { _requestIdleCallback as requestIdleCallback };\nexport { _cancelIdleCallback as cancelIdleCallback };\n","/**\n * This component will render DescriptionComponents that return objects e.g. `cm.apis.addEditViewPanel`\n * these descriptions are still treated like components because users can use react hooks in them.\n *\n * Rendering them normally by mapping etc. causes mutliple render issues.\n */\n\nimport * as React from 'react';\n\nimport isEqual from 'lodash/isEqual';\n\nimport { useForceUpdate } from '../hooks/useForceUpdate';\nimport { useThrottledCallback } from '../hooks/useThrottledCallback';\nimport { cancelIdleCallback, requestIdleCallback } from '../utils/shims';\n\ninterface DescriptionComponent<Props, Description> {\n (props: Props): Description | null;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * DescriptionComponentRenderer\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DescriptionComponentRendererProps<Props = any, Description = any> {\n children: (descriptions: Array<Description & { id: string }>) => React.ReactNode;\n descriptions: DescriptionComponent<Props, Description>[];\n props: Props;\n}\n\n/**\n * @internal\n *\n * @description This component takes an array of DescriptionComponents, which are react components that return objects as opposed to JSX.\n * We render these in their own isolated memoized component and use an update function to push the data back out to the parent.\n * Saving it in a ref, and then \"forcing\" an update of the parent component to render the children of this component with the new data.\n *\n * The DescriptionCompoonents can take props and use react hooks hence why we render them as if they were a component. The update\n * function is throttled and managed to avoid erroneous updates where we could wait a single tick to update the entire UI, which\n * creates less \"popping\" from functions being called in rapid succession.\n */\nconst DescriptionComponentRenderer = <Props, Description>({\n children,\n props,\n descriptions,\n}: DescriptionComponentRendererProps<Props, Description>) => {\n const statesRef = React.useRef<Record<string, { value: Description & { id: string } }>>({});\n const [tick, forceUpdate] = useForceUpdate();\n\n const requestHandle = React.useRef<number | null>(null);\n const requestUpdate = React.useCallback(() => {\n if (requestHandle.current) {\n cancelIdleCallback(requestHandle.current);\n }\n\n requestHandle.current = requestIdleCallback(() => {\n requestHandle.current = null;\n\n forceUpdate();\n });\n }, [forceUpdate]);\n\n /**\n * This will avoid us calling too many react updates in a short space of time.\n */\n const throttledRequestUpdate = useThrottledCallback(requestUpdate, 60, { trailing: true });\n\n const update = React.useCallback<DescriptionProps<Props, Description>['update']>(\n (id, description) => {\n if (description === null) {\n delete statesRef.current[id];\n } else {\n const current = statesRef.current[id];\n statesRef.current[id] = { ...current, value: { ...description, id } };\n }\n\n throttledRequestUpdate();\n },\n [throttledRequestUpdate]\n );\n\n const ids = React.useMemo(\n () => descriptions.map((description) => getCompId(description)),\n [descriptions]\n );\n\n const states = React.useMemo(\n () =>\n ids\n .map((id) => statesRef.current[id]?.value)\n .filter((state) => state !== null && state !== undefined),\n /**\n * we leave tick in the deps to ensure the memo is recalculated when the `update` function is called.\n * the `ids` will most likely be stable unless we get new actions, but we can't respond to the Description\n * Component changing the ref data in any other way.\n */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [ids, tick]\n );\n\n return (\n <>\n {descriptions.map((description) => {\n const key = getCompId(description);\n return (\n <Description key={key} id={key} description={description} props={props} update={update} />\n );\n })}\n {children(states)}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Description\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DescriptionProps<Props, Description> {\n description: DescriptionComponent<Props, Description>;\n id: string;\n props: Props;\n update: (id: string, value: Description | null) => void;\n}\n\n/**\n * Descriptions are objects, but to create the object, we allow users to create components,\n * this means they can use react hooks in them. It also means we need to render them\n * within a component, however because they return an object of data we can't add that\n * to the react tree, instead we push it back out to the parent.\n */\nconst Description = React.memo(\n ({ description, id, props, update }: DescriptionProps<any, any>) => {\n const comp = description(props);\n\n useShallowCompareEffect(() => {\n update(id, comp);\n\n return () => {\n update(id, null);\n };\n }, comp);\n\n return null;\n },\n (prev, next) => isEqual(prev.props, next.props)\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Helpers\n * -----------------------------------------------------------------------------------------------*/\n\nconst ids = new WeakMap<DescriptionComponent<any, any>, string>();\n\nlet counter = 0;\n\nfunction getCompId<T, K>(comp: DescriptionComponent<T, K>): string {\n const cachedId = ids.get(comp);\n\n if (cachedId) return cachedId;\n\n const id = `${comp.name || (comp as any).displayName || '<anonymous>'}-${counter++}`;\n\n ids.set(comp, id);\n\n return id;\n}\n\nconst useShallowCompareMemoize = <T,>(value: T): Array<T | undefined> => {\n const ref = React.useRef<T | undefined>(undefined);\n\n if (!isEqual(value, ref.current)) {\n ref.current = value;\n }\n\n return [ref.current];\n};\n\nconst useShallowCompareEffect = (callback: React.EffectCallback, dependencies?: unknown) => {\n // eslint-disable-next-line react-hooks/exhaustive-deps -- the linter isn't able to see that deps are properly handled here\n React.useEffect(callback, useShallowCompareMemoize(dependencies));\n};\n\nexport { DescriptionComponentRenderer };\nexport type { DescriptionComponentRendererProps, DescriptionComponent };\n","import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit = intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n })!;\n\n const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n","const capitalise = (str: string): string => str.charAt(0).toUpperCase() + str.slice(1);\n\nexport { capitalise };\n","import { Status, StatusProps, Typography } from '@strapi/design-system';\n\nimport { capitalise } from '../../../../utils/strings';\n\ninterface DocumentStatusProps\n extends Omit<StatusProps, 'children' | 'showBullet' | 'size' | 'variant'> {\n /**\n * The status of the document (draft, published, etc.)\n * @default 'draft'\n */\n status?: string;\n}\n\n/**\n * @internal\n * @description Displays the status of a document (draft, published, etc.)\n * and automatically calculates the appropriate variant for the status.\n */\nconst DocumentStatus = ({ status = 'draft', ...restProps }: DocumentStatusProps) => {\n const statusVariant =\n status === 'draft' ? 'primary' : status === 'published' ? 'success' : 'alternative';\n\n return (\n <Status {...restProps} showBullet={false} size={'S'} variant={statusVariant}>\n <Typography as=\"span\" variant=\"omega\" fontWeight=\"bold\">\n {capitalise(status)}\n </Typography>\n </Status>\n );\n};\n\nexport { DocumentStatus };\nexport type { DocumentStatusProps };\n","import * as React from 'react';\n\nimport { Flex, Icon, SingleSelect, SingleSelectOption, Typography } from '@strapi/design-system';\nimport { useQueryParams } from '@strapi/helper-plugin';\nimport { Cog, ExclamationMarkCircle, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMatch, useNavigate } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport { DescriptionComponentRenderer } from '../../../../components/DescriptionComponentRenderer';\nimport { useForm } from '../../../../components/Form';\nimport { RelativeTime } from '../../../../components/RelativeTime';\nimport { BackButton } from '../../../../features/BackButton';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useStrapiApp } from '../../../../features/StrapiApp';\nimport { getDisplayName } from '../../../../utils/users';\nimport {\n CREATED_AT_ATTRIBUTE_NAME,\n CREATED_BY_ATTRIBUTE_NAME,\n PUBLISHED_AT_ATTRIBUTE_NAME,\n PUBLISHED_BY_ATTRIBUTE_NAME,\n UPDATED_AT_ATTRIBUTE_NAME,\n UPDATED_BY_ATTRIBUTE_NAME,\n} from '../../../constants/attributes';\nimport { SINGLE_TYPES } from '../../../constants/collections';\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { useDocumentActions } from '../../../hooks/useDocumentActions';\nimport { CLONE_PATH, LIST_PATH } from '../../../router';\n\nimport { DocumentActionsMenu } from './DocumentActions';\nimport { DocumentStatus } from './DocumentStatus';\n\nimport type {\n ContentManagerPlugin,\n DocumentActionComponent,\n} from '../../../../core/apis/content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HeaderProps {\n isCreating?: boolean;\n status?: 'draft' | 'published' | 'modified';\n title?: string;\n}\n\nconst Header = ({ isCreating, status, title: documentTitle = 'Untitled' }: HeaderProps) => {\n const { formatMessage } = useIntl();\n const isCloning = useMatch(CLONE_PATH) !== null;\n\n const title = isCreating\n ? formatMessage({\n id: 'content-manager.containers.edit.title.new',\n defaultMessage: 'Create an entry',\n })\n : documentTitle;\n\n return (\n <Flex direction=\"column\" alignItems=\"flex-start\" paddingTop={8} paddingBottom={4} gap={3}>\n <BackButton />\n <Flex\n width=\"100%\"\n justifyContent=\"space-between\"\n paddingTop={1}\n gap=\"80px\"\n alignItems=\"flex-start\"\n >\n <Typography variant=\"alpha\" as=\"h1\">\n {title}\n </Typography>\n <HeaderToolbar />\n </Flex>\n {status ? <DocumentStatus status={isCloning ? 'draft' : status} /> : null}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderToolbar\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HeaderButtonAction {\n disabled?: boolean;\n label: string;\n icon?: React.ReactNode;\n /**\n * @default 'default'\n */\n type?: 'icon' | 'default';\n onClick?: (event: React.SyntheticEvent) => void;\n}\n\ninterface HeaderSelectAction {\n disabled?: boolean;\n label: string;\n options: Array<{\n disabled?: boolean;\n label: string;\n startIcon?: React.ReactNode;\n textValue?: string;\n value: string;\n }>;\n onSelect?: (value: string) => void;\n value?: string;\n}\n\ntype HeaderActionDescription = HeaderButtonAction | HeaderSelectAction;\n\n/**\n * @description Contains the document actions that have `position: header`, if there are\n * none we still render the menu because we render the information about the document there.\n */\nconst HeaderToolbar = () => {\n const { formatMessage } = useIntl();\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status = 'draft' },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>();\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('HeaderToolbar', (state) => state.plugins);\n\n return (\n <Flex gap={2}>\n <DescriptionComponentRenderer\n props={{\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n }}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getHeaderActions()}\n >\n {(actions) => {\n if (actions.length > 0) {\n return <HeaderActions actions={actions} />;\n } else {\n return null;\n }\n }}\n </DescriptionComponentRenderer>\n <DescriptionComponentRenderer\n props={{\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n }}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions()}\n >\n {(actions) => {\n const headerActions = actions.filter((action) => {\n const positions = Array.isArray(action.position) ? action.position : [action.position];\n return positions.includes('header');\n });\n\n return (\n <DocumentActionsMenu\n actions={headerActions}\n label={formatMessage({\n id: 'content-manager.containers.edit.header.more-actions',\n defaultMessage: 'More actions',\n })}\n >\n <Information activeTab={status} />\n </DocumentActionsMenu>\n );\n }}\n </DescriptionComponentRenderer>\n </Flex>\n );\n};\n\ninterface InformationProps {\n activeTab: 'draft' | 'published';\n}\n\nconst Information = ({ activeTab }: InformationProps) => {\n const { formatMessage } = useIntl();\n const { document, meta } = useDoc();\n\n if (!document || !document.id) {\n return null;\n }\n\n /**\n * Because in the backend separate entries are made for draft and published\n * documents, the creator fields are different for each of them. For example,\n * you could make your draft in January and then publish it for the first time\n * in Feb. This would make the createdAt value for the published entry in Feb\n * but really we want to show the document as a whole. The draft entry will also\n * never have the publishedAt values.\n *\n * So, we decipher which document to show the creator for based on the activeTab.\n */\n\n const createAndUpdateDocument =\n activeTab === 'draft'\n ? document\n : meta?.availableStatus.find((status) => status.publishedAt === null);\n\n const publishDocument =\n activeTab === 'published'\n ? document\n : meta?.availableStatus.find((status) => status.publishedAt !== null);\n\n const creator = createAndUpdateDocument?.[CREATED_BY_ATTRIBUTE_NAME]\n ? getDisplayName(createAndUpdateDocument[CREATED_BY_ATTRIBUTE_NAME], formatMessage)\n : null;\n\n const updator = createAndUpdateDocument?.[UPDATED_BY_ATTRIBUTE_NAME]\n ? getDisplayName(createAndUpdateDocument[UPDATED_BY_ATTRIBUTE_NAME], formatMessage)\n : null;\n\n const information: Array<{ isDisplayed?: boolean; label: string; value: React.ReactNode }> = [\n {\n isDisplayed: !!publishDocument?.[PUBLISHED_AT_ATTRIBUTE_NAME],\n label: formatMessage({\n id: 'content-manager.containers.edit.information.last-published.label',\n defaultMessage: 'Last published',\n }),\n value: formatMessage(\n {\n id: 'content-manager.containers.edit.information.last-published.value',\n defaultMessage: `Published {time}{isAnonymous, select, true {} other { by {author}}}`,\n },\n {\n time: (\n <RelativeTime timestamp={new Date(publishDocument?.[PUBLISHED_AT_ATTRIBUTE_NAME])} />\n ),\n isAnonymous: !publishDocument?.[PUBLISHED_BY_ATTRIBUTE_NAME],\n author: publishDocument?.[PUBLISHED_BY_ATTRIBUTE_NAME]\n ? getDisplayName(publishDocument?.[PUBLISHED_BY_ATTRIBUTE_NAME], formatMessage)\n : null,\n }\n ),\n },\n {\n isDisplayed: !!createAndUpdateDocument?.[UPDATED_AT_ATTRIBUTE_NAME],\n label: formatMessage({\n id: 'content-manager.containers.edit.information.last-draft.label',\n defaultMessage: 'Last draft',\n }),\n value: formatMessage(\n {\n id: 'content-manager.containers.edit.information.last-draft.value',\n defaultMessage: `Modified {time}{isAnonymous, select, true {} other { by {author}}}`,\n },\n {\n time: (\n <RelativeTime\n timestamp={new Date(createAndUpdateDocument?.[UPDATED_AT_ATTRIBUTE_NAME])}\n />\n ),\n isAnonymous: !updator,\n author: updator,\n }\n ),\n },\n {\n isDisplayed: !!createAndUpdateDocument?.[CREATED_AT_ATTRIBUTE_NAME],\n label: formatMessage({\n id: 'content-manager.containers.edit.information.document.label',\n defaultMessage: 'Document',\n }),\n value: formatMessage(\n {\n id: 'content-manager.containers.edit.information.document.value',\n defaultMessage: `Created {time}{isAnonymous, select, true {} other { by {author}}}`,\n },\n {\n time: (\n <RelativeTime\n timestamp={new Date(createAndUpdateDocument?.[CREATED_AT_ATTRIBUTE_NAME])}\n />\n ),\n isAnonymous: !creator,\n author: creator,\n }\n ),\n },\n ].filter((info) => info.isDisplayed);\n\n return (\n <Flex\n borderWidth=\"1px 0 0 0\"\n borderStyle=\"solid\"\n borderColor=\"neutral150\"\n direction=\"column\"\n marginTop={2}\n marginLeft=\"-4px\"\n marginRight=\"-4px\"\n as=\"dl\"\n padding={5}\n gap={3}\n alignItems=\"flex-start\"\n width=\"100%\"\n >\n {information.map((info) => (\n <Flex gap={1} direction=\"column\" alignItems=\"flex-start\" key={info.label}>\n <Typography as=\"dt\" variant=\"pi\" fontWeight=\"bold\">\n {info.label}\n </Typography>\n <Typography as=\"dd\" variant=\"pi\" textColor=\"neutral600\">\n {info.value}\n </Typography>\n </Flex>\n ))}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderActions\n * -----------------------------------------------------------------------------------------------*/\n\ninterface HeaderActionsProps {\n actions: Array<HeaderActionDescription & { id: string }>;\n}\n\nconst HeaderActions = ({ actions }: HeaderActionsProps) => {\n return (\n <Flex>\n {actions.map((action) => {\n if ('options' in action) {\n return (\n <SingleSelect\n key={action.id}\n size=\"S\"\n disabled={action.disabled}\n aria-label={action.label}\n // @ts-expect-error – the DS will handle numbers, but we're not allowing the API.\n onChange={action.onSelect}\n value={action.value}\n >\n {action.options.map(({ label, ...option }) => (\n <SingleSelectOption key={option.value} {...option}>\n {label}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n );\n } else {\n // TODO: add button handler\n return null;\n }\n })}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DocumentActionComponents\n * -----------------------------------------------------------------------------------------------*/\n\nconst ConfigureTheViewAction: DocumentActionComponent = ({ collectionType, model }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n\n return {\n label: formatMessage({\n id: 'app.links.configure-view',\n defaultMessage: 'Configure the view',\n }),\n icon: <StyledCog />,\n onClick: () => {\n navigate(`../${collectionType}/${model}/configurations/edit`);\n },\n position: 'header',\n };\n};\n\nConfigureTheViewAction.type = 'configure-the-view';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledCog = styled(Cog)`\n path {\n fill: currentColor;\n }\n`;\n\nconst EditTheModelAction: DocumentActionComponent = ({ model }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n\n return {\n label: formatMessage({\n id: 'content-manager.link-to-ctb',\n defaultMessage: 'Edit the model',\n }),\n icon: <StyledPencil />,\n onClick: () => {\n navigate(`/plugins/content-type-builder/content-types/${model}`);\n },\n position: 'header',\n };\n};\n\nEditTheModelAction.type = 'edit-the-model';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledPencil = styled(Pencil)`\n path {\n fill: currentColor;\n }\n`;\n\nconst DeleteAction: DocumentActionComponent = ({ documentId, model, collectionType, document }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const listViewPathMatch = useMatch(LIST_PATH);\n const canDelete = useDocumentRBAC('DeleteAction', (state) => state.canDelete);\n const { delete: deleteAction } = useDocumentActions();\n const { toggleNotification } = useNotification();\n const setSubmitting = useForm('DeleteAction', (state) => state.setSubmitting);\n\n return {\n disabled: !canDelete || !document,\n label: formatMessage({\n id: 'content-manager.actions.delete.label',\n defaultMessage: 'Delete document',\n }),\n icon: <StyledTrash />,\n dialog: {\n type: 'dialog',\n title: formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n }),\n content: (\n <Flex direction=\"column\" gap={2}>\n <Icon as={ExclamationMarkCircle} width=\"24px\" height=\"24px\" color=\"danger600\" />\n <Typography as=\"p\" variant=\"omega\" textAlign=\"center\">\n {formatMessage({\n id: 'content-manager.actions.delete.dialog.body',\n defaultMessage: 'Are you sure?',\n })}\n </Typography>\n </Flex>\n ),\n onConfirm: async () => {\n /**\n * If we have a match, we're in the list view\n * and therefore not in a form and shouldn't be\n * trying to set the submitting value.\n */\n if (!listViewPathMatch) {\n setSubmitting(true);\n }\n try {\n if (!documentId && collectionType !== SINGLE_TYPES) {\n console.error(\n \"You're trying to delete a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.delete.error',\n defaultMessage: 'An error occurred while trying to delete the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await deleteAction({\n documentId,\n model,\n collectionType,\n params: {\n locale: '*',\n },\n });\n\n if (!('error' in res)) {\n navigate({ pathname: `../${collectionType}/${model}` }, { replace: true });\n }\n } finally {\n if (!listViewPathMatch) {\n setSubmitting(false);\n }\n }\n },\n },\n variant: 'danger',\n position: ['header', 'table-row'],\n };\n};\n\nDeleteAction.type = 'delete';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledTrash = styled(Trash)`\n path {\n fill: currentColor;\n }\n`;\n\nconst DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction];\n\nexport { Header, DEFAULT_HEADER_ACTIONS };\nexport type { HeaderProps, HeaderActionDescription };\n","import * as React from 'react';\n\nimport { Flex, Typography } from '@strapi/design-system';\nimport { useQueryParams } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\nimport { useMatch } from 'react-router-dom';\n\nimport { DescriptionComponentRenderer } from '../../../../components/DescriptionComponentRenderer';\nimport { InjectionZone } from '../../../../components/InjectionZone';\nimport { useStrapiApp } from '../../../../features/StrapiApp';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { CLONE_PATH } from '../../../router';\n\nimport { DocumentActions } from './DocumentActions';\n\nimport type {\n ContentManagerPlugin,\n DocumentActionProps,\n PanelComponent,\n PanelComponentProps,\n} from '../../../../core/apis/content-manager';\n\ninterface PanelDescription {\n title: string;\n content: React.ReactNode;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Panels\n * -----------------------------------------------------------------------------------------------*/\n\nconst Panels = () => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>({\n status: 'draft',\n });\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('Panels', (state) => state.plugins);\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies PanelComponentProps;\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <DescriptionComponentRenderer\n props={props}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getEditViewSidePanels()}\n >\n {(panels) =>\n panels.map(({ content, id, ...description }) => (\n <Panel key={id} {...description}>\n {content}\n </Panel>\n ))\n }\n </DescriptionComponentRenderer>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Default Action Panels (CE)\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionsPanel: PanelComponent = () => {\n const { formatMessage } = useIntl();\n\n return {\n title: formatMessage({\n id: 'content-manager.containers.edit.panels.default.title',\n defaultMessage: 'Document',\n }),\n content: <ActionsPanelContent />,\n };\n};\n\nActionsPanel.type = 'actions';\n\nconst ActionsPanelContent = () => {\n const isCloning = useMatch(CLONE_PATH) !== null;\n const [\n {\n query: { status = 'draft' },\n },\n ] = useQueryParams<{ status: 'draft' | 'published' }>();\n const { model, id, document, meta, collectionType } = useDoc();\n const plugins = useStrapiApp('ActionsPanel', (state) => state.plugins);\n\n const props = {\n activeTab: status,\n model,\n documentId: id,\n document: isCloning ? undefined : document,\n meta: isCloning ? undefined : meta,\n collectionType,\n } satisfies DocumentActionProps;\n\n return (\n <Flex direction=\"column\" gap={2} width=\"100%\">\n <DescriptionComponentRenderer\n props={props}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions()}\n >\n {(actions) => <DocumentActions actions={actions} />}\n </DescriptionComponentRenderer>\n <InjectionZone area=\"contentManager.editView.right-links\" slug={model} />\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Panel\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PanelProps extends Pick<PanelDescription, 'title'> {\n children: React.ReactNode;\n}\n\nconst Panel = React.forwardRef<any, PanelProps>(({ children, title }, ref) => {\n return (\n <Flex\n ref={ref}\n as=\"aside\"\n aria-labelledby=\"additional-information\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n hasRadius\n paddingBottom={4}\n paddingLeft={4}\n paddingRight={4}\n paddingTop={4}\n shadow=\"tableShadow\"\n gap={3}\n direction=\"column\"\n justifyContent=\"stretch\"\n alignItems=\"flex-start\"\n >\n <Typography as=\"h2\" variant=\"sigma\" textTransform=\"uppercase\">\n {title}\n </Typography>\n {children}\n </Flex>\n );\n});\n\nexport { Panels, ActionsPanel };\nexport type { PanelDescription };\n","import { Box, Flex, Icon, Typography } from '@strapi/design-system';\nimport { ChevronRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslation } from '../../../utils/translations';\n\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\ntype ProhibitedCloningField = Contracts.CollectionTypes.ProhibitedCloningField;\ntype Reason = ProhibitedCloningField[1];\n\ninterface AutoCloneFailureModalBodyProps {\n prohibitedFields: ProhibitedCloningField[];\n}\n\nconst AutoCloneFailureModalBody = ({ prohibitedFields }: AutoCloneFailureModalBodyProps) => {\n const { formatMessage } = useIntl();\n\n const getDefaultErrorMessage = (reason: Reason) => {\n switch (reason) {\n case 'relation':\n return 'Duplicating the relation could remove it from the original entry.';\n case 'unique':\n return 'Identical values in a unique field are not allowed';\n default:\n return reason;\n }\n };\n\n return (\n <>\n <Typography variant=\"beta\">\n {formatMessage({\n id: getTranslation('containers.list.autoCloneModal.title'),\n defaultMessage: \"This entry can't be duplicated directly.\",\n })}\n </Typography>\n <Box marginTop={2}>\n <Typography textColor=\"neutral600\">\n {formatMessage({\n id: getTranslation('containers.list.autoCloneModal.description'),\n defaultMessage:\n \"A new entry will be created with the same content, but you'll have to change the following fields to save it.\",\n })}\n </Typography>\n </Box>\n <Flex marginTop={6} gap={2} direction=\"column\" alignItems=\"stretch\">\n {prohibitedFields.map(([fieldPath, reason]) => (\n <Flex\n direction=\"column\"\n gap={2}\n alignItems=\"flex-start\"\n borderColor=\"neutral200\"\n hasRadius\n padding={6}\n key={fieldPath.join()}\n >\n <Flex direction=\"row\" as=\"ol\">\n {fieldPath.map((pathSegment, index) => (\n <Typography fontWeight=\"semiBold\" as=\"li\" key={index}>\n {pathSegment}\n {index !== fieldPath.length - 1 && (\n <Icon\n as={ChevronRight}\n color=\"neutral500\"\n height={2}\n width={2}\n marginLeft={2}\n marginRight={2}\n />\n )}\n </Typography>\n ))}\n </Flex>\n <Typography as=\"p\" textColor=\"neutral600\">\n {formatMessage({\n id: getTranslation(`containers.list.autoCloneModal.error.${reason}`),\n defaultMessage: getDefaultErrorMessage(reason),\n })}\n </Typography>\n </Flex>\n ))}\n </Flex>\n </>\n );\n};\n\nexport { AutoCloneFailureModalBody };\nexport type { AutoCloneFailureModalBodyProps };\n","import * as React from 'react';\n\nimport { Button, Flex } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport { useQueryParams } from '@strapi/helper-plugin';\nimport { Duplicate, Pencil } from '@strapi/icons';\nimport { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport { DescriptionComponentRenderer } from '../../../../components/DescriptionComponentRenderer';\nimport { useNotification } from '../../../../features/Notifications';\nimport { useStrapiApp } from '../../../../features/StrapiApp';\nimport { isBaseQueryError } from '../../../../utils/baseQuery';\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { Document, useDoc } from '../../../hooks/useDocument';\nimport { useDocumentActions } from '../../../hooks/useDocumentActions';\nimport { DocumentActionsMenu } from '../../EditView/components/DocumentActions';\n\nimport { AutoCloneFailureModalBody } from './AutoCloneFailureModal';\n\nimport type {\n ContentManagerPlugin,\n DocumentActionComponent,\n DocumentActionProps,\n} from '../../../../core/apis/content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * TableActions\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TableActionsProps {\n document: Document;\n}\n\nconst TableActions = ({ document }: TableActionsProps) => {\n const { formatMessage } = useIntl();\n const { model, collectionType } = useDoc();\n const plugins = useStrapiApp('TableActions', (state) => state.plugins);\n\n const props: DocumentActionProps = {\n activeTab: null,\n model,\n documentId: document.documentId,\n collectionType,\n document,\n };\n\n return (\n <DescriptionComponentRenderer\n props={props}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions()}\n >\n {(actions) => {\n const tableRowActions = actions.filter((action) => {\n const positions = Array.isArray(action.position) ? action.position : [action.position];\n return positions.includes('table-row');\n });\n\n return (\n <DocumentActionsMenu\n actions={tableRowActions}\n label={formatMessage({\n id: 'content-manager.containers.list.table.row-actions',\n defaultMessage: 'Row action',\n })}\n variant=\"ghost\"\n />\n );\n }}\n </DescriptionComponentRenderer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TableActionComponents\n * -----------------------------------------------------------------------------------------------*/\n\nconst EditAction: DocumentActionComponent = ({ documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canRead } = useDocumentRBAC('EditAction', ({ canRead }) => ({ canRead }));\n const { toggleNotification } = useNotification();\n const [{ query }] = useQueryParams<{ plugins?: object }>();\n\n return {\n disabled: !canRead,\n icon: <StyledPencil />,\n label: formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to edit a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.edit.error',\n defaultMessage: 'An error occurred while trying to edit the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n navigate({\n pathname: documentId,\n search: stringify({\n plugins: query.plugins,\n }),\n });\n },\n };\n};\n\nEditAction.type = 'edit';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledPencil = styled(Pencil)`\n path {\n fill: currentColor;\n }\n`;\n\nconst CloneAction: DocumentActionComponent = ({ model, documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canCreate } = useDocumentRBAC('CloneAction', ({ canCreate }) => ({ canCreate }));\n const { toggleNotification } = useNotification();\n const { autoClone } = useDocumentActions();\n const [prohibitedFields, setProhibitedFields] = React.useState<\n Contracts.CollectionTypes.ProhibitedCloningField[]\n >([]);\n\n return {\n disabled: !canCreate,\n icon: <StyledDuplicate />,\n label: formatMessage({\n id: 'content-manager.actions.clone.label',\n defaultMessage: 'Duplicate',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to clone a document in the table without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.clone.error',\n defaultMessage: 'An error occurred while trying to clone the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await autoClone({ model, sourceId: documentId });\n\n if ('data' in res) {\n navigate(res.data.documentId);\n\n /**\n * We return true because we don't need to show a modal anymore.\n */\n return true;\n }\n\n if (\n isBaseQueryError(res.error) &&\n res.error.details &&\n typeof res.error.details === 'object' &&\n 'prohibitedFields' in res.error.details &&\n Array.isArray(res.error.details.prohibitedFields)\n ) {\n const prohibitedFields = res.error.details\n .prohibitedFields as Contracts.CollectionTypes.ProhibitedCloningField[];\n\n setProhibitedFields(prohibitedFields);\n }\n },\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.header',\n defaultMessage: 'Duplicate',\n }),\n content: <AutoCloneFailureModalBody prohibitedFields={prohibitedFields} />,\n footer: ({ onClose }) => {\n return (\n <Flex justifyContent=\"space-between\">\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n <LinkButton\n as={NavLink}\n // @ts-expect-error – the DS LinkButton can't infer props from the `as` prop component\n to={{\n pathname: `clone/${documentId}`,\n }}\n >\n {formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.create',\n defaultMessage: 'Create',\n })}\n </LinkButton>\n </Flex>\n );\n },\n },\n };\n};\n\nCloneAction.type = 'clone';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledDuplicate = styled(Duplicate)`\n path {\n fill: currentColor;\n }\n`;\n\nconst DEFAULT_TABLE_ROW_ACTIONS = [EditAction, CloneAction];\n\nexport { TableActions, DEFAULT_TABLE_ROW_ACTIONS };\n","/* eslint-disable check-file/filename-naming-convention */\n/**\n * This file can be removed when the content-manager is moved back to it's own plugin,\n * we would just add the APIs that plugin and continue to alias their methods on the\n * main StrapiApp class.\n */\n\nimport { ReviewWorkflowsPanel } from '../../../../ee/admin/src/content-manager/pages/EditView/components/ReviewWorkflowsPanel';\nimport { HistoryAction } from '../../content-manager/history/components/HistoryAction';\nimport {\n DEFAULT_ACTIONS,\n type DocumentActionDescription,\n} from '../../content-manager/pages/EditView/components/DocumentActions';\nimport {\n DEFAULT_HEADER_ACTIONS,\n type HeaderActionDescription,\n} from '../../content-manager/pages/EditView/components/Header';\nimport {\n ActionsPanel,\n type PanelDescription,\n} from '../../content-manager/pages/EditView/components/Panels';\nimport { DEFAULT_TABLE_ROW_ACTIONS } from '../../content-manager/pages/ListView/components/TableActions';\n\nimport type { PluginConfig } from './Plugin';\nimport type { DescriptionComponent } from '../../components/DescriptionComponentRenderer';\nimport type { Document } from '../../content-manager/hooks/useDocument';\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\n/* -------------------------------------------------------------------------------------------------\n * Configuration Types\n * -----------------------------------------------------------------------------------------------*/\n\ntype DescriptionReducer<Config extends object> = (prev: Config[]) => Config[];\n\ninterface Context {\n /**\n * This will ONLY be null, if the content-type\n * does not have draft & published enabled.\n */\n activeTab: 'draft' | 'published' | null;\n /**\n * Will be either 'single-types' | 'collection-types'\n */\n collectionType: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n document?: Document;\n /**\n * this will be undefined if someone is creating an entry.\n */\n documentId?: string;\n /**\n * this will be undefined if someone is creating an entry.\n */\n meta?: Contracts.CollectionTypes.DocumentMetadata;\n /**\n * The current content-type's model.\n */\n model: string;\n}\n\ninterface PanelComponentProps extends Context {}\n\ninterface PanelComponent extends DescriptionComponent<PanelComponentProps, PanelDescription> {\n /**\n * The defaults are added by Strapi only, if you're providing your own component,\n * you do not need to provide this.\n */\n type?: 'actions' | 'review-workflows' | 'releases';\n}\n\ninterface DocumentActionProps extends Context {}\n\ninterface DocumentActionComponent\n extends DescriptionComponent<DocumentActionProps, DocumentActionDescription> {\n type?:\n | 'clone'\n | 'configure-the-view'\n | 'delete'\n | 'discard'\n | 'edit'\n | 'edit-the-model'\n | 'history'\n | 'publish'\n | 'unpublish'\n | 'update';\n}\n\ninterface HeaderActionProps extends Context {}\n\ninterface HeaderActionComponent\n extends DescriptionComponent<HeaderActionProps, HeaderActionDescription> {}\n\n/* -------------------------------------------------------------------------------------------------\n * ContentManager plugin\n * -----------------------------------------------------------------------------------------------*/\n\nclass ContentManagerPlugin {\n /**\n * The following properties are the stored ones provided by any plugins registering with\n * the content-manager. The function calls however, need to be called at runtime in the\n * application, so instead we collate them and run them later with the complete list incl.\n * ones already registered & the context of the view.\n */\n documentActions: DocumentActionComponent[] = [\n ...DEFAULT_ACTIONS,\n ...DEFAULT_TABLE_ROW_ACTIONS,\n ...DEFAULT_HEADER_ACTIONS,\n HistoryAction,\n ];\n editViewSidePanels: PanelComponent[] = [ActionsPanel, ReviewWorkflowsPanel];\n headerActions: HeaderActionComponent[] = [];\n\n constructor() {}\n\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent>): void;\n addEditViewSidePanel(panels: PanelComponent[]): void;\n addEditViewSidePanel(panels: DescriptionReducer<PanelComponent> | PanelComponent[]) {\n if (Array.isArray(panels)) {\n this.editViewSidePanels = [...this.editViewSidePanels, ...panels];\n } else if (typeof panels === 'function') {\n this.editViewSidePanels = panels(this.editViewSidePanels);\n } else {\n throw new Error(\n `Expected the \\`panels\\` passed to \\`addEditViewSidePanel\\` to be an array or a function, but received ${getPrintableType(\n panels\n )}`\n );\n }\n }\n\n addDocumentAction(actions: DescriptionReducer<DocumentActionComponent>): void;\n addDocumentAction(actions: DocumentActionComponent[]): void;\n addDocumentAction(\n actions: DescriptionReducer<DocumentActionComponent> | DocumentActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n this.documentActions = [...this.documentActions, ...actions];\n } else if (typeof actions === 'function') {\n this.documentActions = actions(this.documentActions);\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n addDocumentHeaderAction(actions: DescriptionReducer<HeaderActionComponent>): void;\n addDocumentHeaderAction(actions: HeaderActionComponent[]): void;\n addDocumentHeaderAction(\n actions: DescriptionReducer<HeaderActionComponent> | HeaderActionComponent[]\n ) {\n if (Array.isArray(actions)) {\n this.headerActions = [...this.headerActions, ...actions];\n } else if (typeof actions === 'function') {\n this.headerActions = actions(this.headerActions);\n } else {\n throw new Error(\n `Expected the \\`actions\\` passed to \\`addDocumentHeaderAction\\` to be an array or a function, but received ${getPrintableType(\n actions\n )}`\n );\n }\n }\n\n get config() {\n return {\n id: 'content-manager',\n name: 'Content Manager',\n apis: {\n addDocumentAction: this.addDocumentAction.bind(this),\n addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),\n addEditViewSidePanel: this.addEditViewSidePanel.bind(this),\n getDocumentActions: () => this.documentActions,\n getHeaderActions: () => this.headerActions,\n getEditViewSidePanels: () => this.editViewSidePanels,\n },\n } satisfies PluginConfig;\n }\n}\n\n/* -------------------------------------------------------------------------------------------------\n * getPrintableType\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description Gets the human-friendly printable type name for the given value, for instance it will yield\n * `array` instead of `object`, as the native `typeof` operator would do.\n */\nconst getPrintableType = (value: unknown): string => {\n const nativeType = typeof value;\n\n if (nativeType === 'object') {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (value instanceof Object && value.constructor.name !== 'Object') {\n return value.constructor.name;\n }\n }\n\n return nativeType;\n};\n\nexport { ContentManagerPlugin };\nexport type {\n Context,\n DescriptionComponent,\n DescriptionReducer,\n PanelComponentProps,\n PanelComponent,\n PanelDescription,\n DocumentActionComponent,\n DocumentActionDescription,\n DocumentActionProps,\n HeaderActionComponent,\n HeaderActionDescription,\n HeaderActionProps,\n};\n","/* eslint-disable check-file/filename-naming-convention */\nimport { ComponentType } from 'react';\n\nimport invariant from 'invariant';\n\nimport type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { AnySchema } from 'yup';\n\ntype CustomFieldUID = `plugin::${string}.${string}` | `global::${string}`;\n\ntype CustomFieldOptionInput =\n | 'text'\n | 'checkbox'\n | 'checkbox-with-number-field'\n | 'select-default-boolean'\n | 'date'\n | 'select'\n | 'number'\n | 'boolean-radio-group'\n | 'select-date'\n | 'text-area-enum'\n | 'select-number'\n | 'radio-group';\n\ntype CustomFieldOptionName =\n | 'min'\n | 'minLength'\n | 'max'\n | 'maxLength'\n | 'required'\n | 'regex'\n | 'enum'\n | 'unique'\n | 'private'\n | 'default';\n\ninterface CustomFieldOption {\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n description: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n name: CustomFieldOptionName;\n type: CustomFieldOptionInput;\n defaultValue?: string | number | boolean | Date;\n}\n\ninterface CustomFieldOptionSection {\n sectionTitle:\n | (MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n })\n | null;\n items: CustomFieldOption[];\n}\n\ninterface CustomFieldOptions {\n base?: (CustomFieldOptionSection | CustomFieldOption)[];\n advanced?: (CustomFieldOptionSection | CustomFieldOption)[];\n validator?: () => Record<string, AnySchema>;\n}\n\ninterface CustomField {\n name: string;\n pluginId?: string;\n type: (typeof ALLOWED_TYPES)[number];\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n intlDescription: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n icon?: ComponentType;\n components: {\n Input: () => Promise<{ default?: ComponentType }>;\n };\n options?: CustomFieldOptions;\n}\n\nconst ALLOWED_TYPES = [\n 'biginteger',\n 'boolean',\n 'date',\n 'datetime',\n 'decimal',\n 'email',\n 'enumeration',\n 'float',\n 'integer',\n 'json',\n 'password',\n 'richtext',\n 'string',\n 'text',\n 'time',\n 'uid',\n] as const;\n\nconst ALLOWED_ROOT_LEVEL_OPTIONS = [\n 'min',\n 'minLength',\n 'max',\n 'maxLength',\n 'required',\n 'regex',\n 'enum',\n 'unique',\n 'private',\n 'default',\n] as const;\n\nclass CustomFields {\n customFields: Record<string, CustomField>;\n\n constructor() {\n this.customFields = {};\n }\n\n register = (customFields: CustomField | CustomField[]) => {\n if (Array.isArray(customFields)) {\n // If several custom fields are passed, register them one by one\n customFields.forEach((customField) => {\n this.register(customField);\n });\n } else {\n // Handle individual custom field\n const { name, pluginId, type, intlLabel, intlDescription, components, options } =\n customFields;\n\n // Ensure required attributes are provided\n invariant(name, 'A name must be provided');\n invariant(type, 'A type must be provided');\n invariant(intlLabel, 'An intlLabel must be provided');\n invariant(intlDescription, 'An intlDescription must be provided');\n invariant(components, 'A components object must be provided');\n invariant(components.Input, 'An Input component must be provided');\n\n // Ensure the type is valid\n invariant(\n ALLOWED_TYPES.includes(type),\n `Custom field type: '${type}' is not a valid Strapi type or it can't be used with a Custom Field`\n );\n\n // Ensure name has no special characters\n const isValidObjectKey = /^(?![0-9])[a-zA-Z0-9$_-]+$/g;\n invariant(\n isValidObjectKey.test(name),\n `Custom field name: '${name}' is not a valid object key`\n );\n\n // Ensure options have valid name paths\n const allFormOptions = [...(options?.base || []), ...(options?.advanced || [])];\n\n if (allFormOptions.length) {\n const optionPathValidations = allFormOptions.reduce(optionsValidationReducer, []);\n\n optionPathValidations.forEach(({ isValidOptionPath, errorMessage }) => {\n invariant(isValidOptionPath, errorMessage);\n });\n }\n\n // When no plugin is specified, default to the global namespace\n const uid: CustomFieldUID = pluginId ? `plugin::${pluginId}.${name}` : `global::${name}`;\n\n // Ensure the uid is unique\n const uidAlreadyUsed = Object.prototype.hasOwnProperty.call(this.customFields, uid);\n invariant(!uidAlreadyUsed, `Custom field: '${uid}' has already been registered`);\n\n this.customFields[uid] = customFields;\n }\n };\n\n getAll = () => {\n return this.customFields;\n };\n\n get = (uid: string): CustomField | undefined => {\n return this.customFields[uid];\n };\n}\n\ninterface OptionValidation {\n isValidOptionPath: boolean;\n errorMessage: string;\n}\n\nconst optionsValidationReducer = (\n acc: OptionValidation[],\n option: CustomFieldOptionSection | CustomFieldOption\n): OptionValidation[] => {\n if ('items' in option) {\n return option.items.reduce(optionsValidationReducer, acc);\n }\n\n if (!option.name) {\n acc.push({\n isValidOptionPath: false,\n errorMessage: \"The 'name' property is required on an options object\",\n });\n } else {\n acc.push({\n isValidOptionPath:\n option.name.startsWith('options') || ALLOWED_ROOT_LEVEL_OPTIONS.includes(option.name),\n errorMessage: `'${option.name}' must be prefixed with 'options.'`,\n });\n }\n\n return acc;\n};\n\nexport { type CustomField, CustomFields };\n","/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nexport interface PluginConfig\n extends Partial<Pick<Plugin, 'apis' | 'initializer' | 'injectionZones' | 'isReady'>> {\n name: string;\n id: string;\n}\n\nexport class Plugin {\n apis: Record<string, unknown>;\n initializer: React.ComponentType<{ setPlugin(pluginId: string): void }> | null;\n injectionZones: Record<\n string,\n Record<string, Array<{ name: string; Component: React.ComponentType }>>\n >;\n isReady: boolean;\n name: string;\n pluginId: PluginConfig['id'];\n\n constructor(pluginConf: PluginConfig) {\n this.apis = pluginConf.apis || {};\n this.initializer = pluginConf.initializer || null;\n this.injectionZones = pluginConf.injectionZones || {};\n this.isReady = pluginConf.isReady !== undefined ? pluginConf.isReady : true;\n this.name = pluginConf.name;\n this.pluginId = pluginConf.id;\n }\n\n getInjectedComponents(containerName: string, blockName: string) {\n try {\n return this.injectionZones[containerName][blockName] || [];\n } catch (err) {\n console.error('Cannot get injected component', err);\n\n return [];\n }\n }\n\n injectComponent(\n containerName: string,\n blockName: string,\n component: { name: string; Component: React.ComponentType }\n ) {\n try {\n this.injectionZones[containerName][blockName].push(component);\n } catch (err) {\n console.error('Cannot inject component', err);\n }\n }\n}\n","import * as React from 'react';\n\nimport { Permission, RBACContext, RBACContextValue } from '@strapi/helper-plugin';\nimport { produce } from 'immer';\n\nimport { useTypedSelector, useTypedDispatch } from '../core/store/hooks';\n\n/* -------------------------------------------------------------------------------------------------\n * RBACProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RBACProviderProps {\n children: React.ReactNode;\n permissions: Permission[];\n refetchPermissions: RBACContextValue['refetchPermissions'];\n}\n\nconst RBACProvider = ({ children, permissions, refetchPermissions }: RBACProviderProps) => {\n const allPermissions = useTypedSelector((state) => state.rbacProvider.allPermissions) ?? [];\n\n const dispatch = useTypedDispatch();\n\n React.useEffect(() => {\n dispatch(setPermissionsAction(permissions));\n\n return () => {\n dispatch(resetStoreAction());\n };\n }, [permissions, dispatch]);\n\n return (\n <RBACContext.Provider value={{ allPermissions, refetchPermissions }}>\n {children}\n </RBACContext.Provider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RBACReducer\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RBACState {\n allPermissions: null | Permission[];\n collectionTypesRelatedPermissions: Record<string, Record<string, Permission[]>>;\n}\n\nconst initialState = {\n allPermissions: null,\n collectionTypesRelatedPermissions: {},\n};\n\nconst RESET_STORE = 'StrapiAdmin/RBACProvider/RESET_STORE';\nconst SET_PERMISSIONS = 'StrapiAdmin/RBACProvider/SET_PERMISSIONS';\n\ninterface ResetStoreAction {\n type: typeof RESET_STORE;\n}\n\nconst resetStoreAction = (): ResetStoreAction => ({ type: RESET_STORE });\n\ninterface SetPermissionsAction {\n type: typeof SET_PERMISSIONS;\n permissions: Permission[];\n}\n\nconst setPermissionsAction = (\n permissions: SetPermissionsAction['permissions']\n): SetPermissionsAction => ({\n type: SET_PERMISSIONS,\n permissions,\n});\n\ntype Actions = ResetStoreAction | SetPermissionsAction;\n\nconst RBACReducer = (state: RBACState = initialState, action: Actions) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case SET_PERMISSIONS: {\n draftState.allPermissions = action.permissions;\n draftState.collectionTypesRelatedPermissions = action.permissions\n .filter((perm) => perm.subject)\n .reduce<Record<string, Record<string, Permission[]>>>((acc, current) => {\n const { subject, action } = current;\n\n if (!subject) return acc;\n\n if (!acc[subject]) {\n acc[subject] = {};\n }\n\n acc[subject] = acc[subject][action]\n ? { ...acc[subject], [action]: [...acc[subject][action], current] }\n : { ...acc[subject], [action]: [current] };\n\n return acc;\n }, {});\n break;\n }\n case RESET_STORE: {\n return initialState;\n }\n default:\n return state;\n }\n });\n\nexport { RBACProvider, RBACReducer, resetStoreAction, setPermissionsAction };\nexport type {\n RBACState,\n Actions,\n RBACProviderProps,\n ResetStoreAction,\n SetPermissionsAction,\n Permission,\n};\n","import * as React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { DragLayerMonitor, XYCoord, useDragLayer } from 'react-dnd';\n\nfunction getStyle(\n initialOffset: XYCoord | null,\n currentOffset: XYCoord | null,\n mouseOffset: XYCoord | null\n) {\n if (!initialOffset || !currentOffset || !mouseOffset) {\n return { display: 'none' };\n }\n\n const { x, y } = mouseOffset;\n\n return {\n transform: `translate(${x}px, ${y}px)`,\n };\n}\n\nexport interface DragLayerProps {\n renderItem: (item: {\n /**\n * TODO: it'd be great if we could make this a union where the type infers the item.\n */\n item: any;\n type: ReturnType<DragLayerMonitor['getItemType']>;\n }) => React.ReactNode;\n}\n\nconst DragLayer = ({ renderItem }: DragLayerProps) => {\n const { itemType, isDragging, item, initialOffset, currentOffset, mouseOffset } = useDragLayer(\n (monitor) => ({\n item: monitor.getItem(),\n itemType: monitor.getItemType(),\n initialOffset: monitor.getInitialSourceClientOffset(),\n currentOffset: monitor.getSourceClientOffset(),\n isDragging: monitor.isDragging(),\n mouseOffset: monitor.getClientOffset(),\n })\n );\n\n if (!isDragging) {\n return null;\n }\n\n return (\n <Box\n height=\"100%\"\n left={0}\n position=\"fixed\"\n pointerEvents=\"none\"\n top={0}\n zIndex={100}\n width=\"100%\"\n >\n <Box style={getStyle(initialOffset, currentOffset, mouseOffset)}>\n {renderItem({ type: itemType, item })}\n </Box>\n </Box>\n );\n};\n\nexport { DragLayer };\n","import { Flex, Typography } from '@strapi/design-system';\nimport { Cross, Drag, Pencil } from '@strapi/icons';\nimport styled from 'styled-components';\n\ninterface CardDragPreviewProps {\n label: string;\n isSibling?: boolean;\n}\n\nconst CardDragPreview = ({ label, isSibling = false }: CardDragPreviewProps) => {\n return (\n <FieldContainer\n background={isSibling ? 'neutral100' : 'primary100'}\n display=\"inline-flex\"\n gap={3}\n hasRadius\n justifyContent=\"space-between\"\n isSibling={isSibling}\n max-height={`${32 / 16}rem`}\n maxWidth=\"min-content\"\n >\n <Flex gap={3}>\n <DragButton alignItems=\"center\" cursor=\"all-scroll\" padding={3}>\n <Drag />\n </DragButton>\n\n <TypographyMaxWidth\n textColor={isSibling ? undefined : 'primary600'}\n fontWeight=\"bold\"\n ellipsis\n >\n {label}\n </TypographyMaxWidth>\n </Flex>\n\n <Flex>\n <ActionBox alignItems=\"center\">\n <Pencil />\n </ActionBox>\n\n <ActionBox alignItems=\"center\">\n <Cross />\n </ActionBox>\n </Flex>\n </FieldContainer>\n );\n};\n\nconst ActionBox = styled(Flex)`\n height: ${({ theme }) => theme.spaces[7]};\n\n &:last-child {\n padding: 0 ${({ theme }) => theme.spaces[3]};\n }\n`;\n\nconst DragButton = styled(ActionBox)`\n border-right: 1px solid ${({ theme }) => theme.colors.primary200};\n\n svg {\n width: ${12 / 16}rem;\n height: ${12 / 16}rem;\n }\n`;\n\nconst FieldContainer = styled(Flex)<{ isSibling: boolean }>`\n border: 1px solid\n ${({ theme, isSibling }) => (isSibling ? theme.colors.neutral150 : theme.colors.primary200)};\n\n svg {\n width: ${10 / 16}rem;\n height: ${10 / 16}rem;\n\n path {\n fill: ${({ theme, isSibling }) => (isSibling ? undefined : theme.colors.primary600)};\n }\n }\n`;\n\nconst TypographyMaxWidth = styled(Typography)`\n max-width: ${72 / 16}rem;\n`;\n\nexport { CardDragPreview };\nexport type { CardDragPreviewProps };\n","import { Flex, IconButton, Typography } from '@strapi/design-system';\nimport { CarretDown, Drag, Trash } from '@strapi/icons';\nimport styled from 'styled-components';\n\ninterface ComponentDragPreviewProps {\n displayedValue: string;\n}\n\nconst ComponentDragPreview = ({ displayedValue }: ComponentDragPreviewProps) => {\n return (\n <Flex\n background=\"neutral0\"\n borderColor=\"neutral200\"\n justifyContent=\"space-between\"\n gap={3}\n padding={3}\n width={`${300 / 16}rem`}\n >\n <ToggleButton type=\"button\">\n <Flex gap={6}>\n <DropdownIconWrapper\n alignItems=\"center\"\n justifyContent=\"center\"\n background=\"neutral200\"\n height={`${32 / 16}rem`}\n width={`${32 / 16}rem`}\n >\n <CarretDown />\n </DropdownIconWrapper>\n\n <Flex maxWidth={`${150 / 16}rem`}>\n <Typography textColor=\"neutral700\" ellipsis>\n {displayedValue}\n </Typography>\n </Flex>\n </Flex>\n </ToggleButton>\n\n <Flex gap={2}>\n <IconButton aria-label=\"\" borderWidth={0}>\n <Trash />\n </IconButton>\n\n <IconButton aria-label=\"\" borderWidth={0}>\n <Drag />\n </IconButton>\n </Flex>\n </Flex>\n );\n};\n\nconst DropdownIconWrapper = styled(Flex)`\n border-radius: 50%;\n\n svg {\n height: ${6 / 16}rem;\n width: ${11 / 16}rem;\n > path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n }\n`;\n\n// TODO: we shouldn't have to reset a whole button\nconst ToggleButton = styled.button`\n border: none;\n background: transparent;\n display: block;\n width: 100%;\n text-align: unset;\n padding: 0;\n`;\n\nexport { ComponentDragPreview };\nexport type { ComponentDragPreviewProps };\n","export const ItemTypes = {\n COMPONENT: 'component',\n EDIT_FIELD: 'editField',\n FIELD: 'field',\n DYNAMIC_ZONE: 'dynamicZone',\n RELATION: 'relation',\n BLOCKS: 'blocks',\n} as const;\n","import * as React from 'react';\n\nexport type UseKeyboardDragAndDropCallbacks<TIndex extends number | Array<number> = number> = {\n onCancel?: (index: TIndex) => void;\n onDropItem?: (currentIndex: TIndex, newIndex?: TIndex) => void;\n onGrabItem?: (index: TIndex) => void;\n onMoveItem?: (newIndex: TIndex, currentIndex: TIndex) => void;\n};\n\n/**\n * Utility hook designed to implement keyboard accessibile drag and drop by\n * returning an onKeyDown handler to be passed to the drag icon button.\n *\n * @internal - You should use `useDragAndDrop` instead.\n */\nexport const useKeyboardDragAndDrop = <TIndex extends number | Array<number> = number>(\n active: boolean,\n index: TIndex,\n { onCancel, onDropItem, onGrabItem, onMoveItem }: UseKeyboardDragAndDropCallbacks<TIndex>\n) => {\n const [isSelected, setIsSelected] = React.useState(false);\n\n const handleMove = (movement: 'UP' | 'DOWN') => {\n if (!isSelected) {\n return;\n }\n if (typeof index === 'number' && onMoveItem) {\n if (movement === 'UP') {\n onMoveItem((index - 1) as TIndex, index);\n } else if (movement === 'DOWN') {\n onMoveItem((index + 1) as TIndex, index);\n }\n }\n };\n\n const handleDragClick = () => {\n if (isSelected) {\n if (onDropItem) {\n onDropItem(index);\n }\n setIsSelected(false);\n } else {\n if (onGrabItem) {\n onGrabItem(index);\n }\n setIsSelected(true);\n }\n };\n\n const handleCancel = () => {\n if (isSelected) {\n setIsSelected(false);\n\n if (onCancel) {\n onCancel(index);\n }\n }\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLButtonElement> = (e) => {\n if (!active) {\n return;\n }\n\n if (e.key === 'Tab' && !isSelected) {\n return;\n }\n\n e.preventDefault();\n\n switch (e.key) {\n case ' ':\n case 'Enter':\n handleDragClick();\n break;\n\n case 'Escape':\n handleCancel();\n break;\n\n case 'ArrowDown':\n case 'ArrowRight':\n handleMove('DOWN');\n break;\n\n case 'ArrowUp':\n case 'ArrowLeft':\n handleMove('UP');\n break;\n\n default:\n }\n };\n\n return handleKeyDown;\n};\n","import * as React from 'react';\n\nimport {\n useDrag,\n useDrop,\n type HandlerManager,\n type ConnectDragSource,\n type ConnectDropTarget,\n type ConnectDragPreview,\n type DragSourceMonitor,\n} from 'react-dnd';\n\nimport {\n useKeyboardDragAndDrop,\n type UseKeyboardDragAndDropCallbacks,\n} from './useKeyboardDragAndDrop';\n\nimport type { Entity } from '@strapi/types';\n\nconst DIRECTIONS = {\n UPWARD: 'upward',\n DOWNWARD: 'downward',\n} as const;\n\nconst DROP_SENSITIVITY = {\n REGULAR: 'regular',\n IMMEDIATE: 'immediate',\n} as const;\n\ninterface UseDragAndDropOptions<\n TIndex extends number | Array<number> = number,\n TItem extends { index: TIndex } = { index: TIndex }\n> extends UseKeyboardDragAndDropCallbacks<TIndex> {\n type?: string;\n index: TIndex;\n item?: TItem;\n onStart?: () => void;\n onEnd?: () => void;\n dropSensitivity?: (typeof DROP_SENSITIVITY)[keyof typeof DROP_SENSITIVITY];\n}\n\ntype Identifier = ReturnType<HandlerManager['getHandlerId']>;\n\ntype UseDragAndDropReturn<Element extends HTMLElement = HTMLElement> = [\n props: {\n handlerId: Identifier;\n isDragging: boolean;\n handleKeyDown: (event: React.KeyboardEvent<HTMLButtonElement>) => void;\n isOverDropTarget: boolean;\n direction: (typeof DIRECTIONS)[keyof typeof DIRECTIONS] | null;\n },\n objectRef: React.RefObject<Element>,\n dropRef: ConnectDropTarget,\n dragRef: ConnectDragSource,\n dragPreviewRef: ConnectDragPreview\n];\n\ntype DropCollectedProps = {\n handlerId: Identifier;\n isOver: boolean;\n};\n\n/**\n * A utility hook abstracting the general drag and drop hooks from react-dnd.\n * Centralising the same behaviours and by default offering keyboard support.\n */\nconst useDragAndDrop = <\n TIndex extends number | Array<number>,\n TItem extends { index: TIndex; id?: Entity.ID; [key: string]: unknown } = {\n index: TIndex;\n [key: string]: unknown;\n },\n Element extends HTMLElement = HTMLElement\n>(\n active: boolean,\n {\n type = 'STRAPI_DND',\n index,\n item,\n onStart,\n onEnd,\n onGrabItem,\n onDropItem,\n onCancel,\n onMoveItem,\n dropSensitivity = DROP_SENSITIVITY.REGULAR,\n }: UseDragAndDropOptions<TIndex, TItem>\n): UseDragAndDropReturn<Element> => {\n const objectRef = React.useRef<Element>(null);\n\n const [{ handlerId, isOver }, dropRef] = useDrop<TItem, void, DropCollectedProps>({\n accept: type,\n collect(monitor) {\n return {\n handlerId: monitor.getHandlerId(),\n isOver: monitor.isOver({ shallow: true }),\n };\n },\n drop(item) {\n const draggedIndex = item.index;\n const newIndex = index;\n\n if (isOver && onDropItem) {\n onDropItem(draggedIndex, newIndex);\n }\n },\n hover(item, monitor) {\n if (!objectRef.current || !onMoveItem) {\n return;\n }\n\n const dragIndex = item.index;\n const newIndex = index;\n\n const hoverBoundingRect = objectRef.current?.getBoundingClientRect();\n const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n const clientOffset = monitor.getClientOffset();\n if (!clientOffset) return;\n\n const hoverClientY = clientOffset && clientOffset.y - hoverBoundingRect.top;\n if (typeof dragIndex === 'number' && typeof newIndex === 'number') {\n if (dragIndex === newIndex) {\n // Don't replace items with themselves\n return;\n }\n\n if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {\n // Dragging downwards\n if (dragIndex < newIndex && hoverClientY < hoverMiddleY) {\n return;\n }\n\n // Dragging upwards\n if (dragIndex > newIndex && hoverClientY > hoverMiddleY) {\n return;\n }\n }\n\n // Time to actually perform the action\n onMoveItem(newIndex, dragIndex);\n item.index = newIndex;\n } else {\n // Using numbers as indices doesn't work for nested list items with path like [1, 1, 0]\n if (Array.isArray(dragIndex) && Array.isArray(newIndex)) {\n // Indices comparison to find item position in nested list\n const minLength = Math.min(dragIndex.length, newIndex.length);\n let areEqual = true;\n let isLessThan = false;\n let isGreaterThan = false;\n\n for (let i = 0; i < minLength; i++) {\n if (dragIndex[i] < newIndex[i]) {\n isLessThan = true;\n areEqual = false;\n break;\n } else if (dragIndex[i] > newIndex[i]) {\n isGreaterThan = true;\n areEqual = false;\n break;\n }\n }\n\n // Don't replace items with themselves\n if (areEqual && dragIndex.length === newIndex.length) {\n return;\n }\n\n if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {\n // Dragging downwards\n if (isLessThan && !isGreaterThan && hoverClientY < hoverMiddleY) {\n return;\n }\n\n // Dragging upwards\n if (isGreaterThan && !isLessThan && hoverClientY > hoverMiddleY) {\n return;\n }\n }\n }\n\n onMoveItem(newIndex, dragIndex);\n item.index = newIndex;\n }\n },\n });\n\n const getDragDirection = (monitor: DragSourceMonitor<TItem, void>) => {\n if (\n monitor &&\n monitor.isDragging() &&\n !monitor.didDrop() &&\n monitor.getInitialClientOffset() &&\n monitor.getClientOffset()\n ) {\n const deltaY = monitor.getInitialClientOffset()!.y - monitor.getClientOffset()!.y;\n\n if (deltaY > 0) return DIRECTIONS.UPWARD;\n\n if (deltaY < 0) return DIRECTIONS.DOWNWARD;\n\n return null;\n }\n\n return null;\n };\n\n const [{ isDragging, direction }, dragRef, dragPreviewRef] = useDrag({\n type,\n item() {\n if (onStart) {\n onStart();\n }\n\n /**\n * This will be attached and it helps define the preview sizes\n * when a component is flexy e.g. Relations\n */\n const { width } = objectRef.current?.getBoundingClientRect() ?? {};\n\n return { index, width, ...item };\n },\n end() {\n if (onEnd) {\n onEnd();\n }\n },\n canDrag: active,\n /**\n * This is useful when the item is in a virtualized list.\n * However, if we don't have an ID then we want the libraries\n * defaults to take care of this.\n */\n isDragging: item?.id\n ? (monitor) => {\n return item.id === monitor.getItem().id;\n }\n : undefined,\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n initialOffset: monitor.getInitialClientOffset(),\n currentOffset: monitor.getClientOffset(),\n direction: getDragDirection(monitor),\n }),\n });\n\n const handleKeyDown = useKeyboardDragAndDrop(active, index, {\n onGrabItem,\n onDropItem,\n onCancel,\n onMoveItem,\n });\n\n return [\n { handlerId, isDragging, handleKeyDown, isOverDropTarget: isOver, direction },\n objectRef,\n dropRef,\n dragRef,\n dragPreviewRef,\n ];\n};\n\nexport {\n useDragAndDrop,\n UseDragAndDropReturn,\n UseDragAndDropOptions,\n DIRECTIONS,\n DROP_SENSITIVITY,\n};\n","import { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\nimport { generateNKeysBetween } from 'fractional-indexing';\n\nimport { contentManagerApi } from './api';\n\nimport type { EntityService } from '@strapi/types';\nimport type { errors } from '@strapi/utils';\n\ninterface RelationResult extends Contracts.Relations.RelationResult {\n __temp_key__: string;\n}\n\ntype GetRelationsResponse =\n | {\n results: Array<RelationResult>;\n pagination: {\n page: NonNullable<EntityService.Params.Pagination.PageNotation['page']>;\n pageSize: NonNullable<EntityService.Params.Pagination.PageNotation['pageSize']>;\n pageCount: number;\n total: number;\n } | null;\n error?: never;\n }\n | {\n results?: never;\n pagination?: never;\n error: errors.ApplicationError | errors.YupValidationError;\n };\n\nconst relationsApi = contentManagerApi.injectEndpoints({\n endpoints: (build) => ({\n getRelations: build.query<\n GetRelationsResponse,\n Contracts.Relations.FindExisting.Params & {\n params?: Contracts.Relations.FindExisting.Request['query'];\n }\n >({\n query: ({ model, id, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${id}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n id: queryArgs.id,\n targetField: queryArgs.targetField,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n */\n const existingIds = currentCache.results.map((item) => item.documentId);\n const uniqueNewItems = newItems.results.filter(\n (item) => !existingIds.includes(item.documentId)\n );\n currentCache.results.push(...prepareTempKeys(uniqueNewItems, currentCache.results));\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = prepareTempKeys(newItems.results);\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: Contracts.Relations.FindExisting.Response) => {\n if ('results' in response && response.results) {\n return {\n ...response,\n results: prepareTempKeys(response.results.toReversed()),\n };\n } else {\n return response;\n }\n },\n }),\n searchRelations: build.query<\n Contracts.Relations.FindAvailable.Response,\n Contracts.Relations.FindAvailable.Params & {\n params?: Contracts.Relations.FindAvailable.Request['query'];\n }\n >({\n query: ({ model, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n targetField: queryArgs.targetField,\n _q: queryArgs.params?._q,\n idsToOmit: queryArgs.params?.idsToOmit,\n idsToInclude: queryArgs.params?.idsToInclude,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n */\n const existingIds = currentCache.results.map((item) => item.documentId);\n const uniqueNewItems = newItems.results.filter(\n (item) => !existingIds.includes(item.documentId)\n );\n currentCache.results.push(...uniqueNewItems);\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = newItems.results;\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: Contracts.Relations.FindAvailable.Response) => {\n if (response.results) {\n return {\n ...response,\n results: response.results,\n };\n } else {\n return response;\n }\n },\n }),\n }),\n});\n\n/**\n * @internal\n * @description Adds a `__temp_key__` to each relation item. This gives us\n * a stable identifier regardless of it's ids etc. that we can then use for drag and drop.\n */\nconst prepareTempKeys = (\n relations: Contracts.Relations.RelationResult[],\n existingRelations: RelationResult[] = []\n) => {\n const [firstItem] = existingRelations.slice(0);\n\n const keys = generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);\n\n return relations.map((datum, index) => ({\n ...datum,\n __temp_key__: keys[index],\n }));\n};\n\nconst { useGetRelationsQuery, useLazySearchRelationsQuery } = relationsApi;\n\nexport { useGetRelationsQuery, useLazySearchRelationsQuery };\nexport type { RelationResult };\n","import type { MainField } from './attributes';\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\n/**\n * @internal\n * @description Get the label of a relation, the contract has [key: string]: unknown,\n * so we need to check if the mainFieldKey is defined and if the relation has a value\n * under that property. If it does, we then verify it's type of string and return it.\n *\n * We fallback to the documentId.\n */\nconst getRelationLabel = (\n relation: Contracts.Relations.RelationResult,\n mainField?: MainField\n): string => {\n const label = mainField && relation[mainField.name] ? relation[mainField.name] : null;\n\n if (typeof label === 'string') {\n return label;\n }\n\n return relation.documentId;\n};\n\nexport { getRelationLabel };\n","import { createContext } from '../../../../../components/Context';\n\ninterface ComponentContextValue {\n /**\n * The id of the component. It will be undefined if the component\n * has not been created in the database yet. This could be on a new\n * or existing entry.\n */\n id?: number;\n /**\n * The level of the component. This is used to determine the nesting\n * of the component. The default is set to -1 so that the base level is 0\n * for the top level component, and increases by 1 for each level of nesting.\n */\n level: number;\n /**\n * The uid of the component. This is used to determine the type of the\n * component. Within an attribute, it is normally the `component` value.\n * It will be undefined if the hook is not called within the confines\n * of a provider.\n */\n uid?: string;\n /**\n * The type of component parent. It will be undefined if the hook\n * is not called within the confines of a provider.\n */\n type?: 'dynamiczone' | 'repeatable' | 'component';\n}\n\n/**\n * We use this component to wrap any individual component field in the Edit View,\n * this could be a component field in a dynamic zone, a component within a repeatable space,\n * or even nested components.\n *\n * We primarily need this to provide the component id to the components so that they can\n * correctly fetch their relations.\n */\nconst [ComponentProvider, useComponent] = createContext<ComponentContextValue>('ComponentContext', {\n id: undefined,\n level: -1,\n uid: undefined,\n type: undefined,\n});\n\nexport { ComponentProvider, useComponent };\n","import * as React from 'react';\n\nimport {\n Box,\n Combobox,\n ComboboxOption,\n Flex,\n Icon,\n IconButton,\n TextButton,\n Tooltip,\n Typography,\n VisuallyHidden,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport { useFocusInputField, useQueryParams } from '@strapi/helper-plugin';\nimport { Cross, Drag, Refresh } from '@strapi/icons';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport pipe from 'lodash/fp/pipe';\nimport { getEmptyImage } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\nimport styled from 'styled-components';\n\nimport { type InputProps, useField, useForm } from '../../../../../components/Form';\nimport { useNotification } from '../../../../../features/Notifications';\nimport { RelationDragPreviewProps } from '../../../../components/DragPreviews/RelationDragPreview';\nimport { COLLECTION_TYPES } from '../../../../constants/collections';\nimport { ItemTypes } from '../../../../constants/dragAndDrop';\nimport { useDoc } from '../../../../hooks/useDocument';\nimport { type EditFieldLayout } from '../../../../hooks/useDocumentLayout';\nimport {\n DROP_SENSITIVITY,\n UseDragAndDropOptions,\n useDragAndDrop,\n} from '../../../../hooks/useDragAndDrop';\nimport {\n useGetRelationsQuery,\n useLazySearchRelationsQuery,\n RelationResult,\n} from '../../../../services/relations';\nimport { buildValidParams } from '../../../../utils/api';\nimport { getRelationLabel } from '../../../../utils/relations';\nimport { getTranslation } from '../../../../utils/translations';\nimport { DocumentStatus } from '../DocumentStatus';\n\nimport { useComponent } from './ComponentContext';\n\nimport type { Attribute } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * RelationsField\n * -----------------------------------------------------------------------------------------------*/\nconst RELATIONS_TO_DISPLAY = 5;\nconst ONE_WAY_RELATIONS = ['oneWay', 'oneToOne', 'manyToOne', 'oneToManyMorph', 'oneToOneMorph'];\n\ntype RelationPosition =\n | (Pick<RelationResult, 'status' | 'locale'> & {\n before: string;\n end?: never;\n })\n | { end: boolean; before?: never; status?: never; locale?: never };\n\ninterface Relation extends Pick<RelationResult, 'documentId' | 'id' | 'locale' | 'status'> {\n href: string;\n label: string;\n position?: RelationPosition;\n __temp_key__: string;\n}\n\ninterface RelationsFieldProps\n extends Omit<Extract<EditFieldLayout, { type: 'relation' }>, 'size' | 'hint'>,\n Pick<InputProps, 'hint'> {}\n\ninterface RelationsFormValue {\n connect?: Relation[];\n disconnect?: Pick<RelationResult, 'documentId'>[];\n}\n\n/**\n * TODO: we get a rather ugly flash when we remove a single relation from the list leaving\n * no other relations when we press save. The initial relation re-renders, probably because\n * of the lag in the Form cleaning it's \"disconnect\" array, whilst our data has not been invalidated.\n *\n * Could we invalidate relation data on the document actions? Should we?\n */\n\n/**\n * @internal\n * @description The relations field holds a lot of domain logic for handling relations which is rather complicated\n * At present we do not expose this to plugin developers, however, they are able to overwrite it themselves should\n * they wish to do so.\n */\nconst RelationsField = React.forwardRef<HTMLDivElement, RelationsFieldProps>(\n ({ disabled, label, ...props }, ref) => {\n const [currentPage, setCurrentPage] = React.useState(1);\n const { document, model: documentModel } = useDoc();\n const documentId = document?.documentId;\n const { formatMessage } = useIntl();\n const [{ query }] = useQueryParams();\n const params = buildValidParams(query);\n\n const isMorph = props.attribute.relation.toLowerCase().includes('morph');\n const isDisabled = isMorph || disabled;\n\n const { id: componentId, uid } = useComponent('RelationsField', ({ uid, id }) => ({ id, uid }));\n\n /**\n * We'll always have a documentId in a created entry, so we look for a componentId first.\n * Same with `uid` and `documentModel`.\n */\n const id = componentId ? componentId.toString() : documentId;\n const model = uid ?? documentModel;\n\n /**\n * The `name` prop is a complete path to the field, e.g. `field1.field2.field3`.\n * Where the above example would a nested field within two components, however\n * we only require the field on the component not the complete path since we query\n * individual components. Therefore we split the string and take the last item.\n */\n const [targetField] = props.name.split('.').slice(-1);\n\n const { data, isLoading, isFetching } = useGetRelationsQuery(\n {\n model,\n targetField,\n // below we don't run the query if there is no id.\n id: id!,\n params: {\n ...params,\n pageSize: RELATIONS_TO_DISPLAY,\n page: currentPage,\n },\n },\n {\n refetchOnMountOrArgChange: true,\n skip: !id,\n selectFromResult: (result) => {\n return {\n ...result,\n data: {\n ...result.data,\n results: result.data?.results ? result.data.results : [],\n },\n };\n },\n }\n );\n\n const handleLoadMore = () => {\n setCurrentPage((prev) => prev + 1);\n };\n\n const field = useField(props.name);\n\n const isFetchingMoreRelations = isLoading || isFetching;\n\n const realServerRelationsCount =\n 'pagination' in data && data.pagination ? data.pagination.total : 0;\n /**\n * Items that are already connected, but reordered would be in\n * this list, so to get an accurate figure, we remove them.\n */\n const relationsConnected =\n (field.value?.connect ?? []).filter(\n (rel: Relation) => data.results.findIndex((relation) => relation.id === rel.id) === -1\n ).length ?? 0;\n const relationsDisconnected = field.value?.disconnect?.length ?? 0;\n\n const relationsCount = realServerRelationsCount + relationsConnected - relationsDisconnected;\n\n /**\n * This is it, the source of truth for reordering in conjunction with partial loading & updating\n * of relations. Relations on load are given __temp_key__ when fetched, because we don't want to\n * create brand new keys everytime the data updates, just keep adding them onto the newly loaded ones.\n */\n const relations = React.useMemo(() => {\n const ctx = {\n field: field.value,\n // @ts-expect-error – targetModel does exist on the attribute. But it's not typed.\n href: `../${COLLECTION_TYPES}/${props.attribute.targetModel}`,\n mainField: props.mainField,\n };\n\n /**\n * Tidy up our data.\n */\n const transformations = pipe(\n removeConnected(ctx),\n removeDisconnected(ctx),\n addLabelAndHref(ctx)\n );\n\n const transformedRels = transformations([...data.results]);\n\n /**\n * THIS IS CRUCIAL. If you don't sort by the __temp_key__ which comes from fractional indexing\n * then the list will be in the wrong order.\n */\n return [...transformedRels, ...(field.value?.connect ?? [])].sort((a, b) => {\n if (a.__temp_key__ < b.__temp_key__) return -1;\n if (a.__temp_key__ > b.__temp_key__) return 1;\n return 0;\n });\n }, [\n data.results,\n field.value,\n // @ts-expect-error – targetModel does exist on the attribute. But it's not typed.\n props.attribute.targetModel,\n props.mainField,\n ]);\n\n const handleConnect: RelationsInputProps['onChange'] = (relation) => {\n const [lastItemInList] = relations.slice(-1);\n\n const item = {\n ...relation,\n /**\n * If there's a last item, that's the first key we use to generate out next one.\n */\n __temp_key__: generateNKeysBetween(lastItemInList?.__temp_key__ ?? null, null, 1)[0],\n // Fallback to `id` if there is no `mainField` value, which will overwrite the above `id` property with the exact same data.\n [props.mainField?.name ?? 'id']: relation[props.mainField?.name ?? 'id'],\n label: getRelationLabel(relation, props.mainField),\n // @ts-expect-error – targetModel does exist on the attribute, but it's not typed.\n href: `../${COLLECTION_TYPES}/${props.attribute.targetModel}/${relation.documentId}`,\n };\n\n if (ONE_WAY_RELATIONS.includes(props.attribute.relation)) {\n field.onChange(`${props.name}.connect`, [item]);\n } else {\n field.onChange(`${props.name}.connect`, [...(field.value?.connect ?? []), item]);\n }\n };\n\n return (\n <Flex\n ref={ref}\n direction=\"column\"\n gap={3}\n justifyContent=\"space-between\"\n alignItems=\"stretch\"\n wrap=\"wrap\"\n >\n <StyledFlex direction=\"column\" alignItems=\"start\" gap={2} width=\"100%\">\n <RelationsInput\n disabled={isDisabled}\n id={id}\n label={`${label} ${relationsCount > 0 ? `(${relationsCount})` : ''}`}\n model={model}\n onChange={handleConnect}\n {...props}\n />\n {'pagination' in data &&\n data.pagination &&\n data.pagination.pageCount > data.pagination.page ? (\n <TextButton\n disabled={isFetchingMoreRelations}\n onClick={handleLoadMore}\n loading={isFetchingMoreRelations}\n startIcon={<Refresh />}\n // prevent the label from line-wrapping\n shrink={0}\n >\n {formatMessage({\n id: getTranslation('relation.loadMore'),\n defaultMessage: 'Load More',\n })}\n </TextButton>\n ) : null}\n </StyledFlex>\n <RelationsList\n data={relations}\n serverData={data.results}\n disabled={isDisabled}\n name={props.name}\n isLoading={isFetchingMoreRelations}\n relationType={props.attribute.relation}\n />\n </Flex>\n );\n }\n);\n\n/**\n * TODO: this can be removed once we stop shipping Inputs with\n * labels wrapped round in DS@2.\n */\nconst StyledFlex = styled(Flex)`\n & > div {\n width: 100%;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Relation Transformations\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TransformationContext extends Pick<RelationsFieldProps, 'mainField'> {\n field?: RelationsFormValue;\n href: string;\n}\n\n/**\n * If it's in the connected array, it can get out of our data array,\n * we'll be putting it back in later and sorting it anyway.\n */\nconst removeConnected =\n ({ field }: TransformationContext) =>\n (relations: RelationResult[]) => {\n return relations.filter((relation) => {\n const connectedRelations = field?.connect ?? [];\n\n return connectedRelations.findIndex((rel) => rel.documentId === relation.documentId) === -1;\n });\n };\n\n/**\n * @description Removes relations that are in the `disconnect` array of the field\n */\nconst removeDisconnected =\n ({ field }: TransformationContext) =>\n (relations: RelationResult[]): RelationResult[] =>\n relations.filter((relation) => {\n const disconnectedRelations = field?.disconnect ?? [];\n\n return (\n disconnectedRelations.findIndex((rel) => rel.documentId === relation.documentId) === -1\n );\n });\n\n/**\n * @description Adds a label and href to the relation object we use this to render\n * a better UI where we can link to the relation and display a human-readable label.\n */\nconst addLabelAndHref =\n ({ mainField, href }: TransformationContext) =>\n (relations: RelationResult[]): Relation[] =>\n relations.map((relation) => {\n return {\n ...relation,\n // Fallback to `id` if there is no `mainField` value, which will overwrite the above `id` property with the exact same data.\n [mainField?.name ?? 'id']: relation[mainField?.name ?? 'id'],\n label: getRelationLabel(relation, mainField),\n href: `${href}/${relation.documentId}`,\n };\n });\n\n/* -------------------------------------------------------------------------------------------------\n * RelationsInput\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RelationsInputProps extends Omit<RelationsFieldProps, 'type'> {\n id?: string;\n model: string;\n onChange: (\n relation: Pick<RelationResult, 'documentId' | 'id' | 'locale' | 'status'> & {\n [key: string]: any;\n }\n ) => void;\n}\n\n/**\n * @description Contains all the logic for the combobox that can search\n * for relations and then add them to the field's connect array.\n */\nconst RelationsInput = ({\n disabled,\n hint,\n id,\n label,\n model,\n name,\n mainField,\n placeholder,\n required,\n onChange,\n}: RelationsInputProps) => {\n const [textValue, setTextValue] = React.useState<string | undefined>('');\n const [searchParams, setSearchParams] = React.useState({\n _q: '',\n page: 1,\n });\n const { toggleNotification } = useNotification();\n const [{ query }] = useQueryParams();\n\n const { formatMessage } = useIntl();\n const fieldRef = useFocusInputField(name);\n const field = useField<RelationsFormValue>(name);\n\n const [searchForTrigger, { data, isLoading }] = useLazySearchRelationsQuery();\n\n /**\n * Because we're using a lazy query, we need to trigger the search\n * when the component mounts and when the search params change.\n * We also need to trigger the search when the field value changes\n * so that we can filter out the relations that are already connected.\n */\n React.useEffect(() => {\n /**\n * The `name` prop is a complete path to the field, e.g. `field1.field2.field3`.\n * Where the above example would a nested field within two components, however\n * we only require the field on the component not the complete path since we query\n * individual components. Therefore we split the string and take the last item.\n */\n const [targetField] = name.split('.').slice(-1);\n searchForTrigger({\n model,\n targetField,\n params: {\n ...buildValidParams(query),\n id: id ?? '',\n pageSize: 10,\n idsToInclude: field.value?.disconnect?.map((rel) => rel.documentId) ?? [],\n idsToOmit: field.value?.connect?.map((rel) => rel.documentId) ?? [],\n ...searchParams,\n },\n });\n }, [\n field.value?.connect,\n field.value?.disconnect,\n id,\n model,\n name,\n query,\n searchForTrigger,\n searchParams,\n ]);\n\n const handleSearch = async (search: string) => {\n setSearchParams((s) => ({ ...s, _q: search, page: 1 }));\n };\n\n const hasNextPage = data?.pagination ? data.pagination.page < data.pagination.pageCount : false;\n\n const options = data?.results ?? [];\n\n const handleChange = (relationId?: string) => {\n if (!relationId) {\n return;\n }\n\n const relation = options.find((opt) => opt.documentId === relationId);\n\n if (!relation) {\n // This is very unlikely to happen, but it ensures we don't have any data for.\n console.error(\n \"You've tried to add a relation with an id that does not exist in the options you can see, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: getTranslation('relation.error-adding-relation'),\n defaultMessage: 'An error occurred while trying to add the relation.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n /**\n * You need to give this relation a correct _temp_key_ but\n * this component doesn't know about those ones, you can't rely\n * on the connect array because that doesn't hold items that haven't\n * moved. So use a callback to fill in the gaps when connecting.\n *\n */\n onChange(relation);\n };\n\n const handleLoadMore = () => {\n if (!data || !data.pagination) {\n return;\n } else if (data.pagination.page < data.pagination.pageCount) {\n setSearchParams((s) => ({ ...s, page: s.page + 1 }));\n }\n };\n\n React.useLayoutEffect(() => {\n setTextValue('');\n }, [field.value]);\n\n return (\n <Combobox\n ref={fieldRef}\n autocomplete=\"none\"\n error={field.error}\n name={name}\n hint={hint}\n required={required}\n label={label}\n disabled={disabled}\n placeholder={\n placeholder ||\n formatMessage({\n id: getTranslation('relation.add'),\n defaultMessage: 'Add relation',\n })\n }\n hasMoreItems={hasNextPage}\n loading={isLoading}\n onOpenChange={() => {\n handleSearch(textValue ?? '');\n }}\n noOptionsMessage={() =>\n formatMessage({\n id: getTranslation('relation.notAvailable'),\n defaultMessage: 'No relations available',\n })\n }\n loadingMessage={formatMessage({\n id: getTranslation('relation.isLoading'),\n defaultMessage: 'Relations are loading',\n })}\n onLoadMore={handleLoadMore}\n textValue={textValue}\n onChange={handleChange}\n onTextValueChange={(text) => {\n setTextValue(text);\n }}\n onInputChange={(event) => {\n handleSearch(event.currentTarget.value);\n }}\n >\n {options.map((opt) => {\n const textValue = getRelationLabel(opt, mainField);\n\n return (\n <ComboboxOption key={opt.documentId} value={opt.documentId} textValue={textValue}>\n <Flex gap={2} justifyContent=\"space-between\">\n <Typography ellipsis>{textValue}</Typography>\n {opt.status ? <DocumentStatus status={opt.status} /> : null}\n </Flex>\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * RelationsList\n * -----------------------------------------------------------------------------------------------*/\nconst RELATION_ITEM_HEIGHT = 50;\nconst RELATION_GUTTER = 4;\n\ninterface RelationsListProps extends Pick<RelationsFieldProps, 'disabled' | 'name'> {\n data: Relation[];\n isLoading?: boolean;\n relationType: Attribute.Relation['relation'];\n /**\n * The existing relations connected on the server. We need these to diff against.\n */\n serverData: RelationResult[];\n}\n\nconst RelationsList = ({\n data,\n serverData,\n disabled,\n name,\n isLoading,\n relationType,\n}: RelationsListProps) => {\n const ariaDescriptionId = React.useId();\n const { formatMessage } = useIntl();\n const listRef = React.useRef<FixedSizeList>(null);\n const outerListRef = React.useRef<HTMLUListElement>(null);\n const [overflow, setOverflow] = React.useState<'top' | 'bottom' | 'top-bottom'>();\n const [liveText, setLiveText] = React.useState('');\n const field = useField(name);\n const removeFieldRow = useForm('RelationsList', (state) => state.removeFieldRow);\n const addFieldRow = useForm('RelationsList', (state) => state.addFieldRow);\n\n React.useEffect(() => {\n if (data.length <= RELATIONS_TO_DISPLAY) {\n return setOverflow(undefined);\n }\n\n const handleNativeScroll = (e: Event) => {\n const el = e.target as HTMLUListElement;\n const parentScrollContainerHeight = (el.parentNode as HTMLDivElement).scrollHeight;\n const maxScrollBottom = el.scrollHeight - el.scrollTop;\n\n if (el.scrollTop === 0) {\n return setOverflow('bottom');\n }\n\n if (maxScrollBottom === parentScrollContainerHeight) {\n return setOverflow('top');\n }\n\n return setOverflow('top-bottom');\n };\n\n const outerListRefCurrent = outerListRef?.current;\n\n if (!isLoading && data.length > 0 && outerListRefCurrent) {\n outerListRef.current.addEventListener('scroll', handleNativeScroll);\n }\n\n return () => {\n if (outerListRefCurrent) {\n outerListRefCurrent.removeEventListener('scroll', handleNativeScroll);\n }\n };\n }, [isLoading, data.length]);\n\n const getItemPos = (index: number) => `${index + 1} of ${data.length}`;\n\n const handleMoveItem: UseDragAndDropOptions['onMoveItem'] = (newIndex, oldIndex) => {\n const item = data[oldIndex];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.reorder'),\n defaultMessage: '{item}, moved. New position in list: {position}.',\n },\n {\n item: item.label ?? item.documentId,\n position: getItemPos(newIndex),\n }\n )\n );\n\n /**\n * Splicing mutates the array, so we need to create a new array\n */\n const newData = [...data];\n const currentRow = data[oldIndex];\n\n const startKey =\n oldIndex > newIndex ? newData[newIndex - 1]?.__temp_key__ : newData[newIndex]?.__temp_key__;\n const endKey =\n oldIndex > newIndex ? newData[newIndex]?.__temp_key__ : newData[newIndex + 1]?.__temp_key__;\n\n /**\n * We're moving the relation between two other relations, so\n * we need to generate a new key that keeps the order\n */\n const [newKey] = generateNKeysBetween(startKey, endKey, 1);\n\n newData.splice(oldIndex, 1);\n newData.splice(newIndex, 0, { ...currentRow, __temp_key__: newKey });\n\n /**\n * Now we diff against the server to understand what's different so we\n * can keep the connect array nice and tidy. It also needs reversing because\n * we reverse the relations from the server in the first place.\n */\n const connectedRelations = newData\n .reduce<Relation[]>((acc, relation, currentIndex, array) => {\n const relationOnServer = serverData.find(\n (oldRelation) => oldRelation.documentId === relation.documentId\n );\n\n const relationInFront = array[currentIndex + 1];\n\n if (!relationOnServer || relationOnServer.__temp_key__ !== relation.__temp_key__) {\n const position = relationInFront\n ? {\n before: relationInFront.documentId,\n locale: relationInFront.locale,\n status: relationInFront.status,\n }\n : { end: true };\n\n const relationWithPosition: Relation = { ...relation, position };\n\n return [...acc, relationWithPosition];\n }\n\n return acc;\n }, [])\n .toReversed();\n\n field.onChange(`${name}.connect`, connectedRelations);\n };\n\n const handleGrabItem: UseDragAndDropOptions['onGrabItem'] = (index) => {\n const item = data[index];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.grab-item'),\n defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`,\n },\n {\n item: item.label ?? item.documentId,\n position: getItemPos(index),\n }\n )\n );\n };\n\n const handleDropItem: UseDragAndDropOptions['onDropItem'] = (index) => {\n const { href: _href, label, ...item } = data[index];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.drop-item'),\n defaultMessage: `{item}, dropped. Final position in list: {position}.`,\n },\n {\n item: label ?? item.documentId,\n position: getItemPos(index),\n }\n )\n );\n };\n\n const handleCancel: UseDragAndDropOptions['onCancel'] = (index) => {\n const item = data[index];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('dnd.cancel-item'),\n defaultMessage: '{item}, dropped. Re-order cancelled.',\n },\n {\n item: item.label ?? item.documentId,\n }\n )\n );\n };\n\n const handleDisconnect: ListItemProps['data']['handleDisconnect'] = (relation) => {\n if (field.value && field.value.connect) {\n /**\n * A relation will exist in the `connect` array _if_ it has\n * been added without saving. In this case, we just remove it\n * from the connect array\n */\n const indexOfRelationInConnectArray = field.value.connect.findIndex(\n (rel: NonNullable<RelationsFormValue['connect']>[number]) =>\n rel.documentId === relation.documentId\n );\n\n if (indexOfRelationInConnectArray >= 0) {\n removeFieldRow(`${name}.connect`, indexOfRelationInConnectArray);\n return;\n }\n }\n\n addFieldRow(`${name}.disconnect`, { documentId: relation.documentId });\n };\n\n /**\n * These relation types will only ever have one item\n * in their list, so you can't reorder a single item!\n */\n const canReorder = !ONE_WAY_RELATIONS.includes(relationType);\n\n const dynamicListHeight =\n data.length > RELATIONS_TO_DISPLAY\n ? Math.min(data.length, RELATIONS_TO_DISPLAY) * (RELATION_ITEM_HEIGHT + RELATION_GUTTER) +\n RELATION_ITEM_HEIGHT / 2\n : Math.min(data.length, RELATIONS_TO_DISPLAY) * (RELATION_ITEM_HEIGHT + RELATION_GUTTER);\n\n return (\n <ShadowBox overflowDirection={overflow}>\n <VisuallyHidden id={ariaDescriptionId}>\n {formatMessage({\n id: getTranslation('dnd.instructions'),\n defaultMessage: `Press spacebar to grab and re-order`,\n })}\n </VisuallyHidden>\n <VisuallyHidden aria-live=\"assertive\">{liveText}</VisuallyHidden>\n {/* @ts-expect-error – width is expected, but we've not needed to pass it before. */}\n <FixedSizeList\n height={dynamicListHeight}\n ref={listRef}\n outerRef={outerListRef}\n itemCount={data.length}\n itemSize={RELATION_ITEM_HEIGHT + RELATION_GUTTER}\n itemData={{\n ariaDescribedBy: ariaDescriptionId,\n canDrag: canReorder,\n disabled,\n handleCancel,\n handleDropItem,\n handleGrabItem,\n handleMoveItem,\n name,\n handleDisconnect,\n relations: data,\n }}\n itemKey={(index) => data[index].id}\n innerElementType=\"ol\"\n >\n {ListItem}\n </FixedSizeList>\n </ShadowBox>\n );\n};\n\nconst ShadowBox = styled(Box)<{ overflowDirection?: 'top-bottom' | 'top' | 'bottom' }>`\n position: relative;\n overflow: hidden;\n flex: 1;\n\n &:before,\n &:after {\n position: absolute;\n width: 100%;\n height: 4px;\n z-index: 1;\n }\n\n &:before {\n /* TODO: as for DS Table component we would need this to be handled by the DS theme */\n content: '';\n background: linear-gradient(rgba(3, 3, 5, 0.2) 0%, rgba(0, 0, 0, 0) 100%);\n top: 0;\n opacity: ${({ overflowDirection }) =>\n overflowDirection === 'top-bottom' || overflowDirection === 'top' ? 1 : 0};\n transition: opacity 0.2s ease-in-out;\n }\n\n &:after {\n /* TODO: as for DS Table component we would need this to be handled by the DS theme */\n content: '';\n background: linear-gradient(0deg, rgba(3, 3, 5, 0.2) 0%, rgba(0, 0, 0, 0) 100%);\n bottom: 0;\n opacity: ${({ overflowDirection }) =>\n overflowDirection === 'top-bottom' || overflowDirection === 'bottom' ? 1 : 0};\n transition: opacity 0.2s ease-in-out;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * ListItem\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ListItemProps extends Pick<ListChildComponentProps, 'style' | 'index'> {\n data: {\n ariaDescribedBy: string;\n canDrag?: boolean;\n disabled?: boolean;\n handleCancel: UseDragAndDropOptions['onCancel'];\n handleDropItem: UseDragAndDropOptions['onDropItem'];\n handleGrabItem: UseDragAndDropOptions['onGrabItem'];\n handleMoveItem: UseDragAndDropOptions['onMoveItem'];\n handleDisconnect: (relation: Relation) => void;\n name: string;\n relations: Relation[];\n };\n}\n\nconst ListItem = ({ data, index, style }: ListItemProps) => {\n const {\n ariaDescribedBy,\n canDrag = false,\n disabled = false,\n handleCancel,\n handleDisconnect,\n handleDropItem,\n handleGrabItem,\n handleMoveItem,\n name,\n relations,\n } = data;\n const { formatMessage } = useIntl();\n\n const { href, documentId, label, status } = relations[index];\n\n const [{ handlerId, isDragging, handleKeyDown }, relationRef, dropRef, dragRef, dragPreviewRef] =\n useDragAndDrop<number, Omit<RelationDragPreviewProps, 'width'>, HTMLDivElement>(\n canDrag && !disabled,\n {\n type: `${ItemTypes.RELATION}_${name}`,\n index,\n item: {\n displayedValue: label,\n status,\n id: documentId,\n index,\n },\n onMoveItem: handleMoveItem,\n onDropItem: handleDropItem,\n onGrabItem: handleGrabItem,\n onCancel: handleCancel,\n dropSensitivity: DROP_SENSITIVITY.REGULAR,\n }\n );\n\n const composedRefs = useComposedRefs<HTMLDivElement>(relationRef, dragRef);\n\n React.useEffect(() => {\n dragPreviewRef(getEmptyImage());\n }, [dragPreviewRef]);\n\n return (\n <Box\n style={style}\n as=\"li\"\n ref={dropRef}\n aria-describedby={ariaDescribedBy}\n cursor={canDrag ? 'all-scroll' : 'default'}\n >\n {isDragging ? (\n <RelationItemPlaceholder />\n ) : (\n <Flex\n paddingTop={2}\n paddingBottom={2}\n paddingLeft={canDrag ? 2 : 4}\n paddingRight={4}\n hasRadius\n borderColor=\"neutral200\"\n background={disabled ? 'neutral150' : 'neutral0'}\n justifyContent=\"space-between\"\n ref={composedRefs}\n data-handler-id={handlerId}\n >\n <FlexWrapper gap={1}>\n {canDrag ? (\n <IconButton\n forwardedAs=\"div\"\n role=\"button\"\n tabIndex={0}\n aria-label={formatMessage({\n id: getTranslation('components.RelationInput.icon-button-aria-label'),\n defaultMessage: 'Drag',\n })}\n borderWidth={0}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n >\n <Drag />\n </IconButton>\n ) : null}\n <Flex width=\"100%\" minWidth={0} justifyContent=\"space-between\">\n <Box minWidth={0} paddingTop={1} paddingBottom={1} paddingRight={4}>\n <Tooltip description={label}>\n {href ? (\n <LinkEllipsis forwardedAs={NavLink} to={href}>\n {label}\n </LinkEllipsis>\n ) : (\n <Typography textColor={disabled ? 'neutral600' : 'primary600'} ellipsis>\n {label}\n </Typography>\n )}\n </Tooltip>\n </Box>\n {status ? <DocumentStatus status={status} /> : null}\n </Flex>\n </FlexWrapper>\n <Box paddingLeft={4}>\n <DisconnectButton\n disabled={disabled}\n type=\"button\"\n onClick={() => handleDisconnect(relations[index])}\n aria-label={formatMessage({\n id: getTranslation('relation.disconnect'),\n defaultMessage: 'Remove',\n })}\n >\n <Icon width=\"12px\" as={Cross} />\n </DisconnectButton>\n </Box>\n </Flex>\n )}\n </Box>\n );\n};\n\nconst FlexWrapper = styled(Flex)`\n width: 100%;\n /* Used to prevent endAction to be pushed out of container */\n min-width: 0;\n\n & > div[role='button'] {\n cursor: all-scroll;\n }\n`;\n\nconst DisconnectButton = styled.button`\n svg path {\n fill: ${({ theme, disabled }) =>\n disabled ? theme.colors.neutral600 : theme.colors.neutral500};\n }\n\n &:hover svg path,\n &:focus svg path {\n fill: ${({ theme, disabled }) => !disabled && theme.colors.neutral600};\n }\n`;\n\nconst LinkEllipsis = styled(Link)`\n display: block;\n\n & > span {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n display: block;\n }\n`;\n\nconst RelationItemPlaceholder = () => (\n <Box\n paddingTop={2}\n paddingBottom={2}\n paddingLeft={4}\n paddingRight={4}\n hasRadius\n borderStyle=\"dashed\"\n borderColor=\"primary600\"\n borderWidth=\"1px\"\n background=\"primary100\"\n height={`calc(100% - ${RELATION_GUTTER}px)`}\n />\n);\n\nexport { RelationsField as RelationsInput, FlexWrapper, DisconnectButton, LinkEllipsis };\nexport type { RelationsFieldProps };\n","import { Box, Flex, Icon, IconButton, Typography } from '@strapi/design-system';\nimport { Cross, Drag } from '@strapi/icons';\nimport { Entity } from '@strapi/types';\n\nimport { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport {\n DisconnectButton,\n LinkEllipsis,\n FlexWrapper,\n} from '../../pages/EditView/components/FormInputs/Relations';\n\ninterface RelationDragPreviewProps {\n status?: string;\n displayedValue: string;\n id: Entity.ID;\n index: number;\n width: number;\n}\n\nconst RelationDragPreview = ({ status, displayedValue, width }: RelationDragPreviewProps) => {\n return (\n <Box style={{ width }}>\n <Flex\n paddingTop={2}\n paddingBottom={2}\n paddingLeft={2}\n paddingRight={4}\n hasRadius\n borderWidth={1}\n background=\"neutral0\"\n borderColor=\"neutral200\"\n justifyContent=\"space-between\"\n >\n <FlexWrapper gap={1}>\n <IconButton aria-label=\"\" borderWidth={0}>\n <Drag />\n </IconButton>\n <Flex width=\"100%\" minWidth={0} justifyContent=\"space-between\">\n <Box minWidth={0} paddingTop={1} paddingBottom={1} paddingRight={4}>\n <LinkEllipsis href=\"\">\n <Typography textColor=\"primary600\" ellipsis>\n {displayedValue}\n </Typography>\n </LinkEllipsis>\n </Box>\n {status ? <DocumentStatus status={status} /> : null}\n </Flex>\n </FlexWrapper>\n <Box paddingLeft={4}>\n <DisconnectButton type=\"button\">\n <Icon width=\"12px\" as={Cross} />\n </DisconnectButton>\n </Box>\n </Flex>\n </Box>\n );\n};\n\nexport { RelationDragPreview };\nexport type { RelationDragPreviewProps };\n","import * as React from 'react';\n\nimport { useCollator, useFilter } from '@strapi/design-system';\nimport {\n SubNav,\n SubNavHeader,\n SubNavLink,\n SubNavSection,\n SubNavSections,\n} from '@strapi/design-system/v2';\nimport { useQueryParams } from '@strapi/helper-plugin';\nimport { parse, stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { useTypedSelector } from '../../core/store/hooks';\nimport { getTranslation } from '../utils/translations';\n\nconst LeftMenu = () => {\n const [search, setSearch] = React.useState('');\n const [{ query }] = useQueryParams<{ plugins?: object }>();\n const { formatMessage, locale } = useIntl();\n const collectionTypeLinks = useTypedSelector(\n (state) => state['content-manager_app'].collectionTypeLinks\n );\n const singleTypeLinks = useTypedSelector((state) => state['content-manager_app'].singleTypeLinks);\n\n const { startsWith } = useFilter(locale, {\n sensitivity: 'base',\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const menu = React.useMemo(\n () =>\n [\n {\n id: 'collectionTypes',\n title: formatMessage({\n id: getTranslation('components.LeftMenu.collection-types'),\n defaultMessage: 'Collection Types',\n }),\n searchable: true,\n links: collectionTypeLinks,\n },\n {\n id: 'singleTypes',\n title: formatMessage({\n id: getTranslation('components.LeftMenu.single-types'),\n defaultMessage: 'Single Types',\n }),\n searchable: true,\n links: singleTypeLinks,\n },\n ].map((section) => ({\n ...section,\n links: section.links\n /**\n * Filter by the search value\n */\n .filter((link) => startsWith(link.title, search))\n /**\n * Sort correctly using the language\n */\n .sort((a, b) => formatter.compare(a.title, b.title))\n /**\n * Apply the formated strings to the links from react-intl\n */\n .map((link) => {\n return {\n ...link,\n title: formatMessage({ id: link.title, defaultMessage: link.title }),\n };\n }),\n })),\n [collectionTypeLinks, search, singleTypeLinks, startsWith, formatMessage, formatter]\n );\n\n const handleClear = () => {\n setSearch('');\n };\n\n const handleChangeSearch = ({ target: { value } }: { target: { value: string } }) => {\n setSearch(value);\n };\n\n const label = formatMessage({\n id: getTranslation('header.name'),\n defaultMessage: 'Content',\n });\n\n return (\n <SubNav ariaLabel={label}>\n <SubNavHeader\n label={label}\n searchable\n value={search}\n onChange={handleChangeSearch}\n onClear={handleClear}\n searchLabel={formatMessage({\n id: 'content-manager.components.LeftMenu.Search.label',\n defaultMessage: 'Search for a content type',\n })}\n />\n <SubNavSections>\n {menu.map((section) => {\n return (\n <SubNavSection\n key={section.id}\n label={section.title}\n badgeLabel={section.links.length.toString()}\n >\n {section.links.map((link) => {\n return (\n <SubNavLink\n as={NavLink}\n key={link.uid}\n // @ts-expect-error – DS inference does not work with the `as` prop.\n to={{\n pathname: link.to,\n /**\n * We re-add the plugins query to the params available in the menu,\n * this means once you've changed the locale in the app, you continue\n * to see the same locale when changing content-type.\n *\n * NOTE: if you go to a content-type that does not have i18n enabled,\n * we return the default documents anyway.\n */\n search: stringify({\n ...parse(link.search ?? ''),\n plugins: query.plugins,\n }),\n }}\n >\n {link.title}\n </SubNavLink>\n );\n })}\n </SubNavSection>\n );\n })}\n </SubNavSections>\n </SubNav>\n );\n};\n\nexport { LeftMenu };\n","import { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\nimport { contentManagerApi } from './api';\n\nconst contentTypesApi = contentManagerApi.injectEndpoints({\n endpoints: (builder) => ({\n getContentTypeConfiguration: builder.query<\n Contracts.ContentTypes.FindContentTypeConfiguration.Response['data'],\n string\n >({\n query: (uid) => ({\n url: `/content-manager/content-types/${uid}/configuration`,\n method: 'GET',\n }),\n transformResponse: (response: Contracts.ContentTypes.FindContentTypeConfiguration.Response) =>\n response.data,\n providesTags: (_result, _error, uid) => [\n { type: 'ContentTypesConfiguration', id: uid },\n { type: 'ContentTypeSettings', id: 'LIST' },\n ],\n }),\n getAllContentTypeSettings: builder.query<\n Contracts.ContentTypes.FindContentTypesSettings.Response['data'],\n void\n >({\n query: () => '/content-manager/content-types-settings',\n transformResponse: (response: Contracts.ContentTypes.FindContentTypesSettings.Response) =>\n response.data,\n providesTags: [{ type: 'ContentTypeSettings', id: 'LIST' }],\n }),\n updateContentTypeConfiguration: builder.mutation<\n Contracts.ContentTypes.UpdateContentTypeConfiguration.Response['data'],\n Contracts.ContentTypes.UpdateContentTypeConfiguration.Request['body'] & {\n uid: string;\n }\n >({\n query: ({ uid, ...body }) => ({\n url: `/content-manager/content-types/${uid}/configuration`,\n method: 'PUT',\n data: body,\n }),\n transformResponse: (\n response: Contracts.ContentTypes.UpdateContentTypeConfiguration.Response\n ) => response.data,\n invalidatesTags: (_result, _error, { uid }) => [\n { type: 'ContentTypesConfiguration', id: uid },\n { type: 'ContentTypeSettings', id: 'LIST' },\n // Is this necessary?\n { type: 'InitialData' },\n ],\n }),\n }),\n});\n\nconst {\n useGetContentTypeConfigurationQuery,\n useGetAllContentTypeSettingsQuery,\n useUpdateContentTypeConfigurationMutation,\n} = contentTypesApi;\n\nexport {\n useGetContentTypeConfigurationQuery,\n useGetAllContentTypeSettingsQuery,\n useUpdateContentTypeConfigurationMutation,\n};\n","import { useEffect } from 'react';\n\nimport { useNotifyAT } from '@strapi/design-system';\nimport { Permission, hasPermissions, useRBACProvider } from '@strapi/helper-plugin';\nimport { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\n\nimport { HOOKS } from '../../constants';\nimport { useTypedDispatch, useTypedSelector } from '../../core/store/hooks';\nimport { useNotification } from '../../features/Notifications';\nimport { useStrapiApp } from '../../features/StrapiApp';\nimport { useAPIErrorHandler } from '../../hooks/useAPIErrorHandler';\nimport { COLLECTION_TYPES, SINGLE_TYPES } from '../constants/collections';\nimport { ContentManagerAppState, SET_INIT_DATA } from '../layout';\nimport { useGetAllContentTypeSettingsQuery } from '../services/contentTypes';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { getTranslation } from '../utils/translations';\n\nconst { MUTATE_COLLECTION_TYPES_LINKS, MUTATE_SINGLE_TYPES_LINKS } = HOOKS;\n\ninterface ContentManagerLink {\n permissions: Permission[];\n search: string | null;\n kind: string;\n title: string;\n to: string;\n uid: string;\n name: string;\n isDisplayed: boolean;\n}\n\nconst useContentManagerInitData = (): ContentManagerAppState => {\n const dispatch = useTypedDispatch();\n const { toggleNotification } = useNotification();\n const { allPermissions } = useRBACProvider();\n const runHookWaterfall = useStrapiApp(\n 'useContentManagerInitData',\n (state) => state.runHookWaterfall\n );\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n\n const state = useTypedSelector((state) => state['content-manager_app']);\n\n const initialDataQuery = useGetInitialDataQuery(undefined, {\n /**\n * TODO: remove this when the CTB has been refactored to use redux-toolkit-query\n * and it can invalidate the cache on mutation\n */\n refetchOnMountOrArgChange: true,\n });\n\n useEffect(() => {\n if (initialDataQuery.data) {\n notifyStatus(\n formatMessage({\n id: getTranslation('App.schemas.data-loaded'),\n defaultMessage: 'The schemas have been successfully loaded.',\n })\n );\n }\n }, [formatMessage, initialDataQuery.data, notifyStatus]);\n\n useEffect(() => {\n if (initialDataQuery.error) {\n toggleNotification({ type: 'danger', message: formatAPIError(initialDataQuery.error) });\n }\n }, [formatAPIError, initialDataQuery.error, toggleNotification]);\n\n const contentTypeSettingsQuery = useGetAllContentTypeSettingsQuery();\n\n useEffect(() => {\n if (contentTypeSettingsQuery.error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(contentTypeSettingsQuery.error),\n });\n }\n }, [formatAPIError, contentTypeSettingsQuery.error, toggleNotification]);\n\n const formatData = async (\n components: Contracts.Components.Component[],\n contentTypes: Contracts.ContentTypes.ContentType[],\n fieldSizes: Contracts.Init.GetInitData.Response['data']['fieldSizes'],\n contentTypeConfigurations: Contracts.ContentTypes.FindContentTypesSettings.Response['data']\n ) => {\n /**\n * We group these by the two types we support. We do with an object because we can use default\n * values of arrays to make sure we always have an array to manipulate further on if, for example,\n * a user has not made any single types.\n *\n * This means we have to manually add new content types to this hook if we add a new type – but\n * the safety is worth it.\n */\n const { collectionType: collectionTypeLinks, singleType: singleTypeLinks } =\n contentTypes.reduce<{\n collectionType: Contracts.ContentTypes.ContentType[];\n singleType: Contracts.ContentTypes.ContentType[];\n }>(\n (acc, model) => {\n acc[model.kind].push(model);\n return acc;\n },\n {\n collectionType: [],\n singleType: [],\n }\n );\n const collectionTypeSectionLinks = generateLinks(\n collectionTypeLinks,\n 'collectionTypes',\n contentTypeConfigurations\n );\n const singleTypeSectionLinks = generateLinks(singleTypeLinks, 'singleTypes');\n\n // Collection Types verifications\n const collectionTypeLinksPermissions = await Promise.all(\n collectionTypeSectionLinks.map(({ permissions }) =>\n hasPermissions(allPermissions, permissions)\n )\n );\n const authorizedCollectionTypeLinks = collectionTypeSectionLinks.filter(\n (_, index) => collectionTypeLinksPermissions[index]\n );\n\n // Single Types verifications\n const singleTypeLinksPermissions = await Promise.all(\n singleTypeSectionLinks.map(({ permissions }) => hasPermissions(allPermissions, permissions))\n );\n const authorizedSingleTypeLinks = singleTypeSectionLinks.filter(\n (_, index) => singleTypeLinksPermissions[index]\n );\n const { ctLinks } = runHookWaterfall(MUTATE_COLLECTION_TYPES_LINKS, {\n ctLinks: authorizedCollectionTypeLinks,\n models: contentTypes,\n });\n const { stLinks } = runHookWaterfall(MUTATE_SINGLE_TYPES_LINKS, {\n stLinks: authorizedSingleTypeLinks,\n models: contentTypes,\n });\n\n dispatch({\n type: SET_INIT_DATA,\n authorizedCollectionTypeLinks: ctLinks,\n authorizedSingleTypeLinks: stLinks,\n contentTypeSchemas: contentTypes,\n components,\n fieldSizes,\n });\n };\n\n useEffect(() => {\n if (initialDataQuery.data && contentTypeSettingsQuery.data) {\n formatData(\n initialDataQuery.data.components,\n initialDataQuery.data.contentTypes,\n initialDataQuery.data.fieldSizes,\n contentTypeSettingsQuery.data\n );\n }\n }, [initialDataQuery.data, contentTypeSettingsQuery.data]);\n\n return { ...state };\n};\n\nconst generateLinks = (\n links: Contracts.ContentTypes.ContentType[],\n type: 'collectionTypes' | 'singleTypes',\n configurations: Contracts.ContentTypes.FindContentTypesSettings.Response['data'] = []\n) => {\n return links\n .filter((link) => link.isDisplayed)\n .map((link) => {\n const collectionTypesPermissions = [\n { action: 'plugin::content-manager.explorer.create', subject: link.uid },\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const singleTypesPermissions = [\n { action: 'plugin::content-manager.explorer.read', subject: link.uid },\n ];\n const permissions =\n type === 'collectionTypes' ? collectionTypesPermissions : singleTypesPermissions;\n\n const currentContentTypeConfig = configurations.find(({ uid }) => uid === link.uid);\n\n let search = null;\n\n if (currentContentTypeConfig) {\n const searchParams = {\n page: 1,\n pageSize: currentContentTypeConfig.settings.pageSize,\n sort: `${currentContentTypeConfig.settings.defaultSortBy}:${currentContentTypeConfig.settings.defaultSortOrder}`,\n };\n\n search = stringify(searchParams, { encode: false });\n }\n\n return {\n permissions,\n search,\n kind: link.kind,\n title: link.info.displayName,\n to: `/content-manager/${link.kind === 'collectionType' ? COLLECTION_TYPES : SINGLE_TYPES}/${\n link.uid\n }`,\n uid: link.uid,\n // Used for the list item key in the helper plugin\n name: link.uid,\n isDisplayed: link.isDisplayed,\n } satisfies ContentManagerLink;\n });\n};\n\nexport { useContentManagerInitData };\nexport type { ContentManagerLink };\n","/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { AnyAction } from '@reduxjs/toolkit';\nimport { Layout as DSLayout } from '@strapi/design-system';\nimport { produce } from 'immer';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { Navigate, Outlet, useLocation, useMatch } from 'react-router-dom';\n\nimport { DragLayer, DragLayerProps } from '../components/DragLayer';\nimport { useGuidedTour } from '../components/GuidedTour/Provider';\nimport { Page } from '../components/PageHelpers';\n\nimport { CardDragPreview } from './components/DragPreviews/CardDragPreview';\nimport { ComponentDragPreview } from './components/DragPreviews/ComponentDragPreview';\nimport { RelationDragPreview } from './components/DragPreviews/RelationDragPreview';\nimport { LeftMenu } from './components/LeftMenu';\nimport { ItemTypes } from './constants/dragAndDrop';\nimport { useIsHistoryRoute } from './history/routes';\nimport { useContentManagerInitData } from './hooks/useContentManagerInitData';\nimport { getTranslation } from './utils/translations';\n\nimport type { ContentManagerLink } from './hooks/useContentManagerInitData';\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\n\n/* -------------------------------------------------------------------------------------------------\n * Layout\n * -----------------------------------------------------------------------------------------------*/\n\nconst Layout = () => {\n const contentTypeMatch = useMatch('/content-manager/:kind/:uid/*');\n\n const { isLoading, collectionTypeLinks, models, singleTypeLinks } = useContentManagerInitData();\n const authorisedModels = [...collectionTypeLinks, ...singleTypeLinks].sort((a, b) =>\n a.title.localeCompare(b.title)\n );\n\n const { pathname } = useLocation();\n const { formatMessage } = useIntl();\n const startSection = useGuidedTour('Layout', (state) => state.startSection);\n const startSectionRef = React.useRef(startSection);\n\n // Check if we're on a history route to known if we should render the left menu\n const isHistoryRoute = useIsHistoryRoute();\n\n React.useEffect(() => {\n if (startSectionRef.current) {\n startSectionRef.current('contentManager');\n }\n }, []);\n\n if (isLoading) {\n return (\n <>\n <Helmet\n title={formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n />\n <Page.Loading />\n </>\n );\n }\n\n // Array of models that are displayed in the content manager\n const supportedModelsToDisplay = models.filter(({ isDisplayed }) => isDisplayed);\n\n // Redirect the user to the 403 page\n if (\n authorisedModels.length === 0 &&\n supportedModelsToDisplay.length > 0 &&\n pathname !== '/content-manager/403'\n ) {\n return <Navigate to=\"/403\" />;\n }\n\n // Redirect the user to the create content type page\n if (supportedModelsToDisplay.length === 0 && pathname !== '/no-content-types') {\n return <Navigate to=\"/no-content-types\" />;\n }\n\n if (!contentTypeMatch && authorisedModels.length > 0) {\n return (\n <Navigate\n to={{\n pathname: authorisedModels[0].to,\n search: authorisedModels[0].search ?? '',\n }}\n />\n );\n }\n\n return (\n <>\n <Helmet\n title={formatMessage({\n id: getTranslation('plugin.name'),\n defaultMessage: 'Content Manager',\n })}\n />\n {isHistoryRoute ? (\n <Outlet />\n ) : (\n <DSLayout sideNav={<LeftMenu />}>\n <DragLayer renderItem={renderDraglayerItem} />\n <Outlet />\n </DSLayout>\n )}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * renderDraglayerItem\n * -----------------------------------------------------------------------------------------------*/\n\nfunction renderDraglayerItem({ type, item }: Parameters<DragLayerProps['renderItem']>[0]) {\n if (!type || (type && typeof type !== 'string')) {\n return null;\n }\n\n /**\n * Because a user may have multiple relations / dynamic zones / repeable fields in the same content type,\n * we append the fieldName for the item type to make them unique, however, we then want to extract that\n * first type to apply the correct preview.\n */\n const [actualType] = type.split('_');\n\n switch (actualType) {\n case ItemTypes.EDIT_FIELD:\n case ItemTypes.FIELD:\n return <CardDragPreview label={item.label} />;\n case ItemTypes.COMPONENT:\n case ItemTypes.DYNAMIC_ZONE:\n return <ComponentDragPreview displayedValue={item.displayedValue} />;\n\n case ItemTypes.RELATION:\n return <RelationDragPreview {...item} />;\n\n default:\n return null;\n }\n}\n\n/* -------------------------------------------------------------------------------------------------\n * reducer\n * -----------------------------------------------------------------------------------------------*/\n\nexport const SET_INIT_DATA = 'ContentManager/App/SET_INIT_DATA';\n\ninterface SetInitDataAction {\n type: typeof SET_INIT_DATA;\n authorizedCollectionTypeLinks: ContentManagerAppState['collectionTypeLinks'];\n authorizedSingleTypeLinks: ContentManagerAppState['singleTypeLinks'];\n components: ContentManagerAppState['components'];\n contentTypeSchemas: ContentManagerAppState['models'];\n fieldSizes: ContentManagerAppState['fieldSizes'];\n}\n\ninterface ContentManagerAppState {\n collectionTypeLinks: ContentManagerLink[];\n components: Contracts.Init.GetInitData.Response['data']['components'];\n fieldSizes: Contracts.Init.GetInitData.Response['data']['fieldSizes'];\n models: Contracts.Init.GetInitData.Response['data']['contentTypes'];\n singleTypeLinks: ContentManagerLink[];\n isLoading: boolean;\n}\n\nconst initialState = {\n collectionTypeLinks: [],\n components: [],\n fieldSizes: {},\n models: [],\n singleTypeLinks: [],\n isLoading: true,\n} satisfies ContentManagerAppState;\n\nconst reducer = (state: ContentManagerAppState = initialState, action: AnyAction) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case SET_INIT_DATA: {\n const initDataAction = action as SetInitDataAction;\n draftState.collectionTypeLinks = initDataAction.authorizedCollectionTypeLinks.filter(\n ({ isDisplayed }) => isDisplayed\n );\n draftState.singleTypeLinks = initDataAction.authorizedSingleTypeLinks.filter(\n ({ isDisplayed }) => isDisplayed\n );\n draftState.components = initDataAction.components;\n draftState.models = initDataAction.contentTypeSchemas;\n draftState.fieldSizes = initDataAction.fieldSizes;\n draftState.isLoading = false;\n break;\n }\n default:\n return draftState;\n }\n });\n\nexport { Layout, reducer };\nexport type { ContentManagerAppState };\n","import { createSlice, type PayloadAction } from '@reduxjs/toolkit';\n\nimport type { Permission } from '@strapi/helper-plugin';\n\ninterface SyncRbacState {\n permissions: Permission[] | undefined;\n}\n\nconst initialState: SyncRbacState = {\n permissions: undefined,\n};\n\nconst rbacSlice = createSlice({\n name: 'rbac',\n initialState,\n reducers: {\n setPermissions(\n state,\n action: PayloadAction<{\n permissions: Record<string, Permission[]>;\n __meta__?: {\n plugins?: object;\n containerName: string;\n };\n }>\n ) {\n state.permissions = Object.values(action.payload.permissions).reduce<\n NonNullable<SyncRbacState['permissions']>\n >((acc, current) => {\n return [...acc, ...current];\n }, []);\n },\n resetPermissions(state) {\n state.permissions = undefined;\n },\n },\n});\n\nconst { actions, reducer } = rbacSlice;\nconst { setPermissions, resetPermissions } = actions;\n\nexport { reducer, setPermissions, resetPermissions };\nexport type { SyncRbacState };\n","import { combineReducers } from '@reduxjs/toolkit';\n\nimport { reducer as rbacReducer } from './rbac';\n\nconst reducer = combineReducers({\n rbac: rbacReducer,\n});\n\nexport { reducer };\n","import {\n configureStore,\n StoreEnhancer,\n Middleware,\n Reducer,\n combineReducers,\n} from '@reduxjs/toolkit';\n\nimport { RBACReducer, RBACState } from '../../components/RBACProvider';\nimport { reducer as cmAppReducer, ContentManagerAppState } from '../../content-manager/layout';\nimport { reducer as contentManagerReducers } from '../../content-manager/modules/reducers';\nimport { contentManagerApi } from '../../content-manager/services/api';\nimport { reducer as appReducer, AppState } from '../../reducer';\nimport { adminApi } from '../../services/api';\n\n/**\n * @description Static reducers are ones we know, they live in the admin package.\n */\nconst staticReducers = {\n [adminApi.reducerPath]: adminApi.reducer,\n admin_app: appReducer,\n rbacProvider: RBACReducer,\n 'content-manager_app': cmAppReducer,\n [contentManagerApi.reducerPath]: contentManagerApi.reducer,\n 'content-manager': contentManagerReducers,\n} as const;\n\nconst injectReducerStoreEnhancer: (appReducers: Record<string, Reducer>) => StoreEnhancer =\n (appReducers) =>\n (next) =>\n (...args) => {\n const store = next(...args);\n\n const asyncReducers: Record<string, Reducer> = {};\n\n return {\n ...store,\n asyncReducers,\n injectReducer: (key: string, asyncReducer: Reducer) => {\n asyncReducers[key] = asyncReducer;\n store.replaceReducer(\n // @ts-expect-error we dynamically add reducers which makes the types uncomfortable.\n combineReducers({\n ...appReducers,\n ...asyncReducers,\n })\n );\n },\n };\n };\n\ntype PreloadState = Partial<{\n admin_app: AppState;\n}>;\n\n/**\n * @description This is the main store configuration function, injected Reducers use our legacy app.addReducer API,\n * which we're trying to phase out. App Middlewares could potentially be improved...?\n */\nconst configureStoreImpl = (\n preloadedState: PreloadState = {},\n appMiddlewares: Array<() => Middleware> = [],\n injectedReducers: Record<string, Reducer> = {}\n) => {\n const coreReducers = { ...staticReducers, ...injectedReducers } as const;\n\n const defaultMiddlewareOptions = {} as any;\n\n // These are already disabled in 'production' env but we also need to disable it in test environments\n // However, we want to leave them on for development so any issues can still be caught\n if (process.env.NODE_ENV === 'test') {\n defaultMiddlewareOptions.serializableCheck = false;\n defaultMiddlewareOptions.immutableCheck = false;\n }\n\n const store = configureStore({\n preloadedState: {\n admin_app: preloadedState.admin_app,\n },\n reducer: coreReducers,\n devTools: process.env.NODE_ENV !== 'production',\n middleware: (getDefaultMiddleware) => [\n ...getDefaultMiddleware(defaultMiddlewareOptions),\n adminApi.middleware,\n contentManagerApi.middleware,\n ...appMiddlewares.map((m) => m()),\n ],\n enhancers: [injectReducerStoreEnhancer(coreReducers)],\n });\n\n return store;\n};\n\ntype Store = ReturnType<typeof configureStoreImpl> & {\n asyncReducers: Record<string, Reducer>;\n injectReducer: (key: string, asyncReducer: Reducer) => void;\n};\n\ntype RootState = ReturnType<Store['getState']>;\n\ntype Dispatch = Store['dispatch'];\n\nexport { configureStoreImpl as configureStore };\nexport type {\n RootState,\n Dispatch,\n AppState,\n RBACState,\n Store,\n PreloadState,\n ContentManagerAppState,\n};\n","export const getBasename = () => (process.env.ADMIN_PATH ?? '').replace(window.location.origin, '');\n","/* eslint-disable no-await-in-loop */\n/* eslint-disable no-restricted-syntax */\n\nimport type { Store } from '../store/configure';\n\nexport type Handler = (...args: any[]) => any;\n\nexport const createHook = () => {\n const _handlers: Handler[] = [];\n\n return {\n register(fn: Handler) {\n _handlers.push(fn);\n },\n delete(handler: Handler) {\n _handlers.splice(_handlers.indexOf(handler), 1);\n },\n runWaterfall<T>(args: T, store?: Store) {\n return _handlers.reduce((acc, fn) => fn(acc, store), args);\n },\n async runWaterfallAsync<T>(args: T, store?: Store) {\n let result = args;\n\n for (const fn of _handlers) {\n result = await fn(result, store);\n }\n\n return result;\n },\n runSeries<T extends any[]>(...args: T) {\n return _handlers.map((fn) => fn(...args));\n },\n async runSeriesAsync<T extends any[]>(...args: T) {\n const result = [];\n\n for (const fn of _handlers) {\n result.push(await fn(...args));\n }\n\n return result;\n },\n runParallel<T extends any[]>(...args: T) {\n return Promise.all(\n _handlers.map((fn) => {\n return fn(...args);\n })\n );\n },\n };\n};\n","import * as React from 'react';\n\nimport { useCallbackRef } from '@strapi/design-system';\n\nfunction isEnterprise() {\n return window.strapi.isEE;\n}\n\nexport interface UseEnterpriseOptions<TCEData, TEEData, TDefaultValue, TCombinedValue> {\n defaultValue?: TDefaultValue;\n combine?: (ceData: TCEData, eeData: TEEData) => TCombinedValue;\n enabled?: boolean;\n}\n\ntype UseEnterpriseReturn<TCEData, TEEData, TDefaultValue, TCombinedValue> =\n TDefaultValue extends null\n ? TCEData | TEEData | TCombinedValue | null\n : TCEData | TEEData | TCombinedValue | TDefaultValue;\n\nexport const useEnterprise = <\n TCEData,\n TEEData = TCEData,\n TCombinedValue = TEEData,\n TDefaultValue = TCEData\n>(\n ceData: TCEData,\n eeCallback: () => Promise<TEEData>,\n opts: UseEnterpriseOptions<TCEData, TEEData, TDefaultValue, TCombinedValue> = {}\n): UseEnterpriseReturn<TCEData, TEEData, TDefaultValue, TCombinedValue> => {\n const { defaultValue = null, combine = (_ceData, eeData) => eeData, enabled = true } = opts;\n const eeCallbackRef = useCallbackRef(eeCallback);\n const combineCallbackRef = useCallbackRef(combine);\n\n // We have to use a nested object here, because functions (e.g. Components)\n // can not be stored as value directly\n const [{ data }, setData] = React.useState<{\n data: TCEData | TEEData | TDefaultValue | TCombinedValue | null;\n }>({\n data: isEnterprise() && enabled ? defaultValue : ceData,\n });\n\n React.useEffect(() => {\n async function importEE() {\n const eeData = await eeCallbackRef();\n const combinedValue = combineCallbackRef(ceData, eeData);\n\n setData({ data: combinedValue ? combinedValue : eeData });\n }\n\n if (isEnterprise() && enabled) {\n importEE();\n }\n }, [ceData, eeCallbackRef, combineCallbackRef, enabled]);\n\n // @ts-expect-error – the hook type assertion works in practice. But seems to have issues here...\n return data;\n};\n","import { forwardRef } from 'react';\n\nimport { ToggleInput, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst BooleanInput = forwardRef<HTMLInputElement, InputProps>((props, ref) => {\n const { formatMessage } = useIntl();\n const field = useField<boolean | null>(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs<HTMLInputElement | null>(ref, fieldRef);\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <ToggleInput\n ref={composedRefs}\n checked={field.value === null ? null : field.value || false}\n error={field.error}\n /**\n * TODO: reintroduce labelActions\n */\n // labelAction={labelAction}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'False',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'True',\n })}\n onChange={field.onChange}\n onClear={() => {\n field.onChange(props.name, null);\n }}\n {...props}\n />\n );\n});\n\nexport { BooleanInput };\n","import { forwardRef } from 'react';\n\nimport { Checkbox, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\n\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst CheckboxInput = forwardRef<HTMLInputElement, InputProps>((props, ref) => {\n const field = useField<boolean>(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs<HTMLInputElement | null>(ref, fieldRef);\n\n return (\n <Checkbox\n onValueChange={(checked) => field.onChange(props.name, checked)}\n ref={composedRefs}\n value={field.value}\n {...props}\n >\n {props.label || props['aria-label']}\n </Checkbox>\n );\n});\n\nexport { CheckboxInput };\n","import { forwardRef } from 'react';\n\nimport { DatePicker, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst DateInput = forwardRef<HTMLInputElement, InputProps>(({ type: _type, ...props }, ref) => {\n const { formatMessage } = useIntl();\n const field = useField<Date>(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs<HTMLInputElement | null>(ref, fieldRef);\n const value = typeof field.value === 'string' ? new Date(field.value) : field.value;\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <DatePicker\n ref={composedRefs}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n error={field.error}\n id={props.name}\n onChange={(date) => {\n field.onChange(props.name, date);\n }}\n onClear={() => field.onChange(props.name, undefined)}\n selectedDate={value}\n {...props}\n />\n );\n});\n\nexport { DateInput };\n","import { forwardRef } from 'react';\n\nimport { DateTimePicker, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst DateTimeInput = forwardRef<HTMLInputElement, InputProps>((props, ref) => {\n const { formatMessage } = useIntl();\n const field = useField<Date>(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs<HTMLInputElement | null>(ref, fieldRef);\n const value = typeof field.value === 'string' ? new Date(field.value) : field.value;\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <DateTimePicker\n ref={composedRefs}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n error={field.error}\n id={props.name}\n onChange={(date) => {\n field.onChange(props.name, date);\n }}\n onClear={() => field.onChange(props.name, undefined)}\n value={value}\n {...props}\n />\n );\n});\n\nexport { DateTimeInput };\n","import { forwardRef } from 'react';\n\nimport { TextInput, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\n\nimport { useField } from '../Form';\n\nimport type { StringProps } from './types';\n\nexport const EmailInput = forwardRef<any, StringProps>((props, ref) => {\n const field = useField(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <TextInput\n ref={composedRefs}\n autoComplete=\"email\"\n error={field.error}\n id={props.name}\n onChange={field.onChange}\n defaultValue={field.initialValue}\n value={field.value}\n {...props}\n type=\"email\"\n />\n );\n});\n","import { forwardRef } from 'react';\n\nimport { SingleSelect, SingleSelectOption, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\n\nimport { useField } from '../Form';\n\nimport { EnumerationProps } from './types';\n\nexport const EnumerationInput = forwardRef<any, EnumerationProps>(\n ({ options = [], ...props }, ref) => {\n const field = useField(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <SingleSelect\n ref={composedRefs}\n error={field.error}\n onChange={(value) => {\n field.onChange(props.name, value);\n }}\n value={field.value}\n {...props}\n >\n {options.map(({ value, label, disabled, hidden }) => {\n return (\n <SingleSelectOption key={value} value={value} disabled={disabled} hidden={hidden}>\n {label ?? value}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n );\n }\n);\n","import { forwardRef } from 'react';\n\nimport { JSONInput as JSONInputImpl, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\n\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\n/**\n * TODO: fix the ref type when the design system is fixed.\n */\nexport const JsonInput = forwardRef<any, InputProps>((props, ref) => {\n const field = useField(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <JSONInputImpl\n ref={composedRefs}\n value={field.value}\n error={field.error}\n onChange={(json) => {\n // Default to null when the field is not required and there is no input value\n const value = props.required && !json.length ? null : json;\n field.onChange(props.name, value);\n }}\n minHeight={`${252 / 16}rem`}\n maxHeight={`${504 / 16}rem`}\n {...props}\n />\n );\n});\n","import { forwardRef } from 'react';\n\nimport { NumberInput, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\n\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst NumberInputImpl = forwardRef<HTMLInputElement, InputProps>(({ type, ...props }, ref) => {\n const field = useField<number>(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs<HTMLInputElement | null>(ref, fieldRef);\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <NumberInput\n ref={composedRefs}\n defaultValue={field.initialValue}\n error={field.error}\n id={props.name}\n onValueChange={(value) => {\n field.onChange(props.name, value);\n }}\n step={type === 'float' || type == 'decimal' ? 0.01 : 1}\n value={field.value}\n {...props}\n />\n );\n});\n\nexport { NumberInputImpl as NumberInput };\n","import { forwardRef, useState } from 'react';\n\nimport { Icon, TextInput, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\nimport { Eye, EyeStriked } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useField } from '../Form';\n\nimport type { StringProps } from './types';\n\nexport const PasswordInput = forwardRef<any, StringProps>((props, ref) => {\n const [showPassword, setShowPassword] = useState(false);\n const { formatMessage } = useIntl();\n const field = useField(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <TextInput\n ref={composedRefs}\n autoComplete=\"password\"\n error={field.error}\n endAction={\n <button\n aria-label={formatMessage({\n id: 'Auth.form.password.show-password',\n defaultMessage: 'Show password',\n })}\n onClick={() => {\n setShowPassword((prev) => !prev);\n }}\n style={{\n border: 'none',\n padding: 0,\n background: 'transparent',\n }}\n type=\"button\"\n >\n {showPassword ? (\n <Icon as={Eye} color=\"neutral500\" />\n ) : (\n <Icon as={EyeStriked} color=\"neutral500\" />\n )}\n </button>\n }\n id={props.name}\n onChange={field.onChange}\n defaultValue={field.initialValue}\n value={field.value}\n {...props}\n type={showPassword ? 'text' : 'password'}\n />\n );\n});\n","import { forwardRef } from 'react';\n\nimport { TextInput, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\n\nimport { type InputProps, useField } from '../Form';\n\n/**\n * TODO: fix the ref type when the design system is fixed.\n */\nexport const StringInput = forwardRef<any, InputProps>(({ ...props }, ref) => {\n const field = useField(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <TextInput\n ref={composedRefs}\n error={field.error}\n defaultValue={field.initialValue}\n onChange={field.onChange}\n value={field.value ?? ''}\n {...props}\n />\n );\n});\n","import { forwardRef } from 'react';\n\nimport { Textarea, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\n\nimport { useField } from '../Form';\n\nimport type { StringProps } from './types';\n\nexport const TextareaInput = forwardRef<any, StringProps>((props, ref) => {\n const field = useField(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <Textarea\n ref={composedRefs}\n defaultValue={field.initialValue}\n error={field.error}\n id={props.name}\n onChange={field.onChange}\n value={field.value ?? ''}\n {...props}\n />\n );\n});\n","import { forwardRef } from 'react';\n\nimport { TimePicker, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { useField } from '../Form';\n\nimport { InputProps } from './types';\n\nconst TimeInput = forwardRef<HTMLInputElement, InputProps>((props, ref) => {\n const { formatMessage } = useIntl();\n const field = useField<string>(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs<HTMLInputElement | null>(ref, fieldRef);\n\n return (\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n <TimePicker\n ref={composedRefs}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n error={field.error}\n id={props.name}\n onChange={(time) => {\n field.onChange(props.name, time);\n }}\n onClear={() => field.onChange(props.name, undefined)}\n value={field.value ?? ''}\n {...props}\n />\n );\n});\n\nexport { TimeInput };\n","import { forwardRef, memo } from 'react';\n\nimport { TextInput, useComposedRefs } from '@strapi/design-system';\nimport { useFocusInputField } from '@strapi/helper-plugin';\n\nimport { useField } from '../Form';\n\nimport { BooleanInput } from './Boolean';\nimport { CheckboxInput } from './Checkbox';\nimport { DateInput } from './Date';\nimport { DateTimeInput } from './DateTime';\nimport { EmailInput } from './Email';\nimport { EnumerationInput } from './Enumeration';\nimport { JsonInput } from './Json';\nimport { NumberInput } from './Number';\nimport { PasswordInput } from './Password';\nimport { StringInput } from './String';\nimport { TextareaInput } from './Textarea';\nimport { TimeInput } from './Time';\n\nimport type { InputProps } from '../Form';\n\n/* -------------------------------------------------------------------------------------------------\n * InputRenderer\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal This needs to be tested before being exposed as a public API.\n * @experimental\n * @description A generic form renderer for Strapi forms. Similar to GenericInputs but with a different API.\n * The entire component is memoized to avoid re-renders in large forms.\n */\nconst InputRenderer = memo(\n forwardRef<any, InputProps>((props, forwardRef) => {\n switch (props.type) {\n case 'biginteger':\n case 'timestamp':\n case 'string':\n return <StringInput ref={forwardRef} {...props} />;\n case 'boolean':\n return <BooleanInput ref={forwardRef} {...props} />;\n case 'checkbox':\n return <CheckboxInput ref={forwardRef} {...props} />;\n case 'datetime':\n return <DateTimeInput ref={forwardRef} {...props} />;\n case 'date':\n return <DateInput ref={forwardRef} {...props} />;\n case 'decimal':\n case 'float':\n case 'integer':\n return <NumberInput ref={forwardRef} {...props} />;\n case 'json':\n return <JsonInput ref={forwardRef} {...props} />;\n case 'email':\n return <EmailInput ref={forwardRef} {...props} />;\n case 'enumeration':\n return <EnumerationInput ref={forwardRef} {...props} />;\n case 'password':\n return <PasswordInput ref={forwardRef} {...props} />;\n case 'text':\n return <TextareaInput ref={forwardRef} {...props} />;\n case 'time':\n return <TimeInput ref={forwardRef} {...props} />;\n default:\n // This is cast because this renderer tackles all the possibilities of the InputProps, but this is for runtime catches.\n return <NotSupportedField ref={forwardRef} {...(props as InputProps)} />;\n }\n })\n);\n\nconst NotSupportedField = forwardRef<any, InputProps>((props, ref) => {\n const { error } = useField(props.name);\n const fieldRef = useFocusInputField(props.name);\n\n const composedRefs = useComposedRefs(ref, fieldRef);\n\n return (\n <TextInput\n ref={composedRefs}\n disabled\n error={error}\n // @ts-expect-error – label _could_ be a ReactNode since it's a child, this should be fixed in the DS.\n label={props.label}\n id={props.name}\n hint={props.hint}\n name={props.name}\n placeholder={`Unsupported field type: ${props.type}`}\n required={props.required}\n type=\"text\"\n value=\"\"\n />\n );\n});\n\nexport { InputRenderer };\n","import styled from 'styled-components';\n\nimport { useConfiguration } from '../features/Configuration';\n\nconst Img = styled.img`\n height: ${72 / 16}rem;\n`;\n\nconst Logo = () => {\n const {\n logos: { auth },\n } = useConfiguration('UnauthenticatedLogo');\n\n return <Img src={auth?.custom?.url || auth.default} aria-hidden alt=\"\" />;\n};\n\nexport { Logo };\n","import * as React from 'react';\n\nimport { Box, Flex, SingleSelect, SingleSelectOption } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { useTypedDispatch, useTypedSelector } from '../core/store/hooks';\nimport { setLocale } from '../reducer';\n\nconst Wrapper = styled(Box)`\n margin: 0 auto;\n width: 552px;\n`;\n\nexport const Column = styled(Flex)`\n flex-direction: column;\n`;\n\nconst LocaleToggle = () => {\n const localeNames = useTypedSelector((state) => state.admin_app.language.localeNames);\n const dispatch = useTypedDispatch();\n const { formatMessage, locale } = useIntl();\n\n return (\n <SingleSelect\n aria-label={formatMessage({\n id: 'global.localeToggle.label',\n defaultMessage: 'Select interface language',\n })}\n value={locale}\n onChange={(language) => {\n dispatch(setLocale(language as string));\n }}\n >\n {Object.entries(localeNames).map(([language, name]) => (\n <SingleSelectOption key={language} value={language}>\n {name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n );\n};\n\ninterface LayoutContentProps {\n children: React.ReactNode;\n}\n\nexport const LayoutContent = ({ children }: LayoutContentProps) => (\n <Wrapper\n shadow=\"tableShadow\"\n hasRadius\n paddingTop={9}\n paddingBottom={9}\n paddingLeft={10}\n paddingRight={10}\n background=\"neutral0\"\n >\n {children}\n </Wrapper>\n);\n\ninterface UnauthenticatedLayoutProps {\n children: React.ReactNode;\n}\n\nexport const UnauthenticatedLayout = ({ children }: UnauthenticatedLayoutProps) => {\n return (\n <div>\n <Flex as=\"header\" justifyContent=\"flex-end\">\n <Box paddingTop={6} paddingRight={8}>\n <LocaleToggle />\n </Box>\n </Flex>\n <Box paddingTop={2} paddingBottom={11}>\n {children}\n </Box>\n </div>\n );\n};\n","import * as React from 'react';\n\nimport { Box, Button, Flex, Main, Typography } from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport { useQuery } from '@strapi/helper-plugin';\nimport camelCase from 'lodash/camelCase';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useAuth } from '../../../features/Auth';\nimport {\n UnauthenticatedLayout,\n Column,\n LayoutContent,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nimport type { Login } from '../../../../../shared/contracts/authentication';\n\ninterface LoginProps {\n children?: React.ReactNode;\n}\n\nconst LOGIN_SCHEMA = yup.object().shape({\n email: yup\n .string()\n .email({\n id: translatedErrors.email.id,\n defaultMessage: 'Not a valid email',\n })\n .required(translatedErrors.required),\n password: yup.string().required(translatedErrors.required),\n rememberMe: yup.bool().nullable(),\n});\n\nconst Login = ({ children }: LoginProps) => {\n const [apiError, setApiError] = React.useState<string>();\n const { formatMessage } = useIntl();\n const query = useQuery();\n const navigate = useNavigate();\n\n const login = useAuth('Login', (state) => state.login);\n\n const handleLogin = async (body: Parameters<typeof login>[0]) => {\n setApiError(undefined);\n\n const res = await login(body);\n\n if ('error' in res) {\n const message = res.error.message ?? 'Something went wrong';\n\n if (camelCase(message).toLowerCase() === 'usernotactive') {\n navigate('/auth/oops');\n return;\n }\n\n setApiError(message);\n } else {\n const redirectTo = query.get('redirectTo');\n const redirectUrl = redirectTo ? decodeURIComponent(redirectTo) : '/';\n\n navigate(redirectUrl);\n }\n };\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={1}>\n <Typography variant=\"alpha\" as=\"h1\">\n {formatMessage({\n id: 'Auth.form.welcome.title',\n defaultMessage: 'Welcome!',\n })}\n </Typography>\n </Box>\n <Box paddingBottom={7}>\n <Typography variant=\"epsilon\" textColor=\"neutral600\">\n {formatMessage({\n id: 'Auth.form.welcome.subtitle',\n defaultMessage: 'Log in to your Strapi account',\n })}\n </Typography>\n </Box>\n {apiError ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {apiError}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"PUT\"\n initialValues={{\n email: '',\n password: '',\n rememberMe: false,\n }}\n onSubmit={(values) => {\n handleLogin(values);\n }}\n validationSchema={LOGIN_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n label: formatMessage({ id: 'Auth.form.email.label', defaultMessage: 'Email' }),\n name: 'email',\n placeholder: formatMessage({\n id: 'Auth.form.email.placeholder',\n defaultMessage: 'kai@doe.com',\n }),\n required: true,\n type: 'string' as const,\n },\n {\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.rememberMe.label',\n defaultMessage: 'Remember me',\n }),\n name: 'rememberMe',\n type: 'checkbox' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({ id: 'Auth.form.button.login', defaultMessage: 'Login' })}\n </Button>\n </Flex>\n </Form>\n {children}\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n {/* @ts-expect-error – error with inferring the props from the as component */}\n <Link as={NavLink} to=\"/auth/forgot-password\">\n {formatMessage({\n id: 'Auth.link.forgot-password',\n defaultMessage: 'Forgot your password?',\n })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { Login };\nexport type { LoginProps };\n","import { Box, Button, Flex, Main, Typography } from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useAPIErrorHandler } from '../../../hooks/useAPIErrorHandler';\nimport {\n Column,\n LayoutContent,\n UnauthenticatedLayout,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { useForgotPasswordMutation } from '../../../services/auth';\nimport { isBaseQueryError } from '../../../utils/baseQuery';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nimport type { ForgotPassword } from '../../../../../shared/contracts/authentication';\n\nconst ForgotPassword = () => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [forgotPassword, { error }] = useForgotPasswordMutation();\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={7}>\n <Typography as=\"h1\" variant=\"alpha\">\n {formatMessage({\n id: 'Auth.form.button.password-recovery',\n defaultMessage: 'Password Recovery',\n })}\n </Typography>\n </Box>\n {error ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {isBaseQueryError(error)\n ? formatAPIError(error)\n : formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n })}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"POST\"\n initialValues={{\n email: '',\n }}\n onSubmit={async (body) => {\n const res = await forgotPassword(body);\n\n if (!('error' in res)) {\n navigate('/auth/forgot-password-success');\n }\n }}\n validationSchema={yup.object().shape({\n email: yup.string().email(translatedErrors.email).required({\n id: translatedErrors.required.id,\n defaultMessage: 'This field is required.',\n }),\n })}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n label: formatMessage({ id: 'Auth.form.email.label', defaultMessage: 'Email' }),\n name: 'email',\n placeholder: formatMessage({\n id: 'Auth.form.email.placeholder',\n defaultMessage: 'kai@doe.com',\n }),\n required: true,\n type: 'string' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button type=\"submit\" fullWidth>\n {formatMessage({\n id: 'Auth.form.button.forgot-password',\n defaultMessage: 'Send Email',\n })}\n </Button>\n </Flex>\n </Form>\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n {/* @ts-expect-error – error with inferring the props from the as component */}\n <Link as={NavLink} to=\"/auth/login\">\n {formatMessage({ id: 'Auth.link.ready', defaultMessage: 'Ready to sign in?' })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { ForgotPassword };\n","import { Box, Flex, Main, Typography } from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport {\n Column,\n LayoutContent,\n UnauthenticatedLayout,\n} from '../../../layouts/UnauthenticatedLayout';\n\nconst ForgotPasswordSuccess = () => {\n const { formatMessage } = useIntl();\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={7}>\n <Typography as=\"h1\" variant=\"alpha\">\n {formatMessage({\n id: 'app.containers.AuthPage.ForgotPasswordSuccess.title',\n defaultMessage: 'Email sent',\n })}\n </Typography>\n </Box>\n <Typography>\n {formatMessage({\n id: 'app.containers.AuthPage.ForgotPasswordSuccess.text.email',\n defaultMessage: 'It can take a few minutes to receive your password recovery link.',\n })}\n </Typography>\n <Box paddingTop={4}>\n <Typography>\n {formatMessage({\n id: 'app.containers.AuthPage.ForgotPasswordSuccess.text.contact-admin',\n defaultMessage:\n 'If you do not receive this link, please contact your administrator.',\n })}\n </Typography>\n </Box>\n </Column>\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n {/* @ts-expect-error – error with inferring the props from the as component */}\n <Link as={NavLink} to=\"/auth/login\">\n {formatMessage({ id: 'Auth.link.signin', defaultMessage: 'Sign in' })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { ForgotPasswordSuccess };\n","import { Box, Flex, Main, Typography } from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport { useQuery } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\n\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport {\n Column,\n LayoutContent,\n UnauthenticatedLayout,\n} from '../../../layouts/UnauthenticatedLayout';\n\nconst Oops = () => {\n const { formatMessage } = useIntl();\n const query = useQuery();\n\n const message =\n query.get('info') ||\n formatMessage({\n id: 'Auth.components.Oops.text',\n defaultMessage: 'Your account has been suspended.',\n });\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={7}>\n <Typography as=\"h1\" variant=\"alpha\">\n {formatMessage({ id: 'Auth.components.Oops.title', defaultMessage: 'Oops...' })}\n </Typography>\n </Box>\n <Typography>{message}</Typography>\n <Box paddingTop={4}>\n <Typography>\n {formatMessage({\n id: 'Auth.components.Oops.text.admin',\n defaultMessage: 'If this is a mistake, please contact your administrator.',\n })}\n </Typography>\n </Box>\n </Column>\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n {/* @ts-expect-error – error with inferring the props from the as component */}\n <Link as={NavLink} to=\"/auth/login\">\n {formatMessage({ id: 'Auth.link.signin', defaultMessage: 'Sign in' })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { Oops };\n","import * as React from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Button,\n Typography,\n Textarea,\n Portal,\n Field,\n FieldLabel,\n FieldInput,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { usePersistentState } from '@strapi/helper-plugin';\nimport { Cross } from '@strapi/icons';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport styled, { useTheme } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\n\nconst FieldWrapper = styled(Field)`\n height: ${32 / 16}rem;\n width: ${32 / 16}rem;\n\n > label,\n ~ input {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n > label {\n color: inherit;\n cursor: pointer;\n padding: ${({ theme }) => theme.spaces[2]};\n text-align: center;\n vertical-align: middle;\n }\n\n &:hover,\n &:focus-within {\n background-color: ${({ theme }) => theme.colors.neutral0};\n }\n\n &:active,\n &.selected {\n color: ${({ theme }) => theme.colors.primary700};\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.primary700};\n }\n`;\n\nconst delays = {\n postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n postFirstDismissal: 7 * 24 * 60 * 60 * 1000, // 7 days in ms\n postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n display: 5 * 60 * 1000, // 5 minutes in ms\n};\n\nconst ratingArray = [...Array(11).keys()];\n\nconst checkIfShouldShowSurvey = (settings: NpsSurveySettings) => {\n const { enabled, lastResponseDate, firstDismissalDate, lastDismissalDate } = settings;\n\n // This function goes through all the cases where we'd want to not show the survey:\n // 1. If the survey is disabled by strapi, abort mission, don't bother checking the other settings.\n // 2. If the survey is disabled by user, abort mission, don't bother checking the other settings.\n // 3. If the user has already responded to the survey, check if enough time has passed since the last response.\n // 4. If the user has dismissed the survey twice or more before, check if enough time has passed since the last dismissal.\n // 5. If the user has only dismissed the survey once before, check if enough time has passed since the first dismissal.\n // If none of these cases check out, then we show the survey.\n // Note that submitting a response resets the dismissal counts.\n // Checks 4 and 5 should not be reversed, since the first dismissal will also exist if the user has dismissed the survey twice or more before.\n\n // For users who had created an account before the NPS feature was introduced,\n // we assume that they would have enabled the NPS feature if they had the chance.\n\n // Global strapi disable for NSP.\n if (window.strapi.flags.nps === false) {\n return false;\n }\n\n // User chose not to enable the NPS feature when signing up\n if (enabled === false) {\n return false;\n }\n\n // The user has already responded to the survey\n if (lastResponseDate) {\n const timeSinceLastResponse = Date.now() - new Date(lastResponseDate).getTime();\n\n if (timeSinceLastResponse >= delays.postResponse) {\n return true;\n }\n\n return false;\n }\n\n // The user has dismissed the survey twice or more before\n if (lastDismissalDate) {\n const timeSinceLastDismissal = Date.now() - new Date(lastDismissalDate).getTime();\n\n if (timeSinceLastDismissal >= delays.postSubsequentDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has only dismissed the survey once before\n if (firstDismissalDate) {\n const timeSinceFirstDismissal = Date.now() - new Date(firstDismissalDate).getTime();\n\n if (timeSinceFirstDismissal >= delays.postFirstDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has not interacted with the survey before\n return true;\n};\n\nconst NpsSurvey = () => {\n const theme = useTheme();\n const { formatMessage } = useIntl();\n const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings();\n const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false);\n const { toggleNotification } = useNotification();\n const currentEnvironment = useAppInfo('NpsSurvey', (state) => state.currentEnvironment);\n const strapiVersion = useAppInfo('NpsSurvey', (state) => state.strapiVersion);\n\n interface NpsSurveyMutationBody {\n email: string;\n rating: number | null;\n comment: string;\n environment?: string;\n version?: string;\n license: 'Enterprise' | 'Community';\n }\n\n // Only check on first render if the survey should be shown\n const [surveyIsShown, setSurveyIsShown] = React.useState(\n checkIfShouldShowSurvey(npsSurveySettings)\n );\n\n // Set a cooldown to show the survey when session begins\n const [displaySurvey, setDisplaySurvey] = React.useState(false);\n\n React.useEffect(() => {\n const displayTime = setTimeout(() => {\n setDisplaySurvey(true);\n }, delays.display);\n\n return () => {\n clearTimeout(displayTime);\n };\n }, []);\n\n const user = useAuth('NpsSurvey', (state) => state.user);\n\n if (!displaySurvey) {\n return null;\n }\n\n if (!surveyIsShown) {\n return null;\n }\n\n const handleSubmitResponse = async ({\n npsSurveyRating,\n npsSurveyFeedback,\n }: {\n npsSurveyRating: NpsSurveyMutationBody['rating'];\n npsSurveyFeedback: NpsSurveyMutationBody['comment'];\n }) => {\n try {\n const body = {\n email: typeof user === 'object' && user.email ? user.email : '',\n rating: npsSurveyRating,\n comment: npsSurveyFeedback,\n environment: currentEnvironment,\n version: strapiVersion ?? undefined,\n license: window.strapi.projectType,\n };\n const res = await fetch('https://analytics.strapi.io/submit-nps', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n throw new Error('Failed to submit NPS survey');\n }\n\n setNpsSurveySettings((settings) => ({\n ...settings,\n lastResponseDate: new Date().toString(),\n firstDismissalDate: null,\n lastDismissalDate: null,\n }));\n setIsFeedbackResponse(true);\n // Thank you message displayed in the banner should disappear after few seconds.\n setTimeout(() => {\n setSurveyIsShown(false);\n }, 3000);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const handleDismiss = () => {\n setNpsSurveySettings((settings) => {\n const nextSettings = {\n ...settings,\n lastResponseDate: null,\n };\n\n if (settings.firstDismissalDate) {\n // If the user dismisses the survey for the second time\n nextSettings.lastDismissalDate = new Date().toString();\n } else {\n // If the user dismisses the survey for the first time\n nextSettings.firstDismissalDate = new Date().toString();\n }\n\n return nextSettings;\n });\n\n setSurveyIsShown(false);\n };\n\n return (\n <Portal>\n <Formik\n initialValues={{ npsSurveyFeedback: '', npsSurveyRating: null }}\n onSubmit={handleSubmitResponse}\n validationSchema={yup.object({\n npsSurveyFeedback: yup.string(),\n npsSurveyRating: yup.number().required(),\n })}\n >\n {({ values, handleChange, setFieldValue, isSubmitting }) => (\n <Form name=\"npsSurveyForm\">\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex={theme.zIndices[2]}\n width=\"50%\"\n >\n {isFeedbackResponse ? (\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-response',\n defaultMessage: 'Thank you very much for your feedback!',\n })}\n </Typography>\n ) : (\n <Box as=\"fieldset\" width=\"100%\">\n <Flex justifyContent=\"space-between\" width=\"100%\">\n <Box marginLeft=\"auto\" marginRight=\"auto\">\n <Typography fontWeight=\"semiBold\" as=\"legend\">\n {formatMessage({\n id: 'app.components.NpsSurvey.banner-title',\n defaultMessage:\n 'How likely are you to recommend Strapi to a friend or colleague?',\n })}\n </Typography>\n </Box>\n <IconButton\n onClick={handleDismiss}\n aria-label={formatMessage({\n id: 'app.components.NpsSurvey.dismiss-survey-label',\n defaultMessage: 'Dismiss survey',\n })}\n icon={<Cross />}\n />\n </Flex>\n <Flex gap={2} marginTop={2} marginBottom={2} justifyContent=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })}\n </Typography>\n {ratingArray.map((number) => {\n return (\n <FieldWrapper\n key={number}\n className={values.npsSurveyRating === number ? 'selected' : undefined} // \"selected\" class added when child radio button is checked\n hasRadius\n background=\"primary100\"\n borderColor=\"primary200\"\n color=\"primary600\"\n position=\"relative\"\n cursor=\"pointer\"\n >\n <FieldLabel htmlFor={`nps-survey-rating-${number}-input`}>\n <VisuallyHidden>\n <FieldInput\n type=\"radio\"\n id={`nps-survey-rating-${number}-input`}\n name=\"npsSurveyRating\"\n checked={values.npsSurveyRating === number}\n onChange={(e) =>\n setFieldValue('npsSurveyRating', parseInt(e.target.value, 10))\n }\n value={number}\n />\n </VisuallyHidden>\n {number}\n </FieldLabel>\n </FieldWrapper>\n );\n })}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })}\n </Typography>\n </Flex>\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\">\n <Box marginTop={2}>\n <FieldLabel htmlFor=\"npsSurveyFeedback\" fontWeight=\"semiBold\" fontSize={2}>\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-question',\n defaultMessage: 'Do you have any suggestion for improvements?',\n })}\n </FieldLabel>\n </Box>\n <Box width=\"62%\" marginTop={3} marginBottom={4}>\n <Textarea\n id=\"npsSurveyFeedback\" // formik element attribute \"id\" should be same as the values key to work\n width=\"100%\"\n onChange={handleChange}\n >\n {values.npsSurveyFeedback}\n </Textarea>\n </Box>\n <Button marginBottom={2} type=\"submit\" loading={isSubmitting}>\n {formatMessage({\n id: 'app.components.NpsSurvey.submit-feedback',\n defaultMessage: 'Submit Feedback',\n })}\n </Button>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Form>\n )}\n </Formik>\n </Portal>\n );\n};\n\ninterface NpsSurveySettings {\n enabled: boolean;\n lastResponseDate: string | null;\n firstDismissalDate: string | null;\n lastDismissalDate: string | null;\n}\n\n/**\n * We exported to make it available during admin user registration.\n * Because we only enable the NPS for users who subscribe to the newsletter when signing up\n */\nfunction useNpsSurveySettings() {\n const [npsSurveySettings, setNpsSurveySettings] = usePersistentState<NpsSurveySettings>(\n 'STRAPI_NPS_SURVEY_SETTINGS',\n {\n enabled: true,\n lastResponseDate: null,\n firstDismissalDate: null,\n lastDismissalDate: null,\n }\n );\n\n /**\n * TODO: should this just be an array so we can alias the `usePersistentState` hook?\n */\n return { npsSurveySettings, setNpsSurveySettings };\n}\n\nexport { NpsSurvey, useNpsSurveySettings };\n","import * as React from 'react';\n\nimport { Box, Button, Flex, Grid, GridItem, Typography } from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport { auth, useQuery } from '@strapi/helper-plugin';\nimport omit from 'lodash/omit';\nimport { useIntl } from 'react-intl';\nimport { NavLink, Navigate, useNavigate, useMatch } from 'react-router-dom';\nimport styled from 'styled-components';\nimport * as yup from 'yup';\nimport { ValidationError } from 'yup';\n\nimport {\n Register as RegisterUser,\n RegisterAdmin,\n} from '../../../../../shared/contracts/authentication';\nimport { Form, FormHelpers } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { useGuidedTour } from '../../../components/GuidedTour/Provider';\nimport { useNpsSurveySettings } from '../../../components/NpsSurvey';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useAuth } from '../../../features/Auth';\nimport { useNotification } from '../../../features/Notifications';\nimport { useTracking } from '../../../features/Tracking';\nimport { useAPIErrorHandler } from '../../../hooks/useAPIErrorHandler';\nimport { LayoutContent, UnauthenticatedLayout } from '../../../layouts/UnauthenticatedLayout';\nimport {\n useGetRegistrationInfoQuery,\n useRegisterAdminMutation,\n useRegisterUserMutation,\n} from '../../../services/auth';\nimport { isBaseQueryError } from '../../../utils/baseQuery';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nconst REGISTER_USER_SCHEMA = yup.object().shape({\n firstname: yup.string().trim().required(translatedErrors.required),\n lastname: yup.string().nullable(),\n password: yup\n .string()\n .min(8, {\n id: translatedErrors.minLength.id,\n defaultMessage: 'Password must be at least 8 characters',\n values: { min: 8 },\n })\n .matches(/[a-z]/, {\n message: {\n id: 'components.Input.error.contain.lowercase',\n defaultMessage: 'Password must contain at least 1 lowercase letter',\n },\n })\n .matches(/[A-Z]/, {\n message: {\n id: 'components.Input.error.contain.uppercase',\n defaultMessage: 'Password must contain at least 1 uppercase letter',\n },\n })\n .matches(/\\d/, {\n message: {\n id: 'components.Input.error.contain.number',\n defaultMessage: 'Password must contain at least 1 number',\n },\n })\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Password is required',\n }),\n confirmPassword: yup\n .string()\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Confirm password is required',\n })\n .oneOf([yup.ref('password'), null], {\n id: 'components.Input.error.password.noMatch',\n defaultMessage: 'Passwords must match',\n }),\n registrationToken: yup.string().required({\n id: translatedErrors.required.id,\n defaultMessage: 'Registration token is required',\n }),\n});\n\nconst REGISTER_ADMIN_SCHEMA = yup.object().shape({\n firstname: yup.string().trim().required({\n id: translatedErrors.required.id,\n defaultMessage: 'Firstname is required',\n }),\n lastname: yup.string().nullable(),\n password: yup\n .string()\n .min(8, {\n id: translatedErrors.minLength.id,\n defaultMessage: 'Password must be at least 8 characters',\n values: { min: 8 },\n })\n .matches(/[a-z]/, {\n message: {\n id: 'components.Input.error.contain.lowercase',\n defaultMessage: 'Password must contain at least 1 lowercase letter',\n },\n })\n .matches(/[A-Z]/, {\n message: {\n id: 'components.Input.error.contain.uppercase',\n defaultMessage: 'Password must contain at least 1 uppercase letter',\n },\n })\n .matches(/\\d/, {\n message: {\n id: 'components.Input.error.contain.number',\n defaultMessage: 'Password must contain at least 1 number',\n },\n })\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Password is required',\n }),\n confirmPassword: yup\n .string()\n .required({\n id: translatedErrors.required,\n defaultMessage: 'Confirm password is required',\n })\n .oneOf([yup.ref('password'), null], {\n id: 'components.Input.error.password.noMatch',\n defaultMessage: 'Passwords must match',\n }),\n email: yup\n .string()\n .email({\n id: translatedErrors.email.id,\n defaultMessage: 'Not a valid email',\n })\n .strict()\n .lowercase({\n id: translatedErrors.lowercase.id,\n defaultMessage: 'Email must be lowercase',\n })\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Email is required',\n }),\n});\n\ninterface RegisterProps {\n hasAdmin?: boolean;\n}\n\ninterface RegisterFormValues {\n firstname: string;\n lastname: string;\n email: string;\n password: string;\n confirmPassword: string;\n registrationToken: string | undefined;\n news: boolean;\n}\n\nconst Register = ({ hasAdmin }: RegisterProps) => {\n const { toggleNotification } = useNotification();\n const navigate = useNavigate();\n const [submitCount, setSubmitCount] = React.useState(0);\n const [apiError, setApiError] = React.useState<string>();\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const setSkipped = useGuidedTour('Register', (state) => state.setSkipped);\n const query = useQuery();\n const match = useMatch('/auth/:authType');\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidationErrors,\n } = useAPIErrorHandler();\n const { setNpsSurveySettings } = useNpsSurveySettings();\n\n const registrationToken = query.get('registrationToken');\n\n const { data: userInfo, error } = useGetRegistrationInfoQuery(registrationToken as string, {\n skip: !registrationToken,\n });\n\n React.useEffect(() => {\n if (error) {\n const message: string = isBaseQueryError(error) ? formatAPIError(error) : error.message ?? '';\n\n toggleNotification({\n type: 'danger',\n message,\n });\n\n navigate(`/auth/oops?info=${encodeURIComponent(message)}`);\n }\n }, [error, formatAPIError, navigate, toggleNotification]);\n\n const [registerAdmin] = useRegisterAdminMutation();\n const [registerUser] = useRegisterUserMutation();\n const setToken = useAuth('Register', (state) => state.setToken);\n\n const handleRegisterAdmin = async (\n { news, ...body }: RegisterAdmin.Request['body'] & { news: boolean },\n setFormErrors: FormHelpers<RegisterFormValues>['setErrors']\n ) => {\n const res = await registerAdmin(body);\n\n if ('data' in res) {\n setToken(res.data.token);\n\n const { roles } = res.data.user;\n\n if (roles) {\n const isUserSuperAdmin = roles.find(({ code }) => code === 'strapi-super-admin');\n\n if (isUserSuperAdmin) {\n auth.set(false, 'GUIDED_TOUR_SKIPPED', true);\n setSkipped(false);\n trackUsage('didLaunchGuidedtour');\n }\n }\n\n if (news) {\n // Only enable EE survey if user accepted the newsletter\n setNpsSurveySettings((s) => ({ ...s, enabled: true }));\n\n navigate({\n pathname: '/usecase',\n search: `?hasAdmin=${true}`,\n });\n } else {\n navigate('/');\n }\n } else {\n if (isBaseQueryError(res.error)) {\n trackUsage('didNotCreateFirstAdmin');\n\n if (res.error.name === 'ValidationError') {\n setFormErrors(formatValidationErrors(res.error));\n return;\n }\n\n setApiError(formatAPIError(res.error));\n }\n }\n };\n\n const handleRegisterUser = async (\n { news, ...body }: RegisterUser.Request['body'] & { news: boolean },\n setFormErrors: FormHelpers<RegisterFormValues>['setErrors']\n ) => {\n const res = await registerUser(body);\n\n if ('data' in res) {\n setToken(res.data.token);\n\n if (news) {\n // Only enable EE survey if user accepted the newsletter\n setNpsSurveySettings((s) => ({ ...s, enabled: true }));\n\n navigate({\n pathname: '/usecase',\n search: `?hasAdmin=${hasAdmin}`,\n });\n } else {\n navigate('/');\n }\n } else {\n if (isBaseQueryError(res.error)) {\n trackUsage('didNotCreateFirstAdmin');\n\n if (res.error.name === 'ValidationError') {\n setFormErrors(formatValidationErrors(res.error));\n return;\n }\n\n setApiError(formatAPIError(res.error));\n }\n }\n };\n\n if (\n !match ||\n (match.params.authType !== 'register' && match.params.authType !== 'register-admin')\n ) {\n return <Navigate to=\"/\" />;\n }\n\n const isAdminRegistration = match.params.authType === 'register-admin';\n\n const schema = isAdminRegistration ? REGISTER_ADMIN_SCHEMA : REGISTER_USER_SCHEMA;\n\n return (\n <UnauthenticatedLayout>\n <LayoutContent>\n <Flex direction=\"column\" alignItems=\"center\" gap={3}>\n <Logo />\n\n <Typography as=\"h1\" variant=\"alpha\" textAlign=\"center\">\n {formatMessage({\n id: 'Auth.form.welcome.title',\n defaultMessage: 'Welcome to Strapi!',\n })}\n </Typography>\n <Typography variant=\"epsilon\" textColor=\"neutral600\" textAlign=\"center\">\n {formatMessage({\n id: 'Auth.form.register.subtitle',\n defaultMessage:\n 'Credentials are only used to authenticate in Strapi. All saved data will be stored in your database.',\n })}\n </Typography>\n {apiError ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {apiError}\n </Typography>\n ) : null}\n </Flex>\n <Form\n method=\"POST\"\n initialValues={\n {\n firstname: userInfo?.firstname || '',\n lastname: userInfo?.lastname || '',\n email: userInfo?.email || '',\n password: '',\n confirmPassword: '',\n registrationToken: registrationToken || undefined,\n news: false,\n } satisfies RegisterFormValues\n }\n onSubmit={async (data, helpers) => {\n const normalizedData = normalizeData(data);\n\n try {\n await schema.validate(normalizedData, { abortEarly: false });\n\n if (submitCount > 0 && isAdminRegistration) {\n trackUsage('didSubmitWithErrorsFirstAdmin', { count: submitCount.toString() });\n }\n\n if (normalizedData.registrationToken) {\n handleRegisterUser(\n {\n userInfo: omit(normalizedData, [\n 'registrationToken',\n 'confirmPassword',\n 'email',\n 'news',\n ]),\n registrationToken: normalizedData.registrationToken,\n news: normalizedData.news,\n },\n helpers.setErrors\n );\n } else {\n await handleRegisterAdmin(\n omit(normalizedData, ['registrationToken', 'confirmPassword']),\n helpers.setErrors\n );\n }\n } catch (err) {\n if (err instanceof ValidationError) {\n helpers.setErrors(\n err.inner.reduce<Record<string, string>>((acc, { message, path }) => {\n if (path && typeof message === 'object') {\n acc[path] = formatMessage(message);\n }\n return acc;\n }, {})\n );\n }\n setSubmitCount(submitCount + 1);\n }\n }}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} marginTop={7}>\n <Grid gap={4}>\n {[\n {\n label: formatMessage({\n id: 'Auth.form.firstname.label',\n defaultMessage: 'Firstname',\n }),\n name: 'firstname',\n required: true,\n size: 6,\n type: 'string' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.lastname.label',\n defaultMessage: 'Lastname',\n }),\n name: 'lastname',\n size: 6,\n type: 'string' as const,\n },\n {\n disabled: !isAdminRegistration,\n label: formatMessage({\n id: 'Auth.form.email.label',\n defaultMessage: 'Email',\n }),\n name: 'email',\n required: true,\n size: 12,\n type: 'email' as const,\n },\n {\n hint: formatMessage({\n id: 'Auth.form.password.hint',\n defaultMessage:\n 'Must be at least 8 characters, 1 uppercase, 1 lowercase & 1 number',\n }),\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n size: 12,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.confirmPassword.label',\n defaultMessage: 'Confirm Password',\n }),\n name: 'confirmPassword',\n required: true,\n size: 12,\n type: 'password' as const,\n },\n {\n label: formatMessage(\n {\n id: 'Auth.form.register.news.label',\n defaultMessage:\n 'Keep me updated about new features & upcoming improvements (by doing this you accept the {terms} and the {policy}).',\n },\n {\n terms: (\n <A target=\"_blank\" href=\"https://strapi.io/terms\" rel=\"noreferrer\">\n {formatMessage({\n id: 'Auth.privacy-policy-agreement.terms',\n defaultMessage: 'terms',\n })}\n </A>\n ),\n policy: (\n <A target=\"_blank\" href=\"https://strapi.io/privacy\" rel=\"noreferrer\">\n {formatMessage({\n id: 'Auth.privacy-policy-agreement.policy',\n defaultMessage: 'policy',\n })}\n </A>\n ),\n }\n ),\n name: 'news',\n size: 12,\n type: 'checkbox' as const,\n },\n ].map(({ size, ...field }) => (\n <GridItem key={field.name} col={size}>\n <InputRenderer {...field} />\n </GridItem>\n ))}\n </Grid>\n <Button fullWidth size=\"L\" type=\"submit\">\n {formatMessage({\n id: 'Auth.form.button.register',\n defaultMessage: \"Let's start\",\n })}\n </Button>\n </Flex>\n </Form>\n {match?.params.authType === 'register' && (\n <Box paddingTop={4}>\n <Flex justifyContent=\"center\">\n {/* @ts-expect-error – error with inferring the props from the as component */}\n <Link as={NavLink} to=\"/auth/login\">\n {formatMessage({\n id: 'Auth.link.signin.account',\n defaultMessage: 'Already have an account?',\n })}\n </Link>\n </Flex>\n </Box>\n )}\n </LayoutContent>\n </UnauthenticatedLayout>\n );\n};\n\ninterface RegisterFormValues {\n firstname: string;\n lastname: string;\n email: string;\n password: string;\n confirmPassword: string;\n registrationToken: string | undefined;\n news: boolean;\n}\n\ntype StringKeys<T> = {\n [K in keyof T]: T[K] extends string | undefined ? K : never;\n}[keyof T];\n\n/**\n * @description Trims all values but the password & sets lastName to null if it's a falsey value.\n */\nfunction normalizeData(data: RegisterFormValues) {\n return Object.entries(data).reduce(\n (acc, [key, value]) => {\n type PasswordKeys = Extract<keyof RegisterFormValues, 'password' | 'confirmPassword'>;\n type RegisterFormStringValues = Exclude<\n keyof Pick<RegisterFormValues, StringKeys<RegisterFormValues>>,\n PasswordKeys\n >;\n\n if (!['password', 'confirmPassword'].includes(key) && typeof value === 'string') {\n acc[key as RegisterFormStringValues] = value.trim();\n\n if (key === 'lastname') {\n acc[key] = value || undefined;\n }\n } else {\n acc[key as PasswordKeys] = value;\n }\n\n return acc;\n },\n {} as {\n firstname: string;\n lastname: string | undefined;\n email: string;\n password: string;\n confirmPassword: string;\n registrationToken: string | undefined;\n news: boolean;\n }\n );\n}\n\nconst A = styled.a`\n color: ${({ theme }) => theme.colors.primary600};\n`;\n\nexport { Register };\nexport type { RegisterProps };\n","import { Box, Button, Flex, Main, Typography } from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport { useQuery } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate, Navigate } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { ResetPassword } from '../../../../../shared/contracts/authentication';\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useAuth } from '../../../features/Auth';\nimport { useAPIErrorHandler } from '../../../hooks/useAPIErrorHandler';\nimport {\n Column,\n LayoutContent,\n UnauthenticatedLayout,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { useResetPasswordMutation } from '../../../services/auth';\nimport { isBaseQueryError } from '../../../utils/baseQuery';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nconst RESET_PASSWORD_SCHEMA = yup.object().shape({\n password: yup\n .string()\n .min(8, {\n id: translatedErrors.minLength.id,\n defaultMessage: 'Password must be at least 8 characters',\n values: { min: 8 },\n })\n .matches(/[a-z]/, {\n message: {\n id: 'components.Input.error.contain.lowercase',\n defaultMessage: 'Password must contain at least 1 lowercase letter',\n },\n })\n .matches(/[A-Z]/, {\n message: {\n id: 'components.Input.error.contain.uppercase',\n defaultMessage: 'Password must contain at least 1 uppercase letter',\n },\n })\n .matches(/\\d/, {\n message: {\n id: 'components.Input.error.contain.number',\n defaultMessage: 'Password must contain at least 1 number',\n },\n })\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Password is required',\n }),\n confirmPassword: yup\n .string()\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Confirm password is required',\n })\n .oneOf([yup.ref('password'), null], {\n id: 'components.Input.error.password.noMatch',\n defaultMessage: 'Passwords must match',\n }),\n});\n\nconst ResetPassword = () => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const query = useQuery();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const setToken = useAuth('ResetPassword', (state) => state.setToken);\n\n const [resetPassword, { error }] = useResetPasswordMutation();\n\n const handleSubmit = async (body: ResetPassword.Request['body']) => {\n const res = await resetPassword(body);\n\n if ('data' in res) {\n setToken(res.data.token);\n navigate('/');\n }\n };\n /**\n * If someone doesn't have a reset password token\n * then they should just be redirected back to the login page.\n */\n if (!query.get('code')) {\n return <Navigate to=\"/auth/login\" />;\n }\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={7}>\n <Typography as=\"h1\" variant=\"alpha\">\n {formatMessage({\n id: 'global.reset-password',\n defaultMessage: 'Reset password',\n })}\n </Typography>\n </Box>\n {error ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {isBaseQueryError(error)\n ? formatAPIError(error)\n : formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n })}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"POST\"\n initialValues={{\n password: '',\n confirmPassword: '',\n }}\n onSubmit={(values) => {\n // We know query.code is defined because we check for it above.\n handleSubmit({ password: values.password, resetPasswordToken: query.get('code')! });\n }}\n validationSchema={RESET_PASSWORD_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n hint: formatMessage({\n id: 'Auth.form.password.hint',\n defaultMessage:\n 'Password must contain at least 8 characters, 1 uppercase, 1 lowercase and 1 number',\n }),\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.confirmPassword.label',\n defaultMessage: 'Confirm Password',\n }),\n name: 'confirmPassword',\n required: true,\n type: 'password' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({\n id: 'global.change-password',\n defaultMessage: 'Change password',\n })}\n </Button>\n </Flex>\n </Form>\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n {/* @ts-expect-error – error with inferring the props from the as component */}\n <Link as={NavLink} to=\"/auth/login\">\n {formatMessage({ id: 'Auth.link.ready', defaultMessage: 'Ready to sign in?' })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { ResetPassword };\n","import type { ComponentType } from 'react';\n\nimport { ForgotPassword } from './components/ForgotPassword';\nimport { ForgotPasswordSuccess } from './components/ForgotPasswordSuccess';\nimport { Oops } from './components/Oops';\nimport { Register, RegisterProps } from './components/Register';\nimport { ResetPassword } from './components/ResetPassword';\n\nexport type AuthType =\n | 'login'\n | 'register'\n | 'register-admin'\n | 'forgot-password'\n | 'reset-password'\n | 'forgot-password-success'\n | 'oops'\n | 'providers';\n\nexport type FormDictionary = Record<AuthType, ComponentType | ComponentType<RegisterProps>>;\n\nexport const FORMS = {\n 'forgot-password': ForgotPassword,\n 'forgot-password-success': ForgotPasswordSuccess,\n // the `Component` attribute is set after all forms and CE/EE components are loaded, but since we\n // are here outside of a React component we can not use the hook directly\n login: () => null,\n oops: Oops,\n register: Register,\n 'register-admin': Register,\n 'reset-password': ResetPassword,\n providers: () => null,\n} satisfies FormDictionary;\n","import { Navigate, useLocation, useMatch } from 'react-router-dom';\n\nimport { useAuth } from '../../features/Auth';\nimport { useEnterprise } from '../../hooks/useEnterprise';\nimport { useInitQuery } from '../../services/admin';\n\nimport { Login as LoginCE } from './components/Login';\nimport { FORMS, FormDictionary } from './constants';\n\n/* -------------------------------------------------------------------------------------------------\n * AuthPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst AuthPage = () => {\n const { search } = useLocation();\n const match = useMatch('/auth/:authType');\n const authType = match?.params.authType;\n const { data } = useInitQuery();\n const { hasAdmin } = data ?? {};\n const Login = useEnterprise(\n LoginCE,\n async () => (await import('../../../../ee/admin/src/pages/AuthPage/components/Login')).LoginEE\n );\n const forms = useEnterprise<FormDictionary, Partial<FormDictionary>>(\n FORMS,\n async () => (await import('../../../../ee/admin/src/pages/AuthPage/constants')).FORMS,\n {\n combine(ceForms, eeForms) {\n return {\n ...ceForms,\n ...eeForms,\n };\n },\n defaultValue: FORMS,\n }\n );\n\n const token = useAuth('AuthPage', (state) => state.token);\n\n if (!authType || !forms) {\n return <Navigate to=\"/\" />;\n }\n\n const Component = forms[authType as keyof FormDictionary];\n\n // Redirect the user to the login page if\n // the endpoint does not exist or\n // there is already an admin user oo\n // the user is already logged in\n if (!Component || (hasAdmin && authType === 'register-admin') || token) {\n return <Navigate to=\"/\" />;\n }\n\n // Redirect the user to the register-admin if it is the first user\n if (!hasAdmin && authType !== 'register-admin') {\n return (\n <Navigate\n to={{\n pathname: '/auth/register-admin',\n // Forward the `?redirectTo` from /auth/login\n // /abc => /auth/login?redirectTo=%2Fabc => /auth/register-admin?redirectTo=%2Fabc\n search,\n }}\n />\n );\n }\n\n if (Login && authType === 'login') {\n // Assign the component to render for the login form\n return <Login />;\n } else if (authType === 'login' && !Login) {\n // block rendering until the Login EE component is fully loaded\n return null;\n }\n\n return <Component hasAdmin={hasAdmin} />;\n};\n\nexport { AuthPage };\n","/**\n * NotFoundPage\n *\n * This is the page we show when the user visits a url that doesn't have a route\n *\n */\nimport {\n ContentLayout,\n EmptyStateLayout,\n HeaderLayout,\n LinkButton,\n Main,\n} from '@strapi/design-system';\nimport { useFocusWhenNavigate } from '@strapi/helper-plugin';\nimport { ArrowRight, EmptyPictures } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nexport const NotFoundPage = () => {\n const { formatMessage } = useIntl();\n useFocusWhenNavigate();\n\n return (\n <Main labelledBy=\"title\">\n <HeaderLayout\n id=\"title\"\n title={formatMessage({\n id: 'content-manager.pageNotFound',\n defaultMessage: 'Page not found',\n })}\n />\n <ContentLayout>\n <EmptyStateLayout\n action={\n <LinkButton variant=\"secondary\" endIcon={<ArrowRight />} to=\"/\">\n {formatMessage({\n id: 'app.components.NotFoundPage.back',\n defaultMessage: 'Back to homepage',\n })}\n </LinkButton>\n }\n content={formatMessage({\n id: 'app.page.not.found',\n defaultMessage: \"Oops! We can't seem to find the page you're looging for...\",\n })}\n hasRadius\n icon={<EmptyPictures width=\"10rem\" />}\n shadow=\"tableShadow\"\n />\n </ContentLayout>\n </Main>\n );\n};\n","import type { RouteObject } from 'react-router-dom';\n\nexport const ROUTES_CE: RouteObject[] = [\n {\n lazy: async () => {\n const { ProtectedListPage } = await import('./pages/Roles/ListPage');\n\n return {\n Component: ProtectedListPage,\n };\n },\n path: 'roles',\n },\n {\n lazy: async () => {\n const { ProtectedCreatePage } = await import('./pages/Roles/CreatePage');\n\n return {\n Component: ProtectedCreatePage,\n };\n },\n path: 'roles/duplicate/:id',\n },\n {\n lazy: async () => {\n const { ProtectedCreatePage } = await import('./pages/Roles/CreatePage');\n\n return {\n Component: ProtectedCreatePage,\n };\n },\n path: 'roles/new',\n },\n {\n lazy: async () => {\n const { ProtectedEditPage } = await import('./pages/Roles/EditPage');\n\n return {\n Component: ProtectedEditPage,\n };\n },\n path: 'roles/:id',\n },\n {\n lazy: async () => {\n const { ProtectedListPage } = await import('./pages/Users/ListPage');\n\n return {\n Component: ProtectedListPage,\n };\n },\n path: 'users',\n },\n {\n lazy: async () => {\n const { ProtectedEditPage } = await import('./pages/Users/EditPage');\n\n return {\n Component: ProtectedEditPage,\n };\n },\n path: 'users/:id',\n },\n {\n lazy: async () => {\n const { ProtectedCreatePage } = await import('./pages/Webhooks/CreatePage');\n\n return {\n Component: ProtectedCreatePage,\n };\n },\n path: 'webhooks/create',\n },\n {\n lazy: async () => {\n const { ProtectedEditPage } = await import('./pages/Webhooks/EditPage');\n\n return {\n Component: ProtectedEditPage,\n };\n },\n path: 'webhooks/:id',\n },\n {\n lazy: async () => {\n const { ProtectedListPage } = await import('./pages/Webhooks/ListPage');\n\n return {\n Component: ProtectedListPage,\n };\n },\n path: 'webhooks',\n },\n {\n lazy: async () => {\n const { ProtectedListView } = await import('./pages/ApiTokens/ListView');\n\n return {\n Component: ProtectedListView,\n };\n },\n path: 'api-tokens',\n },\n {\n lazy: async () => {\n const { ProtectedCreateView } = await import('./pages/ApiTokens/CreateView');\n\n return {\n Component: ProtectedCreateView,\n };\n },\n path: 'api-tokens/create',\n },\n {\n lazy: async () => {\n const { ProtectedEditView } = await import('./pages/ApiTokens/EditView/EditViewPage');\n\n return {\n Component: ProtectedEditView,\n };\n },\n path: 'api-tokens/:id',\n },\n {\n lazy: async () => {\n const { ProtectedCreateView } = await import('./pages/TransferTokens/CreateView');\n\n return {\n Component: ProtectedCreateView,\n };\n },\n path: 'transfer-tokens/create',\n },\n {\n lazy: async () => {\n const { ProtectedListView } = await import('./pages/TransferTokens/ListView');\n\n return {\n Component: ProtectedListView,\n };\n },\n path: 'transfer-tokens',\n },\n {\n lazy: async () => {\n const { ProtectedEditView } = await import('./pages/TransferTokens/EditView');\n\n return {\n Component: ProtectedEditView,\n };\n },\n path: 'transfer-tokens/:id',\n },\n {\n lazy: async () => {\n const { PurchaseAuditLogs } = await import('./pages/PurchaseAuditLogs');\n\n return {\n Component: PurchaseAuditLogs,\n };\n },\n path: 'purchase-audit-logs',\n },\n {\n lazy: async () => {\n const { PurchaseReviewWorkflows } = await import('./pages/PurchaseReviewWorkflows');\n\n return {\n Component: PurchaseReviewWorkflows,\n };\n },\n path: 'purchase-review-workflows',\n },\n {\n lazy: async () => {\n const { PurchaseSingleSignOn } = await import('./pages/PurchaseSingleSignOn');\n\n return {\n Component: PurchaseSingleSignOn,\n };\n },\n path: 'purchase-single-sign-on',\n },\n];\n","export const languageNativeNames = {\n ar: 'العربية',\n ca: 'Català',\n cs: 'Čeština',\n de: 'Deutsch',\n dk: 'Dansk',\n en: 'English',\n es: 'Español',\n eu: 'Euskara',\n fr: 'Français',\n gu: 'Gujarati',\n he: 'עברית',\n hu: 'Magyar',\n id: 'Indonesian',\n it: 'Italiano',\n ja: '日本語',\n ko: '한국어',\n ml: 'Malayalam',\n ms: 'Melayu',\n nl: 'Nederlands',\n no: 'Norwegian',\n pl: 'Polski',\n 'pt-BR': 'Português (Brasil)',\n pt: 'Português (Portugal)',\n ru: 'Русский',\n sk: 'Slovenčina',\n sv: 'Swedish',\n th: 'ไทย',\n tr: 'Türkçe',\n uk: 'Українська',\n vi: 'Tiếng Việt',\n 'zh-Hans': '中文 (简体)',\n zh: '中文 (繁體)',\n sa: 'संस्कृत',\n hi: 'हिन्दी',\n} as const;\n","import * as React from 'react';\n\nimport { darkTheme, lightTheme } from '@strapi/design-system';\nimport invariant from 'invariant';\nimport isFunction from 'lodash/isFunction';\nimport merge from 'lodash/merge';\nimport pick from 'lodash/pick';\nimport { Provider } from 'react-redux';\nimport { RouterProvider, createBrowserRouter } from 'react-router-dom';\nimport { DefaultTheme } from 'styled-components';\n\nimport { ADMIN_PERMISSIONS_EE, getEERoutes as getBaseEERoutes } from '../../ee/admin/src/constants';\nimport { getEERoutes as getSettingsEERoutes } from '../../ee/admin/src/pages/SettingsPage/constants';\n\nimport { App } from './App';\nimport Logo from './assets/images/logo-strapi-2022.svg';\nimport { ErrorElement } from './components/ErrorElement';\nimport {\n INJECTION_ZONES,\n InjectionZoneBlock,\n InjectionZoneComponent,\n InjectionZoneContainer,\n InjectionZoneModule,\n InjectionZones,\n} from './components/InjectionZone';\nimport { LanguageProvider } from './components/LanguageProvider';\nimport { Page } from './components/PageHelpers';\nimport { Theme } from './components/Theme';\nimport { ADMIN_PERMISSIONS_CE, HOOKS } from './constants';\nimport { routes as cmRoutes } from './content-manager/router';\nimport { ContentManagerPlugin } from './core/apis/content-manager';\nimport { CustomFields } from './core/apis/CustomFields';\nimport { Plugin, PluginConfig } from './core/apis/Plugin';\nimport { RootState, Store, configureStore } from './core/store/configure';\nimport { getBasename } from './core/utils/basename';\nimport { Handler, createHook } from './core/utils/createHook';\nimport { AuthPage } from './pages/Auth/AuthPage';\nimport { NotFoundPage } from './pages/NotFoundPage';\nimport { ROUTES_CE } from './pages/Settings/constants';\nimport { THEME_LOCAL_STORAGE_KEY, LANGUAGE_LOCAL_STORAGE_KEY, ThemeName } from './reducer';\nimport { languageNativeNames } from './translations/languageNativeNames';\n\nimport type { ReducersMapObject, Middleware } from '@reduxjs/toolkit';\nimport type { Permission } from '@strapi/helper-plugin';\nimport type { MessageDescriptor, PrimitiveType } from 'react-intl';\n\nconst {\n INJECT_COLUMN_IN_TABLE,\n MUTATE_COLLECTION_TYPES_LINKS,\n MUTATE_EDIT_VIEW_LAYOUT,\n MUTATE_SINGLE_TYPES_LINKS,\n} = HOOKS;\n\ninterface StrapiAppConstructorArgs extends Partial<Pick<StrapiApp, 'appPlugins'>> {\n config?: {\n auth?: { logo: string };\n head?: { favicon: string };\n locales?: string[];\n menu?: { logo: string };\n notifications?: { releases: boolean };\n theme?: { light: DefaultTheme; dark: DefaultTheme };\n translations?: Record<string, Record<string, string>>;\n tutorials?: boolean;\n };\n}\n\ninterface MenuItem {\n to: string;\n icon: React.ElementType;\n intlLabel: MessageDescriptor & { values?: Record<string, PrimitiveType> };\n permissions: Permission[];\n notificationsCount?: number;\n Component: React.LazyExoticComponent<React.ComponentType>;\n exact?: boolean;\n lockIcon?: boolean;\n}\n\ninterface StrapiAppSettingLink extends Omit<MenuItem, 'icon' | 'notificationCount'> {\n id: string;\n}\n\ninterface StrapiAppPlugin {\n bootstrap: (\n args: Pick<\n StrapiApp,\n | 'addSettingsLink'\n | 'addSettingsLinks'\n | 'getPlugin'\n | 'injectContentManagerComponent'\n | 'injectAdminComponent'\n | 'registerHook'\n >\n ) => void;\n register: (app: StrapiApp) => void;\n registerTrads: (args: {\n locales: string[];\n }) => Promise<{ data: Record<string, string>; locale: string }[]>;\n}\n\ninterface UnloadedSettingsLink extends Omit<StrapiAppSettingLink, 'Component'> {\n Component: () => Promise<{ default: React.ComponentType }>;\n}\n\ninterface Component {\n name: string;\n Component: React.ComponentType;\n}\n\ninterface Field {\n type: string;\n Component: React.ComponentType;\n}\n\ninterface Library {\n fields: Record<Field['type'], Field['Component']>;\n components: Record<Component['name'], Component['Component']>;\n}\n\ninterface StrapiAppSetting {\n id: string;\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n links: StrapiAppSettingLink[];\n}\n\nclass StrapiApp {\n appPlugins: Record<string, StrapiAppPlugin>;\n plugins: Record<string, Plugin> = {};\n hooksDict: Record<string, ReturnType<typeof createHook>> = {};\n\n admin = {\n injectionZones: INJECTION_ZONES,\n };\n\n translations: StrapiApp['configurations']['translations'] = {};\n\n /**\n * MENU API\n */\n menu: MenuItem[] = [];\n settings: Record<string, StrapiAppSetting> = {\n global: {\n id: 'global',\n intlLabel: {\n id: 'Settings.global',\n defaultMessage: 'Global Settings',\n },\n links: [],\n },\n };\n\n configurations = {\n authLogo: Logo,\n head: { favicon: '' },\n locales: ['en'],\n menuLogo: Logo,\n notifications: { releases: true },\n themes: { light: lightTheme, dark: darkTheme },\n translations: {},\n tutorials: true,\n };\n\n /**\n * APIs\n */\n private contentManager = new ContentManagerPlugin();\n library: Library = {\n components: {},\n fields: {},\n };\n middlewares: Array<() => Middleware<object, RootState>> = [];\n reducers: ReducersMapObject = {};\n customFields = new CustomFields();\n\n constructor({ config, appPlugins }: StrapiAppConstructorArgs = {}) {\n this.appPlugins = appPlugins || {};\n\n this.createCustomConfigurations(config ?? {});\n\n this.registerPlugin(this.contentManager.config);\n\n this.createHook(INJECT_COLUMN_IN_TABLE);\n this.createHook(MUTATE_COLLECTION_TYPES_LINKS);\n this.createHook(MUTATE_SINGLE_TYPES_LINKS);\n this.createHook(MUTATE_EDIT_VIEW_LAYOUT);\n }\n\n addComponents = (components: Component | Component[]) => {\n if (Array.isArray(components)) {\n components.map((comp) => {\n invariant(comp.Component, 'A Component must be provided');\n invariant(comp.name, 'A type must be provided');\n\n this.library.components[comp.name] = comp.Component;\n });\n } else {\n invariant(components.Component, 'A Component must be provided');\n invariant(components.name, 'A type must be provided');\n\n this.library.components[components.name] = components.Component;\n }\n };\n\n addFields = (fields: Field | Field[]) => {\n if (Array.isArray(fields)) {\n fields.map((field) => {\n invariant(field.Component, 'A Component must be provided');\n invariant(field.type, 'A type must be provided');\n\n this.library.fields[field.type] = field.Component;\n });\n } else {\n invariant(fields.Component, 'A Component must be provided');\n invariant(fields.type, 'A type must be provided');\n\n this.library.fields[fields.type] = fields.Component;\n }\n };\n\n addMenuLink = (\n link: Omit<MenuItem, 'Component'> & {\n Component: () => Promise<{ default: React.ComponentType }>;\n }\n ) => {\n invariant(link.to, `[${link.intlLabel.defaultMessage}]: link.to should be defined`);\n invariant(\n typeof link.to === 'string',\n `[${\n link.intlLabel.defaultMessage\n }]: Expected link.to to be a string instead received ${typeof link.to}`\n );\n invariant(\n link.intlLabel?.id && link.intlLabel?.defaultMessage,\n `[${link.intlLabel.defaultMessage}]: link.intlLabel.id & link.intlLabel.defaultMessage should be defined`\n );\n invariant(\n link.Component && typeof link.Component === 'function',\n `[${link.intlLabel.defaultMessage}]: link.Component must be a function returning a Promise that returns a default component. Please use: \\`Component: () => import(path)\\` instead.`\n );\n invariant(\n link.icon && typeof link.icon === 'function',\n `[${link.intlLabel.defaultMessage}]: link.Icon should be a valid React Component`\n );\n\n if (\n link.Component &&\n typeof link.Component === 'function' &&\n // @ts-expect-error – shh\n link.Component[Symbol.toStringTag] === 'AsyncFunction'\n ) {\n console.warn(`\n [${link.intlLabel.defaultMessage}]: [deprecated] addMenuLink() was called with an async Component from the plugin \"${link.intlLabel.defaultMessage}\". This will be removed\n in the future. Please use: \\`Component: () => import(path)\\` ensuring you return a default export instead.\n `);\n }\n\n if (link.to.startsWith('/')) {\n console.warn(\n `[${link.intlLabel.defaultMessage}]: the \\`to\\` property of your menu link is an absolute path, it should be relative to the root of the application. This has been corrected for you but will be removed in a future version of Strapi.`\n );\n\n link.to = link.to.slice(1);\n }\n\n this.menu.push({\n ...link,\n Component: React.lazy(async () => {\n const mod = await link.Component();\n\n if ('default' in mod) {\n return mod;\n } else {\n return { default: mod };\n }\n }),\n });\n };\n\n addMiddlewares = (middlewares: StrapiApp['middlewares']) => {\n middlewares.forEach((middleware) => {\n this.middlewares.push(middleware);\n });\n };\n\n addReducers = (reducers: ReducersMapObject) => {\n /**\n * TODO: when we upgrade to redux-toolkit@2 and we can also dynamically add middleware,\n * we'll deprecate these two APIs in favour of their hook counterparts.\n */\n Object.entries(reducers).forEach(([name, reducer]) => {\n this.reducers[name] = reducer;\n });\n };\n\n addSettingsLink = (sectionId: keyof StrapiApp['settings'], link: UnloadedSettingsLink) => {\n invariant(this.settings[sectionId], 'The section does not exist');\n\n invariant(link.id, `[${link.intlLabel.defaultMessage}]: link.id should be defined`);\n invariant(\n link.intlLabel?.id && link.intlLabel?.defaultMessage,\n `[${link.intlLabel.defaultMessage}]: link.intlLabel.id & link.intlLabel.defaultMessage`\n );\n invariant(link.to, `[${link.intlLabel.defaultMessage}]: link.to should be defined`);\n invariant(\n link.Component && typeof link.Component === 'function',\n `[${link.intlLabel.defaultMessage}]: link.Component must be a function returning a Promise. Please use: \\`Component: () => import(path)\\` instead.`\n );\n\n if (\n link.Component &&\n typeof link.Component === 'function' &&\n // @ts-expect-error – shh\n link.Component[Symbol.toStringTag] === 'AsyncFunction'\n ) {\n console.warn(`\n [${link.intlLabel.defaultMessage}]: [deprecated] addSettingsLink() was called with an async Component from the plugin \"${link.intlLabel.defaultMessage}\". This will be removed\n in the future. Please use: \\`Component: () => import(path)\\` ensuring you return a default export instead.\n `);\n }\n\n if (link.to.startsWith('/')) {\n console.warn(\n `[${link.intlLabel.defaultMessage}]: the \\`to\\` property of your settings link is an absolute path. It should be relative to \\`/settings\\`. This has been corrected for you but will be removed in a future version of Strapi.`\n );\n\n link.to = link.to.slice(1);\n }\n\n if (link.to.split('/')[0] === 'settings') {\n console.warn(\n `[${link.intlLabel.defaultMessage}]: the \\`to\\` property of your settings link has \\`settings\\` as the first part of it's path. It should be relative to \\`settings\\` and therefore, not include it. This has been corrected for you but will be removed in a future version of Strapi.`\n );\n\n link.to = link.to.split('/').slice(1).join('/');\n }\n\n this.settings[sectionId].links.push({\n ...link,\n Component: React.lazy(async () => {\n const mod = await link.Component();\n\n if ('default' in mod) {\n return mod;\n } else {\n return { default: mod };\n }\n }),\n });\n };\n\n addSettingsLinks = (\n sectionId: Parameters<typeof this.addSettingsLink>[0],\n links: UnloadedSettingsLink[]\n ) => {\n invariant(this.settings[sectionId], 'The section does not exist');\n invariant(Array.isArray(links), 'TypeError expected links to be an array');\n\n links.forEach((link) => {\n this.addSettingsLink(sectionId, link);\n });\n };\n\n async bootstrap(customBootstrap?: unknown) {\n Object.keys(this.appPlugins).forEach((plugin) => {\n const bootstrap = this.appPlugins[plugin].bootstrap;\n\n if (bootstrap) {\n bootstrap({\n addSettingsLink: this.addSettingsLink,\n addSettingsLinks: this.addSettingsLinks,\n getPlugin: this.getPlugin,\n injectContentManagerComponent: this.injectContentManagerComponent,\n injectAdminComponent: this.injectAdminComponent,\n registerHook: this.registerHook,\n });\n }\n });\n\n if (isFunction(customBootstrap)) {\n customBootstrap({\n addComponents: this.addComponents,\n addFields: this.addFields,\n addMenuLink: this.addMenuLink,\n addReducers: this.addReducers,\n addSettingsLink: this.addSettingsLink,\n addSettingsLinks: this.addSettingsLinks,\n getPlugin: this.getPlugin,\n injectContentManagerComponent: this.injectContentManagerComponent,\n injectAdminComponent: this.injectAdminComponent,\n registerHook: this.registerHook,\n });\n }\n }\n\n createCustomConfigurations = (customConfig: NonNullable<StrapiAppConstructorArgs['config']>) => {\n if (customConfig.locales) {\n this.configurations.locales = [\n 'en',\n ...(customConfig.locales?.filter((loc) => loc !== 'en') || []),\n ];\n }\n\n if (customConfig.auth?.logo) {\n this.configurations.authLogo = customConfig.auth.logo;\n }\n\n if (customConfig.menu?.logo) {\n this.configurations.menuLogo = customConfig.menu.logo;\n }\n\n if (customConfig.head?.favicon) {\n this.configurations.head.favicon = customConfig.head.favicon;\n }\n\n if (customConfig.theme) {\n const darkTheme = customConfig.theme.dark;\n const lightTheme = customConfig.theme.light;\n\n if (!darkTheme && !lightTheme) {\n console.warn(\n `[deprecated] In future versions, Strapi will stop supporting this theme customization syntax. The theme configuration accepts a light and a dark key to customize each theme separately. See https://docs.strapi.io/developer-docs/latest/development/admin-customization.html#theme-extension.`\n );\n merge(this.configurations.themes.light, customConfig.theme);\n }\n\n if (lightTheme) merge(this.configurations.themes.light, lightTheme);\n\n if (darkTheme) merge(this.configurations.themes.dark, darkTheme);\n }\n\n if (customConfig.notifications?.releases !== undefined) {\n this.configurations.notifications.releases = customConfig.notifications.releases;\n }\n\n if (customConfig.tutorials !== undefined) {\n this.configurations.tutorials = customConfig.tutorials;\n }\n };\n\n createHook = (name: string) => {\n this.hooksDict[name] = createHook();\n };\n\n createSettingSection = (section: StrapiAppSetting, links: UnloadedSettingsLink[]) => {\n invariant(section.id, 'section.id should be defined');\n invariant(\n section.intlLabel?.id && section.intlLabel?.defaultMessage,\n 'section.intlLabel should be defined'\n );\n\n invariant(Array.isArray(links), 'TypeError expected links to be an array');\n invariant(this.settings[section.id] === undefined, 'A similar section already exists');\n\n this.settings[section.id] = { ...section, links: [] };\n\n links.forEach((link) => {\n this.addSettingsLink(section.id, link);\n });\n };\n\n getAdminInjectedComponents = (\n moduleName: InjectionZoneModule,\n containerName: InjectionZoneContainer,\n blockName: InjectionZoneBlock\n ): InjectionZoneComponent[] => {\n try {\n // @ts-expect-error – we have a catch block so if you don't pass it correctly we still return an array.\n return this.admin.injectionZones[moduleName][containerName][blockName] || [];\n } catch (err) {\n console.error('Cannot get injected component', err);\n\n return [];\n }\n };\n\n getPlugin = (pluginId: PluginConfig['id']) => this.plugins[pluginId];\n\n async register() {\n Object.keys(this.appPlugins).forEach((plugin) => {\n this.appPlugins[plugin].register(this);\n });\n }\n\n injectContentManagerComponent = <TContainerName extends keyof InjectionZones['contentManager']>(\n containerName: TContainerName,\n blockName: keyof InjectionZones['contentManager'][TContainerName],\n component: InjectionZoneComponent\n ) => {\n invariant(\n this.admin.injectionZones.contentManager[containerName]?.[blockName],\n `The ${containerName} ${String(blockName)} zone is not defined in the content manager`\n );\n invariant(component, 'A Component must be provided');\n\n if (containerName === 'editView' && blockName === 'right-links') {\n console.warn(\n `Injecting components into editView.right-links is deprecated. Please use the \\`addEditViewSidePanel\\` API instead.`\n );\n }\n\n // @ts-expect-error – we've alredy checked above that the block exists.\n this.admin.injectionZones.contentManager[containerName][blockName].push(component);\n };\n\n injectAdminComponent = <TContainerName extends keyof InjectionZones['admin']>(\n containerName: TContainerName,\n blockName: keyof InjectionZones['admin'][TContainerName],\n component: InjectionZoneComponent\n ) => {\n invariant(\n this.admin.injectionZones.admin[containerName]?.[blockName],\n `The ${containerName} ${String(blockName)} zone is not defined in the admin`\n );\n invariant(component, 'A Component must be provided');\n\n // @ts-expect-error – we've alredy checked above that the block exists.\n this.admin.injectionZones.admin[containerName][blockName].push(component);\n };\n\n async loadAdminTrads() {\n const adminLocales = await Promise.all(\n this.configurations.locales.map(async (locale) => {\n try {\n const { default: data } = await import(`./translations/${locale}.json`);\n\n return { data, locale };\n } catch {\n return { data: null, locale };\n }\n })\n );\n\n return adminLocales.reduce<{ [locale: string]: Record<string, string> }>((acc, current) => {\n if (current.data) {\n acc[current.locale] = current.data;\n }\n\n return acc;\n }, {});\n }\n\n /**\n * Load the application's translations and merged the custom translations\n * with the default ones.\n */\n async loadTrads(customTranslations: Record<string, Record<string, string>> = {}) {\n const adminTranslations = await this.loadAdminTrads();\n\n const arrayOfPromises = Object.keys(this.appPlugins)\n .map((plugin) => {\n const registerTrads = this.appPlugins[plugin].registerTrads;\n\n if (registerTrads) {\n return registerTrads({ locales: this.configurations.locales });\n }\n\n return null;\n })\n .filter((a) => a);\n\n type Translation = Awaited<ReturnType<StrapiAppPlugin['registerTrads']>>[number];\n\n const pluginsTrads = (await Promise.all(arrayOfPromises)) as Array<Translation[]>;\n const mergedTrads = pluginsTrads.reduce<{ [locale: string]: Translation['data'] }>(\n (acc, currentPluginTrads) => {\n const pluginTrads = currentPluginTrads.reduce<{ [locale: string]: Translation['data'] }>(\n (acc1, current) => {\n acc1[current.locale] = current.data;\n\n return acc1;\n },\n {}\n );\n\n Object.keys(pluginTrads).forEach((locale) => {\n acc[locale] = { ...acc[locale], ...pluginTrads[locale] };\n });\n\n return acc;\n },\n {}\n );\n\n const translations = this.configurations.locales.reduce<{\n [locale: string]: Translation['data'];\n }>((acc, current) => {\n acc[current] = {\n ...adminTranslations[current],\n ...(mergedTrads[current] || {}),\n ...(customTranslations[current] ?? {}),\n };\n\n return acc;\n }, {});\n\n this.configurations.translations = translations;\n\n return Promise.resolve();\n }\n\n registerHook = (name: string, fn: Handler) => {\n invariant(\n this.hooksDict[name],\n `The hook ${name} is not defined. You are trying to register a hook that does not exist in the application.`\n );\n this.hooksDict[name].register(fn);\n };\n\n registerPlugin = (pluginConf: PluginConfig) => {\n const plugin = new Plugin(pluginConf);\n\n this.plugins[plugin.pluginId] = plugin;\n };\n\n runHookSeries = (name: string, asynchronous = false) =>\n asynchronous ? this.hooksDict[name].runSeriesAsync() : this.hooksDict[name].runSeries();\n\n runHookWaterfall = <T,>(name: string, initialValue: T, store?: Store) => {\n return this.hooksDict[name].runWaterfall(initialValue, store);\n };\n\n runHookParallel = (name: string) => this.hooksDict[name].runParallel();\n\n render() {\n const localeNames = pick(languageNativeNames, this.configurations.locales || []);\n const locale = (localStorage.getItem(LANGUAGE_LOCAL_STORAGE_KEY) ||\n 'en') as keyof typeof localeNames;\n\n const store = configureStore(\n {\n admin_app: {\n permissions: merge({}, ADMIN_PERMISSIONS_CE, ADMIN_PERMISSIONS_EE),\n theme: {\n availableThemes: [],\n currentTheme: (localStorage.getItem(THEME_LOCAL_STORAGE_KEY) || 'system') as ThemeName,\n },\n language: {\n locale: localeNames[locale] ? locale : 'en',\n localeNames,\n },\n },\n },\n this.middlewares,\n this.reducers\n ) as Store;\n\n const settingsRoutes = [...getSettingsEERoutes(), ...ROUTES_CE].filter(\n (route, index, refArray) => refArray.findIndex((obj) => obj.path === route.path) === index\n );\n\n const router = createBrowserRouter(\n [\n {\n path: '/*',\n errorElement: (\n <Provider store={store}>\n <LanguageProvider messages={this.configurations.translations}>\n <Theme themes={this.configurations.themes}>\n <ErrorElement />\n </Theme>\n </LanguageProvider>\n </Provider>\n ),\n element: <App strapi={this} store={store} />,\n children: [\n {\n path: 'usecase',\n lazy: async () => {\n const { PrivateUseCasePage } = await import('./pages/UseCasePage');\n\n return {\n Component: PrivateUseCasePage,\n };\n },\n },\n {\n path: 'auth/:authType',\n element: <AuthPage />,\n },\n {\n path: '/*',\n lazy: async () => {\n const { PrivateAdminLayout } = await import('./layouts/AuthenticatedLayout');\n\n return {\n Component: PrivateAdminLayout,\n };\n },\n children: [\n {\n index: true,\n lazy: async () => {\n const { HomePage } = await import('./pages/HomePage');\n\n return {\n Component: HomePage,\n };\n },\n },\n {\n path: 'me',\n lazy: async () => {\n const { ProfilePage } = await import('./pages/ProfilePage');\n\n return {\n Component: ProfilePage,\n };\n },\n },\n {\n path: 'list-plugins',\n lazy: async () => {\n const { ProtectedInstalledPluginsPage } = await import(\n './pages/InstalledPluginsPage'\n );\n\n return {\n Component: ProtectedInstalledPluginsPage,\n };\n },\n },\n {\n path: 'marketplace',\n lazy: async () => {\n const { ProtectedMarketplacePage } = await import(\n './pages/Marketplace/MarketplacePage'\n );\n\n return {\n Component: ProtectedMarketplacePage,\n };\n },\n },\n {\n path: 'settings/*',\n lazy: async () => {\n const { Layout } = await import('./pages/Settings/Layout');\n\n return {\n Component: Layout,\n };\n },\n children: [\n {\n path: 'application-infos',\n lazy: async () => {\n const { ApplicationInfoPage } = await import(\n './pages/Settings/pages/ApplicationInfo/ApplicationInfoPage'\n );\n\n return {\n Component: ApplicationInfoPage,\n };\n },\n },\n ...Object.values(this.settings).flatMap(({ links }) =>\n links.map(({ to, Component }) => ({\n path: `${to}/*`,\n element: (\n <React.Suspense fallback={<Page.Loading />}>\n <Component />\n </React.Suspense>\n ),\n }))\n ),\n ...settingsRoutes,\n ],\n },\n ...this.menu.map(({ to, Component }) => ({\n path: `${to}/*`,\n element: (\n <React.Suspense fallback={<Page.Loading />}>\n <Component />\n </React.Suspense>\n ),\n })),\n ...getBaseEERoutes(),\n ...cmRoutes,\n ],\n },\n {\n path: '*',\n element: <NotFoundPage />,\n },\n ],\n },\n ],\n {\n basename: getBasename(),\n }\n );\n\n return <RouterProvider router={router} />;\n }\n}\n\nexport { StrapiApp };\nexport type {\n StrapiAppPlugin,\n StrapiAppSettingLink,\n StrapiAppSetting,\n MenuItem,\n StrapiAppConstructorArgs,\n};\n","/* eslint-disable no-undef */\nimport { getFetchClient } from '@strapi/helper-plugin';\nimport { createRoot } from 'react-dom/client';\n\nimport { StrapiApp, StrapiAppConstructorArgs } from './StrapiApp';\n\nimport type { FeaturesConfig, FeaturesService } from '@strapi/types';\n\ninterface RenderAdminArgs {\n customisations: {\n bootstrap?: (app: StrapiApp) => Promise<void> | void;\n config?: StrapiAppConstructorArgs['config'];\n };\n plugins: StrapiAppConstructorArgs['appPlugins'];\n features?: FeaturesService['config'];\n}\n\nconst renderAdmin = async (\n mountNode: HTMLElement | null,\n { plugins, customisations, features }: RenderAdminArgs\n) => {\n if (!mountNode) {\n throw new Error('[@strapi/admin]: Could not find the root element to mount the admin app');\n }\n\n window.strapi = {\n /**\n * This ENV variable is passed from the strapi instance, by default no url is set\n * in the config and therefore the instance returns you an empty string so URLs are relative.\n *\n * To ensure that the backendURL is always set, we use the window.location.origin as a fallback.\n */\n backendURL: process.env.STRAPI_ADMIN_BACKEND_URL || window.location.origin,\n isEE: false,\n telemetryDisabled: process.env.STRAPI_TELEMETRY_DISABLED === 'true' ? true : false,\n future: {\n isEnabled: (name: keyof NonNullable<FeaturesConfig['future']>) => {\n return features?.future?.[name] === true;\n },\n },\n // @ts-expect-error – there's pollution from the global scope of Node.\n features: {\n SSO: 'sso',\n AUDIT_LOGS: 'audit-logs',\n REVIEW_WORKFLOWS: 'review-workflows',\n /**\n * If we don't get the license then we know it's not EE\n * so no feature is enabled.\n */\n isEnabled: () => false,\n },\n projectType: 'Community',\n flags: {\n nps: false,\n promoteEE: true,\n },\n };\n\n const { get } = getFetchClient();\n\n interface ProjectType extends Pick<Window['strapi'], 'flags'> {\n isEE: boolean;\n features: {\n name: string;\n }[];\n }\n\n try {\n const {\n data: {\n data: { isEE, features, flags },\n },\n } = await get<{ data: ProjectType }>('/admin/project-type');\n\n window.strapi.isEE = isEE;\n window.strapi.flags = flags;\n window.strapi.features = {\n ...window.strapi.features,\n isEnabled: (featureName) => features.some((feature) => feature.name === featureName),\n };\n window.strapi.projectType = isEE ? 'Enterprise' : 'Community';\n } catch (err) {\n /**\n * If this fails, we simply don't activate any EE features.\n * Should we warn clearer in the UI?\n */\n console.error(err);\n }\n\n const app = new StrapiApp({\n config: customisations?.config,\n appPlugins: plugins,\n });\n\n await app.register();\n await app.bootstrap(customisations?.bootstrap);\n await app.loadTrads(customisations?.config?.translations);\n\n createRoot(mountNode).render(app.render());\n\n if (\n typeof module !== 'undefined' &&\n module &&\n 'hot' in module &&\n typeof module.hot === 'object' &&\n module.hot !== null &&\n 'accept' in module.hot &&\n typeof module.hot.accept === 'function'\n ) {\n module.hot.accept();\n }\n\n if (typeof import.meta.hot?.accept === 'function') {\n import.meta.hot.accept();\n }\n};\n\nexport { renderAdmin };\nexport type { RenderAdminArgs };\n","import * as React from 'react';\n\nimport {\n Button,\n ButtonProps,\n Dialog,\n DialogBody,\n DialogFooter,\n Flex,\n Typography,\n DialogBodyProps,\n DialogProps,\n DialogFooterProps,\n} from '@strapi/design-system';\nimport { ExclamationMarkCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\n/* -------------------------------------------------------------------------------------------------\n * ConfirmDialog\n * -----------------------------------------------------------------------------------------------*/\ninterface ConfirmDialogProps\n extends Omit<DialogProps, 'title'>,\n Partial<Pick<DialogProps, 'title'>>,\n Pick<ButtonProps, 'variant'>,\n Partial<DialogFooterProps>,\n Pick<DialogBodyProps, 'icon'> {\n onConfirm?: () => Promise<void> | void;\n}\n\n/**\n * @beta\n * @public\n * @description A simple confirm dialog that out of the box can be used to confirm an action.\n * The component can additionally be customised if required e.g. the footer actions can be\n * completely replaced, but cannot be removed. Passing a string as the children prop will render\n * the string as the body of the dialog. If you need more control over the body, you can pass a\n * custom component as the children prop.\n * @example\n * ```tsx\n * const DeleteAction = ({ id }) => {\n * const [isOpen, setIsOpen] = React.useState(false);\n *\n * const [delete] = useDeleteMutation()\n * const handleConfirm = async () => {\n * await delete(id)\n * }\n *\n * return (\n * <>\n * <Button onClick={() => setIsOpen(true)}>Delete</Button>\n * <ConfirmDialog onConfirm={handleConfirm} onClose={() => setIsOpen(false)} isOpen={isOpen} />\n * </>\n * )\n * }\n * ```\n */\nconst ConfirmDialog = ({\n children,\n icon = <ExclamationMarkCircle />,\n onClose,\n onConfirm,\n variant = 'danger',\n startAction,\n endAction,\n ...props\n}: ConfirmDialogProps) => {\n const { formatMessage } = useIntl();\n const [isConfirming, setIsConfirming] = React.useState(false);\n\n const content =\n children ||\n formatMessage({\n id: 'app.confirm.body',\n defaultMessage: 'Are you sure?',\n });\n\n const handleConfirm = async () => {\n if (!onConfirm) {\n return;\n }\n\n try {\n setIsConfirming(true);\n await onConfirm();\n onClose();\n } finally {\n setIsConfirming(false);\n }\n };\n\n return (\n <Dialog\n title={formatMessage({\n id: 'app.components.ConfirmDialog.title',\n defaultMessage: 'Confirmation',\n })}\n onClose={onClose}\n {...props}\n >\n <DialogBody icon={icon}>\n {typeof content === 'string' ? <DefaultBodyWrapper>{content}</DefaultBodyWrapper> : content}\n </DialogBody>\n <DialogFooter\n startAction={\n startAction || (\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'app.components.Button.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n )\n }\n endAction={\n endAction || (\n <Button onClick={handleConfirm} variant={variant} loading={isConfirming}>\n {formatMessage({\n id: 'app.components.Button.confirm',\n defaultMessage: 'Confirm',\n })}\n </Button>\n )\n }\n />\n </Dialog>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DefaultBodyWrapper\n * -----------------------------------------------------------------------------------------------*/\ninterface DefaultBodyWrapperProps {\n children: React.ReactNode;\n}\n\nconst DefaultBodyWrapper = ({ children }: DefaultBodyWrapperProps) => {\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Flex justifyContent=\"center\">\n <Typography variant=\"omega\">{children}</Typography>\n </Flex>\n </Flex>\n );\n};\n\nexport { ConfirmDialog };\nexport type { ConfirmDialogProps };\n","/* eslint-disable import/export */\nimport * as React from 'react';\n\nimport { Flex, SingleSelectOption, SingleSelect, Typography } from '@strapi/design-system';\nimport {\n Dots,\n NextLink,\n PageLink,\n Pagination as PaginationImpl,\n PreviousLink,\n} from '@strapi/design-system/v2';\nimport { useQueryParams } from '@strapi/helper-plugin';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { createContext } from './Context';\n\nimport type { Pagination as PaginationApi } from '../../../shared/contracts/shared';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\ninterface PaginationContextValue {\n /**\n * @description the complete query object, this could include query params\n * injected by other plugins, if you're navigating to a different page you\n * should ensure these are still passed.\n */\n currentQuery?: object;\n pageCount: string;\n pageSize: string;\n page: string;\n setPageSize: (pageSize: string) => void;\n total: NonNullable<RootProps['total']>;\n}\n\nconst [PaginationProvider, usePagination] = createContext<PaginationContextValue>('Pagination');\n\ninterface RootProps {\n children: React.ReactNode;\n /**\n * @default 0\n * @description the total number of pages\n * that exist in the dataset.\n */\n pageCount?: PaginationApi['pageCount'];\n /**\n * @default 1\n * @description the initial page number.\n */\n defaultPage?: PaginationApi['page'];\n /**\n * @default 10\n * @description the initial number of items to display\n */\n defaultPageSize?: PaginationApi['pageSize'];\n /**\n * @description a callback that is called when the page size changes.\n */\n onPageSizeChange?: (pageSize: string) => void;\n /**\n * @default 0\n * @description the total number of items in the dataset.\n */\n total?: PaginationApi['total'];\n}\n\n/**\n * @description The root component for the composable pagination component.\n * It's advised to spread the entire pagination option object into this component.\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * return (\n * <Pagination.Root {...response.pagination}>\n * <Pagination.PageSize />\n * <Pagination.Links />\n * </Pagination.Root>\n * );\n * };\n * ```\n */\nconst Root = React.forwardRef<HTMLDivElement, RootProps>(\n (\n { children, defaultPageSize = 10, pageCount = 0, defaultPage = 1, onPageSizeChange, total = 0 },\n forwardedRef\n ) => {\n const [{ query }, setQuery] = useQueryParams<Pick<PaginationContextValue, 'page' | 'pageSize'>>(\n {\n pageSize: defaultPageSize.toString(),\n page: defaultPage.toString(),\n }\n );\n\n const setPageSize = (pageSize: string) => {\n setQuery({ pageSize, page: '1' });\n\n if (onPageSizeChange) {\n onPageSizeChange(pageSize);\n }\n };\n\n return (\n <Flex ref={forwardedRef} paddingTop={4} alignItems=\"flex-end\" justifyContent=\"space-between\">\n <PaginationProvider\n currentQuery={query}\n page={query.page}\n pageSize={query.pageSize}\n pageCount={pageCount.toString()}\n setPageSize={setPageSize}\n total={total}\n >\n {children}\n </PaginationProvider>\n </Flex>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * PageSize\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description The page size component is responsible for rendering the select input that allows\n * the user to change the number of items displayed per page.\n * If the total number of items is less than the minimum option, this component will not render.\n */\nconst PageSize = ({ options = ['10', '20', '50', '100'] }: Pagination.PageSizeProps) => {\n const { formatMessage } = useIntl();\n\n const pageSize = usePagination('PageSize', (state) => state.pageSize);\n const totalCount = usePagination('PageSize', (state) => state.total);\n const setPageSize = usePagination('PageSize', (state) => state.setPageSize);\n\n const handleChange = (value: string) => {\n setPageSize(value);\n };\n\n const minimumOption = parseInt(options[0], 10);\n\n if (minimumOption >= totalCount) {\n return null;\n }\n\n return (\n <Flex gap={2}>\n <SingleSelect\n size=\"S\"\n aria-label={formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n // @ts-expect-error from the DS V2 this won't be needed because we're only returning strings.\n onChange={handleChange}\n value={pageSize}\n >\n {options.map((option) => (\n <SingleSelectOption key={option} value={option}>\n {option}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Typography textColor=\"neutral600\" as=\"span\">\n {formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Links\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * The component works as follows\n * `1` , 2, 3, ... 10\n * 1, `2`, 3, ... 10\n * 1, 2, `3`, 4, ... 10\n * 1, 2, 3, `4`, 5, ... 10\n * 1, ..,4, `5`, 6, ... 10\n *\n * 1, ...., 8, 9, `10`\n * 1, ...., 8, `9`, 10\n * 1, ...., 7, `8`, 9, 10\n * 1, ... 6, `7`, 8, 9, 10\n */\n\n/**\n * @description The links component is responsible for rendering the pagination links.\n * If the total number of pages is less than or equal to 1, this component will not render.\n */\nconst Links = ({ boundaryCount = 1, siblingCount = 1 }: Pagination.LinksProps) => {\n const { formatMessage } = useIntl();\n\n const query = usePagination('Links', (state) => state.currentQuery);\n const currentPage = usePagination('Links', (state) => state.page);\n const totalPages = usePagination('Links', (state) => state.pageCount);\n\n const pageCount = parseInt(totalPages, 10);\n const activePage = parseInt(currentPage, 10);\n\n const range = (start: number, end: number) => {\n const length = end - start + 1;\n\n return Array.from({ length }, (_, i) => start + i);\n };\n\n const startPages = range(1, Math.min(boundaryCount, pageCount));\n const endPages = range(Math.max(pageCount - boundaryCount + 1, boundaryCount + 1), pageCount);\n\n const siblingsStart = Math.max(\n Math.min(\n // Natural start\n activePage - siblingCount,\n // Lower boundary when page is high\n pageCount - boundaryCount - siblingCount * 2 - 1\n ),\n // Greater than startPages\n boundaryCount + 2\n );\n\n const siblingsEnd = Math.min(\n Math.max(\n // Natural end\n activePage + siblingCount,\n // Upper boundary when page is low\n boundaryCount + siblingCount * 2 + 2\n ),\n // Less than endPages\n endPages.length > 0 ? endPages[0] - 2 : pageCount - 1\n );\n\n const items = [\n ...startPages,\n\n // Start ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsStart > boundaryCount + 2\n ? ['start-ellipsis']\n : boundaryCount + 1 < pageCount - boundaryCount\n ? [boundaryCount + 1]\n : []),\n\n // Sibling pages\n ...range(siblingsStart, siblingsEnd),\n\n // End ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsEnd < pageCount - boundaryCount - 1\n ? ['end-ellipsis']\n : pageCount - boundaryCount > boundaryCount\n ? [pageCount - boundaryCount]\n : []),\n\n ...endPages,\n ];\n\n if (pageCount <= 1) {\n return null;\n }\n\n return (\n <PaginationImpl activePage={activePage} pageCount={pageCount}>\n <PreviousLink\n as={Link}\n // @ts-expect-error – the `as` prop does not correctly infer the props of it's component\n to={{ search: stringify({ ...query, page: activePage - 1 }) }}\n >\n {formatMessage({\n id: 'components.pagination.go-to-previous',\n defaultMessage: 'Go to previous page',\n })}\n </PreviousLink>\n {items.map((item) => {\n if (typeof item === 'number') {\n return (\n <PageLink\n as={Link}\n active={item === activePage}\n key={item}\n number={item}\n // @ts-expect-error – the `as` prop does not correctly infer the props of it's component\n to={{ search: stringify({ ...query, page: item }) }}\n >\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: item }\n )}\n </PageLink>\n );\n }\n\n return <Dots key={item} />;\n })}\n\n <NextLink\n as={Link}\n // @ts-expect-error – the `as` prop does not correctly infer the props of it's component\n to={{ search: stringify({ ...query, page: activePage + 1 }) }}\n >\n {formatMessage({\n id: 'components.pagination.go-to-next',\n defaultMessage: 'Go to next page',\n })}\n </NextLink>\n </PaginationImpl>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Pagination = {\n Root,\n Links,\n PageSize,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Pagination {\n export interface Props extends RootProps {}\n\n export interface PageSizeProps {\n options?: string[];\n }\n\n export interface LinksProps {\n /**\n * @default 1\n * @description Number of always visible pages at the beginning and end.\n */\n boundaryCount?: number;\n /**\n * @default 1\n * @description Number of always visible pages before and after the current page.\n */\n siblingCount?: number;\n }\n}\n\nexport { Pagination };\n","import * as React from 'react';\n\nimport { Icon, IconButton, Searchbar, SearchForm } from '@strapi/design-system';\nimport { useQueryParams } from '@strapi/helper-plugin';\nimport { Search as SearchIcon } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { TrackingEvent, useTracking } from '../features/Tracking';\n\ninterface SearchInputProps {\n disabled?: boolean;\n label: string;\n placeholder?: string;\n trackedEvent?: TrackingEvent['name'] | null;\n trackedEventDetails?: TrackingEvent['properties'];\n}\n\nconst SearchInput = ({\n disabled,\n label,\n placeholder,\n trackedEvent,\n trackedEventDetails,\n}: SearchInputProps) => {\n const inputRef = React.useRef<HTMLInputElement>(null);\n const iconButtonRef = React.useRef<HTMLButtonElement>(null);\n\n const [{ query }, setQuery] = useQueryParams<{ _q: string; page?: number }>();\n\n const [value, setValue] = React.useState(query?._q || '');\n const [isOpen, setIsOpen] = React.useState(!!value);\n\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const handleToggle = () => setIsOpen((prev) => !prev);\n\n React.useLayoutEffect(() => {\n if (isOpen && inputRef.current) {\n inputRef.current.focus();\n }\n }, [isOpen]);\n\n const handleClear = () => {\n setValue('');\n setQuery({ _q: '' }, 'remove');\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Ensure value is a string\n if (value) {\n if (trackedEvent) {\n trackUsage(trackedEvent, trackedEventDetails);\n }\n setQuery({ _q: encodeURIComponent(value), page: 1 });\n } else {\n handleToggle();\n setQuery({ _q: '' }, 'remove');\n }\n };\n\n if (isOpen) {\n return (\n <SearchForm onSubmit={handleSubmit}>\n <Searchbar\n ref={inputRef}\n name=\"search\"\n onChange={(e) => setValue(e.target.value)}\n value={value}\n clearLabel={formatMessage({ id: 'clearLabel', defaultMessage: 'Clear' })}\n onClear={handleClear}\n size=\"S\"\n placeholder={placeholder}\n >\n {label}\n </Searchbar>\n </SearchForm>\n );\n }\n\n return (\n <IconButton\n ref={iconButtonRef}\n disabled={disabled}\n icon={<Icon as={SearchIcon} color=\"neutral800\" />}\n label={formatMessage({ id: 'global.search', defaultMessage: 'Search' })}\n onClick={handleToggle}\n />\n );\n};\n\nexport { SearchInput };\nexport type { SearchInputProps };\n","import * as React from 'react';\n\nimport { useCallbackRef } from '@strapi/design-system';\n\ntype UseControllableStateParams<T> = {\n prop?: T | undefined;\n defaultProp?: T | undefined;\n onChange?: (state: T) => void;\n};\n\ntype SetStateFn<T> = (prevState?: T) => T;\n\nfunction useControllableState<T>({\n prop,\n defaultProp,\n onChange = () => {},\n}: UseControllableStateParams<T>) {\n const [uncontrolledProp, setUncontrolledProp] = useUncontrolledState({ defaultProp, onChange });\n const isControlled = prop !== undefined;\n const value = isControlled ? prop : uncontrolledProp;\n const handleChange = useCallbackRef(onChange);\n\n const setValue: React.Dispatch<React.SetStateAction<T | undefined>> = React.useCallback(\n (nextValue) => {\n if (isControlled) {\n const setter = nextValue as SetStateFn<T>;\n const value = typeof nextValue === 'function' ? setter(prop) : nextValue;\n if (value !== prop) handleChange(value as T);\n } else {\n setUncontrolledProp(nextValue);\n }\n },\n [isControlled, prop, setUncontrolledProp, handleChange]\n );\n\n return [value, setValue] as const;\n}\n\nfunction useUncontrolledState<T>({\n defaultProp,\n onChange,\n}: Omit<UseControllableStateParams<T>, 'prop'>) {\n const uncontrolledState = React.useState<T | undefined>(defaultProp);\n const [value] = uncontrolledState;\n const prevValueRef = React.useRef(value);\n const handleChange = useCallbackRef(onChange);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n handleChange(value as T);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef, handleChange]);\n\n return uncontrolledState;\n}\n\nexport { useControllableState };\n","/**\n * TODO: honestly, half of this stuff should come straight from\n * the design-system and then we can just wrap round the bits for\n * the i18n & router interactions.\n *\n * So we'll do that in v2 of the DS.\n */\n\nimport * as React from 'react';\n\nimport {\n Flex,\n Typography,\n Th,\n Tbody,\n Td,\n Tooltip,\n IconButton,\n Thead,\n Tr,\n RawTrProps,\n BaseCheckbox,\n Loader,\n Table as DSTable,\n EmptyStateLayout,\n EmptyStateLayoutProps,\n TableProps,\n RawTdProps,\n} from '@strapi/design-system';\nimport { useQueryParams } from '@strapi/helper-plugin';\nimport { CarretDown, EmptyDocuments } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { useControllableState } from '../hooks/useControllableState';\n\nimport { createContext } from './Context';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseRow {\n id: string | number;\n [key: string]: any;\n}\n\ninterface TableHeader<TData = object, THeader = object> {\n /**\n * Typically used by plugins to render a custom cell\n */\n cellFormatter?: (data: TData, header: Omit<THeader, 'cellFormatter'>) => React.ReactNode;\n label: string;\n name: string;\n searchable?: boolean;\n sortable?: boolean;\n}\n\ninterface TableContextValue<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Pick<TableProps, 'footer'> {\n colCount: number;\n hasHeaderCheckbox: boolean;\n headers: THeader[];\n isLoading: boolean;\n rowCount: number;\n rows: TRow[];\n setHasHeaderCheckbox: (value: boolean) => void;\n selectedRows: TRow[];\n selectRow: (row: TRow | TRow[]) => void;\n}\n\nconst [TableProvider, useTable] = createContext<TableContextValue<any, any>>('Table');\n\ninterface RootProps<TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>\n extends Partial<\n Pick<\n TableContextValue<TRow, THeader>,\n 'footer' | 'headers' | 'isLoading' | 'rows' | 'selectedRows'\n >\n > {\n children?: React.ReactNode;\n defaultSelectedRows?: TRow[];\n onSelectedRowsChange?: (selectedRows: TRow[]) => void;\n}\n\nconst Root = <TRow extends BaseRow, THeader extends TableHeader<TRow, THeader>>({\n children,\n defaultSelectedRows,\n footer,\n headers = [],\n isLoading = false,\n onSelectedRowsChange,\n rows = [],\n selectedRows: selectedRowsProps,\n}: RootProps<TRow, THeader>) => {\n const [selectedRows = [], setSelectedRows] = useControllableState({\n prop: selectedRowsProps,\n defaultProp: defaultSelectedRows,\n onChange: onSelectedRowsChange,\n });\n const [hasHeaderCheckbox, setHasHeaderCheckbox] = React.useState(false);\n\n const rowCount = rows.length + 1;\n const colCount = hasHeaderCheckbox ? headers.length + 1 : headers.length;\n\n const selectRow: TableContextValue<TRow, THeader>['selectRow'] = (row) => {\n if (Array.isArray(row)) {\n setSelectedRows(row);\n } else {\n setSelectedRows((prev = []) => {\n const currentRowIndex = prev.findIndex((r) => r.id === row.id);\n if (currentRowIndex > -1) {\n return prev.toSpliced(currentRowIndex, 1);\n }\n\n return [...prev, row];\n });\n }\n };\n\n return (\n <TableProvider\n colCount={colCount}\n hasHeaderCheckbox={hasHeaderCheckbox}\n setHasHeaderCheckbox={setHasHeaderCheckbox}\n footer={footer}\n headers={headers}\n isLoading={isLoading}\n rowCount={rowCount}\n rows={rows}\n selectedRows={selectedRows}\n selectRow={selectRow}\n >\n {children}\n </TableProvider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Content\n * -----------------------------------------------------------------------------------------------*/\n\nconst Content = ({ children }: Table.ContentProps) => {\n const rowCount = useTable('Content', (state) => state.rowCount);\n const colCount = useTable('Content', (state) => state.colCount);\n const footer = useTable('Content', (state) => state.footer);\n\n return (\n <DSTable rowCount={rowCount} colCount={colCount} footer={footer}>\n {children}\n </DSTable>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Head\n * -----------------------------------------------------------------------------------------------*/\n\nconst Head = ({ children }: Table.HeadProps) => {\n return (\n <Thead>\n <Tr>{children}</Tr>\n </Thead>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCell\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description A header cell in your table, internally will set the query params for sorting to\n * be passed to your data-fetching function.\n */\nconst HeaderCell = <TData, THead>({ name, label, sortable }: TableHeader<TData, THead>) => {\n const [{ query }, setQuery] = useQueryParams<{ sort?: `${string}:${'ASC' | 'DESC'}` }>();\n const sort = query?.sort ?? '';\n const [sortBy, sortOrder] = sort.split(':');\n const { formatMessage } = useIntl();\n const isSorted = sortBy === name;\n\n const sortLabel = formatMessage(\n { id: 'components.TableHeader.sort', defaultMessage: 'Sort on {label}' },\n { label }\n );\n\n const handleClickSort = () => {\n if (sortable) {\n setQuery({\n sort: `${name}:${isSorted && sortOrder === 'ASC' ? 'DESC' : 'ASC'}`,\n });\n }\n };\n\n return (\n <Th\n action={\n isSorted &&\n sortable && (\n <IconButton\n label={sortLabel}\n onClick={handleClickSort}\n icon={<SortIcon isUp={sortOrder === 'ASC'} />}\n borderStyle=\"none\"\n />\n )\n }\n >\n <Tooltip label={sortable ? sortLabel : label}>\n <Typography\n textColor=\"neutral600\"\n as={!isSorted && sortable ? 'button' : 'span'}\n onClick={handleClickSort}\n variant=\"sigma\"\n >\n {label}\n </Typography>\n </Tooltip>\n </Th>\n );\n};\n\ninterface SortIconProps {\n isUp: boolean;\n}\n\nconst SortIcon = styled(CarretDown)<SortIconProps>`\n transform: ${({ isUp }) => `rotate(${isUp ? '180' : '0'}deg)`};\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * ActionBar\n * -----------------------------------------------------------------------------------------------*/\n\nconst ActionBar = ({ children }: Table.ActionBarProps) => {\n const { formatMessage } = useIntl();\n const selectedRows = useTable('ActionBar', (state) => state.selectedRows);\n\n if (selectedRows.length === 0) return null;\n\n return (\n <Flex gap={2}>\n <Typography variant=\"omega\" textColor=\"neutral500\">\n {formatMessage(\n {\n id: 'content-manager.components.TableDelete.label',\n defaultMessage: '{number, plural, one {# row} other {# rows}} selected',\n },\n { number: selectedRows.length }\n )}\n </Typography>\n {children}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HeaderCheckboxCell\n * -----------------------------------------------------------------------------------------------*/\n\nconst HeaderCheckboxCell = () => {\n const rows = useTable('HeaderCheckboxCell', (state) => state.rows);\n const selectedRows = useTable('HeaderCheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('HeaderCheckboxCell', (state) => state.selectRow);\n const setHasHeaderCheckbox = useTable(\n 'HeaderCheckboxCell',\n (state) => state.setHasHeaderCheckbox\n );\n\n const { formatMessage } = useIntl();\n\n const areAllEntriesSelected = selectedRows.length === rows.length && rows.length > 0;\n const isIndeterminate = !areAllEntriesSelected && selectedRows.length > 0;\n\n React.useEffect(() => {\n setHasHeaderCheckbox(true);\n\n return () => setHasHeaderCheckbox(false);\n }, [setHasHeaderCheckbox]);\n\n const handleSelectAll = () => {\n if (!areAllEntriesSelected) {\n selectRow(rows);\n } else {\n selectRow([]);\n }\n };\n\n return (\n <Th>\n <BaseCheckbox\n aria-label={formatMessage({\n id: 'global.select-all-entries',\n defaultMessage: 'Select all entries',\n })}\n disabled={rows.length === 0}\n checked={areAllEntriesSelected}\n indeterminate={isIndeterminate}\n onChange={handleSelectAll}\n />\n </Th>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Empty\n * -----------------------------------------------------------------------------------------------*/\n\nconst Empty = (props: Table.EmptyProps) => {\n const { formatMessage } = useIntl();\n\n const rows = useTable('Empty', (state) => state.rows);\n const isLoading = useTable('Empty', (state) => state.isLoading);\n const colCount = useTable('Empty', (state) => state.colCount);\n\n /**\n * If we're loading or we have some data, we don't show the empty state.\n */\n if (rows.length > 0 || isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <EmptyStateLayout\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n hasRadius\n icon={<EmptyDocuments width=\"10rem\" />}\n {...props}\n />\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LoadingBody\n * -----------------------------------------------------------------------------------------------*/\n\nconst Loading = ({ children = 'Loading content' }: Table.LoadingProps) => {\n const isLoading = useTable('Loading', (state) => state.isLoading);\n const colCount = useTable('Loading', (state) => state.colCount);\n\n if (!isLoading) {\n return null;\n }\n\n return (\n <Tbody>\n <Tr>\n <Td colSpan={colCount}>\n <Flex justifyContent=\"center\" padding={11} background=\"neutral0\">\n <Loader>{children}</Loader>\n </Flex>\n </Td>\n </Tr>\n </Tbody>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Body\n * -----------------------------------------------------------------------------------------------*/\n\nconst Body = ({ children }: Table.BodyProps) => {\n const isLoading = useTable('Body', (state) => state.isLoading);\n const rows = useTable('Body', (state) => state.rows);\n\n if (isLoading || rows.length === 0) {\n return null;\n }\n\n return <Tbody>{children}</Tbody>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst Row = (props: Table.RowProps) => {\n return <Tr {...props} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Cell\n * -----------------------------------------------------------------------------------------------*/\nconst Cell = Td;\n\n/* -------------------------------------------------------------------------------------------------\n * Row\n * -----------------------------------------------------------------------------------------------*/\nconst CheckboxCell = ({ id, ...props }: Table.CheckboxCellProps) => {\n const rows = useTable('CheckboxCell', (state) => state.rows);\n const selectedRows = useTable('CheckboxCell', (state) => state.selectedRows);\n const selectRow = useTable('CheckboxCell', (state) => state.selectRow);\n\n const { formatMessage } = useIntl();\n\n const handleSelectRow = () => {\n selectRow(rows.find((row) => row.id === id));\n };\n\n const isChecked = selectedRows.findIndex((row) => row.id === id) > -1;\n\n return (\n <Cell {...props} onClick={(e) => e.stopPropagation()}>\n <BaseCheckbox\n aria-label={formatMessage({\n id: 'global.select-all-entries',\n defaultMessage: 'Select all entries',\n })}\n disabled={rows.length === 0}\n checked={isChecked}\n onChange={handleSelectRow}\n />\n </Cell>\n );\n};\n/* -------------------------------------------------------------------------------------------------\n * Exports\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @alpha we may move this component to the design-system.\n * @public\n * @description A generic table component composition. Internally handles the state of the table\n * such as selected rows, loading state, and more assuming the correct pieces are put togther.\n * @example\n * ```tsx\n * interace Data {\n * id: string;\n * name: string;\n * email: string;\n * }\n *\n * const ListView = () => {\n * const { data, isLoading } = useGetData<Data>();\n *\n * const headers: Table.Header<Data>[] = [\n * {\n * label: 'Name',\n * name: 'name',\n * sortable: true,\n * },\n * {\n * label: 'Email',\n * name: 'email',\n * sortable: true,\n * },\n * ];\n *\n * return (\n * <Table.Root rows={data} headers={headers} isLoading={isLoading}>\n * <Table.Content>\n * <Table.Head>\n * {headers.map((head) => (\n * <Table.HeaderCell key={head.name} {...head} />\n * ))}\n * </Table.Head>\n * <Table.Body>\n * <Table.Loading />\n * <Table.Empty />\n * {data.map((row) => (\n * <Table.Row key={row.id}>\n * <Table.Cell>{row.name}</Table.Cell>\n * <Table.Cell>{row.email}</Table.Cell>\n * </Table.Row>\n * ))}\n * </Table.Body>\n * </Table.Content>\n * </Table.Root>\n * );\n * };\n * ```\n */\nconst Table = {\n Root,\n Content,\n ActionBar,\n Head,\n HeaderCell,\n HeaderCheckboxCell,\n Body,\n CheckboxCell,\n Cell,\n Row,\n Loading,\n Empty,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Table {\n export type Props<\n TData extends BaseRow,\n THeader extends TableHeader<TData, THeader> = TableHeader<TData, TableHeader>\n > = RootProps<TData, THeader>;\n export interface ActionBarProps {\n children?: React.ReactNode;\n }\n\n export interface ContentProps {\n children: React.ReactNode;\n }\n\n export type Header<TData, THeader> = TableHeader<TData, THeader>;\n\n export interface HeadProps {\n children: React.ReactNode;\n }\n\n export interface EmptyProps extends Partial<EmptyStateLayoutProps> {}\n\n export interface LoadingProps {\n children?: React.ReactNode;\n }\n\n export interface BodyProps {\n children: React.ReactNode;\n }\n\n export interface RowProps extends RawTrProps {}\n\n export interface CellProps extends RawTdProps {}\n\n export interface CheckboxCellProps extends Pick<BaseRow, 'id'>, Omit<RawTdProps, 'id'> {}\n}\n\nexport { Table, useTable };\n","import { useEffect } from 'react';\n\nimport { Reducer } from '@reduxjs/toolkit';\n\nimport { useTypedStore } from '../core/store/hooks';\n\n/**\n * @public\n * @description Inject a new reducer into the global redux-store.\n * @example\n * ```tsx\n * import { reducer } from './local-store';\n *\n * const MyPlugin = () => {\n * useInjectReducer(\"plugin\", reducer);\n * }\n * ```\n */\nexport function useInjectReducer(namespace: string, reducer: Reducer) {\n const store = useTypedStore();\n\n useEffect(() => {\n store.injectReducer(namespace, reducer);\n }, [store, namespace, reducer]);\n}\n","import type { ComponentsDictionary, Schema } from '../hooks/useDocument';\nimport type { Attribute } from '@strapi/types';\n\nconst checkIfAttributeIsDisplayable = (attribute: Attribute.Any) => {\n const { type } = attribute;\n\n if (type === 'relation') {\n return !attribute.relation.toLowerCase().includes('morph');\n }\n\n return !['json', 'dynamiczone', 'richtext', 'password', 'blocks'].includes(type) && !!type;\n};\n\ninterface MainField {\n name: string;\n type: Attribute.Kind | 'custom';\n}\n\n/**\n * @internal\n * @description given an attribute, content-type schemas & component schemas, find the mainField name & type.\n * If the attribute does not need a `mainField` then we return undefined. If we do not find the type\n * of the field, we assume it's a string #sensible-defaults\n */\nconst getMainField = (\n attribute: Attribute.Any,\n mainFieldName: string | undefined,\n { schemas, components }: { schemas: Schema[]; components: ComponentsDictionary }\n): MainField | undefined => {\n if (!mainFieldName) {\n return undefined;\n }\n\n const mainFieldType =\n attribute.type === 'component'\n ? components[attribute.component].attributes[mainFieldName].type\n : // @ts-expect-error – `targetModel` does exist on the attribute for a relation.\n schemas.find((schema) => schema.uid === attribute.targetModel)?.attributes[mainFieldName]\n .type;\n\n return {\n name: mainFieldName,\n type: mainFieldType ?? 'string',\n };\n};\n\nexport { checkIfAttributeIsDisplayable, getMainField };\nexport type { MainField };\n","import * as React from 'react';\n\nimport { SerializedError } from '@reduxjs/toolkit';\nimport { useQueryParams } from '@strapi/helper-plugin';\n\nimport { HOOKS } from '../../constants';\nimport { useNotification } from '../../features/Notifications';\nimport { useStrapiApp } from '../../features/StrapiApp';\nimport { useAPIErrorHandler } from '../../hooks/useAPIErrorHandler';\nimport { BaseQueryError } from '../../utils/baseQuery';\nimport { useGetContentTypeConfigurationQuery } from '../services/contentTypes';\nimport { getMainField } from '../utils/attributes';\n\nimport { useContentTypeSchema } from './useContentTypeSchema';\nimport {\n type ComponentsDictionary,\n type Document,\n type Schema,\n useDoc,\n useDocument,\n} from './useDocument';\n\nimport type { Filters } from '../../components/Filters';\nimport type { InputProps } from '../../components/FormInputs/types';\nimport type { Table } from '../../components/Table';\nimport type { Contracts } from '@strapi/plugin-content-manager/_internal/shared';\nimport type { Attribute } from '@strapi/types';\n\ntype LayoutOptions = Schema['options'] & Schema['pluginOptions'] & object;\n\ninterface LayoutSettings extends Contracts.ContentTypes.Settings {\n displayName?: string;\n icon?: never;\n}\n\ninterface ListFieldLayout\n extends Table.Header<Document, ListFieldLayout>,\n Pick<Filters.Filter, 'mainField'> {\n attribute: Attribute.Any | { type: 'custom' };\n}\n\ninterface ListLayout {\n layout: ListFieldLayout[];\n components?: never;\n metadatas: {\n [K in keyof Contracts.ContentTypes.Metadatas]: Contracts.ContentTypes.Metadatas[K]['list'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\ninterface EditFieldSharedProps\n extends Omit<InputProps, 'hint' | 'label' | 'type'>,\n Pick<Filters.Filter, 'mainField'> {\n hint?: string;\n label: string;\n size: number;\n unique?: boolean;\n visible?: boolean;\n}\n\n/**\n * Map over all the types in Attribute Types and use that to create a union of new types where the attribute type\n * is under the property attribute and the type is under the property type.\n */\ntype EditFieldLayout = {\n [K in Attribute.Kind]: EditFieldSharedProps & {\n attribute: Extract<Attribute.Any, { type: K }>;\n type: K;\n };\n}[Attribute.Kind];\n\ninterface EditLayout {\n layout: Array<Array<EditFieldLayout[]>>;\n components: {\n [uid: string]: {\n layout: Array<EditFieldLayout[]>;\n settings: Contracts.Components.ComponentConfiguration['settings'] & {\n displayName?: string;\n icon?: string;\n };\n };\n };\n metadatas: {\n [K in keyof Contracts.ContentTypes.Metadatas]: Contracts.ContentTypes.Metadatas[K]['edit'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\n\ntype UseDocumentLayout = (model: string) => {\n error?: BaseQueryError | SerializedError;\n isLoading: boolean;\n /**\n * This is the layout for the edit view,\n */\n edit: EditLayout;\n list: ListLayout;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocumentLayout\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEFAULT_SETTINGS = {\n bulkable: false,\n filterable: false,\n searchable: false,\n pagination: false,\n defaultSortBy: '',\n defaultSortOrder: 'asc',\n mainField: 'id',\n pageSize: 10,\n};\n\n/**\n * @alpha\n * @description This hook is used to get the layouts for either the edit view or list view of a specific content-type\n * including the layouts for the components used in the content-type. It also runs the mutation hook waterfall so the data\n * is consistent wherever it is used. It's a light wrapper around the `useDocument` hook, but provides the `skip` option a document\n * is not fetched, however, it does fetch the schemas & components if they do not already exist in the cache.\n *\n * If the fetch fails, it will display a notification to the user.\n *\n * @example\n * ```tsx\n * const { model } = useParams<{ model: string }>();\n * const { edit: { schema: layout } } = useDocumentLayout(model);\n *\n * return layout.map(panel => panel.map(row => row.map(field => <Field {...field} />)))\n * ```\n *\n */\nconst useDocumentLayout: UseDocumentLayout = (model) => {\n const { schema, components } = useDocument({ model, collectionType: '' }, { skip: true });\n const [{ query }] = useQueryParams();\n const runHookWaterfall = useStrapiApp('useDocumentLayout', (state) => state.runHookWaterfall);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { isLoading: isLoadingSchemas, schemas } = useContentTypeSchema();\n\n const { data, isLoading: isLoadingConfigs, error } = useGetContentTypeConfigurationQuery(model);\n\n const isLoading = isLoadingSchemas || isLoadingConfigs;\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const editLayout = React.useMemo(\n () =>\n data\n ? formatEditLayout(data, { schemas, schema, components })\n : ({\n layout: [],\n components: {},\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as EditLayout),\n [data, schema, components, schemas]\n );\n\n const listLayout = React.useMemo(() => {\n return data\n ? formatListLayout(data, { schemas, schema, components })\n : ({\n layout: [],\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as ListLayout);\n }, [data, schema, schemas, components]);\n\n const { layout: edit } = React.useMemo(\n () =>\n runHookWaterfall(HOOKS.MUTATE_EDIT_VIEW_LAYOUT, {\n layout: editLayout,\n query,\n }),\n [editLayout, query, runHookWaterfall]\n );\n\n return {\n error,\n isLoading,\n edit,\n list: listLayout,\n } satisfies ReturnType<UseDocumentLayout>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the internal useDoc hook, as such it shouldn't be used outside of the\n * content-manager because it won't work as intended.\n */\nconst useDocLayout = () => {\n const { model } = useDoc();\n return useDocumentLayout(model);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatEditLayout\n * -----------------------------------------------------------------------------------------------*/\ntype LayoutData = Contracts.ContentTypes.FindContentTypeConfiguration.Response['data'];\n\n/**\n * @internal\n * @description takes the configuration data, the schema & the components used in the schema and formats the edit view\n * vesions of the schema & components. This is then used to redner the edit view of the content-type.\n */\nconst formatEditLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): EditLayout => {\n let currentPanelIndex = 0;\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const panelledEditAttributes = convertEditLayoutToFieldLayouts(\n data.contentType.layouts.edit,\n schema?.attributes,\n data.contentType.metadatas,\n { configurations: data.components, schemas: components },\n schemas\n ).reduce<Array<EditFieldLayout[][]>>((panels, row) => {\n if (row.some((field) => field.type === 'dynamiczone')) {\n panels.push([row]);\n currentPanelIndex += 2;\n } else {\n if (!panels[currentPanelIndex]) {\n panels.push([]);\n }\n panels[currentPanelIndex].push(row);\n }\n\n return panels;\n }, []);\n\n const componentEditAttributes = Object.entries(data.components).reduce<EditLayout['components']>(\n (acc, [uid, configuration]) => {\n acc[uid] = {\n layout: convertEditLayoutToFieldLayouts(\n configuration.layouts.edit,\n components[uid].attributes,\n configuration.metadatas\n ),\n settings: {\n ...configuration.settings,\n icon: components[uid].info.icon,\n displayName: components[uid].info.displayName,\n },\n };\n return acc;\n },\n {}\n );\n\n const editMetadatas = Object.entries(data.contentType.metadatas).reduce<EditLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.edit,\n };\n },\n {}\n );\n\n return {\n layout: panelledEditAttributes,\n components: componentEditAttributes,\n metadatas: editMetadatas,\n settings: {\n ...data.contentType.settings,\n displayName: schema?.info.displayName,\n },\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertEditLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the edit layout from either a content-type or a component\n * and formats it into a generic object that can be used to correctly render\n * the form fields.\n */\nconst convertEditLayoutToFieldLayouts = (\n rows: LayoutData['contentType']['layouts']['edit'],\n attributes: Schema['attributes'] = {},\n metadatas: Contracts.ContentTypes.Metadatas,\n components?: {\n configurations: Record<string, Contracts.Components.ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return rows.map((row) =>\n row\n .map((field) => {\n const attribute = attributes[field.name];\n\n if (!attribute) {\n return null;\n }\n\n const { edit: metadata } = metadatas[field.name];\n\n const settings: Partial<Contracts.ContentTypes.Settings> =\n attribute.type === 'component' && components\n ? components.configurations[attribute.component].settings\n : {};\n\n return {\n attribute,\n disabled: !metadata.editable,\n hint: metadata.description,\n label: metadata.label ?? '',\n name: field.name,\n // @ts-expect-error – mainField does exist on the metadata for a relation.\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n placeholder: metadata.placeholder ?? '',\n required: attribute.required ?? false,\n size: field.size,\n unique: 'unique' in attribute ? attribute.unique : false,\n visible: metadata.visible ?? true,\n type: attribute.type,\n };\n })\n .filter((field) => field !== null)\n ) as EditFieldLayout[][];\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatListLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the complete configuration data, the schema & the components used in the schema and\n * formats a list view layout for the content-type. This is much simpler than the edit view layout as there\n * are less options to consider.\n */\nconst formatListLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): ListLayout => {\n const listMetadatas = Object.entries(data.contentType.metadatas).reduce<ListLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.list,\n };\n },\n {}\n );\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const listAttributes = convertListLayoutToFieldLayouts(\n data.contentType.layouts.list,\n schema?.attributes,\n listMetadatas,\n { configurations: data.components, schemas: components },\n schemas\n );\n\n return {\n layout: listAttributes,\n settings: { ...data.contentType.settings, displayName: schema?.info.displayName },\n metadatas: listMetadatas,\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertListLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the columns from the list view configuration and formats them into a generic object\n * combinining metadata and attribute data.\n *\n * @note We do use this to reformat the list of strings when updating the displayed headers for the list view.\n */\nconst convertListLayoutToFieldLayouts = (\n columns: LayoutData['contentType']['layouts']['list'],\n attributes: Schema['attributes'] = {},\n metadatas: ListLayout['metadatas'],\n components?: {\n configurations: Record<string, Contracts.Components.ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return columns\n .map((name) => {\n const attribute = attributes[name];\n\n if (!attribute) {\n return null;\n }\n\n const metadata = metadatas[name];\n\n const settings: Partial<Contracts.ContentTypes.Settings> =\n attribute.type === 'component' && components\n ? components.configurations[attribute.component].settings\n : {};\n\n return {\n attribute,\n label: metadata.label ?? '',\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n name: name,\n searchable: metadata.searchable ?? true,\n sortable: metadata.sortable ?? true,\n } satisfies ListFieldLayout;\n })\n .filter((field) => field !== null) as ListFieldLayout[];\n};\n\nexport {\n useDocLayout,\n useDocumentLayout,\n convertListLayoutToFieldLayouts,\n convertEditLayoutToFieldLayouts,\n DEFAULT_SETTINGS,\n};\nexport type { EditLayout, EditFieldLayout, ListLayout, ListFieldLayout, UseDocumentLayout };\n"],"names":["getEERoutes","React","jsxs","jsx","Flex","useIntl","useCallbackRef","Alert","Link","get","getFetchClient","result","isAxiosError","createApi","Loading","Main","Loader","Error","EmptyStateLayout","Icon","ExclamationMarkCircle","Box","EmptyPermissions","EmptyDocuments","useRBACProvider","formatAPIError","ContextSelector","Provider","useDispatch","useStore","useSelector","createSelector","createSlice","reducer","token","useNavigate","auth","useLocation","produce","NavLink","ArrowLeft","axios","createContext","useRBAC","initialState","currentStep","set","defaultsDeep","IntlProvider","DesignSystemProvider","createGlobalStyle","QueryClient","QueryClientProvider","Suspense","Helmet","Outlet","useRouteError","useClipboard","Typography","Button","Duplicate","styled","Fragment","routes","matchRoutes","useLoaderData","Navigate","lazy","useParams","Layout","ProtectedEditViewPage","NoPermissions","historyRoutes","attributes","yup","pipe","translatedErrors","contentType","components","document","error","ValidationError","useQueryParams","toPath","clone","isEqual","ref","useComposedRefs","generateNKeysBetween","useBlocker","Dialog","DialogBody","DialogFooter","Field","Combobox","ComboboxOption","feature","Body","LinkButton","Root","ModalLayout","ModalBody","IconButton","Cross","lightTheme","SingleSelect","id","themeColorName","SingleSelectOption","FieldHint","FieldError","History","stringify","actions","action","Menu","More","VisuallyHidden","ModalHeader","useMatch","canPublish","canCreate","canUpdate","modified","setSubmitting","isSubmitting","Radio","CrossCircle","useMemo","throttle","cancelIdleCallback","requestIdleCallback","ids","intervalToDuration","isPast","Status","Cog","StyledPencil","Pencil","Trash","ChevronRight","canRead","prohibitedFields","invariant","RBACContext","useDragLayer","Drag","CarretDown","useDrop","item","useDrag","uid","TextButton","Refresh","useFocusInputField","textValue","FixedSizeList","getEmptyImage","Tooltip","useFilter","useCollator","SubNav","SubNavHeader","SubNavSections","SubNavSection","SubNavLink","parse","MUTATE_COLLECTION_TYPES_LINKS","MUTATE_SINGLE_TYPES_LINKS","state","useNotifyAT","useEffect","hasPermissions","DSLayout","combineReducers","rbacReducer","appReducer","cmAppReducer","contentManagerReducers","configureStore","forwardRef","ToggleInput","Checkbox","DatePicker","DateTimePicker","TextInput","JSONInputImpl","NumberInput","useState","Eye","EyeStriked","Textarea","TimePicker","memo","useQuery","camelCase","useTheme","Portal","Formik","Form","FieldLabel","FieldInput","usePersistentState","omit","Grid","GridItem","Login","LoginCE","useFocusWhenNavigate","HeaderLayout","ContentLayout","ArrowRight","EmptyPictures","Logo","darkTheme","isFunction","merge","pick","getSettingsEERoutes","createBrowserRouter","getBaseEERoutes","cmRoutes","RouterProvider","features","createRoot","PaginationImpl","PreviousLink","PageLink","Dots","NextLink","SearchForm","Searchbar","SearchIcon","value","DSTable","Thead","Tr","Th","BaseCheckbox","Tbody","Td"],"mappings":"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"}
|