@dxos/react-ui-table 0.3.9-main.3fcc0fa → 0.3.9-main.4e39f3a
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 +58 -15
- package/dist/lib/browser/index.mjs.map +3 -3
- 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/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 +3 -2
- package/dist/types/src/components/Table/props.d.ts.map +1 -1
- package/package.json +11 -12
- package/src/components/Cell/CellCombobox.tsx +4 -1
- package/src/components/Table/Table.stories.tsx +21 -12
- package/src/components/Table/Table.tsx +86 -25
- package/src/components/Table/props.ts +23 -16
|
@@ -192,6 +192,7 @@ var ColumnPanel = ({ context, tableDefs, tableDef, column, onUpdate, onDelete })
|
|
|
192
192
|
// packages/ui/react-ui-table/src/components/Table/Table.tsx
|
|
193
193
|
import { useControllableState } from "@radix-ui/react-use-controllable-state";
|
|
194
194
|
import { getCoreRowModel, getGroupedRowModel, useReactTable } from "@tanstack/react-table";
|
|
195
|
+
import { useVirtualizer } from "@tanstack/react-virtual";
|
|
195
196
|
import React6, { Fragment, useCallback, useEffect, useState as useState2 } from "react";
|
|
196
197
|
import { debounce } from "@dxos/async";
|
|
197
198
|
|
|
@@ -376,8 +377,57 @@ var TableHead = (_props) => {
|
|
|
376
377
|
TableHead.displayName = TABLE_HEAD_NAME;
|
|
377
378
|
|
|
378
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
|
+
};
|
|
379
429
|
var Table = (props) => {
|
|
380
|
-
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;
|
|
381
431
|
const TableProvider2 = TableProvider;
|
|
382
432
|
const [rowSelection = {}, directlySetRowSelection] = useControllableState({
|
|
383
433
|
prop: props.rowSelection,
|
|
@@ -449,6 +499,7 @@ var Table = (props) => {
|
|
|
449
499
|
// Debug
|
|
450
500
|
debugTable: debug
|
|
451
501
|
});
|
|
502
|
+
const rows = table.getRowModel().rows;
|
|
452
503
|
useEffect(() => {
|
|
453
504
|
if (onDataSelectionChange) {
|
|
454
505
|
onDataSelectionChange(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));
|
|
@@ -473,19 +524,11 @@ var Table = (props) => {
|
|
|
473
524
|
width: table.getTotalSize()
|
|
474
525
|
}
|
|
475
526
|
}
|
|
476
|
-
}, /* @__PURE__ */ React6.createElement(TableHead, null), grouping.length === 0
|
|
477
|
-
|
|
478
|
-
})
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
}, /* @__PURE__ */ React6.createElement("thead", null, /* @__PURE__ */ React6.createElement("tr", null, debug && /* @__PURE__ */ React6.createElement("th", null), /* @__PURE__ */ React6.createElement("th", {
|
|
482
|
-
// TODO(burdon): Calculate row span.
|
|
483
|
-
colSpan: table.getHeaderGroups()[0].headers.length,
|
|
484
|
-
className: groupTh(props)
|
|
485
|
-
}, table.getState().grouping[0], "[", String(row.getGroupingValue(table.getState().grouping[0])), "]"))), /* @__PURE__ */ React6.createElement(TableBody, {
|
|
486
|
-
rows: row.subRows
|
|
487
|
-
}));
|
|
488
|
-
}), 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", {
|
|
489
532
|
className: "font-mono text-xs text-neutral-500 my-4 p-2 ring"
|
|
490
533
|
}, /* @__PURE__ */ React6.createElement("code", null, JSON.stringify(table.getState(), void 0, 2))));
|
|
491
534
|
};
|
|
@@ -532,7 +575,7 @@ var CellCombobox = ({ model, value, onValueChange }) => {
|
|
|
532
575
|
variant: "ghost",
|
|
533
576
|
classNames: "is-full rounded-none ring-inset"
|
|
534
577
|
}, value ? /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement("span", {
|
|
535
|
-
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)
|
|
536
579
|
}, model.getText(value)), /* @__PURE__ */ React7.createElement(CaretDown2, {
|
|
537
580
|
weight: "bold",
|
|
538
581
|
className: getSize2(3)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/ColumnMenu.tsx", "../../../src/translations.ts", "../../../src/components/Table/Table.tsx", "../../../src/components/Table/TableBody.tsx", "../../../src/components/Table/TableContext.tsx", "../../../src/theme.ts", "../../../src/components/Cell/Cell.tsx", "../../../src/components/Table/TableFooter.tsx", "../../../src/components/Table/TableHead.tsx", "../../../src/components/Cell/CellCombobox.tsx", "../../../src/helpers.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Check, CaretDown, Trash, X } from '@phosphor-icons/react';\nimport { type HeaderContext, type RowData } from '@tanstack/react-table';\nimport React, { type FC, type PropsWithChildren, useRef, useState } from 'react';\n\nimport { Button, DensityProvider, Input, Popover, Select, Separator, useTranslation } from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\nimport { safeParseInt } from '@dxos/util';\n\nimport { type TableDef, type ColumnProps, type ColumnType } from '../schema';\nimport { translationKey } from '../translations';\n\nexport type ColumnMenuProps<TData extends RowData, TValue> = {\n context: HeaderContext<TData, TValue>;\n tableDefs: TableDef[];\n tableDef: TableDef;\n column: ColumnProps;\n onUpdate?: (id: string, column: ColumnProps) => void;\n onDelete?: (id: string) => void;\n};\n\nexport const ColumnMenu = <TData extends RowData, TValue>({ column, ...props }: ColumnMenuProps<TData, TValue>) => {\n const title = column.label?.length ? column.label : column.id;\n return (\n <div className='flex items-center gap-2'>\n <div className='flex-1 min-is-0 truncate' title={title}>\n {title}\n </div>\n <div className='flex shrink-0'>\n <ColumnPanel {...props} column={column} />\n </div>\n </div>\n );\n};\n\nconst Section: FC<PropsWithChildren & { className?: string }> = ({ children, className }) => (\n <div role='none' className={mx('p-2', className)}>\n {children}\n </div>\n);\n\nexport const ColumnPanel = <TData extends RowData, TValue>({\n context,\n tableDefs,\n tableDef,\n column,\n onUpdate,\n onDelete,\n}: ColumnMenuProps<TData, TValue>) => {\n const [open, setOpen] = useState(false);\n const [prop, setProp] = useState(column.id);\n const [refTable, setRefTable] = useState(column.refTable);\n const [refProp, setRefProp] = useState(column.refProp);\n const [type, setType] = useState(String(column.type));\n const [label, setLabel] = useState(column.label);\n const [digits, setDigits] = useState(String(column.digits ?? '0'));\n const propRef = useRef<HTMLInputElement>(null);\n const { t } = useTranslation(translationKey);\n\n const handleCancel = () => {\n setProp(column.id);\n setOpen(false);\n };\n\n const handleSave = () => {\n // Check valid.\n if (!prop.length || !prop.match(/^[a-zA-Z_].+/i)) {\n propRef.current?.focus();\n return;\n }\n\n // If already exists then check same type.\n const current = tableDef.columns.find((c) => c.id !== column.id && c.id === prop);\n if (current) {\n // TODO(burdon): Allow multiple columns with different refProps. Ensure correct table prop is updated.\n if (current.type !== 'ref' /* || current.ref !== refTable */) {\n // TODO(burdon): Show error.\n propRef.current?.focus();\n return;\n }\n }\n\n onUpdate?.(prop, {\n id: prop, // TODO(burdon): Make unique.\n prop,\n label,\n type: type as ColumnProps['type'],\n refTable,\n refProp,\n digits: safeParseInt(digits),\n });\n\n setOpen(false);\n };\n\n return (\n <Popover.Root open={open} onOpenChange={(nextOpen) => setOpen(nextOpen)}>\n <Popover.Trigger asChild>\n <Button variant='ghost' classNames='p-1'>\n <CaretDown className={getSize(4)} />\n </Button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content>\n <Popover.Viewport classNames='w-60'>\n <DensityProvider density='fine'>\n <div className='flex flex-col gap-1'>\n <Section>\n <Input.Root>\n <Input.Label classNames='mbe-1'>{t('column label label')}</Input.Label>\n <Input.TextInput\n placeholder='Column label'\n value={label ?? ''}\n onChange={(event) => setLabel(event.target.value)}\n autoFocus\n />\n </Input.Root>\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>{t('property key label')}</Input.Label>\n <Input.TextInput\n ref={propRef}\n placeholder='Property key'\n // TODO(burdon): Provide hooks for value normalization, ENTER, ESC, etc.\n value={prop ?? ''}\n onChange={(event) => setProp(event.target.value.replace(/[^\\w_]/g, ''))}\n />\n </Input.Root>\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>{t('column type label')}</Input.Label>\n <Select.Root value={type} onValueChange={setType}>\n <Select.TriggerButton placeholder='Type' classNames='is-full' />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {(['number', 'boolean', 'string', 'ref'] as ColumnType[]).map((type) => (\n <Select.Option key={type} value={type}>\n {t(`${type} column type label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Input.Root>\n </Section>\n\n {type === 'number' && (\n <>\n <Section>\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>{t('digits label')}</Input.Label>\n {/* TODO(burdon): Constrain input to numbers. */}\n <Input.TextInput value={digits ?? ''} onChange={(event) => setDigits(event.target.value)} />\n </Input.Root>\n </Section>\n </>\n )}\n\n {/* TODO(burdon): Selectors on same line. */}\n {type === 'ref' && (\n <>\n <Section>\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>Table</Input.Label>\n <Select.Root value={refTable} onValueChange={setRefTable}>\n <Select.TriggerButton placeholder='Table' classNames='is-full' />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {tableDefs\n .filter((t) => t.id !== tableDef.id)\n .map(({ id, name }) => (\n <Select.Option key={id} value={id}>\n {name ?? id}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Input.Root>\n\n {refTable && (\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>Table property</Input.Label>\n <Select.Root value={refProp} onValueChange={setRefProp}>\n <Select.TriggerButton placeholder='Property' classNames='is-full' />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {tableDefs\n .find((tableDef) => tableDef.id === refTable)\n ?.columns.map(({ id, label }) => (\n <Select.Option key={id} value={id}>\n {label ?? id}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Input.Root>\n )}\n </Section>\n </>\n )}\n\n <Separator classNames='mli-2' />\n\n <Section className='space-b-1.5'>\n {/* TODO(burdon): Style as DropdownMenuItem. */}\n <Button variant='primary' classNames='is-full flex gap-2' onClick={handleSave}>\n <span>{t('save label')}</span>\n <div className='grow' />\n <Check className={getSize(5)} />\n </Button>\n <Button classNames='is-full flex gap-2' onClick={handleCancel}>\n <span>{t('cancel label', { ns: 'os' })}</span>\n <div className='grow' />\n <X className={getSize(5)} />\n </Button>\n <Button classNames='is-full flex gap-2' onClick={() => onDelete?.(column.id)}>\n <span>{t('delete label')}</span>\n <div className='grow' />\n <Trash className={getSize(5)} />\n </Button>\n </Section>\n </div>\n </DensityProvider>\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport const translationKey = 'table';\n\nexport default [\n {\n 'en-US': {\n [translationKey]: {\n 'no selection label': ' ',\n 'number column type label': 'Number',\n 'boolean column type label': 'Toggle',\n 'date column type label': 'Date',\n 'string column type label': 'Text',\n 'ref column type label': 'Reference',\n 'digits label': 'Decimal places',\n 'save label': 'Save',\n 'delete label': 'Delete',\n 'column label label': 'Label',\n 'property key label': 'Property',\n 'column type label': 'Type',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport {\n getCoreRowModel,\n getGroupedRowModel,\n useReactTable,\n type ColumnSizingInfoState,\n type ColumnSizingState,\n type GroupingState,\n type RowData,\n type RowSelectionState,\n type OnChangeFn,\n} from '@tanstack/react-table';\nimport React, { Fragment, useCallback, useEffect, useState } from 'react';\n\nimport { debounce } from '@dxos/async';\n\nimport { TableBody } from './TableBody';\nimport { TableProvider as UntypedTableProvider, type TypedTableProvider } from './TableContext';\nimport { TableFooter } from './TableFooter';\nimport { TableHead } from './TableHead';\nimport { type TableProps } from './props';\nimport { groupTh, tableRoot } from '../../theme';\n\nexport const Table = <TData extends RowData>(props: TableProps<TData>) => {\n const {\n role,\n data = [],\n columns = [],\n onColumnResize,\n columnVisibility,\n header = true,\n footer,\n rowsSelectable,\n fullWidth,\n debug,\n onDataSelectionChange,\n classNames,\n } = props;\n\n const TableProvider = UntypedTableProvider as TypedTableProvider<TData>;\n\n // Row selection\n const [rowSelection = {}, directlySetRowSelection] = useControllableState({\n prop: props.rowSelection,\n onChange: props.onRowSelectionChange,\n defaultProp: props.defaultRowSelection,\n });\n\n // TODO(thure): Does @tanstack/react-table really need this intervention? It did seem necessary to enforce single-selection...\n const handleRowSelectionChange = useCallback<OnChangeFn<RowSelectionState>>(\n (updaterOrValue) => {\n const nextRowSelection = typeof updaterOrValue === 'function' ? updaterOrValue(rowSelection) : updaterOrValue;\n if (rowsSelectable === 'multi') {\n directlySetRowSelection(nextRowSelection);\n } else if (rowsSelectable) {\n const nextRowSelectionKey = Object.keys(nextRowSelection).filter((id) => !rowSelection[id])[0];\n directlySetRowSelection(nextRowSelectionKey ? { [nextRowSelectionKey]: true } : {});\n } else {\n directlySetRowSelection({});\n }\n },\n [rowSelection, directlySetRowSelection],\n );\n\n // Resizing\n const [columnSizingInfo, setColumnSizingInfo] = useState<ColumnSizingInfoState>({} as ColumnSizingInfoState);\n const onColumnResizeDebounced = debounce<ColumnSizingState>((info) => onColumnResize?.(info), 500);\n useEffect(() => {\n if (columnSizingInfo.columnSizingStart?.length === 0) {\n onColumnResizeDebounced(table.getState().columnSizing);\n }\n }, [columnSizingInfo]);\n\n const [grouping, setGrouping] = useState<GroupingState>(props.grouping ?? []);\n useEffect(() => setGrouping(props.grouping ?? []), [props.grouping]);\n\n const table = useReactTable({\n // Data\n meta: {},\n data,\n\n // Columns\n columns,\n defaultColumn: {\n size: 256, // Required in order remove default width.\n maxSize: 1024,\n },\n\n // Rows\n getCoreRowModel: getCoreRowModel(),\n\n // State\n state: {\n columnVisibility,\n columnSizingInfo,\n rowSelection,\n grouping,\n },\n\n // Grouping\n getGroupedRowModel: getGroupedRowModel(),\n onGroupingChange: setGrouping,\n\n // Selection\n ...(rowsSelectable === 'multi'\n ? { enableMultiRowSelection: true }\n : rowsSelectable\n ? { enableRowSelection: true }\n : {}),\n onRowSelectionChange: handleRowSelectionChange,\n\n // Resize columns\n columnResizeMode: 'onChange',\n enableColumnResizing: true,\n onColumnSizingInfoChange: setColumnSizingInfo,\n\n // Debug\n debugTable: debug,\n });\n\n useEffect(() => {\n if (onDataSelectionChange) {\n onDataSelectionChange(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));\n }\n }, [onDataSelectionChange, rowSelection, table]);\n\n // Create additional expansion column if all columns have fixed width.\n const expand = false; // columns.map((column) => column.size).filter(Boolean).length === columns?.length;\n\n return (\n <TableProvider\n {...props}\n header={header}\n expand={expand}\n table={table}\n isGrid={role === 'grid' || role === 'treegrid'}\n >\n <table\n role={role}\n className={tableRoot(props, classNames)}\n {...(!fullWidth && { style: { width: table.getTotalSize() } })}\n >\n <TableHead />\n\n {grouping.length === 0 && <TableBody rows={table.getRowModel().rows} />}\n\n {grouping.length !== 0 &&\n table.getGroupedRowModel().rows.map((row, i) => {\n return (\n <Fragment key={i}>\n {/* TODO(burdon): Customize group header renderer. */}\n <thead>\n <tr>\n {debug && <th />}\n <th\n // TODO(burdon): Calculate row span.\n colSpan={table.getHeaderGroups()[0].headers.length}\n className={groupTh(props)}\n >\n {table.getState().grouping[0]}[{String(row.getGroupingValue(table.getState().grouping[0]))}]\n </th>\n </tr>\n </thead>\n\n <TableBody rows={row.subRows} />\n </Fragment>\n );\n })}\n\n {footer && <TableFooter />}\n </table>\n\n {debug && (\n <pre className='font-mono text-xs text-neutral-500 my-4 p-2 ring'>\n <code>{JSON.stringify(table.getState(), undefined, 2)}</code>\n </pre>\n )}\n </TableProvider>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { flexRender, type Row, type RowData } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useTableContext } from './TableContext';\nimport { tbodyTr } from '../../theme';\nimport { Cell } from '../Cell/Cell';\n\ntype TableBodyProps<TData extends RowData> = {\n rows: Row<TData>[];\n};\n\nconst TABLE_BODY_NAME = 'TableBody';\n\nconst TableBody = <TData extends RowData>({ rows }: TableBodyProps<TData>) => {\n const tableContext = useTableContext<TData>(TABLE_BODY_NAME);\n const { table, keyAccessor, debug, expand, isGrid, onDatumClick, currentDatum } = tableContext;\n const rowSelection = table.getState().rowSelection;\n const domAttributes = useArrowNavigationGroup({ axis: 'grid' });\n const canBeCurrent = !isGrid && !!onDatumClick;\n return (\n <tbody {...(isGrid && domAttributes)}>\n {rows.map((row) => {\n const isCurrent = currentDatum === row.original;\n const isSelected = rowSelection?.[row.id];\n return (\n <tr\n key={keyAccessor ? keyAccessor(row.original) : row.id}\n className={tbodyTr({ canBeCurrent })}\n {...(isCurrent && { 'aria-current': 'location' })}\n {...(isSelected && { 'aria-selected': 'true' })}\n {...(canBeCurrent && {\n tabIndex: 0,\n onClick: () => {\n onDatumClick(row.original);\n },\n onKeyUp: ({ key }) => {\n if (key === 'Enter' || key === ' ') {\n onDatumClick(row.original);\n }\n },\n })}\n >\n {debug && <td>{row.id}</td>}\n\n {row.getVisibleCells().map((cell) => {\n return (\n <Cell key={cell.id} cell={cell}>\n {flexRender(cell.column.columnDef.cell, { className: 'pli-2', ...cell.getContext() })}\n </Cell>\n );\n })}\n\n {expand && <td />}\n </tr>\n );\n })}\n </tbody>\n );\n};\n\nTableBody.displayName = TABLE_BODY_NAME;\n\nexport { TableBody };\n\nexport type { TableBodyProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport { type RowData } from '@tanstack/react-table';\nimport { type ReactNode } from 'react';\n\nimport { type TableContextValue } from './props';\n\nexport const TABLE_NAME = 'Table';\n\ntype CreateContextResult<TData extends RowData> = Readonly<\n [TypedTableProvider<unknown>, (consumerName: string) => TableContextValue<TData>]\n>;\n\nexport type TypedTableProvider<TData extends RowData> = {\n (props: TableContextValue<TData> & { children: ReactNode }): JSX.Element;\n displayName: string;\n};\n\nconst [TableProvider, useUntypedTableContext]: CreateContextResult<unknown> =\n createContext<TableContextValue<unknown>>(TABLE_NAME);\n\nexport const useTableContext = <TData extends RowData>(consumerName: string) =>\n useUntypedTableContext(consumerName) as TableContextValue<TData>;\n\nexport { TableProvider };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type CellContext } from '@tanstack/react-table';\n\nimport {\n chromeSurface,\n fixedSurface,\n focusRing,\n ghostSelected,\n ghostSelectedCurrent,\n groupBorder,\n mx,\n} from '@dxos/react-ui-theme';\nimport { type ComponentFunction } from '@dxos/react-ui-types';\n\nimport { type TableContextValue, type TableFlags } from './components';\n\nexport const currentRow = '!bg-neutral-75 !dark:bg-neutral-850';\nexport const selectedRow = '!bg-primary-100 dark:!bg-primary-700';\nexport const flushPadding = 'pli-0 plb-0';\nexport const textPadding = 'pli-2 plb-0.5';\nexport const headPadding = 'pli-2 plb-1.5';\n\nexport const gridCellFocusRing = 'focus:z-[11] focus:outline outline-2 outline-primary-500 dark:outline-primary-400';\n\n//\n// table\n//\n\nexport type TableStyleProps = Partial<TableContextValue<any>>;\n\nexport const tableRoot: ComponentFunction<TableStyleProps> = ({ fullWidth }, ...etc) =>\n mx('table-fixed', fullWidth && 'is-full', ...etc);\n\nexport const groupTh: ComponentFunction<TableStyleProps> = (_props, ...etc) =>\n mx('text-start font-medium', flushPadding, ...etc);\n\n//\n// thead\n//\n\nexport type TheadStyleProps = Partial<TableFlags>;\n\nexport const theadRoot: ComponentFunction<TheadStyleProps> = ({ header, stickyHeader }, ...etc) =>\n mx(header ? stickyHeader && 'sticky block-start-[--sticky-top] z-[1]' : 'collapse', header && fixedSurface, ...etc);\n\nexport const theadTr: ComponentFunction<TheadStyleProps> = (_props, ...etc) => mx('group', ...etc);\n\nexport const theadTh: ComponentFunction<TheadStyleProps> = ({ border }, ...etc) =>\n mx(\n 'relative text-start font-medium select-none truncate',\n headPadding,\n border && 'border',\n border && groupBorder,\n ...etc,\n );\n\nexport const theadResizeRoot: ComponentFunction<TheadStyleProps> = (_props, ...etc) =>\n mx(\n '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',\n ...etc,\n );\n\nexport const theadResizeThumb: ComponentFunction<TheadStyleProps> = (_props, ...etc) =>\n mx('flex group-hover:bg-neutral-700 -ml-[2px] w-[1px] h-full', ...etc);\n\n//\n// tbody\n//\n\nexport type TbodyStyleProps = Partial<TableContextValue<any>>;\nexport const tbodyRoot: ComponentFunction<TbodyStyleProps> = (_props, ...etc) => mx(...etc);\n\nexport type TbodyTrStyleProps = Partial<{ canBeCurrent?: boolean }>;\nexport const tbodyTr: ComponentFunction<TbodyTrStyleProps> = ({ canBeCurrent }, ...etc) =>\n mx(\n 'group',\n canBeCurrent ? ghostSelectedCurrent : ghostSelected,\n canBeCurrent && focusRing,\n canBeCurrent && 'cursor-pointer rounded',\n ...etc,\n );\n\n//\n// td, th\n//\n\nexport const tdRoot: ComponentFunction<TbodyStyleProps> = ({ border, isGrid }, ...etc) =>\n mx('relative', flushPadding, border && 'border', border && groupBorder, isGrid && gridCellFocusRing, ...etc);\nexport const tdContent: ComponentFunction<CellContext<any, any>> = (_props, ...etc) => mx(...etc);\n\n//\n// tfoot\n//\n\nexport type TfootStyleProps = Partial<TableContextValue<any>>;\n\nexport const tfootRoot: ComponentFunction<TfootStyleProps> = (_props, ...etc) =>\n mx('sticky block-end-0 z-10', chromeSurface, ...etc);\n\nexport const tfootTr: ComponentFunction<TfootStyleProps> = (_props, ...etc) => mx(...etc);\n\nexport const tfootTh: ComponentFunction<TfootStyleProps> = ({ border }, ...etc) =>\n mx(textPadding, chromeSurface, border && groupBorder, ...etc);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useFocusableGroup } from '@fluentui/react-tabster';\nimport { type Cell as CellType, type RowData } from '@tanstack/react-table';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { tdRoot } from '../../theme';\nimport { useTableContext } from '../Table/TableContext';\n\ntype CellProps<TData extends RowData, TValue> = PropsWithChildren<{\n cell: CellType<TData, TValue>;\n}>;\n\nconst CELL_NAME = 'Cell';\n\nconst FocusableCell = <TData extends RowData, TValue>({ cell, children }: CellProps<TData, TValue>) => {\n const tableContext = useTableContext(CELL_NAME);\n const domAttributes = useFocusableGroup({ tabBehavior: 'limited' });\n return (\n <td tabIndex={0} {...domAttributes} className={tdRoot(tableContext, cell.column.columnDef.meta?.cell?.classNames)}>\n {children}\n </td>\n );\n};\n\nconst StaticCell = <TData extends RowData, TValue>({ cell, children }: CellProps<TData, TValue>) => {\n const tableContext = useTableContext(CELL_NAME);\n return <td className={tdRoot(tableContext, cell.column.columnDef.meta?.cell?.classNames)}>{children}</td>;\n};\n\nconst Cell = <TData extends RowData, TValue>({ cell, children }: CellProps<TData, TValue>) => {\n const { isGrid } = useTableContext(CELL_NAME);\n const Root = isGrid ? FocusableCell : StaticCell;\n return <Root cell={cell}>{children}</Root>;\n};\n\nCell.displayName = CELL_NAME;\n\nexport { Cell };\n\nexport type { CellProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { flexRender, type RowData } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useTableContext } from './TableContext';\nimport { tfootRoot, tfootTr, tfootTh } from '../../theme';\n\nexport type TableFooterProps = {};\n\nconst TABLE_FOOTER_NAME = 'TableFooter';\n\nconst TableFooter = <TData extends RowData>(props: TableFooterProps) => {\n const tableContext = useTableContext<TData>(TABLE_FOOTER_NAME);\n const { table, expand, debug } = tableContext;\n const footers = table.getFooterGroups();\n return (\n <tfoot className={tfootRoot(props)}>\n {footers.map((footerGroup) => (\n <tr key={footerGroup.id} className={tfootTr(tableContext)}>\n {debug && <th />}\n\n {footerGroup.headers.map((footer) => {\n return (\n <th key={footer.id} className={tfootTh(tableContext, footer.column.columnDef.meta?.footer?.classNames)}>\n {footer.isPlaceholder ? null : flexRender(footer.column.columnDef.footer, footer.getContext())}\n </th>\n );\n })}\n\n {expand && <th />}\n </tr>\n ))}\n </tfoot>\n );\n};\n\nTableFooter.displayName = TABLE_FOOTER_NAME;\n\nexport { TableFooter };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { flexRender, type RowData } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { useTableContext } from './TableContext';\nimport { theadResizeRoot, theadResizeThumb, theadRoot, theadTh, theadTr } from '../../theme';\n\nconst TABLE_HEAD_NAME = 'TableHead';\n\ntype TableHeadProps = {};\n\nconst TableHead = <TData extends RowData>(_props: TableHeadProps) => {\n const tableContext = useTableContext<TData>(TABLE_HEAD_NAME);\n const headerGroups = tableContext.table.getHeaderGroups();\n const state = tableContext.table.getState();\n return (\n <thead className={theadRoot(tableContext)}>\n {headerGroups.map((headerGroup) => {\n return (\n // Group element to hover resize handles.\n <tr key={headerGroup.id} className={theadTr(tableContext)}>\n {/* TODO(burdon): Calc. width. */}\n {tableContext.debug && (\n <th className='font-mono' style={{ width: 32 }}>\n #\n </th>\n )}\n\n {headerGroup.headers.map((header) => {\n const isResizing = header.column.getIsResizing();\n return (\n <th\n key={header.id}\n style={{\n width: header.getSize(),\n }}\n className={theadTh(tableContext, header.column.columnDef.meta?.header?.classNames)}\n >\n {!header || header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n\n {/*\n * Resize handle.\n * https://codesandbox.io/p/sandbox/github/tanstack/table/tree/main/examples/react/column-sizing\n */}\n {header.column.columnDef.meta?.resizable && (\n <div\n className={theadResizeRoot(tableContext, isResizing && 'hidden')}\n style={{\n transform: `translateX(${isResizing ? state.columnSizingInfo.deltaOffset : 0}px)`,\n }}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n >\n <div className={mx(theadResizeThumb(tableContext))} />\n </div>\n )}\n </th>\n );\n })}\n {tableContext.expand && <th />}\n </tr>\n );\n })}\n </thead>\n );\n};\n\nTableHead.displayName = TABLE_HEAD_NAME;\n\nexport { TableHead };\n\nexport type { TableHeadProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CaretDown } from '@phosphor-icons/react';\nimport { type RowData } from '@tanstack/react-table';\nimport React, { useCallback, useState } from 'react';\n\nimport { Popover, useTranslation } from '@dxos/react-ui';\nimport { PopoverCombobox } from '@dxos/react-ui-searchlist';\nimport { descriptionText, getSize, mx, staticPlaceholderText } from '@dxos/react-ui-theme';\n\nimport { type SearchListQueryModel } from '../../helpers';\nimport { translationKey } from '../../translations';\n\nexport type ComboboxCellItems<TData extends RowData> = Record<string, { label: string; data: TData }>;\n\nconst initialItems = <TData extends RowData>(model: SearchListQueryModel<TData>, value?: TData) =>\n value\n ? {\n [model.getId(value)]: { label: model.getText(value), data: value },\n }\n : {};\n\nexport const CellCombobox = <TData extends RowData>({\n model,\n value,\n onValueChange,\n}: {\n model: SearchListQueryModel<TData>;\n value: TData;\n onValueChange: (value: TData) => void;\n}) => {\n const { t } = useTranslation(translationKey);\n const [items, setItems] = useState<ComboboxCellItems<TData>>(initialItems(model, value));\n const [loading, setLoading] = useState(false);\n const [searchInputValue, setSearchInputValue] = useState('');\n const handleSearchInputValueChange = async (text?: string) => {\n setSearchInputValue(text ?? '');\n setLoading(true);\n const items = await model.query(text);\n setItems(\n items.reduce((acc: ComboboxCellItems<TData>, item) => {\n acc[model.getId(item)] = {\n label: model.getText(item),\n data: item,\n };\n return acc;\n }, initialItems(model, value)),\n );\n setLoading(false);\n };\n\n const handleValueChange = useCallback(\n (id: string) => {\n onValueChange(items[id]?.data);\n },\n [items, onValueChange],\n );\n\n return (\n <PopoverCombobox.Root placeholder={t('no selection label')}>\n <PopoverCombobox.Trigger variant='ghost' classNames='is-full rounded-none ring-inset'>\n {value ? (\n <>\n <span\n className={mx('font-normal text-start flex-1 min-is-0 truncate mie-2', !value && staticPlaceholderText)}\n >\n {model.getText(value)}\n </span>\n <CaretDown weight='bold' className={getSize(3)} />\n </>\n ) : null}\n </PopoverCombobox.Trigger>\n <PopoverCombobox.Content shouldFilter={false} classNames='is-[--radix-popover-trigger-width]'>\n <PopoverCombobox.Input value={searchInputValue} onValueChange={handleSearchInputValueChange} />\n <PopoverCombobox.List>\n {searchInputValue.length < 1 ? (\n <p className={mx('text-center', descriptionText)}>Start typing to search</p>\n ) : loading ? (\n <p className={mx('text-center', descriptionText)}>Searching…</p>\n ) : (\n <>\n <PopoverCombobox.Empty classNames={['text-center', descriptionText]}>No results</PopoverCombobox.Empty>\n {Object.entries(items).map(([id, { label }]) => (\n <PopoverCombobox.Item key={id} value={id} onSelect={handleValueChange} classNames='truncate'>\n {label}\n </PopoverCombobox.Item>\n ))}\n </>\n )}\n </PopoverCombobox.List>\n <Popover.Arrow />\n </PopoverCombobox.Content>\n </PopoverCombobox.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport { Check, ClipboardText, type Icon, X } from '@phosphor-icons/react';\nimport {\n createColumnHelper,\n type ColumnDef,\n type ColumnMeta,\n type RowData,\n type ColumnHelper,\n type CellContext,\n} from '@tanstack/react-table';\nimport format from 'date-fns/format';\nimport formatDistanceToNow from 'date-fns/formatDistanceToNow';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { type PublicKey } from '@dxos/keys';\nimport { type ClassNameValue, Input, Tooltip } from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\n\nimport { CellCombobox } from './components';\nimport { useTableContext } from './components/Table/TableContext';\nimport { textPadding } from './theme';\n\nexport type ValueUpdater<TData extends RowData, TValue> = (row: TData, id: string, value: TValue) => void;\n\nexport const createColumnBuilder = <TData extends RowData>() => ({\n helper: createColumnHelper<TData>(),\n builder: new ColumnBuilder<TData>(),\n});\n\n// TODO(thure): This interface is redundant, e.g. `classNames` == `meta.cell.classNames`\n/**\n * NOTE: Can use `meta` for custom properties.\n */\nexport type BaseColumnOptions<TData, TValue> = Partial<ColumnDef<TData, TValue>> & {\n meta?: ColumnMeta<TData, TValue>;\n label?: string;\n classNames?: ClassNameValue;\n onUpdate?: ValueUpdater<TData, TValue | undefined>;\n};\n\n// TODO(burdon): Better abstraction?\nexport type SearchListQueryModel<TData extends RowData> = {\n getId(object: TData): string;\n getText(object: TData): string;\n query(text?: string): Promise<TData[]>;\n};\n\nexport type ComboboxColumnOptions<TData extends RowData> = BaseColumnOptions<TData, any> & {\n model: SearchListQueryModel<TData>;\n};\n\nexport type StringColumnOptions<TData extends RowData> = BaseColumnOptions<TData, string> & {};\nexport type SelectRowColumnOptions<TData extends RowData> = BaseColumnOptions<TData, string> & {};\n\nexport type NumberColumnOptions<TData extends RowData> = BaseColumnOptions<TData, number> & {\n digits?: number;\n};\n\nexport type KeyColumnOptions<TData extends RowData> = BaseColumnOptions<TData, PublicKey> & {\n tooltip?: boolean;\n};\n\nexport type DateColumnOptions<TData extends RowData> = BaseColumnOptions<TData, Date> & {\n format?: string;\n relative?: boolean;\n};\n\nexport type SwitchColumnOptions<TData extends RowData> = BaseColumnOptions<TData, boolean> & {};\n\nexport type IconColumnOptions<TData extends RowData> = BaseColumnOptions<TData, boolean> & {\n on?: {\n Icon?: Icon;\n className?: string;\n };\n off?: {\n Icon?: Icon;\n className?: string;\n };\n};\n\nconst ComboboxBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, TData>) => {\n const { model, onUpdate } = cellContext.column.columnDef.meta as ColumnMeta<TData, TData>;\n return model ? (\n <CellCombobox<TData>\n model={model}\n value={cellContext.getValue()}\n onValueChange={(value) => onUpdate?.(cellContext.row.original, cellContext.column.id, value)}\n />\n ) : null;\n};\n\nconst StringBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, string>) => {\n const { onUpdate } = cellContext.column.columnDef.meta as ColumnMeta<TData, string>;\n // https://tanstack.com/table/v8/docs/examples/react/editable-data\n const initialValue = cellContext.getValue();\n const [value, setValue] = useState(initialValue);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleSave = () => {\n if (value === initialValue) {\n return;\n }\n onUpdate?.(cellContext.row.original, cellContext.column.id, value);\n };\n\n const handleCancel = () => {\n setValue(initialValue);\n };\n\n // Check if first input column of last row.\n const rows = cellContext.table.getRowModel().flatRows;\n const columns = cellContext.table.getVisibleFlatColumns();\n const placeholder = cellContext.row.index === rows.length - 1 && columns[0].id === cellContext.column.id;\n\n // TODO(burdon): Don't render inputs unless mouse over (Show ellipsis when div)?\n return (\n <Input.Root>\n <Input.TextInput\n ref={inputRef}\n variant='subdued'\n placeholder={placeholder ? 'Add row...' : undefined}\n classNames={['is-full', textPadding]}\n value={value ?? ''}\n onBlur={() => handleSave()}\n onChange={(event) => setValue(event.target.value)}\n onKeyDown={(event) => (event.key === 'Enter' && handleSave()) || (event.key === 'Escape' && handleCancel())}\n />\n </Input.Root>\n );\n};\n\nconst parseNumber = (text?: string) => (text?.trim().length ? Number(text) : NaN);\n\nconst displayNumber = (value?: number, digits?: number) =>\n value || value === 0\n ? value.toLocaleString(undefined, {\n minimumFractionDigits: digits ?? 0,\n maximumFractionDigits: digits ?? 2,\n })\n : '';\n\nconst NumberBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, number>) => {\n const { onUpdate, digits } = cellContext.column.columnDef.meta as ColumnMeta<TData, string>;\n const value = cellContext.getValue();\n const [text, setText] = useState<string>(displayNumber(value, digits));\n const { findPrevFocusable } = useFocusFinders();\n const ref = useRef<HTMLInputElement | null>(null);\n\n // Update display value if `digits` changes and input is not in focus.\n useEffect(() => {\n (!document.activeElement || document.activeElement !== ref.current) && setText(displayNumber(value, digits));\n }, [digits, value]);\n\n const handleEdit = () => {\n if (onUpdate) {\n setText(value !== undefined ? String(value) : '');\n }\n };\n\n // TODO(burdon): Property is encoded as float (e.g., 6.1 => 6.099)\n const handleSave = () => {\n const nextValue = parseNumber(text);\n onUpdate?.(cellContext.row.original, cellContext.column.id, isNaN(nextValue) ? undefined : nextValue);\n setText(displayNumber(nextValue, digits));\n // Shift focus only if input is focused on save (e.g. on `Enter`).\n ref.current && document.activeElement === ref.current && findPrevFocusable(ref.current)?.focus();\n };\n\n const _handleCancel = () => {\n setText(displayNumber(value, digits));\n ref.current && findPrevFocusable(ref.current)?.focus();\n };\n\n return (\n <Input.Root>\n <Input.TextInput\n ref={ref}\n variant='subdued'\n value={text}\n classNames={['is-full text-end font-mono', textPadding]}\n onBlur={handleSave}\n onFocus={handleEdit}\n onChange={({ target: { value } }) => setText(value)}\n onKeyDown={(event) => {\n // TODO(thure): `Escape` is reserved for blurring the input and moving focus to the cell\n return /* (event.key === 'Escape' && handleCancel()) || */ event.key === 'Enter' && handleSave();\n }}\n />\n </Input.Root>\n );\n};\n\nconst RowSelectorBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, unknown>) => {\n const { cell } = cellContext.column.columnDef.meta as ColumnMeta<TData, unknown>;\n const { row } = cellContext;\n\n const checked = row.getCanSelect()\n ? row.getIsSelected()\n : row.getCanSelectSubRows() && (row.getIsSomeSelected() ? 'indeterminate' : row.getIsAllSubRowsSelected());\n return (\n <Input.Root>\n <Input.Checkbox\n size={4}\n classNames={['mli-auto', cell?.classNames]}\n checked={checked}\n onCheckedChange={(event) => {\n if (row.getCanSelect()) {\n row.getToggleSelectedHandler()(event);\n }\n }}\n disabled={!(row.getCanSelect() || row.getCanSelectSubRows())}\n />\n </Input.Root>\n );\n};\n\nconst SwitchBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, boolean>) => {\n const { onUpdate } = cellContext.column.columnDef.meta as ColumnMeta<TData, boolean>;\n const value = cellContext.getValue();\n return (\n <Input.Root>\n <Input.Switch\n classNames='block mli-auto'\n onClick={(event) => event.stopPropagation()}\n disabled={!onUpdate}\n checked={!!value}\n onCheckedChange={(value) => {\n onUpdate?.(cellContext.row.original, cellContext.column.id, !!value);\n }}\n />\n </Input.Root>\n );\n};\n\n/**\n * Util to create column definitions.\n */\nexport class ColumnBuilder<TData extends RowData> {\n /**\n * Combobox value\n */\n combobox({\n label,\n classNames,\n model,\n onUpdate,\n ...props\n }: ComboboxColumnOptions<TData>): Partial<ColumnDef<TData, any>> {\n return {\n minSize: 100,\n header: (column) => {\n return label ?? column.header.id;\n },\n cell:\n model && onUpdate\n ? ComboboxBuilderCell\n : (cellContext) => {\n const cellValue = cellContext.getValue();\n return <div className={mx('truncate', classNames)}>{cellValue ? model?.getText(cellValue) : ''}</div>;\n },\n ...props,\n meta: {\n ...props.meta,\n model,\n onUpdate,\n cell: { classNames, ...props.meta?.cell },\n },\n };\n }\n\n /**\n * String formats.\n */\n string({ label, classNames, onUpdate, ...props }: StringColumnOptions<TData> = {}): Partial<\n ColumnDef<TData, string>\n > {\n return {\n minSize: 100,\n // TODO(burdon): Default.\n header: (column) => {\n return label ?? column.header.id;\n },\n cell: onUpdate\n ? StringBuilderCell\n : (cell) => {\n const value = cell.getValue();\n return <div className={mx('truncate', textPadding, classNames)}>{value}</div>;\n },\n ...props,\n meta: {\n ...props.meta,\n onUpdate,\n cell: { ...props.meta?.cell, classNames },\n },\n };\n }\n\n /**\n * Number formats.\n */\n number({ label, minSize, classNames, digits, onUpdate, ...props }: NumberColumnOptions<TData> = {}): Partial<\n ColumnDef<TData, number>\n > {\n return {\n size: 100,\n minSize: 100,\n header: (cell) => label ?? cell.header.id,\n cell: NumberBuilderCell,\n ...props,\n meta: {\n ...props.meta,\n onUpdate,\n digits,\n header: { classNames: 'text-end', ...props.meta?.header },\n cell: { ...props.meta?.cell, classNames },\n },\n };\n }\n\n /**\n * Date formats.\n */\n // TODO(burdon): Date picker (pluggable renderers?)\n date({ label, format: formatSpec, relative, classNames, ...props }: DateColumnOptions<TData> = {}): Partial<\n ColumnDef<TData, Date>\n > {\n return {\n size: 220, // TODO(burdon): Depends on format.\n minSize: 100,\n header: (cell) => label ?? cell.header.id,\n cell: (cell) => {\n const value = cell.getValue();\n\n try {\n const str = value\n ? formatSpec\n ? format(value, formatSpec)\n : relative\n ? formatDistanceToNow(value, { addSuffix: true })\n : value.toISOString()\n : undefined;\n\n return <div className={mx(textPadding, classNames)}>{str}</div>;\n } catch (err) {\n console.log(value);\n return null;\n }\n },\n ...props,\n meta: { ...props.meta, cell: { ...props.meta?.cell, classNames } },\n };\n }\n\n /**\n * PublicKey with tooltip.\n */\n key({ label, tooltip, classNames, ...props }: KeyColumnOptions<TData> = {}): Partial<ColumnDef<TData, PublicKey>> {\n return {\n size: 94,\n minSize: 94,\n header: (cell) => label ?? cell.header.id,\n cell: (cell) => {\n const value = cell.getValue();\n if (!value) {\n return;\n }\n\n // TODO(burdon): Factor out styles.\n const element = value.truncate();\n if (!tooltip) {\n return element;\n }\n\n return (\n <Tooltip.Provider>\n <Tooltip.Root>\n <Tooltip.Trigger>{element}</Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content side='right'>\n <Tooltip.Arrow />\n <ClipboardText\n onClick={(ev) => {\n ev.stopPropagation(); // Prevent select row.\n void navigator.clipboard.writeText(value.toHex());\n }}\n />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n </Tooltip.Provider>\n );\n },\n ...props,\n meta: { ...props.meta, cell: { ...props.meta?.cell, classNames: ['font-mono', textPadding, classNames] } },\n };\n }\n\n /**\n * Row selector\n */\n selectRow({ classNames, onUpdate, id = 'selectRow' }: SelectRowColumnOptions<TData> = {}): Parameters<\n ColumnHelper<TData>['display']\n >[0] {\n return {\n id,\n size: 32,\n minSize: 32,\n maxSize: 32,\n meta: { onUpdate, cell: { classNames } },\n header: ({ table }) => {\n const { rowsSelectable } = useTableContext('HELPER_SELECT_ROW_HEADER_CELL');\n const checked = table.getIsSomeRowsSelected() ? 'indeterminate' : table.getIsAllRowsSelected();\n return rowsSelectable === 'multi' ? (\n <Input.Root>\n <Input.Checkbox\n size={4}\n classNames={['mli-auto', classNames]}\n checked={checked}\n onCheckedChange={() => table.toggleAllRowsSelected()}\n />\n </Input.Root>\n ) : null;\n },\n cell: RowSelectorBuilderCell,\n };\n }\n\n /**\n * Switch\n */\n switch({ label, classNames, onUpdate, ...props }: SwitchColumnOptions<TData> = {}): Partial<\n ColumnDef<TData, boolean>\n > {\n return {\n size: 50,\n minSize: 50,\n header: (column) => label ?? column.header.id,\n cell: SwitchBuilderCell,\n ...props,\n meta: { ...props.meta, onUpdate, cell: { ...props.meta?.cell, classNames: [textPadding, classNames] } },\n };\n }\n\n /**\n * Icon based on boolean value.\n */\n icon({ label, size, on, off, ...props }: IconColumnOptions<TData> = {}): Partial<ColumnDef<TData, boolean>> {\n const IconOn = on?.Icon ?? Check;\n const IconOff = off?.Icon ?? X;\n return {\n size: size ?? 32,\n header: (column) => <div className={'justify-center'}>{label ?? column.header.id}</div>,\n cell: (cell) => {\n const value = cell.getValue();\n if (value) {\n return <IconOn className={mx('block mli-auto', getSize(6), on?.className ?? 'text-green-700')} />;\n } else if (value === false) {\n return <IconOff className={mx('block mli-auto', getSize(6), off?.className ?? 'text-red-700')} />;\n } else {\n return null;\n }\n },\n ...props,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Check", "CaretDown", "Trash", "X", "React", "useRef", "useState", "Button", "DensityProvider", "Input", "Popover", "Select", "Separator", "useTranslation", "getSize", "mx", "safeParseInt", "translationKey", "ColumnMenu", "column", "props", "title", "label", "length", "id", "div", "className", "ColumnPanel", "Section", "children", "role", "mx", "context", "tableDefs", "tableDef", "onUpdate", "onDelete", "open", "setOpen", "useState", "prop", "setProp", "refTable", "setRefTable", "refProp", "setRefProp", "type", "setType", "String", "setLabel", "digits", "setDigits", "propRef", "useRef", "t", "useTranslation", "translationKey", "handleCancel", "handleSave", "match", "current", "focus", "columns", "find", "c", "safeParseInt", "Popover", "Root", "onOpenChange", "nextOpen", "Trigger", "asChild", "Button", "variant", "classNames", "CaretDown", "getSize", "Portal", "Content", "Viewport", "DensityProvider", "density", "Input", "Label", "TextInput", "placeholder", "value", "onChange", "event", "target", "autoFocus", "ref", "replace", "Select", "onValueChange", "TriggerButton", "map", "Option", "key", "filter", "name", "Separator", "onClick", "span", "Check", "ns", "X", "Trash", "Arrow", "useControllableState", "getCoreRowModel", "getGroupedRowModel", "useReactTable", "React", "Fragment", "useCallback", "useEffect", "useState", "debounce", "useArrowNavigationGroup", "flexRender", "React", "createContext", "TABLE_NAME", "TableProvider", "useUntypedTableContext", "createContext", "useTableContext", "consumerName", "chromeSurface", "fixedSurface", "focusRing", "ghostSelected", "ghostSelectedCurrent", "groupBorder", "mx", "currentRow", "selectedRow", "flushPadding", "textPadding", "headPadding", "gridCellFocusRing", "tableRoot", "fullWidth", "etc", "mx", "groupTh", "_props", "theadRoot", "header", "stickyHeader", "fixedSurface", "theadTr", "theadTh", "border", "groupBorder", "theadResizeRoot", "theadResizeThumb", "tbodyRoot", "tbodyTr", "canBeCurrent", "ghostSelectedCurrent", "ghostSelected", "focusRing", "tdRoot", "isGrid", "tdContent", "tfootRoot", "chromeSurface", "tfootTr", "tfootTh", "useFocusableGroup", "React", "CELL_NAME", "FocusableCell", "cell", "children", "tableContext", "useTableContext", "domAttributes", "useFocusableGroup", "tabBehavior", "React", "td", "tabIndex", "className", "tdRoot", "column", "columnDef", "meta", "classNames", "StaticCell", "Cell", "isGrid", "Root", "displayName", "TABLE_BODY_NAME", "TableBody", "rows", "tableContext", "useTableContext", "table", "keyAccessor", "debug", "expand", "isGrid", "onDatumClick", "currentDatum", "rowSelection", "getState", "domAttributes", "useArrowNavigationGroup", "axis", "canBeCurrent", "React", "tbody", "map", "row", "isCurrent", "original", "isSelected", "id", "tr", "key", "className", "tbodyTr", "tabIndex", "onClick", "onKeyUp", "td", "getVisibleCells", "cell", "Cell", "flexRender", "column", "columnDef", "getContext", "displayName", "flexRender", "React", "TABLE_FOOTER_NAME", "TableFooter", "props", "tableContext", "useTableContext", "table", "expand", "debug", "footers", "getFooterGroups", "React", "tfoot", "className", "tfootRoot", "map", "footerGroup", "tr", "key", "id", "tfootTr", "th", "headers", "footer", "tfootTh", "column", "columnDef", "meta", "classNames", "isPlaceholder", "flexRender", "getContext", "displayName", "flexRender", "React", "mx", "TABLE_HEAD_NAME", "TableHead", "_props", "tableContext", "useTableContext", "headerGroups", "table", "getHeaderGroups", "state", "getState", "React", "thead", "className", "theadRoot", "map", "headerGroup", "tr", "key", "id", "theadTr", "debug", "th", "style", "width", "headers", "header", "isResizing", "column", "getIsResizing", "getSize", "theadTh", "columnDef", "meta", "classNames", "isPlaceholder", "flexRender", "getContext", "resizable", "div", "theadResizeRoot", "transform", "columnSizingInfo", "deltaOffset", "onMouseDown", "getResizeHandler", "onTouchStart", "mx", "theadResizeThumb", "expand", "displayName", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Check, CaretDown, Trash, X } from '@phosphor-icons/react';\nimport { type HeaderContext, type RowData } from '@tanstack/react-table';\nimport React, { type FC, type PropsWithChildren, useRef, useState } from 'react';\n\nimport { Button, DensityProvider, Input, Popover, Select, Separator, useTranslation } from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\nimport { safeParseInt } from '@dxos/util';\n\nimport { type TableDef, type ColumnProps, type ColumnType } from '../schema';\nimport { translationKey } from '../translations';\n\nexport type ColumnMenuProps<TData extends RowData, TValue> = {\n context: HeaderContext<TData, TValue>;\n tableDefs: TableDef[];\n tableDef: TableDef;\n column: ColumnProps;\n onUpdate?: (id: string, column: ColumnProps) => void;\n onDelete?: (id: string) => void;\n};\n\nexport const ColumnMenu = <TData extends RowData, TValue>({ column, ...props }: ColumnMenuProps<TData, TValue>) => {\n const title = column.label?.length ? column.label : column.id;\n return (\n <div className='flex items-center gap-2'>\n <div className='flex-1 min-is-0 truncate' title={title}>\n {title}\n </div>\n <div className='flex shrink-0'>\n <ColumnPanel {...props} column={column} />\n </div>\n </div>\n );\n};\n\nconst Section: FC<PropsWithChildren & { className?: string }> = ({ children, className }) => (\n <div role='none' className={mx('p-2', className)}>\n {children}\n </div>\n);\n\nexport const ColumnPanel = <TData extends RowData, TValue>({\n context,\n tableDefs,\n tableDef,\n column,\n onUpdate,\n onDelete,\n}: ColumnMenuProps<TData, TValue>) => {\n const [open, setOpen] = useState(false);\n const [prop, setProp] = useState(column.id);\n const [refTable, setRefTable] = useState(column.refTable);\n const [refProp, setRefProp] = useState(column.refProp);\n const [type, setType] = useState(String(column.type));\n const [label, setLabel] = useState(column.label);\n const [digits, setDigits] = useState(String(column.digits ?? '0'));\n const propRef = useRef<HTMLInputElement>(null);\n const { t } = useTranslation(translationKey);\n\n const handleCancel = () => {\n setProp(column.id);\n setOpen(false);\n };\n\n const handleSave = () => {\n // Check valid.\n if (!prop.length || !prop.match(/^[a-zA-Z_].+/i)) {\n propRef.current?.focus();\n return;\n }\n\n // If already exists then check same type.\n const current = tableDef.columns.find((c) => c.id !== column.id && c.id === prop);\n if (current) {\n // TODO(burdon): Allow multiple columns with different refProps. Ensure correct table prop is updated.\n if (current.type !== 'ref' /* || current.ref !== refTable */) {\n // TODO(burdon): Show error.\n propRef.current?.focus();\n return;\n }\n }\n\n onUpdate?.(prop, {\n id: prop, // TODO(burdon): Make unique.\n prop,\n label,\n type: type as ColumnProps['type'],\n refTable,\n refProp,\n digits: safeParseInt(digits),\n });\n\n setOpen(false);\n };\n\n return (\n <Popover.Root open={open} onOpenChange={(nextOpen) => setOpen(nextOpen)}>\n <Popover.Trigger asChild>\n <Button variant='ghost' classNames='p-1'>\n <CaretDown className={getSize(4)} />\n </Button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content>\n <Popover.Viewport classNames='w-60'>\n <DensityProvider density='fine'>\n <div className='flex flex-col gap-1'>\n <Section>\n <Input.Root>\n <Input.Label classNames='mbe-1'>{t('column label label')}</Input.Label>\n <Input.TextInput\n placeholder='Column label'\n value={label ?? ''}\n onChange={(event) => setLabel(event.target.value)}\n autoFocus\n />\n </Input.Root>\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>{t('property key label')}</Input.Label>\n <Input.TextInput\n ref={propRef}\n placeholder='Property key'\n // TODO(burdon): Provide hooks for value normalization, ENTER, ESC, etc.\n value={prop ?? ''}\n onChange={(event) => setProp(event.target.value.replace(/[^\\w_]/g, ''))}\n />\n </Input.Root>\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>{t('column type label')}</Input.Label>\n <Select.Root value={type} onValueChange={setType}>\n <Select.TriggerButton placeholder='Type' classNames='is-full' />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {(['number', 'boolean', 'string', 'ref'] as ColumnType[]).map((type) => (\n <Select.Option key={type} value={type}>\n {t(`${type} column type label`)}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Input.Root>\n </Section>\n\n {type === 'number' && (\n <>\n <Section>\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>{t('digits label')}</Input.Label>\n {/* TODO(burdon): Constrain input to numbers. */}\n <Input.TextInput value={digits ?? ''} onChange={(event) => setDigits(event.target.value)} />\n </Input.Root>\n </Section>\n </>\n )}\n\n {/* TODO(burdon): Selectors on same line. */}\n {type === 'ref' && (\n <>\n <Section>\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>Table</Input.Label>\n <Select.Root value={refTable} onValueChange={setRefTable}>\n <Select.TriggerButton placeholder='Table' classNames='is-full' />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {tableDefs\n .filter((t) => t.id !== tableDef.id)\n .map(({ id, name }) => (\n <Select.Option key={id} value={id}>\n {name ?? id}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Input.Root>\n\n {refTable && (\n <Input.Root>\n <Input.Label classNames='mbe-1 mbs-3'>Table property</Input.Label>\n <Select.Root value={refProp} onValueChange={setRefProp}>\n <Select.TriggerButton placeholder='Property' classNames='is-full' />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {tableDefs\n .find((tableDef) => tableDef.id === refTable)\n ?.columns.map(({ id, label }) => (\n <Select.Option key={id} value={id}>\n {label ?? id}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n </Input.Root>\n )}\n </Section>\n </>\n )}\n\n <Separator classNames='mli-2' />\n\n <Section className='space-b-1.5'>\n {/* TODO(burdon): Style as DropdownMenuItem. */}\n <Button variant='primary' classNames='is-full flex gap-2' onClick={handleSave}>\n <span>{t('save label')}</span>\n <div className='grow' />\n <Check className={getSize(5)} />\n </Button>\n <Button classNames='is-full flex gap-2' onClick={handleCancel}>\n <span>{t('cancel label', { ns: 'os' })}</span>\n <div className='grow' />\n <X className={getSize(5)} />\n </Button>\n <Button classNames='is-full flex gap-2' onClick={() => onDelete?.(column.id)}>\n <span>{t('delete label')}</span>\n <div className='grow' />\n <Trash className={getSize(5)} />\n </Button>\n </Section>\n </div>\n </DensityProvider>\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport const translationKey = 'table';\n\nexport default [\n {\n 'en-US': {\n [translationKey]: {\n 'no selection label': ' ',\n 'number column type label': 'Number',\n 'boolean column type label': 'Toggle',\n 'date column type label': 'Date',\n 'string column type label': 'Text',\n 'ref column type label': 'Reference',\n 'digits label': 'Decimal places',\n 'save label': 'Save',\n 'delete label': 'Delete',\n 'column label label': 'Label',\n 'property key label': 'Property',\n 'column type label': 'Type',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport {\n getCoreRowModel,\n getGroupedRowModel,\n useReactTable,\n type ColumnSizingInfoState,\n type ColumnSizingState,\n type GroupingState,\n type RowData,\n type RowSelectionState,\n type OnChangeFn,\n} from '@tanstack/react-table';\nimport { useVirtualizer, type VirtualizerOptions } from '@tanstack/react-virtual';\nimport React, { Fragment, useCallback, useEffect, useState } from 'react';\n\nimport { debounce } from '@dxos/async';\n\nimport { TableBody } from './TableBody';\nimport { TableProvider as UntypedTableProvider, type TypedTableProvider, useTableContext } from './TableContext';\nimport { TableFooter } from './TableFooter';\nimport { TableHead } from './TableHead';\nimport { type TableProps } from './props';\nimport { groupTh, tableRoot } from '../../theme';\n\nconst VirtualizedTableContent = ({\n getScrollElement,\n}: Pick<VirtualizerOptions<Element, Element>, 'getScrollElement'>) => {\n const {\n table: { getRowModel },\n } = useTableContext('VirtualizedTableContent');\n const rows = getRowModel().rows;\n\n const { getTotalSize, getVirtualItems } = useVirtualizer({\n getScrollElement,\n count: rows.length,\n overscan: 16,\n estimateSize: () => 33,\n });\n const virtualRows = getVirtualItems();\n const totalSize = getTotalSize();\n\n const paddingTop = virtualRows.length > 0 ? virtualRows?.[0]?.start || 0 : 0;\n const paddingBottom = virtualRows.length > 0 ? totalSize - (virtualRows?.[virtualRows.length - 1]?.end || 0) : 0;\n\n return (\n <>\n {paddingTop > 0 && (\n <tbody role='none'>\n <tr role='none'>\n <td style={{ height: `${paddingTop}px` }} role='none' />\n </tr>\n </tbody>\n )}\n <TableBody rows={virtualRows.map((virtualRow) => rows[virtualRow.index])} />\n {paddingBottom > 0 && (\n <tbody role='none'>\n <tr role='none'>\n <td style={{ height: `${paddingBottom}px` }} role='none' />\n </tr>\n </tbody>\n )}\n </>\n );\n};\n\nconst GroupedTableContent = () => {\n const {\n table: { getGroupedRowModel, getHeaderGroups, getState },\n debug,\n } = useTableContext('GroupedTableContent');\n return (\n <>\n {getGroupedRowModel().rows.map((row, i) => {\n return (\n <Fragment key={i}>\n {/* TODO(burdon): Customize group header renderer. */}\n <thead>\n <tr>\n {debug && <th />}\n <th\n // TODO(burdon): Calculate row span.\n colSpan={getHeaderGroups()[0].headers.length}\n className={groupTh({})}\n >\n {getState().grouping[0]}[{String(row.getGroupingValue(getState().grouping[0]))}]\n </th>\n </tr>\n </thead>\n <TableBody rows={row.subRows} />\n </Fragment>\n );\n })}\n </>\n );\n};\n\nexport const Table = <TData extends RowData>(props: TableProps<TData>) => {\n const {\n role,\n data = [],\n columns = [],\n onColumnResize,\n columnVisibility,\n header = true,\n footer,\n rowsSelectable,\n fullWidth,\n debug,\n onDataSelectionChange,\n classNames,\n getScrollElement,\n } = props;\n\n const TableProvider = UntypedTableProvider as TypedTableProvider<TData>;\n\n // Row selection\n const [rowSelection = {}, directlySetRowSelection] = useControllableState({\n prop: props.rowSelection,\n onChange: props.onRowSelectionChange,\n defaultProp: props.defaultRowSelection,\n });\n\n // TODO(thure): Does @tanstack/react-table really need this intervention? It did seem necessary to enforce single-selection...\n const handleRowSelectionChange = useCallback<OnChangeFn<RowSelectionState>>(\n (updaterOrValue) => {\n const nextRowSelection = typeof updaterOrValue === 'function' ? updaterOrValue(rowSelection) : updaterOrValue;\n if (rowsSelectable === 'multi') {\n directlySetRowSelection(nextRowSelection);\n } else if (rowsSelectable) {\n const nextRowSelectionKey = Object.keys(nextRowSelection).filter((id) => !rowSelection[id])[0];\n directlySetRowSelection(nextRowSelectionKey ? { [nextRowSelectionKey]: true } : {});\n } else {\n directlySetRowSelection({});\n }\n },\n [rowSelection, directlySetRowSelection],\n );\n\n // Resizing\n const [columnSizingInfo, setColumnSizingInfo] = useState<ColumnSizingInfoState>({} as ColumnSizingInfoState);\n const onColumnResizeDebounced = debounce<ColumnSizingState>((info) => onColumnResize?.(info), 500);\n useEffect(() => {\n if (columnSizingInfo.columnSizingStart?.length === 0) {\n onColumnResizeDebounced(table.getState().columnSizing);\n }\n }, [columnSizingInfo]);\n\n const [grouping, setGrouping] = useState<GroupingState>(props.grouping ?? []);\n useEffect(() => setGrouping(props.grouping ?? []), [props.grouping]);\n\n const table = useReactTable({\n // Data\n meta: {},\n data,\n\n // Columns\n columns,\n defaultColumn: {\n size: 256, // Required in order remove default width.\n maxSize: 1024,\n },\n\n // Rows\n getCoreRowModel: getCoreRowModel(),\n\n // State\n state: {\n columnVisibility,\n columnSizingInfo,\n rowSelection,\n grouping,\n },\n\n // Grouping\n getGroupedRowModel: getGroupedRowModel(),\n onGroupingChange: setGrouping,\n\n // Selection\n ...(rowsSelectable === 'multi'\n ? { enableMultiRowSelection: true }\n : rowsSelectable\n ? { enableRowSelection: true }\n : {}),\n onRowSelectionChange: handleRowSelectionChange,\n\n // Resize columns\n columnResizeMode: 'onChange',\n enableColumnResizing: true,\n onColumnSizingInfoChange: setColumnSizingInfo,\n\n // Debug\n debugTable: debug,\n });\n\n const rows = table.getRowModel().rows;\n\n useEffect(() => {\n if (onDataSelectionChange) {\n onDataSelectionChange(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));\n }\n }, [onDataSelectionChange, rowSelection, table]);\n\n // Create additional expansion column if all columns have fixed width.\n const expand = false; // columns.map((column) => column.size).filter(Boolean).length === columns?.length;\n\n return (\n <TableProvider\n {...props}\n header={header}\n expand={expand}\n table={table}\n isGrid={role === 'grid' || role === 'treegrid'}\n >\n <table\n role={role}\n className={tableRoot(props, classNames)}\n {...(!fullWidth && { style: { width: table.getTotalSize() } })}\n >\n <TableHead />\n\n {grouping.length === 0 ? (\n getScrollElement ? (\n <VirtualizedTableContent getScrollElement={getScrollElement} />\n ) : (\n <TableBody rows={rows} />\n )\n ) : (\n <GroupedTableContent />\n )}\n\n {footer && <TableFooter />}\n </table>\n\n {debug && (\n <pre className='font-mono text-xs text-neutral-500 my-4 p-2 ring'>\n <code>{JSON.stringify(table.getState(), undefined, 2)}</code>\n </pre>\n )}\n </TableProvider>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\nimport { flexRender, type Row, type RowData } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useTableContext } from './TableContext';\nimport { tbodyTr } from '../../theme';\nimport { Cell } from '../Cell/Cell';\n\ntype TableBodyProps<TData extends RowData> = {\n rows: Row<TData>[];\n};\n\nconst TABLE_BODY_NAME = 'TableBody';\n\nconst TableBody = <TData extends RowData>({ rows }: TableBodyProps<TData>) => {\n const tableContext = useTableContext<TData>(TABLE_BODY_NAME);\n const { table, keyAccessor, debug, expand, isGrid, onDatumClick, currentDatum } = tableContext;\n const rowSelection = table.getState().rowSelection;\n const domAttributes = useArrowNavigationGroup({ axis: 'grid' });\n const canBeCurrent = !isGrid && !!onDatumClick;\n return (\n <tbody {...(isGrid && domAttributes)}>\n {rows.map((row) => {\n const isCurrent = currentDatum === row.original;\n const isSelected = rowSelection?.[row.id];\n return (\n <tr\n key={keyAccessor ? keyAccessor(row.original) : row.id}\n className={tbodyTr({ canBeCurrent })}\n {...(isCurrent && { 'aria-current': 'location' })}\n {...(isSelected && { 'aria-selected': 'true' })}\n {...(canBeCurrent && {\n tabIndex: 0,\n onClick: () => {\n onDatumClick(row.original);\n },\n onKeyUp: ({ key }) => {\n if (key === 'Enter' || key === ' ') {\n onDatumClick(row.original);\n }\n },\n })}\n >\n {debug && <td>{row.id}</td>}\n\n {row.getVisibleCells().map((cell) => {\n return (\n <Cell key={cell.id} cell={cell}>\n {flexRender(cell.column.columnDef.cell, { className: 'pli-2', ...cell.getContext() })}\n </Cell>\n );\n })}\n\n {expand && <td />}\n </tr>\n );\n })}\n </tbody>\n );\n};\n\nTableBody.displayName = TABLE_BODY_NAME;\n\nexport { TableBody };\n\nexport type { TableBodyProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport { type RowData } from '@tanstack/react-table';\nimport { type ReactNode } from 'react';\n\nimport { type TableContextValue } from './props';\n\nexport const TABLE_NAME = 'Table';\n\ntype CreateContextResult<TData extends RowData> = Readonly<\n [TypedTableProvider<unknown>, (consumerName: string) => TableContextValue<TData>]\n>;\n\nexport type TypedTableProvider<TData extends RowData> = {\n (props: TableContextValue<TData> & { children: ReactNode }): JSX.Element;\n displayName: string;\n};\n\nconst [TableProvider, useUntypedTableContext]: CreateContextResult<unknown> =\n createContext<TableContextValue<unknown>>(TABLE_NAME);\n\nexport const useTableContext = <TData extends RowData>(consumerName: string) =>\n useUntypedTableContext(consumerName) as TableContextValue<TData>;\n\nexport { TableProvider };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type CellContext } from '@tanstack/react-table';\n\nimport {\n chromeSurface,\n fixedSurface,\n focusRing,\n ghostSelected,\n ghostSelectedCurrent,\n groupBorder,\n mx,\n} from '@dxos/react-ui-theme';\nimport { type ComponentFunction } from '@dxos/react-ui-types';\n\nimport { type TableContextValue, type TableFlags } from './components';\n\nexport const currentRow = '!bg-neutral-75 !dark:bg-neutral-850';\nexport const selectedRow = '!bg-primary-100 dark:!bg-primary-700';\nexport const flushPadding = 'pli-0 plb-0';\nexport const textPadding = 'pli-2 plb-0.5';\nexport const headPadding = 'pli-2 plb-1.5';\n\nexport const gridCellFocusRing = 'focus:z-[11] focus:outline outline-2 outline-primary-500 dark:outline-primary-400';\n\n//\n// table\n//\n\nexport type TableStyleProps = Partial<TableContextValue<any>>;\n\nexport const tableRoot: ComponentFunction<TableStyleProps> = ({ fullWidth }, ...etc) =>\n mx('table-fixed', fullWidth && 'is-full', ...etc);\n\nexport const groupTh: ComponentFunction<TableStyleProps> = (_props, ...etc) =>\n mx('text-start font-medium', flushPadding, ...etc);\n\n//\n// thead\n//\n\nexport type TheadStyleProps = Partial<TableFlags>;\n\nexport const theadRoot: ComponentFunction<TheadStyleProps> = ({ header, stickyHeader }, ...etc) =>\n mx(header ? stickyHeader && 'sticky block-start-[--sticky-top] z-[1]' : 'collapse', header && fixedSurface, ...etc);\n\nexport const theadTr: ComponentFunction<TheadStyleProps> = (_props, ...etc) => mx('group', ...etc);\n\nexport const theadTh: ComponentFunction<TheadStyleProps> = ({ border }, ...etc) =>\n mx(\n 'relative text-start font-medium select-none truncate',\n headPadding,\n border && 'border',\n border && groupBorder,\n ...etc,\n );\n\nexport const theadResizeRoot: ComponentFunction<TheadStyleProps> = (_props, ...etc) =>\n mx(\n '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',\n ...etc,\n );\n\nexport const theadResizeThumb: ComponentFunction<TheadStyleProps> = (_props, ...etc) =>\n mx('flex group-hover:bg-neutral-700 -ml-[2px] w-[1px] h-full', ...etc);\n\n//\n// tbody\n//\n\nexport type TbodyStyleProps = Partial<TableContextValue<any>>;\nexport const tbodyRoot: ComponentFunction<TbodyStyleProps> = (_props, ...etc) => mx(...etc);\n\nexport type TbodyTrStyleProps = Partial<{ canBeCurrent?: boolean }>;\nexport const tbodyTr: ComponentFunction<TbodyTrStyleProps> = ({ canBeCurrent }, ...etc) =>\n mx(\n 'group',\n canBeCurrent ? ghostSelectedCurrent : ghostSelected,\n canBeCurrent && focusRing,\n canBeCurrent && 'cursor-pointer rounded',\n ...etc,\n );\n\n//\n// td, th\n//\n\nexport const tdRoot: ComponentFunction<TbodyStyleProps> = ({ border, isGrid }, ...etc) =>\n mx('relative', flushPadding, border && 'border', border && groupBorder, isGrid && gridCellFocusRing, ...etc);\nexport const tdContent: ComponentFunction<CellContext<any, any>> = (_props, ...etc) => mx(...etc);\n\n//\n// tfoot\n//\n\nexport type TfootStyleProps = Partial<TableContextValue<any>>;\n\nexport const tfootRoot: ComponentFunction<TfootStyleProps> = (_props, ...etc) =>\n mx('sticky block-end-0 z-10', chromeSurface, ...etc);\n\nexport const tfootTr: ComponentFunction<TfootStyleProps> = (_props, ...etc) => mx(...etc);\n\nexport const tfootTh: ComponentFunction<TfootStyleProps> = ({ border }, ...etc) =>\n mx(textPadding, chromeSurface, border && groupBorder, ...etc);\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useFocusableGroup } from '@fluentui/react-tabster';\nimport { type Cell as CellType, type RowData } from '@tanstack/react-table';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { tdRoot } from '../../theme';\nimport { useTableContext } from '../Table/TableContext';\n\ntype CellProps<TData extends RowData, TValue> = PropsWithChildren<{\n cell: CellType<TData, TValue>;\n}>;\n\nconst CELL_NAME = 'Cell';\n\nconst FocusableCell = <TData extends RowData, TValue>({ cell, children }: CellProps<TData, TValue>) => {\n const tableContext = useTableContext(CELL_NAME);\n const domAttributes = useFocusableGroup({ tabBehavior: 'limited' });\n return (\n <td tabIndex={0} {...domAttributes} className={tdRoot(tableContext, cell.column.columnDef.meta?.cell?.classNames)}>\n {children}\n </td>\n );\n};\n\nconst StaticCell = <TData extends RowData, TValue>({ cell, children }: CellProps<TData, TValue>) => {\n const tableContext = useTableContext(CELL_NAME);\n return <td className={tdRoot(tableContext, cell.column.columnDef.meta?.cell?.classNames)}>{children}</td>;\n};\n\nconst Cell = <TData extends RowData, TValue>({ cell, children }: CellProps<TData, TValue>) => {\n const { isGrid } = useTableContext(CELL_NAME);\n const Root = isGrid ? FocusableCell : StaticCell;\n return <Root cell={cell}>{children}</Root>;\n};\n\nCell.displayName = CELL_NAME;\n\nexport { Cell };\n\nexport type { CellProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { flexRender, type RowData } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useTableContext } from './TableContext';\nimport { tfootRoot, tfootTr, tfootTh } from '../../theme';\n\nexport type TableFooterProps = {};\n\nconst TABLE_FOOTER_NAME = 'TableFooter';\n\nconst TableFooter = <TData extends RowData>(props: TableFooterProps) => {\n const tableContext = useTableContext<TData>(TABLE_FOOTER_NAME);\n const { table, expand, debug } = tableContext;\n const footers = table.getFooterGroups();\n return (\n <tfoot className={tfootRoot(props)}>\n {footers.map((footerGroup) => (\n <tr key={footerGroup.id} className={tfootTr(tableContext)}>\n {debug && <th />}\n\n {footerGroup.headers.map((footer) => {\n return (\n <th key={footer.id} className={tfootTh(tableContext, footer.column.columnDef.meta?.footer?.classNames)}>\n {footer.isPlaceholder ? null : flexRender(footer.column.columnDef.footer, footer.getContext())}\n </th>\n );\n })}\n\n {expand && <th />}\n </tr>\n ))}\n </tfoot>\n );\n};\n\nTableFooter.displayName = TABLE_FOOTER_NAME;\n\nexport { TableFooter };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { flexRender, type RowData } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { useTableContext } from './TableContext';\nimport { theadResizeRoot, theadResizeThumb, theadRoot, theadTh, theadTr } from '../../theme';\n\nconst TABLE_HEAD_NAME = 'TableHead';\n\ntype TableHeadProps = {};\n\nconst TableHead = <TData extends RowData>(_props: TableHeadProps) => {\n const tableContext = useTableContext<TData>(TABLE_HEAD_NAME);\n const headerGroups = tableContext.table.getHeaderGroups();\n const state = tableContext.table.getState();\n return (\n <thead className={theadRoot(tableContext)}>\n {headerGroups.map((headerGroup) => {\n return (\n // Group element to hover resize handles.\n <tr key={headerGroup.id} className={theadTr(tableContext)}>\n {/* TODO(burdon): Calc. width. */}\n {tableContext.debug && (\n <th className='font-mono' style={{ width: 32 }}>\n #\n </th>\n )}\n\n {headerGroup.headers.map((header) => {\n const isResizing = header.column.getIsResizing();\n return (\n <th\n key={header.id}\n style={{\n width: header.getSize(),\n }}\n className={theadTh(tableContext, header.column.columnDef.meta?.header?.classNames)}\n >\n {!header || header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n\n {/*\n * Resize handle.\n * https://codesandbox.io/p/sandbox/github/tanstack/table/tree/main/examples/react/column-sizing\n */}\n {header.column.columnDef.meta?.resizable && (\n <div\n className={theadResizeRoot(tableContext, isResizing && 'hidden')}\n style={{\n transform: `translateX(${isResizing ? state.columnSizingInfo.deltaOffset : 0}px)`,\n }}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n >\n <div className={mx(theadResizeThumb(tableContext))} />\n </div>\n )}\n </th>\n );\n })}\n {tableContext.expand && <th />}\n </tr>\n );\n })}\n </thead>\n );\n};\n\nTableHead.displayName = TABLE_HEAD_NAME;\n\nexport { TableHead };\n\nexport type { TableHeadProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { CaretDown } from '@phosphor-icons/react';\nimport { type RowData } from '@tanstack/react-table';\nimport React, { useCallback, useState } from 'react';\n\nimport { Popover, useTranslation } from '@dxos/react-ui';\nimport { PopoverCombobox } from '@dxos/react-ui-searchlist';\nimport { descriptionText, getSize, mx, staticPlaceholderText } from '@dxos/react-ui-theme';\n\nimport { type SearchListQueryModel } from '../../helpers';\nimport { translationKey } from '../../translations';\n\nexport type ComboboxCellItems<TData extends RowData> = Record<string, { label: string; data: TData }>;\n\nconst initialItems = <TData extends RowData>(model: SearchListQueryModel<TData>, value?: TData) =>\n value\n ? {\n [model.getId(value)]: { label: model.getText(value), data: value },\n }\n : {};\n\nexport const CellCombobox = <TData extends RowData>({\n model,\n value,\n onValueChange,\n}: {\n model: SearchListQueryModel<TData>;\n value: TData;\n onValueChange: (value: TData) => void;\n}) => {\n const { t } = useTranslation(translationKey);\n const [items, setItems] = useState<ComboboxCellItems<TData>>(initialItems(model, value));\n const [loading, setLoading] = useState(false);\n const [searchInputValue, setSearchInputValue] = useState('');\n const handleSearchInputValueChange = async (text?: string) => {\n setSearchInputValue(text ?? '');\n setLoading(true);\n const items = await model.query(text);\n setItems(\n items.reduce((acc: ComboboxCellItems<TData>, item) => {\n acc[model.getId(item)] = {\n label: model.getText(item),\n data: item,\n };\n return acc;\n }, initialItems(model, value)),\n );\n setLoading(false);\n };\n\n const handleValueChange = useCallback(\n (id: string) => {\n onValueChange(items[id]?.data);\n },\n [items, onValueChange],\n );\n\n return (\n <PopoverCombobox.Root placeholder={t('no selection label')}>\n <PopoverCombobox.Trigger variant='ghost' classNames='is-full rounded-none ring-inset'>\n {value ? (\n <>\n <span\n className={mx(\n 'font-normal text-start text-base flex-1 min-is-0 truncate mie-2',\n !value && staticPlaceholderText,\n )}\n >\n {model.getText(value)}\n </span>\n <CaretDown weight='bold' className={getSize(3)} />\n </>\n ) : null}\n </PopoverCombobox.Trigger>\n <PopoverCombobox.Content shouldFilter={false} classNames='is-[--radix-popover-trigger-width]'>\n <PopoverCombobox.Input value={searchInputValue} onValueChange={handleSearchInputValueChange} />\n <PopoverCombobox.List>\n {searchInputValue.length < 1 ? (\n <p className={mx('text-center', descriptionText)}>Start typing to search</p>\n ) : loading ? (\n <p className={mx('text-center', descriptionText)}>Searching…</p>\n ) : (\n <>\n <PopoverCombobox.Empty classNames={['text-center', descriptionText]}>No results</PopoverCombobox.Empty>\n {Object.entries(items).map(([id, { label }]) => (\n <PopoverCombobox.Item key={id} value={id} onSelect={handleValueChange} classNames='truncate'>\n {label}\n </PopoverCombobox.Item>\n ))}\n </>\n )}\n </PopoverCombobox.List>\n <Popover.Arrow />\n </PopoverCombobox.Content>\n </PopoverCombobox.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport { Check, ClipboardText, type Icon, X } from '@phosphor-icons/react';\nimport {\n createColumnHelper,\n type ColumnDef,\n type ColumnMeta,\n type RowData,\n type ColumnHelper,\n type CellContext,\n} from '@tanstack/react-table';\nimport format from 'date-fns/format';\nimport formatDistanceToNow from 'date-fns/formatDistanceToNow';\nimport React, { useEffect, useRef, useState } from 'react';\n\nimport { type PublicKey } from '@dxos/keys';\nimport { type ClassNameValue, Input, Tooltip } from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\n\nimport { CellCombobox } from './components';\nimport { useTableContext } from './components/Table/TableContext';\nimport { textPadding } from './theme';\n\nexport type ValueUpdater<TData extends RowData, TValue> = (row: TData, id: string, value: TValue) => void;\n\nexport const createColumnBuilder = <TData extends RowData>() => ({\n helper: createColumnHelper<TData>(),\n builder: new ColumnBuilder<TData>(),\n});\n\n// TODO(thure): This interface is redundant, e.g. `classNames` == `meta.cell.classNames`\n/**\n * NOTE: Can use `meta` for custom properties.\n */\nexport type BaseColumnOptions<TData, TValue> = Partial<ColumnDef<TData, TValue>> & {\n meta?: ColumnMeta<TData, TValue>;\n label?: string;\n classNames?: ClassNameValue;\n onUpdate?: ValueUpdater<TData, TValue | undefined>;\n};\n\n// TODO(burdon): Better abstraction?\nexport type SearchListQueryModel<TData extends RowData> = {\n getId(object: TData): string;\n getText(object: TData): string;\n query(text?: string): Promise<TData[]>;\n};\n\nexport type ComboboxColumnOptions<TData extends RowData> = BaseColumnOptions<TData, any> & {\n model: SearchListQueryModel<TData>;\n};\n\nexport type StringColumnOptions<TData extends RowData> = BaseColumnOptions<TData, string> & {};\nexport type SelectRowColumnOptions<TData extends RowData> = BaseColumnOptions<TData, string> & {};\n\nexport type NumberColumnOptions<TData extends RowData> = BaseColumnOptions<TData, number> & {\n digits?: number;\n};\n\nexport type KeyColumnOptions<TData extends RowData> = BaseColumnOptions<TData, PublicKey> & {\n tooltip?: boolean;\n};\n\nexport type DateColumnOptions<TData extends RowData> = BaseColumnOptions<TData, Date> & {\n format?: string;\n relative?: boolean;\n};\n\nexport type SwitchColumnOptions<TData extends RowData> = BaseColumnOptions<TData, boolean> & {};\n\nexport type IconColumnOptions<TData extends RowData> = BaseColumnOptions<TData, boolean> & {\n on?: {\n Icon?: Icon;\n className?: string;\n };\n off?: {\n Icon?: Icon;\n className?: string;\n };\n};\n\nconst ComboboxBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, TData>) => {\n const { model, onUpdate } = cellContext.column.columnDef.meta as ColumnMeta<TData, TData>;\n return model ? (\n <CellCombobox<TData>\n model={model}\n value={cellContext.getValue()}\n onValueChange={(value) => onUpdate?.(cellContext.row.original, cellContext.column.id, value)}\n />\n ) : null;\n};\n\nconst StringBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, string>) => {\n const { onUpdate } = cellContext.column.columnDef.meta as ColumnMeta<TData, string>;\n // https://tanstack.com/table/v8/docs/examples/react/editable-data\n const initialValue = cellContext.getValue();\n const [value, setValue] = useState(initialValue);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleSave = () => {\n if (value === initialValue) {\n return;\n }\n onUpdate?.(cellContext.row.original, cellContext.column.id, value);\n };\n\n const handleCancel = () => {\n setValue(initialValue);\n };\n\n // Check if first input column of last row.\n const rows = cellContext.table.getRowModel().flatRows;\n const columns = cellContext.table.getVisibleFlatColumns();\n const placeholder = cellContext.row.index === rows.length - 1 && columns[0].id === cellContext.column.id;\n\n // TODO(burdon): Don't render inputs unless mouse over (Show ellipsis when div)?\n return (\n <Input.Root>\n <Input.TextInput\n ref={inputRef}\n variant='subdued'\n placeholder={placeholder ? 'Add row...' : undefined}\n classNames={['is-full', textPadding]}\n value={value ?? ''}\n onBlur={() => handleSave()}\n onChange={(event) => setValue(event.target.value)}\n onKeyDown={(event) => (event.key === 'Enter' && handleSave()) || (event.key === 'Escape' && handleCancel())}\n />\n </Input.Root>\n );\n};\n\nconst parseNumber = (text?: string) => (text?.trim().length ? Number(text) : NaN);\n\nconst displayNumber = (value?: number, digits?: number) =>\n value || value === 0\n ? value.toLocaleString(undefined, {\n minimumFractionDigits: digits ?? 0,\n maximumFractionDigits: digits ?? 2,\n })\n : '';\n\nconst NumberBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, number>) => {\n const { onUpdate, digits } = cellContext.column.columnDef.meta as ColumnMeta<TData, string>;\n const value = cellContext.getValue();\n const [text, setText] = useState<string>(displayNumber(value, digits));\n const { findPrevFocusable } = useFocusFinders();\n const ref = useRef<HTMLInputElement | null>(null);\n\n // Update display value if `digits` changes and input is not in focus.\n useEffect(() => {\n (!document.activeElement || document.activeElement !== ref.current) && setText(displayNumber(value, digits));\n }, [digits, value]);\n\n const handleEdit = () => {\n if (onUpdate) {\n setText(value !== undefined ? String(value) : '');\n }\n };\n\n // TODO(burdon): Property is encoded as float (e.g., 6.1 => 6.099)\n const handleSave = () => {\n const nextValue = parseNumber(text);\n onUpdate?.(cellContext.row.original, cellContext.column.id, isNaN(nextValue) ? undefined : nextValue);\n setText(displayNumber(nextValue, digits));\n // Shift focus only if input is focused on save (e.g. on `Enter`).\n ref.current && document.activeElement === ref.current && findPrevFocusable(ref.current)?.focus();\n };\n\n const _handleCancel = () => {\n setText(displayNumber(value, digits));\n ref.current && findPrevFocusable(ref.current)?.focus();\n };\n\n return (\n <Input.Root>\n <Input.TextInput\n ref={ref}\n variant='subdued'\n value={text}\n classNames={['is-full text-end font-mono', textPadding]}\n onBlur={handleSave}\n onFocus={handleEdit}\n onChange={({ target: { value } }) => setText(value)}\n onKeyDown={(event) => {\n // TODO(thure): `Escape` is reserved for blurring the input and moving focus to the cell\n return /* (event.key === 'Escape' && handleCancel()) || */ event.key === 'Enter' && handleSave();\n }}\n />\n </Input.Root>\n );\n};\n\nconst RowSelectorBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, unknown>) => {\n const { cell } = cellContext.column.columnDef.meta as ColumnMeta<TData, unknown>;\n const { row } = cellContext;\n\n const checked = row.getCanSelect()\n ? row.getIsSelected()\n : row.getCanSelectSubRows() && (row.getIsSomeSelected() ? 'indeterminate' : row.getIsAllSubRowsSelected());\n return (\n <Input.Root>\n <Input.Checkbox\n size={4}\n classNames={['mli-auto', cell?.classNames]}\n checked={checked}\n onCheckedChange={(event) => {\n if (row.getCanSelect()) {\n row.getToggleSelectedHandler()(event);\n }\n }}\n disabled={!(row.getCanSelect() || row.getCanSelectSubRows())}\n />\n </Input.Root>\n );\n};\n\nconst SwitchBuilderCell = <TData extends RowData>(cellContext: CellContext<TData, boolean>) => {\n const { onUpdate } = cellContext.column.columnDef.meta as ColumnMeta<TData, boolean>;\n const value = cellContext.getValue();\n return (\n <Input.Root>\n <Input.Switch\n classNames='block mli-auto'\n onClick={(event) => event.stopPropagation()}\n disabled={!onUpdate}\n checked={!!value}\n onCheckedChange={(value) => {\n onUpdate?.(cellContext.row.original, cellContext.column.id, !!value);\n }}\n />\n </Input.Root>\n );\n};\n\n/**\n * Util to create column definitions.\n */\nexport class ColumnBuilder<TData extends RowData> {\n /**\n * Combobox value\n */\n combobox({\n label,\n classNames,\n model,\n onUpdate,\n ...props\n }: ComboboxColumnOptions<TData>): Partial<ColumnDef<TData, any>> {\n return {\n minSize: 100,\n header: (column) => {\n return label ?? column.header.id;\n },\n cell:\n model && onUpdate\n ? ComboboxBuilderCell\n : (cellContext) => {\n const cellValue = cellContext.getValue();\n return <div className={mx('truncate', classNames)}>{cellValue ? model?.getText(cellValue) : ''}</div>;\n },\n ...props,\n meta: {\n ...props.meta,\n model,\n onUpdate,\n cell: { classNames, ...props.meta?.cell },\n },\n };\n }\n\n /**\n * String formats.\n */\n string({ label, classNames, onUpdate, ...props }: StringColumnOptions<TData> = {}): Partial<\n ColumnDef<TData, string>\n > {\n return {\n minSize: 100,\n // TODO(burdon): Default.\n header: (column) => {\n return label ?? column.header.id;\n },\n cell: onUpdate\n ? StringBuilderCell\n : (cell) => {\n const value = cell.getValue();\n return <div className={mx('truncate', textPadding, classNames)}>{value}</div>;\n },\n ...props,\n meta: {\n ...props.meta,\n onUpdate,\n cell: { ...props.meta?.cell, classNames },\n },\n };\n }\n\n /**\n * Number formats.\n */\n number({ label, minSize, classNames, digits, onUpdate, ...props }: NumberColumnOptions<TData> = {}): Partial<\n ColumnDef<TData, number>\n > {\n return {\n size: 100,\n minSize: 100,\n header: (cell) => label ?? cell.header.id,\n cell: NumberBuilderCell,\n ...props,\n meta: {\n ...props.meta,\n onUpdate,\n digits,\n header: { classNames: 'text-end', ...props.meta?.header },\n cell: { ...props.meta?.cell, classNames },\n },\n };\n }\n\n /**\n * Date formats.\n */\n // TODO(burdon): Date picker (pluggable renderers?)\n date({ label, format: formatSpec, relative, classNames, ...props }: DateColumnOptions<TData> = {}): Partial<\n ColumnDef<TData, Date>\n > {\n return {\n size: 220, // TODO(burdon): Depends on format.\n minSize: 100,\n header: (cell) => label ?? cell.header.id,\n cell: (cell) => {\n const value = cell.getValue();\n\n try {\n const str = value\n ? formatSpec\n ? format(value, formatSpec)\n : relative\n ? formatDistanceToNow(value, { addSuffix: true })\n : value.toISOString()\n : undefined;\n\n return <div className={mx(textPadding, classNames)}>{str}</div>;\n } catch (err) {\n console.log(value);\n return null;\n }\n },\n ...props,\n meta: { ...props.meta, cell: { ...props.meta?.cell, classNames } },\n };\n }\n\n /**\n * PublicKey with tooltip.\n */\n key({ label, tooltip, classNames, ...props }: KeyColumnOptions<TData> = {}): Partial<ColumnDef<TData, PublicKey>> {\n return {\n size: 94,\n minSize: 94,\n header: (cell) => label ?? cell.header.id,\n cell: (cell) => {\n const value = cell.getValue();\n if (!value) {\n return;\n }\n\n // TODO(burdon): Factor out styles.\n const element = value.truncate();\n if (!tooltip) {\n return element;\n }\n\n return (\n <Tooltip.Provider>\n <Tooltip.Root>\n <Tooltip.Trigger>{element}</Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content side='right'>\n <Tooltip.Arrow />\n <ClipboardText\n onClick={(ev) => {\n ev.stopPropagation(); // Prevent select row.\n void navigator.clipboard.writeText(value.toHex());\n }}\n />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n </Tooltip.Provider>\n );\n },\n ...props,\n meta: { ...props.meta, cell: { ...props.meta?.cell, classNames: ['font-mono', textPadding, classNames] } },\n };\n }\n\n /**\n * Row selector\n */\n selectRow({ classNames, onUpdate, id = 'selectRow' }: SelectRowColumnOptions<TData> = {}): Parameters<\n ColumnHelper<TData>['display']\n >[0] {\n return {\n id,\n size: 32,\n minSize: 32,\n maxSize: 32,\n meta: { onUpdate, cell: { classNames } },\n header: ({ table }) => {\n const { rowsSelectable } = useTableContext('HELPER_SELECT_ROW_HEADER_CELL');\n const checked = table.getIsSomeRowsSelected() ? 'indeterminate' : table.getIsAllRowsSelected();\n return rowsSelectable === 'multi' ? (\n <Input.Root>\n <Input.Checkbox\n size={4}\n classNames={['mli-auto', classNames]}\n checked={checked}\n onCheckedChange={() => table.toggleAllRowsSelected()}\n />\n </Input.Root>\n ) : null;\n },\n cell: RowSelectorBuilderCell,\n };\n }\n\n /**\n * Switch\n */\n switch({ label, classNames, onUpdate, ...props }: SwitchColumnOptions<TData> = {}): Partial<\n ColumnDef<TData, boolean>\n > {\n return {\n size: 50,\n minSize: 50,\n header: (column) => label ?? column.header.id,\n cell: SwitchBuilderCell,\n ...props,\n meta: { ...props.meta, onUpdate, cell: { ...props.meta?.cell, classNames: [textPadding, classNames] } },\n };\n }\n\n /**\n * Icon based on boolean value.\n */\n icon({ label, size, on, off, ...props }: IconColumnOptions<TData> = {}): Partial<ColumnDef<TData, boolean>> {\n const IconOn = on?.Icon ?? Check;\n const IconOff = off?.Icon ?? X;\n return {\n size: size ?? 32,\n header: (column) => <div className={'justify-center'}>{label ?? column.header.id}</div>,\n cell: (cell) => {\n const value = cell.getValue();\n if (value) {\n return <IconOn className={mx('block mli-auto', getSize(6), on?.className ?? 'text-green-700')} />;\n } else if (value === false) {\n return <IconOff className={mx('block mli-auto', getSize(6), off?.className ?? 'text-red-700')} />;\n } else {\n return null;\n }\n },\n ...props,\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Check", "CaretDown", "Trash", "X", "React", "useRef", "useState", "Button", "DensityProvider", "Input", "Popover", "Select", "Separator", "useTranslation", "getSize", "mx", "safeParseInt", "translationKey", "ColumnMenu", "column", "props", "title", "label", "length", "id", "div", "className", "ColumnPanel", "Section", "children", "role", "mx", "context", "tableDefs", "tableDef", "onUpdate", "onDelete", "open", "setOpen", "useState", "prop", "setProp", "refTable", "setRefTable", "refProp", "setRefProp", "type", "setType", "String", "setLabel", "digits", "setDigits", "propRef", "useRef", "t", "useTranslation", "translationKey", "handleCancel", "handleSave", "match", "current", "focus", "columns", "find", "c", "safeParseInt", "Popover", "Root", "onOpenChange", "nextOpen", "Trigger", "asChild", "Button", "variant", "classNames", "CaretDown", "getSize", "Portal", "Content", "Viewport", "DensityProvider", "density", "Input", "Label", "TextInput", "placeholder", "value", "onChange", "event", "target", "autoFocus", "ref", "replace", "Select", "onValueChange", "TriggerButton", "map", "Option", "key", "filter", "name", "Separator", "onClick", "span", "Check", "ns", "X", "Trash", "Arrow", "useControllableState", "getCoreRowModel", "getGroupedRowModel", "useReactTable", "useVirtualizer", "React", "Fragment", "useCallback", "useEffect", "useState", "debounce", "useArrowNavigationGroup", "flexRender", "React", "createContext", "TABLE_NAME", "TableProvider", "useUntypedTableContext", "createContext", "useTableContext", "consumerName", "chromeSurface", "fixedSurface", "focusRing", "ghostSelected", "ghostSelectedCurrent", "groupBorder", "mx", "currentRow", "selectedRow", "flushPadding", "textPadding", "headPadding", "gridCellFocusRing", "tableRoot", "fullWidth", "etc", "mx", "groupTh", "_props", "theadRoot", "header", "stickyHeader", "fixedSurface", "theadTr", "theadTh", "border", "groupBorder", "theadResizeRoot", "theadResizeThumb", "tbodyRoot", "tbodyTr", "canBeCurrent", "ghostSelectedCurrent", "ghostSelected", "focusRing", "tdRoot", "isGrid", "tdContent", "tfootRoot", "chromeSurface", "tfootTr", "tfootTh", "useFocusableGroup", "React", "CELL_NAME", "FocusableCell", "cell", "children", "tableContext", "useTableContext", "domAttributes", "useFocusableGroup", "tabBehavior", "React", "td", "tabIndex", "className", "tdRoot", "column", "columnDef", "meta", "classNames", "StaticCell", "Cell", "isGrid", "Root", "displayName", "TABLE_BODY_NAME", "TableBody", "rows", "tableContext", "useTableContext", "table", "keyAccessor", "debug", "expand", "isGrid", "onDatumClick", "currentDatum", "rowSelection", "getState", "domAttributes", "useArrowNavigationGroup", "axis", "canBeCurrent", "React", "tbody", "map", "row", "isCurrent", "original", "isSelected", "id", "tr", "key", "className", "tbodyTr", "tabIndex", "onClick", "onKeyUp", "td", "getVisibleCells", "cell", "Cell", "flexRender", "column", "columnDef", "getContext", "displayName", "flexRender", "React", "TABLE_FOOTER_NAME", "TableFooter", "props", "tableContext", "useTableContext", "table", "expand", "debug", "footers", "getFooterGroups", "React", "tfoot", "className", "tfootRoot", "map", "footerGroup", "tr", "key", "id", "tfootTr", "th", "headers", "footer", "tfootTh", "column", "columnDef", "meta", "classNames", "isPlaceholder", "flexRender", "getContext", "displayName", "flexRender", "React", "mx", "TABLE_HEAD_NAME", "TableHead", "_props", "tableContext", "useTableContext", "headerGroups", "table", "getHeaderGroups", "state", "getState", "React", "thead", "className", "theadRoot", "map", "headerGroup", "tr", "key", "id", "theadTr", "debug", "th", "style", "width", "headers", "header", "isResizing", "column", "getIsResizing", "getSize", "theadTh", "columnDef", "meta", "classNames", "isPlaceholder", "flexRender", "getContext", "resizable", "div", "theadResizeRoot", "transform", "columnSizingInfo", "deltaOffset", "onMouseDown", "getResizeHandler", "onTouchStart", "mx", "theadResizeThumb", "expand", "displayName", "VirtualizedTableContent", "getScrollElement", "table", "getRowModel", "useTableContext", "rows", "getTotalSize", "getVirtualItems", "useVirtualizer", "count", "length", "overscan", "estimateSize", "virtualRows", "totalSize", "paddingTop", "start", "paddingBottom", "end", "React", "tbody", "role", "tr", "td", "style", "height", "TableBody", "map", "virtualRow", "index", "GroupedTableContent", "getGroupedRowModel", "getHeaderGroups", "getState", "debug", "row", "i", "Fragment", "key", "thead", "th", "colSpan", "headers", "className", "groupTh", "grouping", "String", "getGroupingValue", "subRows", "Table", "props", "data", "columns", "onColumnResize", "columnVisibility", "header", "footer", "rowsSelectable", "fullWidth", "onDataSelectionChange", "classNames", "TableProvider", "UntypedTableProvider", "rowSelection", "directlySetRowSelection", "useControllableState", "prop", "onChange", "onRowSelectionChange", "defaultProp", "defaultRowSelection", "handleRowSelectionChange", "useCallback", "updaterOrValue", "nextRowSelection", "nextRowSelectionKey", "Object", "keys", "filter", "id", "columnSizingInfo", "setColumnSizingInfo", "useState", "onColumnResizeDebounced", "debounce", "info", "useEffect", "columnSizingStart", "columnSizing", "setGrouping", "useReactTable", "meta", "defaultColumn", "size", "maxSize", "getCoreRowModel", "state", "onGroupingChange", "enableMultiRowSelection", "enableRowSelection", "columnResizeMode", "enableColumnResizing", "onColumnSizingInfoChange", "debugTable", "rowsById", "original", "expand", "isGrid", "tableRoot", "width", "TableHead", "TableFooter", "pre", "code", "JSON", "stringify", "undefined", "CaretDown", "React", "useCallback", "useState", "Popover", "useTranslation", "PopoverCombobox", "descriptionText", "getSize", "mx", "staticPlaceholderText", "initialItems", "model", "value", "getId", "label", "getText", "data", "CellCombobox", "onValueChange", "t", "useTranslation", "translationKey", "items", "setItems", "useState", "loading", "setLoading", "searchInputValue", "setSearchInputValue", "handleSearchInputValueChange", "text", "query", "reduce", "acc", "item", "handleValueChange", "useCallback", "id", "React", "PopoverCombobox", "Root", "placeholder", "Trigger", "variant", "classNames", "span", "className", "mx", "staticPlaceholderText", "CaretDown", "weight", "getSize", "Content", "shouldFilter", "Input", "List", "length", "p", "descriptionText", "Empty", "Object", "entries", "map", "Item", "key", "onSelect", "Popover", "Arrow", "useFocusFinders", "Check", "ClipboardText", "X", "createColumnHelper", "format", "formatDistanceToNow", "React", "useEffect", "useRef", "useState", "Input", "Tooltip", "getSize", "mx", "createColumnBuilder", "helper", "createColumnHelper", "builder", "ColumnBuilder", "ComboboxBuilderCell", "cellContext", "model", "onUpdate", "column", "columnDef", "meta", "React", "CellCombobox", "value", "getValue", "onValueChange", "row", "original", "id", "StringBuilderCell", "initialValue", "setValue", "useState", "inputRef", "useRef", "handleSave", "handleCancel", "rows", "table", "getRowModel", "flatRows", "columns", "getVisibleFlatColumns", "placeholder", "index", "length", "Input", "Root", "TextInput", "ref", "variant", "undefined", "classNames", "textPadding", "onBlur", "onChange", "event", "target", "onKeyDown", "key", "parseNumber", "text", "trim", "Number", "NaN", "displayNumber", "digits", "toLocaleString", "minimumFractionDigits", "maximumFractionDigits", "NumberBuilderCell", "setText", "findPrevFocusable", "useFocusFinders", "useEffect", "document", "activeElement", "current", "handleEdit", "String", "nextValue", "isNaN", "focus", "_handleCancel", "onFocus", "RowSelectorBuilderCell", "cell", "checked", "getCanSelect", "getIsSelected", "getCanSelectSubRows", "getIsSomeSelected", "getIsAllSubRowsSelected", "Checkbox", "size", "onCheckedChange", "getToggleSelectedHandler", "disabled", "SwitchBuilderCell", "Switch", "onClick", "stopPropagation", "combobox", "label", "props", "minSize", "header", "cellValue", "div", "className", "mx", "getText", "string", "number", "date", "format", "formatSpec", "relative", "str", "formatDistanceToNow", "addSuffix", "toISOString", "err", "console", "log", "tooltip", "element", "truncate", "Tooltip", "Provider", "Trigger", "Portal", "Content", "side", "Arrow", "ClipboardText", "ev", "navigator", "clipboard", "writeText", "toHex", "selectRow", "maxSize", "rowsSelectable", "useTableContext", "getIsSomeRowsSelected", "getIsAllRowsSelected", "toggleAllRowsSelected", "switch", "icon", "on", "off", "IconOn", "Icon", "Check", "IconOff", "X", "getSize"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/ui/react-ui-table/src/translations.ts":{"bytes":2343,"imports":[],"format":"esm"},"packages/ui/react-ui-table/src/components/ColumnMenu.tsx":{"bytes":29348,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/translations.ts","kind":"import-statement","original":"../translations"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableContext.tsx":{"bytes":2237,"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/theme.ts":{"bytes":9807,"imports":[{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/components/Cell/Cell.tsx":{"bytes":4832,"imports":[{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"../Table/TableContext"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableBody.tsx":{"bytes":7888,"imports":[{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./TableContext"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"},{"path":"packages/ui/react-ui-table/src/components/Cell/Cell.tsx","kind":"import-statement","original":"../Cell/Cell"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableFooter.tsx":{"bytes":4719,"imports":[{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./TableContext"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableHead.tsx":{"bytes":8764,"imports":[{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./TableContext"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/Table.tsx":{"bytes":19178,"imports":[{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/Table/TableBody.tsx","kind":"import-statement","original":"./TableBody"},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./TableContext"},{"path":"packages/ui/react-ui-table/src/components/Table/TableFooter.tsx","kind":"import-statement","original":"./TableFooter"},{"path":"packages/ui/react-ui-table/src/components/Table/TableHead.tsx","kind":"import-statement","original":"./TableHead"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/props.ts":{"bytes":2667,"imports":[],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/index.ts":{"bytes":557,"imports":[{"path":"packages/ui/react-ui-table/src/components/Table/Table.tsx","kind":"import-statement","original":"./Table"},{"path":"packages/ui/react-ui-table/src/components/Table/props.ts","kind":"import-statement","original":"./props"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Cell/CellCombobox.tsx":{"bytes":11550,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-searchlist","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/translations.ts","kind":"import-statement","original":"../../translations"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Cell/index.ts":{"bytes":494,"imports":[{"path":"packages/ui/react-ui-table/src/components/Cell/CellCombobox.tsx","kind":"import-statement","original":"./CellCombobox"}],"format":"esm"},"packages/ui/react-ui-table/src/components/index.ts":{"bytes":644,"imports":[{"path":"packages/ui/react-ui-table/src/components/ColumnMenu.tsx","kind":"import-statement","original":"./ColumnMenu"},{"path":"packages/ui/react-ui-table/src/components/Table/index.ts","kind":"import-statement","original":"./Table"},{"path":"packages/ui/react-ui-table/src/components/Cell/index.ts","kind":"import-statement","original":"./Cell"}],"format":"esm"},"packages/ui/react-ui-table/src/helpers.tsx":{"bytes":47982,"imports":[{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"date-fns/format","kind":"import-statement","external":true},{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./components/Table/TableContext"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"./theme"}],"format":"esm"},"packages/ui/react-ui-table/src/schema.ts":{"bytes":1111,"imports":[],"format":"esm"},"packages/ui/react-ui-table/src/types.ts":{"bytes":1830,"imports":[],"format":"esm"},"packages/ui/react-ui-table/src/index.ts":{"bytes":1017,"imports":[{"path":"packages/ui/react-ui-table/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-table/src/helpers.tsx","kind":"import-statement","original":"./helpers"},{"path":"packages/ui/react-ui-table/src/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"./theme"},{"path":"packages/ui/react-ui-table/src/translations.ts","kind":"import-statement","original":"./translations"},{"path":"packages/ui/react-ui-table/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-table/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":79125},"packages/ui/react-ui-table/dist/lib/browser/index.mjs":{"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-searchlist","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"date-fns/format","kind":"import-statement","external":true},{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"exports":["CellCombobox","ColumnBuilder","ColumnMenu","ColumnPanel","Table","createColumnBuilder","currentRow","flushPadding","gridCellFocusRing","groupTh","headPadding","selectedRow","tableRoot","tbodyRoot","tbodyTr","tdContent","tdRoot","textPadding","tfootRoot","tfootTh","tfootTr","theadResizeRoot","theadResizeThumb","theadRoot","theadTh","theadTr","translations"],"entryPoint":"packages/ui/react-ui-table/src/index.ts","inputs":{"packages/ui/react-ui-table/src/components/ColumnMenu.tsx":{"bytesInOutput":7835},"packages/ui/react-ui-table/src/translations.ts":{"bytesInOutput":611},"packages/ui/react-ui-table/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/components/Table/Table.tsx":{"bytesInOutput":4447},"packages/ui/react-ui-table/src/components/Table/TableBody.tsx":{"bytesInOutput":1770},"packages/ui/react-ui-table/src/components/Table/TableContext.tsx":{"bytesInOutput":234},"packages/ui/react-ui-table/src/theme.ts":{"bytesInOutput":2022},"packages/ui/react-ui-table/src/components/Cell/Cell.tsx":{"bytesInOutput":980},"packages/ui/react-ui-table/src/components/Table/TableFooter.tsx":{"bytesInOutput":1036},"packages/ui/react-ui-table/src/components/Table/TableHead.tsx":{"bytesInOutput":1985},"packages/ui/react-ui-table/src/components/Table/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/components/Cell/CellCombobox.tsx":{"bytesInOutput":3100},"packages/ui/react-ui-table/src/components/Cell/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/helpers.tsx":{"bytesInOutput":11524}},"bytes":36850}}}
|
|
1
|
+
{"inputs":{"packages/ui/react-ui-table/src/translations.ts":{"bytes":2343,"imports":[],"format":"esm"},"packages/ui/react-ui-table/src/components/ColumnMenu.tsx":{"bytes":29348,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/translations.ts","kind":"import-statement","original":"../translations"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableContext.tsx":{"bytes":2237,"imports":[{"path":"@radix-ui/react-context","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/theme.ts":{"bytes":9807,"imports":[{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/components/Cell/Cell.tsx":{"bytes":4832,"imports":[{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"../Table/TableContext"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableBody.tsx":{"bytes":7888,"imports":[{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./TableContext"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"},{"path":"packages/ui/react-ui-table/src/components/Cell/Cell.tsx","kind":"import-statement","original":"../Cell/Cell"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableFooter.tsx":{"bytes":4719,"imports":[{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./TableContext"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableHead.tsx":{"bytes":8764,"imports":[{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./TableContext"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/Table.tsx":{"bytes":25082,"imports":[{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"@tanstack/react-virtual","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/Table/TableBody.tsx","kind":"import-statement","original":"./TableBody"},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./TableContext"},{"path":"packages/ui/react-ui-table/src/components/Table/TableFooter.tsx","kind":"import-statement","original":"./TableFooter"},{"path":"packages/ui/react-ui-table/src/components/Table/TableHead.tsx","kind":"import-statement","original":"./TableHead"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"../../theme"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/props.ts":{"bytes":3059,"imports":[],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/index.ts":{"bytes":557,"imports":[{"path":"packages/ui/react-ui-table/src/components/Table/Table.tsx","kind":"import-statement","original":"./Table"},{"path":"packages/ui/react-ui-table/src/components/Table/props.ts","kind":"import-statement","original":"./props"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Cell/CellCombobox.tsx":{"bytes":11640,"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-searchlist","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/translations.ts","kind":"import-statement","original":"../../translations"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Cell/index.ts":{"bytes":494,"imports":[{"path":"packages/ui/react-ui-table/src/components/Cell/CellCombobox.tsx","kind":"import-statement","original":"./CellCombobox"}],"format":"esm"},"packages/ui/react-ui-table/src/components/index.ts":{"bytes":644,"imports":[{"path":"packages/ui/react-ui-table/src/components/ColumnMenu.tsx","kind":"import-statement","original":"./ColumnMenu"},{"path":"packages/ui/react-ui-table/src/components/Table/index.ts","kind":"import-statement","original":"./Table"},{"path":"packages/ui/react-ui-table/src/components/Cell/index.ts","kind":"import-statement","original":"./Cell"}],"format":"esm"},"packages/ui/react-ui-table/src/helpers.tsx":{"bytes":47982,"imports":[{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"date-fns/format","kind":"import-statement","external":true},{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"packages/ui/react-ui-table/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-table/src/components/Table/TableContext.tsx","kind":"import-statement","original":"./components/Table/TableContext"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"./theme"}],"format":"esm"},"packages/ui/react-ui-table/src/schema.ts":{"bytes":1111,"imports":[],"format":"esm"},"packages/ui/react-ui-table/src/types.ts":{"bytes":1830,"imports":[],"format":"esm"},"packages/ui/react-ui-table/src/index.ts":{"bytes":1017,"imports":[{"path":"packages/ui/react-ui-table/src/components/index.ts","kind":"import-statement","original":"./components"},{"path":"packages/ui/react-ui-table/src/helpers.tsx","kind":"import-statement","original":"./helpers"},{"path":"packages/ui/react-ui-table/src/schema.ts","kind":"import-statement","original":"./schema"},{"path":"packages/ui/react-ui-table/src/theme.ts","kind":"import-statement","original":"./theme"},{"path":"packages/ui/react-ui-table/src/translations.ts","kind":"import-statement","original":"./translations"},{"path":"packages/ui/react-ui-table/src/types.ts","kind":"import-statement","original":"./types"}],"format":"esm"}},"outputs":{"packages/ui/react-ui-table/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":82323},"packages/ui/react-ui-table/dist/lib/browser/index.mjs":{"imports":[{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@radix-ui/react-use-controllable-state","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"@tanstack/react-virtual","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@radix-ui/react-context","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-searchlist","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true},{"path":"@fluentui/react-tabster","kind":"import-statement","external":true},{"path":"@phosphor-icons/react","kind":"import-statement","external":true},{"path":"@tanstack/react-table","kind":"import-statement","external":true},{"path":"date-fns/format","kind":"import-statement","external":true},{"path":"date-fns/formatDistanceToNow","kind":"import-statement","external":true},{"path":"react","kind":"import-statement","external":true},{"path":"@dxos/react-ui","kind":"import-statement","external":true},{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"exports":["CellCombobox","ColumnBuilder","ColumnMenu","ColumnPanel","Table","createColumnBuilder","currentRow","flushPadding","gridCellFocusRing","groupTh","headPadding","selectedRow","tableRoot","tbodyRoot","tbodyTr","tdContent","tdRoot","textPadding","tfootRoot","tfootTh","tfootTr","theadResizeRoot","theadResizeThumb","theadRoot","theadTh","theadTr","translations"],"entryPoint":"packages/ui/react-ui-table/src/index.ts","inputs":{"packages/ui/react-ui-table/src/components/ColumnMenu.tsx":{"bytesInOutput":7835},"packages/ui/react-ui-table/src/translations.ts":{"bytesInOutput":611},"packages/ui/react-ui-table/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/components/Table/Table.tsx":{"bytesInOutput":6269},"packages/ui/react-ui-table/src/components/Table/TableBody.tsx":{"bytesInOutput":1770},"packages/ui/react-ui-table/src/components/Table/TableContext.tsx":{"bytesInOutput":234},"packages/ui/react-ui-table/src/theme.ts":{"bytesInOutput":2022},"packages/ui/react-ui-table/src/components/Cell/Cell.tsx":{"bytesInOutput":980},"packages/ui/react-ui-table/src/components/Table/TableFooter.tsx":{"bytesInOutput":1036},"packages/ui/react-ui-table/src/components/Table/TableHead.tsx":{"bytesInOutput":1985},"packages/ui/react-ui-table/src/components/Table/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/components/Cell/CellCombobox.tsx":{"bytesInOutput":3110},"packages/ui/react-ui-table/src/components/Cell/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/helpers.tsx":{"bytesInOutput":11524}},"bytes":38682}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CellCombobox.d.ts","sourceRoot":"","sources":["../../../../../src/components/Cell/CellCombobox.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAOrD,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAG1D,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAStG,eAAO,MAAM,YAAY;;;qCAOU,IAAI;
|
|
1
|
+
{"version":3,"file":"CellCombobox.d.ts","sourceRoot":"","sources":["../../../../../src/components/Cell/CellCombobox.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAOrD,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAG1D,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;AAStG,eAAO,MAAM,YAAY;;;qCAOU,IAAI;iBAoEtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../../../../src/components/Table/Table.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../../../../src/components/Table/Table.tsx"],"names":[],"mappings":"AAyBA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AA2E1C,eAAO,MAAM,KAAK,kEAgJjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Table/Table.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AAOpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;;;;;4BAuGsB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAsChB,GAAG;;AA1Cf,wBAgDE;AAEF,eAAO,MAAM,OAAO;;;;;CAKnB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;CAMtB,CAAC;AAEF,eAAO,MAAM,KAAK;;;;CAIjB,CAAC;AAEF,eAAO,MAAM,OAAO;;
|
|
1
|
+
{"version":3,"file":"Table.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/Table/Table.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;AAOpB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAKlD,KAAK,IAAI,GAAG;IACV,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;;;;;4BAuGsB,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAsChB,GAAG;;AA1Cf,wBAgDE;AAEF,eAAO,MAAM,OAAO;;;;;CAKnB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;CAMtB,CAAC;AAEF,eAAO,MAAM,KAAK;;;;CAIjB,CAAC;AAEF,eAAO,MAAM,OAAO;;CA+BnB,CAAC;AAEF,eAAO,MAAM,QAAQ;;CAwBpB,CAAC;AAEF,eAAO,MAAM,SAAS;;CAuBrB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type RowData, type RowSelectionState, type Table, type VisibilityState } from '@tanstack/react-table';
|
|
2
|
+
import { type VirtualizerOptions } from '@tanstack/react-virtual';
|
|
2
3
|
import { type ClassNameValue } from '@dxos/react-ui-types';
|
|
3
4
|
import { type KeyValue, type TableColumnDef } from '../../types';
|
|
4
5
|
export type TableFlags = Partial<{
|
|
@@ -20,7 +21,7 @@ export type TableCurrent<TData extends RowData> = Partial<{
|
|
|
20
21
|
currentDatum: TData;
|
|
21
22
|
onDatumClick: (datum: TData) => void;
|
|
22
23
|
}>;
|
|
23
|
-
export type TableProps<TData extends RowData> = TableFlags & TableCurrent<TData> & Partial<{
|
|
24
|
+
export type TableProps<TData extends RowData, ScrollElement extends Element | Window = Element, ItemElement extends Element = HTMLTableRowElement> = TableFlags & TableCurrent<TData> & Partial<{
|
|
24
25
|
keyAccessor: KeyValue<TData>;
|
|
25
26
|
data: TData[];
|
|
26
27
|
columns: TableColumnDef<TData>[];
|
|
@@ -31,7 +32,7 @@ export type TableProps<TData extends RowData> = TableFlags & TableCurrent<TData>
|
|
|
31
32
|
onRowSelectionChange: (rowSelection: RowSelectionState) => void;
|
|
32
33
|
onDataSelectionChange: (dataSelection: TData[]) => void;
|
|
33
34
|
classNames: ClassNameValue;
|
|
34
|
-
}
|
|
35
|
+
} & Pick<VirtualizerOptions<ScrollElement, ItemElement>, 'getScrollElement'>>;
|
|
35
36
|
export type { RowSelectionState, VisibilityState, TableColumnDef, KeyValue };
|
|
36
37
|
export type TableContextValue<TData extends RowData> = TableFlags & TableCurrent<TData> & Pick<TableProps<TData>, 'keyAccessor'> & {
|
|
37
38
|
table: Table<TData>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../../../../src/components/Table/props.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../../../../src/components/Table/props.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC;IAC/B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,CAAC;IACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,OAAO,GAAG,OAAO,CAAC;CACnC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,OAAO,IAAI,OAAO,CAAC;IAExD,YAAY,EAAE,KAAK,CAAC;IACpB,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtC,CAAC,CAAC;AAEH,MAAM,MAAM,UAAU,CACpB,KAAK,SAAS,OAAO,EACrB,aAAa,SAAS,OAAO,GAAG,MAAM,GAAG,OAAO,EAChD,WAAW,SAAS,OAAO,GAAG,mBAAmB,IAC/C,UAAU,GACZ,YAAY,CAAC,KAAK,CAAC,GACnB,OAAO,CACL;IACE,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,EAAE,KAAK,EAAE,CAAC;IACd,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;IACjC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IACxD,gBAAgB,EAAE,eAAe,CAAC;IAElC,YAAY,EAAE,iBAAiB,CAAC;IAChC,mBAAmB,EAAE,iBAAiB,CAAC;IACvC,oBAAoB,EAAE,CAAC,YAAY,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAEhE,qBAAqB,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAExD,UAAU,EAAE,cAAc,CAAC;CAC5B,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE,kBAAkB,CAAC,CAC7E,CAAC;AAEJ,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;AAE7E,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,OAAO,IAAI,UAAU,GAC/D,YAAY,CAAC,KAAK,CAAC,GACnB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,GAAG;IACvC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/react-ui-table",
|
|
3
|
-
"version": "0.3.9-main.
|
|
3
|
+
"version": "0.3.9-main.4e39f3a",
|
|
4
4
|
"description": "A table component.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -20,21 +20,20 @@
|
|
|
20
20
|
"@radix-ui/react-context": "^1.0.0",
|
|
21
21
|
"@radix-ui/react-use-controllable-state": "^1.0.0",
|
|
22
22
|
"@tanstack/react-table": "^8.9.3",
|
|
23
|
+
"@tanstack/react-virtual": "^3.0.1",
|
|
23
24
|
"date-fns": "^2.29.3",
|
|
24
|
-
"
|
|
25
|
-
"@dxos/
|
|
26
|
-
"@dxos/
|
|
27
|
-
"@dxos/react-ui": "0.3.9-main.
|
|
28
|
-
"@dxos/
|
|
29
|
-
"@dxos/react-ui-
|
|
30
|
-
"@dxos/react-ui-types": "0.3.9-main.
|
|
31
|
-
"@dxos/util": "0.3.9-main.
|
|
32
|
-
"@dxos/invariant": "0.3.9-main.3fcc0fa"
|
|
25
|
+
"@dxos/async": "0.3.9-main.4e39f3a",
|
|
26
|
+
"@dxos/invariant": "0.3.9-main.4e39f3a",
|
|
27
|
+
"@dxos/react-ui": "0.3.9-main.4e39f3a",
|
|
28
|
+
"@dxos/react-ui-theme": "0.3.9-main.4e39f3a",
|
|
29
|
+
"@dxos/keys": "0.3.9-main.4e39f3a",
|
|
30
|
+
"@dxos/react-ui-searchlist": "0.3.9-main.4e39f3a",
|
|
31
|
+
"@dxos/react-ui-types": "0.3.9-main.4e39f3a",
|
|
32
|
+
"@dxos/util": "0.3.9-main.4e39f3a"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@faker-js/faker": "^8.0.2",
|
|
36
36
|
"@phosphor-icons/react": "^2.0.5",
|
|
37
|
-
"@types/lodash.defaultsdeep": "^4.6.6",
|
|
38
37
|
"@types/react": "^18.0.21",
|
|
39
38
|
"@types/react-dom": "^18.0.6",
|
|
40
39
|
"chromatic": "^7.5.0",
|
|
@@ -43,7 +42,7 @@
|
|
|
43
42
|
"react-dom": "^18.2.0",
|
|
44
43
|
"vite": "^4.3.9",
|
|
45
44
|
"vite-plugin-turbosnap": "^1.0.2",
|
|
46
|
-
"@dxos/react-ui-theme": "0.3.9-main.
|
|
45
|
+
"@dxos/react-ui-theme": "0.3.9-main.4e39f3a"
|
|
47
46
|
},
|
|
48
47
|
"peerDependencies": {
|
|
49
48
|
"@phosphor-icons/react": "^2.0.5",
|
|
@@ -64,7 +64,10 @@ export const CellCombobox = <TData extends RowData>({
|
|
|
64
64
|
{value ? (
|
|
65
65
|
<>
|
|
66
66
|
<span
|
|
67
|
-
className={mx(
|
|
67
|
+
className={mx(
|
|
68
|
+
'font-normal text-start text-base flex-1 min-is-0 truncate mie-2',
|
|
69
|
+
!value && staticPlaceholderText,
|
|
70
|
+
)}
|
|
68
71
|
>
|
|
69
72
|
{model.getText(value)}
|
|
70
73
|
</span>
|
|
@@ -7,7 +7,7 @@ import '@dxosTheme';
|
|
|
7
7
|
import { faker } from '@faker-js/faker';
|
|
8
8
|
import { Plugs, PlugsConnected } from '@phosphor-icons/react';
|
|
9
9
|
import { deepSignal } from 'deepsignal';
|
|
10
|
-
import React, { useEffect, useState } from 'react';
|
|
10
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
11
11
|
|
|
12
12
|
import { PublicKey } from '@dxos/keys';
|
|
13
13
|
import { DensityProvider, AnchoredOverflow } from '@dxos/react-ui';
|
|
@@ -206,6 +206,7 @@ export const Empty = {
|
|
|
206
206
|
|
|
207
207
|
export const Dynamic = {
|
|
208
208
|
render: () => {
|
|
209
|
+
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
209
210
|
const [items, setItems] = useState<Item[]>(createItems(50));
|
|
210
211
|
useEffect(() => {
|
|
211
212
|
const interval = setInterval(() => {
|
|
@@ -219,7 +220,7 @@ export const Dynamic = {
|
|
|
219
220
|
return () => clearInterval(interval);
|
|
220
221
|
}, []);
|
|
221
222
|
return (
|
|
222
|
-
<AnchoredOverflow.Root classNames='max-bs-[80dvh]'>
|
|
223
|
+
<AnchoredOverflow.Root classNames='max-bs-[80dvh]' ref={containerRef}>
|
|
223
224
|
<Table<Item>
|
|
224
225
|
rowsSelectable='multi'
|
|
225
226
|
keyAccessor={(row) => row.publicKey.toHex()}
|
|
@@ -227,6 +228,8 @@ export const Dynamic = {
|
|
|
227
228
|
data={items}
|
|
228
229
|
fullWidth
|
|
229
230
|
footer
|
|
231
|
+
stickyHeader
|
|
232
|
+
getScrollElement={() => containerRef.current}
|
|
230
233
|
/>
|
|
231
234
|
<AnchoredOverflow.Anchor />
|
|
232
235
|
</AnchoredOverflow.Root>
|
|
@@ -236,21 +239,26 @@ export const Dynamic = {
|
|
|
236
239
|
|
|
237
240
|
export const Editable = {
|
|
238
241
|
render: () => {
|
|
239
|
-
const
|
|
242
|
+
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
243
|
+
const [items, setItems] = useState<Item[]>(createItems(200));
|
|
240
244
|
const onUpdate: ValueUpdater<Item, any> = (item, prop, value) => {
|
|
241
245
|
setItems((items) => updateItems(items, item.publicKey, prop, value));
|
|
242
246
|
};
|
|
243
247
|
|
|
244
248
|
return (
|
|
245
|
-
<
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
249
|
+
<div ref={containerRef} className='fixed inset-0 overflow-auto'>
|
|
250
|
+
<Table<Item>
|
|
251
|
+
role='grid'
|
|
252
|
+
rowsSelectable='multi'
|
|
253
|
+
keyAccessor={(row) => row.publicKey.toHex()}
|
|
254
|
+
columns={columns(onUpdate)}
|
|
255
|
+
data={items}
|
|
256
|
+
fullWidth
|
|
257
|
+
stickyHeader
|
|
258
|
+
border
|
|
259
|
+
getScrollElement={() => containerRef.current}
|
|
260
|
+
/>
|
|
261
|
+
</div>
|
|
254
262
|
);
|
|
255
263
|
},
|
|
256
264
|
};
|
|
@@ -273,6 +281,7 @@ export const Resizable = {
|
|
|
273
281
|
columns={columns(onUpdate)}
|
|
274
282
|
data={items}
|
|
275
283
|
fullWidth
|
|
284
|
+
stickyHeader
|
|
276
285
|
// onColumnResize={handleColumnResize}
|
|
277
286
|
/>
|
|
278
287
|
);
|
|
@@ -14,17 +14,90 @@ import {
|
|
|
14
14
|
type RowSelectionState,
|
|
15
15
|
type OnChangeFn,
|
|
16
16
|
} from '@tanstack/react-table';
|
|
17
|
+
import { useVirtualizer, type VirtualizerOptions } from '@tanstack/react-virtual';
|
|
17
18
|
import React, { Fragment, useCallback, useEffect, useState } from 'react';
|
|
18
19
|
|
|
19
20
|
import { debounce } from '@dxos/async';
|
|
20
21
|
|
|
21
22
|
import { TableBody } from './TableBody';
|
|
22
|
-
import { TableProvider as UntypedTableProvider, type TypedTableProvider } from './TableContext';
|
|
23
|
+
import { TableProvider as UntypedTableProvider, type TypedTableProvider, useTableContext } from './TableContext';
|
|
23
24
|
import { TableFooter } from './TableFooter';
|
|
24
25
|
import { TableHead } from './TableHead';
|
|
25
26
|
import { type TableProps } from './props';
|
|
26
27
|
import { groupTh, tableRoot } from '../../theme';
|
|
27
28
|
|
|
29
|
+
const VirtualizedTableContent = ({
|
|
30
|
+
getScrollElement,
|
|
31
|
+
}: Pick<VirtualizerOptions<Element, Element>, 'getScrollElement'>) => {
|
|
32
|
+
const {
|
|
33
|
+
table: { getRowModel },
|
|
34
|
+
} = useTableContext('VirtualizedTableContent');
|
|
35
|
+
const rows = getRowModel().rows;
|
|
36
|
+
|
|
37
|
+
const { getTotalSize, getVirtualItems } = useVirtualizer({
|
|
38
|
+
getScrollElement,
|
|
39
|
+
count: rows.length,
|
|
40
|
+
overscan: 16,
|
|
41
|
+
estimateSize: () => 33,
|
|
42
|
+
});
|
|
43
|
+
const virtualRows = getVirtualItems();
|
|
44
|
+
const totalSize = getTotalSize();
|
|
45
|
+
|
|
46
|
+
const paddingTop = virtualRows.length > 0 ? virtualRows?.[0]?.start || 0 : 0;
|
|
47
|
+
const paddingBottom = virtualRows.length > 0 ? totalSize - (virtualRows?.[virtualRows.length - 1]?.end || 0) : 0;
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<>
|
|
51
|
+
{paddingTop > 0 && (
|
|
52
|
+
<tbody role='none'>
|
|
53
|
+
<tr role='none'>
|
|
54
|
+
<td style={{ height: `${paddingTop}px` }} role='none' />
|
|
55
|
+
</tr>
|
|
56
|
+
</tbody>
|
|
57
|
+
)}
|
|
58
|
+
<TableBody rows={virtualRows.map((virtualRow) => rows[virtualRow.index])} />
|
|
59
|
+
{paddingBottom > 0 && (
|
|
60
|
+
<tbody role='none'>
|
|
61
|
+
<tr role='none'>
|
|
62
|
+
<td style={{ height: `${paddingBottom}px` }} role='none' />
|
|
63
|
+
</tr>
|
|
64
|
+
</tbody>
|
|
65
|
+
)}
|
|
66
|
+
</>
|
|
67
|
+
);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const GroupedTableContent = () => {
|
|
71
|
+
const {
|
|
72
|
+
table: { getGroupedRowModel, getHeaderGroups, getState },
|
|
73
|
+
debug,
|
|
74
|
+
} = useTableContext('GroupedTableContent');
|
|
75
|
+
return (
|
|
76
|
+
<>
|
|
77
|
+
{getGroupedRowModel().rows.map((row, i) => {
|
|
78
|
+
return (
|
|
79
|
+
<Fragment key={i}>
|
|
80
|
+
{/* TODO(burdon): Customize group header renderer. */}
|
|
81
|
+
<thead>
|
|
82
|
+
<tr>
|
|
83
|
+
{debug && <th />}
|
|
84
|
+
<th
|
|
85
|
+
// TODO(burdon): Calculate row span.
|
|
86
|
+
colSpan={getHeaderGroups()[0].headers.length}
|
|
87
|
+
className={groupTh({})}
|
|
88
|
+
>
|
|
89
|
+
{getState().grouping[0]}[{String(row.getGroupingValue(getState().grouping[0]))}]
|
|
90
|
+
</th>
|
|
91
|
+
</tr>
|
|
92
|
+
</thead>
|
|
93
|
+
<TableBody rows={row.subRows} />
|
|
94
|
+
</Fragment>
|
|
95
|
+
);
|
|
96
|
+
})}
|
|
97
|
+
</>
|
|
98
|
+
);
|
|
99
|
+
};
|
|
100
|
+
|
|
28
101
|
export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
29
102
|
const {
|
|
30
103
|
role,
|
|
@@ -39,6 +112,7 @@ export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
39
112
|
debug,
|
|
40
113
|
onDataSelectionChange,
|
|
41
114
|
classNames,
|
|
115
|
+
getScrollElement,
|
|
42
116
|
} = props;
|
|
43
117
|
|
|
44
118
|
const TableProvider = UntypedTableProvider as TypedTableProvider<TData>;
|
|
@@ -122,6 +196,8 @@ export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
122
196
|
debugTable: debug,
|
|
123
197
|
});
|
|
124
198
|
|
|
199
|
+
const rows = table.getRowModel().rows;
|
|
200
|
+
|
|
125
201
|
useEffect(() => {
|
|
126
202
|
if (onDataSelectionChange) {
|
|
127
203
|
onDataSelectionChange(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));
|
|
@@ -146,30 +222,15 @@ export const Table = <TData extends RowData>(props: TableProps<TData>) => {
|
|
|
146
222
|
>
|
|
147
223
|
<TableHead />
|
|
148
224
|
|
|
149
|
-
{grouping.length === 0
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
{debug && <th />}
|
|
159
|
-
<th
|
|
160
|
-
// TODO(burdon): Calculate row span.
|
|
161
|
-
colSpan={table.getHeaderGroups()[0].headers.length}
|
|
162
|
-
className={groupTh(props)}
|
|
163
|
-
>
|
|
164
|
-
{table.getState().grouping[0]}[{String(row.getGroupingValue(table.getState().grouping[0]))}]
|
|
165
|
-
</th>
|
|
166
|
-
</tr>
|
|
167
|
-
</thead>
|
|
168
|
-
|
|
169
|
-
<TableBody rows={row.subRows} />
|
|
170
|
-
</Fragment>
|
|
171
|
-
);
|
|
172
|
-
})}
|
|
225
|
+
{grouping.length === 0 ? (
|
|
226
|
+
getScrollElement ? (
|
|
227
|
+
<VirtualizedTableContent getScrollElement={getScrollElement} />
|
|
228
|
+
) : (
|
|
229
|
+
<TableBody rows={rows} />
|
|
230
|
+
)
|
|
231
|
+
) : (
|
|
232
|
+
<GroupedTableContent />
|
|
233
|
+
)}
|
|
173
234
|
|
|
174
235
|
{footer && <TableFooter />}
|
|
175
236
|
</table>
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type RowData, type RowSelectionState, type Table, type VisibilityState } from '@tanstack/react-table';
|
|
6
|
+
import { type VirtualizerOptions } from '@tanstack/react-virtual';
|
|
6
7
|
|
|
7
8
|
import { type ClassNameValue } from '@dxos/react-ui-types';
|
|
8
9
|
|
|
@@ -30,23 +31,29 @@ export type TableCurrent<TData extends RowData> = Partial<{
|
|
|
30
31
|
onDatumClick: (datum: TData) => void;
|
|
31
32
|
}>;
|
|
32
33
|
|
|
33
|
-
export type TableProps<
|
|
34
|
+
export type TableProps<
|
|
35
|
+
TData extends RowData,
|
|
36
|
+
ScrollElement extends Element | Window = Element,
|
|
37
|
+
ItemElement extends Element = HTMLTableRowElement,
|
|
38
|
+
> = TableFlags &
|
|
34
39
|
TableCurrent<TData> &
|
|
35
|
-
Partial<
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
40
|
+
Partial<
|
|
41
|
+
{
|
|
42
|
+
keyAccessor: KeyValue<TData>;
|
|
43
|
+
data: TData[];
|
|
44
|
+
columns: TableColumnDef<TData>[];
|
|
45
|
+
onColumnResize: (state: Record<string, number>) => void;
|
|
46
|
+
columnVisibility: VisibilityState;
|
|
47
|
+
// Controllable row selection
|
|
48
|
+
rowSelection: RowSelectionState;
|
|
49
|
+
defaultRowSelection: RowSelectionState;
|
|
50
|
+
onRowSelectionChange: (rowSelection: RowSelectionState) => void;
|
|
51
|
+
// Derived from row selection
|
|
52
|
+
onDataSelectionChange: (dataSelection: TData[]) => void;
|
|
53
|
+
// `table` element props
|
|
54
|
+
classNames: ClassNameValue;
|
|
55
|
+
} & Pick<VirtualizerOptions<ScrollElement, ItemElement>, 'getScrollElement'>
|
|
56
|
+
>;
|
|
50
57
|
|
|
51
58
|
export type { RowSelectionState, VisibilityState, TableColumnDef, KeyValue };
|
|
52
59
|
|