@nocoo/basalt 2.1.0 → 2.1.7
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/ai/COMPATIBILITY.md +1 -1
- package/ai/INTEGRATION.md +17 -1
- package/ai/USAGE.md +1 -1
- package/ai/registry.json +80 -80
- package/dist/assets/brand-mark.d.ts +1 -1
- package/dist/assets/brand-mark.js +1 -1
- package/dist/assets/brand-mark.js.map +1 -1
- package/dist/charts/charts.d.ts +1 -1
- package/dist/charts/charts.js +3 -16
- package/dist/charts/charts.js.map +1 -1
- package/dist/charts/custom-chart.d.ts +1 -1
- package/dist/charts/custom-chart.js +3 -16
- package/dist/charts/custom-chart.js.map +1 -1
- package/dist/charts/grouped-bar.d.ts +1 -1
- package/dist/charts/grouped-bar.js +11 -48
- package/dist/charts/grouped-bar.js.map +1 -1
- package/dist/charts/heatmap-calendar.js +80 -136
- package/dist/charts/heatmap-calendar.js.map +1 -1
- package/dist/charts/slot-bar.js +2 -12
- package/dist/charts/slot-bar.js.map +1 -1
- package/dist/charts/stat-card.js +2 -7
- package/dist/charts/stat-card.js.map +1 -1
- package/dist/charts/timeseries.d.ts +1 -1
- package/dist/charts/timeseries.js +3 -16
- package/dist/charts/timeseries.js.map +1 -1
- package/dist/charts/tooltip.js +13 -51
- package/dist/charts/tooltip.js.map +1 -1
- package/dist/components/app-shell.js +2 -2
- package/dist/components/app-shell.js.map +1 -1
- package/dist/components/autocomplete.d.ts +1 -1
- package/dist/components/autocomplete.js +3 -16
- package/dist/components/autocomplete.js.map +1 -1
- package/dist/components/badge.js +6 -6
- package/dist/components/badge.js.map +1 -1
- package/dist/components/banner.js +28 -28
- package/dist/components/banner.js.map +1 -1
- package/dist/components/button.js +6 -7
- package/dist/components/button.js.map +1 -1
- package/dist/components/chat-composer.js +1 -2
- package/dist/components/chat-composer.js.map +1 -1
- package/dist/components/checkbox.js +50 -82
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/code.js +1 -1
- package/dist/components/code.js.map +1 -1
- package/dist/components/combobox.d.ts +1 -1
- package/dist/components/combobox.js +3 -16
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/context-menu.d.ts +1 -67
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/data-table.js +111 -123
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/date-picker.js +236 -245
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/dock.js +15 -16
- package/dist/components/dock.js.map +1 -1
- package/dist/components/field.js +20 -23
- package/dist/components/field.js.map +1 -1
- package/dist/components/layer-card.d.ts +1 -1
- package/dist/components/layer-card.js +44 -51
- package/dist/components/layer-card.js.map +1 -1
- package/dist/components/sidebar.js +3 -3
- package/dist/components/sidebar.js.map +1 -1
- package/dist/components/skeleton-line.d.ts +2 -2
- package/dist/components/skeleton-line.js +1 -1
- package/dist/components/skeleton-line.js.map +1 -1
- package/dist/components/switch.js +46 -78
- package/dist/components/switch.js.map +1 -1
- package/dist/providers/accent.js +89 -198
- package/dist/providers/accent.js.map +1 -1
- package/dist/providers/theme.js +46 -144
- package/dist/providers/theme.js.map +1 -1
- package/dist/styles/standalone.css +12 -24
- package/dist/styles/tokens.css +6 -6
- package/dist/utils/preference-store.d.ts +16 -0
- package/dist/utils/preference-store.js +106 -0
- package/dist/utils/preference-store.js.map +1 -0
- package/dist/utils/use-checkable-group.d.ts +19 -0
- package/dist/utils/use-checkable-group.js +61 -0
- package/dist/utils/use-checkable-group.js.map +1 -0
- package/package.json +1 -2
|
@@ -4,31 +4,23 @@ import { Button as t } from "./button.js";
|
|
|
4
4
|
import { SkeletonLine as n } from "./skeleton-line.js";
|
|
5
5
|
import { Pagination as r } from "./pagination.js";
|
|
6
6
|
import { Table as i, TableBody as a, TableCell as o, TableHead as s, TableHeader as c, TableRow as l } from "./table.js";
|
|
7
|
-
import { useCallback as u, useEffect as d, useLayoutEffect as
|
|
8
|
-
import { jsx as
|
|
7
|
+
import { useCallback as u, useEffect as d, useLayoutEffect as ee, useMemo as te, useRef as f, useState as p } from "react";
|
|
8
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
9
9
|
//#region src/components/data-table.tsx
|
|
10
|
-
function
|
|
11
|
-
return typeof e == "bigint" ? e : typeof e == "number" && Number.isFinite(e) && Number.isInteger(e) ? BigInt(e) : null;
|
|
12
|
-
}
|
|
13
|
-
function v(e, t) {
|
|
14
|
-
let n = BigInt(Math.trunc(e));
|
|
15
|
-
return n < t ? -1 : n > t || e > Number(n) ? 1 : -1;
|
|
16
|
-
}
|
|
17
|
-
function y(e) {
|
|
10
|
+
function g(e) {
|
|
18
11
|
return e === -Infinity ? 0 : typeof e == "bigint" || typeof e == "number" && Number.isFinite(e) ? 1 : e === Infinity ? 2 : typeof e == "number" ? 3 : typeof e == "string" ? 4 : 5;
|
|
19
12
|
}
|
|
20
|
-
function
|
|
21
|
-
let n =
|
|
13
|
+
function ne(e, t) {
|
|
14
|
+
let n = g(e), r = g(t);
|
|
22
15
|
if (n !== r) return n - r;
|
|
23
16
|
if (n === 1) {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
return n !== null && r !== null ? n < r ? -1 : +(n > r) : typeof e == "number" && typeof t == "bigint" ? v(e, t) : typeof e == "bigint" && typeof t == "number" ? -v(t, e) : e - t;
|
|
17
|
+
let n = e, r = t;
|
|
18
|
+
return n < r ? -1 : +(n > r);
|
|
27
19
|
}
|
|
28
20
|
let i = String(e), a = String(t);
|
|
29
21
|
return i < a ? -1 : +(i > a);
|
|
30
22
|
}
|
|
31
|
-
function
|
|
23
|
+
function re(e, t, n, r) {
|
|
32
24
|
if (e === null) return "prim:null";
|
|
33
25
|
if (e === void 0) return "prim:undefined";
|
|
34
26
|
if (typeof e == "symbol") {
|
|
@@ -38,225 +30,221 @@ function ne(e, t, n, r) {
|
|
|
38
30
|
let i = typeof e;
|
|
39
31
|
return i === "number" ? Object.is(e, -0) ? "prim:number:-0" : `prim:number:${String(e)}` : i === "string" || i === "bigint" || i === "boolean" ? `prim:${i}:${String(e)}` : `prim:${t}`;
|
|
40
32
|
}
|
|
41
|
-
function
|
|
33
|
+
function _(e) {
|
|
42
34
|
return e.startsWith("dup:") || e.startsWith("gen:");
|
|
43
35
|
}
|
|
44
|
-
function
|
|
45
|
-
return e.startsWith("id:") || e.startsWith("get:");
|
|
46
|
-
}
|
|
47
|
-
function b(e) {
|
|
36
|
+
function v(e) {
|
|
48
37
|
return typeof e == "function" || typeof e == "object" && !!e;
|
|
49
38
|
}
|
|
50
|
-
function
|
|
39
|
+
function ie(e, t) {
|
|
51
40
|
if (e.filterValue) return String(e.filterValue(t));
|
|
52
41
|
if (e.sortValue) return String(e.sortValue(t));
|
|
53
42
|
let n = e.accessor(t);
|
|
54
43
|
return typeof n == "string" || typeof n == "number" || typeof n == "bigint" ? String(n) : "";
|
|
55
44
|
}
|
|
56
|
-
function
|
|
45
|
+
function y(e, t, n, r) {
|
|
57
46
|
let i = r?.(e, t);
|
|
58
|
-
return i === void 0 ?
|
|
47
|
+
return i === void 0 ? v(e) && "id" in e && e.id != null ? String(e.id) : n : i;
|
|
59
48
|
}
|
|
60
|
-
function
|
|
61
|
-
let [he, ge] =
|
|
62
|
-
|
|
63
|
-
}, [ve, ye] =
|
|
49
|
+
function b({ data: g, columns: b, filter: ae = "", loading: x = !1, empty: oe = "No results", selected: S, defaultSelected: C, onSelectedChange: w, multiple: se = !1, page: T, defaultPage: ce = 1, pageSize: E, onPageChange: le, getRowId: D, className: ue, sort: O, defaultSort: de = null, onSortChange: fe, manualSorting: k = !1, manualPagination: A = !1, manualFiltering: j = !1, total: M, error: N, onRetry: P, retryLabel: pe = "Try again", "aria-label": F = "Data table", "aria-describedby": me }) {
|
|
50
|
+
let [he, ge] = p(de), I = O === void 0 ? he : O, _e = (e) => {
|
|
51
|
+
O === void 0 && ge(e), fe?.(e);
|
|
52
|
+
}, [ve, ye] = p(C ?? []), [L, be] = p(ce), R = f(/* @__PURE__ */ new WeakMap()), z = f(0), B = f(/* @__PURE__ */ new WeakMap()), V = f(/* @__PURE__ */ new Map()), H = f(/* @__PURE__ */ new Map()), U = f(/* @__PURE__ */ new Map()), xe = f(/* @__PURE__ */ new Map()), W = ae.trim().toLowerCase(), G = te(() => {
|
|
64
53
|
let e = (e) => {
|
|
65
|
-
let t =
|
|
66
|
-
return t || (t = `basalt-row-${z.current++}`,
|
|
54
|
+
let t = R.current.get(e);
|
|
55
|
+
return t || (t = `basalt-row-${z.current++}`, R.current.set(e, t)), t;
|
|
67
56
|
}, t = (e, t) => {
|
|
68
|
-
let n =
|
|
57
|
+
let n = D?.(e, t);
|
|
69
58
|
if (n !== void 0) return `get:${n}`;
|
|
70
|
-
if (
|
|
59
|
+
if (v(e) && "id" in e) {
|
|
71
60
|
let t = e.id;
|
|
72
61
|
if (t != null) return `id:${String(t)}`;
|
|
73
62
|
}
|
|
74
|
-
}, n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), s =
|
|
75
|
-
if (!
|
|
76
|
-
let
|
|
77
|
-
|
|
78
|
-
let
|
|
79
|
-
if (
|
|
80
|
-
let e = i.get(
|
|
81
|
-
e.push(
|
|
63
|
+
}, n = /* @__PURE__ */ new Set(), r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Map(), s = (e, n, s, c) => {
|
|
64
|
+
if (!c) return;
|
|
65
|
+
let l = a.get(c) ?? [];
|
|
66
|
+
l.push(s), a.set(c, l), o.set(s, c);
|
|
67
|
+
let u = t(e, n);
|
|
68
|
+
if (u && (r.set(u, s), _(s))) {
|
|
69
|
+
let e = i.get(u) ?? [];
|
|
70
|
+
e.push(s), i.set(u, e);
|
|
82
71
|
}
|
|
83
|
-
},
|
|
84
|
-
let n =
|
|
85
|
-
return n &&
|
|
72
|
+
}, c = /* @__PURE__ */ new WeakMap(), l = g.map((e, t) => {
|
|
73
|
+
let n = v(e) ? e : null, r = n ? c.get(n) ?? 0 : 0;
|
|
74
|
+
return n && c.set(n, r + 1), {
|
|
86
75
|
row: e,
|
|
87
76
|
index: t,
|
|
88
77
|
occurrence: r,
|
|
89
78
|
key: void 0
|
|
90
79
|
};
|
|
91
80
|
});
|
|
92
|
-
for (let e of
|
|
93
|
-
let t =
|
|
81
|
+
for (let e of l) {
|
|
82
|
+
let t = v(e.row) ? e.row : null;
|
|
94
83
|
if (!t) continue;
|
|
95
84
|
let r = B.current.get(t)?.[e.occurrence];
|
|
96
85
|
!r || n.has(r) || V.current.get(r) === t && (e.key = r, n.add(r));
|
|
97
86
|
}
|
|
98
|
-
let
|
|
99
|
-
let
|
|
100
|
-
if (o) return
|
|
87
|
+
let u = l.map(({ row: r, index: i, occurrence: a, key: o }) => {
|
|
88
|
+
let c = v(r) ? r : null;
|
|
89
|
+
if (o) return s(r, i, o, c), {
|
|
101
90
|
row: r,
|
|
102
91
|
key: o,
|
|
103
|
-
selectId:
|
|
92
|
+
selectId: y(r, i, o, D)
|
|
104
93
|
};
|
|
105
94
|
let l = a > 0, u, d = t(r, i);
|
|
106
|
-
if (d && (u = d),
|
|
107
|
-
let t = e(
|
|
95
|
+
if (d && (u = d), c) {
|
|
96
|
+
let t = e(c);
|
|
108
97
|
if (!u) u = l ? `gen:${t}#${a}` : `gen:${t}`;
|
|
109
98
|
else if (n.has(u) || l) u = (U.current.get(u) ?? []).find((e) => !n.has(e)) ?? (l ? `dup:${t}#${a}` : `dup:${t}`);
|
|
110
99
|
else {
|
|
111
100
|
let e = H.current.get(u);
|
|
112
|
-
e && !n.has(e) &&
|
|
101
|
+
e && !n.has(e) && _(e) && (u = e);
|
|
113
102
|
}
|
|
114
103
|
}
|
|
115
|
-
if (u ??=
|
|
104
|
+
if (u ??= re(r, i, xe.current, z), n.has(u)) {
|
|
116
105
|
let e = 0, t = `occ:${u}#${e}`;
|
|
117
106
|
for (; n.has(t);) e += 1, t = `occ:${u}#${e}`;
|
|
118
107
|
u = t;
|
|
119
108
|
}
|
|
120
|
-
return n.add(u),
|
|
109
|
+
return n.add(u), s(r, i, u, c), {
|
|
121
110
|
row: r,
|
|
122
111
|
key: u,
|
|
123
|
-
selectId:
|
|
112
|
+
selectId: y(r, i, u, D)
|
|
124
113
|
};
|
|
125
|
-
}),
|
|
114
|
+
}), d = W && !j ? u.filter(({ row: e }) => b.some((t) => ie(t, e).toLowerCase().includes(W))) : u;
|
|
126
115
|
return {
|
|
127
116
|
rows: (() => {
|
|
128
|
-
if (!
|
|
129
|
-
let e =
|
|
130
|
-
return e ? [...
|
|
131
|
-
let r =
|
|
132
|
-
return
|
|
133
|
-
}) :
|
|
117
|
+
if (!I || k) return d;
|
|
118
|
+
let e = b.find((e) => e.id === I.id);
|
|
119
|
+
return e ? [...d].sort((t, n) => {
|
|
120
|
+
let r = ne(e.sortValue?.(t.row) ?? e.accessor(t.row), e.sortValue?.(n.row) ?? e.accessor(n.row));
|
|
121
|
+
return I.dir === "asc" ? r : -r;
|
|
122
|
+
}) : d;
|
|
134
123
|
})(),
|
|
135
124
|
assigned: a,
|
|
136
125
|
owner: o,
|
|
137
|
-
canonical: s,
|
|
138
126
|
lastKey: r,
|
|
139
127
|
dups: i
|
|
140
128
|
};
|
|
141
129
|
}, [
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
130
|
+
b,
|
|
131
|
+
g,
|
|
132
|
+
D,
|
|
145
133
|
W,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
134
|
+
I,
|
|
135
|
+
j,
|
|
136
|
+
k
|
|
149
137
|
]);
|
|
150
|
-
|
|
138
|
+
ee(() => {
|
|
151
139
|
for (let [e, t] of G.assigned) B.current.set(e, t);
|
|
152
|
-
V.current = G.owner,
|
|
140
|
+
V.current = G.owner, H.current = G.lastKey, U.current = G.dups;
|
|
153
141
|
}, [G]);
|
|
154
|
-
let K =
|
|
155
|
-
|
|
156
|
-
}, [
|
|
157
|
-
|
|
158
|
-
}, [le,
|
|
142
|
+
let K = S !== void 0 || C !== void 0 || w !== void 0, q = S ?? ve, J = u((e) => {
|
|
143
|
+
S === void 0 && ye(e), w?.(e);
|
|
144
|
+
}, [w, S]), Se = A && M !== void 0 ? Math.max(0, M) : G.rows.length, Y = E && E > 0 ? Math.max(1, Math.ceil(Se / E)) : 1, X = Math.min(Y, Math.max(1, T ?? L)), Z = u((e) => {
|
|
145
|
+
T === void 0 && be(e), le?.(e);
|
|
146
|
+
}, [le, T]), Q = f(null);
|
|
159
147
|
d(() => {
|
|
160
|
-
let e =
|
|
161
|
-
if (e ===
|
|
162
|
-
|
|
148
|
+
let e = T ?? L;
|
|
149
|
+
if (e === X || x) {
|
|
150
|
+
Q.current = null;
|
|
163
151
|
return;
|
|
164
152
|
}
|
|
165
|
-
let t = `${e}:${
|
|
166
|
-
|
|
153
|
+
let t = `${e}:${X}`;
|
|
154
|
+
Q.current !== t && (Q.current = t, Z(X));
|
|
167
155
|
}, [
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
156
|
+
T,
|
|
157
|
+
L,
|
|
158
|
+
X,
|
|
159
|
+
x,
|
|
160
|
+
Z
|
|
173
161
|
]);
|
|
174
|
-
let
|
|
162
|
+
let Ce = !A && E && E > 0 ? G.rows.slice((X - 1) * E, X * E) : G.rows, $ = b.length + +!!K, we = (e) => {
|
|
175
163
|
if (se) {
|
|
176
164
|
J(q.includes(e) ? q.filter((t) => t !== e) : [...q, e]);
|
|
177
165
|
return;
|
|
178
166
|
}
|
|
179
167
|
J(q.includes(e) ? [] : [e]);
|
|
180
168
|
};
|
|
181
|
-
return /* @__PURE__ */
|
|
169
|
+
return /* @__PURE__ */ h("div", {
|
|
182
170
|
className: "flex min-w-0 flex-col gap-3",
|
|
183
|
-
children: [/* @__PURE__ */
|
|
171
|
+
children: [/* @__PURE__ */ m("div", {
|
|
184
172
|
role: "region",
|
|
185
|
-
"aria-label": `${
|
|
173
|
+
"aria-label": `${F} scroll area`,
|
|
186
174
|
tabIndex: 0,
|
|
187
175
|
className: "min-w-0 overflow-x-auto rounded-basalt-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-basalt-primary",
|
|
188
|
-
children: /* @__PURE__ */
|
|
176
|
+
children: /* @__PURE__ */ h(i, {
|
|
189
177
|
className: e("w-full", ue),
|
|
190
|
-
"aria-label":
|
|
178
|
+
"aria-label": F,
|
|
191
179
|
"aria-describedby": me,
|
|
192
|
-
"aria-busy":
|
|
193
|
-
children: [/* @__PURE__ */
|
|
180
|
+
"aria-busy": x || void 0,
|
|
181
|
+
children: [/* @__PURE__ */ m(c, { children: /* @__PURE__ */ h(l, { children: [K ? /* @__PURE__ */ m(s, { children: /* @__PURE__ */ m("span", {
|
|
194
182
|
className: "sr-only",
|
|
195
183
|
children: "Select"
|
|
196
|
-
}) }) : null,
|
|
184
|
+
}) }) : null, b.map((e) => /* @__PURE__ */ m(s, {
|
|
197
185
|
className: e.headerClassName,
|
|
198
186
|
style: { width: e.width },
|
|
199
187
|
scope: "col",
|
|
200
|
-
"aria-sort": e.sortable === !1 ? void 0 :
|
|
201
|
-
children: e.sortable === !1 ? e.headerContent ?? e.header : /* @__PURE__ */
|
|
188
|
+
"aria-sort": e.sortable === !1 ? void 0 : I?.id === e.id ? I.dir === "asc" ? "ascending" : "descending" : "none",
|
|
189
|
+
children: e.sortable === !1 ? e.headerContent ?? e.header : /* @__PURE__ */ h("button", {
|
|
202
190
|
type: "button",
|
|
203
191
|
"aria-label": e.header,
|
|
204
192
|
className: "appearance-none border-0 bg-transparent p-0 font-inherit text-inherit font-medium cursor-pointer rounded-sm focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-basalt-primary",
|
|
205
|
-
onClick: () => _e(
|
|
193
|
+
onClick: () => _e(I?.id === e.id && I.dir === "asc" ? {
|
|
206
194
|
id: e.id,
|
|
207
195
|
dir: "desc"
|
|
208
196
|
} : {
|
|
209
197
|
id: e.id,
|
|
210
198
|
dir: "asc"
|
|
211
199
|
}),
|
|
212
|
-
children: [e.headerContent ?? e.header,
|
|
200
|
+
children: [e.headerContent ?? e.header, I?.id === e.id ? I.dir === "asc" ? " ↑" : " ↓" : ""]
|
|
213
201
|
})
|
|
214
|
-
}, e.id))] }) }), /* @__PURE__ */
|
|
202
|
+
}, e.id))] }) }), /* @__PURE__ */ m(a, { children: x ? /* @__PURE__ */ m(l, { children: /* @__PURE__ */ m(o, {
|
|
215
203
|
colSpan: $,
|
|
216
|
-
children: /* @__PURE__ */
|
|
204
|
+
children: /* @__PURE__ */ h("div", {
|
|
217
205
|
role: "status",
|
|
218
206
|
className: "flex flex-col gap-2 py-2",
|
|
219
207
|
children: [
|
|
220
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ m("span", {
|
|
221
209
|
className: "sr-only",
|
|
222
210
|
children: "Loading"
|
|
223
211
|
}),
|
|
224
|
-
/* @__PURE__ */
|
|
225
|
-
/* @__PURE__ */
|
|
226
|
-
/* @__PURE__ */
|
|
212
|
+
/* @__PURE__ */ m(n, {}),
|
|
213
|
+
/* @__PURE__ */ m(n, {}),
|
|
214
|
+
/* @__PURE__ */ m(n, {})
|
|
227
215
|
]
|
|
228
216
|
})
|
|
229
|
-
}) }) :
|
|
217
|
+
}) }) : N != null && N !== !1 ? /* @__PURE__ */ m(l, { children: /* @__PURE__ */ m(o, {
|
|
230
218
|
colSpan: $,
|
|
231
|
-
children: /* @__PURE__ */
|
|
219
|
+
children: /* @__PURE__ */ h("div", {
|
|
232
220
|
role: "alert",
|
|
233
221
|
className: "flex flex-wrap items-center justify-between gap-3 py-6",
|
|
234
|
-
children: [/* @__PURE__ */
|
|
222
|
+
children: [/* @__PURE__ */ m("div", { children: N }), P ? /* @__PURE__ */ m(t, {
|
|
235
223
|
variant: "outline",
|
|
236
224
|
size: "sm",
|
|
237
|
-
onClick:
|
|
225
|
+
onClick: P,
|
|
238
226
|
children: pe
|
|
239
227
|
}) : null]
|
|
240
228
|
})
|
|
241
|
-
}) }) :
|
|
229
|
+
}) }) : Ce.length === 0 ? /* @__PURE__ */ m(l, { children: /* @__PURE__ */ m(o, {
|
|
242
230
|
colSpan: $,
|
|
243
|
-
children: /* @__PURE__ */
|
|
231
|
+
children: /* @__PURE__ */ m("div", {
|
|
244
232
|
role: "status",
|
|
245
233
|
children: oe
|
|
246
234
|
})
|
|
247
|
-
}) }) :
|
|
235
|
+
}) }) : Ce.map(({ row: e, key: t, selectId: n }) => {
|
|
248
236
|
let r = q.includes(n);
|
|
249
|
-
return /* @__PURE__ */
|
|
237
|
+
return /* @__PURE__ */ h(l, {
|
|
250
238
|
variant: r ? "selected" : "default",
|
|
251
239
|
"aria-selected": K ? r : void 0,
|
|
252
|
-
children: [K ? /* @__PURE__ */
|
|
240
|
+
children: [K ? /* @__PURE__ */ m(o, { children: /* @__PURE__ */ m("input", {
|
|
253
241
|
type: "checkbox",
|
|
254
242
|
checked: r,
|
|
255
243
|
"aria-label": `Select ${n}`,
|
|
256
|
-
onChange: () =>
|
|
257
|
-
}) }) : null,
|
|
244
|
+
onChange: () => we(n)
|
|
245
|
+
}) }) : null, b.map((t) => {
|
|
258
246
|
let n = t.accessor(e);
|
|
259
|
-
return /* @__PURE__ */
|
|
247
|
+
return /* @__PURE__ */ m(o, {
|
|
260
248
|
className: t.cellClassName,
|
|
261
249
|
children: typeof n == "bigint" ? String(n) : n
|
|
262
250
|
}, t.id);
|
|
@@ -264,15 +252,15 @@ function S({ data: _, columns: v, filter: y = "", loading: S = !1, empty: oe = "
|
|
|
264
252
|
}, t);
|
|
265
253
|
}) })]
|
|
266
254
|
})
|
|
267
|
-
}),
|
|
268
|
-
page:
|
|
269
|
-
pageCount:
|
|
270
|
-
disabled:
|
|
271
|
-
onPageChange:
|
|
255
|
+
}), E && E > 0 ? /* @__PURE__ */ m(r, {
|
|
256
|
+
page: X,
|
|
257
|
+
pageCount: Y,
|
|
258
|
+
disabled: x,
|
|
259
|
+
onPageChange: Z
|
|
272
260
|
}) : null]
|
|
273
261
|
});
|
|
274
262
|
}
|
|
275
263
|
//#endregion
|
|
276
|
-
export {
|
|
264
|
+
export { b as DataTable };
|
|
277
265
|
|
|
278
266
|
//# sourceMappingURL=data-table.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.js","names":[],"sources":["../../src/components/data-table.tsx"],"sourcesContent":["import {\n\ttype CSSProperties,\n\ttype ReactNode,\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button } from \"./button\";\nimport { Pagination } from \"./pagination\";\nimport { SkeletonLine } from \"./skeleton-line\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"./table\";\n\nexport type DataTableColumn<T> = {\n\tid: string;\n\theader: string;\n\taccessor: (row: T) => ReactNode;\n\tsortValue?: (row: T) => string | number | bigint;\n\tfilterValue?: (row: T) => string | number | bigint;\n\t/** Rich header content; header remains the plain text accessible name. */\n\theaderContent?: ReactNode;\n\t/** Whether the header changes sorting. @default true */\n\tsortable?: boolean;\n\t/** Width of the header and its column. */\n\twidth?: CSSProperties[\"width\"];\n\t/** Classes applied to the header cell. */\n\theaderClassName?: string;\n\t/** Classes applied to each data cell. */\n\tcellClassName?: string;\n};\n\nexport type DataTableSort = { id: string; dir: \"asc\" | \"desc\" };\n\nfunction asBigint(value: unknown): bigint | null {\n\tif (typeof value === \"bigint\") {\n\t\treturn value;\n\t}\n\tif (typeof value === \"number\" && Number.isFinite(value) && Number.isInteger(value)) {\n\t\treturn BigInt(value);\n\t}\n\treturn null;\n}\n\nfunction compareNumberAndBigint(num: number, big: bigint): number {\n\tconst truncated = BigInt(Math.trunc(num));\n\tif (truncated < big) {\n\t\treturn -1;\n\t}\n\tif (truncated > big) {\n\t\treturn 1;\n\t}\n\treturn num > Number(truncated) ? 1 : -1;\n}\n\nfunction rank(value: unknown): number {\n\tif (value === Number.NEGATIVE_INFINITY) {\n\t\treturn 0;\n\t}\n\tif (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isFinite(value))) {\n\t\treturn 1;\n\t}\n\tif (value === Number.POSITIVE_INFINITY) {\n\t\treturn 2;\n\t}\n\tif (typeof value === \"number\") {\n\t\treturn 3;\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn 4;\n\t}\n\treturn 5;\n}\n\nfunction compareUnknown(left: unknown, right: unknown): number {\n\tconst leftRank = rank(left);\n\tconst rightRank = rank(right);\n\tif (leftRank !== rightRank) {\n\t\treturn leftRank - rightRank;\n\t}\n\tif (leftRank === 1) {\n\t\tif (typeof left === \"bigint\" && typeof right === \"bigint\") {\n\t\t\treturn left < right ? -1 : left > right ? 1 : 0;\n\t\t}\n\t\tconst leftInt = asBigint(left);\n\t\tconst rightInt = asBigint(right);\n\t\tif (leftInt !== null && rightInt !== null) {\n\t\t\treturn leftInt < rightInt ? -1 : leftInt > rightInt ? 1 : 0;\n\t\t}\n\t\tif (typeof left === \"number\" && typeof right === \"bigint\") {\n\t\t\treturn compareNumberAndBigint(left, right);\n\t\t}\n\t\tif (typeof left === \"bigint\" && typeof right === \"number\") {\n\t\t\treturn -compareNumberAndBigint(right, left);\n\t\t}\n\t\treturn (left as number) - (right as number);\n\t}\n\tconst leftStr = String(left);\n\tconst rightStr = String(right);\n\treturn leftStr < rightStr ? -1 : leftStr > rightStr ? 1 : 0;\n}\n\nfunction primitiveKey(\n\trow: unknown,\n\tindex: number,\n\tsymbols: Map<symbol, string>,\n\tseq: { current: number },\n): string {\n\tif (row === null) {\n\t\treturn \"prim:null\";\n\t}\n\tif (row === undefined) {\n\t\treturn \"prim:undefined\";\n\t}\n\tif (typeof row === \"symbol\") {\n\t\tlet key = symbols.get(row);\n\t\tif (!key) {\n\t\t\tkey = `prim:symbol:${seq.current++}`;\n\t\t\tsymbols.set(row, key);\n\t\t}\n\t\treturn key;\n\t}\n\tconst type = typeof row;\n\tif (type === \"number\") {\n\t\tif (Object.is(row, -0)) {\n\t\t\treturn \"prim:number:-0\";\n\t\t}\n\t\treturn `prim:number:${String(row)}`;\n\t}\n\tif (type === \"string\" || type === \"bigint\" || type === \"boolean\") {\n\t\treturn `prim:${type}:${String(row)}`;\n\t}\n\treturn `prim:${index}`;\n}\n\nfunction isInstanceKey(key: string) {\n\treturn key.startsWith(\"dup:\") || key.startsWith(\"gen:\");\n}\n\nfunction isCanonicalKey(key: string) {\n\treturn key.startsWith(\"id:\") || key.startsWith(\"get:\");\n}\n\nfunction isRefRow(row: unknown): row is object {\n\treturn typeof row === \"function\" || (typeof row === \"object\" && row !== null);\n}\n\nfunction filterSource<T>(column: DataTableColumn<T>, row: T): string {\n\tif (column.filterValue) {\n\t\treturn String(column.filterValue(row));\n\t}\n\tif (column.sortValue) {\n\t\treturn String(column.sortValue(row));\n\t}\n\tconst rendered = column.accessor(row);\n\tif (\n\t\ttypeof rendered === \"string\" ||\n\t\ttypeof rendered === \"number\" ||\n\t\ttypeof rendered === \"bigint\"\n\t) {\n\t\treturn String(rendered);\n\t}\n\treturn \"\";\n}\n\nfunction publicSelectId<T>(\n\trow: T,\n\tindex: number,\n\tkey: string,\n\tgetRowId?: (row: T, index: number) => string,\n): string {\n\tconst requested = getRowId?.(row, index);\n\tif (requested !== undefined) {\n\t\treturn requested;\n\t}\n\tif (isRefRow(row) && \"id\" in row && row.id != null) {\n\t\treturn String(row.id);\n\t}\n\treturn key;\n}\n\nexport type DataTableProps<T = unknown> = {\n\t/**\n\t * Rows to render.\n\t */\n\tdata: T[];\n\t/**\n\t * Column descriptors.\n\t */\n\tcolumns: DataTableColumn<T>[];\n\t/**\n\t * Filter query matched against column values.\n\t * @default \"\"\n\t */\n\tfilter?: string;\n\t/**\n\t * Replace rows with a loading placeholder.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Copy shown when no rows remain after filtering.\n\t * @default \"No results\"\n\t */\n\tempty?: ReactNode;\n\t/**\n\t * Controlled selected row ids.\n\t */\n\tselected?: string[];\n\t/**\n\t * Uncontrolled initial selected row ids.\n\t */\n\tdefaultSelected?: string[];\n\t/**\n\t * Called when selected row ids change.\n\t */\n\tonSelectedChange?: (ids: string[]) => void;\n\t/**\n\t * Allow more than one selected row.\n\t * @default false\n\t */\n\tmultiple?: boolean;\n\t/**\n\t * Controlled 1-based page. Used with pageSize.\n\t */\n\tpage?: number;\n\t/**\n\t * Uncontrolled initial page.\n\t * @default 1\n\t */\n\tdefaultPage?: number;\n\t/**\n\t * Rows per page. Omit to show every row.\n\t */\n\tpageSize?: number;\n\t/**\n\t * Called when the page changes.\n\t */\n\tonPageChange?: (page: number) => void;\n\t/**\n\t * Stable id for a row.\n\t */\n\tgetRowId?: (row: T, index: number) => string;\n\t/**\n\t * Additional classes for the table.\n\t */\n\tclassName?: string;\n\t/** Controlled sorting. null explicitly disables sorting. */\n\tsort?: DataTableSort | null;\n\t/** Initial sorting for uncontrolled usage. @default null */\n\tdefaultSort?: DataTableSort | null;\n\t/** Reports header sorting requests. Controlled values change only when the caller accepts. */\n\tonSortChange?: (sort: DataTableSort | null) => void;\n\t/** Caller supplies sorted rows; headers only report requests. @default false */\n\tmanualSorting?: boolean;\n\t/** Caller supplies the current page; rows are never sliced again. Use stable row IDs across pages. @default false */\n\tmanualPagination?: boolean;\n\t/** Caller supplies filtered rows; filter is not applied locally. @default false */\n\tmanualFiltering?: boolean;\n\t/** Total matching row count in manualPagination mode; defaults to data.length. */\n\ttotal?: number;\n\t/** Error content replacing rows after loading finishes. */\n\terror?: ReactNode;\n\t/** Optional retry action for an error. The caller owns the request. */\n\tonRetry?: () => void;\n\t/** Retry button text. @default \"Try again\" */\n\tretryLabel?: string;\n\t/** Accessible table name. @default \"Data table\" */\n\t\"aria-label\"?: string;\n\t/** ID of additional table instructions or summary. */\n\t\"aria-describedby\"?: string;\n};\n\nexport function DataTable<T>({\n\tdata,\n\tcolumns,\n\tfilter = \"\",\n\tloading = false,\n\tempty = \"No results\",\n\tselected,\n\tdefaultSelected,\n\tonSelectedChange,\n\tmultiple = false,\n\tpage,\n\tdefaultPage = 1,\n\tpageSize,\n\tonPageChange,\n\tgetRowId,\n\tclassName,\n\tsort: controlledSort,\n\tdefaultSort = null,\n\tonSortChange,\n\tmanualSorting = false,\n\tmanualPagination = false,\n\tmanualFiltering = false,\n\ttotal,\n\terror,\n\tonRetry,\n\tretryLabel = \"Try again\",\n\t\"aria-label\": ariaLabel = \"Data table\",\n\t\"aria-describedby\": ariaDescribedBy,\n}: DataTableProps<T>) {\n\tconst [uncontrolledSort, setUncontrolledSort] = useState<DataTableSort | null>(defaultSort);\n\tconst sort = controlledSort === undefined ? uncontrolledSort : controlledSort;\n\tconst requestSort = (next: DataTableSort) => {\n\t\tif (controlledSort === undefined) setUncontrolledSort(next);\n\t\tonSortChange?.(next);\n\t};\n\tconst [uncontrolledSelected, setUncontrolledSelected] = useState<string[]>(defaultSelected ?? []);\n\tconst [uncontrolledPage, setUncontrolledPage] = useState(defaultPage);\n\tconst rowIds = useRef(new WeakMap<object, string>());\n\tconst rowSeq = useRef(0);\n\tconst assignedKeys = useRef(new WeakMap<object, string[]>());\n\tconst lastCanonical = useRef(new Map<string, object>());\n\tconst lastOwner = useRef(new Map<string, object>());\n\tconst lastKeyByCanonical = useRef(new Map<string, string>());\n\tconst lastDupsByCanonical = useRef(new Map<string, string[]>());\n\tconst symbolKeys = useRef(new Map<symbol, string>());\n\tconst query = filter.trim().toLowerCase();\n\n\tconst rows = useMemo(() => {\n\t\tconst identityOf = (row: object) => {\n\t\t\tlet stored = rowIds.current.get(row);\n\t\t\tif (!stored) {\n\t\t\t\tstored = `basalt-row-${rowSeq.current++}`;\n\t\t\t\trowIds.current.set(row, stored);\n\t\t\t}\n\t\t\treturn stored;\n\t\t};\n\t\tconst canonicalOf = (row: T, index: number) => {\n\t\t\tconst requested = getRowId?.(row, index);\n\t\t\tif (requested !== undefined) {\n\t\t\t\treturn `get:${requested}`;\n\t\t\t}\n\t\t\tif (isRefRow(row) && \"id\" in row) {\n\t\t\t\tconst raw = (row as { id: unknown }).id;\n\t\t\t\tif (raw != null) {\n\t\t\t\t\treturn `id:${String(raw)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tconst used = new Set<string>();\n\t\tconst nextLastKey = new Map<string, string>();\n\t\tconst nextDups = new Map<string, string[]>();\n\t\tconst nextAssigned = new Map<object, string[]>();\n\t\tconst nextOwner = new Map<string, object>();\n\t\tconst nextCanonical = new Map<string, object>();\n\t\tconst rememberKey = (row: T, index: number, key: string, objectRow: object | null) => {\n\t\t\tif (!objectRow) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst list = nextAssigned.get(objectRow) ?? [];\n\t\t\tlist.push(key);\n\t\t\tnextAssigned.set(objectRow, list);\n\t\t\tnextOwner.set(key, objectRow);\n\t\t\tif (isCanonicalKey(key)) {\n\t\t\t\tnextCanonical.set(key, objectRow);\n\t\t\t}\n\t\t\tconst canonical = canonicalOf(row, index);\n\t\t\tif (!canonical) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnextLastKey.set(canonical, key);\n\t\t\tif (isInstanceKey(key)) {\n\t\t\t\tconst dups = nextDups.get(canonical) ?? [];\n\t\t\t\tdups.push(key);\n\t\t\t\tnextDups.set(canonical, dups);\n\t\t\t}\n\t\t};\n\t\tconst counts = new WeakMap<object, number>();\n\t\tconst pending = data.map((row, index) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tconst occurrence = objectRow ? (counts.get(objectRow) ?? 0) : 0;\n\t\t\tif (objectRow) {\n\t\t\t\tcounts.set(objectRow, occurrence + 1);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trow,\n\t\t\t\tindex,\n\t\t\t\toccurrence,\n\t\t\t\tkey: undefined as string | undefined,\n\t\t\t};\n\t\t});\n\t\tfor (const item of pending) {\n\t\t\tconst objectRow = isRefRow(item.row) ? item.row : null;\n\t\t\tif (!objectRow) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst previous = assignedKeys.current.get(objectRow)?.[item.occurrence];\n\t\t\tif (!previous || used.has(previous)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (lastOwner.current.get(previous) === objectRow) {\n\t\t\t\titem.key = previous;\n\t\t\t\tused.add(previous);\n\t\t\t}\n\t\t}\n\t\tconst keyed = pending.map(({ row, index, occurrence, key: reserved }) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tif (reserved) {\n\t\t\t\trememberKey(row, index, reserved, objectRow);\n\t\t\t\treturn {\n\t\t\t\t\trow,\n\t\t\t\t\tkey: reserved,\n\t\t\t\t\tselectId: publicSelectId(row, index, reserved, getRowId),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst isRepeat = occurrence > 0;\n\t\t\tlet key: string | undefined;\n\t\t\tconst requested = canonicalOf(row, index);\n\t\t\tif (requested) {\n\t\t\t\tkey = requested;\n\t\t\t}\n\t\t\tif (objectRow) {\n\t\t\t\tconst stored = identityOf(objectRow);\n\t\t\t\tif (!key) {\n\t\t\t\t\tkey = isRepeat ? `gen:${stored}#${occurrence}` : `gen:${stored}`;\n\t\t\t\t} else if (used.has(key) || isRepeat) {\n\t\t\t\t\tconst reused = (lastDupsByCanonical.current.get(key) ?? []).find(\n\t\t\t\t\t\t(candidate) => !used.has(candidate),\n\t\t\t\t\t);\n\t\t\t\t\tkey = reused ?? (isRepeat ? `dup:${stored}#${occurrence}` : `dup:${stored}`);\n\t\t\t\t} else {\n\t\t\t\t\tconst inherited = lastKeyByCanonical.current.get(key);\n\t\t\t\t\tif (inherited && !used.has(inherited) && isInstanceKey(inherited)) {\n\t\t\t\t\t\tkey = inherited;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tkey = key ?? primitiveKey(row, index, symbolKeys.current, rowSeq);\n\t\t\tif (used.has(key)) {\n\t\t\t\tlet n = 0;\n\t\t\t\tlet candidate = `occ:${key}#${n}`;\n\t\t\t\twhile (used.has(candidate)) {\n\t\t\t\t\tn += 1;\n\t\t\t\t\tcandidate = `occ:${key}#${n}`;\n\t\t\t\t}\n\t\t\t\tkey = candidate;\n\t\t\t}\n\t\t\tused.add(key);\n\t\t\trememberKey(row, index, key, objectRow);\n\t\t\treturn { row, key, selectId: publicSelectId(row, index, key, getRowId) };\n\t\t});\n\t\tconst filtered =\n\t\t\tquery && !manualFiltering\n\t\t\t\t? keyed.filter(({ row }) =>\n\t\t\t\t\t\tcolumns.some((column) => filterSource(column, row).toLowerCase().includes(query)),\n\t\t\t\t\t)\n\t\t\t\t: keyed;\n\t\tconst sorted = (() => {\n\t\t\tif (!sort || manualSorting) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\tconst column = columns.find((item) => item.id === sort.id);\n\t\t\tif (!column) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\treturn [...filtered].sort((a, b) => {\n\t\t\t\tconst left = column.sortValue?.(a.row) ?? column.accessor(a.row);\n\t\t\t\tconst right = column.sortValue?.(b.row) ?? column.accessor(b.row);\n\t\t\t\tconst cmp = compareUnknown(left, right);\n\t\t\t\treturn sort.dir === \"asc\" ? cmp : -cmp;\n\t\t\t});\n\t\t})();\n\t\treturn {\n\t\t\trows: sorted,\n\t\t\tassigned: nextAssigned,\n\t\t\towner: nextOwner,\n\t\t\tcanonical: nextCanonical,\n\t\t\tlastKey: nextLastKey,\n\t\t\tdups: nextDups,\n\t\t};\n\t}, [columns, data, getRowId, query, sort, manualFiltering, manualSorting]);\n\n\tuseLayoutEffect(() => {\n\t\tfor (const [objectRow, keys] of rows.assigned) {\n\t\t\tassignedKeys.current.set(objectRow, keys);\n\t\t}\n\t\tlastOwner.current = rows.owner;\n\t\tlastCanonical.current = rows.canonical;\n\t\tlastKeyByCanonical.current = rows.lastKey;\n\t\tlastDupsByCanonical.current = rows.dups;\n\t}, [rows]);\n\n\tconst selectable =\n\t\tselected !== undefined || defaultSelected !== undefined || onSelectedChange !== undefined;\n\tconst selectedIds = selected ?? uncontrolledSelected;\n\tconst setSelectedIds = useCallback(\n\t\t(next: string[]) => {\n\t\t\tif (selected === undefined) {\n\t\t\t\tsetUncontrolledSelected(next);\n\t\t\t}\n\t\t\tonSelectedChange?.(next);\n\t\t},\n\t\t[onSelectedChange, selected],\n\t);\n\tconst rowCount = manualPagination && total !== undefined ? Math.max(0, total) : rows.rows.length;\n\tconst pageCount = pageSize && pageSize > 0 ? Math.max(1, Math.ceil(rowCount / pageSize)) : 1;\n\tconst resolvedPage = Math.min(pageCount, Math.max(1, page ?? uncontrolledPage));\n\tconst setResolvedPage = useCallback(\n\t\t(next: number) => {\n\t\t\tif (page === undefined) {\n\t\t\t\tsetUncontrolledPage(next);\n\t\t\t}\n\t\t\tonPageChange?.(next);\n\t\t},\n\t\t[onPageChange, page],\n\t);\n\tconst lastCorrection = useRef<string | null>(null);\n\tuseEffect(() => {\n\t\tconst requested = page ?? uncontrolledPage;\n\t\tif (requested === resolvedPage || loading) {\n\t\t\tlastCorrection.current = null;\n\t\t\treturn;\n\t\t}\n\t\tconst correction = `${requested}:${resolvedPage}`;\n\t\tif (lastCorrection.current !== correction) {\n\t\t\tlastCorrection.current = correction;\n\t\t\tsetResolvedPage(resolvedPage);\n\t\t}\n\t}, [page, uncontrolledPage, resolvedPage, loading, setResolvedPage]);\n\tconst paged =\n\t\t!manualPagination && pageSize && pageSize > 0\n\t\t\t? rows.rows.slice((resolvedPage - 1) * pageSize, resolvedPage * pageSize)\n\t\t\t: rows.rows;\n\tconst colCount = columns.length + (selectable ? 1 : 0);\n\tconst toggleSelected = (id: string) => {\n\t\tif (multiple) {\n\t\t\tsetSelectedIds(\n\t\t\t\tselectedIds.includes(id) ? selectedIds.filter((item) => item !== id) : [...selectedIds, id],\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tsetSelectedIds(selectedIds.includes(id) ? [] : [id]);\n\t};\n\n\treturn (\n\t\t<div className=\"flex min-w-0 flex-col gap-3\">\n\t\t\t<div\n\t\t\t\trole=\"region\"\n\t\t\t\taria-label={`${ariaLabel} scroll area`}\n\t\t\t\t// biome-ignore lint/a11y/noNoninteractiveTabindex: Named overflow regions need keyboard scrolling.\n\t\t\t\ttabIndex={0}\n\t\t\t\tclassName=\"min-w-0 overflow-x-auto rounded-basalt-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-basalt-primary\"\n\t\t\t>\n\t\t\t\t<Table\n\t\t\t\t\tclassName={cn(\"w-full\", className)}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t>\n\t\t\t\t\t<TableHeader>\n\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t<TableHead>\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Select</span>\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\t\t\tclassName={column.headerClassName}\n\t\t\t\t\t\t\t\t\tstyle={{ width: column.width }}\n\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\taria-sort={\n\t\t\t\t\t\t\t\t\t\tcolumn.sortable === false\n\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t: sort?.id === column.id\n\t\t\t\t\t\t\t\t\t\t\t\t? sort.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"ascending\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"descending\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"none\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{column.sortable === false ? (\n\t\t\t\t\t\t\t\t\t\t(column.headerContent ?? column.header)\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label={column.header}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"appearance-none border-0 bg-transparent p-0 font-inherit text-inherit font-medium cursor-pointer rounded-sm focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-basalt-primary\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\trequestSort(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsort?.id === column.id && sort.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? { id: column.id, dir: \"desc\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: { id: column.id, dir: \"asc\" },\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{column.headerContent ?? column.header}\n\t\t\t\t\t\t\t\t\t\t\t{sort?.id === column.id ? (sort.dir === \"asc\" ? \" ↑\" : \" ↓\") : \"\"}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t</TableHeader>\n\t\t\t\t\t<TableBody>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t\t<div role=\"status\" className=\"flex flex-col gap-2 py-2\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Loading</span>\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : error != null && error !== false ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex flex-wrap items-center justify-between gap-3 py-6\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div>{error}</div>\n\t\t\t\t\t\t\t\t\t\t{onRetry ? (\n\t\t\t\t\t\t\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n\t\t\t\t\t\t\t\t\t\t\t\t{retryLabel}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : paged.length === 0 ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t\t<div role=\"status\">{empty}</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tpaged.map(({ row, key, selectId }) => {\n\t\t\t\t\t\t\t\tconst isSelected = selectedIds.includes(selectId);\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<TableRow\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tvariant={isSelected ? \"selected\" : \"default\"}\n\t\t\t\t\t\t\t\t\t\taria-selected={selectable ? isSelected : undefined}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tchecked={isSelected}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Select ${selectId}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={() => toggleSelected(selectId)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t{columns.map((column) => {\n\t\t\t\t\t\t\t\t\t\t\tconst cell = column.accessor(row);\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell key={column.id} className={column.cellClassName}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{typeof cell === \"bigint\" ? String(cell) : cell}\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</TableBody>\n\t\t\t\t</Table>\n\t\t\t</div>\n\t\t\t{pageSize && pageSize > 0 ? (\n\t\t\t\t<Pagination\n\t\t\t\t\tpage={resolvedPage}\n\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\tdisabled={loading}\n\t\t\t\t\tonPageChange={setResolvedPage}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table.js","names":[],"sources":["../../src/components/data-table.tsx"],"sourcesContent":["import {\n\ttype CSSProperties,\n\ttype ReactNode,\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { cn } from \"../utils/cn\";\nimport { Button } from \"./button\";\nimport { Pagination } from \"./pagination\";\nimport { SkeletonLine } from \"./skeleton-line\";\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from \"./table\";\n\nexport type DataTableColumn<T> = {\n\tid: string;\n\theader: string;\n\taccessor: (row: T) => ReactNode;\n\tsortValue?: (row: T) => string | number | bigint;\n\tfilterValue?: (row: T) => string | number | bigint;\n\t/** Rich header content; header remains the plain text accessible name. */\n\theaderContent?: ReactNode;\n\t/** Whether the header changes sorting. @default true */\n\tsortable?: boolean;\n\t/** Width of the header and its column. */\n\twidth?: CSSProperties[\"width\"];\n\t/** Classes applied to the header cell. */\n\theaderClassName?: string;\n\t/** Classes applied to each data cell. */\n\tcellClassName?: string;\n};\n\nexport type DataTableSort = { id: string; dir: \"asc\" | \"desc\" };\n\nfunction rank(value: unknown): number {\n\tif (value === Number.NEGATIVE_INFINITY) {\n\t\treturn 0;\n\t}\n\tif (typeof value === \"bigint\" || (typeof value === \"number\" && Number.isFinite(value))) {\n\t\treturn 1;\n\t}\n\tif (value === Number.POSITIVE_INFINITY) {\n\t\treturn 2;\n\t}\n\tif (typeof value === \"number\") {\n\t\treturn 3;\n\t}\n\tif (typeof value === \"string\") {\n\t\treturn 4;\n\t}\n\treturn 5;\n}\n\nfunction compareUnknown(left: unknown, right: unknown): number {\n\tconst leftRank = rank(left);\n\tconst rightRank = rank(right);\n\tif (leftRank !== rightRank) {\n\t\treturn leftRank - rightRank;\n\t}\n\tif (leftRank === 1) {\n\t\tconst a = left as number | bigint;\n\t\tconst b = right as number | bigint;\n\t\treturn a < b ? -1 : a > b ? 1 : 0;\n\t}\n\tconst leftStr = String(left);\n\tconst rightStr = String(right);\n\treturn leftStr < rightStr ? -1 : leftStr > rightStr ? 1 : 0;\n}\n\nfunction primitiveKey(\n\trow: unknown,\n\tindex: number,\n\tsymbols: Map<symbol, string>,\n\tseq: { current: number },\n): string {\n\tif (row === null) {\n\t\treturn \"prim:null\";\n\t}\n\tif (row === undefined) {\n\t\treturn \"prim:undefined\";\n\t}\n\tif (typeof row === \"symbol\") {\n\t\tlet key = symbols.get(row);\n\t\tif (!key) {\n\t\t\tkey = `prim:symbol:${seq.current++}`;\n\t\t\tsymbols.set(row, key);\n\t\t}\n\t\treturn key;\n\t}\n\tconst type = typeof row;\n\tif (type === \"number\") {\n\t\tif (Object.is(row, -0)) {\n\t\t\treturn \"prim:number:-0\";\n\t\t}\n\t\treturn `prim:number:${String(row)}`;\n\t}\n\tif (type === \"string\" || type === \"bigint\" || type === \"boolean\") {\n\t\treturn `prim:${type}:${String(row)}`;\n\t}\n\treturn `prim:${index}`;\n}\n\nfunction isInstanceKey(key: string) {\n\treturn key.startsWith(\"dup:\") || key.startsWith(\"gen:\");\n}\n\nfunction isRefRow(row: unknown): row is object {\n\treturn typeof row === \"function\" || (typeof row === \"object\" && row !== null);\n}\n\nfunction filterSource<T>(column: DataTableColumn<T>, row: T): string {\n\tif (column.filterValue) {\n\t\treturn String(column.filterValue(row));\n\t}\n\tif (column.sortValue) {\n\t\treturn String(column.sortValue(row));\n\t}\n\tconst rendered = column.accessor(row);\n\tif (\n\t\ttypeof rendered === \"string\" ||\n\t\ttypeof rendered === \"number\" ||\n\t\ttypeof rendered === \"bigint\"\n\t) {\n\t\treturn String(rendered);\n\t}\n\treturn \"\";\n}\n\nfunction publicSelectId<T>(\n\trow: T,\n\tindex: number,\n\tkey: string,\n\tgetRowId?: (row: T, index: number) => string,\n): string {\n\tconst requested = getRowId?.(row, index);\n\tif (requested !== undefined) {\n\t\treturn requested;\n\t}\n\tif (isRefRow(row) && \"id\" in row && row.id != null) {\n\t\treturn String(row.id);\n\t}\n\treturn key;\n}\n\nexport type DataTableProps<T = unknown> = {\n\t/**\n\t * Rows to render.\n\t */\n\tdata: T[];\n\t/**\n\t * Column descriptors.\n\t */\n\tcolumns: DataTableColumn<T>[];\n\t/**\n\t * Filter query matched against column values.\n\t * @default \"\"\n\t */\n\tfilter?: string;\n\t/**\n\t * Replace rows with a loading placeholder.\n\t * @default false\n\t */\n\tloading?: boolean;\n\t/**\n\t * Copy shown when no rows remain after filtering.\n\t * @default \"No results\"\n\t */\n\tempty?: ReactNode;\n\t/**\n\t * Controlled selected row ids.\n\t */\n\tselected?: string[];\n\t/**\n\t * Uncontrolled initial selected row ids.\n\t */\n\tdefaultSelected?: string[];\n\t/**\n\t * Called when selected row ids change.\n\t */\n\tonSelectedChange?: (ids: string[]) => void;\n\t/**\n\t * Allow more than one selected row.\n\t * @default false\n\t */\n\tmultiple?: boolean;\n\t/**\n\t * Controlled 1-based page. Used with pageSize.\n\t */\n\tpage?: number;\n\t/**\n\t * Uncontrolled initial page.\n\t * @default 1\n\t */\n\tdefaultPage?: number;\n\t/**\n\t * Rows per page. Omit to show every row.\n\t */\n\tpageSize?: number;\n\t/**\n\t * Called when the page changes.\n\t */\n\tonPageChange?: (page: number) => void;\n\t/**\n\t * Stable id for a row.\n\t */\n\tgetRowId?: (row: T, index: number) => string;\n\t/**\n\t * Additional classes for the table.\n\t */\n\tclassName?: string;\n\t/** Controlled sorting. null explicitly disables sorting. */\n\tsort?: DataTableSort | null;\n\t/** Initial sorting for uncontrolled usage. @default null */\n\tdefaultSort?: DataTableSort | null;\n\t/** Reports header sorting requests. Controlled values change only when the caller accepts. */\n\tonSortChange?: (sort: DataTableSort | null) => void;\n\t/** Caller supplies sorted rows; headers only report requests. @default false */\n\tmanualSorting?: boolean;\n\t/** Caller supplies the current page; rows are never sliced again. Use stable row IDs across pages. @default false */\n\tmanualPagination?: boolean;\n\t/** Caller supplies filtered rows; filter is not applied locally. @default false */\n\tmanualFiltering?: boolean;\n\t/** Total matching row count in manualPagination mode; defaults to data.length. */\n\ttotal?: number;\n\t/** Error content replacing rows after loading finishes. */\n\terror?: ReactNode;\n\t/** Optional retry action for an error. The caller owns the request. */\n\tonRetry?: () => void;\n\t/** Retry button text. @default \"Try again\" */\n\tretryLabel?: string;\n\t/** Accessible table name. @default \"Data table\" */\n\t\"aria-label\"?: string;\n\t/** ID of additional table instructions or summary. */\n\t\"aria-describedby\"?: string;\n};\n\nexport function DataTable<T>({\n\tdata,\n\tcolumns,\n\tfilter = \"\",\n\tloading = false,\n\tempty = \"No results\",\n\tselected,\n\tdefaultSelected,\n\tonSelectedChange,\n\tmultiple = false,\n\tpage,\n\tdefaultPage = 1,\n\tpageSize,\n\tonPageChange,\n\tgetRowId,\n\tclassName,\n\tsort: controlledSort,\n\tdefaultSort = null,\n\tonSortChange,\n\tmanualSorting = false,\n\tmanualPagination = false,\n\tmanualFiltering = false,\n\ttotal,\n\terror,\n\tonRetry,\n\tretryLabel = \"Try again\",\n\t\"aria-label\": ariaLabel = \"Data table\",\n\t\"aria-describedby\": ariaDescribedBy,\n}: DataTableProps<T>) {\n\tconst [uncontrolledSort, setUncontrolledSort] = useState<DataTableSort | null>(defaultSort);\n\tconst sort = controlledSort === undefined ? uncontrolledSort : controlledSort;\n\tconst requestSort = (next: DataTableSort) => {\n\t\tif (controlledSort === undefined) setUncontrolledSort(next);\n\t\tonSortChange?.(next);\n\t};\n\tconst [uncontrolledSelected, setUncontrolledSelected] = useState<string[]>(defaultSelected ?? []);\n\tconst [uncontrolledPage, setUncontrolledPage] = useState(defaultPage);\n\tconst rowIds = useRef(new WeakMap<object, string>());\n\tconst rowSeq = useRef(0);\n\tconst assignedKeys = useRef(new WeakMap<object, string[]>());\n\tconst lastOwner = useRef(new Map<string, object>());\n\tconst lastKeyByCanonical = useRef(new Map<string, string>());\n\tconst lastDupsByCanonical = useRef(new Map<string, string[]>());\n\tconst symbolKeys = useRef(new Map<symbol, string>());\n\tconst query = filter.trim().toLowerCase();\n\n\tconst rows = useMemo(() => {\n\t\tconst identityOf = (row: object) => {\n\t\t\tlet stored = rowIds.current.get(row);\n\t\t\tif (!stored) {\n\t\t\t\tstored = `basalt-row-${rowSeq.current++}`;\n\t\t\t\trowIds.current.set(row, stored);\n\t\t\t}\n\t\t\treturn stored;\n\t\t};\n\t\tconst canonicalOf = (row: T, index: number) => {\n\t\t\tconst requested = getRowId?.(row, index);\n\t\t\tif (requested !== undefined) {\n\t\t\t\treturn `get:${requested}`;\n\t\t\t}\n\t\t\tif (isRefRow(row) && \"id\" in row) {\n\t\t\t\tconst raw = (row as { id: unknown }).id;\n\t\t\t\tif (raw != null) {\n\t\t\t\t\treturn `id:${String(raw)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tconst used = new Set<string>();\n\t\tconst nextLastKey = new Map<string, string>();\n\t\tconst nextDups = new Map<string, string[]>();\n\t\tconst nextAssigned = new Map<object, string[]>();\n\t\tconst nextOwner = new Map<string, object>();\n\t\tconst rememberKey = (row: T, index: number, key: string, objectRow: object | null) => {\n\t\t\tif (!objectRow) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst list = nextAssigned.get(objectRow) ?? [];\n\t\t\tlist.push(key);\n\t\t\tnextAssigned.set(objectRow, list);\n\t\t\tnextOwner.set(key, objectRow);\n\t\t\tconst canonical = canonicalOf(row, index);\n\t\t\tif (!canonical) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tnextLastKey.set(canonical, key);\n\t\t\tif (isInstanceKey(key)) {\n\t\t\t\tconst dups = nextDups.get(canonical) ?? [];\n\t\t\t\tdups.push(key);\n\t\t\t\tnextDups.set(canonical, dups);\n\t\t\t}\n\t\t};\n\t\tconst counts = new WeakMap<object, number>();\n\t\tconst pending = data.map((row, index) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tconst occurrence = objectRow ? (counts.get(objectRow) ?? 0) : 0;\n\t\t\tif (objectRow) {\n\t\t\t\tcounts.set(objectRow, occurrence + 1);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trow,\n\t\t\t\tindex,\n\t\t\t\toccurrence,\n\t\t\t\tkey: undefined as string | undefined,\n\t\t\t};\n\t\t});\n\t\tfor (const item of pending) {\n\t\t\tconst objectRow = isRefRow(item.row) ? item.row : null;\n\t\t\tif (!objectRow) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst previous = assignedKeys.current.get(objectRow)?.[item.occurrence];\n\t\t\tif (!previous || used.has(previous)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (lastOwner.current.get(previous) === objectRow) {\n\t\t\t\titem.key = previous;\n\t\t\t\tused.add(previous);\n\t\t\t}\n\t\t}\n\t\tconst keyed = pending.map(({ row, index, occurrence, key: reserved }) => {\n\t\t\tconst objectRow = isRefRow(row) ? row : null;\n\t\t\tif (reserved) {\n\t\t\t\trememberKey(row, index, reserved, objectRow);\n\t\t\t\treturn {\n\t\t\t\t\trow,\n\t\t\t\t\tkey: reserved,\n\t\t\t\t\tselectId: publicSelectId(row, index, reserved, getRowId),\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst isRepeat = occurrence > 0;\n\t\t\tlet key: string | undefined;\n\t\t\tconst requested = canonicalOf(row, index);\n\t\t\tif (requested) {\n\t\t\t\tkey = requested;\n\t\t\t}\n\t\t\tif (objectRow) {\n\t\t\t\tconst stored = identityOf(objectRow);\n\t\t\t\tif (!key) {\n\t\t\t\t\tkey = isRepeat ? `gen:${stored}#${occurrence}` : `gen:${stored}`;\n\t\t\t\t} else if (used.has(key) || isRepeat) {\n\t\t\t\t\tconst reused = (lastDupsByCanonical.current.get(key) ?? []).find(\n\t\t\t\t\t\t(candidate) => !used.has(candidate),\n\t\t\t\t\t);\n\t\t\t\t\tkey = reused ?? (isRepeat ? `dup:${stored}#${occurrence}` : `dup:${stored}`);\n\t\t\t\t} else {\n\t\t\t\t\tconst inherited = lastKeyByCanonical.current.get(key);\n\t\t\t\t\tif (inherited && !used.has(inherited) && isInstanceKey(inherited)) {\n\t\t\t\t\t\tkey = inherited;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tkey = key ?? primitiveKey(row, index, symbolKeys.current, rowSeq);\n\t\t\tif (used.has(key)) {\n\t\t\t\tlet n = 0;\n\t\t\t\tlet candidate = `occ:${key}#${n}`;\n\t\t\t\twhile (used.has(candidate)) {\n\t\t\t\t\tn += 1;\n\t\t\t\t\tcandidate = `occ:${key}#${n}`;\n\t\t\t\t}\n\t\t\t\tkey = candidate;\n\t\t\t}\n\t\t\tused.add(key);\n\t\t\trememberKey(row, index, key, objectRow);\n\t\t\treturn { row, key, selectId: publicSelectId(row, index, key, getRowId) };\n\t\t});\n\t\tconst filtered =\n\t\t\tquery && !manualFiltering\n\t\t\t\t? keyed.filter(({ row }) =>\n\t\t\t\t\t\tcolumns.some((column) => filterSource(column, row).toLowerCase().includes(query)),\n\t\t\t\t\t)\n\t\t\t\t: keyed;\n\t\tconst sorted = (() => {\n\t\t\tif (!sort || manualSorting) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\tconst column = columns.find((item) => item.id === sort.id);\n\t\t\tif (!column) {\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t\treturn [...filtered].sort((a, b) => {\n\t\t\t\tconst left = column.sortValue?.(a.row) ?? column.accessor(a.row);\n\t\t\t\tconst right = column.sortValue?.(b.row) ?? column.accessor(b.row);\n\t\t\t\tconst cmp = compareUnknown(left, right);\n\t\t\t\treturn sort.dir === \"asc\" ? cmp : -cmp;\n\t\t\t});\n\t\t})();\n\t\treturn {\n\t\t\trows: sorted,\n\t\t\tassigned: nextAssigned,\n\t\t\towner: nextOwner,\n\t\t\tlastKey: nextLastKey,\n\t\t\tdups: nextDups,\n\t\t};\n\t}, [columns, data, getRowId, query, sort, manualFiltering, manualSorting]);\n\n\tuseLayoutEffect(() => {\n\t\tfor (const [objectRow, keys] of rows.assigned) {\n\t\t\tassignedKeys.current.set(objectRow, keys);\n\t\t}\n\t\tlastOwner.current = rows.owner;\n\t\tlastKeyByCanonical.current = rows.lastKey;\n\t\tlastDupsByCanonical.current = rows.dups;\n\t}, [rows]);\n\n\tconst selectable =\n\t\tselected !== undefined || defaultSelected !== undefined || onSelectedChange !== undefined;\n\tconst selectedIds = selected ?? uncontrolledSelected;\n\tconst setSelectedIds = useCallback(\n\t\t(next: string[]) => {\n\t\t\tif (selected === undefined) {\n\t\t\t\tsetUncontrolledSelected(next);\n\t\t\t}\n\t\t\tonSelectedChange?.(next);\n\t\t},\n\t\t[onSelectedChange, selected],\n\t);\n\tconst rowCount = manualPagination && total !== undefined ? Math.max(0, total) : rows.rows.length;\n\tconst pageCount = pageSize && pageSize > 0 ? Math.max(1, Math.ceil(rowCount / pageSize)) : 1;\n\tconst resolvedPage = Math.min(pageCount, Math.max(1, page ?? uncontrolledPage));\n\tconst setResolvedPage = useCallback(\n\t\t(next: number) => {\n\t\t\tif (page === undefined) {\n\t\t\t\tsetUncontrolledPage(next);\n\t\t\t}\n\t\t\tonPageChange?.(next);\n\t\t},\n\t\t[onPageChange, page],\n\t);\n\tconst lastCorrection = useRef<string | null>(null);\n\tuseEffect(() => {\n\t\tconst requested = page ?? uncontrolledPage;\n\t\tif (requested === resolvedPage || loading) {\n\t\t\tlastCorrection.current = null;\n\t\t\treturn;\n\t\t}\n\t\tconst correction = `${requested}:${resolvedPage}`;\n\t\tif (lastCorrection.current !== correction) {\n\t\t\tlastCorrection.current = correction;\n\t\t\tsetResolvedPage(resolvedPage);\n\t\t}\n\t}, [page, uncontrolledPage, resolvedPage, loading, setResolvedPage]);\n\tconst paged =\n\t\t!manualPagination && pageSize && pageSize > 0\n\t\t\t? rows.rows.slice((resolvedPage - 1) * pageSize, resolvedPage * pageSize)\n\t\t\t: rows.rows;\n\tconst colCount = columns.length + (selectable ? 1 : 0);\n\tconst toggleSelected = (id: string) => {\n\t\tif (multiple) {\n\t\t\tsetSelectedIds(\n\t\t\t\tselectedIds.includes(id) ? selectedIds.filter((item) => item !== id) : [...selectedIds, id],\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tsetSelectedIds(selectedIds.includes(id) ? [] : [id]);\n\t};\n\n\treturn (\n\t\t<div className=\"flex min-w-0 flex-col gap-3\">\n\t\t\t<div\n\t\t\t\trole=\"region\"\n\t\t\t\taria-label={`${ariaLabel} scroll area`}\n\t\t\t\t// biome-ignore lint/a11y/noNoninteractiveTabindex: Named overflow regions need keyboard scrolling.\n\t\t\t\ttabIndex={0}\n\t\t\t\tclassName=\"min-w-0 overflow-x-auto rounded-basalt-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-basalt-primary\"\n\t\t\t>\n\t\t\t\t<Table\n\t\t\t\t\tclassName={cn(\"w-full\", className)}\n\t\t\t\t\taria-label={ariaLabel}\n\t\t\t\t\taria-describedby={ariaDescribedBy}\n\t\t\t\t\taria-busy={loading || undefined}\n\t\t\t\t>\n\t\t\t\t\t<TableHeader>\n\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t<TableHead>\n\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Select</span>\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\tkey={column.id}\n\t\t\t\t\t\t\t\t\tclassName={column.headerClassName}\n\t\t\t\t\t\t\t\t\tstyle={{ width: column.width }}\n\t\t\t\t\t\t\t\t\tscope=\"col\"\n\t\t\t\t\t\t\t\t\taria-sort={\n\t\t\t\t\t\t\t\t\t\tcolumn.sortable === false\n\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t: sort?.id === column.id\n\t\t\t\t\t\t\t\t\t\t\t\t? sort.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t? \"ascending\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t: \"descending\"\n\t\t\t\t\t\t\t\t\t\t\t\t: \"none\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{column.sortable === false ? (\n\t\t\t\t\t\t\t\t\t\t(column.headerContent ?? column.header)\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\taria-label={column.header}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"appearance-none border-0 bg-transparent p-0 font-inherit text-inherit font-medium cursor-pointer rounded-sm focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-basalt-primary\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\trequestSort(\n\t\t\t\t\t\t\t\t\t\t\t\t\tsort?.id === column.id && sort.dir === \"asc\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? { id: column.id, dir: \"desc\" }\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: { id: column.id, dir: \"asc\" },\n\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{column.headerContent ?? column.header}\n\t\t\t\t\t\t\t\t\t\t\t{sort?.id === column.id ? (sort.dir === \"asc\" ? \" ↑\" : \" ↓\") : \"\"}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t</TableHeader>\n\t\t\t\t\t<TableBody>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t\t<div role=\"status\" className=\"flex flex-col gap-2 py-2\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"sr-only\">Loading</span>\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t\t<SkeletonLine />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : error != null && error !== false ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\trole=\"alert\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex flex-wrap items-center justify-between gap-3 py-6\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div>{error}</div>\n\t\t\t\t\t\t\t\t\t\t{onRetry ? (\n\t\t\t\t\t\t\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n\t\t\t\t\t\t\t\t\t\t\t\t{retryLabel}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : paged.length === 0 ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell colSpan={colCount}>\n\t\t\t\t\t\t\t\t\t<div role=\"status\">{empty}</div>\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tpaged.map(({ row, key, selectId }) => {\n\t\t\t\t\t\t\t\tconst isSelected = selectedIds.includes(selectId);\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<TableRow\n\t\t\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\t\t\tvariant={isSelected ? \"selected\" : \"default\"}\n\t\t\t\t\t\t\t\t\t\taria-selected={selectable ? isSelected : undefined}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{selectable ? (\n\t\t\t\t\t\t\t\t\t\t\t<TableCell>\n\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tchecked={isSelected}\n\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={`Select ${selectId}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={() => toggleSelected(selectId)}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t\t{columns.map((column) => {\n\t\t\t\t\t\t\t\t\t\t\tconst cell = column.accessor(row);\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<TableCell key={column.id} className={column.cellClassName}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{typeof cell === \"bigint\" ? String(cell) : cell}\n\t\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</TableBody>\n\t\t\t\t</Table>\n\t\t\t</div>\n\t\t\t{pageSize && pageSize > 0 ? (\n\t\t\t\t<Pagination\n\t\t\t\t\tpage={resolvedPage}\n\t\t\t\t\tpageCount={pageCount}\n\t\t\t\t\tdisabled={loading}\n\t\t\t\t\tonPageChange={setResolvedPage}\n\t\t\t\t/>\n\t\t\t) : null}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|