Skip to content

Commit f389464

Browse files
committed
doc: _extensions: board: show/hide boards and shield in catalog
Adds the ability to show/hide boards and shields in the board catalog. Signed-off-by: Benjamin Cabé <benjamin@zephyrproject.org>
1 parent 77763a2 commit f389464

File tree

3 files changed

+112
-8
lines changed

3 files changed

+112
-8
lines changed

doc/_extensions/zephyr/domain/static/css/board-catalog.css

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,58 @@
125125
background-color: transparent;
126126
}
127127

128+
.visibility-toggles {
129+
display: flex;
130+
gap: 8px;
131+
align-items: center;
132+
justify-content: center;
133+
}
134+
135+
.toggle-group input {
136+
display: none;
137+
}
138+
139+
.toggle-label {
140+
display: flex;
141+
align-items: center;
142+
gap: 6px;
143+
cursor: pointer;
144+
}
145+
146+
.toggle-switch {
147+
width: 36px;
148+
height: 18px;
149+
background: #ccc;
150+
border-radius: 18px;
151+
position: relative;
152+
transition: 0.3s;
153+
}
154+
155+
.toggle-switch::before {
156+
content: '';
157+
width: 14px;
158+
height: 14px;
159+
background: white;
160+
border-radius: 50%;
161+
position: absolute;
162+
top: 2px;
163+
left: 2px;
164+
transition: 0.3s;
165+
}
166+
167+
.toggle-text {
168+
font-size: 14px;
169+
text-transform: none;
170+
}
171+
172+
input:checked + .toggle-label .toggle-switch {
173+
background: var(--admonition-note-title-background-color);
174+
}
175+
176+
input:checked + .toggle-label .toggle-switch::before {
177+
left: 20px;
178+
}
179+
128180
#catalog {
129181
display: flex;
130182
flex-wrap: wrap;

doc/_extensions/zephyr/domain/static/js/board-catalog.js

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@ function populateFormFromURL() {
2929
}
3030
});
3131

32+
// Restore visibility toggles from URL
33+
["show-boards", "show-shields"].forEach(toggle => {
34+
if (hashParams.has(toggle)) {
35+
document.getElementById(toggle).checked = hashParams.get(toggle) === "true";
36+
}
37+
});
38+
3239
// Restore supported features from URL
3340
if (hashParams.has("features")) {
3441
const features = hashParams.get("features").split(",");
@@ -70,6 +77,11 @@ function updateURL() {
7077
}
7178
});
7279

80+
["show-boards", "show-shields"].forEach(toggle => {
81+
const isChecked = document.getElementById(toggle).checked;
82+
isChecked ? hashParams.delete(toggle) : hashParams.set(toggle, "false");
83+
});
84+
7385
// Add supported features to URL
7486
const selectedTags = [...document.querySelectorAll('.tag')].map(tag => tag.textContent);
7587
selectedTags.length ? hashParams.set("features", selectedTags.join(",")) : hashParams.delete("features");
@@ -228,6 +240,16 @@ document.addEventListener("DOMContentLoaded", function () {
228240
filterBoards();
229241
});
230242

243+
boardsToggle = document.getElementById("show-boards");
244+
boardsToggle.addEventListener("change", () => {
245+
filterBoards();
246+
});
247+
248+
shieldsToggle = document.getElementById("show-shields");
249+
shieldsToggle.addEventListener("change", () => {
250+
filterBoards();
251+
});
252+
231253
form.addEventListener("input", function () {
232254
filterBoards();
233255
});
@@ -246,6 +268,9 @@ function resetForm() {
246268
fillSocSeriesSelect();
247269
fillSocSocSelect();
248270

271+
document.getElementById("show-boards").checked = true;
272+
document.getElementById("show-shields").checked = true;
273+
249274
// Clear supported features
250275
document.querySelectorAll('.tag').forEach(tag => tag.remove());
251276
document.getElementById('tag-input').value = '';
@@ -269,11 +294,13 @@ function filterBoards() {
269294
const archSelect = document.getElementById("arch").value;
270295
const vendorSelect = document.getElementById("vendor").value;
271296
const socSocSelect = document.getElementById("soc");
297+
const showBoards = document.getElementById("show-boards").checked;
298+
const showShields = document.getElementById("show-shields").checked;
272299

273300
const selectedTags = [...document.querySelectorAll('.tag')].map(tag => tag.textContent);
274301

275302
const resetFiltersBtn = document.getElementById("reset-filters");
276-
if (nameInput || archSelect || vendorSelect || socSocSelect.selectedOptions.length || selectedTags.length) {
303+
if (nameInput || archSelect || vendorSelect || socSocSelect.selectedOptions.length || selectedTags.length || !showBoards || !showShields) {
277304
resetFiltersBtn.classList.remove("btn-disabled");
278305
} else {
279306
resetFiltersBtn.classList.add("btn-disabled");
@@ -287,17 +314,22 @@ function filterBoards() {
287314
const boardVendor = board.getAttribute("data-vendor") || "";
288315
const boardSocs = (board.getAttribute("data-socs") || "").split(" ").filter(Boolean);
289316
const boardSupportedFeatures = (board.getAttribute("data-supported-features") || "").split(" ").filter(Boolean);
317+
const isShield = board.classList.contains("shield");
290318

291319
let matches = true;
292320

293321
const selectedSocs = [...socSocSelect.selectedOptions].map(({ value }) => value);
294322

295-
matches =
296-
!(nameInput && !boardName.includes(nameInput)) &&
297-
!(archSelect && !boardArchs.includes(archSelect)) &&
298-
!(vendorSelect && boardVendor !== vendorSelect) &&
299-
(selectedSocs.length === 0 || selectedSocs.some((soc) => boardSocs.includes(soc))) &&
300-
(selectedTags.length === 0 || selectedTags.every((tag) => boardSupportedFeatures.includes(tag)));
323+
if ((isShield && !showShields) || (!isShield && !showBoards)) {
324+
matches = false;
325+
} else {
326+
matches =
327+
!(nameInput && !boardName.includes(nameInput)) &&
328+
!(archSelect && !boardArchs.includes(archSelect)) &&
329+
!(vendorSelect && boardVendor !== vendorSelect) &&
330+
(selectedSocs.length === 0 || selectedSocs.some((soc) => boardSocs.includes(soc))) &&
331+
(selectedTags.length === 0 || selectedTags.every((tag) => boardSupportedFeatures.includes(tag)));
332+
}
301333

302334
board.classList.toggle("hidden", !matches);
303335
});

doc/_extensions/zephyr/domain/templates/board-catalog.html

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,33 @@
55

66
<form class="filter-form" aria-label="Filter boards & shields by name, architecture, and vendor">
77

8-
<div class="form-group" style="flex-basis: 100%">
8+
<div class="form-group" style="flex-basis: 60%">
99
<label for="name">Name</label>
1010
<input type="text" id="name"
1111
placeholder='Name (or partial name) of the board/shield, e.g. "reel board", "nucleo", &hellip;'
1212
oninput="filterBoards()" />
1313
</div>
1414

15+
<div class="form-group">
16+
<label>Showing</label>
17+
<div class="visibility-toggles">
18+
<div class="toggle-group">
19+
<input type="checkbox" id="show-boards" checked>
20+
<label for="show-boards" class="toggle-label">
21+
<span class="toggle-switch"></span>
22+
<span class="toggle-text">Boards</span>
23+
</label>
24+
</div>
25+
<div class="toggle-group">
26+
<input type="checkbox" id="show-shields" checked>
27+
<label for="show-shields" class="toggle-label">
28+
<span class="toggle-switch"></span>
29+
<span class="toggle-text">Shields</span>
30+
</label>
31+
</div>
32+
</div>
33+
</div>
34+
1535
<div class="form-group">
1636
<label for="arch">Architecture</label>
1737
<div class="select-container">

0 commit comments

Comments
 (0)