diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/CollectionTypeFormWrapper/index.js b/packages/strapi-plugin-content-manager/admin/src/containers/CollectionTypeFormWrapper/index.js index 471f52fce6..21728c77f4 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/CollectionTypeFormWrapper/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/CollectionTypeFormWrapper/index.js @@ -10,6 +10,7 @@ import { } from 'strapi-helper-plugin'; import { useSelector, useDispatch } from 'react-redux'; import PropTypes from 'prop-types'; +import isEqual from 'react-fast-compare'; import { createDefaultForm, getTrad, removePasswordFieldsFromData } from '../../utils'; import pluginId from '../../pluginId'; import { @@ -160,13 +161,13 @@ const CollectionTypeFormWrapper = ({ allLayoutData, children, from, slug, id, or if (requestURL) { fetchData(signal); } else { - dispatch(initForm()); + dispatch(initForm(rawQuery)); } return () => { abortController.abort(); }; - }, [cleanClonedData, cleanReceivedData, push, requestURL, dispatch]); + }, [cleanClonedData, cleanReceivedData, push, requestURL, dispatch, rawQuery]); const displayErrors = useCallback(err => { const errorPayload = err.response.payload; @@ -361,4 +362,4 @@ CollectionTypeFormWrapper.propTypes = { slug: PropTypes.string.isRequired, }; -export default memo(CollectionTypeFormWrapper); +export default memo(CollectionTypeFormWrapper, isEqual); diff --git a/packages/strapi-plugin-content-manager/admin/src/sharedReducers/crudReducer/actions.js b/packages/strapi-plugin-content-manager/admin/src/sharedReducers/crudReducer/actions.js index 871c5a4a38..00a9e8170a 100644 --- a/packages/strapi-plugin-content-manager/admin/src/sharedReducers/crudReducer/actions.js +++ b/packages/strapi-plugin-content-manager/admin/src/sharedReducers/crudReducer/actions.js @@ -19,8 +19,9 @@ export const getDataSucceeded = data => ({ data, }); -export const initForm = () => ({ +export const initForm = rawQuery => ({ type: INIT_FORM, + rawQuery, }); export const resetProps = () => ({ type: RESET_PROPS }); diff --git a/packages/strapi-plugin-content-manager/admin/src/sharedReducers/crudReducer/reducer.js b/packages/strapi-plugin-content-manager/admin/src/sharedReducers/crudReducer/reducer.js index e08ae6acdb..a3a947479a 100644 --- a/packages/strapi-plugin-content-manager/admin/src/sharedReducers/crudReducer/reducer.js +++ b/packages/strapi-plugin-content-manager/admin/src/sharedReducers/crudReducer/reducer.js @@ -39,6 +39,13 @@ const crudReducer = (state = crudInitialState, action) => break; } case INIT_FORM: { + if (action.data) { + draftState.isLoading = false; + draftState.data = action.data; + + break; + } + draftState.isLoading = false; draftState.data = state.contentTypeDataStructure; break; diff --git a/packages/strapi-plugin-i18n/admin/src/middlewares/addCommonFieldsToInitialDataMiddleware.js b/packages/strapi-plugin-i18n/admin/src/middlewares/addCommonFieldsToInitialDataMiddleware.js new file mode 100644 index 0000000000..36b2fc346e --- /dev/null +++ b/packages/strapi-plugin-i18n/admin/src/middlewares/addCommonFieldsToInitialDataMiddleware.js @@ -0,0 +1,59 @@ +import get from 'lodash/get'; +import merge from 'lodash/merge'; +import cloneDeep from 'lodash/cloneDeep'; +import { parse } from 'qs'; +import { request, formatComponentData } from 'strapi-helper-plugin'; +import pluginId from '../pluginId'; + +const addCommonFieldsToInitialDataMiddleware = () => ({ getState, dispatch }) => next => action => { + if (action.type !== 'ContentManager/CrudReducer/INIT_FORM') { + return next(action); + } + + if (!action.rawQuery) { + return next(action); + } + + const search = action.rawQuery.substring(1); + const query = parse(search); + const relatedEntityId = get(query, 'plugins.i18n.relatedEntityId', null); + + if (!relatedEntityId) { + return next(action); + } + + const cmDataStore = getState().get('content-manager_editViewCrudReducer'); + const cmLayoutStore = getState().get('content-manager_editViewLayoutManager'); + const { contentTypeDataStructure } = cmDataStore; + const { currentLayout } = cmLayoutStore; + + const getData = async () => { + dispatch({ type: 'ContentManager/CrudReducer/GET_DATA' }); + + try { + const requestURL = `${pluginId}/content-manager/actions/get-non-localized-fields`; + const body = { model: currentLayout.contentType.uid, id: relatedEntityId }; + + const { data } = await request(requestURL, { method: 'POST', body }); + + const { nonLocalizedFields, localizations } = data; + + const merged = merge(cloneDeep(contentTypeDataStructure, nonLocalizedFields)); + merged.localizations = localizations; + + action.data = formatComponentData( + merged, + currentLayout.contentType, + currentLayout.components + ); + } catch (err) { + // Silent + } + + return next(action); + }; + + return getData(); +}; + +export default addCommonFieldsToInitialDataMiddleware; diff --git a/packages/strapi-plugin-i18n/admin/src/middlewares/index.js b/packages/strapi-plugin-i18n/admin/src/middlewares/index.js index d012a516c0..3c0d78db2a 100644 --- a/packages/strapi-plugin-i18n/admin/src/middlewares/index.js +++ b/packages/strapi-plugin-i18n/admin/src/middlewares/index.js @@ -1,3 +1,4 @@ +import addCommonFieldsToInitialDataMiddleware from './addCommonFieldsToInitialDataMiddleware'; import addLocaleToSingleTypesMiddleware from './addLocaleToSingleTypesMiddleware'; import extendCMEditViewLayoutMiddleware from './extendCMEditViewLayoutMiddleware'; import extendCTBInitialDataMiddleware from './extendCTBInitialDataMiddleware'; @@ -6,6 +7,7 @@ import localeQueryParamsMiddleware from './localeQueryParamsMiddleware'; import localePermissionMiddleware from './localePermissionMiddleware'; const middlewares = [ + addCommonFieldsToInitialDataMiddleware, addLocaleToSingleTypesMiddleware, extendCMEditViewLayoutMiddleware, extendCTBInitialDataMiddleware,