@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.
- package/admin/src/StrapiApp.js +21 -18
- package/admin/src/assets/images/hot-air-balloon.png +0 -0
- package/admin/src/assets/images/icon_offline-cloud.svg +3 -3
- package/admin/src/assets/images/logo-strapi-2022.svg +7 -0
- package/admin/src/assets/images/upgrade-details.png +0 -0
- package/admin/src/components/Providers/index.js +14 -10
- package/admin/src/content-manager/components/CollectionTypeFormWrapper/index.js +24 -0
- package/admin/src/content-manager/components/DynamicTable/CellContent/CellValue.js +1 -1
- package/admin/src/content-manager/components/DynamicTable/CellContent/RelationMultiple/index.js +5 -4
- package/admin/src/content-manager/components/DynamicTable/CellContent/index.js +10 -0
- package/admin/src/content-manager/components/DynamicTable/TableRows/index.js +20 -15
- package/admin/src/content-manager/components/DynamicTable/index.js +21 -4
- package/admin/src/content-manager/components/DynamicZone/components/Component/index.js +19 -9
- package/admin/src/content-manager/components/DynamicZone/index.js +6 -2
- package/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +153 -63
- package/admin/src/content-manager/components/EditViewDataManagerProvider/reducer.js +180 -132
- package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js +70 -16
- package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/findLeafByPathAndReplace.js +52 -0
- package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js +2 -0
- package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/recursivelyFindPathsBasedOnCondition.js +72 -0
- package/admin/src/content-manager/components/FieldComponent/index.js +9 -2
- package/admin/src/content-manager/components/FieldTypeIcon/index.js +31 -1
- package/admin/src/content-manager/components/Inputs/index.js +36 -14
- package/admin/src/content-manager/components/NonRepeatableComponent/index.js +2 -0
- package/admin/src/content-manager/components/PreviewWysiwyg/index.js +1 -1
- package/admin/src/content-manager/components/RelationInput/RelationInput.js +163 -96
- package/admin/src/content-manager/components/RelationInput/components/RelationItem.js +2 -2
- package/admin/src/content-manager/components/RelationInput/constants.js +1 -1
- package/admin/src/content-manager/components/RelationInputDataManager/RelationInputDataManager.js +116 -73
- package/admin/src/content-manager/components/RelationInputDataManager/utils/diffRelations.js +24 -0
- package/admin/src/content-manager/components/RelationInputDataManager/utils/index.js +3 -1
- package/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeRelations.js +17 -31
- package/admin/src/content-manager/components/RelationInputDataManager/utils/normalizeSearchResults.js +16 -0
- package/admin/src/content-manager/components/RelationInputDataManager/utils/select.js +35 -11
- package/admin/src/content-manager/components/RepeatableComponent/DraggedItem/index.js +5 -0
- package/admin/src/content-manager/components/RepeatableComponent/index.js +4 -3
- package/admin/src/content-manager/components/SingleTypeFormWrapper/index.js +23 -0
- package/admin/src/content-manager/hooks/__test__/usePrev.test.js +26 -0
- package/admin/src/content-manager/hooks/index.js +1 -0
- package/admin/src/content-manager/hooks/useFetchContentTypeLayout/utils/formatLayouts.js +19 -48
- package/admin/src/content-manager/hooks/usePrev.js +14 -0
- package/admin/src/content-manager/hooks/useRelation/useRelation.js +116 -15
- package/admin/src/content-manager/pages/App/reducer.js +3 -0
- package/admin/src/content-manager/pages/EditSettingsView/components/FormModal.js +7 -2
- package/admin/src/content-manager/pages/EditSettingsView/index.js +2 -1
- package/admin/src/content-manager/pages/EditView/Header/index.js +118 -50
- package/admin/src/content-manager/pages/EditView/Header/utils/select.js +4 -0
- package/admin/src/content-manager/pages/EditView/index.js +102 -93
- package/admin/src/content-manager/pages/ListSettingsView/components/DraggableCard.js +3 -3
- package/admin/src/content-manager/pages/ListSettingsView/components/Settings.js +2 -2
- package/admin/src/content-manager/pages/ListSettingsView/components/SortDisplayedFields.js +1 -1
- package/admin/src/content-manager/pages/ListView/index.js +24 -15
- package/admin/src/content-manager/pages/ListView/utils/buildQueryString.js +14 -2
- package/admin/src/contexts/ApiTokenPermissions/index.js +24 -0
- package/admin/src/core/apis/CustomFields.js +79 -0
- package/admin/src/core/apis/index.js +1 -0
- package/admin/src/core/store/configureStore.js +17 -2
- package/admin/src/favicon.png +0 -0
- package/admin/src/hooks/index.js +1 -0
- package/admin/src/hooks/useFetchMarketplacePlugins/index.js +2 -2
- package/admin/src/hooks/useFetchMarketplacePlugins/utils/api.js +4 -2
- package/admin/src/hooks/useFetchMarketplaceProviders/index.js +3 -3
- package/admin/src/hooks/useFetchMarketplaceProviders/utils/api.js +5 -3
- package/admin/src/hooks/useRegenerate/index.js +34 -0
- package/admin/src/index.js +1 -0
- package/admin/src/pages/App/index.js +1 -1
- package/admin/src/pages/HomePage/SocialLinks.js +1 -1
- package/admin/src/pages/HomePage/assets/corner-ornament.svg +48 -0
- package/admin/src/pages/HomePage/index.js +3 -2
- package/admin/src/pages/MarketplacePage/components/NpmPackageCard/CardButton.js +110 -0
- package/admin/src/pages/MarketplacePage/components/NpmPackageCard/InstallPluginButton.js +32 -21
- package/admin/src/pages/MarketplacePage/components/NpmPackageCard/PackageStats.js +79 -0
- package/admin/src/pages/MarketplacePage/components/NpmPackageCard/index.js +28 -11
- package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FilterSelect.js +41 -0
- package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FiltersPopover.js +96 -0
- package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/index.js +106 -0
- package/admin/src/pages/MarketplacePage/components/NpmPackagesGrid/index.js +4 -0
- package/admin/src/pages/MarketplacePage/components/SortSelect/index.js +70 -0
- package/admin/src/pages/MarketplacePage/index.js +68 -8
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ActionBoundRoutes/index.js +56 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/getMethodColor.js +41 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/BoundRoute/index.js +72 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/CheckBoxWrapper.js +30 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +150 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ContenTypesSection/index.js +37 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormApiTokenContainer/index.js +255 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormBody/index.js +78 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/FormHead/index.js +89 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Permissions/index.js +40 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +68 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +216 -197
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/init.js +13 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/reducer.js +72 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/getDateOfExpiration.js +16 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/index.js +5 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/schema.js +2 -1
- package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/utils/transformPermissionsData.js +36 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/DefaultButton/index.js +63 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/DeleteButton/index.js +1 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/ReadButton/index.js +19 -0
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/UpdateButton/index.js +3 -36
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/DynamicTable/index.js +13 -11
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/index.js +3 -2
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ListView/utils/tableHeaders.js +8 -8
- package/admin/src/pages/SettingsPage/pages/ApiTokens/ProtectedEditView/index.js +1 -1
- package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/index.js +7 -38
- package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/ActionRow/utils/options.js +31 -0
- package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/index.js +32 -43
- package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/index.js +1 -1
- package/admin/src/pages/SettingsPage/pages/Roles/ListPage/components/RoleRow/index.js +3 -1
- package/admin/src/pages/SettingsPage/pages/Roles/ListPage/index.js +2 -1
- package/admin/src/pages/SettingsPage/pages/Users/ListPage/ModalForm/index.js +2 -2
- package/admin/src/pages/SettingsPage/pages/Webhooks/EditView/components/EventInput/index.js +2 -2
- package/admin/src/permissions/defaultPermissions.js +2 -6
- package/admin/src/translations/ca.json +4 -2
- package/admin/src/translations/de.json +5 -2
- package/admin/src/translations/dk.json +4 -1
- package/admin/src/translations/en.json +38 -3
- package/admin/src/translations/es.json +157 -158
- package/admin/src/translations/fr.json +4 -1
- package/admin/src/translations/gu.json +608 -606
- package/admin/src/translations/he.json +1 -1
- package/admin/src/translations/hi.json +689 -687
- package/admin/src/translations/hu.json +3 -1
- package/admin/src/translations/id.json +3 -1
- package/admin/src/translations/it.json +3 -1
- package/admin/src/translations/ja.json +3 -1
- package/admin/src/translations/ko.json +3 -1
- package/admin/src/translations/ml.json +689 -687
- package/admin/src/translations/nl.json +4 -1
- package/admin/src/translations/no.json +1 -1
- package/admin/src/translations/pl.json +3 -1
- package/admin/src/translations/pt-BR.json +4 -1
- package/admin/src/translations/ru.json +489 -491
- package/admin/src/translations/sa.json +86 -83
- package/admin/src/translations/sk.json +4 -1
- package/admin/src/translations/sv.json +4 -1
- package/admin/src/translations/th.json +1 -1
- package/admin/src/translations/zh-Hans.json +5 -2
- package/admin/src/translations/zh.json +4 -1
- package/build/1856.172d5fa0.chunk.js +174 -0
- package/build/2077.058590f4.chunk.js +206 -0
- package/build/2912.2c42c07b.chunk.js +259 -0
- package/build/4318.5e670740.chunk.js +30 -0
- package/build/4715.22747b59.chunk.js +387 -0
- package/build/{4800.d09f1225.chunk.js → 4800.a6935af6.chunk.js} +1 -1
- package/build/4982.1b75ddb1.chunk.js +325 -0
- package/build/617f9c948fa79e6d73bd.png +0 -0
- package/build/6d21938306785f176538.png +0 -0
- package/build/70674f63fc3904c20de0.svg +7 -0
- package/build/7379.d246dd38.chunk.js +1 -0
- package/build/7692.a36fb2c2.chunk.js +470 -0
- package/build/7841.c50e9509.chunk.js +259 -0
- package/build/7866.ba215f99.chunk.js +505 -0
- package/build/7e9af4fb7e723fcebf1f.svg +48 -0
- package/build/8380.e53e7207.chunk.js +299 -0
- package/build/8549.832ed79d.chunk.js +159 -0
- package/build/8738.0fe8a61e.chunk.js +463 -0
- package/build/{9066.08049eb1.chunk.js → 9066.eaf76ff3.chunk.js} +5 -5
- package/build/{9166.037339e0.chunk.js → 9166.90876521.chunk.js} +16 -15
- package/build/{9420.43a86e7c.chunk.js → 9420.5292d1d2.chunk.js} +38 -37
- package/build/9649.468667d9.chunk.js +199 -0
- package/build/9d5d788027e86620c234.svg +5 -0
- package/build/{Admin-authenticatedApp.e39f36c9.chunk.js → Admin-authenticatedApp.c4f68103.chunk.js} +3 -3
- package/build/{Admin_homePage.118926e0.chunk.js → Admin_homePage.26d32e30.chunk.js} +6 -5
- package/build/Admin_marketplace.32375885.chunk.js +22 -0
- package/build/{Admin_profilePage.9d50ac44.chunk.js → Admin_profilePage.da32abbc.chunk.js} +1 -1
- package/build/Admin_settingsPage.bf2234e1.chunk.js +178 -0
- package/build/admin-app.9049056c.chunk.js +112 -0
- package/build/admin-edit-roles-page.69d9fcb2.chunk.js +1 -0
- package/build/{admin-users.97a08630.chunk.js → admin-users.d71f198a.chunk.js} +3 -3
- package/build/api-tokens-create-page.93dd0689.chunk.js +1 -0
- package/build/api-tokens-edit-page.b0adac81.chunk.js +1 -0
- package/build/api-tokens-list-page.bb36535f.chunk.js +16 -0
- package/build/ca-json.07ae0f2c.chunk.js +1 -0
- package/build/content-manager.ff998bed.chunk.js +1204 -0
- package/build/content-type-builder-list-view.5b3cd768.chunk.js +194 -0
- package/build/content-type-builder-translation-en-json.f985c9c4.chunk.js +1 -0
- package/build/content-type-builder-translation-sv-json.6deff030.chunk.js +1 -0
- package/build/content-type-builder.16af63a6.chunk.js +145 -0
- package/build/de-json.6b3e1894.chunk.js +1 -0
- package/build/dk-json.144c6a8e.chunk.js +1 -0
- package/build/{email-settings-page.64037147.chunk.js → email-settings-page.c3469093.chunk.js} +6 -6
- package/build/en-json.4a269f6b.chunk.js +1 -0
- package/build/es-json.6d123a82.chunk.js +1 -0
- package/build/fr-json.28ab54cb.chunk.js +1 -0
- package/build/gu-json.9a50ea64.chunk.js +1 -0
- package/build/he-json.72f18790.chunk.js +1 -0
- package/build/hi-json.0301b7ba.chunk.js +1 -0
- package/build/hu-json.c4b641bb.chunk.js +1 -0
- package/build/{i18n-settings-page.0b73785d.chunk.js → i18n-settings-page.46d894ff.chunk.js} +5 -5
- package/build/id-json.86035797.chunk.js +1 -0
- package/build/index.html +1 -1
- package/build/it-json.bbdc8993.chunk.js +1 -0
- package/build/ja-json.1c9eeeec.chunk.js +1 -0
- package/build/ko-json.e1f66398.chunk.js +1 -0
- package/build/main.91328e7a.js +9381 -0
- package/build/ml-json.963c889f.chunk.js +1 -0
- package/build/nl-json.2b8cc3a0.chunk.js +1 -0
- package/build/no-json.a58c28bd.chunk.js +1 -0
- package/build/pl-json.249626b3.chunk.js +1 -0
- package/build/pt-BR-json.7852f808.chunk.js +1 -0
- package/build/ru-json.d7cfc2ff.chunk.js +1 -0
- package/build/runtime~main.c9c319c0.js +2 -0
- package/build/sa-json.44e95991.chunk.js +1 -0
- package/build/sk-json.7ba4b330.chunk.js +1 -0
- package/build/sso-settings-page.9ceb0140.chunk.js +1 -0
- package/build/sv-json.8e5a7911.chunk.js +1 -0
- package/build/th-json.a67309b1.chunk.js +1 -0
- package/build/{upload-settings.80ff0974.chunk.js → upload-settings.53b690f3.chunk.js} +5 -5
- package/build/{upload-translation-en-json.004a86c1.chunk.js → upload-translation-en-json.86da7b0a.chunk.js} +1 -1
- package/build/{users-advanced-settings-page.a02f4806.chunk.js → users-advanced-settings-page.3f4ee86e.chunk.js} +5 -5
- package/build/{webhook-edit-page.d2ea3351.chunk.js → webhook-edit-page.dc9442ce.chunk.js} +2 -2
- package/build/webhook-list-page.02191138.chunk.js +134 -0
- package/build/zh-Hans-json.21617c24.chunk.js +1 -0
- package/build/zh-json.608aaf24.chunk.js +1 -0
- package/ee/admin/pages/SettingsPage/pages/Roles/ListPage/index.js +3 -2
- package/ee/server/controllers/user.js +5 -3
- package/env.js +1 -0
- package/package.json +13 -11
- package/scripts/build.js +11 -0
- package/server/bootstrap.js +19 -1
- package/server/config/admin-actions.js +20 -0
- package/server/content-types/api-token-permission.js +36 -0
- package/server/content-types/api-token.js +25 -1
- package/server/content-types/index.js +1 -0
- package/server/controllers/admin.js +3 -0
- package/server/controllers/api-token.js +24 -1
- package/server/controllers/content-api.js +15 -0
- package/server/controllers/index.js +1 -0
- package/server/controllers/user.js +3 -2
- package/server/routes/api-tokens.js +11 -0
- package/server/routes/content-api.js +20 -0
- package/server/routes/index.js +2 -0
- package/server/services/api-token.js +309 -29
- package/server/services/constants.js +10 -0
- package/server/services/permission/engine.js +36 -226
- package/server/services/permission.js +4 -1
- package/server/strategies/admin.js +7 -1
- package/server/strategies/api-token.js +72 -11
- package/server/validation/api-tokens.js +12 -2
- package/utils/create-plugins-exclude-path.js +40 -0
- package/utils/get-custom-app-config-file.js +5 -0
- package/webpack.alias.js +0 -13
- package/webpack.config.js +4 -1
- package/admin/src/assets/images/banner_strapi-rocket.png +0 -0
- package/admin/src/assets/images/big-logo-home.png +0 -0
- package/admin/src/assets/images/homepage-logo.png +0 -0
- package/admin/src/assets/images/icon_made-by-strapi.svg +0 -5
- package/admin/src/assets/images/logo_strapi_auth.png +0 -0
- package/admin/src/assets/images/logo_strapi_auth_v4.png +0 -0
- package/admin/src/assets/images/logo_strapi_menu.png +0 -0
- package/admin/src/assets/images/oops.png +0 -0
- package/admin/src/content-manager/components/State/index.js +0 -37
- package/admin/src/favicon.ico +0 -0
- package/build/15026a3d58aeb2828134.png +0 -0
- package/build/1856.47226450.chunk.js +0 -173
- package/build/2077.c935ee42.chunk.js +0 -205
- package/build/2912.a015078a.chunk.js +0 -258
- package/build/4715.58cd558f.chunk.js +0 -387
- package/build/4982.05eda880.chunk.js +0 -324
- package/build/7098.40dcd7bf.chunk.js +0 -1
- package/build/7841.91f793dc.chunk.js +0 -258
- package/build/7866.1201afbd.chunk.js +0 -504
- package/build/8380.8789ff76.chunk.js +0 -284
- package/build/8549.133c4473.chunk.js +0 -158
- package/build/8851.e4ac62f2.chunk.js +0 -158
- package/build/90f49a385afb000fb1d4.svg +0 -5
- package/build/9311.7cc03f29.chunk.js +0 -508
- package/build/Admin_marketplace.82c0570b.chunk.js +0 -11
- package/build/Admin_settingsPage.98a711e5.chunk.js +0 -178
- package/build/a6b842e0b6d2b61135d1.svg +0 -5
- package/build/admin-app.4f7618a9.chunk.js +0 -112
- package/build/admin-edit-roles-page.554ba3fa.chunk.js +0 -1
- package/build/api-tokens-create-page.4c262d6e.chunk.js +0 -1
- package/build/api-tokens-edit-page.10a9d368.chunk.js +0 -1
- package/build/api-tokens-list-page.442c9f3c.chunk.js +0 -15
- package/build/b997a22a2e0b87ef1fa2.ico +0 -0
- package/build/bd81ba6c07827282255d.png +0 -0
- package/build/c3de6118ef47086ad05c.png +0 -0
- package/build/ca-json.a16899ae.chunk.js +0 -1
- package/build/content-manager.7d57c9d1.chunk.js +0 -1200
- package/build/content-type-builder-list-view.8cc534e0.chunk.js +0 -194
- package/build/content-type-builder-translation-en-json.201bfb78.chunk.js +0 -1
- package/build/content-type-builder.684df7a4.chunk.js +0 -142
- package/build/de-json.aa6026b3.chunk.js +0 -1
- package/build/dk-json.fac2bcfb.chunk.js +0 -1
- package/build/en-json.0c69c7d7.chunk.js +0 -1
- package/build/es-json.d672e181.chunk.js +0 -1
- package/build/fb376b132d18bf4522ca.png +0 -0
- package/build/fde9b1ad0670d29a2516.png +0 -0
- package/build/fr-json.71a16175.chunk.js +0 -1
- package/build/gu-json.ca345cd1.chunk.js +0 -1
- package/build/he-json.3b825d80.chunk.js +0 -1
- package/build/hi-json.50c7e6d4.chunk.js +0 -1
- package/build/hu-json.e0521dcc.chunk.js +0 -1
- package/build/id-json.4b1ff8d6.chunk.js +0 -1
- package/build/it-json.86bac220.chunk.js +0 -1
- package/build/ja-json.4e44e36b.chunk.js +0 -1
- package/build/ko-json.1003756e.chunk.js +0 -1
- package/build/main.b47db1a3.js +0 -9337
- package/build/ml-json.c7774425.chunk.js +0 -1
- package/build/nl-json.f58ea235.chunk.js +0 -1
- package/build/no-json.40386397.chunk.js +0 -1
- package/build/pl-json.fed96aba.chunk.js +0 -1
- package/build/pt-BR-json.073799ab.chunk.js +0 -1
- package/build/ru-json.7ad2cbbf.chunk.js +0 -1
- package/build/runtime~main.feeac6d3.js +0 -2
- package/build/sa-json.f0f704f0.chunk.js +0 -1
- package/build/sk-json.a848961b.chunk.js +0 -1
- package/build/sso-settings-page.445184e0.chunk.js +0 -1
- package/build/sv-json.b038acbe.chunk.js +0 -1
- package/build/th-json.72e8de3d.chunk.js +0 -1
- package/build/webhook-list-page.2775a683.chunk.js +0 -134
- package/build/zh-Hans-json.03d2bda1.chunk.js +0 -1
- package/build/zh-json.3d0cc664.chunk.js +0 -1
- 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,
|
|
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 }) =>
|
|
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
|
|
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
|
|
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 {
|
|
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
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
65
|
+
noRelationsMessage,
|
|
66
|
+
onRelationConnect,
|
|
69
67
|
onRelationLoadMore,
|
|
70
|
-
|
|
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
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
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={
|
|
185
|
-
onMenuOpen={
|
|
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={
|
|
202
|
-
|
|
203
|
-
|
|
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
|
|
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
|
-
<
|
|
313
|
+
<DisconnectButton
|
|
238
314
|
data-testid={`remove-relation-${id}`}
|
|
239
315
|
disabled={disabled}
|
|
240
316
|
type="button"
|
|
241
|
-
onClick={() =>
|
|
317
|
+
onClick={() => onRelationDisconnect(data[index])}
|
|
318
|
+
aria-label={labelDisconnectRelation}
|
|
242
319
|
>
|
|
243
320
|
<Icon width="12px" as={Cross} />
|
|
244
|
-
</
|
|
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
|
-
<
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
|
290
|
-
data: PropTypes.
|
|
291
|
-
|
|
292
|
-
PropTypes.
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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
|
|
308
|
-
data: PropTypes.
|
|
309
|
-
|
|
310
|
-
PropTypes.
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
|
|
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
|
-
|
|
347
|
-
|
|
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:
|
|
426
|
+
searchResults: SearchResults,
|
|
360
427
|
size: PropTypes.number.isRequired,
|
|
361
|
-
relations:
|
|
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={
|
|
18
|
-
paddingBottom={
|
|
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 =
|
|
1
|
+
export const RELATION_ITEM_HEIGHT = 50;
|