@dxos/react-ui-table 0.9.0 → 0.9.1-staging.ee54ba693a

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.
Files changed (68) hide show
  1. package/dist/lib/browser/{chunk-4KOQTPFC.mjs → chunk-K4J2CKTZ.mjs} +73 -24
  2. package/dist/lib/browser/chunk-K4J2CKTZ.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-62PYOJPY.mjs → chunk-VV3P3ADH.mjs} +5 -5
  4. package/dist/lib/browser/chunk-VV3P3ADH.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +76 -10
  6. package/dist/lib/browser/index.mjs.map +3 -3
  7. package/dist/lib/browser/meta.json +1 -1
  8. package/dist/lib/browser/testing/index.mjs +2 -2
  9. package/dist/lib/browser/translations.mjs +5 -2
  10. package/dist/lib/browser/translations.mjs.map +2 -2
  11. package/dist/lib/browser/types/index.mjs +1 -1
  12. package/dist/lib/node-esm/{chunk-KOSV2J5N.mjs → chunk-E6V274ZW.mjs} +73 -24
  13. package/dist/lib/node-esm/chunk-E6V274ZW.mjs.map +7 -0
  14. package/dist/lib/node-esm/{chunk-7LMOZUTS.mjs → chunk-RPEWNOZZ.mjs} +5 -5
  15. package/dist/lib/node-esm/chunk-RPEWNOZZ.mjs.map +7 -0
  16. package/dist/lib/node-esm/index.mjs +76 -10
  17. package/dist/lib/node-esm/index.mjs.map +3 -3
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/testing/index.mjs +2 -2
  20. package/dist/lib/node-esm/translations.mjs +5 -2
  21. package/dist/lib/node-esm/translations.mjs.map +2 -2
  22. package/dist/lib/node-esm/types/index.mjs +1 -1
  23. package/dist/types/src/components/Table/DynamicTable.stories.d.ts +4 -1
  24. package/dist/types/src/components/Table/DynamicTable.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/Table/Relations.stories.d.ts +4 -1
  26. package/dist/types/src/components/Table/Relations.stories.d.ts.map +1 -1
  27. package/dist/types/src/components/Table/Table.d.ts +1 -0
  28. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  29. package/dist/types/src/components/Table/Table.stories.d.ts +6 -3
  30. package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Table/TableToolbar.d.ts +3 -1
  32. package/dist/types/src/components/Table/TableToolbar.d.ts.map +1 -1
  33. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts +7 -4
  34. package/dist/types/src/components/TableCellEditor/TableCellEditor.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/testing.d.ts +2 -3
  36. package/dist/types/src/components/testing.d.ts.map +1 -1
  37. package/dist/types/src/hooks/useTableModel.d.ts.map +1 -1
  38. package/dist/types/src/model/index.d.ts +1 -0
  39. package/dist/types/src/model/index.d.ts.map +1 -1
  40. package/dist/types/src/model/table-model.d.ts +15 -8
  41. package/dist/types/src/model/table-model.d.ts.map +1 -1
  42. package/dist/types/src/model/table-presentation.d.ts.map +1 -1
  43. package/dist/types/src/model/table-view-state.d.ts +19 -0
  44. package/dist/types/src/model/table-view-state.d.ts.map +1 -0
  45. package/dist/types/src/translations.d.ts +4 -1
  46. package/dist/types/src/translations.d.ts.map +1 -1
  47. package/dist/types/src/types/Table.d.ts +3 -11
  48. package/dist/types/src/types/Table.d.ts.map +1 -1
  49. package/dist/types/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +43 -44
  51. package/src/components/Table/Table.stories.tsx +3 -3
  52. package/src/components/Table/Table.tsx +1 -0
  53. package/src/components/Table/TableToolbar.tsx +38 -5
  54. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +2 -2
  55. package/src/components/testing.ts +8 -6
  56. package/src/hooks/useTableModel.ts +7 -6
  57. package/src/model/index.ts +1 -0
  58. package/src/model/table-model.test.ts +93 -5
  59. package/src/model/table-model.ts +36 -20
  60. package/src/model/table-presentation.test.ts +6 -4
  61. package/src/model/table-presentation.ts +34 -4
  62. package/src/model/table-view-state.ts +30 -0
  63. package/src/translations.ts +4 -1
  64. package/src/types/Table.ts +17 -19
  65. package/dist/lib/browser/chunk-4KOQTPFC.mjs.map +0 -7
  66. package/dist/lib/browser/chunk-62PYOJPY.mjs.map +0 -7
  67. package/dist/lib/node-esm/chunk-7LMOZUTS.mjs.map +0 -7
  68. package/dist/lib/node-esm/chunk-KOSV2J5N.mjs.map +0 -7
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/components/Table/Table.tsx", "../../../src/components/Table/TableContent.tsx", "../../../src/util/dynamic-table.ts", "../../../src/util/signals.ts", "../../../src/util/schema.ts", "../../../src/model/modal-controller.ts", "../../../src/components/TableCellEditor/TableCellEditor.tsx", "../../../src/components/TableCellEditor/CellValidationMessage.tsx", "../../../src/components/TableCellEditor/FormCellEditor.tsx", "../../../src/components/Table/ColumnActionsMenu.tsx", "../../../src/components/Table/ColumnSettings.tsx", "../../../src/components/Table/RowActionsMenu.tsx", "../../../src/components/Table/TableToolbar.tsx", "../../../src/components/Table/DynamicTable.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, type RefObject, forwardRef, useImperativeHandle, useRef } from 'react';\n\nimport { type DxGridAxisMeta, type DxGridPosition } from '@dxos/react-ui-grid';\n\nimport { type InsertRowResult } from '../../model';\nimport { TableContent } from './TableContent';\nimport { TableToolbar } from './TableToolbar';\n\nconst columnDefault = { grid: { minSize: 80, maxSize: 640 } };\nconst rowDefault = { frozenRowsStart: { readonly: true, focusUnfurl: false } };\nconst emptyColumnMeta = Atom.make<DxGridAxisMeta>({ grid: {} });\n\n//\n// Context\n//\n\ntype TableContextValue = {\n /** Mutable ref populated by Content so Root can expose the controller. */\n controllerRef: RefObject<TableController>;\n};\n\nconst [TableContextProvider, useTableContext] = createContext<TableContextValue>('Table');\n\n//\n// Controller\n//\n\ntype TableController = {\n update?: (cell?: DxGridPosition) => void;\n handleInsertRowResult?: (insertRowResult?: InsertRowResult) => void;\n};\n\n//\n// Root\n//\n\nconst TABLE_ROOT_NAME = 'Table.Root';\n\ntype TableRootProps = PropsWithChildren;\n\nconst TableRoot = forwardRef<TableController, TableRootProps>(({ children }, forwardedRef) => {\n const controllerRef = useRef<TableController>({});\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n update: (cell) => controllerRef.current?.update?.(cell),\n handleInsertRowResult: (result) => controllerRef.current?.handleInsertRowResult?.(result),\n }),\n [],\n );\n\n return <TableContextProvider controllerRef={controllerRef}>{children}</TableContextProvider>;\n});\n\nTableRoot.displayName = TABLE_ROOT_NAME;\n\n//\n// Table\n//\n\nexport const Table = {\n Root: TableRoot,\n Toolbar: TableToolbar,\n Content: TableContent,\n};\n\nexport type { TableController, TableRootProps };\n\nexport { useTableContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';\nimport * as String from 'effect/String';\nimport React, { type MouseEvent, type WheelEvent, useCallback, useContext, useEffect, useMemo, useState } from 'react';\n\nimport { type Type } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n type DxGridAxisMeta,\n type DxGridElement,\n type DxGridPlane,\n type DxGridPlaneRange,\n Grid,\n type GridContentProps,\n closestCell,\n gridSeparatorBlockEnd,\n gridSeparatorInlineEnd,\n} from '@dxos/react-ui-grid';\nimport { DxEditRequest } from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/ui-theme';\n\nimport { type InsertRowResult, ModalController, type TableModel, type TablePresentation } from '../../model';\nimport { tableButtons, tableControls } from '../../util';\nimport { type OnCreateHandler, type TableCellEditorProps, TableValueEditor } from '../TableCellEditor';\nimport { ColumnActionsMenu } from './ColumnActionsMenu';\nimport { ColumnSettings } from './ColumnSettings';\nimport { RowActionsMenu } from './RowActionsMenu';\nimport { TableController, useTableContext } from './Table';\n\nconst columnDefault = { grid: { minSize: 80, maxSize: 640 } };\nconst rowDefault = { frozenRowsStart: { readonly: true, focusUnfurl: false } };\nconst emptyColumnMeta = Atom.make<DxGridAxisMeta>({ grid: {} });\nconst emptyRowsAtom = Atom.make<unknown[]>([]);\nconst emptyCellUpdateAtom = Atom.make<number>(0);\n\n//\n// Content\n//\n\nconst TABLE_CONTENT_NAME = 'Table.Content';\n\nexport type TableContentProps = {\n schema?: Type.AnyEntity;\n model?: TableModel;\n presentation?: TablePresentation;\n // TODO(burdon): Factor out attention.\n ignoreAttention?: boolean;\n attendableId?: string;\n onCreate?: OnCreateHandler;\n onRowClick?: (row: any) => void;\n testId?: string;\n};\n\nexport const TableContent = composable<HTMLDivElement, TableContentProps>(\n (\n { schema, model, presentation, ignoreAttention, attendableId, onCreate, onRowClick, testId, ...props },\n forwardedRef,\n ) => {\n const registry = useContext(RegistryContext);\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n const { hasAttention } = useAttention(attendableId ?? model?.id ?? 'table');\n const modals = useMemo(() => new ModalController(registry), [registry]);\n const columnMeta = useAtomValue(model?.columnMeta ?? emptyColumnMeta);\n // Subscribe to rows atom to trigger re-render when rows change.\n const rows = useAtomValue(model?.rows ?? emptyRowsAtom);\n // Subscribe to cell update counter to trigger re-render when individual cells change.\n const cellUpdateCounter = useAtomValue(model?.cellUpdate ?? emptyCellUpdateAtom);\n // Derive column count from columnMeta (reactive) with fallback.\n const columnCount = Object.keys(columnMeta.grid).length || model?.projection.getFields().length || 0;\n\n const draftRowCount = model?.getDraftRowCount() ?? 0;\n\n const frozen = useMemo(() => {\n const noActionColumn =\n model?.features.dataEditable === false &&\n model?.features.schemaEditable === false &&\n model.rowActions.length === 0;\n\n return {\n frozenRowsStart: 1,\n frozenRowsEnd: Math.max(1, draftRowCount),\n frozenColsStart: model?.features.selection.enabled ? 1 : 0,\n frozenColsEnd: noActionColumn ? 0 : 1,\n };\n }, [model, draftRowCount]);\n\n const getCells = useCallback<NonNullable<GridContentProps['getCells']>>(\n (range: DxGridPlaneRange, plane: DxGridPlane) => presentation?.getCells(range, plane) ?? {},\n [presentation],\n );\n\n useEffect(() => {\n if (!dxGrid || !presentation) {\n return;\n }\n\n dxGrid.getCells = getCells;\n }, [dxGrid, presentation, getCells]);\n\n // Trigger grid update when rows or cell values change.\n useEffect(() => {\n if (!dxGrid) {\n return;\n }\n\n dxGrid.updateCells(true);\n dxGrid.requestUpdate();\n }, [dxGrid, rows, cellUpdateCounter]);\n\n const handleInsertRowResult = useCallback(\n (insertResult?: InsertRowResult) => {\n if (insertResult === 'draft') {\n requestAnimationFrame(() => {\n dxGrid?.setFocus({ plane: 'frozenRowsEnd', col: 0, row: 0 });\n dxGrid?.refocus();\n });\n } else {\n requestAnimationFrame(() => {\n dxGrid?.setFocus({ plane: 'grid', col: 0, row: model ? model.getRowCount() - 1 : 0 });\n dxGrid?.refocus();\n });\n }\n },\n [model, dxGrid],\n );\n\n const handleSave = useCallback(() => {\n dxGrid?.updateCells(true);\n dxGrid?.requestUpdate();\n }, [dxGrid]);\n\n const handleSaveDraftRow = useCallback(\n (rowIndex = 0) => {\n if (model && dxGrid) {\n const didCommitSuccessfully = model.commitDraftRow(rowIndex);\n if (didCommitSuccessfully) {\n requestAnimationFrame(() => {\n dxGrid.scrollToEndRow();\n });\n }\n }\n },\n [model, dxGrid],\n );\n\n const handleGridClick = useCallback(\n (event: MouseEvent) => {\n const cell = closestCell(event.target as HTMLElement);\n if (cell) {\n const { row: rowIndex, plane } = cell;\n if (onRowClick) {\n if (plane === 'grid') {\n const row = model?.getRowAt(rowIndex);\n row && onRowClick(row);\n } else {\n onRowClick(cell);\n }\n }\n\n if (model?.features.selection.enabled && model?.selection.selectionMode === 'single') {\n model.selection.toggleSelectionForRowIndex(rowIndex);\n }\n }\n\n if (!modals) {\n return;\n }\n\n const buttonSelector = Object.values(tableButtons)\n .map((button) => `button[${button.attr}]`)\n .join(',');\n\n const tableButtonElement = (event.target as HTMLElement).closest(buttonSelector) as HTMLElement;\n if (tableButtonElement) {\n const button = Object.values(tableButtons).find((btn) => tableButtonElement.hasAttribute(btn.attr));\n if (!button) {\n return;\n }\n\n modals.setTrigger(tableButtonElement);\n const data = button.getData(tableButtonElement);\n switch (data.type) {\n case 'rowMenu': {\n modals.showRowMenu(data.rowIndex);\n break;\n }\n case 'columnSettings': {\n modals.showColumnMenu(data.fieldId);\n break;\n }\n case 'newColumn': {\n modals.showColumnCreator();\n break;\n }\n case 'sort': {\n model?.toggleSort(data.fieldId);\n break;\n }\n case 'saveDraftRow': {\n handleSaveDraftRow();\n break;\n }\n }\n return;\n }\n\n const controlSelector = Object.values(tableControls)\n .map((control) => `input[${control.attr}]`)\n .join(',');\n\n const controlElement = (event.target as HTMLElement).closest(controlSelector) as HTMLElement;\n if (controlElement) {\n const control = Object.values(tableControls).find((ctrl) => controlElement.hasAttribute(ctrl.attr));\n if (!control) {\n return;\n }\n\n const data = control.getData(controlElement);\n switch (data.type) {\n case 'checkbox': {\n if (data.header) {\n model?.selection.setSelection(model.selection.allRowsSelected ? 'none' : 'all');\n } else {\n model?.selection.toggleSelectionForRowIndex(data.rowIndex);\n }\n break;\n }\n case 'switch': {\n if (model) {\n model.updateCellData({ row: data.rowIndex, col: data.colIndex }, (value) => !value);\n }\n break;\n }\n }\n }\n },\n [model, modals, dxGrid],\n );\n\n const handleFocus = useCallback<NonNullable<TableCellEditorProps['onFocus']>>(\n (increment, delta, cell) => {\n if (dxGrid && model) {\n if (cell?.plane === 'grid' && cell?.row >= model.getRowCount() - 1 && increment !== 'col') {\n handleInsertRowResult(draftRowCount < 1 ? model.insertRow() : 'final');\n } else if (cell?.plane === 'frozenRowsEnd' && increment === 'row') {\n handleSaveDraftRow(cell.row);\n handleInsertRowResult(model.insertRow());\n } else {\n dxGrid.refocus(increment, delta);\n }\n }\n },\n [dxGrid, model],\n );\n\n const handleKeyDown = useCallback<NonNullable<GridContentProps['onKeyDown']>>(\n (event) => {\n if (!model?.features.dataEditable) {\n return;\n }\n\n const cell = closestCell(event.target);\n if (!model || !cell) {\n return;\n }\n\n // Handle Meta+C (Copy) and Meta+V (Paste) commands\n if (event.metaKey || event.ctrlKey) {\n switch (event.key) {\n case 'c': {\n // Copy focused cell's text content to clipboard\n try {\n const cellData = model.getCellData(cell);\n const textContent = cellData?.toString() ?? '';\n void navigator.clipboard.writeText(textContent);\n event.preventDefault();\n } catch (error) {\n log.catch(error);\n }\n break;\n }\n case 'v': {\n // Paste clipboard content to focused cell\n event.preventDefault();\n void navigator.clipboard.readText().then((clipboardText) => {\n try {\n // Attempt to set the cell's content to clipboard content\n model.setCellData(cell, String.trim(clipboardText).replace(/[\\n\\r]+/, ' '));\n handleSave();\n } catch {\n // If validation fails, emit a DxEditRequest event with initialContent from clipboard\n // TODO(thure): Should `dx-grid` expose a method like this?\n const cellElement = (event.target as HTMLElement).closest(\n '[data-dx-grid-action=\"cell\"]',\n ) as HTMLElement;\n if (cellElement) {\n const rect = cellElement.getBoundingClientRect();\n const editRequest = new DxEditRequest({\n cellIndex: `${cell.plane},${cell.col},${cell.row}`,\n cellBox: {\n insetInlineStart: rect.left,\n insetBlockStart: rect.top,\n inlineSize: rect.width,\n blockSize: rect.height,\n },\n cellElement,\n initialContent: clipboardText,\n });\n cellElement.dispatchEvent(editRequest);\n }\n }\n });\n break;\n }\n }\n }\n\n switch (event.key) {\n case 'Backspace':\n case 'Delete': {\n try {\n model.setCellData(cell, undefined);\n event.preventDefault();\n handleSave();\n } catch {\n // Delete results in a validation error; don’t prevent default so dx-grid can emit an edit request.\n }\n break;\n }\n }\n },\n [model, dxGrid, handleSave],\n );\n\n const handleAxisResize = useCallback<NonNullable<GridContentProps['onAxisResize']>>(\n (event) => {\n if (event.axis === 'col') {\n const columnIndex = parseInt(event.index, 10);\n model?.setColumnWidth(columnIndex, event.size);\n }\n },\n [model],\n );\n\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n if (!ignoreAttention && !hasAttention) {\n event.stopPropagation();\n }\n },\n [hasAttention, ignoreAttention],\n );\n\n const handleNewColumn = useCallback(() => {\n const columns = model?.getColumnCount();\n if (dxGrid && columns) {\n dxGrid.scrollToColumn(columns - 1);\n }\n }, [model, dxGrid]);\n\n // Publish controller to Root.\n const { controllerRef } = useTableContext(TABLE_CONTENT_NAME);\n controllerRef.current = useMemo<TableController>(() => {\n if (!dxGrid || !presentation) {\n return {};\n }\n\n return {\n update: (cell) => {\n if (cell) {\n dxGrid.updateIfWithinBounds(cell, true);\n } else {\n dxGrid.updateCells(true);\n dxGrid.requestUpdate();\n }\n },\n handleInsertRowResult,\n };\n }, [dxGrid, model, presentation]);\n\n if (!model || !modals) {\n return <span className='dx-attention-surface' />;\n }\n\n return (\n <div {...composableProps(props, { classNames: 'dx-container relative' })} ref={forwardedRef}>\n <Grid.Root id={model.id ?? 'table-grid'}>\n <TableValueEditor\n model={model}\n modals={modals}\n schema={schema}\n onFocus={handleFocus}\n onSave={handleSave}\n onCreate={onCreate}\n />\n <Grid.Content\n className={mx('[--dx-grid-base:var(--base-surface)]', gridSeparatorInlineEnd, gridSeparatorBlockEnd)}\n frozen={frozen}\n columns={columnMeta}\n columnDefault={columnDefault}\n rowDefault={rowDefault}\n limitRows={rows.length}\n limitColumns={columnCount}\n overscroll='trap'\n onAxisResize={handleAxisResize}\n onClick={handleGridClick}\n onKeyDownCapture={handleKeyDown}\n onWheelCapture={handleWheel}\n {...(testId && { 'data-testid': testId })}\n ref={setDxGrid}\n />\n <RowActionsMenu model={model} modals={modals} />\n <ColumnActionsMenu model={model} modals={modals} />\n <ColumnSettings model={model} modals={modals} onNewColumn={handleNewColumn} />\n </Grid.Root>\n </div>\n );\n },\n);\n\nTableContent.displayName = TABLE_CONTENT_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Registry } from '@effect-atom/atom-react';\nimport type * as Types from 'effect/Types';\n\nimport { Filter, type JsonSchema, Obj, Order, Query, type QueryAST, Ref, Type, type View } from '@dxos/echo';\nimport {\n ProjectionModel,\n type SchemaPropertyDefinition,\n ViewModel,\n createEchoChangeCallback,\n getSchemaFromJsonSchema,\n getSchemaFromPropertyDefinitions,\n} from '@dxos/schema';\n\nimport { Table } from '../types';\n\n// TODO(ZaymonFC): Upstream these extra fields to SchemaPropertyDefinition to enhance schema-tools schema creation.\ntype PropertyDisplayProps = {\n size: number;\n title: string;\n sort: QueryAST.OrderDirection;\n};\n\nexport type TablePropertyDefinition = SchemaPropertyDefinition & Partial<PropertyDisplayProps>;\n\n/**\n * @deprecated\n */\n// TODO(burdon): Remove variance.\nexport const getBaseSchema = ({\n type,\n typename,\n properties,\n jsonSchema,\n}: {\n type?: Type.AnyEntity;\n typename?: string;\n properties?: TablePropertyDefinition[];\n jsonSchema?: Types.DeepMutable<JsonSchema.JsonSchema>;\n}): { typename: string; type: Type.AnyEntity } => {\n const resolved =\n typename && properties\n ? getSchemaFromPropertyDefinitions(typename, properties)\n : (type ?? (jsonSchema ? getSchemaFromJsonSchema(jsonSchema, typename) : undefined));\n if (!resolved) {\n throw new Error('invalid properties');\n }\n\n return { typename: Type.getTypename(resolved)!, type: resolved };\n};\n\nexport const makeDynamicTable = ({\n registry,\n type,\n properties,\n}: {\n registry: Registry.Registry;\n type: Type.AnyEntity;\n properties?: TablePropertyDefinition[];\n}): { projection: ProjectionModel; object: Table.Table } => {\n const jsonSchema = type.jsonSchema;\n const view = ViewModel.make({\n query: Query.select(Filter.everything()),\n jsonSchema,\n type,\n ...(properties && { fields: properties.map((property) => property.name) }),\n });\n const object = Obj.make(Table.Table, { view: Ref.make(view), sizes: {} });\n\n const projection = new ProjectionModel({\n registry,\n view,\n baseSchema: jsonSchema,\n change: createEchoChangeCallback(view, type),\n });\n projection.normalizeView();\n if (properties && projection.getFields()) {\n setProperties(view, projection, object, properties);\n }\n\n return { projection, object };\n};\n\nconst setProperties = (\n view: View.View,\n projection: ProjectionModel,\n table: Table.Table,\n properties: TablePropertyDefinition[],\n) => {\n for (const property of properties) {\n const field = projection.getFields().find((field) => field.path === property.name);\n if (field) {\n if (property.size !== undefined) {\n Obj.update(table, (table) => {\n table.sizes[field.path] = property.size!;\n });\n }\n\n if (property.title !== undefined) {\n const fieldProjection = projection.getFieldProjection(field.id);\n projection.setFieldProjection({\n ...fieldProjection,\n props: { ...fieldProjection.props, title: property.title },\n });\n }\n\n if (property.sort) {\n // Apply sort to query instead of deprecated view.sort\n const currentQuery = Query.fromAst(Obj.getSnapshot(view).query.ast);\n // Use any type parameter since we're working with dynamic field paths\n const newQuery = currentQuery.orderBy(Order.property<any>(field.path as string, property.sort));\n Obj.update(view, (view) => {\n // Type assertion needed because Query AST types have some variance issues.\n view.query.ast = newQuery.ast as typeof view.query.ast;\n });\n }\n }\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Explicitly marks signal dependencies for tracking within effects.\n * Returns the passed value to enable inline usage.\n */\nexport const touch = <T>(value: T) => value;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\n/**\n * Creates a narrowed schema from an original schema that only includes\n * the specified paths. This allows form components to only display\n * and edit/validate specific fields rather than the entire object.\n *\n * @param schema The original schema to narrow\n * @param paths Array of field paths to extract\n * @returns A narrowed Schema instance containing only the properties at the specified paths\n */\nexport const narrowSchema = <S extends Schema.Schema.AnyNoContext>(\n schema: S,\n paths: string[],\n): Schema.Schema<unknown, unknown> | undefined => {\n const ast = (schema as any)?.ast;\n\n if (SchemaAST.isTypeLiteral(ast)) {\n // Filter property signatures that match any of the provided paths\n const propertySignatures = ast.propertySignatures.filter((signature) => paths.includes(signature.name.toString()));\n\n // If we found at least one matching property\n if (propertySignatures.length > 0) {\n // Create a new TypeLiteral with only the matching properties\n const narrowType = new SchemaAST.TypeLiteral(propertySignatures, []);\n return Schema.make(narrowType);\n }\n }\n\n return undefined;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\nimport { type MutableRefObject, type RefObject } from 'react';\n\nexport type ColumnSettingsMode = { type: 'create' } | { type: 'edit'; fieldId: string };\n\nexport type ModalState =\n | { type: 'row'; rowIndex: number }\n | { type: 'column'; fieldId: string }\n | { type: 'refPanel'; targetId: string; typename: string }\n | { type: 'columnSettings'; mode: ColumnSettingsMode }\n | { type: 'closed' };\n\nexport class ModalController {\n private readonly _registry: Registry.Registry;\n private readonly _state: Atom.Writable<ModalState>;\n private readonly _triggerRef: MutableRefObject<HTMLElement> = { current: null as unknown as HTMLElement };\n\n constructor(registry: Registry.Registry) {\n this._registry = registry;\n this._state = Atom.make<ModalState>({ type: 'closed' });\n }\n\n public get state(): Atom.Atom<ModalState> {\n return this._state;\n }\n\n public get stateValue(): ModalState {\n return this._registry.get(this._state);\n }\n\n public get trigger() {\n return this._triggerRef as RefObject<HTMLButtonElement>;\n }\n\n public setTrigger = (trigger: HTMLElement) => {\n this._triggerRef.current = trigger;\n };\n\n public showRowMenu = (rowIndex: number) => {\n this._registry.set(this._state, { type: 'row', rowIndex });\n };\n\n public showColumnMenu = (fieldId: string) => {\n this._registry.set(this._state, { type: 'column', fieldId });\n };\n\n public showColumnCreator = () => {\n this._registry.set(this._state, { type: 'columnSettings', mode: { type: 'create' } });\n };\n\n public showReferencePanel = (targetId: string, schemaId: string) => {\n this._registry.set(this._state, { type: 'refPanel', targetId, typename: schemaId });\n };\n\n public openColumnSettings = () => {\n const currentState = this._registry.get(this._state);\n if (currentState.type === 'column') {\n const fieldId = currentState.fieldId;\n // Queue next render to let the column action modal close completely.\n requestAnimationFrame(() => {\n this._registry.set(this._state, {\n type: 'columnSettings',\n mode: { type: 'edit', fieldId },\n });\n });\n }\n };\n\n public close = () => {\n this._registry.set(this._state, { type: 'closed' });\n };\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Completion } from '@codemirror/autocomplete';\nimport { EditorView } from '@codemirror/view';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { debounce } from '@dxos/async';\nimport { type Type } from '@dxos/echo';\nimport { Format, TypeEnum } from '@dxos/echo/Format';\nimport { invariant } from '@dxos/invariant';\nimport { type DxGridAxis, type DxGridPosition } from '@dxos/lit-grid';\nimport {\n type EditorBlurHandler,\n type EditorKeyEvent,\n type EditorKeyOrBlurHandler,\n GridCellEditor,\n type GridCellEditorProps,\n type GridScopedProps,\n editorKeys,\n parseCellIndex,\n useGridContext,\n} from '@dxos/react-ui-grid';\nimport { type FieldProjection } from '@dxos/schema';\n\nimport { type ModalController, type TableModel } from '../../model';\nimport { CellValidationMessage } from './CellValidationMessage';\nimport { FormCellEditor, type OnCreateHandler } from './FormCellEditor';\n\n/**\n * Option to create new object/value.\n */\nexport type QueryResult = Pick<Completion, 'label'> & {\n data: any;\n};\n\nexport type TableCellEditorProps<T extends Type.AnyEntity = Type.AnyEntity> = {\n schema?: T;\n model?: TableModel;\n modals?: ModalController;\n onFocus?: (axis?: DxGridAxis, delta?: -1 | 0 | 1, cell?: DxGridPosition) => void;\n onCreate?: OnCreateHandler;\n onSave?: () => void;\n};\n\nexport const TableValueEditor = <T extends Type.AnyEntity = Type.AnyEntity>({\n __gridScope,\n schema,\n model,\n modals,\n onFocus,\n onSave,\n onCreate,\n}: GridScopedProps<TableCellEditorProps<T>>) => {\n const { editing } = useGridContext('TableValueEditor', __gridScope);\n\n const fieldProjection = useMemo<FieldProjection | undefined>(() => {\n if (!model || !editing) {\n return;\n }\n\n const { col } = parseCellIndex(editing.index);\n const field = model.projection.getFields()[col];\n const fieldProjection = model.projection.getFieldProjection(field.id);\n invariant(fieldProjection);\n return fieldProjection;\n }, [model, editing]);\n\n if (\n fieldProjection?.props.type === TypeEnum.Array ||\n fieldProjection?.props.format === Format.TypeFormat.SingleSelect ||\n fieldProjection?.props.format === Format.TypeFormat.Ref\n // TODO(thure): Support `Format.TypeFormat.MultiSelect`\n ) {\n return (\n <FormCellEditor<T>\n __gridScope={__gridScope}\n schema={schema}\n model={model}\n fieldProjection={fieldProjection}\n modals={modals}\n onSave={onSave}\n onCreate={onCreate}\n />\n );\n }\n\n // For all other types, use the existing cell editor.\n return <TableCellEditor model={model} modals={modals} onFocus={onFocus} onSave={onSave} __gridScope={__gridScope} />;\n};\n\nconst cellEditorSlots: GridCellEditorProps['slots'] = {\n content: {\n className: '!py-(--dx-grid-cell-editor-padding-block)',\n },\n};\n\nexport const TableCellEditor = ({\n __gridScope,\n model,\n modals,\n onFocus,\n onSave,\n}: GridScopedProps<TableCellEditorProps>) => {\n const { editing, setEditing } = useGridContext('TableCellEditor', __gridScope);\n const suppressNextBlur = useRef(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n const [validationVariant, setValidationVariant] = useState<'error' | 'warning'>('error');\n\n const fieldProjection = useMemo<FieldProjection | undefined>(() => {\n if (!model || !editing) {\n return;\n }\n\n const { col } = parseCellIndex(editing.index);\n const field = model.projection.getFields()[col];\n const fieldProjection = model.projection.getFieldProjection(field.id);\n invariant(fieldProjection);\n return fieldProjection;\n }, [model, editing]);\n\n // TOOD(burdon): Attach to event handler?\n const handleEnter = useCallback(\n async (value: any) => {\n if (!model || !editing) {\n return;\n }\n\n const cell = parseCellIndex(editing.index);\n const validationResult = await model.validateCellData(cell, value);\n\n if (validationResult.valid) {\n setValidationError(null);\n model.setCellData(cell, value);\n onFocus?.();\n setEditing(null);\n onSave?.();\n } else {\n setValidationError(validationResult.error);\n setValidationVariant('error');\n }\n },\n [model, editing, onFocus, setEditing],\n );\n\n const handleBlur = useCallback<EditorBlurHandler>(\n async (value) => {\n if (suppressNextBlur.current) {\n suppressNextBlur.current = false;\n } else if (model && editing) {\n // Save silently if validation passes\n const cell = parseCellIndex(editing.index);\n if (value !== undefined) {\n const result = await model.validateCellData(cell, value);\n if (result.valid) {\n setValidationError(null);\n model.setCellData(cell, value);\n setEditing(null);\n onSave?.();\n }\n }\n }\n },\n [model, editing],\n );\n\n const handleClose = useCallback<EditorKeyOrBlurHandler>(\n async (value, event) => {\n if (!model || !editing || !fieldProjection) {\n return;\n }\n\n const cell = parseCellIndex(editing.index);\n if (value !== undefined) {\n // Pre-commit validation check.\n const result = await model.validateCellData(cell, value);\n\n if (result.valid) {\n suppressNextBlur.current = true;\n setValidationError(null);\n model.setCellData(cell, value);\n setEditing(null);\n onSave?.();\n if (event && onFocus) {\n onFocus(determineNavigationAxis(event), determineNavigationDelta(event), cell);\n }\n } else {\n setValidationError(result.error);\n setValidationVariant('error');\n }\n } else {\n suppressNextBlur.current = true;\n setValidationError(null);\n setEditing(null);\n onSave?.();\n if (event && onFocus) {\n onFocus(determineNavigationAxis(event), determineNavigationDelta(event));\n }\n }\n },\n [model, editing, onFocus, fieldProjection, setEditing, onSave],\n );\n\n const extensions = useMemo(() => {\n if (!fieldProjection) {\n return [];\n }\n\n const extensions = [\n editorKeys({\n onClose: handleClose,\n ...(editing?.initialContent && { onNav: handleClose }),\n }),\n ];\n // Add validation extension to handle content changes.\n if (model && editing) {\n extensions.push(\n EditorView.updateListener.of(\n debounce((update) => {\n const content = update.state.doc.toString();\n const cell = parseCellIndex(editing.index);\n\n // Perform validation on content change.\n void model.validateCellData(cell, content).then((result) => {\n if (result.valid) {\n setValidationError(null);\n } else {\n setValidationError(result.error);\n setValidationVariant('error');\n }\n });\n }, 10),\n ),\n );\n }\n\n return extensions;\n }, [model, modals, editing, fieldProjection, handleClose]);\n\n const getCellContent = useCallback<GridCellEditorProps['getCellContent']>(() => {\n if (model && editing) {\n const cell = parseCellIndex(editing.index);\n const value = model.getCellData(cell);\n return value !== undefined ? String(value) : '';\n }\n }, [model, editing]);\n\n return (\n <>\n <CellValidationMessage validationError={validationError} variant={validationVariant} __gridScope={__gridScope} />\n <GridCellEditor\n extensions={extensions}\n slots={cellEditorSlots}\n getCellContent={getCellContent}\n onBlur={handleBlur}\n />\n </>\n );\n};\n\nconst determineNavigationAxis = ({ key }: EditorKeyEvent): 'col' | 'row' | undefined => {\n switch (key) {\n case 'ArrowUp':\n case 'ArrowDown':\n case 'Enter': {\n return 'row';\n }\n\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'Tab':\n return 'col';\n }\n};\n\nconst determineNavigationDelta = ({ key, shift }: EditorKeyEvent): -1 | 1 => {\n switch (key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n return -1;\n\n case 'ArrowDown':\n case 'ArrowRight':\n return 1;\n }\n\n return shift ? -1 : 1;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type GridScopedProps, useGridContext } from '@dxos/react-ui-grid';\n\nexport type CellValidationMessageProps = {\n validationError: string | null;\n variant?: 'error' | 'warning';\n};\n\nexport const CellValidationMessage = ({\n __gridScope,\n validationError,\n variant = 'error',\n}: GridScopedProps<CellValidationMessageProps>) => {\n const { editing, editBox: box } = useGridContext('GridSheetCellEditor', __gridScope);\n\n if (!editing || !validationError) {\n return null;\n }\n\n const bgClass = variant === 'error' ? 'bg-error-surface' : 'bg-warning-surface';\n const textClass = variant === 'error' ? 'text-error-fg' : 'text-warning-fg';\n\n return (\n <div\n className={`absolute ${bgClass} ${textClass} rounded-h-sm text-xs p-1`}\n style={{\n ...{ '--dx-grid-cell-width': `${box?.inlineSize ?? 200}px` },\n zIndex: 10,\n insetBlockEnd: `calc(100% - ${box.insetBlockStart}px)`,\n insetInlineStart: box.insetInlineStart,\n inlineSize: box.inlineSize,\n }}\n >\n {validationError}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Entity, Ref, Type } from '@dxos/echo';\nimport { SchemaEx } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { type Label, Popover } from '@dxos/react-ui';\nimport { Form, type FormRootProps, type RefFieldProps } from '@dxos/react-ui-form';\nimport { parseCellIndex, useGridContext } from '@dxos/react-ui-grid';\nimport { type FieldProjection } from '@dxos/schema';\nimport { getDeep, isTruthy, setDeep } from '@dxos/util';\n\nimport { translationKey } from '#translations';\n\nimport { type ModalController, type TableModel, type TableRow } from '../../model';\nimport { narrowSchema } from '../../util';\n\nconst createOptionLabel: Label = ['create-new-object.label', { ns: translationKey }];\n\nexport type OnCreateHandler = (schema: Type.AnyEntity, values: any) => Parameters<typeof Ref.make>[0];\n\nexport type FormCellEditorProps<T extends Type.AnyEntity = Type.AnyEntity> = {\n __gridScope: any;\n schema?: T;\n model?: TableModel;\n fieldProjection: FieldProjection;\n modals?: ModalController; // TODO(burdon): Not used. Remove?\n onSave?: () => void;\n onCreate?: OnCreateHandler;\n} & Omit<FormRootProps<any>, 'values' | 'schema' | 'onCreate'>;\n\nexport const FormCellEditor = <T extends Type.AnyEntity = Type.AnyEntity>({\n __gridScope,\n schema,\n model,\n fieldProjection,\n onSave,\n onCreate,\n ...formProps\n}: FormCellEditorProps<T>) => {\n const anchorRef = useRef<HTMLButtonElement | null>(null);\n const { id: _gridId, editing: contextEditing, setEditing } = useGridContext('ArrayEditor', __gridScope);\n const [editing, setLocalEditing] = useState(false);\n\n useEffect(() => {\n if (contextEditing && contextEditing.cellElement) {\n anchorRef.current = (contextEditing.cellElement as HTMLElement).querySelector(\n '.dx-grid__cell__content',\n ) as HTMLButtonElement;\n setLocalEditing(true);\n } else {\n anchorRef.current = null;\n setLocalEditing(false);\n }\n }, [contextEditing]);\n\n const narrowedSchema = useMemo<Schema.Schema.AnyNoContext | undefined>(() => {\n if (!schema) {\n return undefined;\n }\n\n return narrowSchema(Type.getSchema(schema), [fieldProjection.field.path]);\n }, [JSON.stringify(schema), fieldProjection.field.path]); // TODO(burdon): Avoid stringify.\n\n const originalRow = useMemo<TableRow | undefined>(() => {\n if (model && contextEditing) {\n // Check if this is a draft cell and get the appropriate row data\n const cell = parseCellIndex(contextEditing.index);\n if (model.isDraftCell(cell)) {\n const draftRow = model.getDraftRows()[cell.row];\n invariant(draftRow);\n return draftRow.data;\n } else {\n const row = model.getRowAt(cell.row);\n invariant(row);\n return row;\n }\n }\n\n return undefined;\n }, [model, contextEditing]);\n\n // NOTE: Important to get a mutable deep clone to eject from the echo object.\n // TODO(wittjosiah): Consider using something like Obj.clone for this use case.\n const initialFormValues = useMemo(() => (originalRow ? JSON.parse(JSON.stringify(originalRow)) : {}), [originalRow]);\n const [formValues, setFormValues] = useState<any>(initialFormValues);\n\n const handleValuesChanged = useCallback<NonNullable<FormRootProps<any>['onValuesChanged']>>((values) => {\n setFormValues(values);\n }, []);\n const handleOpenChange = useCallback((nextOpen: boolean) => {\n if (nextOpen === false) {\n setEditing(null);\n onSave?.();\n }\n setLocalEditing(nextOpen);\n }, []);\n\n const handleSave = useCallback<NonNullable<FormRootProps<any>['onSave']>>(\n (values) => {\n if (!originalRow) {\n return;\n }\n const path = fieldProjection.field.path;\n const value = getDeep(values, [path]);\n // Use model's changeRow for consistent mutation handling.\n if (model) {\n model.changeRow(originalRow, (mutableRow) => {\n setDeep(mutableRow, [path], value);\n });\n } else {\n setDeep(originalRow, [path], value);\n }\n contextEditing?.cellElement?.focus();\n setEditing(null);\n setLocalEditing(false);\n onSave?.();\n },\n [fieldProjection.field.path, onSave, contextEditing, originalRow, model],\n );\n\n const handleCreate = useCallback<NonNullable<FormRootProps<any>['onCreate']>>(\n (schema, values) => {\n const objectWithId = onCreate?.(schema, values);\n if (objectWithId && originalRow) {\n const ref = Ref.make(objectWithId);\n const path = fieldProjection.field.path;\n // Use model's changeRow for consistent mutation handling.\n if (model) {\n model.changeRow(originalRow, (mutableRow) => {\n setDeep(mutableRow, [path], ref);\n });\n } else {\n setDeep(originalRow, [path], ref);\n }\n }\n contextEditing?.cellElement?.focus();\n setEditing(null);\n setLocalEditing(false);\n onSave?.();\n },\n [fieldProjection.field.path, onSave, contextEditing, originalRow, onCreate, model],\n );\n\n const getOptions = useCallback<NonNullable<RefFieldProps['getOptions']>>(\n (results) =>\n results\n .map((obj) => {\n return {\n id: Entity.getURI(obj),\n label: SchemaEx.getValue(obj, fieldProjection.field.referencePath!) || obj.id.toString(),\n };\n })\n .filter(isTruthy),\n [fieldProjection],\n );\n\n if (!editing) {\n return null;\n }\n\n return (\n <Popover.Root open={editing} onOpenChange={handleOpenChange}>\n <Popover.VirtualTrigger virtualRef={anchorRef} />\n <Popover.Portal>\n <Popover.Content tabIndex={-1} classNames='dx-card-popover-width dx-density-md'>\n <Popover.Arrow />\n <Popover.Viewport>\n <Form.Root\n {...formProps}\n autoFocus\n schema={narrowedSchema}\n values={formValues}\n onValuesChanged={handleValuesChanged}\n projection={model?.projection}\n createInitialValuePath={fieldProjection.field.referencePath}\n createOptionIcon='ph--plus--regular'\n createOptionLabel={createOptionLabel}\n db={model?.db}\n getOptions={getOptions}\n onCreate={handleCreate}\n onSave={handleSave}\n >\n <Form.Viewport>\n <Form.Content>\n <Form.FieldSet />\n <Form.Actions />\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n </Popover.Viewport>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { DropdownMenu, useTranslation } from '@dxos/react-ui';\n\nimport { translationKey } from '#translations';\n\nimport { type ModalController, type TableModel } from '../../model';\n\nexport type ColumnActionsMenuProps = {\n model: TableModel;\n modals: ModalController;\n};\n\nexport const ColumnActionsMenu = ({ model, modals }: ColumnActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const state = useAtomValue(modals.state);\n if (state?.type !== 'column') {\n return null;\n }\n\n const currentSort = model.getSorting();\n const isCurrentColumnSorted = currentSort?.fieldId === state.fieldId;\n\n return (\n <DropdownMenu.Root modal={false} open={true} onOpenChange={modals.close}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Portal>\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n {(!isCurrentColumnSorted || currentSort?.direction === 'asc') && (\n <DropdownMenu.Item\n data-testid='column-sort-descending'\n onClick={() => model.setSort(state.fieldId, 'desc')}\n >\n {t('column-action-sort-descending.menu')}\n </DropdownMenu.Item>\n )}\n {(!isCurrentColumnSorted || currentSort?.direction === 'desc') && (\n <DropdownMenu.Item\n data-testid='column-sort-ascending'\n onClick={() => model.setSort(state.fieldId, 'asc')}\n >\n {t('column-action-sort-ascending.menu')}\n </DropdownMenu.Item>\n )}\n {isCurrentColumnSorted && (\n <DropdownMenu.Item data-testid='column-clear-sort' onClick={() => model.clearSort()}>\n {t('column-action-clear-sorting.menu')}\n </DropdownMenu.Item>\n )}\n {model.getColumnCount() > 1 && model.features.schemaEditable && (\n <DropdownMenu.Item data-testid='column-delete' onClick={() => model.deleteColumn(state.fieldId)}>\n {t('column-action-delete.menu')}\n </DropdownMenu.Item>\n )}\n {model.features.schemaEditable && (\n <DropdownMenu.Item data-testid='column-settings' onClick={() => modals.openColumnSettings()}>\n {t('column-action-settings.menu')}\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { type Registry, type View } from '@dxos/echo';\nimport { Popover } from '@dxos/react-ui';\nimport { FieldEditor } from '@dxos/react-ui-form';\n\nimport { type ModalController, type TableModel } from '../../model';\n\ntype ColumnSettingsProps = {\n registry?: Registry.Registry;\n model?: TableModel;\n modals: ModalController;\n onNewColumn: () => void;\n};\n\nexport const ColumnSettings = ({ registry, model, modals, onNewColumn }: ColumnSettingsProps) => {\n const [newField, setNewField] = useState<View.FieldType>();\n const state = useAtomValue(modals.state);\n\n useEffect(() => {\n if (state?.type === 'columnSettings' && state.mode.type === 'create' && model?.projection) {\n setNewField(model.projection.createFieldProjection());\n requestAnimationFrame(() => {\n onNewColumn();\n });\n } else {\n setNewField(undefined);\n }\n }, [model?.projection, state]);\n\n const existingField = useMemo(() => {\n if (state?.type === 'columnSettings') {\n const { mode } = state;\n if (mode.type === 'edit') {\n return model?.projection?.getFields().find((f) => f.id === mode.fieldId);\n }\n }\n return undefined;\n }, [model?.projection, state]);\n\n const field = existingField ?? newField;\n\n const handleSave = useCallback(() => {\n modals.close();\n }, [modals]);\n\n const handleCancel = useCallback(() => {\n if (state?.type === 'columnSettings' && state.mode.type === 'create' && newField) {\n model?.projection.deleteFieldProjection(newField.id);\n }\n }, [model?.projection, state, newField]);\n\n if (!model?.projection || !field) {\n return null;\n }\n\n return (\n <Popover.Root modal={false} open={state?.type === 'columnSettings'}>\n <Popover.VirtualTrigger virtualRef={modals.trigger} />\n <Popover.Portal>\n <Popover.Content classNames='md:w-64'>\n <Popover.Viewport>\n <FieldEditor\n projection={model.projection}\n field={field}\n registry={registry}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { DropdownMenu, toLocalizedString, useTranslation } from '@dxos/react-ui';\n\nimport { translationKey } from '#translations';\n\nimport { type ModalController, type TableModel } from '../../model';\n\ntype RowActionsMenuProps = { model: TableModel; modals: ModalController };\n\nexport const RowActionsMenu = ({ model, modals }: RowActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const hasSelection = model.selection.hasSelection;\n const state = useAtomValue(modals.state);\n if (state?.type !== 'row') {\n return null;\n }\n return (\n <DropdownMenu.Root modal={false} open={true} onOpenChange={modals.close}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n {/* Custom actions */}\n {model.rowActions?.length > 0 && (\n <>\n <DropdownMenu.Group>\n {model.rowActions?.map((action) => (\n <DropdownMenu.Item\n key={action.id}\n data-testid={`row-action-${action.id}`}\n onClick={() => {\n modals.close();\n model.handleRowAction(action.id, state.rowIndex);\n }}\n >\n {toLocalizedString(action.label, t)}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Group>\n <DropdownMenu.Separator />\n </>\n )}\n {/* Default actions */}\n {model.features.dataEditable !== false && (\n <DropdownMenu.Item data-testid='row-menu-delete' onClick={() => model.deleteRow(state.rowIndex)}>\n {t(hasSelection ? 'bulk-delete-row.label' : 'delete-row.label')}\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { useContext, useEffect, useMemo } from 'react';\n\nimport { composable, composableProps } from '@dxos/react-ui';\nimport {\n type ActionGraphEdges,\n type ActionGraphNodes,\n type ActionGraphProps,\n Menu,\n type MenuAction,\n MenuRootProps,\n createGapSeparator,\n createMenuAction,\n useMenuActions,\n} from '@dxos/react-ui-menu';\n\nimport { translationKey } from '#translations';\n\nexport type TableToolbarActionProperties = { type: TableToolbarActionType };\n\nexport type TableToolbarAction = MenuAction<TableToolbarActionProperties>;\n\nexport type TableToolbarActionType = 'add-row' | 'comment' | 'save-view';\n\ntype TableToolbarState = Partial<{ viewDirty: boolean }>;\n\nconst createTableToolbarActions = ({\n stateAtom,\n onAdd,\n onSave,\n customActions,\n}: {\n stateAtom: Atom.Atom<TableToolbarState>;\n onAdd?: () => void;\n onSave?: () => void;\n customActions?: Atom.Atom<ActionGraphProps>;\n}) =>\n Atom.make((get) => {\n const nodes: ActionGraphNodes = [];\n if (onAdd) {\n const add = createMenuAction<TableToolbarActionProperties>('add-row', onAdd, {\n type: 'add-row' as const,\n icon: 'ph--plus--regular',\n label: ['add-row.label', { ns: translationKey }],\n testId: 'table.toolbar.add-row',\n });\n nodes.push(add);\n }\n if (onSave) {\n const state = get(stateAtom);\n const save = createMenuAction<TableToolbarActionProperties>('save-view', onSave, {\n type: 'save-view' as const,\n icon: 'ph--floppy-disk--regular',\n label: ['save-view.label', { ns: translationKey }],\n testId: 'table.toolbar.save-view',\n iconOnly: false,\n hidden: !state.viewDirty,\n });\n nodes.push(save);\n }\n const gap = createGapSeparator();\n nodes.push(...gap.nodes);\n const edges: ActionGraphEdges = nodes.map(({ id: target }) => ({ source: 'root', target, relation: 'child' }));\n if (customActions) {\n const custom = get(customActions);\n nodes.push(...custom.nodes);\n edges.push(...custom.edges);\n }\n\n return {\n nodes,\n edges,\n };\n });\n\nexport type TableToolbarProps = Pick<MenuRootProps, 'attendableId'> &\n TableToolbarState & {\n onAdd?: () => void;\n onSave?: () => void;\n customActions?: Atom.Atom<ActionGraphProps>;\n };\n\nexport const TableToolbar = composable<HTMLDivElement, TableToolbarProps>(\n ({ attendableId, viewDirty, onAdd, onSave, customActions, ...props }, forwardedRef) => {\n const registry = useContext(RegistryContext);\n const stateAtom = useMemo(() => Atom.make<TableToolbarState>({ viewDirty }), []);\n\n // Update state.viewDirty when the prop changes.\n useEffect(() => {\n registry.set(stateAtom, { viewDirty });\n }, [registry, stateAtom, viewDirty]);\n\n const actionsCreator = useMemo(\n () => createTableToolbarActions({ stateAtom, onAdd, onSave, customActions }),\n [stateAtom, onAdd, onSave, customActions],\n );\n const menuActions = useMenuActions(actionsCreator);\n\n return (\n <Menu.Root {...menuActions} attendableId={attendableId}>\n <Menu.Toolbar {...composableProps(props)} ref={forwardedRef} />\n </Menu.Root>\n );\n },\n);\n\nTableToolbar.displayName = 'TableToolbar';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport type * as Types from 'effect/Types';\nimport React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type JsonSchema, type Type } from '@dxos/echo';\nimport { type ThemedClassName, useDefaultValue } from '@dxos/react-ui';\nimport { type ProjectionModel } from '@dxos/schema';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useTableModel } from '../../hooks';\nimport { type TableFeatures, TablePresentation, type TableRowAction } from '../../model';\nimport { type Table as TableType } from '../../types';\nimport { type TablePropertyDefinition, getBaseSchema, makeDynamicTable } from '../../util';\nimport { Table, type TableController } from './Table';\n\nexport type DynamicTableProps<T extends Type.AnyEntity = Type.AnyEntity> = ThemedClassName<{\n type?: T;\n name?: string; // TODO(burdon): Remove?\n rows: any[];\n properties?: TablePropertyDefinition[];\n jsonSchema?: Types.DeepMutable<JsonSchema.JsonSchema>;\n features?: Partial<TableFeatures>;\n rowActions?: TableRowAction[];\n onRowClick?: (row: any) => void;\n onRowAction?: (actionId: string, datum: any) => void;\n}>;\n\n/**\n * Properties define both the schema and display characteristics of the table columns.\n */\n// TODO(burdon): Instead of creating component variants, create helpers/hooks that normalize the props.\n// TODO(burdon): Warning: Cannot update a component (`DynamicTable`) while rendering a different component (`DynamicTable`).\nexport const DynamicTable = <T extends Type.AnyEntity = Type.AnyEntity>({\n classNames,\n type: typeProp,\n name = 'com.example.dynamicTable', // Remove default or make random; this will lead to type collisions.\n rows,\n properties,\n jsonSchema: jsonSchemaProp,\n rowActions,\n onRowClick,\n onRowAction,\n ...props\n}: DynamicTableProps<T>) => {\n const registry = useContext(RegistryContext);\n const [dynamicTable, setDynamicTable] = useState<{ object: TableType.Table; projection: ProjectionModel }>();\n\n // TODO(burdon): Remove variance from the props (should be normalized externally; possibly via hooks).\n const { type } = useMemo(\n () => getBaseSchema({ typename: name, properties, jsonSchema: jsonSchemaProp, type: typeProp }),\n [name, properties, jsonSchemaProp, typeProp],\n );\n\n useEffect(() => {\n setDynamicTable(makeDynamicTable({ registry, type, properties }));\n }, [registry, type, properties]);\n\n const tableRef = useRef<TableController>(null);\n const handleCellUpdate = useCallback((cell: any) => {\n tableRef.current?.update?.(cell);\n }, []);\n\n const handleRowOrderChange = useCallback(() => {\n tableRef.current?.update?.();\n }, []);\n\n const features = useDefaultValue(\n props.features,\n () =>\n ({\n selection: { enabled: false },\n dataEditable: false,\n }) as const,\n );\n\n const model = useTableModel({\n rows,\n object: dynamicTable?.object,\n projection: dynamicTable?.projection,\n features,\n rowActions,\n onCellUpdate: handleCellUpdate,\n onRowOrderChange: handleRowOrderChange,\n onRowAction,\n });\n\n const presentation = useMemo(() => {\n if (model) {\n return new TablePresentation(registry, model);\n }\n }, [registry, model]);\n\n return (\n <div className={mx('dx-expander grid', classNames)}>\n <div className='grid min-h-0 overflow-hidden'>\n <Table.Root ref={tableRef}>\n <Table.Content model={model} presentation={presentation} ignoreAttention onRowClick={onRowClick} />\n </Table.Root>\n </div>\n </div>\n );\n};\n"],
5
- "mappings": "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",
6
- "names": ["Atom", "createContext", "React", "forwardRef", "useImperativeHandle", "useRef", "Atom", "RegistryContext", "useAtomValue", "String", "React", "useCallback", "useContext", "useEffect", "useMemo", "useState", "log", "composable", "composableProps", "useAttention", "Grid", "closestCell", "gridSeparatorBlockEnd", "gridSeparatorInlineEnd", "DxEditRequest", "mx", "Filter", "Obj", "Order", "Query", "Ref", "Type", "ProjectionModel", "ViewModel", "createEchoChangeCallback", "getSchemaFromJsonSchema", "getSchemaFromPropertyDefinitions", "getBaseSchema", "type", "typename", "properties", "jsonSchema", "resolved", "getSchemaFromPropertyDefinitions", "getSchemaFromJsonSchema", "undefined", "Error", "Type", "getTypename", "makeDynamicTable", "registry", "view", "ViewModel", "make", "query", "Query", "select", "Filter", "everything", "fields", "map", "property", "name", "object", "Obj", "Table", "Ref", "sizes", "projection", "ProjectionModel", "baseSchema", "change", "createEchoChangeCallback", "normalizeView", "getFields", "setProperties", "table", "field", "find", "path", "size", "update", "title", "fieldProjection", "getFieldProjection", "id", "setFieldProjection", "props", "sort", "currentQuery", "fromAst", "getSnapshot", "ast", "newQuery", "orderBy", "Order", "touch", "value", "Schema", "SchemaAST", "narrowSchema", "schema", "paths", "ast", "isTypeLiteral", "propertySignatures", "filter", "signature", "includes", "name", "toString", "length", "narrowType", "TypeLiteral", "make", "undefined", "Atom", "ModalController", "_registry", "_state", "_triggerRef", "current", "registry", "make", "type", "state", "stateValue", "get", "trigger", "setTrigger", "showRowMenu", "rowIndex", "set", "showColumnMenu", "fieldId", "showColumnCreator", "mode", "showReferencePanel", "targetId", "schemaId", "typename", "openColumnSettings", "currentState", "requestAnimationFrame", "close", "EditorView", "React", "useCallback", "useMemo", "useRef", "useState", "debounce", "Format", "TypeEnum", "invariant", "GridCellEditor", "editorKeys", "parseCellIndex", "useGridContext", "React", "useGridContext", "CellValidationMessage", "__gridScope", "validationError", "variant", "editing", "editBox", "box", "bgClass", "textClass", "div", "className", "style", "inlineSize", "zIndex", "insetBlockEnd", "insetBlockStart", "insetInlineStart", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Entity", "Ref", "Type", "SchemaEx", "invariant", "Popover", "Form", "parseCellIndex", "useGridContext", "getDeep", "isTruthy", "setDeep", "translationKey", "createOptionLabel", "id", "editing", "contextEditing", "setEditing", "useGridContext", "__gridScope", "setLocalEditing", "useEffect", "cellElement", "anchorRef", "current", "undefined", "narrowSchema", "Type", "JSON", "useMemo", "cell", "parseCellIndex", "draftRow", "getDraftRows", "row", "invariant", "data", "model", "setFormValues", "values", "handleOpenChange", "onSave", "useCallback", "path", "setDeep", "value", "fieldProjection", "originalRow", "objectWithId", "make", "field", "Ref", "ref", "onCreate", "Entity", "obj", "label", "filter", "isTruthy", "virtualRef", "Popover", "tabIndex", "React", "autoFocus", "schema", "formValues", "onValuesChanged", "projection", "createInitialValuePath", "createOptionIcon", "db", "getOptions", "handleCreate", "__dxlog_file", "TableValueEditor", "fieldProjection", "useMemo", "model", "editing", "projection", "getFieldProjection", "invariant", "__gridScope", "schema", "modals", "onSave", "onCreate", "onFocus", "suppressNextBlur", "useRef", "validationError", "setValidationError", "useState", "validationVariant", "setValidationVariant", "useCallback", "validationResult", "value", "setEditing", "current", "cell", "parseCellIndex", "result", "validateCellData", "setCellData", "event", "extensions", "handleClose", "onNav", "content", "index", "undefined", "cellEditorSlots", "getCellContent", "onBlur", "determineNavigationAxis", "shift", "useAtomValue", "React", "DropdownMenu", "useTranslation", "translationKey", "ColumnActionsMenu", "model", "modals", "t", "state", "type", "currentSort", "getSorting", "isCurrentColumnSorted", "fieldId", "Root", "modal", "open", "onOpenChange", "close", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "Viewport", "direction", "Item", "data-testid", "onClick", "setSort", "clearSort", "getColumnCount", "features", "schemaEditable", "deleteColumn", "openColumnSettings", "Arrow", "useAtomValue", "React", "useCallback", "useEffect", "useMemo", "useState", "Popover", "FieldEditor", "ColumnSettings", "registry", "model", "modals", "onNewColumn", "newField", "setNewField", "state", "type", "mode", "projection", "createFieldProjection", "requestAnimationFrame", "undefined", "existingField", "getFields", "find", "f", "id", "fieldId", "field", "handleSave", "close", "handleCancel", "deleteFieldProjection", "Root", "modal", "open", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "classNames", "Viewport", "onSave", "onCancel", "Arrow", "useAtomValue", "React", "DropdownMenu", "toLocalizedString", "useTranslation", "translationKey", "RowActionsMenu", "model", "modals", "t", "hasSelection", "selection", "state", "type", "Root", "modal", "open", "onOpenChange", "close", "VirtualTrigger", "virtualRef", "trigger", "Content", "Viewport", "rowActions", "length", "Group", "map", "action", "Item", "key", "id", "data-testid", "onClick", "handleRowAction", "rowIndex", "label", "Separator", "features", "dataEditable", "deleteRow", "Arrow", "__dxlog_file", "columnDefault", "maxSize", "Atom", "emptyRowsAtom", "useContext", "dxGrid", "setDxGrid", "useState", "hasAttention", "useAttention", "attendableId", "modals", "useMemo", "ModalController", "registry", "rows", "useAtomValue", "model", "cellUpdateCounter", "cellUpdate", "columnCount", "Object", "columnMeta", "grid", "getFields", "frozen", "noActionColumn", "dataEditable", "frozenRowsStart", "frozenRowsEnd", "frozenColsStart", "frozenColsEnd", "useCallback", "useEffect", "getCells", "setFocus", "col", "row", "refocus", "requestAnimationFrame", "requestUpdate", "didCommitSuccessfully", "commitDraftRow", "scrollToEndRow", "plane", "cell", "onRowClick", "tableButtonElement", "values", "tableButtons", "find", "data", "controlElement", "tableControls", "ctrl", "selection", "toggleSelectionForRowIndex", "colIndex", "value", "getRowCount", "handleInsertRowResult", "increment", "handleSaveDraftRow", "delta", "navigator", "clipboard", "textContent", "event", "preventDefault", "error", "log", "catch", "cellElement", "getBoundingClientRect", "editRequest", "cellIndex", "cellBox", "insetInlineStart", "rect", "left", "insetBlockStart", "inlineSize", "width", "blockSize", "height", "initialContent", "dispatchEvent", "handleSave", "columnIndex", "index", "setColumnWidth", "stopPropagation", "columns", "scrollToColumn", "presentation", "updateIfWithinBounds", "updateCells", "className", "React", "ref", "forwardedRef", "id", "TableValueEditor", "schema", "onFocus", "onSave", "onCreate", "rowDefault", "limitRows", "limitColumns", "overscroll", "onAxisResize", "handleAxisResize", "onClick", "handleGridClick", "onKeyDownCapture", "onWheelCapture", "onNewColumn", "TableContent", "Atom", "RegistryContext", "React", "useContext", "useEffect", "useMemo", "composable", "composableProps", "Menu", "createGapSeparator", "createMenuAction", "useMenuActions", "translationKey", "createTableToolbarActions", "stateAtom", "onAdd", "onSave", "customActions", "make", "get", "nodes", "add", "type", "icon", "label", "ns", "testId", "push", "state", "save", "iconOnly", "hidden", "viewDirty", "gap", "edges", "map", "id", "target", "source", "relation", "custom", "TableToolbar", "attendableId", "props", "forwardedRef", "registry", "set", "actionsCreator", "menuActions", "Root", "Toolbar", "ref", "displayName", "emptyColumnMeta", "Atom", "make", "grid", "TableContextProvider", "useTableContext", "createContext", "TABLE_ROOT_NAME", "TableRoot", "forwardRef", "children", "forwardedRef", "controllerRef", "useRef", "useImperativeHandle", "update", "cell", "current", "handleInsertRowResult", "result", "React", "displayName", "Table", "Root", "Toolbar", "TableToolbar", "Content", "TableContent", "RegistryContext", "React", "useCallback", "useContext", "useEffect", "useMemo", "useRef", "useState", "useDefaultValue", "mx", "DynamicTable", "classNames", "type", "typeProp", "name", "rows", "properties", "jsonSchema", "jsonSchemaProp", "rowActions", "onRowClick", "onRowAction", "props", "registry", "useContext", "RegistryContext", "dynamicTable", "setDynamicTable", "useState", "useMemo", "getBaseSchema", "typename", "useEffect", "makeDynamicTable", "tableRef", "useRef", "handleCellUpdate", "useCallback", "cell", "current", "update", "handleRowOrderChange", "features", "useDefaultValue", "selection", "enabled", "dataEditable", "model", "useTableModel", "object", "projection", "onCellUpdate", "onRowOrderChange", "presentation", "TablePresentation", "React", "div", "className", "mx", "Table", "Root", "ref", "Content", "ignoreAttention"]
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren, type RefObject, forwardRef, useImperativeHandle, useRef } from 'react';\n\nimport { type DxGridAxisMeta, type DxGridPosition } from '@dxos/react-ui-grid';\n\nimport { type InsertRowResult } from '../../model';\nimport { TableContent } from './TableContent';\nimport { TableToolbar } from './TableToolbar';\n\nconst columnDefault = { grid: { minSize: 80, maxSize: 640 } };\nconst rowDefault = { frozenRowsStart: { readonly: true, focusUnfurl: false } };\nconst emptyColumnMeta = Atom.make<DxGridAxisMeta>({ grid: {} });\n\n//\n// Context\n//\n\ntype TableContextValue = {\n /** Mutable ref populated by Content so Root can expose the controller. */\n controllerRef: RefObject<TableController>;\n};\n\nconst [TableContextProvider, useTableContext] = createContext<TableContextValue>('Table');\n\n//\n// Controller\n//\n\ntype TableController = {\n update?: (cell?: DxGridPosition) => void;\n handleInsertRowResult?: (insertRowResult?: InsertRowResult) => void;\n};\n\n//\n// Root\n//\n\nconst TABLE_ROOT_NAME = 'Table.Root';\n\ntype TableRootProps = PropsWithChildren;\n\nconst TableRoot = forwardRef<TableController, TableRootProps>(({ children }, forwardedRef) => {\n const controllerRef = useRef<TableController>({});\n\n useImperativeHandle(\n forwardedRef,\n () => ({\n update: (cell) => controllerRef.current?.update?.(cell),\n handleInsertRowResult: (result) => controllerRef.current?.handleInsertRowResult?.(result),\n }),\n [],\n );\n\n return <TableContextProvider controllerRef={controllerRef}>{children}</TableContextProvider>;\n});\n\nTableRoot.displayName = TABLE_ROOT_NAME;\n\n//\n// Table\n//\n\nexport const Table = {\n Root: TableRoot,\n Toolbar: TableToolbar,\n Content: TableContent,\n};\n\nexport type { TableController, TableRootProps };\nexport type { TableExportFormat } from './TableToolbar';\n\nexport { useTableContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';\nimport * as String from 'effect/String';\nimport React, { type MouseEvent, type WheelEvent, useCallback, useContext, useEffect, useMemo, useState } from 'react';\n\nimport { type Type } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport {\n type DxGridAxisMeta,\n type DxGridElement,\n type DxGridPlane,\n type DxGridPlaneRange,\n Grid,\n type GridContentProps,\n closestCell,\n gridSeparatorBlockEnd,\n gridSeparatorInlineEnd,\n} from '@dxos/react-ui-grid';\nimport { DxEditRequest } from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/ui-theme';\n\nimport { type InsertRowResult, ModalController, type TableModel, type TablePresentation } from '../../model';\nimport { tableButtons, tableControls } from '../../util';\nimport { type OnCreateHandler, type TableCellEditorProps, TableValueEditor } from '../TableCellEditor';\nimport { ColumnActionsMenu } from './ColumnActionsMenu';\nimport { ColumnSettings } from './ColumnSettings';\nimport { RowActionsMenu } from './RowActionsMenu';\nimport { TableController, useTableContext } from './Table';\n\nconst columnDefault = { grid: { minSize: 80, maxSize: 640 } };\nconst rowDefault = { frozenRowsStart: { readonly: true, focusUnfurl: false } };\nconst emptyColumnMeta = Atom.make<DxGridAxisMeta>({ grid: {} });\nconst emptyRowsAtom = Atom.make<unknown[]>([]);\nconst emptyCellUpdateAtom = Atom.make<number>(0);\n\n//\n// Content\n//\n\nconst TABLE_CONTENT_NAME = 'Table.Content';\n\nexport type TableContentProps = {\n schema?: Type.AnyEntity;\n model?: TableModel;\n presentation?: TablePresentation;\n // TODO(burdon): Factor out attention.\n ignoreAttention?: boolean;\n attendableId?: string;\n onCreate?: OnCreateHandler;\n onRowClick?: (row: any) => void;\n testId?: string;\n};\n\nexport const TableContent = composable<HTMLDivElement, TableContentProps>(\n (\n { schema, model, presentation, ignoreAttention, attendableId, onCreate, onRowClick, testId, ...props },\n forwardedRef,\n ) => {\n const registry = useContext(RegistryContext);\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n const { hasAttention } = useAttention(attendableId ?? model?.id ?? 'table');\n const modals = useMemo(() => new ModalController(registry), [registry]);\n const columnMeta = useAtomValue(model?.columnMeta ?? emptyColumnMeta);\n // Subscribe to rows atom to trigger re-render when rows change.\n const rows = useAtomValue(model?.rows ?? emptyRowsAtom);\n // Subscribe to cell update counter to trigger re-render when individual cells change.\n const cellUpdateCounter = useAtomValue(model?.cellUpdate ?? emptyCellUpdateAtom);\n // Derive column count from columnMeta (reactive) with fallback.\n const columnCount = Object.keys(columnMeta.grid).length || model?.projection.getFields().length || 0;\n\n const draftRowCount = model?.getDraftRowCount() ?? 0;\n\n const frozen = useMemo(() => {\n const noActionColumn =\n model?.features.dataEditable === false &&\n model?.features.schemaEditable === false &&\n model.rowActions.length === 0;\n\n return {\n frozenRowsStart: 1,\n frozenRowsEnd: Math.max(1, draftRowCount),\n frozenColsStart: model?.features.selection.enabled ? 1 : 0,\n frozenColsEnd: noActionColumn ? 0 : 1,\n };\n }, [model, draftRowCount]);\n\n const getCells = useCallback<NonNullable<GridContentProps['getCells']>>(\n (range: DxGridPlaneRange, plane: DxGridPlane) => presentation?.getCells(range, plane) ?? {},\n [presentation],\n );\n\n useEffect(() => {\n if (!dxGrid || !presentation) {\n return;\n }\n\n dxGrid.getCells = getCells;\n }, [dxGrid, presentation, getCells]);\n\n // Trigger grid update when rows or cell values change.\n useEffect(() => {\n if (!dxGrid) {\n return;\n }\n\n dxGrid.updateCells(true);\n dxGrid.requestUpdate();\n }, [dxGrid, rows, cellUpdateCounter]);\n\n const handleInsertRowResult = useCallback(\n (insertResult?: InsertRowResult) => {\n if (insertResult === 'draft') {\n requestAnimationFrame(() => {\n dxGrid?.setFocus({ plane: 'frozenRowsEnd', col: 0, row: 0 });\n dxGrid?.refocus();\n });\n } else {\n requestAnimationFrame(() => {\n dxGrid?.setFocus({ plane: 'grid', col: 0, row: model ? model.getRowCount() - 1 : 0 });\n dxGrid?.refocus();\n });\n }\n },\n [model, dxGrid],\n );\n\n const handleSave = useCallback(() => {\n dxGrid?.updateCells(true);\n dxGrid?.requestUpdate();\n }, [dxGrid]);\n\n const handleSaveDraftRow = useCallback(\n (rowIndex = 0) => {\n if (model && dxGrid) {\n const didCommitSuccessfully = model.commitDraftRow(rowIndex);\n if (didCommitSuccessfully) {\n requestAnimationFrame(() => {\n dxGrid.scrollToEndRow();\n });\n }\n }\n },\n [model, dxGrid],\n );\n\n const handleGridClick = useCallback(\n (event: MouseEvent) => {\n const cell = closestCell(event.target as HTMLElement);\n if (cell) {\n const { row: rowIndex, plane } = cell;\n if (onRowClick) {\n if (plane === 'grid') {\n const row = model?.getRowAt(rowIndex);\n row && onRowClick(row);\n } else {\n onRowClick(cell);\n }\n }\n\n if (model?.features.selection.enabled && model?.selection.selectionMode === 'single') {\n model.selection.toggleSelectionForRowIndex(rowIndex);\n }\n }\n\n if (!modals) {\n return;\n }\n\n const buttonSelector = Object.values(tableButtons)\n .map((button) => `button[${button.attr}]`)\n .join(',');\n\n const tableButtonElement = (event.target as HTMLElement).closest(buttonSelector) as HTMLElement;\n if (tableButtonElement) {\n const button = Object.values(tableButtons).find((btn) => tableButtonElement.hasAttribute(btn.attr));\n if (!button) {\n return;\n }\n\n modals.setTrigger(tableButtonElement);\n const data = button.getData(tableButtonElement);\n switch (data.type) {\n case 'rowMenu': {\n modals.showRowMenu(data.rowIndex);\n break;\n }\n case 'columnSettings': {\n modals.showColumnMenu(data.fieldId);\n break;\n }\n case 'newColumn': {\n modals.showColumnCreator();\n break;\n }\n case 'sort': {\n model?.toggleSort(data.fieldId);\n break;\n }\n case 'saveDraftRow': {\n handleSaveDraftRow();\n break;\n }\n }\n return;\n }\n\n const controlSelector = Object.values(tableControls)\n .map((control) => `input[${control.attr}]`)\n .join(',');\n\n const controlElement = (event.target as HTMLElement).closest(controlSelector) as HTMLElement;\n if (controlElement) {\n const control = Object.values(tableControls).find((ctrl) => controlElement.hasAttribute(ctrl.attr));\n if (!control) {\n return;\n }\n\n const data = control.getData(controlElement);\n switch (data.type) {\n case 'checkbox': {\n if (data.header) {\n model?.selection.setSelection(model.selection.allRowsSelected ? 'none' : 'all');\n } else {\n model?.selection.toggleSelectionForRowIndex(data.rowIndex);\n }\n break;\n }\n case 'switch': {\n if (model) {\n model.updateCellData({ row: data.rowIndex, col: data.colIndex }, (value) => !value);\n }\n break;\n }\n }\n }\n },\n [model, modals, dxGrid],\n );\n\n const handleFocus = useCallback<NonNullable<TableCellEditorProps['onFocus']>>(\n (increment, delta, cell) => {\n if (dxGrid && model) {\n if (cell?.plane === 'grid' && cell?.row >= model.getRowCount() - 1 && increment !== 'col') {\n handleInsertRowResult(draftRowCount < 1 ? model.insertRow() : 'final');\n } else if (cell?.plane === 'frozenRowsEnd' && increment === 'row') {\n handleSaveDraftRow(cell.row);\n handleInsertRowResult(model.insertRow());\n } else {\n dxGrid.refocus(increment, delta);\n }\n }\n },\n [dxGrid, model],\n );\n\n const handleKeyDown = useCallback<NonNullable<GridContentProps['onKeyDown']>>(\n (event) => {\n if (!model?.features.dataEditable) {\n return;\n }\n\n const cell = closestCell(event.target);\n if (!model || !cell) {\n return;\n }\n\n // Handle Meta+C (Copy) and Meta+V (Paste) commands\n if (event.metaKey || event.ctrlKey) {\n switch (event.key) {\n case 'c': {\n // Copy focused cell's text content to clipboard\n try {\n const cellData = model.getCellData(cell);\n const textContent = cellData?.toString() ?? '';\n void navigator.clipboard.writeText(textContent);\n event.preventDefault();\n } catch (error) {\n log.catch(error);\n }\n break;\n }\n case 'v': {\n // Paste clipboard content to focused cell\n event.preventDefault();\n void navigator.clipboard.readText().then((clipboardText) => {\n try {\n // Attempt to set the cell's content to clipboard content\n model.setCellData(cell, String.trim(clipboardText).replace(/[\\n\\r]+/, ' '));\n handleSave();\n } catch {\n // If validation fails, emit a DxEditRequest event with initialContent from clipboard\n // TODO(thure): Should `dx-grid` expose a method like this?\n const cellElement = (event.target as HTMLElement).closest(\n '[data-dx-grid-action=\"cell\"]',\n ) as HTMLElement;\n if (cellElement) {\n const rect = cellElement.getBoundingClientRect();\n const editRequest = new DxEditRequest({\n cellIndex: `${cell.plane},${cell.col},${cell.row}`,\n cellBox: {\n insetInlineStart: rect.left,\n insetBlockStart: rect.top,\n inlineSize: rect.width,\n blockSize: rect.height,\n },\n cellElement,\n initialContent: clipboardText,\n });\n cellElement.dispatchEvent(editRequest);\n }\n }\n });\n break;\n }\n }\n }\n\n switch (event.key) {\n case 'Backspace':\n case 'Delete': {\n try {\n model.setCellData(cell, undefined);\n event.preventDefault();\n handleSave();\n } catch {\n // Delete results in a validation error; don’t prevent default so dx-grid can emit an edit request.\n }\n break;\n }\n }\n },\n [model, dxGrid, handleSave],\n );\n\n const handleAxisResize = useCallback<NonNullable<GridContentProps['onAxisResize']>>(\n (event) => {\n if (event.axis === 'col') {\n const columnIndex = parseInt(event.index, 10);\n model?.setColumnWidth(columnIndex, event.size);\n }\n },\n [model],\n );\n\n const handleWheel = useCallback(\n (event: WheelEvent) => {\n if (!ignoreAttention && !hasAttention) {\n event.stopPropagation();\n }\n },\n [hasAttention, ignoreAttention],\n );\n\n const handleNewColumn = useCallback(() => {\n const columns = model?.getColumnCount();\n if (dxGrid && columns) {\n dxGrid.scrollToColumn(columns - 1);\n }\n }, [model, dxGrid]);\n\n // Publish controller to Root.\n const { controllerRef } = useTableContext(TABLE_CONTENT_NAME);\n controllerRef.current = useMemo<TableController>(() => {\n if (!dxGrid || !presentation) {\n return {};\n }\n\n return {\n update: (cell) => {\n if (cell) {\n dxGrid.updateIfWithinBounds(cell, true);\n } else {\n dxGrid.updateCells(true);\n dxGrid.requestUpdate();\n }\n },\n handleInsertRowResult,\n };\n }, [dxGrid, model, presentation]);\n\n if (!model || !modals) {\n return <span className='dx-attention-surface' />;\n }\n\n return (\n <div {...composableProps(props, { classNames: 'dx-container relative' })} ref={forwardedRef}>\n <Grid.Root id={model.id ?? 'table-grid'}>\n <TableValueEditor\n model={model}\n modals={modals}\n schema={schema}\n onFocus={handleFocus}\n onSave={handleSave}\n onCreate={onCreate}\n />\n <Grid.Content\n className={mx('[--dx-grid-base:var(--base-surface)]', gridSeparatorInlineEnd, gridSeparatorBlockEnd)}\n frozen={frozen}\n columns={columnMeta}\n columnDefault={columnDefault}\n rowDefault={rowDefault}\n limitRows={rows.length}\n limitColumns={columnCount}\n overscroll='trap'\n onAxisResize={handleAxisResize}\n onClick={handleGridClick}\n onKeyDownCapture={handleKeyDown}\n onWheelCapture={handleWheel}\n {...(testId && { 'data-testid': testId })}\n ref={setDxGrid}\n />\n <RowActionsMenu model={model} modals={modals} />\n <ColumnActionsMenu model={model} modals={modals} />\n <ColumnSettings model={model} modals={modals} onNewColumn={handleNewColumn} />\n </Grid.Root>\n </div>\n );\n },\n);\n\nTableContent.displayName = TABLE_CONTENT_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Registry } from '@effect-atom/atom-react';\nimport type * as Types from 'effect/Types';\n\nimport { Filter, type JsonSchema, Obj, Order, Query, type QueryAST, Ref, Type, type View } from '@dxos/echo';\nimport {\n ProjectionModel,\n type SchemaPropertyDefinition,\n ViewModel,\n createEchoChangeCallback,\n getSchemaFromJsonSchema,\n getSchemaFromPropertyDefinitions,\n} from '@dxos/schema';\n\nimport { Table } from '../types';\n\n// TODO(ZaymonFC): Upstream these extra fields to SchemaPropertyDefinition to enhance schema-tools schema creation.\ntype PropertyDisplayProps = {\n size: number;\n title: string;\n sort: QueryAST.OrderDirection;\n};\n\nexport type TablePropertyDefinition = SchemaPropertyDefinition & Partial<PropertyDisplayProps>;\n\n/**\n * @deprecated\n */\n// TODO(burdon): Remove variance.\nexport const getBaseSchema = ({\n type,\n typename,\n properties,\n jsonSchema,\n}: {\n type?: Type.AnyEntity;\n typename?: string;\n properties?: TablePropertyDefinition[];\n jsonSchema?: Types.DeepMutable<JsonSchema.JsonSchema>;\n}): { typename: string; type: Type.AnyEntity } => {\n const resolved =\n typename && properties\n ? getSchemaFromPropertyDefinitions(typename, properties)\n : (type ?? (jsonSchema ? getSchemaFromJsonSchema(jsonSchema, typename) : undefined));\n if (!resolved) {\n throw new Error('invalid properties');\n }\n\n return { typename: Type.getTypename(resolved)!, type: resolved };\n};\n\nexport const makeDynamicTable = ({\n registry,\n type,\n properties,\n}: {\n registry: Registry.Registry;\n type: Type.AnyEntity;\n properties?: TablePropertyDefinition[];\n}): { projection: ProjectionModel; object: Table.Table } => {\n const jsonSchema = type.jsonSchema;\n const view = ViewModel.make({\n query: Query.select(Filter.everything()),\n jsonSchema,\n type,\n ...(properties && { fields: properties.map((property) => property.name) }),\n });\n const object = Obj.make(Table.Table, { view: Ref.make(view), sizes: {} });\n\n const projection = new ProjectionModel({\n registry,\n view,\n baseSchema: jsonSchema,\n change: createEchoChangeCallback(view, type),\n });\n projection.normalizeView();\n if (properties && projection.getFields()) {\n setProperties(view, projection, object, properties);\n }\n\n return { projection, object };\n};\n\nconst setProperties = (\n view: View.View,\n projection: ProjectionModel,\n table: Table.Table,\n properties: TablePropertyDefinition[],\n) => {\n for (const property of properties) {\n const field = projection.getFields().find((field) => field.path === property.name);\n if (field) {\n if (property.size !== undefined) {\n Obj.update(table, (table) => {\n table.sizes[field.path] = property.size!;\n });\n }\n\n if (property.title !== undefined) {\n const fieldProjection = projection.getFieldProjection(field.id);\n projection.setFieldProjection({\n ...fieldProjection,\n props: { ...fieldProjection.props, title: property.title },\n });\n }\n\n if (property.sort) {\n // Apply sort to query instead of deprecated view.sort\n const currentQuery = Query.fromAst(Obj.getSnapshot(view).query.ast);\n // Use any type parameter since we're working with dynamic field paths\n const newQuery = currentQuery.orderBy(Order.property<any>(field.path as string, property.sort));\n Obj.update(view, (view) => {\n // Type assertion needed because Query AST types have some variance issues.\n view.query.ast = newQuery.ast as typeof view.query.ast;\n });\n }\n }\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Explicitly marks signal dependencies for tracking within effects.\n * Returns the passed value to enable inline usage.\n */\nexport const touch = <T>(value: T) => value;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\n/**\n * Creates a narrowed schema from an original schema that only includes\n * the specified paths. This allows form components to only display\n * and edit/validate specific fields rather than the entire object.\n *\n * @param schema The original schema to narrow\n * @param paths Array of field paths to extract\n * @returns A narrowed Schema instance containing only the properties at the specified paths\n */\nexport const narrowSchema = <S extends Schema.Schema.AnyNoContext>(\n schema: S,\n paths: string[],\n): Schema.Schema<unknown, unknown> | undefined => {\n const ast = (schema as any)?.ast;\n\n if (SchemaAST.isTypeLiteral(ast)) {\n // Filter property signatures that match any of the provided paths\n const propertySignatures = ast.propertySignatures.filter((signature) => paths.includes(signature.name.toString()));\n\n // If we found at least one matching property\n if (propertySignatures.length > 0) {\n // Create a new TypeLiteral with only the matching properties\n const narrowType = new SchemaAST.TypeLiteral(propertySignatures, []);\n return Schema.make(narrowType);\n }\n }\n\n return undefined;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, type Registry } from '@effect-atom/atom-react';\nimport { type MutableRefObject, type RefObject } from 'react';\n\nexport type ColumnSettingsMode = { type: 'create' } | { type: 'edit'; fieldId: string };\n\nexport type ModalState =\n | { type: 'row'; rowIndex: number }\n | { type: 'column'; fieldId: string }\n | { type: 'refPanel'; targetId: string; typename: string }\n | { type: 'columnSettings'; mode: ColumnSettingsMode }\n | { type: 'closed' };\n\nexport class ModalController {\n private readonly _registry: Registry.Registry;\n private readonly _state: Atom.Writable<ModalState>;\n private readonly _triggerRef: MutableRefObject<HTMLElement> = { current: null as unknown as HTMLElement };\n\n constructor(registry: Registry.Registry) {\n this._registry = registry;\n this._state = Atom.make<ModalState>({ type: 'closed' });\n }\n\n public get state(): Atom.Atom<ModalState> {\n return this._state;\n }\n\n public get stateValue(): ModalState {\n return this._registry.get(this._state);\n }\n\n public get trigger() {\n return this._triggerRef as RefObject<HTMLButtonElement>;\n }\n\n public setTrigger = (trigger: HTMLElement) => {\n this._triggerRef.current = trigger;\n };\n\n public showRowMenu = (rowIndex: number) => {\n this._registry.set(this._state, { type: 'row', rowIndex });\n };\n\n public showColumnMenu = (fieldId: string) => {\n this._registry.set(this._state, { type: 'column', fieldId });\n };\n\n public showColumnCreator = () => {\n this._registry.set(this._state, { type: 'columnSettings', mode: { type: 'create' } });\n };\n\n public showReferencePanel = (targetId: string, schemaId: string) => {\n this._registry.set(this._state, { type: 'refPanel', targetId, typename: schemaId });\n };\n\n public openColumnSettings = () => {\n const currentState = this._registry.get(this._state);\n if (currentState.type === 'column') {\n const fieldId = currentState.fieldId;\n // Queue next render to let the column action modal close completely.\n requestAnimationFrame(() => {\n this._registry.set(this._state, {\n type: 'columnSettings',\n mode: { type: 'edit', fieldId },\n });\n });\n }\n };\n\n public close = () => {\n this._registry.set(this._state, { type: 'closed' });\n };\n}\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Completion } from '@codemirror/autocomplete';\nimport { EditorView } from '@codemirror/view';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { debounce } from '@dxos/async';\nimport { type Type } from '@dxos/echo';\nimport { Format, TypeEnum } from '@dxos/echo/Format';\nimport { invariant } from '@dxos/invariant';\nimport { type DxGridAxis, type DxGridPosition } from '@dxos/lit-grid';\nimport {\n type EditorBlurHandler,\n type EditorKeyEvent,\n type EditorKeyOrBlurHandler,\n GridCellEditor,\n type GridCellEditorProps,\n type GridScopedProps,\n editorKeys,\n parseCellIndex,\n useGridContext,\n} from '@dxos/react-ui-grid';\nimport { type FieldProjection } from '@dxos/schema';\n\nimport { type ModalController, type TableModel } from '../../model';\nimport { CellValidationMessage } from './CellValidationMessage';\nimport { FormCellEditor, type OnCreateHandler } from './FormCellEditor';\n\n/**\n * Option to create new object/value.\n */\nexport type QueryResult = Pick<Completion, 'label'> & {\n data: any;\n};\n\nexport type TableCellEditorProps<T extends Type.AnyEntity = Type.AnyEntity> = {\n schema?: T;\n model?: TableModel;\n modals?: ModalController;\n onFocus?: (axis?: DxGridAxis, delta?: -1 | 0 | 1, cell?: DxGridPosition) => void;\n onCreate?: OnCreateHandler;\n onSave?: () => void;\n};\n\nexport const TableValueEditor = <T extends Type.AnyEntity = Type.AnyEntity>({\n __gridScope,\n schema,\n model,\n modals,\n onFocus,\n onSave,\n onCreate,\n}: GridScopedProps<TableCellEditorProps<T>>) => {\n const { editing } = useGridContext('TableValueEditor', __gridScope);\n\n const fieldProjection = useMemo<FieldProjection | undefined>(() => {\n if (!model || !editing) {\n return;\n }\n\n const { col } = parseCellIndex(editing.index);\n const field = model.projection.getFields()[col];\n const fieldProjection = model.projection.getFieldProjection(field.id);\n invariant(fieldProjection);\n return fieldProjection;\n }, [model, editing]);\n\n if (\n fieldProjection?.props.type === TypeEnum.Array ||\n fieldProjection?.props.format === Format.TypeFormat.SingleSelect ||\n fieldProjection?.props.format === Format.TypeFormat.Ref\n // TODO(thure): Support `Format.TypeFormat.MultiSelect`\n ) {\n return (\n <FormCellEditor<T>\n __gridScope={__gridScope}\n schema={schema}\n model={model}\n fieldProjection={fieldProjection}\n modals={modals}\n onSave={onSave}\n onCreate={onCreate}\n />\n );\n }\n\n // For all other types, use the existing cell editor.\n return <TableCellEditor model={model} modals={modals} onFocus={onFocus} onSave={onSave} __gridScope={__gridScope} />;\n};\n\nconst cellEditorSlots: GridCellEditorProps['slots'] = {\n content: {\n className: '!py-(--dx-grid-cell-editor-padding-block)',\n },\n};\n\nexport const TableCellEditor = ({\n __gridScope,\n model,\n modals,\n onFocus,\n onSave,\n}: GridScopedProps<TableCellEditorProps>) => {\n const { editing, setEditing } = useGridContext('TableCellEditor', __gridScope);\n const suppressNextBlur = useRef(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n const [validationVariant, setValidationVariant] = useState<'error' | 'warning'>('error');\n\n const fieldProjection = useMemo<FieldProjection | undefined>(() => {\n if (!model || !editing) {\n return;\n }\n\n const { col } = parseCellIndex(editing.index);\n const field = model.projection.getFields()[col];\n const fieldProjection = model.projection.getFieldProjection(field.id);\n invariant(fieldProjection);\n return fieldProjection;\n }, [model, editing]);\n\n // TOOD(burdon): Attach to event handler?\n const handleEnter = useCallback(\n async (value: any) => {\n if (!model || !editing) {\n return;\n }\n\n const cell = parseCellIndex(editing.index);\n const validationResult = await model.validateCellData(cell, value);\n\n if (validationResult.valid) {\n setValidationError(null);\n model.setCellData(cell, value);\n onFocus?.();\n setEditing(null);\n onSave?.();\n } else {\n setValidationError(validationResult.error);\n setValidationVariant('error');\n }\n },\n [model, editing, onFocus, setEditing],\n );\n\n const handleBlur = useCallback<EditorBlurHandler>(\n async (value) => {\n if (suppressNextBlur.current) {\n suppressNextBlur.current = false;\n } else if (model && editing) {\n // Save silently if validation passes\n const cell = parseCellIndex(editing.index);\n if (value !== undefined) {\n const result = await model.validateCellData(cell, value);\n if (result.valid) {\n setValidationError(null);\n model.setCellData(cell, value);\n setEditing(null);\n onSave?.();\n }\n }\n }\n },\n [model, editing],\n );\n\n const handleClose = useCallback<EditorKeyOrBlurHandler>(\n async (value, event) => {\n if (!model || !editing || !fieldProjection) {\n return;\n }\n\n const cell = parseCellIndex(editing.index);\n if (value !== undefined) {\n // Pre-commit validation check.\n const result = await model.validateCellData(cell, value);\n\n if (result.valid) {\n suppressNextBlur.current = true;\n setValidationError(null);\n model.setCellData(cell, value);\n setEditing(null);\n onSave?.();\n if (event && onFocus) {\n onFocus(determineNavigationAxis(event), determineNavigationDelta(event), cell);\n }\n } else {\n setValidationError(result.error);\n setValidationVariant('error');\n }\n } else {\n suppressNextBlur.current = true;\n setValidationError(null);\n setEditing(null);\n onSave?.();\n if (event && onFocus) {\n onFocus(determineNavigationAxis(event), determineNavigationDelta(event));\n }\n }\n },\n [model, editing, onFocus, fieldProjection, setEditing, onSave],\n );\n\n const extensions = useMemo(() => {\n if (!fieldProjection) {\n return [];\n }\n\n const extensions = [\n editorKeys({\n onClose: handleClose,\n ...(editing?.initialContent && { onNav: handleClose }),\n }),\n ];\n // Add validation extension to handle content changes.\n if (model && editing) {\n extensions.push(\n EditorView.updateListener.of(\n debounce((update) => {\n const content = update.state.doc.toString();\n const cell = parseCellIndex(editing.index);\n\n // Perform validation on content change.\n void model.validateCellData(cell, content).then((result) => {\n if (result.valid) {\n setValidationError(null);\n } else {\n setValidationError(result.error);\n setValidationVariant('error');\n }\n });\n }, 10),\n ),\n );\n }\n\n return extensions;\n }, [model, modals, editing, fieldProjection, handleClose]);\n\n const getCellContent = useCallback<GridCellEditorProps['getCellContent']>(() => {\n if (model && editing) {\n const cell = parseCellIndex(editing.index);\n const value = model.getCellData(cell);\n return value !== undefined ? String(value) : '';\n }\n }, [model, editing]);\n\n return (\n <>\n <CellValidationMessage validationError={validationError} variant={validationVariant} __gridScope={__gridScope} />\n <GridCellEditor\n extensions={extensions}\n slots={cellEditorSlots}\n getCellContent={getCellContent}\n onBlur={handleBlur}\n />\n </>\n );\n};\n\nconst determineNavigationAxis = ({ key }: EditorKeyEvent): 'col' | 'row' | undefined => {\n switch (key) {\n case 'ArrowUp':\n case 'ArrowDown':\n case 'Enter': {\n return 'row';\n }\n\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'Tab':\n return 'col';\n }\n};\n\nconst determineNavigationDelta = ({ key, shift }: EditorKeyEvent): -1 | 1 => {\n switch (key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n return -1;\n\n case 'ArrowDown':\n case 'ArrowRight':\n return 1;\n }\n\n return shift ? -1 : 1;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { type GridScopedProps, useGridContext } from '@dxos/react-ui-grid';\n\nexport type CellValidationMessageProps = {\n validationError: string | null;\n variant?: 'error' | 'warning';\n};\n\nexport const CellValidationMessage = ({\n __gridScope,\n validationError,\n variant = 'error',\n}: GridScopedProps<CellValidationMessageProps>) => {\n const { editing, editBox: box } = useGridContext('GridSheetCellEditor', __gridScope);\n\n if (!editing || !validationError) {\n return null;\n }\n\n const bgClass = variant === 'error' ? 'bg-error-surface' : 'bg-warning-surface';\n const textClass = variant === 'error' ? 'text-error-fg' : 'text-warning-fg';\n\n return (\n <div\n className={`absolute ${bgClass} ${textClass} rounded-h-sm text-xs p-1`}\n style={{\n ...{ '--dx-grid-cell-width': `${box?.inlineSize ?? 200}px` },\n zIndex: 10,\n insetBlockEnd: `calc(100% - ${box.insetBlockStart}px)`,\n insetInlineStart: box.insetInlineStart,\n inlineSize: box.inlineSize,\n }}\n >\n {validationError}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport type * as Schema from 'effect/Schema';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Entity, Ref, Type } from '@dxos/echo';\nimport { SchemaEx } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { type Label, Popover } from '@dxos/react-ui';\nimport { Form, type FormRootProps, type RefFieldProps } from '@dxos/react-ui-form';\nimport { parseCellIndex, useGridContext } from '@dxos/react-ui-grid';\nimport { type FieldProjection } from '@dxos/schema';\nimport { getDeep, isTruthy, setDeep } from '@dxos/util';\n\nimport { translationKey } from '#translations';\n\nimport { type ModalController, type TableModel, type TableRow } from '../../model';\nimport { narrowSchema } from '../../util';\n\nconst createOptionLabel: Label = ['create-new-object.label', { ns: translationKey }];\n\nexport type OnCreateHandler = (schema: Type.AnyEntity, values: any) => Parameters<typeof Ref.make>[0];\n\nexport type FormCellEditorProps<T extends Type.AnyEntity = Type.AnyEntity> = {\n __gridScope: any;\n schema?: T;\n model?: TableModel;\n fieldProjection: FieldProjection;\n modals?: ModalController; // TODO(burdon): Not used. Remove?\n onSave?: () => void;\n onCreate?: OnCreateHandler;\n} & Omit<FormRootProps<any>, 'values' | 'schema' | 'onCreate'>;\n\nexport const FormCellEditor = <T extends Type.AnyEntity = Type.AnyEntity>({\n __gridScope,\n schema,\n model,\n fieldProjection,\n onSave,\n onCreate,\n ...formProps\n}: FormCellEditorProps<T>) => {\n const anchorRef = useRef<HTMLButtonElement | null>(null);\n const { id: _gridId, editing: contextEditing, setEditing } = useGridContext('ArrayEditor', __gridScope);\n const [editing, setLocalEditing] = useState(false);\n\n useEffect(() => {\n if (contextEditing && contextEditing.cellElement) {\n anchorRef.current = (contextEditing.cellElement as HTMLElement).querySelector(\n '.dx-grid__cell__content',\n ) as HTMLButtonElement;\n setLocalEditing(true);\n } else {\n anchorRef.current = null;\n setLocalEditing(false);\n }\n }, [contextEditing]);\n\n const narrowedSchema = useMemo<Schema.Schema.AnyNoContext | undefined>(() => {\n if (!schema) {\n return undefined;\n }\n\n return narrowSchema(Type.getSchema(schema), [fieldProjection.field.path]);\n }, [JSON.stringify(schema), fieldProjection.field.path]); // TODO(burdon): Avoid stringify.\n\n const originalRow = useMemo<TableRow | undefined>(() => {\n if (model && contextEditing) {\n // Check if this is a draft cell and get the appropriate row data\n const cell = parseCellIndex(contextEditing.index);\n if (model.isDraftCell(cell)) {\n const draftRow = model.getDraftRows()[cell.row];\n invariant(draftRow);\n return draftRow.data;\n } else {\n const row = model.getRowAt(cell.row);\n invariant(row);\n return row;\n }\n }\n\n return undefined;\n }, [model, contextEditing]);\n\n // NOTE: Important to get a mutable deep clone to eject from the echo object.\n // TODO(wittjosiah): Consider using something like Obj.clone for this use case.\n const initialFormValues = useMemo(() => (originalRow ? JSON.parse(JSON.stringify(originalRow)) : {}), [originalRow]);\n const [formValues, setFormValues] = useState<any>(initialFormValues);\n\n const handleValuesChanged = useCallback<NonNullable<FormRootProps<any>['onValuesChanged']>>((values) => {\n setFormValues(values);\n }, []);\n const handleOpenChange = useCallback((nextOpen: boolean) => {\n if (nextOpen === false) {\n setEditing(null);\n onSave?.();\n }\n setLocalEditing(nextOpen);\n }, []);\n\n const handleSave = useCallback<NonNullable<FormRootProps<any>['onSave']>>(\n (values) => {\n if (!originalRow) {\n return;\n }\n const path = fieldProjection.field.path;\n const value = getDeep(values, [path]);\n // Use model's changeRow for consistent mutation handling.\n if (model) {\n model.changeRow(originalRow, (mutableRow) => {\n setDeep(mutableRow, [path], value);\n });\n } else {\n setDeep(originalRow, [path], value);\n }\n contextEditing?.cellElement?.focus();\n setEditing(null);\n setLocalEditing(false);\n onSave?.();\n },\n [fieldProjection.field.path, onSave, contextEditing, originalRow, model],\n );\n\n const handleCreate = useCallback<NonNullable<FormRootProps<any>['onCreate']>>(\n (schema, values) => {\n const objectWithId = onCreate?.(schema, values);\n if (objectWithId && originalRow) {\n const ref = Ref.make(objectWithId);\n const path = fieldProjection.field.path;\n // Use model's changeRow for consistent mutation handling.\n if (model) {\n model.changeRow(originalRow, (mutableRow) => {\n setDeep(mutableRow, [path], ref);\n });\n } else {\n setDeep(originalRow, [path], ref);\n }\n }\n contextEditing?.cellElement?.focus();\n setEditing(null);\n setLocalEditing(false);\n onSave?.();\n },\n [fieldProjection.field.path, onSave, contextEditing, originalRow, onCreate, model],\n );\n\n const getOptions = useCallback<NonNullable<RefFieldProps['getOptions']>>(\n (results) =>\n results\n .map((obj) => {\n return {\n id: Entity.getURI(obj),\n label: SchemaEx.getValue(obj, fieldProjection.field.referencePath!) || obj.id.toString(),\n };\n })\n .filter(isTruthy),\n [fieldProjection],\n );\n\n if (!editing) {\n return null;\n }\n\n return (\n <Popover.Root open={editing} onOpenChange={handleOpenChange}>\n <Popover.VirtualTrigger virtualRef={anchorRef} />\n <Popover.Portal>\n <Popover.Content tabIndex={-1} classNames='dx-card-popover-width dx-density-md'>\n <Popover.Arrow />\n <Popover.Viewport>\n <Form.Root\n {...formProps}\n autoFocus\n schema={narrowedSchema}\n values={formValues}\n onValuesChanged={handleValuesChanged}\n projection={model?.projection}\n createInitialValuePath={fieldProjection.field.referencePath}\n createOptionIcon='ph--plus--regular'\n createOptionLabel={createOptionLabel}\n db={model?.db}\n getOptions={getOptions}\n onCreate={handleCreate}\n onSave={handleSave}\n >\n <Form.Viewport>\n <Form.Content>\n <Form.FieldSet />\n <Form.Actions />\n </Form.Content>\n </Form.Viewport>\n </Form.Root>\n </Popover.Viewport>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { DropdownMenu, useTranslation } from '@dxos/react-ui';\n\nimport { translationKey } from '#translations';\n\nimport { type ModalController, type TableModel } from '../../model';\n\nexport type ColumnActionsMenuProps = {\n model: TableModel;\n modals: ModalController;\n};\n\nexport const ColumnActionsMenu = ({ model, modals }: ColumnActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const state = useAtomValue(modals.state);\n if (state?.type !== 'column') {\n return null;\n }\n\n const currentSort = model.getSorting();\n const isCurrentColumnSorted = currentSort?.fieldId === state.fieldId;\n\n return (\n <DropdownMenu.Root modal={false} open={true} onOpenChange={modals.close}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Portal>\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n {(!isCurrentColumnSorted || currentSort?.direction === 'asc') && (\n <DropdownMenu.Item\n data-testid='column-sort-descending'\n onClick={() => model.setSort(state.fieldId, 'desc')}\n >\n {t('column-action-sort-descending.menu')}\n </DropdownMenu.Item>\n )}\n {(!isCurrentColumnSorted || currentSort?.direction === 'desc') && (\n <DropdownMenu.Item\n data-testid='column-sort-ascending'\n onClick={() => model.setSort(state.fieldId, 'asc')}\n >\n {t('column-action-sort-ascending.menu')}\n </DropdownMenu.Item>\n )}\n {isCurrentColumnSorted && (\n <DropdownMenu.Item data-testid='column-clear-sort' onClick={() => model.clearSort()}>\n {t('column-action-clear-sorting.menu')}\n </DropdownMenu.Item>\n )}\n {model.getColumnCount() > 1 && model.features.schemaEditable && (\n <DropdownMenu.Item data-testid='column-delete' onClick={() => model.deleteColumn(state.fieldId)}>\n {t('column-action-delete.menu')}\n </DropdownMenu.Item>\n )}\n {model.features.schemaEditable && (\n <DropdownMenu.Item data-testid='column-settings' onClick={() => modals.openColumnSettings()}>\n {t('column-action-settings.menu')}\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { type Registry, type View } from '@dxos/echo';\nimport { Popover } from '@dxos/react-ui';\nimport { FieldEditor } from '@dxos/react-ui-form';\n\nimport { type ModalController, type TableModel } from '../../model';\n\ntype ColumnSettingsProps = {\n registry?: Registry.Registry;\n model?: TableModel;\n modals: ModalController;\n onNewColumn: () => void;\n};\n\nexport const ColumnSettings = ({ registry, model, modals, onNewColumn }: ColumnSettingsProps) => {\n const [newField, setNewField] = useState<View.FieldType>();\n const state = useAtomValue(modals.state);\n\n useEffect(() => {\n if (state?.type === 'columnSettings' && state.mode.type === 'create' && model?.projection) {\n setNewField(model.projection.createFieldProjection());\n requestAnimationFrame(() => {\n onNewColumn();\n });\n } else {\n setNewField(undefined);\n }\n }, [model?.projection, state]);\n\n const existingField = useMemo(() => {\n if (state?.type === 'columnSettings') {\n const { mode } = state;\n if (mode.type === 'edit') {\n return model?.projection?.getFields().find((f) => f.id === mode.fieldId);\n }\n }\n return undefined;\n }, [model?.projection, state]);\n\n const field = existingField ?? newField;\n\n const handleSave = useCallback(() => {\n modals.close();\n }, [modals]);\n\n const handleCancel = useCallback(() => {\n if (state?.type === 'columnSettings' && state.mode.type === 'create' && newField) {\n model?.projection.deleteFieldProjection(newField.id);\n }\n }, [model?.projection, state, newField]);\n\n if (!model?.projection || !field) {\n return null;\n }\n\n return (\n <Popover.Root modal={false} open={state?.type === 'columnSettings'}>\n <Popover.VirtualTrigger virtualRef={modals.trigger} />\n <Popover.Portal>\n <Popover.Content classNames='md:w-64'>\n <Popover.Viewport>\n <FieldEditor\n projection={model.projection}\n field={field}\n registry={registry}\n onSave={handleSave}\n onCancel={handleCancel}\n />\n </Popover.Viewport>\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { DropdownMenu, toLocalizedString, useTranslation } from '@dxos/react-ui';\n\nimport { translationKey } from '#translations';\n\nimport { type ModalController, type TableModel } from '../../model';\n\ntype RowActionsMenuProps = { model: TableModel; modals: ModalController };\n\nexport const RowActionsMenu = ({ model, modals }: RowActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const hasSelection = model.selection.hasSelection;\n const state = useAtomValue(modals.state);\n if (state?.type !== 'row') {\n return null;\n }\n return (\n <DropdownMenu.Root modal={false} open={true} onOpenChange={modals.close}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n {/* Custom actions */}\n {model.rowActions?.length > 0 && (\n <>\n <DropdownMenu.Group>\n {model.rowActions?.map((action) => (\n <DropdownMenu.Item\n key={action.id}\n data-testid={`row-action-${action.id}`}\n onClick={() => {\n modals.close();\n model.handleRowAction(action.id, state.rowIndex);\n }}\n >\n {toLocalizedString(action.label, t)}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Group>\n <DropdownMenu.Separator />\n </>\n )}\n {/* Default actions */}\n {model.features.dataEditable !== false && (\n <DropdownMenu.Item data-testid='row-menu-delete' onClick={() => model.deleteRow(state.rowIndex)}>\n {t(hasSelection ? 'bulk-delete-row.label' : 'delete-row.label')}\n </DropdownMenu.Item>\n )}\n </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { useContext, useEffect, useMemo } from 'react';\n\nimport { composable, composableProps } from '@dxos/react-ui';\nimport {\n type ActionGraphEdges,\n type ActionGraphNodes,\n type ActionGraphProps,\n Menu,\n type MenuAction,\n MenuRootProps,\n createGapSeparator,\n createMenuAction,\n createMenuItemGroup,\n useMenuActions,\n} from '@dxos/react-ui-menu';\n\nimport { translationKey } from '#translations';\n\nexport type TableToolbarActionProperties = { type: TableToolbarActionType };\n\nexport type TableToolbarAction = MenuAction<TableToolbarActionProperties>;\n\nexport type TableToolbarActionType = 'add-row' | 'comment' | 'save-view' | 'export-csv' | 'export-json' | 'export-xml';\n\nexport type TableExportFormat = 'csv' | 'json' | 'xml';\n\ntype TableToolbarState = Partial<{ viewDirty: boolean }>;\n\nconst createTableToolbarActions = ({\n stateAtom,\n onAdd,\n onSave,\n onExport,\n customActions,\n}: {\n stateAtom: Atom.Atom<TableToolbarState>;\n onAdd?: () => void;\n onSave?: () => void;\n onExport?: (format: TableExportFormat) => void;\n customActions?: Atom.Atom<ActionGraphProps>;\n}) =>\n Atom.make((get) => {\n const nodes: ActionGraphNodes = [];\n const edges: ActionGraphEdges = [];\n if (onAdd) {\n const add = createMenuAction<TableToolbarActionProperties>('add-row', onAdd, {\n type: 'add-row' as const,\n icon: 'ph--plus--regular',\n label: ['add-row.label', { ns: translationKey }],\n testId: 'table.toolbar.add-row',\n });\n nodes.push(add);\n edges.push({ source: 'root', target: add.id, relation: 'child' });\n }\n if (onSave) {\n const state = get(stateAtom);\n const save = createMenuAction<TableToolbarActionProperties>('save-view', onSave, {\n type: 'save-view' as const,\n icon: 'ph--floppy-disk--regular',\n label: ['save-view.label', { ns: translationKey }],\n testId: 'table.toolbar.save-view',\n iconOnly: false,\n hidden: !state.viewDirty,\n });\n nodes.push(save);\n edges.push({ source: 'root', target: save.id, relation: 'child' });\n }\n if (onExport) {\n const exportGroup = createMenuItemGroup('export-rows', {\n label: ['export-rows.menu', { ns: translationKey }],\n icon: 'ph--export--regular',\n iconOnly: true,\n variant: 'dropdownMenu',\n });\n nodes.push(exportGroup);\n edges.push({ source: 'root', target: exportGroup.id, relation: 'child' });\n\n const formats: Array<{ format: TableExportFormat; type: TableToolbarActionType; label: string }> = [\n { format: 'csv', type: 'export-csv', label: 'export-rows-csv.menu' },\n { format: 'json', type: 'export-json', label: 'export-rows-json.menu' },\n { format: 'xml', type: 'export-xml', label: 'export-rows-xml.menu' },\n ];\n for (const { format, type, label } of formats) {\n const action = createMenuAction<TableToolbarActionProperties>(type, () => onExport(format), {\n type,\n label: [label, { ns: translationKey }],\n });\n nodes.push(action);\n edges.push({ source: exportGroup.id, target: action.id, relation: 'child' });\n }\n }\n const gap = createGapSeparator();\n nodes.push(...gap.nodes);\n edges.push(...gap.edges);\n if (customActions) {\n const custom = get(customActions);\n nodes.push(...custom.nodes);\n edges.push(...custom.edges);\n }\n\n return {\n nodes,\n edges,\n };\n });\n\nexport type TableToolbarProps = Pick<MenuRootProps, 'attendableId'> &\n TableToolbarState & {\n onAdd?: () => void;\n onSave?: () => void;\n onExport?: (format: TableExportFormat) => void;\n customActions?: Atom.Atom<ActionGraphProps>;\n };\n\nexport const TableToolbar = composable<HTMLDivElement, TableToolbarProps>(\n ({ attendableId, viewDirty, onAdd, onSave, onExport, customActions, ...props }, forwardedRef) => {\n const registry = useContext(RegistryContext);\n const stateAtom = useMemo(() => Atom.make<TableToolbarState>({ viewDirty }), []);\n\n // Update state.viewDirty when the prop changes.\n useEffect(() => {\n registry.set(stateAtom, { viewDirty });\n }, [registry, stateAtom, viewDirty]);\n\n const actionsCreator = useMemo(\n () => createTableToolbarActions({ stateAtom, onAdd, onSave, onExport, customActions }),\n [stateAtom, onAdd, onSave, onExport, customActions],\n );\n const menuActions = useMenuActions(actionsCreator);\n\n return (\n <Menu.Root {...menuActions} attendableId={attendableId}>\n <Menu.Toolbar {...composableProps(props)} ref={forwardedRef} />\n </Menu.Root>\n );\n },\n);\n\nTableToolbar.displayName = 'TableToolbar';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { RegistryContext } from '@effect-atom/atom-react';\nimport type * as Types from 'effect/Types';\nimport React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type JsonSchema, type Type } from '@dxos/echo';\nimport { type ThemedClassName, useDefaultValue } from '@dxos/react-ui';\nimport { type ProjectionModel } from '@dxos/schema';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useTableModel } from '../../hooks';\nimport { type TableFeatures, TablePresentation, type TableRowAction } from '../../model';\nimport { type Table as TableType } from '../../types';\nimport { type TablePropertyDefinition, getBaseSchema, makeDynamicTable } from '../../util';\nimport { Table, type TableController } from './Table';\n\nexport type DynamicTableProps<T extends Type.AnyEntity = Type.AnyEntity> = ThemedClassName<{\n type?: T;\n name?: string; // TODO(burdon): Remove?\n rows: any[];\n properties?: TablePropertyDefinition[];\n jsonSchema?: Types.DeepMutable<JsonSchema.JsonSchema>;\n features?: Partial<TableFeatures>;\n rowActions?: TableRowAction[];\n onRowClick?: (row: any) => void;\n onRowAction?: (actionId: string, datum: any) => void;\n}>;\n\n/**\n * Properties define both the schema and display characteristics of the table columns.\n */\n// TODO(burdon): Instead of creating component variants, create helpers/hooks that normalize the props.\n// TODO(burdon): Warning: Cannot update a component (`DynamicTable`) while rendering a different component (`DynamicTable`).\nexport const DynamicTable = <T extends Type.AnyEntity = Type.AnyEntity>({\n classNames,\n type: typeProp,\n name = 'com.example.dynamicTable', // Remove default or make random; this will lead to type collisions.\n rows,\n properties,\n jsonSchema: jsonSchemaProp,\n rowActions,\n onRowClick,\n onRowAction,\n ...props\n}: DynamicTableProps<T>) => {\n const registry = useContext(RegistryContext);\n const [dynamicTable, setDynamicTable] = useState<{ object: TableType.Table; projection: ProjectionModel }>();\n\n // TODO(burdon): Remove variance from the props (should be normalized externally; possibly via hooks).\n const { type } = useMemo(\n () => getBaseSchema({ typename: name, properties, jsonSchema: jsonSchemaProp, type: typeProp }),\n [name, properties, jsonSchemaProp, typeProp],\n );\n\n useEffect(() => {\n setDynamicTable(makeDynamicTable({ registry, type, properties }));\n }, [registry, type, properties]);\n\n const tableRef = useRef<TableController>(null);\n const handleCellUpdate = useCallback((cell: any) => {\n tableRef.current?.update?.(cell);\n }, []);\n\n const handleRowOrderChange = useCallback(() => {\n tableRef.current?.update?.();\n }, []);\n\n const features = useDefaultValue(\n props.features,\n () =>\n ({\n selection: { enabled: false },\n dataEditable: false,\n }) as const,\n );\n\n const model = useTableModel({\n rows,\n object: dynamicTable?.object,\n projection: dynamicTable?.projection,\n features,\n rowActions,\n onCellUpdate: handleCellUpdate,\n onRowOrderChange: handleRowOrderChange,\n onRowAction,\n });\n\n const presentation = useMemo(() => {\n if (model) {\n return new TablePresentation(registry, model);\n }\n }, [registry, model]);\n\n return (\n <div className={mx('dx-expander grid', classNames)}>\n <div className='grid min-h-0 overflow-hidden'>\n <Table.Root ref={tableRef}>\n <Table.Content model={model} presentation={presentation} ignoreAttention onRowClick={onRowClick} />\n </Table.Root>\n </div>\n </div>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Atom", "createContext", "React", "forwardRef", "useImperativeHandle", "useRef", "Atom", "RegistryContext", "useAtomValue", "String", "React", "useCallback", "useContext", "useEffect", "useMemo", "useState", "log", "composable", "composableProps", "useAttention", "Grid", "closestCell", "gridSeparatorBlockEnd", "gridSeparatorInlineEnd", "DxEditRequest", "mx", "Filter", "Obj", "Order", "Query", "Ref", "Type", "ProjectionModel", "ViewModel", "createEchoChangeCallback", "getSchemaFromJsonSchema", "getSchemaFromPropertyDefinitions", "getBaseSchema", "type", "typename", "properties", "jsonSchema", "resolved", "getSchemaFromPropertyDefinitions", "getSchemaFromJsonSchema", "undefined", "Error", "Type", "getTypename", "makeDynamicTable", "registry", "view", "ViewModel", "make", "query", "Query", "select", "Filter", "everything", "fields", "map", "property", "name", "object", "Obj", "Table", "Ref", "sizes", "projection", "ProjectionModel", "baseSchema", "change", "createEchoChangeCallback", "normalizeView", "getFields", "setProperties", "table", "field", "find", "path", "size", "update", "title", "fieldProjection", "getFieldProjection", "id", "setFieldProjection", "props", "sort", "currentQuery", "fromAst", "getSnapshot", "ast", "newQuery", "orderBy", "Order", "touch", "value", "Schema", "SchemaAST", "narrowSchema", "schema", "paths", "ast", "isTypeLiteral", "propertySignatures", "filter", "signature", "includes", "name", "toString", "length", "narrowType", "TypeLiteral", "make", "undefined", "Atom", "ModalController", "_registry", "_state", "_triggerRef", "current", "registry", "make", "type", "state", "stateValue", "get", "trigger", "setTrigger", "showRowMenu", "rowIndex", "set", "showColumnMenu", "fieldId", "showColumnCreator", "mode", "showReferencePanel", "targetId", "schemaId", "typename", "openColumnSettings", "currentState", "requestAnimationFrame", "close", "EditorView", "React", "useCallback", "useMemo", "useRef", "useState", "debounce", "Format", "TypeEnum", "invariant", "GridCellEditor", "editorKeys", "parseCellIndex", "useGridContext", "React", "useGridContext", "CellValidationMessage", "__gridScope", "validationError", "variant", "editing", "editBox", "box", "bgClass", "textClass", "div", "className", "style", "inlineSize", "zIndex", "insetBlockEnd", "insetBlockStart", "insetInlineStart", "React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Entity", "Ref", "Type", "SchemaEx", "invariant", "Popover", "Form", "parseCellIndex", "useGridContext", "getDeep", "isTruthy", "setDeep", "translationKey", "createOptionLabel", "id", "editing", "contextEditing", "setEditing", "useGridContext", "__gridScope", "setLocalEditing", "useEffect", "cellElement", "anchorRef", "current", "undefined", "narrowSchema", "Type", "JSON", "useMemo", "cell", "parseCellIndex", "draftRow", "getDraftRows", "row", "invariant", "data", "model", "setFormValues", "values", "handleOpenChange", "onSave", "useCallback", "path", "setDeep", "value", "fieldProjection", "originalRow", "objectWithId", "make", "field", "Ref", "ref", "onCreate", "Entity", "obj", "label", "filter", "isTruthy", "virtualRef", "Popover", "tabIndex", "React", "autoFocus", "schema", "formValues", "onValuesChanged", "projection", "createInitialValuePath", "createOptionIcon", "db", "getOptions", "handleCreate", "__dxlog_file", "TableValueEditor", "fieldProjection", "useMemo", "model", "editing", "projection", "getFieldProjection", "invariant", "__gridScope", "schema", "modals", "onSave", "onCreate", "onFocus", "suppressNextBlur", "useRef", "validationError", "setValidationError", "useState", "validationVariant", "setValidationVariant", "useCallback", "validationResult", "value", "setEditing", "current", "cell", "parseCellIndex", "result", "validateCellData", "setCellData", "event", "extensions", "handleClose", "onNav", "content", "index", "undefined", "cellEditorSlots", "getCellContent", "onBlur", "determineNavigationAxis", "shift", "useAtomValue", "React", "DropdownMenu", "useTranslation", "translationKey", "ColumnActionsMenu", "model", "modals", "t", "state", "type", "currentSort", "getSorting", "isCurrentColumnSorted", "fieldId", "Root", "modal", "open", "onOpenChange", "close", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "Viewport", "direction", "Item", "data-testid", "onClick", "setSort", "clearSort", "getColumnCount", "features", "schemaEditable", "deleteColumn", "openColumnSettings", "Arrow", "useAtomValue", "React", "useCallback", "useEffect", "useMemo", "useState", "Popover", "FieldEditor", "ColumnSettings", "registry", "model", "modals", "onNewColumn", "newField", "setNewField", "state", "type", "mode", "projection", "createFieldProjection", "requestAnimationFrame", "undefined", "existingField", "getFields", "find", "f", "id", "fieldId", "field", "handleSave", "close", "handleCancel", "deleteFieldProjection", "Root", "modal", "open", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "classNames", "Viewport", "onSave", "onCancel", "Arrow", "useAtomValue", "React", "DropdownMenu", "toLocalizedString", "useTranslation", "translationKey", "RowActionsMenu", "model", "modals", "t", "hasSelection", "selection", "state", "type", "Root", "modal", "open", "onOpenChange", "close", "VirtualTrigger", "virtualRef", "trigger", "Content", "Viewport", "rowActions", "length", "Group", "map", "action", "Item", "key", "id", "data-testid", "onClick", "handleRowAction", "rowIndex", "label", "Separator", "features", "dataEditable", "deleteRow", "Arrow", "__dxlog_file", "columnDefault", "maxSize", "Atom", "emptyRowsAtom", "useContext", "dxGrid", "setDxGrid", "useState", "hasAttention", "useAttention", "attendableId", "modals", "useMemo", "ModalController", "registry", "rows", "useAtomValue", "model", "cellUpdateCounter", "cellUpdate", "columnCount", "Object", "columnMeta", "grid", "getFields", "frozen", "noActionColumn", "dataEditable", "frozenRowsStart", "frozenRowsEnd", "frozenColsStart", "frozenColsEnd", "useCallback", "useEffect", "getCells", "setFocus", "col", "row", "refocus", "requestAnimationFrame", "requestUpdate", "didCommitSuccessfully", "commitDraftRow", "scrollToEndRow", "plane", "cell", "onRowClick", "tableButtonElement", "values", "tableButtons", "find", "data", "controlElement", "tableControls", "ctrl", "selection", "toggleSelectionForRowIndex", "colIndex", "value", "getRowCount", "handleInsertRowResult", "increment", "handleSaveDraftRow", "delta", "navigator", "clipboard", "textContent", "event", "preventDefault", "error", "log", "catch", "cellElement", "getBoundingClientRect", "editRequest", "cellIndex", "cellBox", "insetInlineStart", "rect", "left", "insetBlockStart", "inlineSize", "width", "blockSize", "height", "initialContent", "dispatchEvent", "handleSave", "columnIndex", "index", "setColumnWidth", "stopPropagation", "columns", "scrollToColumn", "presentation", "updateIfWithinBounds", "updateCells", "className", "React", "ref", "forwardedRef", "id", "TableValueEditor", "schema", "onFocus", "onSave", "onCreate", "rowDefault", "limitRows", "limitColumns", "overscroll", "onAxisResize", "handleAxisResize", "onClick", "handleGridClick", "onKeyDownCapture", "onWheelCapture", "onNewColumn", "TableContent", "Atom", "RegistryContext", "React", "useContext", "useEffect", "useMemo", "composable", "composableProps", "Menu", "createGapSeparator", "createMenuAction", "createMenuItemGroup", "useMenuActions", "translationKey", "createTableToolbarActions", "stateAtom", "onAdd", "onSave", "onExport", "customActions", "make", "get", "nodes", "edges", "add", "type", "icon", "label", "ns", "testId", "push", "source", "target", "id", "relation", "state", "save", "iconOnly", "hidden", "viewDirty", "exportGroup", "variant", "formats", "format", "action", "gap", "custom", "TableToolbar", "attendableId", "props", "forwardedRef", "registry", "set", "actionsCreator", "menuActions", "Root", "Toolbar", "ref", "displayName", "emptyColumnMeta", "Atom", "make", "grid", "TableContextProvider", "useTableContext", "createContext", "TABLE_ROOT_NAME", "TableRoot", "forwardRef", "children", "forwardedRef", "controllerRef", "useRef", "useImperativeHandle", "update", "cell", "current", "handleInsertRowResult", "result", "React", "displayName", "Table", "Root", "Toolbar", "TableToolbar", "Content", "TableContent", "RegistryContext", "React", "useCallback", "useContext", "useEffect", "useMemo", "useRef", "useState", "useDefaultValue", "mx", "DynamicTable", "classNames", "type", "typeProp", "name", "rows", "properties", "jsonSchema", "jsonSchemaProp", "rowActions", "onRowClick", "onRowAction", "props", "registry", "useContext", "RegistryContext", "dynamicTable", "setDynamicTable", "useState", "useMemo", "getBaseSchema", "typename", "useEffect", "makeDynamicTable", "tableRef", "useRef", "handleCellUpdate", "useCallback", "cell", "current", "update", "handleRowOrderChange", "features", "useDefaultValue", "selection", "enabled", "dataEditable", "model", "useTableModel", "object", "projection", "onCellUpdate", "onRowOrderChange", "presentation", "TablePresentation", "React", "div", "className", "mx", "Table", "Root", "ref", "Content", "ignoreAttention"]
7
7
  }