11import { closest } from "./shared.js" ;
2- import { dropdownNavigationIndex } from "./dropdown.js" ;
32
43/**
5- * Click-driven disclosure layers of the debugger page: dropdown menus,
6- * collapsible sections, the "Show more" cell boxes and the click-to-reveal
7- * controls guarding sensitive values.
8- *
9- * Keyboard handling stays with the page bootstrap, which owns the precedence
10- * between the layers; this module exposes the two steps that handler needs
11- * ({@link focusDropdownItem} and {@link dismissDropdowns}).
4+ * Click-driven disclosure layers of the debugger page: the "Show more" cell
5+ * boxes and the click-to-reveal controls guarding sensitive values.
126 *
137 * Usage example:
148 *
@@ -18,27 +12,10 @@ import { dropdownNavigationIndex } from "./dropdown.js";
1812 * ```
1913 */
2014
21- /** Selector of the trigger opening a dropdown menu. */
22- const DROPDOWN_TRIGGER = '[data-yii-debug-toggle="dropdown"]' ;
23-
24- /** Focusable menu items; the browser activates them from the keyboard. */
25- const DROPDOWN_ITEMS = "a[href], button:not([disabled])" ;
26-
27- /** Keys the dropdown menu answers with a roving focus move. */
28- const DROPDOWN_NAVIGATION_KEYS = [ "ArrowDown" , "ArrowUp" , "Home" , "End" ] ;
29-
3015function findToggle ( node , kind ) {
3116 return closest ( node , '[data-yii-debug-toggle="' + kind + '"]' ) ;
3217}
3318
34- function dropdownItems ( menu ) {
35- return Array . from ( menu . querySelectorAll ( DROPDOWN_ITEMS ) ) . filter (
36- function ( item ) {
37- return ! item . hidden && item . getAttribute ( "aria-hidden" ) !== "true" ;
38- } ,
39- ) ;
40- }
41-
4219/**
4320 * Pairs every "Show more" control with the body it controls and labels it after
4421 * the state that body is rendered in.
@@ -69,148 +46,24 @@ export function prepareCellMoreControls() {
6946 }
7047}
7148
72- /** Closes every open dropdown but the one owning `except`. */
73- function hideDropdowns ( except ) {
74- var wrappers = document . querySelectorAll ( ".yii-debug-dropdown.is-open" ) ;
75- for ( var i = 0 ; i < wrappers . length ; i ++ ) {
76- var menu = wrappers [ i ] . querySelector ( ".yii-debug-dropdown-menu" ) ;
77- if ( except && menu === except ) {
78- continue ;
79- }
80- wrappers [ i ] . classList . remove ( "is-open" ) ;
81- var trigger = wrappers [ i ] . querySelector ( DROPDOWN_TRIGGER ) ;
82- if ( trigger ) {
83- trigger . setAttribute ( "aria-expanded" , "false" ) ;
84- }
85- }
86- }
87-
88- /**
89- * Moves focus inside the dropdown the event started in.
90- *
91- * @returns {boolean } `true` when the key belonged to an open-able dropdown, so
92- * the caller stops before the layers behind it answer the same key.
93- */
94- export function focusDropdownItem ( event ) {
95- var dropdownWrapper = closest ( event . target , ".yii-debug-dropdown" ) ;
96- var dropdownTrigger = dropdownWrapper
97- ? dropdownWrapper . querySelector ( DROPDOWN_TRIGGER )
98- : null ;
99- var dropdownMenu = dropdownWrapper
100- ? dropdownWrapper . querySelector ( ".yii-debug-dropdown-menu" )
101- : null ;
102-
103- if (
104- dropdownWrapper &&
105- dropdownTrigger &&
106- dropdownMenu &&
107- DROPDOWN_NAVIGATION_KEYS . indexOf ( event . key ) !== - 1
108- ) {
109- var items = dropdownItems ( dropdownMenu ) ;
110- var currentItem = items . indexOf ( event . target ) ;
111- var nextItem = dropdownNavigationIndex (
112- items . length ,
113- currentItem ,
114- event . key ,
115- event . target === dropdownTrigger ,
116- ) ;
117-
118- if ( items . length === 0 ) {
119- return true ;
120- }
121-
122- event . preventDefault ( ) ;
123- hideDropdowns ( dropdownMenu ) ;
124- dropdownWrapper . classList . add ( "is-open" ) ;
125- dropdownTrigger . setAttribute ( "aria-expanded" , "true" ) ;
126-
127- items [ nextItem ] . focus ( ) ;
128-
129- return true ;
130- }
131-
132- return false ;
133- }
134-
135- /**
136- * Closes every dropdown and returns focus to the trigger of the one that was
137- * open.
138- *
139- * @returns {boolean } `true` when a dropdown absorbed the dismissal, so the
140- * layer behind it keeps its own Escape.
141- */
142- export function dismissDropdowns ( ) {
143- var openDropdown = document . querySelector ( ".yii-debug-dropdown.is-open" ) ;
144- var dropdownWasOpen = Boolean ( openDropdown ) ;
145- var openDropdownTrigger = openDropdown
146- ? openDropdown . querySelector ( DROPDOWN_TRIGGER )
147- : null ;
148-
149- hideDropdowns ( null ) ;
150-
151- if ( openDropdownTrigger ) {
152- openDropdownTrigger . focus ( ) ;
153- }
154-
155- return dropdownWasOpen ;
156- }
157-
158- /** Toggles the disclosure layer a click landed on, closing the menus behind it. */
49+ /** Toggles the "Show more" box a click landed on. */
15950export function onDisclosureClick ( event ) {
160- var dropdown = findToggle ( event . target , "dropdown" ) ;
161- var collapse = findToggle ( event . target , "collapse" ) ;
16251 var cellMore = findToggle ( event . target , "cell-more" ) ;
16352
164- if ( cellMore ) {
165- var moreBox = closest ( cellMore , ".yii-debug-cell-more" ) ;
166- event . preventDefault ( ) ;
167-
168- if ( ! moreBox ) {
169- return ;
170- }
171-
172- var moreOpen = moreBox . classList . toggle ( "is-open" ) ;
173- cellMore . setAttribute ( "aria-expanded" , moreOpen ? "true" : "false" ) ;
174- cellMore . textContent = moreOpen ? "Show less" : "Show more" ;
53+ if ( ! cellMore ) {
17554 return ;
17655 }
17756
178- if ( collapse ) {
179- var targetSelector =
180- collapse . getAttribute ( "data-target" ) || collapse . getAttribute ( "href" ) ;
181- var target = targetSelector ? document . querySelector ( targetSelector ) : null ;
182- event . preventDefault ( ) ;
183-
184- if ( ! target ) {
185- return ;
186- }
187-
188- var isShown = target . classList . contains ( "is-open" ) ;
189- target . classList . toggle ( "is-open" , ! isShown ) ;
190- collapse . setAttribute ( "aria-expanded" , isShown ? "false" : "true" ) ;
191- return ;
192- }
193-
194- if ( dropdown ) {
195- var wrapper = closest ( dropdown , ".yii-debug-dropdown" ) ;
196- var menu = wrapper
197- ? wrapper . querySelector ( ".yii-debug-dropdown-menu" )
198- : null ;
199- event . preventDefault ( ) ;
200- event . stopPropagation ( ) ;
201-
202- if ( ! wrapper || ! menu ) {
203- return ;
204- }
57+ var moreBox = closest ( cellMore , ".yii-debug-cell-more" ) ;
58+ event . preventDefault ( ) ;
20559
206- var isOpen = wrapper . classList . contains ( "is-open" ) ;
207- hideDropdowns ( menu ) ;
208- wrapper . classList . toggle ( "is-open" , ! isOpen ) ;
209- dropdown . setAttribute ( "aria-expanded" , isOpen ? "false" : "true" ) ;
60+ if ( ! moreBox ) {
21061 return ;
21162 }
21263
213- hideDropdowns ( null ) ;
64+ var moreOpen = moreBox . classList . toggle ( "is-open" ) ;
65+ cellMore . setAttribute ( "aria-expanded" , moreOpen ? "true" : "false" ) ;
66+ cellMore . textContent = moreOpen ? "Show less" : "Show more" ;
21467}
21568
21669/** Click-to-reveal toggle for sensitive User-panel fields. */
0 commit comments