diff --git a/src/server/plugins/engine/components/MultilineTextField.test.ts b/src/server/plugins/engine/components/MultilineTextField.test.ts index d903e404d..9cbd20dc4 100644 --- a/src/server/plugins/engine/components/MultilineTextField.test.ts +++ b/src/server/plugins/engine/components/MultilineTextField.test.ts @@ -627,6 +627,51 @@ describe('MultilineTextField', () => { output: { value: getFormData('') } } ] + }, + { + description: 'Schema max with whitespace replacement', + component: { + title: 'Example textarea', + name: 'myComponent', + type: ComponentType.MultilineTextField, + options: {}, + schema: { + max: 10 + } + } satisfies MultilineTextFieldComponent, + assertions: [ + { + input: getFormData(`h\r\ne\r\nl\r\nl\r\no`), + output: { + value: getFormData(`h\ne\nl\nl\no`) + } + } + ] + }, + { + description: 'Schema max with whitespace replacement', + component: { + title: 'Example textarea', + name: 'myComponent', + type: ComponentType.MultilineTextField, + options: {}, + schema: { + max: 8 + } + } satisfies MultilineTextFieldComponent, + assertions: [ + { + input: getFormData(`h\r\ne\r\nl\r\nl\r\no`), + output: { + value: getFormData(`h\ne\nl\nl\no`), + errors: [ + expect.objectContaining({ + text: 'Example textarea must be 8 characters or less' + }) + ] + } + } + ] } ])('$description', ({ component: def, assertions }) => { let collection: ComponentCollection diff --git a/src/server/plugins/engine/components/MultilineTextField.ts b/src/server/plugins/engine/components/MultilineTextField.ts index 68bf908db..37971b78d 100644 --- a/src/server/plugins/engine/components/MultilineTextField.ts +++ b/src/server/plugins/engine/components/MultilineTextField.ts @@ -26,7 +26,11 @@ export class MultilineTextField extends FormComponent { const { schema, options } = def - let formSchema = Joi.string().trim().label(this.label).required() + let formSchema = Joi.string() + .replace(/\r\n/g, '\n') + .trim() + .label(this.label) + .required() if (options.required === false) { formSchema = formSchema.allow('')