From e4c70d7a455fe6e852ca4babd263027df62eeba3 Mon Sep 17 00:00:00 2001 From: soupette Date: Thu, 21 Nov 2019 13:15:13 +0100 Subject: [PATCH] Enable nature change --- .../src/components/RelationForm/index.js | 19 ++++- .../RelationFormNaturePicker/Wrapper.js | 2 +- .../RelationFormNaturePicker/index.js | 83 +++++++++++++++---- .../admin/src/containers/FormModal/index.js | 1 + .../admin/src/containers/FormModal/reducer.js | 1 + .../src/containers/FormModal/utils/forms.js | 2 +- .../admin/src/icons/ManyToMany.js | 3 +- .../admin/src/icons/ManyToOne.js | 3 +- .../admin/src/icons/ManyWay.js | 4 +- .../admin/src/icons/OneToMany.js | 3 +- .../admin/src/icons/OneToOne.js | 3 +- .../admin/src/icons/OneWay.js | 4 +- 12 files changed, 100 insertions(+), 28 deletions(-) diff --git a/packages/strapi-plugin-content-type-builder/admin/src/components/RelationForm/index.js b/packages/strapi-plugin-content-type-builder/admin/src/components/RelationForm/index.js index 69759feaef..f07868d648 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/components/RelationForm/index.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/components/RelationForm/index.js @@ -6,7 +6,13 @@ import RelationFormBox from '../RelationFormBox'; import RelationFormNaturePicker from '../RelationFormNaturePicker'; import Wrapper from './Wrapper'; -const RelationForm = ({ errors, mainBoxHeader, modifiedData, onChange }) => { +const RelationForm = ({ + errors, + mainBoxHeader, + modifiedData, + naturePickerType, + onChange, +}) => { const { formatMessage } = useGlobalContext(); const getError = name => { const errorId = get(errors, [name, 'id'], null); @@ -24,9 +30,15 @@ const RelationForm = ({ errors, mainBoxHeader, modifiedData, onChange }) => { onChange={onChange} value={get(modifiedData, 'name', '')} /> - + { +const relations = { + oneWay: OneWay, + oneToOne: OneToOne, + oneToMany: OneToMany, + manyToOne: ManyToOne, + manyToMany: ManyToMany, + manyWay: ManyWay, +}; + +const RelationFormNaturePicker = ({ + nature, + naturePickerType, + onChange, + oneThatIsCreatingARelationWithAnother, + target, +}) => { + const relationsType = + naturePickerType === 'contentType' + ? [ + 'oneWay', + 'oneToOne', + 'oneToMany', + 'manyToOne', + 'manyToMany', + 'manyWay', + ] + : ['oneWay', 'manyWay']; + + const leftTarget = + nature === 'manyToOne' ? target : oneThatIsCreatingARelationWithAnother; + const rightTarget = + nature === 'manyToOne' ? oneThatIsCreatingARelationWithAnother : target; + const leftDisplayedValue = pluralize( + leftTarget, + nature === 'manyToMany' ? 2 : 1 + ); + const rightDisplayedValue = pluralize( + rightTarget, + ['manyToMany', 'oneToMany', 'manyToOne', 'manyWay'].includes(nature) ? 2 : 1 + ); + return (
- - - - - - - - - - - - + {relationsType.map(relationNature => { + const Asset = relations[relationNature]; + + return ( + { + onChange({ + target: { + name: 'nature', + value: relationNature, + type: 'relation', + }, + }); + }} + /> + ); + })}
- left + {truncate(leftDisplayedValue, { length: 24 })}     - right + {truncate(rightDisplayedValue, { length: 24 })}
@@ -45,6 +94,10 @@ RelationFormNaturePicker.defaultProps = { RelationFormNaturePicker.propTypes = { nature: PropTypes.string, + naturePickerType: PropTypes.string.isRequired, + onChange: PropTypes.func.isRequired, + oneThatIsCreatingARelationWithAnother: PropTypes.string.isRequired, + target: PropTypes.string.isRequired, }; export default RelationFormNaturePicker; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js index 8d884d279a..0718bff3f5 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js @@ -409,6 +409,7 @@ const FormModal = () => { key="relation" mainBoxHeader={name} modifiedData={modifiedData} + naturePickerType={state.forTarget} onChange={handleChange} errors={formErrors} /> diff --git a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/reducer.js b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/reducer.js index 4811f654a1..e6947db2c9 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/reducer.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/reducer.js @@ -32,6 +32,7 @@ const reducer = (state, action) => { type: 'relation', nature: 'oneWay', targetAttribute: '-', + target: 'address', }; } else { dataToSet = { type: attributeType, default: null }; diff --git a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/utils/forms.js b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/utils/forms.js index d38b96d872..5df2cc742f 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/utils/forms.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/utils/forms.js @@ -141,7 +141,6 @@ const forms = { ...numberTypeShape, }); case 'relation': - console.log('lll'); return yup.object().shape({ name: yup .string() @@ -152,6 +151,7 @@ const forms = { .unique(errorsTrads.unique, targetAttributeAllreadyTakenValue) .required(errorsTrads.required), type: yup.string().required(errorsTrads.required), + target: yup.string().required(errorsTrads.required), nature: yup.string().required(), dominant: yup.boolean(), unique: yup.boolean().nullable(), diff --git a/packages/strapi-plugin-content-type-builder/admin/src/icons/ManyToMany.js b/packages/strapi-plugin-content-type-builder/admin/src/icons/ManyToMany.js index 113cabf76a..aaa8c16326 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/icons/ManyToMany.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/icons/ManyToMany.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -const ManyToMany = ({ isSelected }) => { +const ManyToMany = ({ isSelected, ...rest }) => { const stroke = isSelected ? '#1C5DE7' : '#919BAE'; const rectProps = isSelected ? { @@ -14,6 +14,7 @@ const ManyToMany = ({ isSelected }) => { return ( { +const ManyToOne = ({ isSelected, ...rest }) => { const stroke = isSelected ? '#1C5DE7' : '#919BAE'; const rectProps = isSelected ? { @@ -14,6 +14,7 @@ const ManyToOne = ({ isSelected }) => { return ( { +const ManyWay = ({ isSelected, ...rest }) => { const rectStroke = isSelected ? '#1C5DE7' : '#E3E9F3'; const stroke = isSelected ? '#1C5DE7' : '#ABB3C2'; const otherStroke = isSelected ? '#1C5DE7' : '#ABB3C4'; return ( - + diff --git a/packages/strapi-plugin-content-type-builder/admin/src/icons/OneToMany.js b/packages/strapi-plugin-content-type-builder/admin/src/icons/OneToMany.js index 8446a1bfd7..5da78815fe 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/icons/OneToMany.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/icons/OneToMany.js @@ -1,7 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; -const OneToMany = ({ isSelected }) => { +const OneToMany = ({ isSelected, ...rest }) => { const stroke = isSelected ? '#1C5DE7' : '#919BAE'; const rectProps = isSelected ? { @@ -14,6 +14,7 @@ const OneToMany = ({ isSelected }) => { return ( { +const OneToOne = ({ isSelected, ...rest }) => { const stroke = isSelected ? '#1C5DE7' : '#919BAE'; const rectProps = isSelected ? { @@ -14,6 +14,7 @@ const OneToOne = ({ isSelected }) => { return ( { +const OneWay = ({ isSelected, ...rest }) => { const stroke = isSelected ? '#1C5DE7' : '#919BAE'; const rectProps = isSelected ? { @@ -12,7 +12,7 @@ const OneWay = ({ isSelected }) => { stroke: '#101622', }; return ( - +