import { Ref } from 'vue'; import { LocationQuery, LocationQueryRaw } from 'vue-router'; export type RouteFilterValue = string | number | boolean | string[]; export type RouteFilterRecord = Record; export interface RouteSortDefault { field?: string; dir?: 'asc' | 'desc' | ''; } export interface UseRouteFiltersSchema { filter: F; draft?: D; sort?: RouteSortDefault; search?: string; page?: number; } export type RouteFilterState = { [K in keyof F]: F[K] extends string[] ? string[] : F[K]; }; export interface RouteSort { /** Current sort value, e.g. `'-created'`, `'+name'`, or `''` */ readonly value: string; /** Current field being sorted (without sign prefix) */ readonly field: string; /** Current direction */ readonly dir: 'asc' | 'desc' | ''; /** * Toggle sort for `field`. * - none / other field → desc (`-field`) * - `-field` → asc (`+field`) * - `+field` → none (`''`) */ toggle: (field: string) => void; set: (field: string, dir: 'asc' | 'desc') => void; clear: () => void; /** Icon hint for table header */ iconFor: (field: string) => 'ascending' | 'descending' | 'sort'; } export interface RouteDraftControl { /** Reactive draft state — edit directly without .value */ readonly state: RouteFilterState; /** Copy active filter values into draft (call before opening modal) */ open: () => void; /** Apply draft values to active filter (call on save) */ apply: () => void; /** Discard draft changes (call on cancel) */ cancel: () => void; /** Reset draft to schema defaults */ reset: () => void; } export interface UseRouteFiltersReturn { /** Reactive filter state — read/write directly without .value */ filter: RouteFilterState; /** Draft state + controls (only when `draft` was provided in schema) */ draft: RouteDraftControl; /** Sort controls */ sort: RouteSort; /** Reactive search ref (for v-model on input) */ search: Ref; /** Reactive page ref (for v-model / pagination) */ page: Ref; /** Reset filter, search, page and sort to defaults */ reset: () => Promise; /** Clear all schema-managed query params */ clear: () => Promise; } export declare function useRouteFilters(schema: UseRouteFiltersSchema): UseRouteFiltersReturn; /** @deprecated Use `useRouteFilters` with the new schema API instead */ export type RouteFilterSchema = RouteFilterRecord; /** @deprecated */ export declare const parseRouteFiltersFromQuery: (query: LocationQuery, defaults: T) => RouteFilterState; /** @deprecated */ export declare const serializeRouteFiltersToQuery: (state: RouteFilterState, defaults: T) => LocationQueryRaw; export type { RouteFilterRecord as RouteFilterRefs };