From bfbe318a1e16bad8630b5738d1b7906ba06a3354 Mon Sep 17 00:00:00 2001 From: Hanna Kurban <hannak@form.io> Date: Thu, 14 Nov 2024 09:53:51 +0300 Subject: [PATCH] FIO-9344 fixed require validation for day component --- .../__tests__/validateRequiredDay.test.ts | 45 +++++++++++++++++++ .../validation/rules/validateRequiredDay.ts | 32 ++++++++++--- 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/src/process/validation/rules/__tests__/validateRequiredDay.test.ts b/src/process/validation/rules/__tests__/validateRequiredDay.test.ts index 7f4a272c..e32adef5 100644 --- a/src/process/validation/rules/__tests__/validateRequiredDay.test.ts +++ b/src/process/validation/rules/__tests__/validateRequiredDay.test.ts @@ -52,4 +52,49 @@ describe('validateRequiredDay', function () { expect(result).to.be.instanceOf(FieldError); expect(result?.errorKeyOrMessage).to.equal('requiredYearField'); }); + + it('Validating a day component that requires month and year will not return a FieldError if year and month are given', async function () { + const component = { + ...simpleDayField, + fields: { + year: { required: true }, + month: { required: true }, + day: { hide: true } + }, + }; + const data = { component: '07/2024' }; + const context = generateProcessorContext(component, data); + const result = await validateRequiredDay(context); + expect(result).to.equal(null); + }); + + it('Validating a day component that requires day and year will not return a FieldError if year and day are given', async function () { + const component = { + ...simpleDayField, + fields: { + year: { required: true }, + day: { required: true }, + month: { hide: true } + }, + }; + const data = { component: '24/2024' }; + const context = generateProcessorContext(component, data); + const result = await validateRequiredDay(context); + expect(result).to.equal(null); + }); + + it('Validating a day component that requires day and month will not return a FieldError if day and month are given', async function () { + const component = { + ...simpleDayField, + fields: { + month: { required: true }, + day: { required: true }, + year: { hide: true } + }, + }; + const data = { component: '07/24' }; + const context = generateProcessorContext(component, data); + const result = await validateRequiredDay(context); + expect(result).to.equal(null); + }); }); diff --git a/src/process/validation/rules/validateRequiredDay.ts b/src/process/validation/rules/validateRequiredDay.ts index f56aa847..cd2e1078 100644 --- a/src/process/validation/rules/validateRequiredDay.ts +++ b/src/process/validation/rules/validateRequiredDay.ts @@ -39,11 +39,33 @@ export const validateRequiredDaySync: RuleFnSync = (context: ValidationContext) 'validate:validateRequiredDay', ); } - const [DAY, MONTH, YEAR] = component.dayFirst ? [0, 1, 2] : [1, 0, 2]; - const values = value.split('/').map((x) => parseInt(x, 10)), - day = values[DAY], - month = values[MONTH], - year = values[YEAR]; + let [DAY, MONTH, YEAR] = component.dayFirst ? [0, 1, 2] : [1, 0, 2]; + const values = value.split('/').map((x) => parseInt(x, 10)); + let day = values[DAY]; + let month = values[MONTH]; + let year = values[YEAR]; + + if (values.length !== 3) { + if (component.fields.day.hide) { + MONTH = MONTH === 0 ? 0 : MONTH - 1; + YEAR = YEAR - 1; + day = 0; + month = values[MONTH]; + year = values[YEAR]; + } + if (component.fields.month.hide) { + DAY = DAY === 0 ? 0 : DAY - 1; + YEAR = YEAR - 1; + day = component.fields.day.hide && day === 0 ? 0 : values[DAY]; + month = 0; + year = values[YEAR]; + } + if (component.fields.year.hide) { + day = component.fields.day.hide && day === 0 ? 0 : values[DAY]; + month = component.fields.month.hide && month === 0 ? 0 : values[MONTH]; + year = 0; + } + } if (!day && component.fields?.day?.required) { return new FieldError('requiredDayField', context, 'day');