globalThis.spotler_search_templates = globalThis.spotler_search_templates || {}; globalThis.spotler_search_templates['b35a4a6a-b901-438f-8d4c-7755ad50dcce'] = (function (props) { const [state, setState] = props.useState({ mobileView: 'results', tileLayout: props.getConfig('defaultTileLayout'), facets: [], }); const currencyFormatter = new Intl.NumberFormat('nl-NL', { style: 'currency', currency: props.getConfig('currency') || 'EUR', }); function formatCurrency(price) { return currencyFormatter.format(price); } function matchQueryInBold(str) { if (str === undefined) { return ''; } const escapedSearchTerm = props.getSearchTerm().replace(/([.?*+^$[\]\\(){}|-])/g, "\\$&"); return str.replace(new RegExp(escapedSearchTerm, 'gi'), '$&'); } function escapeHtml(str) { const entityMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/', '`': '`', '=': '=', }; return str.replace(/[&<>"'`=/]/g, (s) => entityMap[s]); } async function SuggestView() { const { data, error, isFetching } = props.useSpotlerQuery(); if (isFetching && !data) { return `
`; } return `
Zoeksuggesties
Makita accu
Makita accuboormachine
Makita bithouder
Itemsuggesties
${data.items.data?.map(item => `
${matchQueryInBold(item.properties.title)}
★★★★☆53 reviews
€299
${formatCurrency(item.properties.price)}
`).join("")}
Meer informatie
${data.content.data?.map(content => `
${matchQueryInBold(content.properties.title)}
`).join('')}
`; } async function ItemsView() { const { data, error, hasNextPage, fetchNextPage, isFetching, isFetchingNextPage, hasLastSuccessfulState, revertToLastSuccessfulState } = props.useSpotlerInfiniteQuery('items', { onSuccess: (data) => { setState('facets', (prev) => data.facets.map(facet => { const prevFacet = prev?.find(f => f.id === facet.id); return { ...facet, collapsed: prevFacet?.collapsed ?? facet.is_default_collapsed, showing_more: prevFacet?.showing_more ?? false, } })) if (props.getConfig('autoScrollToTop')) { props.scrollToTop(); } } }); if (isFetching && !data.pages.length) { //return ItemsViewSkeleton(); return `
`; } const items = data.pages[0]; const tileLayoutClasses = { detail: 'sqr-grid-cols-2 sqr-gap-x-4 tablet:sqr-grid-cols-3 desktop:sqr-grid-cols-4', list: 'sqr-grid-cols-1', grid: 'sqr-grid-cols-2 sqr-gap-x-4 tablet:sqr-grid-cols-3 desktop:sqr-grid-cols-4', } return `
${items.meta.total === 0 ? `

Helaas...

Uw zoekopdracht op "${props.getSearchTerm()}" gaf geen resultaten terug.

${hasLastSuccessfulState ? `

` : ``}
`:`
${isFetching ? `
Loading...
` : ''}
${Banners(items?.banners)}
${SpellcheckMessage(items?.spellcheck, items?.meta?.total)}
    ${data.pages.map((page) => Items(page.data)).join('')}
${items.meta.total > 5 ? ` Bekijk alle zoekresultaten `:''}
`}
`; } function ItemsViewSkeleton() { return `
${Array(2).fill().map(() => (`
${Array(8).fill().map(() => (`
`)).join('')}
`)).join('')} ${props.t('loading')}
${Array(12).fill().map(() => (`
${props.t('loading')}
`)).join('')}
`; } function LayoutButtons() { return ''; return `
` } function ActiveFilters(filters, facets) { if (!Array.isArray(filters) || filters.length === 0) { return ''; } const convertedFilters = []; for (const filter of filters) { const facet = facets.find(f => f.name === filter.field); if (!facet) { continue; } switch (facet.type) { case 'dualslider': convertedFilters.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': convertedFilters.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: convertedFilters.push({ name: facet.name, label: facet.label, value: renderFilterLabel(filter.value, facet.prefix, facet.suffix) }); } } if (convertedFilters.length === 0) { return ''; } return `

${props.t('chosen_filters')}

${convertedFilters.map(ActiveFilter).join('')}
`; } function ActiveFilter(filter) { return ` ${filter.label}: ${filter.value} `; } function Facets(facets) { return facets?.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 `
${props.t('spellcheck_results', { old: spellcheck.old, new: spellcheck.new, count: total })}
`; } function Banners(banners) { if (!Array.isArray(banners) || banners.length === 0) { return ''; } const banner = banners[0]; 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 ` props.sendEvent('banner', banner), banner[type])}> `; } return ` props.sendEvent('banner', banner), banner[type])} class="sqr-w-full ${mediaClasses}" src="${banner[type].image}" />`; } function Items(items) { return items?.map((item, index) => Item({ ...item, index })).join(''); } function Item(item) { const tileLayoutClasses = { detail: '', list: { container: 'sqr-flex sqr-gap-x-2', image: 'sqr-grow-0 sqr-max-h-32', content: 'sqr-grow', }, grid: { container: 'sqr-flex-col', image: 'sqr-max-h-60 sqr-w-full tablet:sqr-h-60', content: 'sqr-mt-4 sqr-h-[100px]', }, } const layout = tileLayoutClasses[state.tileLayout] return `
  • props.sendEvent('click', item), item)} href="${item.properties.detail_url}?sqr=${props.getSearchTerm()}" class="[overflow-wrap:anywhere]"> ${item.properties.title}

    ${item.properties.type ? ` ${item.properties.type[0]} `:``} ${item.properties.text_text ? matchQueryInBold(item.properties.text_text[0]): ''}
  • `; } 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(price)}

    ${formatCurrency(discountedPrice)}

    `; } return `

    ${formatCurrency(price)}

    `; } function renderFilter(facet, children) { return `
    ${children}
    `; } function renderSelectFilter(facet) { return renderFilter(facet, `
    `); } function renderMultiSelectFilter(facet) { const hasMoreValues = facet.values.length > facet.result_limit; const filterValues = props.getFilterValue(facet.dataset, facet.name) || []; return renderFilter(facet, `
    ${facet.searchable ? `
    ` : ''} ${facet.values.map((filterValue, index) => `
    = facet.result_limit ? 'data-initially-hidden' : ''} class="sqr-flex sqr-items-center ${(!facet.showing_more && index >= facet.result_limit) ? 'sqr-hidden' : ''}"> props.toggleFilterValue(dataset, name, value), facet.dataset, facet.name, filterValue.value)} > ${filterValue.count}
    `).join("")} ${hasMoreValues ? ` ` : ''}
    `); } function renderRadioFilter(facet) { const hasMoreValues = facet.values.length > facet.result_limit; return renderFilter(facet, `
    ${facet.values.map((filterValue) => `
    props.setFilterValue(dataset, name, value), facet.dataset, facet.name, filterValue.value)} > ${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 (state.view === 'suggest') { return SuggestView(); } return ItemsView(); });