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 ? `
` : ''}
${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(() => (`
`)).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 `
${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();
});