mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-04-15 09:14:08 +00:00
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>
92 lines
2.1 KiB
TypeScript
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,
|
|
}
|
|
}
|