@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,5 +1,5 @@
1
1
  /* eslint-disable import/no-cycle */
2
- import React, { memo } from 'react';
2
+ import React, { memo, useMemo } from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import size from 'lodash/size';
5
5
  import isEqual from 'react-fast-compare';
@@ -17,6 +17,7 @@ import RepeatableComponent from '../RepeatableComponent';
17
17
  import connect from './utils/connect';
18
18
  import select from './utils/select';
19
19
  import Label from './Label';
20
+ import { useContentTypeLayout } from '../../hooks';
20
21
 
21
22
  const FieldComponent = ({
22
23
  addNonRepeatableComponentToField,
@@ -46,6 +47,12 @@ const FieldComponent = ({
46
47
  const showResetComponent =
47
48
  !isRepeatable && isInitialized && !isFromDynamicZone && hasChildrenAllowedFields;
48
49
 
50
+ const { getComponentLayout, components } = useContentTypeLayout();
51
+ const componentLayoutData = useMemo(
52
+ () => getComponentLayout(componentUid),
53
+ [componentUid, getComponentLayout]
54
+ );
55
+
49
56
  if (!hasChildrenAllowedFields && isCreatingEntry) {
50
57
  return <NotAllowedInput labelAction={labelAction} intlLabel={intlLabel} name={name} />;
51
58
  }
@@ -55,7 +62,7 @@ const FieldComponent = ({
55
62
  }
56
63
 
57
64
  const handleClickAddNonRepeatableComponentToField = () => {
58
- addNonRepeatableComponentToField(name, componentUid);
65
+ addNonRepeatableComponentToField(name, componentLayoutData, components);
59
66
  };
60
67
 
61
68
  return (
@@ -1,5 +1,7 @@
1
1
  import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
+ import { Box } from '@strapi/design-system/Box';
4
+ import { useCustomFields } from '@strapi/helper-plugin';
3
5
  import Date from '@strapi/icons/Date';
4
6
  import Boolean from '@strapi/icons/Boolean';
5
7
  import Email from '@strapi/icons/Email';
@@ -40,10 +42,38 @@ const iconByTypes = {
40
42
  dynamiczone: <DynamicZone />,
41
43
  };
42
44
 
43
- const FieldTypeIcon = ({ type }) => iconByTypes[type] || null;
45
+ const FieldTypeIcon = ({ type, customFieldUid }) => {
46
+ const customFieldsRegistry = useCustomFields();
47
+
48
+ let Compo = iconByTypes[type];
49
+
50
+ if (customFieldUid) {
51
+ const customField = customFieldsRegistry.get(customFieldUid);
52
+ const CustomFieldIcon = customField.icon;
53
+
54
+ if (CustomFieldIcon) {
55
+ Compo = (
56
+ <Box marginRight={3} width={7} height={6}>
57
+ <CustomFieldIcon />
58
+ </Box>
59
+ );
60
+ }
61
+ }
62
+
63
+ if (!iconByTypes[type]) {
64
+ return null;
65
+ }
66
+
67
+ return Compo;
68
+ };
69
+
70
+ FieldTypeIcon.defaultProps = {
71
+ customFieldUid: null,
72
+ };
44
73
 
45
74
  FieldTypeIcon.propTypes = {
46
75
  type: PropTypes.string.isRequired,
76
+ customFieldUid: PropTypes.string,
47
77
  };
48
78
 
49
79
  export default FieldTypeIcon;
@@ -5,16 +5,14 @@ import get from 'lodash/get';
5
5
  import omit from 'lodash/omit';
6
6
  import take from 'lodash/take';
7
7
  import isEqual from 'react-fast-compare';
8
- import { GenericInput, NotAllowedInput, useLibrary } from '@strapi/helper-plugin';
9
-
8
+ import { GenericInput, NotAllowedInput, useLibrary, useCustomFields } from '@strapi/helper-plugin';
9
+ import { useContentTypeLayout } from '../../hooks';
10
+ import { getFieldName } from '../../utils';
10
11
  import Wysiwyg from '../Wysiwyg';
11
12
  import InputJSON from '../InputJSON';
12
13
  import InputUID from '../InputUID';
13
14
  import { RelationInputDataManager } from '../RelationInputDataManager';
14
15
 
15
- import { useContentTypeLayout } from '../../hooks';
16
- import { getFieldName } from '../../utils';
17
-
18
16
  import {
19
17
  connect,
20
18
  generateOptions,
@@ -26,6 +24,7 @@ import {
26
24
 
27
25
  function Inputs({
28
26
  allowedFields,
27
+ componentUid,
29
28
  fieldSchema,
30
29
  formErrors,
31
30
  isCreatingEntry,
@@ -42,9 +41,10 @@ function Inputs({
42
41
  const { fields } = useLibrary();
43
42
  const { formatMessage } = useIntl();
44
43
  const { contentType: currentContentTypeLayout } = useContentTypeLayout();
44
+ const customFieldsRegistry = useCustomFields();
45
45
 
46
46
  const disabled = useMemo(() => !get(metadatas, 'editable', true), [metadatas]);
47
- const type = fieldSchema.type;
47
+ const { type, customField: customFieldUid } = fieldSchema;
48
48
  const error = get(formErrors, [keys], null);
49
49
 
50
50
  const fieldName = useMemo(() => {
@@ -194,6 +194,19 @@ function Inputs({
194
194
  return minutes % metadatas.step === 0 ? metadatas.step : step;
195
195
  }, [inputType, inputValue, metadatas.step, step]);
196
196
 
197
+ // Memoize the component to avoid remounting it and losing state
198
+ const CustomFieldInput = useMemo(() => {
199
+ if (customFieldUid) {
200
+ const customField = customFieldsRegistry.get(customFieldUid);
201
+ const CustomFieldInput = React.lazy(customField.components.Input);
202
+
203
+ return CustomFieldInput;
204
+ }
205
+
206
+ // Not a custom field, component won't be used
207
+ return null;
208
+ }, [customFieldUid, customFieldsRegistry]);
209
+
197
210
  if (visible === false) {
198
211
  return null;
199
212
  }
@@ -216,6 +229,7 @@ function Inputs({
216
229
  <RelationInputDataManager
217
230
  {...metadatas}
218
231
  {...fieldSchema}
232
+ componentUid={componentUid}
219
233
  description={
220
234
  metadatas.description
221
235
  ? formatMessage({
@@ -248,6 +262,18 @@ function Inputs({
248
262
  );
249
263
  }
250
264
 
265
+ const customInputs = {
266
+ json: InputJSON,
267
+ uid: InputUID,
268
+ media: fields.media,
269
+ wysiwyg: Wysiwyg,
270
+ ...fields,
271
+ };
272
+
273
+ if (customFieldUid) {
274
+ customInputs[customFieldUid] = CustomFieldInput;
275
+ }
276
+
251
277
  return (
252
278
  <GenericInput
253
279
  attribute={fieldSchema}
@@ -260,13 +286,7 @@ function Inputs({
260
286
  error={error}
261
287
  labelAction={labelAction}
262
288
  contentTypeUID={currentContentTypeLayout.uid}
263
- customInputs={{
264
- json: InputJSON,
265
- uid: InputUID,
266
- media: fields.media,
267
- wysiwyg: Wysiwyg,
268
- ...fields,
269
- }}
289
+ customInputs={customInputs}
270
290
  multiple={fieldSchema.multiple || false}
271
291
  name={keys}
272
292
  onChange={onChange}
@@ -274,7 +294,7 @@ function Inputs({
274
294
  placeholder={placeholder ? { id: placeholder, defaultMessage: placeholder } : null}
275
295
  required={fieldSchema.required || false}
276
296
  step={inputStep}
277
- type={inputType}
297
+ type={customFieldUid || inputType}
278
298
  // validations={validations}
279
299
  value={inputValue}
280
300
  withDefaultValue={false}
@@ -283,6 +303,7 @@ function Inputs({
283
303
  }
284
304
 
285
305
  Inputs.defaultProps = {
306
+ componentUid: undefined,
286
307
  formErrors: {},
287
308
  labelAction: undefined,
288
309
  size: undefined,
@@ -292,6 +313,7 @@ Inputs.defaultProps = {
292
313
 
293
314
  Inputs.propTypes = {
294
315
  allowedFields: PropTypes.array.isRequired,
316
+ componentUid: PropTypes.string,
295
317
  fieldSchema: PropTypes.object.isRequired,
296
318
  formErrors: PropTypes.object,
297
319
  keys: PropTypes.string.isRequired,
@@ -61,10 +61,12 @@ const NonRepeatableComponent = ({ componentUid, isFromDynamicZone, isNested, nam
61
61
  return (
62
62
  <GridItem col={size} key={fieldName} s={12} xs={12}>
63
63
  <Inputs
64
+ componentUid={componentUid}
64
65
  keys={keys}
65
66
  fieldSchema={fieldSchema}
66
67
  metadatas={metadatas}
67
68
  queryInfos={queryInfos}
69
+ size={size}
68
70
  />
69
71
  </GridItem>
70
72
  );
@@ -13,7 +13,7 @@ import sanitizeHtml from './utils/satinizeHtml';
13
13
  import Wrapper from './Wrapper';
14
14
 
15
15
  const PreviewWysiwyg = ({ data }) => {
16
- const html = useMemo(() => sanitizeHtml(md.render(data || '')), [data]);
16
+ const html = useMemo(() => sanitizeHtml(md.render(data.replaceAll('\\n', '\n') || '')), [data]);
17
17
 
18
18
  return (
19
19
  <Wrapper>
@@ -1,10 +1,10 @@
1
1
  import React, { useRef, useState, useMemo, useEffect } from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import styled, { keyframes } from 'styled-components';
3
+ import styled from 'styled-components';
4
4
  import { FixedSizeList as List } from 'react-window';
5
5
 
6
6
  import { ReactSelect } from '@strapi/helper-plugin';
7
- import { Badge } from '@strapi/design-system/Badge';
7
+ import { Status } from '@strapi/design-system/Status';
8
8
  import { Box } from '@strapi/design-system/Box';
9
9
  import { Link } from '@strapi/design-system/Link';
10
10
  import { Icon } from '@strapi/design-system/Icon';
@@ -15,13 +15,13 @@ import { Tooltip } from '@strapi/design-system/Tooltip';
15
15
 
16
16
  import Cross from '@strapi/icons/Cross';
17
17
  import Refresh from '@strapi/icons/Refresh';
18
- import Loader from '@strapi/icons/Loader';
19
18
 
20
19
  import { Relation } from './components/Relation';
21
20
  import { RelationItem } from './components/RelationItem';
22
21
  import { RelationList } from './components/RelationList';
23
22
  import { Option } from './components/Option';
24
23
  import { RELATION_ITEM_HEIGHT } from './constants';
24
+ import { usePrev } from '../../hooks';
25
25
 
26
26
  const LinkEllipsis = styled(Link)`
27
27
  white-space: nowrap;
@@ -39,19 +39,15 @@ const BoxEllipsis = styled(Box)`
39
39
  }
40
40
  `;
41
41
 
42
- const rotation = keyframes`
43
- from {
44
- transform: rotate(0deg);
42
+ const DisconnectButton = styled.button`
43
+ svg path {
44
+ fill: ${({ theme }) => theme.colors.neutral500};
45
45
  }
46
- to {
47
- transform: rotate(359deg);
48
- }
49
- `;
50
46
 
51
- // TODO - to replace with loading prop on TextButton after DS release
52
- const LoaderWrapper = styled(Box)`
53
- animation: ${rotation} 2s infinite linear;
54
- will-change: transform;
47
+ &:hover svg path,
48
+ &:focus svg path {
49
+ fill: ${({ theme }) => theme.colors.neutral600};
50
+ }
55
51
  `;
56
52
 
57
53
  const RelationInput = ({
@@ -64,13 +60,13 @@ const RelationInput = ({
64
60
  label,
65
61
  labelAction,
66
62
  labelLoadMore,
63
+ labelDisconnectRelation,
67
64
  loadingMessage,
68
- onRelationAdd,
65
+ noRelationsMessage,
66
+ onRelationConnect,
69
67
  onRelationLoadMore,
70
- onRelationRemove,
71
- onSearchClose,
68
+ onRelationDisconnect,
72
69
  onSearchNextPage,
73
- onSearchOpen,
74
70
  onSearch,
75
71
  placeholder,
76
72
  publicationStateTranslations,
@@ -84,7 +80,9 @@ const RelationInput = ({
84
80
  const outerListRef = useRef();
85
81
  const [overflow, setOverflow] = useState('');
86
82
 
87
- const relations = useMemo(() => paginatedRelations.data.pages.flat(), [paginatedRelations]);
83
+ const { data } = searchResults;
84
+
85
+ const relations = paginatedRelations.data;
88
86
  const totalNumberOfRelations = relations.length ?? 0;
89
87
 
90
88
  const dynamicListHeight = useMemo(
@@ -102,12 +100,15 @@ const RelationInput = ({
102
100
 
103
101
  const options = useMemo(
104
102
  () =>
105
- searchResults.data.pages.flat().map((result) => ({
106
- ...result,
107
- value: result.id,
108
- label: result.mainField,
109
- })),
110
- [searchResults]
103
+ data
104
+ .flat()
105
+ .filter(Boolean)
106
+ .map((result) => ({
107
+ ...result,
108
+ value: result.id,
109
+ label: result.mainField,
110
+ })),
111
+ [data]
111
112
  );
112
113
 
113
114
  useEffect(() => {
@@ -143,6 +144,92 @@ const RelationInput = ({
143
144
  };
144
145
  }, [paginatedRelations, relations, numberOfRelationsToDisplay, totalNumberOfRelations]);
145
146
 
147
+ /**
148
+ * This code is being isolated because it's a hack to fix a placement bug in
149
+ * `react-select` where when the options prop is updated the position of the
150
+ * menu is not recalculated.
151
+ */
152
+ const [isMenuOpen, setIsMenuOpen] = useState(false);
153
+
154
+ const timeoutRef = useRef();
155
+ const previousOptions = useRef([]);
156
+
157
+ useEffect(() => {
158
+ /**
159
+ * We only really want this effect to fire once when the options
160
+ * change from an empty array to an array with values.
161
+ * Otherwise, it'll fire when the infinite scrolling happens causing
162
+ * the menu to jump to the top all the time when loading more.
163
+ */
164
+ if (options.length > 0 && previousOptions.current.length === 0) {
165
+ setIsMenuOpen((isCurrentlyOpened) => {
166
+ /**
167
+ * If we're currently open and the options changed
168
+ * we want to close and open to ensure the menu's
169
+ * position is correctly calculated
170
+ */
171
+ if (isCurrentlyOpened) {
172
+ timeoutRef.current = setTimeout(() => {
173
+ setIsMenuOpen(true);
174
+ }, 10);
175
+
176
+ return false;
177
+ }
178
+
179
+ return false;
180
+ });
181
+ }
182
+
183
+ return () => {
184
+ previousOptions.current = options || [];
185
+ };
186
+ }, [options]);
187
+
188
+ useEffect(() => {
189
+ return () => {
190
+ /**
191
+ * If the component unmounts and a timer is set we should clear that timer
192
+ */
193
+ if (timeoutRef.current) {
194
+ clearTimeout(timeoutRef.current);
195
+ }
196
+ };
197
+ }, []);
198
+
199
+ const handleMenuClose = () => {
200
+ setIsMenuOpen(false);
201
+ };
202
+
203
+ const handleMenuOpen = () => {
204
+ setIsMenuOpen(true);
205
+ onSearch();
206
+ };
207
+
208
+ const previewRelationsLength = usePrev(relations.length);
209
+ /**
210
+ * @type {React.MutableRefObject<'onChange' | 'loadMore'>}
211
+ */
212
+ const updatedRelationsWith = useRef();
213
+
214
+ const handleLoadMore = () => {
215
+ updatedRelationsWith.current = 'loadMore';
216
+ onRelationLoadMore();
217
+ };
218
+
219
+ useEffect(() => {
220
+ if (
221
+ updatedRelationsWith.current === 'onChange' &&
222
+ relations.length !== previewRelationsLength
223
+ ) {
224
+ listRef.current.scrollToItem(relations.length, 'end');
225
+ } else if (
226
+ updatedRelationsWith.current === 'loadMore' &&
227
+ relations.length !== previewRelationsLength
228
+ ) {
229
+ listRef.current.scrollToItem(0, 'start');
230
+ }
231
+ }, [previewRelationsLength, relations]);
232
+
146
233
  return (
147
234
  <Field error={error} name={name} hint={description} id={id}>
148
235
  <Relation
@@ -157,6 +244,7 @@ const RelationInput = ({
157
244
  // position fixed doesn't update position on scroll
158
245
  // react select doesn't update menu position on options change
159
246
  menuPosition="absolute"
247
+ menuPlacement="auto"
160
248
  components={{ Option }}
161
249
  options={options}
162
250
  isDisabled={disabled}
@@ -165,24 +253,20 @@ const RelationInput = ({
165
253
  inputId={id}
166
254
  isSearchable
167
255
  isClear
168
- loadingMessage={loadingMessage}
256
+ loadingMessage={() => loadingMessage}
169
257
  onChange={(relation) => {
170
258
  setValue(null);
171
- onRelationAdd(relation);
172
-
173
- // scroll to the end of the list
174
- if (relations.length > 0) {
175
- setTimeout(() => {
176
- listRef.current.scrollToItem(relations.length, 'end');
177
- });
178
- }
259
+ onRelationConnect(relation);
260
+ updatedRelationsWith.current = 'onChange';
179
261
  }}
180
262
  onInputChange={(value) => {
181
263
  setValue(value);
182
264
  onSearch(value);
183
265
  }}
184
- onMenuClose={onSearchClose}
185
- onMenuOpen={onSearchOpen}
266
+ onMenuClose={handleMenuClose}
267
+ onMenuOpen={handleMenuOpen}
268
+ menuIsOpen={isMenuOpen}
269
+ noOptionsMessage={() => noRelationsMessage}
186
270
  onMenuScrollToBottom={() => {
187
271
  if (searchResults.hasNextPage) {
188
272
  onSearchNextPage();
@@ -197,18 +281,10 @@ const RelationInput = ({
197
281
  loadMore={
198
282
  shouldDisplayLoadMoreButton && (
199
283
  <TextButton
200
- disabled={paginatedRelations.isLoading}
201
- onClick={() => onRelationLoadMore()}
202
- startIcon={
203
- paginatedRelations.isLoading ? (
204
- // TODO: To replace with loading prop on TextButton after DS release
205
- <LoaderWrapper>
206
- <Loader />
207
- </LoaderWrapper>
208
- ) : (
209
- <Refresh />
210
- )
211
- }
284
+ disabled={paginatedRelations.isLoading || paginatedRelations.isFetchingNextPage}
285
+ onClick={handleLoadMore}
286
+ loading={paginatedRelations.isLoading || paginatedRelations.isFetchingNextPage}
287
+ startIcon={<Refresh />}
212
288
  >
213
289
  {labelLoadMore}
214
290
  </TextButton>
@@ -227,26 +303,27 @@ const RelationInput = ({
227
303
  >
228
304
  {({ data, index, style }) => {
229
305
  const { publicationState, href, mainField, id } = data[index];
230
- const badgeColor = publicationState === 'draft' ? 'secondary' : 'success';
306
+ const statusColor = publicationState === 'draft' ? 'secondary' : 'success';
231
307
 
232
308
  return (
233
309
  <RelationItem
234
310
  disabled={disabled}
235
311
  key={`relation-${name}-${id}`}
236
312
  endAction={
237
- <button
313
+ <DisconnectButton
238
314
  data-testid={`remove-relation-${id}`}
239
315
  disabled={disabled}
240
316
  type="button"
241
- onClick={() => onRelationRemove(data[index])}
317
+ onClick={() => onRelationDisconnect(data[index])}
318
+ aria-label={labelDisconnectRelation}
242
319
  >
243
320
  <Icon width="12px" as={Cross} />
244
- </button>
321
+ </DisconnectButton>
245
322
  }
246
323
  style={style}
247
324
  >
248
325
  <BoxEllipsis minWidth={0} paddingTop={1} paddingBottom={1} paddingRight={4}>
249
- <Tooltip description={mainField ?? id}>
326
+ <Tooltip description={mainField ?? `${id}`}>
250
327
  {href ? (
251
328
  <LinkEllipsis to={href} disabled={disabled}>
252
329
  {mainField ?? id}
@@ -260,15 +337,11 @@ const RelationInput = ({
260
337
  </BoxEllipsis>
261
338
 
262
339
  {publicationState && (
263
- <Badge
264
- borderSize={1}
265
- borderColor={`${badgeColor}200`}
266
- backgroundColor={`${badgeColor}100`}
267
- textColor={`${badgeColor}700`}
268
- shrink={0}
269
- >
270
- {publicationStateTranslations[publicationState]}
271
- </Badge>
340
+ <Status variant={statusColor} showBullet={false} size="S">
341
+ <Typography fontWeight="bold" textColor={`${statusColor}700`}>
342
+ {publicationStateTranslations[publicationState]}
343
+ </Typography>
344
+ </Status>
272
345
  )}
273
346
  </RelationItem>
274
347
  );
@@ -286,36 +359,30 @@ const RelationInput = ({
286
359
  );
287
360
  };
288
361
 
289
- const ReactQueryRelationResult = PropTypes.shape({
290
- data: PropTypes.shape({
291
- pages: PropTypes.arrayOf(
292
- PropTypes.arrayOf(
293
- PropTypes.shape({
294
- href: PropTypes.string,
295
- id: PropTypes.number.isRequired,
296
- publicationState: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
297
- mainField: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
298
- })
299
- )
300
- ),
301
- }),
362
+ const RelationsResult = PropTypes.shape({
363
+ data: PropTypes.arrayOf(
364
+ PropTypes.shape({
365
+ href: PropTypes.string,
366
+ id: PropTypes.number.isRequired,
367
+ publicationState: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
368
+ mainField: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
369
+ })
370
+ ),
302
371
  hasNextPage: PropTypes.bool,
372
+ isFetchingNextPage: PropTypes.bool.isRequired,
303
373
  isLoading: PropTypes.bool.isRequired,
304
374
  isSuccess: PropTypes.bool.isRequired,
305
375
  });
306
376
 
307
- const ReactQuerySearchResult = PropTypes.shape({
308
- data: PropTypes.shape({
309
- pages: PropTypes.arrayOf(
310
- PropTypes.arrayOf(
311
- PropTypes.shape({
312
- id: PropTypes.number.isRequired,
313
- mainField: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
314
- publicationState: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
315
- })
316
- )
317
- ),
318
- }),
377
+ const SearchResults = PropTypes.shape({
378
+ data: PropTypes.arrayOf(
379
+ PropTypes.shape({
380
+ id: PropTypes.number.isRequired,
381
+ href: PropTypes.string,
382
+ mainField: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
383
+ publicationState: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
384
+ })
385
+ ),
319
386
  hasNextPage: PropTypes.bool,
320
387
  isLoading: PropTypes.bool.isRequired,
321
388
  isSuccess: PropTypes.bool.isRequired,
@@ -328,8 +395,8 @@ RelationInput.defaultProps = {
328
395
  labelAction: null,
329
396
  labelLoadMore: null,
330
397
  required: false,
331
- relations: [],
332
- searchResults: [],
398
+ relations: { data: [] },
399
+ searchResults: { data: [] },
333
400
  };
334
401
 
335
402
  RelationInput.propTypes = {
@@ -340,25 +407,25 @@ RelationInput.propTypes = {
340
407
  label: PropTypes.string.isRequired,
341
408
  labelAction: PropTypes.element,
342
409
  labelLoadMore: PropTypes.string,
343
- loadingMessage: PropTypes.func.isRequired,
410
+ labelDisconnectRelation: PropTypes.string.isRequired,
411
+ loadingMessage: PropTypes.string.isRequired,
344
412
  name: PropTypes.string.isRequired,
413
+ noRelationsMessage: PropTypes.string.isRequired,
345
414
  numberOfRelationsToDisplay: PropTypes.number.isRequired,
346
- onRelationAdd: PropTypes.func.isRequired,
347
- onRelationRemove: PropTypes.func.isRequired,
415
+ onRelationConnect: PropTypes.func.isRequired,
416
+ onRelationDisconnect: PropTypes.func.isRequired,
348
417
  onRelationLoadMore: PropTypes.func.isRequired,
349
418
  onSearch: PropTypes.func.isRequired,
350
419
  onSearchNextPage: PropTypes.func.isRequired,
351
- onSearchClose: PropTypes.func.isRequired,
352
- onSearchOpen: PropTypes.func.isRequired,
353
420
  placeholder: PropTypes.string.isRequired,
354
421
  publicationStateTranslations: PropTypes.shape({
355
422
  draft: PropTypes.string.isRequired,
356
423
  published: PropTypes.string.isRequired,
357
424
  }).isRequired,
358
425
  required: PropTypes.bool,
359
- searchResults: ReactQuerySearchResult,
426
+ searchResults: SearchResults,
360
427
  size: PropTypes.number.isRequired,
361
- relations: ReactQueryRelationResult,
428
+ relations: RelationsResult,
362
429
  };
363
430
 
364
431
  export default RelationInput;
@@ -14,8 +14,8 @@ export const RelationItem = ({ children, disabled, endAction, style, ...props })
14
14
  return (
15
15
  <Box style={style} as="li">
16
16
  <Flex
17
- paddingTop={3}
18
- paddingBottom={3}
17
+ paddingTop={2}
18
+ paddingBottom={2}
19
19
  paddingLeft={4}
20
20
  paddingRight={4}
21
21
  hasRadius
@@ -1 +1 @@
1
- export const RELATION_ITEM_HEIGHT = 58;
1
+ export const RELATION_ITEM_HEIGHT = 50;