@strapi/admin 4.15.5 → 4.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_chunks/{AuthenticatedApp-61dfdab8.js → AuthenticatedApp-12b0b80d.js} +23 -23
- package/dist/_chunks/{AuthenticatedApp-61dfdab8.js.map → AuthenticatedApp-12b0b80d.js.map} +1 -1
- package/dist/_chunks/{AuthenticatedApp-da1595e9.mjs → AuthenticatedApp-2b5530b9.mjs} +23 -23
- package/dist/_chunks/{AuthenticatedApp-da1595e9.mjs.map → AuthenticatedApp-2b5530b9.mjs.map} +1 -1
- package/dist/_chunks/{HomePage-48934b34.js → HomePage-3ad80266.js} +4 -4
- package/dist/_chunks/{HomePage-48934b34.js.map → HomePage-3ad80266.js.map} +1 -1
- package/dist/_chunks/{HomePage-f3052b59.js → HomePage-763d3a5f.js} +4 -4
- package/dist/_chunks/{HomePage-f3052b59.js.map → HomePage-763d3a5f.js.map} +1 -1
- package/dist/_chunks/{HomePage-2690d237.mjs → HomePage-93e2ba01.mjs} +4 -4
- package/dist/_chunks/{HomePage-2690d237.mjs.map → HomePage-93e2ba01.mjs.map} +1 -1
- package/dist/_chunks/{HomePage-3792b299.mjs → HomePage-f6a78451.mjs} +4 -4
- package/dist/_chunks/{HomePage-3792b299.mjs.map → HomePage-f6a78451.mjs.map} +1 -1
- package/dist/_chunks/{InstalledPluginsPage-3bd06321.mjs → InstalledPluginsPage-83eaebad.mjs} +3 -3
- package/dist/_chunks/{InstalledPluginsPage-3bd06321.mjs.map → InstalledPluginsPage-83eaebad.mjs.map} +1 -1
- package/dist/_chunks/{InstalledPluginsPage-da0780c1.js → InstalledPluginsPage-e3d10fcd.js} +3 -3
- package/dist/_chunks/{InstalledPluginsPage-da0780c1.js.map → InstalledPluginsPage-e3d10fcd.js.map} +1 -1
- package/dist/_chunks/{Login-ab4b47ad.js → Login-a48df094.js} +2 -2
- package/dist/_chunks/{Login-ab4b47ad.js.map → Login-a48df094.js.map} +1 -1
- package/dist/_chunks/{Login-8f68c65a.mjs → Login-e12abb16.mjs} +2 -2
- package/dist/_chunks/{Login-8f68c65a.mjs.map → Login-e12abb16.mjs.map} +1 -1
- package/dist/_chunks/{MarketplacePage-935fca72.js → MarketplacePage-193e4eca.js} +3 -3
- package/dist/_chunks/{MarketplacePage-935fca72.js.map → MarketplacePage-193e4eca.js.map} +1 -1
- package/dist/_chunks/{MarketplacePage-95af86bb.mjs → MarketplacePage-b1679fa5.mjs} +3 -3
- package/dist/_chunks/{MarketplacePage-95af86bb.mjs.map → MarketplacePage-b1679fa5.mjs.map} +1 -1
- package/dist/_chunks/{ProfilePage-20de1b54.mjs → ProfilePage-3858db75.mjs} +3 -3
- package/dist/_chunks/{ProfilePage-20de1b54.mjs.map → ProfilePage-3858db75.mjs.map} +1 -1
- package/dist/_chunks/{ProfilePage-b8b29c4d.js → ProfilePage-4a1eb00d.js} +3 -3
- package/dist/_chunks/{ProfilePage-b8b29c4d.js.map → ProfilePage-4a1eb00d.js.map} +1 -1
- package/dist/_chunks/{SalesPage-c5cbb366.js → SalesPage-4a0a68fb.js} +2 -2
- package/dist/_chunks/SalesPage-4a0a68fb.js.map +1 -0
- package/dist/_chunks/{SalesPage-c7c94c3f.mjs → SalesPage-fceedf48.mjs} +2 -2
- package/dist/_chunks/{SalesPage-c7c94c3f.mjs.map → SalesPage-fceedf48.mjs.map} +1 -1
- package/dist/_chunks/{build-92e15b93.mjs → build-1026ce7c.mjs} +2 -2
- package/dist/_chunks/{build-92e15b93.mjs.map → build-1026ce7c.mjs.map} +1 -1
- package/dist/_chunks/{build-df2f219f.js → build-d99bcc06.js} +2 -2
- package/dist/_chunks/{build-df2f219f.js.map → build-d99bcc06.js.map} +1 -1
- package/dist/_chunks/{constants-db792b94.mjs → constants-481b3914.mjs} +3 -3
- package/dist/_chunks/{constants-db792b94.mjs.map → constants-481b3914.mjs.map} +1 -1
- package/dist/_chunks/{constants-797ada28.js → constants-49d63c92.js} +6 -6
- package/dist/_chunks/{constants-797ada28.js.map → constants-49d63c92.js.map} +1 -1
- package/dist/_chunks/{constants-008a1527.js → constants-5fd54815.js} +5 -5
- package/dist/_chunks/{constants-008a1527.js.map → constants-5fd54815.js.map} +1 -1
- package/dist/_chunks/{constants-278adc05.mjs → constants-6876b155.mjs} +6 -6
- package/dist/_chunks/{constants-278adc05.mjs.map → constants-6876b155.mjs.map} +1 -1
- package/dist/_chunks/{constants-1d345364.mjs → constants-8bdc91a9.mjs} +5 -5
- package/dist/_chunks/{constants-1d345364.mjs.map → constants-8bdc91a9.mjs.map} +1 -1
- package/dist/_chunks/{constants-29d123f8.mjs → constants-b0bc030f.mjs} +2 -2
- package/dist/_chunks/{constants-29d123f8.mjs.map → constants-b0bc030f.mjs.map} +1 -1
- package/dist/_chunks/{constants-ec71917d.js → constants-dd4a9742.js} +3 -3
- package/dist/_chunks/{constants-ec71917d.js.map → constants-dd4a9742.js.map} +1 -1
- package/dist/_chunks/{constants-4be682e5.js → constants-fac0ce8c.js} +2 -2
- package/dist/_chunks/{constants-4be682e5.js.map → constants-fac0ce8c.js.map} +1 -1
- package/dist/_chunks/{develop-a46fed01.mjs → develop-72394876.mjs} +2 -2
- package/dist/_chunks/{develop-a46fed01.mjs.map → develop-72394876.mjs.map} +1 -1
- package/dist/_chunks/{develop-4d25a6e0.js → develop-da585b1e.js} +2 -2
- package/dist/_chunks/{develop-4d25a6e0.js.map → develop-da585b1e.js.map} +1 -1
- package/dist/_chunks/{index-40d047a8.mjs → index-0dcabbdd.mjs} +3 -3
- package/dist/_chunks/{index-40d047a8.mjs.map → index-0dcabbdd.mjs.map} +1 -1
- package/dist/_chunks/{index-1ebd9d8c.mjs → index-1d2a74ca.mjs} +5 -5
- package/dist/_chunks/{index-1ebd9d8c.mjs.map → index-1d2a74ca.mjs.map} +1 -1
- package/dist/_chunks/{index-f5b276a8.mjs → index-1ddec644.mjs} +21 -21
- package/dist/_chunks/{index-f5b276a8.mjs.map → index-1ddec644.mjs.map} +1 -1
- package/dist/_chunks/{index-a9625818.mjs → index-1eef7482.mjs} +5 -5
- package/dist/_chunks/{index-a9625818.mjs.map → index-1eef7482.mjs.map} +1 -1
- package/dist/_chunks/{index-834fad5c.mjs → index-20454411.mjs} +5 -5
- package/dist/_chunks/{index-834fad5c.mjs.map → index-20454411.mjs.map} +1 -1
- package/dist/_chunks/{index-40495ca1.mjs → index-296f0769.mjs} +2 -2
- package/dist/_chunks/{index-40495ca1.mjs.map → index-296f0769.mjs.map} +1 -1
- package/dist/_chunks/{index-d2b3c398.mjs → index-34233ee7.mjs} +3 -3
- package/dist/_chunks/{index-d2b3c398.mjs.map → index-34233ee7.mjs.map} +1 -1
- package/dist/_chunks/{index-924a1288.js → index-42a0b19b.js} +3 -3
- package/dist/_chunks/{index-924a1288.js.map → index-42a0b19b.js.map} +1 -1
- package/dist/_chunks/{index-dc89c18c.mjs → index-49b7e6ff.mjs} +8 -4
- package/dist/_chunks/index-49b7e6ff.mjs.map +1 -0
- package/dist/_chunks/{index-bc709e72.js → index-4ac37d7c.js} +3 -3
- package/dist/_chunks/{index-bc709e72.js.map → index-4ac37d7c.js.map} +1 -1
- package/dist/_chunks/{index-0fbbca7a.js → index-4ff0e245.js} +3 -3
- package/dist/_chunks/{index-0fbbca7a.js.map → index-4ff0e245.js.map} +1 -1
- package/dist/_chunks/{index-cbf9952d.js → index-526ea946.js} +2 -2
- package/dist/_chunks/{index-cbf9952d.js.map → index-526ea946.js.map} +1 -1
- package/dist/_chunks/{index-1932eedf.mjs → index-55f565cf.mjs} +3 -3
- package/dist/_chunks/{index-1932eedf.mjs.map → index-55f565cf.mjs.map} +1 -1
- package/dist/_chunks/{index-e34335f1.js → index-56cc01e0.js} +3 -3
- package/dist/_chunks/{index-e34335f1.js.map → index-56cc01e0.js.map} +1 -1
- package/dist/_chunks/{index-51986071.mjs → index-5d044c87.mjs} +3 -3
- package/dist/_chunks/{index-51986071.mjs.map → index-5d044c87.mjs.map} +1 -1
- package/dist/_chunks/{index-3c693658.mjs → index-5d14fd43.mjs} +3 -3
- package/dist/_chunks/{index-3c693658.mjs.map → index-5d14fd43.mjs.map} +1 -1
- package/dist/_chunks/{index-f3e7f8cc.mjs → index-5e9a93b3.mjs} +4 -4
- package/dist/_chunks/{index-f3e7f8cc.mjs.map → index-5e9a93b3.mjs.map} +1 -1
- package/dist/_chunks/{index-46c3ee85.mjs → index-60941eee.mjs} +3 -3
- package/dist/_chunks/{index-46c3ee85.mjs.map → index-60941eee.mjs.map} +1 -1
- package/dist/_chunks/{index-9c26fffe.js → index-60e19de0.js} +4 -4
- package/dist/_chunks/{index-9c26fffe.js.map → index-60e19de0.js.map} +1 -1
- package/dist/_chunks/{index-003c2cab.mjs → index-6757c461.mjs} +5 -5
- package/dist/_chunks/{index-003c2cab.mjs.map → index-6757c461.mjs.map} +1 -1
- package/dist/_chunks/{index-b42866c5.mjs → index-69dbf2cf.mjs} +2 -2
- package/dist/_chunks/{index-b42866c5.mjs.map → index-69dbf2cf.mjs.map} +1 -1
- package/dist/_chunks/{index-035f8c59.js → index-71c88425.js} +3 -3
- package/dist/_chunks/{index-035f8c59.js.map → index-71c88425.js.map} +1 -1
- package/dist/_chunks/{index-f7cf652c.js → index-74601a9b.js} +4 -4
- package/dist/_chunks/{index-f7cf652c.js.map → index-74601a9b.js.map} +1 -1
- package/dist/_chunks/{index-cc38783c.mjs → index-7e31e982.mjs} +3 -3
- package/dist/_chunks/{index-cc38783c.mjs.map → index-7e31e982.mjs.map} +1 -1
- package/dist/_chunks/{index-787a0db6.js → index-8759f1d9.js} +5 -5
- package/dist/_chunks/{index-787a0db6.js.map → index-8759f1d9.js.map} +1 -1
- package/dist/_chunks/{index-f55a69e7.mjs → index-89a1d72c.mjs} +4 -4
- package/dist/_chunks/{index-f55a69e7.mjs.map → index-89a1d72c.mjs.map} +1 -1
- package/dist/_chunks/{index-0ed05075.js → index-8b79ee6c.js} +14 -8
- package/dist/_chunks/{index-0ed05075.js.map → index-8b79ee6c.js.map} +1 -1
- package/dist/_chunks/{index-154693de.mjs → index-8c5b4bda.mjs} +3 -3
- package/dist/_chunks/{index-154693de.mjs.map → index-8c5b4bda.mjs.map} +1 -1
- package/dist/_chunks/{index-7bfab5f5.js → index-912140fa.js} +4 -4
- package/dist/_chunks/{index-7bfab5f5.js.map → index-912140fa.js.map} +1 -1
- package/dist/_chunks/{index-eebad65d.js → index-947668f7.js} +3 -3
- package/dist/_chunks/{index-eebad65d.js.map → index-947668f7.js.map} +1 -1
- package/dist/_chunks/{index-8e034257.mjs → index-95d9bcb0.mjs} +3 -3
- package/dist/_chunks/{index-8e034257.mjs.map → index-95d9bcb0.mjs.map} +1 -1
- package/dist/_chunks/{index-56b499fb.mjs → index-98221317.mjs} +5 -5
- package/dist/_chunks/{index-56b499fb.mjs.map → index-98221317.mjs.map} +1 -1
- package/dist/_chunks/{index-6797e259.mjs → index-9881aa54.mjs} +3 -3
- package/dist/_chunks/{index-6797e259.mjs.map → index-9881aa54.mjs.map} +1 -1
- package/dist/_chunks/{index-9304d6de.js → index-9d98e8b2.js} +511 -475
- package/dist/_chunks/index-9d98e8b2.js.map +1 -0
- package/dist/_chunks/{index-97a59f73.js → index-9ebd4c75.js} +4 -4
- package/dist/_chunks/{index-97a59f73.js.map → index-9ebd4c75.js.map} +1 -1
- package/dist/_chunks/{index-b6ee936b.mjs → index-9f08bcc3.mjs} +14 -8
- package/dist/_chunks/{index-b6ee936b.mjs.map → index-9f08bcc3.mjs.map} +1 -1
- package/dist/_chunks/{index-eaff38ba.js → index-a1707d3b.js} +3 -3
- package/dist/_chunks/{index-eaff38ba.js.map → index-a1707d3b.js.map} +1 -1
- package/dist/_chunks/{index-039f8e26.mjs → index-a61e2ef0.mjs} +4 -4
- package/dist/_chunks/{index-039f8e26.mjs.map → index-a61e2ef0.mjs.map} +1 -1
- package/dist/_chunks/{index-b2d4d126.js → index-a8c829e4.js} +5 -5
- package/dist/_chunks/{index-b2d4d126.js.map → index-a8c829e4.js.map} +1 -1
- package/dist/_chunks/{index-72494b79.js → index-a9574ead.js} +3 -3
- package/dist/_chunks/{index-72494b79.js.map → index-a9574ead.js.map} +1 -1
- package/dist/_chunks/{index-9118a940.mjs → index-a98002b5.mjs} +4 -4
- package/dist/_chunks/{index-9118a940.mjs.map → index-a98002b5.mjs.map} +1 -1
- package/dist/_chunks/{index-d9882c45.mjs → index-ad85a00a.mjs} +4 -4
- package/dist/_chunks/{index-d9882c45.mjs.map → index-ad85a00a.mjs.map} +1 -1
- package/dist/_chunks/{index-bde05e9e.mjs → index-b6e7426d.mjs} +3 -3
- package/dist/_chunks/{index-bde05e9e.mjs.map → index-b6e7426d.mjs.map} +1 -1
- package/dist/_chunks/{index-46138ec7.mjs → index-bcafdc00.mjs} +4 -4
- package/dist/_chunks/{index-46138ec7.mjs.map → index-bcafdc00.mjs.map} +1 -1
- package/dist/_chunks/{index-a6f1ccf6.mjs → index-bd42fb77.mjs} +6 -6
- package/dist/_chunks/{index-a6f1ccf6.mjs.map → index-bd42fb77.mjs.map} +1 -1
- package/dist/_chunks/{index-bac648de.js → index-bdb23c76.js} +5 -5
- package/dist/_chunks/{index-bac648de.js.map → index-bdb23c76.js.map} +1 -1
- package/dist/_chunks/{index-81509193.mjs → index-c0f59e46.mjs} +513 -477
- package/dist/_chunks/index-c0f59e46.mjs.map +1 -0
- package/dist/_chunks/{index-557e0c47.js → index-c8be54b1.js} +2 -2
- package/dist/_chunks/{index-557e0c47.js.map → index-c8be54b1.js.map} +1 -1
- package/dist/_chunks/{index-345c0ae9.js → index-c8f0ea8f.js} +6 -6
- package/dist/_chunks/{index-345c0ae9.js.map → index-c8f0ea8f.js.map} +1 -1
- package/dist/_chunks/{index-f7dbd21b.js → index-caa6ed37.js} +2 -2
- package/dist/_chunks/{index-f7dbd21b.js.map → index-caa6ed37.js.map} +1 -1
- package/dist/_chunks/{index-25975989.js → index-ccae5f17.js} +4 -4
- package/dist/_chunks/{index-25975989.js.map → index-ccae5f17.js.map} +1 -1
- package/dist/_chunks/{index-d5f569ab.js → index-cf24d5a0.js} +5 -5
- package/dist/_chunks/{index-d5f569ab.js.map → index-cf24d5a0.js.map} +1 -1
- package/dist/_chunks/{index-6353193a.mjs → index-d8d56664.mjs} +5 -5
- package/dist/_chunks/{index-6353193a.mjs.map → index-d8d56664.mjs.map} +1 -1
- package/dist/_chunks/{index-69d47db4.js → index-da64448f.js} +3 -3
- package/dist/_chunks/{index-69d47db4.js.map → index-da64448f.js.map} +1 -1
- package/dist/_chunks/{index-be3e5f69.mjs → index-e04aafb3.mjs} +2 -2
- package/dist/_chunks/{index-be3e5f69.mjs.map → index-e04aafb3.mjs.map} +1 -1
- package/dist/_chunks/{index-9f30a92e.js → index-e76dc085.js} +4 -4
- package/dist/_chunks/{index-9f30a92e.js.map → index-e76dc085.js.map} +1 -1
- package/dist/_chunks/{index-bfb581a2.js → index-eab05381.js} +3 -3
- package/dist/_chunks/{index-bfb581a2.js.map → index-eab05381.js.map} +1 -1
- package/dist/_chunks/{index-2b22b1a0.js → index-eb720419.js} +5 -5
- package/dist/_chunks/{index-2b22b1a0.js.map → index-eb720419.js.map} +1 -1
- package/dist/_chunks/{index-4f557234.mjs → index-ebd0c6b2.mjs} +3 -3
- package/dist/_chunks/{index-4f557234.mjs.map → index-ebd0c6b2.mjs.map} +1 -1
- package/dist/_chunks/{index-e0e235a0.js → index-ef2c6efd.js} +3 -3
- package/dist/_chunks/{index-e0e235a0.js.map → index-ef2c6efd.js.map} +1 -1
- package/dist/_chunks/{index-1f4afa21.js → index-f09ec538.js} +3 -3
- package/dist/_chunks/{index-1f4afa21.js.map → index-f09ec538.js.map} +1 -1
- package/dist/_chunks/{index-9f2d5dc8.js → index-f5a00b06.js} +3 -3
- package/dist/_chunks/{index-9f2d5dc8.js.map → index-f5a00b06.js.map} +1 -1
- package/dist/_chunks/{index-5a5b0567.js → index-f762b27d.js} +21 -21
- package/dist/_chunks/{index-5a5b0567.js.map → index-f762b27d.js.map} +1 -1
- package/dist/_chunks/{index-f52ae628.mjs → index-faf78cfd.mjs} +3 -3
- package/dist/_chunks/{index-f52ae628.mjs.map → index-faf78cfd.mjs.map} +1 -1
- package/dist/_chunks/{index-0c9fceff.js → index-ff413b1a.js} +5 -5
- package/dist/_chunks/{index-0c9fceff.js.map → index-ff413b1a.js.map} +1 -1
- package/dist/_chunks/{index-1a74fa41.js → index-ffd2f664.js} +8 -4
- package/dist/_chunks/index-ffd2f664.js.map +1 -0
- package/dist/_chunks/{ru-d43423ea.mjs → ru-9aad40c5.mjs} +91 -42
- package/dist/_chunks/{ru-d43423ea.mjs.map → ru-9aad40c5.mjs.map} +1 -1
- package/dist/_chunks/{ru-07958f09.js → ru-c0293425.js} +91 -42
- package/dist/_chunks/{ru-07958f09.js.map → ru-c0293425.js.map} +1 -1
- package/dist/_chunks/{schema-a7f695ae.mjs → schema-da392e23.mjs} +2 -2
- package/dist/_chunks/{schema-a7f695ae.mjs.map → schema-da392e23.mjs.map} +1 -1
- package/dist/_chunks/{schema-15e33d1c.js → schema-e8bfd9c4.js} +2 -2
- package/dist/_chunks/{schema-15e33d1c.js.map → schema-e8bfd9c4.js.map} +1 -1
- package/dist/_chunks/{validateWorkflow-6b5dffaf.js → validateWorkflow-34ccfb57.js} +3 -3
- package/dist/_chunks/{validateWorkflow-6b5dffaf.js.map → validateWorkflow-34ccfb57.js.map} +1 -1
- package/dist/_chunks/{validateWorkflow-2f84e76e.mjs → validateWorkflow-67154f59.mjs} +3 -3
- package/dist/_chunks/{validateWorkflow-2f84e76e.mjs.map → validateWorkflow-67154f59.mjs.map} +1 -1
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/content-manager/components/BlocksInput/BlocksContent.d.ts +5 -0
- package/dist/admin/src/content-manager/components/BlocksInput/BlocksEditor.d.ts +34 -0
- package/dist/admin/src/content-manager/components/BlocksInput/BlocksInput.d.ts +18 -0
- package/dist/admin/src/content-manager/components/BlocksInput/BlocksToolbar.d.ts +2 -0
- package/dist/admin/src/content-manager/components/BlocksInput/hooks/useBlocksStore.d.ts +32 -0
- package/dist/admin/src/content-manager/components/BlocksInput/hooks/useModifiersStore.d.ts +20 -0
- package/dist/admin/src/content-manager/components/BlocksInput/plugins/withLinks.d.ts +8 -0
- package/dist/admin/src/content-manager/components/BlocksInput/plugins/withStrapiSchema.d.ts +8 -0
- package/dist/admin/src/content-manager/components/BlocksInput/tests/mock-schema.d.ts +2 -0
- package/dist/admin/src/content-manager/components/BlocksInput/utils/links.d.ts +10 -0
- package/dist/admin/src/content-manager/components/BlocksInput/utils/types.d.ts +6 -0
- package/dist/admin/src/hooks/useAdminUsers.d.ts +3 -3
- package/dist/admin/src/index.d.ts +1 -0
- package/dist/admin/src/render.d.ts +3 -1
- package/dist/cli.js +1 -1
- package/dist/cli.mjs +1 -1
- package/package.json +14 -14
- package/server/services/__tests__/user.test.js +15 -0
- package/server/services/user.js +1 -4
- package/dist/_chunks/SalesPage-c5cbb366.js.map +0 -1
- package/dist/_chunks/index-1a74fa41.js.map +0 -1
- package/dist/_chunks/index-81509193.mjs.map +0 -1
- package/dist/_chunks/index-9304d6de.js.map +0 -1
- package/dist/_chunks/index-dc89c18c.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarketplacePage-935fca72.js","sources":["../../admin/src/pages/Marketplace/components/NpmPackagesFilters.tsx","../../admin/src/pages/Marketplace/components/NpmPackageCard.tsx","../../admin/src/pages/Marketplace/components/NpmPackagesGrid.tsx","../../admin/src/pages/Marketplace/components/PageHeader.tsx","../../admin/src/pages/Marketplace/components/OfflineLayout.tsx","../../admin/src/pages/Marketplace/components/SortSelect.tsx","../../admin/src/pages/Marketplace/hooks/useMarketplaceData.ts","../../admin/src/pages/Marketplace/hooks/useNavigatorOnline.ts","../../admin/src/pages/Marketplace/MarketplacePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Button,\n Tag,\n MultiSelect,\n MultiSelectOption,\n MultiSelectProps,\n Popover,\n Flex,\n} from '@strapi/design-system';\nimport { Cross, Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport type { Categories, Collections, FilterTypes } from '../hooks/useMarketplaceData';\nimport type { NpmPackageType, MarketplacePageQuery } from '../MarketplacePage';\n\ninterface NpmPackagesFiltersProps {\n handleSelectClear: (type: FilterTypes) => void;\n handleSelectChange: (update: Partial<MarketplacePageQuery>) => void;\n npmPackageType: NpmPackageType;\n possibleCategories: Partial<Record<Categories, number>>;\n possibleCollections: Partial<Record<Collections, number>>;\n query: MarketplacePageQuery;\n}\n\nconst NpmPackagesFilters = ({\n handleSelectClear,\n handleSelectChange,\n npmPackageType,\n possibleCategories,\n possibleCollections,\n query,\n}: NpmPackagesFiltersProps) => {\n const [isVisible, setIsVisible] = React.useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null!);\n const { formatMessage } = useIntl();\n\n const handleToggle = () => setIsVisible((prev) => !prev);\n\n const handleTagRemove = (tagToRemove: string, filterType: FilterTypes) => {\n const update = {\n [filterType]: (query[filterType] ?? []).filter((previousTag) => previousTag !== tagToRemove),\n };\n\n handleSelectChange(update);\n };\n\n return (\n <>\n <Box paddingTop={1} paddingBottom={1}>\n <ButtonToggle\n variant=\"tertiary\"\n ref={buttonRef}\n startIcon={<Filter />}\n onClick={handleToggle}\n size=\"S\"\n >\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </ButtonToggle>\n {isVisible && (\n <Popover source={buttonRef} onDismiss={handleToggle} padding={3} spacing={4}>\n <FiltersFlex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <FilterSelect\n message={formatMessage({\n id: 'admin.pages.MarketPlacePage.filters.collections',\n defaultMessage: 'Collections',\n })}\n value={query?.collections || []}\n onChange={(newCollections) => {\n const update = { collections: newCollections };\n handleSelectChange(update);\n }}\n onClear={() => handleSelectClear('collections')}\n possibleFilters={possibleCollections}\n customizeContent={(values) =>\n formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.filters.collectionsSelected',\n defaultMessage:\n '{count, plural, =0 {No collections} one {# collection} other {# collections}} selected',\n },\n { count: values?.length ?? 0 }\n )\n }\n />\n {npmPackageType === 'plugin' && (\n <FilterSelect\n message={formatMessage({\n id: 'admin.pages.MarketPlacePage.filters.categories',\n defaultMessage: 'Categories',\n })}\n value={query?.categories || []}\n onChange={(newCategories) => {\n const update = { categories: newCategories };\n handleSelectChange(update);\n }}\n onClear={() => handleSelectClear('categories')}\n possibleFilters={possibleCategories}\n customizeContent={(values) =>\n formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.filters.categoriesSelected',\n defaultMessage:\n '{count, plural, =0 {No categories} one {# category} other {# categories}} selected',\n },\n { count: values?.length ?? 0 }\n )\n }\n />\n )}\n </FiltersFlex>\n </Popover>\n )}\n </Box>\n {query.collections?.map((collection) => (\n <Box key={collection} padding={1}>\n <Tag icon={<Cross />} onClick={() => handleTagRemove(collection, 'collections')}>\n {collection}\n </Tag>\n </Box>\n ))}\n {npmPackageType === 'plugin' &&\n query.categories?.map((category) => (\n <Box key={category} padding={1}>\n <Tag icon={<Cross />} onClick={() => handleTagRemove(category, 'categories')}>\n {category}\n </Tag>\n </Box>\n ))}\n </>\n );\n};\n\nconst ButtonToggle = styled(Button)`\n height: ${({ theme }) => theme.sizes.input.S};\n`;\n\nconst FiltersFlex = styled(Flex)`\n /* Hide the label, every input needs a label. */\n label {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FilterSelect\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterSelectProps\n extends Pick<MultiSelectProps, 'customizeContent' | 'onClear' | 'onChange' | 'value'> {\n message: string;\n possibleFilters:\n | NpmPackagesFiltersProps['possibleCategories']\n | NpmPackagesFiltersProps['possibleCollections'];\n}\n\nconst FilterSelect = ({\n message,\n value,\n onChange,\n possibleFilters,\n onClear,\n customizeContent,\n}: FilterSelectProps) => {\n return (\n <MultiSelect\n data-testid={`${message}-button`}\n label={message}\n placeholder={message}\n size=\"M\"\n onChange={onChange}\n onClear={onClear}\n value={value}\n customizeContent={customizeContent}\n >\n {Object.entries(possibleFilters).map(([filterName, count]) => {\n return (\n <MultiSelectOption\n data-testid={`${filterName}-${count}`}\n key={filterName}\n value={filterName}\n >\n {`${filterName} (${count})`}\n </MultiSelectOption>\n );\n })}\n </MultiSelect>\n );\n};\n\nexport { NpmPackagesFilters };\nexport type { NpmPackagesFiltersProps };\n","import { Box, Flex, Icon, Tooltip, Typography, Divider, Button } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport {\n useTracking,\n pxToRem,\n AppInfoContextValue,\n useNotification,\n useClipboard,\n} from '@strapi/helper-plugin';\nimport { CheckCircle, ExternalLink, Download, Github, Star, Check, Duplicate } from '@strapi/icons';\nimport pluralize from 'pluralize';\nimport { useIntl } from 'react-intl';\nimport * as semver from 'semver';\nimport styled from 'styled-components';\n\nimport StrapiLogo from '../../../assets/images/logo-strapi-2022.svg';\n\nimport type { Plugin, Provider } from '../hooks/useMarketplaceData';\nimport type { NpmPackageType } from '../MarketplacePage';\n\n// Custom component to have an ellipsis after the 2nd line\nconst EllipsisText = styled(Typography)`\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n`;\n\ninterface NpmPackageCardProps extends Pick<AppInfoContextValue, 'useYarn'> {\n npmPackage: Plugin | Provider;\n isInstalled: boolean;\n isInDevelopmentMode: AppInfoContextValue['autoReload'];\n npmPackageType: NpmPackageType;\n strapiAppVersion: AppInfoContextValue['strapiVersion'];\n}\n\nconst NpmPackageCard = ({\n npmPackage,\n isInstalled,\n useYarn,\n isInDevelopmentMode,\n npmPackageType,\n strapiAppVersion,\n}: NpmPackageCardProps) => {\n const { attributes } = npmPackage;\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const commandToCopy = useYarn\n ? `yarn add ${attributes.npmPackageName}`\n : `npm install ${attributes.npmPackageName}`;\n\n const madeByStrapiMessage = formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.tooltip.madeByStrapi',\n defaultMessage: 'Made by Strapi',\n });\n\n const npmPackageHref = `https://market.strapi.io/${pluralize.plural(npmPackageType)}/${\n attributes.slug\n }`;\n\n return (\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n paddingTop={4}\n paddingRight={4}\n paddingBottom={4}\n paddingLeft={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n alignItems=\"normal\"\n data-testid=\"npm-package-card\"\n >\n <Box>\n <Flex direction=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\">\n <Box\n as=\"img\"\n src={attributes.logo.url}\n alt={`${attributes.name} logo`}\n hasRadius\n width={11}\n height={11}\n />\n <PackageStats\n githubStars={attributes.githubStars}\n npmDownloads={attributes.npmDownloads}\n npmPackageType={npmPackageType}\n />\n </Flex>\n <Box paddingTop={4}>\n <Typography as=\"h3\" variant=\"delta\">\n <Flex alignItems=\"center\">\n {attributes.name}\n {attributes.validated && !attributes.madeByStrapi && (\n <Tooltip\n description={formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.tooltip.verified',\n defaultMessage: 'Plugin verified by Strapi',\n })}\n >\n <Flex>\n <Icon as={CheckCircle} marginLeft={2} color=\"success600\" />\n </Flex>\n </Tooltip>\n )}\n {attributes.madeByStrapi && (\n <Tooltip description={madeByStrapiMessage}>\n <Flex>\n <Box\n as=\"img\"\n src={StrapiLogo}\n alt={madeByStrapiMessage}\n marginLeft={1}\n width={6}\n height=\"auto\"\n />\n </Flex>\n </Tooltip>\n )}\n </Flex>\n </Typography>\n </Box>\n <Box paddingTop={2}>\n <EllipsisText as=\"p\" variant=\"omega\" textColor=\"neutral600\">\n {attributes.description}\n </EllipsisText>\n </Box>\n </Box>\n\n <Flex gap={2} style={{ alignSelf: 'flex-end' }} paddingTop={6}>\n <LinkButton\n size=\"S\"\n href={npmPackageHref}\n isExternal\n endIcon={<ExternalLink />}\n aria-label={formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.info.label',\n defaultMessage: 'Learn more about {pluginName}',\n },\n { pluginName: attributes.name }\n )}\n variant=\"tertiary\"\n onClick={() => trackUsage('didPluginLearnMore')}\n >\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.info.text',\n defaultMessage: 'More',\n })}\n </LinkButton>\n <InstallPluginButton\n isInstalled={isInstalled}\n isInDevelopmentMode={isInDevelopmentMode}\n commandToCopy={commandToCopy}\n strapiAppVersion={strapiAppVersion}\n strapiPeerDepVersion={attributes.strapiVersion}\n pluginName={attributes.name}\n />\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * InstallPluginButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface InstallPluginButtonProps\n extends Pick<NpmPackageCardProps, 'isInstalled' | 'isInDevelopmentMode' | 'strapiAppVersion'> {\n commandToCopy: string;\n pluginName: string;\n strapiPeerDepVersion?: string;\n}\n\nconst InstallPluginButton = ({\n isInstalled,\n isInDevelopmentMode,\n commandToCopy,\n strapiAppVersion,\n strapiPeerDepVersion,\n pluginName,\n}: InstallPluginButtonProps) => {\n const toggleNotification = useNotification();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { copy } = useClipboard();\n\n const handleCopy = async () => {\n const didCopy = await copy(commandToCopy);\n\n if (didCopy) {\n trackUsage('willInstallPlugin');\n toggleNotification({\n type: 'success',\n message: { id: 'admin.pages.MarketPlacePage.plugin.copy.success' },\n });\n }\n };\n\n // Already installed\n if (isInstalled) {\n return (\n <Box paddingLeft={4}>\n <Icon as={Check} marginRight={2} width={12} height={12} color=\"success600\" />\n <Typography variant=\"omega\" textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.installed',\n defaultMessage: 'Installed',\n })}\n </Typography>\n </Box>\n );\n }\n\n // In development, show install button\n if (isInDevelopmentMode) {\n return (\n <CardButton\n strapiAppVersion={strapiAppVersion}\n strapiPeerDepVersion={strapiPeerDepVersion}\n handleCopy={handleCopy}\n pluginName={pluginName}\n />\n );\n }\n\n // Not in development and plugin not installed already. Show nothing\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CardButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CardButtonProps\n extends Pick<NpmPackageCardProps, 'strapiAppVersion'>,\n Pick<InstallPluginButtonProps, 'strapiPeerDepVersion' | 'pluginName'> {\n handleCopy: () => void;\n}\n\nconst CardButton = ({\n strapiPeerDepVersion,\n strapiAppVersion,\n handleCopy,\n pluginName,\n}: CardButtonProps) => {\n const { formatMessage } = useIntl();\n const versionRange = semver.validRange(strapiPeerDepVersion);\n const isCompatible = semver.satisfies(strapiAppVersion ?? '', versionRange ?? '');\n\n const installMessage = formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.copy',\n defaultMessage: 'Copy install command',\n });\n\n // Only plugins receive a strapiAppVersion\n if (strapiAppVersion) {\n if (!versionRange || !isCompatible) {\n return (\n <Tooltip\n data-testid={`tooltip-${pluginName}`}\n description={\n !versionRange\n ? formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.version.null',\n defaultMessage:\n 'Unable to verify compatibility with your Strapi version: \"{strapiAppVersion}\"',\n },\n { strapiAppVersion }\n )\n : formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.version',\n defaultMessage:\n 'Update your Strapi version: \"{strapiAppVersion}\" to: \"{versionRange}\"',\n },\n {\n strapiAppVersion,\n versionRange,\n }\n )\n }\n >\n <Button\n size=\"S\"\n startIcon={<Duplicate />}\n variant=\"secondary\"\n onClick={handleCopy}\n disabled={!isCompatible}\n >\n {installMessage}\n </Button>\n </Tooltip>\n );\n }\n }\n\n return (\n <Button size=\"S\" startIcon={<Duplicate />} variant=\"secondary\" onClick={handleCopy}>\n {installMessage}\n </Button>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PackageStats\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PackageStatsProps {\n githubStars?: number;\n npmDownloads?: number;\n npmPackageType: NpmPackageType;\n}\n\nconst PackageStats = ({ githubStars = 0, npmDownloads = 0, npmPackageType }: PackageStatsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex gap={1}>\n {!!githubStars && (\n <>\n <Icon as={Github} height={pxToRem(12)} width={pxToRem(12)} aria-hidden />\n <Icon as={Star} height={pxToRem(12)} width={pxToRem(12)} color=\"warning500\" aria-hidden />\n <p\n aria-label={formatMessage(\n {\n id: `admin.pages.MarketPlacePage.${npmPackageType}.githubStars`,\n defaultMessage: `This {package} was starred {starsCount} on GitHub`,\n },\n {\n starsCount: githubStars,\n package: npmPackageType,\n }\n )}\n >\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {githubStars}\n </Typography>\n </p>\n <VerticalDivider unsetMargin={false} />\n </>\n )}\n <Icon as={Download} height={pxToRem(12)} width={pxToRem(12)} aria-hidden />\n <p\n aria-label={formatMessage(\n {\n id: `admin.pages.MarketPlacePage.${npmPackageType}.downloads`,\n defaultMessage: `This {package} has {downloadsCount} weekly downloads`,\n },\n {\n downloadsCount: npmDownloads,\n package: npmPackageType,\n }\n )}\n >\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {npmDownloads}\n </Typography>\n </p>\n </Flex>\n );\n};\n\nconst VerticalDivider = styled(Divider)`\n width: ${pxToRem(12)};\n transform: rotate(90deg);\n`;\n\nexport { NpmPackageCard };\nexport type { NpmPackageCardProps };\n","import {\n Box,\n Flex,\n Grid,\n GridItem,\n GridLayout,\n Icon,\n Loader,\n Typography,\n} from '@strapi/design-system';\nimport { AnErrorOccurred, AppInfoContextValue } from '@strapi/helper-plugin';\nimport { EmptyDocuments } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { NpmPackageCard, NpmPackageCardProps } from './NpmPackageCard';\n\nimport type { Plugin, Provider } from '../hooks/useMarketplaceData';\n\ninterface NpmPackagesGridProps extends Pick<NpmPackageCardProps, 'npmPackageType' | 'useYarn'> {\n debouncedSearch: string;\n installedPackageNames: string[];\n isInDevelopmentMode: AppInfoContextValue['autoReload'];\n npmPackages?: Array<Plugin | Provider>;\n status: 'idle' | 'loading' | 'error' | 'success';\n strapiAppVersion?: NpmPackageCardProps['strapiAppVersion'];\n}\n\nconst NpmPackagesGrid = ({\n status,\n npmPackages = [],\n installedPackageNames = [],\n useYarn,\n isInDevelopmentMode,\n npmPackageType,\n strapiAppVersion,\n debouncedSearch,\n}: NpmPackagesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (status === 'error') {\n return (\n <Flex paddingTop={8}>\n <AnErrorOccurred />\n </Flex>\n );\n }\n\n if (status === 'loading') {\n return (\n <Flex justifyContent=\"center\" paddingTop={8}>\n <Loader>Loading content...</Loader>\n </Flex>\n );\n }\n\n const emptySearchMessage = formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.search.empty',\n defaultMessage: 'No result for \"{target}\"',\n },\n { target: debouncedSearch }\n );\n\n if (npmPackages.length === 0) {\n return (\n <Box position=\"relative\">\n <GridLayout>\n {Array(12)\n .fill(null)\n .map((_, idx) => (\n <EmptyPluginCard key={idx} height=\"234px\" hasRadius />\n ))}\n </GridLayout>\n <Box position=\"absolute\" top={11} width=\"100%\">\n <Flex alignItems=\"center\" justifyContent=\"center\" direction=\"column\">\n <Icon as={EmptyDocuments} color={undefined} width=\"160px\" height=\"88px\" />\n <Box paddingTop={6}>\n <Typography variant=\"delta\" as=\"p\" textColor=\"neutral600\">\n {emptySearchMessage}\n </Typography>\n </Box>\n </Flex>\n </Box>\n </Box>\n );\n }\n\n return (\n <Grid gap={4}>\n {npmPackages.map((npmPackage) => (\n <GridItem col={4} s={6} xs={12} style={{ height: '100%' }} key={npmPackage.id}>\n <NpmPackageCard\n npmPackage={npmPackage}\n isInstalled={installedPackageNames.includes(npmPackage.attributes.npmPackageName)}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType={npmPackageType}\n strapiAppVersion={strapiAppVersion}\n />\n </GridItem>\n ))}\n </Grid>\n );\n};\n\nconst EmptyPluginCard = styled(Box)`\n background: ${({ theme }) =>\n `linear-gradient(180deg, rgba(234, 234, 239, 0) 0%, ${theme.colors.neutral150} 100%)`};\n opacity: 0.33;\n`;\n\nexport { NpmPackagesGrid };\n","import { HeaderLayout } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport { useTracking } from '@strapi/helper-plugin';\nimport { Upload } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport type { NpmPackageType } from '../MarketplacePage';\n\ninterface PageHeaderProps {\n isOnline?: boolean;\n npmPackageType?: NpmPackageType;\n}\n\nconst PageHeader = ({ isOnline, npmPackageType = 'plugin' }: PageHeaderProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const tracking = npmPackageType === 'provider' ? 'didSubmitProvider' : 'didSubmitPlugin';\n\n return (\n <HeaderLayout\n title={formatMessage({\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n })}\n subtitle={formatMessage({\n id: 'admin.pages.MarketPlacePage.subtitle',\n defaultMessage: 'Get more out of Strapi',\n })}\n primaryAction={\n isOnline && (\n <LinkButton\n startIcon={<Upload />}\n variant=\"tertiary\"\n href={`https://market.strapi.io/submit-${npmPackageType}`}\n onClick={() => trackUsage(tracking)}\n isExternal\n >\n {formatMessage({\n id: `admin.pages.MarketPlacePage.submit.${npmPackageType}.link`,\n defaultMessage: `Submit ${npmPackageType}`,\n })}\n </LinkButton>\n )\n }\n />\n );\n};\n\nexport { PageHeader };\nexport type { PageHeaderProps };\n","import { Box, Flex, Layout, Main, Typography } from '@strapi/design-system';\nimport { pxToRem } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { PageHeader } from './PageHeader';\n\nconst OfflineLayout = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Layout>\n <Main>\n <PageHeader />\n <Flex\n width=\"100%\"\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingTop={pxToRem(120)}\n >\n <Box paddingBottom={2}>\n <Typography textColor=\"neutral700\" variant=\"alpha\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.offline.title',\n defaultMessage: 'You are offline',\n })}\n </Typography>\n </Box>\n <Box paddingBottom={6}>\n <Typography textColor=\"neutral700\" variant=\"epsilon\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.offline.subtitle',\n defaultMessage: 'You need to be connected to the Internet to access Strapi Market.',\n })}\n </Typography>\n </Box>\n <svg\n width=\"88\"\n height=\"88\"\n viewBox=\"0 0 88 88\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\".5\" y=\".5\" width=\"87\" height=\"87\" rx=\"43.5\" fill=\"#F0F0FF\" />\n <path\n d=\"M34 39.3h-4c-2.6 0-4.7 1-6.6 2.8a9 9 0 0 0-2.7 6.6 9 9 0 0 0 2.7 6.6A9 9 0 0 0 30 58h22.8L34 39.3Zm-11-11 3-3 39 39-3 3-4.7-4.6H30a13.8 13.8 0 0 1-14-14c0-3.8 1.3-7 4-9.7 2.6-2.7 5.7-4.2 9.5-4.3L23 28.2Zm38.2 11.1c3 .2 5.5 1.5 7.6 3.7A11 11 0 0 1 72 51c0 4-1.6 7.2-5 9.5l-3.3-3.4a6.5 6.5 0 0 0 3.6-6.1c0-1.9-.7-3.5-2-5-1.5-1.3-3.1-2-5-2h-3.5v-1.2c0-3.6-1.2-6.6-3.7-9a13 13 0 0 0-15-2.3L34.6 28a17 17 0 0 1 20.3 1.5c3.5 2.7 5.5 6 6.3 10Z\"\n fill=\"#4945FF\"\n />\n <rect x=\".5\" y=\".5\" width=\"87\" height=\"87\" rx=\"43.5\" stroke=\"#D9D8FF\" />\n </svg>\n </Flex>\n </Main>\n </Layout>\n );\n};\n\nexport { OfflineLayout };\n","import { Box, SingleSelectOption, SingleSelect } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nconst SORT_TYPES = {\n 'name:asc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.alphabetical.selected',\n defaultMessage: 'Sort by alphabetical order',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.alphabetical',\n defaultMessage: 'Alphabetical order',\n },\n },\n 'submissionDate:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.newest.selected',\n defaultMessage: 'Sort by newest',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.newest',\n defaultMessage: 'Newest',\n },\n },\n 'githubStars:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.githubStars.selected',\n defaultMessage: 'Sort by GitHub stars',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.githubStars',\n defaultMessage: 'Number of GitHub stars',\n },\n },\n 'npmDownloads:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.npmDownloads.selected',\n defaultMessage: 'Sort by npm downloads',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.npmDownloads',\n defaultMessage: 'Number of downloads',\n },\n },\n} as const;\n\ninterface SortSelectProps {\n sortQuery: keyof typeof SORT_TYPES;\n handleSelectChange: (payload: { sort: string }) => void;\n}\n\nconst SortSelect = ({ sortQuery, handleSelectChange }: SortSelectProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <SelectWrapper>\n <SingleSelect\n size=\"S\"\n id=\"sort-by-select\"\n value={sortQuery}\n customizeContent={() => formatMessage(SORT_TYPES[sortQuery].selected)}\n onChange={(sortName) => {\n // @ts-expect-error – in V2 design-system we'll only ever return strings.\n handleSelectChange({ sort: sortName });\n }}\n label={formatMessage({\n id: 'admin.pages.MarketPlacePage.sort.label',\n defaultMessage: 'Sort by',\n })}\n >\n {Object.entries(SORT_TYPES).map(([sortName, messages]) => {\n return (\n <SingleSelectOption key={sortName} value={sortName}>\n {formatMessage(messages.option)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled(Box)`\n font-weight: ${({ theme }) => theme.fontWeights.semiBold};\n\n span {\n font-size: ${({ theme }) => theme.fontSizes[1]};\n }\n\n /* Hide the label, every input needs a label. */\n label {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n`;\n\nexport { SortSelect };\nexport type { SortSelectProps };\n","import { useNotifyAT } from '@strapi/design-system';\nimport { useNotification } from '@strapi/helper-plugin';\nimport * as qs from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport type { MarketplacePageQuery, NpmPackageType, TabQuery } from '../MarketplacePage';\n\nconst MARKETPLACE_API_URL = 'https://market-api.strapi.io';\n\ninterface UseMarketplaceDataParams {\n npmPackageType: NpmPackageType;\n debouncedSearch: string;\n query?: MarketplacePageQuery;\n tabQuery: TabQuery;\n}\n\ntype Collections =\n | 'Verified'\n | 'Made by the community'\n | 'Made by Strapi'\n | 'Made by official partners';\n\ntype Categories = 'Custom fields' | 'Deployment' | 'Monitoring';\n\ntype FilterTypes = 'categories' | 'collections';\n\ninterface Plugin {\n id: string;\n attributes: {\n name: string;\n description: string;\n slug: string;\n npmPackageName: string;\n npmPackageUrl: string;\n npmDownloads: number;\n repositoryUrl: string;\n githubStars: number;\n logo: {\n url: string;\n };\n developerName: string;\n validated: boolean;\n madeByStrapi: boolean;\n strapiCompatibility: string;\n submissionDate: string;\n collections: Collections[];\n categories: Categories[];\n strapiVersion: string;\n screenshots: Array<{\n url: string;\n }>;\n };\n}\n\ninterface Provider {\n id: string;\n attributes: {\n name: string;\n description: string;\n slug: string;\n npmPackageName: string;\n npmPackageUrl: string;\n npmDownloads: number;\n repositoryUrl: string;\n githubStars: number;\n pluginName: string;\n logo: {\n url: string;\n };\n developerName: string;\n validated: boolean;\n madeByStrapi: boolean;\n strapiCompatibility: string;\n strapiVersion?: never;\n submissionDate: string;\n collections: Collections[];\n };\n}\n\ninterface MarketplaceMeta {\n collections: Record<Collections, number>;\n pagination: {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n };\n}\n\ninterface MarketplaceResponse<TData extends Plugin | Provider> {\n data: TData[];\n meta: TData extends Provider\n ? MarketplaceMeta\n : MarketplaceMeta & { categories: Record<Categories, number> };\n}\n\nfunction useMarketplaceData({\n npmPackageType,\n debouncedSearch,\n query,\n tabQuery,\n}: UseMarketplaceDataParams) {\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const marketplaceTitle = formatMessage({\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n });\n\n const notifyMarketplaceLoad = () => {\n notifyStatus(\n formatMessage(\n {\n id: 'app.utils.notify.data-loaded',\n defaultMessage: 'The {target} has loaded',\n },\n { target: marketplaceTitle }\n )\n );\n };\n\n const paginationParams = {\n page: query?.page || 1,\n pageSize: query?.pageSize || 24,\n };\n\n const pluginParams = {\n ...tabQuery.plugin,\n pagination: paginationParams,\n search: debouncedSearch,\n };\n\n const { data: pluginsResponse, status: pluginsStatus } = useQuery(\n ['marketplace', 'plugins', pluginParams],\n async () => {\n try {\n const queryString = qs.stringify(pluginParams);\n const res = await fetch(`${MARKETPLACE_API_URL}/plugins?${queryString}`);\n\n if (!res.ok) {\n throw new Error('Failed to fetch marketplace plugins.');\n }\n\n const data = (await res.json()) as MarketplaceResponse<Plugin>;\n\n return data;\n } catch (error) {\n // silence\n }\n\n return null;\n },\n {\n onSuccess() {\n notifyMarketplaceLoad();\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const providerParams = {\n ...tabQuery.provider,\n pagination: paginationParams,\n search: debouncedSearch,\n };\n\n const { data: providersResponse, status: providersStatus } = useQuery(\n ['marketplace', 'providers', providerParams],\n async () => {\n const queryString = qs.stringify(providerParams);\n const res = await fetch(`${MARKETPLACE_API_URL}/providers?${queryString}`);\n\n if (!res.ok) {\n throw new Error('Failed to fetch marketplace providers.');\n }\n\n const data = (await res.json()) as MarketplaceResponse<Provider>;\n\n return data;\n },\n {\n onSuccess() {\n notifyMarketplaceLoad();\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const npmPackageTypeResponse = npmPackageType === 'plugin' ? pluginsResponse : providersResponse;\n\n const possibleCollections = npmPackageTypeResponse?.meta.collections ?? {};\n const possibleCategories = pluginsResponse?.meta.categories ?? {};\n\n const { pagination } = npmPackageTypeResponse?.meta ?? {};\n\n return {\n pluginsResponse,\n providersResponse,\n pluginsStatus,\n providersStatus,\n possibleCollections,\n possibleCategories,\n pagination,\n };\n}\n\nexport { useMarketplaceData };\nexport type {\n MarketplaceResponse,\n Plugin,\n Provider,\n MarketplaceMeta,\n Collections,\n Categories,\n FilterTypes,\n UseMarketplaceDataParams,\n};\n","import * as React from 'react';\n\n/**\n * For more details about this hook see:\n * https://www.30secondsofcode.org/react/s/use-navigator-on-line\n */\nexport const useNavigatorOnline = (): boolean => {\n const onlineStatus =\n typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean'\n ? navigator.onLine\n : true;\n\n const [isOnline, setIsOnline] = React.useState(onlineStatus);\n\n const setOnline = () => setIsOnline(true);\n const setOffline = () => setIsOnline(false);\n\n React.useEffect(() => {\n window.addEventListener('online', setOnline);\n window.addEventListener('offline', setOffline);\n\n return () => {\n window.removeEventListener('online', setOnline);\n window.removeEventListener('offline', setOffline);\n };\n }, []);\n\n return isOnline;\n};\n","import * as React from 'react';\n\nimport {\n Box,\n ContentLayout,\n Flex,\n Icon,\n Layout,\n Main,\n Searchbar,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n ContentBox,\n PageSizeURLQuery,\n PaginationURLQuery,\n useAppInfo,\n useFocusWhenNavigate,\n useNotification,\n useQueryParams,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { ExternalLink, GlassesSquare } from '@strapi/icons';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useDebounce } from '../../hooks/useDebounce';\nimport { selectAdminPermissions } from '../../selectors';\n\nimport { NpmPackagesFilters } from './components/NpmPackagesFilters';\nimport { NpmPackagesGrid } from './components/NpmPackagesGrid';\nimport { OfflineLayout } from './components/OfflineLayout';\nimport { PageHeader } from './components/PageHeader';\nimport { SortSelect, SortSelectProps } from './components/SortSelect';\nimport { FilterTypes, useMarketplaceData } from './hooks/useMarketplaceData';\nimport { useNavigatorOnline } from './hooks/useNavigatorOnline';\n\ntype NpmPackageType = 'plugin' | 'provider';\n\ninterface MarketplacePageQuery {\n collections?: string[];\n categories?: string[];\n npmPackageType?: NpmPackageType;\n page?: number;\n pageSize?: number;\n search?: string;\n sort?: SortSelectProps['sortQuery'];\n}\n\ninterface TabQuery {\n plugin: MarketplacePageQuery;\n provider: MarketplacePageQuery;\n}\n\nconst MarketplacePage = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const toggleNotification = useNotification();\n const [{ query }, setQuery] = useQueryParams<MarketplacePageQuery>();\n const debouncedSearch = useDebounce(query?.search, 500) || '';\n\n const { autoReload: isInDevelopmentMode, dependencies, useYarn, strapiVersion } = useAppInfo();\n const isOnline = useNavigatorOnline();\n\n const npmPackageType = query?.npmPackageType || 'plugin';\n\n const [tabQuery, setTabQuery] = React.useState<TabQuery>({\n plugin: npmPackageType === 'plugin' ? { ...query } : {},\n provider: npmPackageType === 'provider' ? { ...query } : {},\n });\n\n useFocusWhenNavigate();\n\n React.useEffect(() => {\n trackUsage('didGoToMarketplace');\n }, [trackUsage]);\n\n React.useEffect(() => {\n if (!isInDevelopmentMode) {\n toggleNotification({\n type: 'info',\n message: {\n id: 'admin.pages.MarketPlacePage.production',\n defaultMessage: 'Manage plugins from the development environment',\n },\n });\n }\n }, [toggleNotification, isInDevelopmentMode]);\n\n const {\n pluginsResponse,\n providersResponse,\n pluginsStatus,\n providersStatus,\n possibleCollections,\n possibleCategories,\n pagination,\n } = useMarketplaceData({ npmPackageType, debouncedSearch, query, tabQuery });\n\n if (!isOnline) {\n return <OfflineLayout />;\n }\n\n const handleTabChange = (selected: number) => {\n const selectedTab = selected === 0 ? 'plugin' : 'provider';\n const hasTabQuery = tabQuery[selectedTab] && Object.keys(tabQuery[selectedTab]).length;\n\n if (hasTabQuery) {\n setQuery({\n // Keep filters and search\n ...tabQuery[selectedTab],\n search: query?.search || '',\n // Set tab and reset page\n npmPackageType: selectedTab,\n page: 1,\n });\n } else {\n setQuery({\n // Set tab\n npmPackageType: selectedTab,\n // Clear filters\n collections: [],\n categories: [],\n sort: 'name:asc',\n page: 1,\n // Keep search\n search: query?.search || '',\n });\n }\n };\n\n const handleSelectChange = (update: Partial<MarketplacePageQuery>) => {\n setQuery({ ...update, page: 1 });\n setTabQuery((prev) => ({\n ...prev,\n [npmPackageType]: { ...prev[npmPackageType], ...update },\n }));\n };\n\n const handleSelectClear = (filterType: FilterTypes) => {\n setQuery({ [filterType]: [], page: undefined }, 'remove');\n setTabQuery((prev) => ({ ...prev, [npmPackageType]: {} }));\n };\n\n const handleSortSelectChange: SortSelectProps['handleSelectChange'] = ({ sort }) =>\n // @ts-expect-error - this is a narrowing issue.\n handleSelectChange({ sort });\n\n // Check if plugins and providers are installed already\n const installedPackageNames = Object.keys(dependencies ?? {});\n\n return (\n <Layout>\n <Main>\n <Helmet\n title={formatMessage({\n id: 'admin.pages.MarketPlacePage.helmet',\n defaultMessage: 'Marketplace - Plugins',\n })}\n />\n <PageHeader isOnline={isOnline} npmPackageType={npmPackageType} />\n <ContentLayout>\n <TabGroup\n label={formatMessage({\n id: 'admin.pages.MarketPlacePage.tab-group.label',\n defaultMessage: 'Plugins and Providers for Strapi',\n })}\n id=\"tabs\"\n variant=\"simple\"\n initialSelectedTabIndex={['plugin', 'provider'].indexOf(npmPackageType)}\n onTabChange={handleTabChange}\n >\n <Flex justifyContent=\"space-between\" paddingBottom={4}>\n <Tabs>\n <Tab>\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugins',\n defaultMessage: 'Plugins',\n })}{' '}\n {pluginsResponse ? `(${pluginsResponse.meta.pagination.total})` : '...'}\n </Tab>\n <Tab>\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.providers',\n defaultMessage: 'Providers',\n })}{' '}\n {providersResponse ? `(${providersResponse.meta.pagination.total})` : '...'}\n </Tab>\n </Tabs>\n <Box width=\"25%\">\n <Searchbar\n name=\"searchbar\"\n onClear={() => setQuery({ search: '', page: 1 })}\n value={query?.search}\n onChange={(e) => setQuery({ search: e.target.value, page: 1 })}\n clearLabel={formatMessage({\n id: 'admin.pages.MarketPlacePage.search.clear',\n defaultMessage: 'Clear the search',\n })}\n placeholder={formatMessage({\n id: 'admin.pages.MarketPlacePage.search.placeholder',\n defaultMessage: 'Search',\n })}\n >\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.search.placeholder',\n defaultMessage: 'Search',\n })}\n </Searchbar>\n </Box>\n </Flex>\n <Flex paddingBottom={4} gap={2}>\n <SortSelect\n sortQuery={query?.sort || 'name:asc'}\n handleSelectChange={handleSortSelectChange}\n />\n <NpmPackagesFilters\n npmPackageType={npmPackageType}\n possibleCollections={possibleCollections}\n possibleCategories={possibleCategories}\n query={query || {}}\n handleSelectChange={handleSelectChange}\n handleSelectClear={handleSelectClear}\n />\n </Flex>\n\n <TabPanels>\n {/* Plugins panel */}\n <TabPanel>\n <NpmPackagesGrid\n npmPackages={pluginsResponse?.data}\n status={pluginsStatus}\n installedPackageNames={installedPackageNames}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType=\"plugin\"\n strapiAppVersion={strapiVersion}\n debouncedSearch={debouncedSearch}\n />\n </TabPanel>\n {/* Providers panel */}\n <TabPanel>\n <NpmPackagesGrid\n npmPackages={providersResponse?.data}\n status={providersStatus}\n installedPackageNames={installedPackageNames}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType=\"provider\"\n debouncedSearch={debouncedSearch}\n />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n {pagination ? (\n <Box paddingTop={4}>\n <Flex alignItems=\"flex-end\" justifyContent=\"space-between\">\n <PageSizeURLQuery options={['12', '24', '50', '100']} defaultValue=\"24\" />\n <PaginationURLQuery pagination={pagination} />\n </Flex>\n </Box>\n ) : null}\n <Box paddingTop={8}>\n <a\n href=\"https://strapi.canny.io/plugin-requests\"\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n style={{ textDecoration: 'none' }}\n onClick={() => trackUsage('didMissMarketplacePlugin')}\n >\n <ContentBox\n title={formatMessage({\n id: 'admin.pages.MarketPlacePage.missingPlugin.title',\n defaultMessage: 'Documentation',\n })}\n subtitle={formatMessage({\n id: 'admin.pages.MarketPlacePage.missingPlugin.description',\n defaultMessage:\n \"Tell us what plugin you are looking for and we'll let our community plugin developers know in case they are in search for inspiration!\",\n })}\n icon={<GlassesSquare />}\n iconBackground=\"alternative100\"\n endAction={\n <Icon as={ExternalLink} color=\"neutral600\" width={3} height={3} marginLeft={2} />\n }\n />\n </a>\n </Box>\n </ContentLayout>\n </Main>\n </Layout>\n );\n};\n\nconst ProtectedMarketplacePage = () => {\n const permissions = useSelector(selectAdminPermissions);\n\n return (\n // @ts-expect-error – the selector is not typed.\n <CheckPagePermissions permissions={permissions.marketplace.main}>\n <MarketplacePage />\n </CheckPagePermissions>\n );\n};\n\nexport { MarketplacePage, ProtectedMarketplacePage };\nexport type { NpmPackageType, MarketplacePageQuery, TabQuery };\n"],"names":["React","useIntl","jsxs","Fragment","Box","jsx","Filter","Popover","Tag","Cross","styled","Button","Flex","MultiSelect","MultiSelectOption","Typography","useTracking","pluralize","Tooltip","Icon","CheckCircle","StrapiLogo","LinkButton","ExternalLink","useNotification","useClipboard","Check","semver","Duplicate","Github","pxToRem","Star","Download","Divider","AnErrorOccurred","Loader","GridLayout","EmptyDocuments","Grid","GridItem","HeaderLayout","Upload","Layout","Main","SingleSelect","SingleSelectOption","useNotifyAT","useQuery","qs","useQueryParams","useDebounce","useAppInfo","useFocusWhenNavigate","Helmet","ContentLayout","TabGroup","Tabs","Tab","Searchbar","TabPanels","TabPanel","PageSizeURLQuery","PaginationURLQuery","ContentBox","GlassesSquare","useSelector","selectAdminPermissions","CheckPagePermissions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarketplacePage-193e4eca.js","sources":["../../admin/src/pages/Marketplace/components/NpmPackagesFilters.tsx","../../admin/src/pages/Marketplace/components/NpmPackageCard.tsx","../../admin/src/pages/Marketplace/components/NpmPackagesGrid.tsx","../../admin/src/pages/Marketplace/components/PageHeader.tsx","../../admin/src/pages/Marketplace/components/OfflineLayout.tsx","../../admin/src/pages/Marketplace/components/SortSelect.tsx","../../admin/src/pages/Marketplace/hooks/useMarketplaceData.ts","../../admin/src/pages/Marketplace/hooks/useNavigatorOnline.ts","../../admin/src/pages/Marketplace/MarketplacePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Button,\n Tag,\n MultiSelect,\n MultiSelectOption,\n MultiSelectProps,\n Popover,\n Flex,\n} from '@strapi/design-system';\nimport { Cross, Filter } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport type { Categories, Collections, FilterTypes } from '../hooks/useMarketplaceData';\nimport type { NpmPackageType, MarketplacePageQuery } from '../MarketplacePage';\n\ninterface NpmPackagesFiltersProps {\n handleSelectClear: (type: FilterTypes) => void;\n handleSelectChange: (update: Partial<MarketplacePageQuery>) => void;\n npmPackageType: NpmPackageType;\n possibleCategories: Partial<Record<Categories, number>>;\n possibleCollections: Partial<Record<Collections, number>>;\n query: MarketplacePageQuery;\n}\n\nconst NpmPackagesFilters = ({\n handleSelectClear,\n handleSelectChange,\n npmPackageType,\n possibleCategories,\n possibleCollections,\n query,\n}: NpmPackagesFiltersProps) => {\n const [isVisible, setIsVisible] = React.useState(false);\n const buttonRef = React.useRef<HTMLButtonElement>(null!);\n const { formatMessage } = useIntl();\n\n const handleToggle = () => setIsVisible((prev) => !prev);\n\n const handleTagRemove = (tagToRemove: string, filterType: FilterTypes) => {\n const update = {\n [filterType]: (query[filterType] ?? []).filter((previousTag) => previousTag !== tagToRemove),\n };\n\n handleSelectChange(update);\n };\n\n return (\n <>\n <Box paddingTop={1} paddingBottom={1}>\n <ButtonToggle\n variant=\"tertiary\"\n ref={buttonRef}\n startIcon={<Filter />}\n onClick={handleToggle}\n size=\"S\"\n >\n {formatMessage({ id: 'app.utils.filters', defaultMessage: 'Filters' })}\n </ButtonToggle>\n {isVisible && (\n <Popover source={buttonRef} onDismiss={handleToggle} padding={3} spacing={4}>\n <FiltersFlex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <FilterSelect\n message={formatMessage({\n id: 'admin.pages.MarketPlacePage.filters.collections',\n defaultMessage: 'Collections',\n })}\n value={query?.collections || []}\n onChange={(newCollections) => {\n const update = { collections: newCollections };\n handleSelectChange(update);\n }}\n onClear={() => handleSelectClear('collections')}\n possibleFilters={possibleCollections}\n customizeContent={(values) =>\n formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.filters.collectionsSelected',\n defaultMessage:\n '{count, plural, =0 {No collections} one {# collection} other {# collections}} selected',\n },\n { count: values?.length ?? 0 }\n )\n }\n />\n {npmPackageType === 'plugin' && (\n <FilterSelect\n message={formatMessage({\n id: 'admin.pages.MarketPlacePage.filters.categories',\n defaultMessage: 'Categories',\n })}\n value={query?.categories || []}\n onChange={(newCategories) => {\n const update = { categories: newCategories };\n handleSelectChange(update);\n }}\n onClear={() => handleSelectClear('categories')}\n possibleFilters={possibleCategories}\n customizeContent={(values) =>\n formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.filters.categoriesSelected',\n defaultMessage:\n '{count, plural, =0 {No categories} one {# category} other {# categories}} selected',\n },\n { count: values?.length ?? 0 }\n )\n }\n />\n )}\n </FiltersFlex>\n </Popover>\n )}\n </Box>\n {query.collections?.map((collection) => (\n <Box key={collection} padding={1}>\n <Tag icon={<Cross />} onClick={() => handleTagRemove(collection, 'collections')}>\n {collection}\n </Tag>\n </Box>\n ))}\n {npmPackageType === 'plugin' &&\n query.categories?.map((category) => (\n <Box key={category} padding={1}>\n <Tag icon={<Cross />} onClick={() => handleTagRemove(category, 'categories')}>\n {category}\n </Tag>\n </Box>\n ))}\n </>\n );\n};\n\nconst ButtonToggle = styled(Button)`\n height: ${({ theme }) => theme.sizes.input.S};\n`;\n\nconst FiltersFlex = styled(Flex)`\n /* Hide the label, every input needs a label. */\n label {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * FilterSelect\n * -----------------------------------------------------------------------------------------------*/\n\ninterface FilterSelectProps\n extends Pick<MultiSelectProps, 'customizeContent' | 'onClear' | 'onChange' | 'value'> {\n message: string;\n possibleFilters:\n | NpmPackagesFiltersProps['possibleCategories']\n | NpmPackagesFiltersProps['possibleCollections'];\n}\n\nconst FilterSelect = ({\n message,\n value,\n onChange,\n possibleFilters,\n onClear,\n customizeContent,\n}: FilterSelectProps) => {\n return (\n <MultiSelect\n data-testid={`${message}-button`}\n label={message}\n placeholder={message}\n size=\"M\"\n onChange={onChange}\n onClear={onClear}\n value={value}\n customizeContent={customizeContent}\n >\n {Object.entries(possibleFilters).map(([filterName, count]) => {\n return (\n <MultiSelectOption\n data-testid={`${filterName}-${count}`}\n key={filterName}\n value={filterName}\n >\n {`${filterName} (${count})`}\n </MultiSelectOption>\n );\n })}\n </MultiSelect>\n );\n};\n\nexport { NpmPackagesFilters };\nexport type { NpmPackagesFiltersProps };\n","import { Box, Flex, Icon, Tooltip, Typography, Divider, Button } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport {\n useTracking,\n pxToRem,\n AppInfoContextValue,\n useNotification,\n useClipboard,\n} from '@strapi/helper-plugin';\nimport { CheckCircle, ExternalLink, Download, Github, Star, Check, Duplicate } from '@strapi/icons';\nimport pluralize from 'pluralize';\nimport { useIntl } from 'react-intl';\nimport * as semver from 'semver';\nimport styled from 'styled-components';\n\nimport StrapiLogo from '../../../assets/images/logo-strapi-2022.svg';\n\nimport type { Plugin, Provider } from '../hooks/useMarketplaceData';\nimport type { NpmPackageType } from '../MarketplacePage';\n\n// Custom component to have an ellipsis after the 2nd line\nconst EllipsisText = styled(Typography)`\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n overflow: hidden;\n`;\n\ninterface NpmPackageCardProps extends Pick<AppInfoContextValue, 'useYarn'> {\n npmPackage: Plugin | Provider;\n isInstalled: boolean;\n isInDevelopmentMode: AppInfoContextValue['autoReload'];\n npmPackageType: NpmPackageType;\n strapiAppVersion: AppInfoContextValue['strapiVersion'];\n}\n\nconst NpmPackageCard = ({\n npmPackage,\n isInstalled,\n useYarn,\n isInDevelopmentMode,\n npmPackageType,\n strapiAppVersion,\n}: NpmPackageCardProps) => {\n const { attributes } = npmPackage;\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const commandToCopy = useYarn\n ? `yarn add ${attributes.npmPackageName}`\n : `npm install ${attributes.npmPackageName}`;\n\n const madeByStrapiMessage = formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.tooltip.madeByStrapi',\n defaultMessage: 'Made by Strapi',\n });\n\n const npmPackageHref = `https://market.strapi.io/${pluralize.plural(npmPackageType)}/${\n attributes.slug\n }`;\n\n return (\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n paddingTop={4}\n paddingRight={4}\n paddingBottom={4}\n paddingLeft={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n alignItems=\"normal\"\n data-testid=\"npm-package-card\"\n >\n <Box>\n <Flex direction=\"row\" justifyContent=\"space-between\" alignItems=\"flex-start\">\n <Box\n as=\"img\"\n src={attributes.logo.url}\n alt={`${attributes.name} logo`}\n hasRadius\n width={11}\n height={11}\n />\n <PackageStats\n githubStars={attributes.githubStars}\n npmDownloads={attributes.npmDownloads}\n npmPackageType={npmPackageType}\n />\n </Flex>\n <Box paddingTop={4}>\n <Typography as=\"h3\" variant=\"delta\">\n <Flex alignItems=\"center\">\n {attributes.name}\n {attributes.validated && !attributes.madeByStrapi && (\n <Tooltip\n description={formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.tooltip.verified',\n defaultMessage: 'Plugin verified by Strapi',\n })}\n >\n <Flex>\n <Icon as={CheckCircle} marginLeft={2} color=\"success600\" />\n </Flex>\n </Tooltip>\n )}\n {attributes.madeByStrapi && (\n <Tooltip description={madeByStrapiMessage}>\n <Flex>\n <Box\n as=\"img\"\n src={StrapiLogo}\n alt={madeByStrapiMessage}\n marginLeft={1}\n width={6}\n height=\"auto\"\n />\n </Flex>\n </Tooltip>\n )}\n </Flex>\n </Typography>\n </Box>\n <Box paddingTop={2}>\n <EllipsisText as=\"p\" variant=\"omega\" textColor=\"neutral600\">\n {attributes.description}\n </EllipsisText>\n </Box>\n </Box>\n\n <Flex gap={2} style={{ alignSelf: 'flex-end' }} paddingTop={6}>\n <LinkButton\n size=\"S\"\n href={npmPackageHref}\n isExternal\n endIcon={<ExternalLink />}\n aria-label={formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.info.label',\n defaultMessage: 'Learn more about {pluginName}',\n },\n { pluginName: attributes.name }\n )}\n variant=\"tertiary\"\n onClick={() => trackUsage('didPluginLearnMore')}\n >\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.info.text',\n defaultMessage: 'More',\n })}\n </LinkButton>\n <InstallPluginButton\n isInstalled={isInstalled}\n isInDevelopmentMode={isInDevelopmentMode}\n commandToCopy={commandToCopy}\n strapiAppVersion={strapiAppVersion}\n strapiPeerDepVersion={attributes.strapiVersion}\n pluginName={attributes.name}\n />\n </Flex>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * InstallPluginButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface InstallPluginButtonProps\n extends Pick<NpmPackageCardProps, 'isInstalled' | 'isInDevelopmentMode' | 'strapiAppVersion'> {\n commandToCopy: string;\n pluginName: string;\n strapiPeerDepVersion?: string;\n}\n\nconst InstallPluginButton = ({\n isInstalled,\n isInDevelopmentMode,\n commandToCopy,\n strapiAppVersion,\n strapiPeerDepVersion,\n pluginName,\n}: InstallPluginButtonProps) => {\n const toggleNotification = useNotification();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { copy } = useClipboard();\n\n const handleCopy = async () => {\n const didCopy = await copy(commandToCopy);\n\n if (didCopy) {\n trackUsage('willInstallPlugin');\n toggleNotification({\n type: 'success',\n message: { id: 'admin.pages.MarketPlacePage.plugin.copy.success' },\n });\n }\n };\n\n // Already installed\n if (isInstalled) {\n return (\n <Box paddingLeft={4}>\n <Icon as={Check} marginRight={2} width={12} height={12} color=\"success600\" />\n <Typography variant=\"omega\" textColor=\"success600\" fontWeight=\"bold\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.installed',\n defaultMessage: 'Installed',\n })}\n </Typography>\n </Box>\n );\n }\n\n // In development, show install button\n if (isInDevelopmentMode) {\n return (\n <CardButton\n strapiAppVersion={strapiAppVersion}\n strapiPeerDepVersion={strapiPeerDepVersion}\n handleCopy={handleCopy}\n pluginName={pluginName}\n />\n );\n }\n\n // Not in development and plugin not installed already. Show nothing\n return null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CardButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CardButtonProps\n extends Pick<NpmPackageCardProps, 'strapiAppVersion'>,\n Pick<InstallPluginButtonProps, 'strapiPeerDepVersion' | 'pluginName'> {\n handleCopy: () => void;\n}\n\nconst CardButton = ({\n strapiPeerDepVersion,\n strapiAppVersion,\n handleCopy,\n pluginName,\n}: CardButtonProps) => {\n const { formatMessage } = useIntl();\n const versionRange = semver.validRange(strapiPeerDepVersion);\n const isCompatible = semver.satisfies(strapiAppVersion ?? '', versionRange ?? '');\n\n const installMessage = formatMessage({\n id: 'admin.pages.MarketPlacePage.plugin.copy',\n defaultMessage: 'Copy install command',\n });\n\n // Only plugins receive a strapiAppVersion\n if (strapiAppVersion) {\n if (!versionRange || !isCompatible) {\n return (\n <Tooltip\n data-testid={`tooltip-${pluginName}`}\n description={\n !versionRange\n ? formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.version.null',\n defaultMessage:\n 'Unable to verify compatibility with your Strapi version: \"{strapiAppVersion}\"',\n },\n { strapiAppVersion }\n )\n : formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.plugin.version',\n defaultMessage:\n 'Update your Strapi version: \"{strapiAppVersion}\" to: \"{versionRange}\"',\n },\n {\n strapiAppVersion,\n versionRange,\n }\n )\n }\n >\n <Button\n size=\"S\"\n startIcon={<Duplicate />}\n variant=\"secondary\"\n onClick={handleCopy}\n disabled={!isCompatible}\n >\n {installMessage}\n </Button>\n </Tooltip>\n );\n }\n }\n\n return (\n <Button size=\"S\" startIcon={<Duplicate />} variant=\"secondary\" onClick={handleCopy}>\n {installMessage}\n </Button>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PackageStats\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PackageStatsProps {\n githubStars?: number;\n npmDownloads?: number;\n npmPackageType: NpmPackageType;\n}\n\nconst PackageStats = ({ githubStars = 0, npmDownloads = 0, npmPackageType }: PackageStatsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Flex gap={1}>\n {!!githubStars && (\n <>\n <Icon as={Github} height={pxToRem(12)} width={pxToRem(12)} aria-hidden />\n <Icon as={Star} height={pxToRem(12)} width={pxToRem(12)} color=\"warning500\" aria-hidden />\n <p\n aria-label={formatMessage(\n {\n id: `admin.pages.MarketPlacePage.${npmPackageType}.githubStars`,\n defaultMessage: `This {package} was starred {starsCount} on GitHub`,\n },\n {\n starsCount: githubStars,\n package: npmPackageType,\n }\n )}\n >\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {githubStars}\n </Typography>\n </p>\n <VerticalDivider unsetMargin={false} />\n </>\n )}\n <Icon as={Download} height={pxToRem(12)} width={pxToRem(12)} aria-hidden />\n <p\n aria-label={formatMessage(\n {\n id: `admin.pages.MarketPlacePage.${npmPackageType}.downloads`,\n defaultMessage: `This {package} has {downloadsCount} weekly downloads`,\n },\n {\n downloadsCount: npmDownloads,\n package: npmPackageType,\n }\n )}\n >\n <Typography variant=\"pi\" textColor=\"neutral800\">\n {npmDownloads}\n </Typography>\n </p>\n </Flex>\n );\n};\n\nconst VerticalDivider = styled(Divider)`\n width: ${pxToRem(12)};\n transform: rotate(90deg);\n`;\n\nexport { NpmPackageCard };\nexport type { NpmPackageCardProps };\n","import {\n Box,\n Flex,\n Grid,\n GridItem,\n GridLayout,\n Icon,\n Loader,\n Typography,\n} from '@strapi/design-system';\nimport { AnErrorOccurred, AppInfoContextValue } from '@strapi/helper-plugin';\nimport { EmptyDocuments } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { NpmPackageCard, NpmPackageCardProps } from './NpmPackageCard';\n\nimport type { Plugin, Provider } from '../hooks/useMarketplaceData';\n\ninterface NpmPackagesGridProps extends Pick<NpmPackageCardProps, 'npmPackageType' | 'useYarn'> {\n debouncedSearch: string;\n installedPackageNames: string[];\n isInDevelopmentMode: AppInfoContextValue['autoReload'];\n npmPackages?: Array<Plugin | Provider>;\n status: 'idle' | 'loading' | 'error' | 'success';\n strapiAppVersion?: NpmPackageCardProps['strapiAppVersion'];\n}\n\nconst NpmPackagesGrid = ({\n status,\n npmPackages = [],\n installedPackageNames = [],\n useYarn,\n isInDevelopmentMode,\n npmPackageType,\n strapiAppVersion,\n debouncedSearch,\n}: NpmPackagesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (status === 'error') {\n return (\n <Flex paddingTop={8}>\n <AnErrorOccurred />\n </Flex>\n );\n }\n\n if (status === 'loading') {\n return (\n <Flex justifyContent=\"center\" paddingTop={8}>\n <Loader>Loading content...</Loader>\n </Flex>\n );\n }\n\n const emptySearchMessage = formatMessage(\n {\n id: 'admin.pages.MarketPlacePage.search.empty',\n defaultMessage: 'No result for \"{target}\"',\n },\n { target: debouncedSearch }\n );\n\n if (npmPackages.length === 0) {\n return (\n <Box position=\"relative\">\n <GridLayout>\n {Array(12)\n .fill(null)\n .map((_, idx) => (\n <EmptyPluginCard key={idx} height=\"234px\" hasRadius />\n ))}\n </GridLayout>\n <Box position=\"absolute\" top={11} width=\"100%\">\n <Flex alignItems=\"center\" justifyContent=\"center\" direction=\"column\">\n <Icon as={EmptyDocuments} color={undefined} width=\"160px\" height=\"88px\" />\n <Box paddingTop={6}>\n <Typography variant=\"delta\" as=\"p\" textColor=\"neutral600\">\n {emptySearchMessage}\n </Typography>\n </Box>\n </Flex>\n </Box>\n </Box>\n );\n }\n\n return (\n <Grid gap={4}>\n {npmPackages.map((npmPackage) => (\n <GridItem col={4} s={6} xs={12} style={{ height: '100%' }} key={npmPackage.id}>\n <NpmPackageCard\n npmPackage={npmPackage}\n isInstalled={installedPackageNames.includes(npmPackage.attributes.npmPackageName)}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType={npmPackageType}\n strapiAppVersion={strapiAppVersion}\n />\n </GridItem>\n ))}\n </Grid>\n );\n};\n\nconst EmptyPluginCard = styled(Box)`\n background: ${({ theme }) =>\n `linear-gradient(180deg, rgba(234, 234, 239, 0) 0%, ${theme.colors.neutral150} 100%)`};\n opacity: 0.33;\n`;\n\nexport { NpmPackagesGrid };\n","import { HeaderLayout } from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport { useTracking } from '@strapi/helper-plugin';\nimport { Upload } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport type { NpmPackageType } from '../MarketplacePage';\n\ninterface PageHeaderProps {\n isOnline?: boolean;\n npmPackageType?: NpmPackageType;\n}\n\nconst PageHeader = ({ isOnline, npmPackageType = 'plugin' }: PageHeaderProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n\n const tracking = npmPackageType === 'provider' ? 'didSubmitProvider' : 'didSubmitPlugin';\n\n return (\n <HeaderLayout\n title={formatMessage({\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n })}\n subtitle={formatMessage({\n id: 'admin.pages.MarketPlacePage.subtitle',\n defaultMessage: 'Get more out of Strapi',\n })}\n primaryAction={\n isOnline && (\n <LinkButton\n startIcon={<Upload />}\n variant=\"tertiary\"\n href={`https://market.strapi.io/submit-${npmPackageType}`}\n onClick={() => trackUsage(tracking)}\n isExternal\n >\n {formatMessage({\n id: `admin.pages.MarketPlacePage.submit.${npmPackageType}.link`,\n defaultMessage: `Submit ${npmPackageType}`,\n })}\n </LinkButton>\n )\n }\n />\n );\n};\n\nexport { PageHeader };\nexport type { PageHeaderProps };\n","import { Box, Flex, Layout, Main, Typography } from '@strapi/design-system';\nimport { pxToRem } from '@strapi/helper-plugin';\nimport { useIntl } from 'react-intl';\n\nimport { PageHeader } from './PageHeader';\n\nconst OfflineLayout = () => {\n const { formatMessage } = useIntl();\n\n return (\n <Layout>\n <Main>\n <PageHeader />\n <Flex\n width=\"100%\"\n direction=\"column\"\n alignItems=\"center\"\n justifyContent=\"center\"\n paddingTop={pxToRem(120)}\n >\n <Box paddingBottom={2}>\n <Typography textColor=\"neutral700\" variant=\"alpha\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.offline.title',\n defaultMessage: 'You are offline',\n })}\n </Typography>\n </Box>\n <Box paddingBottom={6}>\n <Typography textColor=\"neutral700\" variant=\"epsilon\">\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.offline.subtitle',\n defaultMessage: 'You need to be connected to the Internet to access Strapi Market.',\n })}\n </Typography>\n </Box>\n <svg\n width=\"88\"\n height=\"88\"\n viewBox=\"0 0 88 88\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <rect x=\".5\" y=\".5\" width=\"87\" height=\"87\" rx=\"43.5\" fill=\"#F0F0FF\" />\n <path\n d=\"M34 39.3h-4c-2.6 0-4.7 1-6.6 2.8a9 9 0 0 0-2.7 6.6 9 9 0 0 0 2.7 6.6A9 9 0 0 0 30 58h22.8L34 39.3Zm-11-11 3-3 39 39-3 3-4.7-4.6H30a13.8 13.8 0 0 1-14-14c0-3.8 1.3-7 4-9.7 2.6-2.7 5.7-4.2 9.5-4.3L23 28.2Zm38.2 11.1c3 .2 5.5 1.5 7.6 3.7A11 11 0 0 1 72 51c0 4-1.6 7.2-5 9.5l-3.3-3.4a6.5 6.5 0 0 0 3.6-6.1c0-1.9-.7-3.5-2-5-1.5-1.3-3.1-2-5-2h-3.5v-1.2c0-3.6-1.2-6.6-3.7-9a13 13 0 0 0-15-2.3L34.6 28a17 17 0 0 1 20.3 1.5c3.5 2.7 5.5 6 6.3 10Z\"\n fill=\"#4945FF\"\n />\n <rect x=\".5\" y=\".5\" width=\"87\" height=\"87\" rx=\"43.5\" stroke=\"#D9D8FF\" />\n </svg>\n </Flex>\n </Main>\n </Layout>\n );\n};\n\nexport { OfflineLayout };\n","import { Box, SingleSelectOption, SingleSelect } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nconst SORT_TYPES = {\n 'name:asc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.alphabetical.selected',\n defaultMessage: 'Sort by alphabetical order',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.alphabetical',\n defaultMessage: 'Alphabetical order',\n },\n },\n 'submissionDate:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.newest.selected',\n defaultMessage: 'Sort by newest',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.newest',\n defaultMessage: 'Newest',\n },\n },\n 'githubStars:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.githubStars.selected',\n defaultMessage: 'Sort by GitHub stars',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.githubStars',\n defaultMessage: 'Number of GitHub stars',\n },\n },\n 'npmDownloads:desc': {\n selected: {\n id: 'admin.pages.MarketPlacePage.sort.npmDownloads.selected',\n defaultMessage: 'Sort by npm downloads',\n },\n option: {\n id: 'admin.pages.MarketPlacePage.sort.npmDownloads',\n defaultMessage: 'Number of downloads',\n },\n },\n} as const;\n\ninterface SortSelectProps {\n sortQuery: keyof typeof SORT_TYPES;\n handleSelectChange: (payload: { sort: string }) => void;\n}\n\nconst SortSelect = ({ sortQuery, handleSelectChange }: SortSelectProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <SelectWrapper>\n <SingleSelect\n size=\"S\"\n id=\"sort-by-select\"\n value={sortQuery}\n customizeContent={() => formatMessage(SORT_TYPES[sortQuery].selected)}\n onChange={(sortName) => {\n // @ts-expect-error – in V2 design-system we'll only ever return strings.\n handleSelectChange({ sort: sortName });\n }}\n label={formatMessage({\n id: 'admin.pages.MarketPlacePage.sort.label',\n defaultMessage: 'Sort by',\n })}\n >\n {Object.entries(SORT_TYPES).map(([sortName, messages]) => {\n return (\n <SingleSelectOption key={sortName} value={sortName}>\n {formatMessage(messages.option)}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </SelectWrapper>\n );\n};\n\nconst SelectWrapper = styled(Box)`\n font-weight: ${({ theme }) => theme.fontWeights.semiBold};\n\n span {\n font-size: ${({ theme }) => theme.fontSizes[1]};\n }\n\n /* Hide the label, every input needs a label. */\n label {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n width: 1px;\n }\n`;\n\nexport { SortSelect };\nexport type { SortSelectProps };\n","import { useNotifyAT } from '@strapi/design-system';\nimport { useNotification } from '@strapi/helper-plugin';\nimport * as qs from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport type { MarketplacePageQuery, NpmPackageType, TabQuery } from '../MarketplacePage';\n\nconst MARKETPLACE_API_URL = 'https://market-api.strapi.io';\n\ninterface UseMarketplaceDataParams {\n npmPackageType: NpmPackageType;\n debouncedSearch: string;\n query?: MarketplacePageQuery;\n tabQuery: TabQuery;\n}\n\ntype Collections =\n | 'Verified'\n | 'Made by the community'\n | 'Made by Strapi'\n | 'Made by official partners';\n\ntype Categories = 'Custom fields' | 'Deployment' | 'Monitoring';\n\ntype FilterTypes = 'categories' | 'collections';\n\ninterface Plugin {\n id: string;\n attributes: {\n name: string;\n description: string;\n slug: string;\n npmPackageName: string;\n npmPackageUrl: string;\n npmDownloads: number;\n repositoryUrl: string;\n githubStars: number;\n logo: {\n url: string;\n };\n developerName: string;\n validated: boolean;\n madeByStrapi: boolean;\n strapiCompatibility: string;\n submissionDate: string;\n collections: Collections[];\n categories: Categories[];\n strapiVersion: string;\n screenshots: Array<{\n url: string;\n }>;\n };\n}\n\ninterface Provider {\n id: string;\n attributes: {\n name: string;\n description: string;\n slug: string;\n npmPackageName: string;\n npmPackageUrl: string;\n npmDownloads: number;\n repositoryUrl: string;\n githubStars: number;\n pluginName: string;\n logo: {\n url: string;\n };\n developerName: string;\n validated: boolean;\n madeByStrapi: boolean;\n strapiCompatibility: string;\n strapiVersion?: never;\n submissionDate: string;\n collections: Collections[];\n };\n}\n\ninterface MarketplaceMeta {\n collections: Record<Collections, number>;\n pagination: {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n };\n}\n\ninterface MarketplaceResponse<TData extends Plugin | Provider> {\n data: TData[];\n meta: TData extends Provider\n ? MarketplaceMeta\n : MarketplaceMeta & { categories: Record<Categories, number> };\n}\n\nfunction useMarketplaceData({\n npmPackageType,\n debouncedSearch,\n query,\n tabQuery,\n}: UseMarketplaceDataParams) {\n const { notifyStatus } = useNotifyAT();\n const { formatMessage } = useIntl();\n const toggleNotification = useNotification();\n const marketplaceTitle = formatMessage({\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n });\n\n const notifyMarketplaceLoad = () => {\n notifyStatus(\n formatMessage(\n {\n id: 'app.utils.notify.data-loaded',\n defaultMessage: 'The {target} has loaded',\n },\n { target: marketplaceTitle }\n )\n );\n };\n\n const paginationParams = {\n page: query?.page || 1,\n pageSize: query?.pageSize || 24,\n };\n\n const pluginParams = {\n ...tabQuery.plugin,\n pagination: paginationParams,\n search: debouncedSearch,\n };\n\n const { data: pluginsResponse, status: pluginsStatus } = useQuery(\n ['marketplace', 'plugins', pluginParams],\n async () => {\n try {\n const queryString = qs.stringify(pluginParams);\n const res = await fetch(`${MARKETPLACE_API_URL}/plugins?${queryString}`);\n\n if (!res.ok) {\n throw new Error('Failed to fetch marketplace plugins.');\n }\n\n const data = (await res.json()) as MarketplaceResponse<Plugin>;\n\n return data;\n } catch (error) {\n // silence\n }\n\n return null;\n },\n {\n onSuccess() {\n notifyMarketplaceLoad();\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const providerParams = {\n ...tabQuery.provider,\n pagination: paginationParams,\n search: debouncedSearch,\n };\n\n const { data: providersResponse, status: providersStatus } = useQuery(\n ['marketplace', 'providers', providerParams],\n async () => {\n const queryString = qs.stringify(providerParams);\n const res = await fetch(`${MARKETPLACE_API_URL}/providers?${queryString}`);\n\n if (!res.ok) {\n throw new Error('Failed to fetch marketplace providers.');\n }\n\n const data = (await res.json()) as MarketplaceResponse<Provider>;\n\n return data;\n },\n {\n onSuccess() {\n notifyMarketplaceLoad();\n },\n onError() {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error', defaultMessage: 'An error occured' },\n });\n },\n }\n );\n\n const npmPackageTypeResponse = npmPackageType === 'plugin' ? pluginsResponse : providersResponse;\n\n const possibleCollections = npmPackageTypeResponse?.meta.collections ?? {};\n const possibleCategories = pluginsResponse?.meta.categories ?? {};\n\n const { pagination } = npmPackageTypeResponse?.meta ?? {};\n\n return {\n pluginsResponse,\n providersResponse,\n pluginsStatus,\n providersStatus,\n possibleCollections,\n possibleCategories,\n pagination,\n };\n}\n\nexport { useMarketplaceData };\nexport type {\n MarketplaceResponse,\n Plugin,\n Provider,\n MarketplaceMeta,\n Collections,\n Categories,\n FilterTypes,\n UseMarketplaceDataParams,\n};\n","import * as React from 'react';\n\n/**\n * For more details about this hook see:\n * https://www.30secondsofcode.org/react/s/use-navigator-on-line\n */\nexport const useNavigatorOnline = (): boolean => {\n const onlineStatus =\n typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean'\n ? navigator.onLine\n : true;\n\n const [isOnline, setIsOnline] = React.useState(onlineStatus);\n\n const setOnline = () => setIsOnline(true);\n const setOffline = () => setIsOnline(false);\n\n React.useEffect(() => {\n window.addEventListener('online', setOnline);\n window.addEventListener('offline', setOffline);\n\n return () => {\n window.removeEventListener('online', setOnline);\n window.removeEventListener('offline', setOffline);\n };\n }, []);\n\n return isOnline;\n};\n","import * as React from 'react';\n\nimport {\n Box,\n ContentLayout,\n Flex,\n Icon,\n Layout,\n Main,\n Searchbar,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n ContentBox,\n PageSizeURLQuery,\n PaginationURLQuery,\n useAppInfo,\n useFocusWhenNavigate,\n useNotification,\n useQueryParams,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { ExternalLink, GlassesSquare } from '@strapi/icons';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useDebounce } from '../../hooks/useDebounce';\nimport { selectAdminPermissions } from '../../selectors';\n\nimport { NpmPackagesFilters } from './components/NpmPackagesFilters';\nimport { NpmPackagesGrid } from './components/NpmPackagesGrid';\nimport { OfflineLayout } from './components/OfflineLayout';\nimport { PageHeader } from './components/PageHeader';\nimport { SortSelect, SortSelectProps } from './components/SortSelect';\nimport { FilterTypes, useMarketplaceData } from './hooks/useMarketplaceData';\nimport { useNavigatorOnline } from './hooks/useNavigatorOnline';\n\ntype NpmPackageType = 'plugin' | 'provider';\n\ninterface MarketplacePageQuery {\n collections?: string[];\n categories?: string[];\n npmPackageType?: NpmPackageType;\n page?: number;\n pageSize?: number;\n search?: string;\n sort?: SortSelectProps['sortQuery'];\n}\n\ninterface TabQuery {\n plugin: MarketplacePageQuery;\n provider: MarketplacePageQuery;\n}\n\nconst MarketplacePage = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const toggleNotification = useNotification();\n const [{ query }, setQuery] = useQueryParams<MarketplacePageQuery>();\n const debouncedSearch = useDebounce(query?.search, 500) || '';\n\n const { autoReload: isInDevelopmentMode, dependencies, useYarn, strapiVersion } = useAppInfo();\n const isOnline = useNavigatorOnline();\n\n const npmPackageType = query?.npmPackageType || 'plugin';\n\n const [tabQuery, setTabQuery] = React.useState<TabQuery>({\n plugin: npmPackageType === 'plugin' ? { ...query } : {},\n provider: npmPackageType === 'provider' ? { ...query } : {},\n });\n\n useFocusWhenNavigate();\n\n React.useEffect(() => {\n trackUsage('didGoToMarketplace');\n }, [trackUsage]);\n\n React.useEffect(() => {\n if (!isInDevelopmentMode) {\n toggleNotification({\n type: 'info',\n message: {\n id: 'admin.pages.MarketPlacePage.production',\n defaultMessage: 'Manage plugins from the development environment',\n },\n });\n }\n }, [toggleNotification, isInDevelopmentMode]);\n\n const {\n pluginsResponse,\n providersResponse,\n pluginsStatus,\n providersStatus,\n possibleCollections,\n possibleCategories,\n pagination,\n } = useMarketplaceData({ npmPackageType, debouncedSearch, query, tabQuery });\n\n if (!isOnline) {\n return <OfflineLayout />;\n }\n\n const handleTabChange = (selected: number) => {\n const selectedTab = selected === 0 ? 'plugin' : 'provider';\n const hasTabQuery = tabQuery[selectedTab] && Object.keys(tabQuery[selectedTab]).length;\n\n if (hasTabQuery) {\n setQuery({\n // Keep filters and search\n ...tabQuery[selectedTab],\n search: query?.search || '',\n // Set tab and reset page\n npmPackageType: selectedTab,\n page: 1,\n });\n } else {\n setQuery({\n // Set tab\n npmPackageType: selectedTab,\n // Clear filters\n collections: [],\n categories: [],\n sort: 'name:asc',\n page: 1,\n // Keep search\n search: query?.search || '',\n });\n }\n };\n\n const handleSelectChange = (update: Partial<MarketplacePageQuery>) => {\n setQuery({ ...update, page: 1 });\n setTabQuery((prev) => ({\n ...prev,\n [npmPackageType]: { ...prev[npmPackageType], ...update },\n }));\n };\n\n const handleSelectClear = (filterType: FilterTypes) => {\n setQuery({ [filterType]: [], page: undefined }, 'remove');\n setTabQuery((prev) => ({ ...prev, [npmPackageType]: {} }));\n };\n\n const handleSortSelectChange: SortSelectProps['handleSelectChange'] = ({ sort }) =>\n // @ts-expect-error - this is a narrowing issue.\n handleSelectChange({ sort });\n\n // Check if plugins and providers are installed already\n const installedPackageNames = Object.keys(dependencies ?? {});\n\n return (\n <Layout>\n <Main>\n <Helmet\n title={formatMessage({\n id: 'admin.pages.MarketPlacePage.helmet',\n defaultMessage: 'Marketplace - Plugins',\n })}\n />\n <PageHeader isOnline={isOnline} npmPackageType={npmPackageType} />\n <ContentLayout>\n <TabGroup\n label={formatMessage({\n id: 'admin.pages.MarketPlacePage.tab-group.label',\n defaultMessage: 'Plugins and Providers for Strapi',\n })}\n id=\"tabs\"\n variant=\"simple\"\n initialSelectedTabIndex={['plugin', 'provider'].indexOf(npmPackageType)}\n onTabChange={handleTabChange}\n >\n <Flex justifyContent=\"space-between\" paddingBottom={4}>\n <Tabs>\n <Tab>\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.plugins',\n defaultMessage: 'Plugins',\n })}{' '}\n {pluginsResponse ? `(${pluginsResponse.meta.pagination.total})` : '...'}\n </Tab>\n <Tab>\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.providers',\n defaultMessage: 'Providers',\n })}{' '}\n {providersResponse ? `(${providersResponse.meta.pagination.total})` : '...'}\n </Tab>\n </Tabs>\n <Box width=\"25%\">\n <Searchbar\n name=\"searchbar\"\n onClear={() => setQuery({ search: '', page: 1 })}\n value={query?.search}\n onChange={(e) => setQuery({ search: e.target.value, page: 1 })}\n clearLabel={formatMessage({\n id: 'admin.pages.MarketPlacePage.search.clear',\n defaultMessage: 'Clear the search',\n })}\n placeholder={formatMessage({\n id: 'admin.pages.MarketPlacePage.search.placeholder',\n defaultMessage: 'Search',\n })}\n >\n {formatMessage({\n id: 'admin.pages.MarketPlacePage.search.placeholder',\n defaultMessage: 'Search',\n })}\n </Searchbar>\n </Box>\n </Flex>\n <Flex paddingBottom={4} gap={2}>\n <SortSelect\n sortQuery={query?.sort || 'name:asc'}\n handleSelectChange={handleSortSelectChange}\n />\n <NpmPackagesFilters\n npmPackageType={npmPackageType}\n possibleCollections={possibleCollections}\n possibleCategories={possibleCategories}\n query={query || {}}\n handleSelectChange={handleSelectChange}\n handleSelectClear={handleSelectClear}\n />\n </Flex>\n\n <TabPanels>\n {/* Plugins panel */}\n <TabPanel>\n <NpmPackagesGrid\n npmPackages={pluginsResponse?.data}\n status={pluginsStatus}\n installedPackageNames={installedPackageNames}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType=\"plugin\"\n strapiAppVersion={strapiVersion}\n debouncedSearch={debouncedSearch}\n />\n </TabPanel>\n {/* Providers panel */}\n <TabPanel>\n <NpmPackagesGrid\n npmPackages={providersResponse?.data}\n status={providersStatus}\n installedPackageNames={installedPackageNames}\n useYarn={useYarn}\n isInDevelopmentMode={isInDevelopmentMode}\n npmPackageType=\"provider\"\n debouncedSearch={debouncedSearch}\n />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n {pagination ? (\n <Box paddingTop={4}>\n <Flex alignItems=\"flex-end\" justifyContent=\"space-between\">\n <PageSizeURLQuery options={['12', '24', '50', '100']} defaultValue=\"24\" />\n <PaginationURLQuery pagination={pagination} />\n </Flex>\n </Box>\n ) : null}\n <Box paddingTop={8}>\n <a\n href=\"https://strapi.canny.io/plugin-requests\"\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n style={{ textDecoration: 'none' }}\n onClick={() => trackUsage('didMissMarketplacePlugin')}\n >\n <ContentBox\n title={formatMessage({\n id: 'admin.pages.MarketPlacePage.missingPlugin.title',\n defaultMessage: 'Documentation',\n })}\n subtitle={formatMessage({\n id: 'admin.pages.MarketPlacePage.missingPlugin.description',\n defaultMessage:\n \"Tell us what plugin you are looking for and we'll let our community plugin developers know in case they are in search for inspiration!\",\n })}\n icon={<GlassesSquare />}\n iconBackground=\"alternative100\"\n endAction={\n <Icon as={ExternalLink} color=\"neutral600\" width={3} height={3} marginLeft={2} />\n }\n />\n </a>\n </Box>\n </ContentLayout>\n </Main>\n </Layout>\n );\n};\n\nconst ProtectedMarketplacePage = () => {\n const permissions = useSelector(selectAdminPermissions);\n\n return (\n // @ts-expect-error – the selector is not typed.\n <CheckPagePermissions permissions={permissions.marketplace.main}>\n <MarketplacePage />\n </CheckPagePermissions>\n );\n};\n\nexport { MarketplacePage, ProtectedMarketplacePage };\nexport type { NpmPackageType, MarketplacePageQuery, TabQuery };\n"],"names":["React","useIntl","jsxs","Fragment","Box","jsx","Filter","Popover","Tag","Cross","styled","Button","Flex","MultiSelect","MultiSelectOption","Typography","useTracking","pluralize","Tooltip","Icon","CheckCircle","StrapiLogo","LinkButton","ExternalLink","useNotification","useClipboard","Check","semver","Duplicate","Github","pxToRem","Star","Download","Divider","AnErrorOccurred","Loader","GridLayout","EmptyDocuments","Grid","GridItem","HeaderLayout","Upload","Layout","Main","SingleSelect","SingleSelectOption","useNotifyAT","useQuery","qs","useQueryParams","useDebounce","useAppInfo","useFocusWhenNavigate","Helmet","ContentLayout","TabGroup","Tabs","Tab","Searchbar","TabPanels","TabPanel","PageSizeURLQuery","PaginationURLQuery","ContentBox","GlassesSquare","useSelector","selectAdminPermissions","CheckPagePermissions"],"mappings":"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"}
|
|
@@ -7,12 +7,12 @@ import { Helmet } from "react-helmet";
|
|
|
7
7
|
import { useIntl } from "react-intl";
|
|
8
8
|
import { useSelector } from "react-redux";
|
|
9
9
|
import { u as useDebounce } from "./useDebounce-9364f340.mjs";
|
|
10
|
-
import { s as selectAdminPermissions } from "./AuthenticatedApp-
|
|
10
|
+
import { s as selectAdminPermissions } from "./AuthenticatedApp-2b5530b9.mjs";
|
|
11
11
|
import styled from "styled-components";
|
|
12
12
|
import { LinkButton } from "@strapi/design-system/v2";
|
|
13
13
|
import pluralize from "pluralize";
|
|
14
14
|
import * as semver from "semver";
|
|
15
|
-
import { K as StrapiLogo } from "./index-
|
|
15
|
+
import { K as StrapiLogo } from "./index-9f08bcc3.mjs";
|
|
16
16
|
import * as qs from "qs";
|
|
17
17
|
import { useQuery } from "react-query";
|
|
18
18
|
import "semver/functions/lt";
|
|
@@ -1008,4 +1008,4 @@ export {
|
|
|
1008
1008
|
MarketplacePage,
|
|
1009
1009
|
ProtectedMarketplacePage
|
|
1010
1010
|
};
|
|
1011
|
-
//# sourceMappingURL=MarketplacePage-
|
|
1011
|
+
//# sourceMappingURL=MarketplacePage-b1679fa5.mjs.map
|