@dxos/react-ui-table 0.4.10-main.f68a1ca → 0.4.10-main.fd4f2a3
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 +30 -0
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/types/src/components/schema/SchemaToTable.stories.d.ts +11 -0
- package/dist/types/src/components/schema/SchemaToTable.stories.d.ts.map +1 -0
- package/dist/types/src/components/schema/schema.d.ts +5 -0
- package/dist/types/src/components/schema/schema.d.ts.map +1 -0
- package/dist/types/src/components/schema/schema.test.d.ts +2 -0
- package/dist/types/src/components/schema/schema.test.d.ts.map +1 -0
- package/dist/types/src/components/schema/schemaToColumns.d.ts +4 -0
- package/dist/types/src/components/schema/schemaToColumns.d.ts.map +1 -0
- package/dist/types/src/helpers.d.ts +4 -0
- package/dist/types/src/helpers.d.ts.map +1 -1
- package/package.json +18 -15
- package/src/components/schema/SchemaToTable.stories.tsx +72 -0
- package/src/components/schema/schema.test.ts +148 -0
- package/src/components/schema/schema.ts +96 -0
- package/src/components/schema/schemaToColumns.ts +50 -0
- package/src/helpers.tsx +22 -0
|
@@ -1246,6 +1246,36 @@ var ColumnBuilder = class {
|
|
|
1246
1246
|
...props
|
|
1247
1247
|
};
|
|
1248
1248
|
}
|
|
1249
|
+
/**
|
|
1250
|
+
* This display column type is for nested/unhandled data to appear as JSON.
|
|
1251
|
+
*/
|
|
1252
|
+
display({ label, classNames, ...props } = {}) {
|
|
1253
|
+
return {
|
|
1254
|
+
size: 120,
|
|
1255
|
+
minSize: 120,
|
|
1256
|
+
header: (cell) => label ?? cell.header.id,
|
|
1257
|
+
cell: (cell) => {
|
|
1258
|
+
const value = cell.getValue();
|
|
1259
|
+
return /* @__PURE__ */ React10.createElement("div", {
|
|
1260
|
+
className: "overflow-scroll"
|
|
1261
|
+
}, /* @__PURE__ */ React10.createElement("code", {
|
|
1262
|
+
className: "text-xs"
|
|
1263
|
+
}, JSON.stringify(value)));
|
|
1264
|
+
},
|
|
1265
|
+
...props,
|
|
1266
|
+
meta: {
|
|
1267
|
+
...props.meta,
|
|
1268
|
+
cell: {
|
|
1269
|
+
...props.meta?.cell,
|
|
1270
|
+
classNames: [
|
|
1271
|
+
"font-mono",
|
|
1272
|
+
textPadding,
|
|
1273
|
+
classNames
|
|
1274
|
+
]
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
};
|
|
1278
|
+
}
|
|
1249
1279
|
};
|
|
1250
1280
|
export {
|
|
1251
1281
|
CellCombobox,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/ColumnMenu.tsx", "../../../src/components/ColumnSettingsForm.tsx", "../../../src/translations.ts", "../../../src/components/hooks/useColumnSorting.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/hooks/usePinLastRow.ts", "../../../src/components/Cell/CellCombobox.tsx", "../../../src/helpers.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { X, GearSix, CaretDown, ArrowDown, ArrowUp } from '@phosphor-icons/react';\nimport { type SortDirection, type HeaderContext, type RowData } from '@tanstack/react-table';\nimport React, { useRef, useState, useCallback } from 'react';\n\nimport { Button, DensityProvider, Popover, DropdownMenu } from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\n\nimport { ColumnSettingsForm } from './ColumnSettingsForm';\nimport { useColumnSorting } from './hooks/useColumnSorting';\nimport { type TableDef, type ColumnProps } from '../schema';\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 const header = props.context.header;\n\n const { canSort, sortDirection, onSelectSort, onToggleSort, onClearSort } = useColumnSorting(header.column);\n\n const columnSettingsAnchorRef = useRef<any>(null);\n\n const [isColumnSettingsOpen, setIsColumnSettingsOpen] = useState(false);\n\n const shouldPreventFocusOnClose = useRef(false);\n\n const onOpenColumnSettings = useCallback(() => {\n shouldPreventFocusOnClose.current = true;\n setIsColumnSettingsOpen(true);\n }, [shouldPreventFocusOnClose, setIsColumnSettingsOpen]); // setIsColumnSettingsOpen is a dependency\n\n const onDropdownCloseAutoFocus = useCallback(\n (event: Event) => {\n if (shouldPreventFocusOnClose.current) {\n event.preventDefault();\n shouldPreventFocusOnClose.current = false;\n }\n },\n [shouldPreventFocusOnClose],\n );\n\n return (\n <div className='flex items-center justify-center justify-between'>\n <div className='flex items-center gap-1 truncate' title={title}>\n <SortIndicator direction={sortDirection} onClick={onToggleSort} />\n <div className='truncate'>{title}</div>\n </div>\n\n <DropdownMenu.Root modal={false}>\n <Popover.Root open={isColumnSettingsOpen} onOpenChange={setIsColumnSettingsOpen} modal={false}>\n <DropdownMenu.Trigger ref={columnSettingsAnchorRef} asChild>\n <Popover.Anchor asChild>\n <Button variant='ghost'>\n <CaretDown className={getSize(4)} />\n </Button>\n </Popover.Anchor>\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Content onCloseAutoFocus={onDropdownCloseAutoFocus} sideOffset={4} collisionPadding={8}>\n <DropdownMenu.Viewport>\n {canSort && (\n <>\n <DropdownMenu.Item onClick={() => onSelectSort('asc')}>\n <span className='grow'>Sort ascending</span>\n <span className='opacity-50'>\n <ArrowUp className={getSize(4)} />\n </span>\n </DropdownMenu.Item>\n <DropdownMenu.Item onClick={() => onSelectSort('desc')}>\n <span className='grow'>Sort descending</span>\n <span className='opacity-50'>\n <ArrowDown className={getSize(4)} />\n </span>\n </DropdownMenu.Item>\n {sortDirection !== false && (\n <DropdownMenu.Item onClick={onClearSort}>\n <span className='grow'>Clear sort</span>\n <span className='opacity-50'>\n <X className={getSize(4)} />\n </span>\n </DropdownMenu.Item>\n )}\n </>\n )}\n <DropdownMenu.Item onClick={onOpenColumnSettings}>\n <span className='grow'>Column settings</span>\n <span className='opacity-50'>\n <GearSix className={mx(getSize(4), 'rotate-90')} />\n </span>\n </DropdownMenu.Item>\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n\n <ColumnSettingsPanel {...props} column={column} onClose={() => setIsColumnSettingsOpen(false)} />\n </Popover.Root>\n </DropdownMenu.Root>\n </div>\n );\n};\n\nexport const ColumnSettingsPanel = <TData extends RowData, TValue>({\n tableDefs,\n tableDef,\n column,\n onUpdate,\n onDelete,\n onClose,\n}: ColumnMenuProps<TData, TValue> & { onClose: () => void }) => (\n <Popover.Portal>\n <Popover.Content>\n <Popover.Viewport classNames='w-60'>\n <DensityProvider density='fine'>\n <ColumnSettingsForm\n column={column}\n tableDefs={tableDefs}\n tableDef={tableDef}\n onUpdate={onUpdate}\n onDelete={onDelete}\n onClose={onClose}\n />\n </DensityProvider>\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n);\n\nexport const SortIndicator = ({\n direction,\n onClick,\n}: {\n direction: SortDirection | false;\n onClick: (e: any) => void;\n}) => {\n if (direction === false) {\n return null;\n }\n\n let icon;\n\n switch (direction) {\n case 'asc':\n icon = <ArrowUp className={getSize(3)} />;\n break;\n case 'desc':\n icon = <ArrowDown className={getSize(3)} />;\n break;\n }\n\n return (\n <div onClick={onClick} className='flex items-center cursor-pointer'>\n {icon}\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Check, Trash, X } from '@phosphor-icons/react';\nimport React, { type FC, type PropsWithChildren, useRef, useState } from 'react';\n\nimport { Button, Input, 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\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 ColumnSettingsForm = ({\n column,\n tableDef,\n tableDefs,\n onUpdate,\n onDelete,\n onClose,\n}: {\n column: ColumnProps;\n tableDef: TableDef;\n tableDefs: TableDef[];\n onUpdate?: ((id: string, column: ColumnProps) => void) | undefined;\n onDelete?: ((id: string) => void) | undefined;\n onClose: () => void;\n}) => {\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 onClose;\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\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 onClose();\n };\n\n return (\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 );\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 2024 DXOS.org\n//\n\nimport { type SortDirection, type Column } from '@tanstack/react-table';\nimport { useState } from 'react';\n\nexport const useColumnSorting = (column: Column<any>) => {\n const [sortDirection, setSortDirection] = useState<SortDirection | false>(column.getIsSorted());\n const [firstSort, setFirstSort] = useState<SortDirection | undefined>();\n\n const canSort = column.getCanSort();\n\n const updateColumnSort = (direction: SortDirection | false) => {\n setSortDirection(direction);\n\n switch (direction) {\n case false:\n column.clearSorting();\n break;\n case 'asc':\n column.toggleSorting(false); // descending false\n break;\n case 'desc':\n column.toggleSorting(true); // descending true\n break;\n }\n };\n\n // Whichever sort is explicitly set first, will be the first sort direction\n // When toggling, we always go to the other direction, and then to unsorted.\n const onToggleSort = () => {\n if (sortDirection === false) {\n return;\n }\n\n if (sortDirection === firstSort) {\n updateColumnSort(firstSort === 'asc' ? 'desc' : 'asc');\n } else {\n updateColumnSort(false);\n }\n };\n\n const onSelectSort = (direction: SortDirection) => {\n setFirstSort(direction);\n updateColumnSort(direction);\n };\n\n const onClearSort = () => {\n updateColumnSort(false);\n };\n\n return { canSort, sortDirection, onSelectSort, onToggleSort, onClearSort };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport {\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnSizingInfoState,\n type GroupingState,\n type RowData,\n type ColumnSizingState,\n type OnChangeFn,\n type RowSelectionState,\n getGroupedRowModel,\n getExpandedRowModel,\n} from '@tanstack/react-table';\nimport { useVirtualizer, type VirtualizerOptions } from '@tanstack/react-virtual';\nimport React, { Fragment, useCallback, useEffect, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { useDefaultValue, useOnTransition } from '@dxos/react-ui';\n\nimport { TableBody } from './TableBody';\nimport { type TypedTableProvider, TableProvider as UntypedTableProvider, useTableContext } from './TableContext';\nimport { TableFooter } from './TableFooter';\nimport { TableHead } from './TableHead';\nimport { type TableProps } from './props';\nimport { groupTh, tableRoot } from '../../theme';\nimport { usePinLastRow } from '../hooks/usePinLastRow';\n\nexport const Table = <TData extends RowData>(props: TableProps<TData>) => {\n const {\n role,\n onColumnResize,\n columnVisibility,\n header = true,\n rowsSelectable,\n debug,\n onDataSelectionChange,\n getScrollElement,\n pinLastRow,\n } = props;\n\n const columns = useDefaultValue(props.columns, []);\n const data = useDefaultValue(props.data, []);\n\n const TableProvider = UntypedTableProvider as TypedTableProvider<TData>;\n\n const [columnsInitialised, setColumnsInitialised] = useState(false);\n const [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});\n\n useEffect(() => {\n if (columnsInitialised) {\n return;\n }\n\n setColumnSizing(\n columns\n .filter((column) => !!column.size && (column as any).prop !== undefined)\n .reduce<ColumnSizingState>((state, column) => {\n state[(column as any).prop] = column.size!;\n return state;\n }, {}),\n );\n\n setColumnsInitialised(true);\n }, [columns, setColumnSizing]);\n\n const [columnSizingInfo, setColumnSizingInfo] = useState<ColumnSizingInfoState>({} as ColumnSizingInfoState);\n\n // Notify on column resize.\n const notifyColumnResize = useCallback(() => onColumnResize?.(columnSizing), [onColumnResize, columnSizing]);\n useOnTransition(columnSizingInfo.isResizingColumn, (v) => typeof v === 'string', false, notifyColumnResize);\n\n const [rowSelection = {}, setRowSelection] = 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 setRowSelection(nextRowSelection);\n } else if (rowsSelectable) {\n const nextRowSelectionKey = Object.keys(nextRowSelection).filter((id) => !rowSelection[id])[0];\n setRowSelection(nextRowSelectionKey ? { [nextRowSelectionKey]: true } : {});\n } else {\n setRowSelection({});\n }\n },\n [rowsSelectable, setRowSelection, rowSelection],\n );\n\n const [grouping, handleGroupingChange] = useState<GroupingState>(props.grouping ?? []);\n useEffect(() => handleGroupingChange(props.grouping ?? []), [handleGroupingChange, 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 // State\n state: {\n columnVisibility,\n columnSizing,\n columnSizingInfo,\n rowSelection,\n grouping,\n },\n\n // Resize columns\n columnResizeMode: 'onChange',\n enableColumnResizing: true,\n onColumnSizingChange: setColumnSizing,\n onColumnSizingInfoChange: setColumnSizingInfo,\n\n // Rows\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n\n // Grouping\n getGroupedRowModel: grouping.length > 1 ? getGroupedRowModel() : undefined,\n onGroupingChange: handleGroupingChange,\n\n enableMultiRowSelection: rowsSelectable === 'multi' ? true : undefined,\n enableRowSelection: rowsSelectable === true ? true : undefined,\n\n onRowSelectionChange: handleRowSelectionChange,\n\n enableSorting: true,\n enableColumnPinning: true,\n\n // Debug\n debugTable: debug,\n });\n\n useEffect(() => {\n onDataSelectionChange?.(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));\n }, [onDataSelectionChange, rowSelection, table]);\n\n usePinLastRow(pinLastRow, table, data, getScrollElement);\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 if (!getScrollElement) {\n log.warn('Table: getScrollElement is not set. This is required for virtualized tables.');\n }\n\n return (\n <TableProvider\n {...props}\n table={table}\n header={header}\n expand={expand}\n isGrid={role === 'grid' || role === 'treegrid'}\n >\n <TableImpl<TData> debug={false} getScrollElement={getScrollElement} {...props} />\n </TableProvider>\n );\n};\n\n/**\n * Pure implementation of table outside of context set-up.\n */\nconst TableImpl = <TData extends RowData>(props: TableProps<TData>) => {\n const { debug, classNames, getScrollElement, role, footer, grouping, fullWidth } = props;\n const { table } = useTableContext();\n\n const centerRows = table.getCenterRows();\n const bottomRows = table.getBottomRows();\n\n const rows = [...centerRows, ...bottomRows];\n\n if (debug) {\n return (\n <pre className='font-mono text-xs text-neutral-500 m-1 p-2 ring'>\n <code>{JSON.stringify(table.getState(), undefined, 2)}</code>\n </pre>\n );\n }\n\n const virtualisable = getScrollElement !== undefined;\n const isResizingColumn = table.getState().columnSizingInfo.isResizingColumn;\n\n return (\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 virtualisable ? (\n isResizingColumn ? (\n <MemoizedVirtualisedTableContent getScrollElement={getScrollElement} />\n ) : (\n <VirtualizedTableContent getScrollElement={getScrollElement} />\n )\n ) : (\n <TableBody rows={rows} />\n )\n ) : (\n <GroupedTableContent />\n )}\n\n {footer && <TableFooter />}\n </table>\n );\n};\n\nconst VirtualizedTableContent = ({\n getScrollElement,\n}: Pick<VirtualizerOptions<Element, Element>, 'getScrollElement'>) => {\n const { table } = useTableContext();\n\n const centerRows = table.getCenterRows();\n const pinnedRows = table.getBottomRows();\n\n const { getTotalSize, getVirtualItems } = useVirtualizer({\n getScrollElement,\n count: centerRows.length,\n overscan: 8,\n estimateSize: () => 40,\n });\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 const rowsToRender = [...virtualRows.map((virtualRow) => centerRows[virtualRow.index]), ...pinnedRows];\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={rowsToRender} />\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\nexport const MemoizedVirtualisedTableContent = React.memo(VirtualizedTableContent);\n\nconst GroupedTableContent = () => {\n const {\n table: { getGroupedRowModel, getHeaderGroups, getState },\n debug,\n } = useTableContext();\n\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", "//\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\nconst TABLE_BODY_NAME = 'TableBody';\n\ntype TableBodyProps = {\n rows: Row<RowData>[];\n};\n\nconst TableBody = ({ rows }: TableBodyProps) => {\n const { table, keyAccessor, currentDatum, debug, expand, isGrid, onDatumClick } = useTableContext();\n\n const rowSelection = table.getState().rowSelection;\n const domAttributes = useArrowNavigationGroup({ axis: 'grid' });\n const canBeCurrent = !isGrid && !!onDatumClick;\n\n return (\n <tbody {...(isGrid && domAttributes)}>\n {rows.map((row) => {\n const isCurrent = currentDatum === row.original;\n const isSelected = rowSelection?.[row.id];\n\n const isPinned = row.getIsPinned();\n\n const classNames = tbodyTr({ canBeCurrent, isPinned: isPinned !== false });\n\n return (\n <tr\n key={keyAccessor ? keyAccessor(row.original) : row.id}\n className={classNames}\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 2024 DXOS.org\n//\n\nimport { type RowData } from '@tanstack/react-table';\nimport React, { useContext, createContext, type ReactNode } from 'react';\n\nimport { type TableContextValue } from './props';\n\nexport const TABLE_NAME = 'Table';\n\n// Create the context without a default value.\n// The expectation is that the provider will always supply a value, so no need to define a default here.\nconst TableContext = createContext<TableContextValue<RowData>>({} as TableContextValue<RowData>);\n\nexport type TypedTableProvider<TData extends RowData> = {\n (props: TableContextValue<TData> & { children: ReactNode }): JSX.Element;\n displayName: string;\n};\n\nexport const TableProvider: React.FC<TableContextValue<RowData> & { children: ReactNode }> = ({\n children,\n ...value\n}) => {\n return <TableContext.Provider value={value}>{children}</TableContext.Provider>;\n};\n\n// Create a custom hook to consume the context\nexport const useTableContext = <TData extends RowData>(): TableContextValue<TData> => {\n const context = useContext(TableContext as React.Context<TableContextValue<TData>>);\n\n return context;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type CellContext } from '@tanstack/react-table';\n\nimport { modalSurface, focusRing, ghostSelected, ghostSelectedCurrent, groupBorder, mx } 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';\n\nexport const gridCellFocusRing =\n 'focus-within:z-[11] focus-within: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(\n header ? stickyHeader && 'sticky block-start-[--sticky-top] z-[1]' : 'collapse',\n header && 'base-surface',\n 'drop-shadow-sm',\n ...etc,\n );\n\nexport const theadTr: ComponentFunction<TheadStyleProps> = (_props, ...etc) => mx('group', ...etc);\n\nexport const theadTh: ComponentFunction<TheadStyleProps> = ({ border }, ...etc) =>\n mx(\n 'relative',\n 'text-start font-medium select-none truncate',\n headPadding,\n border && groupBorder,\n border && 'border border-t-0 border-b-0 border-neutral-200',\n ...etc,\n );\n\nexport const theadResizeRoot: ComponentFunction<{ isResizing: boolean }> = ({ isResizing }) => {\n return mx(\n 'absolute h-full w-[4px] top-0 right-0',\n 'cursor-col-resize',\n 'user-select-none',\n 'touch-action-none',\n !isResizing && 'group-hover:bg-neutral-100 dark:group-hover:bg-neutral-800',\n 'pointer-coarse:bg-neutral-100 dark:pointer-coarse:bg-neutral-800',\n isResizing && 'bg-primary-500 dark:bg-primary-400',\n );\n};\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; isPinned?: boolean }>;\nexport const tbodyTr: ComponentFunction<TbodyTrStyleProps> = ({ canBeCurrent, isPinned }, ...etc) =>\n mx(\n 'group',\n canBeCurrent ? ghostSelectedCurrent : ghostSelected,\n canBeCurrent && focusRing,\n canBeCurrent && 'cursor-pointer rounded',\n isPinned && 'sticky z-1 bottom-[-1px] base-surface',\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);\n\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', modalSurface, ...etc);\n\nexport const tfootTr: ComponentFunction<TfootStyleProps> = (_props, ...etc) => mx(...etc);\n\nexport const tfootTh: ComponentFunction<TfootStyleProps> = ({ border }, ...etc) =>\n mx(textPadding, modalSurface, 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();\n const domAttributes = useFocusableGroup({ tabBehavior: 'limited' });\n\n const className = tdRoot(tableContext, cell.column.columnDef.meta?.cell?.classNames);\n\n return (\n <td tabIndex={0} {...domAttributes} className={className}>\n {children}\n </td>\n );\n};\n\nconst StaticCell = <TData extends RowData, TValue>({ cell, children }: CellProps<TData, TValue>) => {\n const tableContext = useTableContext();\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();\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 } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useTableContext } from './TableContext';\nimport { tfootRoot, tfootTr, tfootTh } from '../../theme';\n\ntype TableFooterProps = {};\n\nconst TABLE_FOOT_NAME = 'TableFooter';\n\nconst TableFooter = (props: TableFooterProps) => {\n const tableContext = useTableContext();\n const { table, expand, debug } = tableContext;\n const footers = table.getFooterGroups();\n\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_FOOT_NAME;\n\nexport { TableFooter };\n\nexport type { TableFooterProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { flexRender } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useTableContext } from './TableContext';\nimport { theadResizeRoot, theadRoot, theadTh, theadTr } from '../../theme';\n\nconst TABLE_HEAD_NAME = 'TableHeader';\n\ntype TableHeadProps = {};\n\nconst TableHead = (_props: TableHeadProps) => {\n const tableContext = useTableContext();\n const headerGroups = tableContext.table.getHeaderGroups();\n\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 const onResize = header.getResizeHandler();\n const resizable = header.column.columnDef.meta?.resizable;\n\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\n {resizable && (\n <div\n className={theadResizeRoot({ isResizing })}\n onDoubleClick={header.column.resetSize} // TODO(zan): How should non-pointer users reset column sizing?\n onMouseDown={onResize}\n onTouchStart={onResize}\n />\n )}\n </th>\n );\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 2024 DXOS.org\n//\n\nimport { type Table } from '@tanstack/react-table';\nimport { useEffect, useState } from 'react';\n\nexport const usePinLastRow = (\n pinLastRow: boolean | undefined,\n table: Table<any>,\n data: any,\n getScrollElement?: () => Element | null,\n) => {\n const [pinnedRowKey, setPinnedRowKey] = useState<string>();\n\n useEffect(() => {\n if (!pinLastRow) {\n return;\n }\n\n const rows = table.getRowModel().rows;\n const rowToPin = rows[rows.length - 1];\n const rowId = rowToPin.id;\n\n if (rowId === pinnedRowKey) {\n return;\n }\n\n table.resetRowPinning();\n rowToPin.pin('bottom');\n\n const scrollElement = getScrollElement?.();\n const isFirstRender = pinnedRowKey === undefined;\n\n if (scrollElement && !isFirstRender) {\n requestAnimationFrame(() => {\n scrollElement.scrollTo({ top: scrollElement.scrollHeight });\n });\n }\n\n setPinnedRowKey(rowId);\n }, [pinLastRow, table, getScrollElement, pinnedRowKey, setPinnedRowKey, data]);\n};\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(\n (acc: ComboboxCellItems<TData>, item) => {\n acc[model.getId(item)] = {\n label: model.getText(item),\n data: item,\n };\n return acc;\n },\n initialItems(model, value),\n ),\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 { log } from '@dxos/log';\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 ref = useRef<HTMLInputElement>(null);\n const { findPrevFocusable } = useFocusFinders();\n\n const { onUpdate, cell } = cellContext.column.columnDef.meta as ColumnMeta<TData, string>;\n\n // https://tanstack.com/table/v8/docs/examples/react/editable-data\n const initialValue = cellContext.getValue();\n const [value, setValue] = useState(() => {\n // TODO(burdon): Temporary shim for automerge.\n if ((initialValue as any)?.content) {\n return (initialValue as any)?.content;\n }\n\n return initialValue;\n });\n\n const handleSave = () => {\n ref.current && document.activeElement === ref.current && findPrevFocusable(ref.current)?.focus();\n\n if (value !== initialValue) {\n onUpdate?.(cellContext.row.original, cellContext.column.id, value);\n }\n };\n\n const handleCancel = () => setValue(initialValue);\n\n let placeholder = false;\n const columns = cellContext.table.getVisibleFlatColumns();\n\n // Calling getRowModel is expensive, so only do it when we're a cell in the first position\n if (columns[0].id === cellContext.column.id) {\n const rowCount = cellContext.table.getRowModel().rows.length;\n placeholder = cellContext.row.index === rowCount - 1 && columns[0].id === cellContext.column.id;\n }\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={ref}\n variant='subdued'\n placeholder={placeholder ? 'Add row...' : undefined}\n classNames={['is-full', textPadding, cell?.classNames]}\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 = () => setText(value !== undefined ? String(value) : '');\n\n // TODO(burdon): Property is encoded as float (e.g., 6.1 => 6.099)\n const handleSave = () => {\n const nextValue = parseNumber(text);\n\n if (!isNaN(nextValue)) {\n onUpdate?.(cellContext.row.original, cellContext.column.id, nextValue);\n setText(displayNumber(nextValue, digits));\n } else {\n // Reset the text to display the original value without updating the model.\n setText(displayNumber(value, digits));\n }\n\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\n return (\n <div className='flex justify-center w-full h-full' role='presentation'>\n <Input.Root>\n <Input.Checkbox\n size={4}\n classNames={[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 </div>\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 let value = cell.getValue();\n // TODO(burdon): Hack to support automerge.\n if (typeof value === 'object' && (value as any)?.__typename === 'dxos.Text.v0') {\n value = (value as any).content;\n }\n\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: { ...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 log.info('formatError', { 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 enableResizing: false,\n meta: { onUpdate, cell: { classNames } },\n header: ({ table }) => {\n const { rowsSelectable } = useTableContext();\n const checked = table.getIsSomeRowsSelected() ? 'indeterminate' : table.getIsAllRowsSelected();\n\n return rowsSelectable === 'multi' ? (\n <div className='flex justify-center w-full h-full' role='presentation'>\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 </div>\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 // TODO(Zan): Implement sort algorithm\n enableSorting: true,\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 // TODO(Zan): Implement sort algorithm\n enableSorting: false,\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": ["X", "GearSix", "CaretDown", "ArrowDown", "ArrowUp", "React", "useRef", "useState", "useCallback", "Button", "DensityProvider", "Popover", "DropdownMenu", "getSize", "mx", "Check", "Trash", "X", "React", "useRef", "useState", "Button", "Input", "Select", "Separator", "useTranslation", "getSize", "mx", "safeParseInt", "translationKey", "Section", "children", "className", "div", "role", "mx", "ColumnSettingsForm", "column", "tableDef", "tableDefs", "onUpdate", "onDelete", "onClose", "prop", "setProp", "useState", "id", "refTable", "setRefTable", "refProp", "setRefProp", "type", "setType", "String", "label", "setLabel", "digits", "setDigits", "propRef", "useRef", "t", "useTranslation", "translationKey", "handleCancel", "handleSave", "length", "match", "current", "focus", "columns", "find", "c", "safeParseInt", "Input", "Root", "Label", "classNames", "TextInput", "placeholder", "value", "onChange", "event", "target", "autoFocus", "ref", "replace", "Select", "onValueChange", "TriggerButton", "Portal", "Content", "Viewport", "map", "Option", "key", "filter", "name", "Separator", "Button", "variant", "onClick", "span", "Check", "getSize", "ns", "X", "Trash", "useState", "useColumnSorting", "column", "sortDirection", "setSortDirection", "useState", "getIsSorted", "firstSort", "setFirstSort", "canSort", "getCanSort", "updateColumnSort", "direction", "clearSorting", "toggleSorting", "onToggleSort", "onSelectSort", "onClearSort", "ColumnMenu", "column", "props", "title", "label", "length", "id", "header", "context", "canSort", "sortDirection", "onSelectSort", "onToggleSort", "onClearSort", "useColumnSorting", "columnSettingsAnchorRef", "useRef", "isColumnSettingsOpen", "setIsColumnSettingsOpen", "useState", "shouldPreventFocusOnClose", "onOpenColumnSettings", "useCallback", "current", "onDropdownCloseAutoFocus", "event", "preventDefault", "React", "div", "className", "SortIndicator", "direction", "onClick", "DropdownMenu", "Root", "modal", "Popover", "open", "onOpenChange", "Trigger", "ref", "asChild", "Anchor", "Button", "variant", "CaretDown", "getSize", "Content", "onCloseAutoFocus", "sideOffset", "collisionPadding", "Viewport", "Item", "span", "ArrowUp", "ArrowDown", "X", "GearSix", "mx", "Arrow", "ColumnSettingsPanel", "onClose", "tableDefs", "tableDef", "onUpdate", "onDelete", "Portal", "classNames", "DensityProvider", "density", "ColumnSettingsForm", "icon", "useControllableState", "getCoreRowModel", "getSortedRowModel", "useReactTable", "getGroupedRowModel", "getExpandedRowModel", "useVirtualizer", "React", "Fragment", "useCallback", "useEffect", "useState", "log", "useDefaultValue", "useOnTransition", "useArrowNavigationGroup", "flexRender", "React", "React", "useContext", "createContext", "TableContext", "createContext", "TableProvider", "children", "value", "React", "Provider", "useTableContext", "context", "useContext", "modalSurface", "focusRing", "ghostSelected", "ghostSelectedCurrent", "groupBorder", "mx", "currentRow", "selectedRow", "flushPadding", "textPadding", "headPadding", "gridCellFocusRing", "tableRoot", "fullWidth", "etc", "mx", "groupTh", "_props", "theadRoot", "header", "stickyHeader", "theadTr", "theadTh", "border", "groupBorder", "theadResizeRoot", "isResizing", "tbodyRoot", "tbodyTr", "canBeCurrent", "isPinned", "ghostSelectedCurrent", "ghostSelected", "focusRing", "tdRoot", "isGrid", "tdContent", "tfootRoot", "modalSurface", "tfootTr", "tfootTh", "useFocusableGroup", "React", "CELL_NAME", "FocusableCell", "cell", "children", "tableContext", "useTableContext", "domAttributes", "useFocusableGroup", "tabBehavior", "className", "tdRoot", "column", "columnDef", "meta", "classNames", "React", "td", "tabIndex", "StaticCell", "Cell", "isGrid", "Root", "displayName", "TABLE_BODY_NAME", "TableBody", "rows", "table", "keyAccessor", "currentDatum", "debug", "expand", "isGrid", "onDatumClick", "useTableContext", "rowSelection", "getState", "domAttributes", "useArrowNavigationGroup", "axis", "canBeCurrent", "React", "tbody", "map", "row", "isCurrent", "original", "isSelected", "id", "isPinned", "getIsPinned", "classNames", "tbodyTr", "tr", "key", "className", "tabIndex", "onClick", "onKeyUp", "td", "getVisibleCells", "cell", "Cell", "flexRender", "column", "columnDef", "getContext", "displayName", "flexRender", "React", "TABLE_FOOT_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", "TABLE_HEAD_NAME", "TableHead", "_props", "tableContext", "useTableContext", "headerGroups", "table", "getHeaderGroups", "React", "thead", "className", "theadRoot", "map", "headerGroup", "tr", "key", "id", "theadTr", "debug", "th", "style", "width", "headers", "header", "isResizing", "column", "getIsResizing", "onResize", "getResizeHandler", "resizable", "columnDef", "meta", "getSize", "theadTh", "classNames", "isPlaceholder", "flexRender", "getContext", "div", "theadResizeRoot", "onDoubleClick", "resetSize", "onMouseDown", "onTouchStart", "expand", "displayName", "useEffect", "useState", "usePinLastRow", "pinLastRow", "table", "data", "getScrollElement", "pinnedRowKey", "setPinnedRowKey", "useState", "useEffect", "rows", "getRowModel", "rowToPin", "length", "rowId", "id", "resetRowPinning", "pin", "scrollElement", "isFirstRender", "undefined", "requestAnimationFrame", "scrollTo", "top", "scrollHeight", "Table", "props", "role", "onColumnResize", "columnVisibility", "header", "rowsSelectable", "debug", "onDataSelectionChange", "getScrollElement", "pinLastRow", "columns", "useDefaultValue", "data", "TableProvider", "UntypedTableProvider", "columnsInitialised", "setColumnsInitialised", "useState", "columnSizing", "setColumnSizing", "useEffect", "filter", "column", "size", "prop", "undefined", "reduce", "state", "columnSizingInfo", "setColumnSizingInfo", "notifyColumnResize", "useCallback", "useOnTransition", "isResizingColumn", "v", "rowSelection", "setRowSelection", "useControllableState", "onChange", "onRowSelectionChange", "defaultProp", "defaultRowSelection", "handleRowSelectionChange", "updaterOrValue", "nextRowSelection", "nextRowSelectionKey", "Object", "keys", "id", "grouping", "handleGroupingChange", "table", "useReactTable", "meta", "defaultColumn", "maxSize", "columnResizeMode", "enableColumnResizing", "onColumnSizingChange", "onColumnSizingInfoChange", "getCoreRowModel", "getSortedRowModel", "getExpandedRowModel", "getGroupedRowModel", "length", "onGroupingChange", "enableMultiRowSelection", "enableRowSelection", "enableSorting", "enableColumnPinning", "debugTable", "map", "getRowModel", "rowsById", "original", "usePinLastRow", "expand", "log", "warn", "React", "isGrid", "TableImpl", "classNames", "footer", "fullWidth", "useTableContext", "centerRows", "getCenterRows", "bottomRows", "getBottomRows", "rows", "pre", "className", "code", "JSON", "stringify", "getState", "virtualisable", "tableRoot", "style", "width", "getTotalSize", "TableHead", "MemoizedVirtualisedTableContent", "VirtualizedTableContent", "TableBody", "GroupedTableContent", "TableFooter", "pinnedRows", "getVirtualItems", "useVirtualizer", "count", "overscan", "estimateSize", "virtualRows", "totalSize", "paddingTop", "start", "paddingBottom", "end", "rowsToRender", "virtualRow", "index", "tbody", "tr", "td", "height", "memo", "getHeaderGroups", "row", "i", "Fragment", "key", "thead", "th", "colSpan", "headers", "groupTh", "String", "getGroupingValue", "subRows", "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", "log", "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", "ref", "useRef", "findPrevFocusable", "useFocusFinders", "cell", "initialValue", "setValue", "useState", "content", "handleSave", "current", "document", "activeElement", "focus", "handleCancel", "placeholder", "columns", "table", "getVisibleFlatColumns", "rowCount", "getRowModel", "rows", "length", "index", "Input", "Root", "TextInput", "variant", "undefined", "classNames", "textPadding", "onBlur", "onChange", "event", "target", "onKeyDown", "key", "parseNumber", "text", "trim", "Number", "NaN", "displayNumber", "digits", "toLocaleString", "minimumFractionDigits", "maximumFractionDigits", "NumberBuilderCell", "setText", "useEffect", "handleEdit", "String", "nextValue", "isNaN", "_handleCancel", "onFocus", "RowSelectorBuilderCell", "checked", "getCanSelect", "getIsSelected", "getCanSelectSubRows", "getIsSomeSelected", "getIsAllSubRowsSelected", "div", "className", "role", "Checkbox", "size", "onCheckedChange", "getToggleSelectedHandler", "disabled", "SwitchBuilderCell", "Switch", "onClick", "stopPropagation", "combobox", "label", "props", "minSize", "header", "cellValue", "mx", "getText", "string", "__typename", "number", "date", "format", "formatSpec", "relative", "str", "formatDistanceToNow", "addSuffix", "toISOString", "err", "log", "info", "tooltip", "element", "truncate", "Tooltip", "Provider", "Trigger", "Portal", "Content", "side", "Arrow", "ClipboardText", "ev", "navigator", "clipboard", "writeText", "toHex", "selectRow", "enableResizing", "rowsSelectable", "useTableContext", "getIsSomeRowsSelected", "getIsAllRowsSelected", "toggleAllRowsSelected", "switch", "enableSorting", "icon", "on", "off", "IconOn", "Icon", "Check", "IconOff", "X", "getSize"]
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { X, GearSix, CaretDown, ArrowDown, ArrowUp } from '@phosphor-icons/react';\nimport { type SortDirection, type HeaderContext, type RowData } from '@tanstack/react-table';\nimport React, { useRef, useState, useCallback } from 'react';\n\nimport { Button, DensityProvider, Popover, DropdownMenu } from '@dxos/react-ui';\nimport { getSize, mx } from '@dxos/react-ui-theme';\n\nimport { ColumnSettingsForm } from './ColumnSettingsForm';\nimport { useColumnSorting } from './hooks/useColumnSorting';\nimport { type TableDef, type ColumnProps } from '../schema';\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 const header = props.context.header;\n\n const { canSort, sortDirection, onSelectSort, onToggleSort, onClearSort } = useColumnSorting(header.column);\n\n const columnSettingsAnchorRef = useRef<any>(null);\n\n const [isColumnSettingsOpen, setIsColumnSettingsOpen] = useState(false);\n\n const shouldPreventFocusOnClose = useRef(false);\n\n const onOpenColumnSettings = useCallback(() => {\n shouldPreventFocusOnClose.current = true;\n setIsColumnSettingsOpen(true);\n }, [shouldPreventFocusOnClose, setIsColumnSettingsOpen]); // setIsColumnSettingsOpen is a dependency\n\n const onDropdownCloseAutoFocus = useCallback(\n (event: Event) => {\n if (shouldPreventFocusOnClose.current) {\n event.preventDefault();\n shouldPreventFocusOnClose.current = false;\n }\n },\n [shouldPreventFocusOnClose],\n );\n\n return (\n <div className='flex items-center justify-center justify-between'>\n <div className='flex items-center gap-1 truncate' title={title}>\n <SortIndicator direction={sortDirection} onClick={onToggleSort} />\n <div className='truncate'>{title}</div>\n </div>\n\n <DropdownMenu.Root modal={false}>\n <Popover.Root open={isColumnSettingsOpen} onOpenChange={setIsColumnSettingsOpen} modal={false}>\n <DropdownMenu.Trigger ref={columnSettingsAnchorRef} asChild>\n <Popover.Anchor asChild>\n <Button variant='ghost'>\n <CaretDown className={getSize(4)} />\n </Button>\n </Popover.Anchor>\n </DropdownMenu.Trigger>\n\n <DropdownMenu.Content onCloseAutoFocus={onDropdownCloseAutoFocus} sideOffset={4} collisionPadding={8}>\n <DropdownMenu.Viewport>\n {canSort && (\n <>\n <DropdownMenu.Item onClick={() => onSelectSort('asc')}>\n <span className='grow'>Sort ascending</span>\n <span className='opacity-50'>\n <ArrowUp className={getSize(4)} />\n </span>\n </DropdownMenu.Item>\n <DropdownMenu.Item onClick={() => onSelectSort('desc')}>\n <span className='grow'>Sort descending</span>\n <span className='opacity-50'>\n <ArrowDown className={getSize(4)} />\n </span>\n </DropdownMenu.Item>\n {sortDirection !== false && (\n <DropdownMenu.Item onClick={onClearSort}>\n <span className='grow'>Clear sort</span>\n <span className='opacity-50'>\n <X className={getSize(4)} />\n </span>\n </DropdownMenu.Item>\n )}\n </>\n )}\n <DropdownMenu.Item onClick={onOpenColumnSettings}>\n <span className='grow'>Column settings</span>\n <span className='opacity-50'>\n <GearSix className={mx(getSize(4), 'rotate-90')} />\n </span>\n </DropdownMenu.Item>\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n\n <ColumnSettingsPanel {...props} column={column} onClose={() => setIsColumnSettingsOpen(false)} />\n </Popover.Root>\n </DropdownMenu.Root>\n </div>\n );\n};\n\nexport const ColumnSettingsPanel = <TData extends RowData, TValue>({\n tableDefs,\n tableDef,\n column,\n onUpdate,\n onDelete,\n onClose,\n}: ColumnMenuProps<TData, TValue> & { onClose: () => void }) => (\n <Popover.Portal>\n <Popover.Content>\n <Popover.Viewport classNames='w-60'>\n <DensityProvider density='fine'>\n <ColumnSettingsForm\n column={column}\n tableDefs={tableDefs}\n tableDef={tableDef}\n onUpdate={onUpdate}\n onDelete={onDelete}\n onClose={onClose}\n />\n </DensityProvider>\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n);\n\nexport const SortIndicator = ({\n direction,\n onClick,\n}: {\n direction: SortDirection | false;\n onClick: (e: any) => void;\n}) => {\n if (direction === false) {\n return null;\n }\n\n let icon;\n\n switch (direction) {\n case 'asc':\n icon = <ArrowUp className={getSize(3)} />;\n break;\n case 'desc':\n icon = <ArrowDown className={getSize(3)} />;\n break;\n }\n\n return (\n <div onClick={onClick} className='flex items-center cursor-pointer'>\n {icon}\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Check, Trash, X } from '@phosphor-icons/react';\nimport React, { type FC, type PropsWithChildren, useRef, useState } from 'react';\n\nimport { Button, Input, 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\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 ColumnSettingsForm = ({\n column,\n tableDef,\n tableDefs,\n onUpdate,\n onDelete,\n onClose,\n}: {\n column: ColumnProps;\n tableDef: TableDef;\n tableDefs: TableDef[];\n onUpdate?: ((id: string, column: ColumnProps) => void) | undefined;\n onDelete?: ((id: string) => void) | undefined;\n onClose: () => void;\n}) => {\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 onClose;\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\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 onClose();\n };\n\n return (\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 );\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 2024 DXOS.org\n//\n\nimport { type SortDirection, type Column } from '@tanstack/react-table';\nimport { useState } from 'react';\n\nexport const useColumnSorting = (column: Column<any>) => {\n const [sortDirection, setSortDirection] = useState<SortDirection | false>(column.getIsSorted());\n const [firstSort, setFirstSort] = useState<SortDirection | undefined>();\n\n const canSort = column.getCanSort();\n\n const updateColumnSort = (direction: SortDirection | false) => {\n setSortDirection(direction);\n\n switch (direction) {\n case false:\n column.clearSorting();\n break;\n case 'asc':\n column.toggleSorting(false); // descending false\n break;\n case 'desc':\n column.toggleSorting(true); // descending true\n break;\n }\n };\n\n // Whichever sort is explicitly set first, will be the first sort direction\n // When toggling, we always go to the other direction, and then to unsorted.\n const onToggleSort = () => {\n if (sortDirection === false) {\n return;\n }\n\n if (sortDirection === firstSort) {\n updateColumnSort(firstSort === 'asc' ? 'desc' : 'asc');\n } else {\n updateColumnSort(false);\n }\n };\n\n const onSelectSort = (direction: SortDirection) => {\n setFirstSort(direction);\n updateColumnSort(direction);\n };\n\n const onClearSort = () => {\n updateColumnSort(false);\n };\n\n return { canSort, sortDirection, onSelectSort, onToggleSort, onClearSort };\n};\n", "//\n// Copyright 2023 DXOS.org\n//\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport {\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnSizingInfoState,\n type GroupingState,\n type RowData,\n type ColumnSizingState,\n type OnChangeFn,\n type RowSelectionState,\n getGroupedRowModel,\n getExpandedRowModel,\n} from '@tanstack/react-table';\nimport { useVirtualizer, type VirtualizerOptions } from '@tanstack/react-virtual';\nimport React, { Fragment, useCallback, useEffect, useState } from 'react';\n\nimport { log } from '@dxos/log';\nimport { useDefaultValue, useOnTransition } from '@dxos/react-ui';\n\nimport { TableBody } from './TableBody';\nimport { type TypedTableProvider, TableProvider as UntypedTableProvider, useTableContext } from './TableContext';\nimport { TableFooter } from './TableFooter';\nimport { TableHead } from './TableHead';\nimport { type TableProps } from './props';\nimport { groupTh, tableRoot } from '../../theme';\nimport { usePinLastRow } from '../hooks/usePinLastRow';\n\nexport const Table = <TData extends RowData>(props: TableProps<TData>) => {\n const {\n role,\n onColumnResize,\n columnVisibility,\n header = true,\n rowsSelectable,\n debug,\n onDataSelectionChange,\n getScrollElement,\n pinLastRow,\n } = props;\n\n const columns = useDefaultValue(props.columns, []);\n const data = useDefaultValue(props.data, []);\n\n const TableProvider = UntypedTableProvider as TypedTableProvider<TData>;\n\n const [columnsInitialised, setColumnsInitialised] = useState(false);\n const [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});\n\n useEffect(() => {\n if (columnsInitialised) {\n return;\n }\n\n setColumnSizing(\n columns\n .filter((column) => !!column.size && (column as any).prop !== undefined)\n .reduce<ColumnSizingState>((state, column) => {\n state[(column as any).prop] = column.size!;\n return state;\n }, {}),\n );\n\n setColumnsInitialised(true);\n }, [columns, setColumnSizing]);\n\n const [columnSizingInfo, setColumnSizingInfo] = useState<ColumnSizingInfoState>({} as ColumnSizingInfoState);\n\n // Notify on column resize.\n const notifyColumnResize = useCallback(() => onColumnResize?.(columnSizing), [onColumnResize, columnSizing]);\n useOnTransition(columnSizingInfo.isResizingColumn, (v) => typeof v === 'string', false, notifyColumnResize);\n\n const [rowSelection = {}, setRowSelection] = 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 setRowSelection(nextRowSelection);\n } else if (rowsSelectable) {\n const nextRowSelectionKey = Object.keys(nextRowSelection).filter((id) => !rowSelection[id])[0];\n setRowSelection(nextRowSelectionKey ? { [nextRowSelectionKey]: true } : {});\n } else {\n setRowSelection({});\n }\n },\n [rowsSelectable, setRowSelection, rowSelection],\n );\n\n const [grouping, handleGroupingChange] = useState<GroupingState>(props.grouping ?? []);\n useEffect(() => handleGroupingChange(props.grouping ?? []), [handleGroupingChange, 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 // State\n state: {\n columnVisibility,\n columnSizing,\n columnSizingInfo,\n rowSelection,\n grouping,\n },\n\n // Resize columns\n columnResizeMode: 'onChange',\n enableColumnResizing: true,\n onColumnSizingChange: setColumnSizing,\n onColumnSizingInfoChange: setColumnSizingInfo,\n\n // Rows\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n\n // Grouping\n getGroupedRowModel: grouping.length > 1 ? getGroupedRowModel() : undefined,\n onGroupingChange: handleGroupingChange,\n\n enableMultiRowSelection: rowsSelectable === 'multi' ? true : undefined,\n enableRowSelection: rowsSelectable === true ? true : undefined,\n\n onRowSelectionChange: handleRowSelectionChange,\n\n enableSorting: true,\n enableColumnPinning: true,\n\n // Debug\n debugTable: debug,\n });\n\n useEffect(() => {\n onDataSelectionChange?.(Object.keys(rowSelection).map((id) => table.getRowModel().rowsById[id].original));\n }, [onDataSelectionChange, rowSelection, table]);\n\n usePinLastRow(pinLastRow, table, data, getScrollElement);\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 if (!getScrollElement) {\n log.warn('Table: getScrollElement is not set. This is required for virtualized tables.');\n }\n\n return (\n <TableProvider\n {...props}\n table={table}\n header={header}\n expand={expand}\n isGrid={role === 'grid' || role === 'treegrid'}\n >\n <TableImpl<TData> debug={false} getScrollElement={getScrollElement} {...props} />\n </TableProvider>\n );\n};\n\n/**\n * Pure implementation of table outside of context set-up.\n */\nconst TableImpl = <TData extends RowData>(props: TableProps<TData>) => {\n const { debug, classNames, getScrollElement, role, footer, grouping, fullWidth } = props;\n const { table } = useTableContext();\n\n const centerRows = table.getCenterRows();\n const bottomRows = table.getBottomRows();\n\n const rows = [...centerRows, ...bottomRows];\n\n if (debug) {\n return (\n <pre className='font-mono text-xs text-neutral-500 m-1 p-2 ring'>\n <code>{JSON.stringify(table.getState(), undefined, 2)}</code>\n </pre>\n );\n }\n\n const virtualisable = getScrollElement !== undefined;\n const isResizingColumn = table.getState().columnSizingInfo.isResizingColumn;\n\n return (\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 virtualisable ? (\n isResizingColumn ? (\n <MemoizedVirtualisedTableContent getScrollElement={getScrollElement} />\n ) : (\n <VirtualizedTableContent getScrollElement={getScrollElement} />\n )\n ) : (\n <TableBody rows={rows} />\n )\n ) : (\n <GroupedTableContent />\n )}\n\n {footer && <TableFooter />}\n </table>\n );\n};\n\nconst VirtualizedTableContent = ({\n getScrollElement,\n}: Pick<VirtualizerOptions<Element, Element>, 'getScrollElement'>) => {\n const { table } = useTableContext();\n\n const centerRows = table.getCenterRows();\n const pinnedRows = table.getBottomRows();\n\n const { getTotalSize, getVirtualItems } = useVirtualizer({\n getScrollElement,\n count: centerRows.length,\n overscan: 8,\n estimateSize: () => 40,\n });\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 const rowsToRender = [...virtualRows.map((virtualRow) => centerRows[virtualRow.index]), ...pinnedRows];\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={rowsToRender} />\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\nexport const MemoizedVirtualisedTableContent = React.memo(VirtualizedTableContent);\n\nconst GroupedTableContent = () => {\n const {\n table: { getGroupedRowModel, getHeaderGroups, getState },\n debug,\n } = useTableContext();\n\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", "//\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\nconst TABLE_BODY_NAME = 'TableBody';\n\ntype TableBodyProps = {\n rows: Row<RowData>[];\n};\n\nconst TableBody = ({ rows }: TableBodyProps) => {\n const { table, keyAccessor, currentDatum, debug, expand, isGrid, onDatumClick } = useTableContext();\n\n const rowSelection = table.getState().rowSelection;\n const domAttributes = useArrowNavigationGroup({ axis: 'grid' });\n const canBeCurrent = !isGrid && !!onDatumClick;\n\n return (\n <tbody {...(isGrid && domAttributes)}>\n {rows.map((row) => {\n const isCurrent = currentDatum === row.original;\n const isSelected = rowSelection?.[row.id];\n\n const isPinned = row.getIsPinned();\n\n const classNames = tbodyTr({ canBeCurrent, isPinned: isPinned !== false });\n\n return (\n <tr\n key={keyAccessor ? keyAccessor(row.original) : row.id}\n className={classNames}\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 2024 DXOS.org\n//\n\nimport { type RowData } from '@tanstack/react-table';\nimport React, { useContext, createContext, type ReactNode } from 'react';\n\nimport { type TableContextValue } from './props';\n\nexport const TABLE_NAME = 'Table';\n\n// Create the context without a default value.\n// The expectation is that the provider will always supply a value, so no need to define a default here.\nconst TableContext = createContext<TableContextValue<RowData>>({} as TableContextValue<RowData>);\n\nexport type TypedTableProvider<TData extends RowData> = {\n (props: TableContextValue<TData> & { children: ReactNode }): JSX.Element;\n displayName: string;\n};\n\nexport const TableProvider: React.FC<TableContextValue<RowData> & { children: ReactNode }> = ({\n children,\n ...value\n}) => {\n return <TableContext.Provider value={value}>{children}</TableContext.Provider>;\n};\n\n// Create a custom hook to consume the context\nexport const useTableContext = <TData extends RowData>(): TableContextValue<TData> => {\n const context = useContext(TableContext as React.Context<TableContextValue<TData>>);\n\n return context;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type CellContext } from '@tanstack/react-table';\n\nimport { modalSurface, focusRing, ghostSelected, ghostSelectedCurrent, groupBorder, mx } 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';\n\nexport const gridCellFocusRing =\n 'focus-within:z-[11] focus-within: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(\n header ? stickyHeader && 'sticky block-start-[--sticky-top] z-[1]' : 'collapse',\n header && 'base-surface',\n 'drop-shadow-sm',\n ...etc,\n );\n\nexport const theadTr: ComponentFunction<TheadStyleProps> = (_props, ...etc) => mx('group', ...etc);\n\nexport const theadTh: ComponentFunction<TheadStyleProps> = ({ border }, ...etc) =>\n mx(\n 'relative',\n 'text-start font-medium select-none truncate',\n headPadding,\n border && groupBorder,\n border && 'border border-t-0 border-b-0 border-neutral-200',\n ...etc,\n );\n\nexport const theadResizeRoot: ComponentFunction<{ isResizing: boolean }> = ({ isResizing }) => {\n return mx(\n 'absolute h-full w-[4px] top-0 right-0',\n 'cursor-col-resize',\n 'user-select-none',\n 'touch-action-none',\n !isResizing && 'group-hover:bg-neutral-100 dark:group-hover:bg-neutral-800',\n 'pointer-coarse:bg-neutral-100 dark:pointer-coarse:bg-neutral-800',\n isResizing && 'bg-primary-500 dark:bg-primary-400',\n );\n};\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; isPinned?: boolean }>;\nexport const tbodyTr: ComponentFunction<TbodyTrStyleProps> = ({ canBeCurrent, isPinned }, ...etc) =>\n mx(\n 'group',\n canBeCurrent ? ghostSelectedCurrent : ghostSelected,\n canBeCurrent && focusRing,\n canBeCurrent && 'cursor-pointer rounded',\n isPinned && 'sticky z-1 bottom-[-1px] base-surface',\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);\n\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', modalSurface, ...etc);\n\nexport const tfootTr: ComponentFunction<TfootStyleProps> = (_props, ...etc) => mx(...etc);\n\nexport const tfootTh: ComponentFunction<TfootStyleProps> = ({ border }, ...etc) =>\n mx(textPadding, modalSurface, 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();\n const domAttributes = useFocusableGroup({ tabBehavior: 'limited' });\n\n const className = tdRoot(tableContext, cell.column.columnDef.meta?.cell?.classNames);\n\n return (\n <td tabIndex={0} {...domAttributes} className={className}>\n {children}\n </td>\n );\n};\n\nconst StaticCell = <TData extends RowData, TValue>({ cell, children }: CellProps<TData, TValue>) => {\n const tableContext = useTableContext();\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();\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 } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useTableContext } from './TableContext';\nimport { tfootRoot, tfootTr, tfootTh } from '../../theme';\n\ntype TableFooterProps = {};\n\nconst TABLE_FOOT_NAME = 'TableFooter';\n\nconst TableFooter = (props: TableFooterProps) => {\n const tableContext = useTableContext();\n const { table, expand, debug } = tableContext;\n const footers = table.getFooterGroups();\n\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_FOOT_NAME;\n\nexport { TableFooter };\n\nexport type { TableFooterProps };\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { flexRender } from '@tanstack/react-table';\nimport React from 'react';\n\nimport { useTableContext } from './TableContext';\nimport { theadResizeRoot, theadRoot, theadTh, theadTr } from '../../theme';\n\nconst TABLE_HEAD_NAME = 'TableHeader';\n\ntype TableHeadProps = {};\n\nconst TableHead = (_props: TableHeadProps) => {\n const tableContext = useTableContext();\n const headerGroups = tableContext.table.getHeaderGroups();\n\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 const onResize = header.getResizeHandler();\n const resizable = header.column.columnDef.meta?.resizable;\n\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\n {resizable && (\n <div\n className={theadResizeRoot({ isResizing })}\n onDoubleClick={header.column.resetSize} // TODO(zan): How should non-pointer users reset column sizing?\n onMouseDown={onResize}\n onTouchStart={onResize}\n />\n )}\n </th>\n );\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 2024 DXOS.org\n//\n\nimport { type Table } from '@tanstack/react-table';\nimport { useEffect, useState } from 'react';\n\nexport const usePinLastRow = (\n pinLastRow: boolean | undefined,\n table: Table<any>,\n data: any,\n getScrollElement?: () => Element | null,\n) => {\n const [pinnedRowKey, setPinnedRowKey] = useState<string>();\n\n useEffect(() => {\n if (!pinLastRow) {\n return;\n }\n\n const rows = table.getRowModel().rows;\n const rowToPin = rows[rows.length - 1];\n const rowId = rowToPin.id;\n\n if (rowId === pinnedRowKey) {\n return;\n }\n\n table.resetRowPinning();\n rowToPin.pin('bottom');\n\n const scrollElement = getScrollElement?.();\n const isFirstRender = pinnedRowKey === undefined;\n\n if (scrollElement && !isFirstRender) {\n requestAnimationFrame(() => {\n scrollElement.scrollTo({ top: scrollElement.scrollHeight });\n });\n }\n\n setPinnedRowKey(rowId);\n }, [pinLastRow, table, getScrollElement, pinnedRowKey, setPinnedRowKey, data]);\n};\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(\n (acc: ComboboxCellItems<TData>, item) => {\n acc[model.getId(item)] = {\n label: model.getText(item),\n data: item,\n };\n return acc;\n },\n initialItems(model, value),\n ),\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 { log } from '@dxos/log';\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 ref = useRef<HTMLInputElement>(null);\n const { findPrevFocusable } = useFocusFinders();\n\n const { onUpdate, cell } = cellContext.column.columnDef.meta as ColumnMeta<TData, string>;\n\n // https://tanstack.com/table/v8/docs/examples/react/editable-data\n const initialValue = cellContext.getValue();\n const [value, setValue] = useState(() => {\n // TODO(burdon): Temporary shim for automerge.\n if ((initialValue as any)?.content) {\n return (initialValue as any)?.content;\n }\n\n return initialValue;\n });\n\n const handleSave = () => {\n ref.current && document.activeElement === ref.current && findPrevFocusable(ref.current)?.focus();\n\n if (value !== initialValue) {\n onUpdate?.(cellContext.row.original, cellContext.column.id, value);\n }\n };\n\n const handleCancel = () => setValue(initialValue);\n\n let placeholder = false;\n const columns = cellContext.table.getVisibleFlatColumns();\n\n // Calling getRowModel is expensive, so only do it when we're a cell in the first position\n if (columns[0].id === cellContext.column.id) {\n const rowCount = cellContext.table.getRowModel().rows.length;\n placeholder = cellContext.row.index === rowCount - 1 && columns[0].id === cellContext.column.id;\n }\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={ref}\n variant='subdued'\n placeholder={placeholder ? 'Add row...' : undefined}\n classNames={['is-full', textPadding, cell?.classNames]}\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 = () => setText(value !== undefined ? String(value) : '');\n\n // TODO(burdon): Property is encoded as float (e.g., 6.1 => 6.099)\n const handleSave = () => {\n const nextValue = parseNumber(text);\n\n if (!isNaN(nextValue)) {\n onUpdate?.(cellContext.row.original, cellContext.column.id, nextValue);\n setText(displayNumber(nextValue, digits));\n } else {\n // Reset the text to display the original value without updating the model.\n setText(displayNumber(value, digits));\n }\n\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\n return (\n <div className='flex justify-center w-full h-full' role='presentation'>\n <Input.Root>\n <Input.Checkbox\n size={4}\n classNames={[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 </div>\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 let value = cell.getValue();\n // TODO(burdon): Hack to support automerge.\n if (typeof value === 'object' && (value as any)?.__typename === 'dxos.Text.v0') {\n value = (value as any).content;\n }\n\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: { ...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 log.info('formatError', { 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 enableResizing: false,\n meta: { onUpdate, cell: { classNames } },\n header: ({ table }) => {\n const { rowsSelectable } = useTableContext();\n const checked = table.getIsSomeRowsSelected() ? 'indeterminate' : table.getIsAllRowsSelected();\n\n return rowsSelectable === 'multi' ? (\n <div className='flex justify-center w-full h-full' role='presentation'>\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 </div>\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 // TODO(Zan): Implement sort algorithm\n enableSorting: true,\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 // TODO(Zan): Implement sort algorithm\n enableSorting: false,\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 /**\n * This display column type is for nested/unhandled data to appear as JSON.\n */\n display({ label, classNames, ...props }: KeyColumnOptions<TData> = {}): Partial<ColumnDef<TData, PublicKey>> {\n return {\n size: 120,\n minSize: 120,\n header: (cell) => label ?? cell.header.id,\n cell: (cell) => {\n const value = cell.getValue();\n\n return (\n <div className='overflow-scroll'>\n <code className='text-xs'>{JSON.stringify(value)}</code>\n </div>\n );\n },\n ...props,\n meta: { ...props.meta, cell: { ...props.meta?.cell, classNames: ['font-mono', textPadding, classNames] } },\n };\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAIA,SAASA,KAAAA,IAAGC,SAASC,WAAWC,WAAWC,eAAe;AAE1D,OAAOC,UAASC,UAAAA,SAAQC,YAAAA,WAAUC,mBAAmB;AAErD,SAASC,UAAAA,SAAQC,iBAAiBC,SAASC,oBAAoB;AAC/D,SAASC,WAAAA,UAASC,MAAAA,WAAU;;;ACL5B,SAASC,OAAOC,OAAOC,SAAS;AAChC,OAAOC,SAA0CC,QAAQC,gBAAgB;AAEzE,SAASC,QAAQC,OAAOC,QAAQC,WAAWC,sBAAsB;AACjE,SAASC,SAASC,UAAU;AAC5B,SAASC,oBAAoB;;;ACLtB,IAAMC,iBAAiB;AAE9B,IAAA,uBAAe;EACb;IACE,SAAS;MACP,CAACA,cAAAA,GAAiB;QAChB,sBAAsB;QACtB,4BAA4B;QAC5B,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;QAC5B,yBAAyB;QACzB,gBAAgB;QAChB,cAAc;QACd,gBAAgB;QAChB,sBAAsB;QACtB,sBAAsB;QACtB,qBAAqB;MACvB;IACF;EACF;;;;ADVF,IAAMC,UAA0D,CAAC,EAAEC,UAAUC,UAAS,MACpF,sBAAA,cAACC,OAAAA;EAAIC,MAAK;EAAOF,WAAWG,GAAG,OAAOH,SAAAA;GACnCD,QAAAA;AAIE,IAAMK,qBAAqB,CAAC,EACjCC,QACAC,UACAC,WACAC,UACAC,UACAC,QAAO,MAQR;AACC,QAAM,CAACC,MAAMC,OAAAA,IAAWC,SAASR,OAAOS,EAAE;AAC1C,QAAM,CAACC,UAAUC,WAAAA,IAAeH,SAASR,OAAOU,QAAQ;AACxD,QAAM,CAACE,SAASC,UAAAA,IAAcL,SAASR,OAAOY,OAAO;AACrD,QAAM,CAACE,MAAMC,OAAAA,IAAWP,SAASQ,OAAOhB,OAAOc,IAAI,CAAA;AACnD,QAAM,CAACG,OAAOC,QAAAA,IAAYV,SAASR,OAAOiB,KAAK;AAC/C,QAAM,CAACE,QAAQC,SAAAA,IAAaZ,SAASQ,OAAOhB,OAAOmB,UAAU,GAAA,CAAA;AAC7D,QAAME,UAAUC,OAAyB,IAAA;AACzC,QAAM,EAAEC,EAAC,IAAKC,eAAeC,cAAAA;AAE7B,QAAMC,eAAe,MAAA;AACnBnB,YAAQP,OAAOS,EAAE;AACjBJ;EACF;AAEA,QAAMsB,aAAa,MAAA;AAEjB,QAAI,CAACrB,KAAKsB,UAAU,CAACtB,KAAKuB,MAAM,eAAA,GAAkB;AAChDR,cAAQS,SAASC,MAAAA;AACjB;IACF;AAGA,UAAMD,UAAU7B,SAAS+B,QAAQC,KAAK,CAACC,MAAMA,EAAEzB,OAAOT,OAAOS,MAAMyB,EAAEzB,OAAOH,IAAAA;AAE5E,QAAIwB,SAAS;AAEX,UAAIA,QAAQhB,SAAS,OAAyC;AAE5DO,gBAAQS,SAASC,MAAAA;AACjB;MACF;IACF;AAEA5B,eAAWG,MAAM;MACfG,IAAIH;MACJA;MACAW;MACAH;MACAJ;MACAE;MACAO,QAAQgB,aAAahB,MAAAA;IACvB,CAAA;AAEAd,YAAAA;EACF;AAEA,SACE,sBAAA,cAACT,OAAAA;IAAID,WAAU;KACb,sBAAA,cAACF,SAAAA,MACC,sBAAA,cAAC2C,MAAMC,MAAI,MACT,sBAAA,cAACD,MAAME,OAAK;IAACC,YAAW;KAAShB,EAAE,oBAAA,CAAA,GACnC,sBAAA,cAACa,MAAMI,WAAS;IACdC,aAAY;IACZC,OAAOzB,SAAS;IAChB0B,UAAU,CAACC,UAAU1B,SAAS0B,MAAMC,OAAOH,KAAK;IAChDI,WAAAA;OAGJ,sBAAA,cAACV,MAAMC,MAAI,MACT,sBAAA,cAACD,MAAME,OAAK;IAACC,YAAW;KAAehB,EAAE,oBAAA,CAAA,GACzC,sBAAA,cAACa,MAAMI,WAAS;IACdO,KAAK1B;IACLoB,aAAY;;IAEZC,OAAOpC,QAAQ;IACfqC,UAAU,CAACC,UAAUrC,QAAQqC,MAAMC,OAAOH,MAAMM,QAAQ,WAAW,EAAA,CAAA;OAGvE,sBAAA,cAACZ,MAAMC,MAAI,MACT,sBAAA,cAACD,MAAME,OAAK;IAACC,YAAW;KAAehB,EAAE,mBAAA,CAAA,GACzC,sBAAA,cAAC0B,OAAOZ,MAAI;IAACK,OAAO5B;IAAMoC,eAAenC;KACvC,sBAAA,cAACkC,OAAOE,eAAa;IAACV,aAAY;IAAOF,YAAW;MACpD,sBAAA,cAACU,OAAOG,QAAM,MACZ,sBAAA,cAACH,OAAOI,SAAO,MACb,sBAAA,cAACJ,OAAOK,UAAQ,MACZ;IAAC;IAAU;IAAW;IAAU;IAAwBC,IAAI,CAACzC,UAC7D,sBAAA,cAACmC,OAAOO,QAAM;IAACC,KAAK3C;IAAM4B,OAAO5B;KAC9BS,EAAE,GAAGT,KAAAA,oBAAwB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAU7CA,SAAS,YACR,sBAAA,cAAA,MAAA,UAAA,MACE,sBAAA,cAACrB,SAAAA,MACC,sBAAA,cAAC2C,MAAMC,MAAI,MACT,sBAAA,cAACD,MAAME,OAAK;IAACC,YAAW;KAAehB,EAAE,cAAA,CAAA,GAEzC,sBAAA,cAACa,MAAMI,WAAS;IAACE,OAAOvB,UAAU;IAAIwB,UAAU,CAACC,UAAUxB,UAAUwB,MAAMC,OAAOH,KAAK;SAO9F5B,SAAS,SACR,sBAAA,cAAA,MAAA,UAAA,MACE,sBAAA,cAACrB,SAAAA,MACC,sBAAA,cAAC2C,MAAMC,MAAI,MACT,sBAAA,cAACD,MAAME,OAAK;IAACC,YAAW;KAAc,OAAA,GACtC,sBAAA,cAACU,OAAOZ,MAAI;IAACK,OAAOhC;IAAUwC,eAAevC;KAC3C,sBAAA,cAACsC,OAAOE,eAAa;IAACV,aAAY;IAAQF,YAAW;MACrD,sBAAA,cAACU,OAAOG,QAAM,MACZ,sBAAA,cAACH,OAAOI,SAAO,MACb,sBAAA,cAACJ,OAAOK,UAAQ,MACbpD,UACEwD,OAAO,CAACnC,OAAMA,GAAEd,OAAOR,SAASQ,EAAE,EAClC8C,IAAI,CAAC,EAAE9C,IAAIkD,KAAI,MACd,sBAAA,cAACV,OAAOO,QAAM;IAACC,KAAKhD;IAAIiC,OAAOjC;KAC5BkD,QAAQlD,EAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,GASxBC,YACC,sBAAA,cAAC0B,MAAMC,MAAI,MACT,sBAAA,cAACD,MAAME,OAAK;IAACC,YAAW;KAAc,gBAAA,GACtC,sBAAA,cAACU,OAAOZ,MAAI;IAACK,OAAO9B;IAASsC,eAAerC;KAC1C,sBAAA,cAACoC,OAAOE,eAAa;IAACV,aAAY;IAAWF,YAAW;MACxD,sBAAA,cAACU,OAAOG,QAAM,MACZ,sBAAA,cAACH,OAAOI,SAAO,MACb,sBAAA,cAACJ,OAAOK,UAAQ,MACbpD,UACE+B,KAAK,CAAChC,cAAaA,UAASQ,OAAOC,QAAAA,GAClCsB,QAAQuB,IAAI,CAAC,EAAE9C,IAAIQ,OAAAA,OAAK,MACxB,sBAAA,cAACgC,OAAOO,QAAM;IAACC,KAAKhD;IAAIiC,OAAOjC;KAC5BQ,UAASR,EAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,GAalC,sBAAA,cAACmD,WAAAA;IAAUrB,YAAW;MAEtB,sBAAA,cAAC9C,SAAAA;IAAQE,WAAU;KAEjB,sBAAA,cAACkE,QAAAA;IAAOC,SAAQ;IAAUvB,YAAW;IAAqBwB,SAASpC;KACjE,sBAAA,cAACqC,QAAAA,MAAMzC,EAAE,YAAA,CAAA,GACT,sBAAA,cAAC3B,OAAAA;IAAID,WAAU;MACf,sBAAA,cAACsE,OAAAA;IAAMtE,WAAWuE,QAAQ,CAAA;OAE5B,sBAAA,cAACL,QAAAA;IAAOtB,YAAW;IAAqBwB,SAASrC;KAC/C,sBAAA,cAACsC,QAAAA,MAAMzC,EAAE,gBAAgB;IAAE4C,IAAI;EAAK,CAAA,CAAA,GACpC,sBAAA,cAACvE,OAAAA;IAAID,WAAU;MACf,sBAAA,cAACyE,GAAAA;IAAEzE,WAAWuE,QAAQ,CAAA;OAExB,sBAAA,cAACL,QAAAA;IAAOtB,YAAW;IAAqBwB,SAAS,MAAM3D,WAAWJ,OAAOS,EAAE;KACzE,sBAAA,cAACuD,QAAAA,MAAMzC,EAAE,cAAA,CAAA,GACT,sBAAA,cAAC3B,OAAAA;IAAID,WAAU;MACf,sBAAA,cAAC0E,OAAAA;IAAM1E,WAAWuE,QAAQ,CAAA;;AAKpC;;;AExMA,SAASI,YAAAA,iBAAgB;AAElB,IAAMC,mBAAmB,CAACC,WAAAA;AAC/B,QAAM,CAACC,eAAeC,gBAAAA,IAAoBC,UAAgCH,OAAOI,YAAW,CAAA;AAC5F,QAAM,CAACC,WAAWC,YAAAA,IAAgBH,UAAAA;AAElC,QAAMI,UAAUP,OAAOQ,WAAU;AAEjC,QAAMC,mBAAmB,CAACC,cAAAA;AACxBR,qBAAiBQ,SAAAA;AAEjB,YAAQA,WAAAA;MACN,KAAK;AACHV,eAAOW,aAAY;AACnB;MACF,KAAK;AACHX,eAAOY,cAAc,KAAA;AACrB;MACF,KAAK;AACHZ,eAAOY,cAAc,IAAA;AACrB;IACJ;EACF;AAIA,QAAMC,eAAe,MAAA;AACnB,QAAIZ,kBAAkB,OAAO;AAC3B;IACF;AAEA,QAAIA,kBAAkBI,WAAW;AAC/BI,uBAAiBJ,cAAc,QAAQ,SAAS,KAAA;IAClD,OAAO;AACLI,uBAAiB,KAAA;IACnB;EACF;AAEA,QAAMK,eAAe,CAACJ,cAAAA;AACpBJ,iBAAaI,SAAAA;AACbD,qBAAiBC,SAAAA;EACnB;AAEA,QAAMK,cAAc,MAAA;AAClBN,qBAAiB,KAAA;EACnB;AAEA,SAAO;IAAEF;IAASN;IAAea;IAAcD;IAAcE;EAAY;AAC3E;;;AH7BO,IAAMC,aAAa,CAAgC,EAAEC,QAAQ,GAAGC,MAAAA,MAAuC;AAC5G,QAAMC,QAAQF,OAAOG,OAAOC,SAASJ,OAAOG,QAAQH,OAAOK;AAC3D,QAAMC,SAASL,MAAMM,QAAQD;AAE7B,QAAM,EAAEE,SAASC,eAAeC,cAAcC,cAAcC,YAAW,IAAKC,iBAAiBP,OAAON,MAAM;AAE1G,QAAMc,0BAA0BC,QAAY,IAAA;AAE5C,QAAM,CAACC,sBAAsBC,uBAAAA,IAA2BC,UAAS,KAAA;AAEjE,QAAMC,4BAA4BJ,QAAO,KAAA;AAEzC,QAAMK,uBAAuBC,YAAY,MAAA;AACvCF,8BAA0BG,UAAU;AACpCL,4BAAwB,IAAA;EAC1B,GAAG;IAACE;IAA2BF;GAAwB;AAEvD,QAAMM,2BAA2BF,YAC/B,CAACG,UAAAA;AACC,QAAIL,0BAA0BG,SAAS;AACrCE,YAAMC,eAAc;AACpBN,gCAA0BG,UAAU;IACtC;EACF,GACA;IAACH;GAA0B;AAG7B,SACE,gBAAAO,OAAA,cAACC,OAAAA;IAAIC,WAAU;KACb,gBAAAF,OAAA,cAACC,OAAAA;IAAIC,WAAU;IAAmC1B;KAChD,gBAAAwB,OAAA,cAACG,eAAAA;IAAcC,WAAWrB;IAAesB,SAASpB;MAClD,gBAAAe,OAAA,cAACC,OAAAA;IAAIC,WAAU;KAAY1B,KAAAA,CAAAA,GAG7B,gBAAAwB,OAAA,cAACM,aAAaC,MAAI;IAACC,OAAO;KACxB,gBAAAR,OAAA,cAACS,QAAQF,MAAI;IAACG,MAAMpB;IAAsBqB,cAAcpB;IAAyBiB,OAAO;KACtF,gBAAAR,OAAA,cAACM,aAAaM,SAAO;IAACC,KAAKzB;IAAyB0B,SAAAA;KAClD,gBAAAd,OAAA,cAACS,QAAQM,QAAM;IAACD,SAAAA;KACd,gBAAAd,OAAA,cAACgB,SAAAA;IAAOC,SAAQ;KACd,gBAAAjB,OAAA,cAACkB,WAAAA;IAAUhB,WAAWiB,SAAQ,CAAA;SAKpC,gBAAAnB,OAAA,cAACM,aAAac,SAAO;IAACC,kBAAkBxB;IAA0ByB,YAAY;IAAGC,kBAAkB;KACjG,gBAAAvB,OAAA,cAACM,aAAakB,UAAQ,MACnB1C,WACC,gBAAAkB,OAAA,cAAAA,OAAA,UAAA,MACE,gBAAAA,OAAA,cAACM,aAAamB,MAAI;IAACpB,SAAS,MAAMrB,aAAa,KAAA;KAC7C,gBAAAgB,OAAA,cAAC0B,QAAAA;IAAKxB,WAAU;KAAO,gBAAA,GACvB,gBAAAF,OAAA,cAAC0B,QAAAA;IAAKxB,WAAU;KACd,gBAAAF,OAAA,cAAC2B,SAAAA;IAAQzB,WAAWiB,SAAQ,CAAA;QAGhC,gBAAAnB,OAAA,cAACM,aAAamB,MAAI;IAACpB,SAAS,MAAMrB,aAAa,MAAA;KAC7C,gBAAAgB,OAAA,cAAC0B,QAAAA;IAAKxB,WAAU;KAAO,iBAAA,GACvB,gBAAAF,OAAA,cAAC0B,QAAAA;IAAKxB,WAAU;KACd,gBAAAF,OAAA,cAAC4B,WAAAA;IAAU1B,WAAWiB,SAAQ,CAAA;QAGjCpC,kBAAkB,SACjB,gBAAAiB,OAAA,cAACM,aAAamB,MAAI;IAACpB,SAASnB;KAC1B,gBAAAc,OAAA,cAAC0B,QAAAA;IAAKxB,WAAU;KAAO,YAAA,GACvB,gBAAAF,OAAA,cAAC0B,QAAAA;IAAKxB,WAAU;KACd,gBAAAF,OAAA,cAAC6B,IAAAA;IAAE3B,WAAWiB,SAAQ,CAAA;SAMhC,gBAAAnB,OAAA,cAACM,aAAamB,MAAI;IAACpB,SAASX;KAC1B,gBAAAM,OAAA,cAAC0B,QAAAA;IAAKxB,WAAU;KAAO,iBAAA,GACvB,gBAAAF,OAAA,cAAC0B,QAAAA;IAAKxB,WAAU;KACd,gBAAAF,OAAA,cAAC8B,SAAAA;IAAQ5B,WAAW6B,IAAGZ,SAAQ,CAAA,GAAI,WAAA;SAIzC,gBAAAnB,OAAA,cAACM,aAAa0B,OAAK,IAAA,CAAA,GAGrB,gBAAAhC,OAAA,cAACiC,qBAAAA;IAAqB,GAAG1D;IAAOD;IAAgB4D,SAAS,MAAM3C,wBAAwB,KAAA;;AAKjG;AAEO,IAAM0C,sBAAsB,CAAgC,EACjEE,WACAC,UACA9D,QACA+D,UACAC,UACAJ,QAAO,MAEP,gBAAAlC,OAAA,cAACS,QAAQ8B,QAAM,MACb,gBAAAvC,OAAA,cAACS,QAAQW,SAAO,MACd,gBAAApB,OAAA,cAACS,QAAQe,UAAQ;EAACgB,YAAW;GAC3B,gBAAAxC,OAAA,cAACyC,iBAAAA;EAAgBC,SAAQ;GACvB,gBAAA1C,OAAA,cAAC2C,oBAAAA;EACCrE;EACA6D;EACAC;EACAC;EACAC;EACAJ;MAIN,gBAAAlC,OAAA,cAACS,QAAQuB,OAAK,IAAA,CAAA,CAAA;AAKb,IAAM7B,gBAAgB,CAAC,EAC5BC,WACAC,QAAO,MAIR;AACC,MAAID,cAAc,OAAO;AACvB,WAAO;EACT;AAEA,MAAIwC;AAEJ,UAAQxC,WAAAA;IACN,KAAK;AACHwC,aAAO,gBAAA5C,OAAA,cAAC2B,SAAAA;QAAQzB,WAAWiB,SAAQ,CAAA;;AACnC;IACF,KAAK;AACHyB,aAAO,gBAAA5C,OAAA,cAAC4B,WAAAA;QAAU1B,WAAWiB,SAAQ,CAAA;;AACrC;EACJ;AAEA,SACE,gBAAAnB,OAAA,cAACC,OAAAA;IAAII;IAAkBH,WAAU;KAC9B0C,IAAAA;AAGP;;;AIlKA,SAASC,4BAA4B;AACrC,SACEC,iBACAC,mBACAC,eAOAC,oBACAC,2BACK;AACP,SAASC,sBAA+C;AACxD,OAAOC,UAASC,UAAUC,eAAAA,cAAaC,aAAAA,YAAWC,YAAAA,iBAAgB;AAElE,SAASC,WAAW;AACpB,SAASC,iBAAiBC,uBAAuB;;;ACjBjD,SAASC,+BAA+B;AACxC,SAASC,kBAA0C;AACnD,OAAOC,YAAW;;;ACDlB,OAAOC,UAASC,YAAYC,qBAAqC;AAQjE,IAAMC,eAAeC,8BAA0C,CAAC,CAAA;AAOzD,IAAMC,gBAAgF,CAAC,EAC5FC,UACA,GAAGC,MAAAA,MACJ;AACC,SAAO,gBAAAC,OAAA,cAACL,aAAaM,UAAQ;IAACF;KAAeD,QAAAA;AAC/C;AAGO,IAAMI,kBAAkB,MAAA;AAC7B,QAAMC,UAAUC,WAAWT,YAAAA;AAE3B,SAAOQ;AACT;;;AC1BA,SAASE,cAAcC,WAAWC,eAAeC,sBAAsBC,aAAaC,MAAAA,WAAU;AAKvF,IAAMC,aAAa;AACnB,IAAMC,cAAc;AACpB,IAAMC,eAAe;AACrB,IAAMC,cAAc;AACpB,IAAMC,cAAc;AAEpB,IAAMC,oBACX;AAQK,IAAMC,YAAgD,CAAC,EAAEC,UAAS,MAAOC,QAC9EC,IAAG,eAAeF,aAAa,WAAA,GAAcC,GAAAA;AAExC,IAAME,UAA8C,CAACC,WAAWH,QACrEC,IAAG,0BAA0BP,cAAAA,GAAiBM,GAAAA;AAQzC,IAAMI,YAAgD,CAAC,EAAEC,QAAQC,aAAY,MAAON,QACzFC,IACEI,SAASC,gBAAgB,4CAA4C,YACrED,UAAU,gBACV,kBAAA,GACGL,GAAAA;AAGA,IAAMO,UAA8C,CAACJ,WAAWH,QAAQC,IAAG,SAAA,GAAYD,GAAAA;AAEvF,IAAMQ,UAA8C,CAAC,EAAEC,OAAM,MAAOT,QACzEC,IACE,YACA,+CACAL,aACAa,UAAUC,aACVD,UAAU,mDAAA,GACPT,GAAAA;AAGA,IAAMW,kBAA8D,CAAC,EAAEC,WAAU,MAAE;AACxF,SAAOX,IACL,yCACA,qBACA,oBACA,qBACA,CAACW,cAAc,8DACf,oEACAA,cAAc,oCAAA;AAElB;AAOO,IAAMC,YAAgD,CAACV,WAAWH,QAAQC,IAAAA,GAAMD,GAAAA;AAGhF,IAAMc,UAAgD,CAAC,EAAEC,cAAcC,SAAQ,MAAOhB,QAC3FC,IACE,SACAc,eAAeE,uBAAuBC,eACtCH,gBAAgBI,WAChBJ,gBAAgB,0BAChBC,YAAY,yCAAA,GACThB,GAAAA;AAOA,IAAMoB,SAA6C,CAAC,EAAEX,QAAQY,OAAM,MAAOrB,QAChFC,IAAG,YAAYP,cAAce,UAAU,UAAUA,UAAUC,aAAaW,UAAUxB,mBAAAA,GAAsBG,GAAAA;AAEnG,IAAMsB,YAAsD,CAACnB,WAAWH,QAAQC,IAAAA,GAAMD,GAAAA;AAQtF,IAAMuB,YAAgD,CAACpB,WAAWH,QACvEC,IAAG,2BAA2BuB,cAAAA,GAAiBxB,GAAAA;AAE1C,IAAMyB,UAA8C,CAACtB,WAAWH,QAAQC,IAAAA,GAAMD,GAAAA;AAE9E,IAAM0B,UAA8C,CAAC,EAAEjB,OAAM,MAAOT,QACzEC,IAAGN,aAAa6B,cAAcf,UAAUC,aAAAA,GAAgBV,GAAAA;;;ACzG1D,SAAS2B,yBAAyB;AAElC,OAAOC,YAAuC;AAS9C,IAAMC,YAAY;AAElB,IAAMC,gBAAgB,CAAgC,EAAEC,MAAMC,SAAQ,MAA4B;AAChG,QAAMC,eAAeC,gBAAAA;AACrB,QAAMC,gBAAgBC,kBAAkB;IAAEC,aAAa;EAAU,CAAA;AAEjE,QAAMC,YAAYC,OAAON,cAAcF,KAAKS,OAAOC,UAAUC,MAAMX,MAAMY,UAAAA;AAEzE,SACE,gBAAAC,OAAA,cAACC,MAAAA;IAAGC,UAAU;IAAI,GAAGX;IAAeG;KACjCN,QAAAA;AAGP;AAEA,IAAMe,aAAa,CAAgC,EAAEhB,MAAMC,SAAQ,MAA4B;AAC7F,QAAMC,eAAeC,gBAAAA;AACrB,SAAO,gBAAAU,OAAA,cAACC,MAAAA;IAAGP,WAAWC,OAAON,cAAcF,KAAKS,OAAOC,UAAUC,MAAMX,MAAMY,UAAAA;KAAcX,QAAAA;AAC7F;AAEA,IAAMgB,OAAO,CAAgC,EAAEjB,MAAMC,SAAQ,MAA4B;AACvF,QAAM,EAAEiB,OAAM,IAAKf,gBAAAA;AACnB,QAAMgB,OAAOD,SAASnB,gBAAgBiB;AACtC,SAAO,gBAAAH,OAAA,cAACM,MAAAA;IAAKnB;KAAaC,QAAAA;AAC5B;AAEAgB,KAAKG,cAActB;;;AH7BnB,IAAMuB,kBAAkB;AAMxB,IAAMC,YAAY,CAAC,EAAEC,KAAI,MAAkB;AACzC,QAAM,EAAEC,OAAOC,aAAaC,cAAcC,OAAOC,QAAQC,QAAQC,aAAY,IAAKC,gBAAAA;AAElF,QAAMC,eAAeR,MAAMS,SAAQ,EAAGD;AACtC,QAAME,gBAAgBC,wBAAwB;IAAEC,MAAM;EAAO,CAAA;AAC7D,QAAMC,eAAe,CAACR,UAAU,CAAC,CAACC;AAElC,SACE,gBAAAQ,OAAA,cAACC,SAAWV,UAAUK,eACnBX,KAAKiB,IAAI,CAACC,QAAAA;AACT,UAAMC,YAAYhB,iBAAiBe,IAAIE;AACvC,UAAMC,aAAaZ,eAAeS,IAAII,EAAE;AAExC,UAAMC,WAAWL,IAAIM,YAAW;AAEhC,UAAMC,aAAaC,QAAQ;MAAEZ;MAAcS,UAAUA,aAAa;IAAM,CAAA;AAExE,WACE,gBAAAR,OAAA,cAACY,MAAAA;MACCC,KAAK1B,cAAcA,YAAYgB,IAAIE,QAAQ,IAAIF,IAAII;MACnDO,WAAWJ;MACV,GAAIN,aAAa;QAAE,gBAAgB;MAAW;MAC9C,GAAIE,cAAc;QAAE,iBAAiB;MAAO;MAC5C,GAAIP,gBAAgB;QACnBgB,UAAU;QACVC,SAAS,MAAA;AACPxB,uBAAaW,IAAIE,QAAQ;QAC3B;QACAY,SAAS,CAAC,EAAEJ,IAAG,MAAE;AACf,cAAIA,QAAQ,WAAWA,QAAQ,KAAK;AAClCrB,yBAAaW,IAAIE,QAAQ;UAC3B;QACF;MACF;OAEChB,SAAS,gBAAAW,OAAA,cAACkB,MAAAA,MAAIf,IAAII,EAAE,GAEpBJ,IAAIgB,gBAAe,EAAGjB,IAAI,CAACkB,SAAAA;AAC1B,aACE,gBAAApB,OAAA,cAACqB,MAAAA;QAAKR,KAAKO,KAAKb;QAAIa;SACjBE,WAAWF,KAAKG,OAAOC,UAAUJ,MAAM;QAAEN,WAAW;QAAS,GAAGM,KAAKK,WAAU;MAAG,CAAA,CAAA;IAGzF,CAAA,GAECnC,UAAU,gBAAAU,OAAA,cAACkB,MAAAA,IAAAA,CAAAA;EAGlB,CAAA,CAAA;AAGN;AAEAlC,UAAU0C,cAAc3C;;;AInExB,SAAS4C,cAAAA,mBAAkB;AAC3B,OAAOC,YAAW;AAOlB,IAAMC,kBAAkB;AAExB,IAAMC,cAAc,CAACC,UAAAA;AACnB,QAAMC,eAAeC,gBAAAA;AACrB,QAAM,EAAEC,OAAOC,QAAQC,MAAK,IAAKJ;AACjC,QAAMK,UAAUH,MAAMI,gBAAe;AAErC,SACE,gBAAAC,OAAA,cAACC,SAAAA;IAAMC,WAAWC,UAAUX,KAAAA;KACzBM,QAAQM,IAAI,CAACC,gBACZ,gBAAAL,OAAA,cAACM,MAAAA;IAAGC,KAAKF,YAAYG;IAAIN,WAAWO,QAAQhB,YAAAA;KACzCI,SAAS,gBAAAG,OAAA,cAACU,MAAAA,IAAAA,GAEVL,YAAYM,QAAQP,IAAI,CAACQ,WAAAA;AACxB,WACE,gBAAAZ,OAAA,cAACU,MAAAA;MAAGH,KAAKK,OAAOJ;MAAIN,WAAWW,QAAQpB,cAAcmB,OAAOE,OAAOC,UAAUC,MAAMJ,QAAQK,UAAAA;OACxFL,OAAOM,gBAAgB,OAAOC,YAAWP,OAAOE,OAAOC,UAAUH,QAAQA,OAAOQ,WAAU,CAAA,CAAA;EAGjG,CAAA,GAECxB,UAAU,gBAAAI,OAAA,cAACU,MAAAA,IAAAA,CAAAA,CAAAA,CAAAA;AAKtB;AAEAnB,YAAY8B,cAAc/B;;;ACpC1B,SAASgC,cAAAA,mBAAkB;AAC3B,OAAOC,YAAW;AAKlB,IAAMC,kBAAkB;AAIxB,IAAMC,YAAY,CAACC,WAAAA;AACjB,QAAMC,eAAeC,gBAAAA;AACrB,QAAMC,eAAeF,aAAaG,MAAMC,gBAAe;AAEvD,SACE,gBAAAC,OAAA,cAACC,SAAAA;IAAMC,WAAWC,UAAUR,YAAAA;KACzBE,aAAaO,IAAI,CAACC,gBAAAA;AACjB;;MAEE,gBAAAL,OAAA,cAACM,MAAAA;QAAGC,KAAKF,YAAYG;QAAIN,WAAWO,QAAQd,YAAAA;SAEzCA,aAAae,SACZ,gBAAAV,OAAA,cAACW,MAAAA;QAAGT,WAAU;QAAYU,OAAO;UAAEC,OAAO;QAAG;SAAG,GAAA,GAKjDR,YAAYS,QAAQV,IAAI,CAACW,WAAAA;AACxB,cAAMC,aAAaD,OAAOE,OAAOC,cAAa;AAC9C,cAAMC,WAAWJ,OAAOK,iBAAgB;AACxC,cAAMC,YAAYN,OAAOE,OAAOK,UAAUC,MAAMF;AAEhD,eACE,gBAAArB,OAAA,cAACW,MAAAA;UACCJ,KAAKQ,OAAOP;UACZI,OAAO;YACLC,OAAOE,OAAOS,QAAO;UACvB;UACAtB,WAAWuB,QAAQ9B,cAAcoB,OAAOE,OAAOK,UAAUC,MAAMR,QAAQW,UAAAA;WAEtE,CAACX,UAAUA,OAAOY,gBACf,OACAC,YAAWb,OAAOE,OAAOK,UAAUP,QAAQA,OAAOc,WAAU,CAAA,GAO/DR,aACC,gBAAArB,OAAA,cAAC8B,OAAAA;UACC5B,WAAW6B,gBAAgB;YAAEf;UAAW,CAAA;UACxCgB,eAAejB,OAAOE,OAAOgB;UAC7BC,aAAaf;UACbgB,cAAchB;;MAKxB,CAAA,GAECxB,aAAayC,UAAU,gBAAApC,OAAA,cAACW,MAAAA,IAAAA,CAAAA;;EAG/B,CAAA,CAAA;AAGN;AAEAlB,UAAU4C,cAAc7C;;;ACpExB,SAAS8C,WAAWC,YAAAA,iBAAgB;AAE7B,IAAMC,gBAAgB,CAC3BC,YACAC,OACAC,MACAC,qBAAAA;AAEA,QAAM,CAACC,cAAcC,eAAAA,IAAmBC,UAAAA;AAExCC,YAAU,MAAA;AACR,QAAI,CAACP,YAAY;AACf;IACF;AAEA,UAAMQ,OAAOP,MAAMQ,YAAW,EAAGD;AACjC,UAAME,WAAWF,KAAKA,KAAKG,SAAS,CAAA;AACpC,UAAMC,QAAQF,SAASG;AAEvB,QAAID,UAAUR,cAAc;AAC1B;IACF;AAEAH,UAAMa,gBAAe;AACrBJ,aAASK,IAAI,QAAA;AAEb,UAAMC,gBAAgBb,mBAAAA;AACtB,UAAMc,gBAAgBb,iBAAiBc;AAEvC,QAAIF,iBAAiB,CAACC,eAAe;AACnCE,4BAAsB,MAAA;AACpBH,sBAAcI,SAAS;UAAEC,KAAKL,cAAcM;QAAa,CAAA;MAC3D,CAAA;IACF;AAEAjB,oBAAgBO,KAAAA;EAClB,GAAG;IAACZ;IAAYC;IAAOE;IAAkBC;IAAcC;IAAiBH;GAAK;AAC/E;;;;APXO,IAAMqB,QAAQ,CAAwBC,UAAAA;AAC3C,QAAM,EACJC,MACAC,gBACAC,kBACAC,SAAS,MACTC,gBACAC,OACAC,uBACAC,kBACAC,WAAU,IACRT;AAEJ,QAAMU,UAAUC,gBAAgBX,MAAMU,SAAS,CAAA,CAAE;AACjD,QAAME,OAAOD,gBAAgBX,MAAMY,MAAM,CAAA,CAAE;AAE3C,QAAMC,iBAAgBC;AAEtB,QAAM,CAACC,oBAAoBC,qBAAAA,IAAyBC,UAAS,KAAA;AAC7D,QAAM,CAACC,cAAcC,eAAAA,IAAmBF,UAA4B,CAAC,CAAA;AAErEG,EAAAA,WAAU,MAAA;AACR,QAAIL,oBAAoB;AACtB;IACF;AAEAI,oBACET,QACGW,OAAO,CAACC,WAAW,CAAC,CAACA,OAAOC,QAASD,OAAeE,SAASC,MAAAA,EAC7DC,OAA0B,CAACC,OAAOL,WAAAA;AACjCK,YAAOL,OAAeE,IAAI,IAAIF,OAAOC;AACrC,aAAOI;IACT,GAAG,CAAC,CAAA,CAAA;AAGRX,0BAAsB,IAAA;EACxB,GAAG;IAACN;IAASS;GAAgB;AAE7B,QAAM,CAACS,kBAAkBC,mBAAAA,IAAuBZ,UAAgC,CAAC,CAAA;AAGjF,QAAMa,qBAAqBC,aAAY,MAAM7B,iBAAiBgB,YAAAA,GAAe;IAAChB;IAAgBgB;GAAa;AAC3Gc,kBAAgBJ,iBAAiBK,kBAAkB,CAACC,MAAM,OAAOA,MAAM,UAAU,OAAOJ,kBAAAA;AAExF,QAAM,CAACK,eAAe,CAAC,GAAGC,eAAAA,IAAmBC,qBAAqB;IAChEb,MAAMxB,MAAMmC;IACZG,UAAUtC,MAAMuC;IAChBC,aAAaxC,MAAMyC;EACrB,CAAA;AAGA,QAAMC,2BAA2BX,aAC/B,CAACY,mBAAAA;AACC,UAAMC,mBAAmB,OAAOD,mBAAmB,aAAaA,eAAeR,YAAAA,IAAgBQ;AAC/F,QAAItC,mBAAmB,SAAS;AAC9B+B,sBAAgBQ,gBAAAA;IAClB,WAAWvC,gBAAgB;AACzB,YAAMwC,sBAAsBC,OAAOC,KAAKH,gBAAAA,EAAkBvB,OAAO,CAAC2B,OAAO,CAACb,aAAaa,EAAAA,CAAG,EAAE,CAAA;AAC5FZ,sBAAgBS,sBAAsB;QAAE,CAACA,mBAAAA,GAAsB;MAAK,IAAI,CAAC,CAAA;IAC3E,OAAO;AACLT,sBAAgB,CAAC,CAAA;IACnB;EACF,GACA;IAAC/B;IAAgB+B;IAAiBD;GAAa;AAGjD,QAAM,CAACc,UAAUC,oBAAAA,IAAwBjC,UAAwBjB,MAAMiD,YAAY,CAAA,CAAE;AACrF7B,EAAAA,WAAU,MAAM8B,qBAAqBlD,MAAMiD,YAAY,CAAA,CAAE,GAAG;IAACC;IAAsBlD,MAAMiD;GAAS;AAElG,QAAME,QAAQC,cAAc;;IAE1BC,MAAM,CAAC;IACPzC;;IAGAF;IACA4C,eAAe;MACb/B,MAAM;MACNgC,SAAS;IACX;;IAGA5B,OAAO;MACLxB;MACAe;MACAU;MACAO;MACAc;IACF;;IAGAO,kBAAkB;IAClBC,sBAAsB;IACtBC,sBAAsBvC;IACtBwC,0BAA0B9B;;IAG1B+B,iBAAiBA,gBAAAA;IACjBC,mBAAmBA,kBAAAA;IACnBC,qBAAqBA,oBAAAA;;IAGrBC,oBAAoBd,SAASe,SAAS,IAAID,mBAAAA,IAAuBtC;IACjEwC,kBAAkBf;IAElBgB,yBAAyB7D,mBAAmB,UAAU,OAAOoB;IAC7D0C,oBAAoB9D,mBAAmB,OAAO,OAAOoB;IAErDc,sBAAsBG;IAEtB0B,eAAe;IACfC,qBAAqB;;IAGrBC,YAAYhE;EACd,CAAA;AAEAc,EAAAA,WAAU,MAAA;AACRb,4BAAwBuC,OAAOC,KAAKZ,YAAAA,EAAcoC,IAAI,CAACvB,OAAOG,MAAMqB,YAAW,EAAGC,SAASzB,EAAAA,EAAI0B,QAAQ,CAAA;EACzG,GAAG;IAACnE;IAAuB4B;IAAcgB;GAAM;AAE/CwB,gBAAclE,YAAY0C,OAAOvC,MAAMJ,gBAAAA;AAGvC,QAAMoE,SAAS;AAEf,MAAI,CAACpE,kBAAkB;AACrBqE,QAAIC,KAAK,gFAAA,QAAA;;;;;;EACX;AAEA,SACE,gBAAAC,OAAA,cAAClE,gBAAAA;IACE,GAAGb;IACJmD;IACA/C;IACAwE;IACAI,QAAQ/E,SAAS,UAAUA,SAAS;KAEpC,gBAAA8E,OAAA,cAACE,WAAAA;IAAiB3E,OAAO;IAAOE;IAAqC,GAAGR;;AAG9E;AAKA,IAAMiF,YAAY,CAAwBjF,UAAAA;AACxC,QAAM,EAAEM,OAAO4E,YAAY1E,kBAAkBP,MAAMkF,QAAQlC,UAAUmC,UAAS,IAAKpF;AACnF,QAAM,EAAEmD,MAAK,IAAKkC,gBAAAA;AAElB,QAAMC,aAAanC,MAAMoC,cAAa;AACtC,QAAMC,aAAarC,MAAMsC,cAAa;AAEtC,QAAMC,OAAO;OAAIJ;OAAeE;;AAEhC,MAAIlF,OAAO;AACT,WACE,gBAAAyE,OAAA,cAACY,OAAAA;MAAIC,WAAU;OACb,gBAAAb,OAAA,cAACc,QAAAA,MAAMC,KAAKC,UAAU5C,MAAM6C,SAAQ,GAAIvE,QAAW,CAAA,CAAA,CAAA;EAGzD;AAEA,QAAMwE,gBAAgBzF,qBAAqBiB;AAC3C,QAAMQ,mBAAmBkB,MAAM6C,SAAQ,EAAGpE,iBAAiBK;AAE3D,SACE,gBAAA8C,OAAA,cAAC5B,SAAAA;IACClD;IACA2F,WAAWM,UAAUlG,OAAOkF,UAAAA;IAC3B,GAAI,CAACE,aAAa;MAAEe,OAAO;QAAEC,OAAOjD,MAAMkD,aAAY;MAAG;IAAE;KAE5D,gBAAAtB,OAAA,cAACuB,WAAAA,IAAAA,GAEArD,UAAUe,WAAW,IACpBiC,gBACEhE,mBACE,gBAAA8C,OAAA,cAACwB,iCAAAA;IAAgC/F;OAEjC,gBAAAuE,OAAA,cAACyB,yBAAAA;IAAwBhG;OAG3B,gBAAAuE,OAAA,cAAC0B,WAAAA;IAAUf;OAGb,gBAAAX,OAAA,cAAC2B,qBAAAA,IAAAA,GAGFvB,UAAU,gBAAAJ,OAAA,cAAC4B,aAAAA,IAAAA,CAAAA;AAGlB;AAEA,IAAMH,0BAA0B,CAAC,EAC/BhG,iBAAgB,MAC+C;AAC/D,QAAM,EAAE2C,MAAK,IAAKkC,gBAAAA;AAElB,QAAMC,aAAanC,MAAMoC,cAAa;AACtC,QAAMqB,aAAazD,MAAMsC,cAAa;AAEtC,QAAM,EAAEY,cAAcQ,gBAAe,IAAKC,eAAe;IACvDtG;IACAuG,OAAOzB,WAAWtB;IAClBgD,UAAU;IACVC,cAAc,MAAM;EACtB,CAAA;AAEA,QAAMC,cAAcL,gBAAAA;AACpB,QAAMM,YAAYd,aAAAA;AAElB,QAAMe,aAAaF,YAAYlD,SAAS,IAAIkD,cAAc,CAAA,GAAIG,SAAS,IAAI;AAC3E,QAAMC,gBAAgBJ,YAAYlD,SAAS,IAAImD,aAAaD,cAAcA,YAAYlD,SAAS,CAAA,GAAIuD,OAAO,KAAK;AAE/G,QAAMC,eAAe;OAAIN,YAAY3C,IAAI,CAACkD,eAAenC,WAAWmC,WAAWC,KAAK,CAAC;OAAMd;;AAE3F,SACE,gBAAA7B,OAAA,cAAAA,OAAA,UAAA,MACGqC,aAAa,KACZ,gBAAArC,OAAA,cAAC4C,SAAAA;IAAM1H,MAAK;KACV,gBAAA8E,OAAA,cAAC6C,MAAAA;IAAG3H,MAAK;KACP,gBAAA8E,OAAA,cAAC8C,MAAAA;IAAG1B,OAAO;MAAE2B,QAAQ,GAAGV,UAAAA;IAAe;IAAGnH,MAAK;QAIrD,gBAAA8E,OAAA,cAAC0B,WAAAA;IAAUf,MAAM8B;MAChBF,gBAAgB,KACf,gBAAAvC,OAAA,cAAC4C,SAAAA;IAAM1H,MAAK;KACV,gBAAA8E,OAAA,cAAC6C,MAAAA;IAAG3H,MAAK;KACP,gBAAA8E,OAAA,cAAC8C,MAAAA;IAAG1B,OAAO;MAAE2B,QAAQ,GAAGR,aAAAA;IAAkB;IAAGrH,MAAK;;AAM9D;AAEO,IAAMsG,kCAAkCxB,gBAAAA,OAAMgD,KAAKvB,uBAAAA;AAE1D,IAAME,sBAAsB,MAAA;AAC1B,QAAM,EACJvD,OAAO,EAAEY,oBAAAA,qBAAoBiE,iBAAiBhC,SAAQ,GACtD1F,MAAK,IACH+E,gBAAAA;AAEJ,SACE,gBAAAN,OAAA,cAAAA,OAAA,UAAA,MACGhB,oBAAAA,EAAqB2B,KAAKnB,IAAI,CAAC0D,KAAKC,MAAAA;AACnC,WACE,gBAAAnD,OAAA,cAACoD,UAAAA;MAASC,KAAKF;OAEb,gBAAAnD,OAAA,cAACsD,SAAAA,MACC,gBAAAtD,OAAA,cAAC6C,MAAAA,MACEtH,SAAS,gBAAAyE,OAAA,cAACuD,MAAAA,IAAAA,GACX,gBAAAvD,OAAA,cAACuD,MAAAA;;MAECC,SAASP,gBAAAA,EAAkB,CAAA,EAAGQ,QAAQxE;MACtC4B,WAAW6C,QAAQ,CAAC,CAAA;OAEnBzC,SAAAA,EAAW/C,SAAS,CAAA,GAAG,KAAEyF,OAAOT,IAAIU,iBAAiB3C,SAAAA,EAAW/C,SAAS,CAAA,CAAE,CAAA,GAAG,GAAA,CAAA,CAAA,GAIrF,gBAAA8B,OAAA,cAAC0B,WAAAA;MAAUf,MAAMuC,IAAIW;;EAG3B,CAAA,CAAA;AAGN;;;AQxSA,SAASC,aAAAA,kBAAiB;AAE1B,OAAOC,UAASC,eAAAA,cAAaC,YAAAA,iBAAgB;AAE7C,SAASC,WAAAA,UAASC,kBAAAA,uBAAsB;AACxC,SAASC,uBAAuB;AAChC,SAASC,iBAAiBC,WAAAA,UAASC,MAAAA,KAAIC,6BAA6B;AAOpE,IAAMC,eAAe,CAAwBC,OAAoCC,UAC/EA,QACI;EACE,CAACD,MAAME,MAAMD,KAAAA,CAAAA,GAAS;IAAEE,OAAOH,MAAMI,QAAQH,KAAAA;IAAQI,MAAMJ;EAAM;AACnE,IACA,CAAC;AAEA,IAAMK,eAAe,CAAwB,EAClDN,OACAC,OACAM,cAAa,MAKd;AACC,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,cAAAA;AAC7B,QAAM,CAACC,OAAOC,QAAAA,IAAYC,UAAmCd,aAAaC,OAAOC,KAAAA,CAAAA;AACjF,QAAM,CAACa,SAASC,UAAAA,IAAcF,UAAS,KAAA;AACvC,QAAM,CAACG,kBAAkBC,mBAAAA,IAAuBJ,UAAS,EAAA;AACzD,QAAMK,+BAA+B,OAAOC,SAAAA;AAC1CF,wBAAoBE,QAAQ,EAAA;AAC5BJ,eAAW,IAAA;AACX,UAAMJ,SAAQ,MAAMX,MAAMoB,MAAMD,IAAAA;AAChCP,aACED,OAAMU,OACJ,CAACC,KAA+BC,SAAAA;AAC9BD,UAAItB,MAAME,MAAMqB,IAAAA,CAAAA,IAAS;QACvBpB,OAAOH,MAAMI,QAAQmB,IAAAA;QACrBlB,MAAMkB;MACR;AACA,aAAOD;IACT,GACAvB,aAAaC,OAAOC,KAAAA,CAAAA,CAAAA;AAGxBc,eAAW,KAAA;EACb;AAEA,QAAMS,oBAAoBC,aACxB,CAACC,OAAAA;AACCnB,kBAAcI,MAAMe,EAAAA,GAAKrB,IAAAA;EAC3B,GACA;IAACM;IAAOJ;GAAc;AAGxB,SACE,gBAAAoB,OAAA,cAACC,gBAAgBC,MAAI;IAACC,aAAatB,EAAE,oBAAA;KACnC,gBAAAmB,OAAA,cAACC,gBAAgBG,SAAO;IAACC,SAAQ;IAAQC,YAAW;KACjDhC,QACC,gBAAA0B,OAAA,cAAAA,OAAA,UAAA,MACE,gBAAAA,OAAA,cAACO,QAAAA;IACCC,WAAWC,IACT,mEACA,CAACnC,SAASoC,qBAAAA;KAGXrC,MAAMI,QAAQH,KAAAA,CAAAA,GAEjB,gBAAA0B,OAAA,cAACW,YAAAA;IAAUC,QAAO;IAAOJ,WAAWK,SAAQ,CAAA;QAE5C,IAAA,GAEN,gBAAAb,OAAA,cAACC,gBAAgBa,SAAO;IAACC,cAAc;IAAOT,YAAW;KACvD,gBAAAN,OAAA,cAACC,gBAAgBe,OAAK;IAAC1C,OAAOe;IAAkBT,eAAeW;MAC/D,gBAAAS,OAAA,cAACC,gBAAgBgB,MAAI,MAClB5B,iBAAiB6B,SAAS,IACzB,gBAAAlB,OAAA,cAACmB,KAAAA;IAAEX,WAAWC,IAAG,eAAeW,eAAAA;KAAkB,wBAAA,IAChDjC,UACF,gBAAAa,OAAA,cAACmB,KAAAA;IAAEX,WAAWC,IAAG,eAAeW,eAAAA;KAAkB,iBAAA,IAElD,gBAAApB,OAAA,cAAAA,OAAA,UAAA,MACE,gBAAAA,OAAA,cAACC,gBAAgBoB,OAAK;IAACf,YAAY;MAAC;MAAec;;KAAkB,YAAA,GACpEE,OAAOC,QAAQvC,KAAAA,EAAOwC,IAAI,CAAC,CAACzB,IAAI,EAAEvB,MAAK,CAAE,MACxC,gBAAAwB,OAAA,cAACC,gBAAgBwB,MAAI;IAACC,KAAK3B;IAAIzB,OAAOyB;IAAI4B,UAAU9B;IAAmBS,YAAW;KAC/E9B,KAAAA,CAAAA,CAAAA,CAAAA,GAMX,gBAAAwB,OAAA,cAAC4B,SAAQC,OAAK,IAAA,CAAA,CAAA;AAItB;;;AClGA,SAASC,uBAAuB;AAChC,SAASC,SAAAA,QAAOC,eAA0BC,KAAAA,UAAS;AACnD,SACEC,0BAMK;AACP,SAASC,cAAc;AACvB,SAASC,2BAA2B;AACpC,OAAOC,WAASC,aAAAA,YAAWC,UAAAA,SAAQC,YAAAA,iBAAgB;AAGnD,SAASC,OAAAA,YAAW;AACpB,SAA8BC,SAAAA,QAAOC,eAAe;AACpD,SAASC,WAAAA,UAASC,MAAAA,WAAU;;AAQrB,IAAMC,sBAAsB,OAA8B;EAC/DC,QAAQC,mBAAAA;EACRC,SAAS,IAAIC,cAAAA;AACf;AAqDA,IAAMC,sBAAsB,CAAwBC,gBAAAA;AAClD,QAAM,EAAEC,OAAOC,SAAQ,IAAKF,YAAYG,OAAOC,UAAUC;AACzD,SAAOJ,QACL,gBAAAK,QAAA,cAACC,cAAAA;IACCN;IACAO,OAAOR,YAAYS,SAAQ;IAC3BC,eAAe,CAACF,UAAUN,WAAWF,YAAYW,IAAIC,UAAUZ,YAAYG,OAAOU,IAAIL,KAAAA;OAEtF;AACN;AAEA,IAAMM,oBAAoB,CAAwBd,gBAAAA;AAChD,QAAMe,MAAMC,QAAyB,IAAA;AACrC,QAAM,EAAEC,kBAAiB,IAAKC,gBAAAA;AAE9B,QAAM,EAAEhB,UAAUiB,KAAI,IAAKnB,YAAYG,OAAOC,UAAUC;AAGxD,QAAMe,eAAepB,YAAYS,SAAQ;AACzC,QAAM,CAACD,OAAOa,QAAAA,IAAYC,UAAS,MAAA;AAEjC,QAAKF,cAAsBG,SAAS;AAClC,aAAQH,cAAsBG;IAChC;AAEA,WAAOH;EACT,CAAA;AAEA,QAAMI,aAAa,MAAA;AACjBT,QAAIU,WAAWC,SAASC,kBAAkBZ,IAAIU,WAAWR,kBAAkBF,IAAIU,OAAO,GAAGG,MAAAA;AAEzF,QAAIpB,UAAUY,cAAc;AAC1BlB,iBAAWF,YAAYW,IAAIC,UAAUZ,YAAYG,OAAOU,IAAIL,KAAAA;IAC9D;EACF;AAEA,QAAMqB,eAAe,MAAMR,SAASD,YAAAA;AAEpC,MAAIU,cAAc;AAClB,QAAMC,UAAU/B,YAAYgC,MAAMC,sBAAqB;AAGvD,MAAIF,QAAQ,CAAA,EAAGlB,OAAOb,YAAYG,OAAOU,IAAI;AAC3C,UAAMqB,WAAWlC,YAAYgC,MAAMG,YAAW,EAAGC,KAAKC;AACtDP,kBAAc9B,YAAYW,IAAI2B,UAAUJ,WAAW,KAAKH,QAAQ,CAAA,EAAGlB,OAAOb,YAAYG,OAAOU;EAC/F;AAGA,SACE,gBAAAP,QAAA,cAACiC,OAAMC,MAAI,MACT,gBAAAlC,QAAA,cAACiC,OAAME,WAAS;IACd1B;IACA2B,SAAQ;IACRZ,aAAaA,cAAc,eAAea;IAC1CC,YAAY;MAAC;MAAWC;MAAa1B,MAAMyB;;IAC3CpC,OAAOA,SAAS;IAChBsC,QAAQtB;IACRuB,UAAU,CAACC,UAAU3B,SAAS2B,MAAMC,OAAOzC,KAAK;IAChD0C,WAAW,CAACF,UAAWA,MAAMG,QAAQ,WAAW3B,WAAAA,KAAkBwB,MAAMG,QAAQ,YAAYtB,aAAAA;;AAIpG;AAEA,IAAMuB,cAAc,CAACC,SAAmBA,MAAMC,KAAAA,EAAOjB,SAASkB,OAAOF,IAAAA,IAAQG;AAE7E,IAAMC,gBAAgB,CAACjD,OAAgBkD,WACrClD,SAASA,UAAU,IACfA,MAAMmD,eAAehB,QAAW;EAC9BiB,uBAAuBF,UAAU;EACjCG,uBAAuBH,UAAU;AACnC,CAAA,IACA;AAEN,IAAMI,oBAAoB,CAAwB9D,gBAAAA;AAChD,QAAM,EAAEE,UAAUwD,OAAM,IAAK1D,YAAYG,OAAOC,UAAUC;AAC1D,QAAMG,QAAQR,YAAYS,SAAQ;AAClC,QAAM,CAAC4C,MAAMU,OAAAA,IAAWzC,UAAiBmC,cAAcjD,OAAOkD,MAAAA,CAAAA;AAC9D,QAAM,EAAEzC,kBAAiB,IAAKC,gBAAAA;AAC9B,QAAMH,MAAMC,QAAgC,IAAA;AAG5CgD,EAAAA,WAAU,MAAA;AACP,KAAA,CAACtC,SAASC,iBAAiBD,SAASC,kBAAkBZ,IAAIU,YAAYsC,QAAQN,cAAcjD,OAAOkD,MAAAA,CAAAA;EACtG,GAAG;IAACA;IAAQlD;GAAM;AAElB,QAAMyD,aAAa,MAAMF,QAAQvD,UAAUmC,SAAYuB,OAAO1D,KAAAA,IAAS,EAAA;AAGvE,QAAMgB,aAAa,MAAA;AACjB,UAAM2C,YAAYf,YAAYC,IAAAA;AAE9B,QAAI,CAACe,MAAMD,SAAAA,GAAY;AACrBjE,iBAAWF,YAAYW,IAAIC,UAAUZ,YAAYG,OAAOU,IAAIsD,SAAAA;AAC5DJ,cAAQN,cAAcU,WAAWT,MAAAA,CAAAA;IACnC,OAAO;AAELK,cAAQN,cAAcjD,OAAOkD,MAAAA,CAAAA;IAC/B;AAGA3C,QAAIU,WAAWC,SAASC,kBAAkBZ,IAAIU,WAAWR,kBAAkBF,IAAIU,OAAO,GAAGG,MAAAA;EAC3F;AAEA,QAAMyC,gBAAgB,MAAA;AACpBN,YAAQN,cAAcjD,OAAOkD,MAAAA,CAAAA;AAC7B3C,QAAIU,WAAWR,kBAAkBF,IAAIU,OAAO,GAAGG,MAAAA;EACjD;AAEA,SACE,gBAAAtB,QAAA,cAACiC,OAAMC,MAAI,MACT,gBAAAlC,QAAA,cAACiC,OAAME,WAAS;IACd1B;IACA2B,SAAQ;IACRlC,OAAO6C;IACPT,YAAY;MAAC;MAA8BC;;IAC3CC,QAAQtB;IACR8C,SAASL;IACTlB,UAAU,CAAC,EAAEE,QAAQ,EAAEzC,OAAAA,OAAK,EAAE,MAAOuD,QAAQvD,MAAAA;IAC7C0C,WAAW,CAACF,UAAAA;AAEV;;QAA2DA,MAAMG,QAAQ,WAAW3B,WAAAA;;IACtF;;AAIR;AAEA,IAAM+C,yBAAyB,CAAwBvE,gBAAAA;AACrD,QAAM,EAAEmB,KAAI,IAAKnB,YAAYG,OAAOC,UAAUC;AAC9C,QAAM,EAAEM,IAAG,IAAKX;AAEhB,QAAMwE,UAAU7D,IAAI8D,aAAY,IAC5B9D,IAAI+D,cAAa,IACjB/D,IAAIgE,oBAAmB,MAAOhE,IAAIiE,kBAAiB,IAAK,kBAAkBjE,IAAIkE,wBAAuB;AAEzG,SACE,gBAAAvE,QAAA,cAACwE,OAAAA;IAAIC,WAAU;IAAoCC,MAAK;KACtD,gBAAA1E,QAAA,cAACiC,OAAMC,MAAI,MACT,gBAAAlC,QAAA,cAACiC,OAAM0C,UAAQ;IACbC,MAAM;IACNtC,YAAY;MAACzB,MAAMyB;;IACnB4B;IACAW,iBAAiB,CAACnC,UAAAA;AAChB,UAAIrC,IAAI8D,aAAY,GAAI;AACtB9D,YAAIyE,yBAAwB,EAAGpC,KAAAA;MACjC;IACF;IACAqC,UAAU,EAAE1E,IAAI8D,aAAY,KAAM9D,IAAIgE,oBAAmB;;AAKnE;AAEA,IAAMW,oBAAoB,CAAwBtF,gBAAAA;AAChD,QAAM,EAAEE,SAAQ,IAAKF,YAAYG,OAAOC,UAAUC;AAClD,QAAMG,QAAQR,YAAYS,SAAQ;AAClC,SACE,gBAAAH,QAAA,cAACiC,OAAMC,MAAI,MACT,gBAAAlC,QAAA,cAACiC,OAAMgD,QAAM;IACX3C,YAAW;IACX4C,SAAS,CAACxC,UAAUA,MAAMyC,gBAAe;IACzCJ,UAAU,CAACnF;IACXsE,SAAS,CAAC,CAAChE;IACX2E,iBAAiB,CAAC3E,WAAAA;AAChBN,iBAAWF,YAAYW,IAAIC,UAAUZ,YAAYG,OAAOU,IAAI,CAAC,CAACL,MAAAA;IAChE;;AAIR;AAKO,IAAMV,gBAAN,MAAMA;;;;EAIX4F,SAAS,EACPC,OACA/C,YACA3C,OACAC,UACA,GAAG0F,MAAAA,GAC4D;AAC/D,WAAO;MACLC,SAAS;MACTC,QAAQ,CAAC3F,WAAAA;AACP,eAAOwF,SAASxF,OAAO2F,OAAOjF;MAChC;MACAM,MACElB,SAASC,WACLH,sBACA,CAACC,gBAAAA;AACC,cAAM+F,YAAY/F,YAAYS,SAAQ;AACtC,eAAO,gBAAAH,QAAA,cAACwE,OAAAA;UAAIC,WAAWiB,IAAG,YAAYpD,UAAAA;WAAcmD,YAAY9F,OAAOgG,QAAQF,SAAAA,IAAa,EAAA;MAC9F;MACN,GAAGH;MACHvF,MAAM;QACJ,GAAGuF,MAAMvF;QACTJ;QACAC;QACAiB,MAAM;UAAEyB;UAAY,GAAGgD,MAAMvF,MAAMc;QAAK;MAC1C;IACF;EACF;;;;EAKA+E,OAAO,EAAEP,OAAO/C,YAAY1C,UAAU,GAAG0F,MAAAA,IAAsC,CAAC,GAE9E;AACA,WAAO;MACLC,SAAS;;MAETC,QAAQ,CAAC3F,WAAAA;AACP,eAAOwF,SAASxF,OAAO2F,OAAOjF;MAChC;MACAM,MAAMjB,WACFY,oBACA,CAACK,SAAAA;AACC,YAAIX,QAAQW,KAAKV,SAAQ;AAEzB,YAAI,OAAOD,UAAU,YAAaA,OAAe2F,eAAe,gBAAgB;AAC9E3F,kBAASA,MAAce;QACzB;AAEA,eAAO,gBAAAjB,QAAA,cAACwE,OAAAA;UAAIC,WAAWiB,IAAG,YAAYnD,aAAaD,UAAAA;WAAcpC,KAAAA;MACnE;MACJ,GAAGoF;MACHvF,MAAM;QACJ,GAAGuF,MAAMvF;QACTH;QACAiB,MAAM;UAAE,GAAGyE,MAAMvF,MAAMc;UAAMyB;QAAW;MAC1C;IACF;EACF;;;;EAKAwD,OAAO,EAAET,OAAOE,SAASjD,YAAYc,QAAQxD,UAAU,GAAG0F,MAAAA,IAAsC,CAAC,GAE/F;AACA,WAAO;MACLV,MAAM;MACNW,SAAS;MACTC,QAAQ,CAAC3E,SAASwE,SAASxE,KAAK2E,OAAOjF;MACvCM,MAAM2C;MACN,GAAG8B;MACHvF,MAAM;QACJ,GAAGuF,MAAMvF;QACTH;QACAwD;QACAoC,QAAQ;UAAE,GAAGF,MAAMvF,MAAMyF;QAAO;QAChC3E,MAAM;UAAE,GAAGyE,MAAMvF,MAAMc;UAAMyB;QAAW;MAC1C;IACF;EACF;;;;;EAMAyD,KAAK,EAAEV,OAAOW,QAAQC,YAAYC,UAAU5D,YAAY,GAAGgD,MAAAA,IAAoC,CAAC,GAE9F;AACA,WAAO;MACLV,MAAM;MACNW,SAAS;MACTC,QAAQ,CAAC3E,SAASwE,SAASxE,KAAK2E,OAAOjF;MACvCM,MAAM,CAACA,SAAAA;AACL,cAAMX,QAAQW,KAAKV,SAAQ;AAE3B,YAAI;AACF,gBAAMgG,MAAMjG,QACR+F,aACED,OAAO9F,OAAO+F,UAAAA,IACdC,WACEE,oBAAoBlG,OAAO;YAAEmG,WAAW;UAAK,CAAA,IAC7CnG,MAAMoG,YAAW,IACrBjE;AAEJ,iBAAO,gBAAArC,QAAA,cAACwE,OAAAA;YAAIC,WAAWiB,IAAGnD,aAAaD,UAAAA;aAAc6D,GAAAA;QACvD,SAASI,KAAK;AACZC,UAAAA,KAAIC,KAAK,eAAe;YAAEvG;UAAM,GAAA;;;;;;AAChC,iBAAO;QACT;MACF;MACA,GAAGoF;MACHvF,MAAM;QAAE,GAAGuF,MAAMvF;QAAMc,MAAM;UAAE,GAAGyE,MAAMvF,MAAMc;UAAMyB;QAAW;MAAE;IACnE;EACF;;;;EAKAO,IAAI,EAAEwC,OAAOqB,SAASpE,YAAY,GAAGgD,MAAAA,IAAmC,CAAC,GAAyC;AAChH,WAAO;MACLV,MAAM;MACNW,SAAS;MACTC,QAAQ,CAAC3E,SAASwE,SAASxE,KAAK2E,OAAOjF;MACvCM,MAAM,CAACA,SAAAA;AACL,cAAMX,QAAQW,KAAKV,SAAQ;AAC3B,YAAI,CAACD,OAAO;AACV;QACF;AAGA,cAAMyG,UAAUzG,MAAM0G,SAAQ;AAC9B,YAAI,CAACF,SAAS;AACZ,iBAAOC;QACT;AAEA,eACE,gBAAA3G,QAAA,cAAC6G,QAAQC,UAAQ,MACf,gBAAA9G,QAAA,cAAC6G,QAAQ3E,MAAI,MACX,gBAAAlC,QAAA,cAAC6G,QAAQE,SAAO,MAAEJ,OAAAA,GAClB,gBAAA3G,QAAA,cAAC6G,QAAQG,QAAM,MACb,gBAAAhH,QAAA,cAAC6G,QAAQI,SAAO;UAACC,MAAK;WACpB,gBAAAlH,QAAA,cAAC6G,QAAQM,OAAK,IAAA,GACd,gBAAAnH,QAAA,cAACoH,eAAAA;UACClC,SAAS,CAACmC,OAAAA;AACRA,eAAGlC,gBAAe;AAClB,iBAAKmC,UAAUC,UAAUC,UAAUtH,MAAMuH,MAAK,CAAA;UAChD;;MAOd;MACA,GAAGnC;MACHvF,MAAM;QAAE,GAAGuF,MAAMvF;QAAMc,MAAM;UAAE,GAAGyE,MAAMvF,MAAMc;UAAMyB,YAAY;YAAC;YAAaC;YAAaD;;QAAY;MAAE;IAC3G;EACF;;;;EAKAoF,UAAU,EAAEpF,YAAY1C,UAAUW,KAAK,YAAW,IAAoC,CAAC,GAElF;AACH,WAAO;MACLA;MACAqE,MAAM;MACN+C,gBAAgB;MAChB5H,MAAM;QAAEH;QAAUiB,MAAM;UAAEyB;QAAW;MAAE;MACvCkD,QAAQ,CAAC,EAAE9D,MAAK,MAAE;AAChB,cAAM,EAAEkG,eAAc,IAAKC,gBAAAA;AAC3B,cAAM3D,UAAUxC,MAAMoG,sBAAqB,IAAK,kBAAkBpG,MAAMqG,qBAAoB;AAE5F,eAAOH,mBAAmB,UACxB,gBAAA5H,QAAA,cAACwE,OAAAA;UAAIC,WAAU;UAAoCC,MAAK;WACtD,gBAAA1E,QAAA,cAACiC,OAAMC,MAAI,MACT,gBAAAlC,QAAA,cAACiC,OAAM0C,UAAQ;UACbC,MAAM;UACNtC,YAAY;YAAC;YAAYA;;UACzB4B;UACAW,iBAAiB,MAAMnD,MAAMsG,sBAAqB;eAItD;MACN;MACAnH,MAAMoD;IACR;EACF;;;;EAKAgE,OAAO,EAAE5C,OAAO/C,YAAY1C,UAAU,GAAG0F,MAAAA,IAAsC,CAAC,GAE9E;AACA,WAAO;MACLV,MAAM;MACNW,SAAS;MACTC,QAAQ,CAAC3F,WAAWwF,SAASxF,OAAO2F,OAAOjF;;MAE3C2H,eAAe;MACfrH,MAAMmE;MACN,GAAGM;MACHvF,MAAM;QAAE,GAAGuF,MAAMvF;QAAMH;QAAUiB,MAAM;UAAE,GAAGyE,MAAMvF,MAAMc;UAAMyB,YAAY;YAACC;YAAaD;;QAAY;MAAE;IACxG;EACF;;;;EAKA6F,KAAK,EAAE9C,OAAOT,MAAMwD,IAAIC,KAAK,GAAG/C,MAAAA,IAAoC,CAAC,GAAuC;AAC1G,UAAMgD,SAASF,IAAIG,QAAQC;AAC3B,UAAMC,UAAUJ,KAAKE,QAAQG;AAC7B,WAAO;MACL9D,MAAMA,QAAQ;;MAEdsD,eAAe;MACf1C,QAAQ,CAAC3F,WAAW,gBAAAG,QAAA,cAACwE,OAAAA;QAAIC,WAAW;SAAmBY,SAASxF,OAAO2F,OAAOjF,EAAE;MAChFM,MAAM,CAACA,SAAAA;AACL,cAAMX,QAAQW,KAAKV,SAAQ;AAC3B,YAAID,OAAO;AACT,iBAAO,gBAAAF,QAAA,cAACsI,QAAAA;YAAO7D,WAAWiB,IAAG,kBAAkBiD,SAAQ,CAAA,GAAIP,IAAI3D,aAAa,gBAAA;;QAC9E,WAAWvE,UAAU,OAAO;AAC1B,iBAAO,gBAAAF,QAAA,cAACyI,SAAAA;YAAQhE,WAAWiB,IAAG,kBAAkBiD,SAAQ,CAAA,GAAIN,KAAK5D,aAAa,cAAA;;QAChF,OAAO;AACL,iBAAO;QACT;MACF;MACA,GAAGa;IACL;EACF;;;;EAKAsD,QAAQ,EAAEvD,OAAO/C,YAAY,GAAGgD,MAAAA,IAAmC,CAAC,GAAyC;AAC3G,WAAO;MACLV,MAAM;MACNW,SAAS;MACTC,QAAQ,CAAC3E,SAASwE,SAASxE,KAAK2E,OAAOjF;MACvCM,MAAM,CAACA,SAAAA;AACL,cAAMX,QAAQW,KAAKV,SAAQ;AAE3B,eACE,gBAAAH,QAAA,cAACwE,OAAAA;UAAIC,WAAU;WACb,gBAAAzE,QAAA,cAAC6I,QAAAA;UAAKpE,WAAU;WAAWqE,KAAKC,UAAU7I,KAAAA,CAAAA,CAAAA;MAGhD;MACA,GAAGoF;MACHvF,MAAM;QAAE,GAAGuF,MAAMvF;QAAMc,MAAM;UAAE,GAAGyE,MAAMvF,MAAMc;UAAMyB,YAAY;YAAC;YAAaC;YAAaD;;QAAY;MAAE;IAC3G;EACF;AACF;",
|
|
6
|
+
"names": ["X", "GearSix", "CaretDown", "ArrowDown", "ArrowUp", "React", "useRef", "useState", "useCallback", "Button", "DensityProvider", "Popover", "DropdownMenu", "getSize", "mx", "Check", "Trash", "X", "React", "useRef", "useState", "Button", "Input", "Select", "Separator", "useTranslation", "getSize", "mx", "safeParseInt", "translationKey", "Section", "children", "className", "div", "role", "mx", "ColumnSettingsForm", "column", "tableDef", "tableDefs", "onUpdate", "onDelete", "onClose", "prop", "setProp", "useState", "id", "refTable", "setRefTable", "refProp", "setRefProp", "type", "setType", "String", "label", "setLabel", "digits", "setDigits", "propRef", "useRef", "t", "useTranslation", "translationKey", "handleCancel", "handleSave", "length", "match", "current", "focus", "columns", "find", "c", "safeParseInt", "Input", "Root", "Label", "classNames", "TextInput", "placeholder", "value", "onChange", "event", "target", "autoFocus", "ref", "replace", "Select", "onValueChange", "TriggerButton", "Portal", "Content", "Viewport", "map", "Option", "key", "filter", "name", "Separator", "Button", "variant", "onClick", "span", "Check", "getSize", "ns", "X", "Trash", "useState", "useColumnSorting", "column", "sortDirection", "setSortDirection", "useState", "getIsSorted", "firstSort", "setFirstSort", "canSort", "getCanSort", "updateColumnSort", "direction", "clearSorting", "toggleSorting", "onToggleSort", "onSelectSort", "onClearSort", "ColumnMenu", "column", "props", "title", "label", "length", "id", "header", "context", "canSort", "sortDirection", "onSelectSort", "onToggleSort", "onClearSort", "useColumnSorting", "columnSettingsAnchorRef", "useRef", "isColumnSettingsOpen", "setIsColumnSettingsOpen", "useState", "shouldPreventFocusOnClose", "onOpenColumnSettings", "useCallback", "current", "onDropdownCloseAutoFocus", "event", "preventDefault", "React", "div", "className", "SortIndicator", "direction", "onClick", "DropdownMenu", "Root", "modal", "Popover", "open", "onOpenChange", "Trigger", "ref", "asChild", "Anchor", "Button", "variant", "CaretDown", "getSize", "Content", "onCloseAutoFocus", "sideOffset", "collisionPadding", "Viewport", "Item", "span", "ArrowUp", "ArrowDown", "X", "GearSix", "mx", "Arrow", "ColumnSettingsPanel", "onClose", "tableDefs", "tableDef", "onUpdate", "onDelete", "Portal", "classNames", "DensityProvider", "density", "ColumnSettingsForm", "icon", "useControllableState", "getCoreRowModel", "getSortedRowModel", "useReactTable", "getGroupedRowModel", "getExpandedRowModel", "useVirtualizer", "React", "Fragment", "useCallback", "useEffect", "useState", "log", "useDefaultValue", "useOnTransition", "useArrowNavigationGroup", "flexRender", "React", "React", "useContext", "createContext", "TableContext", "createContext", "TableProvider", "children", "value", "React", "Provider", "useTableContext", "context", "useContext", "modalSurface", "focusRing", "ghostSelected", "ghostSelectedCurrent", "groupBorder", "mx", "currentRow", "selectedRow", "flushPadding", "textPadding", "headPadding", "gridCellFocusRing", "tableRoot", "fullWidth", "etc", "mx", "groupTh", "_props", "theadRoot", "header", "stickyHeader", "theadTr", "theadTh", "border", "groupBorder", "theadResizeRoot", "isResizing", "tbodyRoot", "tbodyTr", "canBeCurrent", "isPinned", "ghostSelectedCurrent", "ghostSelected", "focusRing", "tdRoot", "isGrid", "tdContent", "tfootRoot", "modalSurface", "tfootTr", "tfootTh", "useFocusableGroup", "React", "CELL_NAME", "FocusableCell", "cell", "children", "tableContext", "useTableContext", "domAttributes", "useFocusableGroup", "tabBehavior", "className", "tdRoot", "column", "columnDef", "meta", "classNames", "React", "td", "tabIndex", "StaticCell", "Cell", "isGrid", "Root", "displayName", "TABLE_BODY_NAME", "TableBody", "rows", "table", "keyAccessor", "currentDatum", "debug", "expand", "isGrid", "onDatumClick", "useTableContext", "rowSelection", "getState", "domAttributes", "useArrowNavigationGroup", "axis", "canBeCurrent", "React", "tbody", "map", "row", "isCurrent", "original", "isSelected", "id", "isPinned", "getIsPinned", "classNames", "tbodyTr", "tr", "key", "className", "tabIndex", "onClick", "onKeyUp", "td", "getVisibleCells", "cell", "Cell", "flexRender", "column", "columnDef", "getContext", "displayName", "flexRender", "React", "TABLE_FOOT_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", "TABLE_HEAD_NAME", "TableHead", "_props", "tableContext", "useTableContext", "headerGroups", "table", "getHeaderGroups", "React", "thead", "className", "theadRoot", "map", "headerGroup", "tr", "key", "id", "theadTr", "debug", "th", "style", "width", "headers", "header", "isResizing", "column", "getIsResizing", "onResize", "getResizeHandler", "resizable", "columnDef", "meta", "getSize", "theadTh", "classNames", "isPlaceholder", "flexRender", "getContext", "div", "theadResizeRoot", "onDoubleClick", "resetSize", "onMouseDown", "onTouchStart", "expand", "displayName", "useEffect", "useState", "usePinLastRow", "pinLastRow", "table", "data", "getScrollElement", "pinnedRowKey", "setPinnedRowKey", "useState", "useEffect", "rows", "getRowModel", "rowToPin", "length", "rowId", "id", "resetRowPinning", "pin", "scrollElement", "isFirstRender", "undefined", "requestAnimationFrame", "scrollTo", "top", "scrollHeight", "Table", "props", "role", "onColumnResize", "columnVisibility", "header", "rowsSelectable", "debug", "onDataSelectionChange", "getScrollElement", "pinLastRow", "columns", "useDefaultValue", "data", "TableProvider", "UntypedTableProvider", "columnsInitialised", "setColumnsInitialised", "useState", "columnSizing", "setColumnSizing", "useEffect", "filter", "column", "size", "prop", "undefined", "reduce", "state", "columnSizingInfo", "setColumnSizingInfo", "notifyColumnResize", "useCallback", "useOnTransition", "isResizingColumn", "v", "rowSelection", "setRowSelection", "useControllableState", "onChange", "onRowSelectionChange", "defaultProp", "defaultRowSelection", "handleRowSelectionChange", "updaterOrValue", "nextRowSelection", "nextRowSelectionKey", "Object", "keys", "id", "grouping", "handleGroupingChange", "table", "useReactTable", "meta", "defaultColumn", "maxSize", "columnResizeMode", "enableColumnResizing", "onColumnSizingChange", "onColumnSizingInfoChange", "getCoreRowModel", "getSortedRowModel", "getExpandedRowModel", "getGroupedRowModel", "length", "onGroupingChange", "enableMultiRowSelection", "enableRowSelection", "enableSorting", "enableColumnPinning", "debugTable", "map", "getRowModel", "rowsById", "original", "usePinLastRow", "expand", "log", "warn", "React", "isGrid", "TableImpl", "classNames", "footer", "fullWidth", "useTableContext", "centerRows", "getCenterRows", "bottomRows", "getBottomRows", "rows", "pre", "className", "code", "JSON", "stringify", "getState", "virtualisable", "tableRoot", "style", "width", "getTotalSize", "TableHead", "MemoizedVirtualisedTableContent", "VirtualizedTableContent", "TableBody", "GroupedTableContent", "TableFooter", "pinnedRows", "getVirtualItems", "useVirtualizer", "count", "overscan", "estimateSize", "virtualRows", "totalSize", "paddingTop", "start", "paddingBottom", "end", "rowsToRender", "virtualRow", "index", "tbody", "tr", "td", "height", "memo", "getHeaderGroups", "row", "i", "Fragment", "key", "thead", "th", "colSpan", "headers", "groupTh", "String", "getGroupingValue", "subRows", "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", "log", "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", "ref", "useRef", "findPrevFocusable", "useFocusFinders", "cell", "initialValue", "setValue", "useState", "content", "handleSave", "current", "document", "activeElement", "focus", "handleCancel", "placeholder", "columns", "table", "getVisibleFlatColumns", "rowCount", "getRowModel", "rows", "length", "index", "Input", "Root", "TextInput", "variant", "undefined", "classNames", "textPadding", "onBlur", "onChange", "event", "target", "onKeyDown", "key", "parseNumber", "text", "trim", "Number", "NaN", "displayNumber", "digits", "toLocaleString", "minimumFractionDigits", "maximumFractionDigits", "NumberBuilderCell", "setText", "useEffect", "handleEdit", "String", "nextValue", "isNaN", "_handleCancel", "onFocus", "RowSelectorBuilderCell", "checked", "getCanSelect", "getIsSelected", "getCanSelectSubRows", "getIsSomeSelected", "getIsAllSubRowsSelected", "div", "className", "role", "Checkbox", "size", "onCheckedChange", "getToggleSelectedHandler", "disabled", "SwitchBuilderCell", "Switch", "onClick", "stopPropagation", "combobox", "label", "props", "minSize", "header", "cellValue", "mx", "getText", "string", "__typename", "number", "date", "format", "formatSpec", "relative", "str", "formatDistanceToNow", "addSuffix", "toISOString", "err", "log", "info", "tooltip", "element", "truncate", "Tooltip", "Provider", "Trigger", "Portal", "Content", "side", "Arrow", "ClipboardText", "ev", "navigator", "clipboard", "writeText", "toHex", "selectRow", "enableResizing", "rowsSelectable", "useTableContext", "getIsSomeRowsSelected", "getIsAllRowsSelected", "toggleAllRowsSelected", "switch", "enableSorting", "icon", "on", "off", "IconOn", "Icon", "Check", "IconOff", "X", "getSize", "display", "code", "JSON", "stringify"]
|
|
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/ColumnSettingsForm.tsx":{"bytes":23567,"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/hooks/useColumnSorting.ts":{"bytes":5080,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/components/ColumnMenu.tsx":{"bytes":18609,"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":"packages/ui/react-ui-table/src/components/ColumnSettingsForm.tsx","kind":"import-statement","original":"./ColumnSettingsForm"},{"path":"packages/ui/react-ui-table/src/components/hooks/useColumnSorting.ts","kind":"import-statement","original":"./hooks/useColumnSorting"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableContext.tsx":{"bytes":3140,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/theme.ts":{"bytes":10262,"imports":[{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/components/Cell/Cell.tsx":{"bytes":4842,"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":8051,"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":4638,"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":7863,"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/hooks/usePinLastRow.ts":{"bytes":3993,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/Table.tsx":{"bytes":32122,"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/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","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"},{"path":"packages/ui/react-ui-table/src/components/hooks/usePinLastRow.ts","kind":"import-statement","original":"../hooks/usePinLastRow"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/props.ts":{"bytes":3075,"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":11696,"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":51734,"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/log","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":99128},"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":"@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":"react","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/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","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":"react","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":"react","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/log","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","ColumnSettingsPanel","MemoizedVirtualisedTableContent","SortIndicator","Table","createColumnBuilder","currentRow","flushPadding","gridCellFocusRing","groupTh","headPadding","selectedRow","tableRoot","tbodyRoot","tbodyTr","tdContent","tdRoot","textPadding","tfootRoot","tfootTh","tfootTr","theadResizeRoot","theadRoot","theadTh","theadTr","translations"],"entryPoint":"packages/ui/react-ui-table/src/index.ts","inputs":{"packages/ui/react-ui-table/src/components/ColumnMenu.tsx":{"bytesInOutput":5303},"packages/ui/react-ui-table/src/components/ColumnSettingsForm.tsx":{"bytesInOutput":6544},"packages/ui/react-ui-table/src/translations.ts":{"bytesInOutput":611},"packages/ui/react-ui-table/src/components/hooks/useColumnSorting.ts":{"bytesInOutput":1082},"packages/ui/react-ui-table/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/components/Table/Table.tsx":{"bytesInOutput":8325},"packages/ui/react-ui-table/src/components/Table/TableBody.tsx":{"bytesInOutput":1825},"packages/ui/react-ui-table/src/components/Table/TableContext.tsx":{"bytesInOutput":358},"packages/ui/react-ui-table/src/theme.ts":{"bytesInOutput":2205},"packages/ui/react-ui-table/src/components/Cell/Cell.tsx":{"bytesInOutput":973},"packages/ui/react-ui-table/src/components/Table/TableFooter.tsx":{"bytesInOutput":1015},"packages/ui/react-ui-table/src/components/Table/TableHead.tsx":{"bytesInOutput":1739},"packages/ui/react-ui-table/src/components/hooks/usePinLastRow.ts":{"bytesInOutput":896},"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":12651}},"bytes":48262}}}
|
|
1
|
+
{"inputs":{"packages/ui/react-ui-table/src/translations.ts":{"bytes":2343,"imports":[],"format":"esm"},"packages/ui/react-ui-table/src/components/ColumnSettingsForm.tsx":{"bytes":23567,"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/hooks/useColumnSorting.ts":{"bytes":5080,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/components/ColumnMenu.tsx":{"bytes":18609,"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":"packages/ui/react-ui-table/src/components/ColumnSettingsForm.tsx","kind":"import-statement","original":"./ColumnSettingsForm"},{"path":"packages/ui/react-ui-table/src/components/hooks/useColumnSorting.ts","kind":"import-statement","original":"./hooks/useColumnSorting"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/TableContext.tsx":{"bytes":3140,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/theme.ts":{"bytes":10262,"imports":[{"path":"@dxos/react-ui-theme","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/components/Cell/Cell.tsx":{"bytes":4842,"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":8051,"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":4638,"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":7863,"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/hooks/usePinLastRow.ts":{"bytes":3993,"imports":[{"path":"react","kind":"import-statement","external":true}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/Table.tsx":{"bytes":32122,"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/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","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"},{"path":"packages/ui/react-ui-table/src/components/hooks/usePinLastRow.ts","kind":"import-statement","original":"../hooks/usePinLastRow"}],"format":"esm"},"packages/ui/react-ui-table/src/components/Table/props.ts":{"bytes":3075,"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":11696,"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":54314,"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/log","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":100324},"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":"@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":"react","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/log","kind":"import-statement","external":true},{"path":"@dxos/react-ui","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":"react","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":"react","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/log","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","ColumnSettingsPanel","MemoizedVirtualisedTableContent","SortIndicator","Table","createColumnBuilder","currentRow","flushPadding","gridCellFocusRing","groupTh","headPadding","selectedRow","tableRoot","tbodyRoot","tbodyTr","tdContent","tdRoot","textPadding","tfootRoot","tfootTh","tfootTr","theadResizeRoot","theadRoot","theadTh","theadTr","translations"],"entryPoint":"packages/ui/react-ui-table/src/index.ts","inputs":{"packages/ui/react-ui-table/src/components/ColumnMenu.tsx":{"bytesInOutput":5303},"packages/ui/react-ui-table/src/components/ColumnSettingsForm.tsx":{"bytesInOutput":6544},"packages/ui/react-ui-table/src/translations.ts":{"bytesInOutput":611},"packages/ui/react-ui-table/src/components/hooks/useColumnSorting.ts":{"bytesInOutput":1082},"packages/ui/react-ui-table/src/components/index.ts":{"bytesInOutput":0},"packages/ui/react-ui-table/src/components/Table/Table.tsx":{"bytesInOutput":8325},"packages/ui/react-ui-table/src/components/Table/TableBody.tsx":{"bytesInOutput":1825},"packages/ui/react-ui-table/src/components/Table/TableContext.tsx":{"bytesInOutput":358},"packages/ui/react-ui-table/src/theme.ts":{"bytesInOutput":2205},"packages/ui/react-ui-table/src/components/Cell/Cell.tsx":{"bytesInOutput":973},"packages/ui/react-ui-table/src/components/Table/TableFooter.tsx":{"bytesInOutput":1015},"packages/ui/react-ui-table/src/components/Table/TableHead.tsx":{"bytesInOutput":1739},"packages/ui/react-ui-table/src/components/hooks/usePinLastRow.ts":{"bytesInOutput":896},"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":13425}},"bytes":49036}}}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import '@dxosTheme';
|
|
2
|
+
declare const _default: {
|
|
3
|
+
title: string;
|
|
4
|
+
args: {};
|
|
5
|
+
decorators: import("@storybook/react").Decorator[];
|
|
6
|
+
};
|
|
7
|
+
export default _default;
|
|
8
|
+
export declare const SchemaTable: {
|
|
9
|
+
render: () => JSX.Element;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=SchemaToTable.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaToTable.stories.d.ts","sourceRoot":"","sources":["../../../../../src/components/schema/SchemaToTable.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,YAAY,CAAC;;;;;;AAapB,wBAWE;AAuBF,eAAO,MAAM,WAAW;;CAoBvB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type * as S from '@effect/schema/Schema';
|
|
2
|
+
import { type ColumnType } from '../../schema';
|
|
3
|
+
export type ClassifiedColumnType = ColumnType | 'display';
|
|
4
|
+
export declare const classifySchemaProperties: (schema: S.Schema<any, any>) => [string, ClassifiedColumnType][];
|
|
5
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../../src/components/schema/schema.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,SAAS,CAAC;AA4D1D,eAAO,MAAM,wBAAwB,WAAY,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,qCA0BlE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.test.d.ts","sourceRoot":"","sources":["../../../../../src/components/schema/schema.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaToColumns.d.ts","sourceRoot":"","sources":["../../../../../src/components/schema/schemaToColumns.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAKvD,eAAO,MAAM,kBAAkB,6DAuC9B,CAAC"}
|
|
@@ -83,5 +83,9 @@ export declare class ColumnBuilder<TData extends RowData> {
|
|
|
83
83
|
* Icon based on boolean value.
|
|
84
84
|
*/
|
|
85
85
|
icon({ label, size, on, off, ...props }?: IconColumnOptions<TData>): Partial<ColumnDef<TData, boolean>>;
|
|
86
|
+
/**
|
|
87
|
+
* This display column type is for nested/unhandled data to appear as JSON.
|
|
88
|
+
*/
|
|
89
|
+
display({ label, classNames, ...props }?: KeyColumnOptions<TData>): Partial<ColumnDef<TData, PublicKey>>;
|
|
86
90
|
}
|
|
87
91
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,IAAI,EAAK,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,gBAAgB,CAAC;AAOrE,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,OAAO,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1G,eAAO,MAAM,mBAAmB;;;CAG9B,CAAC;AAGH;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG;IACjF,IAAI,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACpD,CAAC;AAGF,MAAM,MAAM,oBAAoB,CAAC,KAAK,SAAS,OAAO,IAAI;IACxD,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG;IACzF,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;AAC/F,MAAM,MAAM,sBAAsB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;AAElG,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;AAEhG,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG;IACzF,EAAE,CAAC,EAAE;QACH,IAAI,CAAC,EAAE,IAAI,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,IAAI,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC;AA+KF;;GAEG;AACH,qBAAa,aAAa,CAAC,KAAK,SAAS,OAAO;IAC9C;;OAEG;IACH,QAAQ,CAAC,EACP,KAAK,EACL,UAAU,EACV,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,qBAAqB,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAuBhE;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAE,mBAAmB,CAAC,KAAK,CAAM,GAAG,OAAO,CACzF,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CACzB;IA2BD;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAE,mBAAmB,CAAC,KAAK,CAAM,GAAG,OAAO,CAC1G,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CACzB;IAiBD;;OAEG;IAEH,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,GAAE,iBAAiB,CAAC,KAAK,CAAM,GAAG,OAAO,CACzG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CACvB;IA4BD;;OAEG;IACH,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,GAAE,gBAAgB,CAAC,KAAK,CAAM,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAyCjH;;OAEG;IACH,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAgB,EAAE,GAAE,sBAAsB,CAAC,KAAK,CAAM,GAAG,UAAU,CACnG,YAAY,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAC/B,CAAC,CAAC,CAAC;IA2BJ;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAE,mBAAmB,CAAC,KAAK,CAAM,GAAG,OAAO,CACzF,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAC1B;IAaD;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,GAAE,iBAAiB,CAAC,KAAK,CAAM,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,IAAI,EAAK,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,YAAY,EAElB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,KAAK,cAAc,EAAkB,MAAM,gBAAgB,CAAC;AAOrE,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,OAAO,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAE1G,eAAO,MAAM,mBAAmB;;;CAG9B,CAAC;AAGH;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,KAAK,EAAE,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG;IACjF,IAAI,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CACpD,CAAC;AAGF,MAAM,MAAM,oBAAoB,CAAC,KAAK,SAAS,OAAO,IAAI;IACxD,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAC7B,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG;IACzF,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;AAC/F,MAAM,MAAM,sBAAsB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;AAElG,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG;IAC1F,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;AAEhG,MAAM,MAAM,iBAAiB,CAAC,KAAK,SAAS,OAAO,IAAI,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG;IACzF,EAAE,CAAC,EAAE;QACH,IAAI,CAAC,EAAE,IAAI,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,IAAI,CAAC,EAAE,IAAI,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH,CAAC;AA+KF;;GAEG;AACH,qBAAa,aAAa,CAAC,KAAK,SAAS,OAAO;IAC9C;;OAEG;IACH,QAAQ,CAAC,EACP,KAAK,EACL,UAAU,EACV,KAAK,EACL,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,qBAAqB,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAuBhE;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAE,mBAAmB,CAAC,KAAK,CAAM,GAAG,OAAO,CACzF,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CACzB;IA2BD;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAE,mBAAmB,CAAC,KAAK,CAAM,GAAG,OAAO,CAC1G,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CACzB;IAiBD;;OAEG;IAEH,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,GAAE,iBAAiB,CAAC,KAAK,CAAM,GAAG,OAAO,CACzG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CACvB;IA4BD;;OAEG;IACH,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,GAAE,gBAAgB,CAAC,KAAK,CAAM,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAyCjH;;OAEG;IACH,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAgB,EAAE,GAAE,sBAAsB,CAAC,KAAK,CAAM,GAAG,UAAU,CACnG,YAAY,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAC/B,CAAC,CAAC,CAAC;IA2BJ;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAE,mBAAmB,CAAC,KAAK,CAAM,GAAG,OAAO,CACzF,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAC1B;IAaD;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,GAAE,iBAAiB,CAAC,KAAK,CAAM,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAsB3G;;OAEG;IACH,OAAO,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,GAAE,gBAAgB,CAAC,KAAK,CAAM,GAAG,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;CAkB7G"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/react-ui-table",
|
|
3
|
-
"version": "0.4.10-main.
|
|
3
|
+
"version": "0.4.10-main.fd4f2a3",
|
|
4
4
|
"description": "A table component.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -16,34 +16,37 @@
|
|
|
16
16
|
"src"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
+
"@effect/schema": "0.64.7",
|
|
19
20
|
"@fluentui/react-tabster": "^9.19.0",
|
|
20
21
|
"@radix-ui/react-context": "^1.0.0",
|
|
21
22
|
"@radix-ui/react-use-controllable-state": "^1.0.0",
|
|
22
23
|
"@tanstack/react-table": "^8.13.2",
|
|
23
24
|
"@tanstack/react-virtual": "^3.0.1",
|
|
24
25
|
"date-fns": "^3.3.1",
|
|
25
|
-
"
|
|
26
|
-
"@dxos/
|
|
27
|
-
"@dxos/invariant": "0.4.10-main.
|
|
28
|
-
"@dxos/
|
|
29
|
-
"@dxos/
|
|
30
|
-
"@dxos/react-ui
|
|
31
|
-
"@dxos/react-ui-
|
|
32
|
-
"@dxos/react-ui-
|
|
33
|
-
"@dxos/
|
|
26
|
+
"effect": "2.4.9",
|
|
27
|
+
"@dxos/async": "0.4.10-main.fd4f2a3",
|
|
28
|
+
"@dxos/invariant": "0.4.10-main.fd4f2a3",
|
|
29
|
+
"@dxos/keys": "0.4.10-main.fd4f2a3",
|
|
30
|
+
"@dxos/log": "0.4.10-main.fd4f2a3",
|
|
31
|
+
"@dxos/react-ui": "0.4.10-main.fd4f2a3",
|
|
32
|
+
"@dxos/react-ui-searchlist": "0.4.10-main.fd4f2a3",
|
|
33
|
+
"@dxos/react-ui-theme": "0.4.10-main.fd4f2a3",
|
|
34
|
+
"@dxos/react-ui-types": "0.4.10-main.fd4f2a3",
|
|
35
|
+
"@dxos/util": "0.4.10-main.fd4f2a3"
|
|
34
36
|
},
|
|
35
37
|
"devDependencies": {
|
|
36
38
|
"@phosphor-icons/react": "^2.0.5",
|
|
37
39
|
"@types/react": "^18.0.21",
|
|
38
40
|
"@types/react-dom": "^18.0.6",
|
|
41
|
+
"fast-check": "^3.15.1",
|
|
39
42
|
"react": "^18.2.0",
|
|
40
43
|
"react-dom": "^18.2.0",
|
|
41
|
-
"vite": "^5.1.
|
|
44
|
+
"vite": "^5.1.7",
|
|
42
45
|
"vite-plugin-turbosnap": "^1.0.2",
|
|
43
|
-
"@dxos/echo-schema": "0.4.10-main.
|
|
44
|
-
"@dxos/react-ui-theme": "0.4.10-main.
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
46
|
+
"@dxos/echo-schema": "0.4.10-main.fd4f2a3",
|
|
47
|
+
"@dxos/react-ui-theme": "0.4.10-main.fd4f2a3",
|
|
48
|
+
"@dxos/random": "0.4.10-main.fd4f2a3",
|
|
49
|
+
"@dxos/storybook-utils": "0.4.10-main.fd4f2a3"
|
|
47
50
|
},
|
|
48
51
|
"peerDependencies": {
|
|
49
52
|
"@phosphor-icons/react": "^2.0.5",
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import '@dxosTheme';
|
|
6
|
+
|
|
7
|
+
import * as Arbitrary from '@effect/schema/Arbitrary';
|
|
8
|
+
import * as S from '@effect/schema/Schema';
|
|
9
|
+
import * as fc from 'fast-check';
|
|
10
|
+
import React, { useRef } from 'react';
|
|
11
|
+
|
|
12
|
+
import { DensityProvider } from '@dxos/react-ui';
|
|
13
|
+
import { withTheme } from '@dxos/storybook-utils';
|
|
14
|
+
|
|
15
|
+
import { schemaToColumnDefs } from './schemaToColumns';
|
|
16
|
+
import { Table } from '../Table/Table';
|
|
17
|
+
|
|
18
|
+
export default {
|
|
19
|
+
title: 'react-ui-table/SchemaTable',
|
|
20
|
+
args: {},
|
|
21
|
+
decorators: [
|
|
22
|
+
withTheme,
|
|
23
|
+
(Story: any) => (
|
|
24
|
+
<DensityProvider density='fine'>
|
|
25
|
+
<Story />
|
|
26
|
+
</DensityProvider>
|
|
27
|
+
),
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const exampleSchema = S.struct({
|
|
32
|
+
field1: S.string,
|
|
33
|
+
field2: S.number,
|
|
34
|
+
field3: S.Date,
|
|
35
|
+
field4: S.optional(S.string.pipe(S.length(10))),
|
|
36
|
+
field5: S.optional(
|
|
37
|
+
S.struct({
|
|
38
|
+
innerField1: S.string,
|
|
39
|
+
innerField2: S.number,
|
|
40
|
+
}),
|
|
41
|
+
),
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
type ExampleSchema = S.Schema.Type<typeof exampleSchema>;
|
|
45
|
+
|
|
46
|
+
const columns = schemaToColumnDefs(exampleSchema);
|
|
47
|
+
|
|
48
|
+
const exampleSchemaArbitrary = Arbitrary.make(exampleSchema)(fc);
|
|
49
|
+
|
|
50
|
+
const items = fc.sample(exampleSchemaArbitrary, 10);
|
|
51
|
+
|
|
52
|
+
export const SchemaTable = {
|
|
53
|
+
render: () => {
|
|
54
|
+
const containerRef = useRef<HTMLDivElement | null>(null);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<div ref={containerRef} className='fixed inset-0 overflow-auto'>
|
|
58
|
+
<Table<ExampleSchema>
|
|
59
|
+
role='grid'
|
|
60
|
+
rowsSelectable='multi'
|
|
61
|
+
keyAccessor={(row) => JSON.stringify(row)}
|
|
62
|
+
columns={columns}
|
|
63
|
+
data={items}
|
|
64
|
+
fullWidth
|
|
65
|
+
stickyHeader
|
|
66
|
+
border
|
|
67
|
+
getScrollElement={() => containerRef.current}
|
|
68
|
+
/>
|
|
69
|
+
</div>
|
|
70
|
+
);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as S from '@effect/schema/Schema';
|
|
6
|
+
import { expect } from 'chai';
|
|
7
|
+
|
|
8
|
+
import { describe, test } from '@dxos/test';
|
|
9
|
+
|
|
10
|
+
import { classifySchemaProperties } from './schema';
|
|
11
|
+
|
|
12
|
+
describe('schema->column-type', () => {
|
|
13
|
+
test('basic', () => {
|
|
14
|
+
const simpleSchema = S.struct({
|
|
15
|
+
field1: S.string,
|
|
16
|
+
field2: S.number,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
const columns = classifySchemaProperties(simpleSchema);
|
|
20
|
+
|
|
21
|
+
expect(columns).to.deep.equal([
|
|
22
|
+
['field1', 'string'],
|
|
23
|
+
['field2', 'number'],
|
|
24
|
+
]);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('optional properties', () => {
|
|
28
|
+
const simpleSchema = S.struct({
|
|
29
|
+
field1: S.optional(S.string),
|
|
30
|
+
field2: S.optional(S.number),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const columns = classifySchemaProperties(simpleSchema);
|
|
34
|
+
|
|
35
|
+
expect(columns).to.deep.equal([
|
|
36
|
+
['field1', 'string'],
|
|
37
|
+
['field2', 'number'],
|
|
38
|
+
]);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test('dates', () => {
|
|
42
|
+
const simpleSchema = S.struct({
|
|
43
|
+
field1: S.Date,
|
|
44
|
+
field2: S.optional(S.Date),
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const columns = classifySchemaProperties(simpleSchema);
|
|
48
|
+
|
|
49
|
+
expect(columns).to.deep.equal([
|
|
50
|
+
['field1', 'date'],
|
|
51
|
+
['field2', 'date'],
|
|
52
|
+
]);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('Piped validators', () => {
|
|
56
|
+
const simpleSchema = S.struct({
|
|
57
|
+
name: S.optional(S.string.pipe(S.nonEmpty(), S.maxLength(10))),
|
|
58
|
+
age: S.number.pipe(S.negative()),
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
const columns = classifySchemaProperties(simpleSchema);
|
|
62
|
+
|
|
63
|
+
expect(columns).to.deep.equal([
|
|
64
|
+
['name', 'string'],
|
|
65
|
+
['age', 'number'],
|
|
66
|
+
]);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('nested schema', () => {
|
|
70
|
+
const simpleSchema = S.struct({
|
|
71
|
+
name: S.string,
|
|
72
|
+
nested: S.struct({
|
|
73
|
+
age: S.number,
|
|
74
|
+
}),
|
|
75
|
+
someUnion: S.union(S.string, S.number),
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const columns = classifySchemaProperties(simpleSchema);
|
|
79
|
+
|
|
80
|
+
expect(columns).to.deep.equal([
|
|
81
|
+
['name', 'string'],
|
|
82
|
+
['nested.age', 'number'],
|
|
83
|
+
['someUnion', 'display'],
|
|
84
|
+
]);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test('deeply nested schema', () => {
|
|
88
|
+
const simpleSchema = S.struct({
|
|
89
|
+
name: S.string,
|
|
90
|
+
nested: S.struct({
|
|
91
|
+
age: S.number,
|
|
92
|
+
deeplyNested: S.struct({
|
|
93
|
+
height: S.number,
|
|
94
|
+
}),
|
|
95
|
+
}),
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const columns = classifySchemaProperties(simpleSchema);
|
|
99
|
+
|
|
100
|
+
expect(columns).to.deep.equal([
|
|
101
|
+
['name', 'string'],
|
|
102
|
+
['nested.age', 'number'],
|
|
103
|
+
['nested.deeplyNested.height', 'number'],
|
|
104
|
+
]);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test('even more deeply nested schema with optionals', () => {
|
|
108
|
+
const simpleSchema = S.struct({
|
|
109
|
+
name: S.string,
|
|
110
|
+
nested: S.struct({
|
|
111
|
+
age: S.number,
|
|
112
|
+
deeplyNested: S.optional(
|
|
113
|
+
S.struct({
|
|
114
|
+
height: S.optional(S.number),
|
|
115
|
+
}),
|
|
116
|
+
),
|
|
117
|
+
}),
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const columns = classifySchemaProperties(simpleSchema);
|
|
121
|
+
|
|
122
|
+
expect(columns).to.deep.equal([
|
|
123
|
+
['name', 'string'],
|
|
124
|
+
['nested.age', 'number'],
|
|
125
|
+
['nested.deeplyNested.height', 'number'],
|
|
126
|
+
]);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('multiple-nested schemata as sibblings', () => {
|
|
130
|
+
const simpleSchema = S.struct({
|
|
131
|
+
name: S.string,
|
|
132
|
+
nested: S.struct({
|
|
133
|
+
age: S.number,
|
|
134
|
+
}),
|
|
135
|
+
nested2: S.struct({
|
|
136
|
+
height: S.number,
|
|
137
|
+
}),
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const columns = classifySchemaProperties(simpleSchema);
|
|
141
|
+
|
|
142
|
+
expect(columns).to.deep.equal([
|
|
143
|
+
['name', 'string'],
|
|
144
|
+
['nested.age', 'number'],
|
|
145
|
+
['nested2.height', 'number'],
|
|
146
|
+
]);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { AST } from '@effect/schema';
|
|
6
|
+
import type * as S from '@effect/schema/Schema';
|
|
7
|
+
|
|
8
|
+
import { type ColumnType } from '../../schema';
|
|
9
|
+
|
|
10
|
+
export type ClassifiedColumnType = ColumnType | 'display';
|
|
11
|
+
|
|
12
|
+
const isOptionalUnion = (prop: AST.PropertySignature) => AST.isUnion(prop.type) && prop.isOptional;
|
|
13
|
+
|
|
14
|
+
const unwrapOptionProperty = (prop: AST.PropertySignature) => {
|
|
15
|
+
if (!isOptionalUnion(prop)) {
|
|
16
|
+
throw new Error('Not an optional property');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (!AST.isUnion(prop.type)) {
|
|
20
|
+
throw new Error('Not a union type');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const [type, _undefinedCase] = prop.type.types;
|
|
24
|
+
|
|
25
|
+
return type;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const typeToColumn = (type: AST.AST): ClassifiedColumnType => {
|
|
29
|
+
if (AST.isStringKeyword(type)) {
|
|
30
|
+
return 'string';
|
|
31
|
+
} else if (AST.isNumberKeyword(type)) {
|
|
32
|
+
return 'number';
|
|
33
|
+
} else if (AST.isBooleanKeyword(type)) {
|
|
34
|
+
return 'boolean';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (AST.isRefinement(type)) {
|
|
38
|
+
return typeToColumn(type.from);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// TODO(zan): How should we be thinking about transformations?
|
|
42
|
+
// - Which of these are we storing in the database?
|
|
43
|
+
// - For types that aren't the 'DateFromString' transformation, should we be using the 'from' or 'to' type?
|
|
44
|
+
|
|
45
|
+
if (AST.isTransform(type)) {
|
|
46
|
+
const identifier = AST.getIdentifierAnnotation(type);
|
|
47
|
+
|
|
48
|
+
if (identifier._tag === 'Some') {
|
|
49
|
+
if (identifier.value === 'DateFromString') {
|
|
50
|
+
return 'date';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return 'display';
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const propertyToColumn = (property: AST.PropertySignature): ClassifiedColumnType => {
|
|
59
|
+
let type = property.type;
|
|
60
|
+
|
|
61
|
+
if (property.isOptional) {
|
|
62
|
+
type = unwrapOptionProperty(property);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return typeToColumn(type);
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const isStruct = (node: AST.AST) => AST.isTypeLiteral(node);
|
|
69
|
+
|
|
70
|
+
export const classifySchemaProperties = (schema: S.Schema<any, any>) => {
|
|
71
|
+
const recurse = (node: AST.AST, path: string[], acc: [string, ClassifiedColumnType][]) => {
|
|
72
|
+
const properties = AST.getPropertySignatures(node);
|
|
73
|
+
|
|
74
|
+
properties.forEach((prop) => {
|
|
75
|
+
const propName = prop.name.toString();
|
|
76
|
+
|
|
77
|
+
if (prop.isOptional) {
|
|
78
|
+
const unwrappedAst = unwrapOptionProperty(prop);
|
|
79
|
+
|
|
80
|
+
if (isStruct(unwrappedAst)) {
|
|
81
|
+
return recurse(unwrappedAst, [...path, propName], acc);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (isStruct(prop.type)) {
|
|
86
|
+
recurse(prop.type, [...path, propName], acc);
|
|
87
|
+
} else {
|
|
88
|
+
acc.push([path.concat(propName).join('.'), propertyToColumn(prop)]);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
return acc;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
return recurse(schema.ast, [], []);
|
|
96
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as S from '@effect/schema/Schema';
|
|
6
|
+
import { type ColumnDef } from '@tanstack/react-table';
|
|
7
|
+
|
|
8
|
+
import { classifySchemaProperties } from './schema';
|
|
9
|
+
import { createColumnBuilder } from '../../helpers';
|
|
10
|
+
|
|
11
|
+
export const schemaToColumnDefs = <T>(schema: S.Schema<T, any>): ColumnDef<T, any>[] => {
|
|
12
|
+
const classified = classifySchemaProperties(schema);
|
|
13
|
+
|
|
14
|
+
const { helper, builder } = createColumnBuilder<T>();
|
|
15
|
+
|
|
16
|
+
return classified.map(([name, type]) => {
|
|
17
|
+
const propertyKey = name.toString();
|
|
18
|
+
|
|
19
|
+
let column: Partial<ColumnDef<any, any>> | undefined;
|
|
20
|
+
|
|
21
|
+
switch (type) {
|
|
22
|
+
case 'string': {
|
|
23
|
+
column = builder.string({ label: propertyKey });
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
case 'number': {
|
|
27
|
+
column = builder.number({ label: propertyKey });
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
case 'boolean': {
|
|
31
|
+
column = builder.switch({ label: propertyKey });
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
case 'date': {
|
|
35
|
+
column = builder.date({ label: propertyKey });
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case 'display': {
|
|
39
|
+
column = builder.display({ label: propertyKey, id: propertyKey });
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (column === undefined) {
|
|
45
|
+
throw new Error(`Unhandled column type: ${type}`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return helper.accessor(propertyKey as any, column);
|
|
49
|
+
});
|
|
50
|
+
};
|
package/src/helpers.tsx
CHANGED
|
@@ -498,4 +498,26 @@ export class ColumnBuilder<TData extends RowData> {
|
|
|
498
498
|
...props,
|
|
499
499
|
};
|
|
500
500
|
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* This display column type is for nested/unhandled data to appear as JSON.
|
|
504
|
+
*/
|
|
505
|
+
display({ label, classNames, ...props }: KeyColumnOptions<TData> = {}): Partial<ColumnDef<TData, PublicKey>> {
|
|
506
|
+
return {
|
|
507
|
+
size: 120,
|
|
508
|
+
minSize: 120,
|
|
509
|
+
header: (cell) => label ?? cell.header.id,
|
|
510
|
+
cell: (cell) => {
|
|
511
|
+
const value = cell.getValue();
|
|
512
|
+
|
|
513
|
+
return (
|
|
514
|
+
<div className='overflow-scroll'>
|
|
515
|
+
<code className='text-xs'>{JSON.stringify(value)}</code>
|
|
516
|
+
</div>
|
|
517
|
+
);
|
|
518
|
+
},
|
|
519
|
+
...props,
|
|
520
|
+
meta: { ...props.meta, cell: { ...props.meta?.cell, classNames: ['font-mono', textPadding, classNames] } },
|
|
521
|
+
};
|
|
522
|
+
}
|
|
501
523
|
}
|