@dxos/react-ui-table 0.7.5-main.9d26e3a → 0.7.5-main.e9bb01b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{chunk-AT7O4RAD.mjs → chunk-T7CTRLHA.mjs} +2 -2
- package/dist/lib/browser/{chunk-AT7O4RAD.mjs.map → chunk-T7CTRLHA.mjs.map} +1 -1
- package/dist/lib/browser/index.mjs +446 -282
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/types/index.mjs +1 -1
- package/dist/lib/node/{chunk-YSBXNBDJ.cjs → chunk-XQRKYO7Q.cjs} +6 -6
- package/dist/lib/node/chunk-XQRKYO7Q.cjs.map +7 -0
- package/dist/lib/node/index.cjs +438 -268
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/types/index.cjs +3 -3
- package/dist/lib/node/types/index.cjs.map +1 -1
- package/dist/lib/node-esm/{chunk-6OH2NHUX.mjs → chunk-6HE6MLBK.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-6OH2NHUX.mjs.map → chunk-6HE6MLBK.mjs.map} +1 -1
- package/dist/lib/node-esm/index.mjs +446 -282
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/types/index.mjs +1 -1
- package/dist/types/src/components/Table/Table.d.ts.map +1 -1
- package/dist/types/src/components/Table/Table.stories.d.ts +1 -4
- package/dist/types/src/components/Table/Table.stories.d.ts.map +1 -1
- package/dist/types/src/components/TableToolbar/TableToolbar.d.ts +18 -0
- package/dist/types/src/components/TableToolbar/TableToolbar.d.ts.map +1 -0
- package/dist/types/src/components/TableToolbar/index.d.ts +2 -0
- package/dist/types/src/components/TableToolbar/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +1 -1
- package/dist/types/src/model/table-model.d.ts +11 -19
- package/dist/types/src/model/table-model.d.ts.map +1 -1
- package/dist/types/src/model/table-presentation.d.ts.map +1 -1
- package/dist/types/src/model/table-sorting.d.ts +53 -0
- package/dist/types/src/model/table-sorting.d.ts.map +1 -0
- package/dist/types/src/translations.d.ts +2 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/table.d.ts +3 -3
- package/dist/types/src/types/table.d.ts.map +1 -1
- package/dist/types/src/util/table-buttons.d.ts +15 -1
- package/dist/types/src/util/table-buttons.d.ts.map +1 -1
- package/dist/types/src/util/table.d.ts +2 -1
- package/dist/types/src/util/table.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +35 -34
- package/src/_deprecated/schema/Schema.stories.tsx +1 -1
- package/src/components/Table/ColumnActionsMenu.tsx +4 -4
- package/src/components/Table/Table.stories.tsx +52 -40
- package/src/components/Table/Table.tsx +4 -0
- package/src/components/TableToolbar/TableToolbar.tsx +72 -0
- package/src/components/{Toolbar → TableToolbar}/index.ts +1 -1
- package/src/components/index.ts +1 -1
- package/src/model/table-model.test.ts +0 -5
- package/src/model/table-model.ts +40 -98
- package/src/model/table-presentation.ts +25 -4
- package/src/model/table-sorting.ts +215 -0
- package/src/playwright/smoke.spec.ts +18 -11
- package/src/translations.ts +2 -1
- package/src/types/table.ts +1 -1
- package/src/util/table-buttons.ts +33 -3
- package/src/util/table-controls.ts +2 -2
- package/src/util/table.ts +78 -52
- package/dist/lib/node/chunk-YSBXNBDJ.cjs.map +0 -7
- package/dist/types/src/components/Toolbar/Toolbar.d.ts +0 -21
- package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar/common.d.ts +0 -14
- package/dist/types/src/components/Toolbar/common.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar/index.d.ts +0 -2
- package/dist/types/src/components/Toolbar/index.d.ts.map +0 -1
- package/src/components/Toolbar/Toolbar.tsx +0 -87
- package/src/components/Toolbar/common.tsx +0 -71
|
@@ -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/CreateRefPanel.tsx", "../../../src/components/Table/RefPanel.tsx", "../../../src/components/Table/RowActionsMenu.tsx", "../../../src/model/table-model.ts", "../../../src/model/selection-model.ts", "../../../src/util/signals.ts", "../../../src/util/table.ts", "../../../src/util/table-buttons.ts", "../../../src/util/table-controls.ts", "../../../src/model/modal-controller.ts", "../../../src/model/table-presentation.ts", "../../../src/components/TableCellEditor/TableCellEditor.tsx", "../../../src/components/TableCellEditor/extension.ts", "../../../src/components/
|
|
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 type MouseEvent,\n useMemo,\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 { ModalController, type TableModel, type TablePresentation } from '../../model';\nimport { translationKey } from '../../translations';\nimport { tableButtons, tableControls } from '../../util';\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 presentation?: TablePresentation;\n ignoreAttention?: boolean;\n};\n\nconst TableMain = forwardRef<TableController, TableMainProps>(\n ({ model, presentation, 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 const modals = useMemo(() => new ModalController(), []);\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 (!presentation || !dxGrid) {\n return {};\n }\n\n dxGrid.getCells = (range, plane) => presentation.getCells(range, plane);\n return {\n update: (cell) => {\n if (cell) {\n dxGrid.updateIfWithinBounds(cell);\n } else {\n dxGrid.updateCells(true);\n dxGrid.requestUpdate();\n }\n },\n };\n },\n [presentation, dxGrid],\n );\n\n const handleGridClick = useCallback(\n (event: MouseEvent) => {\n if (!modals) {\n return;\n }\n\n const buttonSelector = Object.values(tableButtons)\n .map((button) => `button[${button.attr}]`)\n .join(',');\n\n const tableButtonElement = (event.target as HTMLElement).closest(buttonSelector) as HTMLElement;\n if (tableButtonElement) {\n const button = Object.values(tableButtons).find((btn) => tableButtonElement.hasAttribute(btn.attr));\n if (!button) {\n return;\n }\n\n modals.setTrigger(tableButtonElement);\n const data = button.getData(tableButtonElement);\n switch (data.type) {\n case 'rowMenu': {\n modals.showRowMenu(data.rowIndex);\n break;\n }\n case 'columnSettings': {\n modals.showColumnMenu(data.fieldId);\n break;\n }\n case 'newColumn': {\n modals.showColumnCreator();\n break;\n }\n case 'referencedCell': {\n modals.showReferencePanel(data.targetId, data.schemaId);\n break;\n }\n }\n return;\n }\n\n const controlSelector = Object.values(tableControls)\n .map((control) => `input[${control.attr}]`)\n .join(',');\n\n const controlElement = (event.target as HTMLElement).closest(controlSelector) as HTMLElement;\n if (controlElement) {\n const control = Object.values(tableControls).find((ctrl) => controlElement.hasAttribute(ctrl.attr));\n if (!control) {\n return;\n }\n\n const data = control.getData(controlElement);\n switch (data.type) {\n case 'checkbox': {\n if (data.header) {\n model?.selection.setSelection(model.selection.allRowsSeleted.value ? 'none' : 'all');\n } else {\n model?.selection.toggleSelectionForRowIndex(data.rowIndex);\n }\n break;\n }\n case 'switch': {\n if (model) {\n model.updateCellData({ row: data.rowIndex, col: data.colIndex }, (value) => !value);\n }\n break;\n }\n }\n }\n },\n [model, modals],\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 || !modals) {\n return <span role='none' className='attention-surface' />;\n }\n\n return (\n <Grid.Root id={model.table.id ?? 'table-grid'}>\n <TableCellEditor\n model={model}\n modals={modals}\n onEnter={handleEnter}\n onFocus={handleFocus}\n 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?.target?.fields?.length ?? 0}\n onAxisResize={handleAxisResize}\n onClick={handleGridClick}\n onKeyDown={handleKeyDown}\n overscroll='trap'\n ref={setDxGrid}\n />\n <RowActionsMenu model={model} modals={modals} />\n <ColumnActionsMenu model={model} modals={modals} />\n <ColumnSettings model={model} modals={modals} onNewColumn={handleNewColumn} />\n <RefPanel model={model} modals={modals} />\n <CreateRefPanel model={model} modals={modals} />\n </Grid.Root>\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, type ModalController } from '../../model';\nimport { translationKey } from '../../translations';\n\ntype ColumnActionsMenuProps = { model: TableModel; modals: ModalController };\n\nexport const ColumnActionsMenu = ({ model, modals }: ColumnActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const state = modals.state.value;\n if (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={true} onOpenChange={modals.close}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Portal>\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n {(!isCurrentColumnSorted || currentSort?.direction === 'asc') && (\n <DropdownMenu.Item\n data-testid='column-sort-descending'\n onClick={() => model.setSort(state.fieldId, 'desc')}\n >\n {t('column action sort descending')}\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={() => modals.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, type ModalController } from '../../model';\n\ntype ColumnSettingsProps = { model?: TableModel; modals: ModalController; onNewColumn: () => void };\n\nexport const ColumnSettings = ({ model, modals, onNewColumn }: ColumnSettingsProps) => {\n const [newField, setNewField] = useState<FieldType>();\n const state = modals.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?.target?.fields.find((f) => f.id === mode.fieldId);\n }\n }\n return undefined;\n }, [model?.table?.view?.target?.fields, state]);\n\n const field = existingField ?? newField;\n\n const handleSave = useCallback(() => {\n modals.close();\n }, [modals]);\n\n const handleCancel = useCallback(() => {\n if (state?.type === 'columnSettings' && state.mode.type === 'create' && newField) {\n model?.projection?.deleteFieldProjection(newField.id);\n }\n }, [model?.projection, state, newField]);\n\n if (!model?.table?.view?.target || !model.projection || !field) {\n return null;\n }\n\n return (\n <DropdownMenu.Root modal={false} open={state?.type === 'columnSettings'}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Portal>\n <DropdownMenu.Content classNames='md:is-64'>\n <DropdownMenu.Viewport>\n <FieldEditor\n view={model.table.view.target!}\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, type ModalController } from '../../model';\n\nexport type CreateRefPanelProps = { model?: TableModel; modals: ModalController };\n\n// TODO(burdon): Factor out Space dependency (to plugin?)\nexport const CreateRefPanel = ({ model, modals, __gridScope }: GridScopedProps<CreateRefPanelProps>) => {\n const { id: gridId } = useGridContext('TableCellEditor', __gridScope);\n const space = getSpace(model?.table);\n const state = modals.state.value;\n\n const schema = useMemo<S.Schema<any> | undefined>(() => {\n if (!space || state?.type !== 'createRefPanel') {\n return;\n }\n\n const [schema] = space.db.schemaRegistry.query({ typename: state.typename }).runSync();\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] = space.db.schemaRegistry.query({ typename: state.typename }).runSync();\n if (schema) {\n const obj = space.db.add(create(schema, values));\n state.onCreate?.(obj);\n }\n void modals.close();\n },\n [modals, space, state],\n );\n\n const handleCancel = useCallback(() => {\n if (model) {\n modals.close();\n }\n }, [modals]);\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 modals.close();\n }\n }}\n >\n <Popover.VirtualTrigger virtualRef={modals.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, type ModalController } from '../../model';\n\ntype RefPanelProps = { model: TableModel; modals: ModalController };\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, modals }: RefPanelProps) => {\n const state = modals.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 (!nextOpen) {\n return modals.close();\n }\n }}\n >\n <Popover.VirtualTrigger virtualRef={modals.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, type ModalController } from '../../model';\nimport { translationKey } from '../../translations';\n\ntype RowActionsMenuProps = { model: TableModel; modals: ModalController };\n\nexport const RowActionsMenu = ({ model, modals }: RowActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const hasSelection = model.selection.hasSelection.value;\n const state = modals.state.value;\n if (state?.type !== 'row') {\n return null;\n }\n return (\n <DropdownMenu.Root modal={false} open={true} onOpenChange={modals.close}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n <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 { 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 { isReactiveObject, makeRef } from '@dxos/live-object';\nimport { PublicKey } from '@dxos/react-client';\nimport { formatForDisplay, formatForEditing, parseValue } from '@dxos/react-ui-form';\nimport {\n type DxGridAxisMeta,\n type DxGridPlaneRange,\n type DxGridPlanePosition,\n type DxGridPosition,\n} from '@dxos/react-ui-grid';\nimport { type ViewProjection } from '@dxos/schema';\n\nimport { SelectionModel } from './selection-model';\nimport { type TableType } from '../types';\nimport { touch } from '../util';\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\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 rows(): ReadonlySignal<T[]> {\n return this._sortedRows;\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 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?.target?.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?.target?.fields.find((field) => field.id === sort.fieldId);\n if (!field) {\n return this._rows.value;\n }\n\n const { props } = this._projection.getFieldProjection(field.id);\n\n const dataWithIndices = this._rows.value.map((item, index) => {\n const rawValue = getValue(item, field.path);\n let sortValue = rawValue;\n\n if (props.type.startsWith('boolean')) {\n sortValue = !!rawValue; // Coerce null/undefined/false to false for booleans\n } else if (rawValue != null) {\n if (props.format === FormatEnum.Ref && field.referencePath) {\n sortValue = getValue(rawValue, field.referencePath);\n } else {\n sortValue = formatForDisplay({ type: props.type, format: props.format, value: rawValue });\n }\n }\n\n return {\n item,\n index,\n value: sortValue,\n isEmpty: !props.type.startsWith('boolean') && (sortValue == null || sortValue === ''),\n };\n });\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?.target?.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 // 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?.target?.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?.target?.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.target, 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?.target?.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 // TODO(ZaymonFC): This get's called an additional time by the cell editor onBlur, but with the cell editors\n // plain string value. Maybe onBlur should be called with the actual value?\n if (isReactiveObject(value)) {\n setValue(this._rows.value[rowIdx], field.path, makeRef(value));\n }\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 * Updates a cell's value using a transform function.\n * @param {DxGridPlanePosition} position - The position of the cell to update.\n * @param {(value: any) => any} update - A function that takes the current value and returns the updated value.\n */\n public updateCellData({ col, row }: DxGridPlanePosition, update: (value: any) => any): void {\n const dataRow = this._displayToDataIndex.get(row) ?? row;\n const fields = this.table.view?.target?.fields ?? [];\n const field = fields[col];\n\n const value = getValue(this._rows.value[dataRow], field.path);\n const updatedValue = update(value);\n setValue(this._rows.value[dataRow], field.path, updatedValue);\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.target?.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 // Resize\n //\n\n public setColumnWidth(columnIndex: number, width: number): void {\n const fields = this.table.view?.target?.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 { 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\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\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 switch (mode) {\n case 'all': {\n this._selection.value = new Set(this._rows.value.map((row) => row.id));\n break;\n }\n case 'none': {\n this._selection.value = new Set();\n break;\n }\n }\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Explicitly marks signal dependencies for tracking within effects.\n * Returns the passed value to enable inline usage.\n */\nexport const touch = <T>(value: T) => value;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n AST,\n Format,\n FormatEnum,\n type JsonPath,\n type JsonProp,\n type EchoSchema,\n S,\n TypedObject,\n TypeEnum,\n} from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { PublicKey } from '@dxos/react-client';\nimport { create, makeRef, 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 = async ({\n space,\n table,\n initialRow = true,\n}: InitialiseTableProps): Promise<EchoSchema> => {\n log('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 active: S.optional(S.Boolean),\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] = await space.db.schemaRegistry.register([ContactSchema]);\n\n table.view = makeRef(\n createView({\n name: 'Test',\n typename: contactSchema.typename,\n jsonSchema: contactSchema.jsonSchema,\n fields: ['name', 'active', 'email', 'salary'],\n }),\n );\n\n const projection = new ViewProjection(contactSchema, table.view.target!);\n projection.setFieldProjection({\n field: {\n id: table.view.target!.fields.find((f) => f.path === 'salary')!.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\nexport type TableButton = 'columnSettings' | 'rowMenu' | 'newColumn' | 'referencedCell';\n\nexport const BUTTON_IDENTIFIERS: { [K in TableButton]: string } = {\n columnSettings: 'data-table-column-settings-button',\n newColumn: 'data-table-new-column-button',\n referencedCell: 'data-table-ref-cell-button',\n rowMenu: 'data-table-row-menu-button',\n} as const;\n\ntype ButtonData =\n | { type: 'columnSettings'; fieldId: string }\n | { type: 'newColumn'; disabled?: boolean }\n | { type: 'referencedCell'; schemaId: string; targetId: string }\n | { type: 'rowMenu'; rowIndex: number };\n\nconst createButton = ({\n attr,\n data,\n disabled = false,\n icon,\n testId,\n}: {\n attr: string;\n data: Record<string, string>;\n disabled?: boolean;\n icon: string;\n testId: string;\n}) => {\n const dataAttrs = Object.entries(data)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n\n return `<button ${attr} data-testid=\"${testId}\" class=\"ch-button is-6 pli-0.5 min-bs-0 absolute inset-block-1 inline-end-2\" ${dataAttrs} ${disabled ? 'disabled' : ''}><svg><use href=\"/icons.svg#${icon}\"/></svg></button>`;\n};\n\nconst addColumnButton = {\n attr: BUTTON_IDENTIFIERS.newColumn,\n icon: 'ph--plus--regular',\n render: ({ disabled }: Omit<Extract<ButtonData, { type: 'newColumn' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.newColumn,\n icon: addColumnButton.icon,\n disabled,\n data: {},\n testId: 'table-new-column-button',\n });\n },\n getData: (_el: HTMLElement): Extract<ButtonData, { type: 'newColumn' }> => ({ type: 'newColumn' }),\n} as const;\n\nconst columnSettingsButton = {\n attr: BUTTON_IDENTIFIERS.columnSettings,\n icon: 'ph--caret-down--regular',\n render: ({ fieldId }: Omit<Extract<ButtonData, { type: 'columnSettings' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.columnSettings,\n icon: columnSettingsButton.icon,\n data: {\n 'data-field-id': fieldId,\n },\n testId: 'table-column-settings-button',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'columnSettings' }> => ({\n type: 'columnSettings',\n fieldId: el.getAttribute('data-field-id')!,\n }),\n} as const;\n\nconst referencedCellButton = {\n attr: BUTTON_IDENTIFIERS.referencedCell,\n icon: 'ph--link-simple-horizontal--regular',\n render: ({ targetId, schemaId }: Omit<Extract<ButtonData, { type: 'referencedCell' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.referencedCell,\n icon: referencedCellButton.icon,\n data: {\n 'data-target-id': targetId,\n 'data-schema-id': schemaId,\n },\n testId: 'table-ref-cell-button',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'referencedCell' }> => ({\n type: 'referencedCell',\n targetId: el.getAttribute('data-target-id')!,\n schemaId: el.getAttribute('data-schema-id')!,\n }),\n} as const;\n\nconst rowMenuButton = {\n attr: BUTTON_IDENTIFIERS.rowMenu,\n icon: 'ph--dots-three--regular',\n render: ({ rowIndex }: Omit<Extract<ButtonData, { type: 'rowMenu' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.rowMenu,\n icon: rowMenuButton.icon,\n data: {\n 'data-row-index': rowIndex.toString(),\n },\n testId: 'table-row-menu-button',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'rowMenu' }> => ({\n type: 'rowMenu',\n rowIndex: Number(el.getAttribute('data-row-index')!),\n }),\n} as const;\n\nexport const tableButtons = {\n addColumn: addColumnButton,\n columnSettings: columnSettingsButton,\n referencedCell: referencedCellButton,\n rowMenu: rowMenuButton,\n} as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// Core types.\nexport type TableControl = 'checkbox' | 'switch';\n\nexport type ControlData =\n | { type: 'checkbox'; rowIndex: number; header?: boolean }\n | { type: 'switch'; colIndex: number; rowIndex: number };\n\ntype CommonRenderProps = {\n checked?: boolean;\n disabled?: boolean;\n};\n\nexport type RenderCheckboxProps = CommonRenderProps & Omit<Extract<ControlData, { type: 'checkbox' }>, 'type'>;\nexport type RenderSwitchProps = CommonRenderProps & Omit<Extract<ControlData, { type: 'switch' }>, 'type'>;\n\nexport const CONTROL_IDENTIFIERS = {\n checkbox: 'data-table-checkbox',\n switch: 'data-table-switch',\n} as const;\n\nconst BASE_CLASSES = {\n checkbox: 'absolute inset-block-[.375rem] inline-end-[.375rem] ch-checkbox',\n switch: 'absolute inset-block-[.25rem] inline-end-[.25rem] ch-checkbox--switch',\n} as const;\n\nconst renderAttributes = (data: Record<string, string>) => {\n return Object.entries(data)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n};\n\nconst renderInput = (\n baseClass: string,\n attrs: Record<string, string>,\n checked = false,\n disabled = false,\n preventToggle = false,\n testId: string,\n) => {\n return `<input type=\"checkbox\" class=\"${baseClass}\" ${renderAttributes(attrs)} ${checked ? 'checked' : ''} ${preventToggle ? 'onclick=\"return false\"' : ''} ${disabled ? 'disabled' : ''} data-testid=\"${testId}\"/>`;\n};\n\nexport const renderCheckbox = ({\n rowIndex,\n header = false,\n checked = false,\n disabled = false,\n}: RenderCheckboxProps): string => {\n const attrs = {\n [CONTROL_IDENTIFIERS.checkbox]: '',\n 'data-row-index': rowIndex.toString(),\n ...(header && { 'data-header': '' }),\n };\n\n return renderInput(BASE_CLASSES.checkbox, attrs, checked, disabled, true, 'table-selection');\n};\n\nexport const renderSwitch = ({ colIndex, rowIndex, checked = false, disabled = false }: RenderSwitchProps): string => {\n const attrs = {\n [CONTROL_IDENTIFIERS.switch]: '',\n 'data-row-index': rowIndex.toString(),\n 'data-col-index': colIndex.toString(),\n };\n\n return renderInput(BASE_CLASSES.switch, attrs, checked, disabled, true, 'table-switch');\n};\n\nexport const tableControls = {\n checkbox: {\n attr: CONTROL_IDENTIFIERS.checkbox,\n render: renderCheckbox,\n getData: (el: HTMLElement): Extract<ControlData, { type: 'checkbox' }> => ({\n type: 'checkbox',\n rowIndex: Number(el.getAttribute('data-row-index')),\n header: el.hasAttribute('data-header'),\n }),\n },\n switch: {\n attr: CONTROL_IDENTIFIERS.switch,\n render: renderSwitch,\n getData: (el: HTMLElement): Extract<ControlData, { type: 'switch' }> => ({\n type: 'switch',\n rowIndex: Number(el.getAttribute('data-row-index')),\n colIndex: Number(el.getAttribute('data-col-index')),\n }),\n },\n} as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { signal } from '@preact/signals-core';\nimport { type RefObject, type MutableRefObject } from 'react';\n\nimport { type ReactiveObject } from '@dxos/live-object';\nimport { log } from '@dxos/log';\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 setTrigger = (trigger: HTMLElement) => {\n this._triggerRef.current = trigger;\n };\n\n public showRowMenu = (rowIndex: number) => {\n this._state.value = { type: 'row', rowIndex };\n };\n\n public showColumnMenu = (fieldId: string) => {\n this._state.value = { type: 'column', fieldId };\n };\n\n public showColumnCreator = () => {\n this._state.value = { type: 'columnSettings', mode: { type: 'create' } };\n };\n\n public showReferencePanel = (targetId: string, schemaId: string) => {\n this._state.value = { type: 'refPanel', targetId, typename: schemaId };\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\nimport { signal } from '@preact/signals-core';\n\nimport { FormatEnum, getValue } from '@dxos/echo-schema';\nimport { cellClassesForFieldType, cellClassesForRowSelection, formatForDisplay } from '@dxos/react-ui-form';\nimport {\n type DxGridPlane,\n type DxGridPlaneCells,\n toPlaneCellIndex,\n type DxGridPlaneRange,\n type DxGridCellValue,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\nimport { VIEW_FIELD_LIMIT, type FieldType } from '@dxos/schema';\n\nimport { type BaseTableRow, type TableModel } from './table-model';\nimport { tableButtons, tableControls } from '../util';\n\n/**\n * Presentation layer for a table component, handling cell rendering and grid display logic.\n * Manages rendering of table cells, headers, selection columns, and action columns across\n * different grid planes.\n */\nexport class TablePresentation<T extends BaseTableRow = { id: string }> {\n constructor(\n private readonly model: TableModel<T>,\n private readonly _visibleRange = signal<DxGridPlaneRange>({\n start: { row: 0, col: 0 },\n end: { row: 0, col: 0 },\n }),\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 case 'frozenRowsStart':\n return this.getHeaderCells(range);\n case 'frozenColsStart':\n return this.getSelectionColumnCells(range);\n case 'frozenColsEnd':\n return this.getActionColumnCells(range);\n case 'fixedStartStart':\n return this.getSelectAllCell();\n case 'fixedStartEnd':\n return this.getNewColumnCell();\n default:\n return {};\n }\n }\n\n private getMainGridCells(range: DxGridPlaneRange): DxGridPlaneCells {\n const cells: DxGridPlaneCells = {};\n const fields = this.model.table.view?.target?.fields ?? [];\n\n const addCell = (obj: T, field: FieldType, colIndex: number, displayIndex: number): void => {\n const { props } = this.model.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.Boolean: {\n return '';\n }\n case FormatEnum.Ref: {\n if (!field.referencePath) {\n return ''; // TODO(burdon): Show error.\n }\n\n return getValue(value.target, 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.model.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 (props.format === FormatEnum.Ref && props.referenceSchema) {\n const targetObj = getValue(obj, field.path)?.target;\n if (targetObj) {\n cell.accessoryHtml = tableButtons.referencedCell.render({\n targetId: targetObj.id as any as string,\n schemaId: props.referenceSchema,\n });\n }\n }\n\n if (props.format === FormatEnum.Boolean) {\n const value = getValue(obj, field.path);\n cell.accessoryHtml = tableControls.switch.render({\n colIndex,\n rowIndex: displayIndex,\n checked: value ?? false,\n });\n cell.readonly = true;\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.model.getRowCount(); 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.model.rows.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.model.table.view?.target?.fields ?? [];\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n const { field, props } = this.model.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.model.getRowCount(); row++) {\n const isSelected = this.model.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.model.getRowCount(); row++) {\n const isSelected = this.model.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.model.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.model.table.view?.target?.fields?.length ?? 0) >= VIEW_FIELD_LIMIT,\n }),\n readonly: true,\n },\n };\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, type ModalController } 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 modals?: ModalController;\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 modals,\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 && modals) {\n if (isCreateOption(data)) {\n const { field, props } = fieldProjection;\n if (props.referenceSchema) {\n suppressNextBlur.current = true;\n modals.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, modals, 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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["import_react", "import_react_ui", "import_echo", "import_echo_schema", "import_react_ui_form", "import_react_ui_grid", "import_invariant", "import_signals_core", "import_context", "import_react_client", "
|
|
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/model/table-model.ts", "../../../src/model/selection-model.ts", "../../../src/util/signals.ts", "../../../src/util/table.ts", "../../../src/util/table-buttons.ts", "../../../src/util/table-controls.ts", "../../../src/model/table-sorting.ts", "../../../src/model/modal-controller.ts", "../../../src/model/table-presentation.ts", "../../../src/components/TableCellEditor/TableCellEditor.tsx", "../../../src/components/TableCellEditor/extension.ts", "../../../src/components/TableToolbar/TableToolbar.tsx", "../../../src/hooks/useTableModel.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 label': '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 'save view label': 'Save changes to view',\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 type MouseEvent,\n useMemo,\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 { ModalController, type TableModel, type TablePresentation } from '../../model';\nimport { translationKey } from '../../translations';\nimport { tableButtons, tableControls } from '../../util';\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 presentation?: TablePresentation;\n ignoreAttention?: boolean;\n};\n\nconst TableMain = forwardRef<TableController, TableMainProps>(\n ({ model, presentation, 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 const modals = useMemo(() => new ModalController(), []);\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 (!presentation || !dxGrid) {\n return {};\n }\n\n dxGrid.getCells = (range, plane) => presentation.getCells(range, plane);\n return {\n update: (cell) => {\n if (cell) {\n dxGrid.updateIfWithinBounds(cell);\n } else {\n dxGrid.updateCells(true);\n dxGrid.requestUpdate();\n }\n },\n };\n },\n [presentation, dxGrid],\n );\n\n const handleGridClick = useCallback(\n (event: MouseEvent) => {\n if (!modals) {\n return;\n }\n\n const buttonSelector = Object.values(tableButtons)\n .map((button) => `button[${button.attr}]`)\n .join(',');\n\n const tableButtonElement = (event.target as HTMLElement).closest(buttonSelector) as HTMLElement;\n if (tableButtonElement) {\n const button = Object.values(tableButtons).find((btn) => tableButtonElement.hasAttribute(btn.attr));\n if (!button) {\n return;\n }\n\n modals.setTrigger(tableButtonElement);\n const data = button.getData(tableButtonElement);\n switch (data.type) {\n case 'rowMenu': {\n modals.showRowMenu(data.rowIndex);\n break;\n }\n case 'columnSettings': {\n modals.showColumnMenu(data.fieldId);\n break;\n }\n case 'newColumn': {\n modals.showColumnCreator();\n break;\n }\n case 'referencedCell': {\n modals.showReferencePanel(data.targetId, data.schemaId);\n break;\n }\n case 'sort': {\n model?.sorting?.toggleSort(data.fieldId);\n break;\n }\n }\n return;\n }\n\n const controlSelector = Object.values(tableControls)\n .map((control) => `input[${control.attr}]`)\n .join(',');\n\n const controlElement = (event.target as HTMLElement).closest(controlSelector) as HTMLElement;\n if (controlElement) {\n const control = Object.values(tableControls).find((ctrl) => controlElement.hasAttribute(ctrl.attr));\n if (!control) {\n return;\n }\n\n const data = control.getData(controlElement);\n switch (data.type) {\n case 'checkbox': {\n if (data.header) {\n model?.selection.setSelection(model.selection.allRowsSeleted.value ? 'none' : 'all');\n } else {\n model?.selection.toggleSelectionForRowIndex(data.rowIndex);\n }\n break;\n }\n case 'switch': {\n if (model) {\n model.updateCellData({ row: data.rowIndex, col: data.colIndex }, (value) => !value);\n }\n break;\n }\n }\n }\n },\n [model, modals],\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 || !modals) {\n return <span role='none' className='attention-surface' />;\n }\n\n return (\n <Grid.Root id={model.table.id ?? 'table-grid'}>\n <TableCellEditor\n model={model}\n modals={modals}\n onEnter={handleEnter}\n onFocus={handleFocus}\n 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?.target?.fields?.length ?? 0}\n onAxisResize={handleAxisResize}\n onClick={handleGridClick}\n onKeyDown={handleKeyDown}\n overscroll='trap'\n ref={setDxGrid}\n />\n <RowActionsMenu model={model} modals={modals} />\n <ColumnActionsMenu model={model} modals={modals} />\n <ColumnSettings model={model} modals={modals} onNewColumn={handleNewColumn} />\n <RefPanel model={model} modals={modals} />\n <CreateRefPanel model={model} modals={modals} />\n </Grid.Root>\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, type ModalController } from '../../model';\nimport { translationKey } from '../../translations';\n\ntype ColumnActionsMenuProps = { model: TableModel; modals: ModalController };\n\nexport const ColumnActionsMenu = ({ model, modals }: ColumnActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const state = modals.state.value;\n if (state?.type !== 'column') {\n return null;\n }\n\n const currentSort = model.sorting?.sorting;\n const isCurrentColumnSorted = currentSort?.fieldId === state.fieldId;\n\n return (\n <DropdownMenu.Root modal={false} open={true} onOpenChange={modals.close}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Portal>\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n {(!isCurrentColumnSorted || currentSort?.direction === 'asc') && (\n <DropdownMenu.Item\n data-testid='column-sort-descending'\n onClick={() => model.sorting?.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.sorting?.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.sorting?.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={() => modals.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, type ModalController } from '../../model';\n\ntype ColumnSettingsProps = { model?: TableModel; modals: ModalController; onNewColumn: () => void };\n\nexport const ColumnSettings = ({ model, modals, onNewColumn }: ColumnSettingsProps) => {\n const [newField, setNewField] = useState<FieldType>();\n const state = modals.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?.target?.fields.find((f) => f.id === mode.fieldId);\n }\n }\n return undefined;\n }, [model?.table?.view?.target?.fields, state]);\n\n const field = existingField ?? newField;\n\n const handleSave = useCallback(() => {\n modals.close();\n }, [modals]);\n\n const handleCancel = useCallback(() => {\n if (state?.type === 'columnSettings' && state.mode.type === 'create' && newField) {\n model?.projection?.deleteFieldProjection(newField.id);\n }\n }, [model?.projection, state, newField]);\n\n if (!model?.table?.view?.target || !model.projection || !field) {\n return null;\n }\n\n return (\n <DropdownMenu.Root modal={false} open={state?.type === 'columnSettings'}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Portal>\n <DropdownMenu.Content classNames='md:is-64'>\n <DropdownMenu.Viewport>\n <FieldEditor\n view={model.table.view.target!}\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, type ModalController } from '../../model';\n\nexport type CreateRefPanelProps = { model?: TableModel; modals: ModalController };\n\n// TODO(burdon): Factor out Space dependency (to plugin?)\nexport const CreateRefPanel = ({ model, modals, __gridScope }: GridScopedProps<CreateRefPanelProps>) => {\n const { id: gridId } = useGridContext('TableCellEditor', __gridScope);\n const space = getSpace(model?.table);\n const state = modals.state.value;\n\n const schema = useMemo<S.Schema<any> | undefined>(() => {\n if (!space || state?.type !== 'createRefPanel') {\n return;\n }\n\n const [schema] = space.db.schemaRegistry.query({ typename: state.typename }).runSync();\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] = space.db.schemaRegistry.query({ typename: state.typename }).runSync();\n if (schema) {\n const obj = space.db.add(create(schema, values));\n state.onCreate?.(obj);\n }\n void modals.close();\n },\n [modals, space, state],\n );\n\n const handleCancel = useCallback(() => {\n if (model) {\n modals.close();\n }\n }, [modals]);\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 modals.close();\n }\n }}\n >\n <Popover.VirtualTrigger virtualRef={modals.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, type ModalController } from '../../model';\n\ntype RefPanelProps = { model: TableModel; modals: ModalController };\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, modals }: RefPanelProps) => {\n const state = modals.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 (!nextOpen) {\n return modals.close();\n }\n }}\n >\n <Popover.VirtualTrigger virtualRef={modals.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, type ModalController } from '../../model';\nimport { translationKey } from '../../translations';\n\ntype RowActionsMenuProps = { model: TableModel; modals: ModalController };\n\nexport const RowActionsMenu = ({ model, modals }: RowActionsMenuProps) => {\n const { t } = useTranslation(translationKey);\n const hasSelection = model.selection.hasSelection.value;\n const state = modals.state.value;\n if (state?.type !== 'row') {\n return null;\n }\n return (\n <DropdownMenu.Root modal={false} open={true} onOpenChange={modals.close}>\n <DropdownMenu.VirtualTrigger virtualRef={modals.trigger} />\n <DropdownMenu.Content>\n <DropdownMenu.Viewport>\n <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 { computed, effect, signal, type ReadonlySignal } from '@preact/signals-core';\n\nimport { Resource } from '@dxos/context';\nimport { type FieldSortType, FormatEnum, getValue, setValue, type JsonProp } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { isReactiveObject, makeRef } from '@dxos/live-object';\nimport { PublicKey } from '@dxos/react-client';\nimport { formatForEditing, parseValue } from '@dxos/react-ui-form';\nimport {\n type DxGridAxisMeta,\n type DxGridPlaneRange,\n type DxGridPlanePosition,\n type DxGridPosition,\n} from '@dxos/react-ui-grid';\nimport { type ViewProjection } from '@dxos/schema';\n\nimport { SelectionModel } from './selection-model';\nimport { TableSorting } from './table-sorting';\nimport { type TableType } from '../types';\nimport { touch } from '../util';\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?: FieldSortType[];\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 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 _rows = signal<T[]>([]);\n private readonly _sorting: TableSorting<T>;\n\n private _pinnedRows: NonNullable<TableModelProps<T>['pinnedRows']>;\n private _selection!: SelectionModel<T>;\n private _columnMeta?: ReadonlySignal<DxGridAxisMeta>;\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 this._sorting = new TableSorting(this._rows, table.view?.target, projection);\n\n if (sorting.length > 0) {\n const [sort] = sorting;\n this._sorting.setSort(sort.fieldId, sort.direction);\n }\n\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 rows(): ReadonlySignal<T[]> {\n return this._sorting.sortedRows;\n }\n\n /**\n * @reactive\n */\n public get sorting(): TableSorting<T> | undefined {\n return this._sorting;\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 selection() {\n return this._selection;\n }\n\n /** @reactive */\n public get isViewDirty(): boolean {\n return this._sorting.isDirty;\n }\n\n //\n // Initialisation\n //\n\n protected override async _open() {\n this.initializeColumnMeta();\n this.initializeEffects();\n this._selection = new SelectionModel(this._sorting.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?.target?.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 initializeEffects(): void {\n const rowOrderWatcher = effect(() => {\n touch(this._sorting.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._sorting.sortedRows.value[row];\n this?._table?.view?.target?.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 // 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?.target?.fields.length ?? 0;\n\n public insertRow = (rowIndex?: number): void => {\n const row = rowIndex !== undefined ? this._sorting.getDataIndex(rowIndex) : this._rows.value.length;\n this._onInsertRow?.(row);\n };\n\n public deleteRow = (rowIndex: number): void => {\n const row = this._sorting.getDataIndex(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?.target?.fields ?? [];\n if (col < 0 || col >= fields.length) {\n return undefined;\n }\n\n const field = fields[col];\n const dataIndex = this._sorting.getDataIndex(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.target, 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._sorting.getDataIndex(row);\n const fields = this.table.view?.target?.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 // TODO(ZaymonFC): This get's called an additional time by the cell editor onBlur, but with the cell editors\n // plain string value. Maybe onBlur should be called with the actual value?\n if (isReactiveObject(value)) {\n setValue(this._rows.value[rowIdx], field.path, makeRef(value));\n }\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 * Updates a cell's value using a transform function.\n * @param {DxGridPlanePosition} position - The position of the cell to update.\n * @param {(value: any) => any} update - A function that takes the current value and returns the updated value.\n */\n public updateCellData({ col, row }: DxGridPlanePosition, update: (value: any) => any): void {\n const dataRow = this._sorting.getDataIndex(row);\n const fields = this.table.view?.target?.fields ?? [];\n const field = fields[col];\n\n const value = getValue(this._rows.value[dataRow], field.path);\n const updatedValue = update(value);\n setValue(this._rows.value[dataRow], field.path, updatedValue);\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.target?.fields.find((field) => field.id === fieldId);\n if (field && this._onDeleteColumn) {\n this._onDeleteColumn(field.id);\n }\n }\n\n //\n // Resize\n //\n\n public setColumnWidth(columnIndex: number, width: number): void {\n const fields = this.table.view?.target?.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 // 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 // View operations\n //\n public saveView(): void {\n this._sorting.save();\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\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\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 switch (mode) {\n case 'all': {\n this._selection.value = new Set(this._rows.value.map((row) => row.id));\n break;\n }\n case 'none': {\n this._selection.value = new Set();\n break;\n }\n }\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n/**\n * Explicitly marks signal dependencies for tracking within effects.\n * Returns the passed value to enable inline usage.\n */\nexport const touch = <T>(value: T) => value;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport {\n AST,\n Format,\n FormatEnum,\n type JsonPath,\n type JsonProp,\n type EchoSchema,\n S,\n TypedObject,\n TypeEnum,\n} from '@dxos/echo-schema';\nimport { PublicKey } from '@dxos/react-client';\nimport { create, makeRef, type Space } from '@dxos/react-client/echo';\nimport { createFieldId, createView, getSchemaProperties, ViewProjection } from '@dxos/schema';\n\nimport { type TableType } from '../types';\n\ntype InitialiseTableProps = {\n space: Space;\n table: TableType;\n initialRow?: boolean;\n initialSchema?: string;\n};\n\n// TODO(ZaymonFC): Clean up the branching in this file.\n\n// TODO(burdon): Pass in type.\n// TODO(burdon): User should determine typename.\nexport const initializeTable = async ({\n space,\n table,\n initialRow = true,\n initialSchema,\n}: InitialiseTableProps): Promise<EchoSchema> => {\n if (initialSchema) {\n const schema = await space.db.schemaRegistry.query({ typename: initialSchema }).firstOrUndefined();\n\n if (!schema) {\n throw new Error(`Schema not found: ${initialSchema}`);\n }\n\n // We need to get the schema properties here. For now, only simple types and refs, not compound types\n // are going to be supported.\n const fields = getSchemaProperties(schema.ast)\n .filter((prop) => prop.type !== 'object' || prop.format === FormatEnum.Ref)\n .map((prop) => prop.name);\n\n table.view = makeRef(\n createView({\n // TODO(ZaymonFC): Don't hardcode name?\n name: 'View',\n typename: schema.typename,\n jsonSchema: schema.jsonSchema,\n fields,\n }),\n );\n\n return schema;\n } else {\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 active: S.optional(S.Boolean),\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] = await space.db.schemaRegistry.register([ContactSchema]);\n\n table.view = makeRef(\n createView({\n name: 'View',\n typename: contactSchema.typename,\n jsonSchema: contactSchema.jsonSchema,\n fields: ['name', 'active', 'email', 'salary'],\n }),\n );\n\n const projection = new ViewProjection(contactSchema, table.view.target!);\n projection.setFieldProjection({\n field: {\n id: table.view.target!.fields.find((f) => f.path === 'salary')!.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 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", "//\n// Copyright 2024 DXOS.org\n//\n\nexport type TableButton = 'columnSettings' | 'rowMenu' | 'newColumn' | 'referencedCell' | 'sort';\n\nexport const BUTTON_IDENTIFIERS: { [K in TableButton]: string } = {\n columnSettings: 'data-table-column-settings-button',\n newColumn: 'data-table-new-column-button',\n referencedCell: 'data-table-ref-cell-button',\n rowMenu: 'data-table-row-menu-button',\n sort: 'data-table-sort-button',\n} as const;\n\ntype ButtonData =\n | { type: 'columnSettings'; fieldId: string }\n | { type: 'newColumn'; disabled?: boolean }\n | { type: 'referencedCell'; schemaId: string; targetId: string }\n | { type: 'rowMenu'; rowIndex: number }\n | { type: 'sort'; fieldId: string; direction?: 'asc' | 'desc' };\n\nconst createButton = ({\n attr,\n data,\n disabled = false,\n icon,\n testId,\n type = 'primary',\n}: {\n attr: string;\n data: Record<string, string>;\n disabled?: boolean;\n icon: string;\n testId: string;\n type?: 'primary' | 'secondary';\n}) => {\n const dataAttrs = Object.entries(data)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n\n const positionClass = type === 'primary' ? 'inline-end-2' : 'inline-end-9';\n return `<button ${attr} data-testid=\"${testId}\" class=\"dx-button is-6 pli-0.5 min-bs-0 absolute inset-block-1 ${positionClass}\" ${dataAttrs} ${disabled ? 'disabled' : ''}><svg><use href=\"/icons.svg#${icon}\"/></svg></button>`;\n};\n\nconst addColumnButton = {\n attr: BUTTON_IDENTIFIERS.newColumn,\n icon: 'ph--plus--regular',\n render: ({ disabled }: Omit<Extract<ButtonData, { type: 'newColumn' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.newColumn,\n icon: addColumnButton.icon,\n disabled,\n data: {},\n testId: 'table-new-column-button',\n });\n },\n getData: (_el: HTMLElement): Extract<ButtonData, { type: 'newColumn' }> => ({ type: 'newColumn' }),\n} as const;\n\nconst columnSettingsButton = {\n attr: BUTTON_IDENTIFIERS.columnSettings,\n icon: 'ph--caret-down--regular',\n render: ({ fieldId }: Omit<Extract<ButtonData, { type: 'columnSettings' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.columnSettings,\n icon: columnSettingsButton.icon,\n data: {\n 'data-field-id': fieldId,\n },\n testId: 'table-column-settings-button',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'columnSettings' }> => ({\n type: 'columnSettings',\n fieldId: el.getAttribute('data-field-id')!,\n }),\n} as const;\n\nconst referencedCellButton = {\n attr: BUTTON_IDENTIFIERS.referencedCell,\n icon: 'ph--link-simple-horizontal--regular',\n render: ({ targetId, schemaId }: Omit<Extract<ButtonData, { type: 'referencedCell' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.referencedCell,\n icon: referencedCellButton.icon,\n data: {\n 'data-target-id': targetId,\n 'data-schema-id': schemaId,\n },\n testId: 'table-ref-cell-button',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'referencedCell' }> => ({\n type: 'referencedCell',\n targetId: el.getAttribute('data-target-id')!,\n schemaId: el.getAttribute('data-schema-id')!,\n }),\n} as const;\n\nconst rowMenuButton = {\n attr: BUTTON_IDENTIFIERS.rowMenu,\n icon: 'ph--dots-three--regular',\n render: ({ rowIndex }: Omit<Extract<ButtonData, { type: 'rowMenu' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.rowMenu,\n icon: rowMenuButton.icon,\n data: {\n 'data-row-index': rowIndex.toString(),\n },\n testId: 'table-row-menu-button',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'rowMenu' }> => ({\n type: 'rowMenu',\n rowIndex: Number(el.getAttribute('data-row-index')!),\n }),\n} as const;\n\nconst sortButton = {\n attr: BUTTON_IDENTIFIERS.sort,\n icon: 'ph--sort-ascending--regular',\n render: ({ fieldId, direction }: Omit<Extract<ButtonData, { type: 'sort' }>, 'type'>) => {\n return createButton({\n attr: BUTTON_IDENTIFIERS.sort,\n icon: direction === 'desc' ? 'ph--sort-descending--regular' : 'ph--sort-ascending--regular',\n data: {\n 'data-field-id': fieldId,\n 'data-direction': direction ?? '',\n },\n testId: 'table-sort-button',\n // TODO(ZaymonFC): All buttons should be rendered into an absolutely positioned flex container.\n // This is a bit hacky.\n type: 'secondary',\n });\n },\n getData: (el: HTMLElement): Extract<ButtonData, { type: 'sort' }> => ({\n type: 'sort',\n fieldId: el.getAttribute('data-field-id')!,\n direction: el.getAttribute('data-direction') as 'asc' | 'desc' | undefined,\n }),\n} as const;\n\nexport const tableButtons = {\n addColumn: addColumnButton,\n columnSettings: columnSettingsButton,\n referencedCell: referencedCellButton,\n rowMenu: rowMenuButton,\n sort: sortButton,\n} as const;\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// Core types.\nexport type TableControl = 'checkbox' | 'switch';\n\nexport type ControlData =\n | { type: 'checkbox'; rowIndex: number; header?: boolean }\n | { type: 'switch'; colIndex: number; rowIndex: number };\n\ntype CommonRenderProps = {\n checked?: boolean;\n disabled?: boolean;\n};\n\nexport type RenderCheckboxProps = CommonRenderProps & Omit<Extract<ControlData, { type: 'checkbox' }>, 'type'>;\nexport type RenderSwitchProps = CommonRenderProps & Omit<Extract<ControlData, { type: 'switch' }>, 'type'>;\n\nexport const CONTROL_IDENTIFIERS = {\n checkbox: 'data-table-checkbox',\n switch: 'data-table-switch',\n} as const;\n\nconst BASE_CLASSES = {\n checkbox: 'absolute inset-block-[.375rem] inline-end-[.375rem] dx-checkbox',\n switch: 'absolute inset-block-[.25rem] inline-end-[.25rem] dx-checkbox--switch',\n} as const;\n\nconst renderAttributes = (data: Record<string, string>) => {\n return Object.entries(data)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ');\n};\n\nconst renderInput = (\n baseClass: string,\n attrs: Record<string, string>,\n checked = false,\n disabled = false,\n preventToggle = false,\n testId: string,\n) => {\n return `<input type=\"checkbox\" class=\"${baseClass}\" ${renderAttributes(attrs)} ${checked ? 'checked' : ''} ${preventToggle ? 'onclick=\"return false\"' : ''} ${disabled ? 'disabled' : ''} data-testid=\"${testId}\"/>`;\n};\n\nexport const renderCheckbox = ({\n rowIndex,\n header = false,\n checked = false,\n disabled = false,\n}: RenderCheckboxProps): string => {\n const attrs = {\n [CONTROL_IDENTIFIERS.checkbox]: '',\n 'data-row-index': rowIndex.toString(),\n ...(header && { 'data-header': '' }),\n };\n\n return renderInput(BASE_CLASSES.checkbox, attrs, checked, disabled, true, 'table-selection');\n};\n\nexport const renderSwitch = ({ colIndex, rowIndex, checked = false, disabled = false }: RenderSwitchProps): string => {\n const attrs = {\n [CONTROL_IDENTIFIERS.switch]: '',\n 'data-row-index': rowIndex.toString(),\n 'data-col-index': colIndex.toString(),\n };\n\n return renderInput(BASE_CLASSES.switch, attrs, checked, disabled, true, 'table-switch');\n};\n\nexport const tableControls = {\n checkbox: {\n attr: CONTROL_IDENTIFIERS.checkbox,\n render: renderCheckbox,\n getData: (el: HTMLElement): Extract<ControlData, { type: 'checkbox' }> => ({\n type: 'checkbox',\n rowIndex: Number(el.getAttribute('data-row-index')),\n header: el.hasAttribute('data-header'),\n }),\n },\n switch: {\n attr: CONTROL_IDENTIFIERS.switch,\n render: renderSwitch,\n getData: (el: HTMLElement): Extract<ControlData, { type: 'switch' }> => ({\n type: 'switch',\n rowIndex: Number(el.getAttribute('data-row-index')),\n colIndex: Number(el.getAttribute('data-col-index')),\n }),\n },\n} as const;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { computed, signal, type Signal, type ReadonlySignal } from '@preact/signals-core';\nimport orderBy from 'lodash.orderby';\n\nimport { getValue, FormatEnum, TypeEnum, type SortDirectionType, type FieldSortType } from '@dxos/echo-schema';\nimport { formatForDisplay } from '@dxos/react-ui-form';\nimport type { PropertyType, FieldType, ViewProjection, ViewType } from '@dxos/schema';\n\nimport { type BaseTableRow } from './table-model';\n\n/**\n * Represents the local sort state.\n * - undefined: No local sort set, fallback to view sort.\n * - cleared: Sort explicitly cleared by user.\n * - active: Active local sort with sort configuration.\n */\ntype LocalSort = { type: 'cleared' } | { type: 'active'; sort: FieldSortType } | undefined;\n\n/**\n * Manages table sorting functionality through display and data index mapping.\n *\n * When a table is sorted, rows visually reorder but we need to maintain references\n * to the original data positions. This is handled through two types of indices:\n *\n * - Display indices: The visual positions after sorting\n * - Data indices: The original positions in the source data\n *\n * The _displayToDataIndex map maintains these relationships, enabling lookups\n * between visual and source positions.\n *\n * Example mapping between display and data indices:\n *\n * Original Data: Sorted Display: Mapping: (Display → Data)\n * ┌──────────────┐ ┌──────────────┐ ┌────────┐\n * │ 0: \"Banana\" │ => │ 0: \"Apple\" │ => │ 0 => 1 │\n * │ 1: \"Apple\" │ => │ 1: \"Banana\" │ => │ 1 => 0 │\n * │ 2: \"Cherry\" │ => │ 2: \"Cherry\" │ => │ 2 => 2 │\n * └──────────────┘ └──────────────┘ └────────┘\n */\nexport class TableSorting<T extends BaseTableRow> {\n private readonly _displayToDataIndex = new Map<number, number>();\n private readonly _rows: Signal<T[]>;\n private readonly _localSort = signal<LocalSort>(undefined);\n private readonly _isDirty: ReadonlySignal<boolean>;\n public readonly sortedRows: ReadonlySignal<T[]>;\n\n constructor(\n rows: Signal<T[]>,\n private readonly _view: ViewType | undefined,\n private readonly _projection: ViewProjection,\n ) {\n this._rows = rows;\n this._isDirty = computed(() => {\n const local = this._localSort.value;\n const viewSort = this._view?.query.sort?.[0];\n if (local?.type === 'cleared') {\n return viewSort !== undefined;\n }\n if (local?.type === 'active') {\n if (!viewSort) {\n return true;\n }\n return local.sort.fieldId !== viewSort.fieldId || local.sort.direction !== viewSort.direction;\n }\n return false;\n });\n this.sortedRows = this.initialiseSortedRows();\n }\n\n /**\n * @reactive\n * @returns Local sort if present, falls back to view sort.\n */\n public get sorting(): FieldSortType | undefined {\n const local = this._localSort.value;\n if (local?.type === 'cleared') {\n return undefined;\n }\n if (local?.type === 'active') {\n return local.sort;\n }\n return this._view?.query.sort?.[0];\n }\n\n /**\n * @reactive\n * @returns Whether local sort differs from view sort.\n */\n public get isDirty(): boolean {\n return this._isDirty.value;\n }\n\n public getDataIndex(displayIndex: number): number {\n return this._displayToDataIndex.get(displayIndex) ?? displayIndex;\n }\n\n public setSort(fieldId: string, direction: SortDirectionType): void {\n this._localSort.value = {\n type: 'active',\n sort: { fieldId, direction },\n };\n }\n\n public toggleSort(fieldId: string): void {\n if (!this._view || !this.sorting || this.sorting.fieldId !== fieldId) {\n return;\n }\n\n switch (this.sorting.direction) {\n case 'asc': {\n this.setSort(fieldId, 'desc');\n break;\n }\n case 'desc': {\n this.setSort(fieldId, 'asc');\n break;\n }\n }\n }\n\n public clearSort(): void {\n this._localSort.value = { type: 'cleared' };\n }\n\n public save(): void {\n if (this._view && this._localSort.value !== undefined) {\n if (this._localSort.value.type === 'active') {\n this._view.query.sort = [this._localSort.value.sort];\n } else {\n this._view.query.sort = [];\n }\n this._localSort.value = undefined;\n }\n }\n\n //\n // Initialisation.\n //\n\n private initialiseSortedRows(): ReadonlySignal<T[]> {\n return computed(() => {\n this._displayToDataIndex.clear();\n const sort = this.sorting;\n if (!sort || !this._view) {\n return this._rows.value;\n }\n\n const field = this._view.fields.find((f) => f.id === sort.fieldId);\n if (!field) {\n return this._rows.value;\n }\n\n const { props } = this._projection.getFieldProjection(field.id);\n\n const dataWithIndices = this._rows.value.map((item, index) => {\n const sortValue = this.getSortValue(props, field, item);\n const isEmpty = !(props.type === TypeEnum.Boolean) && (sortValue == null || sortValue === '');\n\n return { item, index, value: sortValue, isEmpty };\n });\n\n const ordered = orderBy(dataWithIndices, ['isEmpty', 'value'], ['asc', sort.direction]);\n\n ordered.forEach(({ index: dataIndex }, displayIndex) => {\n if (displayIndex !== dataIndex) {\n this._displayToDataIndex.set(displayIndex, dataIndex);\n }\n });\n\n return ordered.map(({ item }) => item);\n });\n }\n\n private getSortValue(props: PropertyType, field: FieldType, item: T) {\n const { type, format } = props;\n const value = getValue(item, field.path);\n\n if (type === TypeEnum.Boolean) {\n return !!value; // Coerce null/undefined to false for booleans.\n }\n if (type === TypeEnum.Number) {\n return value;\n }\n if (value == null) {\n return value;\n }\n\n /**\n * For single select fields, the sort value is determined by the index of the option in the\n * options array. This ensures sort order matches the configured option order.\n */\n if (format === FormatEnum.SingleSelect) {\n const options = props.options;\n if (!options) {\n return undefined;\n }\n\n const option = options.find((option) => option.id === value);\n return option ? options.indexOf(option) : undefined;\n }\n\n // TODO(ZaymonFC): Should we format this returned value for display based on the referenced prop format?\n // Right now we're going to be sorting based on the raw values.\n // Maybe we need to recurse this function with the referenced prop format and field?\n if (format === FormatEnum.Ref && field.referencePath) {\n const refValue = getValue(value.target, field.referencePath);\n return refValue;\n }\n\n return formatForDisplay({ type, format, value });\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { signal } from '@preact/signals-core';\nimport { type RefObject, type MutableRefObject } from 'react';\n\nimport { type ReactiveObject } from '@dxos/live-object';\nimport { log } from '@dxos/log';\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 setTrigger = (trigger: HTMLElement) => {\n this._triggerRef.current = trigger;\n };\n\n public showRowMenu = (rowIndex: number) => {\n this._state.value = { type: 'row', rowIndex };\n };\n\n public showColumnMenu = (fieldId: string) => {\n this._state.value = { type: 'column', fieldId };\n };\n\n public showColumnCreator = () => {\n this._state.value = { type: 'columnSettings', mode: { type: 'create' } };\n };\n\n public showReferencePanel = (targetId: string, schemaId: string) => {\n this._state.value = { type: 'refPanel', targetId, typename: schemaId };\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\nimport { signal } from '@preact/signals-core';\n\nimport { FormatEnum, getValue } from '@dxos/echo-schema';\nimport { cellClassesForFieldType, cellClassesForRowSelection, formatForDisplay } from '@dxos/react-ui-form';\nimport {\n type DxGridPlane,\n type DxGridPlaneCells,\n toPlaneCellIndex,\n type DxGridPlaneRange,\n type DxGridCellValue,\n} from '@dxos/react-ui-grid';\nimport { mx } from '@dxos/react-ui-theme';\nimport { VIEW_FIELD_LIMIT, type FieldType } from '@dxos/schema';\n\nimport { type BaseTableRow, type TableModel } from './table-model';\nimport { tableButtons, tableControls } from '../util';\n\n/**\n * Presentation layer for a table component, handling cell rendering and grid display logic.\n * Manages rendering of table cells, headers, selection columns, and action columns across\n * different grid planes.\n */\nexport class TablePresentation<T extends BaseTableRow = { id: string }> {\n constructor(\n private readonly model: TableModel<T>,\n private readonly _visibleRange = signal<DxGridPlaneRange>({\n start: { row: 0, col: 0 },\n end: { row: 0, col: 0 },\n }),\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 case 'frozenRowsStart':\n return this.getHeaderCells(range);\n case 'frozenColsStart':\n return this.getSelectionColumnCells(range);\n case 'frozenColsEnd':\n return this.getActionColumnCells(range);\n case 'fixedStartStart':\n return this.getSelectAllCell();\n case 'fixedStartEnd':\n return this.getNewColumnCell();\n default:\n return {};\n }\n }\n\n private getMainGridCells(range: DxGridPlaneRange): DxGridPlaneCells {\n const cells: DxGridPlaneCells = {};\n const fields = this.model.table.view?.target?.fields ?? [];\n\n const addCell = (obj: T, field: FieldType, colIndex: number, displayIndex: number): void => {\n const { props } = this.model.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.Boolean:\n case FormatEnum.SingleSelect: {\n return '';\n }\n case FormatEnum.Ref: {\n if (!field.referencePath) {\n return ''; // TODO(burdon): Show error.\n }\n\n return getValue(value.target, 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.model.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 (props.format === FormatEnum.Ref && props.referenceSchema) {\n const targetObj = getValue(obj, field.path)?.target;\n if (targetObj) {\n cell.accessoryHtml = tableButtons.referencedCell.render({\n targetId: targetObj.id as any as string,\n schemaId: props.referenceSchema,\n });\n }\n }\n\n if (props.format === FormatEnum.Boolean) {\n const value = getValue(obj, field.path);\n cell.accessoryHtml = tableControls.switch.render({\n colIndex,\n rowIndex: displayIndex,\n checked: value ?? false,\n });\n cell.readonly = true;\n }\n\n if (props.format === FormatEnum.SingleSelect) {\n const value = getValue(obj, field.path);\n const options = this.model.projection.getFieldProjection(field.id).props.options;\n if (options) {\n const option = options.find((o) => o.id === value);\n if (option) {\n cell.accessoryHtml = `<span class=\"dx-tag\" data-hue=\"${option.color}\">${option.title}</span>`;\n }\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.model.getRowCount(); 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.model.rows.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.model.table.view?.target?.fields ?? [];\n for (let col = range.start.col; col <= range.end.col && col < fields.length; col++) {\n const { field, props } = this.model.projection.getFieldProjection(fields[col].id);\n const sorting = this.model.sorting?.sorting;\n const direction = sorting?.fieldId === field.id ? sorting.direction : undefined;\n\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: `\n ${direction !== undefined ? tableButtons.sort.render({ fieldId: field.id, direction }) : ''}\n ${tableButtons.columnSettings.render({ fieldId: field.id })}\n `,\n className: '!bg-gridHeader',\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.model.getRowCount(); row++) {\n const isSelected = this.model.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.model.getRowCount(); row++) {\n const isSelected = this.model.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 accessoryHtml: tableControls.checkbox.render({\n rowIndex: 0,\n header: true,\n checked: this.model.selection.allRowsSeleted.value,\n }),\n className: '!bg-gridHeader',\n readonly: true,\n value: '',\n },\n };\n }\n\n private getNewColumnCell(): DxGridPlaneCells {\n return {\n [toPlaneCellIndex({ col: 0, row: 0 })]: {\n accessoryHtml: tableButtons.addColumn.render({\n disabled: (this.model.table.view?.target?.fields?.length ?? 0) >= VIEW_FIELD_LIMIT,\n }),\n className: '!bg-gridHeader',\n readonly: true,\n value: '',\n },\n };\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, type ModalController } 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 modals?: ModalController;\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 modals,\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 && modals) {\n if (isCreateOption(data)) {\n const { field, props } = fieldProjection;\n if (props.referenceSchema) {\n suppressNextBlur.current = true;\n modals.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, modals, 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 React, { useCallback, useMemo } from 'react';\n\nimport { create } from '@dxos/live-object';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport {\n createGapSeparator,\n createMenuAction,\n type MenuAction,\n type MenuActionHandler,\n MenuProvider,\n ToolbarMenu,\n useMenuActions,\n} from '@dxos/react-ui-menu';\n\nimport { translationKey } from '../../translations';\n\nexport type TableToolbarActionProperties = { type: TableToolbarActionType };\n\nexport type TableToolbarAction = MenuAction<TableToolbarActionProperties>;\n\nexport type TableToolbarActionType = 'add-row' | 'comment' | 'save-view';\n\ntype TableToolbarState = Partial<{ viewDirty: boolean }>;\n\nexport type TableToolbarProps = ThemedClassName<\n TableToolbarState & { onAction?: MenuActionHandler<TableToolbarAction>; attendableId?: string }\n>;\n\nconst createTableToolbarActions = (state: TableToolbarState) => {\n const add = createMenuAction<TableToolbarActionProperties>('add-row', {\n type: 'add-row',\n icon: 'ph--plus--regular',\n label: ['add row', { ns: translationKey }],\n testId: 'table.toolbar.add-row',\n });\n const save = createMenuAction<TableToolbarActionProperties>('save-view', {\n type: 'save-view',\n icon: 'ph--floppy-disk--regular',\n label: ['save view label', { ns: translationKey }],\n testId: 'table.toolbar.save-view',\n iconOnly: false,\n hidden: !state.viewDirty,\n });\n const gap = createGapSeparator();\n const comment = createMenuAction('comment', {\n type: 'comment',\n icon: 'ph--chat-text--regular',\n label: ['create comment', { ns: translationKey }],\n testId: 'table.toolbar.comment',\n });\n const nodes = [add, save, ...gap.nodes, comment];\n return {\n nodes,\n edges: nodes.map(({ id: target }) => ({ source: 'root', target })),\n };\n};\n\nexport const TableToolbar = ({ classNames, viewDirty, attendableId, onAction }: TableToolbarProps) => {\n const state = useMemo(() => create<TableToolbarState>({ viewDirty }), []);\n const actionsCreator = useCallback(() => createTableToolbarActions(state), [state]);\n const menu = useMenuActions(actionsCreator);\n\n return (\n <MenuProvider {...menu} attendableId={attendableId} onAction={onAction as MenuActionHandler}>\n <ToolbarMenu classNames={classNames} />\n </MenuProvider>\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_react", "import_react_ui", "import_echo", "import_echo_schema", "import_react_ui_form", "import_react_ui_grid", "import_invariant", "import_signals_core", "import_context", "import_react_client", "import_react_ui_theme", "import_schema", "import_live_object", "translationKey", "ColumnActionsMenu", "model", "modals", "t", "useTranslation", "state", "value", "type", "currentSort", "sorting", "isCurrentColumnSorted", "fieldId", "React", "DropdownMenu", "Root", "modal", "open", "onOpenChange", "close", "VirtualTrigger", "virtualRef", "trigger", "Portal", "Content", "Viewport", "direction", "Item", "data-testid", "onClick", "setSort", "clearSort", "getColumnCount", "deleteColumn", "openColumnSettings", "Arrow", "ColumnSettings", "onNewColumn", "newField", "setNewField", "useState", "space", "getSpace", "table", "useEffect", "mode", "projection", "createFieldProjection", "requestAnimationFrame", "undefined", "existingField", "useMemo", "view", "target", "fields", "find", "f", "id", "field", "handleSave", "useCallback", "handleCancel", "deleteFieldProjection", "classNames", "FieldEditor", "registry", "db", "schemaRegistry", "onSave", "onCancel", "CreateRefPanel", "__gridScope", "gridId", "useGridContext", "schema", "query", "typename", "runSync", "omit", "S", "values", "obj", "add", "create", "onCreate", "Popover", "nextOpen", "data-grid", "Form", "initialValues", "getRefTargetObj", "getObjectById", "RefPanel", "targetObj", "targetId", "getSchema", "readonly", "RowActionsMenu", "hasSelection", "selection", "deleteRow", "rowIndex", "touch", "initializeTable", "initialRow", "initialSchema", "firstOrUndefined", "Error", "getSchemaProperties", "ast", "filter", "prop", "format", "FormatEnum", "Ref", "map", "name", "makeRef", "createView", "jsonSchema", "ContactSchema", "TypedObject", "PublicKey", "random", "truncate", "version", "optional", "String", "annotations", "AST", "TitleAnnotationId", "active", "Boolean", "email", "Format", "Email", "salary", "Currency", "contactSchema", "register", "ViewProjection", "setFieldProjection", "path", "size", "createFieldId", "referencePath", "props", "property", "TypeEnum", "referenceSchema", "title", "BUTTON_IDENTIFIERS", "columnSettings", "newColumn", "referencedCell", "rowMenu", "sort", "createButton", "attr", "data", "disabled", "icon", "testId", "dataAttrs", "Object", "entries", "k", "v", "join", "positionClass", "addColumnButton", "render", "getData", "_el", "columnSettingsButton", "el", "getAttribute", "referencedCellButton", "schemaId", "rowMenuButton", "toString", "Number", "sortButton", "tableButtons", "addColumn", "CONTROL_IDENTIFIERS", "checkbox", "switch", "BASE_CLASSES", "renderAttributes", "renderInput", "baseClass", "attrs", "checked", "preventToggle", "renderCheckbox", "header", "renderSwitch", "colIndex", "tableControls", "hasAttribute", "SelectionModel", "Resource", "constructor", "_rows", "_onSelectionChanged", "_selection", "signal", "Set", "_validSelectedIds", "computed", "rows", "validIds", "row", "has", "_hasSelection", "_allSelected", "length", "every", "getSelectedRows", "selectedIds", "isRowIndexSelected", "isObjectSelected", "object", "toggleSelectionForRowIndex", "newSelection", "delete", "setSelection", "_open", "selectionWatcher", "effect", "_ctx", "onDispose", "allRowsSeleted", "TableSorting", "_view", "_projection", "_displayToDataIndex", "Map", "_localSort", "_isDirty", "local", "viewSort", "sortedRows", "initialiseSortedRows", "isDirty", "getDataIndex", "displayIndex", "get", "toggleSort", "save", "clear", "getFieldProjection", "dataWithIndices", "item", "index", "sortValue", "getSortValue", "isEmpty", "ordered", "orderBy", "forEach", "dataIndex", "set", "getValue", "SingleSelect", "options", "option", "indexOf", "refValue", "formatForDisplay", "TableModel", "pinnedRows", "top", "bottom", "onCellUpdate", "onDeleteColumn", "onDeleteRows", "onInsertRow", "onRowOrderChanged", "_visibleRange", "start", "col", "end", "getRowCount", "insertRow", "_sorting", "_onInsertRow", "objectsToDelete", "selectedRows", "push", "_onDeleteRows", "getCellData", "formatForEditing", "setCellData", "rowIdx", "isReactiveObject", "setValue", "parseValue", "_table", "_pinnedRows", "_onDeleteColumn", "_onCellUpdate", "_onRowOrderChanged", "columnMeta", "invariant", "_columnMeta", "isViewDirty", "initializeColumnMeta", "initializeEffects", "meta", "fromEntries", "resizeable", "grid", "frozenColsStart", "frozenColsEnd", "rowOrderWatcher", "rowEffectManager", "rowEffects", "plane", "cleanup", "updateCellData", "update", "dataRow", "updatedValue", "setColumnWidth", "columnIndex", "width", "newWidth", "Math", "max", "pinRow", "side", "unpinRow", "saveView", "ModalController", "_state", "_triggerRef", "current", "setTrigger", "showRowMenu", "showColumnMenu", "showColumnCreator", "showReferencePanel", "openCreateRef", "anchorCell", "log", "warn", "TablePresentation", "getCells", "range", "getMainGridCells", "getHeaderCells", "getSelectionColumnCells", "getActionColumnCells", "getSelectAllCell", "getNewColumnCell", "cells", "addCell", "cell", "classes", "formatClasses", "cellClassesForFieldType", "rowSelectionClasses", "cellClassesForRowSelection", "className", "mx", "flat", "accessoryHtml", "o", "color", "idx", "toPlaneCellIndex", "resizeHandle", "isSelected", "VIEW_FIELD_LIMIT", "completion", "debug", "onQuery", "onMatch", "EditorView", "theme", "autocompletion", "icons", "activateOnTyping", "closeOnBlur", "override", "context", "text", "doc", "from", "tooltipClass", "optionClass", "updateListener", "of", "transactions", "tr", "annotation", "pickedCompletion", "newValue", "Symbol", "for", "createOption", "isCreateOption", "TableCellEditor", "onEnter", "onFocus", "editing", "setEditing", "suppressNextBlur", "useRef", "fieldProjection", "parseCellIndex", "handleEnter", "handleBlur", "handleClose", "event", "determineNavigationAxis", "determineNavigationDelta", "extension", "editorKeys", "onClose", "initialContent", "onNav", "document", "querySelector", "cellQuery", "getCellContent", "GridCellEditor", "onBlur", "key", "shift", "inlineEndLine", "blockEndLine", "frozen", "frozenRowsStart", "TableRoot", "children", "role", "div", "TableMain", "forwardRef", "presentation", "ignoreAttention", "forwardedRef", "dxGrid", "setDxGrid", "hasAttention", "useAttention", "fullyQualifiedId", "useImperativeHandle", "updateIfWithinBounds", "updateCells", "requestUpdate", "handleGridClick", "buttonSelector", "button", "tableButtonElement", "closest", "btn", "controlSelector", "control", "controlElement", "ctrl", "handleFocus", "increment", "delta", "refocus", "scrollToRow", "handleKeyDown", "closestCell", "handleAxisResize", "axis", "parseInt", "handleWheel", "stopPropagation", "handleNewColumn", "columns", "scrollToColumn", "handleQuery", "objects", "Filter", "run", "label", "isNotFalsy", "span", "Grid", "onWheelCapture", "limitRows", "limitColumns", "onAxisResize", "onKeyDown", "overscroll", "ref", "Table", "Main", "createTableToolbarActions", "createMenuAction", "ns", "iconOnly", "hidden", "viewDirty", "gap", "createGapSeparator", "comment", "nodes", "edges", "source", "TableToolbar", "attendableId", "onAction", "actionsCreator", "menu", "useMenuActions", "MenuProvider", "ToolbarMenu", "useTableModel", "setModel", "setTimeout", "clearTimeout", "setRows"]
|
|
7
7
|
}
|