henry-search 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/HenrySearch.css +1 -1
- package/dist/HenrySearch.js +19005 -15310
- package/dist/HenrySearch.umd.cjs +129 -110
- package/package.json +3 -1
- package/src/components/PAccordion.vue +4 -3
- package/src/components/Search.vue +2 -0
- package/src/components/SearchDetail.vue +1 -2
- package/src/components/SearchHistory.vue +3 -3
- package/src/components/SearchTab.vue +141 -76
- package/src/composables/formatDate.js +4 -2
- package/src/styles/atoms/breadCrumb/index.scss +1 -1
- package/src/styles/atoms/checkBoxes/index.scss +11 -2
- package/src/styles/config/index.scss +5 -6
- package/src/styles/molecules/accordion/index.scss +4 -3
- package/src/styles/molecules/currentRefinements/index.scss +1 -0
- package/src/styles/molecules/dateRange/index.scss +1 -1
- package/src/styles/molecules/resultActions/index.scss +3 -0
- package/src/styles/molecules/searchBox/index.scss +2 -2
- package/src/styles/organisms/filters/index.scss +6 -6
- package/src/styles/organisms/resultsGrid/index.scss +4 -4
- package/src/styles/templates/eventsSearch/index.scss +10 -9
- package/src/styles/templates/history/index.scss +1 -1
- package/src/styles/templates/performance/index.scss +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "henry-search",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.18",
|
|
4
4
|
"description": "Searches a typesense archive of musical performances",
|
|
5
5
|
"main": "js/main.js",
|
|
6
6
|
"scripts": {
|
|
@@ -28,7 +28,9 @@
|
|
|
28
28
|
"@vitejs/plugin-vue-jsx": "^5.1.1",
|
|
29
29
|
"@vueform/multiselect": "^2.6.11",
|
|
30
30
|
"@vuepic/vue-datepicker": "^11.0.2",
|
|
31
|
+
"@vueuse/core": "^14.1.0",
|
|
31
32
|
"instantsearch.js": "^4.80.0",
|
|
33
|
+
"lodash": "^4.17.21",
|
|
32
34
|
"typesense": "^2.1.0",
|
|
33
35
|
"typesense-instantsearch-adapter": "^2.9.0",
|
|
34
36
|
"vue": "^3.5.21",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import { onMounted, useTemplateRef } from 'vue'
|
|
2
|
+
import { onMounted, useTemplateRef, watch } from 'vue'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* PAccordion is a vue component for the <details> element. It uses the native <details> element
|
|
@@ -17,7 +17,8 @@ const props = defineProps({
|
|
|
17
17
|
summary: { type: String, default: 'summary:first-of-type' },
|
|
18
18
|
startOpen: { type: Boolean, default: true},
|
|
19
19
|
openText: { type: String, default: null},
|
|
20
|
-
closedText: { type: String, default: null}
|
|
20
|
+
closedText: { type: String, default: null},
|
|
21
|
+
name: { type: String, default: null}
|
|
21
22
|
})
|
|
22
23
|
const details = useTemplateRef('details')
|
|
23
24
|
const summaryText = null
|
|
@@ -82,7 +83,7 @@ const handleToggle = event => {
|
|
|
82
83
|
</script>
|
|
83
84
|
|
|
84
85
|
<template>
|
|
85
|
-
<details ref="details" class="accordion" @click="handleToggle">
|
|
86
|
+
<details ref="details" class="accordion" :name="props.name" @click="handleToggle">
|
|
86
87
|
<slot />
|
|
87
88
|
</details>
|
|
88
89
|
</template>
|
|
@@ -44,7 +44,6 @@ onMounted(() => {
|
|
|
44
44
|
client.collections(props.indexName).documents(props.performanceId).retrieve().then(function (results) {
|
|
45
45
|
performance.value = results
|
|
46
46
|
document.title = `BSO HENRY | ${ formatDate(performance.value.performance_date) } Performance Detail`
|
|
47
|
-
console.log(results)
|
|
48
47
|
}).catch((e) => {
|
|
49
48
|
console.log(e)
|
|
50
49
|
//document.location = '/404'
|
|
@@ -124,7 +123,7 @@ const createURL = (facet, value) => {
|
|
|
124
123
|
<div class="breadCrumb"><a :href="searchHistory && searchHistory.length ? searchHistory[searchHistory.length - 1].link : '/'">Back to Search Results</a></div>
|
|
125
124
|
<div class="performance__details">
|
|
126
125
|
<div class="performance__header">
|
|
127
|
-
<h1>{{ formatDate(performance.performance_date,
|
|
126
|
+
<h1>{{ formatDate(performance.performance_date, 'detail') }} Performance Detail</h1>
|
|
128
127
|
<h2>{{ formatTime(performance.performance_date) }} | {{ formatLocation(performance.venue, performance.location) }}</h2>
|
|
129
128
|
</div>
|
|
130
129
|
<div class="headerLinks">
|
|
@@ -48,7 +48,7 @@ const filterHistory = (indexName) => {
|
|
|
48
48
|
<h4 v-if="index == 0">Performances</h4>
|
|
49
49
|
<div class="history__item" v-if="formatSearchTitle(item?.uiState[props.performanceIndex]).length">
|
|
50
50
|
<a :href="item.link">{{ formatSearchTitle(item?.uiState[props.performanceIndex]) }}</a><br/>
|
|
51
|
-
{{ formatDate((new Date(item.date)).getTime() / 1000,
|
|
51
|
+
{{ formatDate((new Date(item.date)).getTime() / 1000, 'history', false) }}
|
|
52
52
|
</div>
|
|
53
53
|
</template>
|
|
54
54
|
</div>
|
|
@@ -57,7 +57,7 @@ const filterHistory = (indexName) => {
|
|
|
57
57
|
<h4 v-if="index == 0">Artists</h4>
|
|
58
58
|
<div v-if="formatSearchTitle(item?.uiState[props.artistIndex]).length">
|
|
59
59
|
<a :href="item.link">{{ formatSearchTitle(item?.uiState[props.artistIndex]) }}</a><br/>
|
|
60
|
-
{{ formatDate((new Date(item.date)).getTime() / 1000,
|
|
60
|
+
{{ formatDate((new Date(item.date)).getTime() / 1000, 'history', false) }}
|
|
61
61
|
</div>
|
|
62
62
|
</template>
|
|
63
63
|
</div>
|
|
@@ -66,7 +66,7 @@ const filterHistory = (indexName) => {
|
|
|
66
66
|
<h4 v-if="index == 0">Works</h4>
|
|
67
67
|
<div class="history__item" v-if="formatSearchTitle(item?.uiState[props.workIndex]).length">
|
|
68
68
|
<a :href="item.link">{{ formatSearchTitle(item?.uiState[props.workIndex]) }}</a><br/>
|
|
69
|
-
{{ formatDate((new Date(item.date)).getTime() / 1000,
|
|
69
|
+
{{ formatDate((new Date(item.date)).getTime() / 1000, 'history', false) }}
|
|
70
70
|
</div>
|
|
71
71
|
</template>
|
|
72
72
|
</div>
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
<script setup>
|
|
2
|
-
import { ref } from 'vue'
|
|
2
|
+
import { ref, onMounted, useTemplateRef } from 'vue'
|
|
3
|
+
import { useDebounceFn } from '@vueuse/core'
|
|
4
|
+
import _ from 'lodash';
|
|
3
5
|
import {
|
|
4
6
|
AisClearRefinements,
|
|
5
7
|
AisCurrentRefinements,
|
|
@@ -16,8 +18,8 @@
|
|
|
16
18
|
import { history as historyRouter } from 'instantsearch.js/es/lib/routers'
|
|
17
19
|
import { simple as simpleStateMapping } from 'instantsearch.js/es/lib/stateMappings'
|
|
18
20
|
import VueDatePicker from '@vuepic/vue-datepicker'
|
|
19
|
-
import slugify from '../composables/slugify'
|
|
20
21
|
|
|
22
|
+
import slugify from '../composables/slugify'
|
|
21
23
|
import PAccordion from './PAccordion.vue'
|
|
22
24
|
import formatDate from '../composables/formatDate'
|
|
23
25
|
import formatSearchTitle from '../composables/formatSearchTitle'
|
|
@@ -87,11 +89,29 @@
|
|
|
87
89
|
updateStateRefs(uiState)
|
|
88
90
|
|
|
89
91
|
return uiState
|
|
90
|
-
}
|
|
92
|
+
},
|
|
93
|
+
createURL({ qsModule, location, routeState }) {
|
|
94
|
+
const { origin, pathname, hash } = location;
|
|
95
|
+
const indexState = routeState["instant_search"] || {};
|
|
96
|
+
const queryString = qsModule.stringify(routeState);
|
|
97
|
+
|
|
98
|
+
const uiState = qsModule.parse(location.search.slice(1))
|
|
99
|
+
|
|
100
|
+
updateSearchHistory(uiState)
|
|
101
|
+
|
|
102
|
+
// if (!indexState.query) {
|
|
103
|
+
// return `${origin}${pathname}${hash}`;
|
|
104
|
+
// }
|
|
105
|
+
|
|
106
|
+
return `${origin}${pathname}?${queryString}${hash}`;
|
|
107
|
+
},
|
|
91
108
|
}),
|
|
109
|
+
|
|
92
110
|
stateMapping: simpleStateMapping()
|
|
93
111
|
})
|
|
94
112
|
|
|
113
|
+
const mainRefinementList = ref({})
|
|
114
|
+
|
|
95
115
|
const server = {
|
|
96
116
|
connectionTimeoutSeconds: 20,
|
|
97
117
|
apiKey: props.searchKey,
|
|
@@ -180,48 +200,61 @@
|
|
|
180
200
|
showByWorks.value = Object.keys(workFilters.value).length !== 0
|
|
181
201
|
|
|
182
202
|
// update search history
|
|
183
|
-
let searchHistory = sessionStorage.getItem('searchHistory') ? JSON.parse(sessionStorage.getItem('searchHistory')) : []
|
|
184
|
-
// if only pagination, don't add to search history
|
|
185
|
-
if (uiState[props.indexName].page && !uiState[props.indexName].query && !uiState[props.indexName].refinementList && !uiState[props.indexName].menu) {
|
|
186
|
-
return
|
|
187
|
-
}
|
|
188
|
-
searchHistory = searchHistory.map((item) => {
|
|
189
|
-
// make sure that all queries aren't entered into the history as a user types each letter
|
|
190
|
-
if (uiState[props.indexName].query?.includes(item.query) && uiState[props.indexName].query != item.query) {
|
|
191
|
-
return {
|
|
192
|
-
date: new Date(),
|
|
193
|
-
uiState: uiState,
|
|
194
|
-
query: uiState[props.indexName].query,
|
|
195
|
-
link: document.location.href
|
|
196
|
-
}
|
|
197
|
-
} else {
|
|
198
|
-
return item
|
|
199
|
-
}
|
|
200
|
-
})
|
|
201
|
-
|
|
202
|
-
//make sure we're not just adding pagination
|
|
203
|
-
let addState = true
|
|
204
|
-
searchHistory.forEach((item) => {
|
|
205
|
-
if (item.link.replace(/\&page=\d*/, "") == document.location.href.replace(/\&page=\d*/, "")) {
|
|
206
|
-
addState = false
|
|
207
|
-
return
|
|
208
|
-
}
|
|
209
|
-
})
|
|
210
203
|
|
|
211
204
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
205
|
+
updateTitle(uiState[props.indexName])
|
|
206
|
+
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const updateSearchHistory = (uiState) => {
|
|
211
|
+
let searchHistory = sessionStorage.getItem('searchHistory') ? JSON.parse(sessionStorage.getItem('searchHistory')) : []
|
|
212
|
+
// if only pagination, don't add to search history
|
|
213
|
+
if (!uiState[props.indexName]) {
|
|
214
|
+
return
|
|
215
|
+
}
|
|
216
|
+
if (uiState[props.indexName].page && !uiState[props.indexName].query && !uiState[props.indexName].refinementList && !uiState[props.indexName].menu) {
|
|
217
|
+
return
|
|
218
|
+
}
|
|
219
|
+
searchHistory = searchHistory.map((item) => {
|
|
220
|
+
// make sure that all queries aren't entered into the history as a user types each letter
|
|
221
|
+
if (uiState[props.indexName].query?.includes(item.query) && uiState[props.indexName].query != item.query) {
|
|
222
|
+
return {
|
|
215
223
|
date: new Date(),
|
|
216
224
|
uiState: uiState,
|
|
217
225
|
query: uiState[props.indexName].query,
|
|
218
226
|
link: document.location.href
|
|
219
|
-
}
|
|
227
|
+
}
|
|
228
|
+
} else {
|
|
229
|
+
return item
|
|
230
|
+
}
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
//make sure we're not just adding pagination
|
|
234
|
+
let addState = true
|
|
235
|
+
searchHistory.forEach((item) => {
|
|
236
|
+
if (item.link.replace(/\&page=\d*/, "") == document.location.href.replace(/\&page=\d*/, "")) {
|
|
237
|
+
addState = false
|
|
238
|
+
return
|
|
239
|
+
}
|
|
240
|
+
if (_.isEqual(item.uiState[props.indexName], uiState[props.indexName])) {
|
|
241
|
+
addState = false
|
|
242
|
+
return
|
|
220
243
|
}
|
|
244
|
+
})
|
|
221
245
|
|
|
222
|
-
|
|
223
|
-
|
|
246
|
+
|
|
247
|
+
if (addState && !(searchHistory.map((a) => a.link)).includes(document.location.href) &&
|
|
248
|
+
document.location.search != '') {
|
|
249
|
+
searchHistory.push({
|
|
250
|
+
date: new Date(),
|
|
251
|
+
uiState: uiState,
|
|
252
|
+
query: uiState[props.indexName].query,
|
|
253
|
+
link: document.location.href
|
|
254
|
+
})
|
|
224
255
|
}
|
|
256
|
+
|
|
257
|
+
sessionStorage.setItem('searchHistory', JSON.stringify(searchHistory))
|
|
225
258
|
}
|
|
226
259
|
|
|
227
260
|
const getWorkFilters = (refinementList) => {
|
|
@@ -248,7 +281,12 @@
|
|
|
248
281
|
|
|
249
282
|
const onStateChange = ({ uiState, setUiState }) => {
|
|
250
283
|
updateStateRefs(uiState)
|
|
251
|
-
setUiState(uiState)
|
|
284
|
+
setUiState(uiState)
|
|
285
|
+
|
|
286
|
+
// console.log('before', new Date())
|
|
287
|
+
|
|
288
|
+
// setTimeout(() => , 3000)
|
|
289
|
+
// console.log('after', new Date())
|
|
252
290
|
}
|
|
253
291
|
|
|
254
292
|
const updateTitle = (state) => {
|
|
@@ -316,7 +354,7 @@
|
|
|
316
354
|
|
|
317
355
|
}
|
|
318
356
|
|
|
319
|
-
|
|
357
|
+
const intersect = (filters, work) => {
|
|
320
358
|
let intersectKeys = Object.keys(filters).filter(k => Object.hasOwn(work, k))
|
|
321
359
|
let intersectArray = []
|
|
322
360
|
intersectKeys.forEach((key) => {
|
|
@@ -375,8 +413,11 @@
|
|
|
375
413
|
} else {
|
|
376
414
|
return items
|
|
377
415
|
}
|
|
378
|
-
|
|
416
|
+
}
|
|
379
417
|
|
|
418
|
+
const refineAndScroll = (refine, params, scrollId) => {
|
|
419
|
+
refine(params)
|
|
420
|
+
document.getElementById(scrollId).scrollIntoView()
|
|
380
421
|
}
|
|
381
422
|
|
|
382
423
|
const toMinValue = (value, range) => {
|
|
@@ -395,6 +436,31 @@
|
|
|
395
436
|
return typeof maxValue === "number" && maxValue !== null && maxValue !== maxRange ? maxValue : maxRange
|
|
396
437
|
}
|
|
397
438
|
|
|
439
|
+
function debounce(func, params, delay) {
|
|
440
|
+
let timeout;
|
|
441
|
+
// return function (params) {
|
|
442
|
+
clearTimeout(timeout);
|
|
443
|
+
timeout = setTimeout(() => {
|
|
444
|
+
func(params);
|
|
445
|
+
}, delay);
|
|
446
|
+
//};
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
const getHeadingStyle = (attribute) => {
|
|
450
|
+
if (mainRefinementList.value && typeof(mainRefinementList.value[attribute]) !== 'undefined' && mainRefinementList.value[attribute]) {
|
|
451
|
+
try {
|
|
452
|
+
if (mainRefinementList.value[attribute] && typeof(mainRefinementList.value[attribute].items) !== 'undefined' && mainRefinementList.value[attribute].items.length) {
|
|
453
|
+
return ''
|
|
454
|
+
} else {
|
|
455
|
+
return '-gray'
|
|
456
|
+
}
|
|
457
|
+
} catch (e) {
|
|
458
|
+
return ''
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
return ''
|
|
462
|
+
}
|
|
463
|
+
|
|
398
464
|
</script>
|
|
399
465
|
|
|
400
466
|
<template>
|
|
@@ -403,9 +469,8 @@
|
|
|
403
469
|
:index-name="props.indexName"
|
|
404
470
|
:routing="routing"
|
|
405
471
|
:on-state-change="onStateChange"
|
|
406
|
-
|
|
407
472
|
>
|
|
408
|
-
|
|
473
|
+
<div :class="`tabs__content ${ filtersClosed ? 'closed' : 'open'}`" :id="`${props.indexName}_tabs__content`">
|
|
409
474
|
<!-- Header and Search Section -->
|
|
410
475
|
<div class="eventsSearch__topSection">
|
|
411
476
|
<!-- Search Filters Section -->
|
|
@@ -413,10 +478,7 @@
|
|
|
413
478
|
<div class="filters__row">
|
|
414
479
|
<!-- Search Box -->
|
|
415
480
|
<div class="filters__filterGroup filters__search">
|
|
416
|
-
<ais-search-box
|
|
417
|
-
|
|
418
|
-
class="searchBox"
|
|
419
|
-
>
|
|
481
|
+
<ais-search-box class="searchBox" >
|
|
420
482
|
<template v-slot="{ currentRefinement, isSearchStalled, refine }">
|
|
421
483
|
<label for="searchbox" class="label__hidden">{{ props.searchPlaceholder }}</label>
|
|
422
484
|
<input
|
|
@@ -517,17 +579,18 @@
|
|
|
517
579
|
</a>
|
|
518
580
|
</div>
|
|
519
581
|
</div>
|
|
520
|
-
<
|
|
521
|
-
<
|
|
522
|
-
<
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
<
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
582
|
+
<p-accordion class="accordion" v-for="refinement in mainRefinements">
|
|
583
|
+
<summary class="accordion__summary">
|
|
584
|
+
<h6 :class="`accordion__heading ${ getHeadingStyle(refinement.attribute) }`">{{ refinement.title }}</h6>
|
|
585
|
+
<div class="accordion__iconWrapper">
|
|
586
|
+
<svg class="accordion__icon icon icon--chevron-right" aria-hidden="true" role="presentation" viewBox="0 0 18 18" fill="none">
|
|
587
|
+
<path d="M7 17L15 9L7 1" stroke="var(--icon-color, currentColor)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
588
|
+
</svg>
|
|
589
|
+
</div>
|
|
590
|
+
</summary>
|
|
591
|
+
<ais-refinement-list :attribute="refinement.attribute" operator="and" :ref="(el) => {mainRefinementList[refinement.attribute] = el}">
|
|
592
|
+
<template v-slot="{items, refine, searchForItems, isFromSearch}">
|
|
593
|
+
|
|
531
594
|
<div class="accordion__content" v-if="items.length || isFromSearch">
|
|
532
595
|
<div class="ais-SearchBox searchBox -filter">
|
|
533
596
|
<label class="label__hidden" :for="refinement.attribute">{{ refinement.placeholder }}</label>
|
|
@@ -562,12 +625,13 @@
|
|
|
562
625
|
<label :for="slugify(refinement.title + ' ' + item.value)">{{ item.value }}</label><span class="eventsSearch__refinementCount">{{ item.count }}</span>
|
|
563
626
|
</label>
|
|
564
627
|
</div>
|
|
565
|
-
</div>
|
|
566
|
-
</
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
628
|
+
</div>
|
|
629
|
+
</template>
|
|
630
|
+
</ais-refinement-list>
|
|
631
|
+
</p-accordion>
|
|
632
|
+
<!-- <template v-else><div></div></template> -->
|
|
633
|
+
|
|
634
|
+
<p-accordion class="ais-RefinementList" v-if="props.addlRefinements" name="more_filters" :start-open="false" open-text="Fewer Filters" closed-text="More Filters">
|
|
571
635
|
<summary class="accordion__summary">
|
|
572
636
|
<h6 class="accordion__heading -thin">More Filters</h6>
|
|
573
637
|
</summary>
|
|
@@ -608,7 +672,7 @@
|
|
|
608
672
|
<div class="eventSearch__checkBox">
|
|
609
673
|
<input :class="`checkbox ${item.isRefined ? '-boxChecked' : ''}`" type="checkbox" :id="slugify(refinement.title + ' ' + item.value)" :value="item.value" :checked="item.isRefined" @click="refine(item.value)">
|
|
610
674
|
</div>
|
|
611
|
-
<label :for="slugify(refinement.title + ' ' + item.value)">{{ item.value }}</label><span class="
|
|
675
|
+
<label :for="slugify(refinement.title + ' ' + item.value)">{{ item.value }}</label><span class="eventsSearch__refinementCount">{{ item.count }}</span>
|
|
612
676
|
</label>
|
|
613
677
|
</div>
|
|
614
678
|
</div>
|
|
@@ -660,9 +724,10 @@
|
|
|
660
724
|
:href="createURL()"
|
|
661
725
|
@click.prevent="refine"
|
|
662
726
|
>
|
|
663
|
-
<button>Clear</button>
|
|
664
|
-
|
|
727
|
+
<button @click="toggleFiltersMobile()" class="filterClear">Clear</button>
|
|
728
|
+
|
|
665
729
|
</a>
|
|
730
|
+
<button @click="toggleFiltersMobile()" class="filterApply">Apply</button>
|
|
666
731
|
</template>
|
|
667
732
|
</ais-clear-refinements>
|
|
668
733
|
|
|
@@ -698,7 +763,7 @@
|
|
|
698
763
|
</div>
|
|
699
764
|
</div>
|
|
700
765
|
<div class="eventsSearch__resultsHeader">
|
|
701
|
-
<div class="eventsSearch__resultsTitle">
|
|
766
|
+
<div class="eventsSearch__resultsTitle" id="resultsTitle">
|
|
702
767
|
<svg width="24" height="24" viewBox="0 0 24 24" :id="`${props.indexName}_filterToggleOn`" :class="`filters__toggleOn ${filtersClosed ? 'closed' : ''}`" @click="toggleFilters()">
|
|
703
768
|
<rect width="24" height="24" rx="4" fill="#01ABE6"/>
|
|
704
769
|
<path d="M6 7.25H18.8864" stroke="white" stroke-linecap="round"/>
|
|
@@ -818,14 +883,14 @@
|
|
|
818
883
|
>
|
|
819
884
|
<ul class="resultsPagination__paginationComponent" v-if="pages.length > 1">
|
|
820
885
|
<li v-if="!isFirstPage && nbPages > 5" class="arrow">
|
|
821
|
-
<a :href="createURL(0)" @click.prevent="refine
|
|
886
|
+
<a :href="createURL(0)" @click.prevent="refineAndScroll(refine, 0, 'resultsTitle')">
|
|
822
887
|
‹‹
|
|
823
888
|
</a>
|
|
824
889
|
</li>
|
|
825
890
|
<li v-if="!isFirstPage && nbPages > 5" class="arrow">
|
|
826
891
|
<a
|
|
827
892
|
:href="createURL(currentRefinement - 1)"
|
|
828
|
-
@click.prevent="refine
|
|
893
|
+
@click.prevent="refineAndScroll(refine, currentRefinement - 1, 'resultsTitle')"
|
|
829
894
|
>
|
|
830
895
|
‹
|
|
831
896
|
</a>
|
|
@@ -835,32 +900,32 @@
|
|
|
835
900
|
<a
|
|
836
901
|
:href="createURL(page)"
|
|
837
902
|
:style="{ fontWeight: page === currentRefinement ? 'bold' : '' }"
|
|
838
|
-
@click.prevent="refine
|
|
903
|
+
@click.prevent="refineAndScroll(refine, page, 'resultsTitle')"
|
|
839
904
|
>
|
|
840
905
|
{{ page + 1 }}
|
|
841
906
|
</a>
|
|
842
907
|
</li>
|
|
843
908
|
<li v-if="pages.length > 5">...</li>
|
|
844
909
|
<li v-if="pages.length > 5">
|
|
845
|
-
<a :href="createURL(nbPages - 1)">
|
|
910
|
+
<a :href="createURL(nbPages - 1)" @click.prevent="refineAndScroll(refine, nbPages - 1, 'resultsTitle')">
|
|
846
911
|
{{ nbPages }}
|
|
847
912
|
</a>
|
|
848
913
|
</li>
|
|
849
914
|
</template>
|
|
850
915
|
<template v-else>
|
|
851
916
|
<li>
|
|
852
|
-
<a :href="createURL(0)" @click.prevent="refine
|
|
917
|
+
<a :href="createURL(0)" @click.prevent="refineAndScroll(refine, 0, 'resultsTitle')" :style="{ fontWeight: currentRefinement === 0 ? 'bold' : '' }">
|
|
853
918
|
1
|
|
854
919
|
</a>
|
|
855
920
|
</li>
|
|
856
921
|
<li v-if="pages.length > 5">...</li>
|
|
857
922
|
<li v-for="page in 5" :key="page" v-if="nbPages > 5">
|
|
858
|
-
<a :href="createURL(nbPages - (5 - page) - 1)" :style="{ fontWeight: nbPages - (5 - page) - 1 === currentRefinement ? 'bold' : '' }">
|
|
923
|
+
<a :href="createURL(nbPages - (5 - page) - 1)" @click.prevent="refineAndScroll(refine, nbPages - (5 - page) - 1, 'resultsTitle')" :style="{ fontWeight: nbPages - (5 - page) - 1 === currentRefinement ? 'bold' : '' }">
|
|
859
924
|
{{ nbPages - (5 - page) }}
|
|
860
925
|
</a>
|
|
861
926
|
</li>
|
|
862
927
|
<li v-for="page in nbPages - 1" v-if="nbPages <= 5">
|
|
863
|
-
<a :href="createURL(page)" :style="{ fontWeight: page === currentRefinement ? 'bold' : '' }">
|
|
928
|
+
<a :href="createURL(page)" @click.prevent="refineAndScroll(refine, page, 'resultsTitle')" :style="{ fontWeight: page === currentRefinement ? 'bold' : '' }">
|
|
864
929
|
{{ page + 1 }}
|
|
865
930
|
</a>
|
|
866
931
|
</li>
|
|
@@ -868,20 +933,20 @@
|
|
|
868
933
|
<li v-if="!isLastPage && nbPages > 5" class="arrow">
|
|
869
934
|
<a
|
|
870
935
|
:href="createURL(currentRefinement + 1)"
|
|
871
|
-
@click.prevent="refine
|
|
936
|
+
@click.prevent="refineAndScroll(refine, currentRefinement + 1, 'resultsTitle')"
|
|
872
937
|
>
|
|
873
938
|
›
|
|
874
939
|
</a>
|
|
875
940
|
</li>
|
|
876
941
|
<li v-if="!isLastPage && nbPages > 5" class="arrow">
|
|
877
|
-
<a :href="createURL(nbPages)" @click.prevent="refine
|
|
942
|
+
<a :href="createURL(nbPages)" @click.prevent="refineAndScroll(refine, currentRefinement + 1, 'resultsTitle')">
|
|
878
943
|
››
|
|
879
944
|
</a>
|
|
880
945
|
</li>
|
|
881
946
|
</ul>
|
|
882
947
|
<div v-else></div>
|
|
883
948
|
</template>
|
|
884
|
-
|
|
949
|
+
|
|
885
950
|
</ais-pagination>
|
|
886
951
|
</nav>
|
|
887
952
|
</section>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export default function formatDate(unix_timestamp,
|
|
1
|
+
export default function formatDate(unix_timestamp, type = null, showTimezone = true) {
|
|
2
2
|
// multiplied by 1000 so that the argument is in milliseconds, not seconds
|
|
3
3
|
const date = new Date(unix_timestamp * 1000)
|
|
4
4
|
const days = ["Sun", "Mon", "Tues", "Weds", "Thurs", "Fri", "Sat"]
|
|
@@ -7,7 +7,9 @@ export default function formatDate(unix_timestamp, detail = false, showTimezone
|
|
|
7
7
|
const amPm = date.getHours() + 1 > 12 ? "pm" : "am"
|
|
8
8
|
const minutes = "0" + date.getMinutes()
|
|
9
9
|
|
|
10
|
-
if (detail) {
|
|
10
|
+
if (type == 'detail') {
|
|
11
|
+
return `${days[date.getDay()]}, ${(months[date.getMonth()]).substring(0, 3)} ${date.getDate()}, ${date.getFullYear()}`
|
|
12
|
+
} else if (type == 'history') {
|
|
11
13
|
return `${days[date.getDay()]}, ${(months[date.getMonth()]).substring(0, 3)} ${date.getDate()}, ${hour}:${minutes.substr(-2)}${amPm}${ showTimezone ? ' EDT' : '' }`
|
|
12
14
|
} else {
|
|
13
15
|
return `${date.getMonth() + 1}-${date.getDate()}-${date.getFullYear()}`
|
|
@@ -3,9 +3,18 @@
|
|
|
3
3
|
max-height: 10rem;
|
|
4
4
|
min-height: 1.8rem;
|
|
5
5
|
overflow-y: auto;
|
|
6
|
+
padding-bottom: 0.5rem;
|
|
6
7
|
input[type=checkbox] {
|
|
7
|
-
border: thin solid var(--color-
|
|
8
|
-
|
|
8
|
+
border: thin solid var(--color-gray-100);
|
|
9
|
+
background-color: var(--color-white);
|
|
10
|
+
border-radius: 0;
|
|
11
|
+
height: 1rem;
|
|
12
|
+
width: 1rem;
|
|
13
|
+
|
|
14
|
+
}
|
|
15
|
+
input[type=checkbox]:checked {
|
|
16
|
+
border: thin solid var(--color-gray-100);
|
|
17
|
+
background-color: var(--color-turquoise);
|
|
9
18
|
border-radius: 0;
|
|
10
19
|
height: 1rem;
|
|
11
20
|
width: 1rem;
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
* a default neutral color scale.
|
|
32
32
|
*/
|
|
33
33
|
--color-gray-50: #f2f2f2;
|
|
34
|
-
--color-gray-100: #
|
|
35
|
-
--color-gray-200: #
|
|
34
|
+
--color-gray-100: #d7d7d7;
|
|
35
|
+
--color-gray-200: #d3d0cd;
|
|
36
36
|
--color-gray-300: #b3b3b3;
|
|
37
|
-
--color-gray-400: #
|
|
37
|
+
--color-gray-400: #9A9FA1;
|
|
38
38
|
--color-gray-500: #808080;
|
|
39
39
|
--color-gray-600: #666666;
|
|
40
40
|
--color-gray-700: #4c4c4c;
|
|
@@ -50,12 +50,11 @@
|
|
|
50
50
|
--color-blue-700: #003D99;
|
|
51
51
|
--color-aqua: #00CCCC;
|
|
52
52
|
--color-aqua-700: #009999;
|
|
53
|
-
--color-dark-blue: #
|
|
53
|
+
--color-dark-blue: #14294E;
|
|
54
54
|
--color-white: #ffffff;
|
|
55
55
|
--color-mid-blue: #12305A;
|
|
56
56
|
--color-light-gray: #F5F5F5;
|
|
57
|
-
--color-light-gold: #
|
|
58
|
-
--color-dark-gray: #686F73;
|
|
57
|
+
--color-light-gold: #fcf3ec;
|
|
59
58
|
--color-turquoise: #01ABE6;
|
|
60
59
|
--color-black:#000000;
|
|
61
60
|
--color-mid-gray: #686F73;
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
height: var(--accordion-height-closed);
|
|
11
11
|
overflow: hidden;
|
|
12
12
|
transition: height var(--root-duration-moderate) var(--root-ease-out);
|
|
13
|
-
border-top: thin solid var(--color-gray-
|
|
13
|
+
border-top: thin solid var(--color-gray-200);
|
|
14
|
+
padding-bottom: 0.4rem;
|
|
14
15
|
|
|
15
16
|
&__summary {
|
|
16
17
|
align-items: center;
|
|
@@ -20,7 +21,7 @@
|
|
|
20
21
|
justify-items: start;
|
|
21
22
|
list-style: none;
|
|
22
23
|
outline-offset: -2px;
|
|
23
|
-
padding: .5rem 0;
|
|
24
|
+
padding: .5rem 0 0 0;
|
|
24
25
|
user-select: none;
|
|
25
26
|
|
|
26
27
|
&::-webkit-details-marker {
|
|
@@ -53,7 +54,7 @@
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
&__content {
|
|
56
|
-
padding: 0 .5rem
|
|
57
|
+
padding: 0 .5rem 0 0;
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
&[open]:not(&.-closing) {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
border: none;
|
|
44
44
|
outline: none;
|
|
45
45
|
&::placeholder {
|
|
46
|
-
color: var(--color-gray
|
|
46
|
+
color: var(--color-mid-gray);
|
|
47
47
|
}
|
|
48
48
|
&.-filter {
|
|
49
49
|
background-color:#ffffff;
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
width: 100%;
|
|
54
54
|
}
|
|
55
55
|
&.-filter::placeholder {
|
|
56
|
-
color: var(--color-gray
|
|
56
|
+
color: var(--color-mid-gray);
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
|