From 376e60331a9f923bb042a08179adea202baa5e34 Mon Sep 17 00:00:00 2001 From: soupette Date: Tue, 7 Jan 2020 12:14:41 +0100 Subject: [PATCH 1/3] Fix yup schema for component with min and max validations --- .../utils/cleanData.js | 1 - .../utils/schema.js | 21 +++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/cleanData.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/cleanData.js index 5b61379015..922ea6c740 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/cleanData.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/cleanData.js @@ -22,7 +22,6 @@ const cleanData = (retrievedData, currentSchema, componentsSchema) => { try { cleanedData = JSON.parse(value); } catch (err) { - console.error(err); cleanedData = value; } diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js index 270dca5974..cfd0738819 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js @@ -110,18 +110,17 @@ const createYupSchema = (model, { components }) => { if (min) { componentSchema = yup.lazy(array => { - if (attribute.required) { - return yup - .array() - .of(componentFieldSchema) - .defined() - .min(min, errorsTrads.min); + let schema = yup.array().of(componentFieldSchema); + + if (max) { + schema = schema.max(max, errorsTrads.max); } - let schema = yup - .array() - .of(componentFieldSchema) - .nullable(); + if (attribute.required) { + return schema.defined().min(min, errorsTrads.min); + } + + schema = schema.nullable(); if (array && !isEmpty(array)) { schema = schema.min(min, errorsTrads.min); @@ -131,7 +130,7 @@ const createYupSchema = (model, { components }) => { }); } - if (max) { + if (max && !min) { componentSchema = componentSchema.max(max, errorsTrads.max); } From 71237608a1b90b69ebe95d9d84aca7f91f5b3a1d Mon Sep 17 00:00:00 2001 From: soupette Date: Tue, 7 Jan 2020 14:55:27 +0100 Subject: [PATCH 2/3] Improve component validation test --- .../components/RepeatableComponent/index.js | 5 +- .../utils/schema.js | 56 +++++++++---------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/packages/strapi-plugin-content-manager/admin/src/components/RepeatableComponent/index.js b/packages/strapi-plugin-content-manager/admin/src/components/RepeatableComponent/index.js index db977326eb..a256399126 100644 --- a/packages/strapi-plugin-content-manager/admin/src/components/RepeatableComponent/index.js +++ b/packages/strapi-plugin-content-manager/admin/src/components/RepeatableComponent/index.js @@ -27,7 +27,9 @@ const RepeatableComponent = ({ const [, drop] = useDrop({ accept: ItemTypes.COMPONENT }); const componentErrorKeys = Object.keys(formErrors) - .filter(errorKey => errorKey.includes(name)) + .filter(errorKey => { + return errorKey.split('.')[0] === name; + }) .map(errorKey => { return errorKey .split('.') @@ -123,6 +125,7 @@ const RepeatableComponent = ({ onClick={() => { if (componentValueLength < max) { const shouldCheckErrors = hasMinError; + addRepeatableComponentToField( name, componentUid, diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js index cfd0738819..4c2eb33b2a 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js @@ -96,43 +96,41 @@ const createYupSchema = (model, { components }) => { if (attribute.repeatable === true) { const { min, max } = attribute; + let componentSchema = yup + .array() + .of(componentFieldSchema) + .test('min', function(value) { + let hasMaxError = false; - let componentSchema = - attribute.required === true - ? yup - .array() - .of(componentFieldSchema) - .defined() - : yup - .array() - .of(componentFieldSchema) - .nullable(); - - if (min) { - componentSchema = yup.lazy(array => { - let schema = yup.array().of(componentFieldSchema); - - if (max) { - schema = schema.max(max, errorsTrads.max); + if (max && value) { + hasMaxError = value.length > max; } - if (attribute.required) { - return schema.defined().min(min, errorsTrads.min); + if (min) { + const hasRequiredError = + attribute.required && + (value === undefined || value.length < min); + + if ( + hasRequiredError || + (value && value.length < min && value.length !== 0) + ) { + return this.createError({ + path: this.path, + message: errorsTrads.min, + }); + } } - schema = schema.nullable(); - - if (array && !isEmpty(array)) { - schema = schema.min(min, errorsTrads.min); + if (hasMaxError) { + return this.createError({ + path: this.path, + message: errorsTrads.max, + }); } - return schema; + return true; }); - } - - if (max && !min) { - componentSchema = componentSchema.max(max, errorsTrads.max); - } acc[current] = componentSchema; From 1e871720737622273b144c800f89d46c0d322b34 Mon Sep 17 00:00:00 2001 From: soupette Date: Wed, 8 Jan 2020 10:29:41 +0100 Subject: [PATCH 3/3] Fix PR feedback --- .../utils/schema.js | 48 +++++++------------ 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js index 4c2eb33b2a..42e5c5bb2a 100644 --- a/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js +++ b/packages/strapi-plugin-content-manager/admin/src/containers/EditViewDataManagerProvider/utils/schema.js @@ -95,42 +95,26 @@ const createYupSchema = (model, { components }) => { ); if (attribute.repeatable === true) { - const { min, max } = attribute; - let componentSchema = yup - .array() - .of(componentFieldSchema) - .test('min', function(value) { - let hasMaxError = false; + const { min, max, required } = attribute; + let componentSchema = yup.lazy(value => { + let baseSchema = yup.array().of(componentFieldSchema); - if (max && value) { - hasMaxError = value.length > max; + if (min) { + if (required) { + baseSchema = baseSchema.min(min, errorsTrads.min); + } else if (required !== true && isEmpty(value)) { + baseSchema = baseSchema.nullable(); + } else { + baseSchema = baseSchema.min(min, errorsTrads.min); } + } - if (min) { - const hasRequiredError = - attribute.required && - (value === undefined || value.length < min); + if (max) { + baseSchema = baseSchema.max(max, errorsTrads.max); + } - if ( - hasRequiredError || - (value && value.length < min && value.length !== 0) - ) { - return this.createError({ - path: this.path, - message: errorsTrads.min, - }); - } - } - - if (hasMaxError) { - return this.createError({ - path: this.path, - message: errorsTrads.max, - }); - } - - return true; - }); + return baseSchema; + }); acc[current] = componentSchema;