Files
InvoiceShelf/resources/scripts-v2/composables/use-pagination.ts
Darko Gjorgjijoski a46cca5cd8 Complete scripts-v2 TypeScript migration — all imports resolved,
build passes

Create all missing components (modals, dropdowns, icons, tabs, mail
drivers, customer partials), fix all @/scripts/ imports to @v2/,
wire up vite entry point and blade template. 382 files, 48883 lines.

- 27 settings components: modals (tax, payment, custom field, note,
  category, role, exchange rate, unit, mail test), dropdowns (6),
  customization tabs (4), mail driver forms (4)
- 22 icon components: 5 utility icons, 4 dashboard icons, 13 editor
  toolbar icons with typed barrel export
- 3 customer components: info, chart placeholder, custom fields single
- Fixed usePopper composable, client/format-money import patterns
- Zero remaining @/scripts/ imports in scripts-v2/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 09:30:00 +02:00

92 lines
2.1 KiB
TypeScript

import { ref, computed } from 'vue'
import type { Ref, ComputedRef } from 'vue'
import { PAGINATION_DEFAULTS } from '@v2/config/constants'
export interface UsePaginationOptions {
initialPage?: number
initialLimit?: number
}
export interface UsePaginationReturn {
page: Ref<number>
limit: Ref<number>
totalCount: Ref<number>
totalPages: ComputedRef<number>
hasNextPage: ComputedRef<boolean>
hasPrevPage: ComputedRef<boolean>
nextPage: () => void
prevPage: () => void
goToPage: (target: number) => void
setTotalCount: (count: number) => void
reset: () => void
}
/**
* Composable for managing pagination state.
* Tracks page, limit, total count, and provides navigation helpers.
*
* @param options - Optional initial page and limit values
*/
export function usePagination(
options?: UsePaginationOptions
): UsePaginationReturn {
const initialPage = options?.initialPage ?? PAGINATION_DEFAULTS.PAGE
const initialLimit = options?.initialLimit ?? PAGINATION_DEFAULTS.LIMIT
const page = ref<number>(initialPage)
const limit = ref<number>(initialLimit)
const totalCount = ref<number>(0)
const totalPages = computed<number>(() => {
if (totalCount.value === 0 || limit.value === 0) {
return 0
}
return Math.ceil(totalCount.value / limit.value)
})
const hasNextPage = computed<boolean>(() => page.value < totalPages.value)
const hasPrevPage = computed<boolean>(() => page.value > 1)
function nextPage(): void {
if (hasNextPage.value) {
page.value += 1
}
}
function prevPage(): void {
if (hasPrevPage.value) {
page.value -= 1
}
}
function goToPage(target: number): void {
if (target >= 1 && target <= totalPages.value) {
page.value = target
}
}
function setTotalCount(count: number): void {
totalCount.value = count
}
function reset(): void {
page.value = initialPage
totalCount.value = 0
}
return {
page,
limit,
totalCount,
totalPages,
hasNextPage,
hasPrevPage,
nextPage,
prevPage,
goToPage,
setTotalCount,
reset,
}
}