123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- <template>
- <div>
- <nav>
- <ul class="pagination">
- <li class="page-item" v-if="isPreviousButtonDisabled" @click="previousPage">
- <a class="page-link" aria-label="Previous">
- <span aria-hidden="true">«</span>
- <span class="sr-only">Previous</span>
- </a>
- </li>
- <li class="page-item" v-for="item in paginationItems" :key="item">
- <BasePaginationItem
- :pageNumber="item"
- :isCurrentPage="item === currentPage"
- @loadPage="onLoadPage"
- />
- </li>
- <li class="page-item" v-if="isNextButtonDisabled" @click="nextPage">
- <a class="page-link" aria-label="Next">
- <span aria-hidden="true">»</span>
- <span class="sr-only">Next</span>
- </a>
- </li>
- </ul>
- </nav>
- </div>
- </template>
- <script>
- import BasePaginationItem from "./basePaginationItem.vue";
-
- export default {
- components: {
- BasePaginationItem
- },
- props: {
- visiblePagesCount: {
- type: Number,
- default: 5
- },
- currentPage: {
- type: Number,
- required: true
- },
- pageCount: {
- type: Number,
- required: true
- }
- },
- computed: {
- isPreviousButtonDisabled() {
- return this.currentPage !== 1;
- },
- isNextButtonDisabled() {
- return this.currentPage !== this.pageCount;
- },
- paginationItems() {
- const { currentPage } = this;
- const { pageCount } = this;
- const { visiblePagesCount } = this;
- let pagintationItemsArray = [];
- if (pageCount <= visiblePagesCount) {
- let count = 1;
- while (count <= pageCount) {
- pagintationItemsArray.push(count);
- count += 1;
- }
- return pagintationItemsArray;
- }
- const visiblePagesThreshold = (visiblePagesCount - 1) / 2;
- pagintationItemsArray = Array(this.visiblePagesCount - 1).fill(0);
- if (currentPage <= visiblePagesThreshold + 1) {
- pagintationItemsArray[0] = 1;
- const pagintationItems = pagintationItemsArray.map(
- (paginationTrigger, index) => pagintationItemsArray[0] + index
- );
- pagintationItems.push(pageCount);
- return pagintationItems;
- }
- if (currentPage >= pageCount - visiblePagesThreshold + 1) {
- const pagintationItems = pagintationItemsArray.map(
- (paginationTrigger, index) => pageCount - index
- );
- pagintationItems.reverse().unshift(1);
- return pagintationItems;
- }
- pagintationItemsArray[0] = currentPage - visiblePagesThreshold + 1;
- const pagintationItems = pagintationItemsArray.map(
- (paginationTrigger, index) => pagintationItemsArray[0] + index
- );
- pagintationItems.unshift(1);
- pagintationItems[pagintationItems.length - 1] = pageCount;
- return pagintationItems;
- }
- },
- methods: {
- onLoadPage(value) {
- this.$emit("loadPage", value);
- },
- nextPage() {
- this.$emit("nextPage");
- },
- previousPage() {
- this.$emit("previousPage");
- }
- }
- };
- </script>
|