PageSourceSearch

https://mcgregor.net/wp-content/plugins/cool-formkit-for-elementor…/assets/js/shared/date-format.js?ver=1.7.10

js mcgregor.net collected 2026-09-26 16:37:09 UTC 4,204 bytes, 150 lines download raw bytes

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.