|
/*
|
|
|
|
Basic Usage
|
|
-----------
|
|
0. Configure for:
|
|
a. error_text_size in px (defaults 12)
|
|
b. error_color - The color of error text (defaults red)
|
|
c. error_class - Choose a name that will not conflict with the class that is in use (defaults error_class).
|
|
d. error_display_html (defaults true). If you set false, each validation should include the text as value for the key as text. Eg. text: 'something to validate'
|
|
e. text_min - minimum text input expected (defualts 2)
|
|
f. text_max - maximum text input expected (defualts 50)
|
|
g. highlight_all_errors - highlights all the errors together after validation if set to true. If set to false will display one error at a time in sequence as defined (defaults: false)
|
|
|
|
1. Define an array of validations to be performed
|
|
2. For each validation minimum input to be provided should be
|
|
a. tagid - tag id of the tag to be validated
|
|
b. regex_name - regex to be used for validation
|
|
c. text - (optional if config.error_display_html is true, if false, then mandatory)
|
|
d. errmsg - the error msg to be shown to the user in case the validation fails for that tag
|
|
e. required - if true, tells the engine to verify the empty value too. If false and the value is left empty then it will be considered ok. (default - false)
|
|
f. custom_regex - use given regex to the validation
|
|
|
|
regex_name options
|
|
------------------
|
|
|
|
1. email - checks for validity of email address format
|
|
2. exact_x_digits - checks for x digits (mostly used for PINcode, PIN, or Phone number)
|
|
a. x_count - number defining the number of digits (e.g. 10) - (defaults 100)
|
|
3. any_number - checks for number
|
|
- allow_negative - (defaults false). if set true, allows negative numbers
|
|
- allow_decimal - (defaults false), if set true, allows to enter decimal numbers
|
|
4. text - validates for text containing a-z, A-Z and 0-9
|
|
- allow_numbers - you can numbers with text (defaults false)
|
|
- other_chars - mention all the charactes you want to allow in a string
|
|
- min - minimum string length (defaults 2)
|
|
- max - maximum string length (defaults 50)
|
|
5. free_text - validates for any free text for it's lenths
|
|
- min - minimum string length (defaults 2)
|
|
- max - maximum string length (defaults 50)
|
|
6. min_number - validates if the entered number is greater than minimum (true) or not (false)
|
|
- min - minimum value to be checked
|
|
7. max_number - validates if the entered number is less than maximum (true) or not (false)
|
|
- max - maximum value to be checked
|
|
8. equal - checks if two tags are holding same value or not
|
|
- tag2id - tagid of the other input tag
|
|
returns true if two strings are equal, else false. Returns false if both the strings are empty
|
|
9. filepath - checks if the file selection is done
|
|
returns true if a file is selected else returns false. checks for full path, relative path path with font/back slash
|
|
[special case]
|
|
- namecheck - startswith, endswith, contains, exact, extension
|
|
- checkname - the value of the name that should be checked as per the namecheck rule selected
|
|
returns true if the namecheck succeeds else false
|
|
10. pan_card - Check for validate of PAN card number Format
|
|
11. gst_number - Check for validate of GSTIN number Format
|
|
-statecode - Check for validate of the selected state code
|
|
12. custom - Validate for external given regex as per condition.
|
|
- custom_regex - Regex to be check by this.
|
|
if developer not provide this field when use custom regex then it will return false.
|
|
13. website - Check for validate to website
|
|
|
|
let validation_input = [
|
|
{tagid: 'input_email1', text: 'naval@mobigic.com', regex_name: 'email', errmsg: 'Email address entered is invalid.'},
|
|
{tagid: 'quantity', text: '0', regex_name: 'any_number', errmsg: 'Only Digits are allowed for Quantity.'},
|
|
{tagid: 'phone', text: '9876543210', regex_name: 'any_number', errmsg: 'the number should be decimal number', allow_negative: false, allow_decimal: true},
|
|
{tagid: 'address', text: 'Brindavan', regex_name: 'text', errmsg: 'Address Error', allow_numbers: true, min: 3, other_chars: ' ', max: 5},
|
|
{tagid:'company_name', regex_name: 'custom', custom_regex: /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/ ,errmsg: 'Please enter company name', required: true},
|
|
];
|
|
|
|
validate(validation_input); // returns [true/false] if error_display_html is true, else returns [true/{errmsg: 'errmsg', tagid: 'tagid'}]
|
|
|
|
|
|
*/
|
|
|
|
// Configuration to be done here
|
|
var config = {
|
|
error_text_size: 12,
|
|
error_color: 'red',
|
|
error_class: 'error_class',// + new Date().getTime(),
|
|
error_display_html: true,
|
|
text_min: 2,
|
|
text_max: 50,
|
|
highlight_all_errors: false
|
|
};
|
|
|
|
// All Regex to be defined here
|
|
var regexes = {
|
|
email: /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/,
|
|
//only_digits: function(allow_negative){return new RegExp('^' + (allow_negative ? '([-+]?)' : '') + '\\d+$')}, ///^\d+$/,
|
|
exact_x_digits: function (x) { return new RegExp('^[0][1-9]\\d{' + (x - 1) + '}$|^[1-9]\\d{' + (x - 1) + '}$'); }, // {exact_digit_count}
|
|
//positive_whole_number: /^\d*[1-9]\d*$/,
|
|
any_number: function (allow_negative, allow_decimal) {
|
|
return new RegExp('^' +
|
|
(allow_negative ? '([-+]?)' : '') +
|
|
'\\d+' +
|
|
(allow_decimal ? '(\\.\\d+)?' : '') + '$')
|
|
}, // allows non-decimal numbers also
|
|
//decimal_number_only: /^\d+(\.\d+)$/, // allows decimal numbers only with atleast 1 place after decimal
|
|
decimal_2_places: /^(\d{1,5}|\d{0,5}\.\d{1,2})$/,
|
|
x_dot_y: function (x_digits, y_digits) { return new RegExp('^([\\d]{0,' + x_digits + '})(\\.[\\d]{1,' + y_digits + '})?$'); }, // match with this returns value of x and value of y
|
|
text: function (allow_numbers, other_chars, min, max) {
|
|
return new RegExp(
|
|
"^[a-zA-Z" +
|
|
(allow_numbers ? "0-9" : "") +
|
|
(other_chars ? other_chars : "") +
|
|
"]{" + (min ? min : config.text_min) + "," + (max ? max : config.text_max) + "}$"
|
|
);
|
|
},
|
|
filepath: /(\\\\?([^\\/]*[\\/])*)([^\\/]+)$/,
|
|
pan: /^[A-Z]{5}[0-9]{4}[A-Z]{1}$/,
|
|
gst: /^([0-2][0-9]|[3][0-7])[A-Z]{3}[ABCFGHLJPTK][A-Z]\d{4}[A-Z][A-Z0-9][Z][A-Z0-9]$/,
|
|
website_regex: /^((ftp|http|https):\/\/)[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+((\/)[\w#]+)*(\/\w+\?[a-zA-Z0-9_]+=\w+(&[a-zA-Z0-9_]+=\w+)*)?$/,
|
|
}
|
|
|
|
var regex_validation = {
|
|
email: function (text, validation_input) {
|
|
return text.match(regexes['email']);
|
|
},
|
|
/*only_digits: function(text, validation_input) {
|
|
return text.match(regexes['only_digits'](validation_input.allow_negative));
|
|
},*/
|
|
// requires {exact_digit_count}, else defaults 100
|
|
exact_x_digits: function (text, validation_input) {
|
|
return text.match(regexes['exact_x_digits'](validation_input.x_count ? validation_input.x_count : 100));
|
|
},
|
|
any_number: function (text, validation_input) {
|
|
return text.match(regexes['any_number'](validation_input.allow_negative, validation_input.allow_decimal));
|
|
},
|
|
/*decimal_number_only: function(text, validation_input) {
|
|
return text.match(regexes['decimal_number_only']);
|
|
}*/
|
|
text: function (text, validation_input) {
|
|
return text.match(regexes['text'](validation_input.allow_numbers, validation_input.other_chars, validation_input.min, validation_input.max));
|
|
},
|
|
free_text: function (text, validation_input) {
|
|
let success = false;
|
|
let len = text.length;
|
|
if (len >= (validation_input.min ? validation_input.min : config.text_min) && len <= (validation_input.max ? validation_input.max : config.text_max)) {
|
|
success = true;
|
|
}
|
|
|
|
return success;
|
|
},
|
|
min_number: function (text, validation_input) {
|
|
let success = false;
|
|
try {
|
|
let n = Number(text);
|
|
success = (n >= validation_input.min);
|
|
} catch (e) {
|
|
|
|
}
|
|
|
|
return success;
|
|
},
|
|
max_number: function (text, validation_input) {
|
|
let success = false;
|
|
try {
|
|
let n = Number(text);
|
|
success = (n <= validation_input.max);
|
|
} catch (e) {
|
|
|
|
}
|
|
|
|
return success;
|
|
},
|
|
equal: function (text, validation_input) {
|
|
let success = false;
|
|
|
|
let tagid1 = validation_input.tagid;
|
|
let tagid2 = validation_input.tag2id;
|
|
|
|
if (tagid1 && tagid2) {
|
|
let text1 = $('#' + tagid1).val();
|
|
let text2 = $('#' + tagid2).val();
|
|
|
|
if (text1.length > 0 && text2.length > 0 && text1.length == text2.length && text1 === text2)
|
|
success = true;
|
|
}
|
|
|
|
return success;
|
|
},
|
|
filepath: function (text, validation_input) {
|
|
let success = false;
|
|
let namecheck = validation_input.namecheck;
|
|
|
|
let match_text = text.match(regexes['filepath']);
|
|
let filename;
|
|
|
|
if (match_text) {
|
|
filename = match_text[match_text.length - 1];
|
|
switch (namecheck) {
|
|
case 'startswith':
|
|
success = filename.startsWith(validation_input.checkstring);
|
|
break;
|
|
case 'endswith':
|
|
success = filename.endsWith(validation_input.checkstring);
|
|
break;
|
|
case 'contains':
|
|
success = filename.indexOf(validation_input.checkstring) != -1;
|
|
break;
|
|
case 'exact':
|
|
success = filename === validation_input.checkstring;
|
|
break;
|
|
case 'extension':
|
|
success = filename.endsWith('.' + validation_input.checkstring);
|
|
break;
|
|
default:
|
|
success = match_text;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return success;
|
|
},
|
|
|
|
pan_card: function (text, validation_input) {
|
|
return text.match(regexes['pan']);
|
|
},
|
|
|
|
gstin: function (text, validation_input) {
|
|
let success = false;
|
|
let statecode = validation_input.statecode ? validation_input.statecode : '';
|
|
if (statecode) {
|
|
if (text.startsWith(statecode)) {
|
|
success = text.match(regexes['gst'])
|
|
}
|
|
}
|
|
else {
|
|
success = text.match(regexes['gst']);
|
|
}
|
|
return success;
|
|
},
|
|
|
|
custom: function (text, validation_input) {
|
|
if (regexes.custom)
|
|
return text.match(regexes['custom'])
|
|
else
|
|
return false
|
|
},
|
|
|
|
website: function (text, validation_input) {
|
|
return text.match(regexes['website_regex'])
|
|
},
|
|
|
|
}
|
|
|
|
//var s = '-8.5552';
|
|
//console.log(s.match(regexes['decimal_number']));
|
|
|
|
function validate(input, user_config) {
|
|
|
|
if (user_config)
|
|
Object.keys(user_config).map(key => { config[key] = user_config[key] });
|
|
|
|
// Clear once before validation
|
|
clearDisplayingError();
|
|
|
|
let all_valid = true;
|
|
let i = 0;
|
|
for (; i < input.length; i++) {
|
|
console.log('' + i + '. ' + input[i].tagid);
|
|
|
|
let text = config.error_display_html ? getValueForValidation(input[i].tagid) : input[i].text;
|
|
// There can be a case where the field is not required and hence not filled by the user, so we should consider it good.
|
|
if (!text && !input[i].required) { } else {
|
|
let valop;
|
|
if (input[i].regex_name === 'custom') {
|
|
regexes.custom = input[i].custom_regex
|
|
valop = regex_validation[input[i].regex_name](text, input[i]);
|
|
}
|
|
else
|
|
valop = regex_validation[input[i].regex_name](text, input[i]);
|
|
|
|
console.log(valop);
|
|
if (!valop) {
|
|
all_valid = false;
|
|
|
|
let tag_to_show_error_on = undefined;
|
|
|
|
if (input[i].show_error_on_tag_id)
|
|
tag_to_show_error_on = input[i].show_error_on_tag_id;
|
|
else
|
|
tag_to_show_error_on = input[i].tagid;
|
|
|
|
setDisplayingError(tag_to_show_error_on, input[i].errmsg);
|
|
//setDisplayingError(input[i].tagid, input[i].errmsg);
|
|
}
|
|
}
|
|
|
|
if (config.error_display_html) {
|
|
if (config.highlight_all_errors)
|
|
continue;
|
|
else
|
|
if (!all_valid)
|
|
break;
|
|
} else {
|
|
if (!all_valid)
|
|
break;
|
|
}
|
|
}
|
|
|
|
return all_valid ?
|
|
(config.error_display_html ? true : true) :
|
|
(config.error_display_html ? false : { tagid: input[i].tagid, errmsg: input[i].errmsg });
|
|
}
|
|
|
|
function getValueForValidation(tagid) {
|
|
let jq_tag = $('#' + tagid);
|
|
let tagName = jq_tag.prop('tagName');
|
|
|
|
let value = ''
|
|
if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
|
|
value = jq_tag.val();
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
function clearDisplayingError() {
|
|
if (config.error_display_html)
|
|
$('span.' + config.error_class).remove();
|
|
}
|
|
|
|
function setDisplayingError(tagid, errmsg) {
|
|
if (config.error_display_html) {
|
|
$('#' + tagid).after('<span class="error_class", style="color: ' + config.error_color + '; font-size: ' + config.error_text_size + 'px">' + errmsg + '<span>');
|
|
$('#' + tagid).focus();
|
|
}
|
|
}
|
|
|
|
|
|
var isNode = new Function("try {return this===global;}catch(e){return false;}");
|
|
|
|
// tests if global scope is binded to "global"
|
|
if (isNode()) {
|
|
//console.log("running under node.js");
|
|
module.exports.validate = validate;
|
|
}
|