@strapi/admin 4.1.7 → 4.1.10-beta.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.
Files changed (397) hide show
  1. package/admin/src/assets/images/icon_offline-cloud.svg +5 -0
  2. package/admin/src/components/ConfigurationsProvider/index.js +51 -0
  3. package/admin/src/components/ConfigurationsProvider/reducer.js +28 -0
  4. package/admin/src/components/LeftMenu/index.js +4 -2
  5. package/admin/src/components/Providers/index.js +8 -4
  6. package/admin/src/components/UnauthenticatedLogo/index.js +4 -2
  7. package/admin/src/content-manager/components/DynamicTable/CellContent/utils/hasContent.js +4 -0
  8. package/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +5 -5
  9. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/schema.js +12 -12
  10. package/admin/src/content-manager/components/FieldComponent/index.js +0 -1
  11. package/admin/src/content-manager/components/Inputs/index.js +4 -4
  12. package/admin/src/content-manager/components/RepeatableComponent/index.js +2 -14
  13. package/admin/src/content-manager/components/RepeatableComponent/utils/getComponentErrorKeys.js +10 -0
  14. package/admin/src/content-manager/pages/EditSettingsView/index.js +1 -1
  15. package/admin/src/hooks/useNavigatorOnLine/index.js +31 -0
  16. package/admin/src/pages/App/index.js +7 -2
  17. package/admin/src/pages/MarketplacePage/components/MissingPluginBanner/index.js +40 -0
  18. package/admin/src/pages/MarketplacePage/components/PageHeader/index.js +46 -0
  19. package/admin/src/pages/MarketplacePage/index.js +48 -26
  20. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/Form/index.js +85 -0
  21. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/Form/init.js +13 -0
  22. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/Form/reducer.js +43 -0
  23. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js +116 -0
  24. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/reducer.js +28 -0
  25. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/stepper.js +25 -0
  26. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js +67 -0
  27. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js +176 -0
  28. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromUrlForm.js +82 -0
  29. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/ImageCardAsset.js +51 -0
  30. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js +97 -0
  31. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js +85 -0
  32. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/reducer.js +28 -0
  33. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/index.js +149 -87
  34. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/api.js +16 -0
  35. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/constants.js +3 -0
  36. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/getFormData.js +17 -0
  37. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js +76 -0
  38. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/prefixAllUrls.js +17 -0
  39. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/urlToFile.js +21 -0
  40. package/admin/src/translations/de.json +244 -23
  41. package/admin/src/translations/en.json +29 -0
  42. package/build/1856.521a99fd.chunk.js +172 -0
  43. package/build/2481.7ba28142.chunk.js +184 -0
  44. package/build/2758.927ecb6d.chunk.js +162 -0
  45. package/build/2912.79c2b3c8.chunk.js +253 -0
  46. package/build/372.3720845e.chunk.js +899 -0
  47. package/build/4715.77e04177.chunk.js +385 -0
  48. package/build/4800.d3ebc81d.chunk.js +1 -0
  49. package/build/497.fbd75558.chunk.js +284 -0
  50. package/build/4982.f53b78a4.chunk.js +308 -0
  51. package/build/5289.0341db2d.chunk.js +336 -0
  52. package/build/6404.80bf5858.chunk.js +506 -0
  53. package/build/6925.fafef528.chunk.js +761 -0
  54. package/build/7197.959bbe97.chunk.js +113 -0
  55. package/build/7589.f3b26345.chunk.js +194 -0
  56. package/build/7841.f0e7d629.chunk.js +253 -0
  57. package/build/8469.3af1823d.chunk.js +1 -0
  58. package/build/9115.318a6841.chunk.js +1 -0
  59. package/build/9298.f97fcef0.chunk.js +334 -0
  60. package/build/948.d64fb515.chunk.js +2 -0
  61. package/build/9853.d96fbc67.chunk.js +356 -0
  62. package/build/Admin-authenticatedApp.d8767873.chunk.js +80 -0
  63. package/build/Admin_homePage.50b6c129.chunk.js +71 -0
  64. package/build/Admin_marketplace.514ace37.chunk.js +11 -0
  65. package/build/Admin_pluginsPage.e895d79f.chunk.js +1 -0
  66. package/build/Admin_profilePage.33cfed9b.chunk.js +15 -0
  67. package/build/Admin_settingsPage.0d94a598.chunk.js +180 -0
  68. package/build/a6b842e0b6d2b61135d1.svg +5 -0
  69. package/build/admin-edit-roles-page.06f3d288.chunk.js +1 -0
  70. package/build/admin-edit-users.6a325cca.chunk.js +11 -0
  71. package/build/admin-users.b89adf82.chunk.js +12 -0
  72. package/build/api-tokens-create-page.635e20c8.chunk.js +1 -0
  73. package/build/api-tokens-edit-page.db07253e.chunk.js +1 -0
  74. package/build/api-tokens-list-page.346c2149.chunk.js +15 -0
  75. package/build/ar-json.d4cb26d9.chunk.js +1 -0
  76. package/build/codemirror-addon-closebrackets.c0f97916.chunk.js +2 -0
  77. package/build/codemirror-addon-lint-js.7c35dcb0.chunk.js +1 -0
  78. package/build/codemirror-addon-lint.505ff1d4.chunk.js +1 -0
  79. package/build/codemirror-addon-mark-selection.653e904d.chunk.js +1 -0
  80. package/build/codemirror-css.98490df3.chunk.js +346 -0
  81. package/build/codemirror-javacript.cafbda9c.chunk.js +1 -0
  82. package/build/codemirror-theme.b3c64617.chunk.js +34 -0
  83. package/build/content-manager.78e3f35c.chunk.js +1204 -0
  84. package/build/content-type-builder-translation-ar-json.142327af.chunk.js +1 -0
  85. package/build/content-type-builder-translation-cs-json.4aafb972.chunk.js +1 -0
  86. package/build/content-type-builder-translation-de-json.0d7696b9.chunk.js +1 -0
  87. package/build/{content-type-builder-translation-dk-json.52805572.chunk.js → content-type-builder-translation-dk-json.4729f055.chunk.js} +1 -1
  88. package/build/content-type-builder-translation-en-json.e5110288.chunk.js +1 -0
  89. package/build/{content-type-builder-translation-es-json.5a362abf.chunk.js → content-type-builder-translation-es-json.333cf47f.chunk.js} +1 -1
  90. package/build/content-type-builder-translation-fr-json.aa6eeea8.chunk.js +1 -0
  91. package/build/{content-type-builder-translation-id-json.4a21dfab.chunk.js → content-type-builder-translation-id-json.7c00a32a.chunk.js} +1 -1
  92. package/build/content-type-builder-translation-it-json.a906b389.chunk.js +1 -0
  93. package/build/content-type-builder-translation-ja-json.87f71930.chunk.js +1 -0
  94. package/build/content-type-builder-translation-ko-json.51201b12.chunk.js +1 -0
  95. package/build/{content-type-builder-translation-ms-json.3755f8c8.chunk.js → content-type-builder-translation-ms-json.963a1a01.chunk.js} +1 -1
  96. package/build/{content-type-builder-translation-nl-json.6f8d924b.chunk.js → content-type-builder-translation-nl-json.c46c8f30.chunk.js} +1 -1
  97. package/build/{content-type-builder-translation-pl-json.fc0b0c20.chunk.js → content-type-builder-translation-pl-json.a866acda.chunk.js} +1 -1
  98. package/build/content-type-builder-translation-pt-BR-json.5739a2aa.chunk.js +1 -0
  99. package/build/content-type-builder-translation-pt-json.766bd747.chunk.js +1 -0
  100. package/build/content-type-builder-translation-ru-json.cf8d7c5c.chunk.js +1 -0
  101. package/build/content-type-builder-translation-sk-json.3a6defe0.chunk.js +1 -0
  102. package/build/content-type-builder-translation-th-json.c96a2d3f.chunk.js +1 -0
  103. package/build/content-type-builder-translation-tr-json.2e52bc60.chunk.js +1 -0
  104. package/build/content-type-builder-translation-uk-json.d8c0b6dd.chunk.js +1 -0
  105. package/build/content-type-builder-translation-zh-Hans-json.92a27f59.chunk.js +1 -0
  106. package/build/content-type-builder-translation-zh-json.2cc55621.chunk.js +1 -0
  107. package/build/content-type-builder.0d8729ad.chunk.js +141 -0
  108. package/build/cropper-css.0055cd53.chunk.js +306 -0
  109. package/build/cs-json.c8f28ba8.chunk.js +1 -0
  110. package/build/de-json.0b92acd2.chunk.js +1 -0
  111. package/build/{dk-json.fb9ee45a.chunk.js → dk-json.9f1bc016.chunk.js} +1 -1
  112. package/build/email-settings-page.fcc7e65d.chunk.js +103 -0
  113. package/build/{email-translation-de-json.559a7d5f.chunk.js → email-translation-ar-json.c624512d.chunk.js} +1 -1
  114. package/build/{email-translation-ar-json.95d90eb4.chunk.js → email-translation-cs-json.cb18caab.chunk.js} +1 -1
  115. package/build/{email-translation-it-json.3de61cb6.chunk.js → email-translation-de-json.54743260.chunk.js} +1 -1
  116. package/build/{email-translation-dk-json.f8a595bf.chunk.js → email-translation-dk-json.f323fe4e.chunk.js} +1 -1
  117. package/build/{email-translation-en-json.fa0dc92b.chunk.js → email-translation-en-json.6da7e388.chunk.js} +1 -1
  118. package/build/{email-translation-es-json.eb303dea.chunk.js → email-translation-es-json.9021417d.chunk.js} +1 -1
  119. package/build/{email-translation-fr-json.49c3c888.chunk.js → email-translation-fr-json.9f125db0.chunk.js} +1 -1
  120. package/build/email-translation-id-json.3bcae5f5.chunk.js +1 -0
  121. package/build/{email-translation-cs-json.dfd1f3f2.chunk.js → email-translation-it-json.6ffd1774.chunk.js} +1 -1
  122. package/build/email-translation-ja-json.72b3f73c.chunk.js +1 -0
  123. package/build/email-translation-ko-json.e61d4e7a.chunk.js +1 -0
  124. package/build/email-translation-ms-json.b2b11e05.chunk.js +1 -0
  125. package/build/email-translation-nl-json.5349635f.chunk.js +1 -0
  126. package/build/email-translation-pl-json.6da50d0f.chunk.js +1 -0
  127. package/build/email-translation-pt-BR-json.2c98ab20.chunk.js +1 -0
  128. package/build/email-translation-pt-json.959ea070.chunk.js +1 -0
  129. package/build/email-translation-ru-json.d508cf3e.chunk.js +1 -0
  130. package/build/email-translation-sk-json.fa1fd4b3.chunk.js +1 -0
  131. package/build/email-translation-th-json.989cfecc.chunk.js +1 -0
  132. package/build/email-translation-tr-json.87f2feb3.chunk.js +1 -0
  133. package/build/email-translation-uk-json.0396a803.chunk.js +1 -0
  134. package/build/email-translation-vi-json.c0d8c414.chunk.js +1 -0
  135. package/build/email-translation-zh-Hans-json.b463cb25.chunk.js +1 -0
  136. package/build/email-translation-zh-json.3455468b.chunk.js +1 -0
  137. package/build/en-json.ca572384.chunk.js +1 -0
  138. package/build/{es-json.8f4d89e2.chunk.js → es-json.2a5a9fc1.chunk.js} +1 -1
  139. package/build/fontawesome-css-all.b88d464e.chunk.js +4618 -0
  140. package/build/fontawesome-css.59dc4459.chunk.js +6 -0
  141. package/build/fontawesome-js.252cc5f3.chunk.js +7 -0
  142. package/build/fr-json.84064a0b.chunk.js +1 -0
  143. package/build/he-json.d40da459.chunk.js +1 -0
  144. package/build/highlight.js.9d8ef460.chunk.js +86 -0
  145. package/build/hu-json.c81ce352.chunk.js +1 -0
  146. package/build/i18n-settings-page.477ffac7.chunk.js +101 -0
  147. package/build/{i18n-translation-de-json.96ae1f68.chunk.js → i18n-translation-de-json.92534555.chunk.js} +1 -1
  148. package/build/{i18n-translation-dk-json.ecf02d28.chunk.js → i18n-translation-dk-json.54f410ca.chunk.js} +1 -1
  149. package/build/{i18n-translation-en-json.4d823f62.chunk.js → i18n-translation-en-json.85bc892c.chunk.js} +1 -1
  150. package/build/i18n-translation-es-json.488206ae.chunk.js +1 -0
  151. package/build/i18n-translation-fr-json.0839d68d.chunk.js +1 -0
  152. package/build/i18n-translation-ko-json.d0bc1203.chunk.js +1 -0
  153. package/build/i18n-translation-zh-Hans-json.560a98e3.chunk.js +1 -0
  154. package/build/{id-json.fef679cb.chunk.js → id-json.fad45d17.chunk.js} +1 -1
  155. package/build/index.html +1 -1
  156. package/build/it-json.12df4cdf.chunk.js +1 -0
  157. package/build/ja-json.850237e9.chunk.js +1 -0
  158. package/build/ko-json.2f3d256e.chunk.js +1 -0
  159. package/build/main.06f66609.js +7909 -0
  160. package/build/{ms-json.f46167ef.chunk.js → ms-json.836ed013.chunk.js} +1 -1
  161. package/build/nl-json.465b173f.chunk.js +1 -0
  162. package/build/{no-json.17ecda5d.chunk.js → no-json.e8749dd4.chunk.js} +1 -1
  163. package/build/{pl-json.0db77f2c.chunk.js → pl-json.94f05d2c.chunk.js} +1 -1
  164. package/build/{pt-BR-json.4c90cb2d.chunk.js → pt-BR-json.6301d49b.chunk.js} +1 -1
  165. package/build/pt-json.c23020ab.chunk.js +1 -0
  166. package/build/ru-json.4560906c.chunk.js +1 -0
  167. package/build/runtime~main.dc1c7ef6.js +2 -0
  168. package/build/sk-json.5b33afc2.chunk.js +1 -0
  169. package/build/sso-settings-page.0b4d2106.chunk.js +1 -0
  170. package/build/sv-json.cdcac02d.chunk.js +1 -0
  171. package/build/th-json.3aadaec6.chunk.js +1 -0
  172. package/build/tr-json.276e59fe.chunk.js +1 -0
  173. package/build/uk-json.5b5b9c27.chunk.js +1 -0
  174. package/build/upload-settings.1456cd65.chunk.js +101 -0
  175. package/build/upload-translation-de-json.b642da08.chunk.js +1 -0
  176. package/build/{upload-translation-dk-json.b74134c8.chunk.js → upload-translation-dk-json.fc61df13.chunk.js} +1 -1
  177. package/build/{upload-translation-en-json.c4e56528.chunk.js → upload-translation-en-json.59269508.chunk.js} +1 -1
  178. package/build/{upload-translation-es-json.15a3015f.chunk.js → upload-translation-es-json.8ec935ef.chunk.js} +1 -1
  179. package/build/upload-translation-fr-json.eb9b4f84.chunk.js +1 -0
  180. package/build/upload-translation-he-json.c226f2dc.chunk.js +1 -0
  181. package/build/upload-translation-it-json.8e58456e.chunk.js +1 -0
  182. package/build/upload-translation-ja-json.1378a2e7.chunk.js +1 -0
  183. package/build/upload-translation-ko-json.5e06e112.chunk.js +1 -0
  184. package/build/{upload-translation-ms-json.30974c82.chunk.js → upload-translation-ms-json.dc3bf0d7.chunk.js} +1 -1
  185. package/build/{upload-translation-pl-json.3740abed.chunk.js → upload-translation-pl-json.6071e38c.chunk.js} +1 -1
  186. package/build/upload-translation-pt-BR-json.7e8d9550.chunk.js +1 -0
  187. package/build/upload-translation-ru-json.da2529f3.chunk.js +1 -0
  188. package/build/upload-translation-sk-json.bfdf4f09.chunk.js +1 -0
  189. package/build/upload-translation-th-json.6a48b826.chunk.js +1 -0
  190. package/build/upload-translation-uk-json.6fb09148.chunk.js +1 -0
  191. package/build/upload-translation-zh-Hans-json.c9622577.chunk.js +1 -0
  192. package/build/upload-translation-zh-json.711f804b.chunk.js +1 -0
  193. package/build/upload.d45af2c9.chunk.js +105 -0
  194. package/build/users-advanced-settings-page.5aa21b84.chunk.js +101 -0
  195. package/build/users-email-settings-page.8b561ea3.chunk.js +1 -0
  196. package/build/users-permissions-translation-ar-json.e8123ed2.chunk.js +1 -0
  197. package/build/users-permissions-translation-cs-json.e6649c5f.chunk.js +1 -0
  198. package/build/{users-permissions-translation-de-json.a5c8db9c.chunk.js → users-permissions-translation-de-json.c3628843.chunk.js} +1 -1
  199. package/build/{users-permissions-translation-dk-json.1fe5e07a.chunk.js → users-permissions-translation-dk-json.fe39c74b.chunk.js} +1 -1
  200. package/build/users-permissions-translation-en-json.3fe86528.chunk.js +1 -0
  201. package/build/{users-permissions-translation-es-json.05669296.chunk.js → users-permissions-translation-es-json.1bb9cde2.chunk.js} +1 -1
  202. package/build/users-permissions-translation-fr-json.172aa69f.chunk.js +1 -0
  203. package/build/{users-permissions-translation-id-json.186a3f65.chunk.js → users-permissions-translation-id-json.5aadd143.chunk.js} +1 -1
  204. package/build/users-permissions-translation-it-json.7d377480.chunk.js +1 -0
  205. package/build/users-permissions-translation-ja-json.4967badf.chunk.js +1 -0
  206. package/build/users-permissions-translation-ko-json.3be77775.chunk.js +1 -0
  207. package/build/{users-permissions-translation-ms-json.3a128ff4.chunk.js → users-permissions-translation-ms-json.ea8a2baf.chunk.js} +1 -1
  208. package/build/{users-permissions-translation-nl-json.4146aed1.chunk.js → users-permissions-translation-nl-json.d638c4ce.chunk.js} +1 -1
  209. package/build/{users-permissions-translation-pl-json.a61de7ed.chunk.js → users-permissions-translation-pl-json.3c4fe81c.chunk.js} +1 -1
  210. package/build/users-permissions-translation-pt-BR-json.f6791a86.chunk.js +1 -0
  211. package/build/users-permissions-translation-pt-json.38afed04.chunk.js +1 -0
  212. package/build/users-permissions-translation-ru-json.319d51ef.chunk.js +1 -0
  213. package/build/users-permissions-translation-sk-json.ba1cd385.chunk.js +1 -0
  214. package/build/users-permissions-translation-sv-json.83c60841.chunk.js +1 -0
  215. package/build/users-permissions-translation-th-json.68873214.chunk.js +1 -0
  216. package/build/users-permissions-translation-tr-json.cdc49a3c.chunk.js +1 -0
  217. package/build/users-permissions-translation-uk-json.63eaa01c.chunk.js +1 -0
  218. package/build/users-permissions-translation-vi-json.dccc02fc.chunk.js +1 -0
  219. package/build/users-permissions-translation-zh-Hans-json.c3fd301b.chunk.js +1 -0
  220. package/build/users-permissions-translation-zh-json.e03ae2a4.chunk.js +1 -0
  221. package/build/users-providers-settings-page.82141ace.chunk.js +1 -0
  222. package/build/users-roles-settings-page.97d7092d.chunk.js +30 -0
  223. package/build/vi-json.3d14e91e.chunk.js +1 -0
  224. package/build/webhook-edit-page.2e6727ab.chunk.js +23 -0
  225. package/build/webhook-list-page.927257b5.chunk.js +133 -0
  226. package/build/zh-Hans-json.c84ce330.chunk.js +1 -0
  227. package/build/zh-json.96bf6019.chunk.js +1 -0
  228. package/package.json +10 -14
  229. package/scripts/build.js +1 -1
  230. package/server/bootstrap.js +3 -1
  231. package/server/config/admin-actions.js +14 -0
  232. package/server/config/index.js +0 -1
  233. package/server/controllers/admin.js +40 -2
  234. package/server/routes/admin.js +28 -0
  235. package/server/services/api-token.js +15 -14
  236. package/server/services/index.js +1 -0
  237. package/server/services/project-settings.js +173 -0
  238. package/server/services/token.js +13 -0
  239. package/server/utils/index.d.ts +2 -0
  240. package/server/validation/project-settings.js +39 -0
  241. package/webpack.config.js +78 -59
  242. package/build/1094.e1db3a1a.chunk.js +0 -1
  243. package/build/1454.f065d92a.chunk.js +0 -2
  244. package/build/1454.f065d92a.chunk.js.LICENSE.txt +0 -7
  245. package/build/1856.a30bd09b.chunk.js +0 -1
  246. package/build/2481.4eae9408.chunk.js +0 -1
  247. package/build/2912.c5f76e65.chunk.js +0 -1
  248. package/build/4362.d8299f0c.chunk.js +0 -1
  249. package/build/4715.8a2db02a.chunk.js +0 -1
  250. package/build/4800.f4a1384a.chunk.js +0 -1
  251. package/build/497.3fcf6196.chunk.js +0 -1
  252. package/build/4982.601f6196.chunk.js +0 -1
  253. package/build/6404.3c2d0a81.chunk.js +0 -1
  254. package/build/6925.bd694b04.chunk.js +0 -2
  255. package/build/6925.bd694b04.chunk.js.LICENSE.txt +0 -5
  256. package/build/7841.490dbbf1.chunk.js +0 -1
  257. package/build/8042.1d66811a.chunk.js +0 -2
  258. package/build/8042.1d66811a.chunk.js.LICENSE.txt +0 -4
  259. package/build/8469.8d819a3c.chunk.js +0 -1
  260. package/build/849.82c29ba7.chunk.js +0 -1
  261. package/build/9235.ced8aebf.chunk.js +0 -1
  262. package/build/9260.4233fae2.chunk.js +0 -2
  263. package/build/9260.4233fae2.chunk.js.LICENSE.txt +0 -15
  264. package/build/9853.6ff595fa.chunk.js +0 -1
  265. package/build/9988.fe838ba6.chunk.js +0 -2
  266. package/build/9988.fe838ba6.chunk.js.LICENSE.txt +0 -9
  267. package/build/Admin-authenticatedApp.61248de6.chunk.js +0 -1
  268. package/build/Admin_homePage.4a3aa22e.chunk.js +0 -1
  269. package/build/Admin_marketplace.4748c8f6.chunk.js +0 -1
  270. package/build/Admin_pluginsPage.89a96d29.chunk.js +0 -1
  271. package/build/Admin_profilePage.7869a07a.chunk.js +0 -1
  272. package/build/Admin_settingsPage.2763454c.chunk.js +0 -1
  273. package/build/admin-edit-roles-page.fbcc195d.chunk.js +0 -1
  274. package/build/admin-edit-users.91e8f5e4.chunk.js +0 -1
  275. package/build/admin-users.0a6acd73.chunk.js +0 -1
  276. package/build/api-tokens-create-page.76e13a35.chunk.js +0 -1
  277. package/build/api-tokens-edit-page.b3d48a7f.chunk.js +0 -1
  278. package/build/api-tokens-list-page.4e822ac8.chunk.js +0 -1
  279. package/build/ar-json.cc19c13c.chunk.js +0 -1
  280. package/build/codemirror-addon-closebrackets.0cfe64d0.chunk.js +0 -1
  281. package/build/codemirror-addon-lint-js.a6eeef9c.chunk.js +0 -1
  282. package/build/codemirror-addon-lint.91580cda.chunk.js +0 -1
  283. package/build/codemirror-addon-mark-selection.4dca121f.chunk.js +0 -1
  284. package/build/codemirror-css.48b438c9.chunk.js +0 -1
  285. package/build/codemirror-javacript.8c7c015d.chunk.js +0 -1
  286. package/build/codemirror-theme.b5559efc.chunk.js +0 -1
  287. package/build/content-manager.abde723b.chunk.js +0 -1
  288. package/build/content-type-builder-translation-ar-json.ab0a0caa.chunk.js +0 -1
  289. package/build/content-type-builder-translation-cs-json.e3913c9f.chunk.js +0 -1
  290. package/build/content-type-builder-translation-de-json.5eb3135d.chunk.js +0 -1
  291. package/build/content-type-builder-translation-en-json.e51b2ec3.chunk.js +0 -1
  292. package/build/content-type-builder-translation-fr-json.afd4a12f.chunk.js +0 -1
  293. package/build/content-type-builder-translation-it-json.4fa203b1.chunk.js +0 -1
  294. package/build/content-type-builder-translation-ja-json.cbb3b88a.chunk.js +0 -1
  295. package/build/content-type-builder-translation-ko-json.7daf86c3.chunk.js +0 -1
  296. package/build/content-type-builder-translation-pt-BR-json.86b192fa.chunk.js +0 -1
  297. package/build/content-type-builder-translation-pt-json.b584f79f.chunk.js +0 -1
  298. package/build/content-type-builder-translation-ru-json.7648049a.chunk.js +0 -1
  299. package/build/content-type-builder-translation-sk-json.c12a8dec.chunk.js +0 -1
  300. package/build/content-type-builder-translation-th-json.668cd5f5.chunk.js +0 -1
  301. package/build/content-type-builder-translation-tr-json.0f52e1e8.chunk.js +0 -1
  302. package/build/content-type-builder-translation-uk-json.4bf80448.chunk.js +0 -1
  303. package/build/content-type-builder-translation-zh-Hans-json.76e58138.chunk.js +0 -1
  304. package/build/content-type-builder-translation-zh-json.0bec81f1.chunk.js +0 -1
  305. package/build/content-type-builder.19ae7eef.chunk.js +0 -1
  306. package/build/cropper-css.ace19575.chunk.js +0 -1
  307. package/build/cs-json.ce6f2e52.chunk.js +0 -1
  308. package/build/de-json.2087d61e.chunk.js +0 -1
  309. package/build/email-settings-page.40ee2bda.chunk.js +0 -1
  310. package/build/email-translation-id-json.e3c2101d.chunk.js +0 -1
  311. package/build/email-translation-ja-json.66337e44.chunk.js +0 -1
  312. package/build/email-translation-ko-json.52bbd7b4.chunk.js +0 -1
  313. package/build/email-translation-ms-json.e39256df.chunk.js +0 -1
  314. package/build/email-translation-nl-json.12d28adb.chunk.js +0 -1
  315. package/build/email-translation-pl-json.9585a84e.chunk.js +0 -1
  316. package/build/email-translation-pt-BR-json.6c04b3ef.chunk.js +0 -1
  317. package/build/email-translation-pt-json.0239be04.chunk.js +0 -1
  318. package/build/email-translation-ru-json.f3b4fecc.chunk.js +0 -1
  319. package/build/email-translation-sk-json.76dbaaa6.chunk.js +0 -1
  320. package/build/email-translation-th-json.25ad73e7.chunk.js +0 -1
  321. package/build/email-translation-tr-json.ae04a9f2.chunk.js +0 -1
  322. package/build/email-translation-uk-json.03b27b08.chunk.js +0 -1
  323. package/build/email-translation-vi-json.3e1dd5b3.chunk.js +0 -1
  324. package/build/email-translation-zh-Hans-json.0df4ca59.chunk.js +0 -1
  325. package/build/email-translation-zh-json.82978eb0.chunk.js +0 -1
  326. package/build/en-json.94e6ed8a.chunk.js +0 -1
  327. package/build/fontawesome-css-all.3b89f909.chunk.js +0 -1
  328. package/build/fontawesome-css.36cff9ae.chunk.js +0 -1
  329. package/build/fontawesome-js.2639263c.chunk.js +0 -2
  330. package/build/fontawesome-js.2639263c.chunk.js.LICENSE.txt +0 -4
  331. package/build/fr-json.2a0b93ed.chunk.js +0 -1
  332. package/build/he-json.917d416c.chunk.js +0 -1
  333. package/build/highlight.js.6321cb45.chunk.js +0 -1
  334. package/build/hu-json.bee23c51.chunk.js +0 -1
  335. package/build/i18n-settings-page.1f6be747.chunk.js +0 -1
  336. package/build/i18n-translation-es-json.7049afa2.chunk.js +0 -1
  337. package/build/i18n-translation-fr-json.c6367bc9.chunk.js +0 -1
  338. package/build/i18n-translation-ko-json.aecb7e01.chunk.js +0 -1
  339. package/build/i18n-translation-zh-Hans-json.258b2e1a.chunk.js +0 -1
  340. package/build/it-json.937b2108.chunk.js +0 -1
  341. package/build/ja-json.b4818378.chunk.js +0 -1
  342. package/build/ko-json.8294a7fc.chunk.js +0 -1
  343. package/build/main.cd1c939f.js +0 -2
  344. package/build/main.cd1c939f.js.LICENSE.txt +0 -91
  345. package/build/nl-json.86eae27d.chunk.js +0 -1
  346. package/build/pt-json.ef0efd89.chunk.js +0 -1
  347. package/build/ru-json.da33236d.chunk.js +0 -1
  348. package/build/runtime~main.c5ab8a8f.js +0 -1
  349. package/build/sk-json.797e898f.chunk.js +0 -1
  350. package/build/sso-settings-page.c5dda65d.chunk.js +0 -1
  351. package/build/sv-json.5bbe6a4f.chunk.js +0 -1
  352. package/build/th-json.c1393c06.chunk.js +0 -1
  353. package/build/tr-json.57cde8b0.chunk.js +0 -1
  354. package/build/uk-json.c6df66d2.chunk.js +0 -1
  355. package/build/upload-settings.9d3231f4.chunk.js +0 -1
  356. package/build/upload-translation-de-json.55a7e43a.chunk.js +0 -1
  357. package/build/upload-translation-fr-json.b12f7247.chunk.js +0 -1
  358. package/build/upload-translation-he-json.bee013d1.chunk.js +0 -1
  359. package/build/upload-translation-it-json.43ec0a8d.chunk.js +0 -1
  360. package/build/upload-translation-ja-json.03f1af04.chunk.js +0 -1
  361. package/build/upload-translation-ko-json.08ad9013.chunk.js +0 -1
  362. package/build/upload-translation-pt-BR-json.c7656183.chunk.js +0 -1
  363. package/build/upload-translation-ru-json.0dd4f526.chunk.js +0 -1
  364. package/build/upload-translation-sk-json.55cacd22.chunk.js +0 -1
  365. package/build/upload-translation-th-json.f7aa9392.chunk.js +0 -1
  366. package/build/upload-translation-uk-json.696a16f3.chunk.js +0 -1
  367. package/build/upload-translation-zh-Hans-json.de7bc63f.chunk.js +0 -1
  368. package/build/upload-translation-zh-json.bbc1ed41.chunk.js +0 -1
  369. package/build/upload.8edef1ea.chunk.js +0 -1
  370. package/build/users-advanced-settings-page.48c437f0.chunk.js +0 -1
  371. package/build/users-email-settings-page.f39866d6.chunk.js +0 -1
  372. package/build/users-permissions-translation-ar-json.667e7eee.chunk.js +0 -1
  373. package/build/users-permissions-translation-cs-json.995b5d76.chunk.js +0 -1
  374. package/build/users-permissions-translation-en-json.0e0bc290.chunk.js +0 -1
  375. package/build/users-permissions-translation-fr-json.3e3522c3.chunk.js +0 -1
  376. package/build/users-permissions-translation-it-json.ee5742c4.chunk.js +0 -1
  377. package/build/users-permissions-translation-ja-json.c9cafa6e.chunk.js +0 -1
  378. package/build/users-permissions-translation-ko-json.170f89c2.chunk.js +0 -1
  379. package/build/users-permissions-translation-pt-BR-json.51b1cc15.chunk.js +0 -1
  380. package/build/users-permissions-translation-pt-json.85f0e0e1.chunk.js +0 -1
  381. package/build/users-permissions-translation-ru-json.a19b2400.chunk.js +0 -1
  382. package/build/users-permissions-translation-sk-json.27af7260.chunk.js +0 -1
  383. package/build/users-permissions-translation-sv-json.739657b9.chunk.js +0 -1
  384. package/build/users-permissions-translation-th-json.f001fff3.chunk.js +0 -1
  385. package/build/users-permissions-translation-tr-json.3aae5dda.chunk.js +0 -1
  386. package/build/users-permissions-translation-uk-json.a66c7a8c.chunk.js +0 -1
  387. package/build/users-permissions-translation-vi-json.685c65cc.chunk.js +0 -1
  388. package/build/users-permissions-translation-zh-Hans-json.2202741e.chunk.js +0 -1
  389. package/build/users-permissions-translation-zh-json.429a3190.chunk.js +0 -1
  390. package/build/users-providers-settings-page.574ed765.chunk.js +0 -1
  391. package/build/users-roles-settings-page.b836dc30.chunk.js +0 -1
  392. package/build/vi-json.104a6f3a.chunk.js +0 -1
  393. package/build/webhook-edit-page.b791c6f9.chunk.js +0 -1
  394. package/build/webhook-list-page.502d1236.chunk.js +0 -1
  395. package/build/zh-Hans-json.9afc1adf.chunk.js +0 -1
  396. package/build/zh-json.f36abb77.chunk.js +0 -1
  397. package/server/config/api-token.js +0 -7
@@ -13,20 +13,24 @@ import {
13
13
  useAppInfos,
14
14
  } from '@strapi/helper-plugin';
15
15
  import { Grid, GridItem } from '@strapi/design-system/Grid';
16
- import { Layout, HeaderLayout, ContentLayout } from '@strapi/design-system/Layout';
16
+ import { Layout, ContentLayout } from '@strapi/design-system/Layout';
17
17
  import { Main } from '@strapi/design-system/Main';
18
18
  import { Searchbar } from '@strapi/design-system/Searchbar';
19
19
  import { Box } from '@strapi/design-system/Box';
20
- import { LinkButton } from '@strapi/design-system/LinkButton';
21
20
  import { useNotifyAT } from '@strapi/design-system/LiveRegions';
22
- import Upload from '@strapi/icons/Upload';
21
+ import { Typography } from '@strapi/design-system/Typography';
22
+ import { Flex } from '@strapi/design-system/Flex';
23
23
 
24
24
  import PluginCard from './components/PluginCard';
25
25
  import { EmptyPluginSearch } from './components/EmptyPluginSearch';
26
+ import PageHeader from './components/PageHeader';
26
27
  import { fetchAppInformation } from './utils/api';
27
28
  import useFetchInstalledPlugins from '../../hooks/useFetchInstalledPlugins';
28
29
  import useFetchMarketplacePlugins from '../../hooks/useFetchMarketplacePlugins';
29
30
  import adminPermissions from '../../permissions';
31
+ import offlineCloud from '../../assets/images/icon_offline-cloud.svg';
32
+ import useNavigatorOnLine from '../../hooks/useNavigatorOnLine';
33
+ import MissingPluginBanner from './components/MissingPluginBanner';
30
34
 
31
35
  const matchSearch = (plugins, search) => {
32
36
  return matchSorter(plugins, search, {
@@ -48,6 +52,7 @@ const MarketPlacePage = () => {
48
52
  const toggleNotification = useNotification();
49
53
  const [searchQuery, setSearchQuery] = useState('');
50
54
  const { autoReload: isInDevelopmentMode } = useAppInfos();
55
+ const isOnline = useNavigatorOnLine();
51
56
 
52
57
  useFocusWhenNavigate();
53
58
 
@@ -116,6 +121,42 @@ const MarketPlacePage = () => {
116
121
  }
117
122
  }, [toggleNotification, isInDevelopmentMode]);
118
123
 
124
+ if (!isOnline) {
125
+ return (
126
+ <Layout>
127
+ <Main>
128
+ <PageHeader isOnline={isOnline} />
129
+ <Flex
130
+ width="100%"
131
+ direction="column"
132
+ alignItems="center"
133
+ justifyContent="center"
134
+ style={{ paddingTop: '120px' }}
135
+ >
136
+ <Box paddingBottom={2}>
137
+ <Typography textColor="neutral700" variant="alpha">
138
+ {formatMessage({
139
+ id: 'admin.pages.MarketPlacePage.offline.title',
140
+ defaultMessage: 'You are offline',
141
+ })}
142
+ </Typography>
143
+ </Box>
144
+ <Box paddingBottom={6}>
145
+ <Typography textColor="neutral700" variant="epsilon">
146
+ {formatMessage({
147
+ id: 'admin.pages.MarketPlacePage.offline.subtitle',
148
+ defaultMessage:
149
+ 'You need to be connected to the Internet to access Strapi Market.',
150
+ })}
151
+ </Typography>
152
+ </Box>
153
+ <img src={offlineCloud} alt="offline" style={{ width: '88px', height: '88px' }} />
154
+ </Flex>
155
+ </Main>
156
+ </Layout>
157
+ );
158
+ }
159
+
119
160
  if (hasFailed) {
120
161
  return (
121
162
  <Layout>
@@ -150,29 +191,7 @@ const MarketPlacePage = () => {
150
191
  defaultMessage: 'Marketplace - Plugins',
151
192
  })}
152
193
  />
153
- <HeaderLayout
154
- title={formatMessage({
155
- id: 'global.marketplace',
156
- defaultMessage: 'Marketplace',
157
- })}
158
- subtitle={formatMessage({
159
- id: 'admin.pages.MarketPlacePage.subtitle',
160
- defaultMessage: 'Get more out of Strapi',
161
- })}
162
- primaryAction={
163
- <LinkButton
164
- startIcon={<Upload />}
165
- variant="tertiary"
166
- href="https://market.strapi.io/submit-plugin"
167
- onClick={() => trackUsage('didSubmitPlugin')}
168
- >
169
- {formatMessage({
170
- id: 'admin.pages.MarketPlacePage.submit.plugin.link',
171
- defaultMessage: 'Submit your plugin',
172
- })}
173
- </LinkButton>
174
- }
175
- />
194
+ <PageHeader isOnline={isOnline} />
176
195
  <ContentLayout>
177
196
  <Box width="25%" paddingBottom={4}>
178
197
  <Searchbar
@@ -219,6 +238,9 @@ const MarketPlacePage = () => {
219
238
  ))}
220
239
  </Grid>
221
240
  )}
241
+ <Box paddingTop={7}>
242
+ <MissingPluginBanner />
243
+ </Box>
222
244
  </ContentLayout>
223
245
  </Main>
224
246
  </Layout>
@@ -0,0 +1,85 @@
1
+ import React, { useReducer, forwardRef, useImperativeHandle } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { useIntl } from 'react-intl';
4
+ import { useTracking } from '@strapi/helper-plugin';
5
+ import { Grid, GridItem } from '@strapi/design-system/Grid';
6
+ import { Box } from '@strapi/design-system/Box';
7
+ import { Typography } from '@strapi/design-system/Typography';
8
+ import LogoInput from '../LogoInput';
9
+ import { useConfigurations } from '../../../../../../hooks';
10
+ import reducer, { initialState } from './reducer';
11
+ import init from './init';
12
+
13
+ const Form = forwardRef(({ projectSettingsStored }, ref) => {
14
+ const { formatMessage } = useIntl();
15
+ const { trackUsage } = useTracking();
16
+ const {
17
+ logos: { menu },
18
+ } = useConfigurations();
19
+ const [{ menuLogo }, dispatch] = useReducer(reducer, initialState, () =>
20
+ init(initialState, projectSettingsStored)
21
+ );
22
+
23
+ const handleChangeMenuLogo = asset => {
24
+ dispatch({
25
+ type: 'SET_CUSTOM_MENU_LOGO',
26
+ value: asset,
27
+ });
28
+ };
29
+
30
+ const handleResetMenuLogo = () => {
31
+ trackUsage('didClickResetLogo');
32
+
33
+ dispatch({
34
+ type: 'RESET_CUSTOM_MENU_LOGO',
35
+ });
36
+ };
37
+
38
+ useImperativeHandle(ref, () => ({
39
+ getValues: () => ({ menuLogo: menuLogo.submit }),
40
+ }));
41
+
42
+ return (
43
+ <Box
44
+ hasRadius
45
+ background="neutral0"
46
+ shadow="tableShadow"
47
+ paddingTop={6}
48
+ paddingBottom={6}
49
+ paddingRight={7}
50
+ paddingLeft={7}
51
+ >
52
+ <Typography variant="delta" as="h3">
53
+ {formatMessage({
54
+ id: 'Settings.application.customization',
55
+ defaultMessage: 'Customization',
56
+ })}
57
+ </Typography>
58
+ <Grid paddingTop={4}>
59
+ <GridItem col={6} s={12}>
60
+ <LogoInput
61
+ onChangeLogo={handleChangeMenuLogo}
62
+ customLogo={menuLogo.display}
63
+ defaultLogo={menu.default}
64
+ onResetMenuLogo={handleResetMenuLogo}
65
+ />
66
+ </GridItem>
67
+ </Grid>
68
+ </Box>
69
+ );
70
+ });
71
+
72
+ Form.defaultProps = {
73
+ projectSettingsStored: null,
74
+ };
75
+
76
+ Form.propTypes = {
77
+ projectSettingsStored: PropTypes.shape({
78
+ menuLogo: PropTypes.shape({
79
+ url: PropTypes.string,
80
+ name: PropTypes.string,
81
+ }),
82
+ }),
83
+ };
84
+
85
+ export default Form;
@@ -0,0 +1,13 @@
1
+ import merge from 'lodash/merge';
2
+
3
+ const init = (initialState, projectSettingsStored) => {
4
+ const copyInitialState = merge(initialState, {
5
+ menuLogo: {
6
+ display: projectSettingsStored.menuLogo,
7
+ },
8
+ });
9
+
10
+ return copyInitialState;
11
+ };
12
+
13
+ export default init;
@@ -0,0 +1,43 @@
1
+ /* eslint-disable consistent-return */
2
+ /*
3
+ *
4
+ * ApplicationInfosPage Form reducer
5
+ *
6
+ */
7
+
8
+ import produce from 'immer';
9
+
10
+ const initialState = {
11
+ menuLogo: {
12
+ display: null,
13
+ submit: {
14
+ rawFile: null,
15
+ isReset: false,
16
+ },
17
+ },
18
+ };
19
+
20
+ const reducer = (state = initialState, action) =>
21
+ produce(state, draftState => {
22
+ switch (action.type) {
23
+ case 'SET_CUSTOM_MENU_LOGO': {
24
+ draftState.menuLogo.display = action.value;
25
+ draftState.menuLogo.submit.rawFile = action.value.rawFile;
26
+ break;
27
+ }
28
+ case 'RESET_CUSTOM_MENU_LOGO': {
29
+ draftState.menuLogo.display = null;
30
+ draftState.menuLogo.submit = {
31
+ rawFile: null,
32
+ isReset: true,
33
+ };
34
+ break;
35
+ }
36
+ default: {
37
+ return draftState;
38
+ }
39
+ }
40
+ });
41
+
42
+ export default reducer;
43
+ export { initialState };
@@ -0,0 +1,116 @@
1
+ import React, { useReducer } from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import PropTypes from 'prop-types';
4
+ import { CarouselInput, CarouselSlide, CarouselActions } from '@strapi/design-system/CarouselInput';
5
+ import { IconButton } from '@strapi/design-system/IconButton';
6
+ import { Box } from '@strapi/design-system/Box';
7
+ import Plus from '@strapi/icons/Plus';
8
+ import Refresh from '@strapi/icons/Refresh';
9
+ import reducer, { initialState } from './reducer';
10
+ import LogoModalStepper from '../LogoModalStepper';
11
+ import { SIZE, DIMENSION } from '../../utils/constants';
12
+ import stepper from './stepper';
13
+
14
+ const LogoInput = ({ customLogo, defaultLogo, onChangeLogo, onResetMenuLogo }) => {
15
+ const [{ currentStep }, dispatch] = useReducer(reducer, initialState);
16
+ const { Component, next, prev, modalTitle } = stepper[currentStep] || {};
17
+ const { formatMessage } = useIntl();
18
+
19
+ const goTo = to => {
20
+ dispatch({
21
+ type: 'GO_TO',
22
+ to,
23
+ });
24
+ };
25
+
26
+ return (
27
+ <>
28
+ <CarouselInput
29
+ label={formatMessage({
30
+ id: 'Settings.application.customization.carousel.title',
31
+ defaultMessage: 'Logo',
32
+ })}
33
+ selectedSlide={0}
34
+ hint={formatMessage(
35
+ {
36
+ id: 'Settings.application.customization.carousel-hint',
37
+ defaultMessage:
38
+ 'Change the admin panel logo (Max dimension: {dimension}x{dimension}, Max file size: {size}KB)',
39
+ },
40
+ { size: SIZE, dimension: DIMENSION }
41
+ )}
42
+ previousLabel=""
43
+ nextLabel=""
44
+ onNext={() => {}}
45
+ onPrevious={() => {}}
46
+ secondaryLabel={customLogo?.name || 'logo.png'}
47
+ actions={
48
+ <CarouselActions>
49
+ <IconButton
50
+ onClick={() => goTo(customLogo ? 'pending' : 'upload')}
51
+ label={formatMessage({
52
+ id: 'Settings.application.customization.carousel.change-action',
53
+ defaultMessage: 'Change logo',
54
+ })}
55
+ icon={<Plus />}
56
+ />
57
+ {customLogo && (
58
+ <IconButton
59
+ onClick={onResetMenuLogo}
60
+ label={formatMessage({
61
+ id: 'Settings.application.customization.carousel.reset-action',
62
+ defaultMessage: 'Reset logo',
63
+ })}
64
+ icon={<Refresh />}
65
+ />
66
+ )}
67
+ </CarouselActions>
68
+ }
69
+ >
70
+ <CarouselSlide
71
+ label={formatMessage({
72
+ id: 'Settings.application.customization.carousel-slide.label',
73
+ defaultMessage: 'Logo slide',
74
+ })}
75
+ >
76
+ <Box
77
+ maxHeight="40%"
78
+ maxWidth="40%"
79
+ as="img"
80
+ src={customLogo?.url || defaultLogo}
81
+ alt={formatMessage({
82
+ id: 'Settings.application.customization.carousel.title',
83
+ defaultMessage: 'Logo',
84
+ })}
85
+ />
86
+ </CarouselSlide>
87
+ </CarouselInput>
88
+ <LogoModalStepper
89
+ Component={Component}
90
+ currentStep={currentStep}
91
+ onChangeLogo={onChangeLogo}
92
+ customLogo={customLogo}
93
+ goTo={goTo}
94
+ next={next}
95
+ prev={prev}
96
+ modalTitle={modalTitle}
97
+ />
98
+ </>
99
+ );
100
+ };
101
+
102
+ LogoInput.defaultProps = {
103
+ customLogo: null,
104
+ };
105
+
106
+ LogoInput.propTypes = {
107
+ customLogo: PropTypes.shape({
108
+ url: PropTypes.string,
109
+ name: PropTypes.string,
110
+ }),
111
+ defaultLogo: PropTypes.string.isRequired,
112
+ onChangeLogo: PropTypes.func.isRequired,
113
+ onResetMenuLogo: PropTypes.func.isRequired,
114
+ };
115
+
116
+ export default LogoInput;
@@ -0,0 +1,28 @@
1
+ /* eslint-disable consistent-return */
2
+ /*
3
+ *
4
+ * LogoInput reducer
5
+ *
6
+ */
7
+
8
+ import produce from 'immer';
9
+
10
+ const initialState = {
11
+ currentStep: undefined,
12
+ };
13
+
14
+ const reducer = (state = initialState, action) =>
15
+ produce(state, draftState => {
16
+ switch (action.type) {
17
+ case 'GO_TO': {
18
+ draftState.currentStep = action.to;
19
+ break;
20
+ }
21
+ default: {
22
+ return draftState;
23
+ }
24
+ }
25
+ });
26
+
27
+ export default reducer;
28
+ export { initialState };
@@ -0,0 +1,25 @@
1
+ import AddLogoDialog from '../LogoModalStepper/AddLogoDialog';
2
+ import PendingLogoDialog from '../LogoModalStepper/PendingLogoDialog';
3
+
4
+ const stepper = {
5
+ upload: {
6
+ Component: AddLogoDialog,
7
+ modalTitle: {
8
+ id: 'Settings.application.customization.modal.upload',
9
+ defaultMessage: 'Upload logo',
10
+ },
11
+ next: 'pending',
12
+ prev: null,
13
+ },
14
+ pending: {
15
+ Component: PendingLogoDialog,
16
+ modalTitle: {
17
+ id: 'Settings.application.customization.modal.pending',
18
+ defaultMessage: 'Pending logo',
19
+ },
20
+ next: null,
21
+ prev: 'upload',
22
+ },
23
+ };
24
+
25
+ export default stepper;
@@ -0,0 +1,67 @@
1
+ import React from 'react';
2
+ import { useIntl } from 'react-intl';
3
+ import PropTypes from 'prop-types';
4
+ import { Tabs, Tab, TabGroup, TabPanels, TabPanel } from '@strapi/design-system/Tabs';
5
+ import { Box } from '@strapi/design-system/Box';
6
+ import { Divider } from '@strapi/design-system/Divider';
7
+ import FromComputerForm from './FromComputerForm';
8
+ import FromUrlForm from './FromUrlForm';
9
+
10
+ const AddLogoDialog = ({ setLocalImage, goTo, next, onClose }) => {
11
+ const { formatMessage } = useIntl();
12
+
13
+ return (
14
+ <TabGroup
15
+ label={formatMessage({
16
+ id: 'Settings.application.customization.modal.tab.label',
17
+ defaultMessage: 'How do you want to upload your assets?',
18
+ })}
19
+ variant="simple"
20
+ >
21
+ <Box paddingLeft={8} paddingRight={8}>
22
+ <Tabs>
23
+ <Tab>
24
+ {formatMessage({
25
+ id: 'Settings.application.customization.modal.upload.from-computer',
26
+ defaultMessage: 'From computer',
27
+ })}
28
+ </Tab>
29
+ <Tab>
30
+ {formatMessage({
31
+ id: 'Settings.application.customization.modal.upload.from-url',
32
+ defaultMessage: 'From url',
33
+ })}
34
+ </Tab>
35
+ </Tabs>
36
+
37
+ <Divider />
38
+ </Box>
39
+ <TabPanels>
40
+ <TabPanel>
41
+ <FromComputerForm
42
+ onClose={onClose}
43
+ setLocalImage={setLocalImage}
44
+ goTo={goTo}
45
+ next={next}
46
+ />
47
+ </TabPanel>
48
+ <TabPanel>
49
+ <FromUrlForm onClose={onClose} setLocalImage={setLocalImage} goTo={goTo} next={next} />
50
+ </TabPanel>
51
+ </TabPanels>
52
+ </TabGroup>
53
+ );
54
+ };
55
+
56
+ AddLogoDialog.defaultProps = {
57
+ next: null,
58
+ };
59
+
60
+ AddLogoDialog.propTypes = {
61
+ goTo: PropTypes.func.isRequired,
62
+ next: PropTypes.string,
63
+ onClose: PropTypes.func.isRequired,
64
+ setLocalImage: PropTypes.func.isRequired,
65
+ };
66
+
67
+ export default AddLogoDialog;
@@ -0,0 +1,176 @@
1
+ import React, { useState, useRef } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { useIntl } from 'react-intl';
4
+ import styled from 'styled-components';
5
+ import { Box } from '@strapi/design-system/Box';
6
+ import { Stack } from '@strapi/design-system/Stack';
7
+ import { Flex } from '@strapi/design-system/Flex';
8
+ import { Icon } from '@strapi/design-system/Icon';
9
+ import { Typography } from '@strapi/design-system/Typography';
10
+ import { ModalFooter } from '@strapi/design-system/ModalLayout';
11
+ import { Button } from '@strapi/design-system/Button';
12
+ import { Field, FieldError, FieldInput } from '@strapi/design-system/Field';
13
+ import PicturePlus from '@strapi/icons/PicturePlus';
14
+ import { parseFileMetadatas } from '../../utils/parseFileMetadatas';
15
+ import { ACCEPTED_FORMAT, SIZE, DIMENSION } from '../../utils/constants';
16
+
17
+ const FileInput = styled(FieldInput)`
18
+ opacity: 0;
19
+ position: absolute;
20
+ top: 0;
21
+ bottom: 0;
22
+ left: 0;
23
+ right: 0;
24
+ z-index: 1;
25
+ `;
26
+
27
+ const FromComputerForm = ({ setLocalImage, goTo, next, onClose }) => {
28
+ const { formatMessage } = useIntl();
29
+ const [dragOver, setDragOver] = useState(false);
30
+ const [fileError, setFileError] = useState(undefined);
31
+ const inputRef = useRef(null);
32
+
33
+ const handleDragEnter = () => setDragOver(true);
34
+ const handleDragLeave = () => setDragOver(false);
35
+
36
+ const handleClick = e => {
37
+ e.preventDefault();
38
+ inputRef.current.click();
39
+ };
40
+
41
+ const handleChange = async () => {
42
+ handleDragLeave();
43
+ const file = inputRef.current.files[0];
44
+
45
+ if (!file) {
46
+ return;
47
+ }
48
+
49
+ try {
50
+ const asset = await parseFileMetadatas(file);
51
+ setLocalImage(asset);
52
+ goTo(next);
53
+ } catch (err) {
54
+ if (err.displayMessage) {
55
+ setFileError(formatMessage(err.displayMessage, { size: SIZE, dimension: DIMENSION }));
56
+ inputRef.current.focus();
57
+ } else {
58
+ throw err;
59
+ }
60
+ }
61
+ };
62
+
63
+ const getBorderColor = () => {
64
+ if (dragOver) {
65
+ return 'primary500';
66
+ }
67
+ if (fileError) {
68
+ return 'danger600';
69
+ }
70
+
71
+ return 'neutral300';
72
+ };
73
+
74
+ return (
75
+ <>
76
+ <form>
77
+ <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>
78
+ <Field name="logo-upload" error={fileError}>
79
+ <label htmlFor="logo-upload">
80
+ <Stack spacing={2}>
81
+ <Flex
82
+ paddingTop={9}
83
+ paddingBottom={7}
84
+ hasRadius
85
+ justifyContent="center"
86
+ direction="column"
87
+ background={dragOver ? 'primary100' : 'neutral100'}
88
+ borderColor={getBorderColor()}
89
+ borderStyle="dashed"
90
+ borderWidth="1px"
91
+ position="relative"
92
+ onDragEnter={handleDragEnter}
93
+ onDragLeave={handleDragLeave}
94
+ >
95
+ <Icon
96
+ color="primary600"
97
+ width={`${60 / 16}rem`}
98
+ height={`${60 / 16}rem`}
99
+ as={PicturePlus}
100
+ aria-hidden
101
+ />
102
+
103
+ <Box paddingTop={3} paddingBottom={5}>
104
+ <Typography variant="delta" as="span">
105
+ {formatMessage({
106
+ id: 'Settings.application.customization.modal.upload.drag-drop',
107
+ defaultMessage: 'Drag and Drop here or',
108
+ })}
109
+ </Typography>
110
+ </Box>
111
+
112
+ <FileInput
113
+ accept={ACCEPTED_FORMAT}
114
+ cursor="pointer"
115
+ as="input"
116
+ type="file"
117
+ name="files"
118
+ tabIndex={-1}
119
+ zIndex={1}
120
+ onChange={handleChange}
121
+ ref={inputRef}
122
+ id="logo-upload"
123
+ />
124
+
125
+ <Button type="button" onClick={handleClick}>
126
+ {formatMessage({
127
+ id: 'Settings.application.customization.modal.upload.cta.browse',
128
+ defaultMessage: 'Browse files',
129
+ })}
130
+ </Button>
131
+
132
+ <Box paddingTop={6}>
133
+ <Typography variant="pi" textColor="neutral600">
134
+ {formatMessage(
135
+ {
136
+ id: 'Settings.application.customization.modal.upload.file-validation',
137
+ defaultMessage:
138
+ 'Max dimension: {dimension}x{dimension}, Max size: {size}KB',
139
+ },
140
+ { size: SIZE, dimension: DIMENSION }
141
+ )}
142
+ </Typography>
143
+ </Box>
144
+ </Flex>
145
+ <FieldError />
146
+ </Stack>
147
+ </label>
148
+ </Field>
149
+ </Box>
150
+ </form>
151
+ <ModalFooter
152
+ startActions={
153
+ <Button onClick={onClose} variant="tertiary">
154
+ {formatMessage({
155
+ id: 'Settings.application.customization.modal.cancel',
156
+ defaultMessage: 'Cancel',
157
+ })}
158
+ </Button>
159
+ }
160
+ />
161
+ </>
162
+ );
163
+ };
164
+
165
+ FromComputerForm.defaultProps = {
166
+ next: null,
167
+ };
168
+
169
+ FromComputerForm.propTypes = {
170
+ goTo: PropTypes.func.isRequired,
171
+ next: PropTypes.string,
172
+ onClose: PropTypes.func.isRequired,
173
+ setLocalImage: PropTypes.func.isRequired,
174
+ };
175
+
176
+ export default FromComputerForm;