/wp-content/plugins/the-events-calendar/src/resources/js/views/events-bar.js

https://github.com/livinglab/openlab · JavaScript · 334 lines · 124 code · 28 blank · 182 comment · 12 complexity · 9277e137782c680b4d3972b30fe4d1bd MD5 · raw file

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