From 92190257df53ec3f9e94ccfc01c14f877a980148 Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Fri, 3 Dec 2021 17:38:31 +0100 Subject: [PATCH 1/2] Field validations: do not validate a field that is not shown, use provided error message if any, quasar component compatible for error status --- packages/form/src/BlitzField.vue | 10 ++++++++- packages/form/src/lang.ts | 1 + packages/form/src/validation.ts | 36 ++++++++++++++++++++++++++------ 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/packages/form/src/BlitzField.vue b/packages/form/src/BlitzField.vue index ef1d3668..589f2057 100644 --- a/packages/form/src/BlitzField.vue +++ b/packages/form/src/BlitzField.vue @@ -725,7 +725,15 @@ export default defineComponent({ if (isFullString(requiredErrorResult)) return requiredErrorResult - return evalPropOrAttr('error') || null + const errorStatus = evalPropOrAttr('error') + if (isBoolean(errorStatus)) { + if (errorStatus) { + const errorMessage = evalPropOrAttr('errorMessage') + return errorMessage ? errorMessage : langCalculated['fieldValidationError'] + } + return null + } + return errorStatus || null }, // validate() IS CALLED FROM REFERENCE!! /** diff --git a/packages/form/src/lang.ts b/packages/form/src/lang.ts index 8ff52e1d..770f425d 100644 --- a/packages/form/src/lang.ts +++ b/packages/form/src/lang.ts @@ -10,5 +10,6 @@ export const defaultLang: () => Lang = () => ({ edit: 'Edit', save: 'Save', requiredField: 'Field is required', + fieldValidationError: 'Field has validation error', formValidationError: 'There are remaining errors.', }) diff --git a/packages/form/src/validation.ts b/packages/form/src/validation.ts index 75a5e9c2..3549ba72 100644 --- a/packages/form/src/validation.ts +++ b/packages/form/src/validation.ts @@ -1,5 +1,5 @@ import { flattenPerSchema } from '@blitzar/utils' -import { isFullString, isFunction } from 'is-what' +import { isBoolean, isFullString, isFunction } from 'is-what' import type { BlitzFieldProps, FormContext, Lang, Schema } from '@blitzar/types' import { defaultLang } from './lang' @@ -22,17 +22,41 @@ export function validateFieldPerSchema( blueprint: BlitzFieldProps, context: FormContext ): null | string { - const lang = context.lang || defaultLang() - const requiredErrorFn = createRequiredErrorFn(lang.requiredField) + // check whether the field is shown + let isVisible = true + if (isFunction(blueprint.showCondition)) { + isVisible = blueprint.showCondition(payload, context) + } + if (!isVisible) return null + + // check whether the field is required + let isRequired = false + if (isFunction(blueprint.required)) { + isRequired = blueprint.required(payload, context) + } else if (isBoolean(blueprint.required)) { + isRequired = blueprint.required + } - const requiredResult = requiredErrorFn(payload) - if (isFullString(requiredResult)) return requiredResult + const lang = context.lang || defaultLang() + if (isRequired) { + const requiredErrorFn = createRequiredErrorFn(lang.requiredField) + const requiredResult = requiredErrorFn(payload) + if (isFullString(requiredResult)) return requiredResult + } if (!blueprint.error) return null - const errorResult = !isFunction(blueprint.error) + let errorResult = !isFunction(blueprint.error) ? blueprint.error : blueprint.error(payload, context) + // report provided error message if error result is true + if (isBoolean(errorResult)) { + if (errorResult) { + return blueprint.errorMessage ? blueprint.errorMessage : lang.fieldValidationError + } + return null + } + return errorResult } From 5219c245f0513c7f3a66c56ab569f3f095edb0fa Mon Sep 17 00:00:00 2001 From: Yannick Marcon Date: Tue, 21 Dec 2021 09:21:06 +0100 Subject: [PATCH 2/2] Fix createRequiredErrorFn when boolean value. Declaration of fieldValidationError added. --- packages/form/src/BlitzField.vue | 1 + packages/form/src/BlitzForm.vue | 1 + packages/form/src/validation.ts | 4 ++-- packages/types/src/core.ts | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/form/src/BlitzField.vue b/packages/form/src/BlitzField.vue index 589f2057..fb9b16c9 100644 --- a/packages/form/src/BlitzField.vue +++ b/packages/form/src/BlitzField.vue @@ -142,6 +142,7 @@ export default defineComponent({ edit: 'Edit', save: 'Save', requiredField: 'Field is required', + fieldValidationError: 'Field has validation error', formValidationError: 'There are remaining errors.', }), }, diff --git a/packages/form/src/BlitzForm.vue b/packages/form/src/BlitzForm.vue index ecc05b45..008d9426 100644 --- a/packages/form/src/BlitzForm.vue +++ b/packages/form/src/BlitzForm.vue @@ -129,6 +129,7 @@ export default defineComponent({ edit: 'Edit', save: 'Save', requiredField: 'Field is required', + fieldValidationError: 'Field has validation error', formValidationError: 'There are remaining errors.', }), }, diff --git a/packages/form/src/validation.ts b/packages/form/src/validation.ts index 3549ba72..e9e5cd21 100644 --- a/packages/form/src/validation.ts +++ b/packages/form/src/validation.ts @@ -6,7 +6,7 @@ import { defaultLang } from './lang' export function createRequiredErrorFn( requiredFieldErrorMsg: string ): (payload: any) => null | string { - return (val) => (val === 0 || !!val ? null : requiredFieldErrorMsg) + return (val) => (isBoolean(val) || val === 0 || !!val ? null : requiredFieldErrorMsg) } /** @@ -46,7 +46,7 @@ export function validateFieldPerSchema( if (!blueprint.error) return null - let errorResult = !isFunction(blueprint.error) + const errorResult = !isFunction(blueprint.error) ? blueprint.error : blueprint.error(payload, context) // report provided error message if error result is true diff --git a/packages/types/src/core.ts b/packages/types/src/core.ts index 156dec70..1b280895 100644 --- a/packages/types/src/core.ts +++ b/packages/types/src/core.ts @@ -33,6 +33,7 @@ export type Lang = { edit: string save: string requiredField: string + fieldValidationError: string formValidationError: string }