import { parseAsArrayOf, parseAsString, parseAsStringLiteral } from 'nuqs/server' /** Sortable table columns, matching the `Resource.Options` sort menu. */ export const TABLE_SORT_COLUMNS = [ 'name', 'columns', 'rows', 'created', 'owner', 'updated', ] as const export type TableSortColumn = (typeof TABLE_SORT_COLUMNS)[number] const SORT_DIRECTIONS = ['asc', 'desc'] as const /** Default sort: most-recently-updated first. */ export const DEFAULT_TABLE_SORT_COLUMN: TableSortColumn = 'updated' export const DEFAULT_TABLE_SORT_DIRECTION = 'desc' /** * Co-located, typed URL query-param definitions for the Tables list. * * - `search` is the table name filter. The input is controlled directly by the * nuqs value; only its URL write is debounced via `limitUrlUpdates` * (`debounce`) on the setter — never written on every keystroke. * - `sort` / `dir` follow the shared sort convention (two scalar params). * - `rows` filters by row-count bucket; `owner` filters by creator id. Both are * multi-select arrays. * * Selecting a table navigates to the `tables/[tableId]` route (via `router`), * so the active table is route state, not query state, and is intentionally not * represented here. */ export const tablesParsers = { search: parseAsString.withDefault(''), sort: parseAsStringLiteral(TABLE_SORT_COLUMNS).withDefault(DEFAULT_TABLE_SORT_COLUMN), dir: parseAsStringLiteral(SORT_DIRECTIONS).withDefault(DEFAULT_TABLE_SORT_DIRECTION), rows: parseAsArrayOf(parseAsString).withDefault([]), owner: parseAsArrayOf(parseAsString).withDefault([]), } as const /** Filter/search/sort view-state: clean URLs, no back-stack churn. */ export const tablesUrlKeys = { history: 'replace', clearOnDefault: true, } as const