diff --git a/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl b/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl index e9a6f614..06e64ab3 100644 --- a/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +++ b/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl @@ -79,47 +79,61 @@ }, - "existsError": function (fieldName) { + "existsError": function (){ - <#if !messagesPerField?? || !(messagesPerField?is_hash)> - throw new Error("You're not supposed to use messagesPerField.printIfExists in this page"); - <#else> - <#list fieldNames as fieldName> - if(fieldName === "${fieldName}" ){ + function existsError_singleFieldName(fieldName) { - <#-- https://github.com/keycloakify/keycloakify/pull/218 --> - <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'> + <#if !messagesPerField?? || !(messagesPerField?is_hash)> + throw new Error("You're not supposed to use messagesPerField.printIfExists in this page"); + <#else> + <#list fieldNames as fieldName> + if(fieldName === "${fieldName}" ){ - <#assign doExistErrorOnUsernameOrPassword = ""> + <#-- https://github.com/keycloakify/keycloakify/pull/218 --> + <#if ('${fieldName}' == 'username' || '${fieldName}' == 'password') && pageId != 'register.ftl' && pageId != 'register-user-profile.ftl'> - <#attempt> - <#assign doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')> - <#recover> - <#assign doExistErrorOnUsernameOrPassword = true> - + <#assign doExistErrorOnUsernameOrPassword = ""> - return <#if doExistErrorOnUsernameOrPassword>true<#else>false; + <#attempt> + <#assign doExistErrorOnUsernameOrPassword = messagesPerField.existsError('username', 'password')> + <#recover> + <#assign doExistErrorOnUsernameOrPassword = true> + - <#else> + return <#if doExistErrorOnUsernameOrPassword>true<#else>false; - <#assign doExistErrorMessageForField = ""> + <#else> - <#attempt> - <#assign doExistErrorMessageForField = messagesPerField.existsError('${fieldName}')> - <#recover> - <#assign doExistErrorMessageForField = true> - + <#assign doExistErrorMessageForField = ""> - return <#if doExistErrorMessageForField>true<#else>false; + <#attempt> + <#assign doExistErrorMessageForField = messagesPerField.existsError('${fieldName}')> + <#recover> + <#assign doExistErrorMessageForField = true> + - + return <#if doExistErrorMessageForField>true<#else>false; - } - + - throw new Error(fieldName + "is probably runtime generated, see: https://docs.keycloakify.dev/limitations#field-names-cant-be-runtime-generated"); + } + - + throw new Error(fieldName + "is probably runtime generated, see: https://docs.keycloakify.dev/limitations#field-names-cant-be-runtime-generated"); + + + + } + + for( let i = 0; i < arguments.length; i++ ){ + + if( existsError_singleFieldName(arguments[i]) ){ + return true; + } + + } + + return false; }, "get": function (fieldName) { @@ -219,6 +233,19 @@ throw new Error(fieldName + "is probably runtime generated, see: https://docs.keycloakify.dev/limitations#field-names-cant-be-runtime-generated"); + }, + "getFirstError": function () { + + for( let i = 0; i < arguments.length; i++ ){ + + const fieldName = arguments[i]; + + if( out.messagesPerField.existsError(fieldName) ){ + return out.messagesPerField.get(fieldName); + } + + } + } }; diff --git a/src/login/kcContext/KcContext.ts b/src/login/kcContext/KcContext.ts index 65e63c55..4e58f6da 100644 --- a/src/login/kcContext/KcContext.ts +++ b/src/login/kcContext/KcContext.ts @@ -101,7 +101,7 @@ export declare namespace KcContext { * @param fields * @return boolean */ - existsError: (fieldName: string) => boolean; + existsError: (fieldName: string, ...otherFiledNames: string[]) => boolean; /** * Get message for given field. * @@ -116,6 +116,8 @@ export declare namespace KcContext { * @return boolean */ exists: (fieldName: string) => boolean; + + getFirstError: (...fieldNames: string[]) => string; }; properties: Record; authenticationSession?: { @@ -165,6 +167,7 @@ export declare namespace KcContext { alias: string; providerId: string; displayName: string; + iconClasses?: string; }[]; }; };