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 elementHasChildren: '.' + termClass + '--has-children', 32 elementIsParent: '.' + termClass + '--parent', 33 elementExpandedCurrent: '.' + termClass + '--expanded-current', 34 elementExpandedInitial: '.' + termClass + '--expanded-initial', 35 }, 36 dataAttrs: { 37 collapseChildren: "collapse_children_terms", 38 collapseOther: "collapse_other_terms", 39 collapseAnimationDuration: "collapse_animation_duration", 40 expandAnimationDuration: "expand_animation_duration", 41 disableParentLinks: "disable_parent_links_level", 42 initialExpansionDisableScreenWidth: "initial_expansion_disable_screen_width", 43 }, 44}; 45 46function initMenuAccordion() { 47 var $ = jQuery; 48 var selectors = IKSM.selectors; 49 var classes = IKSM.classes; 50 var $menus = $(selectors.container); 51 log('initMenuAccordion, $menus:', $menus); 52 53 $menus.each(function (index, menu) { 54 /* 55 * FOR EACH MENU 56 */ 57 58 var $menu = $(menu); 59 var $toggles = $menu.find(selectors.toggle); 60 var data = $menu.find(selectors.dataAttrs).data() || {}; 61 62 log('data', data); 63 // console.time('Click init'); 64 $toggles.click(processClick); 65 66 processDisableParentLinks(); 67 68 processInitialExpansion(); 69 70 /* 71 * FUNCTIONS 72 */ 73 74 function processClick() { 75 // console.time('Click'); 76 var $this = $(this); 77 var $item = $this.closest(selectors.element); 78 79 if (isExpanded($item)) { // Only if expanded 80 collapse($item); 81 if (data[IKSM.dataAttrs.collapseChildren]) { 82 collapseChildren($item); 83 } 84 } else { 85 expand($item); 86 if (data[IKSM.dataAttrs.collapseOther]) { 87 collapseOther($item); 88 } 89 } 90 // console.timeEnd('Click'); 91 } 92 93 function processDisableParentLinks() { 94 if (data.hasOwnProperty(IKSM.dataAttrs.disableParentLinks)) { 95 var $elements = $menu.find("a[data-toggle=1]"); 96 97 $elements.each(function (index, element) { 98 var $item = $(element).closest(selectors.elementInner); 99 $item.click(processClick); 100 $item.find(selectors.toggle).off('click'); 101 }); 102 } 103 } 104 105 function processInitialExpansion() { 106 var $elements; 107 108 // Initial Expansion 109 $elements = $menu.find(selectors.elementExpandedInitial); 110 if ($elements.length) { 111 var screenWidth = parseInt(data[IKSM.dataAttrs.initialExpansionDisableScreenWidth]); 112 113 $elements.each(function (index, element) { 114 const $element = $(element); 115 116 if (screenWidth && isScreenWidthLessThan(screenWidth)) { 117 var $tree = $element.children(selectors.treeContainer); 118 $tree.css("display", "");
119 $element.removeClass(classes.element.expanded); 120 } 121 $element.removeClass(classes.element.expandedInitial); 122 }); 123 } 124 125 // Current Terms Expansion 126 $elements = $menu.find(selectors.elementExpandedCurrent); 127 if ($elements.length) { 128 $elements.removeClass(classes.element.expandedCurrent); 129 } 130 } 131 132 function isExpanded($element) { 133 return $element.hasClass(classes.element.expanded); 134 } 135 136 function hasChildren($element) { 137 return $element && $element.hasClass(classes.element.hasChildren); 138 } 139 140 function expand($element, duration) { 141 if (hasChildren($element)) { 142 // TODO: Recalculate real-height, if children were collapsed/expanded changes 143 duration = duration === undefined ? data[IKSM.dataAttrs.expandAnimationDuration] : duration; 144 var isCollapsing = $element.hasClass(classe
144s.element.collapsing); 145 var $tree = $element.children(selectors.treeContainer); 146 147 $element.addClass(classes.element.expanded); 148 $element.addClass(classes.element.expanding); 149 $element.removeClass(classes.element.collapsing); 150 151 var height; 152 if (isCollapsing) { 153 height = $tree.data("real-height"); 154 } else { 155 $tree.css('opacity', 0); 156 $tree.css('display', 'block'); // To get correct outerHeight 157 height = $tree.outerHeight(); 158 $tree.css('opacity', ''); 159 $tree.css('display', ''); 160 $tree.data("real-height", height); 161 $tree.css("height", 0); // Required for animate 162 } 163 164 $tree.css("display", "block"); // Make it visible 165 $tree.stop().animate({height: height}, duration, function () { 166 $tree.css("height", ""); // Remove unnecessary height 167 $element.removeClass(classes.element.expanding); 168 }); 169 170 log('expand', $element, height); 171 } 172 } 173 174 function collapse($element, duration) { 175 if (hasChildren($element)) { 176 duration = duration === undefined ? data[IKSM.dataAttrs.collapseAnimationDuration] : duration;
177 var isExpanding = $element.hasClass(classes.element.expanding); 178 var $tree = $element.children(selectors.treeContainer); 179 180 $element.removeClass(classes.element.expanded); 181 $element.removeClass(classes.element.expanding); 182 $element.addClass(classes.element.collapsing); 183 184 if (!isExpanding) { 185 var outerHeight = $tree.outerHeight(); 186 $tree.data("real-height", outerHeight); // Saving real height to use it, if EXPANDING started before COLLAPSING ended 187 } 188 189 $tree.stop().animate({height: 0}, duration, function () { 190 $tree.css("display", ""); 191 $tree.css("height", ""); 192 $element.removeClass(classes.element.collapsing); 193 }); 194 195 log('collapse', $element); 196 } 197 } 198 199 function collapseOther($element) { 200 log('collapseOther', $element); 201 var id = $element.data("id"); 202 203 var $elements = $element 204 .parent(selectors.treeContainerInner) // Collapsing SAME level items 205 .children(selectors.elementHasChildren + '.' + classes.element.expanded) 206 .filter(function () { 207 var $this = $(this); 208 if ($this.data("id") === id) { // Same element 209 return false; 210 } 211 if ($this.find(selectors.element + "[data-id='" + id + "']").length > 0) { // Is parent 212 return false; 213 } 214 return true; 215 }); 216 217 // Collapse result elements 218 $elements.each(function (index, element) { 219 var $element = $(element); 220 collapse($element); 221 // Maybe collapse children 222 if (data[IKSM.dataAttrs.collapseChildren]) { 223 collapseChildren($element); 224 } 225 }); 226 } 227 228 function collapseChildren($element) { 229 log('collapseChildren', $element); 230 $element.find(selectors.elementHasChildren).each(function (index, element) { 231 collapse($(element)); 232 }); 233 } 234 }); 235 236 function log(/*...args*/) { 237 // console.log(...args); 238 } 239 240 function isScreenWidthLessThan(width) { 241 return window.matchMedia('(max-width: ' + width + 'px)').matches; 242 } 243}
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.