1'use strict'; 2 3jQuery(document).ready(function ($j) { 4 initMenuAccordion(); 5}); 6 7var termClass = 'iksm-term'; 8 9var IKSM = { 10 classes: { 11 element: { 12 current: termClass + '--current', 13 expanded: termClass + '--expanded', 14 expanding: termClass + '--expanding', 15 collapsing: termClass + '--collapsing', 16 child: termClass + '--child', 17 hasChildren: termClass + '--has-children', 18 expandedCurrent: termClass + '--expanded-current', 19 expandedInitial: termClass + '--expanded-initial', 20 }, 21 }, 22 selectors: { 23 dataAttrs: '#iksm_data_args', 24 container: '.iksm-container', 25 treeContainer: '.iksm-terms-tree', 26 treeContainerInner: '.iksm-terms-tree__inner', 27 toggle: '.' + termClass + '__toggle', 28 element: '.' + termClass, 29 elementCurrent: '.' + termClass + '--current', 30 elementInner: '.' + termClass + '__inner', 31 elementLink: '.' + termClass + '__link', 32 elementHasChildren: '.' + termClass + '--has-children', 33 elementIsParent: '.' + termClass + '--parent', 34 elementExpandedCurrent: '.' + termClass + '--expanded-current', 35 elementExpandedInitial: '.' + termClass + '--expanded-initial', 36 }, 37 dataAttrs: { 38 collapseChildren: "collapse_children_terms", 39 collapseOther: "collapse_other_terms", 40 collapseAnimationDuration: "collapse_animation_duration", 41 expandAnimationDuration: "expand_animation_duration", 42 disableParentLinks: "disable_parent_links_level", 43 toggleByItemClick: "toggle_by_item_click", 44 initialExpansionDisableScreenWidth: "initial_expansion_disable_screen_width", 45 }, 46}; 47jQuery( document ).on( 'elementor/popup/show', (event, id) => { 48 var $ = jQuery; 49 var $popupMenu = $("[data-elementor-id=" + id + "]"); 50 var $menuElementor = $popupMenu.find(IKSM.selectors.container); 51 if ($menuElementor.length > 0 ) { 52 initMenuAccordion($menuElementor); 53 } 54}); 55 56function initMenuAccordion($menus = null) { 57 var $ = jQuery; 58 var selectors = IKSM.selectors; 59 var classes = IKSM.classes; 60 if (!$menus) { 61 $menus = $(selectors.container); 62 } 63 log('initMenuAccordion, $menus:', $menus); 64 65 $menus.each(function (index, menu) { 66 /* 67 * FOR EACH MENU 68 */ 69 70 var $menu = $(menu); 71 var $toggles = $menu.find(selectors.toggle); 72 var $elementsInner = $menu.find(selectors.elementInner); 73 var $elementsLinks = $menu.find(selectors.elementLink); 74 var data = $menu.find(selectors.dataAttrs).data() || {}; 75 76 $toggles.click(processClick); 77 $toggles.keypress(function (event) { 78 if (event.keyCode === 13) { // Enter 79 event.target && event.target.click() 80 } 81 }); 82 83 $elementsInner.keypress(function (event) { 84 if (event.keyCode === 13) { // Enter 85 var $target = $(event.target) 86 var children = $target.children(selectors.elementLink) 87 if (children.length) { 88 children[0].click() 89 } 90 } 91 }); 92
93 // Focus and Blur parent element when focusing/blurring link element 94 95 $elementsLinks.focus(function (event) { 96 var parent = getLinkContainer(event.target) 97 parent && parent.focus() 98 }); 99 100 $elementsLinks.blur(function (event) { 101 var parent = getLinkContainer(event.target) 102 parent && parent.blur() 103 }); 104 105 processToggledLinks(); 106 107 processInitialExpansion(); 108 109 /* 110 * FUNCTIONS 111 */ 112 113 function processClick() { 114 var $this = $(this); 115 var $item = $this.closest(selectors.element); 116 117 if (isExpanded($item)) { // Only if expanded 118 collapse($item); 119 if (data[IKSM.dataAttrs.collapseChildren]) { 120 collapseChildren($item); 121 } 122 } else { 123 expand($item); 124 if (data[IKSM.dataAttrs.collapseOther]) { 125 collapseOther($item); 126 } 127 } 128 } 129 130 function processToggledLinks() { 131 if ( 132 data.hasOwnProperty(IKSM.dataAttrs.disableParentLinks) 133 || data.hasOwnProperty(IKSM.dataAttrs.toggleByItemClick) 134 ) { 135 var $elements = $menu.find("a[data-toggle=1]"); 136 137 $elements.each(function (index, element) { 138 var $item = $(element).closest(selectors.elementInner); 139 $item.click(processClick); 140 $item.find(selectors.toggle).off('click'); 141 }); 142 } 143 } 144 145 function processInitialExpansion() { 146 var $elements; 147 148 // Initial Expansion 149 $elements = $menu.find(selectors.elementExpandedInitial); 150 if ($elements.length) { 151 var screenWidth = parseInt(data[IKSM.dataAttrs.initialExpansionDisableScreenWidth]); 152 153 $elements.each(function (index, element) { 154 const $element = $(element); 155 156 if (screenWidth && isScreenWidthLessThan(screenWidth)) { 157 var $tree = $element.children(selectors.treeContainer); 158 $tree.css("display", ""); 159 $element.removeClass(classes.element.expanded); 160 } 161 $element.removeClass(classes.element.expandedInitial); 162 }); 163 } 164 165 // Current Terms Expansion 166 $elements = $menu.find(selectors.elementExpandedCurrent); 167 if ($elements.length) { 168 $elements.removeClass(classes.element.expandedCurrent); 169 } 170 } 171 172 function isExpanded($element) {
173 return $element.hasClass(classes.element.expanded); 174 } 175 176 function hasChildren($element) { 177 return $element && $element.hasClass(classes.element.hasChildren); 178 } 179 180 function expand($element, duration) { 181 if (hasChildren($element)) { 182 // TODO: Recalculate real-height, if children were collapsed/expanded changes 183 duration = duration === undefined ? data[IKSM.dataAttrs.expandAnimationDuration] : duration; 184 var isCollapsing = $element.hasClass(classes.element.collapsing); 185 var $tree = $element.children(selectors.treeContainer); 186 187 $element.addClass(classes.element.expanded); 188 $element.addClass(classes.element.expanding); 189 $element.removeClass(classes.element.collapsing); 190 191 var height; 192 if (isCollapsing) { 193 height = $tree.data("real-height"); 194 } else { 195 $tree.css('opacity', 0); 196 $tree.css('display', 'block'); // To get correct outerHeight 197 height = $tree.outerHeight(); 198 $tree.css('opacity', ''); 199 $tree.css('display', ''); 200 $tree.data("real-height", height); 201 $tree.css("height", 0); // Required for animate 202 } 203 204 $tree.css("display", "block"); // Make it visible 205 $tree.stop().animate({height: height}, duration, function () { 206 $tree.css("height", ""); // Remove unnecessary height 207 $element.removeClass(classes.element.expanding); 208 }); 209 210 log('expand', $element, height); 211 } 212 } 213 214 function collapse($element, duration) { 215 if (hasChildren($element)) { 216 duration = duration === undefined ? data[IKSM.dataAttrs.collapseAnimationDuration] : duration;
217 var isExpanding = $element.hasClass(classes.element.expanding); 218 var $tree = $element.children(selectors.treeContainer); 219 220 $element.removeClass(classes.element.expanded); 221 $element.removeClass(classes.element.expanding); 222 $element.addClass(classes.element.collapsing); 223 224 if (!isExpanding) { 225 var outerHeight = $tree.outerHeight(); 226 $tree.data("real-height", outerHeight); // Saving real height to use it, if EXPANDING started before COLLAPSING ended 227 } 228 229 $tree.stop().animate({height: 0}, duration, function () { 230 $tree.css("display", ""); 231 $tree.css("height", ""); 232 $element.removeClass(classes.element.collapsing); 233 }); 234 235 log('collapse', $element); 236 } 237 } 238 239 function collapseOther($element) { 240 log('collapseOther', $element); 241 var id = $element.data("id"); 242 243 var $elements = $element 244 .parent(selectors.treeContainerInner) // Collapsing SAME level items 245 .children(selectors.elementHasChildren + '.' + classes.element.expanded) 246 .filter(function () { 247 var $this = $(this); 248 if ($this.data("id") === id) { // Same element 249 return false; 250 } 251 if ($this.find(selectors.element + "[data-id='" + id + "']").length > 0) { // Is parent 252 return false; 253 } 254 return true; 255 }); 256 257 // Collapse result elements 258 $elements.each(function (index, element) { 259 var $element = $(element); 260 collapse($element); 261 // Maybe collapse children 262 if (data[IKSM.dataAttrs.collapseChildren]) { 263 collapseChildren($element); 264 } 265 }); 266 } 267 268 function collapseChildren($element) { 269 log('collapseChildren', $element); 270 $element.find(selectors.elementHasChildren).each(function (index, element) { 271 collapse($(element)); 272 }); 273 } 274 }); 275 276 function getLinkContainer(element) { 277 var $target = $(element) 278 var parent = $target.closest(selectors.elementInner) 279 return parent[0] 280 } 281 282 function log(/*...args*/) { 283 // console.log(...args); 284 } 285 286 function isScreenWidthLessThan(width) { 287 return window.matchMedia('(max-width: ' + width + 'px)').matches; 288 } 289} 290
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.