Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: static/js/main.js

Issue 29548567: Issue 4925 - Create accordion component for Help Center (Closed) Base URL: https://hg.adblockplus.org/help.eyeo.com
Patch Set: Rebase Created Sept. 19, 2017, 4:19 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
53 // Accordion menu
juliandoucette 2017/09/20 14:19:38 NIT: I prefer an OO approach (an Accordion Functio
ire 2017/09/25 11:25:18 Done.
54
55 function setupAccordionMenu(accordionEl)
juliandoucette 2017/09/20 14:19:37 Suggest: "accordion" "No hungarian notation, no s
ire 2017/09/25 11:25:18 Done. Does this apply to the "accordionButtons"? S
juliandoucette 2017/09/26 18:57:05 I don't think so. But it's hard to explain why :D
ire 2017/09/28 14:48:52 Haha okay. I don't think it applies either, but I
56 {
57 var accordionButtons = accordionEl.getElementsByClassName('accordion-toggl e-button');
58
59 for ( var i = 0; i < accordionButtons.length; i++ )
juliandoucette 2017/09/20 14:19:38 NIT: I think that we don't put spaces inside these
ire 2017/09/25 11:25:17 Done.
60 {
61 accordionButtons[i]
juliandoucette 2017/09/20 14:19:38 Suggest: Initialize state before adding event list
ire 2017/09/25 11:25:17 I don't have an opinion either way. Done.
juliandoucette 2017/09/26 18:57:06 You didn't do this?
ire 2017/09/28 14:48:52 Oops, missed this. Done now (I hope :p)
62 .addEventListener("click", toggleAccordionSection, false);
63 accordionButtons[i]
64 .addEventListener("keydown", navigateAccordionHeadings, false);
65
66 // Close all sections besides the first
juliandoucette 2017/09/20 14:19:37 Suggest: "except" instead of "besides" :D "beside
ire 2017/09/25 11:25:18 I've been using "besides" wrong all my life :O hah
67 if ( i !== 0 )
68 {
69 accordionButtons[i].setAttribute("aria-expanded", "false");
70 accordionButtons[i].setAttribute("aria-disabled", "false");
juliandoucette 2017/09/20 14:19:38 I think that aria-disabled is only appropriate whe
ire 2017/09/25 11:25:17 Yup, see my comment above.
71 document
72 .getElementById( accordionButtons[i].getAttribute("aria-controls") )
73 .setAttribute("hidden", "true");
74 }
75 }
76 }
77
78 function toggleAccordionSection()
juliandoucette 2017/09/20 14:19:38 NIT: This function name sounds functional, but it'
ire 2017/09/25 11:25:17 I generally prefer explanatory names, particularly
juliandoucette 2017/09/26 18:57:05 I agree. But I think that the context is misleadin
ire 2017/09/28 14:48:52 Yes, I created the issue #5652 to refactor this an
79 {
80 // Hide currently expanded section
81 var accordion = this.parentElement.parentElement;
82 var expandedButton = accordion.querySelector("button[aria-expanded='true'] ");
83 if ( expandedButton )
juliandoucette 2017/09/20 14:19:38 NIT/Suggest: Make it clearer that you are checking
ire 2017/09/25 11:25:18 Doesn't the name "expandedButton" do that?
juliandoucette 2017/09/26 18:57:05 Yes? :/ (I have no idea what I was thinking :D)
84 {
85 expandedButton.setAttribute("aria-expanded", "false");
86 expandedButton.setAttribute("aria-disabled", "false");
87 document
88 .getElementById( expandedButton.getAttribute("aria-controls") )
89 .setAttribute("hidden", "true");
90 }
91
92 if ( expandedButton === this ) return;
juliandoucette 2017/09/20 14:19:37 NIT/Suggest: Make it clearer that you are handling
ire 2017/09/25 11:25:18 Done.
93
94 // Expand new section
95 this.setAttribute("aria-expanded", "true");
96 this.setAttribute("aria-disabled", "true");
97 document
98 .getElementById( this.getAttribute("aria-controls") )
99 .removeAttribute("hidden");
juliandoucette 2017/09/20 14:19:38 NIT/Suggest: .focus() too? So that you could click
ire 2017/09/25 11:25:17 Why focus an element that isn't typically focusabl
juliandoucette 2017/09/26 18:57:05 I think that I was confused. What I was really sug
ire 2017/09/28 14:48:52 Now I think I'm confused :/ But currently, you ca
100 }
101
102 function navigateAccordionHeadings(e)
juliandoucette 2017/09/20 14:19:37 NIT/Suggest: "event" Julian Doucette: Does our co
ire 2017/09/25 11:25:17 Done.
103 {
104 if ( e.keyCode !== 38 && e.keyCode !== 40 ) return;
juliandoucette 2017/09/20 14:19:38 NIT/Suggest: Prefer event.key and fall back to eve
ire 2017/09/25 11:25:17 Done.
105
106 var accordion = this.parentElement.parentElement;
107
108 // Direction == up
109 if ( e.keyCode == 38 )
juliandoucette 2017/09/20 14:19:38 NIT/Suggest: Name keycodes e.g. var KEY_UP = 38.
ire 2017/09/25 11:25:18 Done.
110 {
111 var prevEl = this.parentElement.previousElementSibling;
112 if ( prevEl )
juliandoucette 2017/09/20 14:19:38 NIT/Suggest: Make it clearer that you are checking
ire 2017/09/25 11:25:18 This would mean I cannot use the same variable nam
juliandoucette 2017/09/26 18:57:05 Acknowledged.
113 {
114 prevEl // .accordion-body
115 .previousElementSibling // .accordion-heading
116 .firstElementChild // .accordion-toggle-button
117 .focus();
118 }
119 else
120 {
121 accordion
122 .lastElementChild // .accordion-body
123 .previousElementSibling // .accordion-heading
124 .firstElementChild // .accordion-toggle-button
125 .focus();
126 }
127 }
128
129 // Direction == down
130 else if ( e.keyCode == 40 )
131 {
132 var nextheading = this.parentElement.nextElementSibling.nextElementSibli ng;
133 if ( nextheading )
134 {
135 nextheading // .accordion-heading
136 .firstElementChild // .accordion-toggle-button
137 .focus();
138 }
139 else
140 {
141 accordion
142 .firstElementChild // .accordion-heading
143 .firstElementChild // .accordion-toggle-button
144 .focus();
145 }
146 }
147 }
148
149 var accordionMenus = document.getElementsByClassName('accordion');
150 for (var i = 0; i < accordionMenus.length; i++)
151 {
152 setupAccordionMenu( accordionMenus[i] );
153 }
154
52 }, false); 155 }, false);
53 }()); 156 }());
OLDNEW

Powered by Google App Engine
This is Rietveld