Skip to main content

Programming

DPCalendar upcoming events module
Pagination and back/next buttons

To be able to use the regular Upcoming Events module of DPCalendar without limiting the amount of events displaying in the module, I wrote a custom solution to «divide» the entries into pages.

  • When more than 5 (or n) events are present, the previous/next-buttons and the pagination appear.
  • When less than 5 (or n) events are present, the respective buttons/pagination don't show up.
  • On the first page, the previous-button doesn't show up.
  • On the last page, the next-button doesn't show up.

Main function (Javascript):

Use the following script/functions in a HTML-Block AFTER the DPCalendar Upcoming Events Module.

1. Define the variables

    var elements = document.querySelectorAll('.dp-event').length;
    var current_page = 1;
	var records_per_page = 5; //desired number of entries on one page

2. Function to count the number of pages

function numPages() {
	return Math.ceil(elements / records_per_page);
}

3. Function previous-page/button

function prevPage() {
	var records_per_page = 5;  //desired number of entries on one page
    if (current_page > 1) {
        current_page--;
        changePage(current_page);
		var start = ((records_per_page * current_page) - records_per_page);
		var end = (start + records_per_page);
		$('.dp-event').addClass('uk-hidden');
		$('.dp-event').slice(start, end).removeClass('uk-hidden');
    }
}

4. Function for the next-page/button

function nextPage() {   
	var records_per_page = 5;  //desired number of entries on one page
    if (current_page < numPages()) {
        current_page++;
        changePage(current_page);
    }
    if (current_page == 1) {
    var start = 0;
	$('.dp-event').slice(0, records_per_page).removeClass('uk-hidden');
    }
    if (current_page > 1) {
        var start = ((current_page - 1) * records_per_page);
        var end = (start + records_per_page);
        $('.dp-event').addClass('uk-hidden');
        $('.dp-event').slice(start, end).removeClass('uk-hidden');
    }
}

5. Function to change the page

function changePage(page)
{
    var btn_next = document.getElementById("btn_next");
    var btn_prev = document.getElementById("btn_prev");
	var page_span = document.getElementById("page");
 
    // Validate page
    if (page < 1) page = 1;
    if (page > numPages()) page = numPages();
	page_span.innerHTML = page + "/" + numPages();
    if (page == 1) {
        btn_prev.style.visibility = "hidden";
    } else {
        btn_prev.style.visibility = "visible";
    }

    if (page == numPages()) {
        btn_next.style.visibility = "hidden";
    } else {
        btn_next.style.visibility = "visible";
    }
    
    if (numPages() <= 1) {
        $('#pages').addClass('uk-hidden');
    }
}

6. BEFORE the DPCalendar module, we need to enter the following in order to hide all entries with class = .dp-event

<script>
	jQuery(function($) {
		$('.dp-event').addClass('uk-hidden');
	}); 
</script>

7. Additional function AFTER the DPCalendar module to set page=1 when loading the website AND to show (unhide) the first n entries/the first page.

<script>
    $(document).ready(function() {
    changePage(1);
    $('.dp-event').slice(0, 5).removeClass('uk-hidden');
	});
</script>

8. AFTER the DPCalendar module, add the desired HTML for the buttons/pagination, example (UIkit/YOOtheme Pro):

<div class="uk-flex-middle uk-grid uk-margin-small-top" uk-grid>
    <div class="uk-width-expand">
        <a class="uk-button uk-button-secondary" href="javascript:prevPage()" id="btn_prev">vorherige</a>
<a class="uk-button uk-button-secondary uk-margin-small-left" href="javascript:nextPage()" id="btn_next">nächste</a>
        </div>
    <div id="pages"><p class="uk-text-small"><strong>Seite <span id="page"></span></strong></p>
        </div>
    </div>
We use cookies
We use cookies on our website. Some of them are essential for the operation of the site, while others help us to improve this site and the user experience. You can decide whether you want to allow cookies or not. Please note that if you reject them, you may not be able to use all the functionalities of the site.