${components.Highlight({ hit: item, attribute: 'label', })}
`; }, header({ items, html }) { if (items.length === 0) { return ""; } return html`
Je laatste zoekopdrachten
`; }, }, }; }, }); const redirectUrlPlugin = createRedirectUrlPlugin({ onRedirect(redirects, { event, navigator, state }) { const item = redirects.find(({ sourceId }) => sourceId === "products"); if (item) { const itemUrl = item && item.urls ? item.urls[0] : ''; if (itemUrl) { // Tracking in events.js if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.redirectFromAlgoliaSearch === 'function') { EVENTS_TC.algoliaAutocomplete.redirectFromAlgoliaSearch(item.indexName || "", state.query, itemUrl || ""); } navigator.navigate({ itemUrl, item, state }); } } else { return; } }, }); function createUrl(index, query) { return `/catalog/search?${index}[query]=${query}`; } function getQS(item) { let hl = item._highlightResult; let isHighlighted = hl.query && hl.query.value != ''; if (!isHighlighted) { return item.query } return getQSHighlight(hl); } function getQSHighlight(highlight) { let query = ''; if (highlight.query && highlight.query.value) { let query = highlight.query.value; if (query && query.length > 0) { var startHighlight = "__aa-highlight__"; var endHighlight = "__/aa-highlight__"; var startIndex = query.indexOf(startHighlight); if (startIndex == 0) { // the highlighted word is the first one in the query var n = startIndex + startHighlight.length; //position of the first letter to upper case query = query.substring(0, n) + query[n].toUpperCase() + query.substring(n + 1); // upper case first letter } else { query = query[0].toUpperCase() + query.substring(1); } query = query.replaceAll(startHighlight, "").replaceAll(endHighlight, ""); const sanitizedQuery = DOMPurify.sanitize(query, { ALLOWED_TAGS: ['strong', 'em', 'b', 'i'], ALLOWED_ATTR: [] }); return { __html: sanitizedQuery }; } return { __html: '' }; } else { return { __html: '' }; } } function getQuerySuggestionTemplate(index, item, html) { return html` `; } var querySuggestionsPlugin = null; if (isQuerySuggestionsActive) { querySuggestionsPlugin = createQuerySuggestionsPlugin({ searchClient, indexName: querySuggestionsIndexName, transformSource({ source, onTapAhead }) { return { ...source, onSelect({ item }) { if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.selectQuerySuggestionACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.selectQuerySuggestionACAlgolia(querySuggestionsIndexName, item.query); } }, getItemUrl({ item }) { return createUrl(productsIndexName, item.query); }, templates: { ...source.templates, item(params) { const { item, html } = params; return getQuerySuggestionTemplate(productsIndexName, item, html); }, header({ items, html, state }) { if (items.length === 0) { return ""; } if (isPopularSuggestionsActive) { const hasQuery = state.query !== ''; const title = hasQuery ? 'Zoeksuggesties' : 'Onze populaire zoekopdrachten'; return html`
${title}
`; } else { return html`
Zoeksuggesties
`; } } }, }; } }) } function submitSearch(query, isSeeAll) { let type = !isSeeAll ? 'submit' : 'suggestion'; let value = !isSeeAll ? 'search' : 'all_items'; // Tracking in events.js if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.submitAlgoliaSearch === 'function') { EVENTS_TC.algoliaAutocomplete.submitAlgoliaSearch(productsIndexName, query, type, value); } window.location.href = createUrl(productsIndexName, query); } function sendEvent(productId, disclaimerId, source) { // if disclaimer id = 0 or disclaimers already accepted, workflow continue const disclaimerCookie = $.cookie("disclaimers"); if ((!disclaimerId || disclaimerId === 0) || (disclaimerCookie && disclaimerCookie === "true")) { if (source.toLowerCase() === "showroomprive") { window.location.href = `/ficheproduit.aspx?produit=${productId}`; } else { window.location.href = `/market/catalog/product.aspx?produit=${productId}`; } } else { if (autocompleteInstance && typeof autocompleteInstance.setIsOpen === 'function') { autocompleteInstance.setIsOpen(false); } DisclaimerPopin.OpenPopin(productId, disclaimerId, source); } } function handleProductClick(productId, disclaimerId, source, addToHistory = false) { // Ajouter à l'historique si demandé et si disclaimers OK if (addToHistory) { const disclaimerCookie = $.cookie("disclaimers"); if ((!disclaimerId || disclaimerId === 0) || (disclaimerCookie && disclaimerCookie === "true")) { RecentlyViewedService.getInstance().addProduct(productId, source); } } // Navigation sendEvent(productId, disclaimerId, source); } function handleRecentProductClick(item) { // Tracking spécifique aux produits récemment vus if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onClickProductHistoryACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onClickProductHistoryACAlgolia(mapProductHistoryItem(item), "suggestion", "item"); } // Navigation (sans ajout à l'historique) sendEvent(item.objectID, item.disclaimerId, item.source); } function clearRecentSearches() { if (globalOnRemove) { const recentSearches = localStorage.getItem('AUTOCOMPLETE_RECENT_SEARCHES:RECENT_SEARCH'); if (recentSearches) { try { const searches = JSON.parse(recentSearches); // Supprimer tous les éléments en utilisant la méthode du plugin searches.forEach(search => { globalOnRemove(search.id); }); } catch (e) { // En cas d'erreur de parsing, supprimer complètement localStorage.removeItem('AUTOCOMPLETE_RECENT_SEARCHES:RECENT_SEARCH'); } } } else { // Fallback si globalOnRemove n'est pas disponible localStorage.removeItem('AUTOCOMPLETE_RECENT_SEARCHES:RECENT_SEARCH'); } } function clearRecentlyViewedProducts() { sessionStorage.removeItem('recently_viewed_products'); RecentlyViewedService.getInstance().products = []; RecentlyViewedService.getInstance().cachedProducts = []; RecentlyViewedService.getInstance().lastStorageState = ''; RecentlyViewedService.getInstance().lastCacheTimestamp = 0; // Recharger l'autocomplete const autocompleteInput = document.querySelector('#autocomplete input'); if (autocompleteInput) { autocompleteInput.dispatchEvent(new Event('input', { bubbles: true })); } } function getPriceTemplate(hit, html) { if (hit.discount) { var price = srpFormat.FormatPrice(hit.price); var publicPrice = srpFormat.FormatPrice(hit.publicPrice); return html`
${price}
${publicPrice}
-${hit.discount}%
` } else { var price = srpFormat.FormatPrice(hit.price); return html`
${price}
` } } function handleRedirectFp(disclaimerId, productId, source) { const disclaimerCookie = $.cookie("disclaimers"); if (!disclaimerId || disclaimerId === 0 || (disclaimerCookie && disclaimerCookie === "true")) { if (source.toLowerCase() === "showroomprive") { return `/ficheproduit.aspx?produit=${productId}`; } else { return `/market/catalog/product.aspx?produit=${productId}`; } } else { return '#' } } function mapInsightEventsItemsToProducts(items) { let products = []; for (let i = 0; i < items.length; i++) { let product = { "name": items[i].label, "variantsId": items[i].variants, "id": items[i].objectID, "brand": items[i].brand.label, "saleId": items[i].sale ? items[i].sale.id : null, "price": items[i].price, "position": items[i].__position } products.push(product); } return products; } function mapInsightEventsItemsToSales(items) { let sales = []; for (let i = 0; i < items.length; i++) { let sale = { label: items[i].label, id: items[i].objectID } sales.push(sale); } return sales; } function mapProductHistoryItem(item) { return { "name": item.label, "price": item.price, "variantsId": item.variants, "id": item.objectID, "brand": item.brand.label, } } const algoliaInsightsPlugin = createAlgoliaInsightsPlugin({ aa, onItemsChange({ insights, insightsEvents, state }) { const events = []; insightsEvents.forEach((insightsEvent) => { let index = insightsEvent.index; if (index) { if (index === productsIndexName) { const event = { ...insightsEvent, eventName: 'Items Viewed from Autocomplete', }; events.push(event); let products = mapInsightEventsItemsToProducts(insightsEvent.items); if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onSearchItemACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onSearchItemACAlgolia(productsIndexName, state.query, products); } } if (index === salesIndexName) { const event = { ...insightsEvent, eventName: 'Sales Viewed from Autocomplete', }; events.push(event); let sales = mapInsightEventsItemsToSales(insightsEvent.items); if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onSearchSaleACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onSearchSaleACAlgolia(salesIndexName, state.query, sales); } } } }); insights.viewedObjectIDs(...events); }, onSelect({ insights, insightsEvents, state }) { const events = []; insightsEvents.forEach((insightsEvent) => { let index = insightsEvent.index; if (index) { if (index === productsIndexName) { const event = { ...insightsEvent, eventName: 'Item Selected from Autocomplete', queryId: insightsEvent.queryID }; events.push(event); let itemToTrack = insightsEvent.items.length > 0 ? insightsEvent.items[0] : null; if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onClickItemACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onClickItemACAlgolia(productsIndexName, state.query, itemToTrack); } } if (index === salesIndexName) { const event = { ...insightsEvent, eventName: 'Sale Selected from Autocomplete', queryId: insightsEvent.queryID }; events.push(event); let saleToTrack = insightsEvent.items.length > 0 ? insightsEvent.items[0] : null; if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onClickSaleACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onClickSaleACAlgolia(salesIndexName, state.query, saleToTrack); } } } }); insights.clickedObjectIDsAfterSearch(...events); } }); var plugins = [algoliaInsightsPlugin, redirectUrlPlugin, recentSearchesPlugin]; if (isQuerySuggestionsActive) { plugins.push(querySuggestionsPlugin); } if (isRecentlyViewedActive) { var recentlyViewedPlugin = generateRecentlyViewedPlugin(); plugins.push(recentlyViewedPlugin); } const DEBOUNCE_MS = 200; const debounced = debouncePromise((items) => Promise.resolve(items), DEBOUNCE_MS); function debouncePromise(fn, time) { let timer; return function debounced(...args) { if (timer) { clearTimeout(timer); // Clear the timeout first if it's already defined. } return new Promise((resolve) => { timer = setTimeout(() => resolve(fn(...args)), time); }); }; } const autocompleteInstance = autocomplete({ container: '#autocomplete', placeholder: 'Wat zoek je?', plugins: plugins, openOnFocus: true, insights: true, getSources({ query }) { const sources = [getAlgoliaProducts(query)]; if (isSaleSuggestionsActive) { sources.push(getAlgoliaSales(query)); } return debounced(sources); }, render({ state, elements, render, html }, root) { const { recentSearchesPlugin, products, sales, querySuggestionsPlugin, recentlyViewed } = elements; const currentQuery = state.query; if (isPopularSuggestionsActive) { var recentSearchExists = hasRecentSearchHistory(); var productHistoryExists = hasProductHistory(); var hasQuery = currentQuery !== ''; var displaySales = isSaleSuggestionsActive && hasQuery; var displayQuerySuggestions = isQuerySuggestionsActive && ((!hasQuery && !recentSearchExists) || hasQuery); var displayRecentSearches = !hasQuery && recentSearchExists; var displayProducts = hasQuery || (!hasQuery && !productHistoryExists); var displayRecentlyViewed = isRecentlyViewedActive && !hasQuery && productHistoryExists; render( html`
${displaySales ? sales : ''} ${displayQuerySuggestions ? querySuggestionsPlugin : ''} ${displayRecentSearches ? recentSearchesPlugin : ''}
${displayProducts ? products : ''} ${displayRecentlyViewed ? recentlyViewed : ''}
`, root ); } else { render( html`
${currentQuery !== '' && isSaleSuggestionsActive ? sales : ''} ${currentQuery !== '' && isQuerySuggestionsActive ? querySuggestionsPlugin : ''} ${currentQuery === '' ? recentSearchesPlugin : ''}
${currentQuery !== '' ? products : ''} ${currentQuery === '' && isRecentlyViewedActive ? recentlyViewed : ''}
`, root ); } }, onSubmit: (params) => { const { state } = params; submitSearch(state.query, false) }, classNames: { detachedCancelButton: '', detachedFormContainer: '', detachedContainer: '', detachedOverlay: '', detachedSearchButton: '', detachedSearchButtonIcon: '', detachedSearchButtonPlaceholder: '', detachedSearchButtonQuery: '', form: 'bg-lvl2 js-algolia-form', input: 'champ_mdr main-header__champRecherche__algolia js-input-rch txt-dark', inputWrapper: '', inputWrapperPrefix: 'champ_mdr', inputWrapperSuffix: 'champ_mdr', item: 'd-block col-6 col-l-3', label: '', list: 'grid-row', loadingIndicator: '', panel: 'bg-header', panelLayout: '', clearButton: '', root: '', source: '', sourceFooter: '', sourceHeader: '', sourceNoResults: '', submitButton: '', } }); function getAlgoliaProducts(query) { return { sourceId: 'products', getItems() { return getAlgoliaResults({ searchClient, queries: [ { indexName: productsIndexName, query, params: { ruleContexts: ['enable-redirect-url'], hitsPerPage: 4, clickAnalytics: true, }, }, ], }); }, templates: { item({ item, html }) { // ajoute sur item la vérification qu'il y a bien "m-" devant l'id pour la source marketplace if (item.objectID && !item.objectID.toLowerCase().startsWith('m-') && item.source.toLowerCase() === "marketplace") { item.objectID = `m-${item.objectID}`; } let redirectToFP = handleRedirectFp(item.disclaimerId, item.objectID, item.source); let priceTemplate = getPriceTemplate(item, html); let pictoTemplate = buildProductPictoHtml(item, html); return html`
${item.brand.label}
${item.label}
${priceTemplate}
`; }, header({ items, html, state }) { if (items.length === 0) { return ""; } if (isPopularSuggestionsActive) { const hasQuery = state.query !== ''; const title = hasQuery ? 'Aanbevolen producten' : 'Onze populaire producten'; return html`
${title}
${hasQuery ? html` ` : ''}
`; } else { return html`
Aanbevolen producten
`; } }, } } }; function getAlgoliaSales(query) { return { sourceId: 'sales', getItems() { return getAlgoliaResults({ searchClient, queries: [ { indexName: salesIndexName, query, params: { ruleContexts: ['enable-redirect-url'], hitsPerPage: 4, clickAnalytics: true }, }, ], }); }, templates: { item({ item, html, components }) { return html`
${buildSaleImageHtml(item, html)}
`; }, header({ items, html }) { if (items.length === 0) { return ""; } return html`
Onze sales van dit moment
`; }, } } } // Fonction pour construire une URL avec des paramètres de requête function buildUrlWithQueryParams(baseUrl, params) { if (!baseUrl) return ''; const url = new URL(baseUrl, window.location.origin); Object.keys(params).forEach(key => { url.searchParams.set(key, params[key]); }); return url.toString(); } // Fonction pour générer le HTML picture d'un produit function buildProductImageHtml(item, html) { const altText = item.label || 'Produit'; if (!item.images || !item.images[0]) { // Pas d'image mais on garde la structure avec alt descriptif return html` ${altText} `; } const webp320 = buildUrlWithQueryParams(item.images[0], { width: "320", quality: "90", output: "webp" }); const webp640 = buildUrlWithQueryParams(item.images[0], { width: "640", quality: "90", output: "webp" }); const jpg320 = buildUrlWithQueryParams(item.images[0], { width: "320", quality: "90", output: "jpg" }); const jpg640 = buildUrlWithQueryParams(item.images[0], { width: "640", quality: "90", output: "jpg" }); const jpgImg = buildUrlWithQueryParams(item.images[0], { width: "320", quality: "90", output: "jpg" }); return html` ${altText} `; } // Fonction pour générer le HTML picture d'une vente function buildSaleImageHtml(item, html) { const altText = item.label || 'Vente'; if (!item.cardMediaUrl) { // Pas d'image mais on garde la structure avec alt descriptif return html` ${altText} `; } const webp420 = buildUrlWithQueryParams(item.cardMediaUrl, { width: "420", quality: "90", output: "webp" }); const webp840 = buildUrlWithQueryParams(item.cardMediaUrl, { width: "840", quality: "90", output: "webp" }); const jpg420 = buildUrlWithQueryParams(item.cardMediaUrl, { width: "420", quality: "90", output: "jpg" }); const jpg840 = buildUrlWithQueryParams(item.cardMediaUrl, { width: "840", quality: "90", output: "jpg" }); const jpgImg = buildUrlWithQueryParams(item.cardMediaUrl, { width: "420", quality: "90", output: "jpg" }); return html` ${altText} `; } // Fonction pour générer le HTML du picto d'un produit function buildProductPictoHtml(item, html) { if (!item.pictos || !item.pictos.length || !item.pictos[0] || !item.pictos[0].url) { return ''; } const altText = item.pictos[0].label || ''; return html`
${item.pictos[0].label}
`; } const STORAGE_KEY = 'recently_viewed_products'; const MAX_ITEMS = 4; const CACHE_INVALIDATION_INTERVAL = 2 * 60 * 1000; // 2 minutes en millisecondes // Dépendances externes à injecter ou à adapter selon votre projet (function (global) { function RecentlyViewedService() { if (RecentlyViewedService._instance) { return RecentlyViewedService._instance; } this.products = []; this.cachedProducts = []; this.lastStorageState = ''; this.cacheInvalidationInterval = null; this.lastCacheTimestamp = 0; this.abortController = null; this.loadFromStorage(); this.startCacheInvalidation(); RecentlyViewedService._instance = this; } RecentlyViewedService.prototype.startCacheInvalidation = function () { if (this.cacheInvalidationInterval) { clearInterval(this.cacheInvalidationInterval); } this.cacheInvalidationInterval = window.setInterval(() => { this.cachedProducts = []; this.lastCacheTimestamp = 0; }, CACHE_INVALIDATION_INTERVAL); }; RecentlyViewedService.prototype.loadFromStorage = function () { const stored = sessionStorage.getItem(STORAGE_KEY); if (stored) { this.products = JSON.parse(stored); this.lastStorageState = stored; } }; RecentlyViewedService.prototype.saveToStorage = function () { const newState = JSON.stringify(this.products); sessionStorage.setItem(STORAGE_KEY, newState); this.lastStorageState = newState; this.cachedProducts = []; this.lastCacheTimestamp = 0; }; RecentlyViewedService.prototype.addProduct = function (id, source) { this.products = this.products.filter(function (p) { return p.id !== id; }); this.products.unshift({ id: id, source: source }); this.products = this.products.slice(0, MAX_ITEMS); this.saveToStorage(); }; RecentlyViewedService.prototype.getRecentProducts = function () { return this.products.slice(); }; RecentlyViewedService.prototype.hasStorageChanged = function () { const currentState = sessionStorage.getItem(STORAGE_KEY); return currentState !== this.lastStorageState; }; RecentlyViewedService.prototype.fetchProductsDetails = async function () { // Annuler l'appel précédent s'il existe if (this.abortController) { this.abortController.abort(); } this.abortController = new AbortController(); try { const queryParams = encodeURIComponent(JSON.stringify(this.products)); const response = await fetch( document.location.origin + '/api/products/list?products=' + queryParams, { signal: this.abortController.signal } ); if (!response.ok) { throw new Error('Network response was not ok'); } const apiResponse = await response.json(); // Correction ici : utiliser .data si présent, sinon le tableau directement const products = apiResponse.status != null && apiResponse.status.code == 200 ? apiResponse.data : []; this.cachedProducts = Array.isArray(products) ? products.map(function (product) { const hit = {}; Object.assign(hit, product); return hit; }) : []; this.lastCacheTimestamp = Date.now(); this.lastStorageState = JSON.stringify(this.products); if (this.cachedProducts.length > 0) { let trackedProducts = mapInsightEventsItemsToProducts(this.cachedProducts); if (EVENTS_TC && EVENTS_TC.algoliaAutocomplete && typeof EVENTS_TC.algoliaAutocomplete.onSearchProductHistoryACAlgolia === 'function') { EVENTS_TC.algoliaAutocomplete.onSearchProductHistoryACAlgolia(trackedProducts, "suggestion", "item_view"); } } return this.cachedProducts; } catch (error) { if (error instanceof Error && error.name === 'AbortError') { return []; } // En cas d'erreur, on retourne un tableau vide au lieu de relancer l'erreur // Cela évite que l'autocomplete réessaie automatiquement // On invalide le cache pour éviter les appels répétés this.cachedProducts = []; this.lastCacheTimestamp = 0; return []; } finally { this.abortController = null; } }; RecentlyViewedService.prototype.getRecentProductsDetails = async function () { if (this.products.length === 0) { return []; } const now = Date.now(); const isCacheExpired = now - this.lastCacheTimestamp > CACHE_INVALIDATION_INTERVAL; if (this.hasStorageChanged() || isCacheExpired || this.cachedProducts.length === 0) { try { return await this.fetchProductsDetails(); } catch (error) { // En cas d'erreur, on retourne le cache existant ou un tableau vide return this.cachedProducts.length > 0 ? this.cachedProducts.slice() : []; } } return this.cachedProducts.slice(); }; RecentlyViewedService.prototype.destroy = function () { if (this.cacheInvalidationInterval) { clearInterval(this.cacheInvalidationInterval); this.cacheInvalidationInterval = null; } if (this.abortController) { this.abortController.abort(); this.abortController = null; } }; // Singleton accessor RecentlyViewedService.getInstance = function () { return new RecentlyViewedService(); }; // Export global global.RecentlyViewedService = RecentlyViewedService; })(typeof window !== 'undefined' ? window : this); function generateRecentlyViewedPlugin() { return { name: 'recentlyViewed', getSources() { return [ { sourceId: 'recentlyViewed', async getItems() { var recentlyViewedService = RecentlyViewedService.getInstance(); return recentlyViewedService.getRecentProductsDetails(); }, templates: { header({ items, html }) { if (items.length === 0) { return ""; } return html`
Laatst bekeken producten
`; }, item({ item, html, state }) { // ajoute sur item la vérification qu'il y a bien "m-" devant l'id pour la source marketplace if (item.objectID && !item.objectID.toLowerCase().startsWith('m-') && item.source.toLowerCase() === "marketplace") { item.objectID = `m-${item.objectID}`; } var collection = (state.collections.find(function (c) { return c.source.sourceId === 'recentlyViewed'; }) || {}).items; var position = collection ? collection.indexOf(item) : -1; let redirectToFP = handleRedirectFp(item.disclaimerId, item.objectID, item.source); let priceTemplate = getPriceTemplate(item, html); let pictoTemplate = buildProductPictoHtml(item, html); return html`
${item.brand.label}
${item.label}
${priceTemplate}
`; } } } ]; } } } function hasRecentSearchHistory() { const recentSearches = localStorage.getItem('AUTOCOMPLETE_RECENT_SEARCHES:RECENT_SEARCH'); if (!recentSearches) return false; try { const searches = JSON.parse(recentSearches); return Array.isArray(searches) && searches.length > 0; } catch (e) { return false; } } function hasProductHistory() { try { const service = window.RecentlyViewedService.getInstance(); return Array.isArray(service.cachedProducts) && service.cachedProducts.length > 0; } catch (e) { return false; } } // Export global si besoin if (typeof window !== 'undefined') { window.generateRecentlyViewedPlugin = generateRecentlyViewedPlugin; }
Showroomprivé neemt jouw privacy serieus
Showroomprive.com gebruikt cookies en gelijksoortige technologieën om het browsen te analyseren, om de doelgroep en de prestaties te meten en om je, samen met onze partners, voor op jou afgestemde advertenties te laten zien. Door op ’Accepteer’ te klikken, stem je ermee in dat deze cookies worden opgeslagen en in het bijzonder dat deze informatie wordt gedeeld met onze partners. Door op ’Weiger’ te klikken ontvang je geen persoonlijke inhoud en alleen noodzakelijke cookies voor een goede werking van de site. Door op ’Stel je keuze in’ te kiezen kun je je voorkeuren instellen en meer informatie verkrijgen. Je kunt tevens je instellingen op elk moment wijzigen (bij de rubriek ‘Mijn gegevens’). Ga naar ici voor meer informatie over het verzamelen van gegevens en het gebruik ervan.
Accepteer
Weiger