PageSourceSearch

https://www.peelenmaas.nl/framework/js/Search/components/pagination.js

js peelenmaas.nl collected 2026-10-01 12:18:05 UTC 2,717 bytes, 70 lines download raw bytes

1// https://www.algolia.com/doc/api-reference/widgets/pagination/js/#connector
2// Create the render function
3const renderPagination = (renderOptions, isFirstRender) => {
4    const {
5        pages,
6        currentRefinement,
7        nbPages,
8        isFirstPage,
9        isLastPage,
10        refine,
11        widgetParams,
12        createURL,
13    } = renderOptions;
14
15    const createPageEntry = (pageIndex, isCurrent) => {
16        return `
17<li>
18<a href="${createURL(pageIndex)}" data-value="${pageIndex}" class="paging__page ${isCurrent ? `paging__page--active` : ''}" 
19${isCurrent ? `aria-current="page" aria-label="${translator.translate('search.pagination.page')} ${pageIndex + 1}"` : ''}>
20${!isCurrent ? `<span class="sr-only">${translator.translate('search.pagination.page')}&nbsp;</span>` : ''} ${pageIndex + 1}</a></li>`;
21    }
22
23    const threeDots = '…';
24    const translator = widgetParams.translator;
25
26    if (nbPages > 1) {
27        widgetParams.container.innerHTML = `
28<nav class="paging" aria-label="${translator.translate('search.pagination.pagination')}">
29<ul class="paging__pages">
30
31<li class="paging__prev-wrapper">
32${ !isFirstPage ? `
33    <a href="${createURL(currentRefinement - 1)}" data-value="${currentRefinement - 1}" class="paging__prev" title="${translator.translate('search.pagination.previous_page')}">${widgetParams.previousWidget()}</a>
34` : `` }
35</li>
36
37    ${ (pages.length > 0 && pages[0] !== 0) ? createPageEntry(0, false) : `` }
38    ${ (pages.length > 0 && pages[0] > 1) ? `<li><span class="paging__more">${threeDots}</span></li>` : ``}
39    
40    ${ pages.map(page => createPageEntry(page, currentRefinement === page)).join('')}
41    ${ (pages.length > 0 && pages[pages.length - 1] <= nbPages - 3) ? `<li><span class="paging__more">${threeDots}</span></li>` : ``}
42    ${ (pages.length > 0 && pages[pages.length - 1] !== nbPages - 1) ? createPageEntry(nbPages - 1, false) : `` }
43    
44<li class="paging__next-wrapper">
45${ !isLastPage ? `
46    <a href="${createURL(currentRefinement + 1)}" data-value="${currentRefinement + 1}" class="paging__next" title="${translator.translate('search.pagination.next_page')}">${widgetParams.nextWidget()}</a>
47` : `` }
48</li>
49
50</ul>
51</nav>
52`;
53    } else {
54        widgetParams.container.innerHTML = ``;
55    }
56
57    [...widgetParams.container.querySelectorAll('a')].forEach(element => {
58        element.addEventListener('click', event => {
59            event.preventDefault();
60            refine(event.currentTarget.dataset.value);
61
62            widgetParams.paginationClick();
63        });
64    });
65};
66
67// Create the custom widget
68export const customPagination = window.instantsearch ? instantsearch.connectors.connectPagination(
69    renderPagination
70) : () => null;

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.