/**
* form and field type matching configuration tables/maps
*/
const validationTable = {
isValidFieldType: {
text: isValidTextField,
select: isValidSelectField,
//multiselect: ...
__invalid__: returnInvalidFieldValue
},
validateForm: validateForm
};
const createErrorTable = {
//form: createFormError,
field: {
text: createTextFieldError,
select: createSelectFieldError,
//multiselect: ...
__invalid__: handleCreateErrorException
}
};
/**
* helping getter functionality
* - that either returns a valid field type that does
* match a key in `validationTable.isValidFieldType`
* - or that does return the '__invalid__' key as it's
* fallback value.
*/
function getValidationFieldType(field) {
const fieldType = (field && field.type);
return (
(typeof fieldType === 'string')
&& (fieldType in validationTable.isValidFieldType)
&& fieldType
) || '__invalid__';
}
/**
* main validation functionality
* - that either returns `true` for an entirely valid form validation process
* - or that does return a type specific/related validation error.
*/
function validateForm(type) {
const tableOfIsValidFieldType = validationTable.isValidFieldType;
let recentField;
return Array.from(type.fields).every(field => {
recentField = field;
return tableOfIsValidFieldType[getValidationFieldType(field)](field);
}) || createErrorTable.field[getValidationFieldType(recentField)](/*recentField*/);
}
/**
* validation and error handling specific helper functionality
*/
function isValidTextField(type) {
return (type.value !== '');
}
function isValidSelectField(type) {
return Array.from(type.options).includes(type.value);
}
function returnInvalidFieldValue() {
return false;
}
function createTextFieldError(/*recentField*/) {
return (new Error('an empty text field value is not allowed.'));
}
function createSelectFieldError(/*recentField*/) {
return (new Error('the field value does not match the options'));
}
function handleCreateErrorException(/*recentField*/) {
return (new Error('there is no matching validation and error handling for this field.'));
}
/**
* test
*/
const validForm = { fields: [{
type: 'text',
value: 'valid'
}, {
type: 'select',
value: 'valid',
options: ['valid', 'select', 'field']
}] };
const invalidFormWithNullType = { fields: [{
type: 'text',
value: 'valid'
}, {
type: null,
value: 'valid'
}, {
type: 'select',
value: 'valid',
options: ['valid', 'select', 'field']
}] };
const invalidFormWithMissingType = { fields: [{
value: 'valid'
}, {
type: 'select',
value: 'valid',
options: ['valid', 'select', 'field']
}] };
const invalidFormWithEmptyTextValue = { fields: [{
type: 'text',
value: ''
}, {
type: 'select',
value: 'valid',
options: ['valid', 'select', 'field']
}] };
const invalidFormWithNonMatchingSelectValue = { fields: [{
type: 'text',
value: 'valid'
}, {
type: 'select',
value: 'invalid',
options: ['valid', 'select', 'field']
}] };
console.log('validateForm(validForm) : ', validateForm(validForm));
console.log('validateForm(invalidFormWithNullType).message : ', validateForm(invalidFormWithNullType).message);
console.log('validateForm(invalidFormWithMissingType).message : ', validateForm(invalidFormWithMissingType).message);
console.log('validateForm(invalidFormWithEmptyTextValue).message : ', validateForm(invalidFormWithEmptyTextValue).message);
console.log('validateForm(invalidFormWithNonMatchingSelectValue).message : ', validateForm(invalidFormWithNonMatchingSelectValue).message);
.as-console-wrapper { max-height: 100%!important; top: 0; }