@strapi/admin 4.6.0-beta.1 → 4.6.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 (497) hide show
  1. package/.browserslistrc +3 -0
  2. package/admin/src/components/ConfigurationsProvider/index.js +21 -18
  3. package/admin/src/components/ConfigurationsProvider/reducer.js +1 -0
  4. package/admin/src/components/GlobalStyle/index.js +0 -6
  5. package/admin/src/components/GuidedTour/Modal/components/Content.js +7 -2
  6. package/admin/src/components/LeftMenu/index.js +60 -53
  7. package/admin/src/components/Notifications/Notification/index.js +25 -3
  8. package/admin/src/components/Notifications/reducer.js +1 -0
  9. package/admin/src/components/UnauthenticatedLogo/index.js +1 -1
  10. package/admin/src/content-manager/components/DragLayer/RelationDragPreview.js +8 -6
  11. package/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js +4 -0
  12. package/admin/src/content-manager/components/DynamicZone/components/DynamicComponent.js +1 -1
  13. package/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +5 -6
  14. package/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +30 -6
  15. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js +18 -6
  16. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/findLeafByPathAndReplace.js +2 -1
  17. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/schema.js +2 -1
  18. package/admin/src/content-manager/components/FieldComponent/index.js +6 -4
  19. package/admin/src/content-manager/components/Hint/index.js +4 -17
  20. package/admin/src/content-manager/components/InputUID/index.js +3 -14
  21. package/admin/src/content-manager/components/PreviewWysiwyg/Wrapper.js +22 -27
  22. package/admin/src/content-manager/components/RelationInput/RelationInput.js +6 -8
  23. package/admin/src/content-manager/components/RelationInput/components/RelationItem.js +6 -1
  24. package/admin/src/content-manager/components/RelationInput/components/RelationList.js +10 -6
  25. package/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +17 -6
  26. package/admin/src/content-manager/components/RelationInputDataManager/utils/select.js +5 -5
  27. package/admin/src/content-manager/components/RepeatableComponent/index.js +18 -23
  28. package/admin/src/content-manager/components/Wysiwyg/EditorLayout.js +19 -28
  29. package/admin/src/content-manager/components/Wysiwyg/index.js +4 -8
  30. package/admin/src/content-manager/hooks/useCallbackRef.js +23 -0
  31. package/admin/src/content-manager/hooks/useDragAndDrop.js +1 -1
  32. package/admin/src/content-manager/hooks/useKeyboardDragAndDrop.js +10 -2
  33. package/admin/src/content-manager/hooks/useRelation/useRelation.js +9 -6
  34. package/admin/src/content-manager/pages/App/LeftMenu/index.js +5 -12
  35. package/admin/src/content-manager/pages/App/LeftMenu/utils/index.js +1 -0
  36. package/admin/src/content-manager/pages/App/LeftMenu/utils/matchByTitle.js +24 -0
  37. package/admin/src/content-manager/pages/EditView/Header/index.js +1 -1
  38. package/admin/src/content-manager/pages/EditView/{Informations → Information}/index.js +55 -39
  39. package/admin/src/content-manager/pages/EditView/{Informations → Information}/utils/getUnits.js +0 -0
  40. package/admin/src/content-manager/pages/EditView/index.js +3 -3
  41. package/admin/src/content-manager/pages/ListSettingsView/index.js +3 -5
  42. package/admin/src/content-manager/utils/getMaxTempKey.js +4 -2
  43. package/admin/src/content-manager/utils/paths.js +37 -0
  44. package/admin/src/core/store/configureStore.js +22 -4
  45. package/admin/src/core/utils/axiosInstance.js +4 -2
  46. package/admin/src/hooks/index.js +0 -1
  47. package/admin/src/hooks/useSettingsMenu/init.js +2 -18
  48. package/admin/src/hooks/useSettingsMenu/utils/adminLinks.js +4 -0
  49. package/admin/src/hooks/useSettingsMenu/utils/customAdminLinks.js +1 -0
  50. package/admin/src/hooks/useSettingsMenu/utils/defaultAdminLinks.js +21 -0
  51. package/admin/src/index.js +3 -3
  52. package/admin/src/pages/App/index.js +8 -3
  53. package/admin/src/pages/ProfilePage/index.js +1 -1
  54. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/index.js +142 -0
  55. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/{Form → CustomizationInfos}/init.js +3 -0
  56. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/{Form → CustomizationInfos}/reducer.js +20 -0
  57. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js +21 -17
  58. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/index.js +68 -42
  59. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/api.js +5 -1
  60. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/EventInput/index.js +1 -1
  61. package/admin/src/permissions/defaultPermissions.js +8 -0
  62. package/admin/src/translations/ca.json +2 -3
  63. package/admin/src/translations/dk.json +2 -2
  64. package/admin/src/translations/en.json +63 -16
  65. package/admin/src/translations/es.json +2 -2
  66. package/admin/src/translations/fr.json +2 -2
  67. package/admin/src/translations/hu.json +197 -2
  68. package/admin/src/translations/ja.json +2 -2
  69. package/admin/src/translations/nl.json +2 -2
  70. package/admin/src/translations/zh-Hans.json +1 -1
  71. package/admin/src/translations/zh.json +11 -3
  72. package/build/2607.ce06608e.chunk.js +66 -0
  73. package/build/2743.dea372fb.chunk.js +42 -0
  74. package/build/3075.03ebe93d.chunk.js +115 -0
  75. package/build/3632.963ac97d.chunk.js +138 -0
  76. package/build/4318.8cb388a5.chunk.js +30 -0
  77. package/build/4656.a0d43cca.chunk.js +159 -0
  78. package/build/5015.8e3fe50b.chunk.js +6 -0
  79. package/build/5910.a5374848.chunk.js +209 -0
  80. package/build/8633.4af74a50.chunk.js +1 -0
  81. package/build/9641.a311b612.chunk.js +276 -0
  82. package/build/9707.62831b4d.chunk.js +101 -0
  83. package/build/Admin-authenticatedApp.50dc27f9.chunk.js +75 -0
  84. package/build/Admin_InternalErrorPage.157152a8.chunk.js +1 -0
  85. package/build/Admin_homePage.79ab880c.chunk.js +77 -0
  86. package/build/Admin_marketplace.eabf21b2.chunk.js +26 -0
  87. package/build/Admin_pluginsPage.953e796b.chunk.js +6 -0
  88. package/build/Admin_profilePage.5c2efda5.chunk.js +15 -0
  89. package/build/Admin_settingsPage.19cfb9ca.chunk.js +178 -0
  90. package/build/Upload_ConfigureTheView.3f2b6e6a.chunk.js +1 -0
  91. package/build/admin-app.34295b50.chunk.js +112 -0
  92. package/build/admin-edit-roles-page.d50d9654.chunk.js +1 -0
  93. package/build/admin-edit-users.912b856d.chunk.js +10 -0
  94. package/build/admin-users.e36e7111.chunk.js +11 -0
  95. package/build/api-tokens-create-page.0e686c30.chunk.js +1 -0
  96. package/build/api-tokens-edit-page.d6c7487b.chunk.js +1 -0
  97. package/build/api-tokens-list-page.1cd86136.chunk.js +16 -0
  98. package/build/ar-json.932794f7.chunk.js +1 -0
  99. package/build/audit-logs-settings-page.308a6250.chunk.js +1 -0
  100. package/build/ca-json.f6a0f472.chunk.js +1 -0
  101. package/build/codemirror-addon-closebrackets.71aa4bbd.chunk.js +2 -0
  102. package/build/codemirror-addon-lint-js.405f70fb.chunk.js +1 -0
  103. package/build/codemirror-addon-lint.8487ad3d.chunk.js +1 -0
  104. package/build/codemirror-addon-mark-selection.1928c849.chunk.js +1 -0
  105. package/build/{codemirror-css.4e2bbed3.chunk.js → codemirror-css.359a2a4b.chunk.js} +2 -3
  106. package/build/codemirror-javacript.af237b68.chunk.js +1 -0
  107. package/build/codemirror-theme.2fe63a16.chunk.js +33 -0
  108. package/build/content-manager.851f40ce.chunk.js +1170 -0
  109. package/build/content-type-builder-list-view.4243b2b1.chunk.js +198 -0
  110. package/build/content-type-builder-translation-ar-json.56d8fcf4.chunk.js +1 -0
  111. package/build/content-type-builder-translation-cs-json.a5b299ca.chunk.js +1 -0
  112. package/build/content-type-builder-translation-de-json.0979cccb.chunk.js +1 -0
  113. package/build/content-type-builder-translation-dk-json.e05583e9.chunk.js +1 -0
  114. package/build/content-type-builder-translation-en-json.e577d595.chunk.js +1 -0
  115. package/build/content-type-builder-translation-es-json.fe4daad8.chunk.js +1 -0
  116. package/build/content-type-builder-translation-fr-json.b1eb52f6.chunk.js +1 -0
  117. package/build/content-type-builder-translation-id-json.ee3b36bb.chunk.js +1 -0
  118. package/build/content-type-builder-translation-it-json.13b3c26a.chunk.js +1 -0
  119. package/build/content-type-builder-translation-ja-json.9be0d5b2.chunk.js +1 -0
  120. package/build/content-type-builder-translation-ko-json.8a274be5.chunk.js +1 -0
  121. package/build/content-type-builder-translation-ms-json.2d29c1e0.chunk.js +1 -0
  122. package/build/content-type-builder-translation-nl-json.40bbc562.chunk.js +1 -0
  123. package/build/content-type-builder-translation-pl-json.24a34349.chunk.js +1 -0
  124. package/build/content-type-builder-translation-pt-BR-json.97f71a9d.chunk.js +1 -0
  125. package/build/content-type-builder-translation-pt-json.ddb44f8c.chunk.js +1 -0
  126. package/build/content-type-builder-translation-ru-json.54d11230.chunk.js +1 -0
  127. package/build/content-type-builder-translation-sk-json.626c9493.chunk.js +1 -0
  128. package/build/content-type-builder-translation-sv-json.59f5e1e5.chunk.js +1 -0
  129. package/build/content-type-builder-translation-th-json.6fe3ed55.chunk.js +1 -0
  130. package/build/content-type-builder-translation-tr-json.cea4d226.chunk.js +1 -0
  131. package/build/content-type-builder-translation-uk-json.c4524247.chunk.js +1 -0
  132. package/build/content-type-builder-translation-zh-Hans-json.52a30266.chunk.js +1 -0
  133. package/build/content-type-builder-translation-zh-json.faedd610.chunk.js +1 -0
  134. package/build/content-type-builder.365b6bf4.chunk.js +125 -0
  135. package/build/cs-json.79879fb6.chunk.js +1 -0
  136. package/build/de-json.30e1f35b.chunk.js +1 -0
  137. package/build/dk-json.e6d9ffa4.chunk.js +1 -0
  138. package/build/email-settings-page.379552b1.chunk.js +15 -0
  139. package/build/email-translation-ar-json.88304564.chunk.js +1 -0
  140. package/build/email-translation-cs-json.6eaeec6a.chunk.js +1 -0
  141. package/build/email-translation-de-json.1b334230.chunk.js +1 -0
  142. package/build/email-translation-dk-json.85402492.chunk.js +1 -0
  143. package/build/email-translation-en-json.4211d4d0.chunk.js +1 -0
  144. package/build/email-translation-es-json.0b6b1006.chunk.js +1 -0
  145. package/build/email-translation-fr-json.78be2787.chunk.js +1 -0
  146. package/build/email-translation-id-json.c97239fe.chunk.js +1 -0
  147. package/build/email-translation-it-json.a2ed8c78.chunk.js +1 -0
  148. package/build/email-translation-ja-json.63eebd02.chunk.js +1 -0
  149. package/build/email-translation-ko-json.4de49b23.chunk.js +1 -0
  150. package/build/email-translation-ms-json.7390477e.chunk.js +1 -0
  151. package/build/email-translation-nl-json.377bdd9f.chunk.js +1 -0
  152. package/build/email-translation-pl-json.97d0db97.chunk.js +1 -0
  153. package/build/email-translation-pt-BR-json.81cca553.chunk.js +1 -0
  154. package/build/email-translation-pt-json.2a2a0643.chunk.js +1 -0
  155. package/build/email-translation-ru-json.6bce37dd.chunk.js +1 -0
  156. package/build/email-translation-sk-json.53da2fcd.chunk.js +1 -0
  157. package/build/email-translation-th-json.660fa9a8.chunk.js +1 -0
  158. package/build/email-translation-tr-json.e6c0f8fc.chunk.js +1 -0
  159. package/build/email-translation-uk-json.bd1fb6bf.chunk.js +1 -0
  160. package/build/email-translation-vi-json.9fb7e6d7.chunk.js +1 -0
  161. package/build/email-translation-zh-Hans-json.c6841563.chunk.js +1 -0
  162. package/build/email-translation-zh-json.7a2232ea.chunk.js +1 -0
  163. package/build/en-json.38d182e5.chunk.js +1 -0
  164. package/build/es-json.e275481d.chunk.js +1 -0
  165. package/build/fr-json.78545ef8.chunk.js +1 -0
  166. package/build/gu-json.676518f2.chunk.js +1 -0
  167. package/build/he-json.ad22e8cc.chunk.js +1 -0
  168. package/build/hi-json.19b51c09.chunk.js +1 -0
  169. package/build/highlight.js.26ef649f.chunk.js +85 -0
  170. package/build/hu-json.f947088f.chunk.js +1 -0
  171. package/build/i18n-settings-page.3ab28b1a.chunk.js +65 -0
  172. package/build/i18n-translation-de-json.362384a6.chunk.js +1 -0
  173. package/build/i18n-translation-dk-json.89401417.chunk.js +1 -0
  174. package/build/i18n-translation-en-json.60af6722.chunk.js +1 -0
  175. package/build/i18n-translation-es-json.87b494d1.chunk.js +1 -0
  176. package/build/i18n-translation-fr-json.57ddc77e.chunk.js +1 -0
  177. package/build/i18n-translation-ko-json.ef4f9471.chunk.js +1 -0
  178. package/build/i18n-translation-pl-json.dfac513d.chunk.js +1 -0
  179. package/build/i18n-translation-tr-json.10f0600d.chunk.js +1 -0
  180. package/build/i18n-translation-zh-Hans-json.757ce62d.chunk.js +1 -0
  181. package/build/i18n-translation-zh-json.bef2dc07.chunk.js +1 -0
  182. package/build/id-json.504daa84.chunk.js +1 -0
  183. package/build/index.html +1 -1
  184. package/build/it-json.2fd90f4d.chunk.js +1 -0
  185. package/build/ja-json.c9f12d0b.chunk.js +1 -0
  186. package/build/ko-json.ef463065.chunk.js +1 -0
  187. package/build/main.9f31732e.js +4454 -0
  188. package/build/ml-json.490f666c.chunk.js +1 -0
  189. package/build/ms-json.db87d8d3.chunk.js +1 -0
  190. package/build/nl-json.c416295a.chunk.js +1 -0
  191. package/build/no-json.1a2258ba.chunk.js +1 -0
  192. package/build/pl-json.8cf0c871.chunk.js +1 -0
  193. package/build/pt-BR-json.51fab8d0.chunk.js +1 -0
  194. package/build/pt-json.62927d1e.chunk.js +1 -0
  195. package/build/ru-json.3b411a39.chunk.js +1 -0
  196. package/build/runtime~main.2b8e2318.js +2 -0
  197. package/build/sa-json.f3fa5407.chunk.js +1 -0
  198. package/build/sk-json.9ec60d9f.chunk.js +1 -0
  199. package/build/sso-settings-page.b64a44e8.chunk.js +41 -0
  200. package/build/sv-json.c6b0c237.chunk.js +1 -0
  201. package/build/th-json.6e68155c.chunk.js +1 -0
  202. package/build/tr-json.9f41dc08.chunk.js +1 -0
  203. package/build/uk-json.b2fcd567.chunk.js +1 -0
  204. package/build/upload-settings.6c26ff37.chunk.js +89 -0
  205. package/build/upload-translation-ca-json.57954414.chunk.js +1 -0
  206. package/build/upload-translation-de-json.420c943b.chunk.js +1 -0
  207. package/build/upload-translation-dk-json.bbb2fa05.chunk.js +1 -0
  208. package/build/upload-translation-en-json.8b7573ce.chunk.js +1 -0
  209. package/build/upload-translation-es-json.ba2eb03a.chunk.js +1 -0
  210. package/build/upload-translation-fr-json.84429734.chunk.js +1 -0
  211. package/build/upload-translation-he-json.0a830937.chunk.js +1 -0
  212. package/build/upload-translation-it-json.e87d7966.chunk.js +1 -0
  213. package/build/upload-translation-ja-json.44b88e7a.chunk.js +1 -0
  214. package/build/upload-translation-ko-json.a52eab64.chunk.js +1 -0
  215. package/build/upload-translation-ms-json.74f6d746.chunk.js +1 -0
  216. package/build/upload-translation-pl-json.426f31c9.chunk.js +1 -0
  217. package/build/upload-translation-pt-BR-json.d1704f0b.chunk.js +1 -0
  218. package/build/upload-translation-pt-json.6b937fdf.chunk.js +1 -0
  219. package/build/upload-translation-ru-json.675f6b93.chunk.js +1 -0
  220. package/build/upload-translation-sk-json.483a18f6.chunk.js +1 -0
  221. package/build/upload-translation-th-json.3847dae0.chunk.js +1 -0
  222. package/build/upload-translation-tr-json.74117e5c.chunk.js +1 -0
  223. package/build/upload-translation-uk-json.9950466a.chunk.js +1 -0
  224. package/build/upload-translation-zh-Hans-json.3da5cf56.chunk.js +1 -0
  225. package/build/upload-translation-zh-json.e1dd6eb2.chunk.js +1 -0
  226. package/build/upload.2c69d238.chunk.js +38 -0
  227. package/build/users-advanced-settings-page.c4270682.chunk.js +13 -0
  228. package/build/users-email-settings-page.60422a2f.chunk.js +28 -0
  229. package/build/users-permissions-translation-ar-json.7d87d54d.chunk.js +1 -0
  230. package/build/users-permissions-translation-cs-json.7e23424a.chunk.js +1 -0
  231. package/build/users-permissions-translation-de-json.a6fb670f.chunk.js +1 -0
  232. package/build/users-permissions-translation-dk-json.60e50f48.chunk.js +1 -0
  233. package/build/users-permissions-translation-en-json.4b302272.chunk.js +1 -0
  234. package/build/users-permissions-translation-es-json.35007573.chunk.js +1 -0
  235. package/build/users-permissions-translation-fr-json.7e55bbbb.chunk.js +1 -0
  236. package/build/users-permissions-translation-id-json.a5a0fb59.chunk.js +1 -0
  237. package/build/users-permissions-translation-it-json.0705465d.chunk.js +1 -0
  238. package/build/users-permissions-translation-ja-json.891fe76e.chunk.js +1 -0
  239. package/build/users-permissions-translation-ko-json.357d7a33.chunk.js +1 -0
  240. package/build/users-permissions-translation-ms-json.c83f87c4.chunk.js +1 -0
  241. package/build/users-permissions-translation-nl-json.c9f92a3c.chunk.js +1 -0
  242. package/build/users-permissions-translation-pl-json.0a7287d1.chunk.js +1 -0
  243. package/build/users-permissions-translation-pt-BR-json.1b6d2920.chunk.js +1 -0
  244. package/build/users-permissions-translation-pt-json.a7eda429.chunk.js +1 -0
  245. package/build/users-permissions-translation-ru-json.20e177db.chunk.js +1 -0
  246. package/build/users-permissions-translation-sk-json.7f37180f.chunk.js +1 -0
  247. package/build/users-permissions-translation-sv-json.17187818.chunk.js +1 -0
  248. package/build/users-permissions-translation-th-json.1e9c0247.chunk.js +1 -0
  249. package/build/users-permissions-translation-tr-json.2bd7ff98.chunk.js +1 -0
  250. package/build/users-permissions-translation-uk-json.6a0a1572.chunk.js +1 -0
  251. package/build/users-permissions-translation-vi-json.6722a8a2.chunk.js +1 -0
  252. package/build/users-permissions-translation-zh-Hans-json.0b31c705.chunk.js +1 -0
  253. package/build/users-permissions-translation-zh-json.7978eaa6.chunk.js +1 -0
  254. package/build/users-providers-settings-page.e1834060.chunk.js +104 -0
  255. package/build/users-roles-settings-page.3ef35132.chunk.js +30 -0
  256. package/build/vi-json.f08d7d03.chunk.js +1 -0
  257. package/build/webhook-edit-page.c0080dc1.chunk.js +75 -0
  258. package/build/webhook-list-page.f75ba3f2.chunk.js +42 -0
  259. package/build/zh-Hans-json.9c0eac99.chunk.js +1 -0
  260. package/build/zh-json.f88f563d.chunk.js +1 -0
  261. package/ee/admin/hooks/useSettingsMenu/utils/customAdminLinks.js +17 -0
  262. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionBody.js +111 -0
  263. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/ActionItem.js +22 -0
  264. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/Modal/index.js +56 -0
  265. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/PaginationFooter/index.js +35 -0
  266. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/TableRows/index.js +88 -0
  267. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/hooks/useFormatTimeStamp.js +24 -0
  268. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/index.js +98 -0
  269. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/utils/getActionTypesDefaultMessages.js +36 -0
  270. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ListView/utils/tableHeaders.js +38 -0
  271. package/ee/admin/pages/SettingsPage/pages/AuditLogs/ProtectedListPage/index.js +12 -0
  272. package/ee/admin/pages/SettingsPage/{SingleSignOn → pages/SingleSignOn}/index.js +3 -3
  273. package/ee/admin/pages/SettingsPage/{SingleSignOn → pages/SingleSignOn}/utils/schema.js +0 -0
  274. package/ee/admin/pages/SettingsPage/utils/customRoutes.js +28 -16
  275. package/ee/server/bootstrap.js +8 -20
  276. package/ee/server/config/admin-actions.js +32 -0
  277. package/ee/server/controllers/audit-logs.js +24 -0
  278. package/ee/server/controllers/authentication/middlewares.js +2 -1
  279. package/ee/server/controllers/index.js +1 -0
  280. package/ee/server/destroy.js +12 -0
  281. package/ee/server/index.js +2 -0
  282. package/ee/server/register.js +15 -0
  283. package/ee/server/routes/index.js +94 -10
  284. package/ee/server/services/audit-logs.js +153 -0
  285. package/ee/server/services/passport/sso.js +13 -1
  286. package/ee/server/services/passport.js +1 -4
  287. package/ee/server/validation/audit-logs.js +18 -0
  288. package/package.json +20 -15
  289. package/server/controllers/admin.js +3 -2
  290. package/server/controllers/authentication.js +8 -1
  291. package/server/index.js +2 -0
  292. package/server/middlewares/index.js +7 -0
  293. package/server/middlewares/rateLimit.js +43 -0
  294. package/server/register.js +9 -0
  295. package/server/routes/authentication.js +12 -1
  296. package/server/routes/roles.js +0 -8
  297. package/server/services/permission/queries.js +12 -3
  298. package/server/services/project-settings.js +10 -6
  299. package/server/services/role.js +11 -2
  300. package/server/services/user.js +25 -3
  301. package/server/validation/project-settings.js +19 -10
  302. package/strapi-server.js +1 -1
  303. package/webpack.config.js +7 -4
  304. package/admin/src/core/store/createReducer.js +0 -5
  305. package/admin/src/hooks/useFetchClient/index.js +0 -23
  306. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/Form/index.js +0 -85
  307. package/admin/src/utils/fetchClient.js +0 -45
  308. package/admin/src/utils/getFetchClient.js +0 -10
  309. package/build/2235.06c13219.chunk.js +0 -106
  310. package/build/2598.962797b2.chunk.js +0 -159
  311. package/build/4318.0bbd3f4b.chunk.js +0 -30
  312. package/build/4958.7c118f5e.chunk.js +0 -276
  313. package/build/5015.f080b64e.chunk.js +0 -6
  314. package/build/5052.712419ea.chunk.js +0 -65
  315. package/build/7295.04ac49dc.chunk.js +0 -114
  316. package/build/805.ddcead70.chunk.js +0 -138
  317. package/build/8633.59223842.chunk.js +0 -1
  318. package/build/874.bde3ea04.chunk.js +0 -104
  319. package/build/9159.ac968e72.chunk.js +0 -169
  320. package/build/9707.77e475ee.chunk.js +0 -101
  321. package/build/Admin-authenticatedApp.9dd415b8.chunk.js +0 -72
  322. package/build/Admin_InternalErrorPage.e0317a5e.chunk.js +0 -1
  323. package/build/Admin_homePage.8945f71a.chunk.js +0 -77
  324. package/build/Admin_marketplace.ed754a4a.chunk.js +0 -26
  325. package/build/Admin_pluginsPage.67728975.chunk.js +0 -6
  326. package/build/Admin_profilePage.60ab80bb.chunk.js +0 -15
  327. package/build/Admin_settingsPage.9ce40fed.chunk.js +0 -178
  328. package/build/Upload_ConfigureTheView.7cb2a3fd.chunk.js +0 -1
  329. package/build/admin-app.d8fc7c4d.chunk.js +0 -112
  330. package/build/admin-edit-roles-page.f407538c.chunk.js +0 -1
  331. package/build/admin-edit-users.5547b126.chunk.js +0 -10
  332. package/build/admin-users.4b6b47f8.chunk.js +0 -11
  333. package/build/api-tokens-create-page.dd4ddfcb.chunk.js +0 -1
  334. package/build/api-tokens-edit-page.821c5a6c.chunk.js +0 -1
  335. package/build/api-tokens-list-page.50519ed7.chunk.js +0 -16
  336. package/build/ar-json.3489463d.chunk.js +0 -1
  337. package/build/ca-json.07ae0f2c.chunk.js +0 -1
  338. package/build/codemirror-addon-closebrackets.c0f97916.chunk.js +0 -2
  339. package/build/codemirror-addon-lint-js.7c35dcb0.chunk.js +0 -1
  340. package/build/codemirror-addon-lint.505ff1d4.chunk.js +0 -1
  341. package/build/codemirror-addon-mark-selection.653e904d.chunk.js +0 -1
  342. package/build/codemirror-javacript.41bdefda.chunk.js +0 -1
  343. package/build/codemirror-theme.a82cae4e.chunk.js +0 -34
  344. package/build/content-manager.f2214e32.chunk.js +0 -1166
  345. package/build/content-type-builder-list-view.4aea46fa.chunk.js +0 -198
  346. package/build/content-type-builder-translation-ar-json.142327af.chunk.js +0 -1
  347. package/build/content-type-builder-translation-cs-json.4aafb972.chunk.js +0 -1
  348. package/build/content-type-builder-translation-de-json.a52482c7.chunk.js +0 -1
  349. package/build/content-type-builder-translation-dk-json.a8616510.chunk.js +0 -1
  350. package/build/content-type-builder-translation-en-json.1d9a3c14.chunk.js +0 -1
  351. package/build/content-type-builder-translation-es-json.c3ea46fb.chunk.js +0 -1
  352. package/build/content-type-builder-translation-fr-json.aa6eeea8.chunk.js +0 -1
  353. package/build/content-type-builder-translation-id-json.7c00a32a.chunk.js +0 -1
  354. package/build/content-type-builder-translation-it-json.a906b389.chunk.js +0 -1
  355. package/build/content-type-builder-translation-ja-json.87f71930.chunk.js +0 -1
  356. package/build/content-type-builder-translation-ko-json.3fb7ddc8.chunk.js +0 -1
  357. package/build/content-type-builder-translation-ms-json.963a1a01.chunk.js +0 -1
  358. package/build/content-type-builder-translation-nl-json.c46c8f30.chunk.js +0 -1
  359. package/build/content-type-builder-translation-pl-json.9b2993b2.chunk.js +0 -1
  360. package/build/content-type-builder-translation-pt-BR-json.6d255441.chunk.js +0 -1
  361. package/build/content-type-builder-translation-pt-json.96a31576.chunk.js +0 -1
  362. package/build/content-type-builder-translation-ru-json.cf8d7c5c.chunk.js +0 -1
  363. package/build/content-type-builder-translation-sk-json.3a6defe0.chunk.js +0 -1
  364. package/build/content-type-builder-translation-sv-json.c608b9ca.chunk.js +0 -1
  365. package/build/content-type-builder-translation-th-json.c96a2d3f.chunk.js +0 -1
  366. package/build/content-type-builder-translation-tr-json.949e22eb.chunk.js +0 -1
  367. package/build/content-type-builder-translation-uk-json.d8c0b6dd.chunk.js +0 -1
  368. package/build/content-type-builder-translation-zh-Hans-json.92a27f59.chunk.js +0 -1
  369. package/build/content-type-builder-translation-zh-json.b79513e4.chunk.js +0 -1
  370. package/build/content-type-builder.8a9a77f9.chunk.js +0 -127
  371. package/build/cropper-css.12fe038c.chunk.js +0 -306
  372. package/build/cs-json.ce49da5c.chunk.js +0 -1
  373. package/build/de-json.6b3e1894.chunk.js +0 -1
  374. package/build/dk-json.144c6a8e.chunk.js +0 -1
  375. package/build/email-settings-page.c6e62f6b.chunk.js +0 -15
  376. package/build/email-translation-ar-json.c624512d.chunk.js +0 -1
  377. package/build/email-translation-cs-json.cb18caab.chunk.js +0 -1
  378. package/build/email-translation-de-json.54743260.chunk.js +0 -1
  379. package/build/email-translation-dk-json.f323fe4e.chunk.js +0 -1
  380. package/build/email-translation-en-json.ebad8943.chunk.js +0 -1
  381. package/build/email-translation-es-json.9021417d.chunk.js +0 -1
  382. package/build/email-translation-fr-json.9f125db0.chunk.js +0 -1
  383. package/build/email-translation-id-json.3bcae5f5.chunk.js +0 -1
  384. package/build/email-translation-it-json.6ffd1774.chunk.js +0 -1
  385. package/build/email-translation-ja-json.72b3f73c.chunk.js +0 -1
  386. package/build/email-translation-ko-json.e61d4e7a.chunk.js +0 -1
  387. package/build/email-translation-ms-json.b2b11e05.chunk.js +0 -1
  388. package/build/email-translation-nl-json.5349635f.chunk.js +0 -1
  389. package/build/email-translation-pl-json.a03bcf98.chunk.js +0 -1
  390. package/build/email-translation-pt-BR-json.2c98ab20.chunk.js +0 -1
  391. package/build/email-translation-pt-json.159505ab.chunk.js +0 -1
  392. package/build/email-translation-ru-json.d508cf3e.chunk.js +0 -1
  393. package/build/email-translation-sk-json.fa1fd4b3.chunk.js +0 -1
  394. package/build/email-translation-th-json.989cfecc.chunk.js +0 -1
  395. package/build/email-translation-tr-json.8aa034bb.chunk.js +0 -1
  396. package/build/email-translation-uk-json.0396a803.chunk.js +0 -1
  397. package/build/email-translation-vi-json.c0d8c414.chunk.js +0 -1
  398. package/build/email-translation-zh-Hans-json.8172da08.chunk.js +0 -1
  399. package/build/email-translation-zh-json.62b1c6fe.chunk.js +0 -1
  400. package/build/en-json.1abdade9.chunk.js +0 -1
  401. package/build/es-json.6d123a82.chunk.js +0 -1
  402. package/build/fr-json.28ab54cb.chunk.js +0 -1
  403. package/build/gu-json.9a50ea64.chunk.js +0 -1
  404. package/build/he-json.72f18790.chunk.js +0 -1
  405. package/build/hi-json.0301b7ba.chunk.js +0 -1
  406. package/build/highlight.js.af2de364.chunk.js +0 -86
  407. package/build/hu-json.c4b641bb.chunk.js +0 -1
  408. package/build/i18n-settings-page.ee572037.chunk.js +0 -1
  409. package/build/i18n-translation-de-json.92534555.chunk.js +0 -1
  410. package/build/i18n-translation-dk-json.54f410ca.chunk.js +0 -1
  411. package/build/i18n-translation-en-json.760250ae.chunk.js +0 -1
  412. package/build/i18n-translation-es-json.488206ae.chunk.js +0 -1
  413. package/build/i18n-translation-fr-json.b401aa34.chunk.js +0 -1
  414. package/build/i18n-translation-ko-json.b2d90a83.chunk.js +0 -1
  415. package/build/i18n-translation-pl-json.cea5bf23.chunk.js +0 -1
  416. package/build/i18n-translation-tr-json.34ca9d61.chunk.js +0 -1
  417. package/build/i18n-translation-zh-Hans-json.560a98e3.chunk.js +0 -1
  418. package/build/i18n-translation-zh-json.eeebb849.chunk.js +0 -1
  419. package/build/id-json.86035797.chunk.js +0 -1
  420. package/build/it-json.bbdc8993.chunk.js +0 -1
  421. package/build/ja-json.1c9eeeec.chunk.js +0 -1
  422. package/build/ko-json.e1f66398.chunk.js +0 -1
  423. package/build/main.91f6e21e.js +0 -4099
  424. package/build/ml-json.963c889f.chunk.js +0 -1
  425. package/build/ms-json.ed51e902.chunk.js +0 -1
  426. package/build/nl-json.26f39180.chunk.js +0 -1
  427. package/build/no-json.a58c28bd.chunk.js +0 -1
  428. package/build/pl-json.249626b3.chunk.js +0 -1
  429. package/build/pt-BR-json.2b72b1d6.chunk.js +0 -1
  430. package/build/pt-json.cd67ba86.chunk.js +0 -1
  431. package/build/ru-json.8830286f.chunk.js +0 -1
  432. package/build/runtime~main.447b0382.js +0 -2
  433. package/build/sa-json.44e95991.chunk.js +0 -1
  434. package/build/sk-json.2af48064.chunk.js +0 -1
  435. package/build/sso-settings-page.91924df1.chunk.js +0 -41
  436. package/build/sv-json.fb1081ff.chunk.js +0 -1
  437. package/build/th-json.a67309b1.chunk.js +0 -1
  438. package/build/tr-json.eac8bd79.chunk.js +0 -1
  439. package/build/uk-json.c4cd2e24.chunk.js +0 -1
  440. package/build/upload-settings.326cd9fd.chunk.js +0 -89
  441. package/build/upload-translation-ca-json.db8ed7ba.chunk.js +0 -1
  442. package/build/upload-translation-de-json.00cbbc08.chunk.js +0 -1
  443. package/build/upload-translation-dk-json.c787a6be.chunk.js +0 -1
  444. package/build/upload-translation-en-json.32cf9aff.chunk.js +0 -1
  445. package/build/upload-translation-es-json.0f90db48.chunk.js +0 -1
  446. package/build/upload-translation-fr-json.e21c0c7a.chunk.js +0 -1
  447. package/build/upload-translation-he-json.4ce77b7b.chunk.js +0 -1
  448. package/build/upload-translation-it-json.5ce11e0b.chunk.js +0 -1
  449. package/build/upload-translation-ja-json.22afae44.chunk.js +0 -1
  450. package/build/upload-translation-ko-json.392002fb.chunk.js +0 -1
  451. package/build/upload-translation-ms-json.0605d6da.chunk.js +0 -1
  452. package/build/upload-translation-pl-json.136eedb6.chunk.js +0 -1
  453. package/build/upload-translation-pt-BR-json.95686cfb.chunk.js +0 -1
  454. package/build/upload-translation-pt-json.5c452b48.chunk.js +0 -1
  455. package/build/upload-translation-ru-json.37bd1546.chunk.js +0 -1
  456. package/build/upload-translation-sk-json.fe86c53b.chunk.js +0 -1
  457. package/build/upload-translation-th-json.9e1fda51.chunk.js +0 -1
  458. package/build/upload-translation-tr-json.b173223a.chunk.js +0 -1
  459. package/build/upload-translation-uk-json.1328cb3e.chunk.js +0 -1
  460. package/build/upload-translation-zh-Hans-json.37a2981e.chunk.js +0 -1
  461. package/build/upload-translation-zh-json.ac5711de.chunk.js +0 -1
  462. package/build/upload.2977cb13.chunk.js +0 -38
  463. package/build/users-advanced-settings-page.0c0b8230.chunk.js +0 -13
  464. package/build/users-email-settings-page.18d4a475.chunk.js +0 -28
  465. package/build/users-permissions-translation-ar-json.e8123ed2.chunk.js +0 -1
  466. package/build/users-permissions-translation-cs-json.e6649c5f.chunk.js +0 -1
  467. package/build/users-permissions-translation-de-json.c3628843.chunk.js +0 -1
  468. package/build/users-permissions-translation-dk-json.bad0b786.chunk.js +0 -1
  469. package/build/users-permissions-translation-en-json.aeab388a.chunk.js +0 -1
  470. package/build/users-permissions-translation-es-json.152a923f.chunk.js +0 -1
  471. package/build/users-permissions-translation-fr-json.172aa69f.chunk.js +0 -1
  472. package/build/users-permissions-translation-id-json.5aadd143.chunk.js +0 -1
  473. package/build/users-permissions-translation-it-json.7d377480.chunk.js +0 -1
  474. package/build/users-permissions-translation-ja-json.4967badf.chunk.js +0 -1
  475. package/build/users-permissions-translation-ko-json.6bd0ae22.chunk.js +0 -1
  476. package/build/users-permissions-translation-ms-json.ea8a2baf.chunk.js +0 -1
  477. package/build/users-permissions-translation-nl-json.d638c4ce.chunk.js +0 -1
  478. package/build/users-permissions-translation-pl-json.c6a02992.chunk.js +0 -1
  479. package/build/users-permissions-translation-pt-BR-json.f6791a86.chunk.js +0 -1
  480. package/build/users-permissions-translation-pt-json.38afed04.chunk.js +0 -1
  481. package/build/users-permissions-translation-ru-json.319d51ef.chunk.js +0 -1
  482. package/build/users-permissions-translation-sk-json.ba1cd385.chunk.js +0 -1
  483. package/build/users-permissions-translation-sv-json.370d6eee.chunk.js +0 -1
  484. package/build/users-permissions-translation-th-json.68873214.chunk.js +0 -1
  485. package/build/users-permissions-translation-tr-json.9bebc250.chunk.js +0 -1
  486. package/build/users-permissions-translation-uk-json.63eaa01c.chunk.js +0 -1
  487. package/build/users-permissions-translation-vi-json.dccc02fc.chunk.js +0 -1
  488. package/build/users-permissions-translation-zh-Hans-json.c3fd301b.chunk.js +0 -1
  489. package/build/users-permissions-translation-zh-json.1fea833f.chunk.js +0 -1
  490. package/build/users-providers-settings-page.25dd858e.chunk.js +0 -1
  491. package/build/users-roles-settings-page.8482a999.chunk.js +0 -30
  492. package/build/vi-json.f7890025.chunk.js +0 -1
  493. package/build/webhook-edit-page.dcc3d145.chunk.js +0 -75
  494. package/build/webhook-list-page.894e6959.chunk.js +0 -42
  495. package/build/zh-Hans-json.21617c24.chunk.js +0 -1
  496. package/build/zh-json.2ecc6b99.chunk.js +0 -1
  497. package/ee/server/routes/features-routes.js +0 -46
@@ -0,0 +1,3 @@
1
+ last 3 major versions
2
+ Firefox ESR
3
+ last 2 Opera versions
@@ -1,45 +1,48 @@
1
- import React, { useMemo, useReducer, useRef } from 'react';
1
+ import React, { useCallback, useMemo, useReducer } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import { ConfigurationsContext } from '../../contexts';
4
4
  import reducer, { initialState } from './reducer';
5
5
 
6
6
  const ConfigurationsProvider = ({
7
7
  children,
8
- authLogo,
8
+ authLogo: defaultAuthLogo,
9
9
  menuLogo: defaultMenuLogo,
10
10
  showReleaseNotification,
11
11
  showTutorials,
12
12
  }) => {
13
- const [{ menuLogo }, dispatch] = useReducer(reducer, initialState);
13
+ const [{ menuLogo, authLogo }, dispatch] = useReducer(reducer, initialState);
14
14
 
15
- const updateProjectSettings = ({ menuLogo }) => {
16
- return dispatch({
17
- type: 'UPDATE_PROJECT_SETTINGS',
18
- values: {
19
- menuLogo: menuLogo || defaultMenuLogo,
20
- },
21
- });
22
- };
23
-
24
- const updateProjectSettingsRef = useRef(updateProjectSettings);
15
+ const updateProjectSettings = useCallback(
16
+ ({ menuLogo, authLogo }) => {
17
+ return dispatch({
18
+ type: 'UPDATE_PROJECT_SETTINGS',
19
+ values: {
20
+ menuLogo: menuLogo || defaultMenuLogo,
21
+ authLogo: authLogo || defaultAuthLogo,
22
+ },
23
+ });
24
+ },
25
+ [defaultAuthLogo, defaultMenuLogo]
26
+ );
25
27
 
26
28
  const configurationValue = useMemo(() => {
27
29
  return {
28
30
  logos: {
29
31
  menu: { custom: menuLogo, default: defaultMenuLogo },
30
- auth: { custom: null, default: authLogo },
32
+ auth: { custom: authLogo, default: defaultAuthLogo },
31
33
  },
32
- updateProjectSettings: updateProjectSettingsRef.current,
34
+ updateProjectSettings,
33
35
  showReleaseNotification,
34
36
  showTutorials,
35
37
  };
36
38
  }, [
37
- authLogo,
38
39
  menuLogo,
40
+ defaultMenuLogo,
41
+ authLogo,
42
+ defaultAuthLogo,
43
+ updateProjectSettings,
39
44
  showReleaseNotification,
40
45
  showTutorials,
41
- updateProjectSettingsRef,
42
- defaultMenuLogo,
43
46
  ]);
44
47
 
45
48
  return (
@@ -9,6 +9,7 @@ import produce from 'immer';
9
9
 
10
10
  const initialState = {
11
11
  menuLogo: null,
12
+ authLogo: null,
12
13
  };
13
14
 
14
15
  const reducer = (state = initialState, action) =>
@@ -1,11 +1,5 @@
1
1
  import { createGlobalStyle } from 'styled-components';
2
2
 
3
- const loadCss = async () => {
4
- await import(/* webpackChunkName: "cropper-css" */ 'cropperjs/dist/cropper.css');
5
- };
6
-
7
- loadCss();
8
-
9
3
  const GlobalStyle = createGlobalStyle`
10
4
  body {
11
5
  background: ${({ theme }) => theme.colors.neutral100};
@@ -8,6 +8,9 @@ import { useIntl } from 'react-intl';
8
8
 
9
9
  const LiStyled = styled.li`
10
10
  list-style: disc;
11
+ &::marker {
12
+ color: ${({ theme }) => theme.colors.neutral800};
13
+ }
11
14
  `;
12
15
 
13
16
  const Content = ({ id, defaultMessage }) => {
@@ -19,13 +22,15 @@ const Content = ({ id, defaultMessage }) => {
19
22
  { id, defaultMessage },
20
23
  {
21
24
  documentationLink: (children) => (
22
- <a
25
+ <Typography
26
+ as="a"
27
+ textColor="primary600"
23
28
  target="_blank"
24
29
  rel="noopener noreferrer"
25
30
  href="https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#api-parameters"
26
31
  >
27
32
  {children}
28
- </a>
33
+ </Typography>
29
34
  ),
30
35
  b: (children) => <Typography fontWeight="semiBold">{children}</Typography>,
31
36
  p: (children) => <Typography>{children}</Typography>,
@@ -2,7 +2,7 @@ import React, { useRef, useState } from 'react';
2
2
  import styled from 'styled-components';
3
3
  import PropTypes from 'prop-types';
4
4
  import { useIntl } from 'react-intl';
5
- import { NavLink as RouterNavLink, useLocation } from 'react-router-dom';
5
+ import { NavLink as RouterNavLink, useLocation, useHistory } from 'react-router-dom';
6
6
  import { Divider } from '@strapi/design-system/Divider';
7
7
  import {
8
8
  MainNav,
@@ -12,6 +12,7 @@ import {
12
12
  NavSection,
13
13
  NavUser,
14
14
  NavCondense,
15
+ NavFooter,
15
16
  } from '@strapi/design-system/v2/MainNav';
16
17
  import { FocusTrap } from '@strapi/design-system/FocusTrap';
17
18
  import { Box } from '@strapi/design-system/Box';
@@ -20,7 +21,8 @@ import { Stack } from '@strapi/design-system/Stack';
20
21
  import Write from '@strapi/icons/Write';
21
22
  import Exit from '@strapi/icons/Exit';
22
23
  import { auth, usePersistentState, useAppInfos, useTracking } from '@strapi/helper-plugin';
23
- import useConfigurations from '../../hooks/useConfigurations';
24
+ import { useConfigurations } from '../../hooks';
25
+ import { axiosInstance } from '../../core/utils';
24
26
 
25
27
  const LinkUserWrapper = styled(Box)`
26
28
  width: ${150 / 16}rem;
@@ -61,6 +63,7 @@ const LeftMenu = ({ generalSectionLinks, pluginsSectionLinks }) => {
61
63
  const { formatMessage } = useIntl();
62
64
  const { trackUsage } = useTracking();
63
65
  const { pathname } = useLocation();
66
+ const history = useHistory();
64
67
 
65
68
  const initials = userDisplayName
66
69
  .split(' ')
@@ -70,9 +73,11 @@ const LeftMenu = ({ generalSectionLinks, pluginsSectionLinks }) => {
70
73
 
71
74
  const handleToggleUserLinks = () => setUserLinksVisible((prev) => !prev);
72
75
 
73
- const handleLogout = () => {
76
+ const handleLogout = async () => {
77
+ await axiosInstance.post('/admin/logout');
74
78
  auth.clearAppStorage();
75
79
  handleToggleUserLinks();
80
+ history.push('/auth/login');
76
81
  };
77
82
 
78
83
  const handleBlur = (e) => {
@@ -179,57 +184,59 @@ const LeftMenu = ({ generalSectionLinks, pluginsSectionLinks }) => {
179
184
  ) : null}
180
185
  </NavSections>
181
186
 
182
- <NavUser
183
- id="main-nav-user-button"
184
- ref={buttonRef}
185
- onClick={handleToggleUserLinks}
186
- initials={initials}
187
- >
188
- {userDisplayName}
189
- </NavUser>
190
- {userLinksVisible && (
191
- <LinkUserWrapper
192
- onBlur={handleBlur}
193
- padding={1}
194
- shadow="tableShadow"
195
- background="neutral0"
196
- hasRadius
187
+ <NavFooter>
188
+ <NavUser
189
+ id="main-nav-user-button"
190
+ ref={buttonRef}
191
+ onClick={handleToggleUserLinks}
192
+ initials={initials}
197
193
  >
198
- <FocusTrap onEscape={handleToggleUserLinks}>
199
- <Stack spacing={0}>
200
- <LinkUser tabIndex={0} onClick={handleToggleUserLinks} to="/me">
201
- <Typography>
202
- {formatMessage({
203
- id: 'global.profile',
204
- defaultMessage: 'Profile',
205
- })}
206
- </Typography>
207
- </LinkUser>
208
- <LinkUser tabIndex={0} onClick={handleLogout} logout="logout" to="/auth/login">
209
- <Typography textColor="danger600">
210
- {formatMessage({
211
- id: 'app.components.LeftMenu.logout',
212
- defaultMessage: 'Logout',
213
- })}
214
- </Typography>
215
- <Exit />
216
- </LinkUser>
217
- </Stack>
218
- </FocusTrap>
219
- </LinkUserWrapper>
220
- )}
221
-
222
- <NavCondense onClick={() => setCondensed((s) => !s)}>
223
- {condensed
224
- ? formatMessage({
225
- id: 'app.components.LeftMenu.expand',
226
- defaultMessage: 'Expand the navbar',
227
- })
228
- : formatMessage({
229
- id: 'app.components.LeftMenu.collapse',
230
- defaultMessage: 'Collapse the navbar',
231
- })}
232
- </NavCondense>
194
+ {userDisplayName}
195
+ </NavUser>
196
+ {userLinksVisible && (
197
+ <LinkUserWrapper
198
+ onBlur={handleBlur}
199
+ padding={1}
200
+ shadow="tableShadow"
201
+ background="neutral0"
202
+ hasRadius
203
+ >
204
+ <FocusTrap onEscape={handleToggleUserLinks}>
205
+ <Stack spacing={0}>
206
+ <LinkUser tabIndex={0} onClick={handleToggleUserLinks} to="/me">
207
+ <Typography>
208
+ {formatMessage({
209
+ id: 'global.profile',
210
+ defaultMessage: 'Profile',
211
+ })}
212
+ </Typography>
213
+ </LinkUser>
214
+ <LinkUser tabIndex={0} onClick={handleLogout} logout="logout" to="/auth/login">
215
+ <Typography textColor="danger600">
216
+ {formatMessage({
217
+ id: 'app.components.LeftMenu.logout',
218
+ defaultMessage: 'Logout',
219
+ })}
220
+ </Typography>
221
+ <Exit />
222
+ </LinkUser>
223
+ </Stack>
224
+ </FocusTrap>
225
+ </LinkUserWrapper>
226
+ )}
227
+
228
+ <NavCondense onClick={() => setCondensed((s) => !s)}>
229
+ {condensed
230
+ ? formatMessage({
231
+ id: 'app.components.LeftMenu.expand',
232
+ defaultMessage: 'Expand the navbar',
233
+ })
234
+ : formatMessage({
235
+ id: 'app.components.LeftMenu.collapse',
236
+ defaultMessage: 'Collapse the navbar',
237
+ })}
238
+ </NavCondense>
239
+ </NavFooter>
233
240
  </MainNav>
234
241
  );
235
242
  };
@@ -6,7 +6,7 @@ import { Link } from '@strapi/design-system/v2/Link';
6
6
 
7
7
  const Notification = ({ dispatch, notification }) => {
8
8
  const { formatMessage } = useIntl();
9
- const { message, link, type, id, onClose, timeout, blockTransition } = notification;
9
+ const { message, link, type, id, onClose, timeout, blockTransition, title } = notification;
10
10
 
11
11
  const formattedMessage = (msg) =>
12
12
  typeof msg === 'string' ? msg : formatMessage(msg, msg.values);
@@ -37,6 +37,7 @@ const Notification = ({ dispatch, notification }) => {
37
37
  let variant;
38
38
  let alertTitle;
39
39
 
40
+ // TODO break out this logic into separate file
40
41
  if (type === 'info') {
41
42
  variant = 'default';
42
43
  alertTitle = formatMessage({
@@ -44,17 +45,29 @@ const Notification = ({ dispatch, notification }) => {
44
45
  defaultMessage: 'Information:',
45
46
  });
46
47
  } else if (type === 'warning') {
48
+ // type should be renamed to danger in the future, but it might introduce changes if done now
49
+ variant = 'danger';
50
+ alertTitle = formatMessage({
51
+ id: 'notification.warning.title',
52
+ defaultMessage: 'Warning:',
53
+ });
54
+ } else if (type === 'softWarning') {
55
+ // type should be renamed to just warning in the future
56
+ variant = 'warning';
47
57
  alertTitle = formatMessage({
48
58
  id: 'notification.warning.title',
49
59
  defaultMessage: 'Warning:',
50
60
  });
51
- variant = 'danger';
52
61
  } else {
62
+ variant = 'success';
53
63
  alertTitle = formatMessage({
54
64
  id: 'notification.success.title',
55
65
  defaultMessage: 'Success:',
56
66
  });
57
- variant = 'success';
67
+ }
68
+
69
+ if (title) {
70
+ alertTitle = typeof title === 'string' ? title : formatMessage(title);
58
71
  }
59
72
 
60
73
  return (
@@ -77,6 +90,7 @@ const Notification = ({ dispatch, notification }) => {
77
90
  {formattedMessage({
78
91
  id: message?.id || message,
79
92
  defaultMessage: message?.defaultMessage || message?.id || message,
93
+ values: message?.values,
80
94
  })}
81
95
  </Alert>
82
96
  );
@@ -124,6 +138,14 @@ Notification.propTypes = {
124
138
  onClose: PropTypes.func,
125
139
  timeout: PropTypes.number,
126
140
  blockTransition: PropTypes.bool,
141
+ title: PropTypes.oneOfType([
142
+ PropTypes.string,
143
+ PropTypes.shape({
144
+ id: PropTypes.string.isRequired,
145
+ defaultMessage: PropTypes.string,
146
+ values: PropTypes.object,
147
+ }),
148
+ ]),
127
149
  }),
128
150
  };
129
151
 
@@ -23,6 +23,7 @@ const notificationReducer = (state = initialState, action) =>
23
23
  timeout: get(action, ['config', 'timeout'], 2500),
24
24
  blockTransition: get(action, ['config', 'blockTransition'], false),
25
25
  onClose: get(action, ['config', 'onClose'], null),
26
+ title: get(action, ['config', 'title'], null),
26
27
  });
27
28
  draftState.notifId = state.notifId + 1;
28
29
  break;
@@ -11,7 +11,7 @@ const Logo = () => {
11
11
  logos: { auth },
12
12
  } = useConfigurations();
13
13
 
14
- return <Img src={auth.default} aria-hidden alt="" />;
14
+ return <Img src={auth?.custom ?? auth.default} aria-hidden alt="" />;
15
15
  };
16
16
 
17
17
  export default Logo;
@@ -43,12 +43,14 @@ export const RelationDragPreview = ({ status, displayedValue, width }) => {
43
43
  <IconButton noBorder>
44
44
  <Drag />
45
45
  </IconButton>
46
- <ChildrenWrapper justifyContent="space-between">
47
- <LinkEllipsis minWidth={0} paddingTop={1} paddingBottom={1} paddingRight={4}>
48
- <Typography textColor="primary600" ellipsis>
49
- {displayedValue}
50
- </Typography>
51
- </LinkEllipsis>
46
+ <ChildrenWrapper maxWidth="100%" justifyContent="space-between">
47
+ <Box minWidth={0} paddingTop={1} paddingBottom={1} paddingRight={4}>
48
+ <LinkEllipsis>
49
+ <Typography textColor="primary600" ellipsis>
50
+ {displayedValue}
51
+ </Typography>
52
+ </LinkEllipsis>
53
+ </Box>
52
54
  {status && (
53
55
  <Status variant={statusColor} showBullet={false} size="S">
54
56
  <Typography fontWeight="bold" textColor={`${statusColor}700`}>
@@ -65,6 +65,10 @@ const RelationMultiple = ({ fieldSchema, metadatas, name, entityId, value, conte
65
65
  {
66
66
  enabled: isOpen,
67
67
  staleTime: 0,
68
+ select: (data) => ({
69
+ ...data,
70
+ results: data.results.reverse(),
71
+ }),
68
72
  }
69
73
  );
70
74
 
@@ -98,7 +98,7 @@ const DynamicZoneComponent = ({
98
98
 
99
99
  const mainField = get(modifiedData, [name, index, mainFieldKey]) ?? '';
100
100
 
101
- const displayedValue = mainFieldKey === 'id' ? '' : mainField.trim();
101
+ const displayedValue = mainFieldKey === 'id' ? '' : String(mainField).trim();
102
102
 
103
103
  const mainValue = displayedValue.length > 0 ? ` - ${displayedValue}` : displayedValue;
104
104
 
@@ -21,7 +21,7 @@ import {
21
21
  getAPIInnerErrors,
22
22
  } from '@strapi/helper-plugin';
23
23
 
24
- import { getTrad, removeKeyInObject } from '../../utils';
24
+ import { getTrad } from '../../utils';
25
25
 
26
26
  import selectCrudReducer from '../../sharedReducers/crudReducer/selectors';
27
27
 
@@ -261,10 +261,11 @@ const EditViewDataManagerProvider = ({
261
261
  });
262
262
  }, []);
263
263
 
264
- const relationLoad = useCallback(({ target: { name, value } }) => {
264
+ const relationLoad = useCallback(({ target: { initialDataPath, modifiedDataPath, value } }) => {
265
265
  dispatch({
266
266
  type: 'LOAD_RELATION',
267
- keys: name.split('.'),
267
+ modifiedDataPath,
268
+ initialDataPath,
268
269
  value,
269
270
  });
270
271
  }, []);
@@ -360,11 +361,9 @@ const EditViewDataManagerProvider = ({
360
361
 
361
362
  const createFormData = useCallback(
362
363
  (modifiedData, initialData) => {
363
- // First we need to remove the added keys needed for the dnd
364
- const preparedData = removeKeyInObject(cloneDeep(modifiedData), '__temp_key__');
365
364
  // Then we need to apply our helper
366
365
  const cleanedData = cleanData(
367
- { browserState: preparedData, serverState: initialData },
366
+ { browserState: modifiedData, serverState: initialData },
368
367
  currentContentTypeLayout,
369
368
  allLayoutData.components
370
369
  );
@@ -6,6 +6,8 @@ import take from 'lodash/take';
6
6
  import cloneDeep from 'lodash/cloneDeep';
7
7
  import uniqBy from 'lodash/uniqBy';
8
8
  import merge from 'lodash/merge';
9
+ import castArray from 'lodash/castArray';
10
+ import isNil from 'lodash/isNil';
9
11
 
10
12
  import {
11
13
  findLeafByPathAndReplace,
@@ -148,22 +150,33 @@ const reducer = (state, action) =>
148
150
  break;
149
151
  }
150
152
  case 'LOAD_RELATION': {
151
- const initialDataPath = ['initialData', ...action.keys];
152
- const modifiedDataPath = ['modifiedData', ...action.keys];
153
- const { value } = action;
153
+ const { initialDataPath, modifiedDataPath, value } = action;
154
154
 
155
155
  const initialDataRelations = get(state, initialDataPath);
156
156
  const modifiedDataRelations = get(state, modifiedDataPath);
157
157
 
158
- set(draftState, initialDataPath, uniqBy([...value, ...initialDataRelations], 'id'));
158
+ /**
159
+ * Check if the values we're loading are already in initial
160
+ * data if they are then we don't need to load them at all
161
+ */
162
+ const valuesToLoad = value.filter((relation) => {
163
+ return !initialDataRelations.some((initialDataRelation) => {
164
+ return initialDataRelation.id === relation.id;
165
+ });
166
+ });
167
+
168
+ set(draftState, initialDataPath, uniqBy([...valuesToLoad, ...initialDataRelations], 'id'));
159
169
 
160
170
  /**
161
171
  * We need to set the value also on modifiedData, because initialData
162
172
  * and modifiedData need to stay in sync, so that the CM can compare
163
173
  * both states, to render the dirty UI state
164
174
  */
165
-
166
- set(draftState, modifiedDataPath, uniqBy([...value, ...modifiedDataRelations], 'id'));
175
+ set(
176
+ draftState,
177
+ modifiedDataPath,
178
+ uniqBy([...valuesToLoad, ...modifiedDataRelations], 'id')
179
+ );
167
180
 
168
181
  break;
169
182
  }
@@ -247,6 +260,17 @@ const reducer = (state, action) =>
247
260
  .reduce((acc, currentPaths) => {
248
261
  const [componentName] = currentPaths;
249
262
 
263
+ const existingComponents = castArray(acc[componentName] || []);
264
+ existingComponents.reduce((result, currentEntry) => {
265
+ if (!isNil(get(currentEntry, [`__temp_key__`]))) {
266
+ return result;
267
+ }
268
+
269
+ set(currentEntry, [`__temp_key__`], getMaxTempKey(result) + 1);
270
+
271
+ return result;
272
+ }, existingComponents);
273
+
250
274
  if (state.modifiedData && get(state.modifiedData, componentName)) {
251
275
  /**
252
276
  * this will be null on initial load, however subsequent calls
@@ -1,6 +1,7 @@
1
1
  import get from 'lodash/get';
2
2
  import isArray from 'lodash/isArray';
3
3
  import isObject from 'lodash/isObject';
4
+ import { getInitialDataPathUsingTempKeys } from '../../../utils/paths';
4
5
 
5
6
  /* eslint-disable indent */
6
7
 
@@ -12,6 +13,8 @@ import isObject from 'lodash/isObject';
12
13
  * @returns
13
14
  */
14
15
  const cleanData = ({ browserState, serverState }, currentSchema, componentsSchema) => {
16
+ const rootServerState = serverState;
17
+ const rootBrowserState = browserState;
15
18
  const getType = (schema, attrName) => get(schema, ['attributes', attrName, 'type'], '');
16
19
  const getOtherInfos = (schema, arr) => get(schema, ['attributes', ...arr], '');
17
20
 
@@ -20,10 +23,12 @@ const cleanData = ({ browserState, serverState }, currentSchema, componentsSchem
20
23
  * @param {object} browserState – the modifiedData from REDUX
21
24
  * @param {object} serverState – the initialData from REDUX
22
25
  * @param {*} schema
26
+ * @param {string} pathToParent - the path to the parent of the current entry
23
27
  * @returns
24
28
  */
25
- const recursiveCleanData = (browserState, serverState, schema) => {
29
+ const recursiveCleanData = (browserState, serverState, schema, pathToParent) => {
26
30
  return Object.keys(browserState).reduce((acc, current) => {
31
+ const path = pathToParent ? `${pathToParent}.${current}` : current;
27
32
  const attrType = getType(schema, current);
28
33
 
29
34
  // This is the field value
@@ -61,7 +66,8 @@ const cleanData = ({ browserState, serverState }, currentSchema, componentsSchem
61
66
  const subCleanedData = recursiveCleanData(
62
67
  data,
63
68
  (oldValue ?? [])[index],
64
- componentsSchema[component]
69
+ componentsSchema[component],
70
+ `${path}.${index}`
65
71
  );
66
72
 
67
73
  return subCleanedData;
@@ -69,20 +75,25 @@ const cleanData = ({ browserState, serverState }, currentSchema, componentsSchem
69
75
  : value;
70
76
  } else {
71
77
  cleanedData = value
72
- ? recursiveCleanData(value, oldValue, componentsSchema[component])
78
+ ? recursiveCleanData(value, oldValue, componentsSchema[component], path)
73
79
  : value;
74
80
  }
75
81
 
76
82
  break;
77
83
 
78
84
  case 'relation': {
85
+ const trueInitialDataPath = getInitialDataPathUsingTempKeys(
86
+ rootServerState,
87
+ rootBrowserState
88
+ )(path).join('.');
89
+
79
90
  /**
80
91
  * Because of how repeatable components work when you dig into them the server
81
92
  * will have no object to compare too therefore no relation array will be setup
82
93
  * because the component has not been initialised, therefore we can safely assume
83
94
  * it needs to be added and provide a default empty array.
84
95
  */
85
- let actualOldValue = oldValue ?? [];
96
+ let actualOldValue = get(rootServerState, trueInitialDataPath, []);
86
97
 
87
98
  const valuesWithPositions = value.map((relation, index, allRelations) => {
88
99
  const nextRelation = allRelations[index + 1];
@@ -141,7 +152,8 @@ const cleanData = ({ browserState, serverState }, currentSchema, componentsSchem
141
152
  const subCleanedData = recursiveCleanData(
142
153
  componentData,
143
154
  (oldValue ?? [])[index],
144
- componentsSchema[componentData.__component]
155
+ componentsSchema[componentData.__component],
156
+ `${path}.${index}`
145
157
  );
146
158
 
147
159
  return subCleanedData;
@@ -157,7 +169,7 @@ const cleanData = ({ browserState, serverState }, currentSchema, componentsSchem
157
169
  }, {});
158
170
  };
159
171
 
160
- return recursiveCleanData(browserState, serverState, currentSchema);
172
+ return recursiveCleanData(browserState, serverState, currentSchema, '');
161
173
  };
162
174
 
163
175
  // TODO: check which parts are still needed: I suspect the
@@ -24,7 +24,8 @@ export const findLeafByPathAndReplace = (endpath, replaceWith) => {
24
24
  * and the current path is not undefined in the accumulator
25
25
  * then we assume it's a leaf and we can replace it.
26
26
  */
27
- if (endpath === curr && acc[curr] !== undefined) {
27
+
28
+ if (ind === currentArr.length - 1 && endpath === curr && acc[curr] !== undefined) {
28
29
  set(acc, curr, replaceWith);
29
30
 
30
31
  return acc;
@@ -284,7 +284,8 @@ const createYupSchemaAttribute = (type, validations, options) => {
284
284
  }
285
285
 
286
286
  if (type === 'boolean') {
287
- return value !== null;
287
+ // Boolean value can be undefined/unset in modifiedData when generated in a new component
288
+ return value !== null && value !== undefined;
288
289
  }
289
290
 
290
291
  if (type === 'date' || type === 'datetime') {
@@ -4,20 +4,22 @@ import PropTypes from 'prop-types';
4
4
  import size from 'lodash/size';
5
5
  import isEqual from 'react-fast-compare';
6
6
  import { useIntl } from 'react-intl';
7
+
7
8
  import { NotAllowedInput } from '@strapi/helper-plugin';
8
9
  import Trash from '@strapi/icons/Trash';
9
10
  import { Box } from '@strapi/design-system/Box';
10
11
  import { IconButton } from '@strapi/design-system/IconButton';
11
12
  import { Flex } from '@strapi/design-system/Flex';
12
13
  import { Stack } from '@strapi/design-system/Stack';
13
- import { getTrad } from '../../utils';
14
- import ComponentInitializer from '../ComponentInitializer';
15
- import NonRepeatableComponent from '../NonRepeatableComponent';
16
- import RepeatableComponent from '../RepeatableComponent';
14
+
17
15
  import connect from './utils/connect';
18
16
  import select from './utils/select';
19
17
  import Label from './Label';
18
+ import ComponentInitializer from '../ComponentInitializer';
19
+ import NonRepeatableComponent from '../NonRepeatableComponent';
20
+ import RepeatableComponent from '../RepeatableComponent';
20
21
  import { useContentTypeLayout } from '../../hooks';
22
+ import { getTrad } from '../../utils';
21
23
 
22
24
  const FieldComponent = ({
23
25
  addNonRepeatableComponentToField,