Skip to content

Commit 2b504ff

Browse files
committed
refactor(ui): delete the unused User, dropdown/collapse and never-emitted CSS, style the gauge readout and the Profiling nesting arrows, and move the Request panel rules to request.css.
1 parent da38998 commit 2b504ff

16 files changed

Lines changed: 1735 additions & 2698 deletions

‎e2e/history-layout.spec.js‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,42 @@ for (const [adapter, query, mail] of [
145145
});
146146
}
147147
}
148+
149+
// Header markup copied from the Yii3 History grid: `SortState::header()` sets the order class on the link.
150+
for (const [direction, order, arrow] of [
151+
["ascending", "asc", "↑"],
152+
["descending", "desc", "↓"],
153+
]) {
154+
test(`Yii3 History marks the ${direction} sorted column with an arrow`, async ({
155+
page,
156+
}) => {
157+
await page.setContent(`
158+
<!doctype html>
159+
<html lang="en">
160+
<body class="yii-debug">
161+
<table class="yii-debug-table">
162+
<thead>
163+
<tr>
164+
<th scope="col" aria-sort="${direction}"><a class="${order}" href="/debug?sort=time">Time</a></th>
165+
<th scope="col"><a href="/debug?sort=method">Method</a></th>
166+
</tr>
167+
</thead>
168+
</table>
169+
</body>
170+
</html>
171+
`);
172+
await page.addStyleTag({ path: stylesheet.pathname });
173+
174+
const marker = (selector) =>
175+
page
176+
.locator(selector)
177+
.evaluate((link) => getComputedStyle(link, "::after").content);
178+
179+
expect(await marker("th[aria-sort] a"), "Sorted column arrow").toBe(
180+
`"${arrow}"`,
181+
);
182+
expect(await marker("th:not([aria-sort]) a"), "Unsorted column").toBe(
183+
"none",
184+
);
185+
});
186+
}

‎resources/assets/dist/css/debug.min.css‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎resources/assets/dist/js/debug.min.js‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎resources/assets/dist/js/focus.min.js‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎resources/src/core/debug.js‎

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import "./history-cursor.js";
55
import { bindCopyControls } from "./clipboard.js";
66
import { initSectionPermalinks } from "./deep-links.js";
77
import {
8-
dismissDropdowns,
9-
focusDropdownItem,
108
onDisclosureClick,
119
onRevealClick,
1210
prepareCellMoreControls,
@@ -67,16 +65,9 @@ import { requestParentToolbarDrawerClose } from "../toolbar/focus.js";
6765
return;
6866
}
6967

70-
/* The open menu answers first, so the drawer behind it keeps its Escape. */
71-
if (focusDropdownItem(event)) {
72-
return;
73-
}
74-
7568
if (event.key === "Escape") {
76-
var dropdownWasOpen = dismissDropdowns();
77-
7869
window.setTimeout(function () {
79-
requestParentToolbarDrawerClose(event, window, dropdownWasOpen);
70+
requestParentToolbarDrawerClose(event, window);
8071
}, 0);
8172
}
8273
});

‎resources/src/core/disclosure.js‎

Lines changed: 10 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
import { 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-
3015
function 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. */
15950
export 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

Comments
 (0)