dom-validator
Version:
Validator similar to vee-validator for vuetify Applications
179 lines (145 loc) • 4.86 kB
JavaScript
import isDate from 'validator/lib/isDate';
import {parseDateIntoString} from '../utilities/date'
let moment = require('moment');
let Holidays = require('date-holidays')
let check = (value, params, scope, otherComponentsInScope, obj, fieldName, locale) => {
if(params && !Array.isArray(params)){
params = [params]
}
let date = parseDateIntoString(value, params, locale);
if(date === false){
return false;
}
let itIsDate = isDate(date)
if(params && params.length < 2){
return itIsDate
}
if(params.length < 3){
throw "Dom-validator: date rule require more parameters in this case";
}
if(!itIsDate){
return false;
}
let operator = params[1];
let delta = params[2];
let option = params[3] || null;
return dateCheck(date, operator, delta, option, params, locale, otherComponentsInScope);
};
let dateCheck = (date, operator, delta, option, params, locale, otherComponentsInScope) => {
let operatorArray = operator.split('-')
let op = operatorArray[0];
let field = null;
if(operatorArray.length > 1){
field = operatorArray[1];
}
let dateRegex = /^(\d{4}\-\d{2}\-\d{2})$/g;
let dateMatch = dateRegex.exec(delta);
date = moment(date).format('YYYY-MM-DD');;
let second = null
if(delta === 'now'){
second = moment().format('YYYY-MM-DD')
}else if(dateMatch){//date
let date = dateMatch[1];
second = moment(date).format('YYYY-MM-DD')
}else{
second = buildSecond(params, locale, delta, field, otherComponentsInScope)
}
if(!second){
return false;
}
if(second === true){
return true;
}
let optionCheckValue = optionCheck(option, date);
if(!optionCheckValue){
return false;
}
switch (op){
case '>':
return date > second;
case '<':
return date < second;
case '>=':
return date >= second;
case '<=':
return date <= second;
case '=':
return date === second;
default:
throw 'Dom-validator: date rule, invalid operator \'' + operator + '\''
}
}
let buildSecond = (params, locale, deltax, field, otherComponentsInScope) => {
let delta = deltax.split('-');
if(delta.length !== 3 && delta.length === 1 && delta[0] !== 'it'){
throw `Dom-validator: date rule invalid delta '${deltax}', it has to be in the format 'rule-value-unit' for example 'before-20-years', 'now' or 'it'`
}
let rule = delta[0];
let value = delta[1] || null;
let unit = delta[2] || null;
let referringTime = buildReferringTime(params, locale, field, otherComponentsInScope)
if(!referringTime){
return false;
}
if(referringTime === true){
return true;
}
switch (rule){
case 'before':
return moment(referringTime).subtract(parseInt(value), unit).format('YYYY-MM-DD');
case 'after':
return moment(referringTime).add(parseInt(value), unit).format('YYYY-MM-DD');
case 'it':
return moment(referringTime).format('YYYY-MM-DD');
default:
throw `Dom-validator: date rule invalid delta '${deltax}', first segment has to be 'before' or after`
}
}
let buildReferringTime = (params, locale, field, otherComponentsInScope) => {
if(!field){
return moment().format('YYYY-MM-DD')
}
for(let index in otherComponentsInScope){
if(index === field){
let val = otherComponentsInScope[index].component.inputValue || otherComponentsInScope[index].component.lazyValue;
if(!val){
return true;
}
val = parseDateIntoString(val, params, locale);
if(val){
return moment(val).format('YYYY-MM-DD')
}else{
return false;
}
}
}
throw `Dom-validator: date rule: field '${field}' does not exist`
}
let optionCheck = (option, date) => {
if(!option){
return true;
}
let options = String(option).split('_');
date = moment(date);
let opt = options[0];
let par1 = options[1] || null;
let myRegexp = /\((.*?)\)$/g;
let match = myRegexp.exec(opt);
let par2 = null;
if(match && match.length > 1){
par2 = match[1];
opt = opt.replace(`(${par2})`, '');
}
if(opt === 'working'){
if(!par2){
par2 = 'IT'
}
let hd = new Holidays(par2)
if(par1 === 'with-sat'){
return date.day() !== 0 && !hd.isHoliday(new Date(date.format('YYYY-MM-DD')));
}
return date.day() !== 6 && date.day() !== 0 && !hd.isHoliday(new Date(date.format('YYYY-MM-DD')));
}
return false
}
export default check;