@strapi/admin 4.5.0-alpha.0 → 4.5.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 (317) hide show
  1. package/admin/src/StrapiApp.js +21 -18
  2. package/admin/src/assets/images/hot-air-balloon.png +0 -0
  3. package/admin/src/assets/images/icon_offline-cloud.svg +3 -3
  4. package/admin/src/assets/images/logo-strapi-2022.svg +7 -0
  5. package/admin/src/assets/images/upgrade-details.png +0 -0
  6. package/admin/src/components/Providers/index.js +14 -10
  7. package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +24 -0
  8. package/admin/src/content-manager/components/DynamicTable/CellContent/CellValue.js +1 -1
  9. package/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js +5 -4
  10. package/admin/src/content-manager/components/DynamicTable/CellContent/index.js +10 -0
  11. package/admin/src/content-manager/components/DynamicTable/TableRows/index.js +20 -15
  12. package/admin/src/content-manager/components/DynamicTable/index.js +21 -4
  13. package/admin/src/content-manager/components/DynamicZone/components/Component/index.js +19 -9
  14. package/admin/src/content-manager/components/DynamicZone/index.js +6 -2
  15. package/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +153 -63
  16. package/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +180 -132
  17. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js +70 -16
  18. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/findLeafByPathAndReplace.js +52 -0
  19. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js +2 -0
  20. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/recursivelyFindPathsBasedOnCondition.js +72 -0
  21. package/admin/src/content-manager/components/FieldComponent/index.js +9 -2
  22. package/admin/src/content-manager/components/FieldTypeIcon/index.js +31 -1
  23. package/admin/src/content-manager/components/Inputs/index.js +36 -14
  24. package/admin/src/content-manager/components/NonRepeatableComponent/index.js +2 -0
  25. package/admin/src/content-manager/components/PreviewWysiwyg/index.js +1 -1
  26. package/admin/src/content-manager/components/RelationInput/RelationInput.js +163 -96
  27. package/admin/src/content-manager/components/RelationInput/components/RelationItem.js +2 -2
  28. package/admin/src/content-manager/components/RelationInput/constants.js +1 -1
  29. package/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +116 -73
  30. package/admin/src/content-manager/components/RelationInputDataManager/utils/diffRelations.js +24 -0
  31. package/admin/src/content-manager/components/RelationInputDataManager/utils/index.js +3 -1
  32. package/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js +17 -31
  33. package/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeSearchResults.js +16 -0
  34. package/admin/src/content-manager/components/RelationInputDataManager/utils/select.js +35 -11
  35. package/admin/src/content-manager/components/RepeatableComponent/DraggedItem/index.js +5 -0
  36. package/admin/src/content-manager/components/RepeatableComponent/index.js +4 -3
  37. package/admin/src/content-manager/components/SingleTypeFormWrapper/index.js +23 -0
  38. package/admin/src/content-manager/hooks/__test__/usePrev.test.js +26 -0
  39. package/admin/src/content-manager/hooks/index.js +1 -0
  40. package/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/formatLayouts.js +19 -48
  41. package/admin/src/content-manager/hooks/usePrev.js +14 -0
  42. package/admin/src/content-manager/hooks/useRelation/useRelation.js +116 -15
  43. package/admin/src/content-manager/pages/App/reducer.js +3 -0
  44. package/admin/src/content-manager/pages/EditSettingsView/components/FormModal.js +7 -2
  45. package/admin/src/content-manager/pages/EditSettingsView/index.js +2 -1
  46. package/admin/src/content-manager/pages/EditView/Header/index.js +118 -50
  47. package/admin/src/content-manager/pages/EditView/Header/utils/select.js +4 -0
  48. package/admin/src/content-manager/pages/EditView/index.js +102 -93
  49. package/admin/src/content-manager/pages/ListSettingsView/components/DraggableCard.js +3 -3
  50. package/admin/src/content-manager/pages/ListSettingsView/components/Settings.js +2 -2
  51. package/admin/src/content-manager/pages/ListSettingsView/components/SortDisplayedFields.js +1 -1
  52. package/admin/src/content-manager/pages/ListView/index.js +24 -15
  53. package/admin/src/content-manager/pages/ListView/utils/buildQueryString.js +14 -2
  54. package/admin/src/contexts/ApiTokenPermissions/index.js +24 -0
  55. package/admin/src/core/apis/CustomFields.js +79 -0
  56. package/admin/src/core/apis/index.js +1 -0
  57. package/admin/src/core/store/configureStore.js +17 -2
  58. package/admin/src/favicon.png +0 -0
  59. package/admin/src/hooks/index.js +1 -0
  60. package/admin/src/hooks/useFetchMarketplacePlugins/index.js +2 -2
  61. package/admin/src/hooks/useFetchMarketplacePlugins/utils/api.js +4 -2
  62. package/admin/src/hooks/useFetchMarketplaceProviders/index.js +3 -3
  63. package/admin/src/hooks/useFetchMarketplaceProviders/utils/api.js +5 -3
  64. package/admin/src/hooks/useRegenerate/index.js +34 -0
  65. package/admin/src/index.js +1 -0
  66. package/admin/src/pages/App/index.js +1 -1
  67. package/admin/src/pages/HomePage/SocialLinks.js +1 -1
  68. package/admin/src/pages/HomePage/assets/corner-ornament.svg +48 -0
  69. package/admin/src/pages/HomePage/index.js +3 -2
  70. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/CardButton.js +110 -0
  71. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/InstallPluginButton.js +32 -21
  72. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/PackageStats.js +79 -0
  73. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/index.js +28 -11
  74. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FilterSelect.js +41 -0
  75. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FiltersPopover.js +96 -0
  76. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/index.js +106 -0
  77. package/admin/src/pages/MarketplacePage/components/NpmPackagesGrid/index.js +4 -0
  78. package/admin/src/pages/MarketplacePage/components/SortSelect/index.js +70 -0
  79. package/admin/src/pages/MarketplacePage/index.js +68 -8
  80. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ActionBoundRoutes/index.js +56 -0
  81. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/getMethodColor.js +41 -0
  82. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/index.js +72 -0
  83. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/CheckBoxWrapper.js +30 -0
  84. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +150 -0
  85. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ContenTypesSection/index.js +37 -0
  86. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js +255 -0
  87. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormBody/index.js +78 -0
  88. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormHead/index.js +89 -0
  89. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Permissions/index.js +40 -0
  90. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +68 -0
  91. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +216 -197
  92. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/init.js +13 -0
  93. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/reducer.js +72 -0
  94. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/getDateOfExpiration.js +16 -0
  95. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/index.js +5 -0
  96. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/schema.js +2 -1
  97. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/transformPermissionsData.js +36 -0
  98. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/DefaultButton/index.js +63 -0
  99. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/DeleteButton/index.js +1 -0
  100. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/ReadButton/index.js +19 -0
  101. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/UpdateButton/index.js +3 -36
  102. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/index.js +13 -11
  103. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js +3 -2
  104. package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/utils/tableHeaders.js +8 -8
  105. package/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedEditView/index.js +1 -1
  106. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/index.js +7 -38
  107. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/options.js +31 -0
  108. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/index.js +32 -43
  109. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/index.js +1 -1
  110. package/admin/src/pages/SettingsPage/pages/Roles/ListPage/components/RoleRow/index.js +3 -1
  111. package/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js +2 -1
  112. package/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/index.js +2 -2
  113. package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/EventInput/index.js +2 -2
  114. package/admin/src/permissions/defaultPermissions.js +2 -6
  115. package/admin/src/translations/ca.json +4 -2
  116. package/admin/src/translations/de.json +5 -2
  117. package/admin/src/translations/dk.json +4 -1
  118. package/admin/src/translations/en.json +38 -3
  119. package/admin/src/translations/es.json +157 -158
  120. package/admin/src/translations/fr.json +4 -1
  121. package/admin/src/translations/gu.json +608 -606
  122. package/admin/src/translations/he.json +1 -1
  123. package/admin/src/translations/hi.json +689 -687
  124. package/admin/src/translations/hu.json +3 -1
  125. package/admin/src/translations/id.json +3 -1
  126. package/admin/src/translations/it.json +3 -1
  127. package/admin/src/translations/ja.json +3 -1
  128. package/admin/src/translations/ko.json +3 -1
  129. package/admin/src/translations/ml.json +689 -687
  130. package/admin/src/translations/nl.json +4 -1
  131. package/admin/src/translations/no.json +1 -1
  132. package/admin/src/translations/pl.json +3 -1
  133. package/admin/src/translations/pt-BR.json +4 -1
  134. package/admin/src/translations/ru.json +489 -491
  135. package/admin/src/translations/sa.json +86 -83
  136. package/admin/src/translations/sk.json +4 -1
  137. package/admin/src/translations/sv.json +4 -1
  138. package/admin/src/translations/th.json +1 -1
  139. package/admin/src/translations/zh-Hans.json +5 -2
  140. package/admin/src/translations/zh.json +4 -1
  141. package/build/1856.172d5fa0.chunk.js +174 -0
  142. package/build/2077.058590f4.chunk.js +206 -0
  143. package/build/2912.2c42c07b.chunk.js +259 -0
  144. package/build/4318.5e670740.chunk.js +30 -0
  145. package/build/4715.22747b59.chunk.js +387 -0
  146. package/build/{4800.d09f1225.chunk.js → 4800.a6935af6.chunk.js} +1 -1
  147. package/build/4982.1b75ddb1.chunk.js +325 -0
  148. package/build/617f9c948fa79e6d73bd.png +0 -0
  149. package/build/6d21938306785f176538.png +0 -0
  150. package/build/70674f63fc3904c20de0.svg +7 -0
  151. package/build/7379.d246dd38.chunk.js +1 -0
  152. package/build/7692.a36fb2c2.chunk.js +470 -0
  153. package/build/7841.c50e9509.chunk.js +259 -0
  154. package/build/7866.ba215f99.chunk.js +505 -0
  155. package/build/7e9af4fb7e723fcebf1f.svg +48 -0
  156. package/build/8380.e53e7207.chunk.js +299 -0
  157. package/build/8549.832ed79d.chunk.js +159 -0
  158. package/build/8738.0fe8a61e.chunk.js +463 -0
  159. package/build/{9066.08049eb1.chunk.js → 9066.eaf76ff3.chunk.js} +5 -5
  160. package/build/{9166.037339e0.chunk.js → 9166.90876521.chunk.js} +16 -15
  161. package/build/{9420.43a86e7c.chunk.js → 9420.5292d1d2.chunk.js} +38 -37
  162. package/build/9649.468667d9.chunk.js +199 -0
  163. package/build/9d5d788027e86620c234.svg +5 -0
  164. package/build/{Admin-authenticatedApp.e39f36c9.chunk.js → Admin-authenticatedApp.c4f68103.chunk.js} +3 -3
  165. package/build/{Admin_homePage.118926e0.chunk.js → Admin_homePage.26d32e30.chunk.js} +6 -5
  166. package/build/Admin_marketplace.32375885.chunk.js +22 -0
  167. package/build/{Admin_profilePage.9d50ac44.chunk.js → Admin_profilePage.da32abbc.chunk.js} +1 -1
  168. package/build/Admin_settingsPage.bf2234e1.chunk.js +178 -0
  169. package/build/admin-app.9049056c.chunk.js +112 -0
  170. package/build/admin-edit-roles-page.69d9fcb2.chunk.js +1 -0
  171. package/build/{admin-users.97a08630.chunk.js → admin-users.d71f198a.chunk.js} +3 -3
  172. package/build/api-tokens-create-page.93dd0689.chunk.js +1 -0
  173. package/build/api-tokens-edit-page.b0adac81.chunk.js +1 -0
  174. package/build/api-tokens-list-page.bb36535f.chunk.js +16 -0
  175. package/build/ca-json.07ae0f2c.chunk.js +1 -0
  176. package/build/content-manager.ff998bed.chunk.js +1204 -0
  177. package/build/content-type-builder-list-view.5b3cd768.chunk.js +194 -0
  178. package/build/content-type-builder-translation-en-json.f985c9c4.chunk.js +1 -0
  179. package/build/content-type-builder-translation-sv-json.6deff030.chunk.js +1 -0
  180. package/build/content-type-builder.16af63a6.chunk.js +145 -0
  181. package/build/de-json.6b3e1894.chunk.js +1 -0
  182. package/build/dk-json.144c6a8e.chunk.js +1 -0
  183. package/build/{email-settings-page.64037147.chunk.js → email-settings-page.c3469093.chunk.js} +6 -6
  184. package/build/en-json.4a269f6b.chunk.js +1 -0
  185. package/build/es-json.6d123a82.chunk.js +1 -0
  186. package/build/fr-json.28ab54cb.chunk.js +1 -0
  187. package/build/gu-json.9a50ea64.chunk.js +1 -0
  188. package/build/he-json.72f18790.chunk.js +1 -0
  189. package/build/hi-json.0301b7ba.chunk.js +1 -0
  190. package/build/hu-json.c4b641bb.chunk.js +1 -0
  191. package/build/{i18n-settings-page.0b73785d.chunk.js → i18n-settings-page.46d894ff.chunk.js} +5 -5
  192. package/build/id-json.86035797.chunk.js +1 -0
  193. package/build/index.html +1 -1
  194. package/build/it-json.bbdc8993.chunk.js +1 -0
  195. package/build/ja-json.1c9eeeec.chunk.js +1 -0
  196. package/build/ko-json.e1f66398.chunk.js +1 -0
  197. package/build/main.91328e7a.js +9381 -0
  198. package/build/ml-json.963c889f.chunk.js +1 -0
  199. package/build/nl-json.2b8cc3a0.chunk.js +1 -0
  200. package/build/no-json.a58c28bd.chunk.js +1 -0
  201. package/build/pl-json.249626b3.chunk.js +1 -0
  202. package/build/pt-BR-json.7852f808.chunk.js +1 -0
  203. package/build/ru-json.d7cfc2ff.chunk.js +1 -0
  204. package/build/runtime~main.c9c319c0.js +2 -0
  205. package/build/sa-json.44e95991.chunk.js +1 -0
  206. package/build/sk-json.7ba4b330.chunk.js +1 -0
  207. package/build/sso-settings-page.9ceb0140.chunk.js +1 -0
  208. package/build/sv-json.8e5a7911.chunk.js +1 -0
  209. package/build/th-json.a67309b1.chunk.js +1 -0
  210. package/build/{upload-settings.80ff0974.chunk.js → upload-settings.53b690f3.chunk.js} +5 -5
  211. package/build/{upload-translation-en-json.004a86c1.chunk.js → upload-translation-en-json.86da7b0a.chunk.js} +1 -1
  212. package/build/{users-advanced-settings-page.a02f4806.chunk.js → users-advanced-settings-page.3f4ee86e.chunk.js} +5 -5
  213. package/build/{webhook-edit-page.d2ea3351.chunk.js → webhook-edit-page.dc9442ce.chunk.js} +2 -2
  214. package/build/webhook-list-page.02191138.chunk.js +134 -0
  215. package/build/zh-Hans-json.21617c24.chunk.js +1 -0
  216. package/build/zh-json.608aaf24.chunk.js +1 -0
  217. package/ee/admin/pages/SettingsPage/pages/Roles/ListPage/index.js +3 -2
  218. package/ee/server/controllers/user.js +5 -3
  219. package/env.js +1 -0
  220. package/package.json +13 -11
  221. package/scripts/build.js +11 -0
  222. package/server/bootstrap.js +19 -1
  223. package/server/config/admin-actions.js +20 -0
  224. package/server/content-types/api-token-permission.js +36 -0
  225. package/server/content-types/api-token.js +25 -1
  226. package/server/content-types/index.js +1 -0
  227. package/server/controllers/admin.js +3 -0
  228. package/server/controllers/api-token.js +24 -1
  229. package/server/controllers/content-api.js +15 -0
  230. package/server/controllers/index.js +1 -0
  231. package/server/controllers/user.js +3 -2
  232. package/server/routes/api-tokens.js +11 -0
  233. package/server/routes/content-api.js +20 -0
  234. package/server/routes/index.js +2 -0
  235. package/server/services/api-token.js +309 -29
  236. package/server/services/constants.js +10 -0
  237. package/server/services/permission/engine.js +36 -226
  238. package/server/services/permission.js +4 -1
  239. package/server/strategies/admin.js +7 -1
  240. package/server/strategies/api-token.js +72 -11
  241. package/server/validation/api-tokens.js +12 -2
  242. package/utils/create-plugins-exclude-path.js +40 -0
  243. package/utils/get-custom-app-config-file.js +5 -0
  244. package/webpack.alias.js +0 -13
  245. package/webpack.config.js +4 -1
  246. package/admin/src/assets/images/banner_strapi-rocket.png +0 -0
  247. package/admin/src/assets/images/big-logo-home.png +0 -0
  248. package/admin/src/assets/images/homepage-logo.png +0 -0
  249. package/admin/src/assets/images/icon_made-by-strapi.svg +0 -5
  250. package/admin/src/assets/images/logo_strapi_auth.png +0 -0
  251. package/admin/src/assets/images/logo_strapi_auth_v4.png +0 -0
  252. package/admin/src/assets/images/logo_strapi_menu.png +0 -0
  253. package/admin/src/assets/images/oops.png +0 -0
  254. package/admin/src/content-manager/components/State/index.js +0 -37
  255. package/admin/src/favicon.ico +0 -0
  256. package/build/15026a3d58aeb2828134.png +0 -0
  257. package/build/1856.47226450.chunk.js +0 -173
  258. package/build/2077.c935ee42.chunk.js +0 -205
  259. package/build/2912.a015078a.chunk.js +0 -258
  260. package/build/4715.58cd558f.chunk.js +0 -387
  261. package/build/4982.05eda880.chunk.js +0 -324
  262. package/build/7098.40dcd7bf.chunk.js +0 -1
  263. package/build/7841.91f793dc.chunk.js +0 -258
  264. package/build/7866.1201afbd.chunk.js +0 -504
  265. package/build/8380.8789ff76.chunk.js +0 -284
  266. package/build/8549.133c4473.chunk.js +0 -158
  267. package/build/8851.e4ac62f2.chunk.js +0 -158
  268. package/build/90f49a385afb000fb1d4.svg +0 -5
  269. package/build/9311.7cc03f29.chunk.js +0 -508
  270. package/build/Admin_marketplace.82c0570b.chunk.js +0 -11
  271. package/build/Admin_settingsPage.98a711e5.chunk.js +0 -178
  272. package/build/a6b842e0b6d2b61135d1.svg +0 -5
  273. package/build/admin-app.4f7618a9.chunk.js +0 -112
  274. package/build/admin-edit-roles-page.554ba3fa.chunk.js +0 -1
  275. package/build/api-tokens-create-page.4c262d6e.chunk.js +0 -1
  276. package/build/api-tokens-edit-page.10a9d368.chunk.js +0 -1
  277. package/build/api-tokens-list-page.442c9f3c.chunk.js +0 -15
  278. package/build/b997a22a2e0b87ef1fa2.ico +0 -0
  279. package/build/bd81ba6c07827282255d.png +0 -0
  280. package/build/c3de6118ef47086ad05c.png +0 -0
  281. package/build/ca-json.a16899ae.chunk.js +0 -1
  282. package/build/content-manager.7d57c9d1.chunk.js +0 -1200
  283. package/build/content-type-builder-list-view.8cc534e0.chunk.js +0 -194
  284. package/build/content-type-builder-translation-en-json.201bfb78.chunk.js +0 -1
  285. package/build/content-type-builder.684df7a4.chunk.js +0 -142
  286. package/build/de-json.aa6026b3.chunk.js +0 -1
  287. package/build/dk-json.fac2bcfb.chunk.js +0 -1
  288. package/build/en-json.0c69c7d7.chunk.js +0 -1
  289. package/build/es-json.d672e181.chunk.js +0 -1
  290. package/build/fb376b132d18bf4522ca.png +0 -0
  291. package/build/fde9b1ad0670d29a2516.png +0 -0
  292. package/build/fr-json.71a16175.chunk.js +0 -1
  293. package/build/gu-json.ca345cd1.chunk.js +0 -1
  294. package/build/he-json.3b825d80.chunk.js +0 -1
  295. package/build/hi-json.50c7e6d4.chunk.js +0 -1
  296. package/build/hu-json.e0521dcc.chunk.js +0 -1
  297. package/build/id-json.4b1ff8d6.chunk.js +0 -1
  298. package/build/it-json.86bac220.chunk.js +0 -1
  299. package/build/ja-json.4e44e36b.chunk.js +0 -1
  300. package/build/ko-json.1003756e.chunk.js +0 -1
  301. package/build/main.b47db1a3.js +0 -9337
  302. package/build/ml-json.c7774425.chunk.js +0 -1
  303. package/build/nl-json.f58ea235.chunk.js +0 -1
  304. package/build/no-json.40386397.chunk.js +0 -1
  305. package/build/pl-json.fed96aba.chunk.js +0 -1
  306. package/build/pt-BR-json.073799ab.chunk.js +0 -1
  307. package/build/ru-json.7ad2cbbf.chunk.js +0 -1
  308. package/build/runtime~main.feeac6d3.js +0 -2
  309. package/build/sa-json.f0f704f0.chunk.js +0 -1
  310. package/build/sk-json.a848961b.chunk.js +0 -1
  311. package/build/sso-settings-page.445184e0.chunk.js +0 -1
  312. package/build/sv-json.b038acbe.chunk.js +0 -1
  313. package/build/th-json.72e8de3d.chunk.js +0 -1
  314. package/build/webhook-list-page.2775a683.chunk.js +0 -134
  315. package/build/zh-Hans-json.03d2bda1.chunk.js +0 -1
  316. package/build/zh-json.3d0cc664.chunk.js +0 -1
  317. package/server/services/permission/engine-hooks.js +0 -82
@@ -1,3 +1,4 @@
1
+ /* eslint-disable react/jsx-no-constructed-context-values */
1
2
  import React, { useCallback, useEffect, useMemo, useRef, useReducer } from 'react';
2
3
  import isEmpty from 'lodash/isEmpty';
3
4
  import cloneDeep from 'lodash/cloneDeep';
@@ -20,7 +21,7 @@ import {
20
21
 
21
22
  import { getTrad, removeKeyInObject } from '../../utils';
22
23
  import reducer, { initialState } from './reducer';
23
- import { cleanData, createYupSchema } from './utils';
24
+ import { cleanData, createYupSchema, recursivelyFindPathsBasedOnCondition } from './utils';
24
25
 
25
26
  const EditViewDataManagerProvider = ({
26
27
  allLayoutData,
@@ -36,6 +37,7 @@ const EditViewDataManagerProvider = ({
36
37
  isSingleType,
37
38
  onPost,
38
39
  onPublish,
40
+ onDraftRelationCheck,
39
41
  onPut,
40
42
  onUnpublish,
41
43
  readActionAllowedFields,
@@ -45,8 +47,20 @@ const EditViewDataManagerProvider = ({
45
47
  status,
46
48
  updateActionAllowedFields,
47
49
  }) => {
50
+ /**
51
+ * TODO: this should be moved into the global reducer
52
+ * to match ever other reducer in the CM.
53
+ */
48
54
  const [reducerState, dispatch] = useReducer(reducer, initialState);
49
- const { formErrors, initialData, modifiedData, modifiedDZName, shouldCheckErrors } = reducerState;
55
+ const {
56
+ formErrors,
57
+ initialData,
58
+ modifiedData,
59
+ modifiedDZName,
60
+ shouldCheckErrors,
61
+ publishConfirmation,
62
+ } = reducerState;
63
+
50
64
  const toggleNotification = useNotification();
51
65
  const { lockApp, unlockApp } = useOverlayBlocker();
52
66
 
@@ -128,45 +142,86 @@ const EditViewDataManagerProvider = ({
128
142
  });
129
143
  }, [componentsDataStructure, contentTypeDataStructure]);
130
144
 
145
+ const { components } = allLayoutData;
146
+
131
147
  useEffect(() => {
132
- if (initialValues) {
133
- const relationalFields = Object.keys(initialValues).filter(
134
- (key) => currentContentTypeLayout?.attributes[key]?.type === 'relation'
135
- );
148
+ if (initialValues && currentContentTypeLayout?.attributes) {
149
+ /**
150
+ * This will return an array of paths:
151
+ * ['many_to_one', 'one_to_many', 'one_to_one']
152
+ * it can also return a path to a relation:
153
+ * ['relation_component.categories']
154
+ */
155
+ const relationalFieldPaths = recursivelyFindPathsBasedOnCondition(
156
+ components,
157
+ (value) => value.type === 'relation'
158
+ )(currentContentTypeLayout.attributes);
159
+
160
+ const componentPaths = recursivelyFindPathsBasedOnCondition(
161
+ components,
162
+ (value) => value.type === 'component' && !value.repeatable
163
+ )(currentContentTypeLayout.attributes);
164
+
165
+ const repeatableComponentPaths = recursivelyFindPathsBasedOnCondition(
166
+ components,
167
+ (value) => value.type === 'component' && value.repeatable
168
+ )(currentContentTypeLayout.attributes);
169
+
170
+ const dynamicZonePaths = recursivelyFindPathsBasedOnCondition(
171
+ components,
172
+ (value) => value.type === 'dynamiczone'
173
+ )(currentContentTypeLayout.attributes);
136
174
 
137
175
  dispatch({
138
176
  type: 'INIT_FORM',
139
177
  initialValues,
140
- relationalFields,
178
+ relationalFieldPaths,
179
+ componentPaths,
180
+ repeatableComponentPaths,
181
+ dynamicZonePaths,
141
182
  });
142
183
  }
143
- }, [initialValues, currentContentTypeLayout]);
184
+ }, [initialValues, currentContentTypeLayout, components]);
144
185
 
145
- const addComponentToDynamicZone = useCallback((keys, componentUid, shouldCheckErrors = false) => {
146
- trackUsageRef.current('didAddComponentToDynamicZone');
186
+ const dispatchAddComponent = useCallback(
187
+ (type) =>
188
+ (keys, componentLayoutData, components, shouldCheckErrors = false) => {
189
+ trackUsageRef.current('didAddComponentToDynamicZone');
147
190
 
148
- dispatch({
149
- type: 'ADD_COMPONENT_TO_DYNAMIC_ZONE',
150
- keys: keys.split('.'),
151
- componentUid,
152
- shouldCheckErrors,
153
- });
154
- }, []);
191
+ dispatch({
192
+ type,
193
+ keys: keys.split('.'),
194
+ componentLayoutData,
195
+ allComponents: components,
196
+ shouldCheckErrors,
197
+ });
198
+ },
199
+ []
200
+ );
155
201
 
156
- const addNonRepeatableComponentToField = useCallback((keys, componentUid) => {
157
- dispatch({
158
- type: 'ADD_NON_REPEATABLE_COMPONENT_TO_FIELD',
159
- keys: keys.split('.'),
160
- componentUid,
161
- });
162
- }, []);
202
+ const addComponentToDynamicZone = dispatchAddComponent('ADD_COMPONENT_TO_DYNAMIC_ZONE');
203
+
204
+ const addNonRepeatableComponentToField = useCallback(
205
+ (keys, componentLayoutData, allComponents) => {
206
+ dispatch({
207
+ type: 'ADD_NON_REPEATABLE_COMPONENT_TO_FIELD',
208
+ keys: keys.split('.'),
209
+ componentLayoutData,
210
+ allComponents,
211
+ });
212
+ },
213
+ []
214
+ );
163
215
 
164
- const connectRelation = useCallback(({ target: { name, value, replace } }) => {
216
+ /**
217
+ * @type {({ name: string, value: Relation, toOneRelation: boolean}) => void}
218
+ */
219
+ const connectRelation = useCallback(({ name, value, toOneRelation }) => {
165
220
  dispatch({
166
221
  type: 'CONNECT_RELATION',
167
222
  keys: name.split('.'),
168
223
  value,
169
- replace,
224
+ toOneRelation,
170
225
  });
171
226
  }, []);
172
227
 
@@ -178,17 +233,7 @@ const EditViewDataManagerProvider = ({
178
233
  });
179
234
  }, []);
180
235
 
181
- const addRepeatableComponentToField = useCallback(
182
- (keys, componentUid, shouldCheckErrors = false) => {
183
- dispatch({
184
- type: 'ADD_REPEATABLE_COMPONENT_TO_FIELD',
185
- keys: keys.split('.'),
186
- componentUid,
187
- shouldCheckErrors,
188
- });
189
- },
190
- []
191
- );
236
+ const addRepeatableComponentToField = dispatchAddComponent('ADD_REPEATABLE_COMPONENT_TO_FIELD');
192
237
 
193
238
  const yupSchema = useMemo(() => {
194
239
  const options = { isCreatingEntry, isDraft: shouldNotRunValidations, isFromComponent: false };
@@ -278,12 +323,12 @@ const EditViewDataManagerProvider = ({
278
323
  );
279
324
 
280
325
  const createFormData = useCallback(
281
- (data) => {
326
+ (modifiedData, initialData) => {
282
327
  // First we need to remove the added keys needed for the dnd
283
- const preparedData = removeKeyInObject(cloneDeep(data), '__temp_key__');
328
+ const preparedData = removeKeyInObject(cloneDeep(modifiedData), '__temp_key__');
284
329
  // Then we need to apply our helper
285
330
  const cleanedData = cleanData(
286
- preparedData,
331
+ { browserState: preparedData, serverState: initialData },
287
332
  currentContentTypeLayout,
288
333
  allLayoutData.components
289
334
  );
@@ -301,6 +346,14 @@ const EditViewDataManagerProvider = ({
301
346
  return shouldNotRunValidations ? { status: 'draft' } : {};
302
347
  }, [hasDraftAndPublish, shouldNotRunValidations]);
303
348
 
349
+ const handlePublishPromptDismissal = useCallback(async (e) => {
350
+ e.preventDefault();
351
+
352
+ return dispatch({
353
+ type: 'RESET_PUBLISH_CONFIRMATION',
354
+ });
355
+ }, []);
356
+
304
357
  const handleSubmit = useCallback(
305
358
  async (e) => {
306
359
  e.preventDefault();
@@ -314,7 +367,7 @@ const EditViewDataManagerProvider = ({
314
367
 
315
368
  try {
316
369
  if (isEmpty(errors)) {
317
- const formData = createFormData(modifiedData);
370
+ const formData = createFormData(modifiedData, initialData);
318
371
 
319
372
  if (isCreatingEntry) {
320
373
  await onPost(formData, trackerProperty);
@@ -334,7 +387,16 @@ const EditViewDataManagerProvider = ({
334
387
  errors,
335
388
  });
336
389
  },
337
- [createFormData, isCreatingEntry, modifiedData, onPost, onPut, trackerProperty, yupSchema]
390
+ [
391
+ createFormData,
392
+ isCreatingEntry,
393
+ modifiedData,
394
+ initialData,
395
+ onPost,
396
+ onPut,
397
+ trackerProperty,
398
+ yupSchema,
399
+ ]
338
400
  );
339
401
 
340
402
  const handlePublish = useCallback(async () => {
@@ -346,8 +408,27 @@ const EditViewDataManagerProvider = ({
346
408
  },
347
409
  { isCreatingEntry, isDraft: false, isFromComponent: false }
348
410
  );
349
- let errors = {};
350
411
 
412
+ const draftCount = await onDraftRelationCheck();
413
+
414
+ if (!publishConfirmation.show && draftCount > 0) {
415
+ // If the warning hasn't already been shown and draft relations are found,
416
+ // abort the publish call and ask for confirmation from the user
417
+ dispatch({
418
+ type: 'SET_PUBLISH_CONFIRMATION',
419
+ publishConfirmation: {
420
+ show: true,
421
+ draftCount,
422
+ },
423
+ });
424
+
425
+ return;
426
+ }
427
+ dispatch({
428
+ type: 'RESET_PUBLISH_CONFIRMATION',
429
+ });
430
+
431
+ let errors = {};
351
432
  try {
352
433
  await schema.validate(modifiedData, { abortEarly: false });
353
434
  } catch (err) {
@@ -369,7 +450,15 @@ const EditViewDataManagerProvider = ({
369
450
  type: 'SET_FORM_ERRORS',
370
451
  errors,
371
452
  });
372
- }, [allLayoutData, currentContentTypeLayout, isCreatingEntry, modifiedData, onPublish]);
453
+ }, [
454
+ allLayoutData,
455
+ currentContentTypeLayout,
456
+ isCreatingEntry,
457
+ modifiedData,
458
+ publishConfirmation.show,
459
+ onPublish,
460
+ onDraftRelationCheck,
461
+ ]);
373
462
 
374
463
  const shouldCheckDZErrors = useCallback(
375
464
  (dzName) => {
@@ -418,11 +507,11 @@ const EditViewDataManagerProvider = ({
418
507
  });
419
508
  }, []);
420
509
 
421
- const disconnectRelation = useCallback(({ target: { name, value } }) => {
510
+ const disconnectRelation = useCallback(({ name, id }) => {
422
511
  dispatch({
423
512
  type: 'DISCONNECT_RELATION',
424
513
  keys: name.split('.'),
425
- value,
514
+ id,
426
515
  });
427
516
  }, []);
428
517
 
@@ -506,25 +595,25 @@ const EditViewDataManagerProvider = ({
506
595
  slug,
507
596
  triggerFormValidation,
508
597
  updateActionAllowedFields,
598
+ onPublishPromptDismissal: handlePublishPromptDismissal,
599
+ publishConfirmation,
509
600
  }}
510
601
  >
511
- <>
512
- {isLoadingForData || (!isCreatingEntry && !initialData.id) ? (
513
- <Main aria-busy="true">
514
- <LoadingIndicatorPage />
515
- </Main>
516
- ) : (
517
- <>
518
- <Prompt
519
- when={!isEqual(modifiedData, initialData)}
520
- message={formatMessage({ id: 'global.prompt.unsaved' })}
521
- />
522
- <form noValidate onSubmit={handleSubmit}>
523
- {children}
524
- </form>
525
- </>
526
- )}
527
- </>
602
+ {isLoadingForData || (!isCreatingEntry && !initialData.id) ? (
603
+ <Main aria-busy="true">
604
+ <LoadingIndicatorPage />
605
+ </Main>
606
+ ) : (
607
+ <>
608
+ <Prompt
609
+ when={!isEqual(modifiedData, initialData)}
610
+ message={formatMessage({ id: 'global.prompt.unsaved' })}
611
+ />
612
+ <form noValidate onSubmit={handleSubmit}>
613
+ {children}
614
+ </form>
615
+ </>
616
+ )}
528
617
  </ContentManagerEditViewDataManagerContext.Provider>
529
618
  );
530
619
  };
@@ -549,6 +638,7 @@ EditViewDataManagerProvider.propTypes = {
549
638
  isSingleType: PropTypes.bool.isRequired,
550
639
  onPost: PropTypes.func.isRequired,
551
640
  onPublish: PropTypes.func.isRequired,
641
+ onDraftRelationCheck: PropTypes.func.isRequired,
552
642
  onPut: PropTypes.func.isRequired,
553
643
  onUnpublish: PropTypes.func.isRequired,
554
644
  readActionAllowedFields: PropTypes.array.isRequired,