1/** 2 * Makes sure we have all the required levels on the Tribe Object 3 * 4 * @since 4.9.4 5 * 6 * @type {PlainObject} 7 */ 8tribe.events = tribe.events || {}; 9tribe.events.views = tribe.events.views || {}; 10 11/** 12 * Configures Events Bar Object in the Global Tribe variable 13 * 14 * @since 4.9.4 15 * 16 * @type {PlainObject} 17 */ 18tribe.events.views.eventsBar = {}; 19 20/** 21 * Initializes in a Strict env the code that manages the Event Views 22 * 23 * @since 4.9.4 24 * 25 * @param {PlainObject} $ jQuery 26 * @param {PlainObject} obj tribe.events.views.eventsBar 27 * 28 * @return {void} 29 */ 30( function( $, obj ) { 31 'use strict'; 32 var $document = $( document ); 33 34 /** 35 * Selectors used for configuration and setup 36 * 37 * @since 4.9.4 38 * 39 * @type {PlainObject} 40 */ 41 obj.selectors = { 42 eventsBar: '[data-js="tribe-events-events-bar"]', 43 searchButton: '[data-js="tribe-events-search-button"]', 44 searchButtonActiveClass: '.tribe-events-c-events-bar__search-button--active', 45 searchContainer: '[data-js="tribe-events-search-container"]', 46 }; 47 48 /** 49 * Object of key codes 50 * 51 * @since 4.9.4 52 * 53 * @type {PlainObject} 54 */ 55 obj.keyCode = { 56 END: 35, 57 HOME: 36, 58 LEFT: 37, 59 RIGHT: 39, 60 }; 61 62 /** 63 * Deinitialize accordion based on header and content 64 * 65 * @since 4.9.7 66 * 67 * @param {jQuery} $header jQuery object of header 68 * @param {jQuery} $content jQuery object of contents 69 * 70 * @return {void} 71 */ 72 obj.deinitAccordion = function( $header, $content ) { 73 tribe.events.views.accordion.deinitAccordion( 0, $header ); 74 tribe.events.views.accordion.deinitAccordionA11yAttrs( $header, $content ); 75 $content.css( 'display', '' ); 76 }; 77 78 /** 79 * Initialize accordion based on header and content 80 * 81 * @since 4.9.7 82 * 83 * @param {jQuery} $container jQuery object of view container 84 * @param {jQuery} $header jQuery object of header 85 * @param {jQuery} $content jQuery object of contents 86 * 87 * @return {void} 88 */ 89 obj.initAccordion = function( $container, $header, $content ) { 90 tribe.events.views.accordion.initAccordion( $container )( 0, $header ); 91 tribe.events.views.accordion.initAccordionA11yAttrs( $header, $content ); 92 }; 93 94 /** 95 * Toggles active class on search button 96 * 97 * @since 4.9.7 98 * 99 * @param {Event} event event object for click event 100 * 101 * @return {void} 102 */ 103 obj.handleSearchButtonClick = function( event ) { 104 event.data.target.toggleClass( obj.selectors.searchButtonActiveClass.className() ); 105 }; 106 107 /** 108 * Deinitialize search button accordion 109 * 110 * @since 4.9.8 111 * 112 * @param {jQuery} $container jQuery object of view container 113 * 114 * @return {void} 115 */ 116 obj.deinitSearchAccordion = function( $container ) { 117 var $searchButton = $container.find( obj.selectors.searchButton ); 118 $searchButton.removeClass( obj.selectors.searchButtonActiveClass.className() ); 119 var $searchContainer = $container.find( obj.selectors.searchContainer ); 120 obj.deinitAccordion( $searchButton, $searchContainer ); 121 $searchButton.off( 'click', obj.handleSearchButtonClick ); 122 }; 123 124 /** 125 * Initialize search button accordion 126 * 127 * @since 4.9.4 128 * 129 * @param {jQuery} $container jQuery object of view container 130 * 131 * @return {void} 132 */ 133 obj.initSearchAccordion = function( $container ) { 134 var $searchButton = $container.find( obj.selectors.searchButton ); 135 var $searchContainer = $container.find( obj.selectors.searchContainer ); 136 obj.initAccordion( $container, $searchButton, $searchContainer ); 137 $searchButton.on( 'click', { target: $searchButton }, obj.handleSearchButtonClick ); 138 }; 139 140 /** 141 * Initializes events bar state 142 * 143 * @since 4.9.8 144 * 145 * @param {jQuery} $container jQuery object of view container 146 * 147 * @return {void} 148 */ 149 obj.initState = function( $container ) { 150 var $eventsBar = $container.find( obj.selectors.eventsBar ); 151 var state = { 152 mobileInitialized: false, 153 desktopInitialized: false, 154 }; 155 156 $eventsBar.data( 'tribeEventsState', state ); 157 }; 158 159 /** 160 * Deinitializes events bar 161 * 162 * @since 4.9.5 163 * 164 * @param {jQuery} $container jQuery object of view container 165 * 166 * @return {void} 167 */ 168 obj.deinitEventsBar = function( $container ) { 169 obj.deinitSearchAccordion( $container ); 170 }; 171 172 /** 173 * Initializes events bar 174 * 175 * @since 4.9.8
176 * 177 * @param {jQuery} $container jQuery object of view container 178 * 179 * @return {void} 180 */ 181 obj.initEventsBar = function( $container ) { 182 var $eventsBar = $container.find( obj.selectors.eventsBar ); 183 184 if ( $eventsBar.length ) { 185 var state = $eventsBar.data( 'tribeEventsState' ); 186 var containerState = $container.data( 'tribeEventsState' ); 187 var isMobile = containerState.isMobile; 188 189 // If viewport is mobile and mobile state is not initialized 190 if ( isMobile && ! state.mobileInitialized ) { 191 obj.initSearchAccordion( $container ); 192 state.desktopInitialized = false; 193 state.mobileInitialized = true; 194 $eventsBar.data( 'tribeEventsState', state ); 195 196 // If viewport is desktop and desktop state is not initialized 197 } else if ( ! isMobile && ! state.desktopInitialized ) { 198 obj.deinitSearchAccordion( $container ); 199 state.mobileInitialized = false; 200 state.desktopInitialized = true; 201 $eventsBar.data( 'tribeEventsState', state ); 202 } 203 } 204 }; 205 206 /** 207 * Handles 'resize.tribeEvents' event 208 * 209 * @since 4.9.7 210 * 211 * @param {Event} event event object for 'resize.tribeEvents' event 212 * 213 * @return {void} 214 */ 215 obj.handleResize = function( event ) { 216 obj.initEventsBar( event.data.container ); 217 }; 218 219 /** 220 * Handles click event on document 221 * 222 * @since 4.9.7 223 * 224 * @param {Event} event event object for click event 225 * 226 * @return {void} 227 */ 228 obj.handleClick = function( event ) { 229 var $target = $( event.target ); 230 var isParentSearchButton = Boolean( $target.closest( obj.selectors.searchButton ).length ); 231 var isParentSearchContainer = Boolean( $target.closest( obj.selectors.searchContainer ).length ); 232 233 if ( ! ( isParentSearchButton || isParentSearchContainer ) ) { 234 var $container = event.data.container; 235 var $eventsBar = $container.find( obj.selectors.eventsBar ); 236 var $searchButton = $eventsBar.find( obj.selectors.searchButton ); 237 238 if ( $searchButton.hasClass( obj.selectors.searchButtonActiveClass.className() ) ) { 239 var $searchContainer = $eventsBar.find( obj.selectors.searchContainer ); 240 $searchButton.removeClass( obj.selectors.searchButtonActiveClass.className() ); 241 tribe.events.views.accordion.closeAccordion( $searchButton, $searchContainer ); 242 } 243 } 244 }; 245 246 /** 247 * Unbind events for events bar 248 * 249 * @since 4.9.7 250 * 251 * @param {jQuery} $container jQuery object of view container 252 * 253 * @return {void} 254 */ 255 obj.unbindEvents = function( $container ) { 256 $container.off( 'resize.tribeEvents', obj.handleResize ); 257 $document.off( 'click', obj.handleClick ); 258 }; 259 260 /** 261 * Bind events for events bar 262 * 263 * @since 4.9.7 264 * 265 * @param {jQuery} $container jQuery object of view container 266 * 267 * @return {void} 268 */ 269 obj.bindEvents = function( $container ) { 270 $container.on( 'resize.tribeEvents', { container: $container }, obj.handleResize ); 271 $document.on( 'click', { container: $container }, obj.handleClick ); 272 }; 273 274 /** 275 * Deinitialize events bar JS 276 * 277 * @since 4.9.4 278 * 279 * @param {Event} event event object for 'beforeAjaxSuccess.tribeEvents' event 280 * @param {jqXHR} jqXHR Request object 281 * @param {PlainObject} settings Settings that this request was made with 282 * 283 * @return {void} 284 */ 285 obj.deinit = function( event, jqXHR, settings ) { 286 var $container = event.data.container; 287 obj.deinitEventsBar( $container ); 288 obj.unbindEvents( $container ); 289 $container.off( 'beforeAjaxSuccess.tribeEvents', obj.deinit ); 290 }; 291 292 /** 293 * Initialize events bar JS 294 * 295 * @since 4.9.8 296 * 297 * @param {Event} event event object for 'afterSetup.tribeEvents' event 298 * @param {integer} index jQuery.each index param from 'afterSetup.tribeEvents' event 299 * @param {jQuery} $container jQuery object of view container 300 * @param {object} data data object passed from 'afterSetup.tribeEvents' event 301 * 302 * @return {void} 303 */ 304 obj.init = function( event, index, $container, data ) { 305 var $eventsBar = $container.find( obj.selectors.eventsBar ); 306 307 if ( ! $eventsBar.length ) { 308 return; 309 } 310 311 obj.initState( $container ); 312 obj.initEventsBar( $container ); 313 obj.bindEvents( $container ); 314 $container.on( 'beforeAjaxSuccess.tribeEvents', { container: $container }, obj.deinit ); 315 }; 316 317 /** 318 * Handles the initialization of events bar when Document is ready 319 * 320 * @since 4.9.4 321 * 322 * @return {void} 323 */ 324 obj.ready = function() { 325 $document.on( 'afterSetup.tribeEvents', tribe.events.views.manager.selectors.container, obj.init ); 326 }; 327 328 // Configure on document ready 329 $document.ready( obj.ready ); 330} )( jQuery, tribe.events.views.eventsBar );
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.