Files
sk_fems_ui/components/Pagination.vue
2025-07-12 15:13:46 +09:00

210 lines
4.5 KiB
Vue

<template>
<div class="ly-pager d-flex">
<v-row class="con-pager" align="center" justify="start">
<!-- <span class="grey--text">{{ $m('CAP.PAGE_ROW', '페이지 행당') }} : </span> -->
<v-menu offset-y>
<template #activator="{ on, attrs }">
<v-btn
dark
text
color="primary"
class="ml-2"
v-bind="attrs"
v-on="on"
>
{{ itemsPerPage }}
<v-icon>mdi-chevron-down</v-icon>
</v-btn>
</template>
<v-list v-if="useLimit">
<v-list-item
v-for="(number, index) in itemsPerPageArray"
:key="index"
@click="changePageLeng(number)"
>
<v-list-item-title>{{ number }}</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
<v-btn fab small class="mr-1 btn-pager" @click="firstToPage">
<v-icon>mdi-chevron-double-left</v-icon>
</v-btn>
<v-btn fab small class="mr-1 btn-pager" @click="prevPage">
<v-icon>mdi-chevron-left</v-icon>
</v-btn>
<!-- <span class="mr-4 grey--text mr-1"> {{ numberOfPages }} / {{ lastPage }} </span> -->
<span class="mr-4 mr-1"> {{ numberOfPages }} / {{ lastPage }} </span>
<v-btn fab small class="ml-1 btn-pager" @click="nextPage">
<v-icon>mdi-chevron-right</v-icon>
</v-btn>
<v-btn fab small class="mr-1 btn-pager" @click="lastToPage">
<v-icon>mdi-chevron-double-right</v-icon>
</v-btn>
<div class="mr-1 btn-pager">
<v-text-field v-model="moveToPage" type="number" label="page" />
</div>
<v-btn fab small class="mr-1" @click="movePage">
{{ $m('CAP.MOVE', '이동') }}
</v-btn>
</v-row>
<slot name="btn"> </slot>
<!-- <Alert ref="alert" /> -->
</div>
</template>
<script>
export default {
props: {
useLimit: {
type: Boolean,
default: true,
},
totalCount: {
type: Number,
default: 0,
},
pageNum: {
type: Number,
default: 0,
},
limit: {
type: Number,
default: 0,
},
itemsPerPageArray: {
type: Array,
default: () => [20, 50, 100],
},
},
data() {
return {
moveToPage: '',
};
},
computed: {
page: function() {
return this.numberOfPages + '-' + this.lastPage;
},
lastPage: function() {
//grid data가 없을 경우 1 리턴
if (this.totalCount == 0) return 1;
let pageLength = Math.floor(this.totalCount / this.itemsPerPage);
if (this.totalCount % this.itemsPerPage > 0) {
pageLength++;
}
return pageLength;
},
itemsPerPage: function() {
return this.limit;
},
numberOfPages: function() {
return Number(this.pageNum);
},
plusPage: function() {
return Number(this.pageNum) + 1;
},
minusPage: function() {
return Number(this.pageNum) - 1;
},
},
watch: {
totalCount: function(newData) {
return (this.moveToPage = newData > 0 ? this.moveToPage : '');
},
moveToPage: function() {
return (this.moveToPage = this.moveToPage.replaceAll(/[^0-9]/g, ''));
},
},
methods: {
nextPage: function() {
if (this.lastPage >= this.plusPage) {
this.$emit('loadData', this.plusPage, this.itemsPerPage);
}
},
prevPage: function() {
if (0 != this.minusPage) {
this.$emit('loadData', this.minusPage, this.itemsPerPage);
}
},
movePage: function() {
if (0 < this.moveToPage && this.moveToPage <= this.lastPage) {
this.$emit('loadData', Number(this.moveToPage), this.itemsPerPage);
} else {
this.$refs.alert.done = () => {
this.$emit('refresh');
};
this.$refs.alert.open(
this.$m('COD.CNFM', '확인'),
this.$m('CAP.PAGE_MOVE_CNFM', '이동할 페이지 정보를 확인 하세요'),
);
}
},
changePageLeng: function(limit) {
//부모 컴포넌트에서 loadData(데이터 조회) 구현
//this.$emit('loadData', this.pageNum, limit);
// limit 변경 시 1 페이지로 초기화
this.$emit('loadData', 1, limit);
},
firstToPage: function() {
if (0 != this.minusPage) {
this.$emit('loadData', 1, this.itemsPerPage);
}
},
lastToPage: function() {
if (this.lastPage >= this.plusPage) {
this.$emit('loadData', this.lastPage, this.itemsPerPage);
}
},
},
};
</script>
<style lang="scss">
.btn-pager {
margin: 4px;
input {
width: 80px;
}
}
.v-btn--fab.v-size--small {
height: 30px;
width: 30px;
}
.v-text-field__details {
display: none;
}
.con-pager {
margin-top: 12px;
margin-bottom: -12px;
}
.ly-pager {
margin: auto;
}
.v-btn {
margin-left: 4px;
}
.v-btn--text {
margin-right: 6px;
}
// .grey--text {
// margin-left: 16px;
// }
.mr-4 {
margin-left: 14px;
}
.v-btn__content {
color: #ffffff;
}
</style>