PageSourceSearch

https://www.diocesisgetafe.es/wp-content/plugins/jet-engine-items-…/items-number-switcher.js?ver=3.8.16

js diocesisgetafe.es collected 2026-10-02 07:20:01 UTC 9,195 bytes, 408 lines download raw bytes

1( function( $ ) {
2
3	"use strict";
4
5	const eventBaseName = 'jet-engine/items-number-switcher/breakpoint-switched/';
6
7	//apply items number filters after Listing Grid lazy load
8	$( document ).on( 'jet-engine/listing-grid/after-lazy-load', function( e, args ) {
9		
10		const loadedProvider = args.container.find( 'div.jet-listing-grid.jet-listing' );
11
12		for ( const groupName in JetSmartFilters.filterGroups ) {
13			const filterGroup = JetSmartFilters.filterGroups[ groupName ];
14			const groupProvider = filterGroup.getProvider();
15			
16			if ( loadedProvider[0] === groupProvider[0] ) {
17				filterGroup.filters.forEach( ( filter ) => {
18					if ( filter.name !== 'items-number-switcher' ) {
19						return;
20					}
21
22					const builder = filter.getBuilder();
23
24					dispatchEvent( getBreakpointByBuilder( builder ), builder )
25				} );
26			}
27		}
28	} );
29
30	function dispatchEvent( breakpoint = '', builder = 'elementor' ) {
31		const e = new CustomEvent(
32			eventBaseName + builder,
33			{
34				detail: {
35					breakpoint: breakpoint,
36					builder: builder,
37				},
38			}
39		);
40
41		document.dispatchEvent( e );
42	}
43
44	function getItemsPerPage( provider, queryId ) {
45		return JetSmartFilterSettings?.props?.[ provider ]?.[ queryId ]?.per_page || 0;
46	}
47
48	function getBreakpointByBuilder( builder ) {
49
50		if ( ! window.JetEngine ) {
51			return '';
52		}
53
54		const wWidth = window.innerWidth;
55
56		switch ( builder ) {
57			case 'elementor':
58				return elementorFrontend.getCurrentDeviceMode();
59			case 'bricks':
60				let breakpoint = JetEngineSettings.bricksBreakpoints[0]['name'];
61				let smallest   = breakpoint;
62
63				JetEngineSettings.bricksBreakpoints.forEach( ( b ) => {
64					if ( +b['width'] <= +wWidth ) {
65						breakpoint = b['name'];
66					}
67				} );
68
69				if ( wWidth < smallest['width'] ) {
70					breakpoint = smallest['name'];
71				}
72
73				return breakpoint;
74			case 'blocks':
75				return wWidth;
76		}
77	}
78
79	const initBreakpointObserver = function() {
80		const breakpointObserver = class BreakpointObserver {
81
82			timeouts = {};
83			breakpoints = {};
84
85			constructor() {
86				this.init();
87			}
88
89			init() {
90				if ( ! window.JetEngineSettings ) {
91					return;
92				}
93				
94				if ( window.elementorFrontend ) {
95					this.initElementor();
96				}
97
98				if ( window.bricksData ) {
99					this.initBricks();
100				}
101
102				this.initBlocks();
103			}
104
105			initElementor() {
106				this.breakpoints['elementor'] = elementorFrontend.getCurrentDeviceMode();
107
108				const observer = new MutationObserver( () => {
109
110					clearTimeout( this.timeouts['elementor'] );
111
112					this.timeouts['elementor'] = setTimeout(
113						() => {
114							const newMode = elementorFrontend.getCurrentDeviceMode();
115							
116							if ( newMode === this.breakpoints['elementor'] ) {
117								return;
118							}
119
120							this.breakpoints['elementor'] = newMode;
121							
122							dispatchEvent( newMode, 'elementor' )
123						}, 500
124					);
125				} );
126
127				observer.observe(
128					document.body,
129					{
130						attributes: true,
131						attributeFilter: ['data-elementor-device-mode']
132					}
133				);
134			}
135
136			initBricks() {
137				this.breakpoints['bricks'] = getBreakpointByBuilder( 'bricks' );
138
139				window.addEventListener(
140					'resize',
141					() => {
142
143						clearTimeout( this.timeouts['bricks'] );
144	
145						this.timeouts['bricks'] = setTimeout(
146							() => {
147								const newMode = getBreakpointByBuilder( 'bricks' );
148								
149								if ( newMode === this.breakpoints['bricks'] ) {
150									return;
151								}
152	
153								this.breakpoints['bricks'] = newMode;
154								
155								dispatchEvent( newMode, 'bricks' )
156							}, 500
157						);
158					}
159				);
160			}
161
162			initBlocks() {
163				window.addEventListener(
164					'resize',
165					() => {
166
167						clearTimeout( this.timeouts['blocks'] );
168	
169						this.timeouts['blocks'] = setTimeout(
170							() => {
171								this.breakpoints['blocks'] = getBreakpointByBuilder( 'blocks' );
172								dispatchEvent( this.breakpoints['blocks'], 'blocks' )
173							}, 500
174						);
175					}
176				);
177			}
178
179		};
180
181		new breakpointObserver();
182
183	}
184
185	const initItemsNumberSwitcher = function() {
186
187		window.JetSmartFilters.filtersList.JetEngineItemsNumberSwitcher = 'jet-smart-filters-items-number-switcher';
188		window.JetSmartFilters.filters.JetEngineItemsNumberSwitcher = class JetEngineItemsNumberSwitcher extends window.JetSmartFilters.filters.BasicFilter {
189
190			name = 'items-number-switcher';
191
192			dataValue = '';
193
194			builder;
195
196			constructor( $container ) {
197				
198				const $filter = $container.find( '.jet-smart-filters-items-number-switcher' );
199				
200				super( $container, $filter );
201
202				this.$container = $container;
203
204				//JetSmartFilters.events.subscribe( 'ajaxFilters/updated', this.reapplyPagination.bind( this ) );				
205
206				window.addEventListener(
207					'load',
208					() => {
209						const builder = this.getBuilder();
210						document.addEventListener( eventBaseName + builder, this.switchNumberOnEvent.bind( this ) );
211
212						if ( this.providerReady() ) {
213							dispatchEvent( getBreakpointByBuilder( builder ), builder );
214						}
215					}
216				);
217			}
218
219			providerReady() {
220				if ( this.filterGroup.$provider.hasClass( 'jet-listing-grid--lazy-load' ) ) {
221					return false;
222				}
223
224				return true;
225			}
226
227			getItemsNumber( breakpoint, builder = 'elementor' ) {
228				let itemsNumber = false;
229
230				switch ( builder ) {
231					case 'elementor':
232					case 'bricks':
233						itemsNumber = this.$filter.data( 'posts_num_responsive_' + breakpoint );
234
235						if ( ! itemsNumber ) {
236							itemsNumber = this.$filter.data( 'posts_num_responsive' );
237						}
238
239						break;
240					case 'blocks':
241						const filterBreakpoints = {};
242
243						for ( const attr of this.$filter[0].attributes ) {
244						  if ( /^data-posts_num_responsive_.+/.test( attr.name ) ) {
245							const breakpointWidth = attr.name.replace( 'data-posts_num_responsive_', '' );
246							filterBreakpoints[ breakpointWidth ] = attr.value;
247						  }
248						}
249
250						let widthList = Object.keys( filterBreakpoints );
251						widthList.sort( (a, b) => Math.sign( b - a ) );
252
253						const wWidth = window.innerWidth;
254
255						for ( const c of widthList ) {
256							if ( wWidth >= c ) {
257								itemsNumber = filterBreakpoints[ c ];
258								break;
259							}
260						}
261
262						if ( ! itemsNumber ) {
263							itemsNumber = filterBreakpoints[ Math.min( ...widthList ) ];
264						}
265
266						break;
267				}
268
269				return itemsNumber;
270			}
271
272			getBuilder() {
273				if ( this.builder !== undefined ) {
274					return this.builder;
275				}
276
277				const $filter = this?.$filter;
278
279				if ( ! $filter?.length ) {
280					this.builder = false;
281					return false;
282				}
283				
284				if ( $filter.parent().filter( '.elementor-widget-container, .elementor-widget' ).length ) {
285					this.builder = 'elementor';
286				} else if ( $filter.parent().filter( '[class*="brxe-"]' ).length ) {
287					this.builder = 'bricks';
288				} else if ( $filter.data( 'isBlock' ) ) {
289					this.builder = 'blocks';
290				}
291
292				return this.builder;
293			}
294
295			switchNumberOnEvent( e ) {
296				const breakpoint = e?.detail?.breakpoint;
297				const builder = e?.detail?.builder || 'elementor';
298				
299				if ( this.getBuilder() !== builder ) {
300					return;
301				}
302
303				this.switchNumber( this.getItemsNumber( breakpoint, builder ) );
304			}
305
306			switchNumber( itemsNumber ) {
307
308				if ( ! itemsNumber ) {
309					return;
310				}
311
312				if ( this.dataValue && +this.dataValue === +itemsNumber ) {
313					return;
314				}
315
316				// let originalReset = this.filterGroup.resetFiltersByName;
317
318				// this.filterGroup.resetFiltersByName = function( filterType ) {
319				// 	if ( filterType === 'pagination' ) {
320				// 		return;
321				// 	}
322
323				// 	originalReset( filterType );
324				// }
325
326				// if ( this.dataValue ) {
327				// 	this.prevPerPage = this.dataValue;
328				// 	this.prevPage = this.getCurrentPage();
329				// }
330
331				this.dataValue = +itemsNumber;
332
333				//this.reapplyPagination();
334
335				this.wasChanged ? this.wasChanged() : this.wasСhanged();
336
337				//this.filterGroup.resetFiltersByName = originalReset;
338			}
339
340			reapplyPagination() {
341				if ( ! this.prevPerPage || ! this.prevPage ) {
342					return;
343				}
344
345				const prevPage = this.prevPage;
346				const prevPerPage = this.prevPerPage;
347				const newPerPage =  this.dataValue;
348
349				let newPage = false;
350
351				if ( prevPage < 2 ) {
352					return;
353				}
354
355				newPage = Math.floor( ( prevPage - 1 ) * prevPerPage / newPerPage ) + 1;
356				
357				if ( prevPage === newPage ) {
358					return;
359				}
360
361				for ( const filter of this.filterGroup.filters ) {
362					if ( filter.name === 'pagination' ) {
363						filter.$filter.find( `.jet-filters-pagination__item[data-value="${newPage}"]` ).click();
364						break;
365					}
366				}
367			}
368
369			getNewPage( newPerPage ) {
370				const currentPage = this.getCurrentPage();
371
372				if ( currentPage < 2 ) {
373					return false;
374				}
375
376				return Math.floor( ( currentPage - 1 ) * this.prevPerPage / newPerPage ) + 1;
377			}
378
379			getCurrentPage() {
380				for ( const filter of this.filterGroup.filters ) {
381					if ( filter.name === 'pagination' ) {
382						if ( ! filter.$filter.find( '.jet-filters-pagination__item' ).length ) {
383							continue;
384						}
385						
386						return filter.dataValue;
387					}
388				}
389
390				return 0;
391			}
392
393			reset() {}
394
395			processData() {
396				return;
397			}
398
399		};
400
401	}
402
403	document.addEventListener( 'DOMContentLoaded', ( e ) => {
404		initBreakpointObserver();
405		initItemsNumberSwitcher();
406	});
407
408}( 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.