diff --git a/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/ListItem.js b/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/ListItem.js index 4f7721433c..ae146ad31f 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/ListItem.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/ListItem.js @@ -18,6 +18,7 @@ function ListItem({ mainField, moveRelation, onRemove, + searchToPersist, targetModel, }) { const to = `/plugins/${pluginId}/collectionType/${targetModel}/${data.id}`; @@ -72,6 +73,7 @@ function ListItem({ data={data} to={to} isDisabled={isDisabled} + searchToPersist={searchToPersist} /> ); @@ -81,6 +83,7 @@ ListItem.defaultProps = { findRelation: () => {}, moveRelation: () => {}, onRemove: () => {}, + searchToPersist: null, targetModel: '', }; @@ -97,6 +100,7 @@ ListItem.propTypes = { }).isRequired, moveRelation: PropTypes.func, onRemove: PropTypes.func, + searchToPersist: PropTypes.string, targetModel: PropTypes.string, }; diff --git a/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/Relation.js b/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/Relation.js index 428454616d..f558447e58 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/Relation.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/Relation.js @@ -19,6 +19,7 @@ const Relation = ({ isDragging, mainField, onRemove, + searchToPersist, to, }) => { const { formatMessage } = useIntl(); @@ -61,7 +62,10 @@ const Relation = ({ )} {displayNavigationLink ? ( - + {formattedValue}  ) : ( @@ -78,6 +82,7 @@ const Relation = ({ Relation.defaultProps = { isDragging: false, onRemove: () => {}, + searchToPersist: null, to: '', }; @@ -94,6 +99,7 @@ Relation.propTypes = { }).isRequired, }).isRequired, onRemove: PropTypes.func, + searchToPersist: PropTypes.string, to: PropTypes.string, }; diff --git a/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/index.js b/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/index.js index 32f6ce0ce1..d21ddfae70 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/SelectMany/index.js @@ -23,6 +23,7 @@ function SelectMany({ onRemove, options, placeholder, + searchToPersist, styles, targetModel, value, @@ -109,6 +110,7 @@ function SelectMany({ onRemove(`${name}.${index}`); } }} + searchToPersist={searchToPersist} targetModel={targetModel} /> ))} @@ -123,6 +125,7 @@ function SelectMany({ SelectMany.defaultProps = { components: {}, move: () => {}, + searchToPersist: null, value: null, }; @@ -147,6 +150,7 @@ SelectMany.propTypes = { onRemove: PropTypes.func.isRequired, options: PropTypes.array.isRequired, placeholder: PropTypes.node.isRequired, + searchToPersist: PropTypes.string, styles: PropTypes.object.isRequired, targetModel: PropTypes.string.isRequired, value: PropTypes.array, diff --git a/packages/strapi-plugin-content-manager/admin/src/components/SelectWrapper/index.js b/packages/strapi-plugin-content-manager/admin/src/components/SelectWrapper/index.js index 7a9b6a6bbc..d9cee36cf4 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/SelectWrapper/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/SelectWrapper/index.js @@ -2,14 +2,16 @@ import React, { useCallback, useState, useEffect, useMemo, memo } from 'react'; import PropTypes from 'prop-types'; import { FormattedMessage, useIntl } from 'react-intl'; import { Link, useLocation } from 'react-router-dom'; -import { findIndex, get, isArray, isEmpty } from 'lodash'; +import { findIndex, get, isArray, isEmpty, set } from 'lodash'; import { LabelIconWrapper, NotAllowedInput, request, useContentManagerEditViewDataManager, + useQueryParams, } from 'strapi-helper-plugin'; import { Flex, Text, Padded } from '@buffetjs/core'; +import { stringify } from 'qs'; import pluginId from '../../pluginId'; import SelectOne from '../SelectOne'; import SelectMany from '../SelectMany'; @@ -25,6 +27,22 @@ const initialPaginationState = { _limit: 20, _start: 0, }; + +const buildParams = (query, paramsToKeep) => { + if (!paramsToKeep) { + return {}; + } + + return paramsToKeep.reduce((acc, current) => { + const value = get(query, current, null); + + if (value) { + set(acc, current, value); + } + + return acc; + }, {}); +}; function SelectWrapper({ description, editable, @@ -41,6 +59,7 @@ function SelectWrapper({ queryInfos, }) { const { formatMessage } = useIntl(); + const [{ query }] = useQueryParams(); // Disable the input in case of a polymorphic relation const isMorph = useMemo(() => relationType.toLowerCase().includes('morph'), [relationType]); const { @@ -74,7 +93,13 @@ function SelectWrapper({ }); }, [options, value]); - const { endPoint, containsKey, defaultParams, shouldDisplayRelationLink } = queryInfos; + const { + endPoint, + containsKey, + defaultParams, + shouldDisplayRelationLink, + paramsToKeep, + } = queryInfos; const isSingle = ['oneWay', 'oneToOne', 'manyToOne', 'oneToManyMorph', 'oneToOneMorph'].includes( relationType @@ -206,6 +231,8 @@ function SelectWrapper({ const to = `/plugins/${pluginId}/collectionType/${targetModel}/${value ? value.id : null}`; + const searchToPersist = stringify(buildParams(query, paramsToKeep), { encode: false }); + const link = useMemo(() => { if (!value) { return null; @@ -216,13 +243,13 @@ function SelectWrapper({ } return ( - + {msg => {msg}} ); - }, [shouldDisplayRelationLink, pathname, to, value]); + }, [shouldDisplayRelationLink, pathname, to, value, searchToPersist]); const Component = isSingle ? SelectOne : SelectMany; const associationsLength = isArray(value) ? value.length : 0; @@ -305,6 +332,7 @@ function SelectWrapper({ placeholder ) } + searchToPersist={searchToPersist} styles={styles} targetModel={targetModel} value={value} @@ -348,11 +376,12 @@ SelectWrapper.propTypes = { placeholder: PropTypes.string, relationType: PropTypes.string.isRequired, targetModel: PropTypes.string.isRequired, - queryInfos: PropTypes.exact({ + queryInfos: PropTypes.shape({ containsKey: PropTypes.string.isRequired, defaultParams: PropTypes.object, endPoint: PropTypes.string.isRequired, shouldDisplayRelationLink: PropTypes.bool.isRequired, + paramsToKeep: PropTypes.array, }).isRequired, }; diff --git a/packages/strapi-plugin-i18n/admin/src/components/CMEditViewInjectedComponents/index.js b/packages/strapi-plugin-i18n/admin/src/components/CMEditViewInjectedComponents/index.js index 589f71db00..af161918db 100644 --- a/packages/strapi-plugin-i18n/admin/src/components/CMEditViewInjectedComponents/index.js +++ b/packages/strapi-plugin-i18n/admin/src/components/CMEditViewInjectedComponents/index.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useMemo } from 'react'; import get from 'lodash/get'; import { useSelector } from 'react-redux'; import { useParams } from 'react-router-dom'; @@ -16,11 +16,19 @@ const CMEditViewInjectedComponents = () => { const id = get(params, 'id', null); const currentEntityId = id === 'create' ? null : id; - const currentLocale = get(query, 'plugins.i18n.locale', false); - + const defaultLocale = locales.find(loc => loc.isDefault); + const currentLocale = get(query, 'plugins.i18n.locale', defaultLocale.code); const hasI18nEnabled = get(layout, ['pluginOptions', 'i18n', 'localized'], false); const hasDraftAndPublishEnabled = get(layout, ['options', 'draftAndPublish'], false); + const defaultQuery = useMemo(() => { + if (!query) { + return { plugins: { i18n: { locale: currentLocale } } }; + } + + return query; + }, [query, currentLocale]); + if (!hasI18nEnabled) { return null; } @@ -42,7 +50,7 @@ const CMEditViewInjectedComponents = () => { createPermissions={createPermissions} hasDraftAndPublishEnabled={hasDraftAndPublishEnabled} localizations={localizations} - query={query} + query={defaultQuery} readPermissions={readPermissions} slug={slug} /> diff --git a/packages/strapi-plugin-i18n/admin/src/middlewares/extendCMEditViewLayoutMiddleware.js b/packages/strapi-plugin-i18n/admin/src/middlewares/extendCMEditViewLayoutMiddleware.js index 9818af7446..802e1fe821 100644 --- a/packages/strapi-plugin-i18n/admin/src/middlewares/extendCMEditViewLayoutMiddleware.js +++ b/packages/strapi-plugin-i18n/admin/src/middlewares/extendCMEditViewLayoutMiddleware.js @@ -18,6 +18,7 @@ const enhanceRelationLayout = (layout, locale) => queryInfos = { ...queryInfos, defaultParams: { ...queryInfos.defaultParams, _locale: locale }, + paramsToKeep: ['plugins.i18n.locale'], }; } @@ -79,6 +80,7 @@ const enhanceComponentLayoutForRelations = (layout, locale) => const queryInfos = { ...field.queryInfos, defaultParams: { ...field.queryInfos.defaultParams, _locale: locale }, + paramsToKeep: ['plugins.i18n.locale'], }; acc.push({ ...field, queryInfos }); diff --git a/packages/strapi-plugin-i18n/admin/src/middlewares/tests/extendCMEditViewLayoutMiddleware.test.js b/packages/strapi-plugin-i18n/admin/src/middlewares/tests/extendCMEditViewLayoutMiddleware.test.js index 5de1cd2990..cdc0b1f5a9 100644 --- a/packages/strapi-plugin-i18n/admin/src/middlewares/tests/extendCMEditViewLayoutMiddleware.test.js +++ b/packages/strapi-plugin-i18n/admin/src/middlewares/tests/extendCMEditViewLayoutMiddleware.test.js @@ -107,6 +107,7 @@ describe('i18n | Middlewares | extendCMEditViewLayoutMiddleware', () => { queryInfos: { test: true, defaultParams: {}, + paramsToKeep: ['plugins.i18n.locale'], }, size: 6, targetModelPluginOptions: {}, @@ -143,6 +144,7 @@ describe('i18n | Middlewares | extendCMEditViewLayoutMiddleware', () => { queryInfos: { test: true, defaultParams: {}, + paramsToKeep: ['plugins.i18n.locale'], }, size: 6, targetModelPluginOptions: {}, @@ -305,6 +307,7 @@ describe('i18n | Middlewares | extendCMEditViewLayoutMiddleware', () => { targetModelPluginOptions: { i18n: { localized: true } }, queryInfos: { defaultParams: { test: true, _locale: 'en' }, + paramsToKeep: ['plugins.i18n.locale'], }, }, { @@ -326,6 +329,7 @@ describe('i18n | Middlewares | extendCMEditViewLayoutMiddleware', () => { targetModelPluginOptions: { i18n: { localized: true } }, queryInfos: { defaultParams: { test: true, _locale: 'en' }, + paramsToKeep: ['plugins.i18n.locale'], }, }, { @@ -515,6 +519,7 @@ describe('i18n | Middlewares | extendCMEditViewLayoutMiddleware', () => { test: true, _locale: 'en', }, + paramsToKeep: ['plugins.i18n.locale'], }, size: 6, targetModelPluginOptions: {