Skip to content

Commit 282a6c5

Browse files
kartbenhenrikbrixandersen
authored andcommitted
doc: boards: allow filtering by SoC
This introduces the ability to filter boards by soc (family / series / soc). Signed-off-by: Benjamin Cabé <[email protected]>
1 parent 86b72ee commit 282a6c5

File tree

4 files changed

+132
-16
lines changed

4 files changed

+132
-16
lines changed

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,19 @@
4646
margin-bottom: 5px;
4747
}
4848

49+
.filter-form #family, .filter-form #series, .filter-form #soc {
50+
overflow: auto;
51+
border-radius: 8px;
52+
padding-right: 18px;
53+
}
54+
55+
.filter-form #family option:checked,
56+
.filter-form #series option:checked,
57+
.filter-form #soc option:checked {
58+
background-color: var(--admonition-note-title-background-color);
59+
color: var(--admonition-note-title-color);
60+
}
61+
4962
.select-container {
5063
position: relative;
5164
}

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

Lines changed: 98 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,76 @@ function toggleDisplayMode(btn) {
1414
}
1515

1616
function populateFormFromURL() {
17-
const params = ["name", "arch", "vendor"];
17+
const params = ["name", "arch", "vendor", "soc"];
1818
const hashParams = new URLSearchParams(window.location.hash.slice(1));
1919
params.forEach((param) => {
2020
const element = document.getElementById(param);
2121
if (hashParams.has(param)) {
22-
element.value = hashParams.get(param);
22+
const value = hashParams.get(param);
23+
if (param === "soc") {
24+
value.split(",").forEach(soc =>
25+
element.querySelector(`option[value="${soc}"]`).selected = true);
26+
} else {
27+
element.value = value;
28+
}
2329
}
2430
});
2531

2632
filterBoards();
2733
}
2834

2935
function updateURL() {
30-
const params = ["name", "arch", "vendor"];
36+
const params = ["name", "arch", "vendor", "soc"];
3137
const hashParams = new URLSearchParams(window.location.hash.slice(1));
3238

3339
params.forEach((param) => {
34-
const value = document.getElementById(param).value;
35-
value ? hashParams.set(param, value) : hashParams.delete(param);
40+
const element = document.getElementById(param);
41+
if (param === "soc") {
42+
const selectedSocs = [...element.selectedOptions].map(({ value }) => value);
43+
selectedSocs.length ? hashParams.set(param, selectedSocs.join(",")) : hashParams.delete(param);
44+
}
45+
else {
46+
element.value ? hashParams.set(param, element.value) : hashParams.delete(param);
47+
}
3648
});
3749

3850
window.history.replaceState({}, "", `#${hashParams.toString()}`);
3951
}
4052

53+
function fillSocFamilySelect() {
54+
const socFamilySelect = document.getElementById("family");
55+
56+
Object.keys(socs_data).sort().forEach(f => {
57+
socFamilySelect.add(new Option(f));
58+
});
59+
}
60+
61+
function fillSocSeriesSelect(families, selectOnFill = false) {
62+
const socSeriesSelect = document.getElementById("series");
63+
64+
families = families?.length ? families : Object.keys(socs_data);
65+
let allSeries = [...new Set(families.flatMap(f => Object.keys(socs_data[f])))];
66+
67+
socSeriesSelect.innerHTML = "";
68+
allSeries.sort().map(s => {
69+
const option = new Option(s, s, selectOnFill, selectOnFill);
70+
socSeriesSelect.add(option);
71+
});
72+
}
73+
74+
function fillSocSocSelect(families, series = undefined, selectOnFill = false) {
75+
const socSocSelect = document.getElementById("soc");
76+
77+
families = families?.length ? families : Object.keys(socs_data);
78+
series = series?.length ? series : families.flatMap(f => Object.keys(socs_data[f]));
79+
matchingSocs = families.flatMap(f => series.flatMap(s => socs_data[f][s] || []));
80+
81+
socSocSelect.innerHTML = "";
82+
matchingSocs.sort().forEach((soc) => {
83+
socSocSelect.add(new Option(soc, soc, selectOnFill, selectOnFill));
84+
});
85+
}
86+
4187
document.addEventListener("DOMContentLoaded", function () {
4288
const form = document.querySelector(".filter-form");
4389

@@ -52,18 +98,53 @@ document.addEventListener("DOMContentLoaded", function () {
5298
vendorSelect.appendChild(option);
5399
});
54100

101+
fillSocFamilySelect();
102+
fillSocSeriesSelect();
103+
fillSocSocSelect();
104+
55105
populateFormFromURL();
56106

57-
form.addEventListener("submit", function (event) {
58-
event.preventDefault();
107+
socFamilySelect = document.getElementById("family");
108+
socFamilySelect.addEventListener("change", () => {
109+
const selectedFamilies = [...socFamilySelect.selectedOptions].map(({ value }) => value);
110+
fillSocSeriesSelect(selectedFamilies, true);
111+
fillSocSocSelect(selectedFamilies, undefined, true);
112+
filterBoards();
113+
});
114+
115+
socSeriesSelect = document.getElementById("series");
116+
socSeriesSelect.addEventListener("change", () => {
117+
const selectedFamilies = [...socFamilySelect.selectedOptions].map(({ value }) => value);
118+
const selectedSeries = [...socSeriesSelect.selectedOptions].map(({ value }) => value);
119+
fillSocSocSelect(selectedFamilies, selectedSeries, true);
120+
filterBoards();
121+
});
122+
123+
socSocSelect = document.getElementById("soc");
124+
socSocSelect.addEventListener("change", () => {
125+
filterBoards();
59126
});
60127

61128
form.addEventListener("input", function () {
62129
filterBoards();
63-
updateURL();
64130
});
131+
132+
form.addEventListener("submit", function (event) {
133+
event.preventDefault();
134+
});
135+
136+
filterBoards();
65137
});
66138

139+
function resetForm() {
140+
const form = document.querySelector(".filter-form");
141+
form.reset();
142+
fillSocFamilySelect();
143+
fillSocSeriesSelect();
144+
fillSocSocSelect();
145+
filterBoards();
146+
}
147+
67148
function updateBoardCount() {
68149
const boards = document.getElementsByClassName("board-card");
69150
const visibleBoards = Array.from(boards).filter(
@@ -77,9 +158,10 @@ function filterBoards() {
77158
const nameInput = document.getElementById("name").value.toLowerCase();
78159
const archSelect = document.getElementById("arch").value;
79160
const vendorSelect = document.getElementById("vendor").value;
161+
const socSocSelect = document.getElementById("soc");
80162

81163
const resetFiltersBtn = document.getElementById("reset-filters");
82-
if (nameInput || archSelect || vendorSelect) {
164+
if (nameInput || archSelect || vendorSelect || socSocSelect.selectedOptions.length) {
83165
resetFiltersBtn.classList.remove("btn-disabled");
84166
} else {
85167
resetFiltersBtn.classList.add("btn-disabled");
@@ -91,20 +173,21 @@ function filterBoards() {
91173
const boardName = board.getAttribute("data-name").toLowerCase();
92174
const boardArchs = board.getAttribute("data-arch").split(" ");
93175
const boardVendor = board.getAttribute("data-vendor");
176+
const boardSocs = board.getAttribute("data-socs").split(" ");
94177

95178
let matches = true;
96179

180+
const selectedSocs = [...socSocSelect.selectedOptions].map(({ value }) => value);
181+
97182
matches =
98183
!(nameInput && !boardName.includes(nameInput)) &&
99184
!(archSelect && !boardArchs.includes(archSelect)) &&
100-
!(vendorSelect && boardVendor !== vendorSelect);
185+
!(vendorSelect && boardVendor !== vendorSelect) &&
186+
(selectedSocs.length === 0 || selectedSocs.some((soc) => boardSocs.includes(soc)));
101187

102-
if (matches) {
103-
board.classList.remove("hidden");
104-
} else {
105-
board.classList.add("hidden");
106-
}
188+
board.classList.toggle("hidden", !matches);
107189
});
108190

191+
updateURL();
109192
updateBoardCount();
110193
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
data-name="{{ board.full_name}}"
1515
data-arch="{{ board.archs | join(" ") }}"
1616
data-vendor="{{ board.vendor }}"
17+
data-socs="{{ board.socs | join(" ") }}"
1718
tabindex="0">
1819
<div class="vendor">{{ catalog.vendors[board.vendor] }}</div>
1920
{% if board.image -%}

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,29 @@
4545
</div>
4646
</div>
4747

48+
<div class="form-group">
49+
<label for="family">Family</label>
50+
<select id="family" name="family" size="10" multiple></select>
51+
</div>
52+
53+
<div class="form-group">
54+
<label for="series">Series</label>
55+
<select id="series" name="series" size="10" multiple></select>
56+
</div>
57+
58+
<div class="form-group">
59+
<label for="soc">SoC</label>
60+
<select id="soc" name="soc" size="10" multiple></select>
61+
</div>
62+
4863
</form>
4964

5065
<div id="form-options" style="text-align: center; margin-bottom: 20px">
5166
<button
5267
id="reset-filters"
5368
class="btn btn-info btn-disabled fa fa-times"
5469
tabindex="0"
55-
onclick="document.querySelector('.filter-form').reset(); filterBoards(); updateURL();">
70+
onclick="resetForm()">
5671
Reset Filters
5772
</button>
5873
<button
@@ -71,3 +86,7 @@
7186
{% include "board-card.html" %}
7287
{% endfor %}
7388
</div>
89+
90+
<script>
91+
socs_data = {{ catalog.socs | tojson }};
92+
</script>

0 commit comments

Comments
 (0)