@rowakit/table 0.2.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -15
- package/dist/index.cjs +675 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +22 -5
- package/dist/index.d.ts +22 -5
- package/dist/index.js +676 -13
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
- package/src/styles/table.css +154 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/column-helpers.ts","../src/components/SmartTable.tsx","../src/index.ts"],"names":["actions","jsx","jsxs","useState","useRef","useEffect","totalPages"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Column helper factory functions\r\n *\r\n * These helpers provide a clean, type-safe API for defining table columns.\r\n * They reduce boilerplate and enforce conventions while maintaining flexibility\r\n * through the `col.custom` escape hatch.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { ReactNode } from 'react';\r\nimport type {\r\n TextColumnDef,\r\n DateColumnDef,\r\n BooleanColumnDef,\r\n BadgeColumnDef,\r\n NumberColumnDef,\r\n ActionsColumnDef,\r\n CustomColumnDef,\r\n ActionDef,\r\n BadgeTone,\r\n} from './types';\r\n\r\n// ============================================================================\r\n// HELPER OPTIONS\r\n// ============================================================================\r\n\r\ninterface TextOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional formatter function */\r\n format?: (value: unknown) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface DateOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional date formatter function */\r\n format?: (value: Date | string | number) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface BooleanOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional boolean formatter function */\r\n format?: (value: boolean) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface BadgeOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Value-to-badge mapping */\r\n map?: Record<string, { label: string; tone: BadgeTone }>;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface NumberOptions<T = unknown> {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Formatting options: Intl.NumberFormatOptions or custom formatter */\r\n format?: Intl.NumberFormatOptions | ((value: number, row: T) => string);\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COLUMN HELPER FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Create a text column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.text('name')\r\n * col.text('email', { header: 'Email Address', sortable: true })\r\n * col.text('status', { format: (val) => val.toUpperCase() })\r\n * ```\r\n */\r\nfunction text<T>(\r\n field: keyof T & string,\r\n options?: TextOptions\r\n): TextColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'text',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a date column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.date('createdAt')\r\n * col.date('updatedAt', { header: 'Last Modified', sortable: true })\r\n * col.date('birthday', {\r\n * format: (date) => new Date(date).toLocaleDateString()\r\n * })\r\n * ```\r\n */\r\nfunction date<T>(\r\n field: keyof T & string,\r\n options?: DateOptions\r\n): DateColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'date',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a boolean column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.boolean('active')\r\n * col.boolean('isPublished', { header: 'Published', sortable: true })\r\n * col.boolean('enabled', {\r\n * format: (val) => val ? 'Yes' : 'No'\r\n * })\r\n * ```\r\n */\r\nfunction boolean<T>(\r\n field: keyof T & string,\r\n options?: BooleanOptions\r\n): BooleanColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'boolean',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a badge column definition for status/enum fields.\r\n *\r\n * @example\r\n * ```ts\r\n * col.badge('status')\r\n * col.badge('status', {\r\n * map: {\r\n * active: { label: 'Active', tone: 'success' },\r\n * paused: { label: 'Paused', tone: 'warning' },\r\n * disabled: { label: 'Disabled', tone: 'danger' }\r\n * }\r\n * })\r\n * ```\r\n */\r\nfunction badge<T>(\r\n field: keyof T & string,\r\n options?: BadgeOptions\r\n): BadgeColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'badge',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n map: options?.map,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a number column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.number('amount')\r\n * col.number('price', {\r\n * format: { style: 'currency', currency: 'USD' }\r\n * })\r\n * col.number('count', {\r\n * format: (val, row) => `${val} items`\r\n * })\r\n * ```\r\n */\r\nfunction number<T>(\r\n field: keyof T & string,\r\n options?: NumberOptions<T>\r\n): NumberColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'number',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create an actions column definition.\r\n *\r\n * The actions column displays a set of actions (buttons/links) that can be\r\n * performed on each row.\r\n *\r\n * @example\r\n * ```ts\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (row) => editUser(row) },\r\n * { id: 'delete', label: 'Delete', confirm: true, onClick: (row) => deleteUser(row) }\r\n * ])\r\n * ```\r\n */\r\nfunction actions<T>(actions: ActionDef<T>[]): ActionsColumnDef<T> {\r\n return {\r\n id: 'actions',\r\n kind: 'actions',\r\n actions,\r\n };\r\n}\r\n\r\n/**\r\n * Create a custom column definition with full rendering control.\r\n *\r\n * This is the escape hatch for any column that doesn't fit the standard types.\r\n * Use this for badges, avatars, complex formatting, or any custom UI.\r\n *\r\n * @example\r\n * ```ts\r\n * col.custom({\r\n * id: 'avatar',\r\n * header: 'User',\r\n * render: (row) => <img src={row.avatar} alt={row.name} />\r\n * })\r\n *\r\n * col.custom({\r\n * id: 'price',\r\n * field: 'price',\r\n * render: (row) => <Money amount={row.price} currency={row.currency} />\r\n * })\r\n *\r\n * col.custom({\r\n * id: 'status',\r\n * render: (row) => (\r\n * <Badge color={row.status === 'active' ? 'green' : 'gray'}>\r\n * {row.status}\r\n * </Badge>\r\n * )\r\n * })\r\n * ```\r\n */\r\nfunction custom<T>(\r\n field: keyof T & string,\r\n render: (row: T) => ReactNode\r\n): CustomColumnDef<T>;\r\nfunction custom<T>(options: {\r\n /** Unique column identifier */\r\n id: string;\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Optional field name for sorting/filtering */\r\n field?: keyof T & string;\r\n /** Render function for cell content */\r\n render: (row: T) => ReactNode;\r\n}): CustomColumnDef<T>;\r\nfunction custom<T>(\r\n arg1:\r\n | (keyof T & string)\r\n | {\r\n id: string;\r\n header?: string;\r\n field?: keyof T & string;\r\n render: (row: T) => ReactNode;\r\n },\r\n arg2?: (row: T) => ReactNode\r\n): CustomColumnDef<T> {\r\n if (typeof arg1 === 'string') {\r\n if (typeof arg2 !== 'function') {\r\n throw new Error('col.custom(field, render): render must be a function');\r\n }\r\n\r\n return {\r\n id: arg1,\r\n kind: 'custom',\r\n field: arg1,\r\n render: arg2,\r\n };\r\n }\r\n\r\n return {\r\n id: arg1.id,\r\n kind: 'custom',\r\n header: arg1.header,\r\n field: arg1.field,\r\n render: arg1.render,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\n/**\r\n * Column helper factory object.\r\n *\r\n * Provides convenient helper functions for creating column definitions.\r\n *\r\n * @example\r\n * ```tsx\r\n * import { col } from '@rowakit/table';\r\n *\r\n * const columns = [\r\n * col.text('name', { sortable: true }),\r\n * col.date('createdAt'),\r\n * col.boolean('active'),\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (row) => {} }\r\n * ]),\r\n * col.custom({ id: 'badge', render: (row) => <Badge>{row.status}</Badge> })\r\n * ];\r\n * ```\r\n */\r\nexport const col = {\r\n text,\r\n date,\r\n boolean,\r\n badge,\r\n number,\r\n actions,\r\n custom,\r\n} as const;\r\n","/**\r\n * RowaKit Table Component\r\n *\r\n * Core table rendering component that maps columns to table cells.\r\n * Handles all column types: text, date, boolean, actions, and custom.\r\n * Includes data fetching state machine with loading/error/empty states.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport type { Fetcher, ColumnDef, FetcherQuery, ActionDef, FilterValue } from '../types';\r\n\r\n// ============================================================================\r\n// COMPONENT PROPS\r\n// ============================================================================\r\n\r\nexport interface SmartTableProps<T> {\r\n /** Server-side data fetcher function */\r\n fetcher: Fetcher<T>;\r\n\r\n /** Array of column definitions */\r\n columns: ColumnDef<T>[];\r\n\r\n /** Available page size options (default: [10, 20, 50]) */\r\n pageSizeOptions?: number[];\r\n\r\n /** Initial page size (default: 20) */\r\n defaultPageSize?: number;\r\n\r\n /** Function or field name to extract row key (default: uses 'id' field) */\r\n rowKey?: keyof T | ((row: T) => string | number);\r\n\r\n /** Optional CSS class name for the table container */\r\n className?: string;\r\n\r\n /** Enable filters (default: false) */\r\n enableFilters?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// STATE MANAGEMENT\r\n// ============================================================================\r\n\r\ntype FetchState = 'idle' | 'loading' | 'success' | 'empty' | 'error';\r\n\r\ninterface DataState<T> {\r\n state: FetchState;\r\n items: T[];\r\n total: number;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Confirmation state for actions that require confirmation.\r\n */\r\ninterface ConfirmState<T> {\r\n action: ActionDef<T>;\r\n row: T;\r\n}\r\n\r\n// ============================================================================\r\n// HELPER FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Extract unique key from a row.\r\n */\r\nfunction getRowKey<T>(row: T, rowKey?: keyof T | ((row: T) => string | number)): string | number {\r\n if (typeof rowKey === 'function') {\r\n return rowKey(row);\r\n }\r\n if (rowKey) {\r\n return String(row[rowKey]);\r\n }\r\n // Fallback to 'id' field if available\r\n if (row && typeof row === 'object' && 'id' in row) {\r\n return String(row.id);\r\n }\r\n // Last resort: use object reference (not ideal but safe)\r\n return String(row);\r\n}\r\n\r\n/**\r\n * Get header label for a column.\r\n */\r\nfunction getHeaderLabel<T>(column: ColumnDef<T>): string {\r\n return column.header ?? column.id;\r\n}\r\n\r\n/**\r\n * Render cell content based on column kind.\r\n */\r\nfunction renderCell<T>(\r\n column: ColumnDef<T>,\r\n row: T,\r\n isLoading: boolean,\r\n setConfirmState: (state: ConfirmState<T> | null) => void\r\n): ReactNode {\r\n switch (column.kind) {\r\n case 'text': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(value);\r\n }\r\n return String(value ?? '');\r\n }\r\n\r\n case 'date': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(value as Date | string | number);\r\n }\r\n // Default date formatting\r\n if (value instanceof Date) {\r\n return value.toLocaleDateString();\r\n }\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n return new Date(value).toLocaleDateString();\r\n }\r\n return '';\r\n }\r\n\r\n case 'boolean': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(Boolean(value));\r\n }\r\n // Default boolean formatting\r\n return value ? 'Yes' : 'No';\r\n }\r\n\r\n case 'badge': {\r\n const value = row[column.field];\r\n const valueStr = String(value ?? '');\r\n \r\n // Look up mapping\r\n const mapped = column.map?.[valueStr];\r\n const label = mapped?.label ?? valueStr;\r\n const tone = mapped?.tone ?? 'neutral';\r\n \r\n return (\r\n <span className={`rowakit-badge rowakit-badge-${tone}`}>\r\n {label}\r\n </span>\r\n );\r\n }\r\n\r\n case 'number': {\r\n const value = row[column.field];\r\n const numValue = Number(value ?? 0);\r\n \r\n if (column.format) {\r\n if (typeof column.format === 'function') {\r\n return column.format(numValue, row);\r\n }\r\n // Intl.NumberFormatOptions\r\n return new Intl.NumberFormat(undefined, column.format).format(numValue);\r\n }\r\n \r\n // Default number formatting\r\n return numValue.toLocaleString();\r\n }\r\n\r\n case 'actions': {\r\n return (\r\n <div className=\"rowakit-table-actions\">\r\n {column.actions.map((action) => {\r\n const isDisabled =\r\n isLoading ||\r\n action.disabled === true ||\r\n (typeof action.disabled === 'function' && action.disabled(row));\r\n\r\n const handleClick = () => {\r\n if (isDisabled || action.loading) {\r\n return;\r\n }\r\n\r\n // If action requires confirmation, show modal\r\n if (action.confirm) {\r\n setConfirmState({ action, row });\r\n } else {\r\n // Execute action directly\r\n void action.onClick(row);\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n key={action.id}\r\n onClick={handleClick}\r\n disabled={isDisabled || action.loading}\r\n type=\"button\"\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n >\r\n {action.icon && typeof action.icon === 'string' ? (\r\n <span>{action.icon}</span>\r\n ) : (\r\n action.icon\r\n )}\r\n {action.label}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n case 'custom': {\r\n return column.render(row);\r\n }\r\n\r\n default: {\r\n // Exhaustive check\r\n const _exhaustive: never = column;\r\n return _exhaustive;\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\n/**\r\n * RowaKitTable - Server-side table component for internal/business apps.\r\n *\r\n * This component renders a table with headers and body based on column definitions.\r\n * It handles all column types (text, date, boolean, actions, custom) and provides\r\n * a clean API for defining table structure.\r\n *\r\n * Features:\r\n * - Automatic data fetching on mount and query changes\r\n * - Loading, error, and empty states\r\n * - Stale request handling\r\n * - Retry on error\r\n *\r\n * @example\r\n * ```tsx\r\n * import { RowaKitTable, col } from '@rowakit/table';\r\n *\r\n * interface User {\r\n * id: string;\r\n * name: string;\r\n * email: string;\r\n * createdAt: Date;\r\n * active: boolean;\r\n * }\r\n *\r\n * const fetchUsers: Fetcher<User> = async (query) => {\r\n * const response = await fetch(`/api/users?page=${query.page}&pageSize=${query.pageSize}`);\r\n * return response.json();\r\n * };\r\n *\r\n * function UsersTable() {\r\n * return (\r\n * <RowaKitTable\r\n * fetcher={fetchUsers}\r\n * columns={[\r\n * col.text('name', { header: 'Name', sortable: true }),\r\n * col.text('email', { header: 'Email' }),\r\n * col.date('createdAt', { header: 'Created' }),\r\n * col.boolean('active', { header: 'Active' }),\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (user) => editUser(user) },\r\n * { id: 'delete', label: 'Delete', confirm: true, onClick: (user) => deleteUser(user) }\r\n * ])\r\n * ]}\r\n * defaultPageSize={20}\r\n * rowKey=\"id\"\r\n * />\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function RowaKitTable<T>({\r\n fetcher,\r\n columns,\r\n defaultPageSize = 20,\r\n pageSizeOptions = [10, 20, 50],\r\n rowKey,\r\n className = '',\r\n enableFilters = false,\r\n}: SmartTableProps<T>) {\r\n // State management\r\n const [dataState, setDataState] = useState<DataState<T>>({\r\n state: 'idle',\r\n items: [],\r\n total: 0,\r\n });\r\n\r\n const [query, setQuery] = useState<FetcherQuery>({\r\n page: 1,\r\n pageSize: defaultPageSize,\r\n });\r\n\r\n // Filter state (field -> FilterValue)\r\n const [filters, setFilters] = useState<Record<string, FilterValue | undefined>>({});\r\n\r\n // Confirmation state for actions that require confirmation\r\n const [confirmState, setConfirmState] = useState<ConfirmState<T> | null>(null);\r\n\r\n // Request tracking to ignore stale responses\r\n const requestIdRef = useRef(0);\r\n\r\n // Sync filters to query (and reset page to 1 when filters change)\r\n useEffect(() => {\r\n if (!enableFilters) return;\r\n\r\n // Build filters object, excluding undefined values\r\n const activeFilters: Record<string, FilterValue> = {};\r\n let hasFilters = false;\r\n \r\n for (const [field, value] of Object.entries(filters)) {\r\n if (value !== undefined) {\r\n activeFilters[field] = value;\r\n hasFilters = true;\r\n }\r\n }\r\n\r\n // Per spec: filters must be undefined when empty (not {})\r\n const filtersToSend = hasFilters ? activeFilters : undefined;\r\n\r\n setQuery((prev) => ({\r\n ...prev,\r\n filters: filtersToSend,\r\n page: 1, // Reset page to 1 when filters change\r\n }));\r\n }, [filters, enableFilters]);\r\n\r\n // Fetch data effect\r\n useEffect(() => {\r\n const currentRequestId = ++requestIdRef.current;\r\n\r\n setDataState((prev) => ({ ...prev, state: 'loading' }));\r\n\r\n fetcher(query)\r\n .then((result) => {\r\n // Ignore stale responses\r\n if (currentRequestId !== requestIdRef.current) {\r\n return;\r\n }\r\n\r\n if (result.items.length === 0) {\r\n setDataState({\r\n state: 'empty',\r\n items: [],\r\n total: result.total,\r\n });\r\n } else {\r\n setDataState({\r\n state: 'success',\r\n items: result.items,\r\n total: result.total,\r\n });\r\n }\r\n })\r\n .catch((error: unknown) => {\r\n // Ignore stale responses\r\n if (currentRequestId !== requestIdRef.current) {\r\n return;\r\n }\r\n\r\n setDataState({\r\n state: 'error',\r\n items: [],\r\n total: 0,\r\n error: error instanceof Error ? error.message : 'Failed to load data',\r\n });\r\n });\r\n }, [fetcher, query]);\r\n\r\n // Retry handler\r\n const handleRetry = () => {\r\n // Force re-fetch by updating query reference\r\n setQuery({ ...query });\r\n };\r\n\r\n // Pagination handlers\r\n const handlePreviousPage = () => {\r\n if (query.page > 1) {\r\n setQuery((prev) => ({ ...prev, page: prev.page - 1 }));\r\n }\r\n };\r\n\r\n const handleNextPage = () => {\r\n const totalPages = Math.ceil(dataState.total / query.pageSize);\r\n if (query.page < totalPages) {\r\n setQuery((prev) => ({ ...prev, page: prev.page + 1 }));\r\n }\r\n };\r\n\r\n const handlePageSizeChange = (newPageSize: number) => {\r\n setQuery({ ...query, pageSize: newPageSize, page: 1 });\r\n };\r\n\r\n // Sorting handler\r\n const handleSort = (field: string) => {\r\n setQuery((prev) => {\r\n // If sorting by a different field, start with ascending\r\n if (prev.sort?.field !== field) {\r\n return { ...prev, sort: { field, direction: 'asc' }, page: 1 };\r\n }\r\n\r\n // Toggle sort direction for the same field\r\n if (prev.sort.direction === 'asc') {\r\n return { ...prev, sort: { field, direction: 'desc' }, page: 1 };\r\n }\r\n\r\n // Remove sort (back to unsorted)\r\n const { sort: _sort, ...rest } = prev;\r\n return { ...rest, page: 1 };\r\n });\r\n };\r\n\r\n // Get sort indicator for a column\r\n const getSortIndicator = (field: string): string => {\r\n if (!query.sort || query.sort.field !== field) {\r\n return '';\r\n }\r\n return query.sort.direction === 'asc' ? ' ↑' : ' ↓';\r\n };\r\n\r\n // Filter handlers\r\n const handleFilterChange = (field: string, value: FilterValue | undefined) => {\r\n setFilters((prev) => ({\r\n ...prev,\r\n [field]: value,\r\n }));\r\n };\r\n\r\n const handleClearFilter = (field: string) => {\r\n setFilters((prev) => {\r\n const newFilters = { ...prev };\r\n delete newFilters[field];\r\n return newFilters;\r\n });\r\n };\r\n\r\n const handleClearAllFilters = () => {\r\n setFilters({});\r\n };\r\n\r\n const isLoading = dataState.state === 'loading';\r\n const isError = dataState.state === 'error';\r\n const isEmpty = dataState.state === 'empty';\r\n const totalPages = Math.ceil(dataState.total / query.pageSize);\r\n const canGoPrevious = query.page > 1 && !isLoading;\r\n const canGoNext = query.page < totalPages && !isLoading;\r\n\r\n const hasActiveFilters = enableFilters && Object.values(filters).some(v => v !== undefined);\r\n\r\n return (\r\n <div className={`rowakit-table${className ? ` ${className}` : ''}`}>\r\n {hasActiveFilters && (\r\n <div className=\"rowakit-table-filter-controls\">\r\n <button\r\n onClick={handleClearAllFilters}\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n type=\"button\"\r\n >\r\n Clear all filters\r\n </button>\r\n </div>\r\n )}\r\n <table>\r\n <thead>\r\n <tr>\r\n {columns.map((column) => {\r\n const isSortable = column.kind !== 'actions' && \r\n (column.kind === 'custom' ? false : column.sortable === true);\r\n const field = column.kind === 'actions' ? '' : \r\n column.kind === 'custom' ? column.field : \r\n column.field;\r\n\r\n return (\r\n <th\r\n key={column.id}\r\n onClick={isSortable ? () => handleSort(String(field)) : undefined}\r\n role={isSortable ? 'button' : undefined}\r\n tabIndex={isSortable ? 0 : undefined}\r\n onKeyDown={isSortable ? (e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleSort(String(field));\r\n }\r\n } : undefined}\r\n aria-sort={\r\n isSortable && query.sort?.field === String(field)\r\n ? query.sort.direction === 'asc' ? 'ascending' : 'descending'\r\n : undefined\r\n }\r\n style={{\r\n width: column.width ? `${column.width}px` : undefined,\r\n textAlign: column.align,\r\n }}\r\n className={column.truncate ? 'rowakit-cell-truncate' : undefined}\r\n >\r\n {getHeaderLabel(column)}{isSortable && getSortIndicator(String(field))}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n {enableFilters && (\r\n <tr className=\"rowakit-table-filter-row\">\r\n {columns.map((column) => {\r\n const field = column.kind === 'actions' || column.kind === 'custom' ? '' : String(column.field);\r\n const canFilter = field && column.kind !== 'actions';\r\n \r\n if (!canFilter) {\r\n return <th key={column.id}></th>;\r\n }\r\n\r\n const filterValue = filters[field];\r\n\r\n // Badge column: select with options\r\n if (column.kind === 'badge') {\r\n const options = column.map ? Object.keys(column.map) : [];\r\n return (\r\n <th key={column.id}>\r\n <select\r\n className=\"rowakit-filter-select\"\r\n value={filterValue?.op === 'equals' ? String(filterValue.value ?? '') : ''}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n if (value === '') {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'equals', value });\r\n }\r\n }}\r\n >\r\n <option value=\"\">All</option>\r\n {options.map((opt) => (\r\n <option key={opt} value={opt}>\r\n {opt}\r\n </option>\r\n ))}\r\n </select>\r\n </th>\r\n );\r\n }\r\n\r\n // Boolean column: select with True/False/All\r\n if (column.kind === 'boolean') {\r\n return (\r\n <th key={column.id}>\r\n <select\r\n className=\"rowakit-filter-select\"\r\n value={\r\n filterValue?.op === 'equals' && typeof filterValue.value === 'boolean'\r\n ? String(filterValue.value)\r\n : ''\r\n }\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n if (value === '') {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'equals', value: value === 'true' });\r\n }\r\n }}\r\n >\r\n <option value=\"\">All</option>\r\n <option value=\"true\">True</option>\r\n <option value=\"false\">False</option>\r\n </select>\r\n </th>\r\n );\r\n }\r\n\r\n // Date column: from/to inputs\r\n if (column.kind === 'date') {\r\n const fromValue = filterValue?.op === 'range' ? filterValue.value.from ?? '' : '';\r\n const toValue = filterValue?.op === 'range' ? filterValue.value.to ?? '' : '';\r\n \r\n return (\r\n <th key={column.id}>\r\n <div className=\"rowakit-filter-date-range\">\r\n <input\r\n type=\"date\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"From\"\r\n value={fromValue}\r\n onChange={(e) => {\r\n const from = e.target.value || undefined;\r\n const to = toValue || undefined;\r\n if (!from && !to) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } });\r\n }\r\n }}\r\n />\r\n <input\r\n type=\"date\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"To\"\r\n value={toValue}\r\n onChange={(e) => {\r\n const to = e.target.value || undefined;\r\n const from = fromValue || undefined;\r\n if (!from && !to) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } });\r\n }\r\n }}\r\n />\r\n </div>\r\n </th>\r\n );\r\n }\r\n\r\n // Text/Number column: text or number input\r\n const isNumberColumn = column.kind === 'number';\r\n return (\r\n <th key={column.id}>\r\n <input\r\n type={isNumberColumn ? 'number' : 'text'}\r\n className=\"rowakit-filter-input\"\r\n placeholder={`Filter ${getHeaderLabel(column)}...`}\r\n value={\r\n filterValue?.op === 'contains'\r\n ? filterValue.value\r\n : filterValue?.op === 'equals' && typeof filterValue.value === 'string'\r\n ? filterValue.value\r\n : filterValue?.op === 'equals' && typeof filterValue.value === 'number'\r\n ? String(filterValue.value)\r\n : ''\r\n }\r\n onChange={(e) => {\r\n const rawValue = e.target.value;\r\n if (rawValue === '') {\r\n handleClearFilter(field);\r\n } else if (isNumberColumn) {\r\n const numValue = Number(rawValue);\r\n if (!isNaN(numValue)) {\r\n // Send the parsed numeric value, not the string\r\n handleFilterChange(field, { op: 'equals', value: numValue } as FilterValue);\r\n } else {\r\n // Invalid numeric input: clear the filter to avoid confusing UX\r\n handleClearFilter(field);\r\n }\r\n } else {\r\n // Text: use \"contains\"\r\n handleFilterChange(field, { op: 'contains', value: rawValue } as FilterValue);\r\n }\r\n }}\r\n />\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n )}\r\n </thead>\r\n <tbody>\r\n {isLoading && (\r\n <tr>\r\n <td colSpan={columns.length} className=\"rowakit-table-loading\">\r\n <div className=\"rowakit-table-loading-spinner\"></div>\r\n <span>Loading...</span>\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {isError && (\r\n <tr>\r\n <td colSpan={columns.length} className=\"rowakit-table-error\">\r\n <div className=\"rowakit-table-error-message\">\r\n {dataState.error ?? 'An error occurred'}\r\n </div>\r\n <button\r\n onClick={handleRetry}\r\n className=\"rowakit-button rowakit-button-primary\"\r\n type=\"button\"\r\n >\r\n Retry\r\n </button>\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {isEmpty && (\r\n <tr>\r\n <td colSpan={columns.length} className=\"rowakit-table-empty\">\r\n No data\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {dataState.state === 'success' &&\r\n dataState.items.map((row) => {\r\n const key = getRowKey(row, rowKey);\r\n return (\r\n <tr key={key}>\r\n {columns.map((column) => {\r\n const cellClass = [\r\n column.kind === 'number' ? 'rowakit-cell-number' : '',\r\n column.truncate ? 'rowakit-cell-truncate' : '',\r\n ].filter(Boolean).join(' ') || undefined;\r\n \r\n return (\r\n <td \r\n key={column.id}\r\n className={cellClass}\r\n style={{\r\n width: column.width ? `${column.width}px` : undefined,\r\n textAlign: column.align || (column.kind === 'number' ? 'right' : undefined),\r\n }}\r\n >\r\n {renderCell(column, row, isLoading, setConfirmState)}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n\r\n {/* Pagination Controls */}\r\n {dataState.total > 0 && (\r\n <div className=\"rowakit-table-pagination\">\r\n {/* Left: Page size selector */}\r\n <div className=\"rowakit-table-pagination-left\">\r\n <label htmlFor=\"page-size\">\r\n Rows per page:\r\n </label>\r\n <select\r\n id=\"page-size\"\r\n value={query.pageSize}\r\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\r\n disabled={isLoading}\r\n >\r\n {pageSizeOptions.map((size) => (\r\n <option key={size} value={size}>\r\n {size}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Center: Page info */}\r\n <div className=\"rowakit-table-pagination-center\">\r\n Page {query.page} of {totalPages} ({dataState.total} total)\r\n </div>\r\n\r\n {/* Right: Previous/Next buttons */}\r\n <div className=\"rowakit-table-pagination-right\">\r\n <button\r\n onClick={handlePreviousPage}\r\n disabled={!canGoPrevious}\r\n className=\"rowakit-button rowakit-button-primary rowakit-button-pagination\"\r\n type=\"button\"\r\n aria-label=\"Previous page\"\r\n >\r\n Previous\r\n </button>\r\n <button\r\n onClick={handleNextPage}\r\n disabled={!canGoNext}\r\n className=\"rowakit-button rowakit-button-primary rowakit-button-pagination\"\r\n type=\"button\"\r\n aria-label=\"Next page\"\r\n >\r\n Next\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Confirmation Modal */}\r\n {confirmState && (\r\n <div\r\n className=\"rowakit-modal-backdrop\"\r\n onClick={() => setConfirmState(null)}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"confirm-dialog-title\"\r\n >\r\n <div className=\"rowakit-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h2 id=\"confirm-dialog-title\" className=\"rowakit-modal-title\">\r\n Confirm Action\r\n </h2>\r\n <p className=\"rowakit-modal-content\">\r\n Are you sure you want to {confirmState.action.label.toLowerCase()}? This action cannot be\r\n undone.\r\n </p>\r\n <div className=\"rowakit-modal-actions\">\r\n <button\r\n onClick={() => setConfirmState(null)}\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n type=\"button\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={() => {\r\n void confirmState.action.onClick(confirmState.row);\r\n setConfirmState(null);\r\n }}\r\n className=\"rowakit-button rowakit-button-danger\"\r\n type=\"button\"\r\n >\r\n Confirm\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * @deprecated Use RowaKitTable instead. SmartTable is kept as an alias for backward compatibility.\r\n */\r\nexport const SmartTable = RowaKitTable;\r\n","/**\r\n * @rowakit/table\r\n *\r\n * Opinionated, server-side-first table component for internal/business apps.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// Core types\r\nexport type {\r\n // Fetcher types\r\n Fetcher,\r\n FetcherQuery,\r\n FetcherResult,\r\n FilterValue,\r\n Filters,\r\n // Column types\r\n ColumnDef,\r\n ColumnKind,\r\n BaseColumnDef,\r\n TextColumnDef,\r\n DateColumnDef,\r\n BooleanColumnDef,\r\n BadgeColumnDef,\r\n NumberColumnDef,\r\n ActionsColumnDef,\r\n CustomColumnDef,\r\n BadgeTone,\r\n // Action types\r\n ActionDef,\r\n} from './types';\r\n\r\n// Column helper factory\r\nexport { col } from './column-helpers';\r\n\r\n// Components\r\nexport { RowaKitTable, SmartTable } from './components/SmartTable';\r\nexport type { SmartTableProps } from './components/SmartTable';\r\n\r\nexport const VERSION = '0.1.0';\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/column-helpers.ts","../src/components/SmartTable.tsx","../src/index.ts"],"names":["actions","jsx","jsxs","useState","useRef","useEffect","totalPages","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * Column helper factory functions\r\n *\r\n * These helpers provide a clean, type-safe API for defining table columns.\r\n * They reduce boilerplate and enforce conventions while maintaining flexibility\r\n * through the `col.custom` escape hatch.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport type { ReactNode } from 'react';\r\nimport type {\r\n TextColumnDef,\r\n DateColumnDef,\r\n BooleanColumnDef,\r\n BadgeColumnDef,\r\n NumberColumnDef,\r\n ActionsColumnDef,\r\n CustomColumnDef,\r\n ActionDef,\r\n BadgeTone,\r\n} from './types';\r\n\r\n// ============================================================================\r\n// HELPER OPTIONS\r\n// ============================================================================\r\n\r\ninterface TextOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional formatter function */\r\n format?: (value: unknown) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface DateOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional date formatter function */\r\n format?: (value: Date | string | number) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface BooleanOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Optional boolean formatter function */\r\n format?: (value: boolean) => string;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface BadgeOptions {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Value-to-badge mapping */\r\n map?: Record<string, { label: string; tone: BadgeTone }>;\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\ninterface NumberOptions<T = unknown> {\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Enable sorting for this column */\r\n sortable?: boolean;\r\n /** Formatting options: Intl.NumberFormatOptions or custom formatter */\r\n format?: Intl.NumberFormatOptions | ((value: number, row: T) => string);\r\n /** Column width in pixels */\r\n width?: number;\r\n /** Text alignment */\r\n align?: 'left' | 'center' | 'right';\r\n /** Enable text truncation with ellipsis */\r\n truncate?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// COLUMN HELPER FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Create a text column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.text('name')\r\n * col.text('email', { header: 'Email Address', sortable: true })\r\n * col.text('status', { format: (val) => val.toUpperCase() })\r\n * ```\r\n */\r\nfunction text<T>(\r\n field: keyof T & string,\r\n options?: TextOptions\r\n): TextColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'text',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a date column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.date('createdAt')\r\n * col.date('updatedAt', { header: 'Last Modified', sortable: true })\r\n * col.date('birthday', {\r\n * format: (date) => new Date(date).toLocaleDateString()\r\n * })\r\n * ```\r\n */\r\nfunction date<T>(\r\n field: keyof T & string,\r\n options?: DateOptions\r\n): DateColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'date',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a boolean column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.boolean('active')\r\n * col.boolean('isPublished', { header: 'Published', sortable: true })\r\n * col.boolean('enabled', {\r\n * format: (val) => val ? 'Yes' : 'No'\r\n * })\r\n * ```\r\n */\r\nfunction boolean<T>(\r\n field: keyof T & string,\r\n options?: BooleanOptions\r\n): BooleanColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'boolean',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a badge column definition for status/enum fields.\r\n *\r\n * @example\r\n * ```ts\r\n * col.badge('status')\r\n * col.badge('status', {\r\n * map: {\r\n * active: { label: 'Active', tone: 'success' },\r\n * paused: { label: 'Paused', tone: 'warning' },\r\n * disabled: { label: 'Disabled', tone: 'danger' }\r\n * }\r\n * })\r\n * ```\r\n */\r\nfunction badge<T>(\r\n field: keyof T & string,\r\n options?: BadgeOptions\r\n): BadgeColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'badge',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n map: options?.map,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create a number column definition.\r\n *\r\n * @example\r\n * ```ts\r\n * col.number('amount')\r\n * col.number('price', {\r\n * format: { style: 'currency', currency: 'USD' }\r\n * })\r\n * col.number('count', {\r\n * format: (val, row) => `${val} items`\r\n * })\r\n * ```\r\n */\r\nfunction number<T>(\r\n field: keyof T & string,\r\n options?: NumberOptions<T>\r\n): NumberColumnDef<T> {\r\n return {\r\n id: field,\r\n kind: 'number',\r\n field,\r\n header: options?.header,\r\n sortable: options?.sortable ?? false,\r\n format: options?.format,\r\n width: options?.width,\r\n align: options?.align,\r\n truncate: options?.truncate,\r\n };\r\n}\r\n\r\n/**\r\n * Create an actions column definition.\r\n *\r\n * The actions column displays a set of actions (buttons/links) that can be\r\n * performed on each row.\r\n *\r\n * @example\r\n * ```ts\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (row) => editUser(row) },\r\n * { id: 'delete', label: 'Delete', confirm: true, onClick: (row) => deleteUser(row) }\r\n * ])\r\n * ```\r\n */\r\nfunction actions<T>(actions: ActionDef<T>[]): ActionsColumnDef<T> {\r\n return {\r\n id: 'actions',\r\n kind: 'actions',\r\n actions,\r\n };\r\n}\r\n\r\n/**\r\n * Create a custom column definition with full rendering control.\r\n *\r\n * This is the escape hatch for any column that doesn't fit the standard types.\r\n * Use this for badges, avatars, complex formatting, or any custom UI.\r\n *\r\n * @example\r\n * ```ts\r\n * col.custom({\r\n * id: 'avatar',\r\n * header: 'User',\r\n * render: (row) => <img src={row.avatar} alt={row.name} />\r\n * })\r\n *\r\n * col.custom({\r\n * id: 'price',\r\n * field: 'price',\r\n * render: (row) => <Money amount={row.price} currency={row.currency} />\r\n * })\r\n *\r\n * col.custom({\r\n * id: 'status',\r\n * render: (row) => (\r\n * <Badge color={row.status === 'active' ? 'green' : 'gray'}>\r\n * {row.status}\r\n * </Badge>\r\n * )\r\n * })\r\n * ```\r\n */\r\nfunction custom<T>(\r\n field: keyof T & string,\r\n render: (row: T) => ReactNode\r\n): CustomColumnDef<T>;\r\nfunction custom<T>(options: {\r\n /** Unique column identifier */\r\n id: string;\r\n /** Optional custom header label */\r\n header?: string;\r\n /** Optional field name for sorting/filtering */\r\n field?: keyof T & string;\r\n /** Render function for cell content */\r\n render: (row: T) => ReactNode;\r\n}): CustomColumnDef<T>;\r\nfunction custom<T>(\r\n arg1:\r\n | (keyof T & string)\r\n | {\r\n id: string;\r\n header?: string;\r\n field?: keyof T & string;\r\n render: (row: T) => ReactNode;\r\n },\r\n arg2?: (row: T) => ReactNode\r\n): CustomColumnDef<T> {\r\n if (typeof arg1 === 'string') {\r\n if (typeof arg2 !== 'function') {\r\n throw new Error('col.custom(field, render): render must be a function');\r\n }\r\n\r\n return {\r\n id: arg1,\r\n kind: 'custom',\r\n field: arg1,\r\n render: arg2,\r\n };\r\n }\r\n\r\n return {\r\n id: arg1.id,\r\n kind: 'custom',\r\n header: arg1.header,\r\n field: arg1.field,\r\n render: arg1.render,\r\n };\r\n}\r\n\r\n// ============================================================================\r\n// EXPORTS\r\n// ============================================================================\r\n\r\n/**\r\n * Column helper factory object.\r\n *\r\n * Provides convenient helper functions for creating column definitions.\r\n *\r\n * @example\r\n * ```tsx\r\n * import { col } from '@rowakit/table';\r\n *\r\n * const columns = [\r\n * col.text('name', { sortable: true }),\r\n * col.date('createdAt'),\r\n * col.boolean('active'),\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (row) => {} }\r\n * ]),\r\n * col.custom({ id: 'badge', render: (row) => <Badge>{row.status}</Badge> })\r\n * ];\r\n * ```\r\n */\r\nexport const col = {\r\n text,\r\n date,\r\n boolean,\r\n badge,\r\n number,\r\n actions,\r\n custom,\r\n} as const;\r\n","/**\r\n * RowaKit Table Component\r\n *\r\n * Core table rendering component that maps columns to table cells.\r\n * Handles all column types: text, date, boolean, actions, and custom.\r\n * Includes data fetching state machine with loading/error/empty states.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { useState, useEffect, useRef } from 'react';\r\nimport type { ReactNode } from 'react';\r\nimport type { Fetcher, ColumnDef, FetcherQuery, ActionDef, FilterValue, ActionsColumnDef } from '../types';\r\n\r\n// ============================================================================\r\n// COMPONENT PROPS\r\n// ============================================================================\r\n\r\nexport interface SmartTableProps<T> {\r\n /** Server-side data fetcher function */\r\n fetcher: Fetcher<T>;\r\n\r\n /** Array of column definitions */\r\n columns: ColumnDef<T>[];\r\n\r\n /** Available page size options (default: [10, 20, 50]) */\r\n pageSizeOptions?: number[];\r\n\r\n /** Initial page size (default: 20) */\r\n defaultPageSize?: number;\r\n\r\n /** Function or field name to extract row key (default: uses 'id' field) */\r\n rowKey?: keyof T | ((row: T) => string | number);\r\n\r\n /** Optional CSS class name for the table container */\r\n className?: string;\r\n\r\n /** Enable filters (default: false) */\r\n enableFilters?: boolean;\r\n\r\n /** Stage C: Enable column resizing (default: false) */\r\n enableColumnResizing?: boolean;\r\n\r\n /** Stage C: Sync table state to URL query string (default: false) */\r\n syncToUrl?: boolean;\r\n\r\n /** Stage C: Enable saved views feature (default: false) */\r\n enableSavedViews?: boolean;\r\n}\r\n\r\n// ============================================================================\r\n// STATE MANAGEMENT\r\n// ============================================================================\r\n\r\ntype FetchState = 'idle' | 'loading' | 'success' | 'empty' | 'error';\r\n\r\ninterface DataState<T> {\r\n state: FetchState;\r\n items: T[];\r\n total: number;\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Confirmation state for actions that require confirmation.\r\n */\r\ninterface ConfirmState<T> {\r\n action: ActionDef<T>;\r\n row: T;\r\n}\r\n\r\n// ============================================================================\r\n// HELPER FUNCTIONS\r\n// ============================================================================\r\n\r\n/**\r\n * Extract unique key from a row.\r\n */\r\nfunction getRowKey<T>(row: T, rowKey?: keyof T | ((row: T) => string | number)): string | number {\r\n if (typeof rowKey === 'function') {\r\n return rowKey(row);\r\n }\r\n if (rowKey) {\r\n return String(row[rowKey]);\r\n }\r\n // Fallback to 'id' field if available\r\n if (row && typeof row === 'object' && 'id' in row) {\r\n return String(row.id);\r\n }\r\n // Last resort: use object reference (not ideal but safe)\r\n return String(row);\r\n}\r\n\r\n/**\r\n * Get header label for a column.\r\n */\r\nfunction getHeaderLabel<T>(column: ColumnDef<T>): string {\r\n return column.header ?? column.id;\r\n}\r\n\r\n// ============================================================================\r\n// PRD-04: SAVED VIEWS STORAGE HELPERS\r\n// ============================================================================\r\n\r\ninterface SavedViewsIndex {\r\n name: string;\r\n updatedAt: number;\r\n}\r\n\r\n/**\r\n * Validate saved view name.\r\n * Rules: trim, 1–40 chars, reject control chars and `/\\?%*:|\"<>`\r\n */\r\nfunction validateViewName(name: string): { valid: boolean; error?: string } {\r\n const trimmed = name.trim();\r\n \r\n if (trimmed.length === 0) {\r\n return { valid: false, error: 'Name cannot be empty' };\r\n }\r\n \r\n if (trimmed.length > 40) {\r\n return { valid: false, error: 'Name cannot exceed 40 characters' };\r\n }\r\n \r\n // Reject control chars and special chars\r\n // eslint-disable-next-line no-control-regex\r\n const invalidChars = /[/\\\\?%*:|\"<>\\x00-\\x1f\\x7f]/;\r\n if (invalidChars.test(trimmed)) {\r\n return { valid: false, error: 'Name contains invalid characters' };\r\n }\r\n \r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Get saved views index from storage.\r\n * If missing, scan localStorage for rowakit-view-* keys and rebuild index.\r\n */\r\nfunction getSavedViewsIndex(): SavedViewsIndex[] {\r\n if (typeof window === 'undefined' || !window.localStorage) {\r\n return [];\r\n }\r\n\r\n try {\r\n const indexStr = localStorage.getItem('rowakit-views-index');\r\n if (indexStr) {\r\n const index = JSON.parse(indexStr) as SavedViewsIndex[];\r\n if (Array.isArray(index)) {\r\n return index;\r\n }\r\n }\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n\r\n // Rebuild index from existing keys\r\n const rebuilt: SavedViewsIndex[] = [];\r\n try {\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n if (key?.startsWith('rowakit-view-')) {\r\n const name = key.substring('rowakit-view-'.length);\r\n rebuilt.push({\r\n name,\r\n updatedAt: Date.now(),\r\n });\r\n }\r\n }\r\n } catch {\r\n // Ignore iteration errors\r\n }\r\n\r\n return rebuilt;\r\n}\r\n\r\n/**\r\n * Save views index to storage.\r\n */\r\nfunction setSavedViewsIndex(index: SavedViewsIndex[]): void {\r\n if (typeof window === 'undefined' || !window.localStorage) {\r\n return;\r\n }\r\n\r\n try {\r\n localStorage.setItem('rowakit-views-index', JSON.stringify(index));\r\n } catch {\r\n // Ignore storage errors\r\n }\r\n}\r\n\r\n/**\r\n * Load all saved views from storage.\r\n * Parses index and reads each view, skipping corrupt entries.\r\n */\r\nfunction loadSavedViewsFromStorage(): Array<{\r\n name: string;\r\n state: {\r\n page: number;\r\n pageSize: number;\r\n sort?: { field: string; direction: 'asc' | 'desc' };\r\n filters?: Record<string, FilterValue | undefined>;\r\n columnWidths?: Record<string, number>;\r\n };\r\n}> {\r\n if (typeof window === 'undefined' || !window.localStorage) {\r\n return [];\r\n }\r\n\r\n const index = getSavedViewsIndex();\r\n const views = [];\r\n\r\n for (const entry of index) {\r\n try {\r\n const viewStr = localStorage.getItem(`rowakit-view-${entry.name}`);\r\n if (viewStr) {\r\n const state = JSON.parse(viewStr);\r\n views.push({\r\n name: entry.name,\r\n state,\r\n });\r\n }\r\n } catch {\r\n // Skip corrupt entries\r\n }\r\n }\r\n\r\n return views;\r\n}\r\n\r\n// ============================================================================\r\n// PRD-05: URL STATE PARSING & SERIALIZATION\r\n// ============================================================================\r\n\r\n/**\r\n * Parse URL search parameters into table state.\r\n * Validates all values according to PRD-05 rules:\r\n * - page >= 1\r\n * - pageSize from options or defaultPageSize\r\n * - sortDirection only asc|desc\r\n * - filters must be object\r\n * - columnWidths must be object of numbers\r\n */\r\nfunction parseUrlState(\r\n params: URLSearchParams,\r\n defaultPageSize: number,\r\n pageSizeOptions?: number[]\r\n): {\r\n page: number;\r\n pageSize: number;\r\n sort?: { field: string; direction: 'asc' | 'desc' };\r\n filters?: Record<string, FilterValue | undefined>;\r\n columnWidths?: Record<string, number>;\r\n} {\r\n // Parse page (default 1, must be >= 1)\r\n const pageStr = params.get('page');\r\n let page = 1;\r\n if (pageStr) {\r\n const parsed = parseInt(pageStr, 10);\r\n page = !isNaN(parsed) && parsed >= 1 ? parsed : 1;\r\n }\r\n\r\n // Parse pageSize (must be valid or use default)\r\n const pageSizeStr = params.get('pageSize');\r\n let pageSize = defaultPageSize;\r\n if (pageSizeStr) {\r\n const parsed = parseInt(pageSizeStr, 10);\r\n if (!isNaN(parsed) && parsed >= 1) {\r\n // If pageSizeOptions provided, validate against it; otherwise accept\r\n if (pageSizeOptions && pageSizeOptions.length > 0) {\r\n pageSize = pageSizeOptions.includes(parsed) ? parsed : defaultPageSize;\r\n } else {\r\n pageSize = parsed;\r\n }\r\n }\r\n }\r\n\r\n const result: {\r\n page: number;\r\n pageSize: number;\r\n sort?: { field: string; direction: 'asc' | 'desc' };\r\n filters?: Record<string, FilterValue | undefined>;\r\n columnWidths?: Record<string, number>;\r\n } = { page, pageSize };\r\n\r\n // Parse sort (only if both field and valid direction present)\r\n const sortField = params.get('sortField');\r\n const sortDir = params.get('sortDirection');\r\n if (sortField && (sortDir === 'asc' || sortDir === 'desc')) {\r\n result.sort = { field: sortField, direction: sortDir };\r\n }\r\n\r\n // Parse filters (must be valid JSON object)\r\n const filtersStr = params.get('filters');\r\n if (filtersStr) {\r\n try {\r\n const parsed = JSON.parse(filtersStr);\r\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n result.filters = parsed;\r\n }\r\n } catch {\r\n // Ignore invalid filters\r\n }\r\n }\r\n\r\n // Parse columnWidths (must be valid JSON object with number values)\r\n const widthsStr = params.get('columnWidths');\r\n if (widthsStr) {\r\n try {\r\n const parsed = JSON.parse(widthsStr);\r\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n // Validate all values are numbers\r\n const widths: Record<string, number> = {};\r\n for (const [key, value] of Object.entries(parsed)) {\r\n if (typeof value === 'number' && value > 0) {\r\n widths[key] = value;\r\n }\r\n }\r\n if (Object.keys(widths).length > 0) {\r\n result.columnWidths = widths;\r\n }\r\n }\r\n } catch {\r\n // Ignore invalid column widths\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Serialize table state to URL search parameters.\r\n * Omits empty/default values to keep URLs short.\r\n * PRD-05: Only includes columnWidths if enableColumnResizing is true.\r\n */\r\nfunction serializeUrlState(\r\n query: FetcherQuery,\r\n filters: Record<string, FilterValue | undefined>,\r\n columnWidths: Record<string, number>,\r\n defaultPageSize: number,\r\n enableColumnResizing: boolean\r\n): string {\r\n const params = new URLSearchParams();\r\n\r\n // Always include page (even if 1, for clarity)\r\n params.set('page', String(query.page));\r\n \r\n // Only include pageSize if different from default\r\n if (query.pageSize !== defaultPageSize) {\r\n params.set('pageSize', String(query.pageSize));\r\n }\r\n\r\n // Include sort if present\r\n if (query.sort) {\r\n params.set('sortField', query.sort.field);\r\n params.set('sortDirection', query.sort.direction);\r\n }\r\n\r\n // Include filters if non-empty\r\n if (filters && Object.keys(filters).length > 0) {\r\n const nonEmptyFilters = Object.fromEntries(\r\n Object.entries(filters).filter(([, v]) => v !== undefined)\r\n );\r\n if (Object.keys(nonEmptyFilters).length > 0) {\r\n params.set('filters', JSON.stringify(nonEmptyFilters));\r\n }\r\n }\r\n\r\n // Include columnWidths only if resizing enabled and widths exist\r\n if (enableColumnResizing && Object.keys(columnWidths).length > 0) {\r\n params.set('columnWidths', JSON.stringify(columnWidths));\r\n }\r\n\r\n return params.toString();\r\n}\r\n\r\nfunction renderCell<T>(\r\n column: ColumnDef<T>,\r\n row: T,\r\n isLoading: boolean,\r\n setConfirmState: (state: ConfirmState<T> | null) => void\r\n): ReactNode {\r\n switch (column.kind) {\r\n case 'text': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(value);\r\n }\r\n return String(value ?? '');\r\n }\r\n\r\n case 'date': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(value as Date | string | number);\r\n }\r\n // Default date formatting\r\n if (value instanceof Date) {\r\n return value.toLocaleDateString();\r\n }\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n return new Date(value).toLocaleDateString();\r\n }\r\n return '';\r\n }\r\n\r\n case 'boolean': {\r\n const value = row[column.field];\r\n if (column.format) {\r\n return column.format(Boolean(value));\r\n }\r\n // Default boolean formatting\r\n return value ? 'Yes' : 'No';\r\n }\r\n\r\n case 'badge': {\r\n const value = row[column.field];\r\n const valueStr = String(value ?? '');\r\n \r\n // Look up mapping\r\n const mapped = column.map?.[valueStr];\r\n const label = mapped?.label ?? valueStr;\r\n const tone = mapped?.tone ?? 'neutral';\r\n \r\n return (\r\n <span className={`rowakit-badge rowakit-badge-${tone}`}>\r\n {label}\r\n </span>\r\n );\r\n }\r\n\r\n case 'number': {\r\n const value = row[column.field];\r\n const numValue = Number(value ?? 0);\r\n \r\n if (column.format) {\r\n if (typeof column.format === 'function') {\r\n return column.format(numValue, row);\r\n }\r\n // Intl.NumberFormatOptions\r\n return new Intl.NumberFormat(undefined, column.format).format(numValue);\r\n }\r\n \r\n // Default number formatting\r\n return numValue.toLocaleString();\r\n }\r\n\r\n case 'actions': {\r\n const columnWithActions = column as ActionsColumnDef<T>;\r\n // Safety check: ensure actions is an array\r\n if (!Array.isArray(columnWithActions.actions)) {\r\n return null;\r\n }\r\n return (\r\n <div className=\"rowakit-table-actions\">\r\n {columnWithActions.actions.map((action) => {\r\n const isDisabled =\r\n isLoading ||\r\n action.disabled === true ||\r\n (typeof action.disabled === 'function' && action.disabled(row));\r\n\r\n const handleClick = () => {\r\n if (isDisabled || action.loading) {\r\n return;\r\n }\r\n\r\n // If action requires confirmation, show modal\r\n if (action.confirm) {\r\n setConfirmState({ action, row });\r\n } else {\r\n // Execute action directly\r\n void action.onClick(row);\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n key={action.id}\r\n onClick={handleClick}\r\n disabled={isDisabled || action.loading}\r\n type=\"button\"\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n >\r\n {action.icon && typeof action.icon === 'string' ? (\r\n <span>{action.icon}</span>\r\n ) : (\r\n action.icon\r\n )}\r\n {action.label}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n }\r\n\r\n case 'custom': {\r\n return column.render(row);\r\n }\r\n\r\n default: {\r\n // Exhaustive check\r\n const _exhaustive: never = column;\r\n return _exhaustive;\r\n }\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// MAIN COMPONENT\r\n// ============================================================================\r\n\r\n/**\r\n * RowaKitTable - Server-side table component for internal/business apps.\r\n *\r\n * This component renders a table with headers and body based on column definitions.\r\n * It handles all column types (text, date, boolean, actions, custom) and provides\r\n * a clean API for defining table structure.\r\n *\r\n * Features:\r\n * - Automatic data fetching on mount and query changes\r\n * - Loading, error, and empty states\r\n * - Stale request handling\r\n * - Retry on error\r\n *\r\n * @example\r\n * ```tsx\r\n * import { RowaKitTable, col } from '@rowakit/table';\r\n *\r\n * interface User {\r\n * id: string;\r\n * name: string;\r\n * email: string;\r\n * createdAt: Date;\r\n * active: boolean;\r\n * }\r\n *\r\n * const fetchUsers: Fetcher<User> = async (query) => {\r\n * const response = await fetch(`/api/users?page=${query.page}&pageSize=${query.pageSize}`);\r\n * return response.json();\r\n * };\r\n *\r\n * function UsersTable() {\r\n * return (\r\n * <RowaKitTable\r\n * fetcher={fetchUsers}\r\n * columns={[\r\n * col.text('name', { header: 'Name', sortable: true }),\r\n * col.text('email', { header: 'Email' }),\r\n * col.date('createdAt', { header: 'Created' }),\r\n * col.boolean('active', { header: 'Active' }),\r\n * col.actions([\r\n * { id: 'edit', label: 'Edit', onClick: (user) => editUser(user) },\r\n * { id: 'delete', label: 'Delete', confirm: true, onClick: (user) => deleteUser(user) }\r\n * ])\r\n * ]}\r\n * defaultPageSize={20}\r\n * rowKey=\"id\"\r\n * />\r\n * );\r\n * }\r\n * ```\r\n */\r\nexport function RowaKitTable<T>({\r\n fetcher,\r\n columns,\r\n defaultPageSize = 20,\r\n pageSizeOptions = [10, 20, 50],\r\n rowKey,\r\n className = '',\r\n enableFilters = false,\r\n enableColumnResizing = false,\r\n syncToUrl = false,\r\n enableSavedViews = false,\r\n}: SmartTableProps<T>) {\r\n // State management\r\n const [dataState, setDataState] = useState<DataState<T>>({\r\n state: 'idle',\r\n items: [],\r\n total: 0,\r\n });\r\n\r\n const [query, setQuery] = useState<FetcherQuery>({\r\n page: 1,\r\n pageSize: defaultPageSize,\r\n });\r\n\r\n // Filter state (field -> FilterValue)\r\n const [filters, setFilters] = useState<Record<string, FilterValue | undefined>>({});\r\n\r\n // Stage C: Column widths for resizing\r\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>({});\r\n\r\n // Stage C: Refs for resize optimization\r\n const resizeRafRef = useRef<number | null>(null);\r\n const resizePendingRef = useRef<{ colId: string; width: number } | null>(null);\r\n const tableRef = useRef<HTMLTableElement | null>(null);\r\n\r\n // PRD-01: Prevent accidental sort during resize\r\n const isResizingRef = useRef(false);\r\n const lastResizeEndTsRef = useRef(0);\r\n const resizingColIdRef = useRef<string | null>(null);\r\n const didHydrateUrlRef = useRef(false);\r\n const didSkipInitialUrlSyncRef = useRef(false);\r\n\r\n // PRD-05: URL sync debounce ref (for columnWidths)\r\n const urlSyncDebounceRef = useRef<NodeJS.Timeout | null>(null);\r\n\r\n // Stage C: Saved views\r\n const [savedViews, setSavedViews] = useState<Array<{\r\n name: string;\r\n state: {\r\n page: number;\r\n pageSize: number;\r\n sort?: { field: string; direction: 'asc' | 'desc' };\r\n filters?: Record<string, FilterValue | undefined>;\r\n columnWidths?: Record<string, number>;\r\n };\r\n }>>([]);\r\n\r\n // PRD-04: Save view form state\r\n const [showSaveViewForm, setShowSaveViewForm] = useState(false);\r\n const [saveViewInput, setSaveViewInput] = useState('');\r\n const [saveViewError, setSaveViewError] = useState<string>('');\r\n const [overwriteConfirmName, setOverwriteConfirmName] = useState<string | null>(null);\r\n\r\n // PRD-04: Hydrate saved views on mount\r\n useEffect(() => {\r\n if (!enableSavedViews) return;\r\n\r\n const views = loadSavedViewsFromStorage();\r\n setSavedViews(views);\r\n }, [enableSavedViews]);\r\n\r\n // Confirmation state for actions that require confirmation\r\n const [confirmState, setConfirmState] = useState<ConfirmState<T> | null>(null);\r\n\r\n // Request tracking to ignore stale responses\r\n const requestIdRef = useRef(0);\r\n\r\n // Stage C: Sync to URL on query changes (PRD-05: Validated and debounced)\r\n useEffect(() => {\r\n if (!syncToUrl) {\r\n didSkipInitialUrlSyncRef.current = false;\r\n return;\r\n }\r\n\r\n // IMPORTANT: On mount, do not overwrite the incoming URL before\r\n // `parseUrlState` has a chance to read it.\r\n if (!didSkipInitialUrlSyncRef.current) {\r\n didSkipInitialUrlSyncRef.current = true;\r\n return;\r\n }\r\n\r\n // Clear any pending debounce\r\n if (urlSyncDebounceRef.current) {\r\n clearTimeout(urlSyncDebounceRef.current);\r\n urlSyncDebounceRef.current = null;\r\n }\r\n\r\n // Query/sort/filter changes: write immediately\r\n const urlStr = serializeUrlState(query, filters, columnWidths, defaultPageSize, enableColumnResizing);\r\n const qs = urlStr ? `?${urlStr}` : '';\r\n // Preserve hash (often used by hash routers like this demo gallery)\r\n window.history.replaceState(null, '', `${window.location.pathname}${qs}${window.location.hash}`);\r\n }, [query, filters, syncToUrl, enableColumnResizing, defaultPageSize, columnWidths]);\r\n\r\n // PRD-05: Debounce columnWidths updates (150ms) while resizing\r\n useEffect(() => {\r\n if (!syncToUrl || !enableColumnResizing) return;\r\n\r\n // Skip initial mount so we don't clobber URL before parsing.\r\n if (!didSkipInitialUrlSyncRef.current) return;\r\n\r\n // Clear any pending debounce\r\n if (urlSyncDebounceRef.current) {\r\n clearTimeout(urlSyncDebounceRef.current);\r\n }\r\n\r\n // Schedule debounced URL update for columnWidths\r\n urlSyncDebounceRef.current = setTimeout(() => {\r\n const urlStr = serializeUrlState(query, filters, columnWidths, defaultPageSize, enableColumnResizing);\r\n const qs = urlStr ? `?${urlStr}` : '';\r\n // Preserve hash (often used by hash routers like this demo gallery)\r\n window.history.replaceState(null, '', `${window.location.pathname}${qs}${window.location.hash}`);\r\n urlSyncDebounceRef.current = null;\r\n }, 150);\r\n\r\n // Cleanup on unmount\r\n return () => {\r\n if (urlSyncDebounceRef.current) {\r\n clearTimeout(urlSyncDebounceRef.current);\r\n urlSyncDebounceRef.current = null;\r\n }\r\n };\r\n }, [columnWidths, syncToUrl, enableColumnResizing, query, filters, defaultPageSize]);\r\n\r\n // Stage C: Load from URL on mount (PRD-05: Validated parsing)\r\n useEffect(() => {\r\n if (!syncToUrl) {\r\n // If URL sync is disabled, allow future re-hydration if re-enabled.\r\n didHydrateUrlRef.current = false;\r\n return;\r\n }\r\n if (didHydrateUrlRef.current) return;\r\n didHydrateUrlRef.current = true;\r\n\r\n const params = new URLSearchParams(window.location.search);\r\n const parsed = parseUrlState(params, defaultPageSize, pageSizeOptions);\r\n\r\n setQuery({\r\n page: parsed.page,\r\n pageSize: parsed.pageSize,\r\n sort: parsed.sort,\r\n filters: parsed.filters,\r\n });\r\n\r\n if (parsed.filters) {\r\n setFilters(parsed.filters);\r\n }\r\n\r\n if (parsed.columnWidths && enableColumnResizing) {\r\n // Clamp URL widths by per-column min/max so a stale/malicious URL can't\r\n // make a column unusably tiny (e.g. \"Product Name\" showing only \"P\").\r\n const clamped: Record<string, number> = {};\r\n for (const [colId, rawWidth] of Object.entries(parsed.columnWidths)) {\r\n const widthNum = typeof rawWidth === 'number' ? rawWidth : Number(rawWidth);\r\n if (!Number.isFinite(widthNum)) continue;\r\n\r\n const colDef = columns.find((c) => c.id === colId);\r\n if (!colDef) continue;\r\n\r\n const minW = colDef.minWidth ?? 80;\r\n const maxW = colDef.maxWidth;\r\n\r\n let finalW = Math.max(minW, widthNum);\r\n if (maxW != null) {\r\n finalW = Math.min(finalW, maxW);\r\n }\r\n clamped[colId] = finalW;\r\n }\r\n\r\n setColumnWidths(clamped);\r\n }\r\n // If URL doesn't provide widths, keep `columnWidths` empty and allow\r\n // defaults from `column.width` to apply.\r\n }, [syncToUrl, defaultPageSize, enableColumnResizing, pageSizeOptions, columns]);\r\n\r\n // Sync filters to query (and reset page to 1 when filters change)\r\n useEffect(() => {\r\n if (!enableFilters) return;\r\n\r\n // Build filters object, excluding undefined values\r\n const activeFilters: Record<string, FilterValue> = {};\r\n let hasFilters = false;\r\n \r\n for (const [field, value] of Object.entries(filters)) {\r\n if (value !== undefined) {\r\n activeFilters[field] = value;\r\n hasFilters = true;\r\n }\r\n }\r\n\r\n // Per spec: filters must be undefined when empty (not {})\r\n const filtersToSend = hasFilters ? activeFilters : undefined;\r\n\r\n setQuery((prev) => ({\r\n ...prev,\r\n filters: filtersToSend,\r\n page: 1, // Reset page to 1 when filters change\r\n }));\r\n }, [filters, enableFilters]);\r\n\r\n // Fetch data effect\r\n useEffect(() => {\r\n const currentRequestId = ++requestIdRef.current;\r\n\r\n setDataState((prev) => ({ ...prev, state: 'loading' }));\r\n\r\n fetcher(query)\r\n .then((result) => {\r\n // Ignore stale responses\r\n if (currentRequestId !== requestIdRef.current) {\r\n return;\r\n }\r\n\r\n if (result.items.length === 0) {\r\n setDataState({\r\n state: 'empty',\r\n items: [],\r\n total: result.total,\r\n });\r\n } else {\r\n setDataState({\r\n state: 'success',\r\n items: result.items,\r\n total: result.total,\r\n });\r\n }\r\n })\r\n .catch((error: unknown) => {\r\n // Ignore stale responses\r\n if (currentRequestId !== requestIdRef.current) {\r\n return;\r\n }\r\n\r\n setDataState({\r\n state: 'error',\r\n items: [],\r\n total: 0,\r\n error: error instanceof Error ? error.message : 'Failed to load data',\r\n });\r\n });\r\n }, [fetcher, query]);\r\n\r\n // Retry handler\r\n const handleRetry = () => {\r\n // Force re-fetch by updating query reference\r\n setQuery({ ...query });\r\n };\r\n\r\n // Pagination handlers\r\n const handlePreviousPage = () => {\r\n if (query.page > 1) {\r\n setQuery((prev) => ({ ...prev, page: prev.page - 1 }));\r\n }\r\n };\r\n\r\n const handleNextPage = () => {\r\n const totalPages = Math.ceil(dataState.total / query.pageSize);\r\n if (query.page < totalPages) {\r\n setQuery((prev) => ({ ...prev, page: prev.page + 1 }));\r\n }\r\n };\r\n\r\n const handlePageSizeChange = (newPageSize: number) => {\r\n setQuery({ ...query, pageSize: newPageSize, page: 1 });\r\n };\r\n\r\n // Sorting handler\r\n const handleSort = (field: string) => {\r\n setQuery((prev) => {\r\n // If sorting by a different field, start with ascending\r\n if (prev.sort?.field !== field) {\r\n return { ...prev, sort: { field, direction: 'asc' }, page: 1 };\r\n }\r\n\r\n // Toggle sort direction for the same field\r\n if (prev.sort.direction === 'asc') {\r\n return { ...prev, sort: { field, direction: 'desc' }, page: 1 };\r\n }\r\n\r\n // Remove sort (back to unsorted)\r\n const { sort: _sort, ...rest } = prev;\r\n return { ...rest, page: 1 };\r\n });\r\n };\r\n\r\n // Get sort indicator for a column\r\n const getSortIndicator = (field: string): string => {\r\n if (!query.sort || query.sort.field !== field) {\r\n return '';\r\n }\r\n return query.sort.direction === 'asc' ? ' ↑' : ' ↓';\r\n };\r\n\r\n // Stage C: Schedule column width update (RAF throttle)\r\n const scheduleColumnWidthUpdate = (colId: string, width: number) => {\r\n resizePendingRef.current = { colId, width };\r\n\r\n if (resizeRafRef.current != null) return;\r\n\r\n resizeRafRef.current = requestAnimationFrame(() => {\r\n resizeRafRef.current = null;\r\n\r\n const pending = resizePendingRef.current;\r\n if (!pending) return;\r\n\r\n handleColumnResize(pending.colId, pending.width);\r\n });\r\n };\r\n\r\n // Stage C: Column resize handler\r\n const handleColumnResize = (columnId: string, newWidth: number) => {\r\n // Enforce minimum width\r\n const minWidth = columns.find(c => c.id === columnId)?.minWidth ?? 80;\r\n const maxWidth = columns.find(c => c.id === columnId)?.maxWidth;\r\n \r\n let finalWidth = Math.max(minWidth, newWidth);\r\n if (maxWidth) {\r\n finalWidth = Math.min(finalWidth, maxWidth);\r\n }\r\n \r\n // PRD-03: Guard against unchanged widths to avoid extra renders\r\n if (columnWidths[columnId] === finalWidth) {\r\n return;\r\n }\r\n\r\n setColumnWidths((prev) => ({\r\n ...prev,\r\n [columnId]: finalWidth,\r\n }));\r\n };\r\n\r\n // Stage C: Column resize drag handler\r\n // PRD-02: Now uses Pointer Events for mouse + touch + pen support\r\n const autoFitColumnWidth = (columnId: string) => {\r\n const tableEl = tableRef.current;\r\n if (!tableEl) return;\r\n\r\n const th = tableEl.querySelector(`th[data-col-id=\"${columnId}\"]`) as HTMLTableCellElement | null;\r\n if (!th) return;\r\n\r\n const tds = Array.from(\r\n tableEl.querySelectorAll(`td[data-col-id=\"${columnId}\"]`),\r\n ) as HTMLTableCellElement[];\r\n\r\n const headerW = th.scrollWidth;\r\n const cellsMaxW = tds.reduce((max, td) => Math.max(max, td.scrollWidth), 0);\r\n\r\n const padding = 24; // buffer for padding + sort icon\r\n const raw = Math.max(headerW, cellsMaxW) + padding;\r\n\r\n const colDef = columns.find((c) => c.id === columnId);\r\n const minW = colDef?.minWidth ?? 80;\r\n const maxW = colDef?.maxWidth ?? 600;\r\n\r\n const finalW = Math.max(minW, Math.min(raw, maxW));\r\n setColumnWidths((prev) => ({ ...prev, [columnId]: finalW }));\r\n };\r\n\r\n const startColumnResize = (e: React.PointerEvent<HTMLDivElement>, columnId: string) => {\r\n e.preventDefault();\r\n e.stopPropagation(); // PRD-01: Prevent sort bubbling\r\n\r\n // Double-click auto-fit: handle via pointerdown.detail to avoid relying on\r\n // onDoubleClick sequencing in presence of pointer capture.\r\n if (e.detail === 2) {\r\n autoFitColumnWidth(columnId);\r\n return;\r\n }\r\n\r\n // PRD-02: Button gating for mouse pointer (require primary button)\r\n if (e.pointerType === 'mouse' && e.buttons !== 1) {\r\n return;\r\n }\r\n\r\n // Save currentTarget reference before event becomes stale\r\n const target = e.currentTarget;\r\n const pointerId = e.pointerId;\r\n\r\n // PRD-02: Acquire pointer capture on the handle element\r\n try {\r\n target.setPointerCapture(pointerId);\r\n } catch {\r\n // setPointerCapture may not be available in test environment\r\n }\r\n\r\n // PRD-01: Mark as resizing\r\n isResizingRef.current = true;\r\n resizingColIdRef.current = columnId;\r\n \r\n const startX = e.clientX;\r\n const th = (target.parentElement as HTMLTableCellElement);\r\n \r\n // Get the actual width of current column\r\n // (either from state if resized, or from offsetWidth if auto)\r\n let startWidth = columnWidths[columnId] ?? th.offsetWidth;\r\n\r\n // If current column is too small (< 80px), use a minimum base width\r\n // to ensure we always have enough space to drag comfortably\r\n const MIN_DRAG_WIDTH = 80;\r\n if (startWidth < MIN_DRAG_WIDTH) {\r\n // Try to get a usable width from next column or use fallback\r\n const nextTh = th.nextElementSibling as HTMLTableCellElement | null;\r\n if (nextTh && nextTh.offsetWidth >= 50) {\r\n startWidth = nextTh.offsetWidth;\r\n } else {\r\n // Fallback: use 100px as a comfortable base for dragging\r\n startWidth = 100;\r\n }\r\n }\r\n\r\n // Prevent text selection during drag\r\n document.body.classList.add('rowakit-resizing');\r\n\r\n // PRD-02: Use pointer events instead of mouse events\r\n const handlePointerMove = (moveEvent: PointerEvent) => {\r\n const delta = moveEvent.clientX - startX;\r\n const newWidth = startWidth + delta;\r\n // Use RAF throttle for smooth performance\r\n scheduleColumnWidthUpdate(columnId, newWidth);\r\n };\r\n\r\n const cleanupResize = () => {\r\n target.removeEventListener('pointermove', handlePointerMove);\r\n target.removeEventListener('pointerup', handlePointerUp);\r\n target.removeEventListener('pointercancel', handlePointerCancel);\r\n \r\n // Re-enable text selection\r\n document.body.classList.remove('rowakit-resizing');\r\n \r\n // PRD-01: Mark resize as complete and set suppression window\r\n isResizingRef.current = false;\r\n resizingColIdRef.current = null;\r\n lastResizeEndTsRef.current = Date.now();\r\n\r\n // PRD-02: Release pointer capture\r\n try {\r\n target.releasePointerCapture(pointerId);\r\n } catch {\r\n // Already released or pointer no longer active\r\n }\r\n };\r\n\r\n const handlePointerUp = () => {\r\n cleanupResize();\r\n };\r\n\r\n const handlePointerCancel = () => {\r\n cleanupResize();\r\n };\r\n\r\n target.addEventListener('pointermove', handlePointerMove);\r\n target.addEventListener('pointerup', handlePointerUp);\r\n target.addEventListener('pointercancel', handlePointerCancel);\r\n };\r\n\r\n // Stage C: Double-click to auto-fit content\r\n // PRD-02: Updated signature to match PointerEvent handler pattern\r\n const handleColumnResizeDoubleClick = (e: React.MouseEvent<HTMLDivElement>, columnId: string) => {\r\n e.preventDefault();\r\n e.stopPropagation(); // PRD-01: Prevent sort bubbling from double-click\r\n\r\n autoFitColumnWidth(columnId);\r\n };\r\n\r\n // Stage C: Saved views handlers\r\n const saveCurrentView = (name: string) => {\r\n const viewState = {\r\n page: query.page,\r\n pageSize: query.pageSize,\r\n sort: query.sort,\r\n filters: query.filters,\r\n columnWidths: enableColumnResizing ? columnWidths : undefined,\r\n };\r\n\r\n setSavedViews((prev) => {\r\n const filtered = prev.filter((v) => v.name !== name);\r\n return [...filtered, { name, state: viewState }];\r\n });\r\n\r\n // PRD-04: Update storage with index\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n try {\r\n // Save the view\r\n localStorage.setItem(`rowakit-view-${name}`, JSON.stringify(viewState));\r\n \r\n // Update index\r\n const index = getSavedViewsIndex();\r\n const filtered = index.filter((v) => v.name !== name);\r\n filtered.push({ name, updatedAt: Date.now() });\r\n setSavedViewsIndex(filtered);\r\n } catch {\r\n // Ignore storage errors\r\n }\r\n }\r\n };\r\n\r\n const loadSavedView = (name: string) => {\r\n const view = savedViews.find((v) => v.name === name);\r\n if (!view) return;\r\n\r\n const { state } = view;\r\n setQuery({\r\n page: state.page,\r\n pageSize: state.pageSize,\r\n sort: state.sort,\r\n filters: state.filters,\r\n });\r\n\r\n // Also update the filters state to keep input fields in sync\r\n setFilters(state.filters ?? {});\r\n\r\n if (state.columnWidths && enableColumnResizing) {\r\n setColumnWidths(state.columnWidths);\r\n }\r\n };\r\n\r\n const deleteSavedView = (name: string) => {\r\n setSavedViews((prev) => prev.filter((v) => v.name !== name));\r\n \r\n // PRD-04: Remove from storage and index\r\n if (typeof window !== 'undefined' && window.localStorage) {\r\n try {\r\n localStorage.removeItem(`rowakit-view-${name}`);\r\n \r\n // Update index\r\n const index = getSavedViewsIndex();\r\n const filtered = index.filter((v) => v.name !== name);\r\n setSavedViewsIndex(filtered);\r\n } catch {\r\n // Ignore storage errors\r\n }\r\n }\r\n };\r\n\r\n const resetTableState = () => {\r\n setQuery({\r\n page: 1,\r\n pageSize: defaultPageSize,\r\n });\r\n setFilters({});\r\n setColumnWidths({});\r\n };\r\n\r\n // Helper function to apply filterTransform to filter values for number columns\r\n const transformFilterValueForColumn = (\r\n column: ColumnDef<T> | undefined,\r\n value: FilterValue | undefined,\r\n ): FilterValue | undefined => {\r\n if (!value || column?.kind !== 'number') {\r\n return value;\r\n }\r\n\r\n const numberColumn = column as ColumnDef<T> & {\r\n filterTransform?: (input: number) => number;\r\n };\r\n\r\n if (!numberColumn.filterTransform) {\r\n return value;\r\n }\r\n\r\n if (value.op === 'equals' && typeof value.value === 'number') {\r\n return {\r\n ...value,\r\n value: numberColumn.filterTransform(value.value),\r\n };\r\n }\r\n\r\n if (value.op === 'range' && typeof value.value === 'object') {\r\n const { from, to } = value.value;\r\n return {\r\n op: 'range',\r\n value: {\r\n from:\r\n from !== undefined && typeof from === 'number'\r\n ? numberColumn.filterTransform(from)\r\n : from,\r\n to:\r\n to !== undefined && typeof to === 'number'\r\n ? numberColumn.filterTransform(to)\r\n : to,\r\n },\r\n };\r\n }\r\n\r\n return value;\r\n };\r\n\r\n // Filter handlers\r\n const handleFilterChange = (field: string, value: FilterValue | undefined) => {\r\n // Stage C: Apply filter transform if defined\r\n const column = columns.find(c => c.id === field);\r\n const transformedValue = transformFilterValueForColumn(column, value);\r\n\r\n setFilters((prev) => ({\r\n ...prev,\r\n [field]: transformedValue,\r\n }));\r\n };\r\n\r\n const handleClearFilter = (field: string) => {\r\n setFilters((prev) => {\r\n const newFilters = { ...prev };\r\n delete newFilters[field];\r\n return newFilters;\r\n });\r\n };\r\n\r\n const handleClearAllFilters = () => {\r\n setFilters({});\r\n };\r\n\r\n const isLoading = dataState.state === 'loading';\r\n const isError = dataState.state === 'error';\r\n const isEmpty = dataState.state === 'empty';\r\n const totalPages = Math.ceil(dataState.total / query.pageSize);\r\n const canGoPrevious = query.page > 1 && !isLoading;\r\n const canGoNext = query.page < totalPages && !isLoading;\r\n\r\n const hasActiveFilters = enableFilters && Object.values(filters).some(v => v !== undefined);\r\n\r\n // PRD-03: Apply fixed layout class when resizing is enabled\r\n const containerClass = [\r\n 'rowakit-table',\r\n enableColumnResizing ? 'rowakit-layout-fixed' : '',\r\n className\r\n ].filter(Boolean).join(' ');\r\n\r\n return (\r\n <div className={containerClass}>\r\n {enableSavedViews && (\r\n <div className=\"rowakit-saved-views-group\">\r\n {!showSaveViewForm ? (\r\n <button\r\n onClick={() => {\r\n setShowSaveViewForm(true);\r\n setSaveViewInput('');\r\n setSaveViewError('');\r\n setOverwriteConfirmName(null);\r\n }}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Save View\r\n </button>\r\n ) : (\r\n <div className=\"rowakit-save-view-form\">\r\n {overwriteConfirmName ? (\r\n <div className=\"rowakit-save-view-confirm\">\r\n <p>View \"{overwriteConfirmName}\" already exists. Overwrite?</p>\r\n <button\r\n onClick={() => {\r\n saveCurrentView(overwriteConfirmName);\r\n setShowSaveViewForm(false);\r\n setSaveViewInput('');\r\n setSaveViewError('');\r\n setOverwriteConfirmName(null);\r\n }}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Overwrite\r\n </button>\r\n <button\r\n onClick={() => {\r\n setOverwriteConfirmName(null);\r\n }}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Cancel\r\n </button>\r\n </div>\r\n ) : (\r\n <>\r\n <input\r\n type=\"text\"\r\n value={saveViewInput}\r\n onChange={(e) => {\r\n setSaveViewInput(e.target.value);\r\n setSaveViewError('');\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') {\r\n // Validate and save\r\n const validation = validateViewName(saveViewInput);\r\n if (!validation.valid) {\r\n setSaveViewError(validation.error || 'Invalid name');\r\n return;\r\n }\r\n\r\n // Check if exists\r\n if (savedViews.some((v) => v.name === saveViewInput.trim())) {\r\n setOverwriteConfirmName(saveViewInput.trim());\r\n } else {\r\n saveCurrentView(saveViewInput.trim());\r\n setShowSaveViewForm(false);\r\n setSaveViewInput('');\r\n setSaveViewError('');\r\n }\r\n }\r\n }}\r\n placeholder=\"Enter view name...\"\r\n className=\"rowakit-save-view-input\"\r\n />\r\n {saveViewError && (\r\n <div className=\"rowakit-save-view-error\">{saveViewError}</div>\r\n )}\r\n <button\r\n onClick={() => {\r\n const validation = validateViewName(saveViewInput);\r\n if (!validation.valid) {\r\n setSaveViewError(validation.error || 'Invalid name');\r\n return;\r\n }\r\n\r\n // Check if exists\r\n if (savedViews.some((v) => v.name === saveViewInput.trim())) {\r\n setOverwriteConfirmName(saveViewInput.trim());\r\n } else {\r\n saveCurrentView(saveViewInput.trim());\r\n setShowSaveViewForm(false);\r\n setSaveViewInput('');\r\n setSaveViewError('');\r\n }\r\n }}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Save\r\n </button>\r\n <button\r\n onClick={() => {\r\n setShowSaveViewForm(false);\r\n setSaveViewInput('');\r\n setSaveViewError('');\r\n }}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Cancel\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n {savedViews.map((view) => (\r\n <div key={view.name} className=\"rowakit-saved-view-item\">\r\n <button\r\n onClick={() => loadSavedView(view.name)}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n {view.name}\r\n </button>\r\n <button\r\n onClick={() => deleteSavedView(view.name)}\r\n className=\"rowakit-saved-view-button rowakit-saved-view-button-delete\"\r\n type=\"button\"\r\n title=\"Delete this view\"\r\n >\r\n ×\r\n </button>\r\n </div>\r\n ))}\r\n {(hasActiveFilters || query.page > 1 || query.sort) && (\r\n <button\r\n onClick={resetTableState}\r\n className=\"rowakit-saved-view-button\"\r\n type=\"button\"\r\n >\r\n Reset\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n {hasActiveFilters && (\r\n <div className=\"rowakit-table-filter-controls\">\r\n <button\r\n onClick={handleClearAllFilters}\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n type=\"button\"\r\n >\r\n Clear all filters\r\n </button>\r\n </div>\r\n )}\r\n <table ref={tableRef}>\r\n <thead>\r\n <tr>\r\n {columns.map((column) => {\r\n const isSortable = column.kind !== 'actions' && \r\n (column.kind === 'custom' ? false : column.sortable === true);\r\n const field = column.kind === 'actions' ? '' : \r\n column.kind === 'custom' ? column.field : \r\n column.field;\r\n\r\n const isResizable = enableColumnResizing && column.kind !== 'actions';\r\n // Use resized width first, then fall back to column.width definition\r\n const actualWidth = columnWidths[column.id] ?? column.width;\r\n\r\n return (\r\n <th\r\n key={column.id}\r\n data-col-id={column.id}\r\n onClick={isSortable ? () => {\r\n // PRD-01: Suppress sort if resizing or during suppression window\r\n if (isResizingRef.current) return;\r\n if (Date.now() - lastResizeEndTsRef.current < 150) return;\r\n handleSort(String(field));\r\n } : undefined}\r\n role={isSortable ? 'button' : undefined}\r\n tabIndex={isSortable ? 0 : undefined}\r\n onKeyDown={isSortable ? (e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n handleSort(String(field));\r\n }\r\n } : undefined}\r\n aria-sort={\r\n isSortable && query.sort?.field === String(field)\r\n ? query.sort.direction === 'asc' ? 'ascending' : 'descending'\r\n : undefined\r\n }\r\n style={{\r\n width: actualWidth != null ? `${actualWidth}px` : undefined,\r\n textAlign: column.align,\r\n position: isResizable ? 'relative' : undefined,\r\n }}\r\n // PRD-03: Re-enable truncation for resizable columns (now safe with fixed layout)\r\n className={[\r\n column.truncate ? 'rowakit-cell-truncate' : '',\r\n resizingColIdRef.current === column.id ? 'resizing' : '' // PRD-01\r\n ].filter(Boolean).join(' ') || undefined}\r\n >\r\n {getHeaderLabel(column)}{isSortable && getSortIndicator(String(field))}\r\n {isResizable && (\r\n <div\r\n className=\"rowakit-column-resize-handle\"\r\n onPointerDown={(e) => startColumnResize(e, column.id)}\r\n onDoubleClick={(e) => handleColumnResizeDoubleClick(e, column.id)}\r\n title=\"Drag to resize | Double-click to auto-fit content\"\r\n />\r\n )}\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n {enableFilters && (\r\n <tr className=\"rowakit-table-filter-row\">\r\n {columns.map((column) => {\r\n const field = column.kind === 'actions' || column.kind === 'custom' ? '' : String(column.field);\r\n const canFilter = field && column.kind !== 'actions';\r\n \r\n if (!canFilter) {\r\n return <th key={column.id}></th>;\r\n }\r\n\r\n const filterValue = filters[field];\r\n\r\n // Badge column: select with options\r\n if (column.kind === 'badge') {\r\n const options = column.map ? Object.keys(column.map) : [];\r\n return (\r\n <th key={column.id}>\r\n <select\r\n className=\"rowakit-filter-select\"\r\n value={filterValue?.op === 'equals' ? String(filterValue.value ?? '') : ''}\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n if (value === '') {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'equals', value });\r\n }\r\n }}\r\n >\r\n <option value=\"\">All</option>\r\n {options.map((opt) => (\r\n <option key={opt} value={opt}>\r\n {opt}\r\n </option>\r\n ))}\r\n </select>\r\n </th>\r\n );\r\n }\r\n\r\n // Boolean column: select with True/False/All\r\n if (column.kind === 'boolean') {\r\n return (\r\n <th key={column.id}>\r\n <select\r\n className=\"rowakit-filter-select\"\r\n value={\r\n filterValue?.op === 'equals' && typeof filterValue.value === 'boolean'\r\n ? String(filterValue.value)\r\n : ''\r\n }\r\n onChange={(e) => {\r\n const value = e.target.value;\r\n if (value === '') {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'equals', value: value === 'true' });\r\n }\r\n }}\r\n >\r\n <option value=\"\">All</option>\r\n <option value=\"true\">True</option>\r\n <option value=\"false\">False</option>\r\n </select>\r\n </th>\r\n );\r\n }\r\n\r\n // Date column: from/to inputs\r\n if (column.kind === 'date') {\r\n const fromValue = filterValue?.op === 'range' ? filterValue.value.from ?? '' : '';\r\n const toValue = filterValue?.op === 'range' ? filterValue.value.to ?? '' : '';\r\n \r\n return (\r\n <th key={column.id}>\r\n <div className=\"rowakit-filter-date-range\">\r\n <input\r\n type=\"date\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"From\"\r\n value={fromValue}\r\n onChange={(e) => {\r\n const from = e.target.value || undefined;\r\n const to = toValue || undefined;\r\n if (!from && !to) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } });\r\n }\r\n }}\r\n />\r\n <input\r\n type=\"date\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"To\"\r\n value={toValue}\r\n onChange={(e) => {\r\n const to = e.target.value || undefined;\r\n const from = fromValue || undefined;\r\n if (!from && !to) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } });\r\n }\r\n }}\r\n />\r\n </div>\r\n </th>\r\n );\r\n }\r\n\r\n // Text/Number column: text or number input\r\n const isNumberColumn = column.kind === 'number';\r\n \r\n // Stage C: Number column can use range filter\r\n if (isNumberColumn) {\r\n const fromValue = filterValue?.op === 'range' ? String(filterValue.value.from ?? '') : \r\n filterValue?.op === 'equals' && typeof filterValue.value === 'number' ? String(filterValue.value) : '';\r\n const toValue = filterValue?.op === 'range' ? String(filterValue.value.to ?? '') : '';\r\n \r\n // If there's an equals filter, show simple input; otherwise show range\r\n const showRangeUI = !filterValue || filterValue.op === 'range';\r\n \r\n if (showRangeUI) {\r\n return (\r\n <th key={column.id}>\r\n <div className=\"rowakit-filter-number-range\">\r\n <input\r\n type=\"number\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"Min\"\r\n value={fromValue}\r\n onChange={(e) => {\r\n const from = e.target.value ? Number(e.target.value) : undefined;\r\n const to = toValue ? Number(toValue) : undefined;\r\n if (from === undefined && to === undefined) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } } as FilterValue);\r\n }\r\n }}\r\n />\r\n <input\r\n type=\"number\"\r\n className=\"rowakit-filter-input\"\r\n placeholder=\"Max\"\r\n value={toValue}\r\n onChange={(e) => {\r\n const to = e.target.value ? Number(e.target.value) : undefined;\r\n const from = fromValue ? Number(fromValue) : undefined;\r\n if (from === undefined && to === undefined) {\r\n handleClearFilter(field);\r\n } else {\r\n handleFilterChange(field, { op: 'range', value: { from, to } } as FilterValue);\r\n }\r\n }}\r\n />\r\n </div>\r\n </th>\r\n );\r\n }\r\n }\r\n\r\n // Regular text/number input\r\n return (\r\n <th key={column.id}>\r\n <input\r\n type={isNumberColumn ? 'number' : 'text'}\r\n className=\"rowakit-filter-input\"\r\n placeholder={`Filter ${getHeaderLabel(column)}...`}\r\n value={\r\n filterValue?.op === 'contains'\r\n ? filterValue.value\r\n : filterValue?.op === 'equals' && typeof filterValue.value === 'string'\r\n ? filterValue.value\r\n : filterValue?.op === 'equals' && typeof filterValue.value === 'number'\r\n ? String(filterValue.value)\r\n : ''\r\n }\r\n onChange={(e) => {\r\n const rawValue = e.target.value;\r\n if (rawValue === '') {\r\n handleClearFilter(field);\r\n } else if (isNumberColumn) {\r\n const numValue = Number(rawValue);\r\n if (!isNaN(numValue)) {\r\n // Send the parsed numeric value, not the string\r\n handleFilterChange(field, { op: 'equals', value: numValue } as FilterValue);\r\n } else {\r\n // Invalid numeric input: clear the filter to avoid confusing UX\r\n handleClearFilter(field);\r\n }\r\n } else {\r\n // Text: use \"contains\"\r\n handleFilterChange(field, { op: 'contains', value: rawValue } as FilterValue);\r\n }\r\n }}\r\n />\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n )}\r\n </thead>\r\n <tbody>\r\n {isLoading && (\r\n <tr>\r\n <td colSpan={columns.length} className=\"rowakit-table-loading\">\r\n <div className=\"rowakit-table-loading-spinner\"></div>\r\n <span>Loading...</span>\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {isError && (\r\n <tr>\r\n <td colSpan={columns.length} className=\"rowakit-table-error\">\r\n <div className=\"rowakit-table-error-message\">\r\n {dataState.error ?? 'An error occurred'}\r\n </div>\r\n <button\r\n onClick={handleRetry}\r\n className=\"rowakit-button rowakit-button-primary\"\r\n type=\"button\"\r\n >\r\n Retry\r\n </button>\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {isEmpty && (\r\n <tr>\r\n <td colSpan={columns.length} className=\"rowakit-table-empty\">\r\n No data\r\n </td>\r\n </tr>\r\n )}\r\n\r\n {dataState.state === 'success' &&\r\n dataState.items.map((row) => {\r\n const key = getRowKey(row, rowKey);\r\n return (\r\n <tr key={key}>\r\n {columns.map((column) => {\r\n const cellClass = [\r\n column.kind === 'number' ? 'rowakit-cell-number' : '',\r\n column.truncate ? 'rowakit-cell-truncate' : '',\r\n ].filter(Boolean).join(' ') || undefined;\r\n \r\n // PRD-03: Apply width to body cells matching header width (resized or column.width)\r\n const actualWidth = columnWidths[column.id] ?? column.width;\r\n \r\n return (\r\n <td \r\n key={column.id}\r\n data-col-id={column.id}\r\n className={cellClass}\r\n style={{\r\n width: actualWidth != null ? `${actualWidth}px` : undefined,\r\n textAlign: column.align || (column.kind === 'number' ? 'right' : undefined),\r\n }}\r\n >\r\n {renderCell(column, row, isLoading, setConfirmState)}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n );\r\n })}\r\n </tbody>\r\n </table>\r\n\r\n {/* Pagination Controls */}\r\n {dataState.total > 0 && (\r\n <div className=\"rowakit-table-pagination\">\r\n {/* Left: Page size selector */}\r\n <div className=\"rowakit-table-pagination-left\">\r\n <label htmlFor=\"page-size\">\r\n Rows per page:\r\n </label>\r\n <select\r\n id=\"page-size\"\r\n value={query.pageSize}\r\n onChange={(e) => handlePageSizeChange(Number(e.target.value))}\r\n disabled={isLoading}\r\n >\r\n {pageSizeOptions.map((size) => (\r\n <option key={size} value={size}>\r\n {size}\r\n </option>\r\n ))}\r\n </select>\r\n </div>\r\n\r\n {/* Center: Page info */}\r\n <div className=\"rowakit-table-pagination-center\">\r\n Page {query.page} of {totalPages} ({dataState.total} total)\r\n </div>\r\n\r\n {/* Right: Previous/Next buttons */}\r\n <div className=\"rowakit-table-pagination-right\">\r\n <button\r\n onClick={handlePreviousPage}\r\n disabled={!canGoPrevious}\r\n className=\"rowakit-button rowakit-button-primary rowakit-button-pagination\"\r\n type=\"button\"\r\n aria-label=\"Previous page\"\r\n >\r\n Previous\r\n </button>\r\n <button\r\n onClick={handleNextPage}\r\n disabled={!canGoNext}\r\n className=\"rowakit-button rowakit-button-primary rowakit-button-pagination\"\r\n type=\"button\"\r\n aria-label=\"Next page\"\r\n >\r\n Next\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Confirmation Modal */}\r\n {confirmState && (\r\n <div\r\n className=\"rowakit-modal-backdrop\"\r\n onClick={() => setConfirmState(null)}\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"confirm-dialog-title\"\r\n >\r\n <div className=\"rowakit-modal\" onClick={(e) => e.stopPropagation()}>\r\n <h2 id=\"confirm-dialog-title\" className=\"rowakit-modal-title\">\r\n Confirm Action\r\n </h2>\r\n <p className=\"rowakit-modal-content\">\r\n Are you sure you want to {confirmState.action.label.toLowerCase()}? This action cannot be\r\n undone.\r\n </p>\r\n <div className=\"rowakit-modal-actions\">\r\n <button\r\n onClick={() => setConfirmState(null)}\r\n className=\"rowakit-button rowakit-button-secondary\"\r\n type=\"button\"\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n onClick={() => {\r\n void confirmState.action.onClick(confirmState.row);\r\n setConfirmState(null);\r\n }}\r\n className=\"rowakit-button rowakit-button-danger\"\r\n type=\"button\"\r\n >\r\n Confirm\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * @deprecated Use RowaKitTable instead. SmartTable is kept as an alias for backward compatibility.\r\n */\r\nexport const SmartTable = RowaKitTable;\r\n","/**\r\n * @rowakit/table\r\n *\r\n * Opinionated, server-side-first table component for internal/business apps.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\n// Core types\r\nexport type {\r\n // Fetcher types\r\n Fetcher,\r\n FetcherQuery,\r\n FetcherResult,\r\n FilterValue,\r\n Filters,\r\n // Column types\r\n ColumnDef,\r\n ColumnKind,\r\n BaseColumnDef,\r\n TextColumnDef,\r\n DateColumnDef,\r\n BooleanColumnDef,\r\n BadgeColumnDef,\r\n NumberColumnDef,\r\n ActionsColumnDef,\r\n CustomColumnDef,\r\n BadgeTone,\r\n // Action types\r\n ActionDef,\r\n} from './types';\r\n\r\n// Column helper factory\r\nexport { col } from './column-helpers';\r\n\r\n// Components\r\nexport { RowaKitTable, SmartTable } from './components/SmartTable';\r\nexport type { SmartTableProps } from './components/SmartTable';\r\n\r\nexport const VERSION = '0.4.0';\r\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -14,6 +14,9 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Filter value shape for server-side filtering.
|
|
17
|
+
*
|
|
18
|
+
* Stage C adds:
|
|
19
|
+
* - Number range filters: { op: 'range', value: { from?: number; to?: number } }
|
|
17
20
|
*/
|
|
18
21
|
type FilterValue = {
|
|
19
22
|
op: 'contains';
|
|
@@ -27,8 +30,8 @@ type FilterValue = {
|
|
|
27
30
|
} | {
|
|
28
31
|
op: 'range';
|
|
29
32
|
value: {
|
|
30
|
-
from?: string;
|
|
31
|
-
to?: string;
|
|
33
|
+
from?: string | number;
|
|
34
|
+
to?: string | number;
|
|
32
35
|
};
|
|
33
36
|
};
|
|
34
37
|
/**
|
|
@@ -109,8 +112,12 @@ interface BaseColumnDef<T> {
|
|
|
109
112
|
sortable?: boolean;
|
|
110
113
|
/** Optional field name to extract from row data (for sortable columns) */
|
|
111
114
|
field?: keyof T & string;
|
|
112
|
-
/** Column width in pixels */
|
|
115
|
+
/** Column width in pixels (Stage C: can be resized by user) */
|
|
113
116
|
width?: number;
|
|
117
|
+
/** Minimum width for resizing (Stage C, default: 80px) */
|
|
118
|
+
minWidth?: number;
|
|
119
|
+
/** Maximum width for resizing (Stage C, optional) */
|
|
120
|
+
maxWidth?: number;
|
|
114
121
|
/** Text alignment */
|
|
115
122
|
align?: 'left' | 'center' | 'right';
|
|
116
123
|
/** Enable text truncation with ellipsis */
|
|
@@ -153,11 +160,15 @@ interface BadgeColumnDef<T> extends BaseColumnDef<T> {
|
|
|
153
160
|
}
|
|
154
161
|
/**
|
|
155
162
|
* Number column definition.
|
|
163
|
+
*
|
|
164
|
+
* Stage C adds:
|
|
165
|
+
* - filterTransform: optional function to transform filter value before sending to fetcher
|
|
156
166
|
*/
|
|
157
167
|
interface NumberColumnDef<T> extends BaseColumnDef<T> {
|
|
158
168
|
kind: 'number';
|
|
159
169
|
field: keyof T & string;
|
|
160
170
|
format?: Intl.NumberFormatOptions | ((value: number, row: T) => string);
|
|
171
|
+
filterTransform?: (value: number) => number;
|
|
161
172
|
}
|
|
162
173
|
/**
|
|
163
174
|
* Actions column definition.
|
|
@@ -456,6 +467,12 @@ interface SmartTableProps<T> {
|
|
|
456
467
|
className?: string;
|
|
457
468
|
/** Enable filters (default: false) */
|
|
458
469
|
enableFilters?: boolean;
|
|
470
|
+
/** Stage C: Enable column resizing (default: false) */
|
|
471
|
+
enableColumnResizing?: boolean;
|
|
472
|
+
/** Stage C: Sync table state to URL query string (default: false) */
|
|
473
|
+
syncToUrl?: boolean;
|
|
474
|
+
/** Stage C: Enable saved views feature (default: false) */
|
|
475
|
+
enableSavedViews?: boolean;
|
|
459
476
|
}
|
|
460
477
|
/**
|
|
461
478
|
* RowaKitTable - Server-side table component for internal/business apps.
|
|
@@ -508,7 +525,7 @@ interface SmartTableProps<T> {
|
|
|
508
525
|
* }
|
|
509
526
|
* ```
|
|
510
527
|
*/
|
|
511
|
-
declare function RowaKitTable<T>({ fetcher, columns, defaultPageSize, pageSizeOptions, rowKey, className, enableFilters, }: SmartTableProps<T>): react_jsx_runtime.JSX.Element;
|
|
528
|
+
declare function RowaKitTable<T>({ fetcher, columns, defaultPageSize, pageSizeOptions, rowKey, className, enableFilters, enableColumnResizing, syncToUrl, enableSavedViews, }: SmartTableProps<T>): react_jsx_runtime.JSX.Element;
|
|
512
529
|
/**
|
|
513
530
|
* @deprecated Use RowaKitTable instead. SmartTable is kept as an alias for backward compatibility.
|
|
514
531
|
*/
|
|
@@ -522,6 +539,6 @@ declare const SmartTable: typeof RowaKitTable;
|
|
|
522
539
|
* @packageDocumentation
|
|
523
540
|
*/
|
|
524
541
|
|
|
525
|
-
declare const VERSION = "0.
|
|
542
|
+
declare const VERSION = "0.4.0";
|
|
526
543
|
|
|
527
544
|
export { type ActionDef, type ActionsColumnDef, type BadgeColumnDef, type BadgeTone, type BaseColumnDef, type BooleanColumnDef, type ColumnDef, type ColumnKind, type CustomColumnDef, type DateColumnDef, type Fetcher, type FetcherQuery, type FetcherResult, type FilterValue, type Filters, type NumberColumnDef, RowaKitTable, SmartTable, type SmartTableProps, type TextColumnDef, VERSION, col };
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,9 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Filter value shape for server-side filtering.
|
|
17
|
+
*
|
|
18
|
+
* Stage C adds:
|
|
19
|
+
* - Number range filters: { op: 'range', value: { from?: number; to?: number } }
|
|
17
20
|
*/
|
|
18
21
|
type FilterValue = {
|
|
19
22
|
op: 'contains';
|
|
@@ -27,8 +30,8 @@ type FilterValue = {
|
|
|
27
30
|
} | {
|
|
28
31
|
op: 'range';
|
|
29
32
|
value: {
|
|
30
|
-
from?: string;
|
|
31
|
-
to?: string;
|
|
33
|
+
from?: string | number;
|
|
34
|
+
to?: string | number;
|
|
32
35
|
};
|
|
33
36
|
};
|
|
34
37
|
/**
|
|
@@ -109,8 +112,12 @@ interface BaseColumnDef<T> {
|
|
|
109
112
|
sortable?: boolean;
|
|
110
113
|
/** Optional field name to extract from row data (for sortable columns) */
|
|
111
114
|
field?: keyof T & string;
|
|
112
|
-
/** Column width in pixels */
|
|
115
|
+
/** Column width in pixels (Stage C: can be resized by user) */
|
|
113
116
|
width?: number;
|
|
117
|
+
/** Minimum width for resizing (Stage C, default: 80px) */
|
|
118
|
+
minWidth?: number;
|
|
119
|
+
/** Maximum width for resizing (Stage C, optional) */
|
|
120
|
+
maxWidth?: number;
|
|
114
121
|
/** Text alignment */
|
|
115
122
|
align?: 'left' | 'center' | 'right';
|
|
116
123
|
/** Enable text truncation with ellipsis */
|
|
@@ -153,11 +160,15 @@ interface BadgeColumnDef<T> extends BaseColumnDef<T> {
|
|
|
153
160
|
}
|
|
154
161
|
/**
|
|
155
162
|
* Number column definition.
|
|
163
|
+
*
|
|
164
|
+
* Stage C adds:
|
|
165
|
+
* - filterTransform: optional function to transform filter value before sending to fetcher
|
|
156
166
|
*/
|
|
157
167
|
interface NumberColumnDef<T> extends BaseColumnDef<T> {
|
|
158
168
|
kind: 'number';
|
|
159
169
|
field: keyof T & string;
|
|
160
170
|
format?: Intl.NumberFormatOptions | ((value: number, row: T) => string);
|
|
171
|
+
filterTransform?: (value: number) => number;
|
|
161
172
|
}
|
|
162
173
|
/**
|
|
163
174
|
* Actions column definition.
|
|
@@ -456,6 +467,12 @@ interface SmartTableProps<T> {
|
|
|
456
467
|
className?: string;
|
|
457
468
|
/** Enable filters (default: false) */
|
|
458
469
|
enableFilters?: boolean;
|
|
470
|
+
/** Stage C: Enable column resizing (default: false) */
|
|
471
|
+
enableColumnResizing?: boolean;
|
|
472
|
+
/** Stage C: Sync table state to URL query string (default: false) */
|
|
473
|
+
syncToUrl?: boolean;
|
|
474
|
+
/** Stage C: Enable saved views feature (default: false) */
|
|
475
|
+
enableSavedViews?: boolean;
|
|
459
476
|
}
|
|
460
477
|
/**
|
|
461
478
|
* RowaKitTable - Server-side table component for internal/business apps.
|
|
@@ -508,7 +525,7 @@ interface SmartTableProps<T> {
|
|
|
508
525
|
* }
|
|
509
526
|
* ```
|
|
510
527
|
*/
|
|
511
|
-
declare function RowaKitTable<T>({ fetcher, columns, defaultPageSize, pageSizeOptions, rowKey, className, enableFilters, }: SmartTableProps<T>): react_jsx_runtime.JSX.Element;
|
|
528
|
+
declare function RowaKitTable<T>({ fetcher, columns, defaultPageSize, pageSizeOptions, rowKey, className, enableFilters, enableColumnResizing, syncToUrl, enableSavedViews, }: SmartTableProps<T>): react_jsx_runtime.JSX.Element;
|
|
512
529
|
/**
|
|
513
530
|
* @deprecated Use RowaKitTable instead. SmartTable is kept as an alias for backward compatibility.
|
|
514
531
|
*/
|
|
@@ -522,6 +539,6 @@ declare const SmartTable: typeof RowaKitTable;
|
|
|
522
539
|
* @packageDocumentation
|
|
523
540
|
*/
|
|
524
541
|
|
|
525
|
-
declare const VERSION = "0.
|
|
542
|
+
declare const VERSION = "0.4.0";
|
|
526
543
|
|
|
527
544
|
export { type ActionDef, type ActionsColumnDef, type BadgeColumnDef, type BadgeTone, type BaseColumnDef, type BooleanColumnDef, type ColumnDef, type ColumnKind, type CustomColumnDef, type DateColumnDef, type Fetcher, type FetcherQuery, type FetcherResult, type FilterValue, type Filters, type NumberColumnDef, RowaKitTable, SmartTable, type SmartTableProps, type TextColumnDef, VERSION, col };
|