import type { PaginationProps } from '../types/pagination'
import type { BasicTableProps } from '../types/table'
import { computed, unref, ref, ComputedRef, watch } from 'vue'
import { LeftOutlined, RightOutlined } from '@ant-design/icons-vue'
import { isBoolean } from '/@/utils/is'
import { PAGE_SIZE, PAGE_SIZE_OPTIONS } from '../const'
import { useI18n } from '/@/hooks/web/useI18n'
interface ItemRender {
page: number
type: 'page' | 'prev' | 'next'
originalElement: any
}
function itemRender({ page, type, originalElement }: ItemRender) {
if (type === 'prev') {
return page === 0 ? null :
} else if (type === 'next') {
return page === 1 ? null :
}
return originalElement
}
export function usePagination(refProps: ComputedRef) {
const { t } = useI18n()
const configRef = ref({})
const show = ref(true)
watch(
() => unref(refProps).pagination,
(pagination) => {
if (!isBoolean(pagination) && pagination) {
configRef.value = {
...unref(configRef),
...(pagination ?? {}),
}
}
},
)
const getPaginationInfo = computed((): PaginationProps | boolean => {
const { pagination } = unref(refProps)
if (!unref(show) || (isBoolean(pagination) && !pagination)) {
return false
}
return {
current: 1,
pageSize: PAGE_SIZE,
size: 'small',
defaultPageSize: PAGE_SIZE,
showTotal: (total) => t('component.table.total', { total }),
showSizeChanger: true,
pageSizeOptions: PAGE_SIZE_OPTIONS,
itemRender: itemRender,
showQuickJumper: true,
...(isBoolean(pagination) ? {} : pagination),
...unref(configRef),
}
})
function setPagination(info: Partial) {
const paginationInfo = unref(getPaginationInfo)
configRef.value = {
...(!isBoolean(paginationInfo) ? paginationInfo : {}),
...info,
}
}
function getPagination() {
return unref(getPaginationInfo)
}
function getShowPagination() {
return unref(show)
}
async function setShowPagination(flag: boolean) {
show.value = flag
}
return { getPagination, getPaginationInfo, setShowPagination, getShowPagination, setPagination }
}