mirror of https://github.com/nocodb/nocodb
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.
73 lines
1.6 KiB
73 lines
1.6 KiB
import axios from 'axios' |
|
import type { PaginatedType } from 'nocodb-sdk' |
|
|
|
const usePaginationShortcuts = ({ |
|
changePage, |
|
paginationDataRef, |
|
}: { |
|
changePage: (page: number) => Promise<void> | undefined |
|
paginationDataRef: Ref<PaginatedType | undefined> |
|
}) => { |
|
const { isViewDataLoading } = storeToRefs(useViewsStore()) |
|
const getTotalPages = () => { |
|
return Math.ceil(paginationDataRef.value!.totalRows! / paginationDataRef.value!.pageSize!) |
|
} |
|
|
|
const changePageWithLoading = async (page: number) => { |
|
isViewDataLoading.value = true |
|
try { |
|
await changePage?.(page) |
|
isViewDataLoading.value = false |
|
} catch (e) { |
|
if (axios.isCancel(e)) return |
|
|
|
isViewDataLoading.value = false |
|
} |
|
} |
|
|
|
const onLeft = async (e: KeyboardEvent) => { |
|
if (!e.altKey) return |
|
e.preventDefault() |
|
|
|
const page = paginationDataRef.value!.page! - 1 |
|
if (page < 1) return |
|
|
|
await changePageWithLoading(page) |
|
} |
|
|
|
const onRight = async (e: KeyboardEvent) => { |
|
if (!e.altKey) return |
|
e.preventDefault() |
|
|
|
const page = paginationDataRef.value!.page! + 1 |
|
|
|
if (page > getTotalPages()) return |
|
|
|
await changePageWithLoading(page) |
|
} |
|
|
|
const onDown = async (e: KeyboardEvent) => { |
|
if (!e.altKey) return |
|
e.preventDefault() |
|
|
|
const page = 1 |
|
|
|
await changePageWithLoading(page) |
|
} |
|
|
|
const onUp = async (e: KeyboardEvent) => { |
|
if (!e.altKey) return |
|
e.preventDefault() |
|
|
|
await changePageWithLoading(getTotalPages()) |
|
} |
|
|
|
return { |
|
onLeft, |
|
onRight, |
|
onUp, |
|
onDown, |
|
} |
|
} |
|
|
|
export default usePaginationShortcuts
|
|
|