globalThis.spotler_search_templates = globalThis.spotler_search_templates || {};
globalThis.spotler_search_templates['d024914b-c005-4a6b-9df1-2023744438c7'] = (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 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 `
${items?.meta?.total} ${
items?.meta?.total === 1 ? "resultaat" : "resultaten"
}
`;
}
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
`;
}
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("");
}
function Item(item) {
return `
${renderPrice(item)}
(00,00 incl.btw)
`;
}
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 `
${price}
${formatCurrency(discountedPrice)}
`;
}
return `
${formatCurrency(price)}
`;
}
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);
element.classList.toggle('sqr-rotate');
filterState.collapsed = active;
}
function removeFilter(event, dataset, name) {
event.preventDefault();
console.log('removeFilter', dataset, name, event);
props.spotler.triggerFilterChange(dataset, name);
}
return `
`;
}
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 ? "Show fewer" : "Show more";
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 sqr-mb-4 sqr-pl-3 ${
!showingMore && index >= facet.result_limit
? "sqr-hidden"
: ""
}">
${renderFilterLabel(
filterValue.label,
facet.prefix,
facet.suffix
)}
(${filterValue.count})
`
)
.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 ?? ""}
tot
${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);
});