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 `
Toont alle ${items?.meta?.total} ${items?.meta?.total === 1 ? "product" : "producten"}
Relevantie
${items?.sort_fields ?.map( (sortField) => `
${sortField.label}
`).join("")}
Close modal
`;
}
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 `
Relevantie
${items?.sort_fields ?.map( (sortField) => `
${sortField.label}
`).join("")}
Close modal
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 `
`;
}
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
Wis alle filters
${filters.map(ActiveFilter).join("")}
`;
}
function ActiveFilter(filter) {
function removeFilter(event, dataset, name) {
props.spotler.triggerFilterChange(dataset, name);
}
return `
${filter.label}: ${filter.value}
Remove badge
`;
}
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 `
//
//
//
//
//
//
//
//
//
//
//
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.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(price)}
${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 `
${facet.label}
${children}
`;
}
function renderSelectFilter(facet) {
return renderFilter(facet,`
Choose
${facet.values.map((filterValue) => `
${renderFilterLabel(filterValue.label, facet.prefix, facet.suffix )} (${filterValue.count})
`).join("")}
`);
}
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]"
>
${renderFilterLabel(filterValue.label, facet.prefix, facet.suffix )}
`).join("")
}
${ hasMoreValues ? `
${showingMore ? "Toon minder" : "Toon meer"}
` : ""
}
`);
}
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) => `
${renderFilterLabel(filterValue.label, facet.prefix, facet.suffix)}
${filterValue.count}
`).join("")
}
${hasMoreValues ? `
${showingMore ? "Toon minder" : "Toon meer"}
` : ""
}
`);
}
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);
});