350 lines
9.9 KiB
JavaScript
350 lines
9.9 KiB
JavaScript
/**
|
|
* Parsley validation for the leads form. Does not strip or rewrite user input;
|
|
* invalid values are reported via Parsley messages only.
|
|
*/
|
|
(function (getJq) {
|
|
'use strict';
|
|
|
|
function $(selector, context) {
|
|
var jq = getJq();
|
|
if (!jq) {
|
|
return { length: 0 };
|
|
}
|
|
return arguments.length > 1 ? jq(selector, context) : jq(selector);
|
|
}
|
|
|
|
var TEXT_ALLOWED = /^[A-Za-z0-9/_.\- ]*$/;
|
|
var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
var FORM_SELECTOR = '#leads_form_id';
|
|
var NS = '.leadsFormValidate';
|
|
|
|
var MESSAGES = {
|
|
text: 'Only letters, numbers, spaces, and the characters / _ - . are allowed.',
|
|
mobile: 'Mobile number must be exactly 10 digits (numbers only).',
|
|
email: 'Please enter a valid email address.'
|
|
};
|
|
|
|
function isParsleyReady() {
|
|
return !!window.Parsley;
|
|
}
|
|
|
|
function isSkippableField(el) {
|
|
if (!el || el.disabled || el.type === 'hidden') {
|
|
return true;
|
|
}
|
|
if (el.classList && el.classList.contains('select2-search__field')) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function isVisibleForValidation(el) {
|
|
if (isSkippableField(el)) {
|
|
return false;
|
|
}
|
|
|
|
var jq = getJq();
|
|
if (!jq) {
|
|
return true;
|
|
}
|
|
|
|
var $el = jq(el);
|
|
if (!$el.length || !$el.is(':visible')) {
|
|
return false;
|
|
}
|
|
|
|
return $el.closest('.form-group, .dynamic-form-row, .claim-row, .col-md-4, .col-md-12').filter(function () {
|
|
var display = jq(this).css('display');
|
|
return display === 'none';
|
|
}).length === 0;
|
|
}
|
|
|
|
function isEmptyValue(val) {
|
|
if (val == null || val === '') {
|
|
return true;
|
|
}
|
|
if (Array.isArray(val)) {
|
|
return val.length === 0;
|
|
}
|
|
return String(val).trim() === '';
|
|
}
|
|
|
|
function isPanOrGstField(el) {
|
|
if (!el) {
|
|
return false;
|
|
}
|
|
var id = (el.id || '').toLowerCase();
|
|
return id === 'pan' || id === 'gst';
|
|
}
|
|
|
|
function isEmailField(el) {
|
|
if (!el) {
|
|
return false;
|
|
}
|
|
var id = (el.id || '').toLowerCase();
|
|
var name = (el.name || '').toLowerCase();
|
|
var type = (el.type || '').toLowerCase();
|
|
return id === 'contact_person_email' || name === 'contact_person_email' || type === 'email';
|
|
}
|
|
|
|
function isMobileField(el) {
|
|
if (!el) {
|
|
return false;
|
|
}
|
|
var id = (el.id || '').toLowerCase();
|
|
var name = (el.name || '').toLowerCase();
|
|
return id === 'contact_person_mobile' || name === 'contact_person_mobile';
|
|
}
|
|
|
|
function isCharsetCandidate(el) {
|
|
if (!el || el.tagName === 'SELECT') {
|
|
return false;
|
|
}
|
|
var type = (el.type || '').toLowerCase();
|
|
if (type === 'file' || type === 'checkbox' || type === 'radio' || type === 'password' || type === 'submit' || type === 'button' || type === 'reset') {
|
|
return false;
|
|
}
|
|
if (isPanOrGstField(el) || isEmailField(el) || isMobileField(el)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function registerValidators() {
|
|
if (!isParsleyReady() || window.Parsley.__leadsFormValidatorsRegistered) {
|
|
return;
|
|
}
|
|
|
|
window.Parsley.addValidator('leadscharset', {
|
|
validateString: function (value) {
|
|
if (!value || String(value).trim() === '') {
|
|
return true;
|
|
}
|
|
return TEXT_ALLOWED.test(String(value));
|
|
},
|
|
messages: { en: MESSAGES.text }
|
|
});
|
|
|
|
window.Parsley.addValidator('leadsmobile10', {
|
|
validateString: function (value, req, instance) {
|
|
var v = String(value || '').replace(/\D/g, '');
|
|
if (!instance.$element.prop('required') && v.length === 0) {
|
|
return true;
|
|
}
|
|
if (instance.$element.prop('required') && v.length === 0) {
|
|
return false;
|
|
}
|
|
return v.length === 10;
|
|
},
|
|
messages: { en: MESSAGES.mobile }
|
|
});
|
|
|
|
window.Parsley.addValidator('leadsemail', {
|
|
validateString: function (value) {
|
|
if (!value || String(value).trim() === '') {
|
|
return true;
|
|
}
|
|
return EMAIL_RE.test(String(value).trim());
|
|
},
|
|
messages: { en: MESSAGES.email }
|
|
});
|
|
|
|
window.Parsley.__leadsFormValidatorsRegistered = true;
|
|
}
|
|
|
|
function clearAttrs($el) {
|
|
['data-parsley-leadscharset', 'data-parsley-leadsmobile10', 'data-parsley-leadsemail'].forEach(function (a) {
|
|
$el.removeAttr(a);
|
|
});
|
|
}
|
|
|
|
function applyConstraints($form) {
|
|
if (!$form || !$form.length) {
|
|
return;
|
|
}
|
|
|
|
$form.find('input, textarea, select').each(function () {
|
|
var el = this;
|
|
var $el = $(el);
|
|
|
|
if (isSkippableField(el) || isPanOrGstField(el)) {
|
|
return;
|
|
}
|
|
|
|
clearAttrs($el);
|
|
|
|
if (isMobileField(el)) {
|
|
$el.attr('data-parsley-leadsmobile10', 'true');
|
|
if (!$el.attr('data-parsley-trigger')) {
|
|
$el.attr('data-parsley-trigger', 'input change');
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (isEmailField(el)) {
|
|
$el.attr('data-parsley-leadsemail', 'true');
|
|
if (!$el.attr('data-parsley-trigger')) {
|
|
$el.attr('data-parsley-trigger', 'input change');
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (isCharsetCandidate(el)) {
|
|
$el.attr('data-parsley-leadscharset', 'true');
|
|
if (!$el.attr('data-parsley-trigger')) {
|
|
$el.attr('data-parsley-trigger', 'input change');
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (el.tagName === 'SELECT' && !$el.attr('data-parsley-trigger')) {
|
|
$el.attr('data-parsley-trigger', 'change');
|
|
}
|
|
});
|
|
}
|
|
|
|
function refreshParsley($form) {
|
|
if (!$form || !$form.length || !isParsleyReady()) {
|
|
return;
|
|
}
|
|
try {
|
|
var instance = $form.parsley();
|
|
if (instance && typeof instance.refresh === 'function') {
|
|
instance.refresh();
|
|
}
|
|
} catch (e) {
|
|
// no-op
|
|
}
|
|
}
|
|
|
|
function validateField(field) {
|
|
if (!field || !isVisibleForValidation(field) || !isParsleyReady()) {
|
|
return;
|
|
}
|
|
var $field = $(field);
|
|
var $form = $field.closest('form');
|
|
if (!$form.length || typeof $field.parsley !== 'function') {
|
|
return;
|
|
}
|
|
|
|
applyConstraints($form);
|
|
refreshParsley($form);
|
|
|
|
try {
|
|
$field.parsley().validate();
|
|
} catch (e) {
|
|
// no-op
|
|
}
|
|
}
|
|
|
|
function prepareHiddenFieldsForSubmit($form) {
|
|
if (!$form || !$form.length) {
|
|
return;
|
|
}
|
|
|
|
$form.find('input, textarea, select').each(function () {
|
|
var el = this;
|
|
var $el = $(el);
|
|
|
|
if (isVisibleForValidation(el)) {
|
|
return;
|
|
}
|
|
|
|
$el.removeAttr('required').prop('required', false);
|
|
clearAttrs($el);
|
|
|
|
try {
|
|
if (typeof $el.parsley === 'function') {
|
|
var fieldInstance = $el.parsley();
|
|
if (fieldInstance && typeof fieldInstance.reset === 'function') {
|
|
fieldInstance.reset();
|
|
}
|
|
}
|
|
} catch (e) {
|
|
// no-op
|
|
}
|
|
});
|
|
}
|
|
|
|
function getInvalidFields($form) {
|
|
var invalid = [];
|
|
|
|
if (!$form || !$form.length || !isParsleyReady()) {
|
|
return invalid;
|
|
}
|
|
|
|
var instance = $form.parsley();
|
|
if (!instance) {
|
|
return invalid;
|
|
}
|
|
|
|
instance.fields.forEach(function (field) {
|
|
if (field.isValid()) {
|
|
return;
|
|
}
|
|
|
|
var el = field.$element[0];
|
|
if (!isVisibleForValidation(el)) {
|
|
return;
|
|
}
|
|
|
|
var val = field.$element.val();
|
|
invalid.push({
|
|
id: field.$element.attr('id') || '',
|
|
name: field.$element.attr('name') || '',
|
|
label: (field.$element.closest('.form-group, .mb-3, .col-md-4, .col-lg-4').find('label').first().text() || '').trim(),
|
|
messages: field.getErrorsMessages ? field.getErrorsMessages() : [],
|
|
isEmpty: isEmptyValue(val)
|
|
});
|
|
});
|
|
|
|
return invalid;
|
|
}
|
|
|
|
function init() {
|
|
var $form = $(FORM_SELECTOR);
|
|
if (!$form.length || !isParsleyReady()) {
|
|
return;
|
|
}
|
|
|
|
registerValidators();
|
|
prepareHiddenFieldsForSubmit($form);
|
|
applyConstraints($form);
|
|
refreshParsley($form);
|
|
|
|
$form.off(NS);
|
|
$form.on('input' + NS, 'input:not([type=hidden]), textarea', function () {
|
|
validateField(this);
|
|
});
|
|
$form.on('change' + NS, 'select, input:not([type=hidden]), textarea', function () {
|
|
validateField(this);
|
|
});
|
|
}
|
|
|
|
$(function () {
|
|
init();
|
|
});
|
|
|
|
window.refreshLeadsFormValidation = function () {
|
|
init();
|
|
};
|
|
|
|
window.prepareLeadsFormForSubmit = function () {
|
|
var $form = $(FORM_SELECTOR);
|
|
if (!$form.length || !isParsleyReady()) {
|
|
return;
|
|
}
|
|
|
|
registerValidators();
|
|
prepareHiddenFieldsForSubmit($form);
|
|
applyConstraints($form);
|
|
refreshParsley($form);
|
|
};
|
|
|
|
window.getLeadsFormInvalidFields = function () {
|
|
return getInvalidFields($(FORM_SELECTOR));
|
|
};
|
|
})(function () {
|
|
return window.jQuery;
|
|
});
|