|
7 | 7 | <link rel="shortcut icon" href="/resources/images/fav-icons/mss-favicon.ico" /> |
8 | 8 | <link rel="stylesheet" href="resources/bootstrap/css/bootstrap.min.css"> |
9 | 9 | <link rel="stylesheet" href="resources/css/syr-icon-fonts.css"> |
10 | | - <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/15.7.1/nouislider.min.css"> |
| 10 | + <link rel="stylesheet" href="resources/css/dateRangeSlider.css"> |
11 | 11 | <style> |
12 | 12 | body { padding-top: 70px; } |
13 | 13 | .facet-panel { background: #f8f9fa; padding: 15px; border-radius: 5px; } |
|
17 | 17 | .result-item:hover { background: #f8f9fa; } |
18 | 18 | .result-count { color: #666; margin-bottom: 15px; } |
19 | 19 | .clear-filters { margin-top: 10px; } |
20 | | - #dateRangeSlider { margin: 20px 0; height: 8px; } |
21 | | - .date-values { display: flex; justify-content: space-between; font-size: 12px; color: #666; margin-top: 10px; } |
22 | | - |
23 | | - /* Custom slider styling */ |
24 | | - .noUi-target { background: #e0e0e0; border: none; } |
25 | | - .noUi-connect { background: #888; } |
26 | | - .noUi-handle { display: none; } |
27 | | - .noUi-horizontal { height: 8px; } |
| 20 | + |
28 | 21 |
|
29 | 22 | /* Navbar font and icon sizing */ |
30 | 23 | .navbar-brand { font-size: 24px; line-height: 50px; height: 50px; padding: 0 15px; display: flex; align-items: center; } |
@@ -59,7 +52,7 @@ <h2>Browse Manuscripts</h2> |
59 | 52 | </div> |
60 | 53 | </div> |
61 | 54 | <script src="resources/js/jquery.min.js"></script> |
62 | | - <script src="https://cdnjs.cloudflare.com/ajax/libs/noUiSlider/15.7.1/nouislider.min.js"></script> |
| 55 | + <script src="resources/js/dateRangeSlider.js"></script> |
63 | 56 | <script> |
64 | 57 | // Determine base URL based on environment |
65 | 58 | const getBaseUrl = () => { |
@@ -162,63 +155,43 @@ <h2>Browse Manuscripts</h2> |
162 | 155 | $('#facets').html(facetsHtml + buildDateSlider()); |
163 | 156 | } |
164 | 157 |
|
| 158 | + let dateSlider = null; |
| 159 | + |
165 | 160 | // Build date range slider |
166 | 161 | function buildDateSlider() { |
167 | 162 | const dates = []; |
168 | 163 | allData.forEach(item => { |
169 | | - if (item.dateNotBefore) { |
170 | | - const d = Array.isArray(item.dateNotBefore) ? item.dateNotBefore[0] : item.dateNotBefore; |
171 | | - dates.push(parseInt(d)); |
172 | | - } |
173 | | - if (item.dateNotAfter) { |
174 | | - const d = Array.isArray(item.dateNotAfter) ? item.dateNotAfter[0] : item.dateNotAfter; |
175 | | - dates.push(parseInt(d)); |
176 | | - } |
177 | | - if (item.dateWhen) { |
178 | | - const d = Array.isArray(item.dateWhen) ? item.dateWhen[0] : item.dateWhen; |
179 | | - dates.push(parseInt(d)); |
180 | | - } |
| 164 | + ['dateNotBefore','dateNotAfter','dateWhen'].forEach(key => { |
| 165 | + if (item[key]) { |
| 166 | + const d = Array.isArray(item[key]) ? item[key][0] : item[key]; |
| 167 | + dates.push(parseInt(d)); |
| 168 | + } |
| 169 | + }); |
181 | 170 | }); |
182 | | - |
183 | 171 | if (dates.length === 0) return ''; |
184 | | - |
| 172 | + |
185 | 173 | const minDate = Math.min(...dates); |
186 | 174 | const maxDate = Math.max(...dates); |
187 | | - |
| 175 | + |
188 | 176 | setTimeout(() => { |
189 | | - const slider = document.getElementById('dateRangeSlider'); |
190 | | - if (slider && !slider.noUiSlider) { |
191 | | - noUiSlider.create(slider, { |
192 | | - start: [minDate, maxDate], |
193 | | - connect: true, |
194 | | - range: { min: minDate, max: maxDate }, |
195 | | - step: 1, |
196 | | - format: { to: v => Math.round(v), from: v => Math.round(v) } |
197 | | - }); |
198 | | - |
199 | | - slider.noUiSlider.on('update', (values) => { |
200 | | - $('#dateMinValue').text(values[0]); |
201 | | - $('#dateMaxValue').text(values[1]); |
202 | | - }); |
203 | | - |
204 | | - slider.noUiSlider.on('change', (values) => { |
205 | | - activeFilters.dateMin = parseInt(values[0]); |
206 | | - activeFilters.dateMax = parseInt(values[1]); |
| 177 | + const el = document.getElementById('dateSliderContainer'); |
| 178 | + if (!el) return; |
| 179 | + dateSlider = new DateRangeSlider(el, { |
| 180 | + min: minDate, max: maxDate, |
| 181 | + onChange: function (s, e) { |
| 182 | + activeFilters.dateMin = s; |
| 183 | + activeFilters.dateMax = e; |
207 | 184 | filterData(); |
208 | | - }); |
209 | | - } |
210 | | - }, 100); |
211 | | - |
212 | | - return ` |
213 | | - <div class="facet-group"> |
214 | | - <label>Date Range</label> |
215 | | - <div id="dateRangeSlider"></div> |
216 | | - <div class="date-values"> |
217 | | - <span id="dateMinValue">${minDate}</span> |
218 | | - <span id="dateMaxValue">${maxDate}</span> |
219 | | - </div> |
220 | | - </div> |
221 | | - `; |
| 185 | + }, |
| 186 | + onReset: function () { |
| 187 | + delete activeFilters.dateMin; |
| 188 | + delete activeFilters.dateMax; |
| 189 | + filterData(); |
| 190 | + } |
| 191 | + }); |
| 192 | + }, 0); |
| 193 | + |
| 194 | + return '<div class="facet-group" id="dateSliderContainer"></div>'; |
222 | 195 | } |
223 | 196 |
|
224 | 197 | // Apply filter |
@@ -383,6 +356,7 @@ <h2>Browse Manuscripts</h2> |
383 | 356 | displayResults(); |
384 | 357 | } |
385 | 358 |
|
| 359 | + |
386 | 360 | // Initialize |
387 | 361 | $(document).ready(() => { |
388 | 362 | loadData(); |
|
0 commit comments