PageSourceSearch

https://almerecity.nl/wp-content/themes/Impreza/common/js/elements/add-to-favs.js?ver=8.46.1

js almerecity.nl collected 2026-10-02 11:43:53 UTC 5,533 bytes, 208 lines download raw bytes

1/**
2 * UpSolution Element: Add to Favorites
3 */
4! function( $, _undefined ) {
5	"use strict";
6
7	window.$us = window.$us || {};
8
9	/**
10	 * @class AddToFavorites
11	 * @param {String|Node} container
12	 */
13	function AddToFavorites( container ) {
14		const self = this;
15
16		self.$wrapperFavs = $( container );
17		self.$btnFavs = $( '.w-btn.us_add_to_favs', container );
18		self.$tooltipNotLoggedIn = $( '.us-add-to-favs-tooltip.not-logged-in', container );
19		self.$tooltipAfterAdding = $( '.us-add-to-favs-tooltip.message-after-adding', container );
20		self.$btnFavsLabel = $( '.w-btn-label', self.$btnFavs );
21
22		self.xhr = _undefined;
23		self.data = {
24			post_ID: 0,
25			labelAfterAdding: '',
26			labelBeforeAdding: '',
27		};
28		if ( self.$btnFavs.is( '[onclick]' ) ) {
29			$.extend( self.data, self.$btnFavs[0].onclick() || {} );
30		}
31
32		// Delete data everywhere except for the preview of the usbuilder,
33		// the data may be needed again to restore the elements.
34		if ( ! $us.usbPreview() ) {
35			self.$btnFavs.removeAttr( 'onclick' );
36		}
37
38		self._events = {
39			toggleFavorites: self._toggleFavorites.bind( self ),
40		};
41
42		self.$btnFavs.on( 'click', self._events.toggleFavorites);
43
44		self.setButtonState( self.getPostIDs().includes( self.data.post_ID ) );
45	};
46
47	// Add to Favorites API
48	$.extend( AddToFavorites.prototype, {
49
50		getPostIDs: function() {
51			return $ush.toString( $us.userFavoritePostIds )
52				.split( ',' )
53				.map( $ush.parseInt )
54				.filter( ( v ) => { return v } );
55		},
56
57		setButtonState: function( isAdded ) {
58			let self = this;
59			self.$btnFavs
60				.removeAttr( 'disabled' )
61				.removeClass( 'loading' );
62			if ( isAdded ) {
63				self.$btnFavs.addClass( 'added' );
64				if ( self.$btnFavsLabel.length ) {
65					self.$btnFavsLabel.text( self.data.labelAfterAdding );
66				}
67			} else {
68				self.$btnFavs.removeClass( 'added' );
69				if ( self.$btnFavsLabel.length ) {
70					self.$btnFavsLabel.text( self.data.labelBeforeAdding );
71				}
72			}
73		},
74
75		_toggleFavorites: function( e ) {
76			const self = this;
77
78			e.preventDefault();
79			e.stopPropagation();
80
81			const notLoggedIn = self.data.userLoggedIn === false;
82			const isAdded = ! self.$btnFavs.hasClass( 'added' );
83
84			if ( notLoggedIn && ! self.data.allowGuests ) {
85				self.toggleTooltip( self.$tooltipNotLoggedIn );
86				return;
87			}
88
89			// For Favorites Counter element
90			$us.$document.trigger( 'usToggleFavorites', isAdded );
91
92
93			let postIDs = self.getPostIDs(),
94				index = postIDs.indexOf( self.data.post_ID );
95			if ( index > -1 ) {
96				postIDs.splice( index, 1 );
97			} else {
98				postIDs.push( self.data.post_ID );
99			}
100			$us.userFavoritePostIds = postIDs.join( ',' );
101
102			if ( notLoggedIn && self.data.allowGuests ) {
103				$ush.setCookie( 'us_favorite_post_ids', postIDs.join( ',' ), 365 );
104			}
105
106			self.setButtonState( isAdded );
107			self.toggleAriaLabel( isAdded );
108
109			if ( self.$btnFavs.hasClass( 'added' ) && self.$tooltipAfterAdding.length ) {
110				self.toggleTooltip( self.$tooltipAfterAdding );
111			} else {
112				self.$tooltipAfterAdding.removeClass( 'show' );
113			}
114
115			if ( ! $ush.isUndefined( self.xhr ) ) {
116				self.xhr.abort();
117			}
118			self.xhr = $.ajax( {
119				url: $us.ajaxUrl,
120				type: 'POST',
121				data: {
122					action: 'us_add_post_to_favorites',
123					post_id: self.data.post_ID,
124				}
125			} );
126		},
127
128		toggleTooltip: function( tooltip ) {
129			const removeTooltip = () => {
130				$us.$window.off( 'click', removeTooltip );
131				if ( tooltip.hasClass( 'show' ) ) {
132					tooltip.removeClass( 'show' );
133				}
134			};
135
136			tooltip.addClass( 'show' );
137
138			$ush.timeout( () => {
139				$us.$window.on( 'click', removeTooltip );
140			}, 1 );
141		},
142
143		toggleAriaLabel: function( isAdded ) {
144			const self = this;
145			if ( ! self.$btnFavs.hasClass( 'text_none' ) ) {
146				return;
147			}
148			if ( isAdded ) {
149				self.$btnFavs.attr( 'aria-label', self.data.labelAfterAdding );
150			} else {
151				self.$btnFavs.attr( 'aria-label', self.data.labelBeforeAdding );
152			}
153		}
154	} );
155
156	$.fn.usAddToFavorites = function() {
157		return this.each( function() {
158			$( this ).data( 'usAddToFavorites', new AddToFavorites( this ) );
159		} );
160	};
161
162	/**
163	 * @class FavoritesCounter
164	 * @param {String|Node} container
165	 */
166	function FavoritesCounter( container ) {
167		const self = this;
168
169		self.$wrapperFavsCounter = $( container );
170		self.$favsCounter = $( '.w-favs-counter-quantity', self.$wrapperFavsCounter );
171		self.$favsCounterQuantity = self.$favsCounter.text() * 1;
172
173		$us.$document.on( 'usToggleFavorites', self._changeCount.bind( self ) );
174	}
175
176	$.extend( FavoritesCounter.prototype, {
177
178		_changeCount: function( _, isAdded ) {
179			const self = this;
180
181			if ( isAdded ) {
182				self.$favsCounterQuantity++;
183				self.$favsCounter.text( self.$favsCounterQuantity );
184			} else {
185				self.$favsCounterQuantity--;
186				self.$favsCounter.text( self.$favsCounterQuantity );
187			}
188
189			if ( self.$favsCounterQuantity < 1 ) {
190				self.$wrapperFavsCounter.addClass( 'empty' );
191			} else {
192				self.$wrapperFavsCounter.removeClass( 'empty' );
193			}
194		},
195	} );
196
197	$.fn.usFavoritesCounter = new FavoritesCounter( '.w-favs-counter' );
198
199	$( () => {
200		$( '.w-btn-wrapper.for_add_to_favs' ).usAddToFavorites();
201	} );
202
203	// Init in Grid Layout context
204	$us.$document.on( 'usPostList.itemsLoaded usGrid.itemsLoaded', ( _, $items ) => {
205		$( '.w-btn-wrapper.for_add_to_favs', $items ).usAddToFavorites();
206	} );
207
208}( 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.