PageSourceSearch

https://page.org/wp-content/plugins/bfm-framework-blocks/js/events-row.js?ver=1790216675

js page.org collected 2026-09-24 17:34:10 UTC 3,704 bytes, 99 lines download raw bytes

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.