1/** 2 * Shared date format handler for Cool Form, Hello Plus, and Elementor Pro forms. 3 * Platform wrappers call CFKEF.initDateFormat({ readyHook, nativeClass, dateFieldSelector, formSelector }). 4 * When nativeClass is set, flatpickr is skipped for inputs with that class. 5 */ 6window.CFKEF = window.CFKEF || {}; 7 8CFKEF.initDateFormat = function (opts) { 9 opts = opts || {}; 10 var readyHook = opts.readyHook || 'frontend/element_ready/form.default'; 11 var nativeClass = opts.nativeClass || ''; 12 var dateFieldSelector = opts.dateFieldSelector || 'input[type="date"][data-date-format]'; 13 var formSelector = opts.formSelector || 'form'; 14 15 var convertFormatToPattern = function (format) { 16 return format 17 .replace(/Y/g, '[0-9]{4}') 18 .replace(/m/g, '[0-9]{2}') 19 .replace(/d/g, '[0-9]{2}') 20 .replace(/\//g, '\\/'); 21 }; 22 23 var convertDateToDDMMYYYY = function (dateStr) { 24 var parts = dateStr.split('-'); 25 return parts[2] + '-' + parts[1] + '-' + parts[0]; 26 }; 27 28 var convertDateToMMDDYYYY = function (dateStr) { 29 var parts = dateStr.split('-'); 30 return parts[1] + '-' + parts[2] + '-' + parts[0]; 31 }; 32 33 var initDateFormat = function (input) { 34 var $input = jQuery(input); 35 36 if (nativeClass && $input.hasClass(nativeClass)) { 37 return; 38 } 39 40 var format = $input.data('date-format') || 'Y-m-d'; 41 var isRequired = input.required || $input.attr('aria-required') === 'true'; 42 var minDate = $input.attr('min') || null; 43 var maxDate = $input.attr('max') || null; 44 45 if (format !== 'Y-m-d') { 46 $input.attr('pattern', convertFormatToPattern(format)); 47 } 48 49 if (format === 'd-m-Y' || format === 'd/m/Y') { 50 if (minDate) { 51 minDate = convertDateToDDMMYYYY(minDate); 52 } 53 if (maxDate) { 54 maxDate = convertDateToDDMMYYYY(maxDate); 55 } 56 } 57 58 if (format === 'm-d-Y' || format === 'm/d/Y') { 59 if (minDate) { 60 minDate = convertDateToMMDDYYYY(minDate); 61 } 62 if (maxDate) { 63 maxDate = convertDateToMMDDYYYY(maxDate); 64 } 65 } 66 67 var fpOptions = { 68 dateFormat: format, 69 minDate: minDate, 70 maxDate: maxDate, 71 disableMobile: true, 72 allowInput: true, 73 onReady: function (selectedDates, dateStr, instance) { 74 if (isRequired) { 75 instance.input.setAttribute('required', 'required'); 76 instance.input.setAttribute('aria-required', 'true'); 77 } 78 }, 79 }; 80 81 if (typeof flatpickr === 'undefined') { 82 return; 83 } 84 85 if (input._flatpickr) { 86 input._flatpickr.set(fpOptions); 87 } else { 88 flatpickr(input, fpOptions); 89 } 90 91 if (isRequired) { 92 $input.prop('required', true).attr('aria-required', 'true'); 93 } 94 }; 95 96 var validateRequiredDateFields = function ($form) { 97 var isValid = true; 98 99 $form.find(dateFieldSelector + '[required]').each(function () { 100 var value = jQuery(this).val(); 101 102 if (!value || !String(value).trim()) { 103 this.reportValidity(); 104 isValid = false; 105 return false; 106 } 107 108 if (typeof this.checkValidity === 'function' && !this.checkValidity()) { 109 this.reportValidity(); 110 isValid = false; 111 return false; 112 } 113 }); 114 115 return isValid; 116 }; 117 118 var bindFormValidation = function ($element) { 119 var form = $element.find(formSelector)[0]; 120 121 if (!form || form.dataset.cfefDateFormatValidation) { 122 return; 123 } 124 125 form.dataset.cfefDateFormatValidation = '1'; 126 127 form.addEventListener( 128 'submit', 129 function (event) { 130 if (!validateRequiredDateFields(jQuery(form))) { 131 event.preventDefault(); 132 event.stopImmediatePropagation(); 133 } 134 }, 135 true 136 ); 137 }; 138 139 var addDateFormatHandler = function ($element) { 140 $element.find(dateFieldSelector).each(function (index, input) { 141 initDateFormat(input); 142 }); 143 144 bindFormValidation($element); 145 }; 146 147 jQuery(window).on('elementor/frontend/init', function () { 148 elementorFrontend.hooks.addAction(readyHook, addDateFormatHandler); 149 }); 150};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.