@tetrascience-npm/tetrascience-react-ui 0.5.0-beta.41.1 → 0.5.0-beta.43.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-filter.cjs +2 -0
- package/dist/components/ui/data-table/data-table-filter.cjs.map +1 -0
- package/dist/components/ui/data-table/data-table-filter.js +178 -0
- package/dist/components/ui/data-table/data-table-filter.js.map +1 -0
- package/dist/components/ui/data-table/data-table.cjs +1 -1
- package/dist/components/ui/data-table/data-table.cjs.map +1 -1
- package/dist/components/ui/data-table/data-table.js +320 -215
- package/dist/components/ui/data-table/data-table.js.map +1 -1
- package/dist/components/ui/table.cjs +1 -1
- package/dist/components/ui/table.cjs.map +1 -1
- package/dist/components/ui/table.js +26 -21
- 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 +51 -4
- package/dist/index.js +425 -423
- package/dist/index.js.map +1 -1
- package/dist/index.tailwind.css +1 -1
- package/dist/providers/athena.d.ts +7 -0
- package/dist/providers/databricks.d.ts +7 -0
- package/dist/providers/snowflake.d.ts +7 -0
- package/dist/server.d.ts +7 -0
- package/package.json +1 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),g=require("lucide-react"),f=require("radix-ui"),R=require("./data-table.cjs"),x=require("../button.cjs"),O=require("../input.cjs"),s=require("../select.cjs"),y=require("../../../lib/utils.cjs"),P={contains:"contains",equals:"equals",not_equals:"not equals",starts_with:"starts with",ends_with:"ends with",is_empty:"is empty",is_not_empty:"is not empty"},A=["is_empty","is_not_empty"],_=["contains","equals","not_equals","starts_with","ends_with","is_empty","is_not_empty"];function L(l,r,n){return r[l]??n?.columnDef?.meta?.label??(typeof n?.columnDef?.header=="string"?n.columnDef.header:void 0)??l}function E(l,r){const n=r?.[0]??"contains";return{id:crypto.randomUUID(),columnId:l,operator:n,value:""}}function I({className:l}){const{table:r,columnLabels:n,filters:o,setFilters:u,filterConfig:v,enableFiltering:F}=R.useDataTable();if(!F)return null;const j=r.getAllLeafColumns(),i=v.length>0?v:j.filter(t=>"accessorKey"in t.columnDef||"accessorFn"in t.columnDef).map(t=>({columnId:t.id})),b=i[0],N=b?.columnId??"";function S(){u([...o,E(N,b?.operators)])}function q(t){u(o.filter(m=>m.id!==t))}function h(t,m){u(o.map(c=>c.id===t?{...c,...m}:c))}function z(){u([])}const d=o.length;return e.jsxs(f.Popover.Root,{children:[e.jsx(f.Popover.Trigger,{asChild:!0,children:e.jsxs(x.Button,{type:"button",variant:"outline",size:"sm","data-slot":"data-table-filter",className:y.cn(l),"aria-label":d>0?`Filter (${d} active)`:"Filter",children:[e.jsx(g.ListFilterIcon,{className:"size-3.5"}),"Filter",d>0&&e.jsx("span",{className:"flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground",children:d})]})}),e.jsx(f.Popover.Portal,{children:e.jsx(f.Popover.Content,{"data-slot":"data-table-filter-panel",align:"end",sideOffset:4,className:y.cn("z-50 min-w-80 rounded-lg border bg-popover p-3 text-popover-foreground shadow-md outline-none","data-[state=open]:animate-in data-[state=closed]:animate-out","data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0","data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95","data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2"),children:e.jsxs("div",{className:"flex flex-col gap-2",children:[o.map(t=>{const c=i.find(a=>a.columnId===t.columnId)?.operators??_,T=A.includes(t.operator);return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(s.Select,{value:t.columnId,onValueChange:a=>{const p=i.find(D=>D.columnId===a)?.operators??_,w=p.includes(t.operator)?t.operator:p[0]??"contains";h(t.id,{columnId:a,operator:w,value:""})},children:[e.jsx(s.SelectTrigger,{size:"sm",className:"w-36",children:e.jsx(s.SelectValue,{})}),e.jsx(s.SelectContent,{children:i.map(a=>{const C=j.find(p=>p.id===a.columnId);return e.jsx(s.SelectItem,{value:a.columnId,children:a.label??L(a.columnId,n,C)},a.columnId)})})]}),e.jsxs(s.Select,{value:t.operator,onValueChange:a=>h(t.id,{operator:a,value:""}),children:[e.jsx(s.SelectTrigger,{size:"sm",className:"w-32",children:e.jsx(s.SelectValue,{})}),e.jsx(s.SelectContent,{children:c.map(a=>e.jsx(s.SelectItem,{value:a,children:P[a]},a))})]}),T?e.jsx("div",{className:"h-8 w-40","aria-hidden":!0}):e.jsx(O.Input,{className:"w-40",placeholder:"Value…",value:t.value,onChange:a=>h(t.id,{value:a.target.value})}),e.jsx(x.Button,{type:"button",variant:"ghost",size:"icon",className:"size-8 shrink-0 text-muted-foreground hover:text-foreground",onClick:()=>q(t.id),"aria-label":"Remove filter",children:e.jsx(g.XIcon,{className:"size-3.5"})})]},t.id)}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs(x.Button,{type:"button",variant:"outline",size:"sm",onClick:S,disabled:i.length===0,children:[e.jsx(g.PlusIcon,{className:"size-3.5"}),"Add filter"]}),o.length>0&&e.jsx(x.Button,{type:"button",variant:"ghost",size:"sm",className:"text-muted-foreground",onClick:z,children:"Clear all"})]})]})})})]})}I.displayName="DataTableFilter";exports.DataTableFilter=I;
|
|
2
|
+
//# sourceMappingURL=data-table-filter.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-filter.cjs","sources":["../../../../src/components/ui/data-table/data-table-filter.tsx"],"sourcesContent":["\"use client\"\n\nimport { ListFilterIcon, PlusIcon, XIcon } from \"lucide-react\"\nimport { Popover } from \"radix-ui\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport type { FilterColumnConfig, FilterCondition, FilterOperator } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Operator metadata\n// ---------------------------------------------------------------------------\n\nconst OPERATOR_LABELS: Record<FilterOperator, string> = {\n contains: \"contains\",\n equals: \"equals\",\n not_equals: \"not equals\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n}\n\nconst VALUE_FREE_OPERATORS: FilterOperator[] = [\"is_empty\", \"is_not_empty\"]\n\nconst DEFAULT_OPERATORS: FilterOperator[] = [\n \"contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"is_empty\",\n \"is_not_empty\",\n]\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColumnLabel(\n colId: string,\n columnLabels: Record<string, string>,\n\n col: any,\n): string {\n return (\n columnLabels[colId] ??\n (col?.columnDef?.meta as { label?: string } | undefined)?.label ??\n (typeof col?.columnDef?.header === \"string\" ? col.columnDef.header : undefined) ??\n colId\n )\n}\n\nfunction makeCondition(\n columnId: string,\n allowedOperators?: FilterOperator[],\n): FilterCondition {\n const operator = allowedOperators?.[0] ?? \"contains\"\n return { id: crypto.randomUUID(), columnId, operator, value: \"\" }\n}\n\n// ---------------------------------------------------------------------------\n// DataTableFilter\n// ---------------------------------------------------------------------------\n\ninterface DataTableFilterProps {\n className?: string\n}\n\nfunction DataTableFilter({ className }: DataTableFilterProps) {\n const { table, columnLabels, filters, setFilters, filterConfig, enableFiltering } =\n useDataTable()\n\n if (!enableFiltering) return null\n\n const allLeafColumns = table.getAllLeafColumns()\n\n const resolvedColumns: FilterColumnConfig[] =\n filterConfig.length > 0\n ? filterConfig\n : allLeafColumns\n .filter((col) => \"accessorKey\" in col.columnDef || \"accessorFn\" in col.columnDef)\n .map((col) => ({ columnId: col.id }))\n\n const firstColumn = resolvedColumns[0]\n const firstColumnId = firstColumn?.columnId ?? \"\"\n\n function addFilter() {\n setFilters([...filters, makeCondition(firstColumnId, firstColumn?.operators)])\n }\n\n function removeFilter(id: string) {\n setFilters(filters.filter((f) => f.id !== id))\n }\n\n function updateFilter(id: string, patch: Partial<FilterCondition>) {\n setFilters(filters.map((f) => (f.id === id ? { ...f, ...patch } : f)))\n }\n\n function clearAll() {\n setFilters([])\n }\n\n const activeCount = filters.length\n\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n data-slot=\"data-table-filter\"\n className={cn(className)}\n aria-label={activeCount > 0 ? `Filter (${activeCount} active)` : \"Filter\"}\n >\n <ListFilterIcon className=\"size-3.5\" />\n Filter\n {activeCount > 0 && (\n <span className=\"flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground\">\n {activeCount}\n </span>\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n data-slot=\"data-table-filter-panel\"\n align=\"end\"\n sideOffset={4}\n className={cn(\n \"z-50 min-w-80 rounded-lg border bg-popover p-3 text-popover-foreground shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"flex flex-col gap-2\">\n {filters.map((condition) => {\n const colConfig = resolvedColumns.find((c) => c.columnId === condition.columnId)\n const operators = colConfig?.operators ?? DEFAULT_OPERATORS\n const isValueFree = VALUE_FREE_OPERATORS.includes(condition.operator)\n\n return (\n <div key={condition.id} className=\"flex items-center gap-2\">\n {/* Column selector */}\n <Select\n value={condition.columnId}\n onValueChange={(v) => {\n const nextConfig = resolvedColumns.find((c) => c.columnId === v)\n const nextOperators = nextConfig?.operators ?? DEFAULT_OPERATORS\n const nextOperator = nextOperators.includes(condition.operator)\n ? condition.operator\n : (nextOperators[0] ?? \"contains\")\n updateFilter(condition.id, {\n columnId: v,\n operator: nextOperator,\n value: \"\",\n })\n }}\n >\n <SelectTrigger size=\"sm\" className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {resolvedColumns.map((c) => {\n const col = allLeafColumns.find((lc) => lc.id === c.columnId)\n return (\n <SelectItem key={c.columnId} value={c.columnId}>\n {c.label ?? getColumnLabel(c.columnId, columnLabels, col)}\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n\n {/* Operator selector */}\n <Select\n value={condition.operator}\n onValueChange={(v) =>\n updateFilter(condition.id, {\n operator: v as FilterOperator,\n value: \"\",\n })\n }\n >\n <SelectTrigger size=\"sm\" className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Value input — hidden for value-free operators */}\n {isValueFree ? (\n <div className=\"h-8 w-40\" aria-hidden />\n ) : (\n <Input\n className=\"w-40\"\n placeholder=\"Value…\"\n value={condition.value}\n onChange={(e) => updateFilter(condition.id, { value: e.target.value })}\n />\n )}\n\n {/* Remove button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => removeFilter(condition.id)}\n aria-label=\"Remove filter\"\n >\n <XIcon className=\"size-3.5\" />\n </Button>\n </div>\n )\n })}\n\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addFilter}\n disabled={resolvedColumns.length === 0}\n >\n <PlusIcon className=\"size-3.5\" />\n Add filter\n </Button>\n {filters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground\"\n onClick={clearAll}\n >\n Clear all\n </Button>\n )}\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nDataTableFilter.displayName = \"DataTableFilter\"\n\nexport { DataTableFilter }\nexport type { DataTableFilterProps }\n"],"names":["OPERATOR_LABELS","VALUE_FREE_OPERATORS","DEFAULT_OPERATORS","getColumnLabel","colId","columnLabels","col","makeCondition","columnId","allowedOperators","operator","DataTableFilter","className","table","filters","setFilters","filterConfig","enableFiltering","useDataTable","allLeafColumns","resolvedColumns","firstColumn","firstColumnId","addFilter","removeFilter","id","f","updateFilter","patch","clearAll","activeCount","jsxs","Popover","jsx","Button","cn","ListFilterIcon","condition","operators","c","isValueFree","Select","v","nextOperators","nextOperator","SelectTrigger","SelectValue","SelectContent","lc","SelectItem","op","Input","e","XIcon","PlusIcon"],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { jsxs as l, jsx as t } from "react/jsx-runtime";
|
|
2
|
+
import { ListFilterIcon as q, XIcon as P, PlusIcon as V } from "lucide-react";
|
|
3
|
+
import { Popover as f } from "radix-ui";
|
|
4
|
+
import { useDataTable as k } from "./data-table.js";
|
|
5
|
+
import { Button as h } from "../button.js";
|
|
6
|
+
import { Input as U } from "../input.js";
|
|
7
|
+
import { Select as y, SelectTrigger as _, SelectValue as I, SelectContent as N, SelectItem as F } from "../select.js";
|
|
8
|
+
import { cn as z } from "../../../lib/utils.js";
|
|
9
|
+
const j = {
|
|
10
|
+
contains: "contains",
|
|
11
|
+
equals: "equals",
|
|
12
|
+
not_equals: "not equals",
|
|
13
|
+
starts_with: "starts with",
|
|
14
|
+
ends_with: "ends with",
|
|
15
|
+
is_empty: "is empty",
|
|
16
|
+
is_not_empty: "is not empty"
|
|
17
|
+
}, B = ["is_empty", "is_not_empty"], w = [
|
|
18
|
+
"contains",
|
|
19
|
+
"equals",
|
|
20
|
+
"not_equals",
|
|
21
|
+
"starts_with",
|
|
22
|
+
"ends_with",
|
|
23
|
+
"is_empty",
|
|
24
|
+
"is_not_empty"
|
|
25
|
+
];
|
|
26
|
+
function K(o, s, n) {
|
|
27
|
+
return s[o] ?? n?.columnDef?.meta?.label ?? (typeof n?.columnDef?.header == "string" ? n.columnDef.header : void 0) ?? o;
|
|
28
|
+
}
|
|
29
|
+
function X(o, s) {
|
|
30
|
+
const n = s?.[0] ?? "contains";
|
|
31
|
+
return { id: crypto.randomUUID(), columnId: o, operator: n, value: "" };
|
|
32
|
+
}
|
|
33
|
+
function $({ className: o }) {
|
|
34
|
+
const { table: s, columnLabels: n, filters: r, setFilters: m, filterConfig: v, enableFiltering: D } = k();
|
|
35
|
+
if (!D) return null;
|
|
36
|
+
const b = s.getAllLeafColumns(), i = v.length > 0 ? v : b.filter((e) => "accessorKey" in e.columnDef || "accessorFn" in e.columnDef).map((e) => ({ columnId: e.id })), C = i[0], A = C?.columnId ?? "";
|
|
37
|
+
function L() {
|
|
38
|
+
m([...r, X(A, C?.operators)]);
|
|
39
|
+
}
|
|
40
|
+
function O(e) {
|
|
41
|
+
m(r.filter((u) => u.id !== e));
|
|
42
|
+
}
|
|
43
|
+
function g(e, u) {
|
|
44
|
+
m(r.map((d) => d.id === e ? { ...d, ...u } : d));
|
|
45
|
+
}
|
|
46
|
+
function R() {
|
|
47
|
+
m([]);
|
|
48
|
+
}
|
|
49
|
+
const c = r.length;
|
|
50
|
+
return /* @__PURE__ */ l(f.Root, { children: [
|
|
51
|
+
/* @__PURE__ */ t(f.Trigger, { asChild: !0, children: /* @__PURE__ */ l(
|
|
52
|
+
h,
|
|
53
|
+
{
|
|
54
|
+
type: "button",
|
|
55
|
+
variant: "outline",
|
|
56
|
+
size: "sm",
|
|
57
|
+
"data-slot": "data-table-filter",
|
|
58
|
+
className: z(o),
|
|
59
|
+
"aria-label": c > 0 ? `Filter (${c} active)` : "Filter",
|
|
60
|
+
children: [
|
|
61
|
+
/* @__PURE__ */ t(q, { className: "size-3.5" }),
|
|
62
|
+
"Filter",
|
|
63
|
+
c > 0 && /* @__PURE__ */ t("span", { className: "flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground", children: c })
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
) }),
|
|
67
|
+
/* @__PURE__ */ t(f.Portal, { children: /* @__PURE__ */ t(
|
|
68
|
+
f.Content,
|
|
69
|
+
{
|
|
70
|
+
"data-slot": "data-table-filter-panel",
|
|
71
|
+
align: "end",
|
|
72
|
+
sideOffset: 4,
|
|
73
|
+
className: z(
|
|
74
|
+
"z-50 min-w-80 rounded-lg border bg-popover p-3 text-popover-foreground shadow-md outline-none",
|
|
75
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out",
|
|
76
|
+
"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
|
77
|
+
"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
|
|
78
|
+
"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2"
|
|
79
|
+
),
|
|
80
|
+
children: /* @__PURE__ */ l("div", { className: "flex flex-col gap-2", children: [
|
|
81
|
+
r.map((e) => {
|
|
82
|
+
const d = i.find((a) => a.columnId === e.columnId)?.operators ?? w, T = B.includes(e.operator);
|
|
83
|
+
return /* @__PURE__ */ l("div", { className: "flex items-center gap-2", children: [
|
|
84
|
+
/* @__PURE__ */ l(
|
|
85
|
+
y,
|
|
86
|
+
{
|
|
87
|
+
value: e.columnId,
|
|
88
|
+
onValueChange: (a) => {
|
|
89
|
+
const p = i.find((S) => S.columnId === a)?.operators ?? w, E = p.includes(e.operator) ? e.operator : p[0] ?? "contains";
|
|
90
|
+
g(e.id, {
|
|
91
|
+
columnId: a,
|
|
92
|
+
operator: E,
|
|
93
|
+
value: ""
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ t(_, { size: "sm", className: "w-36", children: /* @__PURE__ */ t(I, {}) }),
|
|
98
|
+
/* @__PURE__ */ t(N, { children: i.map((a) => {
|
|
99
|
+
const x = b.find((p) => p.id === a.columnId);
|
|
100
|
+
return /* @__PURE__ */ t(F, { value: a.columnId, children: a.label ?? K(a.columnId, n, x) }, a.columnId);
|
|
101
|
+
}) })
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
/* @__PURE__ */ l(
|
|
106
|
+
y,
|
|
107
|
+
{
|
|
108
|
+
value: e.operator,
|
|
109
|
+
onValueChange: (a) => g(e.id, {
|
|
110
|
+
operator: a,
|
|
111
|
+
value: ""
|
|
112
|
+
}),
|
|
113
|
+
children: [
|
|
114
|
+
/* @__PURE__ */ t(_, { size: "sm", className: "w-32", children: /* @__PURE__ */ t(I, {}) }),
|
|
115
|
+
/* @__PURE__ */ t(N, { children: d.map((a) => /* @__PURE__ */ t(F, { value: a, children: j[a] }, a)) })
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
T ? /* @__PURE__ */ t("div", { className: "h-8 w-40", "aria-hidden": !0 }) : /* @__PURE__ */ t(
|
|
120
|
+
U,
|
|
121
|
+
{
|
|
122
|
+
className: "w-40",
|
|
123
|
+
placeholder: "Value…",
|
|
124
|
+
value: e.value,
|
|
125
|
+
onChange: (a) => g(e.id, { value: a.target.value })
|
|
126
|
+
}
|
|
127
|
+
),
|
|
128
|
+
/* @__PURE__ */ t(
|
|
129
|
+
h,
|
|
130
|
+
{
|
|
131
|
+
type: "button",
|
|
132
|
+
variant: "ghost",
|
|
133
|
+
size: "icon",
|
|
134
|
+
className: "size-8 shrink-0 text-muted-foreground hover:text-foreground",
|
|
135
|
+
onClick: () => O(e.id),
|
|
136
|
+
"aria-label": "Remove filter",
|
|
137
|
+
children: /* @__PURE__ */ t(P, { className: "size-3.5" })
|
|
138
|
+
}
|
|
139
|
+
)
|
|
140
|
+
] }, e.id);
|
|
141
|
+
}),
|
|
142
|
+
/* @__PURE__ */ l("div", { className: "flex items-center gap-2", children: [
|
|
143
|
+
/* @__PURE__ */ l(
|
|
144
|
+
h,
|
|
145
|
+
{
|
|
146
|
+
type: "button",
|
|
147
|
+
variant: "outline",
|
|
148
|
+
size: "sm",
|
|
149
|
+
onClick: L,
|
|
150
|
+
disabled: i.length === 0,
|
|
151
|
+
children: [
|
|
152
|
+
/* @__PURE__ */ t(V, { className: "size-3.5" }),
|
|
153
|
+
"Add filter"
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
r.length > 0 && /* @__PURE__ */ t(
|
|
158
|
+
h,
|
|
159
|
+
{
|
|
160
|
+
type: "button",
|
|
161
|
+
variant: "ghost",
|
|
162
|
+
size: "sm",
|
|
163
|
+
className: "text-muted-foreground",
|
|
164
|
+
onClick: R,
|
|
165
|
+
children: "Clear all"
|
|
166
|
+
}
|
|
167
|
+
)
|
|
168
|
+
] })
|
|
169
|
+
] })
|
|
170
|
+
}
|
|
171
|
+
) })
|
|
172
|
+
] });
|
|
173
|
+
}
|
|
174
|
+
$.displayName = "DataTableFilter";
|
|
175
|
+
export {
|
|
176
|
+
$ as DataTableFilter
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=data-table-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-filter.js","sources":["../../../../src/components/ui/data-table/data-table-filter.tsx"],"sourcesContent":["\"use client\"\n\nimport { ListFilterIcon, PlusIcon, XIcon } from \"lucide-react\"\nimport { Popover } from \"radix-ui\"\n\nimport { useDataTable } from \"./data-table\"\n\nimport type { FilterColumnConfig, FilterCondition, FilterOperator } from \"./data-table\"\n\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\"\nimport { cn } from \"@/lib/utils\"\n\n// ---------------------------------------------------------------------------\n// Operator metadata\n// ---------------------------------------------------------------------------\n\nconst OPERATOR_LABELS: Record<FilterOperator, string> = {\n contains: \"contains\",\n equals: \"equals\",\n not_equals: \"not equals\",\n starts_with: \"starts with\",\n ends_with: \"ends with\",\n is_empty: \"is empty\",\n is_not_empty: \"is not empty\",\n}\n\nconst VALUE_FREE_OPERATORS: FilterOperator[] = [\"is_empty\", \"is_not_empty\"]\n\nconst DEFAULT_OPERATORS: FilterOperator[] = [\n \"contains\",\n \"equals\",\n \"not_equals\",\n \"starts_with\",\n \"ends_with\",\n \"is_empty\",\n \"is_not_empty\",\n]\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getColumnLabel(\n colId: string,\n columnLabels: Record<string, string>,\n\n col: any,\n): string {\n return (\n columnLabels[colId] ??\n (col?.columnDef?.meta as { label?: string } | undefined)?.label ??\n (typeof col?.columnDef?.header === \"string\" ? col.columnDef.header : undefined) ??\n colId\n )\n}\n\nfunction makeCondition(\n columnId: string,\n allowedOperators?: FilterOperator[],\n): FilterCondition {\n const operator = allowedOperators?.[0] ?? \"contains\"\n return { id: crypto.randomUUID(), columnId, operator, value: \"\" }\n}\n\n// ---------------------------------------------------------------------------\n// DataTableFilter\n// ---------------------------------------------------------------------------\n\ninterface DataTableFilterProps {\n className?: string\n}\n\nfunction DataTableFilter({ className }: DataTableFilterProps) {\n const { table, columnLabels, filters, setFilters, filterConfig, enableFiltering } =\n useDataTable()\n\n if (!enableFiltering) return null\n\n const allLeafColumns = table.getAllLeafColumns()\n\n const resolvedColumns: FilterColumnConfig[] =\n filterConfig.length > 0\n ? filterConfig\n : allLeafColumns\n .filter((col) => \"accessorKey\" in col.columnDef || \"accessorFn\" in col.columnDef)\n .map((col) => ({ columnId: col.id }))\n\n const firstColumn = resolvedColumns[0]\n const firstColumnId = firstColumn?.columnId ?? \"\"\n\n function addFilter() {\n setFilters([...filters, makeCondition(firstColumnId, firstColumn?.operators)])\n }\n\n function removeFilter(id: string) {\n setFilters(filters.filter((f) => f.id !== id))\n }\n\n function updateFilter(id: string, patch: Partial<FilterCondition>) {\n setFilters(filters.map((f) => (f.id === id ? { ...f, ...patch } : f)))\n }\n\n function clearAll() {\n setFilters([])\n }\n\n const activeCount = filters.length\n\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n data-slot=\"data-table-filter\"\n className={cn(className)}\n aria-label={activeCount > 0 ? `Filter (${activeCount} active)` : \"Filter\"}\n >\n <ListFilterIcon className=\"size-3.5\" />\n Filter\n {activeCount > 0 && (\n <span className=\"flex size-4 items-center justify-center rounded-full bg-primary text-[10px] font-medium text-primary-foreground\">\n {activeCount}\n </span>\n )}\n </Button>\n </Popover.Trigger>\n\n <Popover.Portal>\n <Popover.Content\n data-slot=\"data-table-filter-panel\"\n align=\"end\"\n sideOffset={4}\n className={cn(\n \"z-50 min-w-80 rounded-lg border bg-popover p-3 text-popover-foreground shadow-md outline-none\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"flex flex-col gap-2\">\n {filters.map((condition) => {\n const colConfig = resolvedColumns.find((c) => c.columnId === condition.columnId)\n const operators = colConfig?.operators ?? DEFAULT_OPERATORS\n const isValueFree = VALUE_FREE_OPERATORS.includes(condition.operator)\n\n return (\n <div key={condition.id} className=\"flex items-center gap-2\">\n {/* Column selector */}\n <Select\n value={condition.columnId}\n onValueChange={(v) => {\n const nextConfig = resolvedColumns.find((c) => c.columnId === v)\n const nextOperators = nextConfig?.operators ?? DEFAULT_OPERATORS\n const nextOperator = nextOperators.includes(condition.operator)\n ? condition.operator\n : (nextOperators[0] ?? \"contains\")\n updateFilter(condition.id, {\n columnId: v,\n operator: nextOperator,\n value: \"\",\n })\n }}\n >\n <SelectTrigger size=\"sm\" className=\"w-36\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {resolvedColumns.map((c) => {\n const col = allLeafColumns.find((lc) => lc.id === c.columnId)\n return (\n <SelectItem key={c.columnId} value={c.columnId}>\n {c.label ?? getColumnLabel(c.columnId, columnLabels, col)}\n </SelectItem>\n )\n })}\n </SelectContent>\n </Select>\n\n {/* Operator selector */}\n <Select\n value={condition.operator}\n onValueChange={(v) =>\n updateFilter(condition.id, {\n operator: v as FilterOperator,\n value: \"\",\n })\n }\n >\n <SelectTrigger size=\"sm\" className=\"w-32\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op} value={op}>\n {OPERATOR_LABELS[op]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Value input — hidden for value-free operators */}\n {isValueFree ? (\n <div className=\"h-8 w-40\" aria-hidden />\n ) : (\n <Input\n className=\"w-40\"\n placeholder=\"Value…\"\n value={condition.value}\n onChange={(e) => updateFilter(condition.id, { value: e.target.value })}\n />\n )}\n\n {/* Remove button */}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 shrink-0 text-muted-foreground hover:text-foreground\"\n onClick={() => removeFilter(condition.id)}\n aria-label=\"Remove filter\"\n >\n <XIcon className=\"size-3.5\" />\n </Button>\n </div>\n )\n })}\n\n <div className=\"flex items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={addFilter}\n disabled={resolvedColumns.length === 0}\n >\n <PlusIcon className=\"size-3.5\" />\n Add filter\n </Button>\n {filters.length > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-muted-foreground\"\n onClick={clearAll}\n >\n Clear all\n </Button>\n )}\n </div>\n </div>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )\n}\n\nDataTableFilter.displayName = \"DataTableFilter\"\n\nexport { DataTableFilter }\nexport type { DataTableFilterProps }\n"],"names":["OPERATOR_LABELS","VALUE_FREE_OPERATORS","DEFAULT_OPERATORS","getColumnLabel","colId","columnLabels","col","makeCondition","columnId","allowedOperators","operator","DataTableFilter","className","table","filters","setFilters","filterConfig","enableFiltering","useDataTable","allLeafColumns","resolvedColumns","firstColumn","firstColumnId","addFilter","removeFilter","id","f","updateFilter","patch","clearAll","activeCount","jsxs","Popover","jsx","Button","cn","ListFilterIcon","condition","operators","c","isValueFree","Select","v","nextOperators","nextOperator","SelectTrigger","SelectValue","SelectContent","lc","SelectItem","op","Input","e","XIcon","PlusIcon"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),f=require("@dnd-kit/core"),Oe=require("@dnd-kit/modifiers"),T=require("@dnd-kit/sortable"),He=require("@dnd-kit/utilities"),w=require("@tanstack/react-table"),H=require("lucide-react"),Me=require("react"),ze=require("./data-table-pagination.cjs"),d=require("../table.cjs"),y=require("../../../lib/utils.cjs");function qe(n){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const i in n)if(i!=="default"){const r=Object.getOwnPropertyDescriptor(n,i);Object.defineProperty(a,i,r.get?r:{enumerable:!0,get:()=>n[i]})}}return a.default=n,Object.freeze(a)}const l=qe(Me);function ke(n,a,i){const r=n.toLowerCase().trim(),c=i.toLowerCase().trim();switch(a){case"contains":return r.includes(c);case"equals":return r===c;case"not_equals":return r!==c;case"starts_with":return r.startsWith(c);case"ends_with":return r.endsWith(c);case"is_empty":return r==="";case"is_not_empty":return r!=="";default:return!0}}const Y=l.createContext(null);function Ve(){const n=l.useContext(Y);if(!n)throw new Error("useDataTable must be used within a <DataTable>");return n}function Ee({header:n,children:a,position:i,numeric:r,truncate:c}){const{attributes:s,listeners:x,setNodeRef:h,transform:b,transition:D,isDragging:S}=T.useSortable({id:n.column.id}),_={transform:He.CSS.Transform.toString(b?{...b,scaleX:1,scaleY:1}:null),transition:D,position:"relative"};return t.jsx(d.TableHead,{ref:h,style:_,variant:r?"numeric":void 0,truncate:c,className:y.cn("group/header transition-shadow duration-150",!S&&i==="first"&&"hover:shadow-[inset_-1px_0_0_0_var(--color-border)]",!S&&i==="last"&&"hover:shadow-[inset_1px_0_0_0_var(--color-border)]",!S&&i==="middle"&&"hover:shadow-[inset_1px_0_0_0_var(--color-border),inset_-1px_0_0_0_var(--color-border)]",S&&"opacity-40"),children:t.jsxs("div",{className:y.cn("flex items-center gap-1 min-w-0",r&&"flex-row-reverse"),children:[t.jsx("div",{className:"flex-1 min-w-0",children:a}),t.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",...s,...x,children:t.jsx(H.GripVerticalIcon,{className:"size-3.5"})})]})})}function W({header:n,enableSorting:a,numericColumns:i,columnLabels:r,truncate:c}){if(n.isPlaceholder)return null;const s=a&&n.column.getCanSort(),x=n.column.getIsSorted(),h=i.has(n.column.id);return t.jsxs("div",{className:y.cn("flex items-center gap-1 min-w-0",s&&"group/sort cursor-pointer select-none",h&&"flex-row-reverse"),onClick:s?n.column.getToggleSortingHandler():void 0,onKeyDown:b=>{(b.key==="Enter"||b.key===" ")&&s&&n.column.getToggleSortingHandler()},children:[t.jsx("span",{className:y.cn("min-w-0",c&&"truncate"),children:r[n.column.id]??w.flexRender(n.column.columnDef.header,n.getContext())}),s&&t.jsx("span",{className:y.cn(!x&&"opacity-0 group-hover/sort:opacity-100 transition-opacity"),children:x==="asc"?t.jsx(H.ArrowUpIcon,{className:"size-3.5 text-foreground"}):x==="desc"?t.jsx(H.ArrowDownIcon,{className:"size-3.5 text-foreground"}):t.jsx(H.ArrowUpDownIcon,{className:"size-3.5 text-muted-foreground"})})]})}function X({table:n,columns:a,numericColumns:i,truncate:r}){return n.getRowModel().rows.length===0?t.jsx(d.TableRow,{children:t.jsx(d.TableCell,{colSpan:a.length,className:"h-24 text-center text-muted-foreground",children:"No results."})}):n.getRowModel().rows.map(c=>t.jsx(d.TableRow,{"data-state":c.getIsSelected()?"selected":void 0,children:c.getVisibleCells().map(s=>t.jsx(d.TableCell,{variant:i.has(s.column.id)?"numeric":void 0,truncate:r&&(s.column.columnDef.meta?.truncate??!0),children:w.flexRender(s.column.columnDef.cell,s.getContext())},s.id))},c.id))}function Le(n){const a=[],i=[],r=[],c=[];return l.Children.forEach(n,s=>{l.isValidElement(s)&&s.type===J?a.push(s):l.isValidElement(s)&&s.type.displayName==="DataTableFilter"?i.push(s):l.isValidElement(s)&&s.type===ze.DataTablePagination?r.push(s):c.push(s)}),{toolbarSlots:a,filterSlots:i,paginationSlots:r,restSlots:c}}function Ke({columns:n,data:a,toolbar:i,enableSorting:r=!1,enableColumnVisibility:c=!1,children:s,columnOrder:x,onColumnOrderChange:h,columnVisibility:b,onColumnVisibilityChange:D,columnLabels:S,onColumnLabelChange:_,enablePagination:R=!1,defaultPageSize:Q=10,pagination:M,onPaginationChange:z,enableColumnReorder:Z=!1,enableFiltering:q=!1,filters:$,onFiltersChange:L,filterConfig:k,manualFiltering:K=!1,density:P="default",className:ee,variant:A="card",containerClassName:F,truncate:v=!0}){const[te,ne]=l.useState([]),[oe,re]=l.useState({}),[se,ae]=l.useState([]),[le,ie]=l.useState({}),[ce,ue]=l.useState({pageIndex:0,pageSize:Q}),[de,me]=l.useState([]),ge=M??ce,V=$??de,E=b??oe,p=x??se,N=S??le,fe=l.useMemo(()=>{if(R)return z?e=>{const o=typeof e=="function"?e(M):e;z(o)}:ue},[R,z,M]),xe=l.useMemo(()=>{if(c)return e=>{const o=typeof e=="function"?e(E):e;(D??re)(o)}},[c,E,D]),be=l.useCallback(e=>{(L??me)(e)},[L]),pe=l.useMemo(()=>k||n.filter(e=>"accessorKey"in e).map(e=>({columnId:String(e.accessorKey)})),[k,n]),ye=l.useMemo(()=>{if(!q||K)return a;const e=V.filter(o=>o.columnId&&o.operator&&(o.value.trim()!==""||o.operator==="is_empty"||o.operator==="is_not_empty"));return e.length===0?a:a.filter(o=>e.every(u=>{const g=String(o[u.columnId]??"");return ke(g,u.operator,u.value)}))},[a,V,q,K]),he=l.useCallback(e=>{const o=typeof e=="function"?e(p):e;(h??ae)(o)},[p,h]),m=w.useReactTable({data:ye,columns:n,state:{sorting:r?te:void 0,columnVisibility:c?E:void 0,columnOrder:p.length>0?p:void 0,...R?{pagination:ge}:{}},onSortingChange:r?ne:void 0,onPaginationChange:fe,onColumnVisibilityChange:xe,onColumnOrderChange:he,getCoreRowModel:w.getCoreRowModel(),getSortedRowModel:r?w.getSortedRowModel():void 0,getPaginationRowModel:R?w.getPaginationRowModel():void 0}),Se=l.useCallback((e,o)=>{(_??((u,g)=>ie(O=>({...O,[u]:g}))))(e,o)},[_]),ve=f.useSensors(f.useSensor(f.PointerSensor,{activationConstraint:{distance:5}}),f.useSensor(f.KeyboardSensor,{coordinateGetter:T.sortableKeyboardCoordinates})),[G,B]=l.useState(null),je=l.useCallback(e=>{B(String(e.active.id))},[]),we=l.useCallback(e=>{B(null);const{active:o,over:u}=e;if(!u||o.id===u.id)return;const g=p.length>0?p:m.getAllLeafColumns().map(Ie=>Ie.id),O=g.indexOf(String(o.id)),U=g.indexOf(String(u.id));if(O===-1||U===-1)return;const Ne=T.arrayMove(g,O,U);m.setColumnOrder(Ne)},[p,m]),C=G?m.getFlatHeaders().find(e=>e.column.id===G):null,j=l.useMemo(()=>{if(a.length===0)return new Set;const e=a[0],o=new Set;for(const u of n){const g="accessorKey"in u?String(u.accessorKey):"";g&&typeof e[g]=="number"&&o.add(g)}return o},[a,n]),I=n.some(e=>e.size!=null),Ce={table:m,columnLabels:N,setColumnLabel:Se,filters:V,setFilters:be,filterConfig:pe,enableFiltering:q},{toolbarSlots:Te,filterSlots:De,paginationSlots:_e,restSlots:Re}=Le(s);return t.jsx(Y.Provider,{value:Ce,children:t.jsxs("div",{"data-slot":"data-table",className:y.cn("w-full space-y-2",ee),children:[i,Te,De,Z?t.jsxs(f.DndContext,{sensors:ve,collisionDetection:f.closestCenter,modifiers:[Oe.restrictToHorizontalAxis],onDragStart:je,onDragEnd:we,children:[t.jsx(T.SortableContext,{items:m.getFlatHeaders().map(e=>e.column.id),strategy:T.horizontalListSortingStrategy,children:t.jsxs(d.Table,{"data-density":P,variant:A,containerClassName:F,layout:I?"fixed":void 0,children:[I&&t.jsx("colgroup",{children:m.getHeaderGroups()[0]?.headers.map(e=>t.jsx("col",{style:{width:e.column.getSize()}},e.id))}),t.jsx(d.TableHeader,{children:m.getHeaderGroups().map(e=>t.jsx(d.TableRow,{children:e.headers.map((o,u)=>t.jsx(Ee,{header:o,position:u===0?"first":u===e.headers.length-1?"last":"middle",numeric:j.has(o.column.id),truncate:v&&(o.column.columnDef.meta?.truncate??!0),children:t.jsx(W,{header:o,enableSorting:r,numericColumns:j,columnLabels:N,truncate:v&&(o.column.columnDef.meta?.truncate??!0)})},o.id))},e.id))}),t.jsx(d.TableBody,{children:t.jsx(X,{table:m,columns:n,numericColumns:j,truncate:v})})]})}),t.jsx(f.DragOverlay,{dropAnimation:null,children:C&&t.jsx("div",{className:"rounded-md border bg-background px-4 py-3 text-sm font-medium shadow-lg",children:N[C.column.id]??(typeof C.column.columnDef.header=="string"?C.column.columnDef.header:C.column.id)})})]}):t.jsxs(d.Table,{"data-density":P,variant:A,containerClassName:F,layout:I?"fixed":void 0,children:[I&&t.jsx("colgroup",{children:m.getHeaderGroups()[0]?.headers.map(e=>t.jsx("col",{style:e.column.columnDef.size==null?void 0:{width:e.column.columnDef.size}},e.id))}),t.jsx(d.TableHeader,{children:m.getHeaderGroups().map(e=>t.jsx(d.TableRow,{children:e.headers.map(o=>t.jsx(d.TableHead,{variant:j.has(o.column.id)?"numeric":void 0,truncate:v&&(o.column.columnDef.meta?.truncate??!0),children:t.jsx(W,{header:o,enableSorting:r,numericColumns:j,columnLabels:N,truncate:v&&(o.column.columnDef.meta?.truncate??!0)})},o.id))},e.id))}),t.jsx(d.TableBody,{children:t.jsx(X,{table:m,columns:n,numericColumns:j,truncate:v})})]}),_e,Re]})})}function J({className:n,children:a,...i}){return t.jsx("div",{"data-slot":"table-toolbar",className:y.cn("flex items-center justify-end gap-2",n),...i,children:a})}exports.DataTable=Ke;exports.TableToolbar=J;exports.useDataTable=Ve;
|
|
2
2
|
//# sourceMappingURL=data-table.cjs.map
|
|
@@ -1 +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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"}
|
|
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 RowData,\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// Module augmentation — column meta\n// ---------------------------------------------------------------------------\n\ndeclare module \"@tanstack/react-table\" {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface ColumnMeta<TData extends RowData, TValue> {\n truncate?: boolean\n }\n}\n\n// ---------------------------------------------------------------------------\n// Filter types\n// ---------------------------------------------------------------------------\n\ntype FilterOperator =\n | \"contains\"\n | \"equals\"\n | \"not_equals\"\n | \"starts_with\"\n | \"ends_with\"\n | \"is_empty\"\n | \"is_not_empty\"\n\ninterface FilterCondition {\n /** Stable unique key for React reconciliation. */\n id: string\n columnId: string\n operator: FilterOperator\n value: string\n}\n\ninterface FilterColumnConfig {\n columnId: string\n label?: string\n operators?: FilterOperator[]\n}\n\nfunction applyFilterCondition(\n cellValue: string,\n operator: FilterOperator,\n filterValue: string,\n): boolean {\n const cell = cellValue.toLowerCase().trim()\n const filter = filterValue.toLowerCase().trim()\n switch (operator) {\n case \"contains\": return cell.includes(filter)\n case \"equals\": return cell === filter\n case \"not_equals\": return cell !== filter\n case \"starts_with\": return cell.startsWith(filter)\n case \"ends_with\": return cell.endsWith(filter)\n case \"is_empty\": return cell === \"\"\n case \"is_not_empty\": return cell !== \"\"\n default: {\n const _exhaustive: never = operator\n void _exhaustive\n return true\n }\n }\n}\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 filters: FilterCondition[]\n setFilters: (filters: FilterCondition[]) => void\n filterConfig: FilterColumnConfig[]\n enableFiltering: boolean\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 truncate,\n}: {\n header: Header<TData, unknown>\n children: React.ReactNode\n position?: \"first\" | \"last\" | \"middle\"\n numeric?: boolean\n truncate?: 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 truncate={truncate}\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 min-w-0\", numeric && \"flex-row-reverse\")}>\n <div className=\"flex-1 min-w-0\">{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 truncate?: boolean\n}\n\nfunction SortableHeaderContent({\n header,\n enableSorting,\n numericColumns,\n columnLabels,\n truncate,\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 min-w-0\",\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 <span className={cn(\"min-w-0\", truncate && \"truncate\")}>\n {columnLabels[header.column.id] ??\n flexRender(header.column.columnDef.header, header.getContext())}\n </span>\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 truncate,\n}: {\n table: TanStackTable<TData>\n columns: ColumnDef<TData, unknown>[]\n numericColumns: Set<string>\n truncate?: boolean\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\n key={cell.id}\n variant={numericColumns.has(cell.column.id) ? \"numeric\" : undefined}\n truncate={truncate && (cell.column.columnDef.meta?.truncate ?? true)}\n >\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 filterSlots: 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 (\n React.isValidElement(child) &&\n (child.type as React.ComponentType).displayName === \"DataTableFilter\"\n ) {\n filterSlots.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, filterSlots, 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 enableFiltering?: boolean\n filters?: FilterCondition[]\n onFiltersChange?: (filters: FilterCondition[]) => void\n filterConfig?: FilterColumnConfig[]\n /** When true, filtering is handled externally — onFiltersChange fires but rows are not filtered client-side. */\n manualFiltering?: 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 truncate?: boolean\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 enableFiltering = false,\n filters: controlledFilters,\n onFiltersChange,\n filterConfig,\n manualFiltering = false,\n density = \"default\",\n className,\n variant = \"card\",\n containerClassName,\n truncate = true,\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 const [internalFilters, setInternalFilters] = React.useState<FilterCondition[]>([])\n\n const pagination = controlledPagination ?? internalPagination\n const filters = controlledFilters ?? internalFilters\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 handleFiltersChange = React.useCallback(\n (newFilters: FilterCondition[]) => {\n ;(onFiltersChange ?? setInternalFilters)(newFilters)\n },\n [onFiltersChange],\n )\n\n const resolvedFilterConfig: FilterColumnConfig[] = React.useMemo(() => {\n if (filterConfig) return filterConfig\n return columns\n .filter((col) => \"accessorKey\" in col)\n .map((col) => ({ columnId: String((col as { accessorKey: unknown }).accessorKey) }))\n }, [filterConfig, columns])\n\n const filteredData = React.useMemo((): TData[] => {\n if (!enableFiltering || manualFiltering) return data\n const active = filters.filter(\n (f) =>\n f.columnId &&\n f.operator &&\n (f.value.trim() !== \"\" || f.operator === \"is_empty\" || f.operator === \"is_not_empty\"),\n )\n if (active.length === 0) return data\n return data.filter((row) =>\n active.every((condition) => {\n const cellValue = String(\n (row as Record<string, unknown>)[condition.columnId] ?? \"\",\n )\n return applyFilterCondition(cellValue, condition.operator, condition.value)\n }),\n )\n }, [data, filters, enableFiltering, manualFiltering])\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: filteredData,\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 const hasExplicitSize = columns.some((c) => c.size != null)\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 filters,\n setFilters: handleFiltersChange,\n filterConfig: resolvedFilterConfig,\n enableFiltering,\n } as TableContextValue<unknown>\n\n const { toolbarSlots, filterSlots, 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 {filterSlots}\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\n data-density={density}\n variant={variant}\n containerClassName={containerClassName}\n layout={hasExplicitSize ? \"fixed\" : undefined}\n >\n {hasExplicitSize && (\n <colgroup>\n {table.getHeaderGroups()[0]?.headers.map((header) => (\n <col\n key={header.id}\n style={{ width: header.column.getSize() }}\n />\n ))}\n </colgroup>\n )}\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 truncate={truncate && (header.column.columnDef.meta?.truncate ?? true)}\n >\n <SortableHeaderContent\n header={header as Header<unknown, unknown>}\n enableSorting={enableSorting}\n numericColumns={numericColumns}\n columnLabels={columnLabels}\n truncate={truncate && (header.column.columnDef.meta?.truncate ?? true)}\n />\n </DraggableHeader>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n <DataTableRows table={table} columns={columns} numericColumns={numericColumns} truncate={truncate} />\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\n data-density={density}\n variant={variant}\n containerClassName={containerClassName}\n layout={hasExplicitSize ? \"fixed\" : undefined}\n >\n {hasExplicitSize && (\n <colgroup>\n {table.getHeaderGroups()[0]?.headers.map((header) => (\n <col\n key={header.id}\n style={header.column.columnDef.size == null ? undefined : { width: header.column.columnDef.size }}\n />\n ))}\n </colgroup>\n )}\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n variant={numericColumns.has(header.column.id) ? \"numeric\" : undefined}\n truncate={truncate && (header.column.columnDef.meta?.truncate ?? true)}\n >\n <SortableHeaderContent\n header={header as Header<unknown, unknown>}\n enableSorting={enableSorting}\n numericColumns={numericColumns}\n columnLabels={columnLabels}\n truncate={truncate && (header.column.columnDef.meta?.truncate ?? true)}\n />\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n <DataTableRows table={table} columns={columns} numericColumns={numericColumns} truncate={truncate} />\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 justify-end gap-2\", className)}\n {...props}\n >\n {children}\n </div>\n )\n}\n\nexport { DataTable, TableToolbar, useDataTable }\nexport type { DataTableProps, FilterCondition, FilterOperator, FilterColumnConfig }\n"],"names":["applyFilterCondition","cellValue","operator","filterValue","cell","filter","TableContext","React","useDataTable","ctx","DraggableHeader","header","children","position","numeric","truncate","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","categorizeSlots","toolbarSlots","filterSlots","paginationSlots","restSlots","child","TableToolbar","DataTablePagination","DataTable","data","toolbar","enableColumnVisibility","controlledColumnOrder","onColumnOrderChange","controlledColumnVisibility","onColumnVisibilityChange","controlledColumnLabels","onColumnLabelChange","enablePagination","defaultPageSize","controlledPagination","onPaginationChange","enableColumnReorder","enableFiltering","controlledFilters","onFiltersChange","filterConfig","manualFiltering","density","className","variant","containerClassName","sorting","setSorting","internalColumnVisibility","setInternalColumnVisibility","internalColumnOrder","setInternalColumnOrder","internalColumnLabels","setInternalColumnLabels","internalPagination","setInternalPagination","internalFilters","setInternalFilters","pagination","filters","columnVisibility","columnOrder","handlePaginationChange","updater","next","handleVisibilityChange","handleFiltersChange","newFilters","resolvedFilterConfig","col","filteredData","active","f","condition","handleColumnOrderChange","useReactTable","getCoreRowModel","getSortedRowModel","getPaginationRowModel","setColumnLabel","columnId","label","id","l","prev","reorderSensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","draggingColumnId","setDraggingColumnId","handleColumnDragStart","event","handleColumnDragEnd","over","currentOrder","column","oldIdx","newIdx","newOrder","arrayMove","draggingHeader","h","first","ids","key","hasExplicitSize","c","DndContext","closestCenter","restrictToHorizontalAxis","SortableContext","horizontalListSortingStrategy","Table","TableHeader","headerGroup","headerIdx","TableBody","DragOverlay","props"],"mappings":"usBA0FA,SAASA,GACPC,EACAC,EACAC,EACS,CACT,MAAMC,EAAOH,EAAU,YAAA,EAAc,KAAA,EAC/BI,EAASF,EAAY,YAAA,EAAc,KAAA,EACzC,OAAQD,EAAA,CACN,IAAK,WAAiB,OAAOE,EAAK,SAASC,CAAM,EACjD,IAAK,SAAiB,OAAOD,IAASC,EACtC,IAAK,aAAiB,OAAOD,IAASC,EACtC,IAAK,cAAiB,OAAOD,EAAK,WAAWC,CAAM,EACnD,IAAK,YAAiB,OAAOD,EAAK,SAASC,CAAM,EACjD,IAAK,WAAiB,OAAOD,IAAS,GACtC,IAAK,eAAiB,OAAOA,IAAS,GACtC,QAGE,MAAO,EACT,CAEJ,CAgBA,MAAME,EAAeC,EAAM,cAAiD,IAAI,EAEhF,SAASC,IAAgC,CACvC,MAAMC,EAAMF,EAAM,WAAWD,CAAY,EACzC,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,gDAAgD,EAElE,OAAOA,CACT,CAMA,SAASC,GAAuB,CAC9B,OAAAC,EACA,SAAAC,EACA,SAAAC,EACA,QAAAC,EACA,SAAAC,CACF,EAMG,CACD,KAAM,CACJ,WAAAC,EACA,UAAAC,EACA,WAAAC,EACA,UAAAC,EACA,WAAAC,EACA,WAAAC,CAAA,EACEC,EAAAA,YAAY,CAAE,GAAIX,EAAO,OAAO,GAAI,EAElCY,EAA6B,CACjC,UAAWC,GAAAA,IAAI,UAAU,SACvBL,EAAY,CAAE,GAAGA,EAAW,OAAQ,EAAG,OAAQ,GAAM,IAAA,EAEvD,WAAAC,EACA,SAAU,UAAA,EAGZ,OACEK,EAAAA,IAACC,EAAAA,UAAA,CACC,IAAKR,EACL,MAAAK,EACA,QAAST,EAAU,UAAY,OAC/B,SAAAC,EACA,UAAWY,EAAAA,GACT,8CACA,CAACN,GAAcR,IAAa,SAAW,sDACvC,CAACQ,GAAcR,IAAa,QAAU,qDACtC,CAACQ,GAAcR,IAAa,UAAY,0FACxCQ,GAAc,YAAA,EAGhB,gBAAC,MAAA,CAAI,UAAWM,KAAG,kCAAmCb,GAAW,kBAAkB,EACjF,SAAA,CAAAW,EAAAA,IAAC,MAAA,CAAI,UAAU,iBAAkB,SAAAb,CAAA,CAAS,EAC1Ca,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,mBAAiB,GACjB,UAAU,wJACT,GAAGT,EACH,GAAGC,EAEJ,SAAAQ,EAAAA,IAACG,EAAAA,iBAAA,CAAiB,UAAU,UAAA,CAAW,CAAA,CAAA,CACzC,CAAA,CACF,CAAA,CAAA,CAGN,CAcA,SAASC,EAAsB,CAC7B,OAAAlB,EACA,cAAAmB,EACA,eAAAC,EACA,aAAAC,EACA,SAAAjB,CACF,EAA+B,CAC7B,GAAIJ,EAAO,cAAe,OAAO,KACjC,MAAMsB,EAAUH,GAAiBnB,EAAO,OAAO,WAAA,EACzCuB,EAASvB,EAAO,OAAO,YAAA,EACvBwB,EAAYJ,EAAe,IAAIpB,EAAO,OAAO,EAAE,EAErD,OACEyB,EAAAA,KAAC,MAAA,CACC,UAAWT,EAAAA,GACT,kCACAM,GAAW,wCACXE,GAAa,kBAAA,EAEf,QAASF,EAAUtB,EAAO,OAAO,0BAA4B,OAC7D,UAAY0B,GAAM,EACXA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,MAAQJ,GAC1CtB,EAAO,OAAO,wBAAA,CAElB,EAEA,SAAA,CAAAc,MAAC,OAAA,CAAK,UAAWE,EAAAA,GAAG,UAAWZ,GAAY,UAAU,EAClD,WAAaJ,EAAO,OAAO,EAAE,GAC5B2B,aAAW3B,EAAO,OAAO,UAAU,OAAQA,EAAO,WAAA,CAAY,EAClE,EACCsB,GACCR,EAAAA,IAAC,OAAA,CACC,UAAWE,EAAAA,GACT,CAACO,GAAU,2DAAA,EAGZ,aAAW,MACVT,MAACc,EAAAA,YAAA,CAAY,UAAU,2BAA2B,EAChDL,IAAW,OACbT,EAAAA,IAACe,EAAAA,eAAc,UAAU,0BAAA,CAA2B,EAEpDf,EAAAA,IAACgB,EAAAA,gBAAA,CAAgB,UAAU,gCAAA,CAAiC,CAAA,CAAA,CAEhE,CAAA,CAAA,CAIR,CAEA,SAASC,EAAqB,CAAA,MAC5BC,EACA,QAAAC,EACA,eAAAb,EACA,SAAAhB,CACF,EAKG,CACD,OAAI4B,EAAM,YAAA,EAAc,KAAK,SAAW,EAEpClB,EAAAA,IAACoB,EAAAA,SAAA,CACC,SAAApB,EAAAA,IAACqB,EAAAA,UAAA,CAAU,QAASF,EAAQ,OAAQ,UAAU,yCAAyC,SAAA,aAAA,CAEvF,EACF,EAIGD,EAAM,cAAc,KAAK,IAAKI,SAClCF,EAAAA,SAAA,CAAsB,aAAYE,EAAI,cAAA,EAAkB,WAAa,OACnE,SAAAA,EAAI,kBAAkB,IAAK3C,GAC1BqB,EAAAA,IAACqB,EAAAA,UAAA,CAEC,QAASf,EAAe,IAAI3B,EAAK,OAAO,EAAE,EAAI,UAAY,OAC1D,SAAUW,IAAaX,EAAK,OAAO,UAAU,MAAM,UAAY,IAE9D,sBAAWA,EAAK,OAAO,UAAU,KAAMA,EAAK,YAAY,CAAA,EAJpDA,EAAK,EAAA,CAMb,CAAA,EATY2C,EAAI,EAUnB,CACD,CACH,CAMA,SAASC,GAAgBpC,EAA2B,CAClD,MAAMqC,EAAkC,CAAA,EAClCC,EAAiC,CAAA,EACjCC,EAAqC,CAAA,EACrCC,EAA+B,CAAA,EACrC7C,OAAAA,EAAM,SAAS,QAAQK,EAAWyC,GAAU,CACtC9C,EAAM,eAAe8C,CAAK,GAAKA,EAAM,OAASC,EAChDL,EAAa,KAAKI,CAAK,EAEvB9C,EAAM,eAAe8C,CAAK,GACzBA,EAAM,KAA6B,cAAgB,kBAEpDH,EAAY,KAAKG,CAAK,EACb9C,EAAM,eAAe8C,CAAK,GAAKA,EAAM,OAASE,uBACvDJ,EAAgB,KAAKE,CAAK,EAE1BD,EAAU,KAAKC,CAAK,CAExB,CAAC,EACM,CAAE,aAAAJ,EAAc,YAAAC,EAAa,gBAAAC,EAAiB,UAAAC,CAAA,CACvD,CAwCA,SAASI,GAAyB,CAChC,QAAAZ,EACA,KAAAa,EACA,QAAAC,EACA,cAAA5B,EAAgB,GAChB,uBAAA6B,EAAyB,GACzB,SAAA/C,EACA,YAAagD,EACb,oBAAAC,EACA,iBAAkBC,EAClB,yBAAAC,EACA,aAAcC,EACd,oBAAAC,EACA,iBAAAC,EAAmB,GACnB,gBAAAC,EAAkB,GAClB,WAAYC,EACZ,mBAAAC,EACA,oBAAAC,EAAsB,GACtB,gBAAAC,EAAkB,GAClB,QAASC,EACT,gBAAAC,EACA,aAAAC,EACA,gBAAAC,EAAkB,GAClB,QAAAC,EAAU,UACV,UAAAC,GACA,QAAAC,EAAU,OACV,mBAAAC,EACA,SAAAhE,EAAW,EACb,EAAkC,CAChC,KAAM,CAACiE,GAASC,EAAU,EAAI1E,EAAM,SAAuB,CAAA,CAAE,EACvD,CAAC2E,GAA0BC,EAA2B,EAC1D5E,EAAM,SAA0B,CAAA,CAAE,EAC9B,CAAC6E,GAAqBC,EAAsB,EAChD9E,EAAM,SAA2B,CAAA,CAAE,EAC/B,CAAC+E,GAAsBC,EAAuB,EAAIhF,EAAM,SAE5D,CAAA,CAAE,EACE,CAACiF,GAAoBC,EAAqB,EAC9ClF,EAAM,SAA0B,CAC9B,UAAW,EACX,SAAU4D,CAAA,CACX,EACG,CAACuB,GAAiBC,EAAkB,EAAIpF,EAAM,SAA4B,CAAA,CAAE,EAE5EqF,GAAaxB,GAAwBoB,GACrCK,EAAUrB,GAAqBkB,GAE/BI,EACJhC,GAA8BoB,GAC1Ba,EAAcnC,GAAyBwB,GACvCpD,EAAegC,GAA0BsB,GAEzCU,GAAyBzF,EAAM,QAAQ,IAAM,CACjD,GAAK2D,EACL,OAAIG,EACM4B,GAA4E,CAClF,MAAMC,EAAO,OAAOD,GAAY,WAAaA,EAAQ7B,CAAqB,EAAI6B,EAC9E5B,EAAmB6B,CAAI,CACzB,EAEKT,EACT,EAAG,CAACvB,EAAkBG,EAAoBD,CAAoB,CAAC,EAEzD+B,GAAyB5F,EAAM,QAAQ,IAAM,CACjD,GAAKoD,EACL,OAAQsC,GAA4E,CAClF,MAAMC,EAAO,OAAOD,GAAY,WAAaA,EAAQH,CAAgB,EAAIG,GACvElC,GAA4BoB,IAA6Be,CAAI,CACjE,CACF,EAAG,CAACvC,EAAwBmC,EAAkB/B,CAAwB,CAAC,EAEjEqC,GAAsB7F,EAAM,YAC/B8F,GAAkC,EAC/B5B,GAAmBkB,IAAoBU,CAAU,CACrD,EACA,CAAC5B,CAAe,CAAA,EAGZ6B,GAA6C/F,EAAM,QAAQ,IAC3DmE,GACG9B,EACJ,OAAQ2D,GAAQ,gBAAiBA,CAAG,EACpC,IAAKA,IAAS,CAAE,SAAU,OAAQA,EAAiC,WAAW,GAAI,EACpF,CAAC7B,EAAc9B,CAAO,CAAC,EAEpB4D,GAAejG,EAAM,QAAQ,IAAe,CAChD,GAAI,CAACgE,GAAmBI,EAAiB,OAAOlB,EAChD,MAAMgD,EAASZ,EAAQ,OACpBa,GACCA,EAAE,UACFA,EAAE,WACDA,EAAE,MAAM,KAAA,IAAW,IAAMA,EAAE,WAAa,YAAcA,EAAE,WAAa,eAAA,EAE1E,OAAID,EAAO,SAAW,EAAUhD,EACzBA,EAAK,OAAQV,GAClB0D,EAAO,MAAOE,GAAc,CAC1B,MAAM1G,EAAY,OACf8C,EAAgC4D,EAAU,QAAQ,GAAK,EAAA,EAE1D,OAAO3G,GAAqBC,EAAW0G,EAAU,SAAUA,EAAU,KAAK,CAC5E,CAAC,CAAA,CAEL,EAAG,CAAClD,EAAMoC,EAAStB,EAAiBI,CAAe,CAAC,EAE9CiC,GAA0BrG,EAAM,YACnC0F,GAA+E,CAC9E,MAAMC,EAAO,OAAOD,GAAY,WAAaA,EAAQF,CAAW,EAAIE,GAClEpC,GAAuBwB,IAAwBa,CAAI,CACvD,EACA,CAACH,EAAalC,CAAmB,CAAA,EAG7BlB,EAAQkE,EAAAA,cAAc,CAC1B,KAAML,GACN,QAAA5D,EACA,MAAO,CACL,QAASd,EAAgBkD,GAAU,OACnC,iBAAkBrB,EAAyBmC,EAAmB,OAC9D,YAAaC,EAAY,OAAS,EAAIA,EAAc,OACpD,GAAI7B,EAAmB,CAAE,WAAA0B,IAAe,CAAA,CAAC,EAE3C,gBAAiB9D,EAAgBmD,GAAa,OAC9C,mBAAoBe,GACpB,yBAA0BG,GAC1B,oBAAqBS,GACrB,gBAAiBE,EAAAA,gBAAA,EACjB,kBAAmBhF,EAAgBiF,EAAAA,kBAAA,EAAsB,OACzD,sBAAuB7C,EAAmB8C,EAAAA,wBAA0B,MAAA,CACrE,EAEKC,GAAiB1G,EAAM,YAC3B,CAAC2G,EAAkBC,IAAkB,EACjClD,IAAwB,CAACmD,EAAYC,IAAc9B,GAAyB+B,IAAU,CAAE,GAAGA,EAAM,CAACF,CAAE,EAAGC,GAAI,IAAIH,EAAUC,CAAK,CAClI,EACA,CAAClD,CAAmB,CAAA,EAGhBsD,GAAiBC,EAAAA,WACrBC,EAAAA,UAAUC,EAAAA,cAAe,CAAE,qBAAsB,CAAE,SAAU,CAAA,EAAK,EAClED,EAAAA,UAAUE,EAAAA,eAAgB,CAAE,iBAAkBC,8BAA6B,CAAA,EAGvE,CAACC,EAAkBC,CAAmB,EAAIvH,EAAM,SAAwB,IAAI,EAE5EwH,GAAwBxH,EAAM,YACjCyH,GAA0B,CACzBF,EAAoB,OAAOE,EAAM,OAAO,EAAE,CAAC,CAC7C,EACA,CAAA,CAAC,EAGGC,GAAsB1H,EAAM,YAC/ByH,GAAwB,CACvBF,EAAoB,IAAI,EACxB,KAAM,CAAE,OAAArB,EAAQ,KAAAyB,CAAA,EAASF,EACzB,GAAI,CAACE,GAAQzB,EAAO,KAAOyB,EAAK,GAAI,OACpC,MAAMC,EACJpC,EAAY,OAAS,EAAIA,EAAcpD,EAAM,kBAAA,EAAoB,IAAKyF,IAAWA,GAAO,EAAE,EACtFC,EAASF,EAAa,QAAQ,OAAO1B,EAAO,EAAE,CAAC,EAC/C6B,EAASH,EAAa,QAAQ,OAAOD,EAAK,EAAE,CAAC,EACnD,GAAIG,IAAW,IAAMC,IAAW,GAAI,OACpC,MAAMC,GAAWC,EAAAA,UAAUL,EAAcE,EAAQC,CAAM,EACvD3F,EAAM,eAAe4F,EAAQ,CAC/B,EACA,CAACxC,EAAapD,CAAK,CAAA,EAGf8F,EAAiBZ,EACnBlF,EAAM,eAAA,EAAiB,KAAM+F,GAAMA,EAAE,OAAO,KAAOb,CAAgB,EACnE,KAGE9F,EAAiBxB,EAAM,QAAQ,IAAM,CACzC,GAAIkD,EAAK,SAAW,EAAG,WAAW,IAClC,MAAMkF,EAAQlF,EAAK,CAAC,EACdmF,MAAU,IAChB,UAAWrC,KAAO3D,EAAS,CACzB,MAAMiG,EAAM,gBAAiBtC,EAAM,OAAOA,EAAI,WAAW,EAAI,GACzDsC,GAAO,OAAOF,EAAME,CAAG,GAAM,UAAUD,EAAI,IAAIC,CAAG,CACxD,CACA,OAAOD,CACT,EAAG,CAACnF,EAAMb,CAAO,CAAC,EAEZkG,EAAkBlG,EAAQ,KAAMmG,GAAMA,EAAE,MAAQ,IAAI,EAIpDtI,GAAM,CAAA,MACVkC,EACA,aAAAX,EACA,eAAAiF,GACA,QAAApB,EACA,WAAYO,GACZ,aAAcE,GACd,gBAAA/B,CAAA,EAGI,CAAE,aAAAtB,GAAc,YAAAC,GAAa,gBAAAC,GAAiB,UAAAC,EAAA,EAAcJ,GAAgBpC,CAAQ,EAE1F,OACEa,EAAAA,IAACnB,EAAa,SAAb,CAAsB,MAAOG,GAC5B,SAAA2B,EAAAA,KAAC,MAAA,CAAI,YAAU,aAAa,UAAWT,EAAAA,GAAG,mBAAoBkD,EAAS,EACpE,SAAA,CAAAnB,EACAT,GACAC,GACAoB,EACClC,EAAAA,KAAC4G,EAAAA,WAAA,CACC,QAASzB,GACT,mBAAoB0B,EAAAA,cACpB,UAAW,CAACC,GAAAA,wBAAwB,EACpC,YAAanB,GACb,UAAWE,GAEX,SAAA,CAAAxG,EAAAA,IAAC0H,EAAAA,gBAAA,CACC,MAAOxG,EAAM,iBAAiB,IAAK+F,GAAMA,EAAE,OAAO,EAAE,EACpD,SAAUU,EAAAA,8BAEV,SAAAhH,EAAAA,KAACiH,EAAAA,MAAA,CACC,eAAczE,EACd,QAAAE,EACA,mBAAAC,EACA,OAAQ+D,EAAkB,QAAU,OAEnC,SAAA,CAAAA,GACCrH,EAAAA,IAAC,WAAA,CACE,SAAAkB,EAAM,kBAAkB,CAAC,GAAG,QAAQ,IAAKhC,GACxCc,EAAAA,IAAC,MAAA,CAEC,MAAO,CAAE,MAAOd,EAAO,OAAO,SAAQ,CAAE,EADnCA,EAAO,EAAA,CAGf,EACH,EAEFc,EAAAA,IAAC6H,EAAAA,YAAA,CACE,SAAA3G,EAAM,gBAAA,EAAkB,IAAK4G,GAC5B9H,EAAAA,IAACoB,YACE,SAAA0G,EAAY,QAAQ,IAAI,CAAC5I,EAAQ6I,IAChC/H,EAAAA,IAACf,GAAA,CAEC,OAAAC,EACA,SAAU6I,IAAc,EAAI,QAAUA,IAAcD,EAAY,QAAQ,OAAS,EAAI,OAAS,SAC9F,QAASxH,EAAe,IAAIpB,EAAO,OAAO,EAAE,EAC5C,SAAUI,IAAaJ,EAAO,OAAO,UAAU,MAAM,UAAY,IAEjE,SAAAc,EAAAA,IAACI,EAAA,CACC,OAAAlB,EACA,cAAAmB,EACA,eAAAC,EACA,aAAAC,EACA,SAAUjB,IAAaJ,EAAO,OAAO,UAAU,MAAM,UAAY,GAAA,CAAA,CACnE,EAZKA,EAAO,EAAA,CAcf,GAjBY4I,EAAY,EAkB3B,CACD,CAAA,CACH,EACA9H,EAAAA,IAACgI,EAAAA,WACC,SAAAhI,MAACiB,EAAA,CAAA,MAAcC,EAAc,QAAAC,EAAkB,eAAAb,EAAgC,SAAAhB,EAAoB,CAAA,CACrG,CAAA,CAAA,CAAA,CACF,CAAA,EAEFU,EAAAA,IAACiI,EAAAA,YAAA,CAAY,cAAe,KACzB,SAAAjB,GACChH,EAAAA,IAAC,MAAA,CAAI,UAAU,0EACZ,SAAAO,EAAayG,EAAe,OAAO,EAAE,IACnC,OAAOA,EAAe,OAAO,UAAU,QAAW,SAC/CA,EAAe,OAAO,UAAU,OAChCA,EAAe,OAAO,GAAA,CAC9B,CAAA,CAEJ,CAAA,CAAA,CAAA,EAGFrG,EAAAA,KAACiH,EAAAA,MAAA,CACC,eAAczE,EACd,QAAAE,EACA,mBAAAC,EACA,OAAQ+D,EAAkB,QAAU,OAEnC,SAAA,CAAAA,GACCrH,EAAAA,IAAC,WAAA,CACE,SAAAkB,EAAM,kBAAkB,CAAC,GAAG,QAAQ,IAAKhC,GACxCc,EAAAA,IAAC,MAAA,CAEC,MAAOd,EAAO,OAAO,UAAU,MAAQ,KAAO,OAAY,CAAE,MAAOA,EAAO,OAAO,UAAU,IAAA,CAAK,EAD3FA,EAAO,EAAA,CAGf,EACH,EAEFc,EAAAA,IAAC6H,EAAAA,YAAA,CACE,SAAA3G,EAAM,gBAAA,EAAkB,IAAK4G,GAC5B9H,EAAAA,IAACoB,EAAAA,SAAA,CACE,SAAA0G,EAAY,QAAQ,IAAK5I,GACxBc,EAAAA,IAACC,EAAAA,UAAA,CAEC,QAASK,EAAe,IAAIpB,EAAO,OAAO,EAAE,EAAI,UAAY,OAC5D,SAAUI,IAAaJ,EAAO,OAAO,UAAU,MAAM,UAAY,IAEjE,SAAAc,EAAAA,IAACI,EAAA,CACC,OAAAlB,EACA,cAAAmB,EACA,eAAAC,EACA,aAAAC,EACA,SAAUjB,IAAaJ,EAAO,OAAO,UAAU,MAAM,UAAY,GAAA,CAAA,CACnE,EAVKA,EAAO,EAAA,CAYf,GAfY4I,EAAY,EAgB3B,CACD,CAAA,CACH,EACA9H,EAAAA,IAACgI,EAAAA,WACC,SAAAhI,MAACiB,EAAA,CAAA,MAAcC,EAAc,QAAAC,EAAkB,eAAAb,EAAgC,SAAAhB,EAAoB,CAAA,CACrG,CAAA,CAAA,CAAA,EAGHoC,GACAC,EAAA,CAAA,CACH,CAAA,CACF,CAEJ,CAMA,SAASE,EAAa,CACpB,UAAAuB,EACA,SAAAjE,EACA,GAAG+I,CACL,EAAgC,CAC9B,OACElI,EAAAA,IAAC,MAAA,CACC,YAAU,gBACV,UAAWE,EAAAA,GAAG,sCAAuCkD,CAAS,EAC7D,GAAG8E,EAEH,SAAA/I,CAAA,CAAA,CAGP"}
|