1(function($) { 2 const configs = window.gfMultiDatePickerConfig || []; 3 const initializedFields = new Set(); 4 5 function initializeMultiDatePickers() { 6 if (!$.fn.datepicker) { 7 console.warn('jQuery UI Datepicker is not available.'); 8 return; 9 } 10 11 configs.forEach(config => { 12 const fieldSelector = `#input_${config.form_id}_${config.field_id}`; 13 if (initializedFields.has(fieldSelector)) return; 14 initializedFields.add(fieldSelector); 15 16 const hiddenFieldSelector = `${fieldSelector}_hidden`; 17 const selectedDates = new Set($(fieldSelector).val()?.split(', ').filter(Boolean)); 18 19 $(fieldSelector).wrap('<div class="gf-multi-date-field"></div>').after('<span class="calendar-icon" role="button" aria-label="Open date picker"></span>'); 20 if (!$(hiddenFieldSelector).length) { 21 $(fieldSelector).after(`<input type="hidden" id="${hiddenFieldSelector.replace('#', '')}" name="${hiddenFieldSelector.replace('#', '')}" value="${Array.from(selectedDates).join(', ')}">`); 22 } 23 24 $(fieldSelector).attr({ 25 'aria-describedby': 'datepicker-instructions', 26 'aria-label': 'Select multiple dates' 27 }).datepicker({ 28 dateFormat: config.date_format, 29 beforeShow: (input, inst) => { 30 setTimeout(() => { 31 if (!$(".ui-datepicker-close-btn").length) { 32 $(inst.dpDiv).append('<button type="button" class="ui-datepicker-close-btn" aria-label="Close date picker">Ã</button>'); 33 $(".ui-datepicker-close-btn").on("click", () => $(fieldSelector).datepicker("hide")); 34 } 35 }, 10); 36 }, 37 beforeShowDay: date => { 38 const dateString = $.datepicker.formatDate("mm/dd/yy", date); 39 return [true, selectedDates.has(dateString) ? "ui-state-highlight" : ""]; 40 }, 41 onSelect: dateText => { 42 selectedDates.has(dateText) ? selectedDates.delete(dateText) : selectedDates.add(dateText); 43 const datesArray = Array.from(selectedDates); 44 $(fieldSelector).val(datesArray.join(", ")); 45 $(hiddenFieldSelector).val(datesArray.join(", ")); 46 $(fieldSelector).datepicker("refresh"); 47 setTimeout(() => $(fieldSelector).datepicker("show"), 0); 48 } 49 }); 50 51 $(fieldSelector).parent().find(".calendar-icon").on("click", () => $(fieldSelector).datepicker("show")); 52 $(fieldSelector).on("focus click", function() { $(this).datepicker("show"); }); 53 }); 54 } 55 56 $(document).ready(initializeMultiDatePickers); 57 $(document).on('gform_post_render', initializeMultiDatePickers); 58})(jQuery);
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.