@dxos/react-ui-table 0.3.9-main.f27ec14 → 0.3.9-main.f8fc6b9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/index.mjs +197 -147
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/components/Cell/CellCombobox.d.ts.map +1 -1
- package/dist/types/src/components/ColumnMenu.d.ts.map +1 -1
- package/dist/types/src/components/Table/Table.d.ts.map +1 -1
- package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
- package/dist/types/src/components/Table/props.d.ts +4 -2
- package/dist/types/src/components/Table/props.d.ts.map +1 -1
- package/dist/types/src/helpers.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/schema.d.ts +0 -1
- package/dist/types/src/schema.d.ts.map +1 -1
- package/dist/types/src/theme.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +11 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/package.json +11 -12
- package/src/components/Cell/CellCombobox.tsx +4 -1
- package/src/components/ColumnMenu.tsx +16 -16
- package/src/components/Table/Table.stories.tsx +21 -12
- package/src/components/Table/Table.tsx +86 -25
- package/src/components/Table/props.ts +24 -16
- package/src/helpers.tsx +67 -54
- package/src/index.ts +1 -0
- package/src/schema.ts +0 -8
- package/src/theme.ts +2 -2
- package/src/translations.ts +11 -0
|
@@ -1,45 +1,42 @@
|
|
|
1
1
|
// packages/ui/react-ui-table/src/components/ColumnMenu.tsx
|
|
2
2
|
import { Check, CaretDown, Trash, X } from "@phosphor-icons/react";
|
|
3
3
|
import React, { useRef, useState } from "react";
|
|
4
|
-
import { Button, DensityProvider, Input, Popover, Select, Separator } from "@dxos/react-ui";
|
|
4
|
+
import { Button, DensityProvider, Input, Popover, Select, Separator, useTranslation } from "@dxos/react-ui";
|
|
5
5
|
import { getSize, mx } from "@dxos/react-ui-theme";
|
|
6
6
|
import { safeParseInt } from "@dxos/util";
|
|
7
7
|
|
|
8
|
-
// packages/ui/react-ui-table/src/
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
]);
|
|
8
|
+
// packages/ui/react-ui-table/src/translations.ts
|
|
9
|
+
var translationKey = "table";
|
|
10
|
+
var translations_default = [
|
|
11
|
+
{
|
|
12
|
+
"en-US": {
|
|
13
|
+
[translationKey]: {
|
|
14
|
+
"no selection label": "\xA0",
|
|
15
|
+
"number column type label": "Number",
|
|
16
|
+
"boolean column type label": "Toggle",
|
|
17
|
+
"date column type label": "Date",
|
|
18
|
+
"string column type label": "Text",
|
|
19
|
+
"ref column type label": "Reference",
|
|
20
|
+
"digits label": "Decimal places",
|
|
21
|
+
"save label": "Save",
|
|
22
|
+
"delete label": "Delete",
|
|
23
|
+
"column label label": "Label",
|
|
24
|
+
"property key label": "Property",
|
|
25
|
+
"column type label": "Type"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
];
|
|
31
30
|
|
|
32
31
|
// packages/ui/react-ui-table/src/components/ColumnMenu.tsx
|
|
33
32
|
var ColumnMenu = ({ column, ...props }) => {
|
|
34
33
|
const title = column.label?.length ? column.label : column.id;
|
|
35
34
|
return /* @__PURE__ */ React.createElement("div", {
|
|
36
|
-
className: "flex
|
|
35
|
+
className: "flex items-center gap-2"
|
|
37
36
|
}, /* @__PURE__ */ React.createElement("div", {
|
|
38
|
-
className: "truncate",
|
|
37
|
+
className: "flex-1 min-is-0 truncate",
|
|
39
38
|
title
|
|
40
39
|
}, title), /* @__PURE__ */ React.createElement("div", {
|
|
41
|
-
className: "grow"
|
|
42
|
-
}), /* @__PURE__ */ React.createElement("div", {
|
|
43
40
|
className: "flex shrink-0"
|
|
44
41
|
}, /* @__PURE__ */ React.createElement(ColumnPanel, {
|
|
45
42
|
...props,
|
|
@@ -59,6 +56,7 @@ var ColumnPanel = ({ context, tableDefs, tableDef, column, onUpdate, onDelete })
|
|
|
59
56
|
const [label, setLabel] = useState(column.label);
|
|
60
57
|
const [digits, setDigits] = useState(String(column.digits ?? "0"));
|
|
61
58
|
const propRef = useRef(null);
|
|
59
|
+
const { t } = useTranslation(translationKey);
|
|
62
60
|
const handleCancel = () => {
|
|
63
61
|
setProp(column.id);
|
|
64
62
|
setOpen(false);
|
|
@@ -93,7 +91,7 @@ var ColumnPanel = ({ context, tableDefs, tableDef, column, onUpdate, onDelete })
|
|
|
93
91
|
asChild: true
|
|
94
92
|
}, /* @__PURE__ */ React.createElement(Button, {
|
|
95
93
|
variant: "ghost",
|
|
96
|
-
classNames: "p-
|
|
94
|
+
classNames: "p-1"
|
|
97
95
|
}, /* @__PURE__ */ React.createElement(CaretDown, {
|
|
98
96
|
className: getSize(4)
|
|
99
97
|
}))), /* @__PURE__ */ React.createElement(Popover.Portal, null, /* @__PURE__ */ React.createElement(Popover.Content, null, /* @__PURE__ */ React.createElement(Popover.Viewport, {
|
|
@@ -104,14 +102,14 @@ var ColumnPanel = ({ context, tableDefs, tableDef, column, onUpdate, onDelete })
|
|
|
104
102
|
className: "flex flex-col gap-1"
|
|
105
103
|
}, /* @__PURE__ */ React.createElement(Section, null, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
|
|
106
104
|
classNames: "mbe-1"
|
|
107
|
-
}, "
|
|
105
|
+
}, t("column label label")), /* @__PURE__ */ React.createElement(Input.TextInput, {
|
|
108
106
|
placeholder: "Column label",
|
|
109
107
|
value: label ?? "",
|
|
110
108
|
onChange: (event) => setLabel(event.target.value),
|
|
111
109
|
autoFocus: true
|
|
112
110
|
})), /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
|
|
113
111
|
classNames: "mbe-1 mbs-3"
|
|
114
|
-
}, "
|
|
112
|
+
}, t("property key label")), /* @__PURE__ */ React.createElement(Input.TextInput, {
|
|
115
113
|
ref: propRef,
|
|
116
114
|
placeholder: "Property key",
|
|
117
115
|
// TODO(burdon): Provide hooks for value normalization, ENTER, ESC, etc.
|
|
@@ -119,18 +117,23 @@ var ColumnPanel = ({ context, tableDefs, tableDef, column, onUpdate, onDelete })
|
|
|
119
117
|
onChange: (event) => setProp(event.target.value.replace(/[^\w_]/g, ""))
|
|
120
118
|
})), /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
|
|
121
119
|
classNames: "mbe-1 mbs-3"
|
|
122
|
-
}, "
|
|
120
|
+
}, t("column type label")), /* @__PURE__ */ React.createElement(Select.Root, {
|
|
123
121
|
value: type,
|
|
124
122
|
onValueChange: setType
|
|
125
123
|
}, /* @__PURE__ */ React.createElement(Select.TriggerButton, {
|
|
126
124
|
placeholder: "Type",
|
|
127
125
|
classNames: "is-full"
|
|
128
|
-
}), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null,
|
|
126
|
+
}), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, [
|
|
127
|
+
"number",
|
|
128
|
+
"boolean",
|
|
129
|
+
"string",
|
|
130
|
+
"ref"
|
|
131
|
+
].map((type2) => /* @__PURE__ */ React.createElement(Select.Option, {
|
|
129
132
|
key: type2,
|
|
130
133
|
value: type2
|
|
131
|
-
},
|
|
134
|
+
}, t(`${type2} column type label`))))))))), type === "number" && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Section, null, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
|
|
132
135
|
classNames: "mbe-1 mbs-3"
|
|
133
|
-
}, "
|
|
136
|
+
}, t("digits label")), /* @__PURE__ */ React.createElement(Input.TextInput, {
|
|
134
137
|
value: digits ?? "",
|
|
135
138
|
onChange: (event) => setDigits(event.target.value)
|
|
136
139
|
})))), type === "ref" && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Section, null, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
|
|
@@ -141,7 +144,7 @@ var ColumnPanel = ({ context, tableDefs, tableDef, column, onUpdate, onDelete })
|
|
|
141
144
|
}, /* @__PURE__ */ React.createElement(Select.TriggerButton, {
|
|
142
145
|
placeholder: "Table",
|
|
143
146
|
classNames: "is-full"
|
|
144
|
-
}), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, tableDefs.filter((
|
|
147
|
+
}), /* @__PURE__ */ React.createElement(Select.Portal, null, /* @__PURE__ */ React.createElement(Select.Content, null, /* @__PURE__ */ React.createElement(Select.Viewport, null, tableDefs.filter((t2) => t2.id !== tableDef.id).map(({ id, name }) => /* @__PURE__ */ React.createElement(Select.Option, {
|
|
145
148
|
key: id,
|
|
146
149
|
value: id
|
|
147
150
|
}, name ?? id))))))), refTable && /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
|
|
@@ -163,21 +166,23 @@ var ColumnPanel = ({ context, tableDefs, tableDef, column, onUpdate, onDelete })
|
|
|
163
166
|
variant: "primary",
|
|
164
167
|
classNames: "is-full flex gap-2",
|
|
165
168
|
onClick: handleSave
|
|
166
|
-
}, /* @__PURE__ */ React.createElement("span", null, "
|
|
169
|
+
}, /* @__PURE__ */ React.createElement("span", null, t("save label")), /* @__PURE__ */ React.createElement("div", {
|
|
167
170
|
className: "grow"
|
|
168
171
|
}), /* @__PURE__ */ React.createElement(Check, {
|
|
169
172
|
className: getSize(5)
|
|
170
173
|
})), /* @__PURE__ */ React.createElement(Button, {
|
|
171
174
|
classNames: "is-full flex gap-2",
|
|
172
175
|
onClick: handleCancel
|
|
173
|
-
}, /* @__PURE__ */ React.createElement("span", null, "
|
|
176
|
+
}, /* @__PURE__ */ React.createElement("span", null, t("cancel label", {
|
|
177
|
+
ns: "os"
|
|
178
|
+
})), /* @__PURE__ */ React.createElement("div", {
|
|
174
179
|
className: "grow"
|
|
175
180
|
}), /* @__PURE__ */ React.createElement(X, {
|
|
176
181
|
className: getSize(5)
|
|
177
182
|
})), /* @__PURE__ */ React.createElement(Button, {
|
|
178
183
|
classNames: "is-full flex gap-2",
|
|
179
184
|
onClick: () => onDelete?.(column.id)
|
|
180
|
-
}, /* @__PURE__ */ React.createElement("span", null, "
|
|
185
|
+
}, /* @__PURE__ */ React.createElement("span", null, t("delete label")), /* @__PURE__ */ React.createElement("div", {
|
|
181
186
|
className: "grow"
|
|
182
187
|
}), /* @__PURE__ */ React.createElement(Trash, {
|
|
183
188
|
className: getSize(5)
|
|
@@ -187,6 +192,7 @@ var ColumnPanel = ({ context, tableDefs, tableDef, column, onUpdate, onDelete })
|
|
|
187
192
|
// packages/ui/react-ui-table/src/components/Table/Table.tsx
|
|
188
193
|
import { useControllableState } from "@radix-ui/react-use-controllable-state";
|
|
189
194
|
import { getCoreRowModel, getGroupedRowModel, useReactTable } from "@tanstack/react-table";
|
|
195
|
+
import { useVirtualizer } from "@tanstack/react-virtual";
|
|
190
196
|
import React6, { Fragment, useCallback, useEffect, useState as useState2 } from "react";
|
|
191
197
|
import { debounce } from "@dxos/async";
|
|
192
198
|
|
|
@@ -211,7 +217,7 @@ var headPadding = "pli-2 plb-1.5";
|
|
|
211
217
|
var gridCellFocusRing = "focus:z-[11] focus:outline outline-2 outline-primary-500 dark:outline-primary-400";
|
|
212
218
|
var tableRoot = ({ fullWidth }, ...etc) => mx2("table-fixed", fullWidth && "is-full", ...etc);
|
|
213
219
|
var groupTh = (_props, ...etc) => mx2("text-start font-medium", flushPadding, ...etc);
|
|
214
|
-
var theadRoot = ({ header }, ...etc) => mx2(header ? "sticky block-start-
|
|
220
|
+
var theadRoot = ({ header, stickyHeader }, ...etc) => mx2(header ? stickyHeader && "sticky block-start-[--sticky-top] z-[1]" : "collapse", header && fixedSurface, ...etc);
|
|
215
221
|
var theadTr = (_props, ...etc) => mx2("group", ...etc);
|
|
216
222
|
var theadTh = ({ border }, ...etc) => mx2("relative text-start font-medium select-none truncate", headPadding, border && "border", border && groupBorder, ...etc);
|
|
217
223
|
var theadResizeRoot = (_props, ...etc) => mx2("absolute top-0 pis-1 h-full z-[10] w-[7px] -right-[5px] cursor-col-resize select-none touch-none opacity-20 hover:opacity-100", ...etc);
|
|
@@ -371,8 +377,57 @@ var TableHead = (_props) => {
|
|
|
371
377
|
TableHead.displayName = TABLE_HEAD_NAME;
|
|
372
378
|
|
|
373
379
|
// packages/ui/react-ui-table/src/components/Table/Table.tsx
|
|
380
|
+
var VirtualizedTableContent = ({ getScrollElement }) => {
|
|
381
|
+
const { table: { getRowModel } } = useTableContext("VirtualizedTableContent");
|
|
382
|
+
const rows = getRowModel().rows;
|
|
383
|
+
const { getTotalSize, getVirtualItems } = useVirtualizer({
|
|
384
|
+
getScrollElement,
|
|
385
|
+
count: rows.length,
|
|
386
|
+
overscan: 16,
|
|
387
|
+
estimateSize: () => 33
|
|
388
|
+
});
|
|
389
|
+
const virtualRows = getVirtualItems();
|
|
390
|
+
const totalSize = getTotalSize();
|
|
391
|
+
const paddingTop = virtualRows.length > 0 ? virtualRows?.[0]?.start || 0 : 0;
|
|
392
|
+
const paddingBottom = virtualRows.length > 0 ? totalSize - (virtualRows?.[virtualRows.length - 1]?.end || 0) : 0;
|
|
393
|
+
return /* @__PURE__ */ React6.createElement(React6.Fragment, null, paddingTop > 0 && /* @__PURE__ */ React6.createElement("tbody", {
|
|
394
|
+
role: "none"
|
|
395
|
+
}, /* @__PURE__ */ React6.createElement("tr", {
|
|
396
|
+
role: "none"
|
|
397
|
+
}, /* @__PURE__ */ React6.createElement("td", {
|
|
398
|
+
style: {
|
|
399
|
+
height: `${paddingTop}px`
|
|
400
|
+
},
|
|
401
|
+
role: "none"
|
|
402
|
+
}))), /* @__PURE__ */ React6.createElement(TableBody, {
|
|
403
|
+
rows: virtualRows.map((virtualRow) => rows[virtualRow.index])
|
|
404
|
+
}), paddingBottom > 0 && /* @__PURE__ */ React6.createElement("tbody", {
|
|
405
|
+
role: "none"
|
|
406
|
+
}, /* @__PURE__ */ React6.createElement("tr", {
|
|
407
|
+
role: "none"
|
|
408
|
+
}, /* @__PURE__ */ React6.createElement("td", {
|
|
409
|
+
style: {
|
|
410
|
+
height: `${paddingBottom}px`
|
|
411
|
+
},
|
|
412
|
+
role: "none"
|
|
413
|
+
}))));
|
|
414
|
+
};
|
|
415
|
+
var GroupedTableContent = () => {
|
|
416
|
+
const { table: { getGroupedRowModel: getGroupedRowModel1, getHeaderGroups, getState }, debug } = useTableContext("GroupedTableContent");
|
|
417
|
+
return /* @__PURE__ */ React6.createElement(React6.Fragment, null, getGroupedRowModel1().rows.map((row, i) => {
|
|
418
|
+
return /* @__PURE__ */ React6.createElement(Fragment, {
|
|
419
|
+
key: i
|
|
420
|
+
}, /* @__PURE__ */ React6.createElement("thead", null, /* @__PURE__ */ React6.createElement("tr", null, debug && /* @__PURE__ */ React6.createElement("th", null), /* @__PURE__ */ React6.createElement("th", {
|
|
421
|
+
// TODO(burdon): Calculate row span.
|
|
422
|
+
colSpan: getHeaderGroups()[0].headers.length,
|
|
423
|
+
className: groupTh({})
|
|
424
|
+
}, getState().grouping[0], "[", String(row.getGroupingValue(getState().grouping[0])), "]"))), /* @__PURE__ */ React6.createElement(TableBody, {
|
|
425
|
+
rows: row.subRows
|
|
426
|
+
}));
|
|
427
|
+
}));
|
|
428
|
+
};
|
|
374
429
|
var Table = (props) => {
|
|
375
|
-
const { role, data = [], columns = [], onColumnResize, columnVisibility, header = true, footer, rowsSelectable, fullWidth, debug, onDataSelectionChange, classNames } = props;
|
|
430
|
+
const { role, data = [], columns = [], onColumnResize, columnVisibility, header = true, footer, rowsSelectable, fullWidth, debug, onDataSelectionChange, classNames, getScrollElement } = props;
|
|
376
431
|
const TableProvider2 = TableProvider;
|
|
377
432
|
const [rowSelection = {}, directlySetRowSelection] = useControllableState({
|
|
378
433
|
prop: props.rowSelection,
|
|
@@ -444,6 +499,7 @@ var Table = (props) => {
|
|
|
444
499
|
// Debug
|
|
445
500
|
debugTable: debug
|
|
446
501
|
});
|
|
502
|
+
const rows = table.getRowModel().rows;
|
|
447
503
|
useEffect(() => {
|
|
448
504
|
if (onDataSelectionChange) {
|
|
449
505
|
onDataSelectionChange(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));
|
|
@@ -468,19 +524,11 @@ var Table = (props) => {
|
|
|
468
524
|
width: table.getTotalSize()
|
|
469
525
|
}
|
|
470
526
|
}
|
|
471
|
-
}, /* @__PURE__ */ React6.createElement(TableHead, null), grouping.length === 0
|
|
472
|
-
|
|
473
|
-
})
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
}, /* @__PURE__ */ React6.createElement("thead", null, /* @__PURE__ */ React6.createElement("tr", null, debug && /* @__PURE__ */ React6.createElement("th", null), /* @__PURE__ */ React6.createElement("th", {
|
|
477
|
-
// TODO(burdon): Calculate row span.
|
|
478
|
-
colSpan: table.getHeaderGroups()[0].headers.length,
|
|
479
|
-
className: groupTh(props)
|
|
480
|
-
}, table.getState().grouping[0], "[", String(row.getGroupingValue(table.getState().grouping[0])), "]"))), /* @__PURE__ */ React6.createElement(TableBody, {
|
|
481
|
-
rows: row.subRows
|
|
482
|
-
}));
|
|
483
|
-
}), footer && /* @__PURE__ */ React6.createElement(TableFooter, null)), debug && /* @__PURE__ */ React6.createElement("pre", {
|
|
527
|
+
}, /* @__PURE__ */ React6.createElement(TableHead, null), grouping.length === 0 ? getScrollElement ? /* @__PURE__ */ React6.createElement(VirtualizedTableContent, {
|
|
528
|
+
getScrollElement
|
|
529
|
+
}) : /* @__PURE__ */ React6.createElement(TableBody, {
|
|
530
|
+
rows
|
|
531
|
+
}) : /* @__PURE__ */ React6.createElement(GroupedTableContent, null), footer && /* @__PURE__ */ React6.createElement(TableFooter, null)), debug && /* @__PURE__ */ React6.createElement("pre", {
|
|
484
532
|
className: "font-mono text-xs text-neutral-500 my-4 p-2 ring"
|
|
485
533
|
}, /* @__PURE__ */ React6.createElement("code", null, JSON.stringify(table.getState(), void 0, 2))));
|
|
486
534
|
};
|
|
@@ -488,23 +536,9 @@ var Table = (props) => {
|
|
|
488
536
|
// packages/ui/react-ui-table/src/components/Cell/CellCombobox.tsx
|
|
489
537
|
import { CaretDown as CaretDown2 } from "@phosphor-icons/react";
|
|
490
538
|
import React7, { useCallback as useCallback2, useState as useState3 } from "react";
|
|
491
|
-
import { Popover as Popover2, useTranslation } from "@dxos/react-ui";
|
|
539
|
+
import { Popover as Popover2, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
492
540
|
import { PopoverCombobox } from "@dxos/react-ui-searchlist";
|
|
493
541
|
import { descriptionText, getSize as getSize2, mx as mx4, staticPlaceholderText } from "@dxos/react-ui-theme";
|
|
494
|
-
|
|
495
|
-
// packages/ui/react-ui-table/src/translations.ts
|
|
496
|
-
var translationKey = "table";
|
|
497
|
-
var translations_default = [
|
|
498
|
-
{
|
|
499
|
-
"en-US": {
|
|
500
|
-
[translationKey]: {
|
|
501
|
-
"no selection label": "\xA0"
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
];
|
|
506
|
-
|
|
507
|
-
// packages/ui/react-ui-table/src/components/Cell/CellCombobox.tsx
|
|
508
542
|
var initialItems = (model, value) => value ? {
|
|
509
543
|
[model.getId(value)]: {
|
|
510
544
|
label: model.getText(value),
|
|
@@ -512,7 +546,7 @@ var initialItems = (model, value) => value ? {
|
|
|
512
546
|
}
|
|
513
547
|
} : {};
|
|
514
548
|
var CellCombobox = ({ model, value, onValueChange }) => {
|
|
515
|
-
const { t } =
|
|
549
|
+
const { t } = useTranslation2(translationKey);
|
|
516
550
|
const [items, setItems] = useState3(initialItems(model, value));
|
|
517
551
|
const [loading, setLoading] = useState3(false);
|
|
518
552
|
const [searchInputValue, setSearchInputValue] = useState3("");
|
|
@@ -541,7 +575,7 @@ var CellCombobox = ({ model, value, onValueChange }) => {
|
|
|
541
575
|
variant: "ghost",
|
|
542
576
|
classNames: "is-full rounded-none ring-inset"
|
|
543
577
|
}, value ? /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement("span", {
|
|
544
|
-
className: mx4("font-normal text-start flex-1 min-is-0 truncate mie-2", !value && staticPlaceholderText)
|
|
578
|
+
className: mx4("font-normal text-start text-base flex-1 min-is-0 truncate mie-2", !value && staticPlaceholderText)
|
|
545
579
|
}, model.getText(value)), /* @__PURE__ */ React7.createElement(CaretDown2, {
|
|
546
580
|
weight: "bold",
|
|
547
581
|
className: getSize2(3)
|
|
@@ -569,11 +603,12 @@ var CellCombobox = ({ model, value, onValueChange }) => {
|
|
|
569
603
|
};
|
|
570
604
|
|
|
571
605
|
// packages/ui/react-ui-table/src/helpers.tsx
|
|
606
|
+
import { useFocusFinders } from "@fluentui/react-tabster";
|
|
572
607
|
import { Check as Check2, ClipboardText, X as X2 } from "@phosphor-icons/react";
|
|
573
608
|
import { createColumnHelper } from "@tanstack/react-table";
|
|
574
609
|
import format from "date-fns/format";
|
|
575
610
|
import formatDistanceToNow from "date-fns/formatDistanceToNow";
|
|
576
|
-
import React8, { useRef as useRef2, useState as useState4 } from "react";
|
|
611
|
+
import React8, { useEffect as useEffect2, useRef as useRef2, useState as useState4 } from "react";
|
|
577
612
|
import { Input as Input2, Tooltip } from "@dxos/react-ui";
|
|
578
613
|
import { getSize as getSize3, mx as mx5 } from "@dxos/react-ui-theme";
|
|
579
614
|
var createColumnBuilder = () => ({
|
|
@@ -619,40 +654,55 @@ var StringBuilderCell = (cellContext) => {
|
|
|
619
654
|
onKeyDown: (event) => event.key === "Enter" && handleSave() || event.key === "Escape" && handleCancel()
|
|
620
655
|
}));
|
|
621
656
|
};
|
|
657
|
+
var parseNumber = (text) => text?.trim().length ? Number(text) : NaN;
|
|
658
|
+
var displayNumber = (value, digits) => value || value === 0 ? value.toLocaleString(void 0, {
|
|
659
|
+
minimumFractionDigits: digits ?? 0,
|
|
660
|
+
maximumFractionDigits: digits ?? 2
|
|
661
|
+
}) : "";
|
|
622
662
|
var NumberBuilderCell = (cellContext) => {
|
|
623
|
-
const { onUpdate,
|
|
663
|
+
const { onUpdate, digits } = cellContext.column.columnDef.meta;
|
|
624
664
|
const value = cellContext.getValue();
|
|
625
|
-
const [text, setText] = useState4();
|
|
665
|
+
const [text, setText] = useState4(displayNumber(value, digits));
|
|
666
|
+
const { findPrevFocusable } = useFocusFinders();
|
|
667
|
+
const ref = useRef2(null);
|
|
668
|
+
useEffect2(() => {
|
|
669
|
+
(!document.activeElement || document.activeElement !== ref.current) && setText(displayNumber(value, digits));
|
|
670
|
+
}, [
|
|
671
|
+
digits,
|
|
672
|
+
value
|
|
673
|
+
]);
|
|
626
674
|
const handleEdit = () => {
|
|
627
675
|
if (onUpdate) {
|
|
628
676
|
setText(value !== void 0 ? String(value) : "");
|
|
629
677
|
}
|
|
630
678
|
};
|
|
631
679
|
const handleSave = () => {
|
|
632
|
-
const
|
|
633
|
-
onUpdate?.(cellContext.row.original, cellContext.column.id, isNaN(
|
|
634
|
-
setText(
|
|
680
|
+
const nextValue = parseNumber(text);
|
|
681
|
+
onUpdate?.(cellContext.row.original, cellContext.column.id, isNaN(nextValue) ? void 0 : nextValue);
|
|
682
|
+
setText(displayNumber(nextValue, digits));
|
|
683
|
+
ref.current && document.activeElement === ref.current && findPrevFocusable(ref.current)?.focus();
|
|
635
684
|
};
|
|
636
|
-
const
|
|
637
|
-
setText(
|
|
685
|
+
const _handleCancel = () => {
|
|
686
|
+
setText(displayNumber(value, digits));
|
|
687
|
+
ref.current && findPrevFocusable(ref.current)?.focus();
|
|
638
688
|
};
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
689
|
+
return /* @__PURE__ */ React8.createElement(Input2.Root, null, /* @__PURE__ */ React8.createElement(Input2.TextInput, {
|
|
690
|
+
ref,
|
|
691
|
+
variant: "subdued",
|
|
692
|
+
value: text,
|
|
693
|
+
classNames: [
|
|
694
|
+
"is-full text-end font-mono",
|
|
695
|
+
textPadding
|
|
696
|
+
],
|
|
697
|
+
onBlur: handleSave,
|
|
698
|
+
onFocus: handleEdit,
|
|
699
|
+
onChange: ({ target: { value: value2 } }) => setText(value2),
|
|
700
|
+
onKeyDown: (event) => {
|
|
701
|
+
return (
|
|
702
|
+
/* (event.key === 'Escape' && handleCancel()) || */
|
|
703
|
+
event.key === "Enter" && handleSave()
|
|
704
|
+
);
|
|
705
|
+
}
|
|
656
706
|
}));
|
|
657
707
|
};
|
|
658
708
|
var RowSelectorBuilderCell = (cellContext) => {
|
|
@@ -693,17 +743,7 @@ var ColumnBuilder = class {
|
|
|
693
743
|
*/
|
|
694
744
|
combobox({ label, classNames, model, onUpdate, ...props }) {
|
|
695
745
|
return {
|
|
696
|
-
...props,
|
|
697
746
|
minSize: 100,
|
|
698
|
-
meta: {
|
|
699
|
-
...props.meta,
|
|
700
|
-
model,
|
|
701
|
-
onUpdate,
|
|
702
|
-
cell: {
|
|
703
|
-
classNames,
|
|
704
|
-
...props.meta?.cell
|
|
705
|
-
}
|
|
706
|
-
},
|
|
707
747
|
header: (column) => {
|
|
708
748
|
return label ?? column.header.id;
|
|
709
749
|
},
|
|
@@ -712,6 +752,16 @@ var ColumnBuilder = class {
|
|
|
712
752
|
return /* @__PURE__ */ React8.createElement("div", {
|
|
713
753
|
className: mx5("truncate", classNames)
|
|
714
754
|
}, cellValue ? model?.getText(cellValue) : "");
|
|
755
|
+
},
|
|
756
|
+
...props,
|
|
757
|
+
meta: {
|
|
758
|
+
...props.meta,
|
|
759
|
+
model,
|
|
760
|
+
onUpdate,
|
|
761
|
+
cell: {
|
|
762
|
+
classNames,
|
|
763
|
+
...props.meta?.cell
|
|
764
|
+
}
|
|
715
765
|
}
|
|
716
766
|
};
|
|
717
767
|
}
|
|
@@ -720,16 +770,7 @@ var ColumnBuilder = class {
|
|
|
720
770
|
*/
|
|
721
771
|
string({ label, classNames, onUpdate, ...props } = {}) {
|
|
722
772
|
return {
|
|
723
|
-
...props,
|
|
724
773
|
minSize: 100,
|
|
725
|
-
meta: {
|
|
726
|
-
...props.meta,
|
|
727
|
-
onUpdate,
|
|
728
|
-
cell: {
|
|
729
|
-
...props.meta?.cell,
|
|
730
|
-
classNames
|
|
731
|
-
}
|
|
732
|
-
},
|
|
733
774
|
// TODO(burdon): Default.
|
|
734
775
|
header: (column) => {
|
|
735
776
|
return label ?? column.header.id;
|
|
@@ -739,6 +780,15 @@ var ColumnBuilder = class {
|
|
|
739
780
|
return /* @__PURE__ */ React8.createElement("div", {
|
|
740
781
|
className: mx5("truncate", textPadding, classNames)
|
|
741
782
|
}, value);
|
|
783
|
+
},
|
|
784
|
+
...props,
|
|
785
|
+
meta: {
|
|
786
|
+
...props.meta,
|
|
787
|
+
onUpdate,
|
|
788
|
+
cell: {
|
|
789
|
+
...props.meta?.cell,
|
|
790
|
+
classNames
|
|
791
|
+
}
|
|
742
792
|
}
|
|
743
793
|
};
|
|
744
794
|
}
|
|
@@ -747,9 +797,11 @@ var ColumnBuilder = class {
|
|
|
747
797
|
*/
|
|
748
798
|
number({ label, minSize, classNames, digits, onUpdate, ...props } = {}) {
|
|
749
799
|
return {
|
|
750
|
-
...props,
|
|
751
800
|
size: 100,
|
|
752
801
|
minSize: 100,
|
|
802
|
+
header: (cell) => label ?? cell.header.id,
|
|
803
|
+
cell: NumberBuilderCell,
|
|
804
|
+
...props,
|
|
753
805
|
meta: {
|
|
754
806
|
...props.meta,
|
|
755
807
|
onUpdate,
|
|
@@ -762,9 +814,7 @@ var ColumnBuilder = class {
|
|
|
762
814
|
...props.meta?.cell,
|
|
763
815
|
classNames
|
|
764
816
|
}
|
|
765
|
-
}
|
|
766
|
-
header: (cell) => label ?? cell.header.id,
|
|
767
|
-
cell: NumberBuilderCell
|
|
817
|
+
}
|
|
768
818
|
};
|
|
769
819
|
}
|
|
770
820
|
/**
|
|
@@ -773,16 +823,8 @@ var ColumnBuilder = class {
|
|
|
773
823
|
// TODO(burdon): Date picker (pluggable renderers?)
|
|
774
824
|
date({ label, format: formatSpec, relative, classNames, ...props } = {}) {
|
|
775
825
|
return {
|
|
776
|
-
...props,
|
|
777
826
|
size: 220,
|
|
778
827
|
minSize: 100,
|
|
779
|
-
meta: {
|
|
780
|
-
...props.meta,
|
|
781
|
-
cell: {
|
|
782
|
-
...props.meta?.cell,
|
|
783
|
-
classNames
|
|
784
|
-
}
|
|
785
|
-
},
|
|
786
828
|
header: (cell) => label ?? cell.header.id,
|
|
787
829
|
cell: (cell) => {
|
|
788
830
|
const value = cell.getValue();
|
|
@@ -797,6 +839,14 @@ var ColumnBuilder = class {
|
|
|
797
839
|
console.log(value);
|
|
798
840
|
return null;
|
|
799
841
|
}
|
|
842
|
+
},
|
|
843
|
+
...props,
|
|
844
|
+
meta: {
|
|
845
|
+
...props.meta,
|
|
846
|
+
cell: {
|
|
847
|
+
...props.meta?.cell,
|
|
848
|
+
classNames
|
|
849
|
+
}
|
|
800
850
|
}
|
|
801
851
|
};
|
|
802
852
|
}
|
|
@@ -805,20 +855,8 @@ var ColumnBuilder = class {
|
|
|
805
855
|
*/
|
|
806
856
|
key({ label, tooltip, classNames, ...props } = {}) {
|
|
807
857
|
return {
|
|
808
|
-
...props,
|
|
809
858
|
size: 94,
|
|
810
859
|
minSize: 94,
|
|
811
|
-
meta: {
|
|
812
|
-
...props.meta,
|
|
813
|
-
cell: {
|
|
814
|
-
...props.meta?.cell,
|
|
815
|
-
classNames: [
|
|
816
|
-
"font-mono",
|
|
817
|
-
textPadding,
|
|
818
|
-
classNames
|
|
819
|
-
]
|
|
820
|
-
}
|
|
821
|
-
},
|
|
822
860
|
header: (cell) => label ?? cell.header.id,
|
|
823
861
|
cell: (cell) => {
|
|
824
862
|
const value = cell.getValue();
|
|
@@ -837,6 +875,18 @@ var ColumnBuilder = class {
|
|
|
837
875
|
void navigator.clipboard.writeText(value.toHex());
|
|
838
876
|
}
|
|
839
877
|
})))));
|
|
878
|
+
},
|
|
879
|
+
...props,
|
|
880
|
+
meta: {
|
|
881
|
+
...props.meta,
|
|
882
|
+
cell: {
|
|
883
|
+
...props.meta?.cell,
|
|
884
|
+
classNames: [
|
|
885
|
+
"font-mono",
|
|
886
|
+
textPadding,
|
|
887
|
+
classNames
|
|
888
|
+
]
|
|
889
|
+
}
|
|
840
890
|
}
|
|
841
891
|
};
|
|
842
892
|
}
|
|
@@ -876,9 +926,11 @@ var ColumnBuilder = class {
|
|
|
876
926
|
*/
|
|
877
927
|
switch({ label, classNames, onUpdate, ...props } = {}) {
|
|
878
928
|
return {
|
|
879
|
-
...props,
|
|
880
929
|
size: 50,
|
|
881
930
|
minSize: 50,
|
|
931
|
+
header: (column) => label ?? column.header.id,
|
|
932
|
+
cell: SwitchBuilderCell,
|
|
933
|
+
...props,
|
|
882
934
|
meta: {
|
|
883
935
|
...props.meta,
|
|
884
936
|
onUpdate,
|
|
@@ -889,9 +941,7 @@ var ColumnBuilder = class {
|
|
|
889
941
|
classNames
|
|
890
942
|
]
|
|
891
943
|
}
|
|
892
|
-
}
|
|
893
|
-
header: (column) => label ?? column.header.id,
|
|
894
|
-
cell: SwitchBuilderCell
|
|
944
|
+
}
|
|
895
945
|
};
|
|
896
946
|
}
|
|
897
947
|
/**
|
|
@@ -901,7 +951,6 @@ var ColumnBuilder = class {
|
|
|
901
951
|
const IconOn = on?.Icon ?? Check2;
|
|
902
952
|
const IconOff = off?.Icon ?? X2;
|
|
903
953
|
return {
|
|
904
|
-
...props,
|
|
905
954
|
size: size ?? 32,
|
|
906
955
|
header: (column) => /* @__PURE__ */ React8.createElement("div", {
|
|
907
956
|
className: "justify-center"
|
|
@@ -919,7 +968,8 @@ var ColumnBuilder = class {
|
|
|
919
968
|
} else {
|
|
920
969
|
return null;
|
|
921
970
|
}
|
|
922
|
-
}
|
|
971
|
+
},
|
|
972
|
+
...props
|
|
923
973
|
};
|
|
924
974
|
}
|
|
925
975
|
};
|
|
@@ -929,7 +979,6 @@ export {
|
|
|
929
979
|
ColumnMenu,
|
|
930
980
|
ColumnPanel,
|
|
931
981
|
Table,
|
|
932
|
-
columnTypes,
|
|
933
982
|
createColumnBuilder,
|
|
934
983
|
currentRow,
|
|
935
984
|
flushPadding,
|
|
@@ -950,6 +999,7 @@ export {
|
|
|
950
999
|
theadResizeThumb,
|
|
951
1000
|
theadRoot,
|
|
952
1001
|
theadTh,
|
|
953
|
-
theadTr
|
|
1002
|
+
theadTr,
|
|
1003
|
+
translations_default as translations
|
|
954
1004
|
};
|
|
955
1005
|
//# sourceMappingURL=index.mjs.map
|