From 4794e359893f83d6a5d44f44bd252b832f82b875 Mon Sep 17 00:00:00 2001 From: Joseph Garrone Date: Mon, 6 May 2024 16:07:49 +0200 Subject: [PATCH] Apply number unformat during validation if any --- src/login/kcContext/KcContext.ts | 1 + src/login/lib/useUserProfileForm.tsx | 72 +++++++++++++++++++++------- 2 files changed, 55 insertions(+), 18 deletions(-) diff --git a/src/login/kcContext/KcContext.ts b/src/login/kcContext/KcContext.ts index 0a338215..46802e03 100644 --- a/src/login/kcContext/KcContext.ts +++ b/src/login/kcContext/KcContext.ts @@ -537,6 +537,7 @@ export type Attribute = { }; html5DataAnnotations: { kcNumberFormat?: string; + kcNumberUnFormat?: string; }; readOnly: boolean; validators: Validators; diff --git a/src/login/lib/useUserProfileForm.tsx b/src/login/lib/useUserProfileForm.tsx index 2e44079d..16545946 100644 --- a/src/login/lib/useUserProfileForm.tsx +++ b/src/login/lib/useUserProfileForm.tsx @@ -403,15 +403,36 @@ function useGetErrors(params: { kcContext: Pick { + let { valueOrValues } = formFieldState; + + unFormat_number: { + // NOTE: The `?? {}` is for compat with Keycloak version prior to 24 + const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {}; + + if (kcNumberUnFormat === undefined) { + break unFormat_number; + } + + if (valueOrValues instanceof Array) { + valueOrValues = valueOrValues.map(value => formatNumber(value, kcNumberUnFormat)); + } else { + valueOrValues = formatNumber(valueOrValues, kcNumberUnFormat); + } + } + + return valueOrValues; + })(); + assert(attribute !== undefined); server_side_error: { if (attribute.multivalued) { const defaultValues = attribute.values ?? [""]; - assert(formFieldState.valueOrValues instanceof Array); + assert(valueOrValues instanceof Array); - const values = formFieldState.valueOrValues; + const values = valueOrValues; if (JSON.stringify(defaultValues) !== JSON.stringify(values.slice(0, defaultValues.length))) { break server_side_error; @@ -419,9 +440,9 @@ function useGetErrors(params: { kcContext: Pick { + .map((...[, index]) => { const specificValueErrors = getErrors({ attributeName, "formFieldStates": formFieldStates.map(formFieldState => { if (formFieldState.attribute.name === attributeName) { + assert(formFieldState.valueOrValues instanceof Array); return { "attribute": { ...attribute, "annotations": { ...attribute.annotations, "inputType": undefined - } + }, + "multivalued": false }, - "valueOrValues": value + "valueOrValues": formFieldState.valueOrValues[index] }; } @@ -555,9 +578,9 @@ function useGetErrors(params: { kcContext: Pick { + let { valueOrValues } = usernameFormFieldState; - { - const usernameValue = usernameFormFieldState.valueOrValues; + assert(typeof valueOrValues === "string"); - if (value !== usernameValue) { - break check_password_policy_x; + unFormat_number: { + // NOTE: The `?? {}` is for compat with Keycloak version prior to 24 + const { kcNumberUnFormat } = attribute.html5DataAnnotations ?? {}; + + if (kcNumberUnFormat === undefined) { + break unFormat_number; + } + + valueOrValues = formatNumber(valueOrValues, kcNumberUnFormat); } + + return valueOrValues; + })(); + + if (value !== usernameValue) { + break check_password_policy_x; } const msgArgs = ["invalidPasswordNotUsernameMessage"] as const;