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