From 3d59f035ca568b61d77812791114fb1ba0a7341c Mon Sep 17 00:00:00 2001 From: David Stone Date: Thu, 4 Jun 2026 16:24:14 +0100 Subject: [PATCH 1/3] Update telephone number error messages --- .../components/helpers/telephone.test.js | 10 +++---- .../engine/components/helpers/telephone.ts | 30 ++++--------------- 2 files changed, 10 insertions(+), 30 deletions(-) diff --git a/src/server/plugins/engine/components/helpers/telephone.test.js b/src/server/plugins/engine/components/helpers/telephone.test.js index a9a457cbd..870e8c95c 100644 --- a/src/server/plugins/engine/components/helpers/telephone.test.js +++ b/src/server/plugins/engine/components/helpers/telephone.test.js @@ -38,7 +38,7 @@ describe('Telephone validation helpers', () => { expect(result.error).toBeDefined() expect(result.error?.message).toBe( - 'Enter home phone, like 01632 960 001, 07700 900 982 or +44 808 157 0192' + 'Enter home phone in the correct format' ) expect(result.value).toBe('ABC') }) @@ -53,7 +53,7 @@ describe('Telephone validation helpers', () => { expect(result.error).toBeDefined() expect(result.error?.message).toBe( - 'Enter home phone, like 01632 960 001, 07700 900 982 or +44 808 157 0192' + 'Enter home phone in the correct format' ) expect(result.value).toBe('+1-212-456-7890') }) @@ -86,7 +86,7 @@ describe('Telephone validation helpers', () => { expect(result.error).toBeDefined() expect(result.error?.message).toBe( - 'Enter home phone, starting with + and the country code, for example +92333 1234567 or 00923331234567' + 'Enter home phone in the correct format' ) expect(result.value).toBe('ABC') }) @@ -103,7 +103,7 @@ describe('Telephone validation helpers', () => { expect(result.error).toBeDefined() expect(result.error?.message).toBe( - 'Enter home phone, starting with + and the country code, for example +92333 1234567 or 00923331234567' + 'Enter home phone in the correct format' ) expect(result.value).toBe('+44 1606 76477') }) @@ -135,7 +135,7 @@ describe('Telephone validation helpers', () => { expect(result.error).toBeDefined() expect(result.error?.message).toBe( - 'Enter home phone, like 01632 960 001, 07700 900 982, +44 808 157 0192 or +924568456136' + 'Enter home phone in the correct format' ) expect(result.value).toBe('ABC') }) diff --git a/src/server/plugins/engine/components/helpers/telephone.ts b/src/server/plugins/engine/components/helpers/telephone.ts index 39c22abd9..747318543 100644 --- a/src/server/plugins/engine/components/helpers/telephone.ts +++ b/src/server/plugins/engine/components/helpers/telephone.ts @@ -8,37 +8,17 @@ const phoneUtil = LibPhoneNumber.PhoneNumberUtil.getInstance() export const COUNTRY = 'GB' export const INVALID_ERROR_CODE = 'phoneNumber.invalid' -export const UK_ERROR_CODE = 'phoneNumber.uk' -export const INTERNATIONAL_ERROR_CODE = 'phoneNumber.international' export const isUKNumber = (value: LibPhoneNumber.PhoneNumber) => { return phoneUtil.isValidNumberForRegion(value, COUNTRY) } -export function getErrorCode(format?: TelephoneNumberFieldOptionsFormatEnum) { - if (format === TelephoneNumberFieldOptionsFormatEnum.UK) { - return UK_ERROR_CODE - } else if (format === TelephoneNumberFieldOptionsFormatEnum.International) { - return INTERNATIONAL_ERROR_CODE - } - - return INVALID_ERROR_CODE -} - export const joi = JoiBase.extend({ type: 'string', base: JoiBase.string(), messages: { [INVALID_ERROR_CODE]: JoiBase.expression( - 'Enter {{lowerFirst(#label)}}, like 01632 960 001, 07700 900 982, +44 808 157 0192 or +924568456136', - opts - ) as JoiExpression, - [UK_ERROR_CODE]: JoiBase.expression( - 'Enter {{lowerFirst(#label)}}, like 01632 960 001, 07700 900 982 or +44 808 157 0192', - opts - ) as JoiExpression, - [INTERNATIONAL_ERROR_CODE]: JoiBase.expression( - 'Enter {{lowerFirst(#label)}}, starting with + and the country code, for example +92333 1234567 or 00923331234567', + 'Enter {{lowerFirst(#label)}} in the correct format', opts ) as JoiExpression } as unknown as LanguageMessages, @@ -69,25 +49,25 @@ export const joi = JoiBase.extend({ const parsed = phoneUtil.parse(value, COUNTRY) if (!phoneUtil.isValidNumber(parsed)) { - return error(getErrorCode(format)) + return error(INVALID_ERROR_CODE) } if (format) { const isUK = isUKNumber(parsed) if (!isUK && format === TelephoneNumberFieldOptionsFormatEnum.UK) { - return error(UK_ERROR_CODE) + return error(INVALID_ERROR_CODE) } else if ( isUK && format === TelephoneNumberFieldOptionsFormatEnum.International ) { - return error(INTERNATIONAL_ERROR_CODE) + return error(INVALID_ERROR_CODE) } } return value } catch { - return error(getErrorCode(format)) + return error(INVALID_ERROR_CODE) } } } From e336d2f56a97f5d8a119f0ce119f82ab3fc2b520 Mon Sep 17 00:00:00 2001 From: David Stone Date: Thu, 4 Jun 2026 16:30:20 +0100 Subject: [PATCH 2/3] Remove custom telephone error messages --- .../engine/components/TelephoneNumberField.test.ts | 10 ++-------- .../plugins/engine/components/TelephoneNumberField.ts | 6 +----- .../plugins/engine/components/helpers/telephone.ts | 11 ++++------- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/server/plugins/engine/components/TelephoneNumberField.test.ts b/src/server/plugins/engine/components/TelephoneNumberField.test.ts index 59130d532..d3cc1b861 100644 --- a/src/server/plugins/engine/components/TelephoneNumberField.test.ts +++ b/src/server/plugins/engine/components/TelephoneNumberField.test.ts @@ -9,11 +9,7 @@ import { getAnswer, type Field } from '~/src/server/plugins/engine/components/helpers/components.js' -import { - INTERNATIONAL_ERROR_CODE, - INVALID_ERROR_CODE, - UK_ERROR_CODE -} from '~/src/server/plugins/engine/components/helpers/telephone.js' +import { INVALID_ERROR_CODE } from '~/src/server/plugins/engine/components/helpers/telephone.js' import { FormModel } from '~/src/server/plugins/engine/models/FormModel.js' import definition from '~/test/form/definitions/blank.js' import { getFormData, getFormState } from '~/test/helpers/component-helpers.js' @@ -315,9 +311,7 @@ describe('TelephoneNumberField', () => { 'any.required': 'This is a custom required error', 'string.empty': 'This is a custom empty string error', 'string.pattern.base': 'This is a custom pattern error', - [INVALID_ERROR_CODE]: 'This is a custom pattern error', - [UK_ERROR_CODE]: 'This is a custom pattern error', - [INTERNATIONAL_ERROR_CODE]: 'This is a custom pattern error' + [INVALID_ERROR_CODE]: 'This is a custom pattern error' } } } satisfies TelephoneNumberFieldComponent, diff --git a/src/server/plugins/engine/components/TelephoneNumberField.ts b/src/server/plugins/engine/components/TelephoneNumberField.ts index c48f82015..22cafcbb0 100644 --- a/src/server/plugins/engine/components/TelephoneNumberField.ts +++ b/src/server/plugins/engine/components/TelephoneNumberField.ts @@ -4,9 +4,7 @@ import { type StringSchema } from 'joi' import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js' import { addClassOptionIfNone } from '~/src/server/plugins/engine/components/helpers/index.js' import { - INTERNATIONAL_ERROR_CODE, INVALID_ERROR_CODE, - UK_ERROR_CODE, joi } from '~/src/server/plugins/engine/components/helpers/telephone.js' import { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js' @@ -48,9 +46,7 @@ export class TelephoneNumberField extends FormComponent { 'any.required': message, 'string.empty': message, 'string.pattern.base': message, - [INVALID_ERROR_CODE]: message, - [UK_ERROR_CODE]: message, - [INTERNATIONAL_ERROR_CODE]: message + [INVALID_ERROR_CODE]: message }) } else if (options.customValidationMessages) { formSchema = formSchema.messages(options.customValidationMessages) diff --git a/src/server/plugins/engine/components/helpers/telephone.ts b/src/server/plugins/engine/components/helpers/telephone.ts index 747318543..7500c41b9 100644 --- a/src/server/plugins/engine/components/helpers/telephone.ts +++ b/src/server/plugins/engine/components/helpers/telephone.ts @@ -1,8 +1,8 @@ import { TelephoneNumberFieldOptionsFormatEnum } from '@defra/forms-model' import LibPhoneNumber from 'google-libphonenumber' -import JoiBase, { type JoiExpression, type LanguageMessages } from 'joi' +import JoiBase, { type LanguageMessages } from 'joi' -import { opts } from '~/src/server/plugins/engine/pageControllers/validationOptions.js' +import { messageTemplate } from '~/src/server/plugins/engine/pageControllers/validationOptions.js' const phoneUtil = LibPhoneNumber.PhoneNumberUtil.getInstance() @@ -17,11 +17,8 @@ export const joi = JoiBase.extend({ type: 'string', base: JoiBase.string(), messages: { - [INVALID_ERROR_CODE]: JoiBase.expression( - 'Enter {{lowerFirst(#label)}} in the correct format', - opts - ) as JoiExpression - } as unknown as LanguageMessages, + [INVALID_ERROR_CODE]: messageTemplate.format + } as LanguageMessages, rules: { phoneNumber: { method({ From f757f970d0265d7ee7f1306f55c03d1627bc25bf Mon Sep 17 00:00:00 2001 From: David Stone Date: Thu, 4 Jun 2026 16:37:26 +0100 Subject: [PATCH 3/3] Simplify telephone error message handling --- .../plugins/engine/components/helpers/telephone.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/server/plugins/engine/components/helpers/telephone.ts b/src/server/plugins/engine/components/helpers/telephone.ts index 7500c41b9..8da156302 100644 --- a/src/server/plugins/engine/components/helpers/telephone.ts +++ b/src/server/plugins/engine/components/helpers/telephone.ts @@ -52,11 +52,10 @@ export const joi = JoiBase.extend({ if (format) { const isUK = isUKNumber(parsed) - if (!isUK && format === TelephoneNumberFieldOptionsFormatEnum.UK) { - return error(INVALID_ERROR_CODE) - } else if ( - isUK && - format === TelephoneNumberFieldOptionsFormatEnum.International + if ( + (!isUK && format === TelephoneNumberFieldOptionsFormatEnum.UK) || + (isUK && + format === TelephoneNumberFieldOptionsFormatEnum.International) ) { return error(INVALID_ERROR_CODE) }