mirror of
https://github.com/Hopiu/vue-material.git
synced 2026-05-08 23:44:44 +00:00
119 lines
3.2 KiB
Vue
119 lines
3.2 KiB
Vue
<template>
|
|
<div class="md-table-pagination">
|
|
<span class="md-table-pagination-label">{{ mdLabel }}:</span>
|
|
|
|
<md-select v-model="currentSize" md-menu-class="md-pagination-select" @change="changeSize" v-if="mdPageOptions">
|
|
<md-option v-for="amount in mdPageOptions" :key="amount" :value="amount">{{ amount }}</md-option>
|
|
</md-select>
|
|
|
|
<span>{{ ((currentPage - 1) * currentSize) + 1 }}-{{ subTotal }} {{ mdSeparator }} {{ mdTotal }}</span>
|
|
|
|
<md-button class="md-icon-button md-table-pagination-previous" @click="previousPage" :disabled="currentPage === 1">
|
|
<md-icon>keyboard_arrow_left</md-icon>
|
|
</md-button>
|
|
|
|
<md-button class="md-icon-button md-table-pagination-next" @click="nextPage" :disabled="shouldDisable">
|
|
<md-icon>keyboard_arrow_right</md-icon>
|
|
</md-button>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'md-table-pagination',
|
|
props: {
|
|
mdSize: {
|
|
type: [Number, String],
|
|
default: 10
|
|
},
|
|
mdPageOptions: [Array, Boolean],
|
|
mdPage: {
|
|
type: [Number, String],
|
|
default: 1
|
|
},
|
|
mdTotal: {
|
|
type: [Number, String],
|
|
default: 'Many'
|
|
},
|
|
mdLabel: {
|
|
type: String,
|
|
default: 'Rows per page'
|
|
},
|
|
mdSeparator: {
|
|
type: String,
|
|
default: 'of'
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
totalItems: 0,
|
|
currentPage: 1,
|
|
currentSize: parseInt(this.mdSize, 10)
|
|
};
|
|
},
|
|
watch: {
|
|
mdTotal(val) {
|
|
const sub = this.currentPage * this.currentSize;
|
|
|
|
this.subTotal = sub > val ? val : sub;
|
|
this.totalItems = isNaN(val) ? Number.MAX_SAFE_INTEGER : parseInt(val, 10);
|
|
},
|
|
mdSize(val) {
|
|
this.currentSize = parseInt(val, 10);
|
|
},
|
|
mdPage(val) {
|
|
this.currentPage = parseInt(val, 10);
|
|
}
|
|
},
|
|
computed: {
|
|
lastPage() {
|
|
return false;
|
|
},
|
|
shouldDisable() {
|
|
return this.currentSize * this.currentPage >= this.totalItems;
|
|
},
|
|
subTotal() {
|
|
const sub = this.currentPage * this.currentSize;
|
|
|
|
return sub > this.mdTotal ? this.mdTotal : sub;
|
|
}
|
|
},
|
|
methods: {
|
|
emitPaginationEvent() {
|
|
if (this.canFireEvents) {
|
|
this.$emit('pagination', {
|
|
size: this.currentSize,
|
|
page: this.currentPage
|
|
});
|
|
}
|
|
},
|
|
changeSize() {
|
|
if (this.canFireEvents) {
|
|
this.$emit('size', this.currentSize);
|
|
this.emitPaginationEvent();
|
|
}
|
|
},
|
|
previousPage() {
|
|
if (this.canFireEvents) {
|
|
this.currentPage--;
|
|
this.$emit('page', this.currentPage);
|
|
this.emitPaginationEvent();
|
|
}
|
|
},
|
|
nextPage() {
|
|
if (this.canFireEvents) {
|
|
this.currentPage++;
|
|
this.$emit('page', this.currentPage);
|
|
this.emitPaginationEvent();
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
this.$nextTick(() => {
|
|
this.mdPageOptions = this.mdPageOptions || [10, 25, 50, 100];
|
|
this.currentSize = this.mdPageOptions.includes(this.currentSize) ? this.currentSize : this.mdPageOptions[0];
|
|
this.canFireEvents = true;
|
|
});
|
|
}
|
|
};
|
|
</script>
|