1/** 2 * Events Row block â AJAX filter bar. 3 * 4 * Scoped per `.events-row` instance (a page can hold more than one block), 5 * matching the same querySelectorAll-per-instance pattern already used by 6 * framework-resource-list.js. Uses jQuery specifically because $.ajax() 7 * auto-sets the X-Requested-With header this codebase's wp_ajax_* handlers 8 * are written to expect. 9 */ 10( function ( $ ) { 11 'use strict'; 12 13 if ( typeof evrAjax === 'undefined' ) { 14 return; 15 } 16 17 function debounce( fn, wait ) { 18 var t; 19 return function () { 20 var args = arguments; 21 var ctx = this; 22 clearTimeout( t ); 23 t = setTimeout( function () { 24 fn.apply( ctx, args ); 25 }, wait ); 26 }; 27 } 28 29 function initRow( el ) { 30 var $row = $( el ); 31 var $form = $row.find( '.events-row__filters' ); 32 var $results = $row.find( '.events-row__results' ); 33 var $viewAll = $row.find( '.events-row__view-all' ); 34 35 var viewAllBase = $row.attr( 'data-view-all-base' ) || ''; 36 var viewAllOverride = '1' === $row.attr( 'data-view-all-override' ); 37 var postsPerPage = parseInt( $row.attr( 'data-posts-per-page' ), 10 ) || 3; 38 39 function currentFilters() { 40 return { 41 keyword: $form.find( '.evr-filter-keyword' ).val() || '', 42 series_type: $form.find( '.evr-filter-series' ).val() || '', 43 event_type: $form.find( '.evr-filter-event-type' ).val() || '', 44 admin_division: $form.find( '.evr-filter-admin-division' ).val() || '', 45 status: $form.find( '.evr-filter-status' ).val() || 'upcoming' 46 }; 47 } 48 49 function updateViewAllLink( filters ) { 50 if ( viewAllOverride || ! viewAllBase ) { 51 return; 52 } 53 var params = { 54 status: filters.status, 55 'series-type': filters.series_type, 56 'event-type': filters.event_type, 57 'admin-division': filters.admin_division 58 }; 59 var url = viewAllBase.split( '?' )[ 0 ]; 60 var query = []; 61 Object.keys( params ).forEach( function ( key ) { 62 if ( params[ key ] ) { 63 query.push( encodeURIComponent( key ) + '=' + encodeURIComponent( params[ key ] ) ); 64 } 65 } ); 66 $viewAll.attr( 'href', query.length ? url + '?' + query.join( '&' ) : url ); 67 } 68 69 function fetchEvents() { 70 var filters = currentFilters(); 71 updateViewAllLink( filters ); 72 73 $results.addClass( 'is-loading' ); 74 75 $.post( evrAjax.ajax_url, $.extend( {}, filters, { 76 action: 'evr_filter_events', 77 security: evrAjax.nonce, 78 posts_per_page: postsPerPage 79 } ) ) 80 .done( function ( response ) { 81 if ( response && response.success && response.data ) { 82 $results.html( response.data.html || '<p class="events-row__empty">No events match these filters.</p>' ); 83 } 84 } ) 85 .always( function () { 86 $results.removeClass( 'is-loading' ); 87 } ); 88 } 89 90 $form.on( 'change', '.evr-filter-status, .evr-filter-series, .evr-filter-event-type, .evr-filter-admin-division', fetchEvents ); 91 $form.on( 'input', '.evr-filter-keyword', debounce( fetchEvents, 400 ) ); 92 } 93 94 $( function () { 95 $( '.events-row' ).each( function () { 96 initRow( this ); 97 } ); 98 } ); 99} )( 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.