[feat] facet filtering setup
This commit is contained in:
@@ -373,6 +373,11 @@ $tiers: (
|
||||
}
|
||||
}
|
||||
|
||||
.facet-list {
|
||||
max-height: 240px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------
|
||||
Circles (Header, Buttons, etc.)
|
||||
-------------------------------------------------- */
|
||||
|
||||
3
src/assets/js/main.js
Normal file
3
src/assets/js/main.js
Normal file
@@ -0,0 +1,3 @@
|
||||
const filterfacet = (event) => {
|
||||
console.log(event);
|
||||
}
|
||||
@@ -5,11 +5,11 @@ import '/src/assets/css/main.scss';
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" data-bs-theme="dark">
|
||||
<head>
|
||||
<script>
|
||||
<script is:inline>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
</script>
|
||||
<!-- Google Tag Manager -->
|
||||
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
||||
<script is:inline>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
||||
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
||||
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
||||
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
||||
@@ -54,5 +54,6 @@ import '/src/assets/css/main.scss';
|
||||
// import 'bootstrap/js/dist/tooltip';
|
||||
</script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.8/dist/htmx.min.js"></script>
|
||||
<script is:inline src="/src/assets/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -51,7 +51,8 @@ let searchArray = [{
|
||||
collection: 'cards',
|
||||
filter_by: `sealed:false${filterBy ? ` && ${filterBy}` : ''}`,
|
||||
per_page: 20,
|
||||
facet_by: Object.keys(facetFields).join(','),
|
||||
facet_by: '',
|
||||
max_facet_values: 0,
|
||||
page: Math.floor(start / 20) + 1,
|
||||
sort_by: '_text_match:asc, releaseDate:desc, number:asc',
|
||||
include_fields: '$skus(*)',
|
||||
@@ -65,6 +66,7 @@ if (start === 0) {
|
||||
filter_by: facetFilter(facet),
|
||||
per_page: 0,
|
||||
facet_by: facet,
|
||||
max_facet_values: 500,
|
||||
page: 1,
|
||||
sort_by: '',
|
||||
include_fields: '',
|
||||
@@ -119,17 +121,18 @@ if (start === 0) {
|
||||
|
||||
---
|
||||
{(start === 0) &&
|
||||
<script define:vars={{ totalHits, filters, facets }} is:inline>
|
||||
let hits = totalHits;
|
||||
</script>
|
||||
|
||||
<div id="facetContainer" hx-swap-oob="true">
|
||||
<button type="submit" form="searchform" class="btn btn-secondary">Apply Filters</button>
|
||||
{facets.map((facet) => (
|
||||
<div class="mb-4">
|
||||
<div class="mb-4 facet-group">
|
||||
<div class="h5">{facetNames(facet.field_name)}</div>
|
||||
{(facet.counts.length > 20) &&
|
||||
<input class="facet-filter" type="text" id={`filter_${facet.field_name}`} placeholder="search..." />
|
||||
}
|
||||
<div class="facet-list">
|
||||
{facet.counts.map((count) => (
|
||||
<div>
|
||||
<div class="facet-item" data-facet-value={count.value.toLowerCase()}>
|
||||
<label class="form-check-label">
|
||||
<input type="checkbox" name={facet.field_name} value={count.value} checked={filterChecked(facet.field_name, count.value)} class="form-check-input" form="searchform" />
|
||||
{count.value} ({count.count})
|
||||
@@ -137,10 +140,27 @@ if (start === 0) {
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
<button type="submit" form="searchform" class="btn btn-secondary">Apply Filters</button>
|
||||
</div>
|
||||
|
||||
<script define:vars={{ totalHits, filters, facets }} is:inline>
|
||||
const facetfilters = document.querySelectorAll('.facet-filter');
|
||||
for (const facetfilter of facetfilters) {
|
||||
const facetgroup = facetfilter.closest('.facet-group');
|
||||
const facetlist = facetgroup.querySelector('.facet-list');
|
||||
const facetitems = facetlist.querySelectorAll('.facet-item');
|
||||
facetfilter.addEventListener('input', (e) => {
|
||||
const match = e.target.value.toLowerCase();
|
||||
for (item of facetitems) {
|
||||
const text = item.getAttribute('data-facet-value');
|
||||
if (text.includes(match)) item.style.display = ''; // Show
|
||||
else item.style.display = 'none'; // Hide
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
}
|
||||
|
||||
{pokemon.map((card) => (
|
||||
|
||||
Reference in New Issue
Block a user