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.