nhance/public/assets/js/pages/leads_form_validation.js

248 lines
7.2 KiB
JavaScript

(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) {
return !el || el.disabled || el.type === 'hidden';
}
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 true;
}
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 sanitizeOnInput(el) {
if (!el || isSkippableField(el)) {
return;
}
if (isMobileField(el)) {
var clean = (el.value || '').replace(/\D/g, '').substring(0, 10);
if (el.value !== clean) {
el.value = clean;
}
return;
}
if (isCharsetCandidate(el)) {
var raw = el.value || '';
if (!TEXT_ALLOWED.test(raw)) {
el.value = raw.replace(/[^A-Za-z0-9/_.\- ]/g, '');
}
}
}
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 || isSkippableField(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 init() {
var $form = $(FORM_SELECTOR);
if (!$form.length || !isParsleyReady()) {
return;
}
registerValidators();
applyConstraints($form);
refreshParsley($form);
$form.off(NS);
$form.on('input' + NS, 'input:not([type=hidden]), textarea', function () {
sanitizeOnInput(this);
validateField(this);
});
$form.on('change' + NS, 'select, input:not([type=hidden]), textarea', function () {
validateField(this);
});
}
$(function () {
init();
});
window.refreshLeadsFormValidation = function () {
init();
};
})(function () {
return window.jQuery;
});