main
vue 76 lines 1.78 KB
Raw
1 <template>
2 <div class="pagination-indeterminate flex items-center gap-2">
3 <n-input-number v-model:value="page" size="small" :min="1" button-placement="both" class="page" :disabled>
4 <template #minus-icon>
5 <Icon :name="ArrowBackIcon" />
6 </template>
7 <template #add-icon>
8 <Icon :name="ArrowForwardIcon" />
9 </template>
10 </n-input-number>
11 <n-select
12 v-if="showPageSizes"
13 v-model:value="pageSize"
14 size="small"
15 :options="pageSizesOptions"
16 :show-checkmark="false"
17 class="page-sizes"
18 :disabled
19 />
20 <n-select
21 v-if="showSort"
22 v-model:value="sort"
23 size="small"
24 :options="sortOptions"
25 :show-checkmark="false"
26 class="sort"
27 :disabled
28 />
29 </div>
30 </template>
31
32 <script setup lang="ts">
33 import { NInputNumber, NSelect } from "naive-ui"
34 import { computed, toRefs, watch } from "vue"
35 import Icon from "@/components/common/Icon.vue"
36
37 const props = defineProps<{ showPageSizes?: boolean; showSort?: boolean; pageSizes?: number[]; disabled?: boolean }>()
38 const page = defineModel<number>("page", { default: 1 })
39 const pageSize = defineModel<number>("pageSize", { default: 10 })
40 const sort = defineModel<"asc" | "desc">("sort", { default: "desc" })
41
42 const { pageSizes, disabled, showPageSizes, showSort } = toRefs(props)
43
44 const pageSizesOptions = computed(() =>
45 (pageSizes.value || [10, 25, 50, 100]).map(o => ({ label: `${o} / page`, value: o }))
46 )
47
48 const sortOptions = [
49 { label: "Desc", value: "desc" },
50 { label: "Asc", value: "asc" }
51 ]
52
53 const ArrowForwardIcon = "ion:chevron-forward"
54 const ArrowBackIcon = "ion:chevron-back"
55
56 watch(page, val => {
57 if (!val) {
58 page.value = 1
59 }
60 })
61 </script>
62
63 <style lang="scss" scoped>
64 .pagination-indeterminate {
65 .page {
66 width: 90px;
67 text-align: center;
68 }
69 .page-sizes {
70 width: auto;
71 }
72 .sort {
73 width: auto;
74 }
75 }
76 </style>