globalThis.spotler_search_templates = globalThis.spotler_search_templates || {}; globalThis.spotler_search_templates['5bb4d3a4-64f7-40bc-951a-9090e8448761'] = (function (props) { const currencyFormatter = new Intl.NumberFormat('nl-NL', { style: 'currency', currency: props.spotler.getConfig('currency') || 'EUR', }); function formatCurrency(price) { return currencyFormatter.format(price); } function matchQueryInBold(str) { if (str === undefined) { return ''; } const escapedSearchTerm = props.spotler.getSearchTerm().replace(/([.?*+^$[\]\\(){}|-])/g, "\\$&"); return str.replace(new RegExp(escapedSearchTerm, 'gi'), '$&'); } function triggerChangeView(event, view) { event.preventDefault(); props.spotler.triggerViewChange(view); } function revertToPreviousSuccessfulState() { props.spotler.revertToPreviousSuccessfulState(); } async function SuggestView(props) { const { items, content } = await props.spotler.fetchResults(); return `
Zoeksuggesties
Makita accu
Makita accuboormachine
Makita bithouder
Productsuggesties
${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('')}
`; } async function ItemsView(props) { const { items } = await props.spotler.fetchResults(); 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 `
${items.meta.total === 0 ? ` ${Banners(items?.banners)}

We hebben geen resultaten gevonden

${props.spotler.hasPreviousSuccessfulState() ? ` ` : ``}
` : `
Filter
${ActiveFilters(props.state.datasets['items'], items?.facets)} ${Filters(items?.facets)}
${items?.meta?.total} Producten
Sortering:
${items?.meta?.total} ${items?.meta?.total === 1 ? 'product' : 'producten'}
${Banners(items?.banners)} ${SpellcheckMessage(items?.spellcheck, items?.meta?.total)}
${Items(items?.data)}
`}
`; } function ActiveFilters(dataset, facets) { if (!Array.isArray(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, filterId) { props.spotler.triggerFilterChange(dataset, filterId); } return ` ${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 `
Je zocht naar ${spellcheck.old}, maar wij vonden geen resultaten. Bedoel je misschien ${spellcheck.new}Hiervoor vonden we ${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(''); } function calculateDiscountPercentage(originalPrice, discountedPrice) { if (originalPrice <= 0 || discountedPrice <= 0 || discountedPrice >= originalPrice) { return null; // Handle invalid cases gracefully } let discountAmount = originalPrice - discountedPrice; let discountPercentage = (discountAmount / originalPrice) * 100; return Math.floor(discountPercentage); } function Item(item) { let discountPercentage = null; if (item.properties.double_normal_price && item.properties.double_normal_price !== item.properties.price) { discountPercentage = calculateDiscountPercentage(item.properties.double_normal_price, item.properties.price); } return `
${discountPercentage ? `
${discountPercentage}% korting
`:``} ${item.properties.title}

${props.spotler.getConfig('enableResultItemClick') ? `` : ''} ${item.properties.title}

  • ${item.properties.attributes_usps_usp_1}
  • ${item.properties.attributes_usps_usp_2}
  • ${item.properties.attributes_usps_usp_3}
${item.properties.price || item.properties.double_normal_price ? `

${formatCurrency(item.properties.price)} ${item.properties.double_normal_price ? ` ${formatCurrency(item.properties.double_normal_price)} `:``}

${parseInt(item.properties.stock) >= 1 ? '
Op voorraad
' : '
Binnenkort beschikbaar
'}
`:``}
${getButton(item)}
`; } function getButton(item) { if(parseInt(item.properties.stock) >= 1 ) { return ` ` } else if (item.properties.content_type && item.properties.content_type[0] === 'content') { return ` ` } else { return ` ` } } function renderFilter(facet, children) { // if (facet.id === 206205 && ['bbq','barbeque','barbecue'].indexOf(props.spotler.getSearchTerm().toLowerCase()) !== -1) { // return // } 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 ? 'Bekijk minder' : 'Bekijk 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; const excludeFilters = ["Angus & Oink","Bad Byron’s","Barebones","BBQ","Benegas","Biolite","Bison","Blues Hog","BonFeu","Bowls and Dishes","Butler","Don Marco’s","Excellent Housewar","Feuerhand","Fire & Smoke Society","Fire up","Forged","Goeie Dingen","Grill Fanatics","Heath Riles","Hit","Homey’s","Intco","Jack Daniels","Jealous Devil","Killer Hogs","Koopman","Kosmo’s","Laguiole","Laguiole,Premium Line","Loods Roden","Loot n’ Booty BBQ","Louisiana Grills","Luxury Line","Madame Jeanette Hote Sauce","Madison","Meat Church","Meater","Nachtmann","NomadiQ","Noskos","Noviplast","Outlaw BBQ","Petromax","Pitmaster X","Premium Line","Rijngas","Rock’n’Rubs","Ronneby","Rub Some","Saus.Guru","SenS-Line","Skulls","Smokey Goodness","Smokey Olive Wood","Smokin’ Flavours","Special Shit Big Cock Ranch","Style de vie","Sucklebusters","Sunware","The Spit on Fire","Three Little Pigs","Vaggan","Victorinox","Zeeuwsche Zoute","Smokin' Flavours","Don Marco's","Rock'n' Rubs","Style de Vie","Kosmo’s Q","Bad Byron's","Madame Jeanette Hot Sauce","Homey's","Fire Up","Omnia"]; const searchTerm = props.spotler.getSearchTerm().toLowerCase(); const isExcludedTerm = ['bbq', 'barbeque', 'barbecue'].some(term => searchTerm.includes(term)); return renderFilter(facet, `
${facet.label !== "Kleur" ? facet.values.map((filterValue, index) => ` ${facet.id === 206205 && isExcludedTerm && excludeFilters.some(filter => filterValue.label.includes(filter)) ? `` :`
= facet.result_limit ? 'data-initially-hidden' : ''} class="sqr-flex sqr-items-center ${(!showingMore && index >= facet.result_limit) ? 'sqr-hidden' : ''}">
`} `).join("") : facet.values.map((filterValue, index) => `
= facet.result_limit ? 'data-initially-hidden' : ''} class="sqr-flex sqr-items-center ${(!showingMore && index >= facet.result_limit) ? 'sqr-hidden' : ''}">
`).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) { const filterState = props.state.datasets[facet.dataset].filters?.[facet.id]; return renderFilter(facet, `
tot
`); } function renderFilterLabel(label, prefix, suffix) { const colors = { Beige: "#e8dcca", Antraciet: "#383e42", Blauw: "#6891E8", Bruin: "#674630", Donkerblauw: "#00008B", Donkergroen: "#013220", Geel: "#EADDCA", Grijs: "#959595", Groen: "#689f69", Lichtblauw: "#add8e6", Oranje: "#ffa500", Paars: "#800080", Rood: "#ff0000", Roze: "#ffc0cb", Wit: "#ffffff", Zilver: "#c0c0c0", Zwart: "#000000", Creme: "#f5f5dc", Bordeaux: "#800020", Goud: "#ffd700", Grafietzwart: "#1c1c1c", Khaki: "#f0e68c", Lichtbruin: "#a67b5b", Lichtgrijs: "#d3d3d3", Lichtgroen: "#90ee90", Lichtroze: "#ffb6c1", Mediumblauw: "#0000cd", Taupe: "#483c32", Turquoise: "#40e0d0", "Diverse kleuren": "#ffffff", Donkerbruin: "#654321", Doorzichtig: "#ffffff", Multicolour: "#ffffff", Transparant: "#ffffff", Brons: "#774f2e" }; function getColorValue(colorName) { if (colors.hasOwnProperty(colorName)) { return `
${label}
`; } return label; } return `${prefix ?? ''} ${getColorValue(label)} ${suffix ?? ''}`.trim(); } if (props.state.view === 'items') { return ItemsView(props); } return SuggestView(props); });