@zohodesk/components
Version:
In this Package, we Provide Some Basic Components to Build Web App
327 lines (269 loc) • 12.2 kB
JavaScript
import typeChecker from "./typeChecker";
import { clone } from "./objectUtils";
const validator = {
combinePropsValidation: (currentProps, type, validateOn, validationObj, defaultCheckPropsRules, defaultValidateRules) => {
let newType = type.toLowerCase();
let newValidation = clone({}, validationObj);
let validationRules = newValidation.rules;
let validationRulesOrder = newValidation.rulesOrder;
let validationMessages = newValidation.messages;
let newValidationRulesOrder = validationRulesOrder ? [...validationRulesOrder] : [];
let newValidationRules = validationRules ? validationRules : {};
let checkPropsRules = defaultCheckPropsRules;
let checkPropsOrder = [];
for (let i = 0; i < checkPropsRules.length; i++) {
let prop = checkPropsRules[i];
if (Object.prototype.hasOwnProperty.call(currentProps, prop)) {
if (newValidationRulesOrder.indexOf(prop) === -1) {
checkPropsOrder.push(prop);
}
if (!Object.prototype.hasOwnProperty.call(newValidationRules, prop)) {
newValidationRules[prop] = currentProps[prop];
}
}
}
newValidationRulesOrder = !Object.prototype.hasOwnProperty.call(newValidation, 'rulesOrder') ? checkPropsOrder.concat(newValidationRulesOrder) : validationRulesOrder;
let isRulesFound = Object.keys(newValidationRules).length;
newValidationRules = isRulesFound ? validator.composeRulesForValidation(newType, defaultValidateRules, newValidationRules) : newValidationRules;
return {
validate: newValidation.validate,
validateOn: Object.prototype.hasOwnProperty.call(newValidation, 'validateOn') ? newValidation.validateOn : validateOn,
validationRules: newValidationRules,
validationRulesOrder: newValidationRulesOrder,
validationMessages
};
},
executeValidation: (text, inputTag, validationObj, fieldType) => {
let {
validation
} = validationObj;
let validationRulesOrder = validation.validationRulesOrder || [];
let validationRules = validation.validationRules || {};
let validationMessages = validation.validationMessages || {};
let {
onPassValidation
} = validationObj;
let {
onFailValidation
} = validationObj;
let skipIfEmptyField = null;
if (validationRules.required === false && (fieldType !== 'radio' || fieldType !== 'checkbox')) {
skipIfEmptyField = val => {
if (fieldType === 'onegroup' || fieldType === 'multigroup') {
return !val || !(val.length > 0);
}
let value = (val || '').trim();
return value.length < 1;
};
}
if (skipIfEmptyField === null || skipIfEmptyField(text) === false) {
for (let i = 0, len = validationRulesOrder.length; i < len; i++) {
let rule = validationRulesOrder[i];
if (!validationRules[rule] || !typeChecker.isFunction(validationRules[rule])) {
continue;
}
let isInValid = validationRules[rule](text, inputTag);
if (isInValid) {
let message = validationMessages[rule] && typeChecker.isFunction(validationMessages[rule]) ? validationMessages[rule](text, inputTag) : validationMessages[rule];
onFailValidation && onFailValidation(rule, message, inputTag);
return;
}
}
}
onPassValidation && onPassValidation(text, inputTag);
},
composeRulesForValidation: (type, defaultValidateRules, newValidationRules) => {
let defaultPatterns = validator.regexs;
for (let i = 0, len = defaultValidateRules.length; i < len; i++) {
let rule = defaultValidateRules[i];
let ruleInfo = newValidationRules[rule] || '';
if (ruleInfo && !typeChecker.isFunction(ruleInfo)) {
if (rule === 'required' && ruleInfo === true) {
newValidationRules[rule] = (val, el) => {
if (el.willValidate && el.validity.valueMissing) {
return true;
}
if (type === 'radio' || type === 'checkbox') {
return el.checked === false;
}
if (type === 'onegroup' || type === 'multigroup') {
return !val || val.length < 1;
}
let value = (val || '').replace(/\s{2,}/g, ' ').trim();
return value.length < 1;
};
} else if (rule === 'maxLength' && !Number.isNaN(ruleInfo) && Number.isFinite(ruleInfo)) {
let maxLength = Number(ruleInfo);
newValidationRules[rule] = (val, el) => {
if (el.willValidate && el.validity.tooLong) {
return true;
}
let value = val || '';
if (type !== 'multigroup') {
value = val.trim();
}
return !(value.length <= maxLength);
};
} else if (rule === 'minLength' && !Number.isNaN(ruleInfo) && Number.isFinite(ruleInfo)) {
let minLength = Number(ruleInfo);
newValidationRules[rule] = val => {
let value = val || '';
if (type !== 'multigroup') {
value = val.trim();
}
return !(value.length >= minLength);
};
} else if (rule === 'rangeLength' && /^([-+\d]+)*([,]{1,1}([-+\d]+))$/.test(ruleInfo) === true) {
let rangeLength = ruleInfo;
rangeLength = rangeLength.split(',').map(a => Number(a));
newValidationRules[rule] = val => {
let value = (val || '').trim();
return !(value.length >= rangeLength[0] && value.length <= rangeLength[1]);
};
} else if (rule === 'step' && ruleInfo) {
let step = Number(ruleInfo);
let stepTypes = ['number', 'range', 'date', 'datetime', 'datetime-local', 'month', 'time', 'week'];
newValidationRules[rule] = (val, el) => {
if (stepTypes.indexOf(type) !== -1) {
if (el.willValidate && el.validity.stepMismatch) {
return true;
}
return false;
}
let value = (val || '').trim();
value = Number(value);
if (Number.isNaN(value) || !Number.isFinite(value) || Number.isNaN(step) || !Number.isFinite(step)) {
return true;
}
return !(value % step === 0);
};
} else if (rule === 'max') {
let max = Number(ruleInfo);
let maxTypes = ['number', 'range', 'date', 'datetime', 'datetime-local', 'month', 'time', 'week'];
newValidationRules[rule] = (val, el) => {
if (maxTypes.indexOf(type) !== -1) {
if (el.willValidate && el.validity.rangeOverflow) {
return true;
}
return false;
}
let value = (val || '').trim();
value = Number(value);
if (Number.isNaN(value) || !Number.isFinite(value) || Number.isNaN(max) || !Number.isFinite(max)) {
return true;
}
return !(value <= max);
};
} else if (rule === 'min') {
let min = Number(ruleInfo);
let minTypes = ['number', 'range', 'date', 'datetime', 'datetime-local', 'month', 'time', 'week'];
newValidationRules[rule] = (val, el) => {
if (minTypes.indexOf(type) !== -1) {
if (el.willValidate && el.validity.rangeUnderflow) {
return true;
}
return false;
}
let value = (val || '').trim();
value = Number(value);
if (Number.isNaN(value) || !Number.isFinite(value) || Number.isNaN(min) || !Number.isFinite(min)) {
return true;
}
return !(value >= min);
};
} else if (rule === 'range' && /^([-+\d]+)*([,]{1,1}([-+\d]+))$/.test(ruleInfo) === true) {
let ranges;
ranges = ranges.split(',').map(a => Number(a));
newValidationRules[rule] = val => {
let value = (val || '').trim();
value = Number(value);
if (Number.isNaN(value) || !Number.isFinite(value)) {
return true;
}
return !(value >= ranges[0] && value <= ranges[1]);
};
} else if ((rule === 'digits' || rule === 'integer' || rule === 'double') && ruleInfo === true) {
newValidationRules[rule] = val => {
let value = (val || '').trim();
value = Number(value);
if (Number.isNaN(value) || !Number.isFinite(value)) {
return true;
}
let condition = true;
if (rule === 'integer') {
condition = Number.isSafeInteger(value);
}
if (rule === 'double') {
condition = -Number.MAX_VALUE <= value && Number.MAX_VALUE >= value;
}
return !defaultPatterns[rule].test(value) && condition;
};
} else if ((rule === 'timezonedate' || rule === 'datetimezone' || rule === 'date' || rule === 'datetime') && ruleInfo === true) {
newValidationRules[rule] = val => {
let value = (val || '').trim();
if (!defaultPatterns[rule].test(value)) {
return true;
}
if (rule === 'datetime') {
let index = 0;
value = value.split('T')[index]; //let timings = value[1].replace("Z","").split(":")
//let
//if( !defaultPatterns[rule].test(value); )
}
value = value.replace('/', '-');
value = value.replace(':', '-');
let values = value.split('-'); // Extract the string into month, date and year
let yy = parseInt(values[0]);
let mm = parseInt(values[1]);
let dd = parseInt(values[2]); // Create list of days of a month [assume there is no leap year by default]
let ListofDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if (mm === 1 || mm > 2) {
if (dd > ListofDays[mm - 1]) {
return true;
}
}
if (mm === 2) {
let lyear = false;
if (!(yy % 4) && yy % 100 || !(yy % 400)) {
lyear = true;
}
if (lyear === false && dd >= 29) {
return true;
}
if (lyear === true && dd > 29) {
return true;
}
}
};
} else if (rule === 'pattern' && ruleInfo && ruleInfo.constructor === RegExp) {
newValidationRules[rule] = val => {
let value = (val || '').trim();
return !new RegExp(ruleInfo).test(value);
};
} else if ((rule === 'email' || rule === 'month' || rule === 'time' || rule === 'phone' || rule === 'url' || rule === 'hexcode' || rule === 'cleartextpattern') && ruleInfo === true) {
newValidationRules[rule] = val => {
let value = (val || '').trim();
return !defaultPatterns[rule].test(value);
};
}
}
}
return newValidationRules;
},
regexs: {
integer: /^[-+]?[0-9]+$/,
digits: /^[0-9]+$/,
double: /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/,
email: /^[\w]([\w\-.+'/]*)@([\w\-.]*)(\.[A-z]{2,22}(\.[a-zA-Z]{2}){0,2})$/,
phone: /(\+?( |-|\.)?\d{1,2}( |-|\.)?)?(\(?\d{3}\)?|\d{3})( |-|\.)?(\d{3}( |-|\.)?\d{4})/g,
hexcode: /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/,
month: /^(\d{4,6})[/\-:](1[0-2]|0[1-9])$/,
date: /^(\d{4,6})[/-](1[0-2]|0[1-9])[/\-:](0[1-9]|1[0-9]|2[0-9]|3[0-1])$/,
time: /^([0-9]|0[0-9]|1[0-9]|2[0-3])[-/:][0-5][0-9]$/,
datetime: /^(\d{4,6})[/-](1[0-2]|0[1-9])[/\-:](0[1-9]|1[0-9]|2[0-9]|3[0-1])[T](([0-9]|0[0-9]|1[0-9]|2[0-3])[-/:][0-5][0-9])$/,
datetimezone: /^(\d{4,6})[/-](1[0-2]|0[1-9])[/\-:](0[1-9]|1[0-9]|2[0-9]|3[0-1])[T](([0-9]|0[0-9]|1[0-9]|2[0-3])[-/:][0-5][0-9][-/:.][0-9]{3}[Z])$/,
url: /^(ht|f)tp(s?):\/\/[-.\w]+[.][\w]+(\/?)([A-z0-9\-.?,:'/+=&%$#_@]*)?$/,
cleartextpattern: /^([A-z0-9_\-.$@?,:'/!\s]|[^\u{0000}-\u{007F}])+$/u
}
};
export default validator;