You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

114 lines
2.3 KiB

<template>
<div class="v-data-footer">
<v-edit-dialog
large
persistent
@save="changePageNumber"
>
<span>{{ value }} of {{ length }}</span>
<template v-slot:input>
<div class="mt-4 title">
Move Page
</div>
</template>
<template v-slot:input>
<v-text-field
v-model="newPage"
:rules="rules"
label="Edit"
single-line
counter
autofocus
/>
</template>
</v-edit-dialog>
<v-tooltip bottom>
<template v-slot:activator="{ on }">
<v-btn
v-shortkey.once="['arrowleft']"
:disabled="value===1"
text
fab
small
v-on="on"
@shortkey="prevPage"
@click="prevPage"
>
<v-icon>mdi-chevron-left</v-icon>
</v-btn>
</template>
<span>←</span>
</v-tooltip>
<v-tooltip bottom>
<template v-slot:activator="{ on }">
<v-btn
v-shortkey.once="['arrowright']"
:disabled="value===length || length===0"
text
fab
small
v-on="on"
@shortkey="nextPage"
@click="nextPage"
>
<v-icon>mdi-chevron-right</v-icon>
</v-btn>
</template>
<span></span>
</v-tooltip>
</div>
</template>
<script>
export default {
props: {
value: {
type: Number,
default: 1,
required: true
},
length: {
type: Number,
default: 1,
required: true
}
},
data() {
return {
editedPage: null,
rules: [
v => (v && parseInt(v, 10) > 0 && parseInt(v, 10) <= this.length) || 'Invalid page number!'
]
}
},
computed: {
newPage: {
get() {
return this.value
},
set(newValue) {
const value = parseInt(newValue, 10)
this.editedPage = value
}
}
},
methods: {
changePageNumber() {
if (!this.editedPage || this.editedPage < 0 || this.editedPage > this.length) {
return
}
this.$emit('input', this.editedPage)
},
prevPage() {
const page = Math.max(this.value - 1, 1)
this.$emit('input', page)
},
nextPage() {
const page = Math.min(this.value + 1, this.length)
this.$emit('input', page)
}
}
}
</script>