96 lines
2.3 KiB
JavaScript
96 lines
2.3 KiB
JavaScript
/**
|
|
* Pagination composable
|
|
* Handles pagination state and navigation
|
|
*/
|
|
|
|
import { ref, computed } from 'vue';
|
|
|
|
export function usePagination() {
|
|
// State
|
|
const currentPage = ref(1);
|
|
const perPage = ref(25);
|
|
const totalRecordings = ref(0);
|
|
const totalPages = ref(0);
|
|
const hasNextPage = ref(false);
|
|
const hasPrevPage = ref(false);
|
|
const isLoadingMore = ref(false);
|
|
|
|
// Computed
|
|
const paginationInfo = computed(() => {
|
|
const start = (currentPage.value - 1) * perPage.value + 1;
|
|
const end = Math.min(currentPage.value * perPage.value, totalRecordings.value);
|
|
return {
|
|
start,
|
|
end,
|
|
total: totalRecordings.value,
|
|
currentPage: currentPage.value,
|
|
totalPages: totalPages.value
|
|
};
|
|
});
|
|
|
|
// Methods
|
|
const updatePagination = (pagination) => {
|
|
if (!pagination) {
|
|
// Reset pagination for non-paginated views
|
|
currentPage.value = 1;
|
|
totalPages.value = 1;
|
|
hasNextPage.value = false;
|
|
hasPrevPage.value = false;
|
|
return;
|
|
}
|
|
|
|
currentPage.value = pagination.page;
|
|
totalRecordings.value = pagination.total;
|
|
totalPages.value = pagination.total_pages;
|
|
hasNextPage.value = pagination.has_next;
|
|
hasPrevPage.value = pagination.has_prev;
|
|
};
|
|
|
|
const goToPage = (page) => {
|
|
if (page < 1 || page > totalPages.value) return;
|
|
currentPage.value = page;
|
|
};
|
|
|
|
const nextPage = () => {
|
|
if (hasNextPage.value) {
|
|
currentPage.value++;
|
|
}
|
|
};
|
|
|
|
const prevPage = () => {
|
|
if (hasPrevPage.value) {
|
|
currentPage.value--;
|
|
}
|
|
};
|
|
|
|
const reset = () => {
|
|
currentPage.value = 1;
|
|
totalRecordings.value = 0;
|
|
totalPages.value = 0;
|
|
hasNextPage.value = false;
|
|
hasPrevPage.value = false;
|
|
isLoadingMore.value = false;
|
|
};
|
|
|
|
return {
|
|
// State
|
|
currentPage,
|
|
perPage,
|
|
totalRecordings,
|
|
totalPages,
|
|
hasNextPage,
|
|
hasPrevPage,
|
|
isLoadingMore,
|
|
|
|
// Computed
|
|
paginationInfo,
|
|
|
|
// Methods
|
|
updatePagination,
|
|
goToPage,
|
|
nextPage,
|
|
prevPage,
|
|
reset
|
|
};
|
|
}
|