@@ -17,7 +17,6 @@ var options = {
17
17
'rms-value' , 'baseline-hash-value' , 'result-hash-value' ]
18
18
} ;
19
19
var resultsList = new List ( 'results' , options ) ;
20
- resultsList . sort ( 'status-sort' , { order : "desc" } ) ;
21
20
22
21
var filterClasses = [ ] ;
23
22
var filterElements = document . getElementById ( 'filterForm' ) . getElementsByClassName ( 'filter' ) ;
@@ -26,19 +25,121 @@ for (var i = 0, elem; elem = filterElements[i++];) {
26
25
}
27
26
countClasses ( ) ;
28
27
28
+ // Get and apply initial search parameters from URL
29
+ var searchParams = new URLSearchParams ( window . location . search ) ;
30
+ if ( window . location . search . length > 0 ) {
31
+ applyURL ( ) ;
32
+ } else { // If no parameters, apply default but don't update the URL
33
+ resultsList . sort ( 'status-sort' , { order : "desc" } ) ;
34
+ }
35
+
36
+ // Record URL parameters after new sort (but do not update URL yet)
37
+ resultsList . on ( 'sortComplete' , function updateSortURL ( ) {
38
+ var sortElements = document . getElementsByClassName ( 'sort' ) ;
39
+ for ( var i = 0 , elem ; elem = sortElements [ i ++ ] ; ) {
40
+ if ( elem . checked ) {
41
+ searchParams . set ( 'sort' , elem . dataset [ 'sort' ] ) ;
42
+ searchParams . set ( 'order' , getSortOrder ( elem ) ) ;
43
+ break ;
44
+ }
45
+ }
46
+ } )
47
+
48
+ // Update URL when filter sidebar is hidden
49
+ var filterOffcanvas = document . getElementById ( 'offcanvasFilter' ) ;
50
+ filterOffcanvas . addEventListener ( 'hide.bs.offcanvas' , function ( ) {
51
+ updateURL ( ) ;
52
+ } )
53
+
54
+ // Update URL when search bar is clicked away from
55
+ function searchComplete ( ) {
56
+ var q = document . getElementsByClassName ( 'search' ) [ 0 ] . value ;
57
+ if ( q . length > 0 ) { // Include query in URL if active query
58
+ searchParams . set ( 'q' , q ) ;
59
+ } else {
60
+ searchParams . delete ( 'q' ) ;
61
+ }
62
+ updateURL ( ) ;
63
+ }
64
+
65
+ // Search, sort and filter by the current URL parameters
66
+ function applyURL ( ) {
67
+ // Get and apply sort
68
+ var sort = searchParams . get ( 'sort' ) ;
69
+ if ( sort ) {
70
+ document . getElementsByName ( 'sort' ) . forEach (
71
+ function selectSort ( elem ) {
72
+ if ( elem . dataset [ 'sort' ] == sort ) {
73
+ elem . checked = true ;
74
+ }
75
+ }
76
+ )
77
+ resultsList . sort ( sort , { order : searchParams . get ( 'order' ) } ) ;
78
+ }
79
+ // Get and apply filters
80
+ var filters = searchParams . getAll ( 'f' ) ;
81
+ if ( filters . length > 0 ) {
82
+ var cond = searchParams . get ( 'c' ) ;
83
+ if ( cond === 'and' ) {
84
+ document . getElementById ( 'conditionand' ) . checked = true ;
85
+ } else if ( cond === 'or' ) {
86
+ document . getElementById ( 'conditionor' ) . checked = true ;
87
+ }
88
+ for ( var i = 0 , f ; f = filters [ i ++ ] ; ) {
89
+ document . getElementById ( f ) . checked = true ;
90
+ }
91
+ applyFilters ( ) ;
92
+ }
93
+ // Get and apply search
94
+ var query = searchParams . get ( 'q' ) ;
95
+ if ( query ) {
96
+ document . getElementsByClassName ( 'search' ) [ 0 ] . value = query ;
97
+ resultsList . search ( query ) ;
98
+ }
99
+ }
100
+
101
+ // Update the URL with the current search parameters
102
+ function updateURL ( ) {
103
+ var query = searchParams . toString ( ) ;
104
+ if ( query . length > 0 ) { // Don't end the URL with '?'
105
+ query = '?' + query ;
106
+ }
107
+ if ( window . location . search != query ) { // Update URL if changed
108
+ history . replaceState ( null , '' , window . location . pathname + query ) ;
109
+ }
110
+ }
111
+
112
+ // Get the current sorting order from an active sort radio button
113
+ function getSortOrder ( elem ) {
114
+ var fixedOrder = elem . dataset [ 'order' ] ;
115
+ if ( fixedOrder == 'asc' || fixedOrder == 'desc' ) {
116
+ return fixedOrder ;
117
+ } else if ( elem . classList . contains ( 'desc' ) ) {
118
+ return 'desc' ;
119
+ } else if ( elem . classList . contains ( 'asc' ) ) {
120
+ return 'asc' ;
121
+ } else {
122
+ return 'asc' ;
123
+ }
124
+ }
125
+
29
126
function applyFilters ( ) {
127
+ searchParams . delete ( 'f' ) ;
128
+ searchParams . delete ( 'c' ) ;
30
129
var cond_and = document . getElementById ( 'filterForm' ) . elements [ 'conditionand' ] . checked ;
31
130
var filters = [ ] ;
32
131
var filterElements = document . getElementById ( 'filterForm' ) . getElementsByClassName ( 'filter' ) ;
33
132
for ( var i = 0 , elem ; elem = filterElements [ i ++ ] ; ) {
34
133
if ( elem . checked ) {
35
134
filters . push ( elem . id ) ;
135
+ searchParams . append ( 'f' , elem . id ) ;
36
136
}
37
137
}
38
138
if ( filters . length == 0 ) {
39
139
resultsList . filter ( ) ; // Show all if nothing selected
40
140
return countClasses ( ) ;
41
141
}
142
+ searchParams . set ( 'c' , ( cond_and ) ? 'and' : 'or' ) ;
42
143
resultsList . filter ( function ( item ) {
43
144
var inc = false ;
44
145
for ( var i = 0 , filt ; filt = filters [ i ++ ] ; ) {
@@ -62,6 +163,8 @@ function resetFilters() {
62
163
resultsList . filter ( ) ;
63
164
document . getElementById ( "filterForm" ) . reset ( ) ;
64
165
countClasses ( ) ;
166
+ searchParams . delete ( 'f' ) ;
167
+ searchParams . delete ( 'c' ) ;
65
168
}
66
169
67
170
function countClasses ( ) {
0 commit comments