1jQuery(document).ready(function ($) { 2 // Initialize datepicker with available dates 3 // Convert to array if it's an object (wp_localize_script sometimes converts arrays to objects) 4 var availableDates = etp_events.event_dates || []; 5 if (typeof availableDates === 'object' && !Array.isArray(availableDates)) { 6 availableDates = Object.values(availableDates); 7 } 8 9 $('#event_start_date').datepicker({ 10 showOtherMonths: true, 11 selectOtherMonths: true, 12 dateFormat: 'yy-mm-dd', 13 beforeShowDay: function(date) { 14 var dateString = $.datepicker.formatDate('yy-mm-dd', date); 15 var isAvailable = availableDates.indexOf(dateString) !== -1; 16 17 // Return [enabled, cssClass, tooltip] 18 return [isAvailable, isAvailable ? 'has-event' : '', isAvailable ? 'Event available' : 'No events']; 19 }, 20 onSelect: function() { 21 fetchEvents(); 22 displaySelectedItems(); 23 } 24 }); 25 26 function fetchEvents() { 27 var months = $('#event_month').find('a.checked').map(function () { 28 return $(this).data('month'); 29 }).get(); 30 31 var startDate = $('#event_start_date').val(); 32 33 var data = { 34 action: 'etp_filter_events', 35 event_months: months, 36 start_date: startDate, 37 security: etp_events.security, 38 }; 39 40 $.ajax({
41 url: etp_events.ajax_url, 42 type: 'POST', 43 data: data, 44 beforeSend: function () { 45 $('.etp-events-grid-wrapper').addClass('loading'); 46 }, 47 success: function (response) { 48 if (response.success) { 49 $('.etp-events-grid-container').html(response.data); 50 } 51 }, 52 complete: function () { 53 $('.etp-events-grid-wrapper').removeClass('loading'); 54 }, 55 error: function (xhr, status, error) { 56 console.error('AJAX Error:', status, error); 57 $('.etp-events-grid-wrapper').prepend('<div class="alert alert-error">There was an error fetching events. Please try again later.</div>'); 58 $('.etp-events-grid-wrapper').removeClass('loading'); 59 setTimeout(function () { 60 $('.etp-events-grid-wrapper .alert-error').remove(); 61 }, 5000); 62 } 63 }); 64 } 65 66 function displaySelectedItems() { 67 var selectedMonths = $('#event_month').find('a.checked:not(.any)').map(function () { 68 return $(this).text(); 69 }).get(); 70 71 // var startDate = $('#event_start_date').val(); 72 73 var selectedItems = selectedMonths.slice(); 74 75 // if (startDate) { 76 // selectedItems.push('Date: ' + startDate); 77 // } 78 79 if (selectedItems.length === 0) { 80 $('.selected-filters').html('').css('display', 'none'); 81 return; 82 } 83 84 var selectedItemsHTML = '<p>Selected Filters:</p><ul>'; 85 selectedItems.forEach(function (item) { 86 selectedItemsHTML += '<li class="selected-item"><span class="selected-item-value">' + item + '</span><i class="fas fa-times"></i></li>'; 87 }); 88 selectedItemsHTML += '</ul>'; 89 90 $('.selected-filters').html(selectedItemsHTML).css('display', 'flex'); 91 } 92 93 // Clear date filters button 94 $('#clear_date_filters').on('click', function() { 95 $('#event_start_date').val(''); 96 fetchEvents(); 97 displaySelectedItems(); 98 }); 99 100 $(".dropdown").on("click", function () { 101 $(this).toggleClass("is-active"); 102 }); 103 104 $(".dropdown-content a").on("click", function (e) { 105 e.preventDefault(); 106 e.stopPropagation(); 107 if ($(this).hasClass("any")) { 108 $(this).closest(".dropdown").find(".dropdown-content a").removeClass("checked"); 109 $(this).addClass("checked"); 110 } else { 111 $(this).toggleClass("checked"); 112 $(this).parents('.dropdown-content').find(".any").removeClass("checked"); 113 } 114 115 if (!$(this).parents('.dropdown-content').find("a").hasClass("checked")) { 116 $(this).parents('.dropdown-content').find(".any").addClass("checked"); 117 } 118 119 fetchEvents(); 120 displaySelectedItems(); 121 }); 122 123 $(".selected-filters").on("click", ".selected-item i", function () { 124 var itemValue = $(this).siblings('.selected-item-value').text(); 125 itemValue = itemValue.replace(/^\s+|\s+$/g, ''); 126 127 // Check if it's a date filter 128 if (itemValue.startsWith('Date:')) { 129 $('#event_start_date').val(''); 130 } else { 131 // It's a month filter 132 $('.dropdown-content').find('a').each(function () { 133 var dropdownItemValue = $(this).text().replace(/^\s+|\s+$/g, ''); 134 if (dropdownItemValue === itemValue) { 135 $(this).removeClass('checked'); 136 } 137 }); 138 } 139 140 fetchEvents(); 141 displaySelectedItems(); 142 }); 143 144 $(document).on("click", function (e) { 145 if (!$(e.target).closest(".dropdown").length) { 146 $(".dropdown").removeClass("is-active"); 147 } 148 }); 149});
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.