Paginator

Paginator displays data in paged format and provides navigation between pages.


npx volt-vue add Paginator


import Paginator from '@/volt/Paginator.vue';

The Paginator is a headless component to design a fully customized user interface using the container template. The default UI displays page navigation and page links.


<template>
    <div class="card">
        <Paginator :rows="10" :totalRecords="120" />
    </div>
</template>

<script setup lang="ts">
import Paginator from '@/volt/Paginator.vue';
</script>

A customized paginator with an alternative user interface.


<template>
    <Paginator :rows="10" :totalRecords="120">
        <template #container="{ first, rows, page, pageCount, pageLinks, totalRecords, prevPageCallback, nextPageCallback, rowChangeCallback }">
            <div class="flex flex-col sm:flex-row gap-4 items-center border rounded-4xl border-surface py-2 px-4">
                <Button icon="pi pi-search" rounded pt:root="hidden sm:inline-flex" />
                <div class="flex grow-1 justify-center items-center gap-2">
                    <SecondaryButton text rounded @click="prevPageCallback" :disabled="page === 0">
                        <template #icon>
                            <AngleLeftIcon />
                        </template>
                    </SecondaryButton>
                    <div class="text-center text-surface-500 dark:text-surface-400">{{ page + 1 }} of {{ pageCount }}</div>
                    <SecondaryButton text rounded @click="nextPageCallback" :disabled="page === pageCount - 1">
                        <template #icon>
                            <AngleRightIcon />
                        </template>
                    </SecondaryButton>
                </div>
                <div class="flex gap-2 items-center">
                    <span class="select-none w-32 text-end">{{ first }} - {{ first - 1 + rows }} of {{ totalRecords }}</span>
                    <Select :modelValue="rows" :options="rowsPerPage" optionLabel="name" optionValue="value" pt:label="pe-2" pt:dropdown="w-8" @change="(event) => rowChangeCallback(event.value)" />
                </div>
            </div>
        </template>
    </Paginator>
</template>

<script setup lang="ts">
import Button from '@/volt/Button.vue';
import SecondaryButton from '@/volt/SecondaryButton.vue';
import Paginator from '@/volt/Paginator.vue';
import Select from '@/volt/Select.vue';
import AngleLeftIcon from '@primevue/icons/angleleft';
import AngleRightIcon from '@primevue/icons/angleright';
import { ref } from 'vue';

const rowsPerPage = ref([
    { name: '10', value: 10 },
    { name: '20', value: 20 },
    { name: '40', value: 40 }
]);
</script>