@dxos/react-ui-table 0.7.2 → 0.7.3-main.2dd075e

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 (75) hide show
  1. package/dist/lib/browser/{chunk-EWGUNGJC.mjs → chunk-IYCSJDMB.mjs} +5 -3
  2. package/dist/lib/browser/chunk-IYCSJDMB.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +461 -237
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/types/index.mjs +3 -1
  7. package/dist/lib/node/{chunk-A2N7XWW6.cjs → chunk-MHBMVCFZ.cjs} +8 -5
  8. package/dist/lib/node/chunk-MHBMVCFZ.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +471 -253
  10. package/dist/lib/node/index.cjs.map +4 -4
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/types/index.cjs +4 -2
  13. package/dist/lib/node/types/index.cjs.map +2 -2
  14. package/dist/lib/node-esm/{chunk-SABDOZ6I.mjs → chunk-BMWGPXPL.mjs} +5 -3
  15. package/dist/lib/node-esm/chunk-BMWGPXPL.mjs.map +7 -0
  16. package/dist/lib/node-esm/index.mjs +461 -237
  17. package/dist/lib/node-esm/index.mjs.map +4 -4
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/types/index.mjs +3 -1
  20. package/dist/types/src/_deprecated/components/Table/Table.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Table/ColumnActionsMenu.d.ts.map +1 -1
  22. package/dist/types/src/components/Table/ColumnSettings.d.ts +2 -1
  23. package/dist/types/src/components/Table/ColumnSettings.d.ts.map +1 -1
  24. package/dist/types/src/components/Table/CreateRefPanel.d.ts +8 -0
  25. package/dist/types/src/components/Table/CreateRefPanel.d.ts.map +1 -0
  26. package/dist/types/src/components/Table/RefPanel.d.ts +8 -0
  27. package/dist/types/src/components/Table/RefPanel.d.ts.map +1 -0
  28. package/dist/types/src/components/Table/RowActionsMenu.d.ts.map +1 -1
  29. package/dist/types/src/components/Table/Table.d.ts +2 -2
  30. package/dist/types/src/components/Table/Table.d.ts.map +1 -1
  31. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts +16 -7
  32. package/dist/types/src/components/TableCellEditor/TableCellEditor.d.ts.map +1 -1
  33. package/dist/types/src/components/TableCellEditor/extension.d.ts +2 -1
  34. package/dist/types/src/components/TableCellEditor/extension.d.ts.map +1 -1
  35. package/dist/types/src/components/testing.d.ts +1 -1
  36. package/dist/types/src/components/testing.d.ts.map +1 -1
  37. package/dist/types/src/model/modal-controller.d.ts +11 -0
  38. package/dist/types/src/model/modal-controller.d.ts.map +1 -1
  39. package/dist/types/src/model/table-model.d.ts +4 -5
  40. package/dist/types/src/model/table-model.d.ts.map +1 -1
  41. package/dist/types/src/translations.d.ts +1 -0
  42. package/dist/types/src/translations.d.ts.map +1 -1
  43. package/dist/types/src/types/table.d.ts +57 -2
  44. package/dist/types/src/types/table.d.ts.map +1 -1
  45. package/dist/types/src/util/index.d.ts +0 -1
  46. package/dist/types/src/util/index.d.ts.map +1 -1
  47. package/dist/types/src/util/table-buttons.d.ts +8 -0
  48. package/dist/types/src/util/table-buttons.d.ts.map +1 -1
  49. package/package.json +29 -28
  50. package/src/_deprecated/components/Table/Table.stories.tsx +1 -1
  51. package/src/components/Table/ColumnActionsMenu.tsx +0 -1
  52. package/src/components/Table/ColumnSettings.tsx +7 -4
  53. package/src/components/Table/CreateRefPanel.tsx +83 -0
  54. package/src/components/Table/RefPanel.tsx +52 -0
  55. package/src/components/Table/RowActionsMenu.tsx +1 -2
  56. package/src/components/Table/Table.stories.tsx +2 -2
  57. package/src/components/Table/Table.tsx +60 -33
  58. package/src/components/TableCellEditor/TableCellEditor.stories.tsx +2 -2
  59. package/src/components/TableCellEditor/TableCellEditor.tsx +72 -23
  60. package/src/components/TableCellEditor/extension.ts +3 -4
  61. package/src/components/testing.ts +2 -1
  62. package/src/model/modal-controller.ts +43 -0
  63. package/src/model/table-model.test.ts +5 -3
  64. package/src/model/table-model.ts +34 -22
  65. package/src/playwright/smoke.spec.ts +0 -4
  66. package/src/translations.ts +1 -0
  67. package/src/types/table.ts +5 -5
  68. package/src/util/index.ts +0 -1
  69. package/src/util/table-buttons.ts +18 -1
  70. package/dist/lib/browser/chunk-EWGUNGJC.mjs.map +0 -7
  71. package/dist/lib/node/chunk-A2N7XWW6.cjs.map +0 -7
  72. package/dist/lib/node-esm/chunk-SABDOZ6I.mjs.map +0 -7
  73. package/dist/types/src/util/grid.d.ts +0 -14
  74. package/dist/types/src/util/grid.d.ts.map +0 -1
  75. package/src/util/grid.ts +0 -23
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/translations.ts", "../../../src/components/Table/Table.tsx", "../../../src/components/Table/ColumnActionsMenu.tsx", "../../../src/components/Table/ColumnSettings.tsx", "../../../src/components/Table/RowActionsMenu.tsx", "../../../src/components/TableCellEditor/TableCellEditor.tsx", "../../../src/components/TableCellEditor/extension.ts", "../../../src/util/grid.ts", "../../../src/util/signals.ts", "../../../src/util/table.ts", "../../../src/util/table-buttons.ts", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/Toolbar/common.tsx", "../../../src/hooks/useTableModel.ts", "../../../src/model/table-model.ts", "../../../src/model/modal-controller.ts", "../../../src/model/selection-model.ts", "../../../src/util/table-controls.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport const translationKey = 'table';\n\nexport default [\n {\n 'en-US': {\n [translationKey]: {\n 'object placeholder': 'New table',\n 'create object label': 'Create table',\n 'table name placeholder': 'Table name',\n 'settings title': 'Table settings',\n 'table schema label': 'Schema',\n 'new schema': 'New schema',\n 'continue label': 'Continue',\n 'create stack section label': 'Create table',\n 'add row': 'Add row',\n 'create comment': 'Create thread',\n 'column action sort descending': 'Sort Descending',\n 'column action sort ascending': 'Sort Ascending',\n 'column action clear sorting': 'Clear Sorting',\n 'column action settings': 'Column Settings',\n 'column action delete': 'Delete Column',\n 'delete row label': 'Delete row',\n 'bulk delete row label': 'Delete selected rows',\n 'column deleted label': 'Column deleted',\n 'new column button label': 'Create column',\n },\n },\n },\n] as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, {\n forwardRef,\n type PropsWithChildren,\n useCallback,\n useImperativeHandle,\n useState,\n type WheelEvent,\n} from 'react';\n\nimport { getValue } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { Filter, getSpace, fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { type DxGridElement, Grid, type GridContentProps, closestCell } from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { ColumnActionsMenu } from './ColumnActionsMenu';\nimport { ColumnSettings } from './ColumnSettings';\nimport { RowActionsMenu } from './RowActionsMenu';\nimport { type TableModel } from '../../model';\nimport { type GridCell } from '../../util';\nimport { TableCellEditor, type TableCellEditorProps } from '../TableCellEditor';\n\n// NOTE(Zan): These fragments add border to inline-end and block-end of the grid using pseudo-elements.\n// These are offset by 1px to avoid double borders in planks.\nconst inlineEndLine =\n '[&>.dx-grid]:relative [&>.dx-grid]:after:absolute [&>.dx-grid]:after:inset-block-0 [&>.dx-grid]:after:-inline-end-px [&>.dx-grid]:after:is-px [&>.dx-grid]:after:bg-separator';\nconst blockEndLine =\n '[&>.dx-grid]:before:absolute [&>.dx-grid]:before:inset-inline-0 [&>.dx-grid]:before:-block-end-px [&>.dx-grid]:before:bs-px [&>.dx-grid]:before:bg-separator';\n\nconst frozen = { frozenRowsStart: 1, frozenColsStart: 1, frozenColsEnd: 1 };\n\n//\n// Root\n//\n\nexport type TableRootProps = PropsWithChildren<{ role?: string }>;\n\nconst TableRoot = ({ children, role }: TableRootProps) => {\n return (\n <div\n role='none'\n className={mx(\n 'relative border-bs !border-separator',\n role === 'section'\n ? 'attention-surface overflow-hidden [&_.dx-grid]:max-is-[--dx-grid-content-inline-size]'\n : 'flex flex-col [&_.dx-grid]:grow [&_.dx-grid]:max-is-[--dx-grid-content-inline-size] [&_.dx-grid]:bs-0 [&_.dx-grid]:max-bs-[--dx-grid-content-block-size]',\n )}\n >\n {children}\n </div>\n );\n};\n\n//\n// Main\n//\n\nexport type TableController = {\n update?: (cell?: GridCell) => void;\n};\n\nexport type TableMainProps = {\n model?: TableModel;\n ignoreAttention?: boolean;\n};\n\nconst TableMain = forwardRef<TableController, TableMainProps>(({ model, ignoreAttention }, forwardedRef) => {\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n\n const { hasAttention } = useAttention(model?.table ? fullyQualifiedId(model.table) : 'table');\n\n /**\n * Provides an external controller that can be called to repaint the table.\n */\n useImperativeHandle<TableController, TableController>(\n forwardedRef,\n () => {\n if (!model || !dxGrid) {\n return {};\n }\n\n dxGrid.getCells = model.getCells.bind(model);\n return {\n update: (cell) => {\n if (cell) {\n dxGrid.updateIfWithinBounds(cell);\n } else {\n dxGrid.updateCells(true);\n }\n },\n };\n },\n [model, dxGrid],\n );\n\n const handleFocus: TableCellEditorProps['onFocus'] = (increment, delta) => {\n dxGrid?.refocus(increment, delta);\n };\n\n const handleEnter = useCallback<NonNullable<TableCellEditorProps['onEnter']>>(\n (cell) => {\n // TODO(burdon): Insert row only if bottom row isn't completely blank already.\n if (model && cell.row === model.getRowCount() - 1) {\n model.insertRow(cell.row);\n }\n },\n [model],\n );\n\n const handleKeyDown = useCallback<NonNullable<GridContentProps['onKeyDown']>>(\n (event) => {\n const cell = closestCell(event.target);\n if (!model || !cell) {\n return;\n }\n\n switch (event.key) {\n case 'Backspace':\n case 'Delete': {\n model.setCellData(cell, undefined);\n break;\n }\n }\n },\n [model],\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 // TODO(burdon): Factor out?\n const handleQuery = useCallback<NonNullable<TableCellEditorProps['onQuery']>>(\n async ({ field, props }, _text) => {\n if (model && props.referenceSchema && field.referencePath) {\n const space = getSpace(model.table);\n invariant(space);\n const schema = space.db.schemaRegistry.getSchema(props.referenceSchema);\n if (schema) {\n // TODO(burdon): Cache/filter.\n const { objects } = await space.db.query(Filter.schema(schema)).run();\n return objects\n .map((obj) => {\n const value = getValue(obj, field.referencePath!);\n if (!value || typeof value !== 'string') {\n return undefined;\n }\n\n return {\n label: value,\n data: obj,\n };\n })\n .filter(isNotFalsy);\n }\n }\n\n return [];\n },\n [model],\n );\n\n if (!model) {\n return <span role='none' className='attention-surface' />;\n }\n\n return (\n <>\n <Grid.Root id={model.table.id ?? 'table-grid'}>\n <TableCellEditor model={model} onEnter={handleEnter} onFocus={handleFocus} onQuery={handleQuery} />\n\n <Grid.Content\n onWheelCapture={handleWheel}\n className={mx('[--dx-grid-base:var(--surface-bg)]', inlineEndLine, blockEndLine)}\n frozen={frozen}\n columns={model.columnMeta.value}\n limitRows={model.getRowCount() ?? 0}\n limitColumns={model.table.view?.fields?.length ?? 0}\n onAxisResize={handleAxisResize}\n onClick={model?.handleGridClick}\n onKeyDown={handleKeyDown}\n overscroll='trap'\n ref={setDxGrid}\n />\n </Grid.Root>\n\n <RowActionsMenu model={model} />\n <ColumnActionsMenu model={model} />\n <ColumnSettings model={model} />\n </>\n );\n});\n\n//\n// CellEditor\n//\n\nexport const Table = {\n Root: TableRoot,\n Main: TableMain,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { DropdownMenu, useTranslation } from '@dxos/react-ui';\n\nimport { type TableModel } from '../../model';\nimport { translationKey } from '../../translations';\n\ntype ColumnActionsMenuProps = { model?: TableModel };\n\nexport const ColumnActionsMenu = ({ model }: ColumnActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const state = model?.modalController.state.value;\n\n if (!model || state?.type !== 'column') {\n return null;\n }\n\n const currentSort = model.sorting;\n const isCurrentColumnSorted = currentSort?.fieldId === state.fieldId;\n\n return (\n <DropdownMenu.Root modal={false} open={state?.type === 'column'} onOpenChange={model.modalController.close}>\n <DropdownMenu.VirtualTrigger virtualRef={model.modalController.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')}\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')}\n </DropdownMenu.Item>\n )}\n {isCurrentColumnSorted && (\n <DropdownMenu.Item data-testid='column-clear-sort' onClick={() => model.clearSort()}>\n {t('column action clear sorting')}\n </DropdownMenu.Item>\n )}\n {model.getColumnCount() > 1 && (\n <DropdownMenu.Item data-testid='column-delete' onClick={() => model.deleteColumn(state.fieldId)}>\n {t('column action delete')}\n </DropdownMenu.Item>\n )}\n <DropdownMenu.Item data-testid='column-settings' onClick={() => model.modalController.openColumnSettings()}>\n {t('column action settings')}\n </DropdownMenu.Item>\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 React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { getSpace } from '@dxos/react-client/echo';\nimport { DropdownMenu } from '@dxos/react-ui';\nimport { FieldEditor } from '@dxos/react-ui-form';\nimport { type FieldType } from '@dxos/schema';\n\nimport { type TableModel } from '../../model';\n\ntype ColumnSettingsProps = { model?: TableModel };\n\nexport const ColumnSettings = ({ model }: ColumnSettingsProps) => {\n const [newField, setNewField] = useState<FieldType>();\n const state = model?.modalController.state.value;\n\n const space = getSpace(model?.table);\n\n useEffect(() => {\n if (state?.type === 'columnSettings' && state.mode.type === 'create' && model?.projection) {\n setNewField(model.projection.createFieldProjection());\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?.table?.view?.fields.find((f) => f.id === mode.fieldId);\n }\n }\n return undefined;\n }, [model?.table?.view?.fields, state]);\n\n const field = existingField ?? newField;\n\n const handleClose = useCallback(() => {\n model?.modalController.close();\n }, [model?.modalController]);\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?.table?.view || !model.projection || !field) {\n return null;\n }\n\n return (\n <DropdownMenu.Root modal={false} open={state?.type === 'columnSettings'}>\n <DropdownMenu.VirtualTrigger virtualRef={model.modalController.trigger} />\n <DropdownMenu.Portal>\n <DropdownMenu.Content classNames='md:is-64'>\n <DropdownMenu.Viewport>\n <FieldEditor\n view={model.table.view}\n projection={model.projection}\n field={field}\n registry={space?.db.schemaRegistry}\n onClose={handleClose}\n onCancel={handleCancel}\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 React from 'react';\n\nimport { DropdownMenu, useTranslation } from '@dxos/react-ui';\n\nimport { type TableModel } from '../../model';\nimport { translationKey } from '../../translations';\n\ntype RowActionsMenuProps = { model: TableModel };\n\nexport const RowActionsMenu = ({ model }: RowActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const state = model.modalController.state.value;\n const hasSelection = model.selection.hasSelection.value;\n\n if (state?.type !== 'row') {\n return null;\n }\n\n return (\n <DropdownMenu.Root modal={false} open={true} onOpenChange={model.modalController.close}>\n <DropdownMenu.VirtualTrigger virtualRef={model.modalController.trigger} />\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\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 </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useMemo } from 'react';\n\nimport { FormatEnum } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { type DxGrid } from '@dxos/lit-grid';\nimport {\n editorKeys,\n type EditorKeyEvent,\n GridCellEditor,\n type GridCellEditorProps,\n type EditorKeyOrBlurHandler,\n type EditorBlurHandler,\n type GridScopedProps,\n useGridContext,\n} from '@dxos/react-ui-grid';\nimport { type FieldProjection } from '@dxos/schema';\n\nimport { completion } from './extension';\nimport { type TableModel } from '../../model';\nimport { type GridCell, toGridCell } from '../../util';\n\nexport type TableCellEditorProps = {\n model?: TableModel;\n onEnter?: (cell: GridCell) => void;\n onFocus?: DxGrid['refocus'];\n onQuery?: (field: FieldProjection, text: string) => Promise<{ label: string; data: any }[]>;\n};\n\nexport const TableCellEditor = ({\n model,\n onEnter,\n onFocus,\n onQuery,\n __gridScope,\n}: GridScopedProps<TableCellEditorProps>) => {\n const { editing } = useGridContext('TableCellEditor', __gridScope);\n const fieldProjection = useMemo<FieldProjection | undefined>(() => {\n if (!model || !editing) {\n return;\n }\n\n const { col } = toGridCell(editing.index);\n const field = model.projection.view.fields[col];\n const fieldProjection = model.projection.getFieldProjection(field.id);\n invariant(fieldProjection);\n return fieldProjection;\n }, [model, editing]);\n\n const handleClose = useCallback<EditorKeyOrBlurHandler>(\n (value, event) => {\n if (!model || !editing || !fieldProjection) {\n return;\n }\n\n const cell = toGridCell(editing.index);\n onEnter?.(cell);\n if (event && onFocus) {\n onFocus(determineNavigationAxis(event), determineNavigationDelta(event));\n }\n },\n [model, editing, onFocus, onEnter, fieldProjection, determineNavigationAxis, determineNavigationDelta],\n );\n\n const handleBlur = useCallback<EditorBlurHandler>(\n (value) => {\n if (!model || !editing) {\n return;\n }\n\n const cell = toGridCell(editing.index);\n if (value !== undefined) {\n model.setCellData(cell, value);\n }\n },\n [model, editing],\n );\n\n const extension = useMemo(() => {\n if (!fieldProjection) {\n return [];\n }\n\n const extension = [\n editorKeys({\n onClose: handleClose,\n ...(editing?.initialContent && { onNav: handleClose }),\n }),\n ];\n\n if (onQuery) {\n switch (fieldProjection.props.format) {\n case FormatEnum.Ref: {\n extension.push([\n completion({\n onQuery: (text) => onQuery(fieldProjection, text),\n onMatch: (data) => {\n if (model && editing) {\n const cell = toGridCell(editing.index);\n model.setCellData(cell, data);\n onEnter?.(cell);\n onFocus?.();\n }\n },\n }),\n ]);\n break;\n }\n }\n }\n\n return extension;\n }, [model, editing, fieldProjection, handleClose]);\n\n const getCellContent = useCallback<GridCellEditorProps['getCellContent']>(() => {\n if (model && editing) {\n const value = model.getCellData(toGridCell(editing.index));\n return value !== undefined ? String(value) : '';\n }\n }, [model, editing]);\n\n return <GridCellEditor extension={extension} getCellContent={getCellContent} onBlur={handleBlur} />;\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 2024 DXOS.org\n//\n\nimport {\n autocompletion,\n pickedCompletion,\n type CompletionContext,\n type CompletionResult,\n} from '@codemirror/autocomplete';\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nexport type CompletionOptions = {\n onQuery: (text: string) => Promise<CompletionResult['options']>;\n onMatch: (data: any) => void;\n};\n\n/**\n * Autocomplete Codemirror extension.\n * https://codemirror.net/docs/ref/#autocomplete.autocompletion\n */\nexport const completion = ({ onQuery, onMatch }: CompletionOptions): Extension => {\n return [\n EditorView.theme({\n '.cm-completionDialog': {\n width: 'var(--dx-gridCellWidth)',\n },\n }),\n\n autocompletion({\n icons: false,\n activateOnTyping: true,\n override: [\n async (context: CompletionContext): Promise<CompletionResult> => {\n const text = context.state.doc.toString();\n return {\n from: 0,\n options: await onQuery(text),\n };\n },\n ],\n\n // TODO(burdon): Consts from grid (to line-up with grid).\n tooltipClass: () => 'cm-completionDialog !mt-[8px] !-ml-[4px] [&>ul]:!max-h-[264px]',\n optionClass: () => 'flex h-[33px] items-center',\n\n // Uncomment to debug.\n // closeOnBlur: true,\n }),\n\n // Check for accepted completion metadata in the transaction.\n EditorView.updateListener.of((update) => {\n update.transactions.forEach((tr) => {\n const completion = tr.annotation(pickedCompletion);\n if (completion) {\n onMatch((completion as any).data);\n }\n });\n }),\n ];\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type DxGridPlaneCellIndex } from '@dxos/react-ui-grid';\n\n// TODO(burdon): Factor out to grid.\nexport type GridCell = { col: number; row: number };\n\n/**\n * Generates a string key for a cell based on its column and row indices.\n */\nexport const fromGridCell = ({ col, row }: GridCell): DxGridPlaneCellIndex => {\n return `${col},${row}` as const; // TODO(burdon): \":\" delim.\n};\n\n/**\n * Converts a cell key string back into column and row coordinates.\n */\nexport const toGridCell = (cell: DxGridPlaneCellIndex): GridCell => {\n const [col, row] = cell.split(',').map(Number);\n return { row, col };\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 2024 DXOS.org\n//\n\nimport {\n AST,\n Format,\n FormatEnum,\n type JsonPath,\n type JsonProp,\n type MutableSchema,\n S,\n TypedObject,\n TypeEnum,\n} from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { PublicKey } from '@dxos/react-client';\nimport { create, type Space } from '@dxos/react-client/echo';\nimport { createFieldId, createView, ViewProjection } from '@dxos/schema';\n\nimport { type TableType } from '../types';\n\ntype InitialiseTableProps = {\n space: Space;\n table: TableType;\n initialRow?: boolean;\n};\n\n// TODO(burdon): Pass in type.\n// TODO(burdon): User should determine typename.\nexport const initializeTable = ({ space, table, initialRow = true }: InitialiseTableProps): MutableSchema => {\n log.info('initializeTable', { table });\n\n const ContactSchema = TypedObject({\n typename: `example.com/type/${PublicKey.random().truncate()}`,\n version: '0.1.0',\n })({\n name: S.optional(S.String).annotations({\n [AST.TitleAnnotationId]: 'Name',\n }),\n email: S.optional(Format.Email),\n salary: S.optional(Format.Currency()).annotations({\n [AST.TitleAnnotationId]: 'Salary',\n }), // TODO(burdon): Should default to prop name?\n });\n\n const contactSchema = space.db.schemaRegistry.addSchema(ContactSchema);\n table.view = createView({\n name: 'Test',\n typename: contactSchema.typename,\n jsonSchema: contactSchema.jsonSchema,\n fields: ['name', 'email', 'salary'],\n });\n\n const projection = new ViewProjection(contactSchema, table.view!);\n projection.setFieldProjection({\n field: {\n id: table.view.fields[2].id,\n path: 'salary' as JsonPath,\n size: 150,\n },\n });\n\n projection.setFieldProjection({\n field: {\n id: createFieldId(),\n path: 'manager' as JsonPath,\n referencePath: 'name' as JsonPath,\n },\n props: {\n property: 'manager' as JsonProp,\n type: TypeEnum.Ref,\n format: FormatEnum.Ref,\n referenceSchema: contactSchema.typename,\n title: 'Manager',\n },\n });\n\n if (initialRow) {\n // TODO(burdon): Last (first) row should not be in db and should be managed by the model.\n space.db.add(create(contactSchema, {}));\n }\n\n return contactSchema;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\ntype TableButton = 'columnSettings' | 'rowMenu' | 'newColumn';\n\nconst TABLE_ATTRS: { [K in TableButton]: string } = {\n columnSettings: 'data-table-column-settings-button',\n rowMenu: 'data-table-row-menu-button',\n newColumn: 'data-table-new-column-button',\n} as const;\n\nconst ICONS: { [K in TableButton]: string } = {\n columnSettings: 'ph--caret-down--regular',\n rowMenu: 'ph--dots-three--regular',\n newColumn: 'ph--plus--regular',\n} as const;\n\nconst createButtonHtml = ({\n button,\n value = '',\n disabled = false,\n testId,\n}: {\n button: TableButton;\n value?: string;\n disabled?: boolean;\n testId: string;\n}): string => {\n const buttonClasses = 'ch-button is-6 pli-0.5 min-bs-0 absolute inset-block-1 inline-end-2' as const;\n return `<button class=\"${buttonClasses}\" ${TABLE_ATTRS[button]}=\"${value}\" data-testid=\"${testId}\" ${disabled ? 'disabled' : ''}><svg><use href=\"/icons.svg#${ICONS[button]}\"/></svg></button>`;\n};\n\nexport const tableButtons = {\n columnSettings: {\n attr: TABLE_ATTRS.columnSettings,\n icon: ICONS.columnSettings,\n render: ({ fieldId }: { fieldId: string }) =>\n createButtonHtml({ button: 'columnSettings', value: fieldId, testId: 'table-column-settings-button' }),\n },\n rowMenu: {\n attr: TABLE_ATTRS.rowMenu,\n icon: ICONS.rowMenu,\n render: ({ rowIndex }: { rowIndex: number }) =>\n createButtonHtml({ button: 'rowMenu', value: rowIndex.toString(), testId: 'table-row-menu-button' }),\n },\n addColumn: {\n attr: TABLE_ATTRS.newColumn,\n icon: ICONS.newColumn,\n render: ({ disabled }: { disabled?: boolean } = {}) =>\n createButtonHtml({ button: 'newColumn', disabled, testId: 'table-new-column-button' }),\n },\n} as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { Toolbar as NaturalToolbar, type ThemedClassName, useTranslation } from '@dxos/react-ui';\n\nimport { ToolbarButton, ToolbarSeparator } from './common';\nimport { translationKey } from '../../translations';\n\n//\n// Root\n//\n\n// TODO(Zan): This should become a union later.\nexport type ToolbarAction = { type: 'add-row' } | { type: 'comment' };\n\nexport type ToolbarActionType = ToolbarAction['type'];\n\nexport type ToolbarActionHandler = (action: ToolbarAction) => void;\n\nexport type ToolbarProps = ThemedClassName<\n PropsWithChildren<{\n onAction?: ToolbarActionHandler;\n }>\n>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<ToolbarProps>('Toolbar');\n\nconst ToolbarRoot = ({ classNames, children, onAction }: ToolbarProps) => {\n return (\n <ToolbarContextProvider onAction={onAction}>\n <NaturalToolbar.Root\n classNames={['is-full shrink-0 overflow-x-auto overflow-y-hidden p-1 attention-surface', classNames]}\n >\n {children}\n </NaturalToolbar.Root>\n </ToolbarContextProvider>\n );\n};\n\nconst Editing = () => {\n const { onAction } = useToolbarContext('Editing');\n const { t } = useTranslation(translationKey);\n\n return (\n <>\n <ToolbarButton\n value='add-row'\n icon='ph--plus--regular'\n data-testid='table.toolbar.add-row'\n onClick={() => onAction?.({ type: 'add-row' })}\n >\n {t('add row')}\n </ToolbarButton>\n </>\n );\n};\n\nconst Actions = () => {\n const { onAction } = useToolbarContext('Actions');\n const { t } = useTranslation(translationKey);\n\n return (\n <>\n <ToolbarButton\n value='comment'\n icon='ph--chat-text--regular'\n data-testid='table.toolbar.comment'\n onClick={() => onAction?.({ type: 'comment' })}\n >\n {t('create comment')}\n </ToolbarButton>\n </>\n );\n};\n\nexport const Toolbar = {\n Root: ToolbarRoot,\n Editing,\n Actions,\n Separator: ToolbarSeparator,\n};\n\nexport { useToolbarContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport {\n Icon,\n type IconProps,\n Toolbar as NaturalToolbar,\n Tooltip,\n type ToolbarButtonProps as NaturalToolbarButtonProps,\n type ToolbarToggleGroupItemProps as NaturalToolbarToggleGroupItemProps,\n} from '@dxos/react-ui';\n\n// TODO(burdon): Factor out into new package (react-ui-toolbar) in common with react-ui-editor, etc.\n\nexport const buttonStyles = 'min-bs-0 p-2';\nexport const tooltipProps = { side: 'top' as const, classNames: 'z-10' };\n\nexport const ToolbarSeparator = () => <div role='separator' className='grow' />;\n\n//\n// ToolbarButton\n//\n\ntype ToolbarButtonProps = NaturalToolbarButtonProps & Pick<IconProps, 'icon'>;\n\nexport const ToolbarButton = ({ icon, children, ...props }: ToolbarButtonProps) => {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' {...props} classNames={buttonStyles}>\n <Icon icon={icon} size={5} />\n <span className='sr-only'>{children}</span>\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content {...tooltipProps}>\n {children}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\n//\n// ToolbarToggleButton\n//\n\nexport type ToolbarToggleButtonProps = NaturalToolbarToggleGroupItemProps & Pick<IconProps, 'icon'>;\n\nexport const ToolbarToggleButton = ({ icon, children, ...props }: ToolbarToggleButtonProps) => {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.ToggleGroupItem variant='ghost' {...props} classNames={buttonStyles}>\n <Icon icon={icon} size={5} />\n <span className='sr-only'>{children}</span>\n </NaturalToolbar.ToggleGroupItem>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content {...tooltipProps}>\n {children}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type ReactiveObject } from '@dxos/react-client/echo';\nimport { type ViewProjection } from '@dxos/schema';\n\nimport { type BaseTableRow, TableModel, type TableModelProps } from '../model';\nimport { type TableType } from '../types';\n\nexport type UseTableModelParams<T extends BaseTableRow = { id: string }> = {\n table?: TableType;\n projection?: ViewProjection;\n objects?: ReactiveObject<T>[];\n} & Pick<TableModelProps<T>, 'onInsertRow' | 'onDeleteRows' | 'onDeleteColumn' | 'onCellUpdate' | 'onRowOrderChanged'>;\n\nexport const useTableModel = <T extends BaseTableRow = { id: string }>({\n objects,\n table,\n projection,\n ...props\n}: UseTableModelParams<T>): TableModel<T> | undefined => {\n const [model, setModel] = useState<TableModel<T>>();\n useEffect(() => {\n if (!table || !projection) {\n return;\n }\n\n let model: TableModel<T> | undefined;\n const t = setTimeout(async () => {\n model = new TableModel<T>({ table, projection, ...props });\n await model.open();\n setModel(model);\n });\n\n return () => {\n clearTimeout(t);\n void model?.close();\n };\n }, [table, projection]); // TODO(burdon): Trigger if callbacks change?\n\n // Update data.\n useEffect(() => {\n if (objects) {\n model?.setRows(objects);\n }\n }, [model, objects]);\n\n return model;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { computed, effect, signal, type ReadonlySignal } from '@preact/signals-core';\nimport orderBy from 'lodash.orderby';\n\nimport { Resource } from '@dxos/context';\nimport { getValue, setValue, FormatEnum, type JsonProp } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/react-client';\nimport {\n cellClassesForFieldType,\n cellClassesForRowSelection,\n formatForDisplay,\n formatForEditing,\n parseValue,\n} from '@dxos/react-ui-form';\nimport {\n type DxGridAxisMeta,\n type DxGridCellValue,\n type DxGridPlane,\n type DxGridPlaneCells,\n type DxGridPlaneRange,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\nimport { VIEW_FIELD_LIMIT, type ViewProjection, type FieldType } from '@dxos/schema';\n\nimport { ModalController } from './modal-controller';\nimport { SelectionModel } from './selection-model';\nimport { type TableType } from '../types';\nimport { fromGridCell, type GridCell } from '../util';\nimport { tableButtons, touch } from '../util';\nimport { tableControls } from '../util/table-controls';\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortConfig = { fieldId: string; direction: SortDirection };\n\nexport type BaseTableRow = Record<JsonProp, any> & { id: string };\n\nexport type TableModelProps<T extends BaseTableRow = { id: string }> = {\n table: TableType;\n projection: ViewProjection;\n sorting?: SortConfig[];\n pinnedRows?: { top: number[]; bottom: number[] };\n onInsertRow?: (index?: number) => void;\n onDeleteRows?: (index: number, obj: T[]) => void;\n onDeleteColumn?: (fieldId: string) => void;\n onCellUpdate?: (cell: GridCell) => void;\n onRowOrderChanged?: () => void;\n};\n\nexport class TableModel<T extends BaseTableRow = { id: string }> extends Resource {\n public readonly id = `table-model-${PublicKey.random().truncate()}`;\n\n private readonly _table: TableType;\n private readonly _projection: ViewProjection;\n\n private readonly _visibleRange = signal<DxGridPlaneRange>({\n start: { row: 0, col: 0 },\n end: { row: 0, col: 0 },\n });\n\n /**\n * Maps display indices to data indices.\n * Used for translating between sorted/displayed order and original data order.\n * Keys are display indices, values are corresponding data indices.\n */\n private readonly _displayToDataIndex: Map<number, number> = new Map();\n\n private readonly _onInsertRow?: TableModelProps<T>['onInsertRow'];\n private readonly _onDeleteRows?: TableModelProps<T>['onDeleteRows'];\n private readonly _onDeleteColumn?: TableModelProps<T>['onDeleteColumn'];\n private readonly _onCellUpdate?: TableModelProps<T>['onCellUpdate'];\n private readonly _onRowOrderChanged?: TableModelProps<T>['onRowOrderChanged'];\n\n private readonly _sorting = signal<SortConfig | undefined>(undefined);\n private _sortedRows!: ReadonlySignal<T[]>;\n private _rows = signal<T[]>([]);\n\n private _pinnedRows: NonNullable<TableModelProps<T>['pinnedRows']>;\n\n private _selection!: SelectionModel<T>;\n private _columnMeta?: ReadonlySignal<DxGridAxisMeta>;\n private readonly _modalController = new ModalController();\n\n constructor({\n table,\n projection,\n sorting = [],\n pinnedRows = { top: [], bottom: [] },\n onCellUpdate,\n onDeleteColumn,\n onDeleteRows,\n onInsertRow,\n onRowOrderChanged,\n }: TableModelProps<T>) {\n super();\n this._table = table;\n this._projection = projection;\n\n this._sorting.value = sorting.at(0);\n this._pinnedRows = pinnedRows;\n this._onInsertRow = onInsertRow;\n this._onDeleteRows = onDeleteRows;\n this._onDeleteColumn = onDeleteColumn;\n this._onCellUpdate = onCellUpdate;\n this._onRowOrderChanged = onRowOrderChanged;\n }\n\n public get table() {\n return this._table;\n }\n\n public get projection() {\n return this._projection;\n }\n\n public get pinnedRows(): NonNullable<TableModelProps<T>['pinnedRows']> {\n return this._pinnedRows;\n }\n\n public get columnMeta(): ReadonlySignal<DxGridAxisMeta> {\n invariant(this._columnMeta);\n return this._columnMeta;\n }\n\n public get sorting(): SortConfig | undefined {\n return this._sorting.value;\n }\n\n public get modalController() {\n return this._modalController;\n }\n\n public get selection() {\n return this._selection;\n }\n\n //\n // Initialisation\n //\n\n protected override async _open() {\n this.initializeColumnMeta();\n this.initializeSorting();\n this.initializeEffects();\n this._selection = new SelectionModel(this._sortedRows, () => this._onRowOrderChanged?.());\n await this._selection.open(this._ctx);\n }\n\n private initializeColumnMeta(): void {\n this._columnMeta = computed(() => {\n const fields = this._table.view?.fields ?? [];\n const meta = Object.fromEntries(\n fields.map((field, index: number) => [index, { size: field?.size ?? 256, resizeable: true }]),\n );\n\n return {\n grid: meta,\n frozenColsStart: { 0: { size: 30, resizeable: false } },\n frozenColsEnd: { 0: { size: 40, resizeable: false } },\n };\n });\n }\n\n private initializeSorting(): void {\n this._sortedRows = computed(() => {\n this._displayToDataIndex.clear();\n const sort = this._sorting.value;\n if (!sort) {\n return this._rows.value;\n }\n\n const field = this._table.view?.fields.find((field) => field.id === sort.fieldId);\n if (!field) {\n return this._rows.value;\n }\n\n const dataWithIndices = this._rows.value.map((item, index) => {\n const value = getValue(item, field.path);\n return { item, index, value, isEmpty: value == null || value === '' };\n });\n const sorted = orderBy(dataWithIndices, ['isEmpty', 'value'], ['asc', sort.direction]);\n\n for (let displayIndex = 0; displayIndex < sorted.length; displayIndex++) {\n const { index: dataIndex } = sorted[displayIndex];\n if (displayIndex !== dataIndex) {\n this._displayToDataIndex.set(displayIndex, dataIndex);\n }\n }\n\n return sorted.map(({ item }) => item);\n });\n }\n\n private initializeEffects(): void {\n const rowOrderWatcher = effect(() => {\n touch(this._sortedRows.value);\n this._onRowOrderChanged?.();\n });\n this._ctx.onDispose(rowOrderWatcher);\n\n /**\n * Creates reactive effects for each row in the visible range.\n * Subscribes to changes in the visible range, recreating row effects when it changes.\n * When a row's data changes, invokes onCellUpdate to notify subscribers and trigger UI updates.\n */\n const rowEffectManager = effect(() => {\n const { start, end } = touch(this._visibleRange.value);\n const rowEffects: ReturnType<typeof effect>[] = [];\n for (let row = start.row; row <= end.row; row++) {\n rowEffects.push(\n effect(() => {\n const obj = this._sortedRows.value[row];\n this?._table?.view?.fields.forEach((field) => touch(getValue(obj, field.path)));\n this._onCellUpdate?.({ row, col: start.col });\n }),\n );\n }\n\n return () => rowEffects.forEach((cleanup) => cleanup());\n });\n this._ctx.onDispose(rowEffectManager);\n }\n\n //\n // Get Cells\n //\n\n public getCells = (range: DxGridPlaneRange, plane: DxGridPlane): DxGridPlaneCells => {\n switch (plane) {\n case 'grid': {\n this._visibleRange.value = range;\n return this.getMainGridCells(range);\n }\n case 'frozenRowsStart': {\n return this.getHeaderCells(range);\n }\n case 'frozenColsStart': {\n return this.getSelectionColumnCells(range);\n }\n case 'frozenColsEnd': {\n return this.getActionColumnCells(range);\n }\n case 'fixedStartStart': {\n return this.getSelectAllCell();\n }\n case 'fixedStartEnd': {\n return this.getNewColumnCell();\n }\n default: {\n return {};\n }\n }\n };\n\n private getMainGridCells = (range: DxGridPlaneRange): DxGridPlaneCells => {\n const values: DxGridPlaneCells = {};\n const fields = this._table.view?.fields ?? [];\n\n const addCell = (obj: T, field: FieldType, colIndex: number, displayIndex: number): void => {\n const { props } = this._projection.getFieldProjection(field.id);\n const value: DxGridCellValue = {\n get value() {\n const value = getValue(obj, field.path);\n if (value == null) {\n return '';\n }\n\n switch (props.format) {\n case FormatEnum.Ref: {\n if (!field.referencePath) {\n return ''; // TODO(burdon): Show error.\n }\n\n return getValue(value, field.referencePath);\n }\n\n default: {\n return formatForDisplay({ type: props.type, format: props.format, value });\n }\n }\n },\n };\n\n const classes = [];\n const formatClasses = cellClassesForFieldType({ type: props.type, format: props.format });\n if (formatClasses) {\n classes.push(formatClasses);\n }\n const rowSelectionClasses = cellClassesForRowSelection(this._selection.isObjectSelected(obj));\n if (rowSelectionClasses) {\n classes.push(rowSelectionClasses);\n }\n if (classes.length > 0) {\n value.className = mx(classes.flat());\n }\n\n const idx = fromGridCell({ col: colIndex, row: displayIndex });\n values[idx] = value;\n };\n\n for (let row = range.start.row; row <= range.end.row && row < this._sortedRows.value.length; row++) {\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n const field = fields[col];\n if (!field) {\n continue;\n }\n\n addCell(this._sortedRows.value[row], field, col, row);\n }\n }\n\n return values;\n };\n\n private getHeaderCells = (range: DxGridPlaneRange): DxGridPlaneCells => {\n const values: DxGridPlaneCells = {};\n const fields = this.table.view?.fields ?? [];\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n const { field, props } = this._projection.getFieldProjection(fields[col].id);\n values[fromGridCell({ col, row: 0 })] = {\n value: props.title ?? field.path,\n readonly: true,\n resizeHandle: 'col',\n accessoryHtml: tableButtons.columnSettings.render({ fieldId: field.id }),\n };\n }\n\n return values;\n };\n\n private getSelectionColumnCells = (range: DxGridPlaneRange): DxGridPlaneCells => {\n const values: DxGridPlaneCells = {};\n for (let row = range.start.row; row <= range.end.row && row < this._rows.value.length; row++) {\n const isSelected = this._selection.isRowIndexSelected(row);\n const classes = cellClassesForRowSelection(isSelected);\n values[fromGridCell({ col: 0, row })] = {\n value: '',\n readonly: true,\n className: classes ? mx(classes) : undefined,\n accessoryHtml: tableControls.checkbox.render({ rowIndex: row, checked: isSelected }),\n };\n }\n\n return values;\n };\n\n private getActionColumnCells = (range: DxGridPlaneRange): DxGridPlaneCells => {\n const values: DxGridPlaneCells = {};\n for (let row = range.start.row; row <= range.end.row && row < this._rows.value.length; row++) {\n const isSelected = this._selection.isRowIndexSelected(row);\n const classes = cellClassesForRowSelection(isSelected);\n values[fromGridCell({ col: 0, row })] = {\n value: '',\n readonly: true,\n className: classes ? mx(classes) : undefined,\n accessoryHtml: tableButtons.rowMenu.render({ rowIndex: row }),\n };\n }\n\n return values;\n };\n\n private getSelectAllCell = (): DxGridPlaneCells => {\n return {\n [fromGridCell({ col: 0, row: 0 })]: {\n value: '',\n accessoryHtml: tableControls.checkbox.render({\n rowIndex: 0,\n header: true,\n checked: this._selection.allRowsSeleted.value,\n }),\n readonly: true,\n },\n };\n };\n\n private getNewColumnCell = (): DxGridPlaneCells => {\n return {\n [fromGridCell({ col: 0, row: 0 })]: {\n value: '',\n accessoryHtml: tableButtons.addColumn.render({\n disabled: (this._table.view?.fields?.length ?? 0) >= VIEW_FIELD_LIMIT,\n }),\n readonly: true,\n },\n };\n };\n\n //\n // Data\n //\n\n public setRows = (obj: T[]): void => {\n this._rows.value = obj;\n };\n\n public getRowCount = (): number => this._rows.value.length;\n\n public getColumnCount = (): number => this.table.view?.fields.length ?? 0;\n\n public insertRow = (rowIndex?: number): void => {\n const row = rowIndex !== undefined ? this._displayToDataIndex.get(rowIndex) ?? rowIndex : this._rows.value.length;\n this._onInsertRow?.(row);\n };\n\n public deleteRow = (rowIndex: number): void => {\n const row = this._displayToDataIndex.get(rowIndex) ?? rowIndex;\n const obj = this._rows.value[row];\n const objectsToDelete = [];\n\n if (this._selection.hasSelection.value) {\n const selectedRows = this._selection.getSelectedRows();\n objectsToDelete.push(...selectedRows);\n } else {\n objectsToDelete.push(obj);\n }\n\n this._onDeleteRows?.(row, objectsToDelete);\n };\n\n public getCellData = ({ col, row }: GridCell): any => {\n const fields = this.table.view?.fields ?? [];\n if (col < 0 || col >= fields.length) {\n return undefined;\n }\n\n const field = fields[col];\n const dataIndex = this._displayToDataIndex.get(row) ?? row;\n const value = getValue(this._rows.value[dataIndex], field.path);\n if (value == null) {\n return '';\n }\n\n const { props } = this._projection.getFieldProjection(field.id);\n switch (props.format) {\n case FormatEnum.Ref: {\n if (!field.referencePath) {\n return ''; // TODO(burdon): Show error.\n }\n\n return getValue(value, field.referencePath);\n }\n\n default: {\n return formatForEditing({ type: props.type, format: props.format, value });\n }\n }\n };\n\n public setCellData = ({ col, row }: GridCell, value: any): void => {\n const rowIdx = this._displayToDataIndex.get(row) ?? row;\n const fields = this.table.view?.fields ?? [];\n if (col < 0 || col >= fields.length) {\n return;\n }\n\n const field = fields[col];\n const { props } = this._projection.getFieldProjection(field.id);\n switch (props.format) {\n case FormatEnum.Ref: {\n setValue(this._rows.value[rowIdx], field.path, value);\n break;\n }\n\n default: {\n setValue(\n this._rows.value[rowIdx],\n field.path,\n parseValue({\n type: props.type,\n format: props.format,\n value,\n }),\n );\n break;\n }\n }\n };\n\n //\n // Column Operations\n //\n\n public deleteColumn(fieldId: string): void {\n if (!this.table.view) {\n return;\n }\n\n const field = this.table.view.fields.find((field) => field.id === fieldId);\n if (field && this._onDeleteColumn) {\n if (this._sorting.value?.fieldId === fieldId) {\n this.clearSort();\n }\n this._onDeleteColumn(field.id);\n }\n }\n\n //\n // Interactions\n //\n public handleGridClick = (event: React.MouseEvent): void => {\n if (!this._modalController.handleClick(event)) {\n const target = event.target as HTMLElement;\n\n const selectionCheckbox = target.closest(`input[${tableControls.checkbox.attributes.checkbox}]`);\n if (selectionCheckbox) {\n const isHeader = selectionCheckbox.hasAttribute(tableControls.checkbox.attributes.header);\n if (isHeader) {\n if (this._selection.allRowsSeleted.value) {\n this._selection.setSelection('none');\n } else {\n this._selection.setSelection('all');\n }\n } else {\n const rowIndex = Number(selectionCheckbox.getAttribute(tableControls.checkbox.attributes.checkbox));\n this._selection.toggleSelectionForRowIndex(rowIndex);\n }\n }\n }\n };\n\n //\n // Resize\n //\n\n public setColumnWidth(columnIndex: number, width: number): void {\n const fields = this.table.view?.fields ?? [];\n if (columnIndex < fields.length) {\n const newWidth = Math.max(0, width);\n const field = fields[columnIndex];\n if (field) {\n field.size = newWidth;\n }\n }\n }\n\n //\n // Sorting\n //\n\n public setSort(fieldId: string, direction: SortDirection): void {\n this._sorting.value = { fieldId, direction };\n }\n\n public clearSort(): void {\n this._sorting.value = undefined;\n }\n\n //\n // Pinning\n //\n\n // TODO(burdon): Change to setPinned(on/off).\n public pinRow(rowIndex: number, side: 'top' | 'bottom'): void {\n this._pinnedRows[side].push(rowIndex);\n }\n\n public unpinRow(rowIndex: number): void {\n this._pinnedRows.top = this._pinnedRows.top.filter((index: number) => index !== rowIndex);\n this._pinnedRows.bottom = this._pinnedRows.bottom.filter((index: number) => index !== rowIndex);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { signal } from '@preact/signals-core';\nimport { type RefObject, type MouseEvent, type MutableRefObject } from 'react';\n\nimport { tableButtons } from '../util';\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: 'columnSettings'; mode: ColumnSettingsMode }\n | { type: 'closed' };\n\nexport class ModalController {\n private readonly _state = signal<ModalState>({ type: 'closed' });\n private readonly _triggerRef: MutableRefObject<HTMLElement> = { current: null as unknown as HTMLElement };\n\n public get state() {\n return this._state;\n }\n\n public get trigger() {\n return this._triggerRef as RefObject<HTMLButtonElement>;\n }\n\n public handleClick = (event: MouseEvent): boolean => {\n const target = event.target as HTMLElement;\n\n const rowButton = target.closest(`button[${tableButtons.rowMenu.attr}]`);\n if (rowButton) {\n this._triggerRef.current = rowButton as HTMLElement;\n this._state.value = {\n type: 'row',\n rowIndex: Number(rowButton.getAttribute(tableButtons.rowMenu.attr)),\n };\n return true;\n }\n\n const columnButton = target.closest(`button[${tableButtons.columnSettings.attr}]`);\n if (columnButton) {\n const fieldId = columnButton.getAttribute(tableButtons.columnSettings.attr)!;\n this._triggerRef.current = columnButton as HTMLElement;\n this._state.value = {\n type: 'column',\n fieldId,\n };\n return true;\n }\n\n const addColumnButton = target.closest(`button[${tableButtons.addColumn.attr}]`);\n if (addColumnButton) {\n this._triggerRef.current = addColumnButton as HTMLElement;\n this._state.value = {\n type: 'columnSettings',\n mode: { type: 'create' },\n };\n return true;\n }\n\n return false;\n };\n\n public openColumnSettings = () => {\n if (this._state.value.type === 'column') {\n const fieldId = this._state.value.fieldId;\n // Queue next render to let the column action modal close completely.\n requestAnimationFrame(() => {\n this._state.value = {\n type: 'columnSettings',\n mode: { type: 'edit', fieldId },\n };\n });\n }\n };\n\n public close = () => {\n this._state.value = { type: 'closed' };\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { computed, effect, signal, type ReadonlySignal } from '@preact/signals-core';\n\nimport { Resource } from '@dxos/context';\n\nimport { type BaseTableRow } from './table-model';\nimport { touch } from '../util';\n\nexport class SelectionModel<T extends BaseTableRow> extends Resource {\n private readonly _selection = signal<Set<string>>(new Set());\n\n private readonly _validSelectedIds = computed<Set<string>>(() => {\n const rows = this._rows.value;\n if (!rows) {\n return new Set<string>();\n }\n const validIds = new Set(rows.map((row) => row.id));\n return new Set([...this._selection.value].filter((id) => validIds.has(id)));\n });\n\n private readonly _hasSelection = computed<boolean>(() => this._validSelectedIds.value.size > 0);\n\n private readonly _allSelected = computed<boolean>(() => {\n const rows = this._rows.value;\n if (rows.length === 0) {\n return false;\n }\n return rows.every((row) => this._selection.value.has(row.id));\n });\n\n constructor(\n private readonly _rows: ReadonlySignal<T[]>,\n private readonly _onSelectionChanged?: () => void,\n ) {\n super();\n }\n\n protected override async _open() {\n const selectionWatcher = effect(() => {\n touch(this._selection.value);\n this._onSelectionChanged?.();\n });\n this._ctx.onDispose(selectionWatcher);\n }\n\n //\n // Getters\n //\n\n public get selection(): ReadonlySignal<Set<string>> {\n return this._selection;\n }\n\n public get hasSelection(): ReadonlySignal<boolean> {\n return this._hasSelection;\n }\n\n public get allRowsSeleted(): ReadonlySignal<boolean> {\n return this._allSelected;\n }\n\n public getSelectedRows = (): T[] => {\n const selectedIds = this._validSelectedIds.value;\n return this._rows.value.filter((row) => selectedIds.has(row.id));\n };\n\n public isRowIndexSelected = (rowIndex: number): boolean => {\n const row = this._rows.value[rowIndex];\n return this._selection.value.has(row.id);\n };\n\n public isObjectSelected = (object: T): boolean => {\n return this._selection.value.has(object.id);\n };\n\n //\n // Manipulation\n //\n\n public toggleSelectionForRowIndex = (rowIndex: number): void => {\n const row = this._rows.value[rowIndex];\n const newSelection = new Set(this._selection.value);\n\n if (newSelection.has(row.id)) {\n newSelection.delete(row.id);\n } else {\n newSelection.add(row.id);\n }\n\n this._selection.value = newSelection;\n };\n\n public setSelection = (mode: 'all' | 'none'): void => {\n this._selection.value = mode === 'all' ? new Set(this._rows.value.map((row) => row.id)) : new Set();\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport const checkboxAttributes = {\n checkbox: 'data-table-checkbox',\n header: 'data-table-header',\n} as const;\n\nexport type RenderCheckboxProps = { rowIndex: number; header?: boolean; checked?: boolean; disabled?: boolean };\nexport const renderCheckbox = ({\n rowIndex,\n header = false,\n checked = false,\n disabled = false,\n}: RenderCheckboxProps): string => {\n const baseClasses = 'absolute inset-block-[6px] inline-end-[6px] ch-checkbox' as const;\n const { attributes } = tableControls.checkbox;\n return `<input type=\"checkbox\" class=\"${baseClasses}\" ${attributes.checkbox}=\"${rowIndex}\" ${header ? attributes.header : ''} ${checked ? 'checked' : ''} ${disabled ? 'disabled' : ''} data-testid=\"table-selection\"/>`;\n};\n\nexport const tableControls = {\n checkbox: {\n attributes: checkboxAttributes,\n render: renderCheckbox,\n },\n} as const;\n"],
5
- "mappings": "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",
6
- "names": ["translationKey", "React", "forwardRef", "useCallback", "useImperativeHandle", "useState", "getValue", "invariant", "Filter", "getSpace", "fullyQualifiedId", "useAttention", "Grid", "closestCell", "mx", "isNotFalsy", "React", "DropdownMenu", "useTranslation", "ColumnActionsMenu", "model", "t", "useTranslation", "translationKey", "state", "modalController", "value", "type", "currentSort", "sorting", "isCurrentColumnSorted", "fieldId", "DropdownMenu", "Root", "modal", "open", "onOpenChange", "close", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "Viewport", "direction", "Item", "data-testid", "onClick", "setSort", "clearSort", "getColumnCount", "deleteColumn", "openColumnSettings", "Arrow", "React", "useCallback", "useEffect", "useMemo", "useState", "getSpace", "DropdownMenu", "FieldEditor", "ColumnSettings", "model", "newField", "setNewField", "useState", "state", "modalController", "value", "space", "getSpace", "table", "useEffect", "type", "mode", "projection", "createFieldProjection", "undefined", "existingField", "useMemo", "view", "fields", "find", "f", "id", "fieldId", "field", "handleClose", "useCallback", "close", "handleCancel", "deleteFieldProjection", "React", "DropdownMenu", "Root", "modal", "open", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "classNames", "Viewport", "FieldEditor", "registry", "db", "schemaRegistry", "onClose", "onCancel", "Arrow", "React", "DropdownMenu", "useTranslation", "RowActionsMenu", "model", "t", "useTranslation", "translationKey", "state", "modalController", "value", "hasSelection", "selection", "type", "React", "DropdownMenu", "Root", "modal", "open", "onOpenChange", "close", "VirtualTrigger", "virtualRef", "trigger", "Content", "Viewport", "Item", "data-testid", "onClick", "deleteRow", "rowIndex", "Arrow", "React", "useCallback", "useMemo", "FormatEnum", "invariant", "editorKeys", "GridCellEditor", "useGridContext", "autocompletion", "pickedCompletion", "EditorView", "completion", "onQuery", "onMatch", "EditorView", "theme", "width", "autocompletion", "icons", "activateOnTyping", "override", "context", "text", "state", "doc", "toString", "from", "options", "tooltipClass", "optionClass", "updateListener", "of", "update", "transactions", "forEach", "tr", "annotation", "pickedCompletion", "data", "fromGridCell", "col", "row", "toGridCell", "cell", "split", "map", "Number", "touch", "value", "AST", "Format", "FormatEnum", "S", "TypedObject", "TypeEnum", "log", "PublicKey", "create", "createFieldId", "createView", "ViewProjection", "initializeTable", "space", "table", "initialRow", "info", "ContactSchema", "typename", "random", "truncate", "version", "name", "optional", "String", "annotations", "TitleAnnotationId", "email", "Email", "salary", "Currency", "contactSchema", "db", "schemaRegistry", "addSchema", "view", "jsonSchema", "fields", "projection", "setFieldProjection", "field", "id", "path", "size", "referencePath", "props", "property", "type", "Ref", "format", "referenceSchema", "title", "add", "TABLE_ATTRS", "columnSettings", "rowMenu", "newColumn", "ICONS", "createButtonHtml", "button", "value", "disabled", "testId", "buttonClasses", "tableButtons", "attr", "icon", "render", "fieldId", "rowIndex", "toString", "addColumn", "TableCellEditor", "model", "onEnter", "onFocus", "onQuery", "__gridScope", "editing", "useGridContext", "fieldProjection", "useMemo", "col", "toGridCell", "index", "field", "projection", "view", "fields", "getFieldProjection", "id", "invariant", "handleClose", "useCallback", "value", "event", "cell", "determineNavigationAxis", "determineNavigationDelta", "handleBlur", "undefined", "setCellData", "extension", "editorKeys", "onClose", "initialContent", "onNav", "props", "format", "FormatEnum", "Ref", "push", "completion", "text", "onMatch", "data", "getCellContent", "getCellData", "String", "React", "GridCellEditor", "onBlur", "key", "shift", "inlineEndLine", "blockEndLine", "frozen", "frozenRowsStart", "frozenColsStart", "frozenColsEnd", "TableRoot", "children", "role", "React", "div", "className", "mx", "TableMain", "forwardRef", "model", "ignoreAttention", "forwardedRef", "dxGrid", "setDxGrid", "useState", "hasAttention", "useAttention", "table", "fullyQualifiedId", "useImperativeHandle", "getCells", "bind", "update", "cell", "updateIfWithinBounds", "updateCells", "handleFocus", "increment", "delta", "refocus", "handleEnter", "useCallback", "row", "getRowCount", "insertRow", "handleKeyDown", "event", "closestCell", "target", "key", "setCellData", "undefined", "handleAxisResize", "axis", "columnIndex", "parseInt", "index", "setColumnWidth", "size", "handleWheel", "stopPropagation", "handleQuery", "field", "props", "_text", "referenceSchema", "referencePath", "space", "getSpace", "invariant", "schema", "db", "schemaRegistry", "getSchema", "objects", "query", "Filter", "run", "map", "obj", "value", "getValue", "label", "data", "filter", "isNotFalsy", "span", "Grid", "Root", "id", "TableCellEditor", "onEnter", "onFocus", "onQuery", "Content", "onWheelCapture", "columns", "columnMeta", "limitRows", "limitColumns", "view", "fields", "length", "onAxisResize", "onClick", "handleGridClick", "onKeyDown", "overscroll", "ref", "RowActionsMenu", "ColumnActionsMenu", "ColumnSettings", "Table", "Main", "createContext", "React", "Toolbar", "NaturalToolbar", "useTranslation", "React", "Icon", "Toolbar", "NaturalToolbar", "Tooltip", "buttonStyles", "tooltipProps", "side", "classNames", "ToolbarSeparator", "React", "div", "role", "className", "ToolbarButton", "icon", "children", "props", "Tooltip", "Root", "Trigger", "asChild", "NaturalToolbar", "Button", "variant", "Icon", "size", "span", "Portal", "Content", "Arrow", "ToolbarContextProvider", "useToolbarContext", "createContext", "ToolbarRoot", "classNames", "children", "onAction", "React", "NaturalToolbar", "Root", "Editing", "t", "useTranslation", "translationKey", "ToolbarButton", "value", "icon", "data-testid", "onClick", "type", "Actions", "Toolbar", "Separator", "ToolbarSeparator", "useEffect", "useState", "computed", "effect", "signal", "orderBy", "Resource", "getValue", "setValue", "FormatEnum", "invariant", "PublicKey", "cellClassesForFieldType", "cellClassesForRowSelection", "formatForDisplay", "formatForEditing", "parseValue", "mx", "VIEW_FIELD_LIMIT", "signal", "ModalController", "_state", "signal", "type", "_triggerRef", "current", "handleClick", "event", "target", "rowButton", "closest", "tableButtons", "rowMenu", "attr", "value", "rowIndex", "Number", "getAttribute", "columnButton", "columnSettings", "fieldId", "addColumnButton", "addColumn", "mode", "openColumnSettings", "requestAnimationFrame", "close", "state", "trigger", "computed", "effect", "signal", "Resource", "SelectionModel", "Resource", "constructor", "_rows", "_onSelectionChanged", "_selection", "signal", "Set", "_validSelectedIds", "computed", "rows", "value", "validIds", "map", "row", "id", "filter", "has", "_hasSelection", "size", "_allSelected", "length", "every", "getSelectedRows", "selectedIds", "isRowIndexSelected", "rowIndex", "isObjectSelected", "object", "toggleSelectionForRowIndex", "newSelection", "delete", "add", "setSelection", "mode", "_open", "selectionWatcher", "effect", "touch", "_ctx", "onDispose", "selection", "hasSelection", "allRowsSeleted", "checkboxAttributes", "checkbox", "header", "renderCheckbox", "rowIndex", "checked", "disabled", "baseClasses", "attributes", "tableControls", "render", "TableModel", "Resource", "constructor", "table", "projection", "sorting", "pinnedRows", "top", "bottom", "onCellUpdate", "onDeleteColumn", "onDeleteRows", "onInsertRow", "onRowOrderChanged", "id", "PublicKey", "random", "truncate", "_visibleRange", "signal", "start", "row", "col", "end", "_displayToDataIndex", "Map", "_sorting", "undefined", "_rows", "_modalController", "ModalController", "getCells", "range", "plane", "value", "getMainGridCells", "getHeaderCells", "getSelectionColumnCells", "getActionColumnCells", "getSelectAllCell", "getNewColumnCell", "values", "fields", "_table", "view", "addCell", "obj", "field", "colIndex", "displayIndex", "props", "_projection", "getFieldProjection", "getValue", "path", "format", "FormatEnum", "Ref", "referencePath", "formatForDisplay", "type", "classes", "formatClasses", "cellClassesForFieldType", "push", "rowSelectionClasses", "cellClassesForRowSelection", "_selection", "isObjectSelected", "length", "className", "mx", "flat", "idx", "fromGridCell", "_sortedRows", "title", "readonly", "resizeHandle", "accessoryHtml", "tableButtons", "columnSettings", "render", "fieldId", "isSelected", "isRowIndexSelected", "tableControls", "checkbox", "rowIndex", "checked", "rowMenu", "header", "allRowsSeleted", "addColumn", "disabled", "VIEW_FIELD_LIMIT", "setRows", "getRowCount", "getColumnCount", "insertRow", "get", "_onInsertRow", "deleteRow", "objectsToDelete", "hasSelection", "selectedRows", "getSelectedRows", "_onDeleteRows", "getCellData", "dataIndex", "formatForEditing", "setCellData", "rowIdx", "setValue", "parseValue", "handleGridClick", "event", "handleClick", "target", "selectionCheckbox", "closest", "attributes", "isHeader", "hasAttribute", "setSelection", "Number", "getAttribute", "toggleSelectionForRowIndex", "at", "_pinnedRows", "_onDeleteColumn", "_onCellUpdate", "_onRowOrderChanged", "columnMeta", "invariant", "_columnMeta", "modalController", "selection", "_open", "initializeColumnMeta", "initializeSorting", "initializeEffects", "SelectionModel", "open", "_ctx", "computed", "meta", "Object", "fromEntries", "map", "index", "size", "resizeable", "grid", "frozenColsStart", "frozenColsEnd", "clear", "sort", "find", "dataWithIndices", "item", "isEmpty", "sorted", "orderBy", "direction", "set", "rowOrderWatcher", "effect", "touch", "onDispose", "rowEffectManager", "rowEffects", "forEach", "cleanup", "deleteColumn", "clearSort", "setColumnWidth", "columnIndex", "width", "newWidth", "Math", "max", "setSort", "pinRow", "side", "unpinRow", "filter", "useTableModel", "objects", "table", "projection", "props", "model", "setModel", "useState", "useEffect", "t", "setTimeout", "TableModel", "open", "clearTimeout", "close", "setRows"]
3
+ "sources": ["../../../src/translations.ts", "../../../src/components/Table/Table.tsx", "../../../src/components/Table/ColumnActionsMenu.tsx", "../../../src/components/Table/ColumnSettings.tsx", "../../../src/components/Table/CreateRefPanel.tsx", "../../../src/components/Table/RefPanel.tsx", "../../../src/components/Table/RowActionsMenu.tsx", "../../../src/components/TableCellEditor/TableCellEditor.tsx", "../../../src/components/TableCellEditor/extension.ts", "../../../src/components/Toolbar/Toolbar.tsx", "../../../src/components/Toolbar/common.tsx", "../../../src/hooks/useTableModel.ts", "../../../src/model/table-model.ts", "../../../src/model/modal-controller.ts", "../../../src/util/signals.ts", "../../../src/util/table.ts", "../../../src/util/table-buttons.ts", "../../../src/model/selection-model.ts", "../../../src/util/table-controls.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport const translationKey = 'table';\n\nexport default [\n {\n 'en-US': {\n [translationKey]: {\n 'object placeholder': 'New table',\n 'create object label': 'Create table',\n 'table name placeholder': 'Table name',\n 'settings title': 'Table settings',\n 'table schema label': 'Schema',\n 'new schema': 'New schema',\n 'continue label': 'Continue',\n 'create stack section label': 'Create table',\n 'add row': 'Add row',\n 'create comment': 'Create thread',\n 'column action sort descending': 'Sort Descending',\n 'column action sort ascending': 'Sort Ascending',\n 'column action clear sorting': 'Clear Sorting',\n 'column action settings': 'Column Settings',\n 'column action delete': 'Delete Column',\n 'delete row label': 'Delete row',\n 'bulk delete row label': 'Delete selected rows',\n 'column deleted label': 'Column deleted',\n 'new column button label': 'Create column',\n 'create new object label': 'Create new object “{{text}}”',\n },\n },\n },\n] as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, {\n forwardRef,\n type PropsWithChildren,\n useCallback,\n useImperativeHandle,\n useState,\n type WheelEvent,\n} from 'react';\n\nimport { getValue } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { Filter, getSpace, fullyQualifiedId } from '@dxos/react-client/echo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { useAttention } from '@dxos/react-ui-attention';\nimport { type DxGridElement, Grid, type GridContentProps, closestCell, type DxGridPosition } from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { ColumnActionsMenu } from './ColumnActionsMenu';\nimport { ColumnSettings } from './ColumnSettings';\nimport { CreateRefPanel } from './CreateRefPanel';\nimport { RefPanel } from './RefPanel';\nimport { RowActionsMenu } from './RowActionsMenu';\nimport { type TableModel } from '../../model';\nimport { translationKey } from '../../translations';\nimport { createOption, TableCellEditor, type TableCellEditorProps } from '../TableCellEditor';\n\n// NOTE(Zan): These fragments add border to inline-end and block-end of the grid using pseudo-elements.\n// These are offset by 1px to avoid double borders in planks.\nconst inlineEndLine =\n '[&>.dx-grid]:relative [&>.dx-grid]:after:absolute [&>.dx-grid]:after:inset-block-0 [&>.dx-grid]:after:-inline-end-px [&>.dx-grid]:after:is-px [&>.dx-grid]:after:bg-separator';\nconst blockEndLine =\n '[&>.dx-grid]:before:absolute [&>.dx-grid]:before:inset-inline-0 [&>.dx-grid]:before:-block-end-px [&>.dx-grid]:before:bs-px [&>.dx-grid]:before:bg-separator';\n\nconst frozen = { frozenRowsStart: 1, frozenColsStart: 1, frozenColsEnd: 1 };\n\n//\n// Root\n//\n\nexport type TableRootProps = PropsWithChildren<{ role?: string }>;\n\nconst TableRoot = ({ children, role }: TableRootProps) => {\n return (\n <div\n role='none'\n className={mx(\n 'relative border-bs !border-separator',\n role === 'section'\n ? 'attention-surface overflow-hidden [&_.dx-grid]:max-is-[--dx-grid-content-inline-size]'\n : 'flex flex-col [&_.dx-grid]:grow [&_.dx-grid]:max-is-[--dx-grid-content-inline-size] [&_.dx-grid]:bs-0 [&_.dx-grid]:max-bs-[--dx-grid-content-block-size]',\n )}\n >\n {children}\n </div>\n );\n};\n\n//\n// Main\n//\n\nexport type TableController = {\n update?: (cell?: DxGridPosition) => void;\n};\n\nexport type TableMainProps = {\n model?: TableModel;\n ignoreAttention?: boolean;\n};\n\nconst TableMain = forwardRef<TableController, TableMainProps>(({ model, ignoreAttention }, forwardedRef) => {\n const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);\n const { hasAttention } = useAttention(model?.table ? fullyQualifiedId(model.table) : 'table');\n const { t } = useTranslation(translationKey);\n\n /**\n * Provides an external controller that can be called to repaint the table.\n */\n useImperativeHandle<TableController, TableController>(\n forwardedRef,\n () => {\n if (!model || !dxGrid) {\n return {};\n }\n\n dxGrid.getCells = model.getCells.bind(model);\n return {\n update: (cell) => {\n if (cell) {\n dxGrid.updateIfWithinBounds(cell);\n } else {\n dxGrid.updateCells(true);\n }\n },\n };\n },\n [model, dxGrid],\n );\n\n const handleFocus = useCallback<NonNullable<TableCellEditorProps['onFocus']>>(\n (increment, delta) => {\n if (dxGrid) {\n dxGrid.refocus(increment, delta);\n }\n },\n [dxGrid],\n );\n\n const handleEnter = useCallback<NonNullable<TableCellEditorProps['onEnter']>>(\n (cell) => {\n // TODO(burdon): Insert row only if bottom row isn't completely blank already.\n if (model && cell.row === model.getRowCount() - 1) {\n model.insertRow(cell.row);\n if (dxGrid) {\n requestAnimationFrame(() => {\n dxGrid?.scrollToRow(cell.row + 1);\n dxGrid?.refocus('row', 1);\n });\n }\n }\n },\n [model, dxGrid],\n );\n\n const handleKeyDown = useCallback<NonNullable<GridContentProps['onKeyDown']>>(\n (event) => {\n const cell = closestCell(event.target);\n if (!model || !cell) {\n return;\n }\n\n switch (event.key) {\n case 'Backspace':\n case 'Delete': {\n model.setCellData(cell, undefined);\n break;\n }\n }\n },\n [model],\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 // TODO(burdon): Factor out?\n // TODO(burdon): Generalize to handle other value types (e.g., enums).\n const handleQuery = useCallback<NonNullable<TableCellEditorProps['onQuery']>>(\n async ({ field, props }, text) => {\n if (model && props.referenceSchema && field.referencePath) {\n const space = getSpace(model.table);\n invariant(space);\n const schema = space.db.schemaRegistry.getSchema(props.referenceSchema);\n if (schema) {\n const { objects } = await space.db.query(Filter.schema(schema)).run();\n const options = objects\n .map((obj) => {\n const value = getValue(obj, field.referencePath!);\n if (!value || typeof value !== 'string') {\n return undefined;\n }\n\n return {\n label: value,\n data: obj,\n };\n })\n .filter(isNotFalsy);\n\n return [\n ...options,\n {\n label: t('create new object label', { text }),\n data: createOption(text),\n },\n ];\n }\n }\n\n return [];\n },\n [model],\n );\n\n if (!model) {\n return <span role='none' className='attention-surface' />;\n }\n\n return (\n <Grid.Root id={model.table.id ?? 'table-grid'}>\n <TableCellEditor model={model} onEnter={handleEnter} onFocus={handleFocus} onQuery={handleQuery} />\n <Grid.Content\n onWheelCapture={handleWheel}\n className={mx('[--dx-grid-base:var(--surface-bg)]', inlineEndLine, blockEndLine)}\n frozen={frozen}\n columns={model.columnMeta.value}\n limitRows={model.getRowCount() ?? 0}\n limitColumns={model.table.view?.fields?.length ?? 0}\n onAxisResize={handleAxisResize}\n onClick={model?.handleGridClick}\n onKeyDown={handleKeyDown}\n overscroll='trap'\n ref={setDxGrid}\n />\n <RowActionsMenu model={model} />\n <ColumnActionsMenu model={model} />\n <ColumnSettings model={model} onNewColumn={handleNewColumn} />\n <RefPanel model={model} />\n <CreateRefPanel model={model} />\n </Grid.Root>\n );\n});\n\n//\n// CellEditor\n//\n\nexport const Table = {\n Root: TableRoot,\n Main: TableMain,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { DropdownMenu, useTranslation } from '@dxos/react-ui';\n\nimport { type TableModel } from '../../model';\nimport { translationKey } from '../../translations';\n\ntype ColumnActionsMenuProps = { model?: TableModel };\n\nexport const ColumnActionsMenu = ({ model }: ColumnActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const state = model?.modalController.state.value;\n if (!model || state?.type !== 'column') {\n return null;\n }\n\n const currentSort = model.sorting;\n const isCurrentColumnSorted = currentSort?.fieldId === state.fieldId;\n\n return (\n <DropdownMenu.Root modal={false} open={state?.type === 'column'} onOpenChange={model.modalController.close}>\n <DropdownMenu.VirtualTrigger virtualRef={model.modalController.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')}\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')}\n </DropdownMenu.Item>\n )}\n {isCurrentColumnSorted && (\n <DropdownMenu.Item data-testid='column-clear-sort' onClick={() => model.clearSort()}>\n {t('column action clear sorting')}\n </DropdownMenu.Item>\n )}\n {model.getColumnCount() > 1 && (\n <DropdownMenu.Item data-testid='column-delete' onClick={() => model.deleteColumn(state.fieldId)}>\n {t('column action delete')}\n </DropdownMenu.Item>\n )}\n <DropdownMenu.Item data-testid='column-settings' onClick={() => model.modalController.openColumnSettings()}>\n {t('column action settings')}\n </DropdownMenu.Item>\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 React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { getSpace } from '@dxos/react-client/echo';\nimport { DropdownMenu } from '@dxos/react-ui';\nimport { FieldEditor } from '@dxos/react-ui-form';\nimport { type FieldType } from '@dxos/schema';\n\nimport { type TableModel } from '../../model';\n\ntype ColumnSettingsProps = { model?: TableModel; onNewColumn: () => void };\n\nexport const ColumnSettings = ({ model, onNewColumn }: ColumnSettingsProps) => {\n const [newField, setNewField] = useState<FieldType>();\n const state = model?.modalController.state.value;\n\n const space = getSpace(model?.table);\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?.table?.view?.fields.find((f) => f.id === mode.fieldId);\n }\n }\n return undefined;\n }, [model?.table?.view?.fields, state]);\n\n const field = existingField ?? newField;\n\n const handleSave = useCallback(() => {\n model?.modalController.close();\n }, [model?.modalController]);\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?.table?.view || !model.projection || !field) {\n return null;\n }\n\n return (\n <DropdownMenu.Root modal={false} open={state?.type === 'columnSettings'}>\n <DropdownMenu.VirtualTrigger virtualRef={model.modalController.trigger} />\n <DropdownMenu.Portal>\n <DropdownMenu.Content classNames='md:is-64'>\n <DropdownMenu.Viewport>\n <FieldEditor\n view={model.table.view}\n projection={model.projection}\n field={field}\n registry={space?.db.schemaRegistry}\n onSave={handleSave}\n onCancel={handleCancel}\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 React, { useCallback, useMemo } from 'react';\n\nimport { S } from '@dxos/echo-schema';\nimport { create, getSpace } from '@dxos/react-client/echo';\nimport { Popover } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\nimport { type GridScopedProps, useGridContext } from '@dxos/react-ui-grid';\n\nimport { type TableModel } from '../../model';\n\nexport type CreateRefPanelProps = { model?: TableModel };\n\n// TODO(burdon): Factor out Space dependency (to plugin?)\nexport const CreateRefPanel = ({ model, __gridScope }: GridScopedProps<CreateRefPanelProps>) => {\n const { id: gridId } = useGridContext('TableCellEditor', __gridScope);\n const space = getSpace(model?.table);\n const state = model?.modalController.state.value;\n const schema = useMemo<S.Schema<any> | undefined>(() => {\n if (!space || state?.type !== 'createRefPanel') {\n return;\n }\n\n // TODO(burdon): Factor out.\n const schema: S.Schema<any> | undefined = space.db.schemaRegistry.getSchema(state.typename)?.schema;\n if (schema) {\n const omit = S.omit<any, any, ['id']>('id');\n return omit(schema);\n }\n }, [space, state]);\n\n const handleSave = useCallback(\n (values: any) => {\n if (!model || !space || state?.type !== 'createRefPanel') {\n return;\n }\n\n const schema: S.Schema<any> | undefined = space.db.schemaRegistry.getSchema(state.typename)?.schema;\n if (schema) {\n const obj = space.db.add(create(schema, values));\n state.onCreate?.(obj);\n }\n\n void model.modalController.close();\n },\n [model?.modalController, space, state],\n );\n\n const handleCancel = useCallback(() => {\n if (model) {\n model.modalController.close();\n }\n }, [model?.modalController]);\n\n if (!model?.table?.view || !model.projection) {\n return null;\n }\n\n return (\n <Popover.Root\n modal={false}\n open={state?.type === 'createRefPanel' && !!schema}\n onOpenChange={(nextOpen) => {\n if (model && !nextOpen) {\n return model.modalController.close();\n }\n }}\n >\n <Popover.VirtualTrigger virtualRef={model.modalController.trigger} />\n <Popover.Portal>\n <Popover.Content classNames='md:is-64' data-grid={gridId}>\n {state?.type === 'createRefPanel' && schema && (\n <Form schema={schema} values={state.initialValues ?? {}} onSave={handleSave} onCancel={handleCancel} />\n )}\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { getSpace, type Space } from '@dxos/react-client/echo';\nimport { Popover } from '@dxos/react-ui';\nimport { Form } from '@dxos/react-ui-form';\n\nimport { type TableModel } from '../../model';\n\ntype RefPanelProps = { model?: TableModel };\n\nconst getRefTargetObj = (space?: Space, id?: string) => {\n if (space && id) {\n return space?.db.getObjectById(id);\n } else {\n return undefined;\n }\n};\n\nexport const RefPanel = ({ model }: RefPanelProps) => {\n const state = model?.modalController.state.value;\n const space = getSpace(model?.table);\n const targetObj = getRefTargetObj(space, state?.type === 'refPanel' ? state.targetId : undefined);\n const schema = space && state?.type === 'refPanel' ? space.db.schemaRegistry.getSchema(state.typename) : undefined;\n\n if (!model?.table?.view || !model.projection) {\n return null;\n }\n\n return (\n <Popover.Root\n modal={false}\n open={state?.type === 'refPanel' && !!targetObj && !!schema}\n onOpenChange={(nextOpen) => {\n if (model && !nextOpen) {\n return model.modalController.close();\n }\n }}\n >\n <Popover.VirtualTrigger virtualRef={model.modalController.trigger} />\n <Popover.Portal>\n <Popover.Content classNames='md:is-64'>\n {targetObj && schema && <Form readonly values={targetObj} schema={schema} />}\n <Popover.Arrow />\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { DropdownMenu, useTranslation } from '@dxos/react-ui';\n\nimport { type TableModel } from '../../model';\nimport { translationKey } from '../../translations';\n\ntype RowActionsMenuProps = { model: TableModel };\n\nexport const RowActionsMenu = ({ model }: RowActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const hasSelection = model.selection.hasSelection.value;\n const state = model.modalController.state.value;\n if (state?.type !== 'row') {\n return null;\n }\n\n return (\n <DropdownMenu.Root modal={false} open={true} onOpenChange={model.modalController.close}>\n <DropdownMenu.VirtualTrigger virtualRef={model.modalController.trigger} />\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\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 </DropdownMenu.Viewport>\n <DropdownMenu.Arrow />\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Completion } from '@codemirror/autocomplete';\nimport React, { useCallback, useMemo, useRef } from 'react';\n\nimport { FormatEnum } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { type DxGrid } from '@dxos/lit-grid';\nimport {\n cellQuery,\n editorKeys,\n parseCellIndex,\n useGridContext,\n type DxGridPlanePosition,\n type EditorKeyEvent,\n type EditorKeyOrBlurHandler,\n type EditorBlurHandler,\n GridCellEditor,\n type GridCellEditorProps,\n type GridScopedProps,\n} from '@dxos/react-ui-grid';\nimport { type FieldProjection } from '@dxos/schema';\n\nimport { completion } from './extension';\nimport { type TableModel } from '../../model';\n\nconst newValue = Symbol.for('newValue');\n\n/**\n * Option to create new object/value.\n */\nexport const createOption = (text: string) => ({ [newValue]: true, text });\n\nconst isCreateOption = (data: any) => typeof data === 'object' && data[newValue];\n\nexport type QueryResult = Pick<Completion, 'label'> & { data: any };\n\nexport type TableCellEditorProps = {\n model?: TableModel;\n onEnter?: (cell: DxGridPlanePosition) => void;\n onFocus?: DxGrid['refocus'];\n onQuery?: (field: FieldProjection, text: string) => Promise<QueryResult[]>;\n};\n\nexport const TableCellEditor = ({\n model,\n onEnter,\n onFocus,\n onQuery,\n __gridScope,\n}: GridScopedProps<TableCellEditorProps>) => {\n const { id: gridId, editing, setEditing } = useGridContext('TableCellEditor', __gridScope);\n const suppressNextBlur = useRef(false);\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.view.fields[col];\n const fieldProjection = model.projection.getFieldProjection(field.id);\n invariant(fieldProjection);\n return fieldProjection;\n }, [model, editing]);\n\n const handleEnter = useCallback(\n (value: any) => {\n if (!model || !editing) {\n return;\n }\n\n const cell = parseCellIndex(editing.index);\n model.setCellData(cell, value);\n onEnter?.(cell);\n onFocus?.();\n setEditing(null);\n },\n [model, editing],\n );\n\n const handleBlur = useCallback<EditorBlurHandler>(\n (value) => {\n if (!model || !editing) {\n return;\n }\n if (suppressNextBlur.current) {\n suppressNextBlur.current = false;\n return;\n }\n\n const cell = parseCellIndex(editing.index);\n if (value !== undefined) {\n model.setCellData(cell, value);\n }\n },\n [model, editing],\n );\n\n const handleClose = useCallback<EditorKeyOrBlurHandler>(\n (value, event) => {\n if (!model || !editing || !fieldProjection) {\n return;\n }\n\n const cell = parseCellIndex(editing.index);\n onEnter?.(cell);\n if (event && onFocus) {\n onFocus(determineNavigationAxis(event), determineNavigationDelta(event));\n }\n },\n [model, editing, onFocus, onEnter, fieldProjection, determineNavigationAxis, determineNavigationDelta],\n );\n\n const extension = useMemo(() => {\n if (!fieldProjection) {\n return [];\n }\n\n const extension = [\n editorKeys({\n onClose: handleClose,\n ...(editing?.initialContent && { onNav: handleClose }),\n }),\n ];\n\n if (onQuery) {\n switch (fieldProjection.props.format) {\n case FormatEnum.Ref: {\n extension.push([\n completion({\n onQuery: (text) => onQuery(fieldProjection, text),\n onMatch: (data) => {\n if (model && editing) {\n if (isCreateOption(data)) {\n const { field, props } = fieldProjection;\n if (props.referenceSchema) {\n suppressNextBlur.current = true;\n model.modalController.openCreateRef(\n props.referenceSchema,\n document.querySelector(cellQuery(editing.index, gridId)),\n {\n [field.referencePath!]: data.text,\n },\n (data) => {\n handleEnter(data);\n },\n );\n }\n } else {\n handleEnter(data);\n }\n }\n },\n }),\n ]);\n break;\n }\n }\n }\n\n return extension;\n }, [model, editing, fieldProjection, handleClose]);\n\n const getCellContent = useCallback<GridCellEditorProps['getCellContent']>(() => {\n if (model && editing) {\n const value = model.getCellData(parseCellIndex(editing.index));\n return value !== undefined ? String(value) : '';\n }\n }, [model, editing]);\n\n return <GridCellEditor extension={extension} getCellContent={getCellContent} onBlur={handleBlur} />;\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 2024 DXOS.org\n//\n\nimport {\n autocompletion,\n pickedCompletion,\n type CompletionContext,\n type CompletionResult,\n} from '@codemirror/autocomplete';\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\n\nexport type CompletionOptions = {\n debug?: boolean;\n onQuery: (text: string) => Promise<CompletionResult['options']>;\n onMatch: (data: any) => void;\n};\n\n/**\n * Autocomplete Codemirror extension.\n * https://codemirror.net/docs/ref/#autocomplete.autocompletion\n */\nexport const completion = ({ debug, onQuery, onMatch }: CompletionOptions): Extension => {\n return [\n EditorView.theme({\n '.cm-completionDialog': {\n width: 'var(--dx-gridCellWidth)',\n },\n }),\n\n autocompletion({\n icons: false,\n activateOnTyping: true,\n closeOnBlur: !debug,\n override: [\n async (context: CompletionContext): Promise<CompletionResult> => {\n const text = context.state.doc.toString();\n return {\n from: 0,\n options: await onQuery(text),\n };\n },\n ],\n\n // TODO(burdon): Consts from grid (to line-up with grid).\n tooltipClass: () => 'cm-completionDialog !mt-[8px] !-ml-[4px] [&>ul]:!max-h-[264px]',\n optionClass: () => 'flex h-[33px] items-center',\n }),\n\n // Check for accepted completion metadata in the transaction.\n EditorView.updateListener.of((update) => {\n update.transactions.forEach((tr) => {\n const completion = tr.annotation(pickedCompletion);\n if (completion) {\n onMatch((completion as any).data);\n }\n });\n }),\n ];\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { Toolbar as NaturalToolbar, type ThemedClassName, useTranslation } from '@dxos/react-ui';\n\nimport { ToolbarButton, ToolbarSeparator } from './common';\nimport { translationKey } from '../../translations';\n\n//\n// Root\n//\n\n// TODO(Zan): This should become a union later.\nexport type ToolbarAction = { type: 'add-row' } | { type: 'comment' };\n\nexport type ToolbarActionType = ToolbarAction['type'];\n\nexport type ToolbarActionHandler = (action: ToolbarAction) => void;\n\nexport type ToolbarProps = ThemedClassName<\n PropsWithChildren<{\n onAction?: ToolbarActionHandler;\n }>\n>;\n\nconst [ToolbarContextProvider, useToolbarContext] = createContext<ToolbarProps>('Toolbar');\n\nconst ToolbarRoot = ({ classNames, children, onAction }: ToolbarProps) => {\n return (\n <ToolbarContextProvider onAction={onAction}>\n <NaturalToolbar.Root\n classNames={['is-full shrink-0 overflow-x-auto overflow-y-hidden p-1 attention-surface', classNames]}\n >\n {children}\n </NaturalToolbar.Root>\n </ToolbarContextProvider>\n );\n};\n\nconst Editing = () => {\n const { onAction } = useToolbarContext('Editing');\n const { t } = useTranslation(translationKey);\n\n return (\n <>\n <ToolbarButton\n value='add-row'\n icon='ph--plus--regular'\n data-testid='table.toolbar.add-row'\n onClick={() => onAction?.({ type: 'add-row' })}\n >\n {t('add row')}\n </ToolbarButton>\n </>\n );\n};\n\nconst Actions = () => {\n const { onAction } = useToolbarContext('Actions');\n const { t } = useTranslation(translationKey);\n\n return (\n <>\n <ToolbarButton\n value='comment'\n icon='ph--chat-text--regular'\n data-testid='table.toolbar.comment'\n onClick={() => onAction?.({ type: 'comment' })}\n >\n {t('create comment')}\n </ToolbarButton>\n </>\n );\n};\n\nexport const Toolbar = {\n Root: ToolbarRoot,\n Editing,\n Actions,\n Separator: ToolbarSeparator,\n};\n\nexport { useToolbarContext };\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport {\n Icon,\n type IconProps,\n Toolbar as NaturalToolbar,\n Tooltip,\n type ToolbarButtonProps as NaturalToolbarButtonProps,\n type ToolbarToggleGroupItemProps as NaturalToolbarToggleGroupItemProps,\n} from '@dxos/react-ui';\n\n// TODO(burdon): Factor out into new package (react-ui-toolbar) in common with react-ui-editor, etc.\n\nexport const buttonStyles = 'min-bs-0 p-2';\nexport const tooltipProps = { side: 'top' as const, classNames: 'z-10' };\n\nexport const ToolbarSeparator = () => <div role='separator' className='grow' />;\n\n//\n// ToolbarButton\n//\n\ntype ToolbarButtonProps = NaturalToolbarButtonProps & Pick<IconProps, 'icon'>;\n\nexport const ToolbarButton = ({ icon, children, ...props }: ToolbarButtonProps) => {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.Button variant='ghost' {...props} classNames={buttonStyles}>\n <Icon icon={icon} size={5} />\n <span className='sr-only'>{children}</span>\n </NaturalToolbar.Button>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content {...tooltipProps}>\n {children}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n\n//\n// ToolbarToggleButton\n//\n\nexport type ToolbarToggleButtonProps = NaturalToolbarToggleGroupItemProps & Pick<IconProps, 'icon'>;\n\nexport const ToolbarToggleButton = ({ icon, children, ...props }: ToolbarToggleButtonProps) => {\n return (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <NaturalToolbar.ToggleGroupItem variant='ghost' {...props} classNames={buttonStyles}>\n <Icon icon={icon} size={5} />\n <span className='sr-only'>{children}</span>\n </NaturalToolbar.ToggleGroupItem>\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Content {...tooltipProps}>\n {children}\n <Tooltip.Arrow />\n </Tooltip.Content>\n </Tooltip.Portal>\n </Tooltip.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type ReactiveObject } from '@dxos/react-client/echo';\nimport { type ViewProjection } from '@dxos/schema';\n\nimport { type BaseTableRow, TableModel, type TableModelProps } from '../model';\nimport { type TableType } from '../types';\n\nexport type UseTableModelParams<T extends BaseTableRow = { id: string }> = {\n table?: TableType;\n projection?: ViewProjection;\n objects?: ReactiveObject<T>[];\n} & Pick<TableModelProps<T>, 'onInsertRow' | 'onDeleteRows' | 'onDeleteColumn' | 'onCellUpdate' | 'onRowOrderChanged'>;\n\nexport const useTableModel = <T extends BaseTableRow = { id: string }>({\n objects,\n table,\n projection,\n ...props\n}: UseTableModelParams<T>): TableModel<T> | undefined => {\n const [model, setModel] = useState<TableModel<T>>();\n useEffect(() => {\n if (!table || !projection) {\n return;\n }\n\n let model: TableModel<T> | undefined;\n const t = setTimeout(async () => {\n model = new TableModel<T>({ table, projection, ...props });\n await model.open();\n setModel(model);\n });\n\n return () => {\n clearTimeout(t);\n void model?.close();\n };\n }, [table, projection]); // TODO(burdon): Trigger if callbacks change?\n\n // Update data.\n useEffect(() => {\n if (objects) {\n model?.setRows(objects);\n }\n }, [model, objects]);\n\n return model;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { computed, effect, signal, type ReadonlySignal } from '@preact/signals-core';\nimport orderBy from 'lodash.orderby';\n\nimport { Resource } from '@dxos/context';\nimport { getValue, setValue, FormatEnum, type JsonProp } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/react-client';\nimport {\n cellClassesForFieldType,\n cellClassesForRowSelection,\n formatForDisplay,\n formatForEditing,\n parseValue,\n} from '@dxos/react-ui-form';\nimport {\n type DxGridAxisMeta,\n type DxGridCellValue,\n type DxGridPlane,\n type DxGridPlaneCells,\n type DxGridPlaneRange,\n type DxGridPlanePosition,\n toPlaneCellIndex,\n type DxGridPosition,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\nimport { VIEW_FIELD_LIMIT, type ViewProjection, type FieldType } from '@dxos/schema';\n\nimport { ModalController } from './modal-controller';\nimport { SelectionModel } from './selection-model';\nimport { type TableType } from '../types';\nimport { tableButtons, touch } from '../util';\nimport { tableControls } from '../util/table-controls';\n\nexport type SortDirection = 'asc' | 'desc';\nexport type SortConfig = { fieldId: string; direction: SortDirection };\n\nexport type BaseTableRow = Record<JsonProp, any> & { id: string };\n\nexport type TableModelProps<T extends BaseTableRow = { id: string }> = {\n table: TableType;\n projection: ViewProjection;\n sorting?: SortConfig[];\n pinnedRows?: { top: number[]; bottom: number[] };\n onInsertRow?: (index?: number) => void;\n onDeleteRows?: (index: number, obj: T[]) => void;\n onDeleteColumn?: (fieldId: string) => void;\n onCellUpdate?: (cell: DxGridPosition) => void;\n onRowOrderChanged?: () => void;\n};\n\nexport class TableModel<T extends BaseTableRow = { id: string }> extends Resource {\n public readonly id = `table-model-${PublicKey.random().truncate()}`;\n\n private readonly _table: TableType;\n private readonly _projection: ViewProjection;\n\n private readonly _visibleRange = signal<DxGridPlaneRange>({\n start: { row: 0, col: 0 },\n end: { row: 0, col: 0 },\n });\n\n /**\n * Maps display indices to data indices.\n * Used for translating between sorted/displayed order and original data order.\n * Keys are display indices, values are corresponding data indices.\n */\n private readonly _displayToDataIndex: Map<number, number> = new Map();\n\n private readonly _onInsertRow?: TableModelProps<T>['onInsertRow'];\n private readonly _onDeleteRows?: TableModelProps<T>['onDeleteRows'];\n private readonly _onDeleteColumn?: TableModelProps<T>['onDeleteColumn'];\n private readonly _onCellUpdate?: TableModelProps<T>['onCellUpdate'];\n private readonly _onRowOrderChanged?: TableModelProps<T>['onRowOrderChanged'];\n\n private readonly _sorting = signal<SortConfig | undefined>(undefined);\n private _sortedRows!: ReadonlySignal<T[]>;\n private _rows = signal<T[]>([]);\n\n private _pinnedRows: NonNullable<TableModelProps<T>['pinnedRows']>;\n\n private _selection!: SelectionModel<T>;\n private _columnMeta?: ReadonlySignal<DxGridAxisMeta>;\n private readonly _modalController = new ModalController();\n\n constructor({\n table,\n projection,\n sorting = [],\n pinnedRows = { top: [], bottom: [] },\n onCellUpdate,\n onDeleteColumn,\n onDeleteRows,\n onInsertRow,\n onRowOrderChanged,\n }: TableModelProps<T>) {\n super();\n this._table = table;\n this._projection = projection;\n\n this._sorting.value = sorting.at(0);\n this._pinnedRows = pinnedRows;\n this._onInsertRow = onInsertRow;\n this._onDeleteRows = onDeleteRows;\n this._onDeleteColumn = onDeleteColumn;\n this._onCellUpdate = onCellUpdate;\n this._onRowOrderChanged = onRowOrderChanged;\n }\n\n public get table() {\n return this._table;\n }\n\n public get projection() {\n return this._projection;\n }\n\n public get pinnedRows(): NonNullable<TableModelProps<T>['pinnedRows']> {\n return this._pinnedRows;\n }\n\n public get columnMeta(): ReadonlySignal<DxGridAxisMeta> {\n invariant(this._columnMeta);\n return this._columnMeta;\n }\n\n public get sorting(): SortConfig | undefined {\n return this._sorting.value;\n }\n\n public get modalController() {\n return this._modalController;\n }\n\n public get selection() {\n return this._selection;\n }\n\n //\n // Initialisation\n //\n\n protected override async _open() {\n this.initializeColumnMeta();\n this.initializeSorting();\n this.initializeEffects();\n this._selection = new SelectionModel(this._sortedRows, () => this._onRowOrderChanged?.());\n await this._selection.open(this._ctx);\n }\n\n private initializeColumnMeta(): void {\n this._columnMeta = computed(() => {\n const fields = this._table.view?.fields ?? [];\n const meta = Object.fromEntries(\n fields.map((field, index: number) => [index, { size: field?.size ?? 256, resizeable: true }]),\n );\n\n return {\n grid: meta,\n frozenColsStart: { 0: { size: 30, resizeable: false } },\n frozenColsEnd: { 0: { size: 40, resizeable: false } },\n };\n });\n }\n\n private initializeSorting(): void {\n this._sortedRows = computed(() => {\n this._displayToDataIndex.clear();\n const sort = this._sorting.value;\n if (!sort) {\n return this._rows.value;\n }\n\n const field = this._table.view?.fields.find((field) => field.id === sort.fieldId);\n if (!field) {\n return this._rows.value;\n }\n\n const dataWithIndices = this._rows.value.map((item, index) => {\n const value = getValue(item, field.path);\n return { item, index, value, isEmpty: value == null || value === '' };\n });\n const sorted = orderBy(dataWithIndices, ['isEmpty', 'value'], ['asc', sort.direction]);\n\n for (let displayIndex = 0; displayIndex < sorted.length; displayIndex++) {\n const { index: dataIndex } = sorted[displayIndex];\n if (displayIndex !== dataIndex) {\n this._displayToDataIndex.set(displayIndex, dataIndex);\n }\n }\n\n return sorted.map(({ item }) => item);\n });\n }\n\n private initializeEffects(): void {\n const rowOrderWatcher = effect(() => {\n touch(this._sortedRows.value);\n this._onRowOrderChanged?.();\n });\n this._ctx.onDispose(rowOrderWatcher);\n\n /**\n * Creates reactive effects for each row in the visible range.\n * Subscribes to changes in the visible range, recreating row effects when it changes.\n * When a row's data changes, invokes onCellUpdate to notify subscribers and trigger UI updates.\n */\n const rowEffectManager = effect(() => {\n const { start, end } = touch(this._visibleRange.value);\n const rowEffects: ReturnType<typeof effect>[] = [];\n for (let row = start.row; row <= end.row; row++) {\n rowEffects.push(\n effect(() => {\n const obj = this._sortedRows.value[row];\n this?._table?.view?.fields.forEach((field) => touch(getValue(obj, field.path)));\n this._onCellUpdate?.({ row, col: start.col, plane: 'grid' });\n }),\n );\n }\n\n return () => rowEffects.forEach((cleanup) => cleanup());\n });\n this._ctx.onDispose(rowEffectManager);\n }\n\n //\n // Get Cells\n //\n\n public getCells = (range: DxGridPlaneRange, plane: DxGridPlane): DxGridPlaneCells => {\n switch (plane) {\n case 'grid': {\n this._visibleRange.value = range;\n return this.getMainGridCells(range);\n }\n case 'frozenRowsStart': {\n return this.getHeaderCells(range);\n }\n case 'frozenColsStart': {\n return this.getSelectionColumnCells(range);\n }\n case 'frozenColsEnd': {\n return this.getActionColumnCells(range);\n }\n case 'fixedStartStart': {\n return this.getSelectAllCell();\n }\n case 'fixedStartEnd': {\n return this.getNewColumnCell();\n }\n default: {\n return {};\n }\n }\n };\n\n private getMainGridCells = (range: DxGridPlaneRange): DxGridPlaneCells => {\n const cells: DxGridPlaneCells = {};\n const fields = this._table.view?.fields ?? [];\n\n const addCell = (obj: T, field: FieldType, colIndex: number, displayIndex: number): void => {\n const { props } = this._projection.getFieldProjection(field.id);\n\n const cell: DxGridCellValue = {\n get value() {\n const value = getValue(obj, field.path);\n if (value == null) {\n return '';\n }\n\n switch (props.format) {\n case FormatEnum.Ref: {\n if (!field.referencePath) {\n return ''; // TODO(burdon): Show error.\n }\n\n return getValue(value, field.referencePath);\n }\n\n default: {\n return formatForDisplay({ type: props.type, format: props.format, value });\n }\n }\n },\n };\n\n const classes = [];\n const formatClasses = cellClassesForFieldType({ type: props.type, format: props.format });\n if (formatClasses) {\n classes.push(formatClasses);\n }\n const rowSelectionClasses = cellClassesForRowSelection(this._selection.isObjectSelected(obj));\n if (rowSelectionClasses) {\n classes.push(rowSelectionClasses);\n }\n if (classes.length > 0) {\n cell.className = mx(classes.flat());\n }\n\n if (cell.value && props.format === FormatEnum.Ref && props.referenceSchema) {\n const targetObj = getValue(obj, field.path);\n cell.accessoryHtml = tableButtons.referencedCell.render({\n targetId: targetObj.id,\n schemaId: props.referenceSchema,\n });\n }\n\n const idx = toPlaneCellIndex({ col: colIndex, row: displayIndex });\n cells[idx] = cell;\n };\n\n for (let row = range.start.row; row <= range.end.row && row < this._sortedRows.value.length; row++) {\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n const field = fields[col];\n if (!field) {\n continue;\n }\n\n addCell(this._sortedRows.value[row], field, col, row);\n }\n }\n\n return cells;\n };\n\n private getHeaderCells = (range: DxGridPlaneRange): DxGridPlaneCells => {\n const cells: DxGridPlaneCells = {};\n const fields = this.table.view?.fields ?? [];\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n const { field, props } = this._projection.getFieldProjection(fields[col].id);\n cells[toPlaneCellIndex({ col, row: 0 })] = {\n // TODO(burdon): Use same logic as form for fallback title.\n value: props.title ?? field.path,\n readonly: true,\n resizeHandle: 'col',\n accessoryHtml: tableButtons.columnSettings.render({ fieldId: field.id }),\n };\n }\n\n return cells;\n };\n\n private getSelectionColumnCells = (range: DxGridPlaneRange): DxGridPlaneCells => {\n const cells: DxGridPlaneCells = {};\n for (let row = range.start.row; row <= range.end.row && row < this._rows.value.length; row++) {\n const isSelected = this._selection.isRowIndexSelected(row);\n const classes = cellClassesForRowSelection(isSelected);\n cells[toPlaneCellIndex({ col: 0, row })] = {\n value: '',\n readonly: true,\n className: classes ? mx(classes) : undefined,\n accessoryHtml: tableControls.checkbox.render({ rowIndex: row, checked: isSelected }),\n };\n }\n\n return cells;\n };\n\n private getActionColumnCells = (range: DxGridPlaneRange): DxGridPlaneCells => {\n const cells: DxGridPlaneCells = {};\n for (let row = range.start.row; row <= range.end.row && row < this._rows.value.length; row++) {\n const isSelected = this._selection.isRowIndexSelected(row);\n const classes = cellClassesForRowSelection(isSelected);\n cells[toPlaneCellIndex({ col: 0, row })] = {\n value: '',\n readonly: true,\n className: classes ? mx(classes) : undefined,\n accessoryHtml: tableButtons.rowMenu.render({ rowIndex: row }),\n };\n }\n\n return cells;\n };\n\n private getSelectAllCell = (): DxGridPlaneCells => {\n return {\n [toPlaneCellIndex({ col: 0, row: 0 })]: {\n value: '',\n accessoryHtml: tableControls.checkbox.render({\n rowIndex: 0,\n header: true,\n checked: this._selection.allRowsSeleted.value,\n }),\n readonly: true,\n },\n };\n };\n\n private getNewColumnCell = (): DxGridPlaneCells => {\n return {\n [toPlaneCellIndex({ col: 0, row: 0 })]: {\n value: '',\n accessoryHtml: tableButtons.addColumn.render({\n disabled: (this._table.view?.fields?.length ?? 0) >= VIEW_FIELD_LIMIT,\n }),\n readonly: true,\n },\n };\n };\n\n //\n // Data\n //\n\n public setRows = (obj: T[]): void => {\n this._rows.value = obj;\n };\n\n public getRowCount = (): number => this._rows.value.length;\n\n public getColumnCount = (): number => this.table.view?.fields.length ?? 0;\n\n public insertRow = (rowIndex?: number): void => {\n const row = rowIndex !== undefined ? this._displayToDataIndex.get(rowIndex) ?? rowIndex : this._rows.value.length;\n this._onInsertRow?.(row);\n };\n\n public deleteRow = (rowIndex: number): void => {\n const row = this._displayToDataIndex.get(rowIndex) ?? rowIndex;\n const obj = this._rows.value[row];\n const objectsToDelete = [];\n\n if (this._selection.hasSelection.value) {\n const selectedRows = this._selection.getSelectedRows();\n objectsToDelete.push(...selectedRows);\n } else {\n objectsToDelete.push(obj);\n }\n\n this._onDeleteRows?.(row, objectsToDelete);\n };\n\n public getCellData = ({ col, row }: DxGridPlanePosition): any => {\n const fields = this.table.view?.fields ?? [];\n if (col < 0 || col >= fields.length) {\n return undefined;\n }\n\n const field = fields[col];\n const dataIndex = this._displayToDataIndex.get(row) ?? row;\n const value = getValue(this._rows.value[dataIndex], field.path);\n if (value == null) {\n return '';\n }\n\n const { props } = this._projection.getFieldProjection(field.id);\n switch (props.format) {\n case FormatEnum.Ref: {\n if (!field.referencePath) {\n return ''; // TODO(burdon): Show error.\n }\n\n return getValue(value, field.referencePath);\n }\n\n default: {\n return formatForEditing({ type: props.type, format: props.format, value });\n }\n }\n };\n\n public setCellData = ({ col, row }: DxGridPlanePosition, value: any): void => {\n const rowIdx = this._displayToDataIndex.get(row) ?? row;\n const fields = this.table.view?.fields ?? [];\n if (col < 0 || col >= fields.length) {\n return;\n }\n\n const field = fields[col];\n const { props } = this._projection.getFieldProjection(field.id);\n switch (props.format) {\n case FormatEnum.Ref: {\n setValue(this._rows.value[rowIdx], field.path, value);\n break;\n }\n\n default: {\n setValue(\n this._rows.value[rowIdx],\n field.path,\n parseValue({\n type: props.type,\n format: props.format,\n value,\n }),\n );\n break;\n }\n }\n };\n\n //\n // Column Operations\n //\n\n public deleteColumn(fieldId: string): void {\n if (!this.table.view) {\n return;\n }\n\n const field = this.table.view.fields.find((field) => field.id === fieldId);\n if (field && this._onDeleteColumn) {\n if (this._sorting.value?.fieldId === fieldId) {\n this.clearSort();\n }\n this._onDeleteColumn(field.id);\n }\n }\n\n //\n // Interactions\n //\n public handleGridClick = (event: React.MouseEvent): void => {\n if (!this._modalController.handleClick(event)) {\n const target = event.target as HTMLElement;\n\n const selectionCheckbox = target.closest(`input[${tableControls.checkbox.attributes.checkbox}]`);\n if (selectionCheckbox) {\n const isHeader = selectionCheckbox.hasAttribute(tableControls.checkbox.attributes.header);\n if (isHeader) {\n if (this._selection.allRowsSeleted.value) {\n this._selection.setSelection('none');\n } else {\n this._selection.setSelection('all');\n }\n } else {\n const rowIndex = Number(selectionCheckbox.getAttribute(tableControls.checkbox.attributes.checkbox));\n this._selection.toggleSelectionForRowIndex(rowIndex);\n }\n }\n }\n };\n\n //\n // Resize\n //\n\n public setColumnWidth(columnIndex: number, width: number): void {\n const fields = this.table.view?.fields ?? [];\n if (columnIndex < fields.length) {\n const newWidth = Math.max(0, width);\n const field = fields[columnIndex];\n if (field) {\n field.size = newWidth;\n }\n }\n }\n\n //\n // Sorting\n //\n\n public setSort(fieldId: string, direction: SortDirection): void {\n this._sorting.value = { fieldId, direction };\n }\n\n public clearSort(): void {\n this._sorting.value = undefined;\n }\n\n //\n // Pinning\n //\n\n // TODO(burdon): Change to setPinned(on/off).\n public pinRow(rowIndex: number, side: 'top' | 'bottom'): void {\n this._pinnedRows[side].push(rowIndex);\n }\n\n public unpinRow(rowIndex: number): void {\n this._pinnedRows.top = this._pinnedRows.top.filter((index: number) => index !== rowIndex);\n this._pinnedRows.bottom = this._pinnedRows.bottom.filter((index: number) => index !== rowIndex);\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { signal } from '@preact/signals-core';\nimport { type RefObject, type MouseEvent, type MutableRefObject } from 'react';\n\nimport { type ReactiveObject } from '@dxos/live-object';\nimport { log } from '@dxos/log';\n\nimport { tableButtons } from '../util';\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 | {\n type: 'createRefPanel';\n typename: string;\n initialValues?: Record<string, string>;\n onCreate?: (obj: ReactiveObject<any>) => void;\n }\n | { type: 'columnSettings'; mode: ColumnSettingsMode }\n | { type: 'closed' };\n\nexport class ModalController {\n private readonly _state = signal<ModalState>({ type: 'closed' });\n private readonly _triggerRef: MutableRefObject<HTMLElement> = { current: null as unknown as HTMLElement };\n\n public get state() {\n return this._state;\n }\n\n public get trigger() {\n return this._triggerRef as RefObject<HTMLButtonElement>;\n }\n\n public handleClick = (event: MouseEvent): boolean => {\n const target = event.target as HTMLElement;\n\n // TODO(thure): why not just get the value of the closest recognized attribute and `switch` on that?\n // Repeated querying is more error-prone and less legible, I’d think.\n\n const rowButton = target.closest(`button[${tableButtons.rowMenu.attr}]`);\n if (rowButton) {\n this._triggerRef.current = rowButton as HTMLElement;\n this._state.value = {\n type: 'row',\n rowIndex: Number(rowButton.getAttribute(tableButtons.rowMenu.attr)),\n };\n return true;\n }\n\n const columnButton = target.closest(`button[${tableButtons.columnSettings.attr}]`);\n if (columnButton) {\n const fieldId = columnButton.getAttribute(tableButtons.columnSettings.attr)!;\n this._triggerRef.current = columnButton as HTMLElement;\n this._state.value = {\n type: 'column',\n fieldId,\n };\n return true;\n }\n\n const addColumnButton = target.closest(`button[${tableButtons.addColumn.attr}]`);\n if (addColumnButton) {\n this._triggerRef.current = addColumnButton as HTMLElement;\n this._state.value = {\n type: 'columnSettings',\n mode: { type: 'create' },\n };\n return true;\n }\n\n const refButton = target.closest(`button[${tableButtons.referencedCell.attr}]`);\n if (refButton) {\n this._triggerRef.current = refButton as HTMLElement;\n const [schemaId, targetId] = refButton.getAttribute(tableButtons.referencedCell.attr)!.split('#');\n this._state.value = {\n type: 'refPanel',\n targetId,\n typename: schemaId,\n };\n }\n\n return false;\n };\n\n public openColumnSettings = () => {\n if (this._state.value.type === 'column') {\n const fieldId = this._state.value.fieldId;\n // Queue next render to let the column action modal close completely.\n requestAnimationFrame(() => {\n this._state.value = {\n type: 'columnSettings',\n mode: { type: 'edit', fieldId },\n };\n });\n }\n };\n\n public openCreateRef = (\n typename: string,\n anchorCell: Element | null,\n initialValues?: Record<string, string>,\n onCreate?: (obj: ReactiveObject<any>) => void,\n ) => {\n if (anchorCell) {\n this._triggerRef.current = anchorCell as HTMLElement;\n this._state.value = {\n type: 'createRefPanel',\n typename,\n initialValues,\n onCreate,\n };\n } else {\n log.warn('anchor cell not found while creating new ref');\n }\n };\n\n public close = () => {\n this._state.value = { type: 'closed' };\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 2024 DXOS.org\n//\n\nimport {\n AST,\n Format,\n FormatEnum,\n type JsonPath,\n type JsonProp,\n type MutableSchema,\n S,\n TypedObject,\n TypeEnum,\n} from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { PublicKey } from '@dxos/react-client';\nimport { create, type Space } from '@dxos/react-client/echo';\nimport { createFieldId, createView, ViewProjection } from '@dxos/schema';\n\nimport { type TableType } from '../types';\n\ntype InitialiseTableProps = {\n space: Space;\n table: TableType;\n initialRow?: boolean;\n};\n\n// TODO(burdon): Pass in type.\n// TODO(burdon): User should determine typename.\nexport const initializeTable = ({ space, table, initialRow = true }: InitialiseTableProps): MutableSchema => {\n log.info('initializeTable', { table });\n\n const ContactSchema = TypedObject({\n typename: `example.com/type/${PublicKey.random().truncate()}`,\n version: '0.1.0',\n })({\n name: S.optional(S.String).annotations({\n [AST.TitleAnnotationId]: 'Name',\n }),\n email: S.optional(Format.Email),\n salary: S.optional(Format.Currency()).annotations({\n [AST.TitleAnnotationId]: 'Salary',\n }), // TODO(burdon): Should default to prop name?\n });\n\n const contactSchema = space.db.schemaRegistry.addSchema(ContactSchema);\n table.view = createView({\n name: 'Test',\n typename: contactSchema.typename,\n jsonSchema: contactSchema.jsonSchema,\n fields: ['name', 'email', 'salary'],\n });\n\n const projection = new ViewProjection(contactSchema, table.view!);\n projection.setFieldProjection({\n field: {\n id: table.view.fields[2].id,\n path: 'salary' as JsonPath,\n size: 150,\n },\n });\n\n projection.setFieldProjection({\n field: {\n id: createFieldId(),\n path: 'manager' as JsonPath,\n referencePath: 'name' as JsonPath,\n },\n props: {\n property: 'manager' as JsonProp,\n type: TypeEnum.Ref,\n format: FormatEnum.Ref,\n referenceSchema: contactSchema.typename,\n title: 'Manager',\n },\n });\n\n if (initialRow) {\n // TODO(burdon): Last (first) row should not be in db and should be managed by the model.\n space.db.add(create(contactSchema, {}));\n }\n\n return contactSchema;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\ntype TableButton = 'columnSettings' | 'rowMenu' | 'newColumn' | 'referencedCell';\n\n// TODO(thure): Lots of copy-pasted business here, this could by DRYed out substantially.\n\n// TODO(thure): These unique attributes come with more caveats than e.g. applying multiple attributes – one key-value\n// pair for identifying the button type and another for passing the fieldId.\n\nconst TABLE_ATTRS: { [K in TableButton]: string } = {\n referencedCell: 'data-table-ref-cell-button',\n columnSettings: 'data-table-column-settings-button',\n rowMenu: 'data-table-row-menu-button',\n newColumn: 'data-table-new-column-button',\n} as const;\n\nconst ICONS: { [K in TableButton]: string } = {\n referencedCell: 'ph--link-simple-horizontal--regular',\n columnSettings: 'ph--caret-down--regular',\n rowMenu: 'ph--dots-three--regular',\n newColumn: 'ph--plus--regular',\n} as const;\n\nconst createButtonHtml = ({\n button,\n value = '',\n disabled = false,\n testId,\n}: {\n button: TableButton;\n value?: string;\n disabled?: boolean;\n testId: string;\n}): string => {\n const buttonClasses = 'ch-button is-6 pli-0.5 min-bs-0 absolute inset-block-1 inline-end-2' as const;\n return `<button class=\"${buttonClasses}\" ${TABLE_ATTRS[button]}=\"${value}\" data-testid=\"${testId}\" ${disabled ? 'disabled' : ''}><svg><use href=\"/icons.svg#${ICONS[button]}\"/></svg></button>`;\n};\n\nexport const tableButtons = {\n referencedCell: {\n attr: TABLE_ATTRS.referencedCell,\n icon: ICONS.referencedCell,\n render: ({ targetId, schemaId }: { targetId: string; schemaId: string }) =>\n createButtonHtml({\n button: 'referencedCell',\n value: `${schemaId}#${targetId}`,\n testId: 'table-ref-cell-button',\n }),\n },\n columnSettings: {\n attr: TABLE_ATTRS.columnSettings,\n icon: ICONS.columnSettings,\n render: ({ fieldId }: { fieldId: string }) =>\n createButtonHtml({ button: 'columnSettings', value: fieldId, testId: 'table-column-settings-button' }),\n },\n rowMenu: {\n attr: TABLE_ATTRS.rowMenu,\n icon: ICONS.rowMenu,\n render: ({ rowIndex }: { rowIndex: number }) =>\n createButtonHtml({ button: 'rowMenu', value: rowIndex.toString(), testId: 'table-row-menu-button' }),\n },\n addColumn: {\n attr: TABLE_ATTRS.newColumn,\n icon: ICONS.newColumn,\n render: ({ disabled }: { disabled?: boolean } = {}) =>\n createButtonHtml({ button: 'newColumn', disabled, testId: 'table-new-column-button' }),\n },\n} as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { computed, effect, signal, type ReadonlySignal } from '@preact/signals-core';\n\nimport { Resource } from '@dxos/context';\n\nimport { type BaseTableRow } from './table-model';\nimport { touch } from '../util';\n\nexport class SelectionModel<T extends BaseTableRow> extends Resource {\n private readonly _selection = signal<Set<string>>(new Set());\n\n private readonly _validSelectedIds = computed<Set<string>>(() => {\n const rows = this._rows.value;\n if (!rows) {\n return new Set<string>();\n }\n const validIds = new Set(rows.map((row) => row.id));\n return new Set([...this._selection.value].filter((id) => validIds.has(id)));\n });\n\n private readonly _hasSelection = computed<boolean>(() => this._validSelectedIds.value.size > 0);\n\n private readonly _allSelected = computed<boolean>(() => {\n const rows = this._rows.value;\n if (rows.length === 0) {\n return false;\n }\n return rows.every((row) => this._selection.value.has(row.id));\n });\n\n constructor(\n private readonly _rows: ReadonlySignal<T[]>,\n private readonly _onSelectionChanged?: () => void,\n ) {\n super();\n }\n\n protected override async _open() {\n const selectionWatcher = effect(() => {\n touch(this._selection.value);\n this._onSelectionChanged?.();\n });\n this._ctx.onDispose(selectionWatcher);\n }\n\n //\n // Getters\n //\n\n public get selection(): ReadonlySignal<Set<string>> {\n return this._selection;\n }\n\n public get hasSelection(): ReadonlySignal<boolean> {\n return this._hasSelection;\n }\n\n public get allRowsSeleted(): ReadonlySignal<boolean> {\n return this._allSelected;\n }\n\n public getSelectedRows = (): T[] => {\n const selectedIds = this._validSelectedIds.value;\n return this._rows.value.filter((row) => selectedIds.has(row.id));\n };\n\n public isRowIndexSelected = (rowIndex: number): boolean => {\n const row = this._rows.value[rowIndex];\n return this._selection.value.has(row.id);\n };\n\n public isObjectSelected = (object: T): boolean => {\n return this._selection.value.has(object.id);\n };\n\n //\n // Manipulation\n //\n\n public toggleSelectionForRowIndex = (rowIndex: number): void => {\n const row = this._rows.value[rowIndex];\n const newSelection = new Set(this._selection.value);\n\n if (newSelection.has(row.id)) {\n newSelection.delete(row.id);\n } else {\n newSelection.add(row.id);\n }\n\n this._selection.value = newSelection;\n };\n\n public setSelection = (mode: 'all' | 'none'): void => {\n this._selection.value = mode === 'all' ? new Set(this._rows.value.map((row) => row.id)) : new Set();\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nexport const checkboxAttributes = {\n checkbox: 'data-table-checkbox',\n header: 'data-table-header',\n} as const;\n\nexport type RenderCheckboxProps = { rowIndex: number; header?: boolean; checked?: boolean; disabled?: boolean };\nexport const renderCheckbox = ({\n rowIndex,\n header = false,\n checked = false,\n disabled = false,\n}: RenderCheckboxProps): string => {\n const baseClasses = 'absolute inset-block-[6px] inline-end-[6px] ch-checkbox' as const;\n const { attributes } = tableControls.checkbox;\n return `<input type=\"checkbox\" class=\"${baseClasses}\" ${attributes.checkbox}=\"${rowIndex}\" ${header ? attributes.header : ''} ${checked ? 'checked' : ''} ${disabled ? 'disabled' : ''} data-testid=\"table-selection\"/>`;\n};\n\nexport const tableControls = {\n checkbox: {\n attributes: checkboxAttributes,\n render: renderCheckbox,\n },\n} as const;\n"],
5
+ "mappings": "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",
6
+ "names": ["translationKey", "React", "forwardRef", "useCallback", "useImperativeHandle", "useState", "getValue", "invariant", "Filter", "getSpace", "fullyQualifiedId", "useTranslation", "useAttention", "Grid", "closestCell", "mx", "isNotFalsy", "React", "DropdownMenu", "useTranslation", "ColumnActionsMenu", "model", "t", "useTranslation", "translationKey", "state", "modalController", "value", "type", "currentSort", "sorting", "isCurrentColumnSorted", "fieldId", "DropdownMenu", "Root", "modal", "open", "onOpenChange", "close", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "Viewport", "direction", "Item", "data-testid", "onClick", "setSort", "clearSort", "getColumnCount", "deleteColumn", "openColumnSettings", "Arrow", "React", "useCallback", "useEffect", "useMemo", "useState", "getSpace", "DropdownMenu", "FieldEditor", "ColumnSettings", "model", "onNewColumn", "newField", "setNewField", "useState", "state", "modalController", "value", "space", "getSpace", "table", "useEffect", "type", "mode", "projection", "createFieldProjection", "requestAnimationFrame", "undefined", "existingField", "useMemo", "view", "fields", "find", "f", "id", "fieldId", "field", "handleSave", "useCallback", "close", "handleCancel", "deleteFieldProjection", "React", "DropdownMenu", "Root", "modal", "open", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "classNames", "Viewport", "FieldEditor", "registry", "db", "schemaRegistry", "onSave", "onCancel", "Arrow", "React", "useCallback", "useMemo", "S", "create", "getSpace", "Popover", "Form", "useGridContext", "CreateRefPanel", "model", "__gridScope", "id", "gridId", "useGridContext", "space", "getSpace", "table", "state", "modalController", "value", "schema", "useMemo", "type", "db", "schemaRegistry", "getSchema", "typename", "omit", "S", "handleSave", "useCallback", "values", "obj", "add", "create", "onCreate", "close", "handleCancel", "view", "projection", "React", "Popover", "Root", "modal", "open", "onOpenChange", "nextOpen", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "classNames", "data-grid", "Form", "initialValues", "onSave", "onCancel", "Arrow", "React", "getSpace", "Popover", "Form", "getRefTargetObj", "space", "id", "db", "getObjectById", "undefined", "RefPanel", "model", "state", "modalController", "value", "getSpace", "table", "targetObj", "type", "targetId", "schema", "schemaRegistry", "getSchema", "typename", "view", "projection", "React", "Popover", "Root", "modal", "open", "onOpenChange", "nextOpen", "close", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "classNames", "Form", "readonly", "values", "Arrow", "React", "DropdownMenu", "useTranslation", "RowActionsMenu", "model", "t", "useTranslation", "translationKey", "hasSelection", "selection", "value", "state", "modalController", "type", "React", "DropdownMenu", "Root", "modal", "open", "onOpenChange", "close", "VirtualTrigger", "virtualRef", "trigger", "Content", "Viewport", "Item", "data-testid", "onClick", "deleteRow", "rowIndex", "Arrow", "React", "useCallback", "useMemo", "useRef", "FormatEnum", "invariant", "cellQuery", "editorKeys", "parseCellIndex", "useGridContext", "GridCellEditor", "autocompletion", "pickedCompletion", "EditorView", "completion", "debug", "onQuery", "onMatch", "EditorView", "theme", "width", "autocompletion", "icons", "activateOnTyping", "closeOnBlur", "override", "context", "text", "state", "doc", "toString", "from", "options", "tooltipClass", "optionClass", "updateListener", "of", "update", "transactions", "forEach", "tr", "annotation", "pickedCompletion", "data", "newValue", "Symbol", "for", "createOption", "text", "isCreateOption", "data", "TableCellEditor", "model", "onEnter", "onFocus", "onQuery", "__gridScope", "id", "gridId", "editing", "setEditing", "useGridContext", "suppressNextBlur", "useRef", "fieldProjection", "useMemo", "col", "parseCellIndex", "index", "field", "projection", "view", "fields", "getFieldProjection", "invariant", "handleEnter", "useCallback", "value", "cell", "setCellData", "handleBlur", "current", "undefined", "handleClose", "event", "determineNavigationAxis", "determineNavigationDelta", "extension", "editorKeys", "onClose", "initialContent", "onNav", "props", "format", "FormatEnum", "Ref", "push", "completion", "onMatch", "referenceSchema", "modalController", "openCreateRef", "document", "querySelector", "cellQuery", "referencePath", "getCellContent", "getCellData", "String", "React", "GridCellEditor", "onBlur", "key", "shift", "inlineEndLine", "blockEndLine", "frozen", "frozenRowsStart", "frozenColsStart", "frozenColsEnd", "TableRoot", "children", "role", "React", "div", "className", "mx", "TableMain", "forwardRef", "model", "ignoreAttention", "forwardedRef", "dxGrid", "setDxGrid", "useState", "hasAttention", "useAttention", "table", "fullyQualifiedId", "t", "useTranslation", "translationKey", "useImperativeHandle", "getCells", "bind", "update", "cell", "updateIfWithinBounds", "updateCells", "handleFocus", "useCallback", "increment", "delta", "refocus", "handleEnter", "row", "getRowCount", "insertRow", "requestAnimationFrame", "scrollToRow", "handleKeyDown", "event", "closestCell", "target", "key", "setCellData", "undefined", "handleAxisResize", "axis", "columnIndex", "parseInt", "index", "setColumnWidth", "size", "handleWheel", "stopPropagation", "handleNewColumn", "columns", "getColumnCount", "scrollToColumn", "handleQuery", "field", "props", "text", "referenceSchema", "referencePath", "space", "getSpace", "invariant", "schema", "db", "schemaRegistry", "getSchema", "objects", "query", "Filter", "run", "options", "map", "obj", "value", "getValue", "label", "data", "filter", "isNotFalsy", "createOption", "span", "Grid", "Root", "id", "TableCellEditor", "onEnter", "onFocus", "onQuery", "Content", "onWheelCapture", "columnMeta", "limitRows", "limitColumns", "view", "fields", "length", "onAxisResize", "onClick", "handleGridClick", "onKeyDown", "overscroll", "ref", "RowActionsMenu", "ColumnActionsMenu", "ColumnSettings", "onNewColumn", "RefPanel", "CreateRefPanel", "Table", "Main", "createContext", "React", "Toolbar", "NaturalToolbar", "useTranslation", "React", "Icon", "Toolbar", "NaturalToolbar", "Tooltip", "buttonStyles", "tooltipProps", "side", "classNames", "ToolbarSeparator", "React", "div", "role", "className", "ToolbarButton", "icon", "children", "props", "Tooltip", "Root", "Trigger", "asChild", "NaturalToolbar", "Button", "variant", "Icon", "size", "span", "Portal", "Content", "Arrow", "ToolbarContextProvider", "useToolbarContext", "createContext", "ToolbarRoot", "classNames", "children", "onAction", "React", "NaturalToolbar", "Root", "Editing", "t", "useTranslation", "translationKey", "ToolbarButton", "value", "icon", "data-testid", "onClick", "type", "Actions", "Toolbar", "Separator", "ToolbarSeparator", "useEffect", "useState", "computed", "effect", "signal", "orderBy", "Resource", "getValue", "setValue", "FormatEnum", "invariant", "PublicKey", "cellClassesForFieldType", "cellClassesForRowSelection", "formatForDisplay", "formatForEditing", "parseValue", "toPlaneCellIndex", "mx", "VIEW_FIELD_LIMIT", "signal", "log", "touch", "value", "AST", "Format", "FormatEnum", "S", "TypedObject", "TypeEnum", "log", "PublicKey", "create", "createFieldId", "createView", "ViewProjection", "initializeTable", "space", "table", "initialRow", "info", "ContactSchema", "typename", "random", "truncate", "version", "name", "optional", "String", "annotations", "TitleAnnotationId", "email", "Email", "salary", "Currency", "contactSchema", "db", "schemaRegistry", "addSchema", "view", "jsonSchema", "fields", "projection", "setFieldProjection", "field", "id", "path", "size", "referencePath", "props", "property", "type", "Ref", "format", "referenceSchema", "title", "add", "TABLE_ATTRS", "referencedCell", "columnSettings", "rowMenu", "newColumn", "ICONS", "createButtonHtml", "button", "value", "disabled", "testId", "buttonClasses", "tableButtons", "attr", "icon", "render", "targetId", "schemaId", "fieldId", "rowIndex", "toString", "addColumn", "ModalController", "_state", "signal", "type", "_triggerRef", "current", "handleClick", "event", "target", "rowButton", "closest", "tableButtons", "rowMenu", "attr", "value", "rowIndex", "Number", "getAttribute", "columnButton", "columnSettings", "fieldId", "addColumnButton", "addColumn", "mode", "refButton", "referencedCell", "schemaId", "targetId", "split", "typename", "openColumnSettings", "requestAnimationFrame", "openCreateRef", "anchorCell", "initialValues", "onCreate", "log", "warn", "close", "state", "trigger", "computed", "effect", "signal", "Resource", "SelectionModel", "Resource", "constructor", "_rows", "_onSelectionChanged", "_selection", "signal", "Set", "_validSelectedIds", "computed", "rows", "value", "validIds", "map", "row", "id", "filter", "has", "_hasSelection", "size", "_allSelected", "length", "every", "getSelectedRows", "selectedIds", "isRowIndexSelected", "rowIndex", "isObjectSelected", "object", "toggleSelectionForRowIndex", "newSelection", "delete", "add", "setSelection", "mode", "_open", "selectionWatcher", "effect", "touch", "_ctx", "onDispose", "selection", "hasSelection", "allRowsSeleted", "checkboxAttributes", "checkbox", "header", "renderCheckbox", "rowIndex", "checked", "disabled", "baseClasses", "attributes", "tableControls", "render", "TableModel", "Resource", "constructor", "table", "projection", "sorting", "pinnedRows", "top", "bottom", "onCellUpdate", "onDeleteColumn", "onDeleteRows", "onInsertRow", "onRowOrderChanged", "id", "PublicKey", "random", "truncate", "_visibleRange", "signal", "start", "row", "col", "end", "_displayToDataIndex", "Map", "_sorting", "undefined", "_rows", "_modalController", "ModalController", "getCells", "range", "plane", "value", "getMainGridCells", "getHeaderCells", "getSelectionColumnCells", "getActionColumnCells", "getSelectAllCell", "getNewColumnCell", "cells", "fields", "_table", "view", "addCell", "obj", "field", "colIndex", "displayIndex", "props", "_projection", "getFieldProjection", "cell", "getValue", "path", "format", "FormatEnum", "Ref", "referencePath", "formatForDisplay", "type", "classes", "formatClasses", "cellClassesForFieldType", "push", "rowSelectionClasses", "cellClassesForRowSelection", "_selection", "isObjectSelected", "length", "className", "mx", "flat", "referenceSchema", "targetObj", "accessoryHtml", "tableButtons", "referencedCell", "render", "targetId", "schemaId", "idx", "toPlaneCellIndex", "_sortedRows", "title", "readonly", "resizeHandle", "columnSettings", "fieldId", "isSelected", "isRowIndexSelected", "tableControls", "checkbox", "rowIndex", "checked", "rowMenu", "header", "allRowsSeleted", "addColumn", "disabled", "VIEW_FIELD_LIMIT", "setRows", "getRowCount", "getColumnCount", "insertRow", "get", "_onInsertRow", "deleteRow", "objectsToDelete", "hasSelection", "selectedRows", "getSelectedRows", "_onDeleteRows", "getCellData", "dataIndex", "formatForEditing", "setCellData", "rowIdx", "setValue", "parseValue", "handleGridClick", "event", "handleClick", "target", "selectionCheckbox", "closest", "attributes", "isHeader", "hasAttribute", "setSelection", "Number", "getAttribute", "toggleSelectionForRowIndex", "at", "_pinnedRows", "_onDeleteColumn", "_onCellUpdate", "_onRowOrderChanged", "columnMeta", "invariant", "_columnMeta", "modalController", "selection", "_open", "initializeColumnMeta", "initializeSorting", "initializeEffects", "SelectionModel", "open", "_ctx", "computed", "meta", "Object", "fromEntries", "map", "index", "size", "resizeable", "grid", "frozenColsStart", "frozenColsEnd", "clear", "sort", "find", "dataWithIndices", "item", "isEmpty", "sorted", "orderBy", "direction", "set", "rowOrderWatcher", "effect", "touch", "onDispose", "rowEffectManager", "rowEffects", "forEach", "cleanup", "deleteColumn", "clearSort", "setColumnWidth", "columnIndex", "width", "newWidth", "Math", "max", "setSort", "pinRow", "side", "unpinRow", "filter", "useTableModel", "objects", "table", "projection", "props", "model", "setModel", "useState", "useEffect", "t", "setTimeout", "TableModel", "open", "clearTimeout", "close", "setRows"]
7
7
  }