diff --git a/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/index.js b/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/index.js index 51d0d9bc67..fe05f09533 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/index.js @@ -9,6 +9,7 @@ import pluginId from '../../pluginId'; import useEditView from '../../hooks/useEditView'; import ComponentInitializer from '../ComponentInitializer'; import NonRepeatableComponent from '../NonRepeatableComponent'; +import NotAllowedInput from '../NotAllowedInput'; import RepeatableComponent from '../RepeatableComponent'; import connect from './utils/connect'; import select from './utils/select'; @@ -29,6 +30,7 @@ const FieldComponent = ({ min, name, // Passed thanks to the connect function + hasChildrenAllowedFields, componentValue, removeComponentFromField, }) => { @@ -41,6 +43,14 @@ const FieldComponent = ({ const displayedFields = get(currentComponentSchema, ['layouts', 'edit'], []); + if (!hasChildrenAllowedFields) { + return ( +
+ +
+ ); + } + return ( {isFromDynamicZone && ( @@ -102,6 +112,7 @@ const FieldComponent = ({ FieldComponent.defaultProps = { componentValue: null, componentFriendlyName: null, + hasChildrenAllowedFields: false, icon: 'smile', isFromDynamicZone: false, isRepeatable: false, @@ -114,6 +125,7 @@ FieldComponent.propTypes = { componentFriendlyName: PropTypes.string, componentUid: PropTypes.string.isRequired, componentValue: PropTypes.oneOfType([PropTypes.object, PropTypes.array]), + hasChildrenAllowedFields: PropTypes.bool, icon: PropTypes.string, isFromDynamicZone: PropTypes.bool, isRepeatable: PropTypes.bool, diff --git a/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/utils/connect.js b/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/utils/connect.js index 238d60ef82..648a3d30e4 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/utils/connect.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/utils/connect.js @@ -3,7 +3,7 @@ import React from 'react'; function connect(WrappedComponent, select) { return function(props) { // eslint-disable-next-line react/prop-types - const selectors = select(props.name); + const selectors = select(props); return ; }; diff --git a/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/utils/select.js b/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/utils/select.js index 872f4e5e75..3af397a272 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/utils/select.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/FieldComponent/utils/select.js @@ -1,12 +1,37 @@ -import { useContext } from 'react'; +import { useContext, useMemo } from 'react'; import { get } from 'lodash'; import EditViewDataManagerContext from '../../../contexts/EditViewDataManager'; -function useSelect(name) { - const { modifiedData, removeComponentFromField } = useContext(EditViewDataManagerContext); +function useSelect({ isFromDynamicZone, name }) { + const { + createActionAllowedFields, + isCreatingEntry, + modifiedData, + removeComponentFromField, + } = useContext(EditViewDataManagerContext); + + const allowedFields = useMemo(() => { + return isCreatingEntry ? createActionAllowedFields : []; + }, [isCreatingEntry, createActionAllowedFields]); + const componentValue = get(modifiedData, name, null); + const hasChildrenAllowedFields = useMemo(() => { + if (isFromDynamicZone) { + return true; + } + + const relatedChildrenAllowedFields = allowedFields + .map(fieldName => { + return fieldName.split('.')[0]; + }) + .filter(fieldName => fieldName === name.split('.')[0]); + + return relatedChildrenAllowedFields.length > 0; + }, [allowedFields, isFromDynamicZone, name]); + return { + hasChildrenAllowedFields, removeComponentFromField, componentValue, }; diff --git a/packages/strapi-plugin-content-manager/admin/src/components/Inputs/index.js b/packages/strapi-plugin-content-manager/admin/src/components/Inputs/index.js index fd99f61e08..546bfc5b67 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/Inputs/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/Inputs/index.js @@ -143,7 +143,6 @@ function Inputs({ if (isChildOfDynamicZone) { // TODO we can simply return true here if we block the dynamic zone - console.log('opooooo'); return allowedFields.includes(fieldName[0]); } diff --git a/packages/strapi-plugin-content-manager/admin/src/components/Inputs/utils/select.js b/packages/strapi-plugin-content-manager/admin/src/components/Inputs/utils/select.js index 0f9d9b51fb..06e1ec6f92 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/Inputs/utils/select.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/Inputs/utils/select.js @@ -4,17 +4,19 @@ import EditViewDataManagerContext from '../../../contexts/EditViewDataManager'; function useSelect(keys) { const { - modifiedData, - formErrors, - onChange, - isCreatingEntry, createActionAllowedFields, + formErrors, + isCreatingEntry, + modifiedData, + onChange, } = useContext(EditViewDataManagerContext); - const value = get(modifiedData, keys, null); + const allowedFields = useMemo(() => { return isCreatingEntry ? createActionAllowedFields : []; }, [isCreatingEntry, createActionAllowedFields]); + const value = get(modifiedData, keys, null); + return { allowedFields, formErrors,