@invana/tables 0.0.29 → 0.0.31
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/dist/index.cjs +61 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -1
- package/dist/index.d.ts +31 -1
- package/dist/index.js +61 -34
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
package/dist/index.cjs
CHANGED
|
@@ -163,7 +163,7 @@ function DataTableToolbar({
|
|
|
163
163
|
{
|
|
164
164
|
type: "button",
|
|
165
165
|
onClick: () => col.pin(pinned === "left" ? false : "left"),
|
|
166
|
-
className: `rounded px-1.5 py-0.5 text-
|
|
166
|
+
className: `rounded px-1.5 py-0.5 text-sm ${pinned === "left" ? "bg-primary text-primary-foreground" : "bg-muted hover:bg-muted/70"}`,
|
|
167
167
|
children: "L"
|
|
168
168
|
}
|
|
169
169
|
),
|
|
@@ -172,7 +172,7 @@ function DataTableToolbar({
|
|
|
172
172
|
{
|
|
173
173
|
type: "button",
|
|
174
174
|
onClick: () => col.pin(pinned === "right" ? false : "right"),
|
|
175
|
-
className: `rounded px-1.5 py-0.5 text-
|
|
175
|
+
className: `rounded px-1.5 py-0.5 text-sm ${pinned === "right" ? "bg-primary text-primary-foreground" : "bg-muted hover:bg-muted/70"}`,
|
|
176
176
|
children: "R"
|
|
177
177
|
}
|
|
178
178
|
)
|
|
@@ -384,7 +384,11 @@ function DataTable({
|
|
|
384
384
|
onSortingChange,
|
|
385
385
|
loading = false,
|
|
386
386
|
groupBy,
|
|
387
|
-
renderGroupHeader
|
|
387
|
+
renderGroupHeader,
|
|
388
|
+
density = "default",
|
|
389
|
+
rowIndent,
|
|
390
|
+
isRowSelected,
|
|
391
|
+
onRowClick
|
|
388
392
|
}) {
|
|
389
393
|
const [internalSorting, setInternalSorting] = React2__namespace.useState(
|
|
390
394
|
[]
|
|
@@ -506,6 +510,7 @@ function DataTable({
|
|
|
506
510
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
507
511
|
ui.Table,
|
|
508
512
|
{
|
|
513
|
+
density,
|
|
509
514
|
style: {
|
|
510
515
|
width: enableColumnResizing ? table.getTotalSize() : void 0
|
|
511
516
|
},
|
|
@@ -552,37 +557,59 @@ function DataTable({
|
|
|
552
557
|
) : groupKey
|
|
553
558
|
}
|
|
554
559
|
) }) : null,
|
|
555
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
560
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
561
|
+
ui.TableRow,
|
|
562
|
+
{
|
|
563
|
+
"data-selected": isRowSelected?.(row.original) || void 0,
|
|
564
|
+
"aria-selected": isRowSelected ? isRowSelected(row.original) : void 0,
|
|
565
|
+
tabIndex: onRowClick ? 0 : void 0,
|
|
566
|
+
onClick: onRowClick ? () => onRowClick(row.original) : void 0,
|
|
567
|
+
onKeyDown: onRowClick ? (event) => {
|
|
568
|
+
if (event.key !== "Enter" && event.key !== " ")
|
|
569
|
+
return;
|
|
570
|
+
event.preventDefault();
|
|
571
|
+
onRowClick(row.original);
|
|
572
|
+
} : void 0,
|
|
573
|
+
className: ui.cn(
|
|
574
|
+
isRowSelected?.(row.original) && "bg-accent shadow-[inset_2px_0_0_var(--color-primary)] hover:bg-accent",
|
|
575
|
+
onRowClick && "cursor-pointer focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-ring"
|
|
576
|
+
),
|
|
577
|
+
children: row.getVisibleCells().map((cell, cellIndex) => {
|
|
578
|
+
const column = cell.column;
|
|
579
|
+
const isPinned = column.getIsPinned();
|
|
580
|
+
const align = column.columnDef.meta?.align ?? "left";
|
|
581
|
+
const indent = cellIndex === 0 ? rowIndent?.(row.original) : void 0;
|
|
582
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
583
|
+
ui.TableCell,
|
|
584
|
+
{
|
|
585
|
+
style: {
|
|
586
|
+
width: cell.column.getSize(),
|
|
587
|
+
...indent ? { paddingLeft: `${indent * 14 + 8}px` } : {},
|
|
588
|
+
...isPinned ? {
|
|
589
|
+
position: "sticky",
|
|
590
|
+
left: isPinned === "left" ? column.getStart("left") : void 0,
|
|
591
|
+
right: isPinned === "right" ? column.getAfter("right") : void 0,
|
|
592
|
+
zIndex: 1,
|
|
593
|
+
backgroundColor: "hsl(var(--background))"
|
|
594
|
+
} : {}
|
|
595
|
+
},
|
|
596
|
+
className: ui.cn(
|
|
597
|
+
align === "right" && "text-right",
|
|
598
|
+
align === "center" && "text-center",
|
|
599
|
+
isPinned && "bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]",
|
|
600
|
+
column.columnDef.meta?.mono && "font-mono",
|
|
601
|
+
column.columnDef.meta?.cellClassName
|
|
602
|
+
),
|
|
603
|
+
children: reactTable.flexRender(
|
|
604
|
+
cell.column.columnDef.cell,
|
|
605
|
+
cell.getContext()
|
|
606
|
+
)
|
|
607
|
+
},
|
|
608
|
+
cell.id
|
|
609
|
+
);
|
|
610
|
+
})
|
|
611
|
+
}
|
|
612
|
+
)
|
|
586
613
|
] }, row.id);
|
|
587
614
|
}) })
|
|
588
615
|
]
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-table-pagination.tsx","../src/data-table-toolbar.tsx","../src/editable-cell.tsx","../src/data-table.tsx"],"names":["jsxs","jsx","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","DropdownMenu","DropdownMenuTrigger","Settings2","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Fragment","React","cn","Input","useSortable","TableHead","CSS","GripVertical","flexRender","ArrowUp","ArrowDown","ChevronsUpDown","React2","useReactTable","getCoreRowModel","getSortedRowModel","getFilteredRowModel","getPaginationRowModel","useSensors","useSensor","MouseSensor","TouchSensor","KeyboardSensor","arrayMove","DndContext","closestCenter","restrictToHorizontalAxis","Table","TableHeader","TableRow","SortableContext","horizontalListSortingStrategy","TableBody","TableCell"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Button } from '@invana/ui';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@invana/forms';\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\n\nexport interface DataTablePaginationProps<TData> {\n table: Table<TData>;\n pageSizeOptions?: number[];\n}\n\nexport function DataTablePagination<TData>({\n table,\n pageSizeOptions = [10, 20, 50, 100],\n}: DataTablePaginationProps<TData>) {\n const { pageIndex, pageSize } = table.getState().pagination;\n const serverRowCount = table.options.rowCount;\n const total =\n typeof serverRowCount === 'number'\n ? serverRowCount\n : table.getFilteredRowModel().rows.length;\n const start = total === 0 ? 0 : pageIndex * pageSize + 1;\n const end = Math.min((pageIndex + 1) * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between gap-4 px-2 py-2\">\n <div className=\"text-muted-foreground\">\n {total === 0 ? 'No rows' : `Showing ${start}–${end} of ${total}`}\n </div>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Rows per page</span>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => table.setPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-8 w-[72px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"text-muted-foreground tabular-nums\">\n Page {pageIndex + 1} of {table.getPageCount() || 1}\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"First page\"\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n aria-label=\"Last page\"\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import {\n Button,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@invana/ui';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\n\nexport interface DataTableToolbarProps<TData> {\n table: Table<TData>;\n enableColumnVisibility?: boolean;\n enableColumnPinning?: boolean;\n children?: React.ReactNode;\n}\n\nexport function DataTableToolbar<TData>({\n table,\n enableColumnVisibility = true,\n enableColumnPinning = false,\n children,\n}: DataTableToolbarProps<TData>) {\n const toggleableCols = table\n .getAllLeafColumns()\n .filter((c) => c.getCanHide());\n\n return (\n <div className=\"flex items-center justify-between gap-2 px-2 py-2\">\n <div className=\"flex items-center gap-2\">{children}</div>\n <div className=\"flex items-center gap-2\">\n {enableColumnVisibility && toggleableCols.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8\">\n <Settings2 className=\"mr-2 h-4 w-4\" />\n Columns\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {toggleableCols.map((col) => (\n <DropdownMenuCheckboxItem\n key={col.id}\n className=\"capitalize\"\n checked={col.getIsVisible()}\n onCheckedChange={(v) => col.toggleVisibility(!!v)}\n onSelect={(e) => e.preventDefault()}\n >\n {String(col.columnDef.header ?? col.id)}\n </DropdownMenuCheckboxItem>\n ))}\n {enableColumnPinning && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Pinning</DropdownMenuLabel>\n {table.getAllLeafColumns().map((col) => {\n if (!col.getCanPin()) return null;\n const pinned = col.getIsPinned();\n return (\n <div\n key={col.id}\n className=\"flex items-center justify-between px-2 py-1\"\n >\n <span className=\"capitalize truncate\">\n {String(col.columnDef.header ?? col.id)}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() =>\n col.pin(pinned === 'left' ? false : 'left')\n }\n className={`rounded px-1.5 py-0.5 text-meta ${\n pinned === 'left'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted hover:bg-muted/70'\n }`}\n >\n L\n </button>\n <button\n type=\"button\"\n onClick={() =>\n col.pin(pinned === 'right' ? false : 'right')\n }\n className={`rounded px-1.5 py-0.5 text-meta ${\n pinned === 'right'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted hover:bg-muted/70'\n }`}\n >\n R\n </button>\n </div>\n </div>\n );\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { cn } from '@invana/ui';\nimport {\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@invana/forms';\nimport type { CellContext } from '@tanstack/react-table';\nimport type { CellEditHandler, EditOption, EditType } from './types';\n\nexport interface EditableCellProps<TData> {\n ctx: CellContext<TData, unknown>;\n editType?: EditType;\n options?: EditOption[];\n align?: 'left' | 'center' | 'right';\n onCellEdit?: CellEditHandler<TData>;\n}\n\nexport function EditableCell<TData>({\n ctx,\n editType = 'text',\n options,\n align = 'left',\n onCellEdit,\n}: EditableCellProps<TData>) {\n const initial = ctx.getValue();\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState<unknown>(initial);\n\n React.useEffect(() => {\n if (!editing) setDraft(initial);\n }, [initial, editing]);\n\n const commit = (next: unknown) => {\n setEditing(false);\n if (next === initial) return;\n onCellEdit?.({\n rowIndex: ctx.row.index,\n columnId: ctx.column.id,\n value: next,\n row: ctx.row.original,\n });\n };\n\n const alignClass =\n align === 'right'\n ? 'text-right justify-end'\n : align === 'center'\n ? 'text-center justify-center'\n : 'text-left justify-start';\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={() => setEditing(true)}\n className={cn(\n 'group flex w-full items-center rounded-control px-1.5 py-1 hover:bg-muted/60 focus:outline-none focus:ring-2 focus:ring-ring',\n alignClass,\n )}\n title=\"Click to edit\"\n >\n <span className=\"truncate\">\n {initial == null || initial === '' ? (\n <span className=\"text-muted-foreground italic\">empty</span>\n ) : (\n String(initial)\n )}\n </span>\n </button>\n );\n }\n\n if (editType === 'select') {\n return (\n <Select\n defaultValue={initial == null ? undefined : String(initial)}\n onValueChange={(v) => commit(v)}\n open\n onOpenChange={(open) => {\n if (!open) setEditing(false);\n }}\n >\n <SelectTrigger className=\"h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options?.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n return (\n <Input\n autoFocus\n type={editType === 'number' ? 'number' : 'text'}\n defaultValue={initial == null ? '' : String(initial)}\n onBlur={(e) => {\n const v =\n editType === 'number' ? Number(e.currentTarget.value) : e.currentTarget.value;\n commit(v);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.currentTarget as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setEditing(false);\n }\n }}\n className={cn('h-8', alignClass)}\n />\n );\n}\n","import * as React from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type ColumnOrderState,\n type ColumnPinningState,\n type Header,\n type OnChangeFn,\n type PaginationState,\n type RowData,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from \"@dnd-kit/core\";\nimport { restrictToHorizontalAxis } from \"@dnd-kit/modifiers\";\nimport {\n SortableContext,\n arrayMove,\n horizontalListSortingStrategy,\n useSortable,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n cn,\n} from \"@invana/ui\";\nimport { ArrowDown, ArrowUp, ChevronsUpDown, GripVertical } from \"lucide-react\";\nimport { DataTablePagination } from \"./data-table-pagination\";\nimport { DataTableToolbar } from \"./data-table-toolbar\";\nimport { EditableCell } from \"./editable-cell\";\nimport type { CellEditHandler } from \"./types\";\n\nexport interface DataTableProps<TData extends RowData> {\n columns: ColumnDef<TData, any>[];\n data: TData[];\n pageSize?: number;\n pageSizeOptions?: number[];\n enableSorting?: boolean;\n enablePagination?: boolean;\n enableColumnVisibility?: boolean;\n enableColumnReordering?: boolean;\n enableColumnResizing?: boolean;\n enableColumnPinning?: boolean;\n onCellEdit?: CellEditHandler<TData>;\n toolbar?: React.ReactNode;\n /** Content rendered as a sticky summary bar inside the table's bordered container, below the rows. */\n footer?: React.ReactNode;\n className?: string;\n emptyState?: React.ReactNode;\n /** Server-side mode: skip client pagination — `data` is already the current page. Requires `pageCount` (or `rowCount`). */\n manualPagination?: boolean;\n /** Server-side mode: skip client sorting — caller refetches when `sorting` changes. */\n manualSorting?: boolean;\n /** Total pages on server (for manualPagination). */\n pageCount?: number;\n /** Total rows on server (drives \"Showing X–Y of Z\" in manual mode). */\n rowCount?: number;\n /** Controlled pagination state. */\n pagination?: PaginationState;\n onPaginationChange?: OnChangeFn<PaginationState>;\n /** Controlled sorting state. */\n sorting?: SortingState;\n onSortingChange?: OnChangeFn<SortingState>;\n /** Show a loading overlay over the table body. */\n loading?: boolean;\n /**\n * Presentational row grouping — returns the group a row belongs to, or\n * `null` for none. A full-width header row is emitted whenever the key\n * changes from the previous row.\n *\n * Deliberately *not* TanStack's aggregating grouping model. This is for a\n * list that already arrives in the right order and wants section headings in\n * it — a story index, a queue split into questions/proposals/results. It\n * sorts nothing and aggregates nothing, so it cannot disagree with the order\n * the caller chose.\n */\n groupBy?: (row: TData) => string | null | undefined;\n /** What a group header row contains. Defaults to the key. */\n renderGroupHeader?: (key: string, rows: TData[]) => React.ReactNode;\n}\n\nfunction getCommonPinStyles<TData>(\n header: Header<TData, unknown>,\n): React.CSSProperties {\n const isPinned = header.column.getIsPinned();\n if (!isPinned) return {};\n return {\n position: \"sticky\",\n left: isPinned === \"left\" ? header.column.getStart(\"left\") : undefined,\n right: isPinned === \"right\" ? header.column.getAfter(\"right\") : undefined,\n zIndex: 2,\n };\n}\n\ninterface DraggableHeaderProps<TData> {\n header: Header<TData, unknown>;\n enableReordering: boolean;\n enableResizing: boolean;\n enableSorting: boolean;\n}\n\nfunction DraggableHeader<TData>({\n header,\n enableReordering,\n enableResizing,\n enableSorting,\n}: DraggableHeaderProps<TData>) {\n const column = header.column;\n const isPinned = column.getIsPinned();\n const canDrag = enableReordering && !isPinned && column.id !== \"__select\";\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: column.id, disabled: !canDrag });\n\n const sortDir = column.getIsSorted();\n const canSort = enableSorting && column.getCanSort();\n const align = column.columnDef.meta?.align ?? \"left\";\n const alignClass =\n align === \"right\"\n ? \"justify-end text-right\"\n : align === \"center\"\n ? \"justify-center text-center\"\n : \"justify-start text-left\";\n\n return (\n <TableHead\n ref={setNodeRef}\n colSpan={header.colSpan}\n style={{\n width: header.getSize(),\n transform: CSS.Translate.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n ...getCommonPinStyles(header),\n ...(isPinned ? { backgroundColor: \"hsl(var(--background))\" } : {}),\n }}\n className={cn(\n \"group relative select-none bg-muted/40\",\n isPinned &&\n \"bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]\",\n column.columnDef.meta?.headerClassName,\n )}\n {...attributes}\n >\n <div className={cn(\"flex items-center gap-1\", alignClass)}>\n {canDrag && (\n <button\n type=\"button\"\n className=\"cursor-grab text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 active:cursor-grabbing\"\n {...listeners}\n aria-label=\"Drag column\"\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </button>\n )}\n {canSort ? (\n <button\n type=\"button\"\n onClick={column.getToggleSortingHandler()}\n className=\"inline-flex items-center gap-1 font-medium hover:text-foreground\"\n >\n {flexRender(column.columnDef.header, header.getContext())}\n {sortDir === \"asc\" ? (\n <ArrowUp className=\"h-3.5 w-3.5\" />\n ) : sortDir === \"desc\" ? (\n <ArrowDown className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronsUpDown className=\"h-3.5 w-3.5 opacity-50\" />\n )}\n </button>\n ) : (\n <span className=\"font-medium\">\n {flexRender(column.columnDef.header, header.getContext())}\n </span>\n )}\n </div>\n {enableResizing && column.getCanResize() && (\n <button\n type=\"button\"\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n className={cn(\n \"absolute right-0 top-0 h-full w-1 cursor-col-resize select-none touch-none bg-transparent hover:bg-border\",\n column.getIsResizing() && \"bg-primary\",\n )}\n aria-label=\"Resize column\"\n />\n )}\n </TableHead>\n );\n}\n\nexport function DataTable<TData extends RowData>({\n columns,\n data,\n pageSize = 10,\n pageSizeOptions,\n enableSorting = true,\n enablePagination = true,\n enableColumnVisibility = true,\n enableColumnReordering = false,\n enableColumnResizing = false,\n enableColumnPinning = false,\n onCellEdit,\n toolbar,\n footer,\n className,\n emptyState,\n manualPagination = false,\n manualSorting = false,\n pageCount,\n rowCount,\n pagination: paginationProp,\n onPaginationChange,\n sorting: sortingProp,\n onSortingChange,\n loading = false,\n groupBy,\n renderGroupHeader,\n}: DataTableProps<TData>) {\n const [internalSorting, setInternalSorting] = React.useState<SortingState>(\n [],\n );\n const sorting = sortingProp ?? internalSorting;\n const setSorting: OnChangeFn<SortingState> = (updater) => {\n if (onSortingChange) onSortingChange(updater);\n if (!sortingProp) setInternalSorting(updater);\n };\n\n const [internalPagination, setInternalPagination] =\n React.useState<PaginationState>({\n pageIndex: 0,\n pageSize,\n });\n const pagination = paginationProp ?? internalPagination;\n const setPagination: OnChangeFn<PaginationState> = (updater) => {\n if (onPaginationChange) onPaginationChange(updater);\n if (!paginationProp) setInternalPagination(updater);\n };\n\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(\n [],\n );\n const [columnVisibility, setColumnVisibility] =\n React.useState<VisibilityState>({});\n const [columnPinning, setColumnPinning] = React.useState<ColumnPinningState>({\n left: [],\n right: [],\n });\n const [columnOrder, setColumnOrder] = React.useState<ColumnOrderState>(() =>\n columns.map((c, i) => (c as any).id ?? (c as any).accessorKey ?? String(i)),\n );\n\n const wrappedColumns = React.useMemo<ColumnDef<TData, any>[]>(() => {\n return columns.map((col) => {\n const meta = col.meta;\n if (meta?.editable && !col.cell) {\n return {\n ...col,\n cell: (ctx) => (\n <EditableCell\n ctx={ctx}\n editType={meta.editType}\n options={meta.options}\n align={meta.align}\n onCellEdit={onCellEdit}\n />\n ),\n };\n }\n return col;\n });\n }, [columns, onCellEdit]);\n\n const table = useReactTable({\n data,\n columns: wrappedColumns,\n state: {\n sorting,\n pagination,\n columnFilters,\n columnVisibility,\n columnPinning,\n columnOrder,\n },\n onSortingChange: setSorting,\n onPaginationChange: setPagination,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnPinningChange: setColumnPinning,\n onColumnOrderChange: setColumnOrder,\n enableSorting,\n enableColumnResizing,\n enableColumnPinning,\n manualPagination,\n manualSorting,\n pageCount: pageCount ?? -1,\n rowCount,\n columnResizeMode: \"onChange\",\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel:\n enableSorting && !manualSorting ? getSortedRowModel() : undefined,\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel:\n enablePagination && !manualPagination\n ? getPaginationRowModel()\n : undefined,\n });\n\n const sensors = useSensors(\n useSensor(MouseSensor, { activationConstraint: { distance: 4 } }),\n useSensor(TouchSensor, {\n activationConstraint: { delay: 200, tolerance: 8 },\n }),\n useSensor(KeyboardSensor),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n setColumnOrder((prev) => {\n const next = prev.length\n ? prev\n : table.getAllLeafColumns().map((c) => c.id);\n const oldIndex = next.indexOf(active.id as string);\n const newIndex = next.indexOf(over.id as string);\n if (oldIndex < 0 || newIndex < 0) return prev;\n return arrayMove(next, oldIndex, newIndex);\n });\n };\n\n const visibleLeafColumnIds = table.getVisibleLeafColumns().map((c) => c.id);\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <DataTableToolbar\n table={table}\n enableColumnVisibility={enableColumnVisibility}\n enableColumnPinning={enableColumnPinning}\n >\n {toolbar}\n </DataTableToolbar>\n\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToHorizontalAxis]}\n onDragEnd={handleDragEnd}\n >\n <div className=\"relative overflow-auto rounded-md border\">\n {loading && (\n <div className=\"pointer-events-none absolute inset-0 z-10 flex items-start justify-center bg-background/60 pt-12 text-muted-foreground\">\n Loading…\n </div>\n )}\n <Table\n style={{\n width: enableColumnResizing ? table.getTotalSize() : undefined,\n }}\n >\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n <SortableContext\n items={visibleLeafColumnIds}\n strategy={horizontalListSortingStrategy}\n >\n {headerGroup.headers.map((header) => (\n <DraggableHeader\n key={header.id}\n header={header}\n enableReordering={enableColumnReordering}\n enableResizing={enableColumnResizing}\n enableSorting={enableSorting}\n />\n ))}\n </SortableContext>\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={table.getAllLeafColumns().length}\n className=\"h-24 text-center text-muted-foreground\"\n >\n {emptyState ?? \"No results.\"}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row, rowIndex, allRows) => {\n const groupKey = groupBy?.(row.original);\n const previousKey =\n rowIndex > 0\n ? groupBy?.(allRows[rowIndex - 1].original)\n : undefined;\n const startsGroup =\n groupKey != null && groupKey !== previousKey;\n return (\n <React.Fragment key={row.id}>\n {startsGroup ? (\n <TableRow className=\"bg-muted/50 hover:bg-muted/50\">\n <TableCell\n colSpan={table.getAllLeafColumns().length}\n className=\"py-1 font-medium\"\n >\n {renderGroupHeader\n ? renderGroupHeader(\n groupKey,\n allRows\n .filter(\n (r) => groupBy?.(r.original) === groupKey,\n )\n .map((r) => r.original),\n )\n : groupKey}\n </TableCell>\n </TableRow>\n ) : null}\n <TableRow>\n {row.getVisibleCells().map((cell) => {\n const column = cell.column;\n const isPinned = column.getIsPinned();\n const align = column.columnDef.meta?.align ?? \"left\";\n return (\n <TableCell\n key={cell.id}\n style={{\n width: cell.column.getSize(),\n ...(isPinned\n ? {\n position: \"sticky\",\n left:\n isPinned === \"left\"\n ? column.getStart(\"left\")\n : undefined,\n right:\n isPinned === \"right\"\n ? column.getAfter(\"right\")\n : undefined,\n zIndex: 1,\n backgroundColor: \"hsl(var(--background))\",\n }\n : {}),\n }}\n className={cn(\n align === \"right\" && \"text-right\",\n align === \"center\" && \"text-center\",\n isPinned &&\n \"bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]\",\n column.columnDef.meta?.cellClassName,\n )}\n >\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </TableCell>\n );\n })}\n </TableRow>\n </React.Fragment>\n );\n })\n )}\n </TableBody>\n </Table>\n {footer != null && (\n <div className=\"sticky bottom-0 border-t bg-muted/40 px-3 py-2 text-muted-foreground\">\n {footer}\n </div>\n )}\n </div>\n </DndContext>\n\n {enablePagination && (\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data-table-pagination.tsx","../src/data-table-toolbar.tsx","../src/editable-cell.tsx","../src/data-table.tsx"],"names":["jsxs","jsx","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","DropdownMenu","DropdownMenuTrigger","Settings2","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuCheckboxItem","Fragment","React","cn","Input","useSortable","TableHead","CSS","GripVertical","flexRender","ArrowUp","ArrowDown","ChevronsUpDown","React2","useReactTable","getCoreRowModel","getSortedRowModel","getFilteredRowModel","getPaginationRowModel","useSensors","useSensor","MouseSensor","TouchSensor","KeyboardSensor","arrayMove","DndContext","closestCenter","restrictToHorizontalAxis","Table","TableHeader","TableRow","SortableContext","horizontalListSortingStrategy","TableBody","TableCell"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Button } from '@invana/ui';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@invana/forms';\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\n\nexport interface DataTablePaginationProps<TData> {\n table: Table<TData>;\n pageSizeOptions?: number[];\n}\n\nexport function DataTablePagination<TData>({\n table,\n pageSizeOptions = [10, 20, 50, 100],\n}: DataTablePaginationProps<TData>) {\n const { pageIndex, pageSize } = table.getState().pagination;\n const serverRowCount = table.options.rowCount;\n const total =\n typeof serverRowCount === 'number'\n ? serverRowCount\n : table.getFilteredRowModel().rows.length;\n const start = total === 0 ? 0 : pageIndex * pageSize + 1;\n const end = Math.min((pageIndex + 1) * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between gap-4 px-2 py-2\">\n <div className=\"text-muted-foreground\">\n {total === 0 ? 'No rows' : `Showing ${start}–${end} of ${total}`}\n </div>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Rows per page</span>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => table.setPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-8 w-[72px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"text-muted-foreground tabular-nums\">\n Page {pageIndex + 1} of {table.getPageCount() || 1}\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"First page\"\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n aria-label=\"Last page\"\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import {\n Button,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@invana/ui';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\n\nexport interface DataTableToolbarProps<TData> {\n table: Table<TData>;\n enableColumnVisibility?: boolean;\n enableColumnPinning?: boolean;\n children?: React.ReactNode;\n}\n\nexport function DataTableToolbar<TData>({\n table,\n enableColumnVisibility = true,\n enableColumnPinning = false,\n children,\n}: DataTableToolbarProps<TData>) {\n const toggleableCols = table\n .getAllLeafColumns()\n .filter((c) => c.getCanHide());\n\n return (\n <div className=\"flex items-center justify-between gap-2 px-2 py-2\">\n <div className=\"flex items-center gap-2\">{children}</div>\n <div className=\"flex items-center gap-2\">\n {enableColumnVisibility && toggleableCols.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8\">\n <Settings2 className=\"mr-2 h-4 w-4\" />\n Columns\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {toggleableCols.map((col) => (\n <DropdownMenuCheckboxItem\n key={col.id}\n className=\"capitalize\"\n checked={col.getIsVisible()}\n onCheckedChange={(v) => col.toggleVisibility(!!v)}\n onSelect={(e) => e.preventDefault()}\n >\n {String(col.columnDef.header ?? col.id)}\n </DropdownMenuCheckboxItem>\n ))}\n {enableColumnPinning && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Pinning</DropdownMenuLabel>\n {table.getAllLeafColumns().map((col) => {\n if (!col.getCanPin()) return null;\n const pinned = col.getIsPinned();\n return (\n <div\n key={col.id}\n className=\"flex items-center justify-between px-2 py-1\"\n >\n <span className=\"capitalize truncate\">\n {String(col.columnDef.header ?? col.id)}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() =>\n col.pin(pinned === 'left' ? false : 'left')\n }\n className={`rounded px-1.5 py-0.5 text-sm ${\n pinned === 'left'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted hover:bg-muted/70'\n }`}\n >\n L\n </button>\n <button\n type=\"button\"\n onClick={() =>\n col.pin(pinned === 'right' ? false : 'right')\n }\n className={`rounded px-1.5 py-0.5 text-sm ${\n pinned === 'right'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted hover:bg-muted/70'\n }`}\n >\n R\n </button>\n </div>\n </div>\n );\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { cn } from '@invana/ui';\nimport {\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@invana/forms';\nimport type { CellContext } from '@tanstack/react-table';\nimport type { CellEditHandler, EditOption, EditType } from './types';\n\nexport interface EditableCellProps<TData> {\n ctx: CellContext<TData, unknown>;\n editType?: EditType;\n options?: EditOption[];\n align?: 'left' | 'center' | 'right';\n onCellEdit?: CellEditHandler<TData>;\n}\n\nexport function EditableCell<TData>({\n ctx,\n editType = 'text',\n options,\n align = 'left',\n onCellEdit,\n}: EditableCellProps<TData>) {\n const initial = ctx.getValue();\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState<unknown>(initial);\n\n React.useEffect(() => {\n if (!editing) setDraft(initial);\n }, [initial, editing]);\n\n const commit = (next: unknown) => {\n setEditing(false);\n if (next === initial) return;\n onCellEdit?.({\n rowIndex: ctx.row.index,\n columnId: ctx.column.id,\n value: next,\n row: ctx.row.original,\n });\n };\n\n const alignClass =\n align === 'right'\n ? 'text-right justify-end'\n : align === 'center'\n ? 'text-center justify-center'\n : 'text-left justify-start';\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={() => setEditing(true)}\n className={cn(\n 'group flex w-full items-center rounded-control px-1.5 py-1 hover:bg-muted/60 focus:outline-none focus:ring-2 focus:ring-ring',\n alignClass,\n )}\n title=\"Click to edit\"\n >\n <span className=\"truncate\">\n {initial == null || initial === '' ? (\n <span className=\"text-muted-foreground italic\">empty</span>\n ) : (\n String(initial)\n )}\n </span>\n </button>\n );\n }\n\n if (editType === 'select') {\n return (\n <Select\n defaultValue={initial == null ? undefined : String(initial)}\n onValueChange={(v) => commit(v)}\n open\n onOpenChange={(open) => {\n if (!open) setEditing(false);\n }}\n >\n <SelectTrigger className=\"h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options?.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n return (\n <Input\n autoFocus\n type={editType === 'number' ? 'number' : 'text'}\n defaultValue={initial == null ? '' : String(initial)}\n onBlur={(e) => {\n const v =\n editType === 'number' ? Number(e.currentTarget.value) : e.currentTarget.value;\n commit(v);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.currentTarget as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setEditing(false);\n }\n }}\n className={cn('h-8', alignClass)}\n />\n );\n}\n","import * as React from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type ColumnOrderState,\n type ColumnPinningState,\n type Header,\n type OnChangeFn,\n type PaginationState,\n type RowData,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from \"@dnd-kit/core\";\nimport { restrictToHorizontalAxis } from \"@dnd-kit/modifiers\";\nimport {\n SortableContext,\n arrayMove,\n horizontalListSortingStrategy,\n useSortable,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n cn,\n} from \"@invana/ui\";\nimport { ArrowDown, ArrowUp, ChevronsUpDown, GripVertical } from \"lucide-react\";\nimport { DataTablePagination } from \"./data-table-pagination\";\nimport { DataTableToolbar } from \"./data-table-toolbar\";\nimport { EditableCell } from \"./editable-cell\";\nimport type { CellEditHandler } from \"./types\";\n\nexport interface DataTableProps<TData extends RowData> {\n columns: ColumnDef<TData, any>[];\n data: TData[];\n pageSize?: number;\n pageSizeOptions?: number[];\n enableSorting?: boolean;\n enablePagination?: boolean;\n enableColumnVisibility?: boolean;\n enableColumnReordering?: boolean;\n enableColumnResizing?: boolean;\n enableColumnPinning?: boolean;\n onCellEdit?: CellEditHandler<TData>;\n toolbar?: React.ReactNode;\n /** Content rendered as a sticky summary bar inside the table's bordered container, below the rows. */\n footer?: React.ReactNode;\n className?: string;\n emptyState?: React.ReactNode;\n /** Server-side mode: skip client pagination — `data` is already the current page. Requires `pageCount` (or `rowCount`). */\n manualPagination?: boolean;\n /** Server-side mode: skip client sorting — caller refetches when `sorting` changes. */\n manualSorting?: boolean;\n /** Total pages on server (for manualPagination). */\n pageCount?: number;\n /** Total rows on server (drives \"Showing X–Y of Z\" in manual mode). */\n rowCount?: number;\n /** Controlled pagination state. */\n pagination?: PaginationState;\n onPaginationChange?: OnChangeFn<PaginationState>;\n /** Controlled sorting state. */\n sorting?: SortingState;\n onSortingChange?: OnChangeFn<SortingState>;\n /** Show a loading overlay over the table body. */\n loading?: boolean;\n /**\n * Presentational row grouping — returns the group a row belongs to, or\n * `null` for none. A full-width header row is emitted whenever the key\n * changes from the previous row.\n *\n * Deliberately *not* TanStack's aggregating grouping model. This is for a\n * list that already arrives in the right order and wants section headings in\n * it — a story index, a queue split into questions/proposals/results. It\n * sorts nothing and aggregates nothing, so it cannot disagree with the order\n * the caller chose.\n */\n groupBy?: (row: TData) => string | null | undefined;\n /** What a group header row contains. Defaults to the key. */\n renderGroupHeader?: (key: string, rows: TData[]) => React.ReactNode;\n /**\n * `compact` is the dense reading — 26px rows at `text-sm`, which is what a\n * journal, a trace or a step's output table is drawn at. The primitive\n * `Table` has carried it all along; this is the table that passes it on.\n */\n density?: \"default\" | \"compact\";\n /**\n * How deep this row sits under another — a child run under the run that\n * spawned it. Indents the **first** cell only, so the shape of the list is\n * carried by the column a reader is scanning and not by the whole row.\n *\n * Presentational, like `groupBy`: it nests nothing and sorts nothing, because\n * the caller already has the rows in the order it wants them.\n */\n rowIndent?: (row: TData) => number | undefined;\n /**\n * Which row is the one being read elsewhere — the run open in the panel, the\n * step open on its page. Drawn as an accent ground with a rule down its\n * leading edge, so it is still findable after a scroll.\n */\n isRowSelected?: (row: TData) => boolean;\n /** Makes rows activate — click, `Enter` or `Space`. */\n onRowClick?: (row: TData) => void;\n}\n\nfunction getCommonPinStyles<TData>(\n header: Header<TData, unknown>,\n): React.CSSProperties {\n const isPinned = header.column.getIsPinned();\n if (!isPinned) return {};\n return {\n position: \"sticky\",\n left: isPinned === \"left\" ? header.column.getStart(\"left\") : undefined,\n right: isPinned === \"right\" ? header.column.getAfter(\"right\") : undefined,\n zIndex: 2,\n };\n}\n\ninterface DraggableHeaderProps<TData> {\n header: Header<TData, unknown>;\n enableReordering: boolean;\n enableResizing: boolean;\n enableSorting: boolean;\n}\n\nfunction DraggableHeader<TData>({\n header,\n enableReordering,\n enableResizing,\n enableSorting,\n}: DraggableHeaderProps<TData>) {\n const column = header.column;\n const isPinned = column.getIsPinned();\n const canDrag = enableReordering && !isPinned && column.id !== \"__select\";\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: column.id, disabled: !canDrag });\n\n const sortDir = column.getIsSorted();\n const canSort = enableSorting && column.getCanSort();\n const align = column.columnDef.meta?.align ?? \"left\";\n const alignClass =\n align === \"right\"\n ? \"justify-end text-right\"\n : align === \"center\"\n ? \"justify-center text-center\"\n : \"justify-start text-left\";\n\n return (\n <TableHead\n ref={setNodeRef}\n colSpan={header.colSpan}\n style={{\n width: header.getSize(),\n transform: CSS.Translate.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n ...getCommonPinStyles(header),\n ...(isPinned ? { backgroundColor: \"hsl(var(--background))\" } : {}),\n }}\n className={cn(\n \"group relative select-none bg-muted/40\",\n isPinned &&\n \"bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]\",\n column.columnDef.meta?.headerClassName,\n )}\n {...attributes}\n >\n <div className={cn(\"flex items-center gap-1\", alignClass)}>\n {canDrag && (\n <button\n type=\"button\"\n className=\"cursor-grab text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 active:cursor-grabbing\"\n {...listeners}\n aria-label=\"Drag column\"\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </button>\n )}\n {canSort ? (\n <button\n type=\"button\"\n onClick={column.getToggleSortingHandler()}\n className=\"inline-flex items-center gap-1 font-medium hover:text-foreground\"\n >\n {flexRender(column.columnDef.header, header.getContext())}\n {sortDir === \"asc\" ? (\n <ArrowUp className=\"h-3.5 w-3.5\" />\n ) : sortDir === \"desc\" ? (\n <ArrowDown className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronsUpDown className=\"h-3.5 w-3.5 opacity-50\" />\n )}\n </button>\n ) : (\n <span className=\"font-medium\">\n {flexRender(column.columnDef.header, header.getContext())}\n </span>\n )}\n </div>\n {enableResizing && column.getCanResize() && (\n <button\n type=\"button\"\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n className={cn(\n \"absolute right-0 top-0 h-full w-1 cursor-col-resize select-none touch-none bg-transparent hover:bg-border\",\n column.getIsResizing() && \"bg-primary\",\n )}\n aria-label=\"Resize column\"\n />\n )}\n </TableHead>\n );\n}\n\nexport function DataTable<TData extends RowData>({\n columns,\n data,\n pageSize = 10,\n pageSizeOptions,\n enableSorting = true,\n enablePagination = true,\n enableColumnVisibility = true,\n enableColumnReordering = false,\n enableColumnResizing = false,\n enableColumnPinning = false,\n onCellEdit,\n toolbar,\n footer,\n className,\n emptyState,\n manualPagination = false,\n manualSorting = false,\n pageCount,\n rowCount,\n pagination: paginationProp,\n onPaginationChange,\n sorting: sortingProp,\n onSortingChange,\n loading = false,\n groupBy,\n renderGroupHeader,\n density = \"default\",\n rowIndent,\n isRowSelected,\n onRowClick,\n}: DataTableProps<TData>) {\n const [internalSorting, setInternalSorting] = React.useState<SortingState>(\n [],\n );\n const sorting = sortingProp ?? internalSorting;\n const setSorting: OnChangeFn<SortingState> = (updater) => {\n if (onSortingChange) onSortingChange(updater);\n if (!sortingProp) setInternalSorting(updater);\n };\n\n const [internalPagination, setInternalPagination] =\n React.useState<PaginationState>({\n pageIndex: 0,\n pageSize,\n });\n const pagination = paginationProp ?? internalPagination;\n const setPagination: OnChangeFn<PaginationState> = (updater) => {\n if (onPaginationChange) onPaginationChange(updater);\n if (!paginationProp) setInternalPagination(updater);\n };\n\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(\n [],\n );\n const [columnVisibility, setColumnVisibility] =\n React.useState<VisibilityState>({});\n const [columnPinning, setColumnPinning] = React.useState<ColumnPinningState>({\n left: [],\n right: [],\n });\n const [columnOrder, setColumnOrder] = React.useState<ColumnOrderState>(() =>\n columns.map((c, i) => (c as any).id ?? (c as any).accessorKey ?? String(i)),\n );\n\n const wrappedColumns = React.useMemo<ColumnDef<TData, any>[]>(() => {\n return columns.map((col) => {\n const meta = col.meta;\n if (meta?.editable && !col.cell) {\n return {\n ...col,\n cell: (ctx) => (\n <EditableCell\n ctx={ctx}\n editType={meta.editType}\n options={meta.options}\n align={meta.align}\n onCellEdit={onCellEdit}\n />\n ),\n };\n }\n return col;\n });\n }, [columns, onCellEdit]);\n\n const table = useReactTable({\n data,\n columns: wrappedColumns,\n state: {\n sorting,\n pagination,\n columnFilters,\n columnVisibility,\n columnPinning,\n columnOrder,\n },\n onSortingChange: setSorting,\n onPaginationChange: setPagination,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnPinningChange: setColumnPinning,\n onColumnOrderChange: setColumnOrder,\n enableSorting,\n enableColumnResizing,\n enableColumnPinning,\n manualPagination,\n manualSorting,\n pageCount: pageCount ?? -1,\n rowCount,\n columnResizeMode: \"onChange\",\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel:\n enableSorting && !manualSorting ? getSortedRowModel() : undefined,\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel:\n enablePagination && !manualPagination\n ? getPaginationRowModel()\n : undefined,\n });\n\n const sensors = useSensors(\n useSensor(MouseSensor, { activationConstraint: { distance: 4 } }),\n useSensor(TouchSensor, {\n activationConstraint: { delay: 200, tolerance: 8 },\n }),\n useSensor(KeyboardSensor),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n setColumnOrder((prev) => {\n const next = prev.length\n ? prev\n : table.getAllLeafColumns().map((c) => c.id);\n const oldIndex = next.indexOf(active.id as string);\n const newIndex = next.indexOf(over.id as string);\n if (oldIndex < 0 || newIndex < 0) return prev;\n return arrayMove(next, oldIndex, newIndex);\n });\n };\n\n const visibleLeafColumnIds = table.getVisibleLeafColumns().map((c) => c.id);\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <DataTableToolbar\n table={table}\n enableColumnVisibility={enableColumnVisibility}\n enableColumnPinning={enableColumnPinning}\n >\n {toolbar}\n </DataTableToolbar>\n\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToHorizontalAxis]}\n onDragEnd={handleDragEnd}\n >\n <div className=\"relative overflow-auto rounded-md border\">\n {loading && (\n <div className=\"pointer-events-none absolute inset-0 z-10 flex items-start justify-center bg-background/60 pt-12 text-muted-foreground\">\n Loading…\n </div>\n )}\n <Table\n density={density}\n style={{\n width: enableColumnResizing ? table.getTotalSize() : undefined,\n }}\n >\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n <SortableContext\n items={visibleLeafColumnIds}\n strategy={horizontalListSortingStrategy}\n >\n {headerGroup.headers.map((header) => (\n <DraggableHeader\n key={header.id}\n header={header}\n enableReordering={enableColumnReordering}\n enableResizing={enableColumnResizing}\n enableSorting={enableSorting}\n />\n ))}\n </SortableContext>\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={table.getAllLeafColumns().length}\n className=\"h-24 text-center text-muted-foreground\"\n >\n {emptyState ?? \"No results.\"}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row, rowIndex, allRows) => {\n const groupKey = groupBy?.(row.original);\n const previousKey =\n rowIndex > 0\n ? groupBy?.(allRows[rowIndex - 1].original)\n : undefined;\n const startsGroup =\n groupKey != null && groupKey !== previousKey;\n return (\n <React.Fragment key={row.id}>\n {startsGroup ? (\n <TableRow className=\"bg-muted/50 hover:bg-muted/50\">\n <TableCell\n colSpan={table.getAllLeafColumns().length}\n className=\"py-1 font-medium\"\n >\n {renderGroupHeader\n ? renderGroupHeader(\n groupKey,\n allRows\n .filter(\n (r) => groupBy?.(r.original) === groupKey,\n )\n .map((r) => r.original),\n )\n : groupKey}\n </TableCell>\n </TableRow>\n ) : null}\n <TableRow\n data-selected={\n isRowSelected?.(row.original) || undefined\n }\n aria-selected={\n isRowSelected ? isRowSelected(row.original) : undefined\n }\n tabIndex={onRowClick ? 0 : undefined}\n onClick={\n onRowClick\n ? () => onRowClick(row.original)\n : undefined\n }\n onKeyDown={\n onRowClick\n ? (event) => {\n if (event.key !== \"Enter\" && event.key !== \" \")\n return;\n event.preventDefault();\n onRowClick(row.original);\n }\n : undefined\n }\n className={cn(\n isRowSelected?.(row.original) &&\n \"bg-accent shadow-[inset_2px_0_0_var(--color-primary)] hover:bg-accent\",\n onRowClick &&\n \"cursor-pointer focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-ring\",\n )}\n >\n {row.getVisibleCells().map((cell, cellIndex) => {\n const column = cell.column;\n const isPinned = column.getIsPinned();\n const align = column.columnDef.meta?.align ?? \"left\";\n const indent =\n cellIndex === 0 ? rowIndent?.(row.original) : undefined;\n return (\n <TableCell\n key={cell.id}\n style={{\n width: cell.column.getSize(),\n ...(indent\n ? { paddingLeft: `${indent * 14 + 8}px` }\n : {}),\n ...(isPinned\n ? {\n position: \"sticky\",\n left:\n isPinned === \"left\"\n ? column.getStart(\"left\")\n : undefined,\n right:\n isPinned === \"right\"\n ? column.getAfter(\"right\")\n : undefined,\n zIndex: 1,\n backgroundColor: \"hsl(var(--background))\",\n }\n : {}),\n }}\n className={cn(\n align === \"right\" && \"text-right\",\n align === \"center\" && \"text-center\",\n isPinned &&\n \"bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]\",\n column.columnDef.meta?.mono && \"font-mono\",\n column.columnDef.meta?.cellClassName,\n )}\n >\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </TableCell>\n );\n })}\n </TableRow>\n </React.Fragment>\n );\n })\n )}\n </TableBody>\n </Table>\n {footer != null && (\n <div className=\"sticky bottom-0 border-t bg-muted/40 px-3 py-2 text-muted-foreground\">\n {footer}\n </div>\n )}\n </div>\n </DndContext>\n\n {enablePagination && (\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n )}\n </div>\n );\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -13,6 +13,13 @@ declare module '@tanstack/react-table' {
|
|
|
13
13
|
editType?: EditType;
|
|
14
14
|
options?: EditOption[];
|
|
15
15
|
align?: 'left' | 'center' | 'right';
|
|
16
|
+
/**
|
|
17
|
+
* Read this column as the record writes it — an id, a digest, a count, a
|
|
18
|
+
* duration. Mono is not decoration here: it is what makes a column of
|
|
19
|
+
* addresses scannable and a column of numbers comparable down its own
|
|
20
|
+
* length.
|
|
21
|
+
*/
|
|
22
|
+
mono?: boolean;
|
|
16
23
|
/**
|
|
17
24
|
* Extra class(es) applied to this column's body `<td>`. Use to control
|
|
18
25
|
* padding, vertical alignment, or background when rendering your own
|
|
@@ -77,8 +84,31 @@ interface DataTableProps<TData extends RowData> {
|
|
|
77
84
|
groupBy?: (row: TData) => string | null | undefined;
|
|
78
85
|
/** What a group header row contains. Defaults to the key. */
|
|
79
86
|
renderGroupHeader?: (key: string, rows: TData[]) => React$1.ReactNode;
|
|
87
|
+
/**
|
|
88
|
+
* `compact` is the dense reading — 26px rows at `text-sm`, which is what a
|
|
89
|
+
* journal, a trace or a step's output table is drawn at. The primitive
|
|
90
|
+
* `Table` has carried it all along; this is the table that passes it on.
|
|
91
|
+
*/
|
|
92
|
+
density?: "default" | "compact";
|
|
93
|
+
/**
|
|
94
|
+
* How deep this row sits under another — a child run under the run that
|
|
95
|
+
* spawned it. Indents the **first** cell only, so the shape of the list is
|
|
96
|
+
* carried by the column a reader is scanning and not by the whole row.
|
|
97
|
+
*
|
|
98
|
+
* Presentational, like `groupBy`: it nests nothing and sorts nothing, because
|
|
99
|
+
* the caller already has the rows in the order it wants them.
|
|
100
|
+
*/
|
|
101
|
+
rowIndent?: (row: TData) => number | undefined;
|
|
102
|
+
/**
|
|
103
|
+
* Which row is the one being read elsewhere — the run open in the panel, the
|
|
104
|
+
* step open on its page. Drawn as an accent ground with a rule down its
|
|
105
|
+
* leading edge, so it is still findable after a scroll.
|
|
106
|
+
*/
|
|
107
|
+
isRowSelected?: (row: TData) => boolean;
|
|
108
|
+
/** Makes rows activate — click, `Enter` or `Space`. */
|
|
109
|
+
onRowClick?: (row: TData) => void;
|
|
80
110
|
}
|
|
81
|
-
declare function DataTable<TData extends RowData>({ columns, data, pageSize, pageSizeOptions, enableSorting, enablePagination, enableColumnVisibility, enableColumnReordering, enableColumnResizing, enableColumnPinning, onCellEdit, toolbar, footer, className, emptyState, manualPagination, manualSorting, pageCount, rowCount, pagination: paginationProp, onPaginationChange, sorting: sortingProp, onSortingChange, loading, groupBy, renderGroupHeader, }: DataTableProps<TData>): React$1.JSX.Element;
|
|
111
|
+
declare function DataTable<TData extends RowData>({ columns, data, pageSize, pageSizeOptions, enableSorting, enablePagination, enableColumnVisibility, enableColumnReordering, enableColumnResizing, enableColumnPinning, onCellEdit, toolbar, footer, className, emptyState, manualPagination, manualSorting, pageCount, rowCount, pagination: paginationProp, onPaginationChange, sorting: sortingProp, onSortingChange, loading, groupBy, renderGroupHeader, density, rowIndent, isRowSelected, onRowClick, }: DataTableProps<TData>): React$1.JSX.Element;
|
|
82
112
|
|
|
83
113
|
interface DataTablePaginationProps<TData> {
|
|
84
114
|
table: Table<TData>;
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,13 @@ declare module '@tanstack/react-table' {
|
|
|
13
13
|
editType?: EditType;
|
|
14
14
|
options?: EditOption[];
|
|
15
15
|
align?: 'left' | 'center' | 'right';
|
|
16
|
+
/**
|
|
17
|
+
* Read this column as the record writes it — an id, a digest, a count, a
|
|
18
|
+
* duration. Mono is not decoration here: it is what makes a column of
|
|
19
|
+
* addresses scannable and a column of numbers comparable down its own
|
|
20
|
+
* length.
|
|
21
|
+
*/
|
|
22
|
+
mono?: boolean;
|
|
16
23
|
/**
|
|
17
24
|
* Extra class(es) applied to this column's body `<td>`. Use to control
|
|
18
25
|
* padding, vertical alignment, or background when rendering your own
|
|
@@ -77,8 +84,31 @@ interface DataTableProps<TData extends RowData> {
|
|
|
77
84
|
groupBy?: (row: TData) => string | null | undefined;
|
|
78
85
|
/** What a group header row contains. Defaults to the key. */
|
|
79
86
|
renderGroupHeader?: (key: string, rows: TData[]) => React$1.ReactNode;
|
|
87
|
+
/**
|
|
88
|
+
* `compact` is the dense reading — 26px rows at `text-sm`, which is what a
|
|
89
|
+
* journal, a trace or a step's output table is drawn at. The primitive
|
|
90
|
+
* `Table` has carried it all along; this is the table that passes it on.
|
|
91
|
+
*/
|
|
92
|
+
density?: "default" | "compact";
|
|
93
|
+
/**
|
|
94
|
+
* How deep this row sits under another — a child run under the run that
|
|
95
|
+
* spawned it. Indents the **first** cell only, so the shape of the list is
|
|
96
|
+
* carried by the column a reader is scanning and not by the whole row.
|
|
97
|
+
*
|
|
98
|
+
* Presentational, like `groupBy`: it nests nothing and sorts nothing, because
|
|
99
|
+
* the caller already has the rows in the order it wants them.
|
|
100
|
+
*/
|
|
101
|
+
rowIndent?: (row: TData) => number | undefined;
|
|
102
|
+
/**
|
|
103
|
+
* Which row is the one being read elsewhere — the run open in the panel, the
|
|
104
|
+
* step open on its page. Drawn as an accent ground with a rule down its
|
|
105
|
+
* leading edge, so it is still findable after a scroll.
|
|
106
|
+
*/
|
|
107
|
+
isRowSelected?: (row: TData) => boolean;
|
|
108
|
+
/** Makes rows activate — click, `Enter` or `Space`. */
|
|
109
|
+
onRowClick?: (row: TData) => void;
|
|
80
110
|
}
|
|
81
|
-
declare function DataTable<TData extends RowData>({ columns, data, pageSize, pageSizeOptions, enableSorting, enablePagination, enableColumnVisibility, enableColumnReordering, enableColumnResizing, enableColumnPinning, onCellEdit, toolbar, footer, className, emptyState, manualPagination, manualSorting, pageCount, rowCount, pagination: paginationProp, onPaginationChange, sorting: sortingProp, onSortingChange, loading, groupBy, renderGroupHeader, }: DataTableProps<TData>): React$1.JSX.Element;
|
|
111
|
+
declare function DataTable<TData extends RowData>({ columns, data, pageSize, pageSizeOptions, enableSorting, enablePagination, enableColumnVisibility, enableColumnReordering, enableColumnResizing, enableColumnPinning, onCellEdit, toolbar, footer, className, emptyState, manualPagination, manualSorting, pageCount, rowCount, pagination: paginationProp, onPaginationChange, sorting: sortingProp, onSortingChange, loading, groupBy, renderGroupHeader, density, rowIndent, isRowSelected, onRowClick, }: DataTableProps<TData>): React$1.JSX.Element;
|
|
82
112
|
|
|
83
113
|
interface DataTablePaginationProps<TData> {
|
|
84
114
|
table: Table<TData>;
|
package/dist/index.js
CHANGED
|
@@ -141,7 +141,7 @@ function DataTableToolbar({
|
|
|
141
141
|
{
|
|
142
142
|
type: "button",
|
|
143
143
|
onClick: () => col.pin(pinned === "left" ? false : "left"),
|
|
144
|
-
className: `rounded px-1.5 py-0.5 text-
|
|
144
|
+
className: `rounded px-1.5 py-0.5 text-sm ${pinned === "left" ? "bg-primary text-primary-foreground" : "bg-muted hover:bg-muted/70"}`,
|
|
145
145
|
children: "L"
|
|
146
146
|
}
|
|
147
147
|
),
|
|
@@ -150,7 +150,7 @@ function DataTableToolbar({
|
|
|
150
150
|
{
|
|
151
151
|
type: "button",
|
|
152
152
|
onClick: () => col.pin(pinned === "right" ? false : "right"),
|
|
153
|
-
className: `rounded px-1.5 py-0.5 text-
|
|
153
|
+
className: `rounded px-1.5 py-0.5 text-sm ${pinned === "right" ? "bg-primary text-primary-foreground" : "bg-muted hover:bg-muted/70"}`,
|
|
154
154
|
children: "R"
|
|
155
155
|
}
|
|
156
156
|
)
|
|
@@ -362,7 +362,11 @@ function DataTable({
|
|
|
362
362
|
onSortingChange,
|
|
363
363
|
loading = false,
|
|
364
364
|
groupBy,
|
|
365
|
-
renderGroupHeader
|
|
365
|
+
renderGroupHeader,
|
|
366
|
+
density = "default",
|
|
367
|
+
rowIndent,
|
|
368
|
+
isRowSelected,
|
|
369
|
+
onRowClick
|
|
366
370
|
}) {
|
|
367
371
|
const [internalSorting, setInternalSorting] = React2.useState(
|
|
368
372
|
[]
|
|
@@ -484,6 +488,7 @@ function DataTable({
|
|
|
484
488
|
/* @__PURE__ */ jsxs(
|
|
485
489
|
Table,
|
|
486
490
|
{
|
|
491
|
+
density,
|
|
487
492
|
style: {
|
|
488
493
|
width: enableColumnResizing ? table.getTotalSize() : void 0
|
|
489
494
|
},
|
|
@@ -530,37 +535,59 @@ function DataTable({
|
|
|
530
535
|
) : groupKey
|
|
531
536
|
}
|
|
532
537
|
) }) : null,
|
|
533
|
-
/* @__PURE__ */ jsx(
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
538
|
+
/* @__PURE__ */ jsx(
|
|
539
|
+
TableRow,
|
|
540
|
+
{
|
|
541
|
+
"data-selected": isRowSelected?.(row.original) || void 0,
|
|
542
|
+
"aria-selected": isRowSelected ? isRowSelected(row.original) : void 0,
|
|
543
|
+
tabIndex: onRowClick ? 0 : void 0,
|
|
544
|
+
onClick: onRowClick ? () => onRowClick(row.original) : void 0,
|
|
545
|
+
onKeyDown: onRowClick ? (event) => {
|
|
546
|
+
if (event.key !== "Enter" && event.key !== " ")
|
|
547
|
+
return;
|
|
548
|
+
event.preventDefault();
|
|
549
|
+
onRowClick(row.original);
|
|
550
|
+
} : void 0,
|
|
551
|
+
className: cn(
|
|
552
|
+
isRowSelected?.(row.original) && "bg-accent shadow-[inset_2px_0_0_var(--color-primary)] hover:bg-accent",
|
|
553
|
+
onRowClick && "cursor-pointer focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-ring"
|
|
554
|
+
),
|
|
555
|
+
children: row.getVisibleCells().map((cell, cellIndex) => {
|
|
556
|
+
const column = cell.column;
|
|
557
|
+
const isPinned = column.getIsPinned();
|
|
558
|
+
const align = column.columnDef.meta?.align ?? "left";
|
|
559
|
+
const indent = cellIndex === 0 ? rowIndent?.(row.original) : void 0;
|
|
560
|
+
return /* @__PURE__ */ jsx(
|
|
561
|
+
TableCell,
|
|
562
|
+
{
|
|
563
|
+
style: {
|
|
564
|
+
width: cell.column.getSize(),
|
|
565
|
+
...indent ? { paddingLeft: `${indent * 14 + 8}px` } : {},
|
|
566
|
+
...isPinned ? {
|
|
567
|
+
position: "sticky",
|
|
568
|
+
left: isPinned === "left" ? column.getStart("left") : void 0,
|
|
569
|
+
right: isPinned === "right" ? column.getAfter("right") : void 0,
|
|
570
|
+
zIndex: 1,
|
|
571
|
+
backgroundColor: "hsl(var(--background))"
|
|
572
|
+
} : {}
|
|
573
|
+
},
|
|
574
|
+
className: cn(
|
|
575
|
+
align === "right" && "text-right",
|
|
576
|
+
align === "center" && "text-center",
|
|
577
|
+
isPinned && "bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]",
|
|
578
|
+
column.columnDef.meta?.mono && "font-mono",
|
|
579
|
+
column.columnDef.meta?.cellClassName
|
|
580
|
+
),
|
|
581
|
+
children: flexRender(
|
|
582
|
+
cell.column.columnDef.cell,
|
|
583
|
+
cell.getContext()
|
|
584
|
+
)
|
|
585
|
+
},
|
|
586
|
+
cell.id
|
|
587
|
+
);
|
|
588
|
+
})
|
|
589
|
+
}
|
|
590
|
+
)
|
|
564
591
|
] }, row.id);
|
|
565
592
|
}) })
|
|
566
593
|
]
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-table-pagination.tsx","../src/data-table-toolbar.tsx","../src/editable-cell.tsx","../src/data-table.tsx"],"names":["jsxs","jsx","Button","React","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","cn"],"mappings":"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","file":"index.js","sourcesContent":["import { Button } from '@invana/ui';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@invana/forms';\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\n\nexport interface DataTablePaginationProps<TData> {\n table: Table<TData>;\n pageSizeOptions?: number[];\n}\n\nexport function DataTablePagination<TData>({\n table,\n pageSizeOptions = [10, 20, 50, 100],\n}: DataTablePaginationProps<TData>) {\n const { pageIndex, pageSize } = table.getState().pagination;\n const serverRowCount = table.options.rowCount;\n const total =\n typeof serverRowCount === 'number'\n ? serverRowCount\n : table.getFilteredRowModel().rows.length;\n const start = total === 0 ? 0 : pageIndex * pageSize + 1;\n const end = Math.min((pageIndex + 1) * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between gap-4 px-2 py-2\">\n <div className=\"text-muted-foreground\">\n {total === 0 ? 'No rows' : `Showing ${start}–${end} of ${total}`}\n </div>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Rows per page</span>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => table.setPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-8 w-[72px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"text-muted-foreground tabular-nums\">\n Page {pageIndex + 1} of {table.getPageCount() || 1}\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"First page\"\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n aria-label=\"Last page\"\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import {\n Button,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@invana/ui';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\n\nexport interface DataTableToolbarProps<TData> {\n table: Table<TData>;\n enableColumnVisibility?: boolean;\n enableColumnPinning?: boolean;\n children?: React.ReactNode;\n}\n\nexport function DataTableToolbar<TData>({\n table,\n enableColumnVisibility = true,\n enableColumnPinning = false,\n children,\n}: DataTableToolbarProps<TData>) {\n const toggleableCols = table\n .getAllLeafColumns()\n .filter((c) => c.getCanHide());\n\n return (\n <div className=\"flex items-center justify-between gap-2 px-2 py-2\">\n <div className=\"flex items-center gap-2\">{children}</div>\n <div className=\"flex items-center gap-2\">\n {enableColumnVisibility && toggleableCols.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8\">\n <Settings2 className=\"mr-2 h-4 w-4\" />\n Columns\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {toggleableCols.map((col) => (\n <DropdownMenuCheckboxItem\n key={col.id}\n className=\"capitalize\"\n checked={col.getIsVisible()}\n onCheckedChange={(v) => col.toggleVisibility(!!v)}\n onSelect={(e) => e.preventDefault()}\n >\n {String(col.columnDef.header ?? col.id)}\n </DropdownMenuCheckboxItem>\n ))}\n {enableColumnPinning && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Pinning</DropdownMenuLabel>\n {table.getAllLeafColumns().map((col) => {\n if (!col.getCanPin()) return null;\n const pinned = col.getIsPinned();\n return (\n <div\n key={col.id}\n className=\"flex items-center justify-between px-2 py-1\"\n >\n <span className=\"capitalize truncate\">\n {String(col.columnDef.header ?? col.id)}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() =>\n col.pin(pinned === 'left' ? false : 'left')\n }\n className={`rounded px-1.5 py-0.5 text-meta ${\n pinned === 'left'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted hover:bg-muted/70'\n }`}\n >\n L\n </button>\n <button\n type=\"button\"\n onClick={() =>\n col.pin(pinned === 'right' ? false : 'right')\n }\n className={`rounded px-1.5 py-0.5 text-meta ${\n pinned === 'right'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted hover:bg-muted/70'\n }`}\n >\n R\n </button>\n </div>\n </div>\n );\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { cn } from '@invana/ui';\nimport {\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@invana/forms';\nimport type { CellContext } from '@tanstack/react-table';\nimport type { CellEditHandler, EditOption, EditType } from './types';\n\nexport interface EditableCellProps<TData> {\n ctx: CellContext<TData, unknown>;\n editType?: EditType;\n options?: EditOption[];\n align?: 'left' | 'center' | 'right';\n onCellEdit?: CellEditHandler<TData>;\n}\n\nexport function EditableCell<TData>({\n ctx,\n editType = 'text',\n options,\n align = 'left',\n onCellEdit,\n}: EditableCellProps<TData>) {\n const initial = ctx.getValue();\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState<unknown>(initial);\n\n React.useEffect(() => {\n if (!editing) setDraft(initial);\n }, [initial, editing]);\n\n const commit = (next: unknown) => {\n setEditing(false);\n if (next === initial) return;\n onCellEdit?.({\n rowIndex: ctx.row.index,\n columnId: ctx.column.id,\n value: next,\n row: ctx.row.original,\n });\n };\n\n const alignClass =\n align === 'right'\n ? 'text-right justify-end'\n : align === 'center'\n ? 'text-center justify-center'\n : 'text-left justify-start';\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={() => setEditing(true)}\n className={cn(\n 'group flex w-full items-center rounded-control px-1.5 py-1 hover:bg-muted/60 focus:outline-none focus:ring-2 focus:ring-ring',\n alignClass,\n )}\n title=\"Click to edit\"\n >\n <span className=\"truncate\">\n {initial == null || initial === '' ? (\n <span className=\"text-muted-foreground italic\">empty</span>\n ) : (\n String(initial)\n )}\n </span>\n </button>\n );\n }\n\n if (editType === 'select') {\n return (\n <Select\n defaultValue={initial == null ? undefined : String(initial)}\n onValueChange={(v) => commit(v)}\n open\n onOpenChange={(open) => {\n if (!open) setEditing(false);\n }}\n >\n <SelectTrigger className=\"h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options?.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n return (\n <Input\n autoFocus\n type={editType === 'number' ? 'number' : 'text'}\n defaultValue={initial == null ? '' : String(initial)}\n onBlur={(e) => {\n const v =\n editType === 'number' ? Number(e.currentTarget.value) : e.currentTarget.value;\n commit(v);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.currentTarget as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setEditing(false);\n }\n }}\n className={cn('h-8', alignClass)}\n />\n );\n}\n","import * as React from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type ColumnOrderState,\n type ColumnPinningState,\n type Header,\n type OnChangeFn,\n type PaginationState,\n type RowData,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from \"@dnd-kit/core\";\nimport { restrictToHorizontalAxis } from \"@dnd-kit/modifiers\";\nimport {\n SortableContext,\n arrayMove,\n horizontalListSortingStrategy,\n useSortable,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n cn,\n} from \"@invana/ui\";\nimport { ArrowDown, ArrowUp, ChevronsUpDown, GripVertical } from \"lucide-react\";\nimport { DataTablePagination } from \"./data-table-pagination\";\nimport { DataTableToolbar } from \"./data-table-toolbar\";\nimport { EditableCell } from \"./editable-cell\";\nimport type { CellEditHandler } from \"./types\";\n\nexport interface DataTableProps<TData extends RowData> {\n columns: ColumnDef<TData, any>[];\n data: TData[];\n pageSize?: number;\n pageSizeOptions?: number[];\n enableSorting?: boolean;\n enablePagination?: boolean;\n enableColumnVisibility?: boolean;\n enableColumnReordering?: boolean;\n enableColumnResizing?: boolean;\n enableColumnPinning?: boolean;\n onCellEdit?: CellEditHandler<TData>;\n toolbar?: React.ReactNode;\n /** Content rendered as a sticky summary bar inside the table's bordered container, below the rows. */\n footer?: React.ReactNode;\n className?: string;\n emptyState?: React.ReactNode;\n /** Server-side mode: skip client pagination — `data` is already the current page. Requires `pageCount` (or `rowCount`). */\n manualPagination?: boolean;\n /** Server-side mode: skip client sorting — caller refetches when `sorting` changes. */\n manualSorting?: boolean;\n /** Total pages on server (for manualPagination). */\n pageCount?: number;\n /** Total rows on server (drives \"Showing X–Y of Z\" in manual mode). */\n rowCount?: number;\n /** Controlled pagination state. */\n pagination?: PaginationState;\n onPaginationChange?: OnChangeFn<PaginationState>;\n /** Controlled sorting state. */\n sorting?: SortingState;\n onSortingChange?: OnChangeFn<SortingState>;\n /** Show a loading overlay over the table body. */\n loading?: boolean;\n /**\n * Presentational row grouping — returns the group a row belongs to, or\n * `null` for none. A full-width header row is emitted whenever the key\n * changes from the previous row.\n *\n * Deliberately *not* TanStack's aggregating grouping model. This is for a\n * list that already arrives in the right order and wants section headings in\n * it — a story index, a queue split into questions/proposals/results. It\n * sorts nothing and aggregates nothing, so it cannot disagree with the order\n * the caller chose.\n */\n groupBy?: (row: TData) => string | null | undefined;\n /** What a group header row contains. Defaults to the key. */\n renderGroupHeader?: (key: string, rows: TData[]) => React.ReactNode;\n}\n\nfunction getCommonPinStyles<TData>(\n header: Header<TData, unknown>,\n): React.CSSProperties {\n const isPinned = header.column.getIsPinned();\n if (!isPinned) return {};\n return {\n position: \"sticky\",\n left: isPinned === \"left\" ? header.column.getStart(\"left\") : undefined,\n right: isPinned === \"right\" ? header.column.getAfter(\"right\") : undefined,\n zIndex: 2,\n };\n}\n\ninterface DraggableHeaderProps<TData> {\n header: Header<TData, unknown>;\n enableReordering: boolean;\n enableResizing: boolean;\n enableSorting: boolean;\n}\n\nfunction DraggableHeader<TData>({\n header,\n enableReordering,\n enableResizing,\n enableSorting,\n}: DraggableHeaderProps<TData>) {\n const column = header.column;\n const isPinned = column.getIsPinned();\n const canDrag = enableReordering && !isPinned && column.id !== \"__select\";\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: column.id, disabled: !canDrag });\n\n const sortDir = column.getIsSorted();\n const canSort = enableSorting && column.getCanSort();\n const align = column.columnDef.meta?.align ?? \"left\";\n const alignClass =\n align === \"right\"\n ? \"justify-end text-right\"\n : align === \"center\"\n ? \"justify-center text-center\"\n : \"justify-start text-left\";\n\n return (\n <TableHead\n ref={setNodeRef}\n colSpan={header.colSpan}\n style={{\n width: header.getSize(),\n transform: CSS.Translate.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n ...getCommonPinStyles(header),\n ...(isPinned ? { backgroundColor: \"hsl(var(--background))\" } : {}),\n }}\n className={cn(\n \"group relative select-none bg-muted/40\",\n isPinned &&\n \"bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]\",\n column.columnDef.meta?.headerClassName,\n )}\n {...attributes}\n >\n <div className={cn(\"flex items-center gap-1\", alignClass)}>\n {canDrag && (\n <button\n type=\"button\"\n className=\"cursor-grab text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 active:cursor-grabbing\"\n {...listeners}\n aria-label=\"Drag column\"\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </button>\n )}\n {canSort ? (\n <button\n type=\"button\"\n onClick={column.getToggleSortingHandler()}\n className=\"inline-flex items-center gap-1 font-medium hover:text-foreground\"\n >\n {flexRender(column.columnDef.header, header.getContext())}\n {sortDir === \"asc\" ? (\n <ArrowUp className=\"h-3.5 w-3.5\" />\n ) : sortDir === \"desc\" ? (\n <ArrowDown className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronsUpDown className=\"h-3.5 w-3.5 opacity-50\" />\n )}\n </button>\n ) : (\n <span className=\"font-medium\">\n {flexRender(column.columnDef.header, header.getContext())}\n </span>\n )}\n </div>\n {enableResizing && column.getCanResize() && (\n <button\n type=\"button\"\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n className={cn(\n \"absolute right-0 top-0 h-full w-1 cursor-col-resize select-none touch-none bg-transparent hover:bg-border\",\n column.getIsResizing() && \"bg-primary\",\n )}\n aria-label=\"Resize column\"\n />\n )}\n </TableHead>\n );\n}\n\nexport function DataTable<TData extends RowData>({\n columns,\n data,\n pageSize = 10,\n pageSizeOptions,\n enableSorting = true,\n enablePagination = true,\n enableColumnVisibility = true,\n enableColumnReordering = false,\n enableColumnResizing = false,\n enableColumnPinning = false,\n onCellEdit,\n toolbar,\n footer,\n className,\n emptyState,\n manualPagination = false,\n manualSorting = false,\n pageCount,\n rowCount,\n pagination: paginationProp,\n onPaginationChange,\n sorting: sortingProp,\n onSortingChange,\n loading = false,\n groupBy,\n renderGroupHeader,\n}: DataTableProps<TData>) {\n const [internalSorting, setInternalSorting] = React.useState<SortingState>(\n [],\n );\n const sorting = sortingProp ?? internalSorting;\n const setSorting: OnChangeFn<SortingState> = (updater) => {\n if (onSortingChange) onSortingChange(updater);\n if (!sortingProp) setInternalSorting(updater);\n };\n\n const [internalPagination, setInternalPagination] =\n React.useState<PaginationState>({\n pageIndex: 0,\n pageSize,\n });\n const pagination = paginationProp ?? internalPagination;\n const setPagination: OnChangeFn<PaginationState> = (updater) => {\n if (onPaginationChange) onPaginationChange(updater);\n if (!paginationProp) setInternalPagination(updater);\n };\n\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(\n [],\n );\n const [columnVisibility, setColumnVisibility] =\n React.useState<VisibilityState>({});\n const [columnPinning, setColumnPinning] = React.useState<ColumnPinningState>({\n left: [],\n right: [],\n });\n const [columnOrder, setColumnOrder] = React.useState<ColumnOrderState>(() =>\n columns.map((c, i) => (c as any).id ?? (c as any).accessorKey ?? String(i)),\n );\n\n const wrappedColumns = React.useMemo<ColumnDef<TData, any>[]>(() => {\n return columns.map((col) => {\n const meta = col.meta;\n if (meta?.editable && !col.cell) {\n return {\n ...col,\n cell: (ctx) => (\n <EditableCell\n ctx={ctx}\n editType={meta.editType}\n options={meta.options}\n align={meta.align}\n onCellEdit={onCellEdit}\n />\n ),\n };\n }\n return col;\n });\n }, [columns, onCellEdit]);\n\n const table = useReactTable({\n data,\n columns: wrappedColumns,\n state: {\n sorting,\n pagination,\n columnFilters,\n columnVisibility,\n columnPinning,\n columnOrder,\n },\n onSortingChange: setSorting,\n onPaginationChange: setPagination,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnPinningChange: setColumnPinning,\n onColumnOrderChange: setColumnOrder,\n enableSorting,\n enableColumnResizing,\n enableColumnPinning,\n manualPagination,\n manualSorting,\n pageCount: pageCount ?? -1,\n rowCount,\n columnResizeMode: \"onChange\",\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel:\n enableSorting && !manualSorting ? getSortedRowModel() : undefined,\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel:\n enablePagination && !manualPagination\n ? getPaginationRowModel()\n : undefined,\n });\n\n const sensors = useSensors(\n useSensor(MouseSensor, { activationConstraint: { distance: 4 } }),\n useSensor(TouchSensor, {\n activationConstraint: { delay: 200, tolerance: 8 },\n }),\n useSensor(KeyboardSensor),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n setColumnOrder((prev) => {\n const next = prev.length\n ? prev\n : table.getAllLeafColumns().map((c) => c.id);\n const oldIndex = next.indexOf(active.id as string);\n const newIndex = next.indexOf(over.id as string);\n if (oldIndex < 0 || newIndex < 0) return prev;\n return arrayMove(next, oldIndex, newIndex);\n });\n };\n\n const visibleLeafColumnIds = table.getVisibleLeafColumns().map((c) => c.id);\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <DataTableToolbar\n table={table}\n enableColumnVisibility={enableColumnVisibility}\n enableColumnPinning={enableColumnPinning}\n >\n {toolbar}\n </DataTableToolbar>\n\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToHorizontalAxis]}\n onDragEnd={handleDragEnd}\n >\n <div className=\"relative overflow-auto rounded-md border\">\n {loading && (\n <div className=\"pointer-events-none absolute inset-0 z-10 flex items-start justify-center bg-background/60 pt-12 text-muted-foreground\">\n Loading…\n </div>\n )}\n <Table\n style={{\n width: enableColumnResizing ? table.getTotalSize() : undefined,\n }}\n >\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n <SortableContext\n items={visibleLeafColumnIds}\n strategy={horizontalListSortingStrategy}\n >\n {headerGroup.headers.map((header) => (\n <DraggableHeader\n key={header.id}\n header={header}\n enableReordering={enableColumnReordering}\n enableResizing={enableColumnResizing}\n enableSorting={enableSorting}\n />\n ))}\n </SortableContext>\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={table.getAllLeafColumns().length}\n className=\"h-24 text-center text-muted-foreground\"\n >\n {emptyState ?? \"No results.\"}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row, rowIndex, allRows) => {\n const groupKey = groupBy?.(row.original);\n const previousKey =\n rowIndex > 0\n ? groupBy?.(allRows[rowIndex - 1].original)\n : undefined;\n const startsGroup =\n groupKey != null && groupKey !== previousKey;\n return (\n <React.Fragment key={row.id}>\n {startsGroup ? (\n <TableRow className=\"bg-muted/50 hover:bg-muted/50\">\n <TableCell\n colSpan={table.getAllLeafColumns().length}\n className=\"py-1 font-medium\"\n >\n {renderGroupHeader\n ? renderGroupHeader(\n groupKey,\n allRows\n .filter(\n (r) => groupBy?.(r.original) === groupKey,\n )\n .map((r) => r.original),\n )\n : groupKey}\n </TableCell>\n </TableRow>\n ) : null}\n <TableRow>\n {row.getVisibleCells().map((cell) => {\n const column = cell.column;\n const isPinned = column.getIsPinned();\n const align = column.columnDef.meta?.align ?? \"left\";\n return (\n <TableCell\n key={cell.id}\n style={{\n width: cell.column.getSize(),\n ...(isPinned\n ? {\n position: \"sticky\",\n left:\n isPinned === \"left\"\n ? column.getStart(\"left\")\n : undefined,\n right:\n isPinned === \"right\"\n ? column.getAfter(\"right\")\n : undefined,\n zIndex: 1,\n backgroundColor: \"hsl(var(--background))\",\n }\n : {}),\n }}\n className={cn(\n align === \"right\" && \"text-right\",\n align === \"center\" && \"text-center\",\n isPinned &&\n \"bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]\",\n column.columnDef.meta?.cellClassName,\n )}\n >\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </TableCell>\n );\n })}\n </TableRow>\n </React.Fragment>\n );\n })\n )}\n </TableBody>\n </Table>\n {footer != null && (\n <div className=\"sticky bottom-0 border-t bg-muted/40 px-3 py-2 text-muted-foreground\">\n {footer}\n </div>\n )}\n </div>\n </DndContext>\n\n {enablePagination && (\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n )}\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data-table-pagination.tsx","../src/data-table-toolbar.tsx","../src/editable-cell.tsx","../src/data-table.tsx"],"names":["jsxs","jsx","Button","React","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","cn"],"mappings":";;;;;;;;;;;;AAqBO,SAAS,mBAAA,CAA2B;AAAA,EACzC,KAAA;AAAA,EACA,eAAA,GAAkB,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG;AACpC,CAAA,EAAoC;AAClC,EAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAS,GAAI,KAAA,CAAM,UAAS,CAAE,UAAA;AACjD,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,QAAA;AACrC,EAAA,MAAM,KAAA,GACJ,OAAO,cAAA,KAAmB,QAAA,GACtB,iBACA,KAAA,CAAM,mBAAA,GAAsB,IAAA,CAAK,MAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,KAAA,KAAU,CAAA,GAAI,CAAA,GAAI,YAAY,QAAA,GAAW,CAAA;AACvD,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAA,CAAK,SAAA,GAAY,CAAA,IAAK,UAAU,KAAK,CAAA;AAEtD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA,KAAA,KAAU,CAAA,GAAI,SAAA,GAAY,CAAA,QAAA,EAAW,KAAK,CAAA,MAAA,EAAI,GAAG,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAChE,CAAA;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,wBACrD,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,OAAO,QAAQ,CAAA;AAAA,YACtB,eAAe,CAAC,CAAA,KAAM,MAAM,WAAA,CAAY,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,YAEjD,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,cAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,8BACA,GAAA,CAAC,aAAA,EAAA,EACE,QAAA,EAAA,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,qBACpB,GAAA,CAAC,UAAA,EAAA,EAAmB,KAAA,EAAO,OAAO,CAAC,CAAA,EAChC,QAAA,EAAA,CAAA,EAAA,EADc,CAEjB,CACD,CAAA,EACH;AAAA;AAAA;AAAA;AACF,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oCAAA,EAAqC,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QAC5C,SAAA,GAAY,CAAA;AAAA,QAAE,MAAA;AAAA,QAAK,KAAA,CAAM,cAAa,IAAK;AAAA,OAAA,EACnD,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,MAAM,KAAA,CAAM,YAAA,CAAa,CAAC,CAAA;AAAA,YACnC,QAAA,EAAU,CAAC,KAAA,CAAM,kBAAA,EAAmB;AAAA,YACpC,YAAA,EAAW,YAAA;AAAA,YAEX,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SACpC;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,MAAM,KAAA,CAAM,YAAA,EAAa;AAAA,YAClC,QAAA,EAAU,CAAC,KAAA,CAAM,kBAAA,EAAmB;AAAA,YACpC,YAAA,EAAW,eAAA;AAAA,YAEX,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SACnC;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,SAAA;AAAA,YACV,OAAA,EAAS,MAAM,KAAA,CAAM,QAAA,EAAS;AAAA,YAC9B,QAAA,EAAU,CAAC,KAAA,CAAM,cAAA,EAAe;AAAA,YAChC,YAAA,EAAW,WAAA;AAAA,YAEX,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA,SACpC;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,SAAA;AAAA,YACV,SAAS,MAAM,KAAA,CAAM,aAAa,KAAA,CAAM,YAAA,KAAiB,CAAC,CAAA;AAAA,YAC1D,QAAA,EAAU,CAAC,KAAA,CAAM,cAAA,EAAe;AAAA,YAChC,YAAA,EAAW,WAAA;AAAA,YAEX,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACrC,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACvFO,SAAS,gBAAA,CAAwB;AAAA,EACtC,KAAA;AAAA,EACA,sBAAA,GAAyB,IAAA;AAAA,EACzB,mBAAA,GAAsB,KAAA;AAAA,EACtB;AACF,CAAA,EAAiC;AAC/B,EAAA,MAAM,cAAA,GAAiB,MACpB,iBAAA,EAAkB,CAClB,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,EAAY,CAAA;AAE/B,EAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA2B,QAAA,EAAS,CAAA;AAAA,oBACnDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA,sBAAA,IAA0B,cAAA,CAAe,MAAA,GAAS,CAAA,oBACjDD,IAAAA,CAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,mBAAA,EAAA,EAAoB,OAAA,EAAO,IAAA,EAC1B,QAAA,kBAAAD,IAAAA,CAACE,MAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,WAAU,KAAA,EAC5C,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,QAAE;AAAA,OAAA,EAExC,CAAA,EACF,CAAA;AAAA,sBACAD,IAAAA,CAAC,mBAAA,EAAA,EAAoB,KAAA,EAAM,KAAA,EAAM,WAAU,MAAA,EACzC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,qBAAkB,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,wBACjCA,IAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,QACtB,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,qBACnBA,GAAAA;AAAA,UAAC,wBAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAU,YAAA;AAAA,YACV,OAAA,EAAS,IAAI,YAAA,EAAa;AAAA,YAC1B,iBAAiB,CAAC,CAAA,KAAM,IAAI,gBAAA,CAAiB,CAAC,CAAC,CAAC,CAAA;AAAA,YAChD,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,YAEjC,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,MAAA,IAAU,IAAI,EAAE;AAAA,WAAA;AAAA,UANjC,GAAA,CAAI;AAAA,SAQZ,CAAA;AAAA,QACA,mBAAA,oBACCD,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAC,IAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,0BACvBA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,UACzB,KAAA,CAAM,iBAAA,EAAkB,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ;AACtC,YAAA,IAAI,CAAC,GAAA,CAAI,SAAA,EAAU,EAAG,OAAO,IAAA;AAC7B,YAAA,MAAM,MAAA,GAAS,IAAI,WAAA,EAAY;AAC/B,YAAA,uBACED,IAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,SAAA,EAAU,6CAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA,MAAA,CAAO,IAAI,SAAA,CAAU,MAAA,IAAU,GAAA,CAAI,EAAE,CAAA,EACxC,CAAA;AAAA,kCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,oCAAAC,GAAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,QAAA;AAAA,wBACL,SAAS,MACP,GAAA,CAAI,IAAI,MAAA,KAAW,MAAA,GAAS,QAAQ,MAAM,CAAA;AAAA,wBAE5C,SAAA,EAAW,CAAA,8BAAA,EACT,MAAA,KAAW,MAAA,GACP,uCACA,4BACN,CAAA,CAAA;AAAA,wBACD,QAAA,EAAA;AAAA;AAAA,qBAED;AAAA,oCACAA,GAAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,QAAA;AAAA,wBACL,SAAS,MACP,GAAA,CAAI,IAAI,MAAA,KAAW,OAAA,GAAU,QAAQ,OAAO,CAAA;AAAA,wBAE9C,SAAA,EAAW,CAAA,8BAAA,EACT,MAAA,KAAW,OAAA,GACP,uCACA,4BACN,CAAA,CAAA;AAAA,wBACD,QAAA,EAAA;AAAA;AAAA;AAED,mBAAA,EACF;AAAA;AAAA,eAAA;AAAA,cAjCK,GAAA,CAAI;AAAA,aAkCX;AAAA,UAEJ,CAAC;AAAA,SAAA,EACH;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;ACxFO,SAAS,YAAA,CAAoB;AAAA,EAClC,GAAA;AAAA,EACA,QAAA,GAAW,MAAA;AAAA,EACX,OAAA;AAAA,EACA,KAAA,GAAQ,MAAA;AAAA,EACR;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,OAAA,GAAU,IAAI,QAAA,EAAS;AAC7B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUE,gBAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,gBAAkB,OAAO,CAAA;AAEzD,EAAMA,iBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS,QAAA,CAAS,OAAO,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAErB,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAAkB;AAChC,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,IAAI,SAAS,OAAA,EAAS;AACtB,IAAA,UAAA,GAAa;AAAA,MACX,QAAA,EAAU,IAAI,GAAA,CAAI,KAAA;AAAA,MAClB,QAAA,EAAU,IAAI,MAAA,CAAO,EAAA;AAAA,MACrB,KAAA,EAAO,IAAA;AAAA,MACP,GAAA,EAAK,IAAI,GAAA,CAAI;AAAA,KACd,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,aACJ,KAAA,KAAU,OAAA,GACN,wBAAA,GACA,KAAA,KAAU,WACR,4BAAA,GACA,yBAAA;AAER,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACEF,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,QAC9B,SAAA,EAAW,EAAA;AAAA,UACT,8HAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA,EAAM,eAAA;AAAA,QAEN,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,UAAA,EACb,QAAA,EAAA,OAAA,IAAW,QAAQ,OAAA,KAAY,EAAA,mBAC9BA,GAAAA,CAAC,UAAK,SAAA,EAAU,8BAAA,EAA+B,mBAAK,CAAA,GAEpD,MAAA,CAAO,OAAO,CAAA,EAElB;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,uBACED,IAAAA;AAAA,MAACI,MAAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAc,OAAA,IAAW,IAAA,GAAO,MAAA,GAAY,OAAO,OAAO,CAAA;AAAA,QAC1D,aAAA,EAAe,CAAC,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA;AAAA,QAC9B,IAAA,EAAI,IAAA;AAAA,QACJ,YAAA,EAAc,CAAC,IAAA,KAAS;AACtB,UAAA,IAAI,CAAC,IAAA,EAAM,UAAA,CAAW,KAAK,CAAA;AAAA,QAC7B,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAACI,eAAA,EAAc,SAAA,EAAU,OACvB,QAAA,kBAAAJ,GAAAA,CAACK,WAAAA,EAAA,EAAY,CAAA,EACf,CAAA;AAAA,0BACAL,IAACM,aAAAA,EAAA,EACE,mBAAS,GAAA,CAAI,CAAC,sBACbN,GAAAA,CAACO,YAAA,EAAyB,KAAA,EAAO,EAAE,KAAA,EAChC,QAAA,EAAA,CAAA,CAAE,SADY,CAAA,CAAE,KAEnB,CACD,CAAA,EACH;AAAA;AAAA;AAAA,KACF;AAAA,EAEJ;AAEA,EAAA,uBACEP,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,QAAA,KAAa,QAAA,GAAW,QAAA,GAAW,MAAA;AAAA,MACzC,YAAA,EAAc,OAAA,IAAW,IAAA,GAAO,EAAA,GAAK,OAAO,OAAO,CAAA;AAAA,MACnD,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,QAAA,MAAM,CAAA,GACJ,aAAa,QAAA,GAAW,MAAA,CAAO,EAAE,aAAA,CAAc,KAAK,CAAA,GAAI,CAAA,CAAE,aAAA,CAAc,KAAA;AAC1E,QAAA,MAAA,CAAO,CAAC,CAAA;AAAA,MACV,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAC,CAAA,CAAE,cAAmC,IAAA,EAAK;AAAA,QAC7C,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,EAAA,CAAG,KAAA,EAAO,UAAU;AAAA;AAAA,GACjC;AAEJ;ACEA,SAAS,mBACP,MAAA,EACqB;AACrB,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,QAAA;AAAA,IACV,MAAM,QAAA,KAAa,MAAA,GAAS,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA;AAAA,IAC7D,OAAO,QAAA,KAAa,OAAA,GAAU,OAAO,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,GAAI,MAAA;AAAA,IAChE,MAAA,EAAQ;AAAA,GACV;AACF;AASA,SAAS,eAAA,CAAuB;AAAA,EAC9B,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAgC;AAC9B,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,MAAM,QAAA,GAAW,OAAO,WAAA,EAAY;AACpC,EAAA,MAAM,OAAA,GAAU,gBAAA,IAAoB,CAAC,QAAA,IAAY,OAAO,EAAA,KAAO,UAAA;AAC/D,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,YAAY,EAAE,EAAA,EAAI,OAAO,EAAA,EAAI,QAAA,EAAU,CAAC,OAAA,EAAS,CAAA;AAErD,EAAA,MAAM,OAAA,GAAU,OAAO,WAAA,EAAY;AACnC,EAAA,MAAM,OAAA,GAAU,aAAA,IAAiB,MAAA,CAAO,UAAA,EAAW;AACnD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,CAAU,IAAA,EAAM,KAAA,IAAS,MAAA;AAC9C,EAAA,MAAM,aACJ,KAAA,KAAU,OAAA,GACN,wBAAA,GACA,KAAA,KAAU,WACR,4BAAA,GACA,yBAAA;AAER,EAAA,uBACED,IAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,UAAA;AAAA,MACL,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,OAAO,OAAA,EAAQ;AAAA,QACtB,SAAA,EAAW,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA;AAAA,QAC3C,UAAA;AAAA,QACA,OAAA,EAAS,aAAa,GAAA,GAAM,CAAA;AAAA,QAC5B,GAAG,mBAAmB,MAAM,CAAA;AAAA,QAC5B,GAAI,QAAA,GAAW,EAAE,eAAA,EAAiB,wBAAA,KAA6B;AAAC,OAClE;AAAA,MACA,SAAA,EAAWS,EAAAA;AAAA,QACT,wCAAA;AAAA,QACA,QAAA,IACE,4DAAA;AAAA,QACF,MAAA,CAAO,UAAU,IAAA,EAAM;AAAA,OACzB;AAAA,MACC,GAAG,UAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAT,KAAC,KAAA,EAAA,EAAI,SAAA,EAAWS,EAAAA,CAAG,yBAAA,EAA2B,UAAU,CAAA,EACrD,QAAA,EAAA;AAAA,UAAA,OAAA,oBACCR,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,+GAAA;AAAA,cACT,GAAG,SAAA;AAAA,cACJ,YAAA,EAAW,aAAA;AAAA,cAEX,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA,WACxC;AAAA,UAED,0BACCD,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,OAAO,uBAAA,EAAwB;AAAA,cACxC,SAAA,EAAU,kEAAA;AAAA,cAET,QAAA,EAAA;AAAA,gBAAA,UAAA,CAAW,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,YAAY,CAAA;AAAA,gBACvD,OAAA,KAAY,wBACXC,GAAAA,CAAC,WAAQ,SAAA,EAAU,aAAA,EAAc,IAC/B,OAAA,KAAY,MAAA,mBACdA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAU,aAAA,EAAc,CAAA,mBAEnCA,GAAAA,CAAC,cAAA,EAAA,EAAe,WAAU,wBAAA,EAAyB;AAAA;AAAA;AAAA,WAEvD,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EACb,QAAA,EAAA,UAAA,CAAW,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,UAAA,EAAY,CAAA,EAC1D;AAAA,SAAA,EAEJ,CAAA;AAAA,QACC,cAAA,IAAkB,MAAA,CAAO,YAAA,EAAa,oBACrCA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,WAAA,EAAa,OAAO,gBAAA,EAAiB;AAAA,YACrC,YAAA,EAAc,OAAO,gBAAA,EAAiB;AAAA,YACtC,SAAA,EAAWQ,EAAAA;AAAA,cACT,2GAAA;AAAA,cACA,MAAA,CAAO,eAAc,IAAK;AAAA,aAC5B;AAAA,YACA,YAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA,GAEJ;AAEJ;AAEO,SAAS,SAAA,CAAiC;AAAA,EAC/C,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,EAAA;AAAA,EACX,eAAA;AAAA,EACA,aAAA,GAAgB,IAAA;AAAA,EAChB,gBAAA,GAAmB,IAAA;AAAA,EACnB,sBAAA,GAAyB,IAAA;AAAA,EACzB,sBAAA,GAAyB,KAAA;AAAA,EACzB,oBAAA,GAAuB,KAAA;AAAA,EACvB,mBAAA,GAAsB,KAAA;AAAA,EACtB,UAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,EAAY,cAAA;AAAA,EACZ,kBAAA;AAAA,EACA,OAAA,EAAS,WAAA;AAAA,EACT,eAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,OAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAA,GAAU,SAAA;AAAA,EACV,SAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAU,MAAA,CAAA,QAAA;AAAA,IAClD;AAAC,GACH;AACA,EAAA,MAAM,UAAU,WAAA,IAAe,eAAA;AAC/B,EAAA,MAAM,UAAA,GAAuC,CAAC,OAAA,KAAY;AACxD,IAAA,IAAI,eAAA,kBAAiC,OAAO,CAAA;AAC5C,IAAA,IAAI,CAAC,WAAA,EAAa,kBAAA,CAAmB,OAAO,CAAA;AAAA,EAC9C,CAAA;AAEA,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GACxC,MAAA,CAAA,QAAA,CAA0B;AAAA,IAC9B,SAAA,EAAW,CAAA;AAAA,IACX;AAAA,GACD,CAAA;AACH,EAAA,MAAM,aAAa,cAAA,IAAkB,kBAAA;AACrC,EAAA,MAAM,aAAA,GAA6C,CAAC,OAAA,KAAY;AAC9D,IAAA,IAAI,kBAAA,qBAAuC,OAAO,CAAA;AAClD,IAAA,IAAI,CAAC,cAAA,EAAgB,qBAAA,CAAsB,OAAO,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,MAAA,CAAA,QAAA;AAAA,IAC9C;AAAC,GACH;AACA,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GACpC,MAAA,CAAA,QAAA,CAA0B,EAAE,CAAA;AACpC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAU,MAAA,CAAA,QAAA,CAA6B;AAAA,IAC3E,MAAM,EAAC;AAAA,IACP,OAAO;AAAC,GACT,CAAA;AACD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAU,MAAA,CAAA,QAAA;AAAA,IAA2B,MACrE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAU,EAAA,IAAO,CAAA,CAAU,WAAA,IAAe,MAAA,CAAO,CAAC,CAAC;AAAA,GAC5E;AAEA,EAAA,MAAM,cAAA,GAAuB,eAAiC,MAAM;AAClE,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC1B,MAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,MAAA,IAAI,IAAA,EAAM,QAAA,IAAY,CAAC,GAAA,CAAI,IAAA,EAAM;AAC/B,QAAA,OAAO;AAAA,UACL,GAAG,GAAA;AAAA,UACH,IAAA,EAAM,CAAC,GAAA,qBACLR,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,GAAA;AAAA,cACA,UAAU,IAAA,CAAK,QAAA;AAAA,cACf,SAAS,IAAA,CAAK,OAAA;AAAA,cACd,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ;AAAA;AAAA;AACF,SAEJ;AAAA,MACF;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,IAC1B,IAAA;AAAA,IACA,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO;AAAA,MACL,OAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,eAAA,EAAiB,UAAA;AAAA,IACjB,kBAAA,EAAoB,aAAA;AAAA,IACpB,qBAAA,EAAuB,gBAAA;AAAA,IACvB,wBAAA,EAA0B,mBAAA;AAAA,IAC1B,qBAAA,EAAuB,gBAAA;AAAA,IACvB,mBAAA,EAAqB,cAAA;AAAA,IACrB,aAAA;AAAA,IACA,oBAAA;AAAA,IACA,mBAAA;AAAA,IACA,gBAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAW,SAAA,IAAa,EAAA;AAAA,IACxB,QAAA;AAAA,IACA,gBAAA,EAAkB,UAAA;AAAA,IAClB,iBAAiB,eAAA,EAAgB;AAAA,IACjC,iBAAA,EACE,aAAA,IAAiB,CAAC,aAAA,GAAgB,mBAAkB,GAAI,MAAA;AAAA,IAC1D,qBAAqB,mBAAA,EAAoB;AAAA,IACzC,qBAAA,EACE,gBAAA,IAAoB,CAAC,gBAAA,GACjB,uBAAsB,GACtB;AAAA,GACP,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACd,SAAA,CAAU,aAAa,EAAE,oBAAA,EAAsB,EAAE,QAAA,EAAU,CAAA,IAAK,CAAA;AAAA,IAChE,UAAU,WAAA,EAAa;AAAA,MACrB,oBAAA,EAAsB,EAAE,KAAA,EAAO,GAAA,EAAK,WAAW,CAAA;AAAE,KAClD,CAAA;AAAA,IACD,UAAU,cAAc;AAAA,GAC1B;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAwB;AAC7C,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,KAAA;AACzB,IAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,CAAO,EAAA,KAAO,KAAK,EAAA,EAAI;AACpC,IAAA,cAAA,CAAe,CAAC,IAAA,KAAS;AACvB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,GACd,IAAA,GACA,KAAA,CAAM,iBAAA,EAAkB,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,EAAY,CAAA;AACjD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,EAAY,CAAA;AAC/C,MAAA,IAAI,QAAA,GAAW,CAAA,IAAK,QAAA,GAAW,CAAA,EAAG,OAAO,IAAA;AACzC,MAAA,OAAO,SAAA,CAAU,IAAA,EAAM,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC3C,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAE1E,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAWS,EAAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA,EACjD,QAAA,EAAA;AAAA,oBAAAR,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,KAAA;AAAA,QACA,sBAAA;AAAA,QACA,mBAAA;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,oBAEAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,kBAAA,EAAoB,aAAA;AAAA,QACpB,SAAA,EAAW,CAAC,wBAAwB,CAAA;AAAA,QACpC,SAAA,EAAW,aAAA;AAAA,QAEX,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,oBACCC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0HAAyH,QAAA,EAAA,eAAA,EAExI,CAAA;AAAA,0BAEFD,IAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,KAAA,EAAO;AAAA,gBACL,KAAA,EAAO,oBAAA,GAAuB,KAAA,CAAM,YAAA,EAAa,GAAI;AAAA,eACvD;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAC,GAAAA,CAAC,WAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,WAAA,qBAC5BA,GAAAA,CAAC,QAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,kBAAC,eAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAO,oBAAA;AAAA,oBACP,QAAA,EAAU,6BAAA;AAAA,oBAET,QAAA,EAAA,WAAA,CAAY,OAAA,CAAQ,GAAA,CAAI,CAAC,2BACxBA,GAAAA;AAAA,sBAAC,eAAA;AAAA,sBAAA;AAAA,wBAEC,MAAA;AAAA,wBACA,gBAAA,EAAkB,sBAAA;AAAA,wBAClB,cAAA,EAAgB,oBAAA;AAAA,wBAChB;AAAA,uBAAA;AAAA,sBAJK,MAAA,CAAO;AAAA,qBAMf;AAAA;AAAA,iBACH,EAAA,EAda,WAAA,CAAY,EAe3B,CACD,CAAA,EACH,CAAA;AAAA,gCACAA,GAAAA,CAAC,SAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,CAAK,MAAA,KAAW,CAAA,mBACnCA,GAAAA,CAAC,QAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA;AAAA,kBAAC,SAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,KAAA,CAAM,iBAAA,EAAkB,CAAE,MAAA;AAAA,oBACnC,SAAA,EAAU,wCAAA;AAAA,oBAET,QAAA,EAAA,UAAA,IAAc;AAAA;AAAA,iBACjB,EACF,CAAA,GAEA,KAAA,CAAM,WAAA,EAAY,CAAE,KAAK,GAAA,CAAI,CAAC,GAAA,EAAK,QAAA,EAAU,OAAA,KAAY;AACvD,kBAAA,MAAM,QAAA,GAAW,OAAA,GAAU,GAAA,CAAI,QAAQ,CAAA;AACvC,kBAAA,MAAM,WAAA,GACJ,WAAW,CAAA,GACP,OAAA,GAAU,QAAQ,QAAA,GAAW,CAAC,CAAA,CAAE,QAAQ,CAAA,GACxC,MAAA;AACN,kBAAA,MAAM,WAAA,GACJ,QAAA,IAAY,IAAA,IAAQ,QAAA,KAAa,WAAA;AACnC,kBAAA,uBACED,IAAAA,CAAO,MAAA,CAAA,QAAA,EAAN,EACE,QAAA,EAAA;AAAA,oBAAA,WAAA,mBACCC,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,iCAClB,QAAA,kBAAAA,GAAAA;AAAA,sBAAC,SAAA;AAAA,sBAAA;AAAA,wBACC,OAAA,EAAS,KAAA,CAAM,iBAAA,EAAkB,CAAE,MAAA;AAAA,wBACnC,SAAA,EAAU,kBAAA;AAAA,wBAET,QAAA,EAAA,iBAAA,GACG,iBAAA;AAAA,0BACE,QAAA;AAAA,0BACA,OAAA,CACG,MAAA;AAAA,4BACC,CAAC,CAAA,KAAM,OAAA,GAAU,CAAA,CAAE,QAAQ,CAAA,KAAM;AAAA,2BACnC,CACC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAQ;AAAA,yBAC1B,GACA;AAAA;AAAA,uBAER,CAAA,GACE,IAAA;AAAA,oCACJA,GAAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,eAAA,EACE,aAAA,GAAgB,GAAA,CAAI,QAAQ,CAAA,IAAK,MAAA;AAAA,wBAEnC,eAAA,EACE,aAAA,GAAgB,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AAAA,wBAEhD,QAAA,EAAU,aAAa,CAAA,GAAI,MAAA;AAAA,wBAC3B,SACE,UAAA,GACI,MAAM,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,GAC7B,MAAA;AAAA,wBAEN,SAAA,EACE,UAAA,GACI,CAAC,KAAA,KAAU;AACT,0BAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,GAAA;AACzC,4BAAA;AACF,0BAAA,KAAA,CAAM,cAAA,EAAe;AACrB,0BAAA,UAAA,CAAW,IAAI,QAAQ,CAAA;AAAA,wBACzB,CAAA,GACA,MAAA;AAAA,wBAEN,SAAA,EAAWQ,EAAAA;AAAA,0BACT,aAAA,GAAgB,GAAA,CAAI,QAAQ,CAAA,IAC1B,uEAAA;AAAA,0BACF,UAAA,IACE;AAAA,yBACJ;AAAA,wBAEC,cAAI,eAAA,EAAgB,CAAE,GAAA,CAAI,CAAC,MAAM,SAAA,KAAc;AAC9C,0BAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,0BAAA,MAAM,QAAA,GAAW,OAAO,WAAA,EAAY;AACpC,0BAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,CAAU,IAAA,EAAM,KAAA,IAAS,MAAA;AAC9C,0BAAA,MAAM,SACJ,SAAA,KAAc,CAAA,GAAI,SAAA,GAAY,GAAA,CAAI,QAAQ,CAAA,GAAI,MAAA;AAChD,0BAAA,uBACER,GAAAA;AAAA,4BAAC,SAAA;AAAA,4BAAA;AAAA,8BAEC,KAAA,EAAO;AAAA,gCACL,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,OAAA,EAAQ;AAAA,gCAC3B,GAAI,MAAA,GACA,EAAE,WAAA,EAAa,CAAA,EAAG,SAAS,EAAA,GAAK,CAAC,CAAA,EAAA,CAAA,EAAK,GACtC,EAAC;AAAA,gCACL,GAAI,QAAA,GACA;AAAA,kCACE,QAAA,EAAU,QAAA;AAAA,kCACV,MACE,QAAA,KAAa,MAAA,GACT,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GACtB,MAAA;AAAA,kCACN,OACE,QAAA,KAAa,OAAA,GACT,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,GACvB,MAAA;AAAA,kCACN,MAAA,EAAQ,CAAA;AAAA,kCACR,eAAA,EAAiB;AAAA,oCAEnB;AAAC,+BACP;AAAA,8BACA,SAAA,EAAWQ,EAAAA;AAAA,gCACT,UAAU,OAAA,IAAW,YAAA;AAAA,gCACrB,UAAU,QAAA,IAAY,aAAA;AAAA,gCACtB,QAAA,IACE,4DAAA;AAAA,gCACF,MAAA,CAAO,SAAA,CAAU,IAAA,EAAM,IAAA,IAAQ,WAAA;AAAA,gCAC/B,MAAA,CAAO,UAAU,IAAA,EAAM;AAAA,+BACzB;AAAA,8BAEC,QAAA,EAAA,UAAA;AAAA,gCACC,IAAA,CAAK,OAAO,SAAA,CAAU,IAAA;AAAA,gCACtB,KAAK,UAAA;AAAW;AAClB,6BAAA;AAAA,4BAlCK,IAAA,CAAK;AAAA,2BAmCZ;AAAA,wBAEJ,CAAC;AAAA;AAAA;AACH,mBAAA,EAAA,EAhGmB,IAAI,EAiGzB,CAAA;AAAA,gBAEJ,CAAC,CAAA,EAEL;AAAA;AAAA;AAAA,WACF;AAAA,UACC,UAAU,IAAA,oBACTR,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wEACZ,QAAA,EAAA,MAAA,EACH;AAAA,SAAA,EAEJ;AAAA;AAAA,KACF;AAAA,IAEC,gBAAA,oBACCA,GAAAA,CAAC,mBAAA,EAAA,EAAoB,OAAc,eAAA,EAAkC;AAAA,GAAA,EAEzE,CAAA;AAEJ","file":"index.js","sourcesContent":["import { Button } from '@invana/ui';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@invana/forms';\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\n\nexport interface DataTablePaginationProps<TData> {\n table: Table<TData>;\n pageSizeOptions?: number[];\n}\n\nexport function DataTablePagination<TData>({\n table,\n pageSizeOptions = [10, 20, 50, 100],\n}: DataTablePaginationProps<TData>) {\n const { pageIndex, pageSize } = table.getState().pagination;\n const serverRowCount = table.options.rowCount;\n const total =\n typeof serverRowCount === 'number'\n ? serverRowCount\n : table.getFilteredRowModel().rows.length;\n const start = total === 0 ? 0 : pageIndex * pageSize + 1;\n const end = Math.min((pageIndex + 1) * pageSize, total);\n\n return (\n <div className=\"flex items-center justify-between gap-4 px-2 py-2\">\n <div className=\"text-muted-foreground\">\n {total === 0 ? 'No rows' : `Showing ${start}–${end} of ${total}`}\n </div>\n <div className=\"flex items-center gap-4\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Rows per page</span>\n <Select\n value={String(pageSize)}\n onValueChange={(v) => table.setPageSize(Number(v))}\n >\n <SelectTrigger className=\"h-8 w-[72px]\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {s}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"text-muted-foreground tabular-nums\">\n Page {pageIndex + 1} of {table.getPageCount() || 1}\n </div>\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"First page\"\n >\n <ChevronsLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"Previous page\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label=\"Next page\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n aria-label=\"Last page\"\n >\n <ChevronsRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import {\n Button,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@invana/ui';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\n\nexport interface DataTableToolbarProps<TData> {\n table: Table<TData>;\n enableColumnVisibility?: boolean;\n enableColumnPinning?: boolean;\n children?: React.ReactNode;\n}\n\nexport function DataTableToolbar<TData>({\n table,\n enableColumnVisibility = true,\n enableColumnPinning = false,\n children,\n}: DataTableToolbarProps<TData>) {\n const toggleableCols = table\n .getAllLeafColumns()\n .filter((c) => c.getCanHide());\n\n return (\n <div className=\"flex items-center justify-between gap-2 px-2 py-2\">\n <div className=\"flex items-center gap-2\">{children}</div>\n <div className=\"flex items-center gap-2\">\n {enableColumnVisibility && toggleableCols.length > 0 && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8\">\n <Settings2 className=\"mr-2 h-4 w-4\" />\n Columns\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {toggleableCols.map((col) => (\n <DropdownMenuCheckboxItem\n key={col.id}\n className=\"capitalize\"\n checked={col.getIsVisible()}\n onCheckedChange={(v) => col.toggleVisibility(!!v)}\n onSelect={(e) => e.preventDefault()}\n >\n {String(col.columnDef.header ?? col.id)}\n </DropdownMenuCheckboxItem>\n ))}\n {enableColumnPinning && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel>Pinning</DropdownMenuLabel>\n {table.getAllLeafColumns().map((col) => {\n if (!col.getCanPin()) return null;\n const pinned = col.getIsPinned();\n return (\n <div\n key={col.id}\n className=\"flex items-center justify-between px-2 py-1\"\n >\n <span className=\"capitalize truncate\">\n {String(col.columnDef.header ?? col.id)}\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() =>\n col.pin(pinned === 'left' ? false : 'left')\n }\n className={`rounded px-1.5 py-0.5 text-sm ${\n pinned === 'left'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted hover:bg-muted/70'\n }`}\n >\n L\n </button>\n <button\n type=\"button\"\n onClick={() =>\n col.pin(pinned === 'right' ? false : 'right')\n }\n className={`rounded px-1.5 py-0.5 text-sm ${\n pinned === 'right'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted hover:bg-muted/70'\n }`}\n >\n R\n </button>\n </div>\n </div>\n );\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n );\n}\n","import * as React from 'react';\nimport { cn } from '@invana/ui';\nimport {\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@invana/forms';\nimport type { CellContext } from '@tanstack/react-table';\nimport type { CellEditHandler, EditOption, EditType } from './types';\n\nexport interface EditableCellProps<TData> {\n ctx: CellContext<TData, unknown>;\n editType?: EditType;\n options?: EditOption[];\n align?: 'left' | 'center' | 'right';\n onCellEdit?: CellEditHandler<TData>;\n}\n\nexport function EditableCell<TData>({\n ctx,\n editType = 'text',\n options,\n align = 'left',\n onCellEdit,\n}: EditableCellProps<TData>) {\n const initial = ctx.getValue();\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState<unknown>(initial);\n\n React.useEffect(() => {\n if (!editing) setDraft(initial);\n }, [initial, editing]);\n\n const commit = (next: unknown) => {\n setEditing(false);\n if (next === initial) return;\n onCellEdit?.({\n rowIndex: ctx.row.index,\n columnId: ctx.column.id,\n value: next,\n row: ctx.row.original,\n });\n };\n\n const alignClass =\n align === 'right'\n ? 'text-right justify-end'\n : align === 'center'\n ? 'text-center justify-center'\n : 'text-left justify-start';\n\n if (!editing) {\n return (\n <button\n type=\"button\"\n onClick={() => setEditing(true)}\n className={cn(\n 'group flex w-full items-center rounded-control px-1.5 py-1 hover:bg-muted/60 focus:outline-none focus:ring-2 focus:ring-ring',\n alignClass,\n )}\n title=\"Click to edit\"\n >\n <span className=\"truncate\">\n {initial == null || initial === '' ? (\n <span className=\"text-muted-foreground italic\">empty</span>\n ) : (\n String(initial)\n )}\n </span>\n </button>\n );\n }\n\n if (editType === 'select') {\n return (\n <Select\n defaultValue={initial == null ? undefined : String(initial)}\n onValueChange={(v) => commit(v)}\n open\n onOpenChange={(open) => {\n if (!open) setEditing(false);\n }}\n >\n <SelectTrigger className=\"h-8\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {options?.map((o) => (\n <SelectItem key={o.value} value={o.value}>\n {o.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n }\n\n return (\n <Input\n autoFocus\n type={editType === 'number' ? 'number' : 'text'}\n defaultValue={initial == null ? '' : String(initial)}\n onBlur={(e) => {\n const v =\n editType === 'number' ? Number(e.currentTarget.value) : e.currentTarget.value;\n commit(v);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.currentTarget as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setEditing(false);\n }\n }}\n className={cn('h-8', alignClass)}\n />\n );\n}\n","import * as React from \"react\";\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type ColumnOrderState,\n type ColumnPinningState,\n type Header,\n type OnChangeFn,\n type PaginationState,\n type RowData,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n DndContext,\n KeyboardSensor,\n MouseSensor,\n TouchSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from \"@dnd-kit/core\";\nimport { restrictToHorizontalAxis } from \"@dnd-kit/modifiers\";\nimport {\n SortableContext,\n arrayMove,\n horizontalListSortingStrategy,\n useSortable,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n cn,\n} from \"@invana/ui\";\nimport { ArrowDown, ArrowUp, ChevronsUpDown, GripVertical } from \"lucide-react\";\nimport { DataTablePagination } from \"./data-table-pagination\";\nimport { DataTableToolbar } from \"./data-table-toolbar\";\nimport { EditableCell } from \"./editable-cell\";\nimport type { CellEditHandler } from \"./types\";\n\nexport interface DataTableProps<TData extends RowData> {\n columns: ColumnDef<TData, any>[];\n data: TData[];\n pageSize?: number;\n pageSizeOptions?: number[];\n enableSorting?: boolean;\n enablePagination?: boolean;\n enableColumnVisibility?: boolean;\n enableColumnReordering?: boolean;\n enableColumnResizing?: boolean;\n enableColumnPinning?: boolean;\n onCellEdit?: CellEditHandler<TData>;\n toolbar?: React.ReactNode;\n /** Content rendered as a sticky summary bar inside the table's bordered container, below the rows. */\n footer?: React.ReactNode;\n className?: string;\n emptyState?: React.ReactNode;\n /** Server-side mode: skip client pagination — `data` is already the current page. Requires `pageCount` (or `rowCount`). */\n manualPagination?: boolean;\n /** Server-side mode: skip client sorting — caller refetches when `sorting` changes. */\n manualSorting?: boolean;\n /** Total pages on server (for manualPagination). */\n pageCount?: number;\n /** Total rows on server (drives \"Showing X–Y of Z\" in manual mode). */\n rowCount?: number;\n /** Controlled pagination state. */\n pagination?: PaginationState;\n onPaginationChange?: OnChangeFn<PaginationState>;\n /** Controlled sorting state. */\n sorting?: SortingState;\n onSortingChange?: OnChangeFn<SortingState>;\n /** Show a loading overlay over the table body. */\n loading?: boolean;\n /**\n * Presentational row grouping — returns the group a row belongs to, or\n * `null` for none. A full-width header row is emitted whenever the key\n * changes from the previous row.\n *\n * Deliberately *not* TanStack's aggregating grouping model. This is for a\n * list that already arrives in the right order and wants section headings in\n * it — a story index, a queue split into questions/proposals/results. It\n * sorts nothing and aggregates nothing, so it cannot disagree with the order\n * the caller chose.\n */\n groupBy?: (row: TData) => string | null | undefined;\n /** What a group header row contains. Defaults to the key. */\n renderGroupHeader?: (key: string, rows: TData[]) => React.ReactNode;\n /**\n * `compact` is the dense reading — 26px rows at `text-sm`, which is what a\n * journal, a trace or a step's output table is drawn at. The primitive\n * `Table` has carried it all along; this is the table that passes it on.\n */\n density?: \"default\" | \"compact\";\n /**\n * How deep this row sits under another — a child run under the run that\n * spawned it. Indents the **first** cell only, so the shape of the list is\n * carried by the column a reader is scanning and not by the whole row.\n *\n * Presentational, like `groupBy`: it nests nothing and sorts nothing, because\n * the caller already has the rows in the order it wants them.\n */\n rowIndent?: (row: TData) => number | undefined;\n /**\n * Which row is the one being read elsewhere — the run open in the panel, the\n * step open on its page. Drawn as an accent ground with a rule down its\n * leading edge, so it is still findable after a scroll.\n */\n isRowSelected?: (row: TData) => boolean;\n /** Makes rows activate — click, `Enter` or `Space`. */\n onRowClick?: (row: TData) => void;\n}\n\nfunction getCommonPinStyles<TData>(\n header: Header<TData, unknown>,\n): React.CSSProperties {\n const isPinned = header.column.getIsPinned();\n if (!isPinned) return {};\n return {\n position: \"sticky\",\n left: isPinned === \"left\" ? header.column.getStart(\"left\") : undefined,\n right: isPinned === \"right\" ? header.column.getAfter(\"right\") : undefined,\n zIndex: 2,\n };\n}\n\ninterface DraggableHeaderProps<TData> {\n header: Header<TData, unknown>;\n enableReordering: boolean;\n enableResizing: boolean;\n enableSorting: boolean;\n}\n\nfunction DraggableHeader<TData>({\n header,\n enableReordering,\n enableResizing,\n enableSorting,\n}: DraggableHeaderProps<TData>) {\n const column = header.column;\n const isPinned = column.getIsPinned();\n const canDrag = enableReordering && !isPinned && column.id !== \"__select\";\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: column.id, disabled: !canDrag });\n\n const sortDir = column.getIsSorted();\n const canSort = enableSorting && column.getCanSort();\n const align = column.columnDef.meta?.align ?? \"left\";\n const alignClass =\n align === \"right\"\n ? \"justify-end text-right\"\n : align === \"center\"\n ? \"justify-center text-center\"\n : \"justify-start text-left\";\n\n return (\n <TableHead\n ref={setNodeRef}\n colSpan={header.colSpan}\n style={{\n width: header.getSize(),\n transform: CSS.Translate.toString(transform),\n transition,\n opacity: isDragging ? 0.6 : 1,\n ...getCommonPinStyles(header),\n ...(isPinned ? { backgroundColor: \"hsl(var(--background))\" } : {}),\n }}\n className={cn(\n \"group relative select-none bg-muted/40\",\n isPinned &&\n \"bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]\",\n column.columnDef.meta?.headerClassName,\n )}\n {...attributes}\n >\n <div className={cn(\"flex items-center gap-1\", alignClass)}>\n {canDrag && (\n <button\n type=\"button\"\n className=\"cursor-grab text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 active:cursor-grabbing\"\n {...listeners}\n aria-label=\"Drag column\"\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </button>\n )}\n {canSort ? (\n <button\n type=\"button\"\n onClick={column.getToggleSortingHandler()}\n className=\"inline-flex items-center gap-1 font-medium hover:text-foreground\"\n >\n {flexRender(column.columnDef.header, header.getContext())}\n {sortDir === \"asc\" ? (\n <ArrowUp className=\"h-3.5 w-3.5\" />\n ) : sortDir === \"desc\" ? (\n <ArrowDown className=\"h-3.5 w-3.5\" />\n ) : (\n <ChevronsUpDown className=\"h-3.5 w-3.5 opacity-50\" />\n )}\n </button>\n ) : (\n <span className=\"font-medium\">\n {flexRender(column.columnDef.header, header.getContext())}\n </span>\n )}\n </div>\n {enableResizing && column.getCanResize() && (\n <button\n type=\"button\"\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n className={cn(\n \"absolute right-0 top-0 h-full w-1 cursor-col-resize select-none touch-none bg-transparent hover:bg-border\",\n column.getIsResizing() && \"bg-primary\",\n )}\n aria-label=\"Resize column\"\n />\n )}\n </TableHead>\n );\n}\n\nexport function DataTable<TData extends RowData>({\n columns,\n data,\n pageSize = 10,\n pageSizeOptions,\n enableSorting = true,\n enablePagination = true,\n enableColumnVisibility = true,\n enableColumnReordering = false,\n enableColumnResizing = false,\n enableColumnPinning = false,\n onCellEdit,\n toolbar,\n footer,\n className,\n emptyState,\n manualPagination = false,\n manualSorting = false,\n pageCount,\n rowCount,\n pagination: paginationProp,\n onPaginationChange,\n sorting: sortingProp,\n onSortingChange,\n loading = false,\n groupBy,\n renderGroupHeader,\n density = \"default\",\n rowIndent,\n isRowSelected,\n onRowClick,\n}: DataTableProps<TData>) {\n const [internalSorting, setInternalSorting] = React.useState<SortingState>(\n [],\n );\n const sorting = sortingProp ?? internalSorting;\n const setSorting: OnChangeFn<SortingState> = (updater) => {\n if (onSortingChange) onSortingChange(updater);\n if (!sortingProp) setInternalSorting(updater);\n };\n\n const [internalPagination, setInternalPagination] =\n React.useState<PaginationState>({\n pageIndex: 0,\n pageSize,\n });\n const pagination = paginationProp ?? internalPagination;\n const setPagination: OnChangeFn<PaginationState> = (updater) => {\n if (onPaginationChange) onPaginationChange(updater);\n if (!paginationProp) setInternalPagination(updater);\n };\n\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(\n [],\n );\n const [columnVisibility, setColumnVisibility] =\n React.useState<VisibilityState>({});\n const [columnPinning, setColumnPinning] = React.useState<ColumnPinningState>({\n left: [],\n right: [],\n });\n const [columnOrder, setColumnOrder] = React.useState<ColumnOrderState>(() =>\n columns.map((c, i) => (c as any).id ?? (c as any).accessorKey ?? String(i)),\n );\n\n const wrappedColumns = React.useMemo<ColumnDef<TData, any>[]>(() => {\n return columns.map((col) => {\n const meta = col.meta;\n if (meta?.editable && !col.cell) {\n return {\n ...col,\n cell: (ctx) => (\n <EditableCell\n ctx={ctx}\n editType={meta.editType}\n options={meta.options}\n align={meta.align}\n onCellEdit={onCellEdit}\n />\n ),\n };\n }\n return col;\n });\n }, [columns, onCellEdit]);\n\n const table = useReactTable({\n data,\n columns: wrappedColumns,\n state: {\n sorting,\n pagination,\n columnFilters,\n columnVisibility,\n columnPinning,\n columnOrder,\n },\n onSortingChange: setSorting,\n onPaginationChange: setPagination,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnPinningChange: setColumnPinning,\n onColumnOrderChange: setColumnOrder,\n enableSorting,\n enableColumnResizing,\n enableColumnPinning,\n manualPagination,\n manualSorting,\n pageCount: pageCount ?? -1,\n rowCount,\n columnResizeMode: \"onChange\",\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel:\n enableSorting && !manualSorting ? getSortedRowModel() : undefined,\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel:\n enablePagination && !manualPagination\n ? getPaginationRowModel()\n : undefined,\n });\n\n const sensors = useSensors(\n useSensor(MouseSensor, { activationConstraint: { distance: 4 } }),\n useSensor(TouchSensor, {\n activationConstraint: { delay: 200, tolerance: 8 },\n }),\n useSensor(KeyboardSensor),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n setColumnOrder((prev) => {\n const next = prev.length\n ? prev\n : table.getAllLeafColumns().map((c) => c.id);\n const oldIndex = next.indexOf(active.id as string);\n const newIndex = next.indexOf(over.id as string);\n if (oldIndex < 0 || newIndex < 0) return prev;\n return arrayMove(next, oldIndex, newIndex);\n });\n };\n\n const visibleLeafColumnIds = table.getVisibleLeafColumns().map((c) => c.id);\n\n return (\n <div className={cn(\"flex flex-col gap-2\", className)}>\n <DataTableToolbar\n table={table}\n enableColumnVisibility={enableColumnVisibility}\n enableColumnPinning={enableColumnPinning}\n >\n {toolbar}\n </DataTableToolbar>\n\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToHorizontalAxis]}\n onDragEnd={handleDragEnd}\n >\n <div className=\"relative overflow-auto rounded-md border\">\n {loading && (\n <div className=\"pointer-events-none absolute inset-0 z-10 flex items-start justify-center bg-background/60 pt-12 text-muted-foreground\">\n Loading…\n </div>\n )}\n <Table\n density={density}\n style={{\n width: enableColumnResizing ? table.getTotalSize() : undefined,\n }}\n >\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n <SortableContext\n items={visibleLeafColumnIds}\n strategy={horizontalListSortingStrategy}\n >\n {headerGroup.headers.map((header) => (\n <DraggableHeader\n key={header.id}\n header={header}\n enableReordering={enableColumnReordering}\n enableResizing={enableColumnResizing}\n enableSorting={enableSorting}\n />\n ))}\n </SortableContext>\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={table.getAllLeafColumns().length}\n className=\"h-24 text-center text-muted-foreground\"\n >\n {emptyState ?? \"No results.\"}\n </TableCell>\n </TableRow>\n ) : (\n table.getRowModel().rows.map((row, rowIndex, allRows) => {\n const groupKey = groupBy?.(row.original);\n const previousKey =\n rowIndex > 0\n ? groupBy?.(allRows[rowIndex - 1].original)\n : undefined;\n const startsGroup =\n groupKey != null && groupKey !== previousKey;\n return (\n <React.Fragment key={row.id}>\n {startsGroup ? (\n <TableRow className=\"bg-muted/50 hover:bg-muted/50\">\n <TableCell\n colSpan={table.getAllLeafColumns().length}\n className=\"py-1 font-medium\"\n >\n {renderGroupHeader\n ? renderGroupHeader(\n groupKey,\n allRows\n .filter(\n (r) => groupBy?.(r.original) === groupKey,\n )\n .map((r) => r.original),\n )\n : groupKey}\n </TableCell>\n </TableRow>\n ) : null}\n <TableRow\n data-selected={\n isRowSelected?.(row.original) || undefined\n }\n aria-selected={\n isRowSelected ? isRowSelected(row.original) : undefined\n }\n tabIndex={onRowClick ? 0 : undefined}\n onClick={\n onRowClick\n ? () => onRowClick(row.original)\n : undefined\n }\n onKeyDown={\n onRowClick\n ? (event) => {\n if (event.key !== \"Enter\" && event.key !== \" \")\n return;\n event.preventDefault();\n onRowClick(row.original);\n }\n : undefined\n }\n className={cn(\n isRowSelected?.(row.original) &&\n \"bg-accent shadow-[inset_2px_0_0_var(--color-primary)] hover:bg-accent\",\n onRowClick &&\n \"cursor-pointer focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-ring\",\n )}\n >\n {row.getVisibleCells().map((cell, cellIndex) => {\n const column = cell.column;\n const isPinned = column.getIsPinned();\n const align = column.columnDef.meta?.align ?? \"left\";\n const indent =\n cellIndex === 0 ? rowIndent?.(row.original) : undefined;\n return (\n <TableCell\n key={cell.id}\n style={{\n width: cell.column.getSize(),\n ...(indent\n ? { paddingLeft: `${indent * 14 + 8}px` }\n : {}),\n ...(isPinned\n ? {\n position: \"sticky\",\n left:\n isPinned === \"left\"\n ? column.getStart(\"left\")\n : undefined,\n right:\n isPinned === \"right\"\n ? column.getAfter(\"right\")\n : undefined,\n zIndex: 1,\n backgroundColor: \"hsl(var(--background))\",\n }\n : {}),\n }}\n className={cn(\n align === \"right\" && \"text-right\",\n align === \"center\" && \"text-center\",\n isPinned &&\n \"bg-background shadow-[inset_-1px_0_0_0_hsl(var(--border))]\",\n column.columnDef.meta?.mono && \"font-mono\",\n column.columnDef.meta?.cellClassName,\n )}\n >\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </TableCell>\n );\n })}\n </TableRow>\n </React.Fragment>\n );\n })\n )}\n </TableBody>\n </Table>\n {footer != null && (\n <div className=\"sticky bottom-0 border-t bg-muted/40 px-3 py-2 text-muted-foreground\">\n {footer}\n </div>\n )}\n </div>\n </DndContext>\n\n {enablePagination && (\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n )}\n </div>\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@invana/tables",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.31",
|
|
4
4
|
"description": "Invana Design System - Data table components",
|
|
5
5
|
"homepage": "https://github.com/invana/design-kit#readme",
|
|
6
6
|
"type": "module",
|
|
@@ -40,9 +40,9 @@
|
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"react": "^18 || ^19",
|
|
42
42
|
"react-dom": "^18 || ^19",
|
|
43
|
-
"@invana/forms": "0.0.
|
|
44
|
-
"@invana/styling": "0.0.
|
|
45
|
-
"@invana/ui": "0.0.
|
|
43
|
+
"@invana/forms": "0.0.31",
|
|
44
|
+
"@invana/styling": "0.0.31",
|
|
45
|
+
"@invana/ui": "0.0.31"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
48
|
"@dnd-kit/core": "^6.3.1",
|
|
@@ -59,9 +59,9 @@
|
|
|
59
59
|
"react-dom": "^19.2.7",
|
|
60
60
|
"tsup": "^8.5.1",
|
|
61
61
|
"typescript": "~5.9.3",
|
|
62
|
-
"@invana/forms": "0.0.
|
|
63
|
-
"@invana/
|
|
64
|
-
"@invana/
|
|
62
|
+
"@invana/forms": "0.0.31",
|
|
63
|
+
"@invana/ui": "0.0.31",
|
|
64
|
+
"@invana/styling": "0.0.31"
|
|
65
65
|
},
|
|
66
66
|
"scripts": {
|
|
67
67
|
"build": "tsup",
|