@tetrascience-npm/tetrascience-react-ui 0.5.0-beta.28.1 → 0.5.0-beta.29.1
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/components/ui/data-table/data-table-column-toggle.cjs +2 -0
- package/dist/components/ui/data-table/data-table-column-toggle.cjs.map +1 -0
- package/dist/components/ui/data-table/data-table-column-toggle.js +142 -0
- package/dist/components/ui/data-table/data-table-column-toggle.js.map +1 -0
- package/dist/components/ui/data-table/data-table-pagination.cjs +2 -0
- package/dist/components/ui/data-table/data-table-pagination.cjs.map +1 -0
- package/dist/components/ui/data-table/data-table-pagination.js +88 -0
- package/dist/components/ui/data-table/data-table-pagination.js.map +1 -0
- package/dist/components/ui/data-table/data-table.cjs +2 -0
- package/dist/components/ui/data-table/data-table.cjs.map +1 -0
- package/dist/components/ui/data-table/data-table.js +293 -0
- package/dist/components/ui/data-table/data-table.js.map +1 -0
- package/dist/components/ui/table.cjs +1 -1
- package/dist/components/ui/table.cjs.map +1 -1
- package/dist/components/ui/table.js +68 -36
- package/dist/components/ui/table.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.ts +70 -4
- package/dist/index.js +234 -226
- package/dist/index.js.map +1 -1
- package/dist/index.tailwind.css +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("react/jsx-runtime"),u=require("@dnd-kit/core"),D=require("@dnd-kit/modifiers"),b=require("@dnd-kit/sortable"),O=require("@dnd-kit/utilities"),j=require("lucide-react"),k=require("react"),T=require("./data-table.cjs"),q=require("../button.cjs"),y=require("../../../lib/utils.cjs");function w(s){const i=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(s){for(const a in s)if(a!=="default"){const o=Object.getOwnPropertyDescriptor(s,a);Object.defineProperty(i,a,o.get?o:{enumerable:!0,get:()=>s[a]})}}return i.default=s,Object.freeze(i)}const C=w(k);function N({id:s,label:i,visible:a,onToggle:o}){const{attributes:p,listeners:g,setNodeRef:h,transform:l,transition:f,isDragging:c}=b.useSortable({id:s}),v={transform:O.CSS.Transform.toString(l),transition:f};return n.jsxs("div",{ref:h,style:v,role:"checkbox","aria-checked":a,tabIndex:0,onClick:o,onKeyDown:d=>{(d.key==="Enter"||d.key===" ")&&o()},className:y.cn("group/col-item flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm select-none hover:bg-accent hover:text-accent-foreground",c&&"z-50 bg-accent text-accent-foreground shadow-sm"),children:[n.jsx("button",{type:"button",className:y.cn("cursor-grab touch-none text-muted-foreground group-hover/col-item:text-accent-foreground active:cursor-grabbing",!c&&"opacity-0 group-hover/col-item:opacity-100 transition-opacity"),onClick:d=>d.stopPropagation(),...p,...g,children:n.jsx(j.GripVerticalIcon,{className:"size-3.5"})}),n.jsx("span",{className:"flex-1 truncate",children:i}),n.jsx(j.CheckIcon,{className:y.cn("size-4 shrink-0",a?"text-muted-foreground group-hover/col-item:text-accent-foreground":"text-transparent")})]})}function z({className:s}){const{table:i,columnLabels:a}=T.useDataTable(),[o,p]=C.useState(!1),g=C.useRef(null),h=u.useSensors(u.useSensor(u.PointerSensor),u.useSensor(u.KeyboardSensor,{coordinateGetter:b.sortableKeyboardCoordinates})),l=i.getAllColumns().filter(t=>t.getCanHide()),f=i.getState().columnOrder,c=f&&f.length>0?f.filter(t=>l.some(e=>e.id===t)):l.map(t=>t.id);if(C.useEffect(()=>{if(!o)return;function t(e){g.current&&!g.current.contains(e.target)&&p(!1)}return document.addEventListener("mousedown",t),()=>document.removeEventListener("mousedown",t)},[o]),l.length===0)return null;function v(t){const e=l.find(r=>r.id===t);return e?a[e.id]??e.columnDef.meta?.label??(typeof e.columnDef.header=="string"?e.columnDef.header:e.id):t}const d=t=>{const{active:e,over:r}=t;if(!r||e.id===r.id)return;const m=c.indexOf(String(e.id)),x=c.indexOf(String(r.id));if(m===-1||x===-1)return;const S=b.arrayMove(c,m,x);i.setColumnOrder(S)};return n.jsxs("div",{className:"relative",ref:g,children:[n.jsxs(q.Button,{variant:"ghost",size:"sm",className:s,"data-slot":"data-table-column-toggle",onClick:()=>p(t=>!t),"aria-expanded":o,children:[n.jsx(j.SlidersHorizontalIcon,{"data-icon":"inline-start"}),"Columns"]}),o&&n.jsx("div",{className:"absolute right-0 top-full z-50 mt-1 w-56 rounded-lg border bg-popover p-1 shadow-md",role:"group","aria-label":"Toggle and reorder columns",children:n.jsx(u.DndContext,{sensors:h,collisionDetection:u.closestCenter,modifiers:[D.restrictToVerticalAxis],onDragEnd:d,children:n.jsx(b.SortableContext,{items:c,strategy:b.verticalListSortingStrategy,children:(()=>{const t=c.filter(e=>l.find(r=>r.id===e)?.getIsVisible()).length;return c.map(e=>{const r=l.find(S=>S.id===e);if(!r)return null;const m=r.getIsVisible(),x=m&&t<=1;return n.jsx(N,{id:e,label:v(e),visible:m,onToggle:x?()=>{}:()=>r.toggleVisibility()},e)})})()})})})]})}exports.DataTableColumnToggle=z;
|
|
2
|
+
//# sourceMappingURL=data-table-column-toggle.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-column-toggle.cjs","sources":["../../../../src/components/ui/data-table/data-table-column-toggle.tsx"],"sourcesContent":["\"use client\"\n\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport { CheckIcon, GripVerticalIcon, SlidersHorizontalIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\ninterface DataTableColumnToggleProps {\n className?: string\n}\n\ninterface SortableColumnItemProps {\n id: string\n label: string\n visible: boolean\n onToggle: () => void\n}\n\nfunction SortableColumnItem({ id, label, visible, onToggle }: SortableColumnItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n role=\"checkbox\"\n aria-checked={visible}\n tabIndex={0}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n onToggle();\n }\n }}\n className={cn(\n \"group/col-item flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm select-none hover:bg-accent hover:text-accent-foreground\",\n isDragging && \"z-50 bg-accent text-accent-foreground shadow-sm\",\n )}\n >\n <button\n type=\"button\"\n className={cn(\n \"cursor-grab touch-none text-muted-foreground group-hover/col-item:text-accent-foreground active:cursor-grabbing\",\n !isDragging && \"opacity-0 group-hover/col-item:opacity-100 transition-opacity\",\n )}\n onClick={(e) => e.stopPropagation()}\n {...attributes}\n {...listeners}\n >\n <GripVerticalIcon className=\"size-3.5\" />\n </button>\n <span className=\"flex-1 truncate\">{label}</span>\n <CheckIcon className={cn(\"size-4 shrink-0\", visible ? \"text-muted-foreground group-hover/col-item:text-accent-foreground\" : \"text-transparent\")} />\n </div>\n )\n}\n\nfunction DataTableColumnToggle({ className }: DataTableColumnToggleProps) {\n const { table, columnLabels } = useDataTable()\n const [open, setOpen] = React.useState(false)\n const panelRef = React.useRef<HTMLDivElement>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const allColumns = table.getAllColumns().filter((col) => col.getCanHide())\n const stateOrder = table.getState().columnOrder\n const orderedIds =\n stateOrder && stateOrder.length > 0\n ? stateOrder.filter((id) => allColumns.some((c) => c.id === id))\n : allColumns.map((c) => c.id)\n\n // Close on outside click\n React.useEffect(() => {\n if (!open) return\n function handleClick(e: MouseEvent) {\n if (panelRef.current && !panelRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClick)\n return () => document.removeEventListener(\"mousedown\", handleClick)\n }, [open])\n\n if (allColumns.length === 0) return null\n\n function getLabel(colId: string) {\n const col = allColumns.find((c) => c.id === colId)\n if (!col) return colId\n return (\n columnLabels[col.id] ??\n (col.columnDef.meta as { label?: string } | undefined)?.label ??\n (typeof col.columnDef.header === \"string\" ? col.columnDef.header : col.id)\n )\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n\n const oldIndex = orderedIds.indexOf(String(active.id))\n const newIndex = orderedIds.indexOf(String(over.id))\n if (oldIndex === -1 || newIndex === -1) return\n\n const newOrder = arrayMove(orderedIds, oldIndex, newIndex)\n table.setColumnOrder(newOrder)\n }\n\n return (\n <div className=\"relative\" ref={panelRef}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={className}\n data-slot=\"data-table-column-toggle\"\n onClick={() => setOpen((prev) => !prev)}\n aria-expanded={open}\n >\n <SlidersHorizontalIcon data-icon=\"inline-start\" />\n Columns\n </Button>\n\n {open && (\n <div\n className=\"absolute right-0 top-full z-50 mt-1 w-56 rounded-lg border bg-popover p-1 shadow-md\"\n role=\"group\"\n aria-label=\"Toggle and reorder columns\"\n >\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToVerticalAxis]}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={orderedIds} strategy={verticalListSortingStrategy}>\n {(() => {\n const visibleCount = orderedIds.filter((colId) => allColumns.find((c) => c.id === colId)?.getIsVisible()).length\n return orderedIds.map((colId) => {\n const col = allColumns.find((c) => c.id === colId)\n if (!col) return null\n const isVisible = col.getIsVisible()\n const isLastVisible = isVisible && visibleCount <= 1\n return (\n <SortableColumnItem\n key={colId}\n id={colId}\n label={getLabel(colId)}\n visible={isVisible}\n onToggle={isLastVisible ? () => { } : () => col.toggleVisibility()}\n />\n )\n })\n })()}\n </SortableContext>\n </DndContext>\n </div>\n )}\n </div>\n )\n}\n\nexport { DataTableColumnToggle }\nexport type { DataTableColumnToggleProps }\n"],"names":["SortableColumnItem","id","label","visible","onToggle","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","style","CSS","jsxs","e","cn","jsx","GripVerticalIcon","CheckIcon","DataTableColumnToggle","className","table","columnLabels","useDataTable","open","setOpen","React","panelRef","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","allColumns","col","stateOrder","orderedIds","c","handleClick","getLabel","colId","handleDragEnd","event","active","over","oldIndex","newIndex","newOrder","arrayMove","Button","prev","SlidersHorizontalIcon","DndContext","closestCenter","restrictToVerticalAxis","SortableContext","verticalListSortingStrategy","visibleCount","isVisible","isLastVisible"],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { jsxs as S, jsx as n } from "react/jsx-runtime";
|
|
2
|
+
import { useSensors as D, useSensor as y, PointerSensor as k, KeyboardSensor as w, DndContext as N, closestCenter as E } from "@dnd-kit/core";
|
|
3
|
+
import { restrictToVerticalAxis as O } from "@dnd-kit/modifiers";
|
|
4
|
+
import { sortableKeyboardCoordinates as V, SortableContext as z, verticalListSortingStrategy as I, arrayMove as L, useSortable as T } from "@dnd-kit/sortable";
|
|
5
|
+
import { CSS as R } from "@dnd-kit/utilities";
|
|
6
|
+
import { SlidersHorizontalIcon as K, GripVerticalIcon as j, CheckIcon as A } from "lucide-react";
|
|
7
|
+
import * as v from "react";
|
|
8
|
+
import { useDataTable as G } from "./data-table.js";
|
|
9
|
+
import { Button as H } from "../button.js";
|
|
10
|
+
import { cn as C } from "../../../lib/utils.js";
|
|
11
|
+
function P({ id: p, label: a, visible: m, onToggle: s }) {
|
|
12
|
+
const {
|
|
13
|
+
attributes: f,
|
|
14
|
+
listeners: l,
|
|
15
|
+
setNodeRef: b,
|
|
16
|
+
transform: i,
|
|
17
|
+
transition: c,
|
|
18
|
+
isDragging: o
|
|
19
|
+
} = T({ id: p }), h = {
|
|
20
|
+
transform: R.Transform.toString(i),
|
|
21
|
+
transition: c
|
|
22
|
+
};
|
|
23
|
+
return /* @__PURE__ */ S(
|
|
24
|
+
"div",
|
|
25
|
+
{
|
|
26
|
+
ref: b,
|
|
27
|
+
style: h,
|
|
28
|
+
role: "checkbox",
|
|
29
|
+
"aria-checked": m,
|
|
30
|
+
tabIndex: 0,
|
|
31
|
+
onClick: s,
|
|
32
|
+
onKeyDown: (d) => {
|
|
33
|
+
(d.key === "Enter" || d.key === " ") && s();
|
|
34
|
+
},
|
|
35
|
+
className: C(
|
|
36
|
+
"group/col-item flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm select-none hover:bg-accent hover:text-accent-foreground",
|
|
37
|
+
o && "z-50 bg-accent text-accent-foreground shadow-sm"
|
|
38
|
+
),
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ n(
|
|
41
|
+
"button",
|
|
42
|
+
{
|
|
43
|
+
type: "button",
|
|
44
|
+
className: C(
|
|
45
|
+
"cursor-grab touch-none text-muted-foreground group-hover/col-item:text-accent-foreground active:cursor-grabbing",
|
|
46
|
+
!o && "opacity-0 group-hover/col-item:opacity-100 transition-opacity"
|
|
47
|
+
),
|
|
48
|
+
onClick: (d) => d.stopPropagation(),
|
|
49
|
+
...f,
|
|
50
|
+
...l,
|
|
51
|
+
children: /* @__PURE__ */ n(j, { className: "size-3.5" })
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
/* @__PURE__ */ n("span", { className: "flex-1 truncate", children: a }),
|
|
55
|
+
/* @__PURE__ */ n(A, { className: C("size-4 shrink-0", m ? "text-muted-foreground group-hover/col-item:text-accent-foreground" : "text-transparent") })
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
function Y({ className: p }) {
|
|
61
|
+
const { table: a, columnLabels: m } = G(), [s, f] = v.useState(!1), l = v.useRef(null), b = D(
|
|
62
|
+
y(k),
|
|
63
|
+
y(w, {
|
|
64
|
+
coordinateGetter: V
|
|
65
|
+
})
|
|
66
|
+
), i = a.getAllColumns().filter((t) => t.getCanHide()), c = a.getState().columnOrder, o = c && c.length > 0 ? c.filter((t) => i.some((e) => e.id === t)) : i.map((t) => t.id);
|
|
67
|
+
if (v.useEffect(() => {
|
|
68
|
+
if (!s) return;
|
|
69
|
+
function t(e) {
|
|
70
|
+
l.current && !l.current.contains(e.target) && f(!1);
|
|
71
|
+
}
|
|
72
|
+
return document.addEventListener("mousedown", t), () => document.removeEventListener("mousedown", t);
|
|
73
|
+
}, [s]), i.length === 0) return null;
|
|
74
|
+
function h(t) {
|
|
75
|
+
const e = i.find((r) => r.id === t);
|
|
76
|
+
return e ? m[e.id] ?? e.columnDef.meta?.label ?? (typeof e.columnDef.header == "string" ? e.columnDef.header : e.id) : t;
|
|
77
|
+
}
|
|
78
|
+
return /* @__PURE__ */ S("div", { className: "relative", ref: l, children: [
|
|
79
|
+
/* @__PURE__ */ S(
|
|
80
|
+
H,
|
|
81
|
+
{
|
|
82
|
+
variant: "ghost",
|
|
83
|
+
size: "sm",
|
|
84
|
+
className: p,
|
|
85
|
+
"data-slot": "data-table-column-toggle",
|
|
86
|
+
onClick: () => f((t) => !t),
|
|
87
|
+
"aria-expanded": s,
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ n(K, { "data-icon": "inline-start" }),
|
|
90
|
+
"Columns"
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
),
|
|
94
|
+
s && /* @__PURE__ */ n(
|
|
95
|
+
"div",
|
|
96
|
+
{
|
|
97
|
+
className: "absolute right-0 top-full z-50 mt-1 w-56 rounded-lg border bg-popover p-1 shadow-md",
|
|
98
|
+
role: "group",
|
|
99
|
+
"aria-label": "Toggle and reorder columns",
|
|
100
|
+
children: /* @__PURE__ */ n(
|
|
101
|
+
N,
|
|
102
|
+
{
|
|
103
|
+
sensors: b,
|
|
104
|
+
collisionDetection: E,
|
|
105
|
+
modifiers: [O],
|
|
106
|
+
onDragEnd: (t) => {
|
|
107
|
+
const { active: e, over: r } = t;
|
|
108
|
+
if (!r || e.id === r.id) return;
|
|
109
|
+
const u = o.indexOf(String(e.id)), g = o.indexOf(String(r.id));
|
|
110
|
+
if (u === -1 || g === -1) return;
|
|
111
|
+
const x = L(o, u, g);
|
|
112
|
+
a.setColumnOrder(x);
|
|
113
|
+
},
|
|
114
|
+
children: /* @__PURE__ */ n(z, { items: o, strategy: I, children: (() => {
|
|
115
|
+
const t = o.filter((e) => i.find((r) => r.id === e)?.getIsVisible()).length;
|
|
116
|
+
return o.map((e) => {
|
|
117
|
+
const r = i.find((x) => x.id === e);
|
|
118
|
+
if (!r) return null;
|
|
119
|
+
const u = r.getIsVisible(), g = u && t <= 1;
|
|
120
|
+
return /* @__PURE__ */ n(
|
|
121
|
+
P,
|
|
122
|
+
{
|
|
123
|
+
id: e,
|
|
124
|
+
label: h(e),
|
|
125
|
+
visible: u,
|
|
126
|
+
onToggle: g ? () => {
|
|
127
|
+
} : () => r.toggleVisibility()
|
|
128
|
+
},
|
|
129
|
+
e
|
|
130
|
+
);
|
|
131
|
+
});
|
|
132
|
+
})() })
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
}
|
|
136
|
+
)
|
|
137
|
+
] });
|
|
138
|
+
}
|
|
139
|
+
export {
|
|
140
|
+
Y as DataTableColumnToggle
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=data-table-column-toggle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-column-toggle.js","sources":["../../../../src/components/ui/data-table/data-table-column-toggle.tsx"],"sourcesContent":["\"use client\"\n\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\"\nimport { restrictToVerticalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport { CheckIcon, GripVerticalIcon, SlidersHorizontalIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\n\ninterface DataTableColumnToggleProps {\n className?: string\n}\n\ninterface SortableColumnItemProps {\n id: string\n label: string\n visible: boolean\n onToggle: () => void\n}\n\nfunction SortableColumnItem({ id, label, visible, onToggle }: SortableColumnItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n }\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n role=\"checkbox\"\n aria-checked={visible}\n tabIndex={0}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n onToggle();\n }\n }}\n className={cn(\n \"group/col-item flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-sm select-none hover:bg-accent hover:text-accent-foreground\",\n isDragging && \"z-50 bg-accent text-accent-foreground shadow-sm\",\n )}\n >\n <button\n type=\"button\"\n className={cn(\n \"cursor-grab touch-none text-muted-foreground group-hover/col-item:text-accent-foreground active:cursor-grabbing\",\n !isDragging && \"opacity-0 group-hover/col-item:opacity-100 transition-opacity\",\n )}\n onClick={(e) => e.stopPropagation()}\n {...attributes}\n {...listeners}\n >\n <GripVerticalIcon className=\"size-3.5\" />\n </button>\n <span className=\"flex-1 truncate\">{label}</span>\n <CheckIcon className={cn(\"size-4 shrink-0\", visible ? \"text-muted-foreground group-hover/col-item:text-accent-foreground\" : \"text-transparent\")} />\n </div>\n )\n}\n\nfunction DataTableColumnToggle({ className }: DataTableColumnToggleProps) {\n const { table, columnLabels } = useDataTable()\n const [open, setOpen] = React.useState(false)\n const panelRef = React.useRef<HTMLDivElement>(null)\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const allColumns = table.getAllColumns().filter((col) => col.getCanHide())\n const stateOrder = table.getState().columnOrder\n const orderedIds =\n stateOrder && stateOrder.length > 0\n ? stateOrder.filter((id) => allColumns.some((c) => c.id === id))\n : allColumns.map((c) => c.id)\n\n // Close on outside click\n React.useEffect(() => {\n if (!open) return\n function handleClick(e: MouseEvent) {\n if (panelRef.current && !panelRef.current.contains(e.target as Node)) {\n setOpen(false)\n }\n }\n document.addEventListener(\"mousedown\", handleClick)\n return () => document.removeEventListener(\"mousedown\", handleClick)\n }, [open])\n\n if (allColumns.length === 0) return null\n\n function getLabel(colId: string) {\n const col = allColumns.find((c) => c.id === colId)\n if (!col) return colId\n return (\n columnLabels[col.id] ??\n (col.columnDef.meta as { label?: string } | undefined)?.label ??\n (typeof col.columnDef.header === \"string\" ? col.columnDef.header : col.id)\n )\n }\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n\n const oldIndex = orderedIds.indexOf(String(active.id))\n const newIndex = orderedIds.indexOf(String(over.id))\n if (oldIndex === -1 || newIndex === -1) return\n\n const newOrder = arrayMove(orderedIds, oldIndex, newIndex)\n table.setColumnOrder(newOrder)\n }\n\n return (\n <div className=\"relative\" ref={panelRef}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={className}\n data-slot=\"data-table-column-toggle\"\n onClick={() => setOpen((prev) => !prev)}\n aria-expanded={open}\n >\n <SlidersHorizontalIcon data-icon=\"inline-start\" />\n Columns\n </Button>\n\n {open && (\n <div\n className=\"absolute right-0 top-full z-50 mt-1 w-56 rounded-lg border bg-popover p-1 shadow-md\"\n role=\"group\"\n aria-label=\"Toggle and reorder columns\"\n >\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToVerticalAxis]}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={orderedIds} strategy={verticalListSortingStrategy}>\n {(() => {\n const visibleCount = orderedIds.filter((colId) => allColumns.find((c) => c.id === colId)?.getIsVisible()).length\n return orderedIds.map((colId) => {\n const col = allColumns.find((c) => c.id === colId)\n if (!col) return null\n const isVisible = col.getIsVisible()\n const isLastVisible = isVisible && visibleCount <= 1\n return (\n <SortableColumnItem\n key={colId}\n id={colId}\n label={getLabel(colId)}\n visible={isVisible}\n onToggle={isLastVisible ? () => { } : () => col.toggleVisibility()}\n />\n )\n })\n })()}\n </SortableContext>\n </DndContext>\n </div>\n )}\n </div>\n )\n}\n\nexport { DataTableColumnToggle }\nexport type { DataTableColumnToggleProps }\n"],"names":["SortableColumnItem","id","label","visible","onToggle","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","style","CSS","jsxs","e","cn","jsx","GripVerticalIcon","CheckIcon","DataTableColumnToggle","className","table","columnLabels","useDataTable","open","setOpen","React","panelRef","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","allColumns","col","stateOrder","orderedIds","c","handleClick","getLabel","colId","Button","prev","SlidersHorizontalIcon","DndContext","closestCenter","restrictToVerticalAxis","event","active","over","oldIndex","newIndex","newOrder","arrayMove","SortableContext","verticalListSortingStrategy","visibleCount","isVisible","isLastVisible"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),g=require("lucide-react"),p=require("./data-table.cjs"),o=require("../button.cjs"),s=require("../select.cjs"),m=require("../../../lib/utils.cjs"),j=5,b=10,P=25;function S({pageSizeOptions:u=[j,b,P],className:d}){const{table:t}=p.useDataTable(),c=t.getPageCount(),{pageIndex:i,pageSize:r}=t.getState().pagination,l=t.getFilteredRowModel().rows.length;if(l===0)return null;const x=i*r+1,h=Math.min((i+1)*r,l);return e.jsxs("div",{"data-slot":"data-table-pagination",className:m.cn("flex items-center justify-between gap-4 text-sm text-muted-foreground",d),children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"whitespace-nowrap",children:"Rows per page:"}),e.jsxs(s.Select,{value:String(r),onValueChange:a=>t.setPageSize(Number(a)),children:[e.jsx(s.SelectTrigger,{className:"h-7 w-16",children:e.jsx(s.SelectValue,{})}),e.jsx(s.SelectContent,{children:u.map(a=>e.jsx(s.SelectItem,{value:String(a),children:a},a))})]}),e.jsxs("span",{className:"whitespace-nowrap tabular-nums",children:[x,"–",h," of ",l]})]}),c>1&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(o.Button,{variant:"ghost",size:"icon-sm",onClick:()=>t.previousPage(),disabled:!t.getCanPreviousPage(),"aria-label":"Previous page",children:e.jsx(g.ChevronLeftIcon,{})}),Array.from({length:c},(a,n)=>e.jsx(o.Button,{variant:n===i?"default":"link",size:"icon-xs",onClick:()=>t.setPageIndex(n),"aria-label":`Page ${n+1}`,"aria-current":n===i?"page":void 0,children:n+1},n)),e.jsx(o.Button,{variant:"ghost",size:"icon-sm",onClick:()=>t.nextPage(),disabled:!t.getCanNextPage(),"aria-label":"Next page",children:e.jsx(g.ChevronRightIcon,{})})]})]})}exports.DataTablePagination=S;
|
|
2
|
+
//# sourceMappingURL=data-table-pagination.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-pagination.cjs","sources":["../../../../src/components/ui/data-table/data-table-pagination.tsx"],"sourcesContent":["\"use client\"\n\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\ninterface DataTablePaginationProps {\n pageSizeOptions?: number[]\n className?: string\n}\n\nconst DEFAULT_PAGE_SIZE_SMALL = 5\nconst DEFAULT_PAGE_SIZE_MEDIUM = 10\nconst DEFAULT_PAGE_SIZE_LARGE = 25\n\nfunction DataTablePagination({\n pageSizeOptions = [DEFAULT_PAGE_SIZE_SMALL, DEFAULT_PAGE_SIZE_MEDIUM, DEFAULT_PAGE_SIZE_LARGE],\n className,\n}: DataTablePaginationProps) {\n const { table } = useDataTable()\n\n const pageCount = table.getPageCount()\n const { pageIndex, pageSize } = table.getState().pagination\n const totalRows = table.getFilteredRowModel().rows.length\n\n if (totalRows === 0) return null\n\n const start = pageIndex * pageSize + 1\n const end = Math.min((pageIndex + 1) * pageSize, totalRows)\n\n return (\n <div\n data-slot=\"data-table-pagination\"\n className={cn(\n \"flex items-center justify-between gap-4 text-sm text-muted-foreground\",\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"whitespace-nowrap\">Rows per page:</span>\n <Select\n value={String(pageSize)}\n onValueChange={(value) => table.setPageSize(Number(value))}\n >\n <SelectTrigger className=\"h-7 w-16\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span className=\"whitespace-nowrap tabular-nums\">\n {start}–{end} of {totalRows}\n </span>\n </div>\n\n {pageCount > 1 && (\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"Previous page\"\n >\n <ChevronLeftIcon />\n </Button>\n\n {Array.from({ length: pageCount }, (_, i) => (\n <Button\n key={i}\n variant={i === pageIndex ? \"default\" : \"link\"}\n size=\"icon-xs\"\n onClick={() => table.setPageIndex(i)}\n aria-label={`Page ${i + 1}`}\n aria-current={i === pageIndex ? \"page\" : undefined}\n >\n {i + 1}\n </Button>\n ))}\n\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label=\"Next page\"\n >\n <ChevronRightIcon />\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nexport { DataTablePagination }\nexport type { DataTablePaginationProps }\n"],"names":["DEFAULT_PAGE_SIZE_SMALL","DEFAULT_PAGE_SIZE_MEDIUM","DEFAULT_PAGE_SIZE_LARGE","DataTablePagination","pageSizeOptions","className","table","useDataTable","pageCount","pageIndex","pageSize","totalRows","start","end","jsxs","cn","jsx","Select","value","SelectTrigger","SelectValue","SelectContent","size","SelectItem","Button","ChevronLeftIcon","_","i","ChevronRightIcon"],"mappings":"uQAqBMA,EAA0B,EAC1BC,EAA2B,GAC3BC,EAA0B,GAEhC,SAASC,EAAoB,CAC3B,gBAAAC,EAAkB,CAACJ,EAAyBC,EAA0BC,CAAuB,EAC7F,UAAAG,CACF,EAA6B,CAC3B,KAAM,CAAE,MAAAC,CAAA,EAAUC,eAAA,EAEZC,EAAYF,EAAM,aAAA,EAClB,CAAE,UAAAG,EAAW,SAAAC,CAAA,EAAaJ,EAAM,WAAW,WAC3CK,EAAYL,EAAM,oBAAA,EAAsB,KAAK,OAEnD,GAAIK,IAAc,EAAG,OAAO,KAE5B,MAAMC,EAAQH,EAAYC,EAAW,EAC/BG,EAAM,KAAK,KAAKJ,EAAY,GAAKC,EAAUC,CAAS,EAE1D,OACEG,EAAAA,KAAC,MAAA,CACC,YAAU,wBACV,UAAWC,EAAAA,GACT,wEACAV,CAAA,EAGF,SAAA,CAAAS,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAE,EAAAA,IAAC,OAAA,CAAK,UAAU,oBAAoB,SAAA,iBAAc,EAClDF,EAAAA,KAACG,EAAAA,OAAA,CACC,MAAO,OAAOP,CAAQ,EACtB,cAAgBQ,GAAUZ,EAAM,YAAY,OAAOY,CAAK,CAAC,EAEzD,SAAA,CAAAF,MAACG,EAAAA,cAAA,CAAc,UAAU,WACvB,SAAAH,MAACI,EAAAA,cAAY,EACf,EACAJ,EAAAA,IAACK,EAAAA,cAAA,CACE,SAAAjB,EAAgB,IAAKkB,GACpBN,MAACO,EAAAA,WAAA,CAAsB,MAAO,OAAOD,CAAI,EACtC,SAAAA,CAAA,EADcA,CAEjB,CACD,CAAA,CACH,CAAA,CAAA,CAAA,EAEFR,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACb,SAAA,CAAAF,EAAM,IAAQC,EAAI,OAAKF,CAAA,CAAA,CAC1B,CAAA,EACF,EAECH,EAAY,GACXM,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAE,EAAAA,IAACQ,EAAAA,OAAA,CACC,QAAQ,QACR,KAAK,UACL,QAAS,IAAMlB,EAAM,aAAA,EACrB,SAAU,CAACA,EAAM,mBAAA,EACjB,aAAW,gBAEX,eAACmB,EAAAA,gBAAA,CAAA,CAAgB,CAAA,CAAA,EAGlB,MAAM,KAAK,CAAE,OAAQjB,GAAa,CAACkB,EAAGC,IACrCX,EAAAA,IAACQ,EAAAA,OAAA,CAEC,QAASG,IAAMlB,EAAY,UAAY,OACvC,KAAK,UACL,QAAS,IAAMH,EAAM,aAAaqB,CAAC,EACnC,aAAY,QAAQA,EAAI,CAAC,GACzB,eAAcA,IAAMlB,EAAY,OAAS,OAExC,SAAAkB,EAAI,CAAA,EAPAA,CAAA,CASR,EAEDX,EAAAA,IAACQ,EAAAA,OAAA,CACC,QAAQ,QACR,KAAK,UACL,QAAS,IAAMlB,EAAM,SAAA,EACrB,SAAU,CAACA,EAAM,eAAA,EACjB,aAAW,YAEX,eAACsB,EAAAA,iBAAA,CAAA,CAAiB,CAAA,CAAA,CACpB,CAAA,CACF,CAAA,CAAA,CAAA,CAIR"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { jsxs as r, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { ChevronLeftIcon as h, ChevronRightIcon as u } from "lucide-react";
|
|
3
|
+
import { useDataTable as f } from "./data-table.js";
|
|
4
|
+
import { Button as s } from "../button.js";
|
|
5
|
+
import { Select as v, SelectTrigger as x, SelectValue as P, SelectContent as S, SelectItem as b } from "../select.js";
|
|
6
|
+
import { cn as C } from "../../../lib/utils.js";
|
|
7
|
+
const E = 5, w = 10, _ = 25;
|
|
8
|
+
function M({
|
|
9
|
+
pageSizeOptions: g = [E, w, _],
|
|
10
|
+
className: m
|
|
11
|
+
}) {
|
|
12
|
+
const { table: a } = f(), c = a.getPageCount(), { pageIndex: o, pageSize: i } = a.getState().pagination, l = a.getFilteredRowModel().rows.length;
|
|
13
|
+
if (l === 0) return null;
|
|
14
|
+
const d = o * i + 1, p = Math.min((o + 1) * i, l);
|
|
15
|
+
return /* @__PURE__ */ r(
|
|
16
|
+
"div",
|
|
17
|
+
{
|
|
18
|
+
"data-slot": "data-table-pagination",
|
|
19
|
+
className: C(
|
|
20
|
+
"flex items-center justify-between gap-4 text-sm text-muted-foreground",
|
|
21
|
+
m
|
|
22
|
+
),
|
|
23
|
+
children: [
|
|
24
|
+
/* @__PURE__ */ r("div", { className: "flex items-center gap-2", children: [
|
|
25
|
+
/* @__PURE__ */ e("span", { className: "whitespace-nowrap", children: "Rows per page:" }),
|
|
26
|
+
/* @__PURE__ */ r(
|
|
27
|
+
v,
|
|
28
|
+
{
|
|
29
|
+
value: String(i),
|
|
30
|
+
onValueChange: (t) => a.setPageSize(Number(t)),
|
|
31
|
+
children: [
|
|
32
|
+
/* @__PURE__ */ e(x, { className: "h-7 w-16", children: /* @__PURE__ */ e(P, {}) }),
|
|
33
|
+
/* @__PURE__ */ e(S, { children: g.map((t) => /* @__PURE__ */ e(b, { value: String(t), children: t }, t)) })
|
|
34
|
+
]
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
/* @__PURE__ */ r("span", { className: "whitespace-nowrap tabular-nums", children: [
|
|
38
|
+
d,
|
|
39
|
+
"–",
|
|
40
|
+
p,
|
|
41
|
+
" of ",
|
|
42
|
+
l
|
|
43
|
+
] })
|
|
44
|
+
] }),
|
|
45
|
+
c > 1 && /* @__PURE__ */ r("div", { className: "flex items-center gap-1", children: [
|
|
46
|
+
/* @__PURE__ */ e(
|
|
47
|
+
s,
|
|
48
|
+
{
|
|
49
|
+
variant: "ghost",
|
|
50
|
+
size: "icon-sm",
|
|
51
|
+
onClick: () => a.previousPage(),
|
|
52
|
+
disabled: !a.getCanPreviousPage(),
|
|
53
|
+
"aria-label": "Previous page",
|
|
54
|
+
children: /* @__PURE__ */ e(h, {})
|
|
55
|
+
}
|
|
56
|
+
),
|
|
57
|
+
Array.from({ length: c }, (t, n) => /* @__PURE__ */ e(
|
|
58
|
+
s,
|
|
59
|
+
{
|
|
60
|
+
variant: n === o ? "default" : "link",
|
|
61
|
+
size: "icon-xs",
|
|
62
|
+
onClick: () => a.setPageIndex(n),
|
|
63
|
+
"aria-label": `Page ${n + 1}`,
|
|
64
|
+
"aria-current": n === o ? "page" : void 0,
|
|
65
|
+
children: n + 1
|
|
66
|
+
},
|
|
67
|
+
n
|
|
68
|
+
)),
|
|
69
|
+
/* @__PURE__ */ e(
|
|
70
|
+
s,
|
|
71
|
+
{
|
|
72
|
+
variant: "ghost",
|
|
73
|
+
size: "icon-sm",
|
|
74
|
+
onClick: () => a.nextPage(),
|
|
75
|
+
disabled: !a.getCanNextPage(),
|
|
76
|
+
"aria-label": "Next page",
|
|
77
|
+
children: /* @__PURE__ */ e(u, {})
|
|
78
|
+
}
|
|
79
|
+
)
|
|
80
|
+
] })
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
export {
|
|
86
|
+
M as DataTablePagination
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=data-table-pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-pagination.js","sources":["../../../../src/components/ui/data-table/data-table-pagination.tsx"],"sourcesContent":["\"use client\"\n\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\ninterface DataTablePaginationProps {\n pageSizeOptions?: number[]\n className?: string\n}\n\nconst DEFAULT_PAGE_SIZE_SMALL = 5\nconst DEFAULT_PAGE_SIZE_MEDIUM = 10\nconst DEFAULT_PAGE_SIZE_LARGE = 25\n\nfunction DataTablePagination({\n pageSizeOptions = [DEFAULT_PAGE_SIZE_SMALL, DEFAULT_PAGE_SIZE_MEDIUM, DEFAULT_PAGE_SIZE_LARGE],\n className,\n}: DataTablePaginationProps) {\n const { table } = useDataTable()\n\n const pageCount = table.getPageCount()\n const { pageIndex, pageSize } = table.getState().pagination\n const totalRows = table.getFilteredRowModel().rows.length\n\n if (totalRows === 0) return null\n\n const start = pageIndex * pageSize + 1\n const end = Math.min((pageIndex + 1) * pageSize, totalRows)\n\n return (\n <div\n data-slot=\"data-table-pagination\"\n className={cn(\n \"flex items-center justify-between gap-4 text-sm text-muted-foreground\",\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n <span className=\"whitespace-nowrap\">Rows per page:</span>\n <Select\n value={String(pageSize)}\n onValueChange={(value) => table.setPageSize(Number(value))}\n >\n <SelectTrigger className=\"h-7 w-16\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <span className=\"whitespace-nowrap tabular-nums\">\n {start}–{end} of {totalRows}\n </span>\n </div>\n\n {pageCount > 1 && (\n <div className=\"flex items-center gap-1\">\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label=\"Previous page\"\n >\n <ChevronLeftIcon />\n </Button>\n\n {Array.from({ length: pageCount }, (_, i) => (\n <Button\n key={i}\n variant={i === pageIndex ? \"default\" : \"link\"}\n size=\"icon-xs\"\n onClick={() => table.setPageIndex(i)}\n aria-label={`Page ${i + 1}`}\n aria-current={i === pageIndex ? \"page\" : undefined}\n >\n {i + 1}\n </Button>\n ))}\n\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label=\"Next page\"\n >\n <ChevronRightIcon />\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nexport { DataTablePagination }\nexport type { DataTablePaginationProps }\n"],"names":["DEFAULT_PAGE_SIZE_SMALL","DEFAULT_PAGE_SIZE_MEDIUM","DEFAULT_PAGE_SIZE_LARGE","DataTablePagination","pageSizeOptions","className","table","useDataTable","pageCount","pageIndex","pageSize","totalRows","start","end","jsxs","cn","jsx","Select","value","SelectTrigger","SelectValue","SelectContent","size","SelectItem","Button","ChevronLeftIcon","_","i","ChevronRightIcon"],"mappings":";;;;;;AAqBA,MAAMA,IAA0B,GAC1BC,IAA2B,IAC3BC,IAA0B;AAEhC,SAASC,EAAoB;AAAA,EAC3B,iBAAAC,IAAkB,CAACJ,GAAyBC,GAA0BC,CAAuB;AAAA,EAC7F,WAAAG;AACF,GAA6B;AAC3B,QAAM,EAAE,OAAAC,EAAA,IAAUC,EAAA,GAEZC,IAAYF,EAAM,aAAA,GAClB,EAAE,WAAAG,GAAW,UAAAC,EAAA,IAAaJ,EAAM,WAAW,YAC3CK,IAAYL,EAAM,oBAAA,EAAsB,KAAK;AAEnD,MAAIK,MAAc,EAAG,QAAO;AAE5B,QAAMC,IAAQH,IAAYC,IAAW,GAC/BG,IAAM,KAAK,KAAKJ,IAAY,KAAKC,GAAUC,CAAS;AAE1D,SACE,gBAAAG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWC;AAAA,QACT;AAAA,QACAV;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,gBAAAS,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAE,EAAC,QAAA,EAAK,WAAU,qBAAoB,UAAA,kBAAc;AAAA,UAClD,gBAAAF;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,OAAO,OAAOP,CAAQ;AAAA,cACtB,eAAe,CAACQ,MAAUZ,EAAM,YAAY,OAAOY,CAAK,CAAC;AAAA,cAEzD,UAAA;AAAA,gBAAA,gBAAAF,EAACG,GAAA,EAAc,WAAU,YACvB,UAAA,gBAAAH,EAACI,KAAY,GACf;AAAA,gBACA,gBAAAJ,EAACK,GAAA,EACE,UAAAjB,EAAgB,IAAI,CAACkB,MACpB,gBAAAN,EAACO,GAAA,EAAsB,OAAO,OAAOD,CAAI,GACtC,UAAAA,EAAA,GADcA,CAEjB,CACD,EAAA,CACH;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,gBAAAR,EAAC,QAAA,EAAK,WAAU,kCACb,UAAA;AAAA,YAAAF;AAAA,YAAM;AAAA,YAAQC;AAAA,YAAI;AAAA,YAAKF;AAAA,UAAA,EAAA,CAC1B;AAAA,QAAA,GACF;AAAA,QAECH,IAAY,KACX,gBAAAM,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,UAAA,gBAAAE;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAMlB,EAAM,aAAA;AAAA,cACrB,UAAU,CAACA,EAAM,mBAAA;AAAA,cACjB,cAAW;AAAA,cAEX,4BAACmB,GAAA,CAAA,CAAgB;AAAA,YAAA;AAAA,UAAA;AAAA,UAGlB,MAAM,KAAK,EAAE,QAAQjB,KAAa,CAACkB,GAAGC,MACrC,gBAAAX;AAAA,YAACQ;AAAA,YAAA;AAAA,cAEC,SAASG,MAAMlB,IAAY,YAAY;AAAA,cACvC,MAAK;AAAA,cACL,SAAS,MAAMH,EAAM,aAAaqB,CAAC;AAAA,cACnC,cAAY,QAAQA,IAAI,CAAC;AAAA,cACzB,gBAAcA,MAAMlB,IAAY,SAAS;AAAA,cAExC,UAAAkB,IAAI;AAAA,YAAA;AAAA,YAPAA;AAAA,UAAA,CASR;AAAA,UAED,gBAAAX;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAMlB,EAAM,SAAA;AAAA,cACrB,UAAU,CAACA,EAAM,eAAA;AAAA,cACjB,cAAW;AAAA,cAEX,4BAACsB,GAAA,CAAA,CAAiB;AAAA,YAAA;AAAA,UAAA;AAAA,QACpB,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),f=require("@dnd-kit/core"),pe=require("@dnd-kit/modifiers"),C=require("@dnd-kit/sortable"),he=require("@dnd-kit/utilities"),S=require("@tanstack/react-table"),_=require("lucide-react"),Se=require("react"),ve=require("./data-table-pagination.cjs"),c=require("../table.cjs"),v=require("../../../lib/utils.cjs");function ye(t){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const l in t)if(l!=="default"){const s=Object.getOwnPropertyDescriptor(t,l);Object.defineProperty(a,l,s.get?s:{enumerable:!0,get:()=>t[l]})}}return a.default=t,Object.freeze(a)}const i=ye(Se),K=i.createContext(null);function je(){const t=i.useContext(K);if(!t)throw new Error("useDataTable must be used within a <DataTable>");return t}function Ce({header:t,children:a,position:l,numeric:s}){const{attributes:o,listeners:b,setNodeRef:y,transform:m,transition:R,isDragging:x}=C.useSortable({id:t.column.id}),O={transform:he.CSS.Transform.toString(m?{...m,scaleX:1,scaleY:1}:null),transition:R,position:"relative"};return e.jsx(c.TableHead,{ref:y,style:O,variant:s?"numeric":void 0,className:v.cn("group/header transition-shadow duration-150",!x&&l==="first"&&"hover:shadow-[inset_-1px_0_0_0_var(--color-border)]",!x&&l==="last"&&"hover:shadow-[inset_1px_0_0_0_var(--color-border)]",!x&&l==="middle"&&"hover:shadow-[inset_1px_0_0_0_var(--color-border),inset_-1px_0_0_0_var(--color-border)]",x&&"opacity-40"),children:e.jsxs("div",{className:v.cn("flex items-center gap-1",s&&"flex-row-reverse"),children:[e.jsx("div",{className:"flex-1",children:a}),e.jsx("button",{type:"button","data-drag-handle":"",className:"cursor-grab touch-none text-muted-foreground hover:text-foreground active:cursor-grabbing opacity-0 group-hover/header:opacity-100 transition-opacity",...o,...b,children:e.jsx(_.GripVerticalIcon,{className:"size-3.5"})})]})})}function A({header:t,enableSorting:a,numericColumns:l,columnLabels:s}){if(t.isPlaceholder)return null;const o=a&&t.column.getCanSort(),b=t.column.getIsSorted(),y=l.has(t.column.id);return e.jsxs("div",{className:v.cn("flex items-center gap-1",o&&"group/sort cursor-pointer select-none",y&&"flex-row-reverse"),onClick:o?t.column.getToggleSortingHandler():void 0,onKeyDown:m=>{(m.key==="Enter"||m.key===" ")&&o&&t.column.getToggleSortingHandler()},children:[s[t.column.id]??S.flexRender(t.column.columnDef.header,t.getContext()),o&&e.jsx("span",{className:v.cn(!b&&"opacity-0 group-hover/sort:opacity-100 transition-opacity"),children:b==="asc"?e.jsx(_.ArrowUpIcon,{className:"size-3.5 text-foreground"}):b==="desc"?e.jsx(_.ArrowDownIcon,{className:"size-3.5 text-foreground"}):e.jsx(_.ArrowUpDownIcon,{className:"size-3.5 text-muted-foreground"})})]})}function L({table:t,columns:a,numericColumns:l}){return t.getRowModel().rows.length===0?e.jsx(c.TableRow,{children:e.jsx(c.TableCell,{colSpan:a.length,className:"h-24 text-center text-muted-foreground",children:"No results."})}):t.getRowModel().rows.map(s=>e.jsx(c.TableRow,{"data-state":s.getIsSelected()?"selected":void 0,children:s.getVisibleCells().map(o=>e.jsx(c.TableCell,{variant:l.has(o.column.id)?"numeric":void 0,children:S.flexRender(o.column.columnDef.cell,o.getContext())},o.id))},s.id))}function Te(t){const a=[],l=[],s=[];return i.Children.forEach(t,o=>{i.isValidElement(o)&&o.type===B?a.push(o):i.isValidElement(o)&&o.type===ve.DataTablePagination?l.push(o):s.push(o)}),{toolbarSlots:a,paginationSlots:l,restSlots:s}}function we({columns:t,data:a,toolbar:l,enableSorting:s=!1,enableColumnVisibility:o=!1,children:b,columnOrder:y,onColumnOrderChange:m,columnVisibility:R,onColumnVisibilityChange:x,columnLabels:O,onColumnLabelChange:M,enablePagination:T=!1,defaultPageSize:F=10,pagination:N,onPaginationChange:H,enableColumnReorder:U=!1,density:q="default",className:G,variant:k="card",containerClassName:z}){const[X,Y]=i.useState([]),[J,Q]=i.useState({}),[W,Z]=i.useState([]),[$,ee]=i.useState({}),[te,ne]=i.useState({pageIndex:0,pageSize:F}),oe=N??te,I=R??J,p=y??W,w=O??$,re=i.useMemo(()=>{if(T)return H?n=>{const r=typeof n=="function"?n(N):n;H(r)}:ne},[T,H,N]),se=i.useMemo(()=>{if(o)return n=>{const r=typeof n=="function"?n(I):n;(x??Q)(r)}},[o,I,x]),ae=i.useCallback(n=>{const r=typeof n=="function"?n(p):n;(m??Z)(r)},[p,m]),u=S.useReactTable({data:a,columns:t,state:{sorting:s?X:void 0,columnVisibility:o?I:void 0,columnOrder:p.length>0?p:void 0,...T?{pagination:oe}:{}},onSortingChange:s?Y:void 0,onPaginationChange:re,onColumnVisibilityChange:se,onColumnOrderChange:ae,getCoreRowModel:S.getCoreRowModel(),getSortedRowModel:s?S.getSortedRowModel():void 0,getPaginationRowModel:T?S.getPaginationRowModel():void 0}),le=i.useCallback((n,r)=>{(M??((d,g)=>ee(D=>({...D,[d]:g}))))(n,r)},[M]),ie=f.useSensors(f.useSensor(f.PointerSensor,{activationConstraint:{distance:5}}),f.useSensor(f.KeyboardSensor,{coordinateGetter:C.sortableKeyboardCoordinates})),[V,E]=i.useState(null),ce=i.useCallback(n=>{E(String(n.active.id))},[]),de=i.useCallback(n=>{E(null);const{active:r,over:d}=n;if(!d||r.id===d.id)return;const g=p.length>0?p:u.getAllLeafColumns().map(xe=>xe.id),D=g.indexOf(String(r.id)),P=g.indexOf(String(d.id));if(D===-1||P===-1)return;const be=C.arrayMove(g,D,P);u.setColumnOrder(be)},[p,u]),j=V?u.getFlatHeaders().find(n=>n.column.id===V):null,h=i.useMemo(()=>{if(a.length===0)return new Set;const n=a[0],r=new Set;for(const d of t){const g="accessorKey"in d?String(d.accessorKey):"";g&&typeof n[g]=="number"&&r.add(g)}return r},[a,t]),ue={table:u,columnLabels:w,setColumnLabel:le},{toolbarSlots:ge,paginationSlots:me,restSlots:fe}=Te(b);return e.jsx(K.Provider,{value:ue,children:e.jsxs("div",{"data-slot":"data-table",className:v.cn("w-full space-y-2",G),children:[l,ge,U?e.jsxs(f.DndContext,{sensors:ie,collisionDetection:f.closestCenter,modifiers:[pe.restrictToHorizontalAxis],onDragStart:ce,onDragEnd:de,children:[e.jsx(C.SortableContext,{items:u.getFlatHeaders().map(n=>n.column.id),strategy:C.horizontalListSortingStrategy,children:e.jsxs(c.Table,{"data-density":q,variant:k,containerClassName:z,children:[e.jsx(c.TableHeader,{children:u.getHeaderGroups().map(n=>e.jsx(c.TableRow,{children:n.headers.map((r,d)=>e.jsx(Ce,{header:r,position:d===0?"first":d===n.headers.length-1?"last":"middle",numeric:h.has(r.column.id),children:e.jsx(A,{header:r,enableSorting:s,numericColumns:h,columnLabels:w})},r.id))},n.id))}),e.jsx(c.TableBody,{children:e.jsx(L,{table:u,columns:t,numericColumns:h})})]})}),e.jsx(f.DragOverlay,{dropAnimation:null,children:j&&e.jsx("div",{className:"rounded-md border bg-background px-4 py-3 text-sm font-medium shadow-lg",children:w[j.column.id]??(typeof j.column.columnDef.header=="string"?j.column.columnDef.header:j.column.id)})})]}):e.jsxs(c.Table,{"data-density":q,variant:k,containerClassName:z,children:[e.jsx(c.TableHeader,{children:u.getHeaderGroups().map(n=>e.jsx(c.TableRow,{children:n.headers.map(r=>e.jsx(c.TableHead,{variant:h.has(r.column.id)?"numeric":void 0,children:e.jsx(A,{header:r,enableSorting:s,numericColumns:h,columnLabels:w})},r.id))},n.id))}),e.jsx(c.TableBody,{children:e.jsx(L,{table:u,columns:t,numericColumns:h})})]}),me,fe]})})}function B({className:t,children:a,...l}){return e.jsx("div",{"data-slot":"table-toolbar",className:v.cn("flex items-center gap-2",t),...l,children:a})}exports.DataTable=we;exports.TableToolbar=B;exports.useDataTable=je;
|
|
2
|
+
//# sourceMappingURL=data-table.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table.cjs","sources":["../../../../src/components/ui/data-table/data-table.tsx"],"sourcesContent":["\"use client\"\n\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n DragOverlay,\n type DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\"\nimport { restrictToHorizontalAxis } from \"@dnd-kit/modifiers\"\nimport {\n arrayMove,\n horizontalListSortingStrategy,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n} from \"@dnd-kit/sortable\"\nimport { CSS } from \"@dnd-kit/utilities\"\nimport {\n type ColumnDef,\n type ColumnOrderState,\n type Header,\n type PaginationState,\n type SortingState,\n type Table as TanStackTable,\n type VisibilityState,\n flexRender,\n getCoreRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from \"@tanstack/react-table\"\nimport { ArrowDownIcon, ArrowUpDownIcon, ArrowUpIcon, GripVerticalIcon } from \"lucide-react\"\nimport * as React from \"react\"\n\nimport { DataTablePagination } from \"./data-table-pagination\"\n\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/components/ui/table\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface TableContextValue<TData> {\n table: TanStackTable<TData>\n columnLabels: Record<string, string>\n setColumnLabel: (columnId: string, label: string) => void\n}\n\nconst TableContext = React.createContext<TableContextValue<unknown> | null>(null)\n\nfunction useDataTable<TData = unknown>() {\n const ctx = React.useContext(TableContext) as TableContextValue<TData> | null\n if (!ctx) {\n throw new Error(\"useDataTable must be used within a <DataTable>\")\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// DraggableHeader\n// ---------------------------------------------------------------------------\n\nfunction DraggableHeader<TData>({\n header,\n children,\n position,\n numeric,\n}: {\n header: Header<TData, unknown>\n children: React.ReactNode\n position?: \"first\" | \"last\" | \"middle\"\n numeric?: boolean\n}) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: header.column.id })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(\n transform ? { ...transform, scaleX: 1, scaleY: 1 } : null,\n ),\n transition,\n position: \"relative\",\n }\n\n return (\n <TableHead\n ref={setNodeRef}\n style={style}\n variant={numeric ? \"numeric\" : undefined}\n className={cn(\n \"group/header transition-shadow duration-150\",\n !isDragging && position === \"first\" && \"hover:shadow-[inset_-1px_0_0_0_var(--color-border)]\",\n !isDragging && position === \"last\" && \"hover:shadow-[inset_1px_0_0_0_var(--color-border)]\",\n !isDragging && position === \"middle\" && \"hover:shadow-[inset_1px_0_0_0_var(--color-border),inset_-1px_0_0_0_var(--color-border)]\",\n isDragging && \"opacity-40\",\n )}\n >\n <div className={cn(\"flex items-center gap-1\", numeric && \"flex-row-reverse\")}>\n <div className=\"flex-1\">{children}</div>\n <button\n type=\"button\"\n data-drag-handle=\"\"\n className=\"cursor-grab touch-none text-muted-foreground hover:text-foreground active:cursor-grabbing opacity-0 group-hover/header:opacity-100 transition-opacity\"\n {...attributes}\n {...listeners}\n >\n <GripVerticalIcon className=\"size-3.5\" />\n </button>\n </div>\n </TableHead>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Shared header / body renderers (extracted to reduce cognitive complexity)\n// ---------------------------------------------------------------------------\n\ninterface SortableHeaderContentProps {\n header: Header<unknown, unknown>\n enableSorting: boolean\n numericColumns: Set<string>\n columnLabels: Record<string, string>\n}\n\nfunction SortableHeaderContent({\n header,\n enableSorting,\n numericColumns,\n columnLabels,\n}: SortableHeaderContentProps) {\n if (header.isPlaceholder) return null\n const canSort = enableSorting && header.column.getCanSort()\n const sorted = header.column.getIsSorted()\n const isNumeric = numericColumns.has(header.column.id)\n\n return (\n <div\n className={cn(\n \"flex items-center gap-1\",\n canSort && \"group/sort cursor-pointer select-none\",\n isNumeric && \"flex-row-reverse\",\n )}\n onClick={canSort ? header.column.getToggleSortingHandler() : undefined}\n onKeyDown={(e) => {\n if ((e.key === \"Enter\" || e.key === \" \") && canSort) {\n header.column.getToggleSortingHandler()\n }\n }}\n >\n {columnLabels[header.column.id] ??\n flexRender(header.column.columnDef.header, header.getContext())}\n {canSort && (\n <span\n className={cn(\n !sorted && \"opacity-0 group-hover/sort:opacity-100 transition-opacity\",\n )}\n >\n {sorted === \"asc\" ? (\n <ArrowUpIcon className=\"size-3.5 text-foreground\" />\n ) : sorted === \"desc\" ? (\n <ArrowDownIcon className=\"size-3.5 text-foreground\" />\n ) : (\n <ArrowUpDownIcon className=\"size-3.5 text-muted-foreground\" />\n )}\n </span>\n )}\n </div>\n )\n}\n\nfunction DataTableRows<TData>({\n table,\n columns,\n numericColumns,\n}: {\n table: TanStackTable<TData>\n columns: ColumnDef<TData, unknown>[]\n numericColumns: Set<string>\n}) {\n if (table.getRowModel().rows.length === 0) {\n return (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center text-muted-foreground\">\n No results.\n </TableCell>\n </TableRow>\n )\n }\n\n return table.getRowModel().rows.map((row) => (\n <TableRow key={row.id} data-state={row.getIsSelected() ? \"selected\" : undefined}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} variant={numericColumns.has(cell.column.id) ? \"numeric\" : undefined}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n}\n\n// ---------------------------------------------------------------------------\n// Slot categorization\n// ---------------------------------------------------------------------------\n\nfunction categorizeSlots(children: React.ReactNode) {\n const toolbarSlots: React.ReactNode[] = []\n const paginationSlots: React.ReactNode[] = []\n const restSlots: React.ReactNode[] = []\n React.Children.forEach(children, (child) => {\n if (React.isValidElement(child) && child.type === TableToolbar) {\n toolbarSlots.push(child)\n } else if (React.isValidElement(child) && child.type === DataTablePagination) {\n paginationSlots.push(child)\n } else {\n restSlots.push(child)\n }\n })\n return { toolbarSlots, paginationSlots, restSlots }\n}\n\n// ---------------------------------------------------------------------------\n// DataTable\n// ---------------------------------------------------------------------------\n\ninterface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n /** @deprecated Use `<TableToolbar>` as a child instead */\n toolbar?: React.ReactNode\n enableSorting?: boolean\n enableColumnVisibility?: boolean\n columnOrder?: ColumnOrderState\n onColumnOrderChange?: (order: ColumnOrderState) => void\n columnVisibility?: VisibilityState\n onColumnVisibilityChange?: (vis: VisibilityState) => void\n columnLabels?: Record<string, string>\n onColumnLabelChange?: (columnId: string, label: string) => void\n enablePagination?: boolean\n defaultPageSize?: number\n pagination?: PaginationState\n onPaginationChange?: (pagination: PaginationState) => void\n enableColumnReorder?: boolean\n density?: \"compact\" | \"default\" | \"relaxed\"\n children?: React.ReactNode\n className?: string\n /** Variant passed to the base Table component */\n variant?: React.ComponentProps<typeof Table>[\"variant\"]\n /** className passed to the base Table's container div */\n containerClassName?: React.ComponentProps<typeof Table>[\"containerClassName\"]\n}\n\nfunction DataTable<TData, TValue>({\n columns,\n data,\n toolbar,\n enableSorting = false,\n enableColumnVisibility = false,\n children,\n columnOrder: controlledColumnOrder,\n onColumnOrderChange,\n columnVisibility: controlledColumnVisibility,\n onColumnVisibilityChange,\n columnLabels: controlledColumnLabels,\n onColumnLabelChange,\n enablePagination = false,\n defaultPageSize = 10,\n pagination: controlledPagination,\n onPaginationChange,\n enableColumnReorder = false,\n density = \"default\",\n className,\n variant = \"card\",\n containerClassName,\n}: DataTableProps<TData, TValue>) {\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [internalColumnVisibility, setInternalColumnVisibility] =\n React.useState<VisibilityState>({})\n const [internalColumnOrder, setInternalColumnOrder] =\n React.useState<ColumnOrderState>([])\n const [internalColumnLabels, setInternalColumnLabels] = React.useState<\n Record<string, string>\n >({})\n const [internalPagination, setInternalPagination] =\n React.useState<PaginationState>({\n pageIndex: 0,\n pageSize: defaultPageSize,\n })\n\n const pagination = controlledPagination ?? internalPagination\n\n const columnVisibility =\n controlledColumnVisibility ?? internalColumnVisibility\n const columnOrder = controlledColumnOrder ?? internalColumnOrder\n const columnLabels = controlledColumnLabels ?? internalColumnLabels\n\n const handlePaginationChange = React.useMemo(() => {\n if (!enablePagination) return\n if (onPaginationChange) {\n return (updater: PaginationState | ((prev: PaginationState) => PaginationState)) => {\n const next = typeof updater === \"function\" ? updater(controlledPagination!) : updater\n onPaginationChange(next)\n }\n }\n return setInternalPagination\n }, [enablePagination, onPaginationChange, controlledPagination])\n\n const handleVisibilityChange = React.useMemo(() => {\n if (!enableColumnVisibility) return\n return (updater: VisibilityState | ((prev: VisibilityState) => VisibilityState)) => {\n const next = typeof updater === \"function\" ? updater(columnVisibility) : updater\n ;(onColumnVisibilityChange ?? setInternalColumnVisibility)(next)\n }\n }, [enableColumnVisibility, columnVisibility, onColumnVisibilityChange])\n\n const handleColumnOrderChange = React.useCallback(\n (updater: ColumnOrderState | ((prev: ColumnOrderState) => ColumnOrderState)) => {\n const next = typeof updater === \"function\" ? updater(columnOrder) : updater\n ;(onColumnOrderChange ?? setInternalColumnOrder)(next)\n },\n [columnOrder, onColumnOrderChange],\n )\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting: enableSorting ? sorting : undefined,\n columnVisibility: enableColumnVisibility ? columnVisibility : undefined,\n columnOrder: columnOrder.length > 0 ? columnOrder : undefined,\n ...(enablePagination ? { pagination } : {}),\n },\n onSortingChange: enableSorting ? setSorting : undefined,\n onPaginationChange: handlePaginationChange,\n onColumnVisibilityChange: handleVisibilityChange,\n onColumnOrderChange: handleColumnOrderChange,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined,\n getPaginationRowModel: enablePagination ? getPaginationRowModel() : undefined,\n })\n\n const setColumnLabel = React.useCallback(\n (columnId: string, label: string) => {\n ;(onColumnLabelChange ?? ((id: string, l: string) => setInternalColumnLabels((prev) => ({ ...prev, [id]: l }))))(columnId, label)\n },\n [onColumnLabelChange],\n )\n\n const reorderSensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n\n const [draggingColumnId, setDraggingColumnId] = React.useState<string | null>(null)\n\n const handleColumnDragStart = React.useCallback(\n (event: DragStartEvent) => {\n setDraggingColumnId(String(event.active.id))\n },\n [],\n )\n\n const handleColumnDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n setDraggingColumnId(null)\n const { active, over } = event\n if (!over || active.id === over.id) return\n const currentOrder =\n columnOrder.length > 0 ? columnOrder : table.getAllLeafColumns().map((column) => column.id)\n const oldIdx = currentOrder.indexOf(String(active.id))\n const newIdx = currentOrder.indexOf(String(over.id))\n if (oldIdx === -1 || newIdx === -1) return\n const newOrder = arrayMove(currentOrder, oldIdx, newIdx)\n table.setColumnOrder(newOrder)\n },\n [columnOrder, table],\n )\n\n const draggingHeader = draggingColumnId\n ? table.getFlatHeaders().find((h) => h.column.id === draggingColumnId)\n : null\n\n // Infer which columns are numeric from the first data row\n const numericColumns = React.useMemo(() => {\n if (data.length === 0) return new Set<string>()\n const first = data[0] as Record<string, unknown>\n const ids = new Set<string>()\n for (const col of columns) {\n const key = \"accessorKey\" in col ? String(col.accessorKey) : \"\"\n if (key && typeof first[key] === \"number\") ids.add(key)\n }\n return ids\n }, [data, columns])\n\n // Not memoized: TanStack's table instance is a stable reference that mutates\n // internally, so children reading table.getState() need fresh context on each render.\n const ctx = {\n table,\n columnLabels,\n setColumnLabel,\n } as TableContextValue<unknown>\n\n const { toolbarSlots, paginationSlots, restSlots } = categorizeSlots(children)\n\n return (\n <TableContext.Provider value={ctx}>\n <div data-slot=\"data-table\" className={cn(\"w-full space-y-2\", className)}>\n {toolbar}\n {toolbarSlots}\n {enableColumnReorder ? (\n <DndContext\n sensors={reorderSensors}\n collisionDetection={closestCenter}\n modifiers={[restrictToHorizontalAxis]}\n onDragStart={handleColumnDragStart}\n onDragEnd={handleColumnDragEnd}\n >\n <SortableContext\n items={table.getFlatHeaders().map((h) => h.column.id)}\n strategy={horizontalListSortingStrategy}\n >\n <Table data-density={density} variant={variant} containerClassName={containerClassName}>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header, headerIdx) => (\n <DraggableHeader\n key={header.id}\n header={header}\n position={headerIdx === 0 ? \"first\" : headerIdx === headerGroup.headers.length - 1 ? \"last\" : \"middle\"}\n numeric={numericColumns.has(header.column.id)}\n >\n <SortableHeaderContent\n header={header as Header<unknown, unknown>}\n enableSorting={enableSorting}\n numericColumns={numericColumns}\n columnLabels={columnLabels}\n />\n </DraggableHeader>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n <DataTableRows table={table} columns={columns} numericColumns={numericColumns} />\n </TableBody>\n </Table>\n </SortableContext>\n <DragOverlay dropAnimation={null}>\n {draggingHeader && (\n <div className=\"rounded-md border bg-background px-4 py-3 text-sm font-medium shadow-lg\">\n {columnLabels[draggingHeader.column.id] ??\n (typeof draggingHeader.column.columnDef.header === \"string\"\n ? draggingHeader.column.columnDef.header\n : draggingHeader.column.id)}\n </div>\n )}\n </DragOverlay>\n </DndContext>\n ) : (\n <Table data-density={density} variant={variant} containerClassName={containerClassName}>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead key={header.id} variant={numericColumns.has(header.column.id) ? \"numeric\" : undefined}>\n <SortableHeaderContent\n header={header as Header<unknown, unknown>}\n enableSorting={enableSorting}\n numericColumns={numericColumns}\n columnLabels={columnLabels}\n />\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n <DataTableRows table={table} columns={columns} numericColumns={numericColumns} />\n </TableBody>\n </Table>\n )}\n {paginationSlots}\n {restSlots}\n </div>\n </TableContext.Provider>\n )\n}\n\n// ---------------------------------------------------------------------------\n// TableToolbar\n// ---------------------------------------------------------------------------\n\nfunction TableToolbar({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"table-toolbar\"\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nexport { DataTable, TableToolbar, useDataTable }\nexport type { DataTableProps }\n"],"names":["TableContext","React","useDataTable","ctx","DraggableHeader","header","children","position","numeric","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","style","CSS","jsx","TableHead","cn","GripVerticalIcon","SortableHeaderContent","enableSorting","numericColumns","columnLabels","canSort","sorted","isNumeric","jsxs","e","flexRender","ArrowUpIcon","ArrowDownIcon","ArrowUpDownIcon","DataTableRows","table","columns","TableRow","TableCell","row","cell","categorizeSlots","toolbarSlots","paginationSlots","restSlots","child","TableToolbar","DataTablePagination","DataTable","data","toolbar","enableColumnVisibility","controlledColumnOrder","onColumnOrderChange","controlledColumnVisibility","onColumnVisibilityChange","controlledColumnLabels","onColumnLabelChange","enablePagination","defaultPageSize","controlledPagination","onPaginationChange","enableColumnReorder","density","className","variant","containerClassName","sorting","setSorting","internalColumnVisibility","setInternalColumnVisibility","internalColumnOrder","setInternalColumnOrder","internalColumnLabels","setInternalColumnLabels","internalPagination","setInternalPagination","pagination","columnVisibility","columnOrder","handlePaginationChange","updater","next","handleVisibilityChange","handleColumnOrderChange","useReactTable","getCoreRowModel","getSortedRowModel","getPaginationRowModel","setColumnLabel","columnId","label","id","l","prev","reorderSensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","draggingColumnId","setDraggingColumnId","handleColumnDragStart","event","handleColumnDragEnd","active","over","currentOrder","column","oldIdx","newIdx","newOrder","arrayMove","draggingHeader","h","first","ids","col","key","DndContext","closestCenter","restrictToHorizontalAxis","SortableContext","horizontalListSortingStrategy","Table","TableHeader","headerGroup","headerIdx","TableBody","DragOverlay","props"],"mappings":"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"}
|