@dxos/react-ui-table 0.3.9-main.7501ea3 → 0.3.9-main.7508af4

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.
@@ -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/schema.ts
9
- var columnTypes = /* @__PURE__ */ new Map([
10
- [
11
- "string",
12
- "Text"
13
- ],
14
- [
15
- "boolean",
16
- "Checkbox"
17
- ],
18
- [
19
- "number",
20
- "Number"
21
- ],
22
- [
23
- "date",
24
- "Date"
25
- ],
26
- [
27
- "ref",
28
- "Reference"
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 grow items-center overflow-hidden"
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-0"
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
- }, "Label"), /* @__PURE__ */ React.createElement(Input.TextInput, {
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
- }, "Property"), /* @__PURE__ */ React.createElement(Input.TextInput, {
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
- }, "Type"), /* @__PURE__ */ React.createElement(Select.Root, {
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, Array.from(columnTypes.entries()).map(([type2, label2]) => /* @__PURE__ */ React.createElement(Select.Option, {
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
- }, label2)))))))), type === "number" && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Section, null, /* @__PURE__ */ React.createElement(Input.Root, null, /* @__PURE__ */ React.createElement(Input.Label, {
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
- }, "Decimal places"), /* @__PURE__ */ React.createElement(Input.TextInput, {
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((t) => t.id !== tableDef.id).map(({ id, name }) => /* @__PURE__ */ React.createElement(Select.Option, {
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, "Save"), /* @__PURE__ */ React.createElement("div", {
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, "Cancel"), /* @__PURE__ */ React.createElement("div", {
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, "Delete"), /* @__PURE__ */ React.createElement("div", {
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-[--sticky-top] z-[1]" : "collapse", header && fixedSurface, ...etc);
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 && /* @__PURE__ */ React6.createElement(TableBody, {
472
- rows: table.getRowModel().rows
473
- }), grouping.length !== 0 && table.getGroupedRowModel().rows.map((row, i) => {
474
- return /* @__PURE__ */ React6.createElement(Fragment, {
475
- key: i
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 } = useTranslation(translationKey);
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, cell, digits } = cellContext.column.columnDef.meta;
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 value2 = text?.trim().length ? Number(text) : NaN;
633
- onUpdate?.(cellContext.row.original, cellContext.column.id, isNaN(value2) ? void 0 : value2);
634
- setText(void 0);
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 handleCancel = () => {
637
- setText(void 0);
685
+ const _handleCancel = () => {
686
+ setText(displayNumber(value, digits));
687
+ ref.current && findPrevFocusable(ref.current)?.focus();
638
688
  };
639
- if (text !== void 0) {
640
- return /* @__PURE__ */ React8.createElement(Input2.Root, null, /* @__PURE__ */ React8.createElement(Input2.TextInput, {
641
- value: text,
642
- classNames: [
643
- "is-full text-end font-mono"
644
- ],
645
- onBlur: handleSave,
646
- onChange: (event) => setText(event.target.value),
647
- onKeyDown: (event) => event.key === "Escape" && handleCancel() || event.key === "Enter" && handleSave()
648
- }));
649
- }
650
- return /* @__PURE__ */ React8.createElement("div", {
651
- className: mx5('is-full text-end font-mono empty:after:content-["\xA0"]', textPadding, cell?.classNames),
652
- onClick: handleEdit
653
- }, value?.toLocaleString(void 0, {
654
- minimumFractionDigits: digits ?? 0,
655
- maximumFractionDigits: digits ?? 2
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,