@@ -14,30 +14,76 @@ function toggleDisplayMode(btn) {
14
14
}
15
15
16
16
function populateFormFromURL ( ) {
17
- const params = [ "name" , "arch" , "vendor" ] ;
17
+ const params = [ "name" , "arch" , "vendor" , "soc" ] ;
18
18
const hashParams = new URLSearchParams ( window . location . hash . slice ( 1 ) ) ;
19
19
params . forEach ( ( param ) => {
20
20
const element = document . getElementById ( param ) ;
21
21
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
+ }
23
29
}
24
30
} ) ;
25
31
26
32
filterBoards ( ) ;
27
33
}
28
34
29
35
function updateURL ( ) {
30
- const params = [ "name" , "arch" , "vendor" ] ;
36
+ const params = [ "name" , "arch" , "vendor" , "soc" ] ;
31
37
const hashParams = new URLSearchParams ( window . location . hash . slice ( 1 ) ) ;
32
38
33
39
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
+ }
36
48
} ) ;
37
49
38
50
window . history . replaceState ( { } , "" , `#${ hashParams . toString ( ) } ` ) ;
39
51
}
40
52
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
+
41
87
document . addEventListener ( "DOMContentLoaded" , function ( ) {
42
88
const form = document . querySelector ( ".filter-form" ) ;
43
89
@@ -52,18 +98,53 @@ document.addEventListener("DOMContentLoaded", function () {
52
98
vendorSelect . appendChild ( option ) ;
53
99
} ) ;
54
100
101
+ fillSocFamilySelect ( ) ;
102
+ fillSocSeriesSelect ( ) ;
103
+ fillSocSocSelect ( ) ;
104
+
55
105
populateFormFromURL ( ) ;
56
106
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 ( ) ;
59
126
} ) ;
60
127
61
128
form . addEventListener ( "input" , function ( ) {
62
129
filterBoards ( ) ;
63
- updateURL ( ) ;
64
130
} ) ;
131
+
132
+ form . addEventListener ( "submit" , function ( event ) {
133
+ event . preventDefault ( ) ;
134
+ } ) ;
135
+
136
+ filterBoards ( ) ;
65
137
} ) ;
66
138
139
+ function resetForm ( ) {
140
+ const form = document . querySelector ( ".filter-form" ) ;
141
+ form . reset ( ) ;
142
+ fillSocFamilySelect ( ) ;
143
+ fillSocSeriesSelect ( ) ;
144
+ fillSocSocSelect ( ) ;
145
+ filterBoards ( ) ;
146
+ }
147
+
67
148
function updateBoardCount ( ) {
68
149
const boards = document . getElementsByClassName ( "board-card" ) ;
69
150
const visibleBoards = Array . from ( boards ) . filter (
@@ -77,9 +158,10 @@ function filterBoards() {
77
158
const nameInput = document . getElementById ( "name" ) . value . toLowerCase ( ) ;
78
159
const archSelect = document . getElementById ( "arch" ) . value ;
79
160
const vendorSelect = document . getElementById ( "vendor" ) . value ;
161
+ const socSocSelect = document . getElementById ( "soc" ) ;
80
162
81
163
const resetFiltersBtn = document . getElementById ( "reset-filters" ) ;
82
- if ( nameInput || archSelect || vendorSelect ) {
164
+ if ( nameInput || archSelect || vendorSelect || socSocSelect . selectedOptions . length ) {
83
165
resetFiltersBtn . classList . remove ( "btn-disabled" ) ;
84
166
} else {
85
167
resetFiltersBtn . classList . add ( "btn-disabled" ) ;
@@ -91,20 +173,21 @@ function filterBoards() {
91
173
const boardName = board . getAttribute ( "data-name" ) . toLowerCase ( ) ;
92
174
const boardArchs = board . getAttribute ( "data-arch" ) . split ( " " ) ;
93
175
const boardVendor = board . getAttribute ( "data-vendor" ) ;
176
+ const boardSocs = board . getAttribute ( "data-socs" ) . split ( " " ) ;
94
177
95
178
let matches = true ;
96
179
180
+ const selectedSocs = [ ...socSocSelect . selectedOptions ] . map ( ( { value } ) => value ) ;
181
+
97
182
matches =
98
183
! ( nameInput && ! boardName . includes ( nameInput ) ) &&
99
184
! ( archSelect && ! boardArchs . includes ( archSelect ) ) &&
100
- ! ( vendorSelect && boardVendor !== vendorSelect ) ;
185
+ ! ( vendorSelect && boardVendor !== vendorSelect ) &&
186
+ ( selectedSocs . length === 0 || selectedSocs . some ( ( soc ) => boardSocs . includes ( soc ) ) ) ;
101
187
102
- if ( matches ) {
103
- board . classList . remove ( "hidden" ) ;
104
- } else {
105
- board . classList . add ( "hidden" ) ;
106
- }
188
+ board . classList . toggle ( "hidden" , ! matches ) ;
107
189
} ) ;
108
190
191
+ updateURL ( ) ;
109
192
updateBoardCount ( ) ;
110
193
}
0 commit comments