globalThis.spotler_search_templates = globalThis.spotler_search_templates || {}; globalThis.spotler_search_templates['837caaa7-c813-48ed-838f-9fd2297037e6'] = (function (props) { const currencyFormatter = new Intl.NumberFormat("nl-NL", { style: "currency", currency: props.spotler.getConfig("currency") || "EUR", }); function formatCurrency(price) { let withoutSpace = currencyFormatter.format(price); return withoutSpace.replace(/(\p{Sc})\s(\d)/gu, '$1$2'); } function matchQueryInBold(str) { if (str === undefined) { return ""; } const escapedSearchTerm = props.spotler .getSearchTerm() .replace(/([.?*+^$[\]\\(){}|-])/g, "\\$&"); return str.replace( new RegExp(escapedSearchTerm, "gi"), '$&' ); } function escapeHtml(str) { const entityMap = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'", "/": "/", "`": "`", "=": "=", }; return str.replace(/[&<>"'`=/]/g, (s) => entityMap[s]); } function triggerChangeView(event, view) { event.preventDefault(); props.spotler.triggerViewChange(view); } function revertToPreviousSuccessfulState(event) { props.spotler.revertToPreviousSuccessfulState(); } async function SuggestView(props) { const {items, content} = await props.spotler.fetchResults(); return `
Zoeksuggesties
Makita accu
Makita accuboormachine
Makita bithouder
Itemsuggesties
${items.data?.map((item) => `
${matchQueryInBold(item.properties.title)}
★★★★☆ 53 reviews
€299
${formatCurrency(item.properties.price)}
`).join("")}
Meer informatie
${content.data?.map((content) => `
${matchQueryInBold(content.properties.title)}
`).join("")}
`; } function TabletAndDesktopHeading(props, items) { return `
`; } function MobileHeading(props, items) { function toggleResultsFilterMobile(event) { const element = event.target; const view = element.dataset.sptlrMobileViewTrigger; const container = event.target.closest("[data-sptlr-container]"); container.querySelectorAll("[data-sptlr-mobile-view]").forEach((el) => { el.classList.toggle("sqr-hidden", el.dataset.sptlrMobileView !== view); }); container .querySelectorAll("[data-sptlr-mobile-view-trigger]") .forEach((el) => { el.classList.toggle( "sqr-opacity-50", el.dataset.sptlrMobileViewTrigger !== view ); }); props.state.datasets["items"].mobileView = view; } return `
Resultaten (${items?.meta?.total})
Filteren
`; } //Spotler container async function ItemsView(props) { const {items} = await props.spotler.fetchResults(); props.state.datasets["items"].mobileView = props.state.datasets["items"].mobileView ?? "results"; function toggleResultsFilterMobile(event) { const element = event.target; const view = element.dataset.sptlrMobileViewTrigger; const container = event.target.closest("[data-sptlr-container]"); container.querySelectorAll("[data-sptlr-mobile-view]").forEach((el) => { el.classList.toggle("sqr-hidden", el.dataset.sptlrMobileView !== view); }); container .querySelectorAll("[data-sptlr-mobile-view-trigger]") .forEach((el) => { el.classList.toggle( "sqr-opacity-50", el.dataset.sptlrMobileViewTrigger !== view ); }); props.state.datasets["items"].mobileView = view; } props.state.datasets["items"].filterStates = items.facets.reduce( (obj, f) => { obj[f.id] = {collapsed: f.is_default_collapsed, ...obj[f.id]}; return obj; }, props.state.datasets["items"].filterStates ?? {} ); if (items.meta.total > items.meta.offset + items.meta.limit) { props.spotler.registerInfiniteScroll( "items", "[data-sqr-infinite-scroll-item]:last-child", ({items}) => Items(items.data) ); } return `
${TabletAndDesktopHeading(props, items)} ${MobileHeading(props, items)}
${ActiveFilters(props.state.datasets["items"], items?.facets)} ${Filters(items?.facets)}
${items.meta.total === 0 ? `

We hebben geen resultaten gevonden

${props.spotler.hasPreviousSuccessfulState() ? ` ` : ``}
` : ` ${SpellcheckMessage(items?.spellcheck, items?.meta?.total)} ${Banners(items?.banners)}
${Items(items?.data)}
` }
`; } function ActiveFilters(dataset, facets) { if (!dataset.filters || dataset.filters.length === 0) { return ""; } const filters = []; for (const filter of dataset.filters) { const facet = facets.find((f) => f.name === filter.field); if (!facet) { continue; } switch (facet.type) { case "dualslider": filters.push({ name: facet.name, label: facet.label, value: `${renderFilterLabel( filter.start, facet.prefix, facet.suffix )} - ${renderFilterLabel(filter.end, facet.prefix, facet.suffix)}`, }); break; case "multiselect": filters.push({ name: facet.name, label: facet.label, value: facet.values .filter((v) => filter.values.includes(v.value)) .map((v) => renderFilterLabel(v.label, facet.prefix, facet.suffix) ) .join(", "), }); break; default: filters.push({ name: facet.name, label: facet.label, value: renderFilterLabel(filter.value, facet.prefix, facet.suffix), }); } } if (filters.length === 0) { return ""; } function clearFilters(event, dataset) { event.preventDefault(); props.spotler.clearAllFilters(dataset); } return `

Gekozen filters

${filters.map(ActiveFilter).join("")}
`; } function ActiveFilter(filter) { function removeFilter(event, dataset, name) { props.spotler.triggerFilterChange(dataset, name); } return ` ${filter.label}: ${filter.value} `; } function Filters(filters) { return filters?.map((facet) => { switch (facet.type) { case "select": return renderSelectFilter({...facet, dataset: "items"}); case "multiselect": return renderMultiSelectFilter({...facet, dataset: "items"}); case "radio": return renderRadioFilter({...facet, dataset: "items"}); case "slider": return renderSliderFilter({...facet, dataset: "items"}); case "dualslider": return renderDualSliderFilter({...facet, dataset: "items"}); } }).join(""); } function SpellcheckMessage(spellcheck, total) { if (!spellcheck) { return ""; } return `
U zocht op ${spellcheck.old}, maar wij vonden geen resultaten. U zocht op ${spellcheck.new}, wij vonden ${total} ${total === 1 ? "resultaat" : "resultaten"}.
`; } function Banners(banners) { if (!Array.isArray(banners) || banners.length === 0) { return ""; } const banner = banners.pop(); const bannerTypes = Object.keys(banner); let bannerHtml = ""; for (let i = 0, l = bannerTypes.length; i < l; i++) { const bannerType = bannerTypes[i]; switch (bannerType) { case "mobile": bannerHtml += Banner( banner, bannerType, "sqr-block tablet:sqr-hidden" ); break; case "tablet": bannerHtml += Banner( banner, bannerType, "sqr-hidden tablet:sqr-block desktop:sqr-hidden" ); break; case "desktop": bannerHtml += Banner( banner, bannerType, "sqr-hidden desktop:sqr-block" ); break; } } return bannerHtml; } function Banner(banner, type, mediaClasses) { if (!(type in banner)) { return ""; } if (banner[type].url) { return ` `; } return ``; } function Items(items) { return items?.map(Item).join(""); } // Item setup // function Item(item) { // return ` //
//
// //
// ${item.properties.title} //
//
//
//
// //
Bewaar voor later
//
//
//
//
//
//
//
// // //
// Gemonteerde levering | Premium kwaliteit //
//
//
//
//
// ${renderPrice(item)} // // // // // ${formatCurrency(item.properties['retailprice'])} // // // incl. BTW // //
//
// // // // // //
//
//
//
//
// `; // } function Item(item) { let reviewCountRaw = item.properties.rating_count ? item.properties.rating_count[0] : ''; let reviewCountDecimals = reviewCountRaw.split('.'); let reviewCount = reviewCountDecimals[0]; return `
${item.properties.title}
Bewaar voor later
${item.properties.custom_attributes}
${item.properties.rating_avg && item.properties.rating_avg[0] !== '0' ? `
`:``} ${item.properties.rating_count ? ` ${reviewCount} ${reviewCount === '1' ? 'beoordeling' : 'beoordelingen'} `:``}
${renderPrice(item)} ${formatCurrency(item.properties['priceincl'])} incl. BTW
`; } // Attach the event listener after the items are rendered // Use event delegation to handle dynamically created elements document.body.addEventListener('input', function(event) { if (event.target.matches('.qty')) { const quantity = event.target.value; const productId = event.target.dataset.product_id; const link = event.target.closest('.input-group-cart').querySelector('a'); // Update the href and data-quantity attribute //link.href = `?add-to-cart=${productId}&quantity=${quantity}`; link.setAttribute('data-quantity', quantity); } }); function renderPrice(item) { const price = item.properties.double_normal_price > 0 ? item.properties.double_normal_price : item.properties.price; const discountedPrice = item.properties.price; if (discountedPrice > 0 && price !== discountedPrice) { return `
${formatCurrency(discountedPrice)}
`; } return `
${formatCurrency(price).replace("€ ", "€")}
`; } function renderFilter(facet, children) { const filterState = props.state.datasets[facet.dataset].filterStates?.[facet.id]; const collapsed = filterState?.collapsed ?? facet.is_default_collapsed; function collapse(e, dataset, filterId) { e.preventDefault(); const element = e.currentTarget; const filterState = props.state.datasets[dataset].filterStates?.[filterId]; const active = element.classList.contains("sqr-active"); element.classList.toggle("sqr-active", !active); element.nextElementSibling.classList.toggle("sqr-hidden", active); filterState.collapsed = active; } return `
${children}
`; } function renderSelectFilter(facet) { return renderFilter(facet,`
`); } function showMore(e, dataset, filterId) { e.preventDefault(); const element = e.currentTarget; const parentElement = element.closest("[data-sqr-filter]"); const filterState = props.state.datasets[dataset].filterStates?.[filterId]; filterState.showing_more = !filterState.showing_more; element.textContent = filterState.showing_more ? "Toon minder" : "Toon meer"; parentElement.dataset.sqrFilterShowingMore = filterState.showing_more; parentElement .querySelectorAll("[data-initially-hidden]") .forEach((element) => { element.classList.toggle("sqr-hidden", !filterState.showing_more); }); } function renderMultiSelectFilter(facet) { const hasMoreValues = facet.values.length > facet.result_limit; const filterState = props.state.datasets[facet.dataset].filterStates?.[facet.id]; const showingMore = filterState.showing_more ?? false; return renderFilter(facet,`
${facet.searchable? `
` : "" } ${facet.values.map((filterValue, index) => `
= facet.result_limit ? "data-initially-hidden" : ""} class="sqr-flex sqr-items-center ${!showingMore && index >= facet.result_limit ? "sqr-hidden" : ""} sqr-pl-[14px]" >
`).join("") } ${ hasMoreValues ? ` ` : "" }
`); } function renderRadioFilter(facet) { const hasMoreValues = facet.values.length > facet.result_limit; const filterState = props.state.datasets[facet.dataset].filterStates?.[facet.id]; const showingMore = filterState.showing_more ?? false; return renderFilter( facet, `
${facet.values.map((filterValue) => `
${filterValue.count}
`).join("") } ${hasMoreValues ? ` ` : "" }
`); } function renderSliderFilter(facet) { return renderFilter(facet, `
`); } function renderDualSliderFilter(facet) { return renderFilter( facet, `
${facet.use_input? `
` : `
${facet.prefix ?? ""} ${facet.min} ${facet.suffix ?? ""}
${facet.prefix ?? ""} ${facet.max} ${facet.suffix ?? ""}
`}
`); } function renderFilterLabel(label, prefix, suffix) { return `${prefix ?? ""} ${label} ${suffix ?? ""}`.trim(); } if (props.state.view === "items") { return ItemsView(props); } return SuggestView(props); });