 Issue 29548567:
  Issue 4925 - Create accordion component for Help Center  (Closed) 
  Base URL: https://hg.adblockplus.org/help.eyeo.com
    
  
    Issue 29548567:
  Issue 4925 - Create accordion component for Help Center  (Closed) 
  Base URL: https://hg.adblockplus.org/help.eyeo.com| Left: | ||
| Right: | 
| OLD | NEW | 
|---|---|
| 1 (function(){ | 1 (function(){ | 
| 2 document.addEventListener("DOMContentLoaded", function() | 2 document.addEventListener("DOMContentLoaded", function() | 
| 3 { | 3 { | 
| 4 | 4 | 
| 5 // Change html class name from "no-js" to "js" | 5 // Change html class name from "no-js" to "js" | 
| 6 document.documentElement.className = "js"; | 6 document.documentElement.className = "js"; | 
| 7 | 7 | 
| 8 // Toggle Navbar Collapse | 8 // Toggle Navbar Collapse | 
| 9 function toggleNavbarCollapse() | 9 function toggleNavbarCollapse() | 
| 10 { | 10 { | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 var customSelectEls = document.getElementsByClassName('custom-select-selecte d'); | 42 var customSelectEls = document.getElementsByClassName('custom-select-selecte d'); | 
| 43 for (var i = 0; i < customSelectEls.length; i++) | 43 for (var i = 0; i < customSelectEls.length; i++) | 
| 44 { | 44 { | 
| 45 customSelectEls[i] | 45 customSelectEls[i] | 
| 46 .addEventListener("click", onClickCustomSelect, false); | 46 .addEventListener("click", onClickCustomSelect, false); | 
| 47 customSelectEls[i] | 47 customSelectEls[i] | 
| 48 .nextElementSibling | 48 .nextElementSibling | 
| 49 .setAttribute("aria-hidden", "true"); | 49 .setAttribute("aria-hidden", "true"); | 
| 50 } | 50 } | 
| 51 | 51 | 
| 52 // Accordion menu | |
| 53 | |
| 54 function Accordion(accordion) | |
| 55 { | |
| 56 this.accordion = accordion; | |
| 57 this.init(); | |
| 
juliandoucette
2017/09/26 18:57:06
NIT: It's unnecessary to separate this constructor
 
ire
2017/09/28 14:48:52
Done.
 | |
| 58 } | |
| 59 | |
| 60 Accordion.prototype.init = function() | |
| 61 { | |
| 62 var accordionButtons = this.accordion.getElementsByClassName('accordion-to ggle-button'); | |
| 63 | |
| 64 for (var i = 0; i < accordionButtons.length; i++) | |
| 65 { | |
| 66 accordionButtons[i] | |
| 67 .addEventListener("click", this.toggleAccordionSection, false); | |
| 68 accordionButtons[i] | |
| 69 .addEventListener("keydown", this.navigateAccordionHeadings, false); | |
| 70 | |
| 71 // Close all sections except the first | |
| 72 if (i !== 0) | |
| 73 { | |
| 74 accordionButtons[i].setAttribute("aria-expanded", "false"); | |
| 75 document | |
| 76 .getElementById( accordionButtons[i].getAttribute("aria-controls") ) | |
| 77 .setAttribute("hidden", "true"); | |
| 78 } | |
| 79 } | |
| 80 }; | |
| 81 | |
| 82 Accordion.prototype.toggleAccordionSection = function() | |
| 83 { | |
| 84 // Hide currently expanded section | |
| 85 var accordion = this.parentElement.parentElement; | |
| 86 var expandedButton = accordion.querySelector("button[aria-expanded='true'] "); | |
| 87 if (expandedButton) | |
| 88 { | |
| 89 expandedButton.setAttribute("aria-expanded", "false"); | |
| 90 document | |
| 91 .getElementById( expandedButton.getAttribute("aria-controls") ) | |
| 92 .setAttribute("hidden", "true"); | |
| 93 } | |
| 94 | |
| 95 // If currently expanded section is clicked | |
| 96 if (expandedButton === this) return; | |
| 97 | |
| 98 // Expand new section | |
| 99 this.setAttribute("aria-expanded", "true"); | |
| 100 document | |
| 101 .getElementById( this.getAttribute("aria-controls") ) | |
| 102 .removeAttribute("hidden"); | |
| 103 } | |
| 104 | |
| 105 Accordion.prototype.navigateAccordionHeadings = function(event) | |
| 
juliandoucette
2017/09/26 18:57:06
Suggest:
Accordion.prototype._onKeyDown(event)
{
 
ire
2017/09/28 14:48:53
Made some changes.
 | |
| 106 { | |
| 107 var IS_KEY_UP = event.key == 38 || event.keyCode == 38; | |
| 
juliandoucette
2017/09/26 18:57:06
I think that the value of event.key for up is "Arr
 
ire
2017/09/28 14:48:53
Done. (Sorry I didn't check :/)
 | |
| 108 var IS_KEY_DOWN = event.key == 40 || event.keyCode == 40; | |
| 109 | |
| 110 if (!IS_KEY_UP && !IS_KEY_DOWN) return; | |
| 111 | |
| 112 var accordion = this.parentElement.parentElement; | |
| 113 | |
| 114 if (IS_KEY_UP) | |
| 115 { | |
| 116 var prevAccordionBody = this.parentElement.previousElementSibling; | |
| 117 if (prevAccordionBody) | |
| 118 { | |
| 119 prevAccordionBody // .accordion-body | |
| 120 .previousElementSibling // .accordion-heading | |
| 121 .firstElementChild // .accordion-toggle-button | |
| 122 .focus(); | |
| 123 } | |
| 124 else | |
| 125 { | |
| 126 accordion | |
| 127 .lastElementChild // .accordion-body | |
| 128 .previousElementSibling // .accordion-heading | |
| 129 .firstElementChild // .accordion-toggle-button | |
| 130 .focus(); | |
| 131 } | |
| 132 } | |
| 133 | |
| 134 else if (IS_KEY_DOWN) | |
| 135 { | |
| 136 var nextheading = this.parentElement.nextElementSibling.nextElementSibli ng; | |
| 137 if (nextheading) | |
| 138 { | |
| 139 nextheading // .accordion-heading | |
| 140 .firstElementChild // .accordion-toggle-button | |
| 141 .focus(); | |
| 142 } | |
| 143 else | |
| 144 { | |
| 145 accordion | |
| 146 .firstElementChild // .accordion-heading | |
| 147 .firstElementChild // .accordion-toggle-button | |
| 148 .focus(); | |
| 149 } | |
| 150 } | |
| 151 | |
| 152 } | |
| 153 | |
| 154 var accordions = document.getElementsByClassName('accordion'); | |
| 155 for (var i = 0; i < accordions.length; i++) | |
| 156 { | |
| 157 new Accordion(accordions[i]); | |
| 158 } | |
| 159 | |
| 52 }, false); | 160 }, false); | 
| 53 }()); | 161 }()); | 
| OLD | NEW |