@mortenbrudvik/waveui 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +274 -24
- package/dist/components/data-display/List.cjs +1 -1
- package/dist/components/data-display/List.cjs.map +1 -1
- package/dist/components/data-display/List.mjs +405 -219
- package/dist/components/data-display/List.mjs.map +1 -1
- package/dist/components/data-display/List.registry.cjs +1 -1
- package/dist/components/data-display/List.registry.cjs.map +1 -1
- package/dist/components/data-display/List.registry.mjs +12 -6
- package/dist/components/data-display/List.registry.mjs.map +1 -1
- package/dist/components/input/Combobox.cjs +1 -1
- package/dist/components/input/Combobox.cjs.map +1 -1
- package/dist/components/input/Combobox.mjs +163 -148
- package/dist/components/input/Combobox.mjs.map +1 -1
- package/dist/components/input/Dropdown.cjs +1 -1
- package/dist/components/input/Dropdown.cjs.map +1 -1
- package/dist/components/input/Dropdown.mjs +132 -117
- package/dist/components/input/Dropdown.mjs.map +1 -1
- package/dist/components/input/Listbox.cjs +1 -1
- package/dist/components/input/Listbox.cjs.map +1 -1
- package/dist/components/input/Listbox.mjs +90 -78
- package/dist/components/input/Listbox.mjs.map +1 -1
- package/dist/components/input/Option.cjs +1 -1
- package/dist/components/input/Option.cjs.map +1 -1
- package/dist/components/input/Option.data.cjs +2 -0
- package/dist/components/input/Option.data.cjs.map +1 -0
- package/dist/components/input/Option.data.mjs +114 -0
- package/dist/components/input/Option.data.mjs.map +1 -0
- package/dist/components/input/Option.mjs +21 -17
- package/dist/components/input/Option.mjs.map +1 -1
- package/dist/components/layout/FlatTree.cjs +2 -0
- package/dist/components/layout/FlatTree.cjs.map +1 -0
- package/dist/components/layout/FlatTree.context.cjs +2 -0
- package/dist/components/layout/FlatTree.context.cjs.map +1 -0
- package/dist/components/layout/FlatTree.context.mjs +20 -0
- package/dist/components/layout/FlatTree.context.mjs.map +1 -0
- package/dist/components/layout/FlatTree.item.cjs +2 -0
- package/dist/components/layout/FlatTree.item.cjs.map +1 -0
- package/dist/components/layout/FlatTree.item.mjs +90 -0
- package/dist/components/layout/FlatTree.item.mjs.map +1 -0
- package/dist/components/layout/FlatTree.mjs +276 -0
- package/dist/components/layout/FlatTree.mjs.map +1 -0
- package/dist/components/layout/Tree.core.cjs +1 -1
- package/dist/components/layout/Tree.core.cjs.map +1 -1
- package/dist/components/layout/Tree.core.mjs +166 -165
- package/dist/components/layout/Tree.core.mjs.map +1 -1
- package/dist/components/layout/Tree.selection.cjs +1 -1
- package/dist/components/layout/Tree.selection.cjs.map +1 -1
- package/dist/components/layout/Tree.selection.mjs +11 -57
- package/dist/components/layout/Tree.selection.mjs.map +1 -1
- package/dist/components/layout/useFlatTree.cjs +2 -0
- package/dist/components/layout/useFlatTree.cjs.map +1 -0
- package/dist/components/layout/useFlatTree.mjs +83 -0
- package/dist/components/layout/useFlatTree.mjs.map +1 -0
- package/dist/components/table/DataGrid.cjs +1 -1
- package/dist/components/table/DataGrid.cjs.map +1 -1
- package/dist/components/table/DataGrid.context.cjs +2 -0
- package/dist/components/table/DataGrid.context.cjs.map +1 -0
- package/dist/components/table/DataGrid.context.mjs +74 -0
- package/dist/components/table/DataGrid.context.mjs.map +1 -0
- package/dist/components/table/DataGrid.header.cjs +2 -0
- package/dist/components/table/DataGrid.header.cjs.map +1 -0
- package/dist/components/table/DataGrid.header.mjs +168 -0
- package/dist/components/table/DataGrid.header.mjs.map +1 -0
- package/dist/components/table/DataGrid.mjs +488 -591
- package/dist/components/table/DataGrid.mjs.map +1 -1
- package/dist/components/table/DataGrid.sizing.cjs +2 -0
- package/dist/components/table/DataGrid.sizing.cjs.map +1 -0
- package/dist/components/table/DataGrid.sizing.mjs +187 -0
- package/dist/components/table/DataGrid.sizing.mjs.map +1 -0
- package/dist/components/table/DataGrid.store.cjs +2 -0
- package/dist/components/table/DataGrid.store.cjs.map +1 -0
- package/dist/components/table/DataGrid.store.mjs +108 -0
- package/dist/components/table/DataGrid.store.mjs.map +1 -0
- package/dist/components/table/DataGrid.window.cjs +2 -0
- package/dist/components/table/DataGrid.window.cjs.map +1 -0
- package/dist/components/table/DataGrid.window.mjs +165 -0
- package/dist/components/table/DataGrid.window.mjs.map +1 -0
- package/dist/components/table/Table.cjs +1 -1
- package/dist/components/table/Table.cjs.map +1 -1
- package/dist/components/table/Table.mjs +74 -72
- package/dist/components/table/Table.mjs.map +1 -1
- package/dist/components/table/Table.resize.cjs +2 -0
- package/dist/components/table/Table.resize.cjs.map +1 -0
- package/dist/components/table/Table.resize.mjs +98 -0
- package/dist/components/table/Table.resize.mjs.map +1 -0
- package/dist/components/table/useGridNavigation.cjs +1 -1
- package/dist/components/table/useGridNavigation.cjs.map +1 -1
- package/dist/components/table/useGridNavigation.mjs +343 -140
- package/dist/components/table/useGridNavigation.mjs.map +1 -1
- package/dist/components/table/useTableColumnSizing.cjs +2 -0
- package/dist/components/table/useTableColumnSizing.cjs.map +1 -0
- package/dist/components/table/useTableColumnSizing.mjs +76 -0
- package/dist/components/table/useTableColumnSizing.mjs.map +1 -0
- package/dist/components/table/useTableFeatures.cjs +2 -0
- package/dist/components/table/useTableFeatures.cjs.map +1 -0
- package/dist/components/table/useTableFeatures.mjs +110 -0
- package/dist/components/table/useTableFeatures.mjs.map +1 -0
- package/dist/components/table/useTableSelection.cjs +2 -0
- package/dist/components/table/useTableSelection.cjs.map +1 -0
- package/dist/components/table/useTableSelection.mjs +39 -0
- package/dist/components/table/useTableSelection.mjs.map +1 -0
- package/dist/components/table/useTableSort.cjs +2 -0
- package/dist/components/table/useTableSort.cjs.map +1 -0
- package/dist/components/table/useTableSort.mjs +58 -0
- package/dist/components/table/useTableSort.mjs.map +1 -0
- package/dist/hooks/useActiveDescendant.cjs +1 -1
- package/dist/hooks/useActiveDescendant.cjs.map +1 -1
- package/dist/hooks/useActiveDescendant.mjs +33 -25
- package/dist/hooks/useActiveDescendant.mjs.map +1 -1
- package/dist/hooks/useListbox.cjs +1 -1
- package/dist/hooks/useListbox.cjs.map +1 -1
- package/dist/hooks/useListbox.mjs +140 -130
- package/dist/hooks/useListbox.mjs.map +1 -1
- package/dist/hooks/useRovingTabIndex.cjs +1 -1
- package/dist/hooks/useRovingTabIndex.cjs.map +1 -1
- package/dist/hooks/useRovingTabIndex.mjs +1 -1
- package/dist/hooks/useRovingTabIndex.mjs.map +1 -1
- package/dist/hooks/useSelection.cjs +2 -0
- package/dist/hooks/useSelection.cjs.map +1 -0
- package/dist/hooks/useSelection.mjs +57 -0
- package/dist/hooks/useSelection.mjs.map +1 -0
- package/dist/hooks/useVirtualWindow.cjs +2 -0
- package/dist/hooks/useVirtualWindow.cjs.map +1 -0
- package/dist/hooks/useVirtualWindow.mjs +102 -0
- package/dist/hooks/useVirtualWindow.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1542 -53
- package/dist/index.d.ts +1542 -53
- package/dist/index.mjs +147 -136
- package/dist/lib/classNames.cjs +1 -1
- package/dist/lib/classNames.cjs.map +1 -1
- package/dist/lib/classNames.mjs +68 -49
- package/dist/lib/classNames.mjs.map +1 -1
- package/dist/lib/columnSizing.cjs +2 -0
- package/dist/lib/columnSizing.cjs.map +1 -0
- package/dist/lib/columnSizing.mjs +27 -0
- package/dist/lib/columnSizing.mjs.map +1 -0
- package/dist/lib/flatTree.cjs +2 -0
- package/dist/lib/flatTree.cjs.map +1 -0
- package/dist/lib/flatTree.mjs +118 -0
- package/dist/lib/flatTree.mjs.map +1 -0
- package/dist/lib/selection.cjs +2 -0
- package/dist/lib/selection.cjs.map +1 -0
- package/dist/lib/selection.mjs +28 -0
- package/dist/lib/selection.mjs.map +1 -0
- package/dist/lib/treeCascade.cjs +2 -0
- package/dist/lib/treeCascade.cjs.map +1 -0
- package/dist/lib/treeCascade.mjs +52 -0
- package/dist/lib/treeCascade.mjs.map +1 -0
- package/dist/lib/virtual.cjs +2 -0
- package/dist/lib/virtual.cjs.map +1 -0
- package/dist/lib/virtual.mjs +54 -0
- package/dist/lib/virtual.mjs.map +1 -0
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { warnOnce as e } from "../../lib/dev.mjs";
|
|
3
|
+
import { useEventCallback as t } from "../../hooks/useEventCallback.mjs";
|
|
4
|
+
import { useControllable as n } from "../../hooks/useControllable.mjs";
|
|
5
|
+
import { computeCheckStates as r, toggleCheck as i } from "../../lib/treeCascade.mjs";
|
|
6
|
+
import { buildFlatTreeIndex as a, flatTreeForest as o, visibleFlatItems as s } from "../../lib/flatTree.mjs";
|
|
7
|
+
import * as c from "react";
|
|
8
|
+
//#region src/components/layout/useFlatTree.ts
|
|
9
|
+
var l = [];
|
|
10
|
+
function u(e) {
|
|
11
|
+
switch (e.kind) {
|
|
12
|
+
case "unknown-parent": return `useFlatTree: the item "${e.value}" has the parentValue "${e.parentValue}", which matches no item; it is shown as a root.`;
|
|
13
|
+
case "cycle": return `useFlatTree: the parentValue links form a cycle at "${e.value}"; the link of that item to its parent is ignored and it is shown as a root.`;
|
|
14
|
+
case "duplicate-value": return `useFlatTree: duplicate item value "${e.value}" (item ${e.index}); only the first item with a value is used.`;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function d(d, f = {}) {
|
|
18
|
+
let { expandedItems: p, defaultExpandedItems: m, onExpandedItemsChange: h, checkedItems: g, defaultCheckedItems: _, onCheckedItemsChange: v, selectionMode: y = "none" } = f, b = c.useMemo(() => a(d), [d]);
|
|
19
|
+
c.useEffect(() => {
|
|
20
|
+
let t = /* @__PURE__ */ new Set();
|
|
21
|
+
for (let n of b.issues) t.has(n.kind) || (t.add(n.kind), e(`useFlatTree:${n.kind}`, u(n)));
|
|
22
|
+
}, [b]);
|
|
23
|
+
let [x] = c.useState(() => m ?? l), [S, C] = n(p, x, (e) => h?.([...e])), w = c.useMemo(() => new Set(S), [S]), T = c.useCallback((e) => {
|
|
24
|
+
let t = typeof e == "string" ? [e] : e;
|
|
25
|
+
C((e) => {
|
|
26
|
+
let n = new Set(e), r = [];
|
|
27
|
+
for (let e of t) n.has(e) || (n.add(e), r.push(e));
|
|
28
|
+
return r.length > 0 ? [...e, ...r] : e;
|
|
29
|
+
});
|
|
30
|
+
}, [C]), E = c.useCallback((e) => {
|
|
31
|
+
C((t) => t.includes(e) ? t.filter((t) => t !== e) : t);
|
|
32
|
+
}, [C]), D = c.useCallback((e) => {
|
|
33
|
+
C((t) => t.includes(e) ? t.filter((t) => t !== e) : [...t, e]);
|
|
34
|
+
}, [C]), O = c.useCallback((e) => (b.byValue.get(e)?.isBranch ?? !1) && w.has(e), [b, w]), [k] = c.useState(() => _ ?? l), A = c.useRef(void 0), [j, M] = n(g, k, (e) => v?.([...e], A.current)), N = y === "multiple", P = c.useMemo(() => N ? o(b) : null, [b, N]), F = c.useMemo(() => P ? r(P, new Set(j)) : null, [P, j]), I = t((e, t, n) => {
|
|
35
|
+
let a = P ?? o(b);
|
|
36
|
+
M((o) => {
|
|
37
|
+
if ((r(a, new Set(o)).get(e) ?? (o.includes(e) ? "checked" : "unchecked")) === (t ? "checked" : "unchecked")) return o;
|
|
38
|
+
let s = i(a, o, e);
|
|
39
|
+
return s.includes(e) !== t && (s = i(a, s, e)), A.current = n ? {
|
|
40
|
+
value: e,
|
|
41
|
+
checked: s.includes(e),
|
|
42
|
+
event: n
|
|
43
|
+
} : void 0, s;
|
|
44
|
+
}), A.current = void 0;
|
|
45
|
+
}), L = c.useMemo(() => {
|
|
46
|
+
let e = s(b, w);
|
|
47
|
+
return F ? e.map((e) => ({
|
|
48
|
+
...e,
|
|
49
|
+
checked: F.get(e.item.value) ?? "unchecked"
|
|
50
|
+
})) : e;
|
|
51
|
+
}, [
|
|
52
|
+
b,
|
|
53
|
+
w,
|
|
54
|
+
F
|
|
55
|
+
]), R = c.useMemo(() => {
|
|
56
|
+
let e = /* @__PURE__ */ new Map();
|
|
57
|
+
for (let t of L) e.set(t.item.value, t);
|
|
58
|
+
return e;
|
|
59
|
+
}, [L]), z = c.useCallback((e) => R.get(e), [R]), B = c.useMemo(() => ({ selectionMode: y }), [y]), V = c.useCallback(() => B, [B]);
|
|
60
|
+
return c.useMemo(() => ({
|
|
61
|
+
visibleItems: L,
|
|
62
|
+
getItem: z,
|
|
63
|
+
expand: T,
|
|
64
|
+
collapse: E,
|
|
65
|
+
toggle: D,
|
|
66
|
+
isExpanded: O,
|
|
67
|
+
setChecked: I,
|
|
68
|
+
getTreeProps: V
|
|
69
|
+
}), [
|
|
70
|
+
L,
|
|
71
|
+
z,
|
|
72
|
+
T,
|
|
73
|
+
E,
|
|
74
|
+
D,
|
|
75
|
+
O,
|
|
76
|
+
I,
|
|
77
|
+
V
|
|
78
|
+
]);
|
|
79
|
+
}
|
|
80
|
+
//#endregion
|
|
81
|
+
export { d as useFlatTree };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=useFlatTree.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFlatTree.mjs","names":["React","EMPTY","issueMessage","issue","useFlatTree","options","index","buildFlatTreeIndex","items","reported","warnOnce","initialExpanded","defaultExpandedItems","expandedList","setExpandedList","useControllable","expandedItems","onExpandedItemsChange","next","expandedSet","expand","values","value","seen","prev","added","v","collapse","toggle","isExpanded","initialChecked","defaultCheckedItems","pendingDetails","checkedList","setCheckedList","checkedItems","onCheckedItemsChange","isMultiple","selectionMode","forest","flatTreeForest","checkStates","computeCheckStates","setChecked","useEventCallback","nodes","previous","checked","toggleCheck","event","visibleItems","rows","visibleFlatItems","row","rowsByValue","map","getItem","treeProps","getTreeProps"],"sources":["../../../src/components/layout/useFlatTree.ts"],"sourcesContent":["import * as React from 'react';\nimport { useControllable } from '../../hooks/useControllable';\nimport { useEventCallback } from '../../hooks/useEventCallback';\nimport { warnOnce } from '../../lib/dev';\nimport {\n buildFlatTreeIndex,\n flatTreeForest,\n visibleFlatItems,\n type FlatTreeItemData,\n type FlatTreeIssue,\n type VisibleFlatItem,\n} from '../../lib/flatTree';\nimport { computeCheckStates, toggleCheck, type CheckState } from '../../lib/treeCascade';\nimport type { SelectionMode } from '../../lib/types';\nimport type { TreeCheckedItemsChangeDetails } from './Tree.core';\n\nconst EMPTY: readonly string[] = [];\n\n/** Options of {@link useFlatTree}: the state names and shapes of the nested `Tree`. */\nexport interface UseFlatTreeOptions {\n /** Controlled list of expanded item values. */\n expandedItems?: readonly string[];\n /**\n * Item values that are expanded initially (uncontrolled).\n * @default []\n */\n defaultExpandedItems?: readonly string[];\n /** Called with the new list of expanded item values when an item expands or collapses. */\n onExpandedItemsChange?: (expandedItems: string[]) => void;\n /** Controlled checked items (`selectionMode=\"multiple\"`); the cascade rule is the nested `Tree`'s. */\n checkedItems?: readonly string[];\n /**\n * Initially checked items (uncontrolled).\n * @default []\n */\n defaultCheckedItems?: readonly string[];\n /**\n * Called with every checked item (in tree order) when a check changes. `details` is passed when\n * `setChecked` got an `event`; it is typed optional until 1.0.\n */\n onCheckedItemsChange?: (checkedItems: string[], details?: TreeCheckedItemsChangeDetails) => void;\n /**\n * How items are selected, as `Tree`. With `'multiple'` every visible row carries its `checked`\n * state; the model's `getTreeProps()` hands the mode on to `FlatTree`.\n * @default 'none'\n */\n selectionMode?: 'none' | SelectionMode;\n}\n\n/** The state and the visible rows of a flat tree, from {@link useFlatTree}. */\nexport interface FlatTreeModel {\n /**\n * The rows to show: the roots and the children of every expanded branch, in tree order. With\n * `selectionMode: 'multiple'` each row has its `checked` state. The array and its rows keep\n * their identity until the items, the expanded set or the checked set change.\n */\n visibleItems: readonly (VisibleFlatItem & { checked?: CheckState })[];\n /** The visible row of `value`; `undefined` for an item under a collapsed branch or an unknown value. */\n getItem(value: string): (VisibleFlatItem & { checked?: CheckState }) | undefined;\n /**\n * Expands `value`, or every value of a list in one change (one `onExpandedItemsChange` call, as\n * `*` on a tree item makes). Nothing happens, and nothing is called, if every value is already in\n * the expanded set.\n */\n expand(value: string | readonly string[]): void;\n /** Collapses `value`. Nothing happens, and nothing is called, if it is not in the expanded set. */\n collapse(value: string): void;\n /** Expands `value` when it is collapsed and collapses it when it is expanded. */\n toggle(value: string): void;\n /** Whether `value` is a branch (an item with child items, or typed `'branch'`) in the expanded set. */\n isExpanded(value: string): boolean;\n /**\n * Sets the check state of `value`, with the cascade of the nested `Tree`: the item and everything\n * nested in it, then its ancestors from their children. Nothing is called when the item is\n * already in that state; a mixed item is set to `checked` as requested. A value that matches no\n * item is added to, or removed from, the checked list. `event` becomes `details.event` of\n * `onCheckedItemsChange`; without it the callback gets no `details`. It works in any\n * `selectionMode` (the rows carry `checked` only with `'multiple'`), and on a disabled item too.\n */\n setChecked(value: string, checked: boolean, event?: Event): void;\n /** The props `FlatTree` takes from the model, for `<FlatTree model={model} {...model.getTreeProps()} />`. */\n getTreeProps(): { selectionMode: 'none' | SelectionMode };\n}\n\nfunction issueMessage(issue: FlatTreeIssue): string {\n switch (issue.kind) {\n case 'unknown-parent':\n return (\n `useFlatTree: the item \"${issue.value}\" has the parentValue \"${issue.parentValue}\", which ` +\n 'matches no item; it is shown as a root.'\n );\n case 'cycle':\n return (\n `useFlatTree: the parentValue links form a cycle at \"${issue.value}\"; the link of that ` +\n 'item to its parent is ignored and it is shown as a root.'\n );\n case 'duplicate-value':\n return (\n `useFlatTree: duplicate item value \"${issue.value}\" (item ${issue.index}); only the first ` +\n 'item with a value is used.'\n );\n }\n}\n\n/**\n * The model of a flat tree: items listed with a `parentValue` link, in any order, become the rows\n * a windowed tree shows (`FlatTree`), without building an element tree. Returns the visible rows\n * (with `level`, `position`, `setSize` and `expanded` for the tree ARIA), the expanded and\n * checked state, and the actions on them.\n *\n * Pass `items` as a stable reference or memoise it: the index of the items is rebuilt when its\n * identity changes. Expanded and checked state work as in `Tree`: pass `expandedItems` or\n * `checkedItems` to control it (a stable array, or the rows are rebuilt on every render), or\n * `defaultExpandedItems` and `defaultCheckedItems` to start uncontrolled; the change callbacks\n * fire once per change. When `items` is replaced, the expanded and checked values stay in the\n * state: a value that matches no item is ignored for the rows until an item with it returns, and\n * it is changed only by you.\n *\n * Development warnings, once each: an unknown `parentValue` (the item is a root), a cycle of\n * parents (cut) and a duplicate value (the first item wins).\n *\n * @example\n * const model = useFlatTree(items, { defaultExpandedItems: ['docs'] });\n * model.visibleItems.map((row) => row.item.label);\n */\nexport function useFlatTree(\n items: readonly FlatTreeItemData[],\n options: UseFlatTreeOptions = {},\n): FlatTreeModel {\n const {\n expandedItems,\n defaultExpandedItems,\n onExpandedItemsChange,\n checkedItems,\n defaultCheckedItems,\n onCheckedItemsChange,\n selectionMode = 'none',\n } = options;\n\n const index = React.useMemo(() => buildFlatTreeIndex(items), [items]);\n React.useEffect(() => {\n const reported = new Set<string>();\n for (const issue of index.issues) {\n if (reported.has(issue.kind)) continue;\n reported.add(issue.kind);\n warnOnce(`useFlatTree:${issue.kind}`, issueMessage(issue));\n }\n }, [index]);\n\n const [initialExpanded] = React.useState<readonly string[]>(() => defaultExpandedItems ?? EMPTY);\n const [expandedList, setExpandedList] = useControllable<readonly string[]>(\n expandedItems,\n initialExpanded,\n (next) => onExpandedItemsChange?.([...next]),\n );\n const expandedSet = React.useMemo(() => new Set(expandedList), [expandedList]);\n\n const expand = React.useCallback(\n (value: string | readonly string[]) => {\n const values = typeof value === 'string' ? [value] : value;\n setExpandedList((prev) => {\n // Sets, not array searches: `*` can expand thousands of siblings against a large set.\n const seen = new Set(prev);\n const added: string[] = [];\n for (const v of values) {\n if (seen.has(v)) continue;\n seen.add(v);\n added.push(v);\n }\n return added.length > 0 ? [...prev, ...added] : prev;\n });\n },\n [setExpandedList],\n );\n const collapse = React.useCallback(\n (value: string) => {\n setExpandedList((prev) => (prev.includes(value) ? prev.filter((v) => v !== value) : prev));\n },\n [setExpandedList],\n );\n const toggle = React.useCallback(\n (value: string) => {\n setExpandedList((prev) =>\n prev.includes(value) ? prev.filter((v) => v !== value) : [...prev, value],\n );\n },\n [setExpandedList],\n );\n const isExpanded = React.useCallback(\n (value: string) => (index.byValue.get(value)?.isBranch ?? false) && expandedSet.has(value),\n [index, expandedSet],\n );\n\n // useControllable passes the value only, so `details` reaches the change callback through a ref\n // written and cleared in the same event (the nested Tree does the same).\n const [initialChecked] = React.useState<readonly string[]>(() => defaultCheckedItems ?? EMPTY);\n const pendingDetails = React.useRef<TreeCheckedItemsChangeDetails | undefined>(undefined);\n const [checkedList, setCheckedList] = useControllable<readonly string[]>(\n checkedItems,\n initialChecked,\n (next) => onCheckedItemsChange?.([...next], pendingDetails.current),\n );\n\n const isMultiple = selectionMode === 'multiple';\n const forest = React.useMemo(\n () => (isMultiple ? flatTreeForest(index) : null),\n [index, isMultiple],\n );\n const checkStates = React.useMemo(\n () => (forest ? computeCheckStates(forest, new Set(checkedList)) : null),\n [forest, checkedList],\n );\n\n const setChecked = useEventCallback((value: string, checked: boolean, event?: Event) => {\n const nodes = forest ?? flatTreeForest(index);\n setCheckedList((previous) => {\n const current =\n computeCheckStates(nodes, new Set(previous)).get(value) ??\n (previous.includes(value) ? 'checked' : 'unchecked');\n if (current === (checked ? 'checked' : 'unchecked')) return previous;\n let next = toggleCheck(nodes, previous, value);\n // A mixed item turns checked on a toggle; asked to be unchecked it needs a second one.\n if (next.includes(value) !== checked) next = toggleCheck(nodes, next, value);\n pendingDetails.current = event ? { value, checked: next.includes(value), event } : undefined;\n return next;\n });\n pendingDetails.current = undefined;\n });\n\n const visibleItems = React.useMemo(() => {\n const rows = visibleFlatItems(index, expandedSet);\n if (!checkStates) return rows;\n return rows.map((row) => ({ ...row, checked: checkStates.get(row.item.value) ?? 'unchecked' }));\n }, [index, expandedSet, checkStates]);\n\n const rowsByValue = React.useMemo(() => {\n const map = new Map<string, (typeof visibleItems)[number]>();\n for (const row of visibleItems) map.set(row.item.value, row);\n return map;\n }, [visibleItems]);\n const getItem = React.useCallback((value: string) => rowsByValue.get(value), [rowsByValue]);\n\n const treeProps = React.useMemo(() => ({ selectionMode }), [selectionMode]);\n const getTreeProps = React.useCallback(() => treeProps, [treeProps]);\n\n return React.useMemo(\n () => ({\n visibleItems,\n getItem,\n expand,\n collapse,\n toggle,\n isExpanded,\n setChecked,\n getTreeProps,\n }),\n [visibleItems, getItem, expand, collapse, toggle, isExpanded, setChecked, getTreeProps],\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/cn.cjs"),n=require("../../lib/children.cjs"),r=require("../../lib/dev.cjs"),i=require("../../lib/composeEventHandlers.cjs"),a=require("../../lib/classNames.cjs"),o=require("../../hooks/useControllable.cjs"),s=require("../../hooks/useId.cjs"),c=require("../../hooks/useMergedRefs.cjs"),l=require("./useGridNavigation.cjs"),u=require("../../lib/styles.cjs"),d=require("../../lib/events.cjs"),f=require("./Table.shared.cjs");let p=require("react");p=e.__toESM(p,1);let m=require("react/jsx-runtime");var h=`Select all rows`,g=`Selection`;function _(e,t=!1){let n=new Set(e),r=new Map,i=new Map,a=0,o=0,s=`none`,c=t,l,u=new Set,d=new Set,f=e=>{for(let t of Array.from(e))t()},p=()=>{if(l!==void 0)return l;let e=null;for(let t of n){if(r.has(t)){e=t;break}e??=t}return l=e,e},m=e=>{if(n.size<2||!n.has(e))return;let t=l;l=void 0,c&&p()!==t&&f(u)},h=()=>{let e=o===0?`none`:o===a?`all`:`some`;e!==s&&(s=e,f(d))},g=e=>r.has(e)&&!i.has(e),_=(e,t)=>{let r=g(e);t();let i=g(e);if(r===i)return;let s=i?1:-1;a+=s,n.has(e)&&(o+=s)},v=(e,t,n)=>{let r=(e.get(t)??0)+n;r>0?e.set(t,r):e.delete(t)},y=e=>t=>(e.add(t),()=>{e.delete(t)});return{subscribe:y(u),subscribeSelectAll:y(d),register(e){let t=!r.has(e);_(e,()=>v(r,e,1)),h(),t&&m(e);let n=!1;return()=>{n||(n=!0,_(e,()=>v(r,e,-1)),!r.has(e)&&(h(),m(e)))}},disable(e){_(e,()=>v(i,e,1)),h();let t=!1;return()=>{t||(t=!0,_(e,()=>v(i,e,-1)),h())}},isDisabled(e){return i.has(e)},setSelected(e){let t=new Set(e);if(!(t.size===n.size&&e.every(e=>n.has(e)))){n=t,l=void 0,o=0;for(let e of t)g(e)&&(o+=1);f(u),h()}},setSingleMode(e){c=e},isSelected(e,t=!1){return t?p()===e:n.has(e)},countRegistrations(e){return r.get(e)??0},getSelectAllState(){return s},getRegistered(){return Array.from(r.keys())},prune(e){return e.filter(e=>r.has(e))}}}function v(){let e=new Map,t=new Set,n=null,r=()=>{let r=null,i=null;for(let[t,a]of e){let o=a();if(!o){if(n!==null&&e.has(n))return;continue}(!i||o.compareDocumentPosition(i)&Node.DOCUMENT_POSITION_FOLLOWING)&&(r=t,i=o)}if(r===null&&(r=e.keys().next().value??null),r!==n){n=r;for(let e of Array.from(t))e()}};return{subscribe(e){return t.add(e),()=>{t.delete(e)}},register(t,n){return e.set(t,n),r(),()=>{e.delete(t),r()}},getFirst:()=>n,refresh:r}}var y=p.createContext(null),b=p.createContext(null),x=p.createContext(`body`),S=p.createContext(null),C=p.createContext(!0),w=p.createContext(null),ee=p.createContext(null),T=p.createContext(null),E={selectionMode:`none`,store:_([]),toggleRow:()=>{},toggleAll:()=>{},radioName:``,selectAllLabel:h,selectionHeaderLabel:g,selectOnRowClick:!1,selectionAppearance:`brand`,subtleSelection:!1},D={sort:null,requestSort:()=>{}},O={selectionCellProps:void 0,hasSelectionCell:!0,rowId:void 0,isSelected:!1,disabled:!1,invisible:!1,ariaLabel:void 0,ariaLabelledBy:void 0};function k(e){return p.useContext(y)||(r.reportMissingContext(e,`DataGrid`),E)}function te(e){return p.useContext(T)||(r.reportMissingContext(e,`DataGrid.Row`),O)}function ne(e){return p.useContext(b)||(r.reportMissingContext(e,`DataGrid`),D)}var A=[];function j(e){return e===void 0?void 0:Array.from(e)}function M(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function re({key:e,node:t}){return(0,m.jsx)(p.Fragment,{children:t},e)}function N(e){return r.resolveDeprecatedProp(`DataGrid`,e.columnId,e.id,`columns[].id`,`columns[].columnId`)}function ie(e){r.warnOnce(`DataGrid:duplicate-rowId:${e}`,`DataGrid: several rows share the rowId "${e}". Row ids must be unique within a DataGrid; rows with the same rowId are selected and deselected together.`)}var P=`px-4 py-3 border-b border-border`,ae={brand:`hover:bg-subtle-hover data-[selected]:bg-selected transition-colors motion-reduce:transition-none`,neutral:`hover:bg-subtle-hover data-[selected]:bg-subtle-selected transition-colors motion-reduce:transition-none`,none:`hover:bg-subtle-hover transition-colors motion-reduce:transition-none`};function F(e){return f.getTablePartKind(e)===`dataGridSelectionCell`}function I(e){let{items:u,getRowId:d,sort:f,defaultSort:v,sortColumn:x,defaultSortColumn:S,sortDirection:C,defaultSortDirection:E,onSortChange:D,selectionMode:O=`none`,selectedItems:k,defaultSelectedItems:te,onSelectedItemsChange:ne,selectedKeys:ie,defaultSelectedKeys:P,onSelectionChange:ae,labels:F,selectOnRowClick:I=!1,selectionAppearance:L=`brand`,subtleSelection:R=!1,columns:z,containerProps:oe,children:H,className:se,onKeyDown:G,onFocus:ce,onBlur:q,ref:le,...ue}=e,J=u!==void 0,Y=f!==void 0||v!==void 0,X=!Y&&!J,[de,Z]=p.useState(!X);!X&&!de&&Z(!0);let fe=de||!X,pe=x!==void 0||C!==void 0;x!==void 0&&r.warnDeprecated(`DataGrid`,`sortColumn`,`sort`),C!==void 0&&r.warnDeprecated(`DataGrid`,`sortDirection`,`sort`),S!==void 0&&r.warnDeprecated(`DataGrid`,`defaultSortColumn`,`defaultSort`),E!==void 0&&r.warnDeprecated(`DataGrid`,`defaultSortDirection`,`defaultSort`);let me=pe||S!==void 0||E!==void 0,he=Y&&me,ge=!X&&!Y&&me;p.useEffect(()=>{he?r.warnOnce(`DataGrid:mixed-sort`,"DataGrid: do not mix `sort`/`defaultSort` with the deprecated `sortColumn`/`sortDirection`/`defaultSortColumn`/`defaultSortDirection`. `sort`/`defaultSort` win."):ge&&r.warnOnce(`DataGrid:items-deprecated-sort`,"DataGrid: the deprecated `sortColumn`/`sortDirection`/`defaultSortColumn`/`defaultSortDirection` do not apply to a grid with `items` and are ignored. Pass `sort` or `defaultSort`.")},[he,ge]),p.useEffect(()=>{X&&(x!==void 0&&C===void 0?r.warnOnce(`DataGrid:sortColumn-without-sortDirection`,"DataGrid: `sortColumn` is controlled but `sortDirection` is not (mixed control). The direction is kept internally and toggles on repeated clicks, as in 0.4. Pass `sort` (`{ columnId, direction }`) to control both."):C!==void 0&&x===void 0&&r.warnOnce(`DataGrid:sortDirection-without-sortColumn`,"DataGrid: `sortDirection` is controlled but `sortColumn` is not (mixed control). The column is kept internally and follows the clicked header, as in 0.4. Pass `sort` (`{ columnId, direction }`) to control both."))},[X,x,C]);let[_e,ve]=p.useState(()=>({column:S??``,direction:E??`ascending`})),ye=p.useMemo(()=>{if(x===void 0&&C===void 0)return;let e=x??_e.column;return e===``?null:{columnId:e,direction:C??_e.direction}},[x,C,_e]),be=p.useMemo(()=>S?{columnId:S,direction:E??`ascending`}:null,[S,E]),xe=X?ye:f,Se=be;v===void 0?ge&&(Se=null):Se=v;let Ce=p.useRef(void 0),[we,Te]=o.useControllable(xe,Se,e=>{e&&(X&&ve(t=>t.column===e.columnId&&t.direction===e.direction?t:{column:e.columnId,direction:e.direction}),D&&(fe?D(e,Ce.current):D(e.columnId,e.direction)))}),Ee=p.useCallback((e,t)=>{Ce.current={event:t};try{Te(t=>({columnId:e,direction:t?.columnId===e&&t.direction===`ascending`?`descending`:`ascending`}))}finally{Ce.current=void 0}},[Te]),De=p.useMemo(()=>({sort:we,requestSort:Ee}),[we,Ee]);ae!==void 0&&r.warnDeprecated(`DataGrid`,`onSelectionChange`,`onSelectedItemsChange`);let Oe=p.useMemo(()=>j(ie),[ie]),ke=p.useMemo(()=>j(P),[P]),Ae=r.resolveDeprecatedProp(`DataGrid`,k,Oe,`selectedKeys`,`selectedItems`),je=r.resolveDeprecatedProp(`DataGrid`,te,ke,`defaultSelectedKeys`,`defaultSelectedItems`)??A,Me=p.useRef(void 0),[Ne,Pe]=o.useControllable(Ae,je,e=>{ne?.([...e],Me.current),ae?.(new Set(e))}),Fe=p.useCallback((e,t)=>{Me.current={event:e};try{Pe(t)}finally{Me.current=void 0}},[Pe]),Q=O===`single`,[$]=p.useState(()=>_(Ne,Q));p.useLayoutEffect(()=>{$.setSelected(Ne)},[$,Ne]),p.useLayoutEffect(()=>{$.setSingleMode(Q)},[$,Q]);let Ie=p.useCallback((e,t)=>{Fe(t,t=>{let n=$.prune(t),r;return r=Q?n[0]===e?[]:[e]:n.includes(e)?n.filter(t=>t!==e):[...n,e],M(r,t)?t:r})},[Q,Fe,$]),Le=Ne.length;p.useEffect(()=>{Q&&Le>1&&r.warnOnce(`DataGrid:single-several-selected`,`DataGrid: a single-selection grid (selectionMode "single") has ${Le} selected row ids; only the first one that is rendered is selected. Pass at most one id in \`selectedItems\`/\`defaultSelectedItems\`, or use selectionMode="multiple".`)},[Q,Le]);let Re=p.useCallback(e=>{Fe(e,e=>{let t=new Set($.prune(e)),n=$.getRegistered(),r=n.filter(e=>!$.isDisabled(e)),i=r.length>0&&r.every(e=>t.has(e))?n.filter(e=>$.isDisabled(e)&&t.has(e)):n.filter(e=>!$.isDisabled(e)||t.has(e));return M(i,e)?e:i})},[Fe,$]),ze=s.useId(`wave-datagrid-selection`),Be=F?.selectAll??h,Ve=F?.selectionHeader??g,He=p.useMemo(()=>({selectionMode:O,store:$,toggleRow:Ie,toggleAll:Re,radioName:ze,selectAllLabel:Be,selectionHeaderLabel:Ve,selectOnRowClick:I,selectionAppearance:L,subtleSelection:R}),[O,$,Ie,Re,ze,Be,Ve,I,L,R]),{gridRef:Ue,gridProps:We}=l.useGridNavigation(),Ge=c.useMergedRefs(le,Ue),Ke=p.useMemo(()=>{if(u===void 0)return null;let e=new Set;return u.map((t,n)=>{let r=d?d(t):String(n),i=e.has(r)?`${r}\u0000${n}`:r;return e.add(i),{item:t,index:n,rowId:r,key:i}})},[u,d]),qe=we?.columnId,Je=we?.direction,Ye=p.useMemo(()=>{if(J&&qe!==void 0&&z)return z.find(e=>N(e)===qe)?.compare},[J,qe,z]),Xe=p.useMemo(()=>{if(Ke===null||!Ye)return Ke;let e=Ye;return Ke.slice().sort(Je===`descending`?(t,n)=>-e(t.item,n.item):(t,n)=>e(t.item,n.item))},[Ke,Ye,Je]),Ze=p.useMemo(()=>{if(!z||!J)return null;let e=z.map((e,t)=>N(e)??t);return t=>(0,m.jsx)(W,{children:z.map((n,r)=>(0,m.jsx)(K,{children:n.renderCell?.(t)},e[r]))})},[z,J]),Qe=p.useMemo(()=>({rows:Xe,renderColumnsRow:Ze}),[Xe,Ze]),$e=z?.some(e=>e.columnId===void 0&&e.id===void 0)??!1;p.useEffect(()=>{$e&&r.warnOnce(`DataGrid:column-without-columnId`,"DataGrid: a column in `columns` has no `columnId` (nor the deprecated `id`), so its header cannot sort. Give every column a unique `columnId`.")},[$e]);let et=H,tt=z?n.flattenChildren(H):[],nt=e=>tt.some(({node:t})=>n.isElementOfType(t,e)),rt=z&&!nt(B)?(0,m.jsx)(B,{children:(0,m.jsx)(`tr`,{children:z.map((e,t)=>{let n=N(e);return(0,m.jsx)(V,{columnId:n,sortable:e.sortable??e.compare!==void 0,children:e.renderHeaderCell?e.renderHeaderCell():e.label},n??t)})})},`wave-generated-header`):null,it=z&&J&&!nt(U)?(0,m.jsx)(U,{},`wave-generated-body`):null;if(rt||it){let e=({node:e})=>n.isElementOfType(e,`caption`),t=tt.filter(t=>!e(t)),r=it?t.findIndex(({node:e})=>n.isElementOfType(e,`tfoot`)):-1,i=r>=0?r:t.length;et=[...tt.filter(e).map(re),rt,...t.slice(0,i).map(re),it,...t.slice(i).map(re)]}let{className:at,"aria-label":ot,"aria-labelledby":st,...ct}=oe??{},lt=ct.role!==void 0,ut=!lt&&(ot!==void 0||st!==void 0);return p.useEffect(()=>{ut&&r.warnOnce(`DataGrid:container-name-without-role`,'DataGrid: `containerProps["aria-label"]`/`["aria-labelledby"]` is ignored because the wrapper has no role. Name the grid itself (`aria-label` on DataGrid), or pass a `role` (e.g. "region") in `containerProps` too.')},[ut]),(0,m.jsx)(y.Provider,{value:He,children:(0,m.jsx)(b.Provider,{value:De,children:(0,m.jsx)(w.Provider,{value:Qe,children:(0,m.jsx)(T.Provider,{value:null,children:(0,m.jsx)(ee.Provider,{value:null,children:(0,m.jsx)(`div`,{...ct,"aria-label":lt?ot:void 0,"aria-labelledby":lt?st:void 0,className:t.cn(a.dataGridClassNames.container,`overflow-x-auto rounded-md border border-border`,at),children:(0,m.jsx)(`table`,{ref:Ge,role:`grid`,"aria-multiselectable":O===`multiple`||void 0,"data-selection-appearance":L,"data-subtle-selection":R?``:void 0,className:t.cn(a.dataGridClassNames.root,`w-full border-separate border-spacing-0`,R&&`group/grid`,se),...ue,onKeyDown:i.composeEventHandlers(G,We.onKeyDown),onFocus:i.composeEventHandlers(ce,We.onFocus,{checkDefaultPrevented:!1}),onBlur:i.composeEventHandlers(q,We.onBlur,{checkDefaultPrevented:!1}),children:et})})})})})})})}I.displayName=`DataGrid`;function L({selectionMode:e,stableClassName:n,cellProps:r,ref:i}){let{store:o,toggleAll:s,selectAllLabel:c,selectionHeaderLabel:l,subtleSelection:d}=k(`DataGrid.Header`),h=p.useSyncExternalStore(o.subscribeSelectAll,o.getSelectAllState,o.getSelectAllState),{className:g,disabled:_,invisible:v,controlRef:y,"aria-label":b,"aria-labelledby":x,"aria-describedby":S,...C}=r??{},w=!1;return h===`all`?w=!0:h===`some`&&(w=`mixed`),(0,m.jsx)(`th`,{scope:`col`,...C,ref:i,"data-selection-cell":``,className:t.cn(n,a.dataGridHeaderClassNames.selectionCell,f.SELECTION_CELL_CLASSES,`text-start`,u.focusRingInset,g),children:e===`multiple`?(0,m.jsx)(f.TableSelectionControl,{ref:y,type:`checkbox`,"aria-label":b??(x===void 0?c:void 0),"aria-labelledby":x,"aria-describedby":S,checked:w,disabled:_,invisible:v,subtle:d,reveal:`grid`,onChange:e=>s(e.nativeEvent),className:a.dataGridHeaderClassNames.selectAllCheckbox}):(0,m.jsx)(`span`,{className:`sr-only`,children:l})})}var R={subscribe:()=>()=>{},register:()=>()=>{},getFirst:()=>null,refresh:()=>{}};function z({selectionMode:e,initialFirst:n,stableClassName:r,cellProps:i,ref:o}){let s=p.useContext(S)??R,[l]=p.useState(()=>({})),d=p.useRef(null),h=c.useMergedRefs(d,o),g=p.useCallback(()=>{let e=s.getFirst();return e===null?n:e===l},[s,l,n]),_=p.useCallback(()=>n,[n]),v=p.useSyncExternalStore(s.subscribe,g,_);if(p.useLayoutEffect(()=>s.register(l,()=>d.current),[s,l]),v)return(0,m.jsx)(L,{ref:h,selectionMode:e,stableClassName:r,cellProps:i});let{className:y,disabled:b,invisible:x,controlRef:C,"aria-label":w,"aria-labelledby":ee,"aria-describedby":T,...E}=i??{};return(0,m.jsx)(`td`,{...E,ref:h,"data-selection-cell":``,className:t.cn(r,a.dataGridHeaderClassNames.selectionCell,f.SELECTION_CELL_CLASSES,u.focusRingInset,y)})}function oe(e,t){let r=!0,i=e=>p.Children.map(e,e=>{if(n.isElementOfType(e,p.Fragment))return p.cloneElement(e,void 0,i(e.props.children));if(!p.isValidElement(e))return e;let a=r;if(r=!1,n.isElementOfType(e,`tr`)){let r=e.props.children,i=t===`none`||n.flattenChildren(r).some(({node:e})=>F(e))?null:(0,m.jsx)(z,{selectionMode:t,initialFirst:a});return p.cloneElement(e,void 0,i,(0,m.jsx)(C.Provider,{value:a,children:r}))}return(0,m.jsx)(C.Provider,{value:a,children:e})});return i(e)}var B=({children:e,className:n,ref:i,...o})=>{let{selectionMode:s}=k(`DataGrid.Header`),[l,u]=p.useState(null),d=c.useMergedRefs(i,u),[f]=p.useState(v),h=oe(e,s);return p.useLayoutEffect(()=>{f.refresh()}),p.useEffect(()=>{if(!r.isDev||!l||s===`none`)return;let e=Array.from(l.rows,e=>Array.from(e.cells).filter(e=>e.hasAttribute(`data-selection-cell`)));e.some((e,t)=>e.length===0&&l.rows[t].cells.length>0)&&r.warnOnce(`DataGrid.Header:missing-selection-cell`,"DataGrid.Header: a header row has no selection column header cell, so the header has one column fewer than the selectable rows. Render header rows as `<tr>` children of DataGrid.Header (a Fragment is fine), or use `DataGrid.Row` for a header row that another component renders."),e.some(e=>e.length>1)&&r.warnOnce(`DataGrid.Header:several-selection-cells`,`DataGrid.Header: a header row has more than one selection cell. A DataGrid.SelectionCell rendered by another component is not seen, so the row also gets the automatic cell: render DataGrid.SelectionCell as a child of the row (a Fragment is fine).`)}),(0,m.jsx)(x.Provider,{value:`header`,children:(0,m.jsx)(S.Provider,{value:f,children:(0,m.jsx)(`thead`,{ref:d,className:t.cn(a.dataGridHeaderClassNames.root,`bg-card`,n),...o,children:h})})})};B.displayName=`DataGridHeader`;var V=({columnId:e,sortable:n=!1,sortIcon:o,children:s,className:c,onClick:l,ref:d,...h})=>{let{sort:g,requestSort:_}=ne(`DataGrid.HeaderCell`),v=n&&e?e:void 0,y=v!==void 0&&g?.columnId===v?g.direction:null,b=e=>{let t=e.currentTarget.firstElementChild;v!==void 0&&t?.localName===`button`&&t.contains(e.target)&&_(v,e.nativeEvent)};return p.useEffect(()=>{n&&!e&&r.warnOnce(`DataGrid.HeaderCell:sortable-without-columnId`,"DataGrid.HeaderCell: `sortable` needs a `columnId`; the header is rendered as not sortable.")},[n,e]),(0,m.jsx)(`th`,{ref:d,scope:`col`,"aria-sort":v===void 0?void 0:y??`none`,className:t.cn(a.dataGridHeaderCellClassNames.root,P,`text-start align-middle font-semibold text-caption-1 uppercase tracking-wider`,u.focusRingInset,v!==void 0&&`p-0 hover:bg-subtle-hover`,c),...h,onClick:v===void 0?l:i.composeEventHandlers(l,b),children:v===void 0?(0,m.jsx)(`span`,{className:`inline-flex items-center gap-1`,children:s}):(0,m.jsx)(f.TableSortButton,{component:`DataGrid.HeaderCell`,direction:y,sortIcon:o,className:a.dataGridHeaderCellClassNames.button,iconClassName:a.dataGridHeaderCellClassNames.sortIcon,children:s})})};V.displayName=`DataGridHeaderCell`;var H=p.memo(function({item:e,index:t,rowId:n,render:r}){return(0,m.jsx)(ee.Provider,{value:n,children:r(e,t)})}),U=({children:e,className:n,ref:i,...o})=>{let s=p.useContext(w),c=s?.rows??null,l=typeof e==`function`&&c===null;p.useEffect(()=>{l&&r.warnOnce(`DataGrid.Body:render-without-items`,"DataGrid.Body: a render function child renders one row per item of the DataGrid's `items`, which is not set, so the body has no rows.")},[l]);let u=e=>e&&c?.map(t=>(0,m.jsx)(H,{item:t.item,index:t.index,rowId:t.rowId,render:e},t.key)),d;return d=typeof e==`function`?u(e):e===void 0?u(s?.renderColumnsRow??null):e,(0,m.jsx)(x.Provider,{value:`body`,children:(0,m.jsx)(`tbody`,{ref:i,className:t.cn(a.dataGridBodyClassNames.root,n),...o,children:d})})};U.displayName=`DataGridBody`;var W=({rowId:e,selectionLabel:o,selectionCellProps:c,children:l,className:f,onClick:h,onKeyDown:g,ref:_,...v})=>{let{selectionMode:y,store:b,toggleRow:S,selectOnRowClick:w,selectionAppearance:E}=k(`DataGrid.Row`),D=p.useContext(ee),O=e??D??void 0,te=p.useContext(x),ne=p.useContext(C),A=te===`header`,j=y!==`none`&&!A,M=s.useId(`wave-datagrid-row-label`),N=n.flattenChildren(l),P;for(let{node:e}of N)if(F(e)){P=e.props;break}let I=P!==void 0,L=P?.disabled??c?.disabled??!1,R=P?.invisible??c?.invisible??!1,oe=P?.[`aria-labelledby`],B=P?.[`aria-label`]??c?.[`aria-label`]??o,V=y===`single`,H=p.useCallback(()=>O!==void 0&&b.isSelected(O,V),[O,b,V]),U=p.useSyncExternalStore(b.subscribe,H,H);p.useLayoutEffect(()=>{if(O===void 0||A)return;let e=b.register(O);return r.isDev&&b.countRegistrations(O)>1&&ie(O),e},[b,O,A]),p.useLayoutEffect(()=>{if(O!==void 0&&!A&&L)return b.disable(O)},[b,O,A,L]),p.useEffect(()=>{j&&O===void 0&&r.warnOnce(`DataGrid.Row:missing-rowId`,"DataGrid.Row: a selectable grid needs a `rowId` on every row; this row has no selection control.")},[j,O]);let W=j&&O!==void 0&&B===void 0&&oe===void 0,G=e=>{if(!j||O===void 0||e.key!==` `)return;let t=e.target;(t===e.currentTarget||t.parentElement===e.currentTarget)&&(e.preventDefault(),L||S(O,e.nativeEvent))},ce=e=>{if(!w||!j||O===void 0||L)return;let t=e.currentTarget;d.isForeignEvent(e,{isOwnPart:e=>e.parentElement===t})||d.endsTextSelection(e)||S(O,e.nativeEvent)},q,le=-1;if(W){let e=N.findIndex(({node:e})=>n.isElementOfType(e,K,`td`,`th`));if(e>=0){let t=N[e].node;q=t.props.id??M,t.props.id===void 0&&(le=e)}}let ue=N.map(({key:e,node:t},n)=>re({key:e,node:n===le?p.cloneElement(t,{id:M}):t})),J=W&&q===void 0;p.useEffect(()=>{J&&r.warnOnce(`DataGrid.Row:selection-label`,'DataGrid.Row: no child is a `DataGrid.Cell`, `<td>` or `<th>` element, so the row selection control is named "Select row". Pass `selectionLabel` (a cell rendered by another component is not seen).')},[J]);let Y=oe??q,X=B??(Y===void 0?`Select row`:void 0),de=p.useMemo(()=>({selectionCellProps:c,hasSelectionCell:I,rowId:j?O:void 0,isSelected:U,disabled:L,invisible:R,ariaLabel:X,ariaLabelledBy:Y}),[c,I,j,O,U,L,R,X,Y]),Z=null;return!I&&A&&y!==`none`?Z=(0,m.jsx)(z,{selectionMode:y,initialFirst:ne,cellProps:c}):!I&&j&&(Z=(0,m.jsx)(se,{component:`DataGrid.Row`})),(0,m.jsx)(T.Provider,{value:de,children:(0,m.jsxs)(`tr`,{ref:_,className:t.cn(a.dataGridRowClassNames.root,`group/table-row`,!A&&ae[E],j&&U&&u.forcedColors.selectedContainer,f),"aria-selected":j?U:void 0,"data-selected":j&&U?``:void 0,...v,onClick:i.composeEventHandlers(h,ce),onKeyDown:i.composeEventHandlers(g,G),children:[Z,ue]})})};W.displayName=`DataGridRow`;function se({component:e,stableClassName:n,className:r,controlRef:i,"aria-describedby":o,ref:s,...c}){let{selectionMode:l,toggleRow:d,radioName:p,subtleSelection:h}=k(e),g=te(e),{rowId:_}=g,v=l===`single`;return(0,m.jsx)(`td`,{role:`gridcell`,...c,ref:s,"data-selection-cell":``,className:t.cn(n,a.dataGridRowClassNames.selectionCell,f.SELECTION_CELL_CLASSES,u.focusRingInset,g.selectionCellProps?.className,r),children:_!==void 0&&l!==`none`&&(0,m.jsx)(f.TableSelectionControl,{ref:i,type:v?`radio`:`checkbox`,name:v?p:void 0,form:v?``:void 0,checked:g.isSelected,disabled:g.disabled,invisible:g.invisible,subtle:h,onChange:e=>d(_,e.nativeEvent),"aria-label":g.ariaLabel,"aria-labelledby":g.ariaLabelledBy,"aria-describedby":o,className:a.dataGridRowClassNames.selectionControl})})}var G=({disabled:e,invisible:n,className:i,"aria-label":o,"aria-labelledby":s,"aria-describedby":c,controlRef:l,ref:u,...d})=>{let{selectionMode:f}=k(`DataGrid.SelectionCell`),h=p.useContext(x),g=p.useContext(C),_=p.useContext(T),v=f===`none`,y=!v&&_!==null&&!_.hasSelectionCell;if(p.useEffect(()=>{v&&r.warnOnce(`DataGrid.SelectionCell:not-selectable`,'DataGrid.SelectionCell: the grid has no row selection (`selectionMode` is "none"), so the cell renders nothing. Set `selectionMode` on the DataGrid, or remove the cell.')},[v]),p.useEffect(()=>{y&&r.warnOnce(`DataGrid.SelectionCell:unseen`,`DataGrid.SelectionCell: rendered by another component, so its DataGrid.Row did not see it and added its own selection cell. Render DataGrid.SelectionCell as a child of DataGrid.Row (a Fragment is fine).`)},[y]),v)return null;if(h===`header`){let r=_?.selectionCellProps;return(0,m.jsx)(z,{ref:u,selectionMode:f,initialFirst:g,stableClassName:a.dataGridSelectionCellClassNames.root,cellProps:{...d,className:t.cn(r?.className,i),disabled:e??r?.disabled,invisible:n??r?.invisible,"aria-label":o??r?.[`aria-label`],"aria-labelledby":s,"aria-describedby":c,controlRef:l}})}return(0,m.jsx)(se,{...d,ref:u,component:`DataGrid.SelectionCell`,stableClassName:a.dataGridSelectionCellClassNames.root,className:i,controlRef:l,"aria-describedby":c})};G.displayName=`DataGridSelectionCell`,f.markTablePart(G,`dataGridSelectionCell`);var K=({children:e,className:n,ref:r,...i})=>(0,m.jsx)(`td`,{ref:r,role:`gridcell`,className:t.cn(a.dataGridCellClassNames.root,P,`relative text-body-1`,u.focusRingInset,n),...i,children:e});K.displayName=`DataGridCell`;var ce=Object.assign(I,{Header:B,HeaderCell:V,Body:U,Row:W,Cell:K,SelectionCell:G});exports.DataGrid=ce,exports.DataGridBody=U,exports.DataGridCell=K,exports.DataGridHeader=B,exports.DataGridHeaderCell=V,exports.DataGridRow=W,exports.DataGridSelectionCell=G,exports.createSelectionStore=_;
|
|
1
|
+
"use client";const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../lib/cn.cjs"),n=require("../../lib/children.cjs"),r=require("../../lib/dev.cjs"),i=require("../../lib/composeEventHandlers.cjs"),a=require("../../lib/classNames.cjs"),o=require("../../hooks/useControllable.cjs"),s=require("../../hooks/useId.cjs"),c=require("../../hooks/useMergedRefs.cjs"),l=require("../../lib/selection.cjs"),u=require("./useGridNavigation.cjs"),d=require("../../lib/styles.cjs"),f=require("../../lib/events.cjs"),p=require("./Table.shared.cjs"),m=require("./DataGrid.sizing.cjs"),h=require("./DataGrid.window.cjs"),g=require("./DataGrid.store.cjs"),_=require("./DataGrid.context.cjs"),v=require("./DataGrid.header.cjs");let y=require("react");y=e.__toESM(y,1);let b=require("react/jsx-runtime");var x=[],S=[];function C(e){return e===void 0?void 0:Array.from(e)}function w(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}function ee(e,t,n){if(n.length===0)return e;let r=new Set(e),i=l.summarizeSelection(r,n).all?l.clearIds(r,n):l.selectAllIds(r,n),a=new Set(t);return[...Array.from(i).filter(e=>!a.has(e)),...t.filter(e=>i.has(e))]}function te({key:e,node:t}){return(0,b.jsx)(y.Fragment,{children:t},e)}function ne(e){return n.flattenChildren(e).filter(({node:e})=>y.isValidElement(e)).length}function T(e){return r.resolveDeprecatedProp(`DataGrid`,e.columnId,e.id,`columns[].id`,`columns[].columnId`)}function re(e){r.warnOnce(`DataGrid:duplicate-rowId:${e}`,`DataGrid: several rows share the rowId "${e}". Row ids must be unique within a DataGrid; rows with the same rowId are selected and deselected together.`)}var ie={brand:`hover:bg-subtle-hover data-[selected]:bg-selected transition-colors motion-reduce:transition-none`,neutral:`hover:bg-subtle-hover data-[selected]:bg-subtle-selected transition-colors motion-reduce:transition-none`,none:`hover:bg-subtle-hover transition-colors motion-reduce:transition-none`};function E(e){let{items:d,getRowId:f,isSelectionDisabled:p,sort:re,defaultSort:ie,sortColumn:E,defaultSortColumn:D,sortDirection:A,defaultSortDirection:j,onSortChange:M,selectionMode:N=`none`,selectedItems:oe,defaultSelectedItems:P,onSelectedItemsChange:F,selectedKeys:I,defaultSelectedKeys:L,onSelectionChange:R,labels:z,selectOnRowClick:se=!1,selectionAppearance:ce=`brand`,subtleSelection:B=!1,columns:V,resizableColumns:le=!1,columnSizingOptions:H,columnWidths:ue,defaultColumnWidths:de,onColumnWidthsChange:fe,virtualWindow:pe,containerProps:me,children:U,className:he,style:ge,onKeyDown:_e,onFocus:ve,onBlur:ye,onPointerDownCapture:be,ref:xe,...Se}=e,W=d!==void 0,Ce=re!==void 0||ie!==void 0,G=!Ce&&!W,[we,Te]=y.useState(!G);!G&&!we&&Te(!0);let Ee=we||!G,De=E!==void 0||A!==void 0;E!==void 0&&r.warnDeprecated(`DataGrid`,`sortColumn`,`sort`),A!==void 0&&r.warnDeprecated(`DataGrid`,`sortDirection`,`sort`),D!==void 0&&r.warnDeprecated(`DataGrid`,`defaultSortColumn`,`defaultSort`),j!==void 0&&r.warnDeprecated(`DataGrid`,`defaultSortDirection`,`defaultSort`);let Oe=De||D!==void 0||j!==void 0,ke=Ce&&Oe,Ae=!G&&!Ce&&Oe;y.useEffect(()=>{ke?r.warnOnce(`DataGrid:mixed-sort`,"DataGrid: do not mix `sort`/`defaultSort` with the deprecated `sortColumn`/`sortDirection`/`defaultSortColumn`/`defaultSortDirection`. `sort`/`defaultSort` win."):Ae&&r.warnOnce(`DataGrid:items-deprecated-sort`,"DataGrid: the deprecated `sortColumn`/`sortDirection`/`defaultSortColumn`/`defaultSortDirection` do not apply to a grid with `items` and are ignored. Pass `sort` or `defaultSort`.")},[ke,Ae]),y.useEffect(()=>{G&&(E!==void 0&&A===void 0?r.warnOnce(`DataGrid:sortColumn-without-sortDirection`,"DataGrid: `sortColumn` is controlled but `sortDirection` is not (mixed control). The direction is kept internally and toggles on repeated clicks, as in 0.4. Pass `sort` (`{ columnId, direction }`) to control both."):A!==void 0&&E===void 0&&r.warnOnce(`DataGrid:sortDirection-without-sortColumn`,"DataGrid: `sortDirection` is controlled but `sortColumn` is not (mixed control). The column is kept internally and follows the clicked header, as in 0.4. Pass `sort` (`{ columnId, direction }`) to control both."))},[G,E,A]);let[je,Me]=y.useState(()=>({column:D??``,direction:j??`ascending`})),Ne=y.useMemo(()=>{if(E===void 0&&A===void 0)return;let e=E??je.column;return e===``?null:{columnId:e,direction:A??je.direction}},[E,A,je]),Pe=y.useMemo(()=>D?{columnId:D,direction:j??`ascending`}:null,[D,j]),Fe=G?Ne:re,Ie=Pe;ie===void 0?Ae&&(Ie=null):Ie=ie;let Le=y.useRef(void 0),[Re,ze]=o.useControllable(Fe,Ie,e=>{e&&(G&&Me(t=>t.column===e.columnId&&t.direction===e.direction?t:{column:e.columnId,direction:e.direction}),M&&(Ee?M(e,Le.current):M(e.columnId,e.direction)))}),Be=y.useCallback((e,t)=>{Le.current={event:t};try{ze(t=>({columnId:e,direction:t?.columnId===e&&t.direction===`ascending`?`descending`:`ascending`}))}finally{Le.current=void 0}},[ze]),Ve=y.useMemo(()=>({sort:Re,requestSort:Be}),[Re,Be]);R!==void 0&&r.warnDeprecated(`DataGrid`,`onSelectionChange`,`onSelectedItemsChange`);let He=y.useMemo(()=>C(I),[I]),Ue=y.useMemo(()=>C(L),[L]),We=r.resolveDeprecatedProp(`DataGrid`,oe,He,`selectedKeys`,`selectedItems`),Ge=r.resolveDeprecatedProp(`DataGrid`,P,Ue,`defaultSelectedKeys`,`defaultSelectedItems`)??x,Ke=y.useRef(void 0),[qe,Je]=o.useControllable(We,Ge,e=>{F?.([...e],Ke.current),R?.(new Set(e))}),Ye=y.useCallback((e,t)=>{Ke.current={event:e};try{Je(t)}finally{Ke.current=void 0}},[Je]),K=y.useMemo(()=>{if(d===void 0)return null;let e=new Set;return d.map((t,n)=>{let r=f?f(t):String(n),i=e.has(r)?`${r}\u0000${n}`:r;return e.add(i),{item:t,index:n,rowId:r,key:i}})},[d,f]),q=N!==`none`,J=y.useMemo(()=>K===null||!p||!q?null:K.map(e=>p(e.item,e.index)),[K,p,q]),Xe=y.useMemo(()=>{if(K===null||!q)return null;let e=new Set;if(J)for(let t of K)J[t.index]&&e.add(t.rowId);return{ids:K.map(e=>e.rowId),disabled:e}},[K,J,q]),Y=N===`single`,[X]=y.useState(()=>g.createSelectionStore(qe,Y,Xe));y.useLayoutEffect(()=>{X.setUniverse(Xe)},[X,Xe]),y.useLayoutEffect(()=>{X.setSelected(qe)},[X,qe]),y.useLayoutEffect(()=>{X.setSingleMode(Y)},[X,Y]);let Ze=y.useCallback((e,t)=>{Ye(t,t=>{let n;if(W){let r=new Set(Y?t.slice(0,1):t);n=Array.from(l.toggleId(r,e,Y?`single`:`multiple`,{allowEmpty:!0}))}else{let r=X.prune(t);n=Y?r[0]===e?[]:[e]:r.includes(e)?r.filter(t=>t!==e):[...r,e]}return w(n,t)?t:n})},[W,Y,Ye,X]),Qe=qe.length;y.useEffect(()=>{Y&&Qe>1&&r.warnOnce(`DataGrid:single-several-selected`,`DataGrid: a single-selection grid (selectionMode "single") has ${Qe} selected row ids; only ${W?`the first one`:`the first one that is rendered`} is selected. Pass at most one id in \`selectedItems\`/\`defaultSelectedItems\`, or use selectionMode="multiple".`)},[Y,Qe,W]);let $e=y.useCallback(e=>{Ye(e,e=>{let t;if(W)t=ee(e,X.getUniverseIds(),X.getSelectableIds());else{let n=new Set(X.prune(e)),r=X.getRegistered(),i=r.filter(e=>!X.isDisabled(e));t=i.length>0&&i.every(e=>n.has(e))?r.filter(e=>X.isDisabled(e)&&n.has(e)):r.filter(e=>!X.isDisabled(e)||n.has(e))}return w(t,e)?e:t})},[W,Ye,X]),et=s.useId(`wave-datagrid-selection`),tt=z?.selectAll??`Select all rows`,nt=z?.selectionHeader??`Selection`,rt=y.useMemo(()=>({selectionMode:N,store:X,toggleRow:Ze,toggleAll:$e,radioName:et,selectAllLabel:tt,selectionHeaderLabel:nt,selectOnRowClick:se,selectionAppearance:ce,subtleSelection:B}),[N,X,Ze,$e,et,tt,nt,se,ce,B]),it=Re?.columnId,at=Re?.direction,ot=y.useMemo(()=>{if(W&&it!==void 0&&V)return V.find(e=>T(e)===it)?.compare},[W,it,V]),st=y.useMemo(()=>{if(K===null||!ot)return K;let e=ot;return K.slice().sort(at===`descending`?(t,n)=>-e(t.item,n.item):(t,n)=>e(t.item,n.item))},[K,ot,at]),ct=y.useMemo(()=>{if(!V||!W)return null;let e=V.map((e,t)=>T(e)??t);return t=>(0,b.jsx)(k,{children:V.map((n,r)=>(0,b.jsx)(ae,{children:n.renderCell?.(t)},e[r]))})},[V,W]),lt=y.useMemo(()=>({rows:st,renderColumnsRow:ct,selectionDisabled:J}),[st,ct,J]),ut=V?.some(e=>e.columnId===void 0&&e.id===void 0)??!1;y.useEffect(()=>{ut&&r.warnOnce(`DataGrid:column-without-columnId`,"DataGrid: a column in `columns` has no `columnId` (nor the deprecated `id`), so its header cannot sort. Give every column a unique `columnId`.")},[ut]);let dt=V?n.flattenChildren(U):[],ft=e=>dt.find(({node:t})=>n.isElementOfType(t,e))?.node,pt=ft(v.DataGridHeader),mt=ft(O),ht=n.isElementOfType(mt,O)?mt.props.children:void 0,gt=pe!==void 0&&W&&V!==void 0&&(ht===void 0||typeof ht==`function`)?pe:null,Z=gt!==null,_t=n.isElementOfType(pt,v.DataGridHeader)?ne(pt.props.children):1,vt=d?.length??0,{gridRef:yt,gridProps:bt,activeRowIndex:xt,pendingRowIndex:St}=u.useGridNavigation({model:h.getWindowNavigationModel(gt,vt,_t)}),Q=h.useDataGridWindow({virtualWindow:gt,ignored:pe!==void 0&&!Z,rows:st,headerRowCount:_t,columnCount:(V?.length??0)+ +!!q,activeRowIndex:xt,pendingRowIndex:St}),Ct=c.useMergedRefs(xe,yt,Q.tableRef),wt=e=>{bt.onFocus(e),Q.onFocus(e)},Tt=e=>{bt.onBlur(e),Q.onBlur(e)},Et=le||H!==void 0||ue!==void 0||de!==void 0,Dt=Et&&!(V&&W);y.useEffect(()=>{Dt&&r.warnOnce(`DataGrid:resizable-columns-require-columns`,"DataGrid: `resizableColumns`, `columnSizingOptions`, `columnWidths` and `defaultColumnWidths` need the `columns` prop together with `items`, and are ignored without them. Render the grid from `items` and `columns`.")},[Dt]);let Ot=Et&&!Dt||Z,kt=y.useMemo(()=>Ot&&V?V.map(T):S,[Ot,V]),$=m.useDataGridColumnSizing({enabled:Ot,resizable:le,columnIds:kt,selectionColumn:N!==`none`,columnSizingOptions:H,columnWidths:ue,defaultColumnWidths:de,onColumnWidthsChange:fe,resizeColumnLabel:z?.resizeColumn,columnWidthText:z?.columnWidth}),At=U,jt=V&&pt===void 0?(0,b.jsx)(v.DataGridHeader,{children:(0,b.jsx)(`tr`,{children:V.map((e,t)=>{let n=T(e);return(0,b.jsx)(v.DataGridHeaderCell,{columnId:n,sortable:e.sortable??e.compare!==void 0,children:e.renderHeaderCell?e.renderHeaderCell():e.label},n??t)})})},`wave-generated-header`):null,Mt=V&&W&&mt===void 0?(0,b.jsx)(O,{},`wave-generated-body`):null;if(jt||Mt||$.colgroup){let e=({node:e})=>n.isElementOfType(e,`caption`),t=dt.filter(t=>!e(t)),r=Mt?t.findIndex(({node:e})=>n.isElementOfType(e,`tfoot`)):-1,i=r>=0?r:t.length;At=[...dt.filter(e).map(te),$.colgroup,jt,...t.slice(0,i).map(te),Mt,...t.slice(i).map(te)]}let{className:Nt,"aria-label":Pt,"aria-labelledby":Ft,ref:It,...Lt}=me??{},Rt=c.useMergedRefs(It,Q.scrollerRef,gt?.scrollRef),zt=Lt.role!==void 0,Bt=!zt&&(Pt!==void 0||Ft!==void 0);return y.useEffect(()=>{Bt&&r.warnOnce(`DataGrid:container-name-without-role`,'DataGrid: `containerProps["aria-label"]`/`["aria-labelledby"]` is ignored because the wrapper has no role. Name the grid itself (`aria-label` on DataGrid), or pass a `role` (e.g. "region") in `containerProps` too.')},[Bt]),(0,b.jsx)(_.DataGridContext.Provider,{value:rt,children:(0,b.jsx)(_.DataGridSortContext.Provider,{value:Ve,children:(0,b.jsx)(_.DataGridItemsContext.Provider,{value:lt,children:(0,b.jsx)(_.DataGridRowContext.Provider,{value:null,children:(0,b.jsx)(_.DataGridRowIdContext.Provider,{value:null,children:(0,b.jsx)(_.DataGridItemSelectionDisabledContext.Provider,{value:void 0,children:(0,b.jsx)(m.DataGridResizeContext.Provider,{value:$.resizeContext,children:(0,b.jsx)(m.DataGridFixedLayoutContext.Provider,{value:$.colgroup!==null,children:(0,b.jsx)(`div`,{tabIndex:Z?-1:void 0,...Lt,ref:Rt,"aria-label":zt?Pt:void 0,"aria-labelledby":zt?Ft:void 0,className:t.cn(a.dataGridClassNames.container,`overflow-x-auto rounded-md border border-border`,Z&&`[overflow-anchor:none]`,Nt),children:(0,b.jsx)(`table`,{ref:Ct,role:`grid`,"aria-multiselectable":N===`multiple`||void 0,"aria-rowcount":Z?vt+_t:void 0,"data-selection-appearance":ce,"data-subtle-selection":B?``:void 0,"data-resizing":$.resizing?``:void 0,className:t.cn(a.dataGridClassNames.root,`w-full border-separate border-spacing-0`,B&&`group/grid`,he),style:$.tableStyle?{...$.tableStyle,...ge}:ge,...Se,onKeyDown:i.composeEventHandlers(_e,bt.onKeyDown),onFocus:i.composeEventHandlers(ve,wt,{checkDefaultPrevented:!1}),onBlur:i.composeEventHandlers(ye,Tt,{checkDefaultPrevented:!1}),onPointerDownCapture:i.composeEventHandlers(be,Q.onPointerDownCapture),children:(0,b.jsx)(h.DataGridWindowContext.Provider,{value:Q.context,children:(0,b.jsx)(h.DataGridWindowRowContext.Provider,{value:null,children:At})})})})})})})})})})})})}E.displayName=`DataGrid`;var D=y.memo(function({item:e,index:t,rowId:n,selectionDisabled:r,render:i,position:a,ariaRowIndex:o,height:s}){let c=y.useMemo(()=>a===void 0||o===void 0?null:{index:a,ariaRowIndex:o,height:s},[a,o,s]);return(0,b.jsx)(_.DataGridRowIdContext.Provider,{value:n,children:(0,b.jsx)(_.DataGridItemSelectionDisabledContext.Provider,{value:r,children:(0,b.jsx)(h.DataGridWindowRowContext.Provider,{value:c,children:i(e,t)})})})}),O=({children:e,className:n,ref:i,...o})=>{let s=y.useContext(_.DataGridItemsContext),c=y.useContext(h.DataGridWindowContext),l=s?.rows??null,u=typeof e==`function`&&l===null;y.useEffect(()=>{u&&r.warnOnce(`DataGrid.Body:render-without-items`,"DataGrid.Body: a render function child renders one row per item of the DataGrid's `items`, which is not set, so the body has no rows.")},[u]);let d=s?.selectionDisabled??null,f=e=>{if(!e||!l)return null;if(c){let{headerRowCount:t,virtualWindow:n}=c;return h.renderWindowRows(c,l.length,r=>{let i=l[r];return(0,b.jsx)(D,{item:i.item,index:i.index,rowId:i.rowId,selectionDisabled:d?.[i.index],render:e,position:r,ariaRowIndex:r+t+1,height:n.itemSize},`row:${i.key}`)})}return l.map(t=>(0,b.jsx)(D,{item:t.item,index:t.index,rowId:t.rowId,selectionDisabled:d?.[t.index],render:e},t.key))},p;return p=typeof e==`function`?f(e):e===void 0?f(s?.renderColumnsRow??null):e,(0,b.jsx)(_.DataGridSectionContext.Provider,{value:`body`,children:(0,b.jsx)(`tbody`,{ref:i,className:t.cn(a.dataGridBodyClassNames.root,n),...o,children:p})})};O.displayName=`DataGridBody`;var k=({rowId:e,selectionLabel:o,selectionCellProps:c,children:l,className:u,style:p,onClick:m,onKeyDown:g,ref:x,...S})=>{let{selectionMode:C,store:w,toggleRow:ee,selectOnRowClick:ne,selectionAppearance:T}=_.useDataGridContext(`DataGrid.Row`),E=y.useContext(h.DataGridWindowRowContext),D=y.useContext(_.DataGridRowIdContext),O=e??D??void 0,k=y.useContext(_.DataGridSectionContext),j=y.useContext(_.DataGridHeaderRowHintContext),M=k===`header`,N=C!==`none`&&!M,oe=s.useId(`wave-datagrid-row-label`),P=n.flattenChildren(l),F;for(let{node:e}of P)if(v.isSelectionCellElement(e)){F=e.props;break}let I=F!==void 0,L=y.useContext(_.DataGridItemSelectionDisabledContext),R=F?.disabled??c?.disabled,z=R??L??!1,se=F?.invisible??c?.invisible??!1,ce=F?.[`aria-labelledby`],B=F?.[`aria-label`]??c?.[`aria-label`]??o,V=C===`single`,le=y.useCallback(()=>O!==void 0&&w.isSelected(O,V),[O,w,V]),H=y.useSyncExternalStore(w.subscribe,le,le);y.useLayoutEffect(()=>{if(O===void 0||M)return;let e=w.register(O);return r.isDev&&w.countRegistrations(O)>1&&re(O),e},[w,O,M]),y.useLayoutEffect(()=>{if(O!==void 0&&!M&&z)return w.disable(O)},[w,O,M,z]),y.useEffect(()=>{N&&O===void 0&&r.warnOnce(`DataGrid.Row:missing-rowId`,"DataGrid.Row: a selectable grid needs a `rowId` on every row; this row has no selection control.")},[N,O]);let ue=N&&O!==void 0&&L!==void 0&&R!==void 0&&R!==L;y.useEffect(()=>{if(!ue)return;let e=e=>e?`disabled`:`enabled`;r.warnOnce(`DataGrid:selection-disabled-mismatch`,`DataGrid: the selection cell of row "${O}" is ${e(z)} (\`DataGrid.SelectionCell disabled\` or \`selectionCellProps.disabled\`), but \`isSelectionDisabled\` says its item is ${e(!z)}. Select-all skips a row that either one disables, and the row's control follows its cell: make them agree, or leave the cell's \`disabled\` unset to take it from \`isSelectionDisabled\`.`)},[ue,O,z]);let de=N&&e!==void 0&&D!==null&&e!==D;y.useEffect(()=>{de?r.warnOnce(`DataGrid.Row:row-id-mismatch`,"DataGrid.Row: a row rendered from the grid's `items` sets its own `rowId`, which differs from its item's id (`getRowId`, by default the item's index). Select-all and its checkbox use the ids from `getRowId`, so the row is outside them and select-all selects ids that no row has. Pass a `getRowId` that returns the row's id, and leave out `rowId`."):N&&O!==void 0&&D===null&&w.isOutsideUniverse(O)&&r.warnOnce(`DataGrid.Row:row-id-outside-items`,"DataGrid.Row: a selectable row in a grid with `items` has a `rowId` that is no item's id (`getRowId`, by default the item's index). Select-all and its checkbox use the ids of `items`, so the row is outside them. Render the rows from `items` (a `DataGrid.Body` render function, or `columns`) with a `getRowId` that returns their ids.")},[de,N,O,D,w]);let fe=N&&O!==void 0&&B===void 0&&ce===void 0,pe=e=>{if(!N||O===void 0||e.key!==` `)return;let t=e.target;(t===e.currentTarget||t.parentElement===e.currentTarget)&&(e.preventDefault(),z||ee(O,e.nativeEvent))},me=e=>{if(!ne||!N||O===void 0||z)return;let t=e.currentTarget;f.isForeignEvent(e,{isOwnPart:e=>e.parentElement===t})||f.endsTextSelection(e)||ee(O,e.nativeEvent)},U,he=-1;if(fe){let e=P.findIndex(({node:e})=>n.isElementOfType(e,ae,`td`,`th`));if(e>=0){let t=P[e].node;U=t.props.id??oe,t.props.id===void 0&&(he=e)}}let ge=P.map(({key:e,node:t},n)=>te({key:e,node:n===he?y.cloneElement(t,{id:oe}):t})),_e=fe&&U===void 0;y.useEffect(()=>{_e&&r.warnOnce(`DataGrid.Row:selection-label`,'DataGrid.Row: no child is a `DataGrid.Cell`, `<td>` or `<th>` element, so the row selection control is named "Select row". Pass `selectionLabel` (a cell rendered by another component is not seen).')},[_e]);let ve=ce??U,ye=B??(ve===void 0?`Select row`:void 0),be=y.useMemo(()=>({selectionCellProps:c,hasSelectionCell:I,rowId:N?O:void 0,isSelected:H,disabled:z,invisible:se,ariaLabel:ye,ariaLabelledBy:ve}),[c,I,N,O,H,z,se,ye,ve]),xe=null;return!I&&M&&C!==`none`?xe=(0,b.jsx)(v.DataGridSelectionHeaderSlot,{selectionMode:C,initialFirst:j,cellProps:c}):!I&&N&&(xe=(0,b.jsx)(A,{component:`DataGrid.Row`})),(0,b.jsx)(_.DataGridRowContext.Provider,{value:be,children:(0,b.jsxs)(`tr`,{ref:x,className:t.cn(a.dataGridRowClassNames.root,`group/table-row`,!M&&ie[T],N&&H&&d.forcedColors.selectedContainer,u),"aria-selected":N?H:void 0,"data-selected":N&&H?``:void 0,...S,style:E?.height===void 0?p:{...p,height:E.height},...E&&{"aria-rowindex":E.ariaRowIndex,"data-row-index":E.index},onClick:i.composeEventHandlers(m,me),onKeyDown:i.composeEventHandlers(g,pe),children:[xe,ge]})})};k.displayName=`DataGridRow`;function A({component:e,stableClassName:n,className:r,controlRef:i,"aria-describedby":o,ref:s,...c}){let{selectionMode:l,toggleRow:u,radioName:f,subtleSelection:m}=_.useDataGridContext(e),g=_.useDataGridRowContext(e),v=y.useContext(h.DataGridWindowRowContext)?.index!==void 0,{rowId:x}=g,S=l===`single`;return(0,b.jsx)(`td`,{role:`gridcell`,...c,ref:s,"data-selection-cell":``,className:t.cn(n,a.dataGridRowClassNames.selectionCell,p.SELECTION_CELL_CLASSES,v&&`py-0 align-middle`,d.focusRingInset,g.selectionCellProps?.className,r),children:x!==void 0&&l!==`none`&&(0,b.jsx)(p.TableSelectionControl,{ref:i,type:S?`radio`:`checkbox`,name:S?f:void 0,form:S?``:void 0,checked:g.isSelected,disabled:g.disabled,invisible:g.invisible,subtle:m,onChange:e=>u(x,e.nativeEvent),"aria-label":g.ariaLabel,"aria-labelledby":g.ariaLabelledBy,"aria-describedby":o,className:a.dataGridRowClassNames.selectionControl})})}var j=({disabled:e,invisible:n,className:i,"aria-label":o,"aria-labelledby":s,"aria-describedby":c,controlRef:l,ref:u,...d})=>{let{selectionMode:f}=_.useDataGridContext(`DataGrid.SelectionCell`),p=y.useContext(_.DataGridSectionContext),m=y.useContext(_.DataGridHeaderRowHintContext),h=y.useContext(_.DataGridRowContext),g=f===`none`,x=!g&&h!==null&&!h.hasSelectionCell;if(y.useEffect(()=>{g&&r.warnOnce(`DataGrid.SelectionCell:not-selectable`,'DataGrid.SelectionCell: the grid has no row selection (`selectionMode` is "none"), so the cell renders nothing. Set `selectionMode` on the DataGrid, or remove the cell.')},[g]),y.useEffect(()=>{x&&r.warnOnce(`DataGrid.SelectionCell:unseen`,`DataGrid.SelectionCell: rendered by another component, so its DataGrid.Row did not see it and added its own selection cell. Render DataGrid.SelectionCell as a child of DataGrid.Row (a Fragment is fine).`)},[x]),g)return null;if(p===`header`){let r=h?.selectionCellProps;return(0,b.jsx)(v.DataGridSelectionHeaderSlot,{ref:u,selectionMode:f,initialFirst:m,stableClassName:a.dataGridSelectionCellClassNames.root,cellProps:{...d,className:t.cn(r?.className,i),disabled:e??r?.disabled,invisible:n??r?.invisible,"aria-label":o??r?.[`aria-label`],"aria-labelledby":s,"aria-describedby":c,controlRef:l}})}return(0,b.jsx)(A,{...d,ref:u,component:`DataGrid.SelectionCell`,stableClassName:a.dataGridSelectionCellClassNames.root,className:i,controlRef:l,"aria-describedby":c})};j.displayName=`DataGridSelectionCell`,p.markTablePart(j,`dataGridSelectionCell`);var ae=({children:e,className:n,ref:r,...i})=>{let o=y.useContext(m.DataGridFixedLayoutContext),s=y.useContext(h.DataGridWindowRowContext)?.index!==void 0;return(0,b.jsx)(`td`,{ref:r,role:`gridcell`,className:t.cn(a.dataGridCellClassNames.root,v.cellBase,`relative text-body-1`,(o||s)&&`overflow-hidden text-ellipsis whitespace-nowrap`,s&&`py-0 align-middle`,d.focusRingInset,n),...i,children:e})};ae.displayName=`DataGridCell`;var M=Object.assign(E,{Header:v.DataGridHeader,HeaderCell:v.DataGridHeaderCell,Body:O,Row:k,Cell:ae,SelectionCell:j});exports.DataGrid=M,exports.DataGridBody=O,exports.DataGridCell=ae,exports.DataGridHeader=v.DataGridHeader,exports.DataGridHeaderCell=v.DataGridHeaderCell,exports.DataGridRow=k,exports.DataGridSelectionCell=j,exports.createSelectionStore=g.createSelectionStore;
|
|
2
2
|
//# sourceMappingURL=DataGrid.cjs.map
|