Вызов
<template>
<div>
<div class="feedback-block">
<button class="btn btn-primary col-md-3" @click="toggleModal">Создать новое обращение</button>
<br><br>
<div class="mess">
<div class="mess-item" v-for="todo in laravelData.data">
<div class="mess-item-left">
<div class="mess-date">{{ todo.date }}</div>
<div class="mess-new" v-if="todo.messagesNew > 0">
Новых сообщений: {{ todo.messagesNew }}
</div>
<div class="mess-total" v-else>Сообщений: {{ todo.messagesTotal }}</div>
</div>
<div class="mess-item-right">
<router-link tag="div" class="mess-tema" exact-active-class="active" to="feedback/messages">
{{ todo.tema }}
</router-link>
<div class="mess-text">{{ todo.text }}</div>
</div>
</div>
</div>
<Paginator :data="laravelData" :limit="3" @pagination-change-page="getResults"></Paginator>
</div>
<modal title="НОВОЕ ОБРАЩЕНИЕ" :visible="modalVisible" v-if="modalVisible" v-on:closeModal="modalVisible = false">
<modal-create></modal-create>
</modal>
</div>
</template>
<script>
import Modal from '../../../_partials/Modal';
import Paginator from '../../../_partials/Paginator';
import ModalCreate from './ModalCreate';
import axios from 'axios';
export default {
components: {
Modal,
Paginator,
ModalCreate,
axios,
},
mounted() {
// Fetch initial results
var queryDict = {}
location.hash.substr(location.hash.indexOf("?")+1).split("&")
.forEach(function(item) {queryDict[item.split("=")[0]] = item.split("=")[1]});
if (parseInt(queryDict.page)) this.getResults(queryDict.page);
else this.getResults();
},
methods: {
toggleModal() {
this.modalVisible = !this.modalVisible;
},
// Our method to GET results from a Laravel endpoint
getResults(page = 1) {
axios.get('/api.php/?page=' + page)
.then(response => {
this.laravelData = response.data;
});
},
},
data() {
return {
// Our data object that holds the Laravel paginator data
laravelData: {},
modalVisible: false,
}
},
props: ['initial'],
};
</script>
Компонент
<template>
<div>
<div class="mypagination" v-if="data.total > data.per_page">
<a class=""
v-if="data.current_page !=1"
@click.prevent="selectPage(1)"
> Первая </a>
<a class="prev"
v-if="data.current_page !=1"
@click.prevent="selectPage(--data.current_page)"
>
<slot name="prev-nav">Предыдущая <span class="left-arrow">←</span></slot>
</a>
<a v-for="n in getPages()"
:class="{ 'active': n == data.current_page }"
@click.prevent="selectPage(n)"
>{{ n }}</a>
<a class="next"
v-if="data.current_page !=data.last_page"
@click.prevent="selectPage(++data.current_page)"
>
<slot name="next-nav">Следующая <span class="rigth-arrow">→</span></slot>
</a>
<a class=""
v-if="data.current_page !=data.last_page"
@click.prevent="selectPage(data.last_page)"
>
Последняя (<b>{{ data.last_page }}</b>)
</a>
</div>
<span v-else=""> Нет данных </span>
</div>
</template>
<script>
var updateQueryStringParam = function (key, value) {
if (location.hash.indexOf("?")!=-1)
var hash = location.hash.substr(0, location.hash.indexOf("?"));
else var hash = location.hash;
var baseUrl = [location.protocol, '//', location.host, location.pathname, hash ].join(''),
urlQueryString = document.location.search,
newParam = key + '=' + value,
params = '?' + newParam;
// If the "search" string exists, then build params from it
if (urlQueryString) {
let keyRegex = new RegExp('([\?&])' + key + '[^&]*');
// If param exists already, update it
if (urlQueryString.match(keyRegex) !== null) {
params = urlQueryString.replace(keyRegex, "$1" + newParam);
} else { // Otherwise, add it to end of query string
params = urlQueryString + '&' + newParam;
}
}
window.history.replaceState({}, "", baseUrl + params);
};
export default {
props: {
data: {
type: Object,
default: function() {
return {
current_page: 1,
data: [],
from: 1,
last_page: 15,
next_page_url: null,
per_page: 10,
prev_page_url: null,
to: 1,
total: 20,
}
}
},
limit: {
type: Number,
default: 0
}
},
methods: {
selectPage: function(page) {
if (page === '...') {
return;
}
this.$emit('pagination-change-page', page);
updateQueryStringParam('page',page);
},
getPages: function() {
if (this.limit === -1) {
return 0;
}
if (this.limit === 0 ) {
return this.data.last_page;
}
var current = parseInt(this.data.current_page),
last = parseInt(this.data.last_page),
delta = parseInt(this.limit),
left = current - delta,
right = current + delta + 1,
range = [],
pages = [],
l;
if ( (current-1) > this.limit ) pages.push('...');
for (var i = 1; i <= last; i++) {
if ( (i >= left && i < right)) {
pages.push(i);
}
}
if ( (last-current) > this.limit ) pages.push('...');
return pages;
}
}
};
</script>
<style>
.mypagination {
display: inline-block;
color:#0a246a;
}
.mypagination a {
color: black;
float: left;
padding: 8px 16px;
text-decoration: none;
border-top: 2px solid grey;
}
.mypagination a.active {
color: red;
border-top: 2px solid red;
}
.mypagination a:hover:not(.active) {
background-color: #ddd;
}
.mypagination a.next {
position:relative;
width: 150px;
padding-right:20px;
}
.mypagination .rigth-arrow {
top: -16px;
font-size: 42px;
position: absolute;
}
.mypagination a.prev {
position:relative;
width: 150px;
padding-left: 40px;
}
.mypagination .left-arrow {
font-size: 42px;
position: absolute;
right: 14px;
left: 0px;
top: -16px;
}
</style>
