@revisium/schema-toolkit-ui 0.6.2 → 0.6.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["observable","SystemSchemaIds","SystemSchemaIds","SystemSchemaIds","fileSchema","rowIdSchema","rowCreatedIdSchema","rowVersionIdSchema","rowCreatedAtSchema","rowPublishedAtSchema","rowUpdatedAtSchema","rowHashSchema","rowSchemaHashSchema","FIELD_NAME_ERROR_MESSAGE","React","ChakraTooltip","Portal","PiTreeViewThin","PiBracketsCurlyThin","PiLinkThin","Menu","Button","Icon","PiCaretDownLight","Portal","IconButton","PiCopy","Flex","Box","CodeMirror","EditorView","githubLight","Text","Flex","Box","Text","Box","Text","Breadcrumb","Text","Flex","Breadcrumb","Fragment","Text","Button","Flex","Box","Text","PiPlusBold","Button","Icon","PiX","Button","Icon","PiCaretLeft","IconButton","PiGear","IconButton","PiPlus","Flex","Box","PiDotOutlineFill","IconButton","MdOutlineChevronRight","Menu","Box","LuChevronRight","Portal","Fragment","Flex","Icon","PiDotsSixVerticalBold","Box","PiWarningCircle","Flex","Text","Box","Flex","Box","PiWarning","PiFunction","PiTextT","Menu","PiTextT","Box","PiCaretRight","Portal","Textarea","Textarea","Box","Menu","PiFunction","PiCaretRight","Portal","Menu","PiEquals","Box","PiCaretRight","Portal","Input","Menu","Portal","Box","PiTrash","Flex","Box","Flex","Text","Flex","Box","Flex","Text","Box","Flex","Text","Flex","Box","PiDotOutlineFill","Text","Box","Text","Box","Box","DialogRoot","Portal","DialogBackdrop","DialogPositioner","DialogContent","DialogHeader","DialogTitle","DialogBody","DialogFooter","Flex","DialogCloseTrigger","Flex","Button","PiPlusLight","PiMinusLight","PiArrowsLeftRightLight","PiPencilSimpleLight","Flex","Icon","Text","Badge","PiPencilSimpleLight","Flex","Text","Box","Badge","VStack","Flex","Text","Badge","Icon","PiArrowRight","Flex","Text","Icon","PiArrowRight","Box","Box","Flex","Icon","PiArrowsLeftRightLight","Text","Box","Flex","Icon","PiWarningCircle","Text","Badge","Popover","Button","Icon","PiArrowCounterClockwiseBold","Text","Flex","VStack","Box","Text","VStack","SegmentGroup","Box","Text","Flex","VStack","SegmentGroup","Box","Flex","Box","Button","observable","SystemSchemaIds","observable","Flex","Box","Flex","PiDotOutlineFill","Box","MdOutlineChevronRight","Box","Flex","PiFunctionLight","Text","Text","Menu","Flex","Icon","PiDotsThreeVerticalBold","Portal","LuChevronRight","Fragment","Box","Flex","Box","Popover","Box","Portal","Box","Flex","IconButton","PiArrowSquareUpRightThin","PiInfo","Flex","Text","IconButton","PiXBold","Box","Input","IconButton","PiXBold","Box","Box","Flex","Text","HStack","Button","PiMagnifyingGlassBold","PiPlusBold","Flex","Spinner","Text","Flex","IconButton","PiFile","HoverCard","Portal","Image","Flex","PiInfo","Box","IconButton","PiUploadThin","Box","Textarea","Virtuoso","Fragment","VStack","SystemSchemaIds","SystemSchemaIds","fileSchema","rowIdSchema","rowCreatedAtSchema","rowCreatedIdSchema","rowVersionIdSchema","rowPublishedAtSchema","rowUpdatedAtSchema","rowHashSchema","rowSchemaHashSchema","SchemaParser","SystemSchemaIds","observable","PiFile","PiCalendar","Menu","Box","Text","Menu","Box","Text","PiCaretDownLight","Menu","Box","Text","PiCaretDownLight","Input","Menu","Box","Text","PiCaretDownLight","Menu","Box","Text","PiCaretDownLight","Box","IconButton","LuX","Menu","Box","LuChevronDown","VStack","Box","Text","Button","LuPlus","Popover","IconButton","LuCode","Portal","Box","CodeMirror","EditorView","githubLight","Popover","Box","IconButton","LuFilter","Portal","Text","Button","LuPlus","IconButton","PiMagnifyingGlass","Box","Input","PiXBold","Menu","Box","Text","PiCaretDownLight","PiArrowUpLight","PiArrowDownLight","Menu","Box","Text","PiCaretDownLight","Box","Text","IconButton","LuX","Popover","Box","IconButton","LuArrowUpDown","Portal","Text","Button","LuPlus","observable","observable","comparer","Portal","Textarea","Portal","Menu","Box","Kbd","Menu","Box","Text","Box","Text","Box","Text","Popover","Portal","Box","Text","Popover","Portal","Box","HStack","Text","Flex","PiInfo","IconButton","PiUploadThin","Text","Text","Box","Flex","LuArrowUp","LuArrowDown","Box","Flex","LuPin","Flex","LuFilter","Menu","Text","LuChevronRight","Portal","LuArrowUpAZ","LuArrowDownAZ","LuX","Menu","Text","LuChevronRight","Portal","LuChevronLeft","LuArrowLeftToLine","LuArrowRightToLine","Menu","Box","Text","Menu","Text","LuChevronRight","Portal","Menu","LuFilter","Text","LuPinOff","LuPin","PiEyeSlash","PiListBullets","LuCopy","Box","Menu","Flex","Text","Portal","Flex","Menu","IconButton","PiPlus","Portal","PiListBullets","Text","SELECTION_COLUMN_WIDTH","ADD_COLUMN_BUTTON_WIDTH","Box","Menu","PiCheckSquare","Text","LuCopy","LuTrash2","Flex","Icon","PiArrowSquareRightLight","Menu","PiDotsThreeVerticalBold","Portal","Text","Box","Flex","Checkbox","Box","ActionBar","Portal","Button","PiCheckSquare","LuCopy","LuTrash2","PiX","DialogRoot","Portal","DialogBackdrop","DialogPositioner","DialogContent","DialogHeader","DialogTitle","DialogBody","Text","DialogFooter","Flex","Button","Spinner","Box","Text","TableVirtuoso","Menu","Flex","Icon","PiDotsThreeVerticalBold","Portal","PiCheckSquare","Text","LuCopy","LuTrash2","FilterModel","Flex","Text","Spinner","Popover","Badge","Box","Portal","HStack","LuInfo","Text","Button","Box","Spinner","Flex"],"sources":["../src/schema-editor/model/state/TreeState.ts","../src/schema-editor/model/accessor/NodeAccessor.ts","../src/schema-editor/model/accessor/NodeState.ts","../src/schema-editor/config/schema-type-ids.ts","../src/schema-editor/model/accessor/NodeLabel.ts","../src/schema-editor/model/accessor/NodeFormula.ts","../src/schema-editor/model/accessor/NodeValidation.ts","../src/schema-editor/model/utils/typeIdMapping.ts","../src/schema-editor/model/accessor/NodeActions.ts","../src/schema-editor/model/accessor/NodeAccessorFactory.ts","../src/schema-editor/model/core/AccessorCache.ts","../src/schema-editor/model/core/ValidationTracker.ts","../src/schema-editor/model/core/ViewState.ts","../src/schema-editor/model/utils/DataTransformations.ts","../src/schema-editor/model/utils/DefaultValues.ts","../src/schema-editor/model/utils/traverseTree.ts","../src/schema-editor/model/utils/TreeNavigator.ts","../src/schema-editor/model/core/CollapseManager.ts","../src/schema-editor/model/core/KeyboardNavigation.ts","../src/schema-editor/config/system-schemas.ts","../src/lib/initReactivity.ts","../src/schema-editor/model/core/SchemaEditorCore.ts","../src/schema-editor/model/vm/SchemaTreeVM.ts","../src/schema-editor/model/dialog/CreateTableDialogVM.ts","../src/schema-editor/model/dialog/ReviewErrorsDialogVM.ts","../src/schema-editor/model/vm/CreatingEditorVM.ts","../src/schema-editor/model/dialog/ReviewChangesDialogVM.ts","../src/schema-editor/model/vm/UpdatingEditorVM.ts","../src/components/Tooltip/Tooltip.tsx","../src/schema-editor/types/index.ts","../src/components/ViewerSwitcher/ViewerSwitcher.tsx","../src/components/CopyButton/CopyButton.tsx","../src/components/JsonCard/JsonCard.tsx","../src/hooks/useContentEditable.ts","../src/components/ContentEditable/ContentEditable.tsx","../src/components/Breadcrumbs/constants.ts","../src/components/Breadcrumbs/EditableSegment.tsx","../src/components/Breadcrumbs/SegmentContent.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/GrayButton/GrayButton.tsx","../src/components/CreateButton/CreateButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/BackButton/BackButton.tsx","../src/components/SettingsButton/SettingsButton.tsx","../src/components/PlusButton/PlusButton.tsx","../src/schema-editor/ui/tree/TreeNodeWrapper/TreeNodeWrapper.tsx","../src/schema-editor/ui/TypeMenu/TypeMenu.tsx","../src/schema-editor/ui/tree/TreeNodeField/DragHandle.tsx","../src/schema-editor/ui/tree/TreeNodeField/ErrorIndicator.tsx","../src/schema-editor/ui/tree/TreeNodeField/useDragAndDrop.ts","../src/schema-editor/ui/tree/TreeNodeField/TreeNodeField.tsx","../src/schema-editor/ui/tree/TreeNodeIndicators/TreeNodeIndicators.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/DescriptionSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/FormulaSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/parseDefaultValue.ts","../src/schema-editor/ui/tree/TreeNodeContextMenu/DefaultValueSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/TreeNodeContextMenu.tsx","../src/schema-editor/ui/tree/TreeNodeRightContent/TreeNodeRightContent.tsx","../src/schema-editor/ui/tree/NodeViewLayout/NodeViewLayout.tsx","../src/schema-editor/ui/tree/ObjectNodeView/ObjectNodeView.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ForeignKeyValue.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayItemsChildren.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayItemsView.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayNodeView.tsx","../src/schema-editor/ui/tree/PrimitiveNodeView/PrimitiveNodeView.tsx","../src/schema-editor/ui/tree/ForeignKeyNodeView/ForeignKeyNodeView.tsx","../src/schema-editor/ui/tree/RefNodeView/RefNodeView.tsx","../src/schema-editor/ui/tree/TreeNodeView/TreeNodeView.tsx","../src/schema-editor/ui/dialog/shared/Highlight/Highlight.tsx","../src/schema-editor/ui/dialog/shared/CodeBox/CodeBox.tsx","../src/schema-editor/ui/dialog/shared/DialogLayout/DialogLayout.tsx","../src/schema-editor/ui/dialog/shared/DialogFooterActions/DialogFooterActions.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/helpers.ts","../src/schema-editor/ui/dialog/shared/PatchRow/OperationDescription.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/DefaultValueRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/DataLossBadge.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/TransformationInfoRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/ValueChangeRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/PatchRow.tsx","../src/schema-editor/ui/dialog/shared/TableIdChangeRow/TableIdChangeRow.tsx","../src/schema-editor/ui/dialog/shared/ErrorItem/ErrorItem.tsx","../src/schema-editor/ui/dialog/shared/RevertButton/RevertButton.tsx","../src/schema-editor/ui/dialog/ReviewErrorsDialog/ReviewErrorsDialog.tsx","../src/schema-editor/ui/dialog/ReviewChangesDialog/ReviewChangesDialog.tsx","../src/schema-editor/ui/dialog/CreateTableDialog/CreateTableDialog.tsx","../src/schema-editor/ui/SchemaEditor/SchemaEditor.tsx","../src/schema-editor/ui/CreatingSchemaEditor/CreatingSchemaEditor.tsx","../src/schema-editor/ui/UpdatingSchemaEditor/UpdatingSchemaEditor.tsx","../src/row-editor/vm/flattenNodes.ts","../src/row-editor/vm/state/RowTreeState.ts","../src/row-editor/vm/accessor/RowNodeAccessor.ts","../src/row-editor/vm/accessor/RowNodeState.ts","../src/row-editor/vm/accessor/RowNodeMenu.ts","../src/row-editor/vm/accessor/RowNodeLayout.ts","../src/row-editor/vm/accessor/RowAccessorFactory.ts","../src/row-editor/vm/accessor/RowAccessorCache.ts","../src/row-editor/vm/RowEditorCore.ts","../src/row-editor/vm/RowEditorVM.ts","../src/row-editor/ui/components/Guides.tsx","../src/row-editor/ui/components/Dot.tsx","../src/row-editor/ui/components/Field.tsx","../src/row-editor/ui/components/More.tsx","../src/row-editor/ui/components/NodeMenu/NodeMenu.tsx","../src/row-editor/ui/components/Row.tsx","../src/row-editor/ui/renderers/ContainerRenderer.tsx","../src/row-editor/ui/editors/PrimitiveBox.tsx","../src/row-editor/ui/editors/StringEditor.tsx","../src/row-editor/ui/renderers/StringRenderer.tsx","../src/row-editor/ui/editors/NumberEditor.tsx","../src/row-editor/ui/renderers/NumberRenderer.tsx","../src/row-editor/ui/editors/FocusPopover.tsx","../src/row-editor/ui/editors/FocusPopoverItem.tsx","../src/row-editor/ui/editors/BooleanMenu.tsx","../src/row-editor/ui/editors/BooleanEditor.tsx","../src/row-editor/ui/renderers/BooleanRenderer.tsx","../src/row-editor/ui/editors/ForeignKeyActions.tsx","../src/lib/Debounce.ts","../src/search-foreign-key/vm/SearchForeignKeyVM.ts","../src/search-foreign-key/ui/Header.tsx","../src/search-foreign-key/ui/SearchInput.tsx","../src/search-foreign-key/ui/Item.tsx","../src/search-foreign-key/ui/List.tsx","../src/search-foreign-key/ui/Empty.tsx","../src/search-foreign-key/ui/Footer.tsx","../src/search-foreign-key/ui/SearchForeignKey.tsx","../src/row-editor/ui/editors/ForeignKeyMenu.tsx","../src/row-editor/ui/renderers/ForeignKeyRenderer.tsx","../src/row-editor/ui/editors/FileHoverCard.tsx","../src/row-editor/ui/editors/FileActions.tsx","../src/row-editor/ui/renderers/FileRenderer.tsx","../src/row-editor/ui/editors/MarkdownEditor.tsx","../src/row-editor/ui/renderers/MarkdownRenderer.tsx","../src/row-editor/ui/renderers/NodeRenderers.ts","../src/row-editor/ui/RowEditor/FlatItemView.tsx","../src/row-editor/ui/RowEditor/RowEditor.tsx","../src/row-editor/ui/NodeView/NodeView.tsx","../src/table-editor/shared/field-types.ts","../src/table-editor/shared/system-fields.ts","../src/table-editor/shared/system-field-ids.ts","../src/table-editor/TableEditor/model/SchemaContext.ts","../src/table-editor/Columns/model/extractColumns.ts","../src/table-editor/Columns/model/selectDefaultColumns.ts","../src/table-editor/Columns/model/ColumnsModel.ts","../src/table-editor/Filters/model/utils/operators.ts","../src/table-editor/Filters/model/utils/searchTypes.ts","../src/table-editor/Filters/model/vm/FilterConditionVM.ts","../src/table-editor/Filters/model/vm/FilterGroupVM.ts","../src/table-editor/Filters/model/filterSchema.ts","../src/table-editor/Filters/model/core/FilterTreeOps.ts","../src/table-editor/Filters/model/utils/filterTreeUtils.ts","../src/table-editor/Filters/model/utils/filterBuilder.ts","../src/table-editor/Filters/model/core/FilterSerializer.ts","../src/table-editor/Filters/model/utils/filterValidation.ts","../src/table-editor/Filters/model/core/FilterValidator.ts","../src/table-editor/Filters/model/core/FilterCore.ts","../src/table-editor/Table/ui/Header/getFieldTypeIcon.tsx","../src/table-editor/Filters/ui/FieldSelect/FieldMenuItems.tsx","../src/table-editor/Filters/ui/FieldSelect/FieldSelect.tsx","../src/table-editor/Filters/ui/OperatorSelect/OperatorSelect.tsx","../src/table-editor/Filters/ui/FilterValueInput/FilterValueInput.tsx","../src/table-editor/Filters/ui/SearchLanguageSelect/SearchLanguageSelect.tsx","../src/table-editor/Filters/ui/SearchTypeSelect/SearchTypeSelect.tsx","../src/table-editor/Filters/ui/FilterConditionView/FilterConditionView.tsx","../src/table-editor/Filters/ui/FilterGroupView/LogicDropdown.tsx","../src/table-editor/Filters/ui/FilterGroupView/FilterGroupView.tsx","../src/table-editor/shared/CopyJsonPopover/CopyJsonPopover.tsx","../src/table-editor/Filters/ui/FilterWidget/FilterWidget.tsx","../src/table-editor/Search/model/SearchModel.ts","../src/table-editor/Search/ui/SearchWidget.tsx","../src/table-editor/Sortings/model/sortSchema.ts","../src/table-editor/Sortings/model/SortModel.ts","../src/table-editor/Sortings/ui/SortFieldSelect/SortFieldSelect.tsx","../src/table-editor/Sortings/ui/SortDirectionSelect/SortDirectionSelect.tsx","../src/table-editor/Sortings/ui/SortRow/SortRow.tsx","../src/table-editor/Sortings/ui/SortingsWidget/SortingsWidget.tsx","../src/table-editor/Table/model/SelectionModel.ts","../src/lib/fsm/resolveTransition.ts","../src/lib/fsm/ObservableFSM.ts","../src/table-editor/Table/model/cellFSMConfig.ts","../src/table-editor/Table/model/CellFSM.ts","../src/table-editor/Table/model/CellVM.ts","../src/table-editor/Table/model/RowVM.ts","../src/table-editor/Table/ui/Cell/cellEditorUtils.ts","../src/table-editor/Table/ui/Cell/CellTextareaEditor.tsx","../src/table-editor/Table/ui/Cell/CellContextActionsContext.ts","../src/table-editor/Table/ui/Cell/CellContextMenu.tsx","../src/table-editor/Table/ui/Cell/cellStyles.ts","../src/table-editor/Table/ui/Cell/cellCss.ts","../src/table-editor/Table/ui/Cell/useCellContextMenu.ts","../src/table-editor/Table/ui/Cell/useCellFocus.ts","../src/table-editor/Table/ui/Cell/useCellKeyboard.ts","../src/table-editor/Table/ui/Cell/useDeferredMenuEdit.ts","../src/table-editor/Table/ui/Cell/CellWrapper.tsx","../src/table-editor/Table/ui/Cell/useTextareaCell.ts","../src/table-editor/Table/ui/Cell/StringCell.tsx","../src/table-editor/Table/ui/Cell/NumberCell.tsx","../src/table-editor/Table/ui/Cell/usePopoverAnchor.ts","../src/table-editor/Table/ui/Cell/BooleanCell.tsx","../src/table-editor/Table/ui/Cell/ForeignKeyCell.tsx","../src/table-editor/Table/ui/Cell/FileCell.tsx","../src/table-editor/Table/ui/Cell/DateTimeCell.tsx","../src/table-editor/Table/ui/Cell/ReadonlyCell.tsx","../src/table-editor/Table/ui/Cell/CellRenderer.tsx","../src/table-editor/Table/model/parseTSV.ts","../src/table-editor/Table/model/clipboardOperations.ts","../src/table-editor/Table/ui/borderConstants.ts","../src/table-editor/Table/ui/ResizeHandle.tsx","../src/table-editor/Table/ui/Header/SortIndicator.tsx","../src/table-editor/Table/ui/Header/PinIndicator.tsx","../src/table-editor/Table/ui/Header/FilterIndicator.tsx","../src/table-editor/Table/ui/Header/SortSubmenu.tsx","../src/table-editor/Table/ui/Header/MoveColumnSubmenu.tsx","../src/table-editor/Table/ui/Header/FieldMenuItem.tsx","../src/table-editor/Table/ui/Header/InsertColumnSubmenu.tsx","../src/table-editor/Table/ui/Header/ColumnHeaderMenu.tsx","../src/table-editor/Table/ui/Header/ColumnHeader.tsx","../src/table-editor/Table/ui/Header/AddColumnButton.tsx","../src/table-editor/Table/ui/HeaderRow.tsx","../src/table-editor/Table/ui/RowActionMenuItems.tsx","../src/table-editor/Table/ui/RowActionOverlay.tsx","../src/table-editor/Table/ui/SelectionCheckboxCell.tsx","../src/table-editor/Table/ui/DataRow.tsx","../src/table-editor/Table/ui/SelectionToolbar.tsx","../src/table-editor/Table/ui/DeleteConfirmDialog/DeleteConfirmDialog.tsx","../src/table-editor/Table/ui/TableComponent.tsx","../src/table-editor/Table/ui/TableRowComponent.tsx","../src/table-editor/Table/ui/hooks/useScrollShadow.ts","../src/table-editor/Table/ui/TableWidget.tsx","../src/table-editor/Table/ui/RowActionsMenu/RowActionsMenu.tsx","../src/table-editor/Status/model/RowCountModel.ts","../src/table-editor/Status/model/ViewSettingsBadgeModel.ts","../src/table-editor/TableEditor/model/TableEditorCore.ts","../src/table-editor/TableEditor/model/MockDataSource.ts","../src/table-editor/Status/ui/RowCountWidget.tsx","../src/table-editor/Status/ui/ViewSettingsBadge.tsx","../src/table-editor/TableEditor/ui/TableEditor.tsx"],"sourcesContent":["import { makeAutoObservable, observable } from 'mobx';\n\nexport class TreeState {\n private readonly _expandedNodes = observable.map<string, boolean>();\n private readonly _focusedNodes = observable.map<string, boolean>();\n private readonly _menuOpenNodes = observable.map<string, boolean>();\n private readonly _settingsOpenNodes = observable.map<string, boolean>();\n private readonly _dropNodes = observable.map<string, boolean>();\n private readonly _disabledDropNodes = observable.map<string, boolean>();\n private readonly _draggedOverNodes = observable.map<string, boolean>();\n private readonly _focusRequestCounts = observable.map<string, number>();\n private _activeNodeId: string | null = null;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get activeNodeId(): string | null {\n return this._activeNodeId;\n }\n\n public setActiveNodeId(nodeId: string | null): void {\n this._activeNodeId = nodeId;\n }\n\n public isActive(nodeId: string): boolean {\n return this._activeNodeId === nodeId;\n }\n\n public getFocusRequestCount(nodeId: string): number {\n return this._focusRequestCounts.get(nodeId) ?? 0;\n }\n\n public requestFocus(nodeId: string): void {\n const current = this._focusRequestCounts.get(nodeId) ?? 0;\n this._focusRequestCounts.set(nodeId, current + 1);\n }\n\n public isExpanded(nodeId: string): boolean {\n return this._expandedNodes.get(nodeId) ?? true;\n }\n\n public setExpanded(nodeId: string, value: boolean): void {\n this._expandedNodes.set(nodeId, value);\n }\n\n public toggleExpanded(nodeId: string): void {\n this._expandedNodes.set(nodeId, !this.isExpanded(nodeId));\n }\n\n public isFocused(nodeId: string): boolean {\n return this._focusedNodes.get(nodeId) ?? false;\n }\n\n public setFocused(nodeId: string, value: boolean): void {\n this._focusedNodes.set(nodeId, value);\n }\n\n public isMenuOpen(nodeId: string): boolean {\n return this._menuOpenNodes.get(nodeId) ?? false;\n }\n\n public setMenuOpen(nodeId: string, value: boolean): void {\n this._menuOpenNodes.set(nodeId, value);\n }\n\n public isSettingsOpen(nodeId: string): boolean {\n return this._settingsOpenNodes.get(nodeId) ?? false;\n }\n\n public setSettingsOpen(nodeId: string, value: boolean): void {\n this._settingsOpenNodes.set(nodeId, value);\n }\n\n public isDrop(nodeId: string): boolean {\n return this._dropNodes.get(nodeId) ?? false;\n }\n\n public setDrop(nodeId: string, value: boolean): void {\n this._dropNodes.set(nodeId, value);\n }\n\n public isDisabledDrop(nodeId: string): boolean {\n return this._disabledDropNodes.get(nodeId) ?? false;\n }\n\n public setDisabledDrop(nodeId: string, value: boolean): void {\n this._disabledDropNodes.set(nodeId, value);\n }\n\n public isDraggedOver(nodeId: string): boolean {\n return this._draggedOverNodes.get(nodeId) ?? false;\n }\n\n public setDraggedOver(nodeId: string, value: boolean): void {\n this._draggedOverNodes.set(nodeId, value);\n }\n\n public clearNode(nodeId: string): void {\n this._expandedNodes.delete(nodeId);\n this._focusedNodes.delete(nodeId);\n this._menuOpenNodes.delete(nodeId);\n this._settingsOpenNodes.delete(nodeId);\n this._dropNodes.delete(nodeId);\n this._disabledDropNodes.delete(nodeId);\n this._draggedOverNodes.delete(nodeId);\n this._focusRequestCounts.delete(nodeId);\n }\n\n public collapseAll(nodeIds: string[], keepRootExpanded: boolean): void {\n for (const nodeId of nodeIds) {\n this._expandedNodes.set(nodeId, false);\n }\n if (keepRootExpanded) {\n const firstNodeId = nodeIds[0];\n if (firstNodeId !== undefined) {\n this._expandedNodes.set(firstNodeId, true);\n }\n }\n }\n\n public expandAll(nodeIds: string[]): void {\n for (const nodeId of nodeIds) {\n this._expandedNodes.set(nodeId, true);\n }\n }\n\n public reset(): void {\n this._expandedNodes.clear();\n this._focusedNodes.clear();\n this._menuOpenNodes.clear();\n this._settingsOpenNodes.clear();\n this._dropNodes.clear();\n this._disabledDropNodes.clear();\n this._draggedOverNodes.clear();\n this._focusRequestCounts.clear();\n this._activeNodeId = null;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from '@revisium/schema-toolkit';\nimport type { NodeState } from './NodeState';\nimport type { NodeLabel } from './NodeLabel';\nimport type { NodeFormula } from './NodeFormula';\nimport type { NodeValidation } from './NodeValidation';\nimport type { NodeActions } from './NodeActions';\n\nexport interface NodeAccessorDependencies {\n state: NodeState;\n label: NodeLabel;\n formula: NodeFormula;\n validation: NodeValidation;\n actions: NodeActions;\n}\n\nexport class NodeAccessor {\n public readonly state: NodeState;\n public readonly label: NodeLabel;\n public readonly formula: NodeFormula;\n public readonly validation: NodeValidation;\n public readonly actions: NodeActions;\n\n constructor(\n private readonly _node: SchemaNode,\n deps: NodeAccessorDependencies,\n private readonly _isRoot: boolean = false,\n private readonly _isReadonly: boolean = false,\n ) {\n this.state = deps.state;\n this.label = deps.label;\n this.formula = deps.formula;\n this.validation = deps.validation;\n this.actions = deps.actions;\n\n makeAutoObservable(\n this,\n {\n state: false,\n label: false,\n formula: false,\n validation: false,\n actions: false,\n },\n { autoBind: true },\n );\n }\n\n public get nodeId(): string {\n return this._node.id();\n }\n\n public get isRoot(): boolean {\n return this._isRoot;\n }\n\n public get isReadonly(): boolean {\n return this._isReadonly;\n }\n\n public get isObject(): boolean {\n return this._node.isObject();\n }\n\n public get isArray(): boolean {\n return this._node.isArray();\n }\n\n public get isPrimitive(): boolean {\n return this._node.isPrimitive();\n }\n\n public get isRef(): boolean {\n return this._node.isRef();\n }\n\n public get ref(): string | undefined {\n if (this._node.isRef()) {\n return this._node.ref();\n }\n return undefined;\n }\n\n public get isForeignKey(): boolean {\n return this.label.isForeignKey;\n }\n\n public get defaultValue(): unknown {\n return this._node.defaultValue();\n }\n\n public get defaultValueAsString(): string {\n const value = this.defaultValue;\n if (value === undefined || value === null) {\n return '';\n }\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n return String(value);\n default:\n return JSON.stringify(value);\n }\n }\n\n public get hoverTargetClass(): string {\n return `hover-target-${this.nodeId}`;\n }\n\n public get shouldApplyFieldStyles(): boolean {\n return (\n !this.state.isFocused &&\n !this.state.isMenuOpen &&\n !this.state.isSettingsOpen\n );\n }\n\n public get showMenu(): boolean {\n return !this._isReadonly;\n }\n\n public handleFieldBlur(): void {\n this.state.setFocused(false);\n if (!this._node.name() && !this._isRoot) {\n this.actions.remove();\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { TreeState } from '../state/TreeState';\n\nexport class NodeState {\n constructor(\n private readonly _nodeId: string,\n private readonly _treeState: TreeState,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get isExpanded(): boolean {\n return this._treeState.isExpanded(this._nodeId);\n }\n\n public toggleExpanded(): void {\n this._treeState.toggleExpanded(this._nodeId);\n }\n\n public get isFocused(): boolean {\n return this._treeState.isFocused(this._nodeId);\n }\n\n public setFocused(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setFocused(this._nodeId, value);\n }\n\n public get isMenuOpen(): boolean {\n return this._treeState.isMenuOpen(this._nodeId);\n }\n\n public setMenuOpen(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setMenuOpen(this._nodeId, value);\n }\n\n public get isSettingsOpen(): boolean {\n return this._treeState.isSettingsOpen(this._nodeId);\n }\n\n public setSettingsOpen(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setSettingsOpen(this._nodeId, value);\n }\n\n public get isDrop(): boolean {\n return this._treeState.isDrop(this._nodeId);\n }\n\n public setDrop(value: boolean): void {\n this._treeState.setDrop(this._nodeId, value);\n }\n\n public get isDisabledDrop(): boolean {\n return this._treeState.isDisabledDrop(this._nodeId);\n }\n\n public setDisabledDrop(value: boolean): void {\n this._treeState.setDisabledDrop(this._nodeId, value);\n }\n\n public get isDraggedOver(): boolean {\n return this._treeState.isDraggedOver(this._nodeId);\n }\n\n public setDraggedOver(value: boolean): void {\n this._treeState.setDraggedOver(this._nodeId, value);\n }\n\n public get isActive(): boolean {\n return this._treeState.isActive(this._nodeId);\n }\n\n public activate(): void {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n\n public get focusRequestCount(): number {\n return this._treeState.getFocusRequestCount(this._nodeId);\n }\n\n public requestFocus(): void {\n this._treeState.requestFocus(this._nodeId);\n }\n}\n","import { SystemSchemaIds } from '@revisium/schema-toolkit';\n\nconst SYSTEM_SCHEMA_LABELS: Record<string, string> = {\n [SystemSchemaIds.RowId]: 'id',\n [SystemSchemaIds.RowCreatedId]: 'createdId',\n [SystemSchemaIds.RowVersionId]: 'versionId',\n [SystemSchemaIds.RowCreatedAt]: 'createdAt',\n [SystemSchemaIds.RowPublishedAt]: 'publishedAt',\n [SystemSchemaIds.RowUpdatedAt]: 'updatedAt',\n [SystemSchemaIds.RowHash]: 'hash',\n [SystemSchemaIds.RowSchemaHash]: 'schemaHash',\n [SystemSchemaIds.File]: 'File',\n};\n\nexport const getLabelByRef = (ref: string): string => {\n return SYSTEM_SCHEMA_LABELS[ref] ?? ref;\n};\n\nexport enum SchemaTypeIds {\n String = 'String',\n Number = 'Number',\n Boolean = 'Boolean',\n Object = 'Object',\n Array = 'Array',\n ForeignKeyString = 'ForeignKeyString',\n File = 'File',\n RowId = 'RowId',\n RowVersionId = 'RowVersionId',\n RowCreatedId = 'RowCreatedId',\n RowCreatedAt = 'RowCreatedAt',\n RowPublishedAt = 'RowPublishedAt',\n RowUpdatedAt = 'RowUpdatedAt',\n RowHash = 'RowHash',\n RowSchemaHash = 'RowSchemaHash',\n Markdown = 'Markdown',\n}\n\ntype BaseOption = {\n id: string;\n label: string;\n type?: 'item' | 'submenu';\n};\n\nexport type MenuOptionItem =\n | (BaseOption & {\n type?: 'item';\n addDividerAfter?: boolean;\n })\n | (BaseOption & {\n type: 'submenu';\n items: MenuOptionItem[];\n });\n\nexport type MenuGroup = {\n id: string;\n options: MenuOptionItem[];\n addDividerAfter?: boolean;\n};\n\nconst typesOptions: MenuOptionItem[] = [\n { id: SchemaTypeIds.String, label: 'string' },\n { id: SchemaTypeIds.Number, label: 'number' },\n { id: SchemaTypeIds.Boolean, label: 'boolean' },\n { id: SchemaTypeIds.Object, label: 'object' },\n { id: SchemaTypeIds.Array, label: 'array' },\n { id: SchemaTypeIds.ForeignKeyString, label: 'foreign key' },\n];\n\nconst schemasOptions: MenuOptionItem[] = [\n {\n id: 'schemas-submenu',\n label: 'Schemas',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.File, label: getLabelByRef(SystemSchemaIds.File) },\n { id: SchemaTypeIds.Markdown, label: 'Markdown' },\n ],\n },\n];\n\nconst systemFieldsOptions: MenuOptionItem[] = [\n {\n id: 'system-fields-submenu',\n label: 'System fields',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.RowId, label: getLabelByRef(SystemSchemaIds.RowId) },\n {\n id: SchemaTypeIds.RowVersionId,\n label: getLabelByRef(SystemSchemaIds.RowVersionId),\n },\n {\n id: SchemaTypeIds.RowCreatedId,\n label: getLabelByRef(SystemSchemaIds.RowCreatedId),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowCreatedAt,\n label: getLabelByRef(SystemSchemaIds.RowCreatedAt),\n },\n {\n id: SchemaTypeIds.RowPublishedAt,\n label: getLabelByRef(SystemSchemaIds.RowPublishedAt),\n },\n {\n id: SchemaTypeIds.RowUpdatedAt,\n label: getLabelByRef(SystemSchemaIds.RowUpdatedAt),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowHash,\n label: getLabelByRef(SystemSchemaIds.RowHash),\n },\n {\n id: SchemaTypeIds.RowSchemaHash,\n label: getLabelByRef(SystemSchemaIds.RowSchemaHash),\n },\n ],\n },\n];\n\nexport const typeMenuGroups: MenuGroup[] = [\n { id: 'types', options: typesOptions, addDividerAfter: true },\n { id: 'schemas', options: schemasOptions, addDividerAfter: true },\n { id: 'system-fields', options: systemFieldsOptions },\n];\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from '@revisium/schema-toolkit';\nimport { getLabelByRef } from '../../config/schema-type-ids';\n\nexport class NodeLabel {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _getTableId: () => string,\n private readonly _isRoot: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get name(): string {\n if (this._isRoot) {\n return this._getTableId();\n }\n return this._node.name();\n }\n\n public get nodeType(): string {\n return this._node.nodeType();\n }\n\n public get typeLabel(): string {\n if (this._node.isRef()) {\n return this.getRefLabel();\n }\n if (this._node.isObject()) {\n return 'object';\n }\n if (this._node.isArray()) {\n return 'array';\n }\n if (this._node.foreignKey() !== undefined) {\n return 'ForeignKey';\n }\n if (this._node.contentMediaType?.() === 'text/markdown') {\n return 'Markdown';\n }\n return this._node.nodeType();\n }\n\n public get description(): string | undefined {\n return this._node.metadata().description;\n }\n\n public get isDeprecated(): boolean {\n return this._node.metadata().deprecated ?? false;\n }\n\n public get foreignKeyTable(): string | undefined {\n return this._node.foreignKey();\n }\n\n public get isForeignKey(): boolean {\n return this._node.foreignKey() !== undefined;\n }\n\n private getRefLabel(): string {\n const ref = this._node.ref();\n if (!ref) {\n return 'Ref';\n }\n return getLabelByRef(ref);\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport type {\n SchemaNode,\n SchemaModel,\n JsonObjectSchema,\n} from '@revisium/schema-toolkit';\n\nexport class NodeFormula {\n private _inputValue: string | null = null;\n private _inputError: string | null = null;\n\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get hasFormula(): boolean {\n return this._node.hasFormula();\n }\n\n public get plainSchema(): JsonObjectSchema {\n return this._schemaModel.plainSchema;\n }\n\n public get rawExpression(): string {\n const formula = this._node.formula();\n return formula?.expression() ?? '';\n }\n\n public get formula(): string {\n if (this._inputValue !== null) {\n return this._inputValue;\n }\n if (!this.hasFormula) {\n return '';\n }\n const serialized = this._schemaModel.serializeFormula(this._node.id());\n if (serialized) {\n return serialized;\n }\n return this.rawExpression;\n }\n\n public get inputValue(): string | null {\n return this._inputValue;\n }\n\n public get inputError(): string | null {\n return this._inputError;\n }\n\n public get schemaError(): string | undefined {\n const errors = this._schemaModel.formulaErrors;\n const error = errors.find((e) => e.nodeId === this._node.id());\n return error?.message;\n }\n\n public get hasError(): boolean {\n return this._inputError !== null || this.schemaError !== undefined;\n }\n\n public get errorMessage(): string | undefined {\n return this._inputError ?? this.schemaError;\n }\n\n public setInputValue(value: string): void {\n this._inputValue = value;\n this._inputError = null;\n }\n\n public clearInput(): void {\n this._inputValue = null;\n this._inputError = null;\n }\n\n private hasFormulaErrorForNode(): boolean {\n const errors = this._schemaModel.formulaErrors;\n return errors.some((e) => e.nodeId === this._node.id());\n }\n\n public applyFormula(): boolean {\n if (this._inputValue === null) {\n return true;\n }\n\n const trimmed = this._inputValue.trim();\n\n try {\n this._schemaModel.updateFormula(this._node.id(), trimmed || undefined);\n\n if (this.hasFormulaErrorForNode()) {\n return false;\n }\n\n this.clearInput();\n return true;\n } catch (error) {\n runInAction(() => {\n this._inputError =\n error instanceof Error ? error.message : 'Invalid formula';\n });\n return false;\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode, SchemaModel } from '@revisium/schema-toolkit';\nimport type { NodeFormula } from './NodeFormula';\n\nexport class NodeValidation {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n private readonly _formula: NodeFormula,\n private readonly _getTableIdError: () => string | null,\n private readonly _isRoot: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get schemaError(): string | undefined {\n const errors = this._schemaModel.validationErrors;\n const error = errors.find((e) => e.nodeId === this._node.id());\n return error?.message;\n }\n\n public get tableIdError(): string | null {\n if (this._isRoot) {\n return this._getTableIdError();\n }\n return null;\n }\n\n public get formulaError(): string | undefined {\n return this._formula.errorMessage;\n }\n\n public get hasError(): boolean {\n return (\n this.schemaError !== undefined ||\n this.tableIdError !== null ||\n this.formulaError !== undefined\n );\n }\n\n public get errorMessage(): string | undefined {\n return this.schemaError ?? this.tableIdError ?? this.formulaError;\n }\n}\n","import type { FieldType } from '@revisium/schema-toolkit';\n\nconst TYPE_ID_TO_FIELD_TYPE: Record<string, FieldType> = {\n String: 'string',\n Number: 'number',\n Boolean: 'boolean',\n Object: 'object',\n Array: 'array',\n};\n\nexport function typeIdToFieldType(typeId: string): FieldType | null {\n return TYPE_ID_TO_FIELD_TYPE[typeId] ?? null;\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n SystemSchemaIds,\n type SchemaNode,\n type SchemaModel,\n} from '@revisium/schema-toolkit';\nimport { typeIdToFieldType } from '../utils/typeIdMapping';\n\nexport interface NodeActionsCallbacks {\n renameTable: (name: string) => void;\n onNodeRemoved: (nodeId: string) => void;\n onNodeAdded: (nodeId: string) => void;\n onNodeReplaced: (oldNodeId: string, newNodeId: string) => void;\n selectForeignKey: () => Promise<string | null>;\n}\n\nexport class NodeActions {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n private readonly _callbacks: NodeActionsCallbacks,\n private readonly _isRoot: boolean,\n private readonly _isReadonly: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get canRemove(): boolean {\n return !this._isReadonly && !this._isRoot;\n }\n\n public get canAddProperty(): boolean {\n return !this._isReadonly && this._node.isObject();\n }\n\n public rename(newName: string): void {\n if (this._isReadonly) {\n return;\n }\n\n if (this._isRoot) {\n this._callbacks.renameTable(newName);\n return;\n }\n\n if (newName !== this._node.name()) {\n this._schemaModel.renameField(this._node.id(), newName);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isReadonly || this._isRoot) {\n return;\n }\n\n if (typeId === 'ForeignKeyString') {\n this.changeToForeignKey();\n return;\n }\n\n if (typeId === 'Markdown') {\n this.changeToMarkdown();\n return;\n }\n\n const refUri = this.typeIdToRefUri(typeId);\n if (refUri) {\n const oldNodeId = this._node.id();\n const newNode = this._schemaModel.changeFieldType(oldNodeId, {\n $ref: refUri,\n });\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (!fieldType) {\n return;\n }\n\n const oldNodeId = this._node.id();\n const newNode = this._schemaModel.changeFieldType(oldNodeId, fieldType);\n\n if (!newNode.isNull()) {\n this._schemaModel.updateForeignKey(newNode.id(), undefined);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n }\n\n private changeToForeignKey(): void {\n const oldNodeId = this._node.id();\n let nodeId = oldNodeId;\n\n if (this._node.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n nodeId = newNode.id();\n }\n\n this._schemaModel.updateForeignKey(nodeId, '');\n this._callbacks.onNodeReplaced(oldNodeId, nodeId);\n }\n\n private changeToMarkdown(): void {\n const oldNodeId = this._node.id();\n let node = this._node;\n\n if (node.nodeType() !== 'string') {\n node = this._schemaModel.changeFieldType(oldNodeId, 'string');\n }\n\n node.setContentMediaType('text/markdown');\n this._callbacks.onNodeReplaced(oldNodeId, node.id());\n }\n\n public remove(): void {\n if (this._isReadonly || this._isRoot) {\n return;\n }\n\n const nodeId = this._node.id();\n const removed = this._schemaModel.removeField(nodeId);\n\n if (removed) {\n this._callbacks.onNodeRemoved(nodeId);\n }\n }\n\n public addProperty(name: string = ''): SchemaNode | null {\n if (this._isReadonly || !this._node.isObject()) {\n return null;\n }\n\n const newNode = this._schemaModel.addField(this._node.id(), name, 'string');\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeAdded(newNode.id());\n return newNode;\n }\n\n return null;\n }\n\n public insertFieldAt(index: number, name: string): SchemaNode | null {\n if (this._isReadonly || !this._node.isObject()) {\n return null;\n }\n\n const newNode = this._schemaModel.insertFieldAt(\n this._node.id(),\n index,\n name,\n 'string',\n );\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeAdded(newNode.id());\n return newNode;\n }\n\n return null;\n }\n\n public setDescription(description: string | undefined): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateMetadata(this._node.id(), {\n description: description || undefined,\n });\n }\n\n public setDeprecated(deprecated: boolean): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateMetadata(this._node.id(), {\n deprecated: deprecated || undefined,\n });\n }\n\n public setDefaultValue(value: unknown): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateDefaultValue(this._node.id(), value);\n }\n\n public setForeignKey(tableId: string | undefined): void {\n if (this._isReadonly) {\n return;\n }\n\n if (tableId === undefined) {\n this._schemaModel.updateForeignKey(this._node.id(), undefined);\n return;\n }\n\n if (this._node.foreignKey() === undefined) {\n const oldNodeId = this._node.id();\n if (this._node.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n this._schemaModel.updateForeignKey(newNode.id(), tableId);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n } else {\n this._schemaModel.updateForeignKey(oldNodeId, tableId);\n }\n } else {\n this._schemaModel.updateForeignKey(this._node.id(), tableId);\n }\n }\n\n public changeItemsType(typeId: string): void {\n if (this._isReadonly || !this._node.isArray()) {\n return;\n }\n\n const items = this._node.items();\n if (items.isNull()) {\n return;\n }\n\n const oldNodeId = items.id();\n\n if (typeId === 'ForeignKeyString') {\n this.changeItemsToForeignKey(items, oldNodeId);\n return;\n }\n\n if (typeId === 'Markdown') {\n this.changeItemsToMarkdown(items, oldNodeId);\n return;\n }\n\n const refUri = this.typeIdToRefUri(typeId);\n if (refUri) {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, {\n $ref: refUri,\n });\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (!fieldType) {\n return;\n }\n\n const newNode = this._schemaModel.changeFieldType(oldNodeId, fieldType);\n\n if (!newNode.isNull()) {\n this._schemaModel.updateForeignKey(newNode.id(), undefined);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n }\n\n private changeItemsToForeignKey(items: SchemaNode, oldNodeId: string): void {\n let nodeId = oldNodeId;\n\n if (items.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n nodeId = newNode.id();\n }\n\n this._schemaModel.updateForeignKey(nodeId, '');\n this._callbacks.onNodeReplaced(oldNodeId, nodeId);\n }\n\n private changeItemsToMarkdown(items: SchemaNode, oldNodeId: string): void {\n let node = items;\n\n if (items.nodeType() !== 'string') {\n node = this._schemaModel.changeFieldType(oldNodeId, 'string');\n }\n\n node.setContentMediaType('text/markdown');\n this._callbacks.onNodeReplaced(oldNodeId, node.id());\n }\n\n public async selectForeignKey(): Promise<void> {\n const tableId = await this._callbacks.selectForeignKey();\n if (tableId !== null) {\n this.setForeignKey(tableId);\n }\n }\n\n private typeIdToRefUri(typeId: string): string | null {\n const mapping: Record<string, string> = {\n File: SystemSchemaIds.File,\n RowId: SystemSchemaIds.RowId,\n RowCreatedId: SystemSchemaIds.RowCreatedId,\n RowVersionId: SystemSchemaIds.RowVersionId,\n RowCreatedAt: SystemSchemaIds.RowCreatedAt,\n RowPublishedAt: SystemSchemaIds.RowPublishedAt,\n RowUpdatedAt: SystemSchemaIds.RowUpdatedAt,\n RowHash: SystemSchemaIds.RowHash,\n RowSchemaHash: SystemSchemaIds.RowSchemaHash,\n };\n return mapping[typeId] ?? null;\n }\n}\n","import type { SchemaNode, SchemaModel } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\nimport { NodeState } from './NodeState';\nimport { NodeLabel } from './NodeLabel';\nimport { NodeFormula } from './NodeFormula';\nimport { NodeValidation } from './NodeValidation';\nimport { NodeActions, type NodeActionsCallbacks } from './NodeActions';\nimport { NodeAccessor } from './NodeAccessor';\n\nexport interface NodeAccessorDependencies {\n state: NodeState;\n label: NodeLabel;\n formula: NodeFormula;\n validation: NodeValidation;\n actions: NodeActions;\n}\n\nexport interface NodeAccessorContext {\n schemaModel: SchemaModel;\n treeState: TreeState;\n getTableId: () => string;\n getTableIdError: () => string | null;\n callbacks: NodeActionsCallbacks;\n}\n\nexport class NodeAccessorFactory {\n public create(\n node: SchemaNode,\n context: NodeAccessorContext,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ): NodeAccessor {\n const state = new NodeState(node.id(), context.treeState);\n const label = new NodeLabel(node, context.getTableId, isRoot);\n const formula = new NodeFormula(node, context.schemaModel);\n const validation = new NodeValidation(\n node,\n context.schemaModel,\n formula,\n context.getTableIdError,\n isRoot,\n );\n const actions = new NodeActions(\n node,\n context.schemaModel,\n context.callbacks,\n isRoot,\n isReadonly,\n );\n\n return new NodeAccessor(\n node,\n { state, label, formula, validation, actions },\n isRoot,\n isReadonly,\n );\n }\n}\n","import type { SchemaModel } from '@revisium/schema-toolkit';\nimport {\n NodeAccessor,\n NodeAccessorFactory,\n type NodeAccessorContext,\n} from '../accessor';\n\nexport class AccessorCache {\n private readonly _cache = new Map<string, NodeAccessor>();\n\n constructor(\n private readonly _getSchemaModel: () => SchemaModel,\n private readonly _getContext: () => NodeAccessorContext,\n private readonly _accessorFactory: NodeAccessorFactory,\n ) {}\n\n public get(\n nodeId: string,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ): NodeAccessor {\n const cached = this._cache.get(nodeId);\n if (cached) {\n return cached;\n }\n\n const node = this._getSchemaModel().nodeById(nodeId);\n const accessor = this._accessorFactory.create(\n node,\n this._getContext(),\n isRoot,\n isReadonly,\n );\n this._cache.set(nodeId, accessor);\n return accessor;\n }\n\n public getChildren(\n parentNodeId: string,\n parentIsReadonly: boolean = false,\n ): NodeAccessor[] {\n const parentNode = this._getSchemaModel().nodeById(parentNodeId);\n if (parentNode.isNull()) {\n return [];\n }\n\n const childrenReadonly = parentIsReadonly || parentNode.isRef();\n\n if (parentNode.isObject()) {\n return parentNode\n .properties()\n .map((child) => this.get(child.id(), false, childrenReadonly));\n }\n\n if (parentNode.isArray()) {\n const items = parentNode.items();\n if (!items.isNull()) {\n return [this.get(items.id(), false, childrenReadonly)];\n }\n }\n\n return [];\n }\n\n public delete(nodeId: string): void {\n this._cache.delete(nodeId);\n }\n\n public clear(): void {\n this._cache.clear();\n }\n\n public entries(): IterableIterator<[string, NodeAccessor]> {\n return this._cache.entries();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n TableModel,\n SchemaValidationError,\n TreeFormulaValidationError,\n} from '@revisium/schema-toolkit';\nimport type { AccessorCache } from './AccessorCache';\n\nexport class ValidationTracker {\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _accessorCache: AccessorCache,\n private readonly _getTableIdError: () => string | null,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get validationErrors(): readonly SchemaValidationError[] {\n return this._tableModel.schema.validationErrors;\n }\n\n public get formulaErrors(): TreeFormulaValidationError[] {\n const schemaErrors = this._tableModel.schema.formulaErrors;\n const inputErrors = this.collectFormulaInputErrors();\n return [...schemaErrors, ...inputErrors];\n }\n\n public get tableIdError(): string | null {\n return this._getTableIdError();\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public get errorsCount(): number {\n let count = this.validationErrors.length + this.formulaErrors.length;\n if (this.tableIdError !== null) {\n count += 1;\n }\n return count;\n }\n\n public collectFormulaInputErrors(): TreeFormulaValidationError[] {\n const errors: TreeFormulaValidationError[] = [];\n for (const [nodeId, accessor] of this._accessorCache.entries()) {\n const error = accessor.formula.inputError;\n if (error) {\n errors.push({\n nodeId,\n fieldPath: accessor.label.name || undefined,\n message: error,\n });\n }\n }\n return errors;\n }\n}\n","import { makeAutoObservable } from 'mobx';\n\nexport type ViewMode = 'Tree' | 'Json' | 'RefBy';\n\nexport class ViewState {\n private _viewMode: ViewMode = 'Tree';\n private _loading = false;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get viewMode(): ViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public setLoading(value: boolean): void {\n this._loading = value;\n }\n}\n","export type DataLossSeverity = 'none' | 'possible' | 'certain';\n\nexport interface TransformationStep {\n name: string;\n dataLossSeverity: DataLossSeverity;\n}\n\nexport interface TransformationInfo {\n fromType: string;\n toType: string;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n steps: TransformationStep[];\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface TransformationRule {\n fromType: SchemaType;\n toType: SchemaType;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n stepName: string;\n}\n\ninterface TransformationContext {\n fromType: SchemaType;\n toType: SchemaType;\n fromItemsType?: SchemaType;\n toItemsType?: SchemaType;\n}\n\nconst transformationRules: TransformationRule[] = [\n {\n fromType: 'number',\n toType: 'string',\n example: { before: 123, after: '123' },\n dataLossSeverity: 'none',\n stepName: 'number → string',\n },\n {\n fromType: 'boolean',\n toType: 'string',\n example: { before: true, after: 'true' },\n dataLossSeverity: 'none',\n stepName: 'boolean → string',\n },\n {\n fromType: 'boolean',\n toType: 'number',\n example: { before: true, after: 1 },\n dataLossSeverity: 'none',\n stepName: 'boolean → number',\n },\n {\n fromType: 'string',\n toType: 'number',\n example: { before: '123', after: 123 },\n dataLossSeverity: 'possible',\n stepName: 'string → number',\n },\n {\n fromType: 'string',\n toType: 'boolean',\n example: { before: 'hello', after: true },\n dataLossSeverity: 'possible',\n stepName: 'string → boolean',\n },\n {\n fromType: 'number',\n toType: 'boolean',\n example: { before: 42, after: true },\n dataLossSeverity: 'possible',\n stepName: 'number → boolean',\n },\n {\n fromType: 'object',\n toType: 'string',\n example: { before: { a: 1 }, after: '' },\n dataLossSeverity: 'certain',\n stepName: 'object → string',\n },\n {\n fromType: 'object',\n toType: 'number',\n example: { before: { a: 1 }, after: 0 },\n dataLossSeverity: 'certain',\n stepName: 'object → number',\n },\n {\n fromType: 'object',\n toType: 'boolean',\n example: { before: { a: 1 }, after: false },\n dataLossSeverity: 'certain',\n stepName: 'object → boolean',\n },\n {\n fromType: 'array',\n toType: 'string',\n example: { before: ['a', 'b'], after: 'a' },\n dataLossSeverity: 'possible',\n stepName: 'array → string (first element)',\n },\n {\n fromType: 'array',\n toType: 'number',\n example: { before: [1, 2], after: 1 },\n dataLossSeverity: 'possible',\n stepName: 'array → number (first element)',\n },\n {\n fromType: 'array',\n toType: 'boolean',\n example: { before: [true, false], after: true },\n dataLossSeverity: 'possible',\n stepName: 'array → boolean (first element)',\n },\n {\n fromType: 'string',\n toType: 'object',\n example: { before: 'hello', after: {} },\n dataLossSeverity: 'certain',\n stepName: 'string → object',\n },\n {\n fromType: 'number',\n toType: 'object',\n example: { before: 42, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'number → object',\n },\n {\n fromType: 'boolean',\n toType: 'object',\n example: { before: true, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'boolean → object',\n },\n {\n fromType: 'string',\n toType: 'array',\n example: { before: 'hello', after: ['hello'] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'number',\n toType: 'array',\n example: { before: 42, after: [42] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'boolean',\n toType: 'array',\n example: { before: true, after: [true] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'object',\n toType: 'array',\n example: { before: { a: 1 }, after: [] },\n dataLossSeverity: 'certain',\n stepName: 'object → array',\n },\n {\n fromType: 'array',\n toType: 'object',\n example: { before: [1, 2], after: {} },\n dataLossSeverity: 'certain',\n stepName: 'array → object',\n },\n];\n\nconst sampleValues: Record<SchemaType, unknown> = {\n string: 'hello',\n number: 42,\n boolean: true,\n object: { a: 1 },\n array: [1, 2],\n ref: null,\n unknown: null,\n};\n\nconst validSchemaTypes = new Set<SchemaType>([\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'array',\n 'ref',\n 'unknown',\n]);\n\nfunction toSchemaType(typeStr: string): SchemaType {\n return validSchemaTypes.has(typeStr as SchemaType)\n ? (typeStr as SchemaType)\n : 'unknown';\n}\n\nfunction parseTypeString(typeStr: string): {\n baseType: SchemaType;\n itemsType?: SchemaType;\n} {\n const arrayMatch = /^array<(.+)>$/.exec(typeStr);\n if (arrayMatch?.[1]) {\n return { baseType: 'array', itemsType: toSchemaType(arrayMatch[1]) };\n }\n return { baseType: toSchemaType(typeStr) };\n}\n\nfunction findTransformationRule(\n fromType: SchemaType,\n toType: SchemaType,\n): TransformationRule | null {\n if (fromType === toType) {\n return null;\n }\n return (\n transformationRules.find(\n (rule) => rule.fromType === fromType && rule.toType === toType,\n ) ?? null\n );\n}\n\nfunction transformValue(\n value: unknown,\n fromType: SchemaType,\n toType: SchemaType,\n): unknown {\n if (fromType === toType) {\n return value;\n }\n switch (toType) {\n case 'string':\n return String(value);\n case 'number':\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return typeof value === 'number' ? value : 0;\n case 'boolean':\n return Boolean(value);\n default:\n return value;\n }\n}\n\nfunction getConversionSeverity(\n fromType: SchemaType,\n toType: SchemaType,\n): DataLossSeverity {\n if (fromType === toType) {\n return 'none';\n }\n const rule = findTransformationRule(fromType, toType);\n return rule ? rule.dataLossSeverity : 'certain';\n}\n\nfunction maxSeverity(\n a: DataLossSeverity,\n b: DataLossSeverity,\n): DataLossSeverity {\n const order: DataLossSeverity[] = ['none', 'possible', 'certain'];\n return order[Math.max(order.indexOf(a), order.indexOf(b))] ?? 'certain';\n}\n\nfunction computeOverallSeverity(steps: TransformationStep[]): DataLossSeverity {\n return steps.reduce<DataLossSeverity>(\n (acc, step) => maxSeverity(acc, step.dataLossSeverity),\n 'none',\n );\n}\n\nfunction buildTransformationSteps(\n ctx: TransformationContext,\n): TransformationStep[] {\n const { fromType, toType, fromItemsType, toItemsType } = ctx;\n const steps: TransformationStep[] = [];\n\n if (\n toType === 'array' &&\n toItemsType !== undefined &&\n fromType !== 'array' &&\n fromType !== 'object'\n ) {\n steps.push({ name: 'wrap in array', dataLossSeverity: 'none' });\n if (fromType !== toItemsType) {\n const severity = getConversionSeverity(fromType, toItemsType);\n steps.push({\n name: `${fromType} → ${toItemsType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'array' &&\n fromItemsType !== undefined &&\n toType !== 'array' &&\n toType !== 'object'\n ) {\n steps.push({\n name: 'unwrap array (first element)',\n dataLossSeverity: 'possible',\n });\n if (fromItemsType !== toType) {\n const severity = getConversionSeverity(fromItemsType, toType);\n steps.push({\n name: `${fromItemsType} → ${toType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'object' ||\n toType === 'object' ||\n fromType === 'array' ||\n toType === 'array'\n ) {\n steps.push({\n name: `${fromType} → ${toType}`,\n dataLossSeverity: 'certain',\n });\n } else {\n const severity = getConversionSeverity(fromType, toType);\n steps.push({ name: `${fromType} → ${toType}`, dataLossSeverity: severity });\n }\n\n return steps;\n}\n\nfunction computeArrayTransformationExample(\n fromType: SchemaType,\n itemsType: SchemaType,\n): { before: unknown; after: unknown } {\n const before = sampleValues[fromType];\n const transformedValue = transformValue(before, fromType, itemsType);\n return { before, after: [transformedValue] };\n}\n\nfunction computeArrayToPrimitiveExample(\n fromItemsType: SchemaType,\n toType: SchemaType,\n): { before: unknown; after: unknown } {\n const itemValue = sampleValues[fromItemsType];\n const before = [itemValue, itemValue];\n const after = transformValue(itemValue, fromItemsType, toType);\n return { before, after };\n}\n\nexport function getTransformationInfoFromTypeChange(\n fromType: string,\n toType: string,\n): TransformationInfo | null {\n if (fromType === toType) {\n return null;\n }\n\n const from = parseTypeString(fromType);\n const to = parseTypeString(toType);\n\n if (from.baseType === 'unknown' || to.baseType === 'unknown') {\n return null;\n }\n\n if (\n to.baseType === 'array' &&\n to.itemsType &&\n from.baseType !== 'array' &&\n from.baseType !== 'object'\n ) {\n const example = computeArrayTransformationExample(\n from.baseType,\n to.itemsType,\n );\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n toItemsType: to.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n if (\n from.baseType === 'array' &&\n from.itemsType &&\n to.baseType !== 'array' &&\n to.baseType !== 'object'\n ) {\n const example = computeArrayToPrimitiveExample(from.itemsType, to.baseType);\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n fromItemsType: from.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n const rule = findTransformationRule(from.baseType, to.baseType);\n if (rule) {\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n });\n return {\n fromType,\n toType,\n example: rule.example,\n dataLossSeverity: rule.dataLossSeverity,\n steps,\n };\n }\n\n return {\n fromType,\n toType,\n example: { before: '?', after: '?' },\n dataLossSeverity: 'certain',\n steps: [\n {\n name: `${from.baseType} → ${to.baseType}`,\n dataLossSeverity: 'certain',\n },\n ],\n };\n}\n","import type { JsonPatch } from '@revisium/schema-toolkit';\nimport { generateDefaultValue } from '@revisium/schema-toolkit';\n\nexport interface DefaultValueExample {\n value: unknown;\n type: string;\n foreignKeyTableId?: string;\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface SchemaLike {\n $ref?: string;\n type?: string;\n foreignKey?: string;\n}\n\nfunction getTypeFromSchema(schema: SchemaLike): SchemaType {\n if (schema.$ref) {\n return 'ref';\n }\n if (schema.type) {\n return schema.type as SchemaType;\n }\n return 'unknown';\n}\n\nfunction getForeignKeyTableId(schema: SchemaLike): string | undefined {\n if (schema.type === 'string' && schema.foreignKey) {\n return schema.foreignKey || undefined;\n }\n return undefined;\n}\n\nexport function getDefaultValueExample(\n patch: JsonPatch,\n): DefaultValueExample | null {\n if (patch.op !== 'add' || patch.value === undefined) {\n return null;\n }\n\n const schema = patch.value as SchemaLike;\n const value = generateDefaultValue(patch.value, { arrayItemCount: 1 });\n const type = getTypeFromSchema(schema);\n const foreignKeyTableId = getForeignKeyTableId(schema);\n\n return { value, type, foreignKeyTableId };\n}\n","import type { SchemaNode } from '@revisium/schema-toolkit';\n\nexport function traverseTree(\n root: SchemaNode,\n visitor: (node: SchemaNode) => void,\n): void {\n if (root.isNull()) {\n return;\n }\n visitor(root);\n if (root.isObject()) {\n for (const child of root.properties()) {\n traverseTree(child, visitor);\n }\n } else if (root.isArray()) {\n const items = root.items();\n if (!items.isNull()) {\n traverseTree(items, visitor);\n }\n }\n}\n","import type { SchemaModel, SchemaNode } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\n\nexport class TreeNavigator {\n constructor(\n private readonly _getSchemaModel: () => SchemaModel,\n private readonly _treeState: TreeState,\n ) {}\n\n public visibleNodeIds(): string[] {\n const root = this._getSchemaModel().root;\n if (root.isNull()) {\n return [];\n }\n const ids: string[] = [];\n this.collectVisibleNodes(root, ids, true);\n return ids;\n }\n\n public findParentId(nodeId: string): string | null {\n const root = this._getSchemaModel().root;\n if (root.isNull()) {\n return null;\n }\n return this.findParentInTree(root, nodeId);\n }\n\n public isRootId(nodeId: string): boolean {\n return this._getSchemaModel().root.id() === nodeId;\n }\n\n public getNode(nodeId: string): SchemaNode {\n return this._getSchemaModel().nodeById(nodeId);\n }\n\n public nodeHasChildren(node: SchemaNode): boolean {\n if (node.isObject()) {\n return node.properties().length > 0;\n }\n if (node.isArray()) {\n return !node.items().isNull();\n }\n return false;\n }\n\n public getFirstChildId(node: SchemaNode): string | null {\n if (node.isObject()) {\n const first = node.properties()[0];\n if (first) {\n return first.id();\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n return items.id();\n }\n }\n return null;\n }\n\n private collectVisibleNodes(\n node: SchemaNode,\n ids: string[],\n isRoot: boolean,\n ): void {\n if (node.isNull()) {\n return;\n }\n\n ids.push(node.id());\n\n if (!isRoot && !this._treeState.isExpanded(node.id())) {\n return;\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectVisibleNodes(child, ids, false);\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectVisibleNodes(items, ids, false);\n }\n }\n }\n\n private findParentInTree(node: SchemaNode, targetId: string): string | null {\n if (node.isNull()) {\n return null;\n }\n\n if (node.isObject()) {\n return this.findParentInObject(node, targetId);\n }\n\n if (node.isArray()) {\n return this.findParentInArray(node, targetId);\n }\n\n return null;\n }\n\n private findParentInObject(\n node: SchemaNode,\n targetId: string,\n ): string | null {\n for (const child of node.properties()) {\n if (child.id() === targetId) {\n return node.id();\n }\n const found = this.findParentInTree(child, targetId);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n private findParentInArray(node: SchemaNode, targetId: string): string | null {\n const items = node.items();\n if (items.isNull()) {\n return null;\n }\n if (items.id() === targetId) {\n return node.id();\n }\n return this.findParentInTree(items, targetId);\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaModel } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\nimport { traverseTree } from '../utils';\n\nexport class CollapseManager {\n constructor(\n private readonly _treeState: TreeState,\n private readonly _getSchemaModel: () => SchemaModel,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public collapseAll(): void {\n const nodeIds = this.collectAllNodeIds();\n this._treeState.collapseAll(nodeIds, true);\n }\n\n public expandAll(): void {\n const nodeIds = this.collectAllNodeIds();\n this._treeState.expandAll(nodeIds);\n }\n\n public collapseIfComplex(threshold: number): void {\n const nodeCount = this._getSchemaModel().nodeCount;\n if (nodeCount >= threshold) {\n this.collapseAll();\n }\n }\n\n public collapseRefNodes(): void {\n const refNodeIds = this.collectRefNodeIds();\n for (const nodeId of refNodeIds) {\n this._treeState.setExpanded(nodeId, false);\n }\n }\n\n private collectRefNodeIds(): string[] {\n const ids: string[] = [];\n traverseTree(this._getSchemaModel().root, (node) => {\n if (node.isRef() && (node.isObject() || node.isArray())) {\n ids.push(node.id());\n }\n });\n return ids;\n }\n\n private collectAllNodeIds(): string[] {\n const ids: string[] = [];\n traverseTree(this._getSchemaModel().root, (node) => {\n ids.push(node.id());\n });\n return ids;\n }\n}\n","import { makeAutoObservable, reaction, type IReactionDisposer } from 'mobx';\nimport type { TreeState } from '../state/TreeState';\nimport type { AccessorCache } from './AccessorCache';\nimport type { TreeNavigator } from '../utils/TreeNavigator';\n\nexport type KeyboardMode = 'TREE_NAV' | 'EDIT_NAME';\n\ninterface KeyboardEvent {\n key: string;\n shiftKey: boolean;\n preventDefault: () => void;\n}\n\nexport class KeyboardNavigation {\n private _mode: KeyboardMode = 'TREE_NAV';\n private _skipNextEscape = false;\n private _suppressNextReturnFocus = false;\n private _containerRef: HTMLElement | null = null;\n private readonly _disposers: IReactionDisposer[] = [];\n\n constructor(\n private readonly _treeState: TreeState,\n private readonly _navigator: TreeNavigator,\n private readonly _accessors: AccessorCache,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n\n this._disposers.push(\n reaction(\n () => {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return false;\n }\n return this._treeState.isFocused(activeId);\n },\n (isFocused, wasFocused) => {\n if (isFocused && !wasFocused) {\n this._mode = 'EDIT_NAME';\n }\n if (!isFocused && wasFocused) {\n this._mode = 'TREE_NAV';\n this._skipNextEscape = true;\n if (this._suppressNextReturnFocus) {\n this._suppressNextReturnFocus = false;\n } else {\n this.deferReturnFocus();\n }\n }\n },\n ),\n );\n }\n\n public get mode(): KeyboardMode {\n return this._mode;\n }\n\n public get visibleNodeIds(): string[] {\n return this._navigator.visibleNodeIds();\n }\n\n public handleKeyDown(event: KeyboardEvent): void {\n if (this._mode !== 'TREE_NAV') {\n return;\n }\n\n if (event.key !== 'Escape') {\n this._skipNextEscape = false;\n }\n\n if (event.key === 'Tab' && event.shiftKey) {\n event.preventDefault();\n this.moveToPrev();\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n case 'Tab':\n event.preventDefault();\n this.moveToNext();\n return;\n case 'ArrowUp':\n event.preventDefault();\n this.moveToPrev();\n return;\n case 'ArrowRight':\n event.preventDefault();\n this.expandOrMoveToChild();\n return;\n case 'ArrowLeft':\n event.preventDefault();\n this.collapseOrMoveToParent();\n return;\n case ' ':\n event.preventDefault();\n this.toggleExpand();\n return;\n case 'Enter':\n case 'F2':\n case 'i':\n event.preventDefault();\n this.enterEditMode();\n return;\n case 'Insert':\n event.preventDefault();\n this.insertField();\n return;\n case 'Delete':\n case 'Backspace':\n event.preventDefault();\n this.removeNode();\n return;\n case 'Escape':\n event.preventDefault();\n if (this._skipNextEscape) {\n this._skipNextEscape = false;\n return;\n }\n this.deactivateOrRemoveEmpty();\n return;\n }\n }\n\n public setContainerRef(el: HTMLElement | null): void {\n if (this._containerRef && !el) {\n document.removeEventListener('mousedown', this.handleNativeMouseDown);\n }\n this._containerRef = el;\n if (this._containerRef) {\n document.addEventListener('mousedown', this.handleNativeMouseDown);\n }\n }\n\n public returnFocus(): void {\n if (\n this._containerRef &&\n !this._containerRef.contains(document.activeElement)\n ) {\n this._containerRef.focus();\n }\n }\n\n public deactivate(): void {\n this._treeState.setActiveNodeId(null);\n }\n\n private readonly handleNativeMouseDown = (event: Event): void => {\n this._skipNextEscape = false;\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n if (this._containerRef?.contains(target)) {\n this._suppressNextReturnFocus = true;\n if (!target.closest('[data-node-id]')) {\n this._treeState.setActiveNodeId(null);\n }\n return;\n }\n const isInsideOverlay = target.closest(\n '[role=\"menu\"], [role=\"listbox\"], [role=\"dialog\"]',\n );\n if (isInsideOverlay) {\n this._suppressNextReturnFocus = true;\n } else {\n this._treeState.setActiveNodeId(null);\n }\n };\n\n public handleEditEnter(): void {\n this.insertField();\n }\n\n public handleNodeAdded(nodeId: string): void {\n this._treeState.setActiveNodeId(nodeId);\n }\n\n public handleNodeReplaced(oldId: string, newId: string): void {\n if (this._treeState.activeNodeId === oldId) {\n this._treeState.setActiveNodeId(newId);\n if (this._mode === 'EDIT_NAME') {\n this._mode = 'TREE_NAV';\n }\n this.deferReturnFocus();\n }\n }\n\n private deferReturnFocus(): void {\n setTimeout(() => this.returnFocus(), 0);\n }\n\n public dispose(): void {\n for (const disposer of this._disposers) {\n disposer();\n }\n this._disposers.length = 0;\n this.setContainerRef(null);\n }\n\n private moveToNext(): void {\n const ids = this.visibleNodeIds;\n if (ids.length === 0) {\n return;\n }\n\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n const firstId = ids[0];\n if (firstId !== undefined) {\n this._treeState.setActiveNodeId(firstId);\n this.scrollToNode(firstId);\n }\n return;\n }\n\n const currentIndex = ids.indexOf(activeId);\n if (currentIndex === -1 || currentIndex >= ids.length - 1) {\n return;\n }\n\n const nextId = ids[currentIndex + 1];\n if (nextId !== undefined) {\n this._treeState.setActiveNodeId(nextId);\n this.scrollToNode(nextId);\n }\n }\n\n private moveToPrev(): void {\n const ids = this.visibleNodeIds;\n if (ids.length === 0) {\n return;\n }\n\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n const lastId = ids.at(-1);\n if (lastId !== undefined) {\n this._treeState.setActiveNodeId(lastId);\n this.scrollToNode(lastId);\n }\n return;\n }\n\n const currentIndex = ids.indexOf(activeId);\n if (currentIndex <= 0) {\n return;\n }\n\n const prevId = ids[currentIndex - 1];\n if (prevId !== undefined) {\n this._treeState.setActiveNodeId(prevId);\n this.scrollToNode(prevId);\n }\n }\n\n private expandOrMoveToChild(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n if (!this._navigator.nodeHasChildren(node)) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && !this._treeState.isExpanded(activeId)) {\n this._treeState.setExpanded(activeId, true);\n return;\n }\n\n const firstChild = this._navigator.getFirstChildId(node);\n if (firstChild) {\n this._treeState.setActiveNodeId(firstChild);\n this.scrollToNode(firstChild);\n }\n }\n\n private collapseOrMoveToParent(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (\n !isRoot &&\n this._navigator.nodeHasChildren(node) &&\n this._treeState.isExpanded(activeId)\n ) {\n this._treeState.setExpanded(activeId, false);\n return;\n }\n\n const parentId = this._navigator.findParentId(activeId);\n if (parentId) {\n this._treeState.setActiveNodeId(parentId);\n this.scrollToNode(parentId);\n }\n }\n\n private toggleExpand(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && this._navigator.nodeHasChildren(node)) {\n this._treeState.toggleExpanded(activeId);\n }\n }\n\n private insertField(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n const accessor = this._accessors.get(activeId);\n accessor.actions.insertFieldAt(0, '');\n return;\n }\n\n const parentId = this._navigator.findParentId(activeId);\n if (!parentId) {\n return;\n }\n\n const parentNode = this._navigator.getNode(parentId);\n if (parentNode.isNull() || !parentNode.isObject()) {\n return;\n }\n\n const siblings = parentNode.properties();\n const currentIndex = siblings.findIndex((s) => s.id() === activeId);\n if (currentIndex === -1) {\n return;\n }\n\n const parentAccessor = this._accessors.get(parentId);\n parentAccessor.actions.insertFieldAt(currentIndex + 1, '');\n }\n\n private enterEditMode(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n this._treeState.requestFocus(activeId);\n }\n\n private deactivateOrRemoveEmpty(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && !node.isNull() && !node.name()) {\n this.removeNode();\n return;\n }\n\n this._treeState.setActiveNodeId(null);\n }\n\n private removeNode(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const accessor = this._accessors.get(activeId);\n if (!accessor.actions.canRemove) {\n return;\n }\n\n const ids = this.visibleNodeIds;\n const currentIndex = ids.indexOf(activeId);\n\n accessor.actions.remove();\n\n const updatedIds = this.visibleNodeIds;\n if (updatedIds.length === 0) {\n this._treeState.setActiveNodeId(null);\n return;\n }\n\n const nextIndex = Math.min(currentIndex, updatedIds.length - 1);\n const nextId = updatedIds[nextIndex];\n if (nextId !== undefined) {\n this._treeState.setActiveNodeId(nextId);\n }\n }\n\n private scrollToNode(nodeId: string): void {\n if (!this._containerRef) {\n return;\n }\n const el = this._containerRef.querySelector(`[data-node-id=\"${nodeId}\"]`);\n if (el) {\n el.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n}\n","import {\n fileSchema,\n rowIdSchema,\n rowCreatedIdSchema,\n rowVersionIdSchema,\n rowCreatedAtSchema,\n rowPublishedAtSchema,\n rowUpdatedAtSchema,\n rowHashSchema,\n rowSchemaHashSchema,\n SystemSchemaIds,\n type RefSchemas,\n} from '@revisium/schema-toolkit';\n\nexport const defaultRefSchemas: RefSchemas = {\n [SystemSchemaIds.File]: fileSchema,\n [SystemSchemaIds.RowId]: rowIdSchema,\n [SystemSchemaIds.RowCreatedId]: rowCreatedIdSchema,\n [SystemSchemaIds.RowVersionId]: rowVersionIdSchema,\n [SystemSchemaIds.RowCreatedAt]: rowCreatedAtSchema,\n [SystemSchemaIds.RowPublishedAt]: rowPublishedAtSchema,\n [SystemSchemaIds.RowUpdatedAt]: rowUpdatedAtSchema,\n [SystemSchemaIds.RowHash]: rowHashSchema,\n [SystemSchemaIds.RowSchemaHash]: rowSchemaHashSchema,\n};\n","import * as mobx from 'mobx';\nimport {\n setReactivityProvider,\n createMobxProvider,\n} from '@revisium/schema-toolkit/core';\n\nlet initialized = false;\n\nexport function ensureReactivityProvider(): void {\n if (initialized) {\n return;\n }\n initialized = true;\n setReactivityProvider(createMobxProvider(mobx));\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n createTableModel,\n type TableModel,\n type SchemaModel,\n type JsonObjectSchema,\n type SchemaPatch,\n type JsonPatch,\n type RefSchemas,\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from '@revisium/schema-toolkit';\nimport { TreeState } from '../state/TreeState';\nimport {\n NodeAccessor,\n NodeAccessorFactory,\n type NodeActionsCallbacks,\n} from '../accessor';\nimport { AccessorCache } from './AccessorCache';\nimport { ValidationTracker } from './ValidationTracker';\nimport { ViewState } from './ViewState';\nimport { CollapseManager } from './CollapseManager';\nimport { KeyboardNavigation } from './KeyboardNavigation';\nimport { defaultRefSchemas } from '../../config/system-schemas';\nimport { typeIdToFieldType } from '../utils/typeIdMapping';\nimport { TreeNavigator } from '../utils/TreeNavigator';\nimport { ensureReactivityProvider } from '../../../lib/initReactivity';\n\nconst DEFAULT_COLLAPSE_COMPLEXITY = 14;\n\nexport type ForeignKeySelectionCallback = () => Promise<string | null>;\n\nexport interface SchemaEditorCoreOptions {\n tableId?: string;\n refSchemas?: RefSchemas;\n collapseComplexSchemas?: boolean;\n collapseComplexity?: number;\n onCancel?: () => void;\n onSelectForeignKey?: ForeignKeySelectionCallback;\n}\n\nexport class SchemaEditorCore {\n private readonly _tableModel: TableModel;\n private readonly _treeState: TreeState;\n private readonly _onCancel: (() => void) | null;\n private readonly _onSelectForeignKey: ForeignKeySelectionCallback | null;\n\n public readonly accessors: AccessorCache;\n public readonly validation: ValidationTracker;\n public readonly view: ViewState;\n public readonly collapse: CollapseManager;\n public readonly keyboard: KeyboardNavigation;\n\n constructor(\n jsonSchema: JsonObjectSchema,\n options: SchemaEditorCoreOptions = {},\n accessorFactory: NodeAccessorFactory = new NodeAccessorFactory(),\n ) {\n ensureReactivityProvider();\n\n this._tableModel = createTableModel({\n tableId: options.tableId ?? '',\n schema: jsonSchema,\n refSchemas: options.refSchemas ?? defaultRefSchemas,\n });\n\n this._treeState = new TreeState();\n this._onCancel = options.onCancel ?? null;\n this._onSelectForeignKey = options.onSelectForeignKey ?? null;\n\n const callbacks: NodeActionsCallbacks = {\n renameTable: (name) => this.setTableId(name),\n onNodeRemoved: (nodeId) => this.handleNodeRemoved(nodeId),\n onNodeAdded: (nodeId) => this.handleNodeAdded(nodeId),\n onNodeReplaced: (oldId, newId) => this.handleNodeReplaced(oldId, newId),\n selectForeignKey: () => this.selectForeignKey(),\n };\n\n this.accessors = new AccessorCache(\n () => this._tableModel.schema,\n () => ({\n schemaModel: this._tableModel.schema,\n treeState: this._treeState,\n getTableId: () => this._tableModel.tableId,\n getTableIdError: () => this.tableIdError,\n callbacks,\n }),\n accessorFactory,\n );\n\n this.validation = new ValidationTracker(\n this._tableModel,\n this.accessors,\n () => this.tableIdError,\n );\n\n this.view = new ViewState();\n this.collapse = new CollapseManager(\n this._treeState,\n () => this._tableModel.schema,\n );\n this.keyboard = new KeyboardNavigation(\n this._treeState,\n new TreeNavigator(() => this._tableModel.schema, this._treeState),\n this.accessors,\n );\n\n const shouldCollapse = options.collapseComplexSchemas ?? false;\n const complexity =\n options.collapseComplexity ?? DEFAULT_COLLAPSE_COMPLEXITY;\n if (shouldCollapse) {\n this.collapse.collapseIfComplex(complexity);\n }\n\n this.collapse.collapseRefNodes();\n\n makeAutoObservable(\n this,\n {\n accessors: false,\n validation: false,\n view: false,\n collapse: false,\n keyboard: false,\n },\n { autoBind: true },\n );\n }\n\n public get tableModel(): TableModel {\n return this._tableModel;\n }\n\n public get schemaModel(): SchemaModel {\n return this._tableModel.schema;\n }\n\n public get treeState(): TreeState {\n return this._treeState;\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get initialTableId(): string {\n return this._tableModel.baseTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableModel.isRenamed;\n }\n\n public get tableIdError(): string | null {\n const id = this._tableModel.tableId;\n if (id && !isValidFieldName(id)) {\n return FIELD_NAME_ERROR_MESSAGE;\n }\n return null;\n }\n\n public setTableId(value: string): void {\n this._tableModel.rename(value);\n }\n\n public get rootAccessor(): NodeAccessor {\n return this.accessors.get(this._tableModel.schema.root.id(), true);\n }\n\n public get isDirty(): boolean {\n return this._tableModel.isDirty;\n }\n\n public get isValid(): boolean {\n return (\n this._tableModel.schema.isValid &&\n this.tableIdError === null &&\n this._tableModel.tableId.length > 0\n );\n }\n\n public get patchesCount(): number {\n return this.getPatches().length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public markAsSaved(): void {\n this._tableModel.commit();\n this.accessors.clear();\n }\n\n public changeRootType(typeId: string): void {\n const currentRoot = this._tableModel.schema.root;\n if (currentRoot.isNull()) {\n return;\n }\n\n if (typeId === 'Array' && !currentRoot.isArray()) {\n const result = this._tableModel.schema.wrapRootInArray();\n if (result) {\n this.accessors.clear();\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (fieldType) {\n const result = this._tableModel.schema.replaceRoot(fieldType);\n if (result) {\n this.accessors.clear();\n }\n }\n }\n\n public async selectForeignKey(): Promise<string | null> {\n if (!this._onSelectForeignKey) {\n return null;\n }\n return this._onSelectForeignKey();\n }\n\n public cancel(): void {\n this._onCancel?.();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._tableModel.schema.patches;\n }\n\n public getJsonPatches(): JsonPatch[] {\n return this._tableModel.schema.jsonPatches;\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._tableModel.schema.plainSchema;\n }\n\n public moveNode(fromNodeId: string, toParentId: string): void {\n this._tableModel.schema.moveNode(fromNodeId, toParentId);\n this.accessors.delete(fromNodeId);\n }\n\n public revert(): void {\n this._tableModel.revert();\n this.accessors.clear();\n this._treeState.reset();\n }\n\n public dispose(): void {\n this.keyboard.dispose();\n this.accessors.clear();\n this._treeState.reset();\n }\n\n private handleNodeRemoved(nodeId: string): void {\n this.accessors.delete(nodeId);\n this._treeState.clearNode(nodeId);\n if (this._treeState.activeNodeId === nodeId) {\n this._treeState.setActiveNodeId(null);\n }\n }\n\n private handleNodeAdded(nodeId: string): void {\n this.collapseIfRefNode(nodeId);\n this.keyboard.handleNodeAdded(nodeId);\n }\n\n private handleNodeReplaced(oldNodeId: string, newNodeId: string): void {\n this.accessors.delete(oldNodeId);\n\n if (oldNodeId !== newNodeId) {\n this._treeState.clearNode(oldNodeId);\n }\n\n this._treeState.setMenuOpen(newNodeId, false);\n this.keyboard.handleNodeReplaced(oldNodeId, newNodeId);\n this.collapseIfRefNode(newNodeId);\n }\n\n private collapseIfRefNode(nodeId: string): void {\n const node = this._tableModel.schema.nodeById(nodeId);\n if (node.isRef() && (node.isObject() || node.isArray())) {\n this._treeState.setExpanded(nodeId, false);\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaModel } from '@revisium/schema-toolkit';\nimport type { SchemaEditorCore } from '../core';\nimport type { KeyboardNavigation } from '../core/KeyboardNavigation';\nimport type { NodeAccessor } from '../accessor';\n\nexport class SchemaTreeVM {\n constructor(private readonly _core: SchemaEditorCore) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get rootAccessor(): NodeAccessor {\n return this._core.rootAccessor;\n }\n\n public get schemaModel(): SchemaModel {\n return this._core.schemaModel;\n }\n\n public getChildAccessors(\n nodeId: string,\n parentIsReadonly: boolean = false,\n ): NodeAccessor[] {\n return this._core.accessors.getChildren(nodeId, parentIsReadonly);\n }\n\n public changeRootType(typeId: string): void {\n this._core.changeRootType(typeId);\n }\n\n public changeNodeType(accessor: NodeAccessor, typeId: string): void {\n if (accessor.isRoot) {\n this._core.changeRootType(typeId);\n } else {\n accessor.actions.changeType(typeId);\n }\n }\n\n public moveNode(fromNodeId: string, toParentId: string): void {\n this._core.moveNode(fromNodeId, toParentId);\n }\n\n public selectForeignKey(): Promise<string | null> {\n return this._core.selectForeignKey();\n }\n\n public get keyboard(): KeyboardNavigation {\n return this._core.keyboard;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n type TableModel,\n type JsonObjectSchema,\n} from '@revisium/schema-toolkit';\n\nexport type CreateTableViewMode = 'Example' | 'Schema';\n\nexport class CreateTableDialogVM {\n private _viewMode: CreateTableViewMode = 'Example';\n private _loading = false;\n\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _onApprove: () => Promise<void>,\n private readonly _onClose: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get viewMode(): CreateTableViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: CreateTableViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public get plainSchema(): JsonObjectSchema {\n return this._tableModel.schema.plainSchema;\n }\n\n public get exampleData(): unknown {\n return this._tableModel.schema.generateDefaultValue({ arrayItemCount: 1 });\n }\n\n public async approve(): Promise<void> {\n this._loading = true;\n try {\n await this._onApprove();\n } finally {\n this._loading = false;\n }\n }\n\n public close(): void {\n this._onClose();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n TableModel,\n SchemaValidationError,\n TreeFormulaValidationError,\n} from '@revisium/schema-toolkit';\n\nexport class ReviewErrorsDialogVM {\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _getTableIdError: () => string | null,\n private readonly _getFormulaInputErrors: () => TreeFormulaValidationError[],\n private readonly _onRevert?: () => void,\n private readonly _onClose?: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get canRevert(): boolean {\n return this._onRevert !== undefined;\n }\n\n public revert(): void {\n this._onRevert?.();\n this._onClose?.();\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get tableIdError(): string | null {\n return this._getTableIdError();\n }\n\n public get validationErrors(): readonly SchemaValidationError[] {\n return this._tableModel.schema.validationErrors;\n }\n\n public get formulaErrors(): TreeFormulaValidationError[] {\n const schemaErrors = this._tableModel.schema.formulaErrors;\n const inputErrors = this._getFormulaInputErrors();\n return [...schemaErrors, ...inputErrors];\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public get errorsCount(): number {\n let count = this.validationErrors.length + this.formulaErrors.length;\n if (this.tableIdError !== null) {\n count += 1;\n }\n return count;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { JsonObjectSchema } from '@revisium/schema-toolkit';\nimport {\n SchemaEditorCore,\n type SchemaEditorCoreOptions,\n type ViewMode,\n} from '../core';\nimport { SchemaTreeVM } from './SchemaTreeVM';\nimport { CreateTableDialogVM } from '../dialog/CreateTableDialogVM';\nimport { ReviewErrorsDialogVM } from '../dialog/ReviewErrorsDialogVM';\n\nexport type CreateDialogViewMode = 'Example' | 'Schema';\n\nexport interface CreatingEditorVMOptions extends SchemaEditorCoreOptions {\n onApprove?: () => Promise<boolean>;\n}\n\nexport class CreatingEditorVM {\n private readonly _core: SchemaEditorCore;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n\n public readonly tree: SchemaTreeVM;\n\n private _isErrorsDialogOpen = false;\n private _isCreateDialogOpen = false;\n private _createDialogViewMode: CreateDialogViewMode = 'Example';\n\n constructor(\n coreOrSchema: SchemaEditorCore | JsonObjectSchema,\n options: CreatingEditorVMOptions = {},\n ) {\n if (coreOrSchema instanceof SchemaEditorCore) {\n this._core = coreOrSchema;\n } else {\n this._core = new SchemaEditorCore(coreOrSchema, options);\n }\n this._onApprove = options.onApprove ?? null;\n this.tree = new SchemaTreeVM(this._core);\n\n makeAutoObservable(this, { tree: false }, { autoBind: true });\n }\n\n // ============ Mode ============\n\n public get mode(): 'creating' {\n return 'creating';\n }\n\n // ============ Table ID ============\n\n public get tableId(): string {\n return this._core.tableId;\n }\n\n public get initialTableId(): string {\n return this._core.initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._core.isTableIdChanged;\n }\n\n public get tableIdError(): string | null {\n return this._core.tableIdError;\n }\n\n public setTableId(value: string): void {\n this._core.setTableId(value);\n }\n\n // ============ State ============\n\n public get isDirty(): boolean {\n return this._core.isDirty;\n }\n\n public get isValid(): boolean {\n return this._core.isValid;\n }\n\n public markAsSaved(): void {\n this._core.markAsSaved();\n }\n\n // ============ Toolbar ============\n\n public get loading(): boolean {\n return this._core.view.loading;\n }\n\n public get viewMode(): ViewMode {\n return this._core.view.viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._core.view.setViewMode(mode);\n }\n\n public cancel(): void {\n this._core.cancel();\n }\n\n public collapseAll(): void {\n this._core.collapse.collapseAll();\n }\n\n public expandAll(): void {\n this._core.collapse.expandAll();\n }\n\n // ============ Errors Dialog ============\n\n public get showReviewErrorsButton(): boolean {\n return this._core.validation.hasErrors;\n }\n\n public get errorsCount(): number {\n return this._core.validation.errorsCount;\n }\n\n public get isErrorsDialogOpen(): boolean {\n return this._isErrorsDialogOpen;\n }\n\n public openErrorsDialog(): void {\n this._isErrorsDialogOpen = true;\n }\n\n public closeErrorsDialog(): void {\n this._isErrorsDialogOpen = false;\n }\n\n public get errorsDialogVM(): ReviewErrorsDialogVM {\n return new ReviewErrorsDialogVM(\n this._core.tableModel,\n () => this._core.tableIdError,\n () => this._core.validation.collectFormulaInputErrors(),\n );\n }\n\n // ============ Create Dialog ============\n\n public get showCreateTableButton(): boolean {\n return this._core.isValid && !this._core.validation.hasErrors;\n }\n\n public get isCreateDialogOpen(): boolean {\n return this._isCreateDialogOpen;\n }\n\n public openCreateDialog(): void {\n this._isCreateDialogOpen = true;\n }\n\n public closeCreateDialog(): void {\n this._isCreateDialogOpen = false;\n }\n\n public get createDialogViewMode(): CreateDialogViewMode {\n return this._createDialogViewMode;\n }\n\n public setCreateDialogViewMode(mode: CreateDialogViewMode): void {\n this._createDialogViewMode = mode;\n }\n\n public get createDialogVM(): CreateTableDialogVM {\n return new CreateTableDialogVM(\n this._core.tableModel,\n () => this.approve(),\n () => this.closeCreateDialog(),\n );\n }\n\n // ============ Actions ============\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._core.view.setLoading(true);\n try {\n const success = await this._onApprove();\n if (success) {\n this._core.markAsSaved();\n this.closeCreateDialog();\n }\n } finally {\n this._core.view.setLoading(false);\n }\n }\n\n // ============ View Data ============\n\n public getPlainSchema(): JsonObjectSchema {\n return this._core.getPlainSchema();\n }\n\n public dispose(): void {\n this._core.dispose();\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport type {\n TableModel,\n SchemaPatch,\n JsonPatch,\n} from '@revisium/schema-toolkit';\n\nexport type ReviewChangesViewMode = 'Changes' | 'Patches';\n\nexport interface TableIdChangeInfo {\n initialTableId: string;\n currentTableId: string;\n}\n\nexport class ReviewChangesDialogVM {\n private _viewMode: ReviewChangesViewMode = 'Changes';\n private _loading = false;\n\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _onApprove: () => Promise<void>,\n private readonly _onRevert: () => void,\n private readonly _onClose: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get initialTableId(): string {\n return this._tableModel.baseTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableModel.isRenamed;\n }\n\n public get tableIdChange(): TableIdChangeInfo | null {\n if (!this.isTableIdChanged) {\n return null;\n }\n return {\n initialTableId: this.initialTableId,\n currentTableId: this.tableId,\n };\n }\n\n public get patches(): SchemaPatch[] {\n return this._tableModel.schema.patches;\n }\n\n public get jsonPatches(): JsonPatch[] {\n return this._tableModel.schema.jsonPatches;\n }\n\n public get patchesCount(): number {\n return this.patches.length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public get hasChanges(): boolean {\n return this.patchesCount > 0 || this.isTableIdChanged;\n }\n\n public get viewMode(): ReviewChangesViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ReviewChangesViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public async approve(): Promise<void> {\n this._loading = true;\n try {\n await this._onApprove();\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n public revert(): void {\n this._onRevert();\n this._onClose();\n }\n\n public close(): void {\n this._onClose();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { JsonObjectSchema } from '@revisium/schema-toolkit';\nimport {\n SchemaEditorCore,\n type SchemaEditorCoreOptions,\n type ViewMode,\n} from '../core';\nimport { SchemaTreeVM } from './SchemaTreeVM';\nimport { ReviewChangesDialogVM } from '../dialog/ReviewChangesDialogVM';\nimport { ReviewErrorsDialogVM } from '../dialog/ReviewErrorsDialogVM';\n\nexport type UpdateDialogViewMode = 'Changes' | 'Patches';\n\nexport interface UpdatingEditorVMOptions extends SchemaEditorCoreOptions {\n onApprove?: () => Promise<boolean>;\n}\n\nexport class UpdatingEditorVM {\n private readonly _core: SchemaEditorCore;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n\n public readonly tree: SchemaTreeVM;\n\n private _isErrorsDialogOpen = false;\n private _isChangesDialogOpen = false;\n private _updateDialogViewMode: UpdateDialogViewMode = 'Changes';\n\n constructor(\n coreOrSchema: SchemaEditorCore | JsonObjectSchema,\n options: UpdatingEditorVMOptions = {},\n ) {\n if (coreOrSchema instanceof SchemaEditorCore) {\n this._core = coreOrSchema;\n } else {\n this._core = new SchemaEditorCore(coreOrSchema, options);\n }\n this._onApprove = options.onApprove ?? null;\n this.tree = new SchemaTreeVM(this._core);\n\n makeAutoObservable(this, { tree: false }, { autoBind: true });\n }\n\n // ============ Mode ============\n\n public get mode(): 'updating' {\n return 'updating';\n }\n\n // ============ Table ID ============\n\n public get tableId(): string {\n return this._core.tableId;\n }\n\n public get initialTableId(): string {\n return this._core.initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._core.isTableIdChanged;\n }\n\n public get tableIdError(): string | null {\n return this._core.tableIdError;\n }\n\n public setTableId(value: string): void {\n this._core.setTableId(value);\n }\n\n // ============ State ============\n\n public get isDirty(): boolean {\n return this._core.isDirty;\n }\n\n public get isValid(): boolean {\n return this._core.isValid;\n }\n\n public markAsSaved(): void {\n this._core.markAsSaved();\n }\n\n // ============ Toolbar ============\n\n public get loading(): boolean {\n return this._core.view.loading;\n }\n\n public get viewMode(): ViewMode {\n return this._core.view.viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._core.view.setViewMode(mode);\n }\n\n public cancel(): void {\n this._core.cancel();\n }\n\n public collapseAll(): void {\n this._core.collapse.collapseAll();\n }\n\n public expandAll(): void {\n this._core.collapse.expandAll();\n }\n\n // ============ Errors Dialog ============\n\n public get showReviewErrorsButton(): boolean {\n return this._core.validation.hasErrors;\n }\n\n public get errorsCount(): number {\n return this._core.validation.errorsCount;\n }\n\n public get isErrorsDialogOpen(): boolean {\n return this._isErrorsDialogOpen;\n }\n\n public openErrorsDialog(): void {\n this._isErrorsDialogOpen = true;\n }\n\n public closeErrorsDialog(): void {\n this._isErrorsDialogOpen = false;\n }\n\n public get errorsDialogVM(): ReviewErrorsDialogVM {\n return new ReviewErrorsDialogVM(\n this._core.tableModel,\n () => this._core.tableIdError,\n () => this._core.validation.collectFormulaInputErrors(),\n () => this.revert(),\n () => this.closeErrorsDialog(),\n );\n }\n\n // ============ Changes Dialog ============\n\n public get showApplyChangesButton(): boolean {\n return (\n this._core.isValid &&\n !this._core.validation.hasErrors &&\n (this._core.isDirty || this._core.isTableIdChanged)\n );\n }\n\n public get totalChangesCount(): number {\n return this._core.totalChangesCount;\n }\n\n public get isChangesDialogOpen(): boolean {\n return this._isChangesDialogOpen;\n }\n\n public openChangesDialog(): void {\n this._isChangesDialogOpen = true;\n }\n\n public closeChangesDialog(): void {\n this._isChangesDialogOpen = false;\n }\n\n public get updateDialogViewMode(): UpdateDialogViewMode {\n return this._updateDialogViewMode;\n }\n\n public setUpdateDialogViewMode(mode: UpdateDialogViewMode): void {\n this._updateDialogViewMode = mode;\n }\n\n public get changesDialogVM(): ReviewChangesDialogVM {\n return new ReviewChangesDialogVM(\n this._core.tableModel,\n () => this.approve(),\n () => this.revert(),\n () => this.closeChangesDialog(),\n );\n }\n\n // ============ Actions ============\n\n public revert(): void {\n this._core.revert();\n }\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._core.view.setLoading(true);\n try {\n const success = await this._onApprove();\n if (success) {\n this._core.markAsSaved();\n this.closeChangesDialog();\n }\n } finally {\n this._core.view.setLoading(false);\n }\n }\n\n // ============ View Data ============\n\n public getPlainSchema(): JsonObjectSchema {\n return this._core.getPlainSchema();\n }\n\n public getPatches() {\n return this._core.getPatches();\n }\n\n public getJsonPatches() {\n return this._core.getJsonPatches();\n }\n\n public dispose(): void {\n this._core.dispose();\n }\n}\n","import { Tooltip as ChakraTooltip, Portal } from '@chakra-ui/react';\nimport * as React from 'react';\n\nexport interface TooltipProps extends ChakraTooltip.RootProps {\n showArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement>;\n content: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n}\n\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n function Tooltip(props, ref) {\n const {\n showArrow,\n children,\n disabled,\n portalled = true,\n content,\n contentProps,\n portalRef,\n ...rest\n } = props;\n\n if (disabled) {\n return <>{children}</>;\n }\n\n return (\n <ChakraTooltip.Root {...rest}>\n <ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content ref={ref} {...contentProps}>\n {showArrow && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {content}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n },\n);\n","export interface NodeUIState {\n isExpanded: boolean;\n isFocused: boolean;\n isMenuOpen: boolean;\n isSettingsOpen: boolean;\n}\n\nexport interface FormulaState {\n inputValue: string | null;\n errorValue: string | null;\n}\n\nexport interface DragState {\n isDragging: boolean;\n isDraggedOver: boolean;\n}\n\nexport enum ViewerSwitcherMode {\n Tree = 'Tree',\n Json = 'Json',\n RefBy = 'RefBy',\n}\n","import { Button, Icon, Menu, Portal } from '@chakra-ui/react';\nimport React, { useMemo, useState } from 'react';\nimport {\n PiBracketsCurlyThin,\n PiCaretDownLight,\n PiLinkThin,\n PiTreeViewThin,\n} from 'react-icons/pi';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { ViewerSwitcherMode } from '../../schema-editor/types';\n\nconst modes: {\n mode: ViewerSwitcherMode;\n label: string;\n icon: React.ElementType;\n dataTestId?: string;\n}[] = [\n {\n mode: ViewerSwitcherMode.Tree,\n label: 'Tree',\n icon: PiTreeViewThin,\n dataTestId: 'row-editor-mode-tree',\n },\n {\n mode: ViewerSwitcherMode.Json,\n label: 'JSON',\n icon: PiBracketsCurlyThin,\n dataTestId: 'row-editor-mode-json',\n },\n {\n mode: ViewerSwitcherMode.RefBy,\n label: 'References',\n icon: PiLinkThin,\n dataTestId: 'row-editor-mode-refs',\n },\n];\n\ninterface ViewerSwitcherProps {\n mode: ViewerSwitcherMode;\n availableRefByMode?: boolean;\n onChange?: (mode: ViewerSwitcherMode) => void;\n}\n\nexport const ViewerSwitcher: React.FC<ViewerSwitcherProps> = ({\n mode,\n onChange,\n availableRefByMode,\n}) => {\n const [menuOpen, setMenuOpen] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const currentModes = useMemo(\n () =>\n modes.filter(\n (item) =>\n !(item.mode === ViewerSwitcherMode.RefBy && !availableRefByMode),\n ),\n [availableRefByMode],\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentMode = modes.find((m) => m.mode === mode) ?? modes[0]!;\n\n const handleValueChange = (details: { value: string }) => {\n const selectedMode = modes.find(\n (m) => m.mode === (details.value as ViewerSwitcherMode),\n );\n if (selectedMode) {\n onChange?.(selectedMode.mode);\n }\n };\n\n return (\n <Menu.Root onOpenChange={({ open }) => setMenuOpen(open)}>\n <Menu.Trigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n height=\"2.5rem\"\n color=\"gray.500\"\n _hover={{ backgroundColor: 'gray.50', '& .caret': { opacity: 1 } }}\n _focus={{ outline: 'none', boxShadow: 'none' }}\n _focusVisible={{ outline: 'none', boxShadow: 'none' }}\n data-testid=\"view-mode-switcher\"\n px=\"8px\"\n gap=\"2px\"\n >\n <Tooltip\n open={!menuOpen && tooltipOpen}\n onOpenChange={(details) => setTooltipOpen(details.open)}\n content=\"View mode\"\n openDelay={500}\n closeDelay={0}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <Icon as={currentMode.icon} boxSize={4} />\n <Icon\n as={PiCaretDownLight}\n boxSize={3}\n color=\"gray.400\"\n className=\"caret\"\n opacity={0}\n transition=\"opacity 0.15s\"\n />\n </span>\n </Tooltip>\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minWidth=\"140px\">\n <Menu.RadioItemGroup value={mode} onValueChange={handleValueChange}>\n {currentModes.map((item) => (\n <Menu.RadioItem\n key={item.mode}\n value={item.mode}\n data-testid={item.dataTestId}\n cursor=\"pointer\"\n >\n <Menu.ItemIndicator />\n <Icon as={item.icon} boxSize={4} mr=\"8px\" />\n {item.label}\n </Menu.RadioItem>\n ))}\n </Menu.RadioItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiCopy } from 'react-icons/pi';\n\ninterface CopyButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const CopyButton: FC<CopyButtonProps> = ({ dataTestId, ...props }) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.100' }}\n color=\"gray.400\"\n variant=\"ghost\"\n {...props}\n >\n <PiCopy />\n </IconButton>\n );\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { githubLight } from '@uiw/codemirror-theme-github';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { json } from '@codemirror/lang-json';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { CopyButton } from '../CopyButton/CopyButton';\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\ninterface JsonCardProps {\n data: JsonValue;\n readonly?: boolean;\n onChange?: (data: JsonValue) => void;\n onBlur?: () => void;\n onCopy?: () => void;\n}\n\nexport const JsonCard: React.FC<JsonCardProps> = ({\n data,\n readonly,\n onChange,\n onBlur,\n onCopy,\n}) => {\n const [error, setError] = useState('');\n const externalText = JSON.stringify(data, null, 3);\n const [internalText, setInternalText] = useState(externalText);\n const isFocusedRef = useRef(false);\n\n const displayText = isFocusedRef.current ? internalText : externalText;\n\n const handleClick = useCallback(() => {\n void navigator.clipboard.writeText(displayText).then(() => {\n onCopy?.();\n });\n }, [displayText, onCopy]);\n\n const handleChange = useCallback(\n (value: string) => {\n setInternalText(value);\n\n try {\n const parsedData = JSON.parse(value) as JsonValue;\n setError('');\n onChange?.(parsedData);\n } catch (e) {\n console.error(e);\n setError('Invalid JSON');\n }\n },\n [onChange],\n );\n\n const handleFocus = useCallback(() => {\n isFocusedRef.current = true;\n setInternalText(externalText);\n }, [externalText]);\n\n const handleBlur = useCallback(() => {\n isFocusedRef.current = false;\n setInternalText(externalText);\n onBlur?.();\n }, [onBlur, externalText]);\n\n const hoverStyles = {\n '&:hover .copy-button': { visibility: 'visible' as const },\n };\n\n return (\n <Flex\n position=\"relative\"\n width=\"100%\"\n flex={1}\n direction=\"column\"\n gap=\"1rem\"\n css={hoverStyles}\n >\n <Box p={1} flex={1}>\n <CodeMirror\n value={displayText}\n extensions={[EditorView.lineWrapping, json()]}\n editable={!readonly}\n theme={githubLight}\n maxWidth=\"100%\"\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n }}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n <CopyButton\n dataTestId=\"json-card-copy-button\"\n aria-label=\"\"\n position=\"absolute\"\n top=\"8px\"\n right=\"8px\"\n className=\"copy-button\"\n visibility=\"hidden\"\n onClick={handleClick}\n />\n </Box>\n <Flex\n height=\"40px\"\n paddingBottom=\"8px\"\n alignItems=\"flex-end\"\n backgroundColor=\"white\"\n width=\"100%\"\n position=\"sticky\"\n bottom={0}\n justifyContent=\"center\"\n >\n <Text color=\"gray\">{error}</Text>\n </Flex>\n </Flex>\n );\n};\n","import {\n FocusEventHandler,\n FormEventHandler,\n KeyboardEventHandler,\n RefCallback,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\n\nexport interface UseContentEditableOptions {\n value: string;\n onChange?: (value: string) => void;\n onBlur?: () => void;\n onFocus?: () => void;\n onEscape?: () => void;\n onEnter?: () => void;\n restrict?: RegExp;\n autoFocus?: boolean;\n focusTrigger?: number;\n}\n\nexport type UseContentEditableReturn = {\n ref: RefCallback<HTMLElement>;\n contentEditable: true;\n spellCheck: false;\n dangerouslySetInnerHTML: { __html: string };\n onInput: FormEventHandler<HTMLElement>;\n onBlur: FormEventHandler<HTMLElement>;\n onFocus: FocusEventHandler<HTMLElement>;\n onKeyDown: KeyboardEventHandler<HTMLElement>;\n};\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#039;');\n}\n\nconst allowed = new Set([\n 'Backspace',\n 'Escape',\n 'Enter',\n 'ArrowRight',\n 'ArrowLeft',\n 'Delete',\n]);\n\nexport function useContentEditable(\n options: UseContentEditableOptions,\n): UseContentEditableReturn {\n const { value, autoFocus, focusTrigger } = options;\n\n const elementRef = useRef<HTMLElement | null>(null);\n const cursorPosition = useRef<number | null>(null);\n const prevFocusTriggerRef = useRef(focusTrigger);\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const ref: RefCallback<HTMLElement> = useCallback((node) => {\n elementRef.current = node;\n }, []);\n\n useEffect(() => {\n if (autoFocus) {\n elementRef.current?.focus();\n }\n }, [autoFocus]);\n\n useLayoutEffect(() => {\n const selection = globalThis.getSelection();\n if (selection && cursorPosition.current !== null && elementRef.current) {\n const maxPosition = (elementRef.current.textContent || '').length;\n const position = Math.min(maxPosition, cursorPosition.current);\n\n const range = document.createRange();\n const sel = globalThis.getSelection();\n const firstChild = elementRef.current.childNodes[0];\n const node: Node = firstChild ?? elementRef.current;\n range.setStart(node, position);\n range.collapse(true);\n\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n });\n\n useEffect(() => {\n if (prevFocusTriggerRef.current === focusTrigger) {\n return;\n }\n prevFocusTriggerRef.current = focusTrigger;\n\n elementRef.current?.focus();\n const selection = globalThis.getSelection();\n\n if (elementRef.current && selection) {\n const range = document.createRange();\n range.selectNodeContents(elementRef.current);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }, [focusTrigger]);\n\n const handleInput: FormEventHandler<HTMLElement> = useCallback((event) => {\n const selection = globalThis.getSelection();\n if (selection && selection.rangeCount > 0) {\n cursorPosition.current = selection.getRangeAt(0).startOffset;\n }\n\n const textValue = event.currentTarget.innerText;\n const val = textValue === '\\n' ? '' : textValue;\n optionsRef.current.onChange?.(val);\n }, []);\n\n const handleBlur: FormEventHandler<HTMLElement> = useCallback(() => {\n optionsRef.current.onBlur?.();\n cursorPosition.current = null;\n }, []);\n\n const handleFocus: FocusEventHandler<HTMLElement> = useCallback(() => {\n optionsRef.current.onFocus?.();\n }, []);\n\n const handleKeyDown: KeyboardEventHandler<HTMLElement> = useCallback(\n (event) => {\n const opts = optionsRef.current;\n\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (opts.value) {\n elementRef.current?.blur();\n opts.onEnter?.();\n }\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n elementRef.current?.blur();\n opts.onEscape?.();\n }\n\n if (\n opts.restrict &&\n !event.metaKey &&\n !event.ctrlKey &&\n !allowed.has(event.key) &&\n !opts.restrict.test(event.key)\n ) {\n event.preventDefault();\n }\n },\n [],\n );\n\n return {\n ref,\n contentEditable: true,\n spellCheck: false,\n dangerouslySetInnerHTML: { __html: escapeHtml(value) },\n onInput: handleInput,\n onBlur: handleBlur,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n}\n","import { Box, BoxProps, Flex, Text } from '@chakra-ui/react';\nimport React, { useCallback, useRef } from 'react';\nimport {\n useContentEditable,\n type UseContentEditableOptions,\n} from '../../hooks/useContentEditable';\n\nexport interface ContentEditableProps extends Pick<\n UseContentEditableOptions,\n | 'onChange'\n | 'onBlur'\n | 'onFocus'\n | 'onEscape'\n | 'onEnter'\n | 'restrict'\n | 'autoFocus'\n | 'focusTrigger'\n> {\n initValue: string;\n placeholder?: string;\n prefix?: string;\n postfix?: string;\n dataTestId?: string;\n textDecoration?: BoxProps['textDecoration'];\n}\n\nexport const ContentEditable: React.FC<ContentEditableProps> = ({\n initValue,\n placeholder,\n autoFocus,\n onBlur,\n onChange,\n onEscape,\n onEnter,\n onFocus,\n focusTrigger,\n restrict,\n prefix,\n postfix,\n dataTestId,\n textDecoration,\n}) => {\n const elementRef = useRef<HTMLElement | null>(null);\n\n const editableProps = useContentEditable({\n value: initValue,\n onChange,\n onBlur,\n onFocus,\n onEscape,\n onEnter,\n restrict,\n autoFocus,\n focusTrigger,\n });\n\n const hookRef = editableProps.ref;\n const combinedRef = useCallback(\n (node: HTMLElement | null) => {\n elementRef.current = node;\n hookRef(node);\n },\n [hookRef],\n );\n\n const handleParentClick = useCallback(() => {\n elementRef.current?.focus();\n }, []);\n\n const showPlaceholder = !initValue && placeholder;\n\n return (\n <Flex\n minWidth={0}\n width={showPlaceholder ? '100%' : undefined}\n position=\"relative\"\n cursor=\"text\"\n onClick={handleParentClick}\n >\n {!showPlaceholder && prefix}\n <Box\n color=\"blackAlpha.800\"\n textDecoration={textDecoration}\n data-testid={dataTestId}\n ref={combinedRef}\n contentEditable={editableProps.contentEditable}\n spellCheck={editableProps.spellCheck}\n dangerouslySetInnerHTML={editableProps.dangerouslySetInnerHTML}\n outline={0}\n width=\"100%\"\n onBlur={editableProps.onBlur}\n onFocus={editableProps.onFocus}\n onInput={editableProps.onInput}\n onKeyDown={editableProps.onKeyDown}\n ></Box>\n {!showPlaceholder && postfix}\n {showPlaceholder && (\n <Text\n cursor=\"text\"\n userSelect=\"none\"\n pointerEvents=\"none\"\n whiteSpace=\"nowrap\"\n color=\"gray.400\"\n position=\"absolute\"\n >\n {placeholder}\n </Text>\n )}\n </Flex>\n );\n};\n","export const SEGMENT_COLOR = '#71717A';\nexport const SEPARATOR_COLOR = '#a3a3a3';\nexport const CURRENT_COLOR = '#000';\nexport const HOVER_BG = '#F5F5F5';\n\nexport const BREADCRUMB_FONT_SIZE = '16px';\nexport const BREADCRUMB_BORDER_RADIUS = '6px';\nexport const BREADCRUMB_PADDING = '4px';\n","import { Box, Text } from '@chakra-ui/react';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { useContentEditable } from '../../hooks/useContentEditable';\nimport { Tooltip } from '../Tooltip';\nimport { type BreadcrumbEditableProps } from './Breadcrumbs';\nimport {\n BREADCRUMB_BORDER_RADIUS,\n BREADCRUMB_PADDING,\n CURRENT_COLOR,\n HOVER_BG,\n} from './constants';\n\nexport const EditableSegment: React.FC<BreadcrumbEditableProps> = ({\n value,\n onChange,\n onBlur,\n tooltip,\n placeholder,\n dataTestId,\n}) => {\n const [focused, setFocused] = useState(false);\n const elementRef = useRef<HTMLElement | null>(null);\n const valueRef = useRef(value);\n valueRef.current = value;\n const onBlurRef = useRef(onBlur);\n onBlurRef.current = onBlur;\n\n const handleFocus = useCallback(() => {\n setFocused(true);\n }, []);\n\n const handleBlur = useCallback(() => {\n setFocused(false);\n onBlurRef.current?.(valueRef.current);\n }, []);\n\n const editableProps = useContentEditable({\n value,\n onChange,\n onBlur: handleBlur,\n onFocus: handleFocus,\n });\n\n const hookRef = editableProps.ref;\n const combinedRef = useCallback(\n (node: HTMLElement | null) => {\n elementRef.current = node;\n hookRef(node);\n },\n [hookRef],\n );\n\n const handleParentClick = useCallback(() => {\n elementRef.current?.focus();\n }, []);\n\n const showPlaceholder = !value && !focused && !!placeholder;\n\n const box = (\n <Box\n borderRadius={BREADCRUMB_BORDER_RADIUS}\n px={BREADCRUMB_PADDING}\n py={BREADCRUMB_PADDING}\n bg={focused || showPlaceholder ? HOVER_BG : undefined}\n _hover={{ bg: HOVER_BG }}\n cursor=\"text\"\n onClick={handleParentClick}\n position=\"relative\"\n >\n {showPlaceholder && (\n <Text\n pointerEvents=\"none\"\n userSelect=\"none\"\n whiteSpace=\"nowrap\"\n color=\"gray.400\"\n fontWeight=\"400\"\n >\n {placeholder}\n </Text>\n )}\n <Box\n ref={combinedRef}\n color={CURRENT_COLOR}\n fontWeight=\"600\"\n outline={0}\n whiteSpace=\"nowrap\"\n data-testid={dataTestId}\n contentEditable={editableProps.contentEditable}\n spellCheck={editableProps.spellCheck}\n dangerouslySetInnerHTML={editableProps.dangerouslySetInnerHTML}\n onInput={editableProps.onInput}\n onBlur={editableProps.onBlur}\n onFocus={editableProps.onFocus}\n onKeyDown={editableProps.onKeyDown}\n {...(showPlaceholder\n ? { position: 'absolute' as const, inset: 0 }\n : {})}\n />\n </Box>\n );\n\n if (tooltip) {\n return (\n <Tooltip\n content={tooltip}\n openDelay={300}\n open={focused ? false : undefined}\n closeOnClick={false}\n >\n {box}\n </Tooltip>\n );\n }\n\n return box;\n};\n","import { Text } from '@chakra-ui/react';\nimport { Breadcrumb } from '@chakra-ui/react/breadcrumb';\nimport React from 'react';\nimport { type BreadcrumbSegment } from './Breadcrumbs';\nimport {\n BREADCRUMB_BORDER_RADIUS,\n BREADCRUMB_PADDING,\n CURRENT_COLOR,\n HOVER_BG,\n SEGMENT_COLOR,\n} from './constants';\n\ninterface SegmentContentProps {\n segment: BreadcrumbSegment;\n isHighlighted: boolean;\n onClick?: () => void;\n}\n\nexport const SegmentContent: React.FC<SegmentContentProps> = ({\n segment,\n isHighlighted,\n onClick,\n}) => {\n if (isHighlighted) {\n return (\n <Breadcrumb.CurrentLink\n color={CURRENT_COLOR}\n fontWeight=\"600\"\n data-testid={segment.dataTestId}\n >\n {segment.label}\n </Breadcrumb.CurrentLink>\n );\n }\n\n if (onClick) {\n return (\n <Breadcrumb.Link\n as=\"button\"\n color={SEGMENT_COLOR}\n borderRadius={BREADCRUMB_BORDER_RADIUS}\n px={BREADCRUMB_PADDING}\n py={BREADCRUMB_PADDING}\n focusRing=\"none\"\n cursor=\"pointer\"\n _hover={{ bg: HOVER_BG }}\n _focusVisible={{ bg: HOVER_BG }}\n onClick={onClick}\n data-testid={segment.dataTestId}\n >\n {segment.label}\n </Breadcrumb.Link>\n );\n }\n\n return (\n <Text color={SEGMENT_COLOR} data-testid={segment.dataTestId}>\n {segment.label}\n </Text>\n );\n};\n","import { Flex, Text } from '@chakra-ui/react';\nimport { Breadcrumb } from '@chakra-ui/react/breadcrumb';\nimport React, { Fragment } from 'react';\nimport {\n BREADCRUMB_FONT_SIZE,\n BREADCRUMB_PADDING,\n SEPARATOR_COLOR,\n} from './constants';\nimport { EditableSegment } from './EditableSegment';\nimport { SegmentContent } from './SegmentContent';\n\nexport interface BreadcrumbSegment {\n label: string;\n dataTestId?: string;\n}\n\nexport interface BreadcrumbEditableProps {\n value: string;\n onChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n tooltip?: string;\n placeholder?: string;\n dataTestId?: string;\n}\n\nexport interface BreadcrumbsProps {\n segments: BreadcrumbSegment[];\n separator?: string;\n dataTestId?: string;\n highlightLast?: boolean;\n onSegmentClick?: (segment: BreadcrumbSegment, index: number) => void;\n editable?: BreadcrumbEditableProps;\n action?: React.ReactNode;\n}\n\nexport const Breadcrumbs: React.FC<BreadcrumbsProps> = ({\n segments,\n separator = '/',\n dataTestId,\n highlightLast = true,\n onSegmentClick,\n editable,\n action,\n}) => {\n return (\n <Flex alignItems=\"center\" gap={BREADCRUMB_PADDING}>\n <Breadcrumb.Root\n fontWeight=\"400\"\n fontSize={BREADCRUMB_FONT_SIZE}\n data-testid={dataTestId}\n >\n <Breadcrumb.List fontSize={BREADCRUMB_FONT_SIZE}>\n {segments.map((segment, index) => {\n const isLast = index === segments.length - 1 && !editable;\n const isHighlighted = isLast && highlightLast;\n const handleClick = onSegmentClick\n ? () => onSegmentClick(segment, index)\n : undefined;\n\n return (\n <Fragment key={`${segment.label}-${index}`}>\n <Breadcrumb.Item>\n <SegmentContent\n segment={segment}\n isHighlighted={isHighlighted}\n onClick={isLast ? undefined : handleClick}\n />\n </Breadcrumb.Item>\n {(!isLast || editable) && (\n <Breadcrumb.Separator>\n <Text color={SEPARATOR_COLOR}>{separator}</Text>\n </Breadcrumb.Separator>\n )}\n </Fragment>\n );\n })}\n {editable && (\n <Breadcrumb.Item>\n <EditableSegment\n value={editable.value}\n onChange={editable.onChange}\n onBlur={editable.onBlur}\n tooltip={editable.tooltip}\n placeholder={editable.placeholder}\n dataTestId={editable.dataTestId}\n />\n </Breadcrumb.Item>\n )}\n </Breadcrumb.List>\n </Breadcrumb.Root>\n {action}\n </Flex>\n );\n};\n","import { Box, Button, Flex, Text } from '@chakra-ui/react';\nimport React from 'react';\n\ninterface GrayButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n isLoading?: boolean;\n icon?: React.ReactNode;\n height?: string;\n dataTestId?: string;\n}\n\nexport const GrayButton: React.FC<GrayButtonProps> = ({\n height = '2.5rem',\n title,\n onClick,\n disabled,\n isSelected,\n isLoading,\n icon,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n _hover={{ color: 'gray.400', backgroundColor: 'white' }}\n _disabled={\n isSelected\n ? { backgroundColor: 'gray.50', cursor: 'not-allowed' }\n : undefined\n }\n alignSelf=\"flex-start\"\n color=\"gray.300\"\n fontWeight=\"500\"\n fontSize={16}\n height={height}\n disabled={disabled || isSelected}\n loading={isLoading}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Flex alignItems=\"center\" gap=\"0.5rem\">\n {icon && <Box fontSize=\"sm\">{icon}</Box>}\n <Text>{title}</Text>\n </Flex>\n </Button>\n );\n};\n","import React from 'react';\nimport { PiPlusBold } from 'react-icons/pi';\nimport { GrayButton } from '../GrayButton/GrayButton';\n\ninterface CreateButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CreateButton: React.FC<CreateButtonProps> = (props) => {\n return <GrayButton {...props} icon={<PiPlusBold />} />;\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiX } from 'react-icons/pi';\n\ninterface CloseButtonProps {\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CloseButton: React.FC<CloseButtonProps> = ({\n height = '2.5rem',\n onClick,\n disabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={disabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n color=\"gray.400\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n width=\"48px\"\n >\n <Icon as={PiX} size=\"md\" />\n </Button>\n );\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiCaretLeft } from 'react-icons/pi';\n\ninterface BackButtonProps {\n onClick?: () => void;\n isDisabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const BackButton: React.FC<BackButtonProps> = ({\n height = '2.5rem',\n onClick,\n isDisabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={isDisabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Icon as={PiCaretLeft} boxSize={4} color=\"gray.500\" />\n </Button>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiGear } from 'react-icons/pi';\n\ninterface SettingsButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const SettingsButton: FC<SettingsButtonProps> = ({\n dataTestId,\n ...props\n}) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.50' }}\n color=\"gray.400\"\n variant=\"ghost\"\n size=\"sm\"\n {...props}\n >\n <PiGear />\n </IconButton>\n );\n};\n","import { IconButton } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiPlus } from 'react-icons/pi';\nimport { Tooltip } from '../Tooltip';\n\nexport interface PlusButtonProps {\n onClick?: () => void;\n tooltip?: string;\n disabled?: boolean;\n dataTestId?: string;\n}\n\nexport const PlusButton: React.FC<PlusButtonProps> = ({\n onClick,\n tooltip,\n disabled,\n dataTestId,\n}) => {\n const button = (\n <IconButton\n aria-label={tooltip ?? 'Add'}\n size=\"xs\"\n variant=\"ghost\"\n color=\"gray.400\"\n disabled={disabled}\n focusRing=\"none\"\n _hover={{ bg: 'gray.100', color: 'gray.600' }}\n onClick={onClick}\n data-testid={dataTestId}\n >\n <PiPlus />\n </IconButton>\n );\n\n if (tooltip) {\n return (\n <Tooltip content={tooltip} openDelay={300}>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n};\n","import { Box, Flex, IconButton } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport { MdOutlineChevronRight } from 'react-icons/md';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface TreeNodeWrapperProps {\n accessor: NodeAccessor;\n isCollapsible: boolean;\n isCollapsed: boolean;\n onToggleCollapse?: () => void;\n field: ReactNode;\n hoverTargetClass?: string;\n dataTestId?: string;\n children?: ReactNode;\n}\n\nexport const TreeNodeWrapper: FC<TreeNodeWrapperProps> = observer(\n ({\n accessor,\n isCollapsible,\n isCollapsed,\n onToggleCollapse,\n field,\n hoverTargetClass,\n dataTestId,\n children,\n }) => {\n const dotOutlineClass = `dot-outline-${accessor.nodeId}`;\n const collapseButtonClass = `collapse-button-${accessor.nodeId}`;\n\n const isActiveWithName =\n accessor.state.isActive && Boolean(accessor.label.name);\n\n const collapseHoverStyles =\n isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' },\n }\n : {};\n\n const activeCollapseStyles =\n isActiveWithName && isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' as const },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' as const },\n }\n : {};\n\n const fieldHoverStyles = hoverTargetClass\n ? {\n [`&:hover .${hoverTargetClass}`]: { opacity: 1 },\n ...(isActiveWithName\n ? { [`& .${hoverTargetClass}`]: { opacity: 1 } }\n : {}),\n }\n : {};\n\n const getCollapseButtonTestId = (): string | undefined => {\n if (!dataTestId) {\n return undefined;\n }\n return isCollapsed\n ? `${dataTestId}-expand-button`\n : `${dataTestId}-collapse-button`;\n };\n\n return (\n <Flex\n flexDirection=\"column\"\n alignSelf=\"flex-start\"\n width=\"100%\"\n _hover={collapseHoverStyles}\n css={activeCollapseStyles}\n data-node-id={accessor.nodeId}\n data-active={accessor.state.isActive || undefined}\n >\n <Flex\n gap=\"4px\"\n alignItems=\"center\"\n height=\"30px\"\n mt=\"2px\"\n mb=\"2px\"\n position=\"relative\"\n css={fieldHoverStyles}\n backgroundColor={accessor.state.isActive ? 'gray.100' : undefined}\n borderRadius=\"4px\"\n cursor=\"default\"\n >\n <Box position=\"absolute\" ml=\"-60px\" height=\"100%\" width=\"60px\" />\n <Box\n className={dotOutlineClass}\n color=\"gray.300\"\n visibility={isCollapsed ? 'hidden' : 'visible'}\n >\n <PiDotOutlineFill />\n </Box>\n {isCollapsible && (\n <IconButton\n data-testid={getCollapseButtonTestId()}\n className={collapseButtonClass}\n visibility={isCollapsed ? 'visible' : 'hidden'}\n _hover={{ backgroundColor: 'transparent' }}\n ml=\"-8px\"\n position=\"absolute\"\n size=\"xs\"\n color=\"gray.400\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n width=\"26px\"\n height=\"26px\"\n >\n <Box rotate={isCollapsed ? '0' : '90deg'}>\n <MdOutlineChevronRight />\n </Box>\n </IconButton>\n )}\n {field}\n </Flex>\n {children && !isCollapsed && (\n <Flex\n ml=\"7px\"\n pl=\"18px\"\n borderLeftWidth={1}\n borderLeftStyle=\"solid\"\n borderLeftColor=\"white\"\n _hover={{ borderLeftColor: 'blackAlpha.200' }}\n >\n {children}\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Portal } from '@chakra-ui/react';\nimport { Menu } from '@chakra-ui/react/menu';\nimport { FC, Fragment, ReactElement } from 'react';\nimport { LuChevronRight } from 'react-icons/lu';\nimport { typeMenuGroups, type MenuOptionItem } from '../../config';\n\ninterface SubMenuProps {\n label: string;\n options: MenuOptionItem[];\n onSelect: (id: string) => void;\n dataTestIdPrefix?: string;\n triggerId?: string;\n}\n\nconst SubMenu: FC<SubMenuProps> = ({\n label,\n options,\n onSelect,\n dataTestIdPrefix,\n triggerId,\n}) => {\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={triggerId}>\n <Box flex=\"1\">{label}</Box>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {options.map((option) => (\n <Fragment key={option.id}>\n <Menu.Item\n value={option.id}\n data-testid={`${dataTestIdPrefix}-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n {option.type !== 'submenu' && option.addDividerAfter && (\n <Menu.Separator />\n )}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n\ninterface TypeMenuProps {\n menuButton: ReactElement;\n onSelect: (typeId: string) => void;\n dataTestId?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const TypeMenu: FC<TypeMenuProps> = ({\n menuButton,\n onSelect,\n dataTestId,\n open,\n onOpenChange,\n}) => {\n const handleOpenChange = (details: { open: boolean }) => {\n onOpenChange?.(details.open);\n };\n\n return (\n <Menu.Root open={open} onOpenChange={handleOpenChange}>\n <Menu.Trigger asChild>{menuButton}</Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {typeMenuGroups.map((group) => (\n <Fragment key={group.id}>\n {group.options.map((option) =>\n option.type === 'submenu' ? (\n <SubMenu\n key={option.id}\n label={option.label}\n options={option.items}\n onSelect={onSelect}\n triggerId={`${dataTestId}-menu-submenu-${option.id}`}\n dataTestIdPrefix={`${dataTestId}-menu-sub`}\n />\n ) : (\n <Menu.Item\n key={option.id}\n value={option.id}\n data-testid={`${dataTestId}-menu-type-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n ),\n )}\n {group.addDividerAfter && <Menu.Separator />}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { Flex, Icon } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiDotsSixVerticalBold } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip';\n\ninterface DragHandleProps {\n dataTestId: string;\n hoverClass?: string;\n applyHoverStyles: boolean;\n}\n\nexport const DragHandle: FC<DragHandleProps> = ({\n dataTestId,\n hoverClass,\n applyHoverStyles,\n}) => (\n <Tooltip\n content=\"Drag to move field to another object\"\n positioning={{ placement: 'left' }}\n >\n <Flex\n data-testid={`${dataTestId}-drag-button`}\n className={hoverClass}\n position=\"absolute\"\n left=\"-34px\"\n opacity={applyHoverStyles ? 0 : 1}\n cursor=\"grab\"\n _hover={{ backgroundColor: 'gray.50' }}\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"4px\"\n marginLeft=\"-6px\"\n >\n <Icon as={PiDotsSixVerticalBold} size=\"md\" color=\"gray.300\" />\n </Flex>\n </Tooltip>\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiWarningCircle } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip';\n\ninterface ErrorIndicatorProps {\n dataTestId: string;\n errorMessage: string;\n}\n\nexport const ErrorIndicator: FC<ErrorIndicatorProps> = ({\n dataTestId,\n errorMessage,\n}) => (\n <Tooltip\n content={errorMessage}\n positioning={{ placement: 'top' }}\n contentProps={{ maxWidth: '400px' }}\n >\n <Box\n data-testid={`${dataTestId}-error-indicator`}\n color=\"red.500\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n ml=\"4px\"\n >\n <PiWarningCircle />\n </Box>\n </Tooltip>\n);\n","import {\n draggable,\n dropTargetForElements,\n monitorForElements,\n type ElementEventBasePayload,\n type ElementDropTargetEventPayloadMap,\n} from '@atlaskit/drag-and-drop/adapter/element';\nimport type { CleanupFn } from '@atlaskit/drag-and-drop/types';\nimport { useEffect, useRef } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ntype DragAndDropData = Record<string, unknown> & {\n accessor: NodeAccessor;\n};\n\nconst getDragData = (data: Record<string, unknown>): NodeAccessor | null => {\n const accessor = data.accessor;\n if (accessor && typeof accessor === 'object' && 'nodeId' in accessor) {\n return accessor as NodeAccessor;\n }\n return null;\n};\n\ninterface UseDragAndDropOptions {\n accessor: NodeAccessor;\n onDrop?: (fromNodeId: string) => void;\n canDrag: boolean;\n isDropTarget: boolean;\n canAcceptDrop: (fromNodeId: string) => boolean;\n}\n\nexport const useDragAndDrop = ({\n accessor,\n onDrop,\n canDrag,\n isDropTarget,\n canAcceptDrop,\n}: UseDragAndDropOptions) => {\n const dragAndDropRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!canDrag || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = draggable({\n element: dragAndDropRef.current,\n getInitialData: (): DragAndDropData => ({ accessor }),\n });\n\n return () => cleanup();\n }, [accessor, canDrag]);\n\n useEffect(() => {\n if (!isDropTarget || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = dropTargetForElements({\n element: dragAndDropRef.current,\n onDrop: (e: ElementDropTargetEventPayloadMap['onDrop']) => {\n const draggingAccessor = getDragData(e.source.data);\n\n if (draggingAccessor && canAcceptDrop(draggingAccessor.nodeId)) {\n if (onDrop) {\n onDrop(draggingAccessor.nodeId);\n }\n }\n\n accessor.state.setDraggedOver(false);\n accessor.state.setDrop(false);\n },\n onDragEnter: (e: ElementDropTargetEventPayloadMap['onDragEnter']) => {\n const draggingAccessor = getDragData(e.source.data);\n if (draggingAccessor) {\n accessor.state.setDraggedOver(canAcceptDrop(draggingAccessor.nodeId));\n }\n },\n onDragLeave: () => accessor.state.setDraggedOver(false),\n });\n\n return () => cleanup();\n }, [accessor, isDropTarget, onDrop, canAcceptDrop]);\n\n useEffect(() => {\n return monitorForElements({\n onDragStart: (e: ElementEventBasePayload) => {\n const draggingAccessor = getDragData(e.source.data);\n\n if (!draggingAccessor) {\n return;\n }\n\n if (isDropTarget) {\n const canAccept = canAcceptDrop(draggingAccessor.nodeId);\n\n if (canAccept) {\n accessor.state.setDrop(true);\n } else {\n accessor.state.setDisabledDrop(true);\n }\n } else {\n accessor.state.setDisabledDrop(true);\n }\n },\n onDrop: () => {\n accessor.state.setDrop(false);\n accessor.state.setDisabledDrop(false);\n },\n });\n }, [accessor, isDropTarget, canAcceptDrop]);\n\n return {\n dragAndDropRef,\n isDraggable: canDrag,\n isDrop: accessor.state.isDrop,\n isDisabledDrop: accessor.state.isDisabledDrop,\n isDraggedOver: accessor.state.isDraggedOver,\n };\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode, useCallback } from 'react';\nimport { ContentEditable } from '../../../../components/ContentEditable';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TypeMenu } from '../../TypeMenu/TypeMenu';\nimport { DragHandle } from './DragHandle';\nimport { ErrorIndicator } from './ErrorIndicator';\nimport { useDragAndDrop } from './useDragAndDrop';\n\ninterface TreeNodeFieldProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n hoverTargetClass?: string;\n onChangeType: (typeId: string) => void;\n rightContent?: ReactNode;\n}\n\nexport const TreeNodeField: FC<TreeNodeFieldProps> = observer(\n ({\n accessor,\n treeVM,\n dataTestId,\n hoverTargetClass,\n onChangeType,\n rightContent,\n }) => {\n const isActiveWithName =\n accessor.state.isActive && Boolean(accessor.label.name);\n const applyHoverStyles = !accessor.state.isFocused && !isActiveWithName;\n const hoverClass =\n applyHoverStyles && hoverTargetClass ? hoverTargetClass : undefined;\n const hasName = Boolean(accessor.label.name);\n\n const hasDropTarget = treeVM.schemaModel.hasValidDropTarget(\n accessor.nodeId,\n );\n const canDrag =\n !accessor.isRoot && !accessor.isReadonly && hasName && hasDropTarget;\n const isDropTarget = accessor.isObject && !accessor.isReadonly;\n\n const canAcceptDrop = useCallback(\n (fromNodeId: string) => {\n return treeVM.schemaModel.canMoveNode(fromNodeId, accessor.nodeId);\n },\n [accessor.nodeId, treeVM.schemaModel],\n );\n\n const handleDrop = useCallback(\n (fromNodeId: string) => {\n treeVM.moveNode(fromNodeId, accessor.nodeId);\n },\n [treeVM, accessor.nodeId],\n );\n\n const {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDraggedOver,\n isDisabledDrop,\n } = useDragAndDrop({\n accessor,\n canDrag,\n isDropTarget,\n canAcceptDrop,\n onDrop: handleDrop,\n });\n\n const showTypeSelector = !accessor.isReadonly;\n\n return (\n <Flex gap=\"0.5rem\" width=\"100%\" justifyContent=\"flex-start\" outline={0}>\n <Flex\n data-testid={isDrop ? `${dataTestId}-drop` : undefined}\n ref={dragAndDropRef}\n flex={hasName ? 0 : 1}\n position=\"relative\"\n whiteSpace=\"nowrap\"\n borderWidth={1}\n borderStyle=\"dashed\"\n borderColor={isDrop ? 'gray.400' : 'transparent'}\n backgroundColor={isDraggedOver ? 'gray.200' : undefined}\n color={isDisabledDrop ? 'gray.300' : undefined}\n >\n {isDraggable && (\n <DragHandle\n dataTestId={dataTestId}\n hoverClass={hoverClass}\n applyHoverStyles={applyHoverStyles}\n />\n )}\n {accessor.isReadonly ? (\n <Text color=\"gray.400\" data-testid={dataTestId}>\n {accessor.label.name}\n </Text>\n ) : (\n <ContentEditable\n dataTestId={dataTestId}\n autoFocus={!accessor.label.name}\n initValue={accessor.label.name}\n placeholder={\n accessor.isRoot\n ? 'Enter the name of the table'\n : 'Enter the name of the field'\n }\n onBlur={accessor.handleFieldBlur}\n onFocus={() => accessor.state.setFocused(true)}\n onChange={accessor.actions.rename}\n onEnter={treeVM.keyboard.handleEditEnter}\n focusTrigger={accessor.state.focusRequestCount}\n />\n )}\n {hasName && accessor.validation.hasError && (\n <ErrorIndicator\n dataTestId={dataTestId}\n errorMessage={accessor.validation.errorMessage ?? ''}\n />\n )}\n </Flex>\n {hasName && (\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <Box className={hoverClass} opacity={applyHoverStyles ? 0 : 1}>\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {showTypeSelector ? (\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={onChangeType}\n open={accessor.state.isMenuOpen}\n onOpenChange={accessor.state.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n textDecoration=\"underline\"\n cursor=\"pointer\"\n >\n {accessor.label.typeLabel}\n </Text>\n }\n />\n ) : (\n <Text\n data-testid={`${dataTestId}-type-label`}\n color=\"gray.400\"\n >\n {accessor.label.typeLabel}\n </Text>\n )}\n {rightContent}\n </Flex>\n </Box>\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiTextT, PiFunction, PiWarning } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface TreeNodeIndicatorsProps {\n accessor: NodeAccessor;\n}\n\nexport const TreeNodeIndicators: FC<TreeNodeIndicatorsProps> = observer(\n ({ accessor }) => {\n const description = accessor.label.description;\n const hasFormula = accessor.formula.hasFormula;\n const formula = accessor.formula.formula;\n const isDeprecated = accessor.label.isDeprecated;\n\n const hasAnyIndicator = description || hasFormula || isDeprecated;\n\n if (!hasAnyIndicator) {\n return null;\n }\n\n return (\n <Flex gap=\"2px\" alignItems=\"center\">\n {isDeprecated && (\n <Tooltip content=\"Deprecated\" positioning={{ placement: 'top' }}>\n <Box\n color=\"orange.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiWarning />\n </Box>\n </Tooltip>\n )}\n {hasFormula && (\n <Tooltip\n content={`Formula: ${formula}`}\n positioning={{ placement: 'top' }}\n >\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiFunction />\n </Box>\n </Tooltip>\n )}\n {description && (\n <Tooltip content={description} positioning={{ placement: 'top' }}>\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiTextT />\n </Box>\n </Tooltip>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useCallback, useState } from 'react';\nimport { PiTextT, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface DescriptionSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const DescriptionSubmenu: FC<DescriptionSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const [localValue, setLocalValue] = useState(\n accessor.label.description ?? '',\n );\n\n const handleBlur = () => {\n accessor.actions.setDescription(localValue || undefined);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-description-menu`}>\n <PiTextT />\n <Box flex=\"1\">Description</Box>\n {accessor.label.description && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.label.description}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"280px\">\n <Textarea\n size=\"sm\"\n placeholder=\"Add description...\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n rows={3}\n ref={useCallback((el: HTMLTextAreaElement | null) => {\n if (el) {\n requestAnimationFrame(() => {\n el.focus({ preventScroll: true });\n const len = el.value.length;\n el.setSelectionRange(len, len);\n });\n }\n }, [])}\n data-testid={`${dataTestId}-description-input`}\n />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport {\n validateFormulaAgainstSchema,\n type JsonObjectSchema,\n} from '@revisium/schema-toolkit';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { PiFunction, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface FormulaSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nconst validateLocally = (\n value: string,\n fieldName: string,\n plainSchema: JsonObjectSchema,\n): string | null => {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const error = validateFormulaAgainstSchema(trimmed, fieldName, plainSchema);\n return error ? error.error : null;\n } catch {\n return 'Invalid formula';\n }\n};\n\nconst FormulaInput: FC<{\n accessor: NodeAccessor;\n dataTestId: string;\n}> = observer(({ accessor, dataTestId }) => {\n const initialValue = accessor.formula.formula;\n const initialError = accessor.formula.errorMessage ?? null;\n const [localValue, setLocalValue] = useState(initialValue);\n const [localError, setLocalError] = useState<string | null>(initialError);\n const localValueRef = useRef(localValue);\n const initialValueRef = useRef(initialValue);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setLocalValue(value);\n localValueRef.current = value;\n const error = validateLocally(\n value,\n accessor.label.name,\n accessor.formula.plainSchema,\n );\n setLocalError(error);\n };\n\n useEffect(() => {\n const accessorRef = accessor;\n const initialRef = initialValueRef;\n return () => {\n const value = localValueRef.current;\n if (value === initialRef.current) {\n return;\n }\n accessorRef.formula.setInputValue(value);\n accessorRef.formula.applyFormula();\n };\n }, [accessor]);\n\n const hasError = localError !== null;\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <>\n <Textarea\n size=\"sm\"\n placeholder=\"e.g. price * quantity\"\n value={localValue}\n onChange={handleChange}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n ref={useCallback((el: HTMLTextAreaElement | null) => {\n if (el) {\n requestAnimationFrame(() => {\n el.focus({ preventScroll: true });\n const len = el.value.length;\n el.setSelectionRange(len, len);\n });\n }\n }, [])}\n rows={2}\n borderColor={hasError ? 'red.300' : undefined}\n data-testid={`${dataTestId}-formula-input`}\n />\n {hasError && (\n <Box\n fontSize=\"xs\"\n color=\"red.500\"\n mt={1}\n data-testid={`${dataTestId}-formula-error`}\n >\n {localError}\n </Box>\n )}\n {!hasError && localValue && (\n <Box fontSize=\"xs\" color=\"gray.500\" mt={1}>\n Field will be readOnly\n </Box>\n )}\n </>\n );\n});\n\nexport const FormulaSubmenu: FC<FormulaSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const hasError = accessor.formula.hasError;\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-formula-menu`}>\n <PiFunction />\n <Box flex=\"1\">Formula</Box>\n {accessor.formula.hasFormula && (\n <Box\n color={hasError ? 'red.400' : 'gray.400'}\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.formula.formula}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content w=\"280px\" p={2}>\n <FormulaInput accessor={accessor} dataTestId={dataTestId} />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import type { NodeAccessor } from '../../../model/accessor';\n\nexport function parseDefaultValue(\n value: string,\n accessor: NodeAccessor,\n): unknown {\n const nodeType = accessor.label.nodeType;\n if (nodeType === 'number') {\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n if (nodeType === 'boolean') {\n return value === 'true';\n }\n return value;\n}\n","import { Box, Input, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useCallback, useState } from 'react';\nimport { PiEquals, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { parseDefaultValue } from './parseDefaultValue';\n\ninterface DefaultValueSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const DefaultValueSubmenu: FC<DefaultValueSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const [localValue, setLocalValue] = useState(accessor.defaultValueAsString);\n\n const handleBlur = () => {\n accessor.actions.setDefaultValue(parseDefaultValue(localValue, accessor));\n };\n\n const handleBooleanChange = (checked: boolean) => {\n accessor.actions.setDefaultValue(checked);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n const isBoolean = accessor.label.nodeType === 'boolean';\n const isNumber = accessor.label.nodeType === 'number';\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-default-menu`}>\n <PiEquals />\n <Box flex=\"1\">Default value</Box>\n {accessor.defaultValueAsString && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.defaultValueAsString}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"200px\">\n {isBoolean ? (\n <Menu.CheckboxItem\n value=\"default-true\"\n checked={accessor.defaultValue === true}\n onCheckedChange={() =>\n handleBooleanChange(accessor.defaultValue !== true)\n }\n data-testid={`${dataTestId}-default-checkbox`}\n >\n true\n <Menu.ItemIndicator />\n </Menu.CheckboxItem>\n ) : (\n <Input\n size=\"sm\"\n type={isNumber ? 'number' : 'text'}\n placeholder={isNumber ? '0' : 'default value'}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n ref={useCallback((el: HTMLInputElement | null) => {\n if (el) {\n requestAnimationFrame(() => {\n el.focus({ preventScroll: true });\n });\n }\n }, [])}\n data-testid={`${dataTestId}-default-input`}\n />\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useRef } from 'react';\nimport { PiTrash } from 'react-icons/pi';\nimport { SettingsButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { DescriptionSubmenu } from './DescriptionSubmenu';\nimport { FormulaSubmenu } from './FormulaSubmenu';\nimport { DefaultValueSubmenu } from './DefaultValueSubmenu';\n\ninterface TreeNodeContextMenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const TreeNodeContextMenu: FC<TreeNodeContextMenuProps> = observer(\n ({\n accessor,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n const handleOpenChange = (details: { open: boolean }) => {\n accessor.state.setSettingsOpen(details.open);\n };\n\n const canDelete = accessor.actions.canRemove;\n\n return (\n <Menu.Root\n open={accessor.state.isSettingsOpen}\n onOpenChange={handleOpenChange}\n positioning={{ placement: 'bottom-start' }}\n >\n <Menu.Trigger asChild>\n <SettingsButton\n height=\"26px\"\n color=\"gray.300\"\n _hover={{ color: 'gray.400' }}\n dataTestId={dataTestId}\n />\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content ref={contentRef} minW=\"220px\">\n <DescriptionSubmenu accessor={accessor} dataTestId={dataTestId} />\n\n {showFormula && (\n <FormulaSubmenu accessor={accessor} dataTestId={dataTestId} />\n )}\n\n {showDefault && (\n <DefaultValueSubmenu\n accessor={accessor}\n dataTestId={dataTestId}\n />\n )}\n\n <Menu.Separator />\n\n <Menu.Item\n value=\"deprecated\"\n onClick={() =>\n accessor.actions.setDeprecated(!accessor.label.isDeprecated)\n }\n data-testid={`${dataTestId}-deprecated`}\n >\n <Box w=\"16px\" />\n {accessor.label.isDeprecated\n ? 'Remove deprecated'\n : 'Mark as deprecated'}\n </Menu.Item>\n\n {showDelete && (\n <>\n <Menu.Separator />\n <Menu.Item\n value=\"delete\"\n color={canDelete ? 'fg.error' : 'gray.400'}\n disabled={!canDelete}\n onClick={canDelete ? onDelete : undefined}\n data-testid={`${dataTestId}-delete`}\n _hover={\n canDelete\n ? { bg: 'bg.error', color: 'fg.error' }\n : undefined\n }\n >\n <PiTrash />\n <Box flex=\"1\">Delete field</Box>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { TreeNodeIndicators } from '../TreeNodeIndicators';\nimport { TreeNodeContextMenu } from '../TreeNodeContextMenu';\n\ninterface TreeNodeRightContentProps {\n accessor: NodeAccessor;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const TreeNodeRightContent: FC<TreeNodeRightContentProps> = observer(\n ({\n accessor,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const showMenu = !accessor.isReadonly;\n\n return (\n <>\n <TreeNodeIndicators accessor={accessor} />\n {showMenu && (\n <TreeNodeContextMenu\n accessor={accessor}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete={showDelete}\n showFormula={showFormula}\n showDefault={showDefault}\n onDelete={onDelete}\n />\n )}\n </>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeWrapper } from '../TreeNodeWrapper';\nimport { TreeNodeField } from '../TreeNodeField';\nimport { TreeNodeRightContent } from '../TreeNodeRightContent';\n\ninterface NodeViewLayoutProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n collapsible?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n children?: ReactNode;\n}\n\nexport const NodeViewLayout: FC<NodeViewLayoutProps> = observer(\n ({\n accessor,\n treeVM,\n dataTestId,\n collapsible = false,\n showFormula,\n showDefault,\n children,\n }) => {\n const hoverTargetClass = accessor.hoverTargetClass;\n const isCollapsible = collapsible && !accessor.isRoot;\n const isCollapsed = isCollapsible && !accessor.state.isExpanded;\n\n return (\n <TreeNodeWrapper\n accessor={accessor}\n isCollapsible={isCollapsible}\n isCollapsed={isCollapsed}\n onToggleCollapse={\n isCollapsible ? accessor.state.toggleExpanded : undefined\n }\n hoverTargetClass={hoverTargetClass}\n dataTestId={dataTestId}\n field={\n <TreeNodeField\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={(typeId) => treeVM.changeNodeType(accessor, typeId)}\n rightContent={\n <TreeNodeRightContent\n accessor={accessor}\n dataTestId={dataTestId}\n showDelete={!accessor.isRoot}\n showFormula={showFormula}\n showDefault={showDefault}\n onDelete={accessor.actions.remove}\n />\n }\n />\n }\n >\n {children}\n </TreeNodeWrapper>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\nimport { TreeNodeView } from '../TreeNodeView';\n\ninterface ObjectNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ObjectNodeView: FC<ObjectNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const hideContent = accessor.isRoot && !accessor.label.name;\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n const showAddButton = !accessor.isReadonly && !hideContent;\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n collapsible\n >\n {!hideContent && (\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.map((childAccessor, index) => (\n <TreeNodeView\n key={childAccessor.nodeId}\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => accessor.actions.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n )}\n </NodeViewLayout>\n );\n },\n);\n","import { Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface ForeignKeyValueProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ accessor, dataTestId }) => {\n const value = accessor.label.foreignKeyTable;\n\n return (\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={accessor.actions.selectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {value || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeView } from '../TreeNodeView';\nimport { ArrayItemsView } from './ArrayItemsView';\nimport { ForeignKeyValue } from './ForeignKeyValue';\n\ninterface ArrayItemsChildrenProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayItemsChildren: FC<ArrayItemsChildrenProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n if (accessor.isObject) {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.map((childAccessor, index) => (\n <TreeNodeView\n key={childAccessor.nodeId}\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {accessor.actions.canAddProperty && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => accessor.actions.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n );\n }\n\n if (accessor.isArray) {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n if (children.length > 0 && children[0]) {\n return (\n <ArrayItemsView\n accessor={accessor}\n childAccessor={children[0]}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n }\n\n if (accessor.isForeignKey) {\n return <ForeignKeyValue accessor={accessor} dataTestId={dataTestId} />;\n }\n\n return null;\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeWrapper } from '../TreeNodeWrapper';\nimport { TreeNodeIndicators } from '../TreeNodeIndicators';\nimport { TreeNodeContextMenu } from '../TreeNodeContextMenu';\nimport { TypeMenu } from '../../TypeMenu/TypeMenu';\nimport { ArrayItemsChildren } from './ArrayItemsChildren';\n\ninterface ArrayItemsViewProps {\n accessor: NodeAccessor;\n childAccessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayItemsView: FC<ArrayItemsViewProps> = observer(\n ({ accessor, childAccessor, treeVM, dataTestId }) => {\n const hoverTargetClass = childAccessor.hoverTargetClass;\n const applyHoverStyles = childAccessor.shouldApplyFieldStyles;\n\n const handleChangeItemsType = (typeId: string) => {\n accessor.actions.changeItemsType(typeId);\n };\n\n return (\n <TreeNodeWrapper\n accessor={childAccessor}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={handleChangeItemsType}\n open={childAccessor.state.isMenuOpen}\n onOpenChange={childAccessor.state.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n cursor=\"pointer\"\n textDecoration=\"underline\"\n outline={0}\n >\n {childAccessor.label.typeLabel}\n </Text>\n }\n />\n <Box\n className={applyHoverStyles ? hoverTargetClass : undefined}\n opacity={applyHoverStyles ? 0 : 1}\n >\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <TreeNodeIndicators accessor={childAccessor} />\n {childAccessor.showMenu && (\n <TreeNodeContextMenu\n accessor={childAccessor}\n dataTestId={`${dataTestId}-items-setting-button`}\n showDelete={false}\n showFormula={childAccessor.isPrimitive}\n showDefault={childAccessor.isPrimitive}\n />\n )}\n </Flex>\n </Box>\n </Flex>\n }\n >\n <ArrayItemsChildren\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-0`}\n />\n </TreeNodeWrapper>\n );\n },\n);\n","import { Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\nimport { ArrayItemsView } from './ArrayItemsView';\n\ninterface ArrayNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayNodeView: FC<ArrayNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n collapsible\n >\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.length > 0 && children[0] ? (\n <ArrayItemsView\n accessor={accessor}\n childAccessor={children[0]}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n ) : (\n <Text color=\"gray.400\" fontSize=\"sm\" ml=\"8px\">\n items\n </Text>\n )}\n </Flex>\n </NodeViewLayout>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface PrimitiveNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const PrimitiveNodeView: FC<PrimitiveNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n showFormula={accessor.isPrimitive}\n showDefault={accessor.isPrimitive}\n />\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useCallback } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface ForeignKeyNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ForeignKeyNodeView: FC<ForeignKeyNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const handleSelectForeignKey = useCallback(async () => {\n const tableId = await treeVM.selectForeignKey();\n if (tableId !== null) {\n accessor.actions.setForeignKey(tableId);\n }\n }, [treeVM, accessor.actions]);\n\n const foreignKeyValue = accessor.label.foreignKeyTable;\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n >\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Box color=\"gray.300\">\n <PiDotOutlineFill />\n </Box>\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={handleSelectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {foreignKeyValue || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n </NodeViewLayout>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface RefNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const RefNodeView: FC<RefNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n },\n);\n","import { Box, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { ObjectNodeView } from '../ObjectNodeView';\nimport { ArrayNodeView } from '../ArrayNodeView';\nimport { PrimitiveNodeView } from '../PrimitiveNodeView';\nimport { ForeignKeyNodeView } from '../ForeignKeyNodeView';\nimport { RefNodeView } from '../RefNodeView';\n\ninterface TreeNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n showItemsLabel?: boolean;\n}\n\nexport const TreeNodeView: FC<TreeNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId, showItemsLabel }) => {\n const renderNode = () => {\n if (accessor.isObject) {\n return (\n <ObjectNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isArray) {\n return (\n <ArrayNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isForeignKey) {\n return (\n <ForeignKeyNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isRef) {\n return (\n <RefNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isPrimitive) {\n return (\n <PrimitiveNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n return null;\n };\n\n if (showItemsLabel) {\n return (\n <Box>\n <Text color=\"gray.400\" fontSize=\"sm\" ml=\"-6px\" mb=\"-4px\">\n items\n </Text>\n {renderNode()}\n </Box>\n );\n }\n\n return renderNode();\n },\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface HighlightProps {\n children: ReactNode;\n}\n\nexport const Highlight: FC<HighlightProps> = ({ children }) => (\n <Box as=\"span\" px=\"1\" bg=\"gray.100\" borderRadius=\"sm\" whiteSpace=\"nowrap\">\n {children}\n </Box>\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface CodeBoxProps {\n children: ReactNode;\n}\n\nexport const CodeBox: FC<CodeBoxProps> = ({ children }) => (\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {children}\n </Box>\n);\n","import { Flex, Portal } from '@chakra-ui/react';\nimport {\n DialogBackdrop,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogPositioner,\n DialogRoot,\n DialogTitle,\n} from '@chakra-ui/react/dialog';\nimport { FC, ReactNode } from 'react';\n\ninterface DialogLayoutProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n children: ReactNode;\n footer?: ReactNode;\n maxWidth?: string;\n}\n\nexport const DialogLayout: FC<DialogLayoutProps> = ({\n isOpen,\n onClose,\n title,\n children,\n footer,\n maxWidth = '700px',\n}) => {\n return (\n <DialogRoot\n open={isOpen}\n onOpenChange={({ open }) => !open && onClose()}\n size=\"lg\"\n >\n <Portal>\n <DialogBackdrop />\n <DialogPositioner>\n <DialogContent maxWidth={maxWidth}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n\n <DialogBody>{children}</DialogBody>\n\n {footer && (\n <DialogFooter>\n <Flex justify=\"space-between\" width=\"100%\">\n {footer}\n </Flex>\n </DialogFooter>\n )}\n\n <DialogCloseTrigger />\n </DialogContent>\n </DialogPositioner>\n </Portal>\n </DialogRoot>\n );\n};\n","import { Button, Flex } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface DialogFooterActionsProps {\n leftContent?: ReactNode;\n onCancel: () => void;\n onConfirm?: () => void;\n confirmLabel?: string;\n confirmDisabled?: boolean;\n confirmLoading?: boolean;\n showConfirm?: boolean;\n}\n\nexport const DialogFooterActions: FC<DialogFooterActionsProps> = ({\n leftContent,\n onCancel,\n onConfirm,\n confirmLabel = 'Confirm',\n confirmDisabled = false,\n confirmLoading = false,\n showConfirm = true,\n}) => {\n return (\n <>\n {leftContent ?? <div />}\n <Flex gap={2}>\n <Button variant=\"outline\" onClick={onCancel}>\n Cancel\n </Button>\n {showConfirm && onConfirm && (\n <Button\n variant=\"outline\"\n onClick={onConfirm}\n disabled={confirmDisabled}\n loading={confirmLoading}\n >\n {confirmLabel}\n </Button>\n )}\n </Flex>\n </>\n );\n};\n","import {\n PiPlusLight,\n PiMinusLight,\n PiArrowsLeftRightLight,\n PiPencilSimpleLight,\n} from 'react-icons/pi';\nimport { IconType } from 'react-icons';\nimport { jsonPointerToSimplePath } from '@revisium/schema-toolkit';\nimport type { SchemaPatch, PropertyChange } from '@revisium/schema-toolkit';\nimport type { DefaultValueExample } from '../../../../model/utils';\n\nexport type PatchOp = 'add' | 'remove' | 'move' | 'replace';\n\nexport const operationIcons: Record<PatchOp, IconType> = {\n add: PiPlusLight,\n remove: PiMinusLight,\n move: PiArrowsLeftRightLight,\n replace: PiPencilSimpleLight,\n};\n\nexport const formatDefaultValue = (value: unknown): string => {\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value, null, 2);\n }\n return JSON.stringify(value);\n};\n\nexport const formatChangeValue = (value: unknown): string => {\n if (value === undefined) {\n return '(none)';\n }\n if (typeof value === 'string') {\n return value || '\"\"';\n }\n return JSON.stringify(value);\n};\n\nexport const getFromFieldName = (patch: SchemaPatch['patch']): string => {\n if (patch.op === 'move' && patch.from) {\n return jsonPointerToSimplePath(patch.from);\n }\n return '';\n};\n\nexport const getFilteredPropertyChanges = (\n op: string,\n propertyChanges: PropertyChange[],\n defaultExample: DefaultValueExample | null,\n): PropertyChange[] => {\n if (op === 'remove') {\n return [];\n }\n if (op === 'add' && defaultExample) {\n return propertyChanges.filter((c) => c.property !== 'default');\n }\n return propertyChanges;\n};\n","import { Badge, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiPencilSimpleLight } from 'react-icons/pi';\nimport type { SchemaPatch } from '@revisium/schema-toolkit';\nimport { Highlight } from '../Highlight';\nimport { operationIcons, getFromFieldName, PatchOp } from './helpers';\n\ninterface OperationDescriptionProps {\n schemaPatch: SchemaPatch;\n}\n\nexport const OperationDescription: FC<OperationDescriptionProps> = ({\n schemaPatch,\n}) => {\n const { patch, fieldName } = schemaPatch;\n const IconComponent = operationIcons[patch.op as PatchOp];\n\n switch (patch.op) {\n case 'add':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was added\n </Text>\n </Flex>\n );\n case 'remove':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was removed\n </Text>\n </Flex>\n );\n case 'move': {\n const fromField = getFromFieldName(patch);\n if (schemaPatch.isRename) {\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Renamed field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n </Flex>\n );\n }\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Moved field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n {schemaPatch.movesIntoArray && (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data will be cloned\n </Badge>\n )}\n </Flex>\n );\n }\n case 'replace':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was modified\n </Text>\n </Flex>\n );\n default:\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiPencilSimpleLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was changed\n </Text>\n </Flex>\n );\n }\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport type { DefaultValueExample } from '../../../../model/utils';\nimport { formatDefaultValue } from './helpers';\n\ninterface DefaultValueRowProps {\n example: DefaultValueExample;\n}\n\nexport const DefaultValueRow: FC<DefaultValueRowProps> = ({ example }) => {\n const { value, type, foreignKeyTableId } = example;\n\n if (foreignKeyTableId) {\n return null;\n }\n\n const formattedValue = formatDefaultValue(value);\n const isMultiline = formattedValue.includes('\\n');\n\n return (\n <Flex\n align={isMultiline ? 'flex-start' : 'center'}\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n >\n <Text color=\"gray.400\">default:</Text>\n <Box\n as=\"code\"\n px={isMultiline ? 2 : 1}\n py={isMultiline ? 1.5 : 0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n whiteSpace={isMultiline ? 'pre' : 'nowrap'}\n >\n {formattedValue}\n </Box>\n <Text color=\"gray.400\">({type})</Text>\n </Flex>\n );\n};\n","import { Badge } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport type { DataLossSeverity } from '../../../../model/utils';\n\ninterface DataLossBadgeProps {\n severity: DataLossSeverity;\n}\n\nexport const DataLossBadge: FC<DataLossBadgeProps> = ({ severity }) => {\n if (severity === 'none') {\n return null;\n }\n\n if (severity === 'possible') {\n return (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data may be lost\n </Badge>\n );\n }\n\n return (\n <Badge size=\"sm\" colorPalette=\"red\" variant=\"subtle\">\n data loss\n </Badge>\n );\n};\n","import { Badge, Flex, Icon, Text, VStack } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowRight } from 'react-icons/pi';\nimport type { TransformationInfo } from '../../../../model/utils';\nimport { CodeBox } from '../CodeBox';\nimport { DataLossBadge } from './DataLossBadge';\n\ninterface TransformationInfoRowProps {\n info: TransformationInfo;\n}\n\nexport const TransformationInfoRow: FC<TransformationInfoRowProps> = ({\n info,\n}) => {\n return (\n <VStack align=\"stretch\" gap={1} pl={2}>\n <Flex align=\"center\" gap={2} fontSize=\"xs\" flexWrap=\"wrap\">\n {info.steps.map((step, stepIndex) => (\n <Flex key={step.name} align=\"center\" gap={1}>\n {stepIndex > 0 && <Text color=\"gray.400\">+</Text>}\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\">\n {step.name}\n </Badge>\n </Flex>\n ))}\n <DataLossBadge severity={info.dataLossSeverity} />\n </Flex>\n\n <Flex align=\"center\" gap={2} fontSize=\"xs\" color=\"gray.500\">\n <Text color=\"gray.400\">example:</Text>\n <CodeBox>{JSON.stringify(info.example.before)}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{JSON.stringify(info.example.after)}</CodeBox>\n </Flex>\n </VStack>\n );\n};\n","import { Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowRight } from 'react-icons/pi';\nimport { CodeBox } from '../CodeBox';\n\ninterface ValueChangeRowProps {\n label: string;\n fromValue: string;\n toValue: string;\n}\n\nexport const ValueChangeRow: FC<ValueChangeRowProps> = ({\n label,\n fromValue,\n toValue,\n}) => (\n <Flex\n align=\"center\"\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n flexWrap=\"wrap\"\n >\n <Text color=\"gray.400\">{label}:</Text>\n <CodeBox>{fromValue}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{toValue}</CodeBox>\n </Flex>\n);\n","import { Box } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useMemo } from 'react';\nimport type { SchemaPatch } from '@revisium/schema-toolkit';\nimport {\n getTransformationInfoFromTypeChange,\n getDefaultValueExample,\n} from '../../../../model/utils';\nimport { OperationDescription } from './OperationDescription';\nimport { DefaultValueRow } from './DefaultValueRow';\nimport { TransformationInfoRow } from './TransformationInfoRow';\nimport { ValueChangeRow } from './ValueChangeRow';\nimport { formatChangeValue, getFilteredPropertyChanges } from './helpers';\n\ninterface PatchRowProps {\n schemaPatch: SchemaPatch;\n}\n\nexport const PatchRow: FC<PatchRowProps> = observer(({ schemaPatch }) => {\n const { patch, typeChange, propertyChanges } = schemaPatch;\n\n const transformationInfo = useMemo(\n () =>\n typeChange\n ? getTransformationInfoFromTypeChange(\n typeChange.fromType,\n typeChange.toType,\n )\n : null,\n [typeChange],\n );\n const defaultExample = useMemo(() => {\n if (patch.op === 'add' && patch.value !== undefined) {\n return getDefaultValueExample({\n op: 'add',\n path: patch.path,\n value: patch.value,\n });\n }\n return null;\n }, [patch]);\n\n const filteredChanges = useMemo(\n () => getFilteredPropertyChanges(patch.op, propertyChanges, defaultExample),\n [patch.op, propertyChanges, defaultExample],\n );\n\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <OperationDescription schemaPatch={schemaPatch} />\n\n {defaultExample && (\n <Box mt={2} ml={8}>\n <DefaultValueRow example={defaultExample} />\n </Box>\n )}\n\n {transformationInfo && (\n <Box mt={2} ml={8}>\n <TransformationInfoRow info={transformationInfo} />\n </Box>\n )}\n\n {filteredChanges.map((change) => (\n <Box key={change.property} mt={2} ml={8}>\n <ValueChangeRow\n label={change.property}\n fromValue={formatChangeValue(change.from)}\n toValue={formatChangeValue(change.to)}\n />\n </Box>\n ))}\n </Box>\n );\n});\n","import { Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowsLeftRightLight } from 'react-icons/pi';\nimport type { TableIdChangeInfo } from '../../../../model/dialog';\nimport { Highlight } from '../Highlight';\n\ninterface TableIdChangeRowProps {\n change: TableIdChangeInfo;\n}\n\nexport const TableIdChangeRow: FC<TableIdChangeRowProps> = ({ change }) => {\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiArrowsLeftRightLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Table renamed from <Highlight>{change.initialTableId}</Highlight> to{' '}\n <Highlight>{change.currentTableId}</Highlight>\n </Text>\n </Flex>\n </Box>\n );\n};\n","import { Badge, Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiWarningCircle } from 'react-icons/pi';\n\nexport type ErrorType = 'validation' | 'formula' | 'tableId';\n\ninterface ErrorItemProps {\n message: string;\n type?: ErrorType;\n fieldPath?: string;\n}\n\nexport const ErrorItem: FC<ErrorItemProps> = ({ message, type, fieldPath }) => (\n <Box py={2} px={4}>\n <Flex align=\"center\" gap={2}>\n <Icon as={PiWarningCircle} color=\"gray.400\" boxSize={4} flexShrink={0} />\n <Text fontSize=\"sm\" color=\"gray.600\">\n {type === 'formula' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n formula\n </Badge>\n )}\n {type === 'tableId' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n table name\n </Badge>\n )}\n {fieldPath && (\n <Box as=\"span\" fontWeight=\"medium\">\n {fieldPath}:{' '}\n </Box>\n )}\n {message}\n </Text>\n </Flex>\n </Box>\n);\n","import { Button, Flex, Icon, Popover, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowCounterClockwiseBold } from 'react-icons/pi';\n\ninterface RevertButtonProps {\n onRevert: () => void;\n disabled?: boolean;\n}\n\nexport const RevertButton: FC<RevertButtonProps> = ({ onRevert, disabled }) => {\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Button variant=\"ghost\" size=\"sm\" color=\"gray.500\" disabled={disabled}>\n <Icon as={PiArrowCounterClockwiseBold} />\n Revert All\n </Button>\n </Popover.Trigger>\n <Popover.Positioner>\n <Popover.Content>\n <Popover.Arrow />\n <Popover.Body>\n <Text fontSize=\"sm\" mb={3}>\n This will revert all changes. Are you sure?\n </Text>\n <Flex gap={2} justify=\"flex-end\">\n <Popover.CloseTrigger asChild>\n <Button variant=\"outline\" size=\"xs\">\n Cancel\n </Button>\n </Popover.CloseTrigger>\n <Popover.CloseTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"xs\"\n colorPalette=\"red\"\n onClick={onRevert}\n >\n Revert\n </Button>\n </Popover.CloseTrigger>\n </Flex>\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Popover.Root>\n );\n};\n","import { Box, Text, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { ReviewErrorsDialogVM } from '../../../model/dialog';\nimport {\n DialogLayout,\n DialogFooterActions,\n ErrorItem,\n RevertButton,\n} from '../shared';\n\ninterface ReviewErrorsDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: ReviewErrorsDialogVM;\n}\n\nexport const ReviewErrorsDialog: FC<ReviewErrorsDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Review Errors for \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n leftContent={\n vm.canRevert ? <RevertButton onRevert={vm.revert} /> : undefined\n }\n onCancel={onClose}\n showConfirm={false}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"gray.50\"\n overflow=\"hidden\"\n >\n <Box\n py={2}\n px={4}\n bg=\"gray.100\"\n borderBottom=\"1px solid\"\n borderColor=\"gray.200\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"gray.600\">\n Please fix the following errors before applying changes:\n </Text>\n </Box>\n <VStack\n align=\"stretch\"\n gap={0}\n divideY=\"1px\"\n divideColor=\"gray.100\"\n >\n {vm.tableIdError && (\n <ErrorItem\n key=\"tableId-error\"\n message={vm.tableIdError}\n type=\"tableId\"\n />\n )}\n {vm.validationErrors.map((error) => (\n <ErrorItem\n key={`validation-${error.nodeId}`}\n message={error.message}\n type=\"validation\"\n />\n ))}\n {vm.formulaErrors.map((error) => (\n <ErrorItem\n key={`formula-${error.fieldPath ?? ''}-${error.message}`}\n message={error.message}\n type=\"formula\"\n fieldPath={error.fieldPath}\n />\n ))}\n </VStack>\n </Box>\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, Flex, SegmentGroup, Text, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { JsonCard } from '../../../../components/JsonCard';\nimport type { ReviewChangesDialogVM } from '../../../model/dialog';\nimport {\n DialogLayout,\n DialogFooterActions,\n PatchRow,\n TableIdChangeRow,\n RevertButton,\n} from '../shared';\n\ninterface ReviewChangesDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: ReviewChangesDialogVM;\n}\n\nexport const ReviewChangesDialog: FC<ReviewChangesDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n const applyButtonText = `Apply Changes (${vm.totalChangesCount})`;\n\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Review Changes for \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n leftContent={\n <RevertButton onRevert={vm.revert} disabled={!vm.hasChanges} />\n }\n onCancel={onClose}\n onConfirm={vm.approve}\n confirmLabel={applyButtonText}\n confirmDisabled={!vm.hasChanges}\n confirmLoading={vm.loading}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n {vm.hasChanges ? (\n <>\n <SegmentGroup.Root\n size=\"sm\"\n value={vm.viewMode}\n onValueChange={(details) =>\n vm.setViewMode(details.value as 'Changes' | 'Patches')\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Changes', 'Patches']} />\n </SegmentGroup.Root>\n\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {vm.viewMode === 'Changes' ? (\n <>\n {vm.tableIdChange && (\n <TableIdChangeRow change={vm.tableIdChange} />\n )}\n {vm.patches.map((schemaPatch) => (\n <PatchRow\n key={`${schemaPatch.patch.op}:${schemaPatch.patch.path}`}\n schemaPatch={schemaPatch}\n />\n ))}\n </>\n ) : (\n <JsonCard readonly data={vm.patches.map((p) => p.patch)} />\n )}\n </Box>\n\n <Text fontSize=\"xs\" color=\"gray.500\">\n Data in existing rows will be automatically transformed\n according to the new schema.\n </Text>\n </>\n ) : (\n <Flex justify=\"center\" align=\"center\" minHeight=\"100px\">\n <Text color=\"gray.400\" fontSize=\"sm\">\n No changes to apply\n </Text>\n </Flex>\n )}\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, SegmentGroup, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { JsonCard } from '../../../../components/JsonCard';\nimport type { CreateTableDialogVM } from '../../../model/dialog';\nimport type { JsonValue } from '@revisium/schema-toolkit';\nimport { DialogLayout, DialogFooterActions } from '../shared';\n\ninterface CreateTableDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: CreateTableDialogVM;\n}\n\nexport const CreateTableDialog: FC<CreateTableDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Create Table \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n onCancel={onClose}\n onConfirm={vm.approve}\n confirmLabel=\"Create Table\"\n confirmLoading={vm.loading}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n <SegmentGroup.Root\n size=\"sm\"\n value={vm.viewMode}\n onValueChange={(details) =>\n vm.setViewMode(details.value as 'Example' | 'Schema')\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Example', 'Schema']} />\n </SegmentGroup.Root>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {vm.viewMode === 'Example' ? (\n <JsonCard readonly data={(vm.exampleData ?? null) as JsonValue} />\n ) : (\n <JsonCard readonly data={(vm.plainSchema ?? null) as JsonValue} />\n )}\n </Box>\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, Button, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { ViewerSwitcher } from '../../../components/ViewerSwitcher';\nimport { ViewerSwitcherMode } from '../../types';\nimport { JsonCard } from '../../../components/JsonCard';\nimport type { BaseEditorVM } from '../../model/vm/types';\nimport { TreeNodeView } from '../tree';\nimport { ReviewErrorsDialog } from '../dialog';\nimport type { JsonValue } from '@revisium/schema-toolkit';\n\nexport interface SchemaEditorProps {\n vm: BaseEditorVM;\n dataTestId: string;\n backButton: ReactNode;\n primaryAction?: {\n show: boolean;\n label: string;\n testId: string;\n onClick: () => void;\n };\n dialogs: ReactNode;\n}\n\nexport const SchemaEditor: FC<SchemaEditorProps> = observer(\n ({ vm, dataTestId, backButton, primaryAction, dialogs }) => {\n return (\n <Flex\n flex={1}\n flexDirection=\"column\"\n gap=\"0.5rem\"\n css={{\n '&:hover .editor-hover-target': { opacity: 1 },\n }}\n data-testid={dataTestId}\n >\n <Flex\n justifyContent=\"space-between\"\n width=\"100%\"\n alignItems=\"center\"\n paddingBottom=\"8px\"\n >\n <Box>\n {backButton}\n {vm.showReviewErrorsButton && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={vm.openErrorsDialog}\n data-testid=\"schema-editor-review-errors-button\"\n >\n Review Errors ({vm.errorsCount})\n </Button>\n )}\n {primaryAction?.show && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={primaryAction.onClick}\n loading={vm.loading}\n data-testid={primaryAction.testId}\n >\n {primaryAction.label}\n </Button>\n )}\n </Box>\n <Box className=\"editor-hover-target\" opacity={0}>\n <ViewerSwitcher\n availableRefByMode={false}\n mode={vm.viewMode as ViewerSwitcherMode}\n onChange={(mode) => vm.setViewMode(mode)}\n />\n </Box>\n </Flex>\n\n {vm.viewMode === ViewerSwitcherMode.Tree && (\n <Box\n ref={(el: HTMLDivElement | null) =>\n vm.tree.keyboard.setContainerRef(el)\n }\n tabIndex={0}\n onKeyDown={vm.tree.keyboard.handleKeyDown}\n outline={0}\n paddingBottom=\"4rem\"\n >\n <TreeNodeView\n accessor={vm.tree.rootAccessor}\n treeVM={vm.tree}\n dataTestId=\"root\"\n />\n </Box>\n )}\n\n {vm.viewMode === ViewerSwitcherMode.Json && (\n <JsonCard\n readonly\n data={vm.getPlainSchema() as unknown as JsonValue}\n />\n )}\n\n <ReviewErrorsDialog\n isOpen={vm.isErrorsDialogOpen}\n onClose={vm.closeErrorsDialog}\n vm={vm.errorsDialogVM}\n />\n\n {dialogs}\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CloseButton } from '../../../components';\nimport type { CreatingEditorVM } from '../../model/vm';\nimport { SchemaEditor } from '../SchemaEditor';\nimport { CreateTableDialog } from '../dialog';\n\nexport interface CreatingSchemaEditorProps {\n vm: CreatingEditorVM;\n}\n\nexport const CreatingSchemaEditor: FC<CreatingSchemaEditorProps> = observer(\n ({ vm }) => {\n return (\n <SchemaEditor\n vm={vm}\n dataTestId=\"schema-editor-creating\"\n backButton={\n <CloseButton\n dataTestId=\"close-create-table-button\"\n onClick={vm.cancel}\n />\n }\n primaryAction={{\n show: vm.showCreateTableButton,\n label: 'Create Table',\n testId: 'schema-editor-create-button',\n onClick: vm.openCreateDialog,\n }}\n dialogs={\n <CreateTableDialog\n isOpen={vm.isCreateDialogOpen}\n onClose={vm.closeCreateDialog}\n vm={vm.createDialogVM}\n />\n }\n />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { BackButton } from '../../../components/BackButton';\nimport type { UpdatingEditorVM } from '../../model/vm';\nimport { SchemaEditor } from '../SchemaEditor';\nimport { ReviewChangesDialog } from '../dialog';\n\nexport interface UpdatingSchemaEditorProps {\n vm: UpdatingEditorVM;\n}\n\nexport const UpdatingSchemaEditor: FC<UpdatingSchemaEditorProps> = observer(\n ({ vm }) => {\n return (\n <SchemaEditor\n vm={vm}\n dataTestId=\"schema-editor-updating\"\n backButton={\n <BackButton\n dataTestId=\"back-to-table-list-button\"\n onClick={vm.cancel}\n />\n }\n primaryAction={{\n show: vm.showApplyChangesButton,\n label: `Apply Changes (${vm.totalChangesCount})`,\n testId: 'schema-editor-approve-button',\n onClick: vm.openChangesDialog,\n }}\n dialogs={\n <ReviewChangesDialog\n isOpen={vm.isChangesDialogOpen}\n onClose={vm.closeChangesDialog}\n vm={vm.changesDialogVM}\n />\n }\n />\n );\n },\n);\n","import type { ArrayNodeVM, NodeVM } from './types';\n\nexport type FlatItem =\n | { readonly type: 'node'; readonly node: NodeVM }\n | {\n readonly type: 'add-button';\n readonly array: ArrayNodeVM;\n readonly guides: boolean[];\n };\n\nfunction traverse(node: NodeVM, result: FlatItem[]): void {\n result.push({ type: 'node', node });\n\n if (node.showChildren) {\n for (const child of node.childNodes) {\n traverse(child, result);\n }\n }\n\n if (node.isArray() && node.showAddButton) {\n result.push({\n type: 'add-button',\n array: node,\n guides: [...node.guides, false],\n });\n }\n}\n\nexport function flattenNodes(root: NodeVM): readonly FlatItem[] {\n const result: FlatItem[] = [];\n\n if (root.isObject()) {\n for (const child of root.children) {\n traverse(child, result);\n }\n } else {\n traverse(root, result);\n }\n\n return result;\n}\n","import { makeAutoObservable, observable } from 'mobx';\n\nexport class RowTreeState {\n private readonly _expanded = observable.map<string, boolean>();\n private readonly _focused = observable.map<string, boolean>();\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n isExpanded(nodeId: string): boolean {\n return this._expanded.get(nodeId) ?? true;\n }\n\n setExpanded(nodeId: string, value: boolean): void {\n this._expanded.set(nodeId, value);\n }\n\n toggleExpanded(nodeId: string): void {\n this._expanded.set(nodeId, !this.isExpanded(nodeId));\n }\n\n isFocused(nodeId: string): boolean {\n return this._focused.get(nodeId) ?? false;\n }\n\n setFocused(nodeId: string, value: boolean): void {\n this._focused.set(nodeId, value);\n }\n\n expandAll(nodeIds: string[]): void {\n for (const nodeId of nodeIds) {\n this._expanded.set(nodeId, true);\n }\n }\n\n collapseAll(nodeIds: string[]): void {\n for (const nodeId of nodeIds) {\n this._expanded.set(nodeId, false);\n }\n }\n\n reset(): void {\n this._expanded.clear();\n this._focused.clear();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n ValueNode,\n ValueTreeLike,\n ForeignKeyValueNode,\n} from '@revisium/schema-toolkit';\nimport { isForeignKeyValueNode } from '@revisium/schema-toolkit';\nimport type {\n NodeVM,\n PrimitiveNodeVM,\n ObjectNodeVM,\n ArrayNodeVM,\n ForeignKeyNodeVM,\n FileNodeVM,\n MenuItem,\n NodeRendererType,\n EditorContext,\n RowEditorCallbacks,\n} from '../types';\nimport type { RowNodeState } from './RowNodeState';\nimport type { RowNodeMenu } from './RowNodeMenu';\nimport type { RowNodeLayout } from './RowNodeLayout';\nimport type { ChildResolver } from './ChildResolver';\n\ntype PrimitiveValue = string | number | boolean;\n\ninterface PrimitiveNode extends ValueNode {\n value: PrimitiveValue;\n defaultValue: PrimitiveValue;\n isReadOnly: boolean;\n setValue(value: unknown): void;\n}\n\ninterface ArrayNode extends ValueNode {\n value: readonly ValueNode[];\n length: number;\n at(index: number): ValueNode | undefined;\n pushValue(value: unknown): void;\n removeAt(index: number): void;\n move(fromIndex: number, toIndex: number): void;\n}\n\ninterface DirtyNode {\n isDirty: boolean;\n}\n\nexport class RowNodeAccessor implements NodeVM {\n private _menu!: RowNodeMenu;\n private _layout!: RowNodeLayout;\n\n constructor(\n public readonly node: ValueNode,\n public readonly parent: RowNodeAccessor | null,\n private readonly _state: RowNodeState,\n private readonly _tree: ValueTreeLike,\n public readonly editorContext: EditorContext | null,\n private readonly _childResolver: ChildResolver,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n setMenu(menu: RowNodeMenu): void {\n this._menu = menu;\n }\n\n setLayout(layout: RowNodeLayout): void {\n this._layout = layout;\n }\n\n // --- Identity ---\n\n get id(): string {\n return this.node.id;\n }\n\n get name(): string {\n return this.node.name;\n }\n\n get displayName(): string {\n if (this.parent) {\n return this.node.name;\n }\n return this._rootDisplayName();\n }\n\n get testId(): string {\n if (!this.parent) {\n return 'root';\n }\n const parentId = this.parent.testId;\n if (parentId === 'root' && this.parent.isObject()) {\n return this.name;\n }\n return `${parentId}-${this.name}`;\n }\n\n // --- Type guards ---\n\n isPrimitive(): this is PrimitiveNodeVM {\n return this.node.isPrimitive();\n }\n\n isObject(): this is ObjectNodeVM {\n return this.node.isObject();\n }\n\n isArray(): this is ArrayNodeVM {\n return this.node.isArray();\n }\n\n // --- State (delegated to RowNodeState) ---\n\n get isExpanded(): boolean {\n return this._state.isExpanded;\n }\n\n set isExpanded(value: boolean) {\n this._state.setExpanded(value);\n }\n\n get isFocused(): boolean {\n return this._state.isFocused;\n }\n\n expand(): void {\n this._state.setExpanded(true);\n }\n\n collapse(): void {\n this._state.setExpanded(false);\n }\n\n toggleExpanded(): void {\n this._state.toggleExpanded();\n }\n\n setFocused(focused: boolean): void {\n this._state.setFocused(focused);\n }\n\n // --- Layout (delegated to RowNodeLayout) ---\n\n get depth(): number {\n return this._layout.depth;\n }\n\n get guides(): boolean[] {\n return this._layout.guides;\n }\n\n get isCollapsible(): boolean {\n return this._layout.isCollapsible;\n }\n\n get isCollapsibleTree(): boolean {\n return this._layout.isCollapsibleTree;\n }\n\n get rendererType(): NodeRendererType {\n return this._layout.rendererType;\n }\n\n get isContainer(): boolean {\n return this._layout.isContainer;\n }\n\n get childNodes(): readonly NodeVM[] {\n return this._childResolver.getChildren(this);\n }\n\n get showChildren(): boolean {\n return this._layout.showChildren;\n }\n\n get collapsedLabel(): string {\n return this._layout.collapsedLabel;\n }\n\n get isLongText(): boolean {\n return this._layout.isLongText;\n }\n\n expandAll(): void {\n this._layout.expandAll();\n }\n\n collapseAll(): void {\n this._layout.collapseAll();\n }\n\n // --- Menu ---\n\n get menu(): MenuItem[] {\n return this._menu.menu;\n }\n\n // --- Misc ---\n\n get formula(): string | undefined {\n if (this.node.isPrimitive()) {\n return this.node.formula?.expression;\n }\n return undefined;\n }\n\n get isEditorReadOnly(): boolean {\n return this.editorContext?.isReadOnly ?? false;\n }\n\n get path(): string {\n return this._tree.pathOf(this.node).asString();\n }\n\n get isDirty(): boolean {\n return (this.node as unknown as DirtyNode).isDirty;\n }\n\n // --- Primitive ---\n\n get value(): PrimitiveValue {\n return (this.node as PrimitiveNode).value;\n }\n\n get defaultValue(): PrimitiveValue {\n return (this.node as PrimitiveNode).defaultValue;\n }\n\n get isReadOnly(): boolean {\n return (this.node as PrimitiveNode).isReadOnly;\n }\n\n get isFieldReadOnly(): boolean {\n return this.isReadOnly || this.isEditorReadOnly;\n }\n\n setValue(value: unknown): void {\n (this.node as PrimitiveNode).setValue(value);\n }\n\n // --- Object ---\n\n get children(): readonly NodeVM[] {\n if (!this.node.isObject()) {\n return [];\n }\n return this._childResolver.getChildren(this);\n }\n\n child(name: string): NodeVM | undefined {\n return (this.children as readonly RowNodeAccessor[]).find(\n (c) => c.name === name,\n );\n }\n\n // --- Array ---\n\n get items(): readonly NodeVM[] {\n if (!this.node.isArray()) {\n return [];\n }\n return this._childResolver.getChildren(this);\n }\n\n get length(): number {\n if (!this.node.isArray()) {\n return 0;\n }\n return (this.node as ArrayNode).length;\n }\n\n at(index: number): NodeVM | undefined {\n const allItems = this.items as readonly RowNodeAccessor[];\n if (index < 0 || index >= allItems.length) {\n return undefined;\n }\n return allItems[index];\n }\n\n pushValue(value: unknown): void {\n (this.node as ArrayNode).pushValue(value);\n }\n\n removeAt(index: number): void {\n (this.node as ArrayNode).removeAt(index);\n }\n\n move(fromIndex: number, toIndex: number): void {\n (this.node as ArrayNode).move(fromIndex, toIndex);\n }\n\n insertAt(index: number): void {\n (this.node as ArrayNode).pushValue(null);\n const lastIndex = this.length - 1;\n if (index < lastIndex) {\n (this.node as ArrayNode).move(lastIndex, index);\n }\n }\n\n get showAddButton(): boolean {\n return this.isExpanded && !this.isEditorReadOnly;\n }\n\n // --- ForeignKey ---\n\n isForeignKey(): this is ForeignKeyNodeVM {\n return isForeignKeyValueNode(this.node);\n }\n\n get foreignKeyTableId(): string {\n return (this.node as unknown as ForeignKeyValueNode).foreignKey;\n }\n\n // --- File ---\n\n isFile(): this is FileNodeVM {\n return this.rendererType === 'file';\n }\n\n get fileStatus(): string {\n return this._getFileChildValue('status', '');\n }\n\n get fileId(): string {\n return this._getFileChildValue('fileId', '');\n }\n\n get fileUrl(): string {\n return this._getFileChildValue('url', '');\n }\n\n get fileMimeType(): string {\n return this._getFileChildValue('mimeType', '');\n }\n\n get fileWidth(): number {\n return this._getFileChildNumericValue('width');\n }\n\n get fileHeight(): number {\n return this._getFileChildNumericValue('height');\n }\n\n // --- Callbacks ---\n\n get callbacks(): RowEditorCallbacks | null {\n return this.editorContext?.callbacks ?? null;\n }\n\n // --- Internal ---\n\n getChildAccessors(): readonly RowNodeAccessor[] {\n return this._childResolver.getChildren(this);\n }\n\n // --- Private helpers ---\n\n private _getFileChildValue(name: string, fallback: string): string {\n if (!this.node.isObject()) {\n return fallback;\n }\n const child = this.node.child(name);\n if (child?.isPrimitive()) {\n return String(child.value);\n }\n return fallback;\n }\n\n private _rootDisplayName(): string {\n const schema = this.node.schema;\n if (!('type' in schema)) {\n return this.node.name;\n }\n return `<${schema.type}>`;\n }\n\n private _getFileChildNumericValue(name: string): number {\n if (!this.node.isObject()) {\n return 0;\n }\n const child = this.node.child(name);\n if (child?.isPrimitive()) {\n return Number(child.value) || 0;\n }\n return 0;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { RowTreeState } from '../state/RowTreeState';\n\nexport class RowNodeState {\n constructor(\n private readonly _nodeId: string,\n private readonly _treeState: RowTreeState,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get isExpanded(): boolean {\n return this._treeState.isExpanded(this._nodeId);\n }\n\n setExpanded(value: boolean): void {\n this._treeState.setExpanded(this._nodeId, value);\n }\n\n toggleExpanded(): void {\n this._treeState.toggleExpanded(this._nodeId);\n }\n\n get isFocused(): boolean {\n return this._treeState.isFocused(this._nodeId);\n }\n\n setFocused(value: boolean): void {\n this._treeState.setFocused(this._nodeId, value);\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { ValueNode } from '@revisium/schema-toolkit';\nimport type { MenuItem } from '../types';\nimport type { RowNodeAccessor } from './RowNodeAccessor';\n\ninterface ArrayItemContext {\n index: number;\n arrayLength: number;\n insertAt(index: number): void;\n removeAt(index: number): void;\n move(from: number, to: number): void;\n}\n\nexport class RowNodeMenu {\n constructor(private readonly _accessor: RowNodeAccessor) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get menu(): MenuItem[] {\n return [\n ...this.topMenu,\n ...this.arrayOwnMenu,\n ...this.arrayItemMenu,\n ...this.bottomMenu,\n ];\n }\n\n private get arrayItemContext(): ArrayItemContext | null {\n const parent = this._accessor.parent;\n if (!parent || !parent.node.isArray()) {\n return null;\n }\n const arrayNode = parent.node as ValueNode & {\n value: readonly ValueNode[];\n };\n const index = arrayNode.value.indexOf(this._accessor.node);\n if (index === -1) {\n return null;\n }\n return {\n index,\n arrayLength: arrayNode.value.length,\n insertAt: (i: number) => parent.insertAt(i),\n removeAt: (i: number) => parent.removeAt(i),\n move: (from: number, to: number) => parent.move(from, to),\n };\n }\n\n private get topMenu(): MenuItem[] {\n if (!this._accessor.isCollapsibleTree) {\n return [];\n }\n return [\n {\n value: 'expand',\n label: 'Expand',\n handler: () => this._accessor.expandAll(),\n },\n {\n value: 'collapse',\n label: 'Collapse',\n handler: () => this._accessor.collapseAll(),\n afterSeparator: true,\n },\n ];\n }\n\n private get arrayOwnMenu(): MenuItem[] {\n if (!this._accessor.node.isArray()) {\n return [];\n }\n\n return [\n {\n value: 'array',\n label: 'Array',\n children: [\n ...(this._accessor.length > 0\n ? [\n {\n value: 'add-first',\n label: 'Add item to start',\n handler: () => this._accessor.insertAt(0),\n },\n ]\n : []),\n {\n value: 'add-last',\n label: 'Add item to end',\n handler: () => this._accessor.pushValue(null),\n },\n ],\n },\n ];\n }\n\n private get arrayItemMenu(): MenuItem[] {\n const ctx = this.arrayItemContext;\n if (!ctx) {\n return [];\n }\n\n const moveMenuItem =\n ctx.arrayLength > 1 ? this.buildMoveMenuItem(ctx) : null;\n\n return [\n ...(moveMenuItem ? [moveMenuItem] : []),\n {\n value: 'item',\n label: 'Item',\n children: [\n {\n value: 'add-before',\n label: 'Add before',\n handler: () => ctx.insertAt(ctx.index),\n },\n {\n value: 'add-after',\n label: 'Add after',\n handler: () => ctx.insertAt(ctx.index + 1),\n },\n ],\n },\n {\n value: 'delete',\n label: 'Delete',\n handler: () => ctx.removeAt(ctx.index),\n afterSeparator: true,\n },\n ];\n }\n\n private buildMoveMenuItem(ctx: ArrayItemContext): MenuItem {\n const { index, arrayLength } = ctx;\n const isFirst = index === 0;\n const isLast = index === arrayLength - 1;\n\n const moveChildren: MenuItem[] = [\n ...(arrayLength > 2 && index > 1\n ? [\n {\n value: 'move-to-start',\n label: 'to start',\n handler: () => ctx.move(index, 0),\n },\n ]\n : []),\n ...(!isFirst\n ? [\n {\n value: 'move-up',\n label: 'up',\n handler: () => ctx.move(index, index - 1),\n },\n ]\n : []),\n ...(!isLast\n ? [\n {\n value: 'move-down',\n label: 'down',\n handler: () => ctx.move(index, index + 1),\n },\n ]\n : []),\n ...(arrayLength > 2 && index < arrayLength - 2\n ? [\n {\n value: 'move-to-end',\n label: 'to end',\n handler: () => ctx.move(index, arrayLength - 1),\n },\n ]\n : []),\n ];\n\n return {\n value: 'move',\n label: 'Move',\n children: moveChildren,\n };\n }\n\n private get bottomMenu(): MenuItem[] {\n const copyChildren: MenuItem[] = [\n {\n value: 'json',\n label: 'json',\n handler: () => this.copyJson(),\n },\n ];\n\n const path = this._accessor.path;\n if (path) {\n copyChildren.push({\n value: 'path',\n label: 'path',\n handler: () => this.copyPath(),\n });\n }\n\n return [\n {\n value: 'copy',\n label: 'Copy',\n children: copyChildren,\n },\n ];\n }\n\n private async copyJson(): Promise<void> {\n const json = JSON.stringify(this._accessor.node.getPlainValue(), null, 2);\n await navigator.clipboard.writeText(json);\n }\n\n private async copyPath(): Promise<void> {\n await navigator.clipboard.writeText(this._accessor.path);\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n isForeignKeyValueNode,\n SystemSchemaIds,\n} from '@revisium/schema-toolkit';\nimport type { NodeRendererType } from '../types';\nimport type { RowNodeAccessor } from './RowNodeAccessor';\n\nconst STRING_COLLAPSE_THRESHOLD = 64;\n\nexport class RowNodeLayout {\n constructor(private readonly _accessor: RowNodeAccessor) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get depth(): number {\n let d = 0;\n let current: RowNodeAccessor | null = this._accessor.parent;\n while (current) {\n d++;\n current = current.parent;\n }\n return d;\n }\n\n get guides(): boolean[] {\n const result: boolean[] = [];\n let current: RowNodeAccessor | null = this._accessor.parent;\n while (current) {\n if (current.parent) {\n const siblings = current.parent.getChildAccessors();\n const isLastSibling = siblings.at(-1)?.id === current.id;\n result.unshift(!isLastSibling);\n } else if (!current.isObject()) {\n result.unshift(false);\n }\n current = current.parent;\n }\n return result;\n }\n\n get isCollapsible(): boolean {\n return this._accessor.getChildAccessors().length > 0;\n }\n\n get isCollapsibleTree(): boolean {\n return (\n this.isCollapsible ||\n this._accessor.getChildAccessors().some((c) => c.isCollapsible)\n );\n }\n\n get rendererType(): NodeRendererType {\n if (this._accessor.node.isObject()) {\n const schema = this._accessor.node.schema;\n if ('$ref' in schema && schema.$ref === SystemSchemaIds.File) {\n return 'file';\n }\n return 'container';\n }\n if (this._accessor.node.isArray()) {\n return 'container';\n }\n if (isForeignKeyValueNode(this._accessor.node)) {\n return 'foreignKey';\n }\n if (this._accessor.node.isPrimitive()) {\n const v = this._accessor.value;\n if (typeof v === 'boolean') {\n return 'boolean';\n }\n if (typeof v === 'number') {\n return 'number';\n }\n }\n const schema = this._accessor.node.schema;\n if (\n 'contentMediaType' in schema &&\n schema.contentMediaType === 'text/markdown'\n ) {\n return 'markdown';\n }\n return 'string';\n }\n\n get isContainer(): boolean {\n return this._accessor.node.isObject() || this._accessor.node.isArray();\n }\n\n get isRefNode(): boolean {\n const schema = this._accessor.node.schema;\n return '$ref' in schema && this.isContainer;\n }\n\n get showChildren(): boolean {\n return (\n this.isContainer &&\n this._accessor.isExpanded &&\n this._accessor.getChildAccessors().length > 0\n );\n }\n\n get collapsedLabel(): string {\n if (this._accessor.node.isPrimitive()) {\n return this.primitiveCollapsedLabel;\n }\n if (this._accessor.node.isObject()) {\n return formatCount(this._accessor.children.length, 'key', 'keys');\n }\n if (this._accessor.node.isArray()) {\n return formatCount(this._accessor.length, 'item', 'items');\n }\n return '';\n }\n\n private get primitiveCollapsedLabel(): string {\n const v = this._accessor.value;\n if (typeof v !== 'string') {\n return '';\n }\n if (!v.trim()) {\n return '<empty text>';\n }\n const wordCount = v.trim().split(/\\s+/).length;\n return formatCount(wordCount, 'word', 'words', 'text: ');\n }\n\n get isLongText(): boolean {\n const v = this._accessor.value;\n return typeof v === 'string' && v.length > STRING_COLLAPSE_THRESHOLD;\n }\n\n expandAll(): void {\n this._accessor.expand();\n for (const child of this._accessor.getChildAccessors()) {\n if (child.isCollapsible) {\n child.expandAll();\n }\n }\n }\n\n collapseAll(): void {\n this._accessor.collapse();\n for (const child of this._accessor.getChildAccessors()) {\n if (child.isCollapsible) {\n child.collapseAll();\n }\n }\n }\n}\n\nfunction formatCount(\n count: number,\n singular: string,\n plural: string,\n prefix = '',\n): string {\n return `<${prefix}${count} ${count === 1 ? singular : plural}>`;\n}\n","import type { ValueNode, ValueTreeLike } from '@revisium/schema-toolkit';\nimport type { EditorContext } from '../types';\nimport type { RowTreeState } from '../state/RowTreeState';\nimport { RowNodeAccessor } from './RowNodeAccessor';\nimport { RowNodeState } from './RowNodeState';\nimport { RowNodeMenu } from './RowNodeMenu';\nimport { RowNodeLayout } from './RowNodeLayout';\nimport type { ChildResolver } from './ChildResolver';\n\nexport class RowAccessorFactory {\n constructor(\n private readonly _tree: ValueTreeLike,\n private readonly _treeState: RowTreeState,\n private readonly _editorContext: EditorContext | null,\n ) {}\n\n create(\n node: ValueNode,\n parent: RowNodeAccessor | null,\n childResolver: ChildResolver,\n ): RowNodeAccessor {\n const state = new RowNodeState(node.id, this._treeState);\n\n const accessor: RowNodeAccessor = new RowNodeAccessor(\n node,\n parent,\n state,\n this._tree,\n this._editorContext,\n childResolver,\n );\n\n const layout = new RowNodeLayout(accessor);\n const menu = new RowNodeMenu(accessor);\n accessor.setLayout(layout);\n accessor.setMenu(menu);\n\n if (layout.isRefNode || layout.rendererType === 'markdown') {\n this._treeState.setExpanded(node.id, false);\n }\n\n return accessor;\n }\n}\n","import { observable } from 'mobx';\nimport type { ValueNode } from '@revisium/schema-toolkit';\nimport type { RowNodeAccessor } from './RowNodeAccessor';\nimport type { RowAccessorFactory } from './RowAccessorFactory';\nimport type { ChildResolver } from './ChildResolver';\n\nexport class RowAccessorCache implements ChildResolver {\n private readonly _cache = observable.map<string, RowNodeAccessor>();\n\n constructor(private readonly _factory: RowAccessorFactory) {}\n\n getOrCreate(\n node: ValueNode,\n parent: RowNodeAccessor | null,\n ): RowNodeAccessor {\n const cached = this._cache.get(node.id);\n if (cached) {\n return cached;\n }\n const accessor = this._factory.create(node, parent, this);\n this._cache.set(node.id, accessor);\n return accessor;\n }\n\n getChildren(accessor: RowNodeAccessor): RowNodeAccessor[] {\n const node = accessor.node;\n\n if (node.isObject()) {\n const objectNode = node as ValueNode & {\n children: readonly ValueNode[];\n };\n return objectNode.children.map((childNode) =>\n this.getOrCreate(childNode, accessor),\n );\n }\n\n if (node.isArray()) {\n const arrayNode = node as ValueNode & {\n value: readonly ValueNode[];\n };\n return arrayNode.value.map((itemNode) =>\n this.getOrCreate(itemNode, accessor),\n );\n }\n\n return [];\n }\n\n clear(): void {\n this._cache.clear();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { ValueTreeLike } from '@revisium/schema-toolkit';\nimport type { EditorContext } from './types';\nimport type { FlatItem } from './flattenNodes';\nimport { flattenNodes } from './flattenNodes';\nimport { RowTreeState } from './state/RowTreeState';\nimport type { RowNodeAccessor } from './accessor/RowNodeAccessor';\nimport { RowAccessorFactory } from './accessor/RowAccessorFactory';\nimport { RowAccessorCache } from './accessor/RowAccessorCache';\n\nexport interface RowEditorCoreOptions {\n collapseComplexity?: number;\n}\n\nexport class RowEditorCore {\n readonly treeState = new RowTreeState();\n private readonly _cache: RowAccessorCache;\n private readonly _root: RowNodeAccessor;\n\n constructor(\n tree: ValueTreeLike,\n editorContext: EditorContext | null,\n options?: RowEditorCoreOptions,\n ) {\n const factory = new RowAccessorFactory(tree, this.treeState, editorContext);\n this._cache = new RowAccessorCache(factory);\n this._root = this._cache.getOrCreate(tree.root, null);\n\n if (options?.collapseComplexity) {\n this._collapseIfComplex(options.collapseComplexity);\n }\n\n makeAutoObservable(this, { treeState: false }, { autoBind: true });\n }\n\n get root(): RowNodeAccessor {\n return this._root;\n }\n\n get flattenedNodes(): readonly FlatItem[] {\n return flattenNodes(this._root);\n }\n\n dispose(): void {\n this._cache.clear();\n this.treeState.reset();\n }\n\n private _collapseIfComplex(threshold: number): void {\n const nodeIds = this._collectAllNodeIds(this._root);\n if (nodeIds.length >= threshold) {\n this.treeState.collapseAll(nodeIds);\n this.treeState.setExpanded(this._root.id, true);\n }\n }\n\n private _collectAllNodeIds(\n accessor: RowNodeAccessor,\n ids: string[] = [],\n ): string[] {\n ids.push(accessor.id);\n for (const child of accessor.getChildAccessors()) {\n this._collectAllNodeIds(child, ids);\n }\n return ids;\n }\n}\n","import { makeAutoObservable, reaction } from 'mobx';\nimport type {\n JsonSchema,\n JsonValuePatch,\n Diagnostic,\n RowModel,\n} from '@revisium/schema-toolkit';\nimport { createRowModel } from '@revisium/schema-toolkit';\nimport { ensureReactivityProvider } from '../../lib/initReactivity';\nimport type { FlatItem } from './flattenNodes';\nimport { RowEditorCore } from './RowEditorCore';\nimport type { NodeVM, EditorContext, RowEditorCallbacks } from './types';\n\nexport type RowEditorMode = 'creating' | 'editing' | 'reading';\n\nexport interface RowEditorVMOptions {\n mode?: RowEditorMode;\n rowId?: string;\n onChange?: (patches: readonly JsonValuePatch[]) => void;\n onSave?: (\n rowId: string,\n value: unknown,\n patches: readonly JsonValuePatch[],\n ) => void;\n onCancel?: () => void;\n callbacks?: RowEditorCallbacks;\n refSchemas?: Record<string, JsonSchema>;\n collapseComplexity?: number;\n}\n\nexport class RowEditorVM implements EditorContext {\n private readonly _rowModel: RowModel;\n private readonly _core: RowEditorCore;\n private readonly _mode: RowEditorMode;\n private readonly _callbacks: RowEditorCallbacks | null;\n private readonly _onChange:\n | ((patches: readonly JsonValuePatch[]) => void)\n | null;\n private readonly _onSave:\n | ((\n rowId: string,\n value: unknown,\n patches: readonly JsonValuePatch[],\n ) => void)\n | null;\n private readonly _onCancel: (() => void) | null;\n private readonly _disposeReaction: (() => void) | null;\n private _prevPatchCount = 0;\n private _rowId: string;\n private _initialRowId: string;\n\n constructor(\n schema: JsonSchema,\n initialValue?: unknown,\n options?: RowEditorVMOptions,\n ) {\n ensureReactivityProvider();\n this._mode = options?.mode ?? 'editing';\n this._rowId = options?.rowId ?? '';\n this._initialRowId = this._rowId;\n this._callbacks = options?.callbacks ?? null;\n this._onChange = options?.onChange ?? null;\n this._onSave = options?.onSave ?? null;\n this._onCancel = options?.onCancel ?? null;\n this._rowModel = createRowModel({\n rowId: 'editor',\n schema,\n data: initialValue,\n refSchemas: options?.refSchemas,\n });\n this._core = new RowEditorCore(this._rowModel.tree, this, {\n collapseComplexity: options?.collapseComplexity,\n });\n\n makeAutoObservable(this, {}, { autoBind: true });\n\n this._disposeReaction = this._onChange\n ? reaction(\n () => this.patches,\n () => this._emitChange(),\n )\n : null;\n }\n\n get root(): NodeVM {\n return this._core.root;\n }\n\n get flattenedNodes(): readonly FlatItem[] {\n return this._core.flattenedNodes;\n }\n\n get rowModel(): RowModel {\n return this._rowModel;\n }\n\n get mode(): RowEditorMode {\n return this._mode;\n }\n\n get rowId(): string {\n return this._rowId;\n }\n\n get initialRowId(): string {\n return this._initialRowId;\n }\n\n get isRowIdChanged(): boolean {\n return this._rowId !== this._initialRowId;\n }\n\n setRowId(value: string): void {\n this._rowId = value;\n }\n\n get isDirty(): boolean {\n return this._rowModel.isDirty;\n }\n\n get hasChanges(): boolean {\n return this.isDirty || this.isRowIdChanged;\n }\n\n get isValid(): boolean {\n return this._rowModel.isValid;\n }\n\n get errors(): readonly Diagnostic[] {\n return this._rowModel.errors;\n }\n\n get isReadOnly(): boolean {\n return this._mode === 'reading';\n }\n\n get callbacks(): RowEditorCallbacks | null {\n return this._callbacks;\n }\n\n get patches(): readonly JsonValuePatch[] {\n return this._rowModel.patches;\n }\n\n getValue(): unknown {\n return this._rowModel.getPlainValue();\n }\n\n save(): void {\n const value = this.getValue();\n const patches = this.patches;\n this.commit();\n this._onSave?.(this._rowId, value, patches);\n }\n\n markAsSaved(): void {\n this.commit();\n }\n\n cancel(): void {\n this._onCancel?.();\n }\n\n commit(): void {\n this._rowModel.commit();\n this._prevPatchCount = 0;\n this._initialRowId = this._rowId;\n }\n\n revert(): void {\n this._rowModel.revert();\n this._prevPatchCount = 0;\n }\n\n dispose(): void {\n this._disposeReaction?.();\n this._core.dispose();\n this._rowModel.dispose();\n }\n\n private _emitChange(): void {\n if (!this._onChange || !this.isValid) {\n return;\n }\n const all = this.patches;\n const newPatches = all.slice(this._prevPatchCount);\n this._prevPatchCount = all.length;\n if (newPatches.length > 0) {\n this._onChange(newPatches);\n }\n }\n}\n","import { FC } from 'react';\nimport { Box, Flex } from '@chakra-ui/react';\n\nexport interface GuidesProps {\n guides: boolean[];\n}\n\ninterface GuideItem {\n key: string;\n showLine: boolean;\n}\n\nfunction toGuideItems(guides: boolean[]): GuideItem[] {\n return guides.map((showLine, i) => ({ key: `d${i}`, showLine }));\n}\n\nexport const Guides: FC<GuidesProps> = ({ guides }) => {\n const items = toGuideItems(guides);\n\n return (\n <Flex position=\"relative\" alignItems=\"center\">\n <Box left=\"-48px\" width=\"48px\" height=\"100%\" position=\"absolute\" />\n {items.map((item) => (\n <Box\n key={item.key}\n position=\"relative\"\n width=\"24px\"\n height=\"100%\"\n _before={\n item.showLine\n ? {\n content: '\"\"',\n position: 'absolute',\n left: '8px',\n top: 0,\n bottom: 0,\n width: '1px',\n backgroundColor: 'blackAlpha.200',\n }\n : undefined\n }\n />\n ))}\n </Flex>\n );\n};\n","import { FC } from 'react';\nimport { Box, Flex } from '@chakra-ui/react';\nimport { MdOutlineChevronRight } from 'react-icons/md';\nimport { PiDotOutlineFill } from 'react-icons/pi';\n\nexport interface DotProps {\n isCollapsed?: boolean;\n isCollapsible?: boolean;\n toggleCollapsed?: () => void;\n testId?: string;\n}\n\nconst getDotTestId = (\n testId: string | undefined,\n isCollapsed: boolean | undefined,\n): string | undefined => {\n if (!testId) {\n return undefined;\n }\n return isCollapsed ? `${testId}-expand` : `${testId}-collapse`;\n};\n\nexport const Dot: FC<DotProps> = ({\n isCollapsed,\n isCollapsible,\n toggleCollapsed,\n testId,\n}) => {\n return (\n <>\n {!isCollapsed && (\n <Flex\n color=\"gray.300\"\n width=\"16px\"\n height=\"28px\"\n _groupHover={{\n display: isCollapsible ? 'none' : 'flex',\n }}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <PiDotOutlineFill />\n </Flex>\n )}\n {isCollapsible && (\n <Flex\n _groupHover={{\n display: 'inline-flex',\n color: 'gray.500',\n }}\n display={isCollapsed ? 'inline-flex' : 'none'}\n _hover={{\n backgroundColor: 'transparent',\n }}\n color=\"gray.400\"\n onClick={toggleCollapsed}\n width=\"16px\"\n height=\"28px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor=\"pointer\"\n data-testid={getDotTestId(testId, isCollapsed)}\n >\n <Box transform={isCollapsed ? 'rotate(0deg)' : 'rotate(90deg)'}>\n <MdOutlineChevronRight size={16} />\n </Box>\n </Flex>\n )}\n </>\n );\n};\n","import { FC } from 'react';\nimport { Box, Flex, Text } from '@chakra-ui/react';\nimport { PiFunctionLight } from 'react-icons/pi';\nimport { Tooltip } from '../../../components/Tooltip';\n\nexport interface FieldProps {\n name: string;\n formula?: string;\n description?: string;\n isDeprecated?: boolean;\n}\n\nexport const Field: FC<FieldProps> = ({\n name,\n formula,\n description,\n isDeprecated,\n}) => {\n const getTooltipContent = () => {\n if (formula && description) {\n return (\n <Box>\n <Flex\n alignItems=\"center\"\n gap=\"4px\"\n marginBottom=\"4px\"\n fontWeight=\"medium\"\n >\n <PiFunctionLight size={14} />\n <span>{formula}</span>\n </Flex>\n <Box color=\"gray.300\">{description}</Box>\n </Box>\n );\n }\n if (formula) {\n return (\n <Flex alignItems=\"center\" gap=\"4px\">\n <PiFunctionLight size={14} />\n <span>{formula}</span>\n </Flex>\n );\n }\n if (description) {\n return description;\n }\n return null;\n };\n\n const tooltipContent = getTooltipContent();\n\n const fieldContent = (\n <Flex alignItems=\"center\" gap=\"4px\" color=\"gray.400\">\n <Text textDecoration={isDeprecated ? 'line-through' : undefined}>\n {name}:\n </Text>\n {formula && <PiFunctionLight size={14} />}\n </Flex>\n );\n\n return (\n <Flex height=\"28px\" alignItems=\"center\">\n {tooltipContent ? (\n <Tooltip\n openDelay={350}\n content={tooltipContent}\n positioning={{ placement: 'right-end' }}\n showArrow\n >\n {fieldContent}\n </Tooltip>\n ) : (\n fieldContent\n )}\n </Flex>\n );\n};\n","import { FC } from 'react';\nimport { Text } from '@chakra-ui/react';\n\nexport interface MoreProps {\n onClick?: () => void;\n label: string;\n}\n\nexport const More: FC<MoreProps> = ({ onClick, label }) => {\n return (\n <Text ml=\"8px\" color=\"gray.300\" onClick={onClick} cursor=\"pointer\">\n {label}\n </Text>\n );\n};\n","import { FC, Fragment, useState } from 'react';\nimport { Box, Flex, Icon, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuChevronRight } from 'react-icons/lu';\nimport { PiDotsThreeVerticalBold } from 'react-icons/pi';\nimport type { NodeVM } from '../../../vm/types';\n\ninterface NodeMenuProps {\n node: NodeVM;\n}\n\nexport const NodeMenu: FC<NodeMenuProps> = observer(({ node }) => {\n const [isOpen, setIsOpen] = useState(false);\n\n if (node.menu.length === 0) {\n return null;\n }\n\n return (\n <Menu.Root\n lazyMount\n unmountOnExit\n onOpenChange={({ open }) => setIsOpen(open)}\n >\n <Menu.Trigger asChild>\n <Flex\n width=\"24px\"\n left=\"-24px\"\n position=\"absolute\"\n zIndex={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor=\"pointer\"\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n mt=\"2px\"\n height=\"24px\"\n width=\"12px\"\n borderRadius=\"4px\"\n bg=\"blackAlpha.50\"\n backdropFilter=\"blur(4px)\"\n boxShadow=\"0 0 0 1px rgba(0,0,0,0.06), 0 1px 1px rgba(0,0,0,0.08)\"\n opacity={isOpen ? 1 : 0}\n transition={isOpen ? 'opacity 1s ease 0s' : undefined}\n _groupHover={{\n opacity: 1,\n transition: 'opacity 0.5s ease 0s',\n }}\n _hover={{\n boxShadow:\n '0 0 0 1px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.1)',\n }}\n >\n <Icon\n size=\"md\"\n color=\"gray.400\"\n as={PiDotsThreeVerticalBold}\n ></Icon>\n </Flex>\n </Flex>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {node.menu.map((item) =>\n item.children ? (\n <Menu.Root\n key={item.value}\n positioning={{ placement: 'right-start', gutter: 2 }}\n >\n {item.beforeSeparator && <Menu.Separator />}\n <Menu.TriggerItem width=\"100%\" justifyContent=\"space-between\">\n {item.label} <LuChevronRight />\n </Menu.TriggerItem>\n {item.afterSeparator && <Menu.Separator />}\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {item.children.map((childItem) => (\n <Fragment key={childItem.value}>\n {childItem.beforeSeparator && <Menu.Separator />}\n <Menu.Item\n value={childItem.value}\n onClick={childItem.handler}\n >\n <Box flex={1}>{childItem.label}</Box>\n </Menu.Item>\n {childItem.afterSeparator && <Menu.Separator />}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n ) : (\n <Fragment key={item.value}>\n {item.beforeSeparator && <Menu.Separator />}\n <Menu.Item value={item.value} onClick={item.handler}>\n <Box flex={1}>{item.label}</Box>\n </Menu.Item>\n {item.afterSeparator && <Menu.Separator />}\n </Fragment>\n ),\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n});\n","import { FC, ReactNode } from 'react';\nimport { Flex } from '@chakra-ui/react';\nimport { Guides } from './Guides';\nimport { Dot } from './Dot';\nimport { Field } from './Field';\nimport { More } from './More';\nimport { NodeMenu } from './NodeMenu';\nimport type { NodeVM } from '../../vm/types';\n\nexport interface RowProps {\n node?: NodeVM;\n name: string;\n guides: boolean[];\n isCollapsible?: boolean;\n isExpanded?: boolean;\n onToggle?: () => void;\n formula?: string;\n description?: string;\n isDeprecated?: boolean;\n skipDot?: boolean;\n skipField?: boolean;\n skipMore?: boolean;\n collapsedLabel?: string;\n isReadOnly?: boolean;\n testId?: string;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n children?: ReactNode;\n}\n\nexport const Row: FC<RowProps> = ({\n node,\n name,\n guides,\n isCollapsible = false,\n isExpanded = true,\n onToggle,\n formula,\n description,\n isDeprecated,\n skipDot,\n skipField,\n skipMore,\n collapsedLabel,\n isReadOnly,\n testId,\n onMouseEnter,\n onMouseLeave,\n children,\n}) => {\n const isCollapsed = isCollapsible && !isExpanded;\n const showMenu = node && !isReadOnly;\n\n return (\n <Flex\n width=\"100%\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n position=\"relative\"\n className=\"group\"\n data-testid={testId}\n >\n <Guides guides={guides} />\n {showMenu && <NodeMenu node={node} />}\n <Flex width=\"100%\" alignItems=\"center\">\n <Flex>\n {!skipDot && (\n <Dot\n isCollapsed={isCollapsed}\n isCollapsible={isCollapsible}\n toggleCollapsed={onToggle}\n testId={testId}\n />\n )}\n {!skipField && (\n <Field\n name={name}\n formula={formula}\n description={description}\n isDeprecated={isDeprecated}\n />\n )}\n {children}\n </Flex>\n {!skipMore && isCollapsed && collapsedLabel && (\n <More onClick={onToggle} label={collapsedLabel} />\n )}\n </Flex>\n </Flex>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { ContainerRendererContext } from './types';\nimport { Row } from '../components/Row';\n\nexport const ContainerRendererComponent: FC<ContainerRendererContext> =\n observer(({ node }) => {\n const handleToggle = useCallback(() => {\n node.toggleExpanded();\n }, [node]);\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n isCollapsible={node.isCollapsible}\n isExpanded={node.isExpanded}\n onToggle={handleToggle}\n collapsedLabel={node.collapsedLabel}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n />\n );\n });\n","import { FC, useCallback, useState } from 'react';\nimport { Box } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { ContentEditable } from '../../../components/ContentEditable';\n\nexport interface PrimitiveBoxProps {\n value: string;\n onChange: (value: string) => void;\n readonly?: boolean;\n prefix?: string;\n postfix?: string;\n dataTestId?: string;\n restrict?: RegExp;\n onFocus?: () => void;\n onBlur?: () => void;\n}\n\nexport const PrimitiveBox: FC<PrimitiveBoxProps> = observer(\n ({\n value,\n readonly,\n prefix = '',\n postfix = '',\n restrict,\n dataTestId,\n onChange,\n onFocus,\n onBlur,\n }) => {\n const [focused, setFocused] = useState(false);\n\n const handleFocus = useCallback(() => {\n setFocused(true);\n onFocus?.();\n }, [onFocus]);\n\n const handleBlur = useCallback(() => {\n setFocused(false);\n onBlur?.();\n }, [onBlur]);\n\n return (\n <Box\n borderRadius=\"4px\"\n bgColor={focused ? 'gray.100' : undefined}\n _hover={{\n bgColor: readonly ? undefined : 'gray.100',\n }}\n mt=\"2px\"\n ml=\"2px\"\n pl=\"4px\"\n pr=\"4px\"\n minHeight=\"24px\"\n minWidth=\"15px\"\n cursor={readonly ? 'text' : undefined}\n >\n {readonly ? (\n `${prefix}${value}${postfix}`\n ) : (\n <ContentEditable\n dataTestId={dataTestId}\n prefix={prefix}\n postfix={postfix}\n initValue={value}\n onChange={onChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n restrict={restrict}\n />\n )}\n </Box>\n );\n },\n);\n","import { FC, useCallback, useEffect, useState } from 'react';\nimport { PrimitiveBox } from './PrimitiveBox';\n\nexport interface StringEditorProps {\n value: string;\n setValue: (value: string) => void;\n readonly?: boolean;\n dataTestId?: string;\n}\n\nexport const StringEditor: FC<StringEditorProps> = ({\n value,\n setValue,\n readonly,\n dataTestId,\n}) => {\n const [internalValue, setInternalValue] = useState(value);\n\n useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n const handleChange = useCallback((newValue: string) => {\n setInternalValue(newValue);\n }, []);\n\n const handleBlur = useCallback(() => {\n setValue(internalValue);\n }, [internalValue, setValue]);\n\n const prefix = internalValue ? '' : '\"';\n\n return (\n <PrimitiveBox\n prefix={prefix}\n postfix={prefix}\n value={internalValue}\n readonly={readonly}\n dataTestId={dataTestId}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { PrimitiveRendererContext } from './types';\nimport { Row } from '../components/Row';\nimport { StringEditor } from '../editors/StringEditor';\n\nexport const StringRendererComponent: FC<PrimitiveRendererContext> = observer(\n ({ node }) => {\n const value = String(node.value);\n\n const handleSetValue = useCallback(\n (newValue: string) => {\n node.setValue(newValue);\n },\n [node],\n );\n\n const handleToggle = useCallback(() => {\n node.toggleExpanded();\n }, [node]);\n\n if (node.isLongText) {\n return (\n <>\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isCollapsible\n isExpanded={node.isExpanded}\n onToggle={handleToggle}\n collapsedLabel={node.collapsedLabel}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n />\n {node.isExpanded && (\n <Row name=\"\" guides={[...node.guides, true]} skipDot skipField>\n <StringEditor\n value={value}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n )}\n </>\n );\n }\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n >\n <StringEditor\n value={value}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n );\n },\n);\n","import { FC, useCallback, useEffect, useState, useRef } from 'react';\nimport { PrimitiveBox } from './PrimitiveBox';\n\nconst NUMERIC_CHARS = /^[\\d.eE+-]+$/;\n\nexport interface NumberEditorProps {\n value: number;\n setValue: (value: number) => void;\n readonly?: boolean;\n dataTestId?: string;\n}\n\nexport const NumberEditor: FC<NumberEditorProps> = ({\n value,\n setValue,\n readonly,\n dataTestId,\n}) => {\n const stringValue = value.toString();\n const lastValidValue = useRef(stringValue);\n\n const [state, setState] = useState(stringValue);\n\n useEffect(() => {\n setState(stringValue);\n lastValidValue.current = stringValue;\n }, [stringValue]);\n\n const handleChange = useCallback((newValue: string) => {\n setState(newValue);\n }, []);\n\n const handleBlur = useCallback(() => {\n const trimmed = state.trim();\n const parsedValue = Number(trimmed);\n\n if (trimmed !== '' && Number.isFinite(parsedValue)) {\n setValue(parsedValue);\n setState(parsedValue.toString());\n lastValidValue.current = parsedValue.toString();\n } else {\n setState(lastValidValue.current);\n }\n }, [setValue, state]);\n\n return (\n <PrimitiveBox\n value={state}\n readonly={readonly}\n dataTestId={dataTestId}\n onChange={handleChange}\n onBlur={handleBlur}\n restrict={NUMERIC_CHARS}\n />\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { PrimitiveRendererContext } from './types';\nimport { Row } from '../components/Row';\nimport { NumberEditor } from '../editors/NumberEditor';\n\nexport const NumberRendererComponent: FC<PrimitiveRendererContext> = observer(\n ({ node }) => {\n const handleSetValue = useCallback(\n (value: number) => {\n node.setValue(value);\n },\n [node],\n );\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n >\n <NumberEditor\n value={Number(node.value)}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n );\n },\n);\n","import { FC, ReactNode, useCallback } from 'react';\nimport { Popover, Portal, Box } from '@chakra-ui/react';\n\ninterface FocusPopoverProps {\n isOpen: boolean;\n setIsOpen: (isOpen: boolean) => void;\n trigger: ReactNode;\n children: ReactNode;\n disabled?: boolean;\n width?: string;\n}\n\nexport const FocusPopover: FC<FocusPopoverProps> = ({\n isOpen,\n setIsOpen,\n trigger,\n children,\n disabled,\n width,\n}) => {\n const handleClick = useCallback(() => {\n if (!disabled) {\n setIsOpen(true);\n }\n }, [disabled, setIsOpen]);\n\n return (\n <Popover.Root\n lazyMount\n unmountOnExit\n open={isOpen}\n onOpenChange={({ open }) => {\n if (!disabled) {\n setIsOpen(open);\n }\n }}\n autoFocus={false}\n closeOnInteractOutside={!disabled}\n modal={false}\n positioning={{ placement: 'bottom-start' }}\n >\n <Popover.Trigger asChild>\n <Box onClick={handleClick}>{trigger}</Box>\n </Popover.Trigger>\n {!disabled && (\n <Portal>\n <Popover.Positioner>\n <Popover.Content width={width} p={1}>\n {children}\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n )}\n </Popover.Root>\n );\n};\n","import { FC, ReactNode } from 'react';\nimport { Box } from '@chakra-ui/react';\n\ninterface FocusPopoverItemProps {\n children: ReactNode;\n onClick?: () => void;\n}\n\nexport const FocusPopoverItem: FC<FocusPopoverItemProps> = ({\n children,\n onClick,\n}) => {\n return (\n <Box\n px={2}\n py={1.5}\n cursor=\"pointer\"\n borderRadius=\"md\"\n fontSize=\"sm\"\n _hover={{ bg: 'gray.100' }}\n onClick={onClick}\n >\n {children}\n </Box>\n );\n};\n","import { FC, ReactNode, useState, useCallback } from 'react';\nimport { FocusPopover } from './FocusPopover';\nimport { FocusPopoverItem } from './FocusPopoverItem';\n\ninterface BooleanMenuProps {\n children: ReactNode;\n onChange: (value: boolean) => void;\n disabled?: boolean;\n}\n\nexport const BooleanMenu: FC<BooleanMenuProps> = ({\n children,\n onChange,\n disabled,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n\n const handleSelect = useCallback(\n (value: string) => {\n const boolValue = value === 'true';\n onChange(boolValue);\n setIsOpen(false);\n },\n [onChange],\n );\n\n return (\n <FocusPopover\n width=\"60px\"\n isOpen={isOpen}\n setIsOpen={setIsOpen}\n trigger={children}\n disabled={disabled}\n >\n <FocusPopoverItem onClick={() => handleSelect('true')}>\n true\n </FocusPopoverItem>\n <FocusPopoverItem onClick={() => handleSelect('false')}>\n false\n </FocusPopoverItem>\n </FocusPopover>\n );\n};\n","import { FC, useCallback, useEffect, useState } from 'react';\nimport { PrimitiveBox } from './PrimitiveBox';\nimport { BooleanMenu } from './BooleanMenu';\n\nexport interface BooleanEditorProps {\n value: boolean;\n setValue: (value: boolean) => void;\n readonly?: boolean;\n dataTestId?: string;\n}\n\nexport const BooleanEditor: FC<BooleanEditorProps> = ({\n value,\n setValue,\n readonly,\n dataTestId,\n}) => {\n const stringValue = value.toString();\n\n const [state, setState] = useState(stringValue);\n\n useEffect(() => {\n setState(stringValue);\n }, [stringValue]);\n\n const handleChange = useCallback((value: string) => {\n setState(value);\n }, []);\n\n const handleBlur = useCallback(() => {\n const trimmed = state.trim();\n const boolValue =\n trimmed.toLowerCase() === 'false' || trimmed === '0'\n ? false\n : Boolean(trimmed);\n setState(boolValue.toString());\n setValue(boolValue);\n }, [setValue, state]);\n\n const handleBooleanSelect = useCallback(\n (boolValue: boolean) => {\n setState(boolValue.toString());\n setValue(boolValue);\n },\n [setValue],\n );\n\n return (\n <BooleanMenu onChange={handleBooleanSelect} disabled={readonly}>\n <PrimitiveBox\n value={state}\n readonly={readonly}\n dataTestId={dataTestId}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </BooleanMenu>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { PrimitiveRendererContext } from './types';\nimport { Row } from '../components/Row';\nimport { BooleanEditor } from '../editors/BooleanEditor';\n\nexport const BooleanRendererComponent: FC<PrimitiveRendererContext> = observer(\n ({ node }) => {\n const handleSetValue = useCallback(\n (value: boolean) => {\n node.setValue(value);\n },\n [node],\n );\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n >\n <BooleanEditor\n value={Boolean(node.value)}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n );\n },\n);\n","import { FC, useCallback } from 'react';\nimport { Flex, IconButton } from '@chakra-ui/react';\nimport { PiArrowSquareUpRightThin, PiInfo } from 'react-icons/pi';\nimport { observer } from 'mobx-react-lite';\nimport { Tooltip } from '../../../components/Tooltip';\nimport type { ForeignKeyNodeVM } from '../../vm/types';\n\ninterface ForeignKeyActionsProps {\n node: ForeignKeyNodeVM;\n}\n\nexport const ForeignKeyActions: FC<ForeignKeyActionsProps> = observer(\n ({ node }) => {\n const value = String(node.value);\n const showNavigate =\n Boolean(value) && Boolean(node.callbacks?.onNavigateToForeignKey);\n const showWarning = !value && !node.isEditorReadOnly;\n\n const handleNavigate = useCallback(() => {\n node.callbacks?.onNavigateToForeignKey?.(node.foreignKeyTableId, value);\n }, [node, value]);\n\n return (\n <Flex alignItems=\"center\" gap=\"4px\">\n {showNavigate && (\n <IconButton\n aria-label=\"Navigate to foreign key\"\n variant=\"ghost\"\n size=\"2xs\"\n color=\"gray.500\"\n _hover={{ color: 'black', bg: 'gray.100' }}\n onClick={handleNavigate}\n data-testid={`${node.testId}-fk-navigate`}\n >\n <PiArrowSquareUpRightThin />\n </IconButton>\n )}\n {showWarning && (\n <Tooltip\n openDelay={50}\n closeDelay={50}\n content=\"This field requires a valid foreign key ID\"\n >\n <Flex\n width=\"24px\"\n height=\"24px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n color=\"gray.400\"\n >\n <PiInfo />\n </Flex>\n </Tooltip>\n )}\n </Flex>\n );\n },\n);\n","export class Debounce {\n private _timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly _delay: number) {}\n\n schedule(fn: () => void): void {\n if (this._timer) {\n clearTimeout(this._timer);\n }\n this._timer = setTimeout(fn, this._delay);\n }\n\n dispose(): void {\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n }\n}\n","import { makeAutoObservable, reaction, runInAction } from 'mobx';\nimport { Debounce } from '../../lib/Debounce';\n\nexport type SearchForeignKeySearchFn = (\n tableId: string,\n search: string,\n) => Promise<{ ids: string[]; hasMore: boolean }>;\n\ntype SearchState = 'loading' | 'empty' | 'list' | 'notFound' | 'error';\n\nexport class SearchForeignKeyVM {\n private _search = '';\n private _state: SearchState = 'loading';\n private _ids: string[] = [];\n private _hasMore = false;\n private _initialized = false;\n private _disposeReaction: (() => void) | null = null;\n private readonly _debounce = new Debounce(300);\n\n constructor(\n private readonly _tableId: string,\n private readonly _onSearch: SearchForeignKeySearchFn | null,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get search(): string {\n return this._search;\n }\n\n get state(): SearchState {\n return this._state;\n }\n\n get ids(): string[] {\n return this._ids;\n }\n\n get hasMore(): boolean {\n return this._hasMore;\n }\n\n get showInput(): boolean {\n return (\n this._state === 'list' ||\n this._state === 'notFound' ||\n (this._state === 'loading' && this._initialized)\n );\n }\n\n get showFooter(): boolean {\n return (\n this._state === 'list' ||\n this._state === 'notFound' ||\n this._state === 'error' ||\n this._state === 'empty'\n );\n }\n\n get showLoading(): boolean {\n return this._state === 'loading';\n }\n\n get showNotFound(): boolean {\n return this._state === 'notFound';\n }\n\n get showError(): boolean {\n return this._state === 'error';\n }\n\n get showEmpty(): boolean {\n return this._state === 'empty';\n }\n\n get showList(): boolean {\n return this._state === 'list';\n }\n\n get tableId(): string {\n return this._tableId;\n }\n\n init(): void {\n void this._performSearch();\n this._disposeReaction = reaction(\n () => this._search,\n () => this._debouncedSearch(),\n );\n }\n\n setSearch(value: string): void {\n this._search = value;\n }\n\n dispose(): void {\n this._disposeReaction?.();\n this._disposeReaction = null;\n this._debounce.dispose();\n }\n\n private _debouncedSearch(): void {\n this._debounce.schedule(() => {\n void this._performSearch();\n });\n }\n\n private _resolveState(ids: string[], search: string): SearchState {\n if (ids.length === 0 && !search) {\n return 'empty';\n }\n if (ids.length === 0) {\n return 'notFound';\n }\n return 'list';\n }\n\n private async _performSearch(): Promise<void> {\n if (!this._onSearch) {\n this._state = 'error';\n return;\n }\n\n const searchTerm = this._search;\n try {\n this._state = 'loading';\n const result = await this._onSearch(this._tableId, searchTerm);\n runInAction(() => {\n if (this._search !== searchTerm) {\n return;\n }\n this._initialized = true;\n this._ids = result.ids;\n this._hasMore = result.hasMore;\n this._state = this._resolveState(result.ids, searchTerm);\n });\n } catch {\n runInAction(() => {\n if (this._search !== searchTerm) {\n return;\n }\n this._state = 'error';\n });\n }\n }\n}\n","import { FC } from 'react';\nimport { Flex, Text, IconButton } from '@chakra-ui/react';\nimport { PiXBold } from 'react-icons/pi';\n\ninterface HeaderProps {\n tableId: string;\n onClose?: () => void;\n}\n\nexport const Header: FC<HeaderProps> = ({ tableId, onClose }) => {\n return (\n <Flex p=\"4px\" alignItems=\"center\" justifyContent=\"space-between\">\n <Text fontSize=\"xs\" color=\"gray.600\" fontWeight=\"medium\">\n Select from &quot;{tableId}&quot;\n </Text>\n {onClose && (\n <IconButton\n aria-label=\"Close\"\n variant=\"ghost\"\n size=\"2xs\"\n color=\"gray.500\"\n _hover={{ color: 'black' }}\n onClick={onClose}\n >\n <PiXBold />\n </IconButton>\n )}\n </Flex>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { Box, Input, IconButton } from '@chakra-ui/react';\nimport { PiXBold } from 'react-icons/pi';\n\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport const SearchInput: FC<SearchInputProps> = ({ value, onChange }) => {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange],\n );\n\n const handleClear = useCallback(() => {\n onChange('');\n }, [onChange]);\n\n return (\n <Box px=\"4px\" pb=\"4px\" position=\"relative\">\n <Input\n value={value}\n onChange={handleChange}\n placeholder=\"Search by ID...\"\n size=\"sm\"\n data-testid=\"fk-search-input\"\n autoFocus\n />\n {value && (\n <IconButton\n aria-label=\"Clear\"\n variant=\"ghost\"\n size=\"2xs\"\n position=\"absolute\"\n right=\"8px\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n onClick={handleClear}\n color=\"gray.400\"\n _hover={{ color: 'black' }}\n >\n <PiXBold />\n </IconButton>\n )}\n </Box>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { Box } from '@chakra-ui/react';\n\ninterface ItemProps {\n id: string;\n onSelect: (id: string) => void;\n}\n\nexport const Item: FC<ItemProps> = ({ id, onSelect }) => {\n const handleClick = useCallback(() => {\n onSelect(id);\n }, [id, onSelect]);\n\n return (\n <Box\n px={2}\n py={1.5}\n mr=\"12px\"\n cursor=\"pointer\"\n borderRadius=\"md\"\n fontSize=\"sm\"\n _hover={{ bg: 'gray.100' }}\n onClick={handleClick}\n data-testid={`fk-item-${id}`}\n >\n {id}\n </Box>\n );\n};\n","import { FC } from 'react';\nimport { Box } from '@chakra-ui/react';\nimport { Item } from './Item';\n\ninterface ListProps {\n ids: string[];\n onSelect: (id: string) => void;\n}\n\nexport const List: FC<ListProps> = ({ ids, onSelect }) => {\n return (\n <Box flex={1} overflowY=\"auto\" data-testid=\"fk-list\">\n {ids.map((id) => (\n <Item key={id} id={id} onSelect={onSelect} />\n ))}\n </Box>\n );\n};\n","import { FC } from 'react';\nimport { Flex, Text } from '@chakra-ui/react';\n\nexport const Empty: FC = () => {\n return (\n <Flex\n flex={1}\n justifyContent=\"center\"\n alignItems=\"center\"\n data-testid=\"fk-empty\"\n >\n <Text fontSize=\"sm\" color=\"gray.500\">\n No rows found in this table\n </Text>\n </Flex>\n );\n};\n","import { FC } from 'react';\nimport { HStack, Button } from '@chakra-ui/react';\nimport { PiMagnifyingGlassBold, PiPlusBold } from 'react-icons/pi';\n\ninterface FooterProps {\n onOpenTableSearch?: () => void;\n onCreateAndConnect?: () => void;\n}\n\nexport const Footer: FC<FooterProps> = ({\n onOpenTableSearch,\n onCreateAndConnect,\n}) => {\n const hasActions = onOpenTableSearch || onCreateAndConnect;\n\n if (!hasActions) {\n return null;\n }\n\n return (\n <HStack\n mt=\"4px\"\n p=\"4px\"\n gap={2}\n borderTopWidth=\"1px\"\n borderColor=\"gray.200\"\n >\n {onOpenTableSearch && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n color=\"gray.500\"\n onClick={onOpenTableSearch}\n data-testid=\"fk-open-table-search\"\n >\n <PiMagnifyingGlassBold />\n Open Table Search\n </Button>\n )}\n {onCreateAndConnect && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n color=\"gray.500\"\n onClick={onCreateAndConnect}\n data-testid=\"fk-create-and-connect\"\n >\n <PiPlusBold />\n Create &amp; Connect\n </Button>\n )}\n </HStack>\n );\n};\n","import { FC, useEffect, useState } from 'react';\nimport { Flex, Spinner, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { SearchForeignKeyVM } from '../vm/SearchForeignKeyVM';\nimport type { SearchForeignKeySearchFn } from '../vm/SearchForeignKeyVM';\nimport { Header } from './Header';\nimport { SearchInput } from './SearchInput';\nimport { List } from './List';\nimport { Empty } from './Empty';\nimport { Footer } from './Footer';\n\ninterface SearchForeignKeyProps {\n tableId: string;\n onSearch: SearchForeignKeySearchFn;\n onSelect: (id: string) => void;\n onClose?: () => void;\n onOpenTableSearch?: () => void;\n onCreateAndConnect?: () => void;\n}\n\nexport type { SearchForeignKeyProps };\n\nexport const SearchForeignKey: FC<SearchForeignKeyProps> = observer(\n ({\n tableId,\n onSearch,\n onSelect,\n onClose,\n onOpenTableSearch,\n onCreateAndConnect,\n }) => {\n const [model] = useState(() => new SearchForeignKeyVM(tableId, onSearch));\n\n useEffect(() => {\n model.init();\n return () => model.dispose();\n }, [model]);\n\n return (\n <Flex\n flexDirection=\"column\"\n height=\"290px\"\n width=\"100%\"\n data-testid=\"fk-picker\"\n >\n <Header tableId={tableId} onClose={onClose} />\n {model.showInput && (\n <SearchInput value={model.search} onChange={model.setSearch} />\n )}\n {model.showLoading && (\n <Flex flex={1} justifyContent=\"center\" alignItems=\"center\">\n <Spinner size=\"sm\" color=\"gray.400\" />\n </Flex>\n )}\n {model.showNotFound && (\n <Flex flex={1} justifyContent=\"center\" alignItems=\"center\">\n <Text fontSize=\"sm\" color=\"gray.500\">\n No results found\n </Text>\n </Flex>\n )}\n {model.showError && (\n <Flex flex={1} justifyContent=\"center\" alignItems=\"center\">\n <Text fontSize=\"sm\" color=\"gray.500\">\n Could not load data\n </Text>\n </Flex>\n )}\n {model.showEmpty && <Empty />}\n {model.showList && <List ids={model.ids} onSelect={onSelect} />}\n {model.showFooter && (\n <Footer\n onOpenTableSearch={onOpenTableSearch}\n onCreateAndConnect={onCreateAndConnect}\n />\n )}\n </Flex>\n );\n },\n);\n","import { FC, ReactNode, useState, useCallback } from 'react';\nimport { FocusPopover } from './FocusPopover';\nimport { SearchForeignKey } from '../../../search-foreign-key';\nimport type { ForeignKeyNodeVM } from '../../vm/types';\n\ninterface ForeignKeyMenuProps {\n node: ForeignKeyNodeVM;\n onSelect: (id: string) => void;\n disabled?: boolean;\n children: ReactNode;\n}\n\nexport const ForeignKeyMenu: FC<ForeignKeyMenuProps> = ({\n node,\n onSelect,\n disabled,\n children,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n\n const onSearchForeignKey = node.callbacks?.onSearchForeignKey;\n\n const handleSelect = useCallback(\n (id: string) => {\n onSelect(id);\n setIsOpen(false);\n },\n [onSelect],\n );\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const handleOpenTableSearch = useCallback(async () => {\n if (!node.callbacks?.onOpenTableSearch) {\n return;\n }\n const selectedId = await node.callbacks.onOpenTableSearch(\n node.foreignKeyTableId,\n );\n if (selectedId) {\n handleSelect(selectedId);\n }\n }, [node.callbacks, node.foreignKeyTableId, handleSelect]);\n\n const handleCreateAndConnect = useCallback(async () => {\n if (!node.callbacks?.onCreateAndConnect) {\n return;\n }\n const createdId = await node.callbacks.onCreateAndConnect(\n node.foreignKeyTableId,\n );\n if (createdId) {\n handleSelect(createdId);\n }\n }, [node.callbacks, node.foreignKeyTableId, handleSelect]);\n\n if (!onSearchForeignKey) {\n return <>{children}</>;\n }\n\n return (\n <FocusPopover\n isOpen={isOpen}\n setIsOpen={setIsOpen}\n trigger={children}\n disabled={disabled}\n width=\"320px\"\n >\n <SearchForeignKey\n tableId={node.foreignKeyTableId}\n onSearch={onSearchForeignKey}\n onSelect={handleSelect}\n onClose={handleClose}\n onOpenTableSearch={\n node.callbacks?.onOpenTableSearch ? handleOpenTableSearch : undefined\n }\n onCreateAndConnect={\n node.callbacks?.onCreateAndConnect\n ? handleCreateAndConnect\n : undefined\n }\n />\n </FocusPopover>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport type { ForeignKeyNodeVM } from '../../vm/types';\nimport { Row } from '../components/Row';\nimport { StringEditor } from '../editors/StringEditor';\nimport { ForeignKeyActions } from '../editors/ForeignKeyActions';\nimport { ForeignKeyMenu } from '../editors/ForeignKeyMenu';\n\ninterface ForeignKeyRendererContext {\n node: ForeignKeyNodeVM;\n}\n\nexport const ForeignKeyRendererComponent: FC<ForeignKeyRendererContext> =\n observer(({ node }) => {\n const value = String(node.value);\n\n const handleSetValue = useCallback(\n (newValue: string) => {\n node.setValue(newValue);\n },\n [node],\n );\n\n const handleSelect = useCallback(\n (id: string) => {\n node.setValue(id);\n },\n [node],\n );\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n >\n <Flex alignItems=\"center\" gap=\"2px\">\n <ForeignKeyMenu\n node={node}\n onSelect={handleSelect}\n disabled={node.isFieldReadOnly}\n >\n <StringEditor\n value={value}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </ForeignKeyMenu>\n <ForeignKeyActions node={node} />\n </Flex>\n </Row>\n );\n });\n","import { FC } from 'react';\nimport { HoverCard, Portal, Image, IconButton } from '@chakra-ui/react';\nimport { PiFile } from 'react-icons/pi';\n\ninterface FileIconProps {\n onClick: () => void;\n dataTestId?: string;\n}\n\nconst FileIcon: FC<FileIconProps> = ({ onClick, dataTestId }) => {\n return (\n <IconButton\n data-testid={dataTestId}\n aria-label=\"Open file\"\n variant=\"ghost\"\n size=\"2xs\"\n color=\"gray.400\"\n _hover={{ bg: 'gray.100', color: 'black' }}\n onClick={onClick}\n >\n <PiFile />\n </IconButton>\n );\n};\n\ninterface FileHoverCardProps {\n url: string;\n availablePreview: boolean;\n width: number;\n height: number;\n onClick: () => void;\n dataTestId?: string;\n}\n\nexport const FileHoverCard: FC<FileHoverCardProps> = ({\n url,\n availablePreview,\n width,\n height,\n onClick,\n dataTestId,\n}) => {\n if (!availablePreview) {\n return <FileIcon onClick={onClick} dataTestId={dataTestId} />;\n }\n\n return (\n <HoverCard.Root\n lazyMount\n unmountOnExit\n openDelay={350}\n closeDelay={100}\n positioning={{ gutter: 16 }}\n >\n <HoverCard.Trigger asChild>\n <span>\n <FileIcon onClick={onClick} dataTestId={dataTestId} />\n </span>\n </HoverCard.Trigger>\n <Portal>\n <HoverCard.Positioner>\n <HoverCard.Content>\n <HoverCard.Arrow>\n <HoverCard.ArrowTip />\n </HoverCard.Arrow>\n <Image\n aspectRatio={height > 0 ? width / height : 1}\n width=\"400px\"\n src={url}\n alt=\"File preview\"\n />\n </HoverCard.Content>\n </HoverCard.Positioner>\n </Portal>\n </HoverCard.Root>\n );\n};\n","import { FC, useCallback, useRef } from 'react';\nimport { Box, Flex, IconButton } from '@chakra-ui/react';\nimport { PiInfo, PiUploadThin } from 'react-icons/pi';\nimport { observer } from 'mobx-react-lite';\nimport { Tooltip } from '../../../components/Tooltip';\nimport { FileHoverCard } from './FileHoverCard';\nimport type { FileNodeVM } from '../../vm/types';\n\ninterface FileActionsProps {\n node: FileNodeVM;\n}\n\nexport const FileActions: FC<FileActionsProps> = observer(({ node }) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const url = node.fileUrl;\n const fileId = node.fileId;\n const status = node.fileStatus;\n const mimeType = node.fileMimeType;\n const width = node.fileWidth;\n const height = node.fileHeight;\n const readonly = node.isEditorReadOnly;\n\n const availablePreview = mimeType.startsWith('image/');\n const showViewFile = Boolean(url);\n const showUploadFile =\n !readonly &&\n Boolean(node.callbacks?.onUploadFile) &&\n (status === 'ready' || status === 'uploaded');\n const showInfo = !showViewFile && !showUploadFile;\n\n const handleFileChange = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n return;\n }\n event.target.value = '';\n const rowId = node.editorContext?.rowId ?? '';\n const result = await node.callbacks?.onUploadFile?.({\n rowId,\n fileId,\n file,\n });\n if (result) {\n const valueNode = node.node as unknown as {\n setValue(v: unknown, o?: { internal?: boolean }): void;\n };\n valueNode.setValue(result, { internal: true });\n }\n },\n [node, fileId],\n );\n\n const handleOpenFile = useCallback(() => {\n if (node.callbacks?.onOpenFile) {\n node.callbacks.onOpenFile(url);\n } else {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n }, [node, url]);\n\n const handleUploadClick = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n return (\n <Flex alignItems=\"center\">\n {showInfo && (\n <Tooltip\n openDelay={50}\n closeDelay={50}\n content={\n readonly\n ? 'The file was not uploaded in this revision'\n : 'Save the row first, then upload the file'\n }\n >\n <Flex\n width=\"24px\"\n height=\"24px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n color=\"gray.400\"\n >\n <PiInfo />\n </Flex>\n </Tooltip>\n )}\n {showViewFile && (\n <FileHoverCard\n url={url}\n availablePreview={availablePreview}\n width={width}\n height={height}\n onClick={handleOpenFile}\n dataTestId={`${node.testId}-open-file`}\n />\n )}\n {showUploadFile && (\n <Box>\n <input\n ref={fileInputRef}\n type=\"file\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n data-testid={`${node.testId}-file-input`}\n />\n <IconButton\n aria-label=\"Upload file\"\n variant=\"ghost\"\n size=\"2xs\"\n color={showViewFile ? 'gray.300' : 'gray.500'}\n _hover={{ bg: 'gray.100', color: 'black' }}\n onClick={handleUploadClick}\n data-testid={`${node.testId}-upload-file`}\n >\n <PiUploadThin />\n </IconButton>\n </Box>\n )}\n </Flex>\n );\n});\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { FileNodeVM } from '../../vm/types';\nimport { Row } from '../components/Row';\nimport { FileActions } from '../editors/FileActions';\n\ninterface FileRendererContext {\n node: FileNodeVM;\n}\n\nexport const FileRendererComponent: FC<FileRendererContext> = observer(\n ({ node }) => {\n const handleToggle = useCallback(() => {\n node.toggleExpanded();\n }, [node]);\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n isCollapsible={node.isCollapsible}\n isExpanded={node.isExpanded}\n onToggle={handleToggle}\n collapsedLabel={node.collapsedLabel}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n skipMore\n >\n <FileActions node={node} />\n </Row>\n );\n },\n);\n","import { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Textarea } from '@chakra-ui/react';\n\nexport interface MarkdownEditorProps {\n value: string;\n setValue: (value: string) => void;\n readonly?: boolean;\n dataTestId?: string;\n}\n\nexport const MarkdownEditor: FC<MarkdownEditorProps> = ({\n value,\n setValue,\n readonly,\n dataTestId,\n}) => {\n const [internalValue, setInternalValue] = useState(value);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInternalValue(e.target.value);\n },\n [],\n );\n\n const handleBlur = useCallback(() => {\n setValue(internalValue);\n }, [internalValue, setValue]);\n\n return (\n <Box mt=\"2px\" ml=\"2px\" pr=\"4px\" width=\"100%\">\n <Textarea\n ref={textareaRef}\n value={internalValue}\n onChange={handleChange}\n onBlur={handleBlur}\n readOnly={readonly}\n data-testid={dataTestId}\n fontFamily=\"mono\"\n fontSize=\"13px\"\n lineHeight=\"1.5\"\n minHeight=\"120px\"\n resize=\"vertical\"\n borderColor=\"gray.200\"\n _focus={{\n borderColor: 'blue.400',\n boxShadow: '0 0 0 1px var(--chakra-colors-blue-400)',\n }}\n placeholder=\"Markdown content...\"\n />\n </Box>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { PrimitiveRendererContext } from './types';\nimport { Row } from '../components/Row';\nimport { MarkdownEditor } from '../editors/MarkdownEditor';\n\nexport const MarkdownRendererComponent: FC<PrimitiveRendererContext> = observer(\n ({ node }) => {\n const value = String(node.value);\n\n const handleSetValue = useCallback(\n (newValue: string) => {\n node.setValue(newValue);\n },\n [node],\n );\n\n return (\n <>\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isCollapsible\n isExpanded={node.isExpanded}\n onToggle={node.toggleExpanded}\n collapsedLabel={node.collapsedLabel}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n />\n {node.isExpanded && (\n <Row name=\"\" guides={[...node.guides, true]} skipDot skipField>\n <MarkdownEditor\n value={value}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n )}\n </>\n );\n },\n);\n","import type { FC } from 'react';\nimport type { NodeRendererType, NodeVM } from '../../vm/types';\nimport { ContainerRendererComponent } from './ContainerRenderer';\nimport { StringRendererComponent } from './StringRenderer';\nimport { NumberRendererComponent } from './NumberRenderer';\nimport { BooleanRendererComponent } from './BooleanRenderer';\nimport { ForeignKeyRendererComponent } from './ForeignKeyRenderer';\nimport { FileRendererComponent } from './FileRenderer';\nimport { MarkdownRendererComponent } from './MarkdownRenderer';\n\nexport const NODE_RENDERERS: Record<NodeRendererType, FC<{ node: NodeVM }>> = {\n container: ContainerRendererComponent as FC<{ node: NodeVM }>,\n string: StringRendererComponent as FC<{ node: NodeVM }>,\n number: NumberRendererComponent as FC<{ node: NodeVM }>,\n boolean: BooleanRendererComponent as FC<{ node: NodeVM }>,\n foreignKey: ForeignKeyRendererComponent as FC<{ node: NodeVM }>,\n file: FileRendererComponent as FC<{ node: NodeVM }>,\n markdown: MarkdownRendererComponent as FC<{ node: NodeVM }>,\n};\n","import { FC } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { FlatItem } from '../../vm/flattenNodes';\nimport { NODE_RENDERERS } from '../renderers/NodeRenderers';\nimport { Row } from '../components/Row';\nimport { CreateButton } from '../../../components/CreateButton';\n\nexport const FlatItemView: FC<{ item: FlatItem }> = observer(({ item }) => {\n if (item.type === 'node') {\n const Renderer = NODE_RENDERERS[item.node.rendererType];\n return <Renderer node={item.node} />;\n }\n\n const handleAddItem = () => {\n item.array.pushValue(null);\n };\n\n return (\n <Row name=\"\" guides={item.guides} skipDot skipField skipMore>\n <CreateButton\n title=\"Item\"\n onClick={handleAddItem}\n dataTestId={`${item.array.testId}-add-button`}\n />\n </Row>\n );\n});\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Virtuoso } from 'react-virtuoso';\nimport type { RowEditorVM } from '../../vm/RowEditorVM';\nimport type { FlatItem } from '../../vm/flattenNodes';\nimport { FlatItemView } from './FlatItemView';\n\nexport interface RowEditorProps {\n viewModel: RowEditorVM;\n}\n\nexport const RowEditor: FC<RowEditorProps> = observer(({ viewModel }) => {\n const itemContent = useCallback(\n (_index: number, item: FlatItem) => <FlatItemView item={item} />,\n [],\n );\n\n return (\n <Virtuoso\n data={viewModel.flattenedNodes as FlatItem[]}\n itemContent={itemContent}\n useWindowScroll\n style={{ width: '100%', height: '100%' }}\n />\n );\n});\n","import { FC, Fragment, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { VStack } from '@chakra-ui/react';\nimport type { NodeVM } from '../../vm/types';\nimport { NODE_RENDERERS } from '../renderers/NodeRenderers';\nimport { Row } from '../components/Row';\nimport { CreateButton } from '../../../components/CreateButton';\n\nexport interface NodeViewProps {\n viewModel: NodeVM;\n}\n\nexport const NodeView: FC<NodeViewProps> = observer(({ viewModel }) => {\n const Renderer = NODE_RENDERERS[viewModel.rendererType];\n const { showChildren, childNodes } = viewModel;\n const showAddButton = viewModel.isArray() && viewModel.showAddButton;\n\n const handleAddItem = useCallback(() => {\n if (viewModel.isArray()) {\n viewModel.pushValue(null);\n }\n }, [viewModel]);\n\n return (\n <Fragment>\n <Renderer node={viewModel} />\n {showChildren && (\n <VStack align=\"stretch\" gap={0}>\n {childNodes.map((child) => (\n <NodeView key={child.id} viewModel={child} />\n ))}\n </VStack>\n )}\n {showAddButton && (\n <Row\n name=\"\"\n guides={[...viewModel.guides, false]}\n skipDot\n skipField\n skipMore\n >\n <CreateButton\n title=\"Item\"\n onClick={handleAddItem}\n dataTestId={`${viewModel.testId}-add-button`}\n />\n </Row>\n )}\n </Fragment>\n );\n});\n","export enum FilterFieldType {\n String = 'String',\n Number = 'Number',\n Boolean = 'Boolean',\n ForeignKey = 'ForeignKey',\n File = 'File',\n DateTime = 'DateTime',\n}\n","import { SystemSchemaIds } from '@revisium/schema-toolkit';\nimport { FilterFieldType } from './field-types.js';\n\nexport enum SystemFieldId {\n Id = 'id',\n CreatedAt = 'createdAt',\n UpdatedAt = 'updatedAt',\n CreatedId = 'createdId',\n VersionId = 'versionId',\n PublishedAt = 'publishedAt',\n Hash = 'hash',\n SchemaHash = 'schemaHash',\n}\n\nexport interface SystemFieldDef {\n id: SystemFieldId;\n label: string;\n fieldType: FilterFieldType;\n ref: SystemSchemaIds;\n}\n\nexport const SYSTEM_FIELDS: SystemFieldDef[] = [\n {\n id: SystemFieldId.Id,\n label: 'id',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowId,\n },\n {\n id: SystemFieldId.CreatedAt,\n label: 'createdAt',\n fieldType: FilterFieldType.DateTime,\n ref: SystemSchemaIds.RowCreatedAt,\n },\n {\n id: SystemFieldId.UpdatedAt,\n label: 'updatedAt',\n fieldType: FilterFieldType.DateTime,\n ref: SystemSchemaIds.RowUpdatedAt,\n },\n {\n id: SystemFieldId.CreatedId,\n label: 'createdId',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowCreatedId,\n },\n {\n id: SystemFieldId.VersionId,\n label: 'versionId',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowVersionId,\n },\n {\n id: SystemFieldId.PublishedAt,\n label: 'publishedAt',\n fieldType: FilterFieldType.DateTime,\n ref: SystemSchemaIds.RowPublishedAt,\n },\n {\n id: SystemFieldId.Hash,\n label: 'hash',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowHash,\n },\n {\n id: SystemFieldId.SchemaHash,\n label: 'schemaHash',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowSchemaHash,\n },\n];\n\nexport const SYSTEM_FIELD_BY_REF: ReadonlyMap<string, SystemFieldDef> = new Map(\n SYSTEM_FIELDS.map((f) => [f.ref, f]),\n);\n","export const SYSTEM_FIELD_IDS: ReadonlySet<string> = new Set([\n 'id',\n 'createdAt',\n 'updatedAt',\n 'createdId',\n 'versionId',\n 'publishedAt',\n 'hash',\n 'schemaHash',\n]);\n","import {\n SchemaParser,\n SystemSchemaIds,\n fileSchema,\n rowIdSchema,\n rowCreatedAtSchema,\n rowCreatedIdSchema,\n rowVersionIdSchema,\n rowPublishedAtSchema,\n rowUpdatedAtSchema,\n rowHashSchema,\n rowSchemaHashSchema,\n} from '@revisium/schema-toolkit';\nimport type {\n JsonObjectSchema,\n JsonSchema,\n RefSchemas,\n SchemaNode,\n} from '@revisium/schema-toolkit';\nimport { extractColumns } from '../../Columns/model/extractColumns.js';\nimport type { ColumnSpec } from '../../Columns/model/types.js';\nimport { FilterFieldType } from '../../shared/field-types.js';\nimport { SYSTEM_FIELDS } from '../../shared/system-fields.js';\n\nexport const DATA_FIELD = 'data';\n\nexport function stripDataFieldPrefix(field: string): string {\n const prefix = `${DATA_FIELD}.`;\n if (field.startsWith(prefix)) {\n return field.slice(prefix.length);\n }\n if (field === DATA_FIELD) {\n return '';\n }\n return field;\n}\n\nconst SYSTEM_REF_SCHEMAS: RefSchemas = {\n [SystemSchemaIds.File]: fileSchema,\n [SystemSchemaIds.RowId]: rowIdSchema,\n [SystemSchemaIds.RowCreatedAt]: rowCreatedAtSchema,\n [SystemSchemaIds.RowCreatedId]: rowCreatedIdSchema,\n [SystemSchemaIds.RowVersionId]: rowVersionIdSchema,\n [SystemSchemaIds.RowPublishedAt]: rowPublishedAtSchema,\n [SystemSchemaIds.RowUpdatedAt]: rowUpdatedAtSchema,\n [SystemSchemaIds.RowHash]: rowHashSchema,\n [SystemSchemaIds.RowSchemaHash]: rowSchemaHashSchema,\n};\n\nexport function wrapDataSchema(dataSchema: JsonSchema): JsonObjectSchema {\n return {\n type: 'object',\n properties: { [DATA_FIELD]: dataSchema },\n additionalProperties: false,\n required: [DATA_FIELD],\n } as JsonObjectSchema;\n}\n\nfunction buildRowSchema(wrappedDataSchema: JsonObjectSchema): JsonObjectSchema {\n const systemProperties: Record<string, { $ref: string }> = {};\n for (const sf of SYSTEM_FIELDS) {\n systemProperties[sf.id] = { $ref: sf.ref };\n }\n\n return {\n type: 'object',\n properties: {\n ...systemProperties,\n ...wrappedDataSchema.properties,\n },\n additionalProperties: false,\n required: [...Object.keys(systemProperties), ...wrappedDataSchema.required],\n } as JsonObjectSchema;\n}\n\nexport class SchemaContext {\n private _allColumns: ColumnSpec[] = [];\n private _dataSchema: JsonSchema | null = null;\n private _wrappedDataSchema: JsonObjectSchema | null = null;\n private _fullRefSchemas: RefSchemas = {};\n private _rootNode: SchemaNode | null = null;\n\n get allColumns(): ColumnSpec[] {\n return this._allColumns;\n }\n\n get sortableFields(): ColumnSpec[] {\n return this._allColumns.filter(\n (col) => !col.isDeprecated && col.fieldType !== FilterFieldType.File,\n );\n }\n\n get filterableFields(): ColumnSpec[] {\n return this.sortableFields;\n }\n\n get dataSchema(): JsonSchema | null {\n return this._dataSchema;\n }\n\n get wrappedDataSchema(): JsonObjectSchema | null {\n return this._wrappedDataSchema;\n }\n\n get fullRefSchemas(): RefSchemas {\n return this._fullRefSchemas;\n }\n\n get rootNode(): SchemaNode | null {\n return this._rootNode;\n }\n\n init(dataSchema: JsonSchema, refSchemas?: RefSchemas): void {\n this._dataSchema = dataSchema;\n this._fullRefSchemas = { ...SYSTEM_REF_SCHEMAS, ...refSchemas };\n\n const wrapped = wrapDataSchema(dataSchema);\n this._wrappedDataSchema = wrapped;\n const rowSchema = buildRowSchema(wrapped);\n const parser = new SchemaParser();\n this._rootNode = parser.parse(rowSchema, this._fullRefSchemas);\n this._allColumns = extractColumns(this._rootNode);\n }\n}\n","import type { SchemaNode } from '@revisium/schema-toolkit';\nimport { SystemSchemaIds } from '@revisium/schema-toolkit';\nimport { FilterFieldType } from '../../shared/field-types.js';\nimport { SYSTEM_FIELD_BY_REF } from '../../shared/system-fields.js';\nimport { DATA_FIELD } from '../../TableEditor/model/SchemaContext.js';\nimport type { ColumnSpec } from './types.js';\n\nconst NODE_TYPE_TO_FIELD_TYPE: Readonly<\n Record<string, FilterFieldType | undefined>\n> = {\n string: FilterFieldType.String,\n number: FilterFieldType.Number,\n boolean: FilterFieldType.Boolean,\n};\n\nexport function extractColumns(rootNode: SchemaNode): ColumnSpec[] {\n const columns: ColumnSpec[] = [];\n if (!rootNode.isObject()) {\n return columns;\n }\n collectColumns(rootNode, '', columns);\n return columns;\n}\n\nfunction collectColumns(\n node: SchemaNode,\n parentPath: string,\n columns: ColumnSpec[],\n): void {\n for (const child of node.properties()) {\n const fieldPath = buildFieldPath(parentPath, child.name());\n const result = resolveColumn(child, fieldPath);\n\n if (result === 'recurse') {\n collectColumns(child, fieldPath, columns);\n } else if (result) {\n if (Array.isArray(result)) {\n for (const col of result) {\n columns.push(col);\n }\n } else {\n columns.push(result);\n }\n }\n }\n}\n\nfunction buildFieldPath(parentPath: string, fieldName: string): string {\n return parentPath ? `${parentPath}.${fieldName}` : fieldName;\n}\n\nfunction resolveColumn(\n child: SchemaNode,\n fieldPath: string,\n): ColumnSpec | ColumnSpec[] | 'recurse' | null {\n if (child.isArray()) {\n return null;\n }\n\n const refResult = resolveRefColumn(child, fieldPath);\n if (refResult) {\n return refResult;\n }\n\n if (child.isObject() && !child.isRef()) {\n return 'recurse';\n }\n\n if (child.foreignKey() !== undefined) {\n const col = createColumn(fieldPath, child, FilterFieldType.ForeignKey);\n col.foreignKeyTableId = child.foreignKey();\n return col;\n }\n\n const fieldType = NODE_TYPE_TO_FIELD_TYPE[child.nodeType()];\n if (fieldType) {\n return createColumn(fieldPath, child, fieldType);\n }\n\n return null;\n}\n\nfunction resolveRefColumn(\n child: SchemaNode,\n fieldPath: string,\n): ColumnSpec | ColumnSpec[] | null {\n const refValue = child.ref();\n if (!refValue) {\n return null;\n }\n\n const systemDef = SYSTEM_FIELD_BY_REF.get(refValue);\n if (systemDef) {\n const isDeprecated = child.metadata().deprecated ?? false;\n const hasFormula = child.hasFormula();\n return {\n field: systemDef.id,\n label: systemDef.label,\n fieldType: systemDef.fieldType,\n isSystem: true,\n systemFieldId: systemDef.id,\n isDeprecated,\n hasFormula,\n isSortable: !isDeprecated && !hasFormula,\n };\n }\n\n if (refValue === SystemSchemaIds.File) {\n return resolveFileRefColumns(child, fieldPath);\n }\n\n return null;\n}\n\nfunction resolveFileRefColumns(\n child: SchemaNode,\n fieldPath: string,\n): ColumnSpec[] {\n const fileColumn = createColumn(fieldPath, child, FilterFieldType.File);\n const result: ColumnSpec[] = [fileColumn];\n\n if (child.isObject()) {\n for (const subField of child.properties()) {\n const subFieldPath = buildFieldPath(fieldPath, subField.name());\n const fieldType = NODE_TYPE_TO_FIELD_TYPE[subField.nodeType()];\n if (fieldType) {\n result.push(createColumn(subFieldPath, subField, fieldType));\n }\n }\n }\n\n return result;\n}\n\nfunction stripDataPrefix(fieldPath: string): string {\n if (fieldPath === DATA_FIELD) {\n return DATA_FIELD;\n }\n if (fieldPath.startsWith(`${DATA_FIELD}.`)) {\n return fieldPath.slice(DATA_FIELD.length + 1);\n }\n return fieldPath;\n}\n\nfunction createColumn(\n fieldPath: string,\n child: SchemaNode,\n fieldType: FilterFieldType,\n): ColumnSpec {\n const isDeprecated = child.metadata().deprecated ?? false;\n const hasFormula = child.hasFormula();\n return {\n field: fieldPath,\n label: stripDataPrefix(fieldPath),\n fieldType,\n isSystem: false,\n isDeprecated,\n hasFormula,\n isSortable:\n !isDeprecated && !hasFormula && fieldType !== FilterFieldType.File,\n };\n}\n","import { FilterFieldType } from '../../shared/field-types.js';\nimport type { ColumnSpec } from './types.js';\n\nconst SEMANTIC_NAME_PATTERNS =\n /^(title|name|label|subject|summary|description|heading|caption|email|username|displayName|firstName|lastName)$/i;\n\nconst PRIORITY_BY_TYPE: Record<FilterFieldType, number> = {\n [FilterFieldType.File]: 2,\n [FilterFieldType.String]: 2,\n [FilterFieldType.Number]: 3,\n [FilterFieldType.Boolean]: 3,\n [FilterFieldType.DateTime]: 3,\n [FilterFieldType.ForeignKey]: 4,\n};\n\nfunction columnPriority(col: ColumnSpec): number {\n if (\n col.fieldType === FilterFieldType.String &&\n SEMANTIC_NAME_PATTERNS.test(col.label)\n ) {\n return 1;\n }\n return PRIORITY_BY_TYPE[col.fieldType];\n}\n\nexport function selectDefaultColumns(\n columns: ColumnSpec[],\n maxVisible: number = 4,\n): ColumnSpec[] {\n const idColumn = columns.find((col) => col.isSystem && col.field === 'id');\n\n const fileFieldPrefixes = columns\n .filter((col) => col.fieldType === FilterFieldType.File)\n .map((col) => `${col.field}.`);\n\n const eligible = columns.filter(\n (col) =>\n !col.isSystem &&\n !col.isDeprecated &&\n !fileFieldPrefixes.some((prefix) => col.field.startsWith(prefix)),\n );\n const sorted = [...eligible].sort(\n (a, b) => columnPriority(a) - columnPriority(b),\n );\n\n const dataSlots = idColumn ? maxVisible - 1 : maxVisible;\n\n let fileIncluded = false;\n const dataColumns: ColumnSpec[] = [];\n for (const col of sorted) {\n if (dataColumns.length >= dataSlots) {\n break;\n }\n if (col.fieldType === FilterFieldType.File) {\n if (fileIncluded) {\n continue;\n }\n fileIncluded = true;\n }\n dataColumns.push(col);\n }\n\n if (idColumn) {\n return [idColumn, ...dataColumns];\n }\n return dataColumns;\n}\n","import { makeAutoObservable, observable, untracked } from 'mobx';\nimport { FilterFieldType } from '../../shared/field-types.js';\nimport type { ColumnSpec, PinSide, ViewColumn } from './types.js';\nimport { selectDefaultColumns } from './selectDefaultColumns.js';\n\nconst DEFAULT_COLUMN_WIDTH = 150;\nconst DEFAULT_ID_COLUMN_WIDTH = 240;\n\nfunction fieldToCssVar(field: string): string {\n return `--cw-${field.replaceAll('.', '-')}`;\n}\n\nfunction isValidPinZoneOrder(\n fields: string[],\n pins: Map<string, PinSide>,\n): boolean {\n let zone: 'left' | 'none' | 'right' = 'left';\n for (const field of fields) {\n const pin = pins.get(field);\n if (zone === 'left') {\n if (pin === 'right') {\n zone = 'right';\n } else if (pin === undefined) {\n zone = 'none';\n }\n } else if (zone === 'none') {\n if (pin === 'left') {\n return false;\n }\n if (pin === 'right') {\n zone = 'right';\n }\n } else {\n if (pin !== 'right') {\n return false;\n }\n }\n }\n return true;\n}\n\nexport class ColumnsModel {\n private _allColumns: ColumnSpec[] = [];\n private _visibleFields: string[] = [];\n private readonly _columnWidths = observable.map<string, number>();\n private readonly _pinnedColumns = observable.map<string, PinSide>();\n private _onChange: (() => void) | null = null;\n private _isResizing = false;\n private _wrapperElement: HTMLElement | null = null;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n // --- Computed Getters ---\n\n get visibleColumns(): ColumnSpec[] {\n const lookup = this._columnLookup;\n const result: ColumnSpec[] = [];\n for (const field of this._visibleFields) {\n const col = lookup.get(field);\n if (col) {\n result.push(col);\n }\n }\n return result;\n }\n\n get hiddenColumns(): ColumnSpec[] {\n const visible = this._visibleFieldSet;\n return this._allColumns.filter((col) => !visible.has(col.field));\n }\n\n get availableFieldsToAdd(): ColumnSpec[] {\n const visible = this._visibleFieldSet;\n return this._allColumns.filter(\n (col) => !visible.has(col.field) && !col.isSystem,\n );\n }\n\n get availableFieldsToInsert(): ColumnSpec[] {\n const visible = this._visibleFieldSet;\n return this._allColumns.filter((col) => !visible.has(col.field));\n }\n\n get availableSystemFieldsToAdd(): ColumnSpec[] {\n const visible = this._visibleFieldSet;\n return this._allColumns.filter(\n (col) => !visible.has(col.field) && col.isSystem,\n );\n }\n\n get hasHiddenColumns(): boolean {\n return this._visibleFields.length < this._allColumns.length;\n }\n\n get canRemoveColumn(): boolean {\n return this._visibleFields.length > 1;\n }\n\n get sortableFields(): ColumnSpec[] {\n return this._operableFields;\n }\n\n get filterableFields(): ColumnSpec[] {\n return this._operableFields;\n }\n\n private get _operableFields(): ColumnSpec[] {\n return this._allColumns.filter(\n (col) => !col.isDeprecated && col.fieldType !== FilterFieldType.File,\n );\n }\n\n get pinnedLeftCount(): number {\n let count = 0;\n for (const side of this._pinnedColumns.values()) {\n if (side === 'left') {\n count++;\n }\n }\n return count;\n }\n\n get pinnedRightCount(): number {\n let count = 0;\n for (const side of this._pinnedColumns.values()) {\n if (side === 'right') {\n count++;\n }\n }\n return count;\n }\n\n // --- Lifecycle ---\n\n init(columns: ColumnSpec[]): void {\n this._allColumns = columns;\n const defaults = selectDefaultColumns(columns);\n this._visibleFields = defaults.map((col) => col.field);\n this._columnWidths.clear();\n this._pinnedColumns.clear();\n }\n\n // --- Visibility ---\n\n showColumn(field: string): void {\n if (!this._visibleFields.includes(field)) {\n const rightBounds = this._getZoneBounds('right');\n this._visibleFields.splice(rightBounds.start, 0, field);\n this._notifyChange();\n }\n }\n\n hideColumn(field: string): void {\n if (this._visibleFields.length <= 1) {\n return;\n }\n const index = this._visibleFields.indexOf(field);\n if (index !== -1) {\n this._visibleFields.splice(index, 1);\n this._pinnedColumns.delete(field);\n this._notifyChange();\n }\n }\n\n hideAll(): void {\n if (this._visibleFields.length <= 1) {\n return;\n }\n this._visibleFields = this._visibleFields.slice(0, 1);\n this._pinnedColumns.clear();\n this._notifyChange();\n }\n\n addAll(): void {\n this._visibleFields = this._allColumns.map((col) => col.field);\n this._notifyChange();\n }\n\n // --- Query ---\n\n getColumnIndex(field: string): number {\n return this._visibleFields.indexOf(field);\n }\n\n canMoveLeft(field: string): boolean {\n const index = this.getColumnIndex(field);\n if (index <= 0) {\n return false;\n }\n const zone = this._getZone(field);\n const bounds = this._getZoneBounds(zone);\n return index > bounds.start;\n }\n\n canMoveRight(field: string): boolean {\n const index = this.getColumnIndex(field);\n if (index < 0 || index >= this._visibleFields.length - 1) {\n return false;\n }\n const zone = this._getZone(field);\n const bounds = this._getZoneBounds(zone);\n return index < bounds.end - 1;\n }\n\n canMoveToStart(field: string): boolean {\n return this.canMoveLeft(field);\n }\n\n canMoveToEnd(field: string): boolean {\n return this.canMoveRight(field);\n }\n\n // --- Movement ---\n\n moveColumnLeft(field: string): void {\n if (!this.canMoveLeft(field)) {\n return;\n }\n const index = this.getColumnIndex(field);\n this._visibleFields.splice(index, 1);\n this._visibleFields.splice(index - 1, 0, field);\n this._notifyChange();\n }\n\n moveColumnRight(field: string): void {\n if (!this.canMoveRight(field)) {\n return;\n }\n const index = this.getColumnIndex(field);\n this._visibleFields.splice(index, 1);\n this._visibleFields.splice(index + 1, 0, field);\n this._notifyChange();\n }\n\n moveColumnToStart(field: string): void {\n if (!this.canMoveLeft(field)) {\n return;\n }\n const index = this.getColumnIndex(field);\n const zone = this._getZone(field);\n const bounds = this._getZoneBounds(zone);\n this._visibleFields.splice(index, 1);\n this._visibleFields.splice(bounds.start, 0, field);\n this._notifyChange();\n }\n\n moveColumnToEnd(field: string): void {\n if (!this.canMoveRight(field)) {\n return;\n }\n const index = this.getColumnIndex(field);\n const zone = this._getZone(field);\n const bounds = this._getZoneBounds(zone);\n this._visibleFields.splice(index, 1);\n this._visibleFields.splice(bounds.end - 1, 0, field);\n this._notifyChange();\n }\n\n // --- Insertion ---\n\n insertColumnBefore(targetField: string, newField: string): void {\n if (this._visibleFields.includes(newField)) {\n return;\n }\n const targetIndex = this._visibleFields.indexOf(targetField);\n if (targetIndex === -1) {\n return;\n }\n const targetPin = this._pinnedColumns.get(targetField);\n const shouldPin =\n targetPin !== undefined &&\n this._hasNeighborPin(targetIndex, 'before', targetPin);\n this._visibleFields.splice(targetIndex, 0, newField);\n if (shouldPin) {\n this._pinnedColumns.set(newField, targetPin);\n }\n this._notifyChange();\n }\n\n insertColumnAfter(targetField: string, newField: string): void {\n if (this._visibleFields.includes(newField)) {\n return;\n }\n const targetIndex = this._visibleFields.indexOf(targetField);\n if (targetIndex === -1) {\n return;\n }\n const targetPin = this._pinnedColumns.get(targetField);\n const shouldPin =\n targetPin !== undefined &&\n this._hasNeighborPin(targetIndex, 'after', targetPin);\n this._visibleFields.splice(targetIndex + 1, 0, newField);\n if (shouldPin) {\n this._pinnedColumns.set(newField, targetPin);\n }\n this._notifyChange();\n }\n\n reorderColumns(fields: string[]): void {\n this._visibleFields = fields;\n this._notifyChange();\n }\n\n // --- Width ---\n\n get isResizing(): boolean {\n return this._isResizing;\n }\n\n setWrapperElement(el: HTMLElement | null): void {\n this._wrapperElement = el;\n }\n\n setColumnWidth(field: string, width: number): void {\n this._isResizing = true;\n this._columnWidths.set(field, width);\n if (this._wrapperElement) {\n this._wrapperElement.style.setProperty(\n fieldToCssVar(field),\n `${width}px`,\n );\n }\n }\n\n commitColumnWidth(): void {\n this._isResizing = false;\n this._notifyChange();\n }\n\n getColumnWidth(field: string): number | undefined {\n return this._columnWidths.get(field);\n }\n\n resolveColumnWidth(field: string): number {\n return this._resolveWidthUntracked(field);\n }\n\n get columnWidthCssVars(): Record<string, string> {\n if (this._isResizing) {\n return this._buildCssVarsUntracked();\n }\n return this._buildCssVarsTracked();\n }\n\n getWidthCssVarsDuringResize(): Record<string, string> {\n return this._buildCssVarsUntracked();\n }\n\n columnWidthCssVar(field: string): string {\n return `var(${fieldToCssVar(field)}, ${field === 'id' ? DEFAULT_ID_COLUMN_WIDTH : DEFAULT_COLUMN_WIDTH}px)`;\n }\n\n // --- Pinning ---\n\n getPinState(field: string): PinSide | undefined {\n return this._pinnedColumns.get(field);\n }\n\n isPinned(field: string): boolean {\n return this._pinnedColumns.has(field);\n }\n\n canPinLeft(field: string): boolean {\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return false;\n }\n return this._pinnedColumns.get(field) !== 'left';\n }\n\n canPinRight(field: string): boolean {\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return false;\n }\n return this._pinnedColumns.get(field) !== 'right';\n }\n\n canUnpin(field: string): boolean {\n return this._pinnedColumns.has(field);\n }\n\n pinLeft(field: string): void {\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return;\n }\n this._pinnedColumns.set(field, 'left');\n this._visibleFields.splice(index, 1);\n const insertAt = this._pinnedLeftInsertIndex();\n this._visibleFields.splice(insertAt, 0, field);\n this._notifyChange();\n }\n\n pinRight(field: string): void {\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return;\n }\n this._pinnedColumns.set(field, 'right');\n this._visibleFields.splice(index, 1);\n const insertAt = this._pinnedRightInsertIndex();\n this._visibleFields.splice(insertAt, 0, field);\n this._notifyChange();\n }\n\n unpin(field: string): void {\n if (!this._pinnedColumns.has(field)) {\n return;\n }\n const wasLeft = this._pinnedColumns.get(field) === 'left';\n this._pinnedColumns.delete(field);\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return;\n }\n this._visibleFields.splice(index, 1);\n if (wasLeft) {\n const middleBounds = this._getZoneBounds('middle');\n this._visibleFields.splice(middleBounds.start, 0, field);\n } else {\n const middleBounds = this._getZoneBounds('middle');\n this._visibleFields.splice(middleBounds.end, 0, field);\n }\n this._notifyChange();\n }\n\n getColumnStickyLeft(\n field: string,\n selectionWidth: number,\n ): number | undefined {\n if (this._pinnedColumns.get(field) !== 'left') {\n return undefined;\n }\n let offset = selectionWidth;\n for (const f of this._visibleFields) {\n if (f === field) {\n break;\n }\n if (this._pinnedColumns.get(f) === 'left') {\n offset += this._resolveWidthUntracked(f);\n }\n }\n return offset;\n }\n\n getColumnStickyRight(field: string): number | undefined {\n if (this._pinnedColumns.get(field) !== 'right') {\n return undefined;\n }\n let offset = 0;\n let found = false;\n for (const f of this._visibleFields) {\n if (f === field) {\n found = true;\n continue;\n }\n if (found && this._pinnedColumns.get(f) === 'right') {\n offset += this._resolveWidthUntracked(f);\n }\n }\n return offset;\n }\n\n getColumnStickyLeftCss(\n field: string,\n selectionWidth: number,\n ): string | undefined {\n if (this._pinnedColumns.get(field) !== 'left') {\n return undefined;\n }\n const parts: string[] = [];\n if (selectionWidth > 0) {\n parts.push(`${selectionWidth}px`);\n }\n for (const f of this._visibleFields) {\n if (f === field) {\n break;\n }\n if (this._pinnedColumns.get(f) === 'left') {\n parts.push(this.columnWidthCssVar(f));\n }\n }\n if (parts.length === 0) {\n return '0px';\n }\n if (parts.length === 1) {\n return parts[0];\n }\n return `calc(${parts.join(' + ')})`;\n }\n\n getColumnStickyRightCss(field: string): string | undefined {\n if (this._pinnedColumns.get(field) !== 'right') {\n return undefined;\n }\n const parts: string[] = [];\n let found = false;\n for (const f of this._visibleFields) {\n if (f === field) {\n found = true;\n continue;\n }\n if (found && this._pinnedColumns.get(f) === 'right') {\n parts.push(this.columnWidthCssVar(f));\n }\n }\n if (parts.length === 0) {\n return '0px';\n }\n if (parts.length === 1) {\n return parts[0];\n }\n return `calc(${parts.join(' + ')})`;\n }\n\n isStickyLeftBoundary(field: string): boolean {\n if (this._pinnedColumns.get(field) !== 'left') {\n return false;\n }\n const index = this.getColumnIndex(field);\n const nextField = this._visibleFields[index + 1];\n if (!nextField) {\n return true;\n }\n return this._pinnedColumns.get(nextField) !== 'left';\n }\n\n isStickyRightBoundary(field: string): boolean {\n if (this._pinnedColumns.get(field) !== 'right') {\n return false;\n }\n const index = this.getColumnIndex(field);\n if (index <= 0) {\n return true;\n }\n const prevField = this._visibleFields[index - 1];\n if (!prevField) {\n return true;\n }\n return this._pinnedColumns.get(prevField) !== 'right';\n }\n\n // --- Reset ---\n\n resetToDefaults(): void {\n const defaults = selectDefaultColumns(this._allColumns);\n this._visibleFields = defaults.map((col) => col.field);\n this._columnWidths.clear();\n this._pinnedColumns.clear();\n this._notifyChange();\n }\n\n // --- Serialization ---\n\n serializeToViewColumns(): ViewColumn[] {\n return this._visibleFields.map((field) => {\n const viewField = this._toViewField(field);\n const width = this._columnWidths.get(field);\n const pinned = this._pinnedColumns.get(field);\n const result: ViewColumn = { field: viewField };\n if (width !== undefined) {\n result.width = width;\n }\n if (pinned !== undefined) {\n result.pinned = pinned;\n }\n return result;\n });\n }\n\n applyViewColumns(viewColumns: ViewColumn[]): void {\n const lookup = this._columnLookup;\n const fields: string[] = [];\n const widths = new Map<string, number>();\n const pins = new Map<string, PinSide>();\n\n for (const vc of viewColumns) {\n const field = this._fromViewField(vc.field);\n if (lookup.has(field)) {\n fields.push(field);\n if (vc.width !== undefined) {\n widths.set(field, vc.width);\n }\n if (vc.pinned !== undefined) {\n pins.set(field, vc.pinned);\n }\n }\n }\n\n this._columnWidths.clear();\n this._pinnedColumns.clear();\n\n for (const [field, width] of widths) {\n this._columnWidths.set(field, width);\n }\n\n if (isValidPinZoneOrder(fields, pins)) {\n for (const [field, side] of pins) {\n this._pinnedColumns.set(field, side);\n }\n }\n\n if (fields.length === 0) {\n const defaults = selectDefaultColumns(this._allColumns);\n this._visibleFields = defaults.map((col) => col.field);\n } else {\n this._visibleFields = fields;\n }\n }\n\n // --- Events ---\n\n setOnChange(cb: (() => void) | null): void {\n this._onChange = cb;\n }\n\n dispose(): void {\n this._onChange = null;\n }\n\n // --- Private ---\n\n private get _visibleFieldSet(): Set<string> {\n return new Set(this._visibleFields);\n }\n\n private get _columnLookup(): Map<string, ColumnSpec> {\n return new Map(this._allColumns.map((col) => [col.field, col]));\n }\n\n private _getZone(field: string): 'left' | 'middle' | 'right' {\n const pin = this._pinnedColumns.get(field);\n if (pin === 'left') {\n return 'left';\n }\n if (pin === 'right') {\n return 'right';\n }\n return 'middle';\n }\n\n private _getZoneBounds(zone: 'left' | 'middle' | 'right'): {\n start: number;\n end: number;\n } {\n let leftEnd = 0;\n for (let i = 0; i < this._visibleFields.length; i++) {\n const f = this._visibleFields[i];\n if (f && this._pinnedColumns.get(f) === 'left') {\n leftEnd = i + 1;\n } else {\n break;\n }\n }\n\n let rightStart = this._visibleFields.length;\n for (let i = this._visibleFields.length - 1; i >= 0; i--) {\n const f = this._visibleFields[i];\n if (f && this._pinnedColumns.get(f) === 'right') {\n rightStart = i;\n } else {\n break;\n }\n }\n\n switch (zone) {\n case 'left':\n return { start: 0, end: leftEnd };\n case 'right':\n return { start: rightStart, end: this._visibleFields.length };\n case 'middle':\n return { start: leftEnd, end: rightStart };\n }\n }\n\n private _pinnedLeftInsertIndex(): number {\n const bounds = this._getZoneBounds('left');\n return bounds.end;\n }\n\n private _pinnedRightInsertIndex(): number {\n const bounds = this._getZoneBounds('right');\n return bounds.start;\n }\n\n private _hasNeighborPin(\n targetIndex: number,\n direction: 'before' | 'after',\n pin: PinSide,\n ): boolean {\n const neighborIndex =\n direction === 'after' ? targetIndex + 1 : targetIndex - 1;\n const neighbor = this._visibleFields[neighborIndex];\n if (!neighbor) {\n return false;\n }\n return this._pinnedColumns.get(neighbor) === pin;\n }\n\n private _toViewField(field: string): string {\n return field;\n }\n\n private _fromViewField(viewField: string): string {\n return viewField;\n }\n\n private _resolveWidthUntracked(field: string): number {\n return untracked(\n () =>\n this._columnWidths.get(field) ??\n (field === 'id' ? DEFAULT_ID_COLUMN_WIDTH : DEFAULT_COLUMN_WIDTH),\n );\n }\n\n private _buildCssVarsTracked(): Record<string, string> {\n const vars: Record<string, string> = {};\n for (const field of this._visibleFields) {\n const width =\n this._columnWidths.get(field) ??\n (field === 'id' ? DEFAULT_ID_COLUMN_WIDTH : DEFAULT_COLUMN_WIDTH);\n vars[fieldToCssVar(field)] = `${width}px`;\n }\n return vars;\n }\n\n private _buildCssVarsUntracked(): Record<string, string> {\n return untracked(() => {\n const vars: Record<string, string> = {};\n for (const field of this._visibleFields) {\n const width =\n this._columnWidths.get(field) ??\n (field === 'id' ? DEFAULT_ID_COLUMN_WIDTH : DEFAULT_COLUMN_WIDTH);\n vars[fieldToCssVar(field)] = `${width}px`;\n }\n return vars;\n });\n }\n\n private _notifyChange(): void {\n if (this._onChange) {\n this._onChange();\n }\n }\n}\n","import { FilterFieldType } from '../../../shared/field-types.js';\n\nexport enum FilterOperator {\n Equals = 'equals',\n NotEquals = 'not_equals',\n Contains = 'contains',\n NotContains = 'not_contains',\n StartsWith = 'starts_with',\n EndsWith = 'ends_with',\n IsEmpty = 'is_empty',\n IsNotEmpty = 'is_not_empty',\n Gt = 'gt',\n Gte = 'gte',\n Lt = 'lt',\n Lte = 'lte',\n IsTrue = 'is_true',\n IsFalse = 'is_false',\n Search = 'search',\n}\n\nexport interface OperatorInfo {\n operator: FilterOperator;\n label: string;\n requiresValue: boolean;\n}\n\nconst UNARY_OPERATORS = new Set<FilterOperator>([\n FilterOperator.IsEmpty,\n FilterOperator.IsNotEmpty,\n FilterOperator.IsTrue,\n FilterOperator.IsFalse,\n]);\n\nexport function operatorRequiresValue(operator: FilterOperator): boolean {\n return !UNARY_OPERATORS.has(operator);\n}\n\nfunction op(\n operator: FilterOperator,\n label: string,\n requiresValue = true,\n): OperatorInfo {\n return { operator, label, requiresValue };\n}\n\nconst STRING_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.Equals, 'equals'),\n op(FilterOperator.NotEquals, 'not equals'),\n op(FilterOperator.Contains, 'contains'),\n op(FilterOperator.NotContains, 'not contains'),\n op(FilterOperator.StartsWith, 'starts with'),\n op(FilterOperator.EndsWith, 'ends with'),\n op(FilterOperator.IsEmpty, 'is empty', false),\n op(FilterOperator.IsNotEmpty, 'is not empty', false),\n op(FilterOperator.Search, 'search'),\n];\n\nconst NUMBER_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.Equals, '='),\n op(FilterOperator.NotEquals, '!='),\n op(FilterOperator.Gt, '>'),\n op(FilterOperator.Gte, '>='),\n op(FilterOperator.Lt, '<'),\n op(FilterOperator.Lte, '<='),\n op(FilterOperator.IsEmpty, 'is empty', false),\n op(FilterOperator.IsNotEmpty, 'is not empty', false),\n];\n\nconst BOOLEAN_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.IsTrue, 'is true', false),\n op(FilterOperator.IsFalse, 'is false', false),\n op(FilterOperator.IsEmpty, 'is empty', false),\n op(FilterOperator.IsNotEmpty, 'is not empty', false),\n];\n\nconst FOREIGN_KEY_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.Equals, 'equals'),\n op(FilterOperator.NotEquals, 'not equals'),\n op(FilterOperator.IsEmpty, 'is empty', false),\n op(FilterOperator.IsNotEmpty, 'is not empty', false),\n];\n\nconst DATETIME_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.Equals, 'is'),\n op(FilterOperator.NotEquals, 'is not'),\n op(FilterOperator.Lt, 'before'),\n op(FilterOperator.Gt, 'after'),\n op(FilterOperator.Lte, 'on or before'),\n op(FilterOperator.Gte, 'on or after'),\n];\n\nexport const OPERATORS_BY_TYPE: Readonly<\n Record<FilterFieldType, readonly OperatorInfo[]>\n> = {\n [FilterFieldType.String]: STRING_OPERATORS,\n [FilterFieldType.Number]: NUMBER_OPERATORS,\n [FilterFieldType.Boolean]: BOOLEAN_OPERATORS,\n [FilterFieldType.ForeignKey]: FOREIGN_KEY_OPERATORS,\n [FilterFieldType.File]: STRING_OPERATORS,\n [FilterFieldType.DateTime]: DATETIME_OPERATORS,\n};\n\nexport function getOperatorLabel(\n operator: FilterOperator,\n fieldType: FilterFieldType,\n): string {\n const ops = OPERATORS_BY_TYPE[fieldType];\n const found = ops.find((o) => o.operator === operator);\n if (found) {\n return found.label;\n }\n return operator;\n}\n\nexport function getDefaultOperator(fieldType: FilterFieldType): FilterOperator {\n const operators = OPERATORS_BY_TYPE[fieldType];\n const first = operators[0];\n if (!first) {\n throw new Error(`No operators defined for field type: ${fieldType}`);\n }\n return first.operator;\n}\n\nexport function getOperatorsForType(\n fieldType: FilterFieldType,\n): OperatorInfo[] {\n return [...OPERATORS_BY_TYPE[fieldType]];\n}\n","export enum SearchLanguage {\n Arabic = 'arabic',\n Armenian = 'armenian',\n Basque = 'basque',\n Catalan = 'catalan',\n Danish = 'danish',\n Dutch = 'dutch',\n English = 'english',\n Finnish = 'finnish',\n French = 'french',\n German = 'german',\n Greek = 'greek',\n Hindi = 'hindi',\n Hungarian = 'hungarian',\n Indonesian = 'indonesian',\n Irish = 'irish',\n Italian = 'italian',\n Lithuanian = 'lithuanian',\n Nepali = 'nepali',\n Norwegian = 'norwegian',\n Portuguese = 'portuguese',\n Romanian = 'romanian',\n Russian = 'russian',\n Serbian = 'serbian',\n Simple = 'simple',\n Spanish = 'spanish',\n Swedish = 'swedish',\n Tamil = 'tamil',\n Turkish = 'turkish',\n Yiddish = 'yiddish',\n}\n\nexport enum SearchType {\n Plain = 'plain',\n Phrase = 'phrase',\n Prefix = 'prefix',\n Tsquery = 'tsquery',\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport const SEARCH_LANGUAGES: readonly {\n value: SearchLanguage;\n label: string;\n}[] = Object.values(SearchLanguage).map((value) => ({\n value,\n label:\n value === SearchLanguage.Simple\n ? 'Simple (no stemming)'\n : capitalize(value),\n}));\n\nexport const SEARCH_TYPES: readonly { value: SearchType; label: string }[] = [\n { value: SearchType.Plain, label: 'Words (any order)' },\n { value: SearchType.Phrase, label: 'Exact phrase' },\n { value: SearchType.Prefix, label: 'Partial words' },\n { value: SearchType.Tsquery, label: 'Raw tsquery' },\n];\n","import type { FilterFieldType } from '../../../shared/field-types.js';\nimport type { FilterOperator } from '../utils/operators.js';\nimport type { SearchLanguage, SearchType } from '../utils/searchTypes.js';\nimport type { ConditionNode } from '../filterSchema.js';\n\nexport class FilterConditionVM {\n constructor(private readonly _node: ConditionNode) {}\n\n get id(): string {\n return this._node.child('id').value;\n }\n\n get field(): string {\n return this._node.child('field').value;\n }\n\n get fieldType(): FilterFieldType {\n return this._node.child('fieldType').value as FilterFieldType;\n }\n\n get operator(): FilterOperator {\n return this._node.child('operator').value as FilterOperator;\n }\n\n get value(): string {\n return this._node.child('value').value;\n }\n\n get searchLanguage(): SearchLanguage {\n return this._node.child('searchLanguage').value as SearchLanguage;\n }\n\n get searchType(): SearchType {\n return this._node.child('searchType').value as SearchType;\n }\n}\n","import type { FilterRootNode, NestedGroupNode } from '../filterSchema.js';\nimport { FilterConditionVM } from './FilterConditionVM.js';\n\nexport class FilterGroupVM {\n private readonly _isRoot: boolean;\n\n constructor(\n private readonly _node: FilterRootNode | NestedGroupNode,\n isRoot = false,\n ) {\n this._isRoot = isRoot;\n }\n\n get id(): string {\n return this._node.child('id').value;\n }\n\n get logic(): 'and' | 'or' {\n return this._node.child('logic').value as 'and' | 'or';\n }\n\n get conditions(): FilterConditionVM[] {\n const conditionsNode = this._node.child('conditions');\n const result: FilterConditionVM[] = [];\n for (let i = 0; i < conditionsNode.length; i++) {\n const item = conditionsNode.at(i);\n if (item) {\n result.push(new FilterConditionVM(item));\n }\n }\n return result;\n }\n\n get groups(): FilterGroupVM[] {\n if (!this._isRoot) {\n return [];\n }\n const rootNode = this._node as FilterRootNode;\n const groupsNode = rootNode.child('groups');\n const result: FilterGroupVM[] = [];\n for (let i = 0; i < groupsNode.length; i++) {\n const item = groupsNode.at(i);\n if (item) {\n result.push(new FilterGroupVM(item));\n }\n }\n return result;\n }\n}\n","import { obj, arr, str, num } from '@revisium/schema-toolkit';\nimport type { InferNode, InferValue } from '@revisium/schema-toolkit';\n\nexport const CONDITION_SCHEMA = obj({\n id: str(),\n field: str(),\n fieldType: str(),\n operator: str(),\n value: str(),\n searchLanguage: str(),\n searchType: str(),\n});\n\nexport const NESTED_GROUP_SCHEMA = obj({\n id: str(),\n logic: str(),\n conditions: arr(CONDITION_SCHEMA),\n});\n\nexport const FILTER_SCHEMA = obj({\n id: str(),\n logic: str(),\n conditions: arr(CONDITION_SCHEMA),\n groups: arr(NESTED_GROUP_SCHEMA),\n nextConditionId: num(),\n nextGroupId: num(),\n});\n\nexport type ConditionNode = InferNode<typeof CONDITION_SCHEMA>;\nexport type NestedGroupNode = InferNode<typeof NESTED_GROUP_SCHEMA>;\nexport type FilterRootNode = InferNode<typeof FILTER_SCHEMA>;\nexport type FilterData = InferValue<typeof FILTER_SCHEMA>;\n","import type { createRowModel } from '@revisium/schema-toolkit';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { FILTER_SCHEMA } from '../filterSchema.js';\nimport { FilterConditionVM } from '../vm/FilterConditionVM.js';\nimport { FilterOperator, getDefaultOperator } from '../utils/operators.js';\nimport { SearchLanguage, SearchType } from '../utils/searchTypes.js';\n\ntype FilterRowModel = ReturnType<typeof createRowModel<typeof FILTER_SCHEMA>>;\n\nexport class FilterTreeOps {\n constructor(\n private readonly _row: FilterRowModel,\n private readonly _getAvailableFields: () => ColumnSpec[],\n ) {}\n\n addCondition(groupId?: string): void {\n const firstField = this._getAvailableFields()[0];\n if (!firstField) {\n return;\n }\n\n if (groupId) {\n const groupsNode = this._row.root.child('groups');\n const groupIndex = groupsNode.findIndex(\n (g) => g.child('id').value === groupId,\n );\n if (groupIndex < 0) {\n return;\n }\n const groupNode = groupsNode.at(groupIndex);\n if (!groupNode) {\n return;\n }\n groupNode\n .child('conditions')\n .pushValue(this._newConditionData(firstField));\n } else {\n this._row.root\n .child('conditions')\n .pushValue(this._newConditionData(firstField));\n }\n }\n\n addConditionForField(field: string): void {\n const col = this._getAvailableFields().find((c) => c.field === field);\n if (!col) {\n return;\n }\n\n const conditionData = this._newConditionData(col);\n this._row.root.child('conditions').pushValue(conditionData);\n }\n\n updateCondition(\n id: string,\n updates: Partial<\n Pick<\n FilterConditionVM,\n 'field' | 'operator' | 'value' | 'searchLanguage' | 'searchType'\n >\n >,\n ): void {\n const condNode = this._findConditionNode(id);\n if (!condNode) {\n return;\n }\n\n if (\n updates.field !== undefined &&\n updates.field !== condNode.child('field').value\n ) {\n this._applyFieldUpdate(condNode, updates.field);\n } else if (\n updates.operator !== undefined &&\n updates.operator !== condNode.child('operator').value\n ) {\n this._applyOperatorUpdate(condNode, updates.operator);\n } else if (updates.value !== undefined) {\n condNode.child('value').setValue(updates.value);\n } else if (updates.searchLanguage !== undefined) {\n condNode.child('searchLanguage').setValue(updates.searchLanguage);\n } else if (updates.searchType !== undefined) {\n condNode.child('searchType').setValue(updates.searchType);\n }\n }\n\n removeCondition(id: string): void {\n const result = this._findConditionLocation(id);\n if (result) {\n result.conditionsNode.removeAt(result.index);\n }\n }\n\n addGroup(): void {\n const groupData = {\n id: this._generateGroupId(),\n logic: 'and',\n conditions: [],\n };\n this._row.root.child('groups').pushValue(groupData);\n }\n\n removeGroup(id: string): void {\n const groupsNode = this._row.root.child('groups');\n const idx = groupsNode.findIndex((g) => g.child('id').value === id);\n if (idx >= 0) {\n groupsNode.removeAt(idx);\n }\n }\n\n setGroupLogic(id: string, logic: 'and' | 'or'): void {\n if (this._row.root.child('id').value === id) {\n this._row.root.child('logic').setValue(logic);\n return;\n }\n const groupsNode = this._row.root.child('groups');\n const idx = groupsNode.findIndex((g) => g.child('id').value === id);\n if (idx >= 0) {\n groupsNode.at(idx)?.child('logic').setValue(logic);\n }\n }\n\n countConditions(): number {\n let count = this._row.root.child('conditions').length;\n const groups = this._row.root.child('groups');\n for (let i = 0; i < groups.length; i++) {\n const group = groups.at(i);\n if (group) {\n count += group.child('conditions').length;\n }\n }\n return count;\n }\n\n isEmpty(): boolean {\n const conditionsNode = this._row.root.child('conditions');\n const groupsNode = this._row.root.child('groups');\n return conditionsNode.length === 0 && groupsNode.length === 0;\n }\n\n hasConditionForField(field: string): boolean {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n if (rootConditions.at(i)?.child('field').value === field) {\n return true;\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n if (groupConditions.at(ci)?.child('field').value === field) {\n return true;\n }\n }\n }\n }\n return false;\n }\n\n removeEmptyGroups(): void {\n const groupsNode = this._row.root.child('groups');\n for (let i = groupsNode.length - 1; i >= 0; i--) {\n const group = groupsNode.at(i);\n if (group?.child('conditions').length === 0) {\n groupsNode.removeAt(i);\n }\n }\n }\n\n private _applyFieldUpdate(\n condNode: NonNullable<ReturnType<FilterTreeOps['_findConditionNode']>>,\n field: string,\n ): void {\n const col = this._getAvailableFields().find((c) => c.field === field);\n if (!col) {\n return;\n }\n const oldFieldType = condNode.child('fieldType').value;\n condNode.child('field').setValue(col.field);\n condNode.child('fieldType').setValue(col.fieldType);\n if (col.fieldType !== oldFieldType) {\n condNode.child('operator').setValue(getDefaultOperator(col.fieldType));\n condNode.child('value').setValue('');\n condNode.child('searchLanguage').setValue('');\n condNode.child('searchType').setValue('');\n }\n }\n\n private _applyOperatorUpdate(\n condNode: NonNullable<ReturnType<FilterTreeOps['_findConditionNode']>>,\n operator: FilterOperator,\n ): void {\n condNode.child('operator').setValue(operator);\n condNode.child('value').setValue('');\n if (operator === FilterOperator.Search) {\n condNode.child('searchLanguage').setValue(SearchLanguage.Simple);\n condNode.child('searchType').setValue(SearchType.Plain);\n } else {\n condNode.child('searchLanguage').setValue('');\n condNode.child('searchType').setValue('');\n }\n }\n\n private _newConditionData(col: ColumnSpec) {\n return {\n id: this._generateConditionId(),\n field: col.field,\n fieldType: col.fieldType,\n operator: getDefaultOperator(col.fieldType),\n value: '',\n searchLanguage: '',\n searchType: '',\n };\n }\n\n private _generateConditionId(): string {\n const node = this._row.root.child('nextConditionId');\n const current = node.value;\n node.setValue(current + 1);\n return `c-${current}`;\n }\n\n private _generateGroupId(): string {\n const node = this._row.root.child('nextGroupId');\n const current = node.value;\n node.setValue(current + 1);\n return `g-${current}`;\n }\n\n _findConditionNode(id: string) {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n const item = rootConditions.at(i);\n if (item?.child('id').value === id) {\n return item;\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n const item = groupConditions.at(ci);\n if (item?.child('id').value === id) {\n return item;\n }\n }\n }\n }\n return null;\n }\n\n private _findConditionLocation(id: string) {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n const item = rootConditions.at(i);\n if (item?.child('id').value === id) {\n return { conditionsNode: rootConditions, index: i };\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n const item = groupConditions.at(ci);\n if (item?.child('id').value === id) {\n return { conditionsNode: groupConditions, index: ci };\n }\n }\n }\n }\n return null;\n }\n}\n","import type { FilterCondition, FilterGroup } from '../types.js';\n\nexport function findConditionInGroup(\n group: FilterGroup,\n id: string,\n): { condition: FilterCondition; parent: FilterGroup } | null {\n for (const condition of group.conditions) {\n if (condition.id === id) {\n return { condition, parent: group };\n }\n }\n for (const subGroup of group.groups) {\n const found = findConditionInGroup(subGroup, id);\n if (found) {\n return found;\n }\n }\n return null;\n}\n\nexport function findGroupInTree(\n group: FilterGroup,\n id: string,\n): FilterGroup | null {\n if (group.id === id) {\n return group;\n }\n for (const subGroup of group.groups) {\n const found = findGroupInTree(subGroup, id);\n if (found) {\n return found;\n }\n }\n return null;\n}\n\nexport function removeGroupFromTree(parent: FilterGroup, id: string): boolean {\n const index = parent.groups.findIndex((g) => g.id === id);\n if (index !== -1) {\n parent.groups.splice(index, 1);\n return true;\n }\n for (const subGroup of parent.groups) {\n if (removeGroupFromTree(subGroup, id)) {\n return true;\n }\n }\n return false;\n}\n\nexport function countConditions(group: FilterGroup): number {\n let count = group.conditions.length;\n for (const subGroup of group.groups) {\n count += countConditions(subGroup);\n }\n return count;\n}\n\nexport function syncNextIds(group: FilterGroup): {\n nextConditionId: number;\n nextGroupId: number;\n} {\n const extractNum = (id: string, prefix: string): number => {\n if (id.startsWith(prefix)) {\n const num = Number(id.slice(prefix.length));\n if (!Number.isNaN(num)) {\n return num;\n }\n }\n return 0;\n };\n\n let maxCondition = 0;\n let maxGroup = 0;\n\n const walk = (g: FilterGroup): void => {\n maxGroup = Math.max(maxGroup, extractNum(g.id, 'g-'));\n for (const c of g.conditions) {\n maxCondition = Math.max(maxCondition, extractNum(c.id, 'c-'));\n }\n for (const sub of g.groups) {\n walk(sub);\n }\n };\n\n walk(group);\n return { nextConditionId: maxCondition + 1, nextGroupId: maxGroup + 1 };\n}\n","import { stripDataFieldPrefix } from '../../../TableEditor/model/SchemaContext.js';\nimport { FilterFieldType } from '../../../shared/field-types.js';\nimport { SYSTEM_FIELD_IDS } from '../../../shared/system-field-ids.js';\nimport { operatorRequiresValue, FilterOperator } from './operators.js';\nimport type { FilterCondition, FilterGroup } from '../types.js';\n\nfunction parseValue(\n value: string,\n fieldType: FilterFieldType,\n): string | number {\n if (fieldType === FilterFieldType.Number) {\n const num = Number(value);\n if (!Number.isNaN(num)) {\n return num;\n }\n }\n return value;\n}\n\nfunction buildOperatorClause(\n operator: FilterOperator,\n value: string,\n fieldType: FilterFieldType,\n): Record<string, unknown> {\n const parsed = parseValue(value, fieldType);\n\n switch (operator) {\n case FilterOperator.Equals:\n return { equals: parsed };\n case FilterOperator.NotEquals:\n return { not: { equals: parsed } };\n case FilterOperator.Contains:\n return { string_contains: value };\n case FilterOperator.NotContains:\n return { not: { string_contains: value } };\n case FilterOperator.StartsWith:\n return { string_starts_with: value };\n case FilterOperator.EndsWith:\n return { string_ends_with: value };\n case FilterOperator.Gt:\n return { gt: parsed };\n case FilterOperator.Gte:\n return { gte: parsed };\n case FilterOperator.Lt:\n return { lt: parsed };\n case FilterOperator.Lte:\n return { lte: parsed };\n case FilterOperator.IsEmpty:\n return { equals: null };\n case FilterOperator.IsNotEmpty:\n return { not: { equals: null } };\n case FilterOperator.IsTrue:\n return { equals: true };\n case FilterOperator.IsFalse:\n return { equals: false };\n case FilterOperator.Search:\n return { search: value };\n }\n}\n\nfunction buildConditionClause(\n condition: FilterCondition,\n): Record<string, unknown> | null {\n if (operatorRequiresValue(condition.operator) && condition.value === '') {\n return null;\n }\n\n if (condition.operator === FilterOperator.Search) {\n if (SYSTEM_FIELD_IDS.has(condition.field)) {\n return {\n [condition.field]: {\n search: condition.value,\n searchLanguage: condition.searchLanguage || 'simple',\n searchType: condition.searchType || 'plain',\n },\n };\n }\n const path = stripDataFieldPrefix(condition.field);\n return {\n data: {\n path,\n search: condition.value,\n searchLanguage: condition.searchLanguage || 'simple',\n searchType: condition.searchType || 'plain',\n },\n };\n }\n\n const opClause = buildOperatorClause(\n condition.operator,\n condition.value,\n condition.fieldType,\n );\n\n if (SYSTEM_FIELD_IDS.has(condition.field)) {\n return { [condition.field]: opClause };\n }\n\n const path = stripDataFieldPrefix(condition.field);\n return {\n data: {\n path,\n ...opClause,\n },\n };\n}\n\nexport function buildWhereClause(\n group: FilterGroup,\n): Record<string, unknown> | null {\n const clauses: Record<string, unknown>[] = [];\n\n for (const condition of group.conditions) {\n const clause = buildConditionClause(condition);\n if (clause) {\n clauses.push(clause);\n }\n }\n\n for (const subGroup of group.groups) {\n const subClause = buildWhereClause(subGroup);\n if (subClause) {\n clauses.push(subClause);\n }\n }\n\n if (clauses.length === 0) {\n return null;\n }\n\n if (clauses.length === 1) {\n const first = clauses[0];\n if (first) {\n return first;\n }\n return null;\n }\n\n const key = group.logic === 'or' ? 'OR' : 'AND';\n return { [key]: clauses };\n}\n","import type { createRowModel } from '@revisium/schema-toolkit';\nimport type { FILTER_SCHEMA, FilterData } from '../filterSchema.js';\nimport { syncNextIds } from '../utils/filterTreeUtils.js';\nimport { buildWhereClause } from '../utils/filterBuilder.js';\nimport type { FilterGroup } from '../types.js';\n\ntype FilterRowModel = ReturnType<typeof createRowModel<typeof FILTER_SCHEMA>>;\n\nexport class FilterSerializer {\n constructor(private readonly _row: FilterRowModel) {}\n\n serializeRootGroup(): FilterGroup {\n const plain = this._row.root.getPlainValue() as FilterData;\n return {\n id: plain.id,\n logic: plain.logic as 'and' | 'or',\n conditions: plain.conditions.map((c) => ({\n id: c.id,\n field: c.field,\n fieldType: c.fieldType as FilterGroup['conditions'][0]['fieldType'],\n operator: c.operator as FilterGroup['conditions'][0]['operator'],\n value: c.value,\n searchLanguage: c.searchLanguage || undefined,\n searchType: c.searchType || undefined,\n })),\n groups: plain.groups.map((g) => ({\n id: g.id,\n logic: g.logic as 'and' | 'or',\n conditions: g.conditions.map((c) => ({\n id: c.id,\n field: c.field,\n fieldType: c.fieldType as FilterGroup['conditions'][0]['fieldType'],\n operator: c.operator as FilterGroup['conditions'][0]['operator'],\n value: c.value,\n searchLanguage: c.searchLanguage || undefined,\n searchType: c.searchType || undefined,\n })),\n groups: [],\n })),\n };\n }\n\n buildCurrentWhereClause(): Record<string, unknown> | null {\n return buildWhereClause(this.serializeRootGroup());\n }\n\n applySnapshot(serialized: string): boolean {\n const parsed = JSON.parse(serialized) as FilterGroup;\n const ids = syncNextIds(parsed);\n const data = this._groupToData(\n parsed,\n ids.nextConditionId,\n ids.nextGroupId,\n );\n this._row.reset(data);\n return parsed.conditions.length > 0 || parsed.groups.length > 0;\n }\n\n private _conditionToData(c: {\n id: string;\n field: string;\n fieldType: string;\n operator: string;\n value: string;\n searchLanguage?: string;\n searchType?: string;\n }) {\n return {\n id: c.id,\n field: c.field,\n fieldType: c.fieldType,\n operator: c.operator,\n value: c.value,\n searchLanguage: c.searchLanguage ?? '',\n searchType: c.searchType ?? '',\n };\n }\n\n private _groupToData(\n group: FilterGroup,\n nextConditionId: number,\n nextGroupId: number,\n ): FilterData {\n return {\n id: group.id,\n logic: group.logic,\n conditions: group.conditions.map((c) => this._conditionToData(c)),\n groups: group.groups.map((g) => ({\n id: g.id,\n logic: g.logic,\n conditions: g.conditions.map((c) => this._conditionToData(c)),\n })),\n nextConditionId,\n nextGroupId,\n };\n }\n}\n","import { FilterFieldType } from '../../../shared/field-types.js';\nimport { operatorRequiresValue } from './operators.js';\nimport type { FilterCondition, FilterGroup } from '../types.js';\n\nexport function isConditionValueValid(condition: FilterCondition): boolean {\n if (!operatorRequiresValue(condition.operator)) {\n return true;\n }\n if (condition.value === '') {\n return false;\n }\n if (condition.fieldType === FilterFieldType.Number) {\n return !Number.isNaN(Number(condition.value));\n }\n if (condition.fieldType === FilterFieldType.DateTime) {\n return !Number.isNaN(new Date(condition.value).getTime());\n }\n return true;\n}\n\nexport function validateGroup(group: FilterGroup): boolean {\n for (const condition of group.conditions) {\n if (!isConditionValueValid(condition)) {\n return false;\n }\n }\n for (const subGroup of group.groups) {\n if (!validateGroup(subGroup)) {\n return false;\n }\n }\n return true;\n}\n\nexport function getConditionErrorMessage(\n condition: FilterCondition,\n): string | null {\n if (!operatorRequiresValue(condition.operator)) {\n return null;\n }\n\n if (condition.value === '') {\n return 'Value is required';\n }\n\n if (condition.fieldType === FilterFieldType.Number) {\n if (Number.isNaN(Number(condition.value))) {\n return 'Value must be a number';\n }\n }\n\n if (condition.fieldType === FilterFieldType.DateTime) {\n if (Number.isNaN(new Date(condition.value).getTime())) {\n return 'Value must be a valid date';\n }\n }\n\n return null;\n}\n","import type { createRowModel } from '@revisium/schema-toolkit';\nimport type { FILTER_SCHEMA } from '../filterSchema.js';\nimport { FilterConditionVM } from '../vm/FilterConditionVM.js';\nimport {\n isConditionValueValid,\n getConditionErrorMessage,\n} from '../utils/filterValidation.js';\n\ntype FilterRowModel = ReturnType<typeof createRowModel<typeof FILTER_SCHEMA>>;\n\nexport class FilterValidator {\n constructor(private readonly _row: FilterRowModel) {}\n\n get allValid(): boolean {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n const item = rootConditions.at(i);\n if (item && !isConditionValueValid(new FilterConditionVM(item))) {\n return false;\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n const item = groupConditions.at(ci);\n if (item && !isConditionValueValid(new FilterConditionVM(item))) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n isConditionValid(id: string): boolean {\n const condNode = this._findConditionNode(id);\n if (!condNode) {\n return false;\n }\n return isConditionValueValid(new FilterConditionVM(condNode));\n }\n\n getConditionError(id: string): string | null {\n const condNode = this._findConditionNode(id);\n if (!condNode) {\n return null;\n }\n return getConditionErrorMessage(new FilterConditionVM(condNode));\n }\n\n private _findConditionNode(id: string) {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n const item = rootConditions.at(i);\n if (item?.child('id').value === id) {\n return item;\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n const item = groupConditions.at(ci);\n if (item?.child('id').value === id) {\n return item;\n }\n }\n }\n }\n return null;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport { createRowModel } from '@revisium/schema-toolkit';\nimport { ensureReactivityProvider } from '../../../../lib/initReactivity.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { FilterConditionVM } from '../vm/FilterConditionVM.js';\nimport { FilterGroupVM } from '../vm/FilterGroupVM.js';\nimport { FILTER_SCHEMA, type FilterData } from '../filterSchema.js';\nimport type { FilterGroup } from '../types.js';\nimport { FilterTreeOps } from './FilterTreeOps.js';\nimport { FilterSerializer } from './FilterSerializer.js';\nimport { FilterValidator } from './FilterValidator.js';\n\ntype FilterRowModel = ReturnType<typeof createRowModel<typeof FILTER_SCHEMA>>;\n\nexport class FilterCore {\n private readonly _row: FilterRowModel;\n private readonly _treeOps: FilterTreeOps;\n private readonly _serializer: FilterSerializer;\n private readonly _validator: FilterValidator;\n\n private _availableFields: ColumnSpec[] = [];\n private _onChange: (() => void) | null = null;\n private _onApply: ((where: Record<string, unknown> | null) => void) | null =\n null;\n private _isOpen = false;\n private _committedHasFilters = false;\n\n constructor() {\n ensureReactivityProvider();\n\n const emptyData = FilterCore._emptyFilterData();\n this._row = createRowModel<typeof FILTER_SCHEMA>({\n rowId: 'filter',\n schema: FILTER_SCHEMA,\n data: emptyData,\n });\n\n this._treeOps = new FilterTreeOps(this._row, () => this._availableFields);\n this._serializer = new FilterSerializer(this._row);\n this._validator = new FilterValidator(this._row);\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n private static _emptyFilterData(): FilterData {\n return {\n id: 'g-1',\n logic: 'and',\n conditions: [],\n groups: [],\n nextConditionId: 1,\n nextGroupId: 2,\n };\n }\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n setOpen(value: boolean): void {\n this._isOpen = value;\n }\n\n get rootGroup(): FilterGroupVM {\n return new FilterGroupVM(this._row.root, true);\n }\n\n get hasPendingChanges(): boolean {\n return this._row.isDirty;\n }\n\n get totalConditionCount(): number {\n return this._treeOps.countConditions();\n }\n\n get hasActiveFilters(): boolean {\n return this._committedHasFilters;\n }\n\n get allFiltersValid(): boolean {\n return this._validator.allValid;\n }\n\n get isEmpty(): boolean {\n return this._treeOps.isEmpty();\n }\n\n hasFilterForField(field: string): boolean {\n if (!this._committedHasFilters) {\n return false;\n }\n return this._treeOps.hasConditionForField(field);\n }\n\n get showBadge(): boolean {\n return this.totalConditionCount > 0 || this.hasActiveFilters;\n }\n\n buildCurrentWhereClause(): Record<string, unknown> | null {\n return this._serializer.buildCurrentWhereClause();\n }\n\n init(availableFields: ColumnSpec[]): void {\n this._availableFields = availableFields;\n this._row.reset(FilterCore._emptyFilterData());\n this._committedHasFilters = false;\n }\n\n addCondition(groupId?: string): void {\n this._treeOps.addCondition(groupId);\n this._notifyChange();\n }\n\n addConditionForField(field: string): void {\n this._treeOps.addConditionForField(field);\n this._notifyChange();\n }\n\n updateCondition(\n id: string,\n updates: Partial<\n Pick<\n FilterConditionVM,\n 'field' | 'operator' | 'value' | 'searchLanguage' | 'searchType'\n >\n >,\n ): void {\n this._treeOps.updateCondition(id, updates);\n this._notifyChange();\n }\n\n removeCondition(id: string): void {\n this._treeOps.removeCondition(id);\n this._notifyChange();\n }\n\n addGroup(): void {\n this._treeOps.addGroup();\n this._notifyChange();\n }\n\n removeGroup(id: string): void {\n this._treeOps.removeGroup(id);\n this._notifyChange();\n }\n\n setGroupLogic(id: string, logic: 'and' | 'or'): void {\n this._treeOps.setGroupLogic(id, logic);\n this._notifyChange();\n }\n\n apply(): void {\n this._treeOps.removeEmptyGroups();\n this._row.commit();\n this._committedHasFilters = !this.isEmpty;\n this._fireOnApply();\n this._notifyChange();\n }\n\n applyAndClose(): void {\n this.apply();\n this.setOpen(false);\n }\n\n reset(): void {\n this._row.revert();\n this._notifyChange();\n }\n\n applySnapshot(serialized: string): void {\n let parsed: FilterGroup;\n try {\n parsed = JSON.parse(serialized) as FilterGroup;\n } catch {\n return;\n }\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n !Array.isArray(parsed.conditions) ||\n !Array.isArray(parsed.groups)\n ) {\n return;\n }\n const validFields = new Set(this._availableFields.map((f) => f.field));\n const cleaned = FilterCore._stripInvalidConditions(parsed, validFields);\n const hasFilters = this._serializer.applySnapshot(JSON.stringify(cleaned));\n this._committedHasFilters = hasFilters;\n this._notifyChange();\n }\n\n private static _stripInvalidConditions(\n group: FilterGroup,\n validFields: Set<string>,\n ): FilterGroup {\n return {\n ...group,\n conditions: group.conditions.filter((c) => validFields.has(c.field)),\n groups: group.groups\n .map((g) => FilterCore._stripInvalidConditions(g, validFields))\n .filter((g) => g.conditions.length > 0 || g.groups.length > 0),\n };\n }\n\n clearAll(): void {\n this._row.reset(FilterCore._emptyFilterData());\n this._committedHasFilters = false;\n this._fireOnApply();\n this._notifyChange();\n }\n\n clearAllAndClose(): void {\n this.clearAll();\n this.setOpen(false);\n }\n\n isConditionValid(id: string): boolean {\n return this._validator.isConditionValid(id);\n }\n\n getConditionError(id: string): string | null {\n return this._validator.getConditionError(id);\n }\n\n serializeRootGroup(): FilterGroup {\n return this._serializer.serializeRootGroup();\n }\n\n setOnChange(cb: (() => void) | null): void {\n this._onChange = cb;\n }\n\n setOnApply(\n cb: ((where: Record<string, unknown> | null) => void) | null,\n ): void {\n this._onApply = cb;\n }\n\n dispose(): void {\n this._onChange = null;\n this._onApply = null;\n this._row.dispose();\n }\n\n private _fireOnApply(): void {\n if (this._onApply) {\n const where = this._serializer.buildCurrentWhereClause();\n this._onApply(where);\n }\n }\n\n private _notifyChange(): void {\n if (this._onChange) {\n this._onChange();\n }\n }\n}\n","import type { ReactNode } from 'react';\nimport { PiCalendar, PiFile } from 'react-icons/pi';\nimport { FilterFieldType } from '../../../shared/field-types.js';\n\nexport const getFieldTypeIcon = (fieldType: FilterFieldType): ReactNode => {\n switch (fieldType) {\n case FilterFieldType.String:\n return 'Aa';\n case FilterFieldType.Number:\n return '#';\n case FilterFieldType.Boolean:\n return '?';\n case FilterFieldType.ForeignKey:\n return '->';\n case FilterFieldType.File:\n return <PiFile size={14} />;\n case FilterFieldType.DateTime:\n return <PiCalendar size={14} />;\n default: {\n const _exhaustiveCheck: never = fieldType;\n return _exhaustiveCheck;\n }\n }\n};\n","import { Box, Menu, Text } from '@chakra-ui/react';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { getFieldTypeIcon } from '../../../Table/ui/Header/getFieldTypeIcon.js';\n\ninterface FieldMenuItemsProps {\n items: ColumnSpec[];\n selectedField: string;\n onChange: (field: string) => void;\n}\n\nexport const FieldMenuItems = ({\n items,\n selectedField,\n onChange,\n}: FieldMenuItemsProps) => (\n <>\n {items.map((f) => (\n <Menu.Item\n key={f.field}\n value={f.field}\n onClick={() => onChange(f.field)}\n bg={f.field === selectedField ? 'gray.100' : undefined}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2} width=\"100%\">\n <Box\n fontSize=\"sm\"\n fontFamily=\"mono\"\n color=\"gray.400\"\n width=\"24px\"\n textAlign=\"center\"\n >\n {getFieldTypeIcon(f.fieldType)}\n </Box>\n <Text truncate>{f.label || '(unnamed)'}</Text>\n </Box>\n </Menu.Item>\n ))}\n </>\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { FilterFieldType } from '../../../shared/field-types.js';\nimport { getFieldTypeIcon } from '../../../Table/ui/Header/getFieldTypeIcon.js';\nimport { FieldMenuItems } from './FieldMenuItems.js';\n\ninterface FieldSelectProps {\n value: string;\n fieldType: FilterFieldType;\n fields: ColumnSpec[];\n onChange: (field: string) => void;\n}\n\nexport const FieldSelect = observer(\n ({ value, fieldType, fields, onChange }: FieldSelectProps) => {\n const currentLabel = fields.find((f) => f.field === value)?.label || value;\n const dataFields = fields.filter((f) => !f.isSystem);\n const systemFields = fields.filter((f) => f.isSystem);\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={4}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"100px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"field-select\"\n >\n <Box fontSize=\"sm\" fontFamily=\"mono\" color=\"gray.400\" minW=\"16px\">\n {getFieldTypeIcon(fieldType)}\n </Box>\n <Text fontSize=\"md\" fontWeight=\"medium\" truncate maxW=\"120px\">\n {currentLabel}\n </Text>\n <Box ml=\"auto\" color=\"gray.400\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content maxH=\"300px\" overflow=\"auto\" minW=\"180px\">\n {dataFields.length > 0 && (\n <Menu.ItemGroup>\n <Menu.ItemGroupLabel\n fontWeight=\"medium\"\n color=\"gray.500\"\n fontSize=\"xs\"\n >\n Data fields\n </Menu.ItemGroupLabel>\n <FieldMenuItems\n items={dataFields}\n selectedField={value}\n onChange={onChange}\n />\n </Menu.ItemGroup>\n )}\n {systemFields.length > 0 && (\n <>\n {dataFields.length > 0 && <Menu.Separator />}\n <Menu.ItemGroup>\n <Menu.ItemGroupLabel\n fontWeight=\"medium\"\n color=\"gray.500\"\n fontSize=\"xs\"\n >\n System fields\n </Menu.ItemGroupLabel>\n <FieldMenuItems\n items={systemFields}\n selectedField={value}\n onChange={onChange}\n />\n </Menu.ItemGroup>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport type { FilterOperator } from '../../model/operators.js';\nimport {\n getOperatorLabel,\n getOperatorsForType,\n} from '../../model/operators.js';\nimport type { FilterFieldType } from '../../../shared/field-types.js';\n\ninterface OperatorSelectProps {\n value: FilterOperator;\n fieldType: FilterFieldType;\n onChange: (operator: FilterOperator) => void;\n}\n\nexport const OperatorSelect = observer(\n ({ value, fieldType, onChange }: OperatorSelectProps) => {\n const operators = getOperatorsForType(fieldType);\n const currentLabel = getOperatorLabel(value, fieldType);\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={4}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"80px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"operator-select\"\n >\n <Text fontSize=\"md\" fontWeight=\"medium\" truncate>\n {currentLabel}\n </Text>\n <Box color=\"gray.400\" ml=\"auto\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content minW=\"120px\">\n {operators.map((op) => (\n <Menu.Item\n key={op.operator}\n value={op.operator}\n onClick={() => onChange(op.operator)}\n bg={op.operator === value ? 'gray.100' : undefined}\n >\n {op.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Input } from '@chakra-ui/react';\nimport { FilterFieldType } from '../../../shared/field-types.js';\n\ninterface FilterValueInputProps {\n value: string;\n fieldType: FilterFieldType;\n onChange: (value: string) => void;\n error?: string | null;\n}\n\nfunction toDateTimeLocalValue(isoString: string): string {\n if (!isoString) {\n return '';\n }\n const date = new Date(isoString);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return `${year}-${month}-${day}T${hours}:${minutes}`;\n}\n\nfunction fromDateTimeLocalValue(localValue: string): string {\n if (!localValue) {\n return '';\n }\n const date = new Date(localValue);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n return date.toISOString();\n}\n\nexport const FilterValueInput = observer(\n ({ value, fieldType, onChange, error }: FilterValueInputProps) => {\n if (fieldType === FilterFieldType.DateTime) {\n return (\n <Input\n type=\"datetime-local\"\n value={toDateTimeLocalValue(value)}\n onChange={(e) => onChange(fromDateTimeLocalValue(e.target.value))}\n size=\"sm\"\n w=\"160px\"\n h=\"40px\"\n borderRadius=\"lg\"\n borderColor={error ? 'red.500' : 'gray.200'}\n data-testid=\"filter-value-input\"\n />\n );\n }\n\n return (\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"value\"\n size=\"sm\"\n w=\"160px\"\n h=\"40px\"\n borderRadius=\"lg\"\n borderColor={error ? 'red.500' : 'gray.200'}\n data-testid=\"filter-value-input\"\n />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport {\n SEARCH_LANGUAGES,\n type SearchLanguage,\n} from '../../model/searchTypes.js';\n\ninterface SearchLanguageSelectProps {\n value: SearchLanguage;\n onChange: (value: SearchLanguage) => void;\n}\n\nexport const SearchLanguageSelect = observer(\n ({ value, onChange }: SearchLanguageSelectProps) => {\n const currentLabel =\n SEARCH_LANGUAGES.find((l) => l.value === value)?.label ?? value;\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={3}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"80px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"search-language-select\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" truncate>\n {currentLabel}\n </Text>\n <Box color=\"gray.400\" ml=\"auto\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content maxH=\"300px\" overflow=\"auto\" minW=\"180px\">\n {SEARCH_LANGUAGES.map((lang) => (\n <Menu.Item\n key={lang.value}\n value={lang.value}\n onClick={() => onChange(lang.value)}\n bg={lang.value === value ? 'gray.100' : undefined}\n >\n {lang.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport { SEARCH_TYPES, type SearchType } from '../../model/searchTypes.js';\n\ninterface SearchTypeSelectProps {\n value: SearchType;\n onChange: (value: SearchType) => void;\n}\n\nexport const SearchTypeSelect = observer(\n ({ value, onChange }: SearchTypeSelectProps) => {\n const currentLabel =\n SEARCH_TYPES.find((t) => t.value === value)?.label ?? value;\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={3}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"80px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"search-type-select\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" truncate>\n {currentLabel}\n </Text>\n <Box color=\"gray.400\" ml=\"auto\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content minW=\"160px\">\n {SEARCH_TYPES.map((st) => (\n <Menu.Item\n key={st.value}\n value={st.value}\n onClick={() => onChange(st.value)}\n bg={st.value === value ? 'gray.100' : undefined}\n >\n {st.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, IconButton } from '@chakra-ui/react';\nimport { LuX } from 'react-icons/lu';\nimport type { FilterModel } from '../../model/FilterModel.js';\nimport type { FilterConditionVM } from '../../model/FilterConditionVM.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport {\n FilterOperator,\n operatorRequiresValue,\n} from '../../model/operators.js';\nimport { FieldSelect } from '../FieldSelect/FieldSelect.js';\nimport { OperatorSelect } from '../OperatorSelect/OperatorSelect.js';\nimport { FilterValueInput } from '../FilterValueInput/FilterValueInput.js';\nimport { SearchLanguageSelect } from '../SearchLanguageSelect/SearchLanguageSelect.js';\nimport { SearchTypeSelect } from '../SearchTypeSelect/SearchTypeSelect.js';\n\ninterface FilterConditionViewProps {\n model: FilterModel;\n condition: FilterConditionVM;\n availableFields: ColumnSpec[];\n}\n\nexport const FilterConditionView = observer(\n ({ model, condition, availableFields }: FilterConditionViewProps) => {\n const isSearch = condition.operator === FilterOperator.Search;\n\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={2}\n minH=\"40px\"\n flexWrap=\"wrap\"\n data-testid=\"filter-condition\"\n >\n <FieldSelect\n value={condition.field}\n fieldType={condition.fieldType}\n fields={availableFields}\n onChange={(field) => model.updateCondition(condition.id, { field })}\n />\n <OperatorSelect\n value={condition.operator}\n fieldType={condition.fieldType}\n onChange={(operator) =>\n model.updateCondition(condition.id, { operator })\n }\n />\n {operatorRequiresValue(condition.operator) && (\n <FilterValueInput\n value={condition.value}\n fieldType={condition.fieldType}\n onChange={(value) => model.updateCondition(condition.id, { value })}\n error={model.getConditionError(condition.id)}\n />\n )}\n {isSearch && (\n <>\n <SearchLanguageSelect\n value={condition.searchLanguage}\n onChange={(searchLanguage) =>\n model.updateCondition(condition.id, { searchLanguage })\n }\n />\n <SearchTypeSelect\n value={condition.searchType}\n onChange={(searchType) =>\n model.updateCondition(condition.id, { searchType })\n }\n />\n </>\n )}\n <IconButton\n aria-label=\"Remove condition\"\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n color=\"gray.400\"\n _hover={{ bg: 'gray.100', color: 'gray.600' }}\n onClick={() => model.removeCondition(condition.id)}\n data-testid=\"remove-condition\"\n >\n <LuX size={20} />\n </IconButton>\n </Box>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu } from '@chakra-ui/react';\nimport { LuChevronDown } from 'react-icons/lu';\n\ninterface LogicDropdownProps {\n logic: 'and' | 'or';\n onChange: (logic: 'and' | 'or') => void;\n}\n\nexport const LogicDropdown = observer(\n ({ logic, onChange }: LogicDropdownProps) => (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n gap={1}\n px={3}\n h=\"32px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n fontSize=\"sm\"\n cursor=\"pointer\"\n color=\"black\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"logic-select\"\n >\n {logic === 'and' ? 'All' : 'Any'}\n <LuChevronDown size={14} />\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content>\n <Menu.Item\n value=\"and\"\n onClick={() => onChange('and')}\n data-testid=\"logic-and\"\n >\n All\n </Menu.Item>\n <Menu.Item\n value=\"or\"\n onClick={() => onChange('or')}\n data-testid=\"logic-or\"\n >\n Any\n </Menu.Item>\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n ),\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Button, Text, VStack } from '@chakra-ui/react';\nimport { LuPlus } from 'react-icons/lu';\nimport type { FilterModel } from '../../model/FilterModel.js';\nimport type { FilterGroupVM } from '../../model/FilterGroupVM.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { FilterConditionView } from '../FilterConditionView/FilterConditionView.js';\nimport { LogicDropdown } from './LogicDropdown.js';\n\ninterface FilterGroupViewProps {\n model: FilterModel;\n group: FilterGroupVM;\n availableFields: ColumnSpec[];\n isRoot?: boolean;\n}\n\nexport const FilterGroupView = observer(\n ({ model, group, availableFields, isRoot = false }: FilterGroupViewProps) => {\n if (isRoot) {\n return (\n <VStack gap={3} alignItems=\"stretch\">\n <Box display=\"flex\" alignItems=\"center\" gap={1.5}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n Where\n </Text>\n <LogicDropdown\n logic={group.logic}\n onChange={(logic) => model.setGroupLogic(group.id, logic)}\n />\n <Text fontSize=\"sm\" color=\"gray.500\">\n of the following are true\n </Text>\n </Box>\n\n {group.conditions.length > 0 && (\n <VStack gap={2} alignItems=\"stretch\">\n {group.conditions.map((c) => (\n <FilterConditionView\n key={c.id}\n model={model}\n condition={c}\n availableFields={availableFields}\n />\n ))}\n </VStack>\n )}\n\n {group.groups.map((g) => (\n <FilterGroupView\n key={g.id}\n model={model}\n group={g}\n availableFields={availableFields}\n isRoot={false}\n />\n ))}\n </VStack>\n );\n }\n\n return (\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n bg=\"rgba(204,204,204,0.1)\"\n p={4}\n borderRadius=\"xl\"\n data-testid=\"filter-group\"\n >\n <VStack gap={3} alignItems=\"stretch\">\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Box display=\"flex\" alignItems=\"center\" gap={1.5}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n Match\n </Text>\n <LogicDropdown\n logic={group.logic}\n onChange={(logic) => model.setGroupLogic(group.id, logic)}\n />\n <Text fontSize=\"sm\" color=\"gray.500\">\n of the following\n </Text>\n </Box>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n fontWeight=\"medium\"\n color=\"red.500\"\n onClick={() => model.removeGroup(group.id)}\n data-testid=\"remove-group\"\n >\n Remove group\n </Button>\n </Box>\n\n {group.conditions.length > 0 && (\n <VStack gap={2} alignItems=\"stretch\">\n {group.conditions.map((c) => (\n <FilterConditionView\n key={c.id}\n model={model}\n condition={c}\n availableFields={availableFields}\n />\n ))}\n </VStack>\n )}\n\n <Box h=\"1px\" bg=\"gray.200\" />\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"gray.500\"\n alignSelf=\"flex-start\"\n onClick={() => model.addCondition(group.id)}\n data-testid=\"add-condition\"\n >\n <LuPlus size={14} />\n <Text ml={1}>Add condition</Text>\n </Button>\n </VStack>\n </Box>\n );\n },\n);\n","import { FC, useCallback, useMemo, useState } from 'react';\nimport { Box, IconButton, Popover, Portal } from '@chakra-ui/react';\nimport { githubLight } from '@uiw/codemirror-theme-github';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { json } from '@codemirror/lang-json';\nimport { LuCode } from 'react-icons/lu';\nimport { Tooltip } from '../../../components/Tooltip/Tooltip.js';\nimport { CopyButton } from '../../../components/CopyButton/CopyButton.js';\n\ninterface CopyJsonPopoverProps {\n data: object;\n tooltipContent?: string;\n testId?: string;\n}\n\nexport const CopyJsonPopover: FC<CopyJsonPopoverProps> = ({\n data,\n tooltipContent = 'Copy JSON',\n testId,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const text = useMemo(() => JSON.stringify(data, null, 2), [data]);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n // clipboard write can fail in non-secure contexts or without permissions\n }\n }, [text]);\n\n return (\n <Popover.Root\n open={isOpen}\n onOpenChange={(e) => setIsOpen(e.open)}\n lazyMount\n unmountOnExit\n modal={false}\n >\n <Tooltip\n content={tooltipContent}\n positioning={{ placement: 'top' }}\n disabled={isOpen}\n >\n <Popover.Trigger asChild>\n <IconButton\n aria-label={tooltipContent}\n size=\"xs\"\n variant=\"ghost\"\n colorPalette=\"gray\"\n color=\"gray.400\"\n data-testid={testId}\n >\n <LuCode size={14} />\n </IconButton>\n </Popover.Trigger>\n </Tooltip>\n <Portal>\n <Popover.Positioner>\n <Popover.Content\n minW=\"350px\"\n maxW=\"500px\"\n p={0}\n borderRadius=\"md\"\n boxShadow=\"lg\"\n >\n <Box\n position=\"relative\"\n borderWidth={1}\n borderColor=\"gray.100\"\n borderRadius=\"md\"\n bg=\"white\"\n >\n <Box p={2}>\n <CodeMirror\n value={text}\n extensions={[EditorView.lineWrapping, json()]}\n editable={false}\n theme={githubLight}\n maxWidth=\"100%\"\n maxHeight=\"300px\"\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n }}\n />\n </Box>\n <CopyButton\n dataTestId={testId ? `${testId}-copy` : undefined}\n aria-label=\"Copy\"\n position=\"absolute\"\n top=\"8px\"\n right=\"8px\"\n size=\"xs\"\n onClick={handleCopy}\n />\n </Box>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import { observer } from 'mobx-react-lite';\nimport {\n Box,\n Button,\n IconButton,\n Popover,\n Portal,\n Text,\n} from '@chakra-ui/react';\nimport { LuFilter, LuPlus } from 'react-icons/lu';\nimport type { FilterModel } from '../../model/FilterModel.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { FilterGroupView } from '../FilterGroupView/FilterGroupView.js';\nimport { CopyJsonPopover } from '../../../shared/CopyJsonPopover/index.js';\n\ninterface FilterWidgetProps {\n model: FilterModel;\n availableFields: ColumnSpec[];\n}\n\nexport const FilterWidget = observer(\n ({ model, availableFields }: FilterWidgetProps) => {\n return (\n <Popover.Root\n open={model.isOpen}\n onOpenChange={(e) => model.setOpen(e.open)}\n lazyMount\n unmountOnExit\n >\n <Popover.Trigger asChild>\n <Box position=\"relative\" display=\"inline-flex\">\n <IconButton\n aria-label=\"Filters\"\n variant=\"ghost\"\n size=\"xs\"\n color=\"gray.400\"\n data-testid=\"filter-trigger\"\n >\n <LuFilter />\n </IconButton>\n {model.showBadge && (\n <Box\n position=\"absolute\"\n top=\"-1\"\n right=\"-1\"\n borderRadius=\"full\"\n width=\"16px\"\n height=\"16px\"\n fontSize=\"xs\"\n bg={model.hasPendingChanges ? 'red.500' : 'gray.500'}\n color=\"white\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n lineHeight=\"1\"\n data-testid=\"filter-badge\"\n >\n {model.totalConditionCount}\n </Box>\n )}\n </Box>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content p={4} w=\"732px\" borderRadius=\"xl\">\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n mb={3}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2}>\n <Box color=\"gray.500\">\n <LuFilter size={20} />\n </Box>\n <Text fontSize=\"xl\" fontWeight=\"medium\" color=\"gray.500\">\n Filters\n </Text>\n {model.totalConditionCount > 0 && (\n <Box bg=\"gray.100\" px={2} py={1} borderRadius=\"sm\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"black\">\n {model.totalConditionCount}\n </Text>\n </Box>\n )}\n {model.hasPendingChanges && (\n <Box bg=\"#fdedea\" px={2} py={1} borderRadius=\"sm\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"#be3e24\">\n Unsaved\n </Text>\n </Box>\n )}\n </Box>\n <Box display=\"flex\" gap={2} alignItems=\"center\">\n {!model.isEmpty && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"black\"\n onClick={model.clearAllAndClose}\n data-testid=\"clear-all\"\n >\n Clear all\n </Button>\n )}\n {!model.isEmpty && model.allFiltersValid && (\n <CopyJsonPopover\n data={model.buildCurrentWhereClause() ?? {}}\n tooltipContent=\"Copy filter JSON\"\n testId=\"filter-copy-json\"\n />\n )}\n <Button\n size=\"sm\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n onClick={model.applyAndClose}\n disabled={\n !model.allFiltersValid || !model.hasPendingChanges\n }\n color={\n model.hasPendingChanges && model.allFiltersValid\n ? 'black'\n : 'rgba(0,0,0,0.2)'\n }\n _hover={\n model.hasPendingChanges && model.allFiltersValid\n ? { bg: 'gray.200' }\n : undefined\n }\n _disabled={{\n opacity: 1,\n bg: 'gray.100',\n cursor: 'default',\n }}\n data-testid=\"apply-filters\"\n >\n Apply\n </Button>\n </Box>\n </Box>\n\n <Box h=\"1px\" bg=\"gray.200\" mb={3} />\n\n {!model.isEmpty && (\n <FilterGroupView\n model={model}\n group={model.rootGroup}\n availableFields={availableFields}\n isRoot={true}\n />\n )}\n\n <Box mt={model.isEmpty ? 0 : 2}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"gray.500\"\n onClick={() => model.addCondition()}\n data-testid=\"footer-add-condition\"\n >\n <LuPlus size={14} />\n <Text ml={1}>Add condition</Text>\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"gray.500\"\n onClick={() => model.addGroup()}\n data-testid=\"footer-add-group\"\n >\n <LuPlus size={14} />\n <Text ml={1}>Add group</Text>\n </Button>\n </Box>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n },\n);\n","import { makeAutoObservable } from 'mobx';\nimport { Debounce } from '../../../lib/Debounce.js';\n\nexport class SearchModel {\n private _query = '';\n private _debouncedQuery = '';\n private readonly _debounce: Debounce;\n private readonly _onSearch: (query: string) => void;\n\n constructor(onSearch: (query: string) => void, delay: number = 300) {\n this._onSearch = onSearch;\n this._debounce = new Debounce(delay);\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get query(): string {\n return this._query;\n }\n\n get debouncedQuery(): string {\n return this._debouncedQuery;\n }\n\n get hasActiveSearch(): boolean {\n return this._debouncedQuery.length > 0;\n }\n\n setQuery(value: string): void {\n this._query = value;\n this._debounce.schedule(() => {\n this._debouncedQuery = value;\n this._onSearch(value);\n });\n }\n\n clear(): void {\n this._query = '';\n this._debouncedQuery = '';\n this._debounce.dispose();\n this._onSearch('');\n }\n\n dispose(): void {\n this._debounce.dispose();\n }\n}\n","import { useRef, useState } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Box, IconButton, Input } from '@chakra-ui/react';\nimport { PiMagnifyingGlass, PiXBold } from 'react-icons/pi';\nimport type { SearchModel } from '../model/index.js';\n\nconst HEIGHT = '24px';\n\ninterface SearchWidgetProps {\n model: SearchModel;\n}\n\nexport const SearchWidget = observer(({ model }: SearchWidgetProps) => {\n const [expanded, setExpanded] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const isOpen = expanded || model.query !== '';\n\n const handleBlur = () => {\n if (model.query === '') {\n setExpanded(false);\n }\n };\n\n const handleExpand = () => {\n setExpanded(true);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n };\n\n if (!isOpen) {\n return (\n <IconButton\n aria-label=\"Search\"\n variant=\"ghost\"\n size=\"xs\"\n color=\"gray.400\"\n onClick={handleExpand}\n data-testid=\"search-trigger\"\n >\n <PiMagnifyingGlass />\n </IconButton>\n );\n }\n\n return (\n <Box position=\"relative\" width=\"280px\" height={HEIGHT}>\n <Box\n position=\"absolute\"\n left=\"4px\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n color=\"gray.400\"\n zIndex={1}\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiMagnifyingGlass />\n </Box>\n <Input\n ref={inputRef}\n value={model.query}\n onChange={(e) => model.setQuery(e.target.value)}\n onBlur={handleBlur}\n placeholder=\"Search...\"\n variant=\"flushed\"\n height={HEIGHT}\n fontSize=\"sm\"\n pl=\"24px\"\n autoFocus\n data-testid=\"search-input\"\n />\n {model.query !== '' && (\n <IconButton\n aria-label=\"Clear\"\n variant=\"ghost\"\n size=\"2xs\"\n position=\"absolute\"\n right=\"0\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n onClick={() => model.clear()}\n color=\"gray.400\"\n _hover={{ color: 'black' }}\n >\n <PiXBold />\n </IconButton>\n )}\n </Box>\n );\n});\n","import { arr, obj, str } from '@revisium/schema-toolkit';\n\nexport const SORT_SCHEMA = arr(\n obj({\n field: str(),\n direction: str(),\n }),\n);\n","import { makeAutoObservable } from 'mobx';\nimport { createRowModel } from '@revisium/schema-toolkit';\nimport { ensureReactivityProvider } from '../../../lib/initReactivity.js';\nimport type { ColumnSpec } from '../../Columns/model/types.js';\nimport { SORT_SCHEMA } from './sortSchema.js';\nimport type { SortEntry, ViewSort } from './types.js';\n\ntype SortRowModel = ReturnType<typeof createRowModel<typeof SORT_SCHEMA>>;\ntype SortRootNode = SortRowModel['root'];\ntype SortItemValue = ReturnType<SortRootNode['getPlainValue']>[number];\n\nexport class SortModel {\n private readonly _row: SortRowModel;\n private _availableFields: ColumnSpec[] = [];\n private _isOpen = false;\n private _onChange: (() => void) | null = null;\n private _onApply:\n | ((sorts: ReturnType<SortModel['serializeToViewSorts']>) => void)\n | null = null;\n\n constructor() {\n ensureReactivityProvider();\n this._row = createRowModel({\n rowId: 'sort',\n schema: SORT_SCHEMA,\n data: [],\n });\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n private get _rootNode(): SortRootNode {\n return this._row.root;\n }\n\n get sorts(): SortEntry[] {\n return this._row.getPlainValue() as SortEntry[];\n }\n\n get hasSorts(): boolean {\n return this._rootNode.length > 0;\n }\n\n get sortCount(): number {\n return this._rootNode.length;\n }\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n get hasPendingChanges(): boolean {\n return this._row.isDirty;\n }\n\n setOpen(value: boolean): void {\n this._isOpen = value;\n }\n\n get availableFields(): ColumnSpec[] {\n const used = new Set(this.sorts.map((s) => s.field));\n return this._availableFields.filter((col) => !used.has(col.field));\n }\n\n private get _fieldLookup(): Map<string, ColumnSpec> {\n return new Map(this._availableFields.map((col) => [col.field, col]));\n }\n\n private _findIndex(field: string): number {\n return this._rootNode.findIndex(\n (node) => node.child('field').value === field,\n );\n }\n\n private _setItemChild(\n index: number,\n childName: 'field' | 'direction',\n value: string,\n ): void {\n const itemNode = this._rootNode.at(index);\n if (itemNode) {\n itemNode.child(childName).setValue(value);\n }\n }\n\n init(availableFields: ColumnSpec[]): void {\n this._availableFields = availableFields;\n this._row.reset([]);\n }\n\n apply(): void {\n this._row.commit();\n this._fireOnApply();\n this._notifyChange();\n }\n\n applyAndClose(): void {\n this.apply();\n this.setOpen(false);\n }\n\n addSort(field: string, direction: 'asc' | 'desc' = 'asc'): void {\n if (this._findIndex(field) >= 0) {\n return;\n }\n this._rootNode.pushValue({ field, direction });\n }\n\n replaceField(oldField: string, newField: string): void {\n if (oldField === newField) {\n return;\n }\n const oldIndex = this._findIndex(oldField);\n if (oldIndex < 0) {\n return;\n }\n const dupIndex = this._findIndex(newField);\n if (dupIndex >= 0) {\n this._rootNode.removeAt(dupIndex);\n const adjustedIndex = dupIndex < oldIndex ? oldIndex - 1 : oldIndex;\n this._setItemChild(adjustedIndex, 'field', newField);\n } else {\n this._setItemChild(oldIndex, 'field', newField);\n }\n }\n\n getSortDirection(field: string): 'asc' | 'desc' | null {\n const sort = this.sorts.find((s) => s.field === field);\n return sort ? sort.direction : null;\n }\n\n getSortIndex(field: string): number | null {\n const index = this._findIndex(field);\n return index >= 0 ? index + 1 : null;\n }\n\n isSorted(field: string): boolean {\n return this._findIndex(field) >= 0;\n }\n\n setSingleSort(field: string, direction: 'asc' | 'desc'): void {\n const index = this._findIndex(field);\n if (index >= 0) {\n this._setItemChild(index, 'direction', direction);\n } else {\n this._rootNode.pushValue({ field, direction });\n }\n this.apply();\n }\n\n setDirection(field: string, direction: 'asc' | 'desc'): void {\n const index = this._findIndex(field);\n if (index >= 0) {\n this._setItemChild(index, 'direction', direction);\n }\n }\n\n removeSort(field: string): void {\n const index = this._findIndex(field);\n if (index >= 0) {\n this._rootNode.removeAt(index);\n }\n }\n\n toggleDirection(field: string): void {\n const index = this._findIndex(field);\n if (index >= 0) {\n const current = this.sorts[index]?.direction;\n this._setItemChild(\n index,\n 'direction',\n current === 'asc' ? 'desc' : 'asc',\n );\n }\n }\n\n reorderSorts(fields: string[]): void {\n const plainSorts = this._rootNode.getPlainValue();\n const lookup = new Map(plainSorts.map((s) => [s.field, s]));\n const reordered: SortItemValue[] = [];\n for (const field of fields) {\n const entry = lookup.get(field);\n if (entry) {\n reordered.push(entry);\n }\n }\n this._rootNode.setValue(reordered);\n }\n\n clearAll(): void {\n this._rootNode.clear();\n this._row.commit();\n this._fireOnApply();\n this._notifyChange();\n }\n\n clearAllAndClose(): void {\n this.clearAll();\n this.setOpen(false);\n }\n\n addFirstAvailableSort(): void {\n const firstAvailable = this.availableFields[0];\n if (firstAvailable) {\n this.addSort(firstAvailable.field);\n }\n }\n\n serializeToViewSorts(): ViewSort[] {\n return this.sorts.map((sort) => ({\n field: sort.field,\n direction: sort.direction,\n }));\n }\n\n applyViewSorts(viewSorts: ViewSort[]): void {\n const lookup = this._fieldLookup;\n const sorts: SortItemValue[] = [];\n\n for (const vs of viewSorts) {\n const direction = vs.direction === 'desc' ? 'desc' : 'asc';\n if (lookup.has(vs.field)) {\n sorts.push({ field: vs.field, direction });\n }\n }\n\n this._rootNode.setValue(sorts);\n this._row.commit();\n this._notifyChange();\n }\n\n setOnChange(cb: (() => void) | null): void {\n this._onChange = cb;\n }\n\n setOnApply(\n cb: ((sorts: ReturnType<SortModel['serializeToViewSorts']>) => void) | null,\n ): void {\n this._onApply = cb;\n }\n\n dispose(): void {\n this._onChange = null;\n this._onApply = null;\n this._row.dispose();\n }\n\n private _fireOnApply(): void {\n if (this._onApply) {\n this._onApply(this.serializeToViewSorts());\n }\n }\n\n private _notifyChange(): void {\n if (this._onChange) {\n this._onChange();\n }\n }\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { getFieldTypeIcon } from '../../../Table/ui/Header/getFieldTypeIcon.js';\n\ninterface SortFieldSelectProps {\n currentField: string;\n availableFields: ColumnSpec[];\n onChange: (field: string) => void;\n}\n\nexport const SortFieldSelect = observer(\n ({ currentField, availableFields, onChange }: SortFieldSelectProps) => {\n const currentCol = availableFields.find((f) => f.field === currentField);\n const currentLabel = currentCol?.label || currentField;\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={4}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"100px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"sort-field-select\"\n >\n {currentCol && (\n <Box fontSize=\"sm\" fontFamily=\"mono\" color=\"gray.400\" minW=\"16px\">\n {getFieldTypeIcon(currentCol.fieldType)}\n </Box>\n )}\n <Text fontSize=\"md\" fontWeight=\"medium\" truncate maxW=\"120px\">\n {currentLabel}\n </Text>\n <Box ml=\"auto\" color=\"gray.400\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content maxH=\"300px\" overflow=\"auto\" minW=\"180px\">\n {availableFields.map((field) => (\n <Menu.Item\n key={field.field}\n value={field.field}\n onClick={() => onChange(field.field)}\n bg={field.field === currentField ? 'gray.100' : undefined}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2} width=\"100%\">\n <Box\n fontSize=\"sm\"\n fontFamily=\"mono\"\n color=\"gray.400\"\n width=\"24px\"\n textAlign=\"center\"\n >\n {getFieldTypeIcon(field.fieldType)}\n </Box>\n <Text truncate>{field.label || '(unnamed)'}</Text>\n </Box>\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport type { IconType } from 'react-icons';\nimport {\n PiArrowDownLight,\n PiArrowUpLight,\n PiCaretDownLight,\n} from 'react-icons/pi';\n\ninterface SortDirectionSelectProps {\n selectedDirection: 'asc' | 'desc';\n onSelect: (direction: 'asc' | 'desc') => void;\n}\n\nconst directions: {\n value: 'asc' | 'desc';\n label: string;\n icon: IconType;\n}[] = [\n { value: 'asc', label: 'A—Z', icon: PiArrowUpLight },\n { value: 'desc', label: 'Z—A', icon: PiArrowDownLight },\n];\n\nexport const SortDirectionSelect = observer(\n ({ selectedDirection, onSelect }: SortDirectionSelectProps) => {\n const ascDirection = directions[0] as (typeof directions)[number];\n const selected =\n directions.find((d) => d.value === selectedDirection) ?? ascDirection;\n const Icon = selected.icon;\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={4}\n h=\"40px\"\n borderRadius=\"lg\"\n bg=\"gray.100\"\n cursor=\"pointer\"\n minW=\"80px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"sort-direction-select\"\n >\n <Icon size={18} />\n <Text fontSize=\"md\" fontWeight=\"medium\">\n {selected.label}\n </Text>\n <Box color=\"gray.400\" ml=\"auto\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content minW=\"120px\">\n {directions.map((dir) => {\n const DirIcon = dir.icon;\n return (\n <Menu.Item\n key={dir.value}\n value={dir.value}\n onClick={() => onSelect(dir.value)}\n bg={selectedDirection === dir.value ? 'gray.100' : undefined}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2}>\n <DirIcon size={18} />\n <Text fontWeight=\"medium\">{dir.label}</Text>\n </Box>\n </Menu.Item>\n );\n })}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, IconButton, Text } from '@chakra-ui/react';\nimport { LuX } from 'react-icons/lu';\nimport type { SortEntry } from '../../model/types.js';\nimport type { SortModel } from '../../model/SortModel.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { SortFieldSelect } from '../SortFieldSelect/SortFieldSelect.js';\nimport { SortDirectionSelect } from '../SortDirectionSelect/SortDirectionSelect.js';\n\ninterface SortRowProps {\n sort: SortEntry;\n index: number;\n model: SortModel;\n availableFields: ColumnSpec[];\n}\n\nexport const SortRow = observer(\n ({ sort, index, model, availableFields }: SortRowProps) => {\n const handleFieldChange = (newField: string) => {\n model.replaceField(sort.field, newField);\n };\n\n const handleDirectionChange = (direction: 'asc' | 'desc') => {\n model.setDirection(sort.field, direction);\n };\n\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={2}\n h=\"40px\"\n data-testid=\"sort-row\"\n >\n <Text fontSize=\"md\" color=\"gray.400\" minW=\"20px\">\n {index + 1}.\n </Text>\n <SortFieldSelect\n currentField={sort.field}\n availableFields={availableFields}\n onChange={handleFieldChange}\n />\n <SortDirectionSelect\n selectedDirection={sort.direction}\n onSelect={handleDirectionChange}\n />\n <IconButton\n aria-label=\"Remove sort\"\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n color=\"gray.400\"\n _hover={{ bg: 'gray.100', color: 'gray.600' }}\n onClick={() => model.removeSort(sort.field)}\n data-testid=\"remove-sort\"\n >\n <LuX size={20} />\n </IconButton>\n </Box>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport {\n Box,\n Button,\n IconButton,\n Popover,\n Portal,\n Text,\n} from '@chakra-ui/react';\nimport { LuArrowUpDown, LuPlus } from 'react-icons/lu';\nimport type { SortModel } from '../../model/SortModel.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { SortRow } from '../SortRow/SortRow.js';\nimport { CopyJsonPopover } from '../../../shared/CopyJsonPopover/index.js';\n\ninterface SortingsWidgetProps {\n model: SortModel;\n availableFields: ColumnSpec[];\n onChange: (sorts: ReturnType<SortModel['serializeToViewSorts']>) => void;\n}\n\nexport const SortingsWidget = observer(\n ({ model, availableFields, onChange }: SortingsWidgetProps) => {\n const handleApply = () => {\n model.applyAndClose();\n onChange(model.serializeToViewSorts());\n };\n\n const handleClearAll = () => {\n model.clearAllAndClose();\n onChange(model.serializeToViewSorts());\n };\n\n return (\n <Popover.Root\n open={model.isOpen}\n onOpenChange={(e) => model.setOpen(e.open)}\n lazyMount\n unmountOnExit\n >\n <Popover.Trigger asChild>\n <Box position=\"relative\" display=\"inline-flex\">\n <IconButton\n aria-label=\"Sort\"\n variant=\"ghost\"\n size=\"xs\"\n color=\"gray.400\"\n data-testid=\"sort-trigger\"\n >\n <LuArrowUpDown />\n </IconButton>\n {(model.hasSorts || model.hasPendingChanges) && (\n <Box\n position=\"absolute\"\n top=\"-1\"\n right=\"-1\"\n borderRadius=\"full\"\n width=\"16px\"\n height=\"16px\"\n fontSize=\"xs\"\n bg={model.hasPendingChanges ? 'red.500' : 'gray.500'}\n color=\"white\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n lineHeight=\"1\"\n data-testid=\"sort-badge\"\n >\n {model.sortCount}\n </Box>\n )}\n </Box>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content p={4} minW=\"450px\" borderRadius=\"xl\">\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n mb={model.hasSorts ? 3 : 0}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2}>\n <Box color=\"gray.500\">\n <LuArrowUpDown size={20} />\n </Box>\n <Text fontSize=\"xl\" fontWeight=\"medium\" color=\"gray.500\">\n Sort\n </Text>\n {model.sortCount > 0 && (\n <Box bg=\"gray.100\" px={2} py={1} borderRadius=\"sm\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"black\">\n {model.sortCount}\n </Text>\n </Box>\n )}\n {model.hasPendingChanges && (\n <Box bg=\"#fdedea\" px={2} py={1} borderRadius=\"sm\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"#be3e24\">\n Unsaved\n </Text>\n </Box>\n )}\n </Box>\n <Box display=\"flex\" gap={2} alignItems=\"center\">\n {model.hasSorts && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"black\"\n onClick={handleClearAll}\n data-testid=\"clear-all-sorts\"\n >\n Clear all\n </Button>\n )}\n {model.hasSorts && (\n <CopyJsonPopover\n data={model.serializeToViewSorts()}\n tooltipContent=\"Copy sort JSON\"\n testId=\"sort-copy-json\"\n />\n )}\n <Button\n size=\"sm\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n onClick={handleApply}\n disabled={!model.hasPendingChanges}\n color={\n model.hasPendingChanges ? 'black' : 'rgba(0,0,0,0.2)'\n }\n _hover={\n model.hasPendingChanges ? { bg: 'gray.200' } : undefined\n }\n _disabled={{\n opacity: 1,\n bg: 'gray.100',\n cursor: 'default',\n }}\n data-testid=\"apply-sorts\"\n >\n Apply\n </Button>\n </Box>\n </Box>\n\n {model.hasSorts && (\n <>\n <Box h=\"1px\" bg=\"gray.200\" mb={3} />\n <Box display=\"flex\" flexDirection=\"column\" gap={2}>\n {model.sorts.map((sort, index) => (\n <SortRow\n key={sort.field}\n sort={sort}\n index={index}\n model={model}\n availableFields={availableFields}\n />\n ))}\n </Box>\n </>\n )}\n\n {model.availableFields.length > 0 && (\n <Box mt={model.hasSorts ? 2 : 0}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"gray.500\"\n onClick={model.addFirstAvailableSort}\n data-testid=\"add-sort\"\n >\n <LuPlus size={14} />\n <Text ml={1}>Add sort</Text>\n </Button>\n </Box>\n )}\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n },\n);\n","import { makeAutoObservable, observable } from 'mobx';\n\nexport class SelectionModel {\n private readonly _selected = observable.map<string, boolean>();\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get isSelectionMode(): boolean {\n return this._selected.size > 0;\n }\n\n get selectedCount(): number {\n return this._selected.size;\n }\n\n get selectedIds(): string[] {\n return Array.from(this._selected.keys());\n }\n\n isSelected(rowId: string): boolean {\n return this._selected.get(rowId) === true;\n }\n\n deselect(rowId: string): void {\n this._selected.delete(rowId);\n }\n\n toggle(rowId: string): void {\n if (this._selected.has(rowId)) {\n this._selected.delete(rowId);\n } else {\n this._selected.set(rowId, true);\n }\n }\n\n selectAll(rowIds: string[]): void {\n for (const id of rowIds) {\n this._selected.set(id, true);\n }\n }\n\n deselectAll(): void {\n this._selected.clear();\n }\n\n enterSelectionMode(rowId?: string): void {\n if (rowId) {\n this._selected.set(rowId, true);\n }\n }\n\n isAllSelected(allRowIds: string[]): boolean {\n if (allRowIds.length === 0) {\n return false;\n }\n return allRowIds.every((id) => this._selected.has(id));\n }\n\n exitSelectionMode(): void {\n this._selected.clear();\n }\n}\n","import type { TransitionConfig, ResolvedTransition } from './types';\n\nexport function resolveTransition<TState extends string, TContext>(\n config: TransitionConfig<TState, TContext>,\n context: TContext,\n): ResolvedTransition<TState, TContext> | null {\n if (typeof config === 'string') {\n return { target: config };\n }\n\n if (typeof config === 'function') {\n const result = config(context);\n return {\n target: result.target,\n context: result.context,\n };\n }\n\n if (config.guard && !config.guard(context)) {\n return null;\n }\n\n return {\n target: config.target,\n action: config.action,\n };\n}\n","import { makeAutoObservable, observable } from 'mobx';\n\nimport type { ObservableFSMConfig, TransitionMap } from './types';\nimport { resolveTransition } from './resolveTransition';\n\nexport class ObservableFSM<\n TState extends string,\n TEvent extends string,\n TContext extends object,\n> {\n private _state: TState;\n private _context: TContext;\n private readonly _transitions: TransitionMap<TState, TEvent, TContext>;\n private readonly _onTransition?: (\n from: TState,\n to: TState,\n event: TEvent,\n ) => void;\n private readonly _onUnhandledEvent?: (state: TState, event: TEvent) => void;\n\n constructor(config: ObservableFSMConfig<TState, TEvent, TContext>) {\n this._state = config.initial;\n this._context = observable.object({ ...config.context }, undefined, {\n deep: false,\n });\n this._transitions = config.transitions;\n this._onTransition = config.onTransition;\n this._onUnhandledEvent = config.onUnhandledEvent;\n\n makeAutoObservable<this, '_context'>(\n this,\n { _context: false },\n { autoBind: true },\n );\n }\n\n get state(): TState {\n return this._state;\n }\n\n get context(): TContext {\n return this._context;\n }\n\n dispatch(event: TEvent): void {\n const config = this._transitions[this._state]?.[event];\n\n if (config === undefined) {\n this._onUnhandledEvent?.(this._state, event);\n return;\n }\n\n const resolved = resolveTransition(config, this._context);\n\n if (!resolved) {\n return;\n }\n\n const from = this._state;\n this._state = resolved.target;\n\n if (resolved.context) {\n Object.assign(this._context, resolved.context);\n }\n\n resolved.action?.(this._context);\n this._onTransition?.(from, resolved.target, event);\n }\n\n matches(state: TState): boolean {\n return this._state === state;\n }\n\n dispose(): void {\n // intentionally empty — reserved for future cleanup\n }\n}\n","import type {\n ObservableFSMConfig,\n TransitionFn,\n} from '../../../lib/fsm/index.js';\n\nexport interface CellAddress {\n rowId: string;\n field: string;\n}\n\nexport type EditTrigger =\n | { type: 'doubleClick'; clickOffset?: number }\n | { type: 'enter' }\n | { type: 'char'; char: string };\n\nexport interface SelectedRange {\n startCol: number;\n endCol: number;\n startRow: number;\n endRow: number;\n}\n\nexport interface SelectionEdges {\n top: boolean;\n bottom: boolean;\n left: boolean;\n right: boolean;\n}\n\nexport type CellState = 'idle' | 'focused' | 'editing';\n\nexport type CellEvent =\n | 'FOCUS'\n | 'BLUR'\n | 'DOUBLE_CLICK'\n | 'ENTER'\n | 'TYPE_CHAR'\n | 'COMMIT'\n | 'COMMIT_MOVE_DOWN'\n | 'CANCEL'\n | 'MOVE_UP'\n | 'MOVE_DOWN'\n | 'MOVE_LEFT'\n | 'MOVE_RIGHT'\n | 'TAB'\n | 'SELECT_TO'\n | 'SHIFT_MOVE_UP'\n | 'SHIFT_MOVE_DOWN'\n | 'SHIFT_MOVE_LEFT'\n | 'SHIFT_MOVE_RIGHT'\n | 'DRAG_START'\n | 'DRAG_EXTEND';\n\nexport interface CellFSMContext {\n focusedCell: CellAddress | null;\n anchorCell: CellAddress | null;\n editTrigger: EditTrigger | null;\n columns: string[];\n rowIds: string[];\n navigationVersion: number;\n _pendingCell: CellAddress | null;\n _pendingTrigger: EditTrigger | null;\n _pendingShift: boolean;\n}\n\nfunction moveFocused(\n colDelta: number,\n rowDelta: number,\n): TransitionFn<CellState, CellFSMContext> {\n return (ctx) => {\n const next = moveCell(ctx, colDelta, rowDelta);\n if (next) {\n return {\n target: 'focused',\n context: { focusedCell: next, anchorCell: null },\n };\n }\n return { target: 'focused', context: { anchorCell: null } };\n };\n}\n\nfunction shiftMoveFocused(\n colDelta: number,\n rowDelta: number,\n): TransitionFn<CellState, CellFSMContext> {\n return (ctx) => {\n const anchor = ctx.anchorCell ?? ctx.focusedCell;\n const next = moveCell(ctx, colDelta, rowDelta);\n if (next) {\n return {\n target: 'focused',\n context: { focusedCell: next, anchorCell: anchor },\n };\n }\n return { target: 'focused', context: { anchorCell: anchor } };\n };\n}\n\nfunction tabFocused(): TransitionFn<CellState, CellFSMContext> {\n return (ctx) => {\n const next = resolveTabTarget(ctx, ctx._pendingShift ? -1 : 1);\n if (next) {\n return {\n target: 'focused',\n context: { focusedCell: next, anchorCell: null },\n };\n }\n return { target: 'focused', context: { anchorCell: null } };\n };\n}\n\nfunction moveCell(\n ctx: CellFSMContext,\n colDelta: number,\n rowDelta: number,\n): CellAddress | null {\n const pos = currentPosition(ctx);\n if (!pos) {\n return null;\n }\n return cellAt(ctx, pos.colIndex + colDelta, pos.rowIndex + rowDelta);\n}\n\nfunction resolveTabTarget(\n ctx: CellFSMContext,\n delta: number,\n): CellAddress | null {\n const pos = currentPosition(ctx);\n if (!pos) {\n return null;\n }\n\n const nextCol = pos.colIndex + delta;\n const sameRow = cellAt(ctx, nextCol, pos.rowIndex);\n if (sameRow) {\n return sameRow;\n }\n\n const wrapCol = delta > 0 ? 0 : ctx.columns.length - 1;\n return cellAt(ctx, wrapCol, pos.rowIndex + delta);\n}\n\nfunction currentPosition(\n ctx: CellFSMContext,\n): { colIndex: number; rowIndex: number } | null {\n if (!ctx.focusedCell) {\n return null;\n }\n const colIndex = ctx.columns.indexOf(ctx.focusedCell.field);\n const rowIndex = ctx.rowIds.indexOf(ctx.focusedCell.rowId);\n if (colIndex === -1 || rowIndex === -1) {\n return null;\n }\n return { colIndex, rowIndex };\n}\n\nfunction cellAt(\n ctx: CellFSMContext,\n colIndex: number,\n rowIndex: number,\n): CellAddress | null {\n const field = ctx.columns[colIndex];\n const rowId = ctx.rowIds[rowIndex];\n if (field === undefined || rowId === undefined) {\n return null;\n }\n return { rowId, field };\n}\n\nexport function cellPosition(\n ctx: CellFSMContext,\n cell: CellAddress,\n): { colIndex: number; rowIndex: number } | null {\n const colIndex = ctx.columns.indexOf(cell.field);\n const rowIndex = ctx.rowIds.indexOf(cell.rowId);\n if (colIndex === -1 || rowIndex === -1) {\n return null;\n }\n return { colIndex, rowIndex };\n}\n\nexport function createConfig(): ObservableFSMConfig<\n CellState,\n CellEvent,\n CellFSMContext\n> {\n return {\n initial: 'idle',\n context: {\n focusedCell: null,\n anchorCell: null,\n editTrigger: null,\n columns: [],\n rowIds: [],\n navigationVersion: 0,\n _pendingCell: null,\n _pendingTrigger: null,\n _pendingShift: false,\n },\n transitions: {\n idle: {\n FOCUS: (ctx) => ({\n target: 'focused',\n context: {\n focusedCell: ctx._pendingCell,\n anchorCell: null,\n editTrigger: null,\n },\n }),\n DRAG_START: (ctx) => ({\n target: 'focused',\n context: {\n anchorCell: ctx._pendingCell,\n focusedCell: ctx._pendingCell,\n editTrigger: null,\n },\n }),\n },\n focused: {\n FOCUS: (ctx) => ({\n target: 'focused',\n context: {\n focusedCell: ctx._pendingCell,\n anchorCell: null,\n editTrigger: null,\n },\n }),\n BLUR: {\n target: 'idle',\n action: (ctx) => {\n ctx.focusedCell = null;\n ctx.anchorCell = null;\n ctx.editTrigger = null;\n },\n },\n DOUBLE_CLICK: (ctx) => ({\n target: 'editing',\n context: {\n anchorCell: null,\n editTrigger: ctx._pendingTrigger,\n },\n }),\n ENTER: {\n target: 'editing',\n action: (ctx) => {\n ctx.anchorCell = null;\n ctx.editTrigger = { type: 'enter' };\n },\n },\n TYPE_CHAR: (ctx) => ({\n target: 'editing',\n context: {\n anchorCell: null,\n editTrigger: ctx._pendingTrigger,\n },\n }),\n MOVE_UP: moveFocused(0, -1),\n MOVE_DOWN: moveFocused(0, 1),\n MOVE_LEFT: moveFocused(-1, 0),\n MOVE_RIGHT: moveFocused(1, 0),\n TAB: tabFocused(),\n SELECT_TO: (ctx) => ({\n target: 'focused',\n context: {\n anchorCell: ctx.anchorCell ?? ctx.focusedCell,\n focusedCell: ctx._pendingCell,\n },\n }),\n SHIFT_MOVE_UP: shiftMoveFocused(0, -1),\n SHIFT_MOVE_DOWN: shiftMoveFocused(0, 1),\n SHIFT_MOVE_LEFT: shiftMoveFocused(-1, 0),\n SHIFT_MOVE_RIGHT: shiftMoveFocused(1, 0),\n DRAG_START: (ctx) => ({\n target: 'focused',\n context: {\n anchorCell: ctx._pendingCell,\n focusedCell: ctx._pendingCell,\n },\n }),\n DRAG_EXTEND: (ctx) => ({\n target: 'focused',\n context: {\n focusedCell: ctx._pendingCell,\n },\n }),\n },\n editing: {\n FOCUS: (ctx) => ({\n target: 'focused',\n context: {\n focusedCell: ctx._pendingCell,\n anchorCell: null,\n editTrigger: null,\n },\n }),\n DRAG_START: (ctx) => ({\n target: 'focused',\n context: {\n anchorCell: ctx._pendingCell,\n focusedCell: ctx._pendingCell,\n editTrigger: null,\n },\n }),\n COMMIT: {\n target: 'focused',\n action: (ctx) => {\n ctx.anchorCell = null;\n ctx.editTrigger = null;\n },\n },\n COMMIT_MOVE_DOWN: (ctx) => {\n const next = moveCell(ctx, 0, 1);\n if (next) {\n return {\n target: 'editing',\n context: {\n focusedCell: next,\n anchorCell: null,\n editTrigger: { type: 'enter' as const },\n },\n };\n }\n return {\n target: 'focused',\n context: {\n anchorCell: null,\n editTrigger: null,\n },\n };\n },\n CANCEL: {\n target: 'focused',\n action: (ctx) => {\n ctx.anchorCell = null;\n ctx.editTrigger = null;\n },\n },\n BLUR: {\n target: 'idle',\n action: (ctx) => {\n ctx.focusedCell = null;\n ctx.anchorCell = null;\n ctx.editTrigger = null;\n },\n },\n },\n },\n };\n}\n","import { computed, makeAutoObservable } from 'mobx';\nimport { ObservableFSM } from '../../../lib/fsm/index.js';\nimport {\n createConfig,\n type CellAddress,\n type CellEvent,\n type CellFSMContext,\n type CellState,\n type EditTrigger,\n type SelectedRange,\n type SelectionEdges,\n} from './cellFSMConfig.js';\n\nexport type {\n CellAddress,\n CellState,\n EditTrigger,\n SelectedRange,\n SelectionEdges,\n} from './cellFSMConfig.js';\n\nconst READONLY_TOAST_THROTTLE_MS = 2000;\n\nfunction buildIndexMap(arr: string[]): Map<string, number> {\n const map = new Map<string, number>();\n arr.forEach((value, i) => {\n map.set(value, i);\n });\n return map;\n}\n\nfunction selectedRangeEquals(\n a: SelectedRange | null,\n b: SelectedRange | null,\n): boolean {\n if (a === b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n return (\n a.startCol === b.startCol &&\n a.endCol === b.endCol &&\n a.startRow === b.startRow &&\n a.endRow === b.endRow\n );\n}\n\nexport class CellFSM {\n private readonly _fsm: ObservableFSM<CellState, CellEvent, CellFSMContext>;\n private _onReadonlyEditAttempt: (() => void) | null = null;\n private _lastReadonlyToastAt = 0;\n private _columnIndexMap: Map<string, number> = new Map();\n private _rowIndexMap: Map<string, number> = new Map();\n\n constructor() {\n this._fsm = new ObservableFSM(createConfig());\n makeAutoObservable(\n this,\n {\n selectedRange: computed({ equals: selectedRangeEquals }),\n },\n { autoBind: true },\n );\n }\n\n setOnReadonlyEditAttempt(cb: (() => void) | null): void {\n this._onReadonlyEditAttempt = cb;\n }\n\n notifyReadonlyEditAttempt(): void {\n const now = Date.now();\n if (now - this._lastReadonlyToastAt < READONLY_TOAST_THROTTLE_MS) {\n return;\n }\n this._lastReadonlyToastAt = now;\n this._onReadonlyEditAttempt?.();\n }\n\n get state(): CellState {\n return this._fsm.state;\n }\n\n get focusedCell(): CellAddress | null {\n return this._fsm.context.focusedCell;\n }\n\n get anchorCell(): CellAddress | null {\n return this._fsm.context.anchorCell;\n }\n\n get editTrigger(): EditTrigger | null {\n return this._fsm.context.editTrigger;\n }\n\n get columns(): string[] {\n return this._fsm.context.columns;\n }\n\n get rowIds(): string[] {\n return this._fsm.context.rowIds;\n }\n\n get navigationVersion(): number {\n return this._fsm.context.navigationVersion;\n }\n\n get columnIndexMap(): Map<string, number> {\n return this._columnIndexMap;\n }\n\n get rowIndexMap(): Map<string, number> {\n return this._rowIndexMap;\n }\n\n get hasSelection(): boolean {\n return this.selectedRange !== null;\n }\n\n isCellFocused(rowId: string, field: string): boolean {\n const cell = this._fsm.context.focusedCell;\n if (!cell) {\n return false;\n }\n return cell.rowId === rowId && cell.field === field;\n }\n\n isCellAnchor(rowId: string, field: string): boolean {\n const cell = this._fsm.context.anchorCell;\n if (!cell) {\n return false;\n }\n return cell.rowId === rowId && cell.field === field;\n }\n\n isCellEditing(rowId: string, field: string): boolean {\n return this._fsm.matches('editing') && this.isCellFocused(rowId, field);\n }\n\n isCellInSelection(rowId: string, field: string): boolean {\n const range = this.selectedRange;\n if (!range) {\n return false;\n }\n const colIndex = this._columnIndexMap.get(field);\n const rowIndex = this._rowIndexMap.get(rowId);\n if (colIndex === undefined || rowIndex === undefined) {\n return false;\n }\n return (\n colIndex >= range.startCol &&\n colIndex <= range.endCol &&\n rowIndex >= range.startRow &&\n rowIndex <= range.endRow\n );\n }\n\n getCellSelectionEdges(rowId: string, field: string): SelectionEdges | null {\n const range = this.selectedRange;\n if (!range) {\n return null;\n }\n const colIndex = this._columnIndexMap.get(field);\n const rowIndex = this._rowIndexMap.get(rowId);\n if (colIndex === undefined || rowIndex === undefined) {\n return null;\n }\n if (\n colIndex < range.startCol ||\n colIndex > range.endCol ||\n rowIndex < range.startRow ||\n rowIndex > range.endRow\n ) {\n return null;\n }\n return {\n top: rowIndex === range.startRow,\n bottom: rowIndex === range.endRow,\n left: colIndex === range.startCol,\n right: colIndex === range.endCol,\n };\n }\n\n get selectedRange(): SelectedRange | null {\n const ctx = this._fsm.context;\n if (!ctx.anchorCell || !ctx.focusedCell) {\n return null;\n }\n if (\n ctx.anchorCell.rowId === ctx.focusedCell.rowId &&\n ctx.anchorCell.field === ctx.focusedCell.field\n ) {\n return null;\n }\n const anchorCol = this._columnIndexMap.get(ctx.anchorCell.field);\n const anchorRow = this._rowIndexMap.get(ctx.anchorCell.rowId);\n const focusCol = this._columnIndexMap.get(ctx.focusedCell.field);\n const focusRow = this._rowIndexMap.get(ctx.focusedCell.rowId);\n if (\n anchorCol === undefined ||\n anchorRow === undefined ||\n focusCol === undefined ||\n focusRow === undefined\n ) {\n return null;\n }\n return {\n startCol: Math.min(anchorCol, focusCol),\n endCol: Math.max(anchorCol, focusCol),\n startRow: Math.min(anchorRow, focusRow),\n endRow: Math.max(anchorRow, focusRow),\n };\n }\n\n getSelectedRange(): SelectedRange | null {\n return this.selectedRange;\n }\n\n setNavigationContext(columns: string[], rowIds: string[]): void {\n Object.assign(this._fsm.context, { columns, rowIds });\n this._columnIndexMap = buildIndexMap(columns);\n this._rowIndexMap = buildIndexMap(rowIds);\n }\n\n updateNavigationContext(columns: string[], rowIds: string[]): void {\n const ctx = this._fsm.context;\n const focused = ctx.focusedCell;\n\n ctx.columns = columns;\n ctx.rowIds = rowIds;\n ctx.navigationVersion++;\n this._columnIndexMap = buildIndexMap(columns);\n this._rowIndexMap = buildIndexMap(rowIds);\n\n if (!focused) {\n return;\n }\n\n const stillValid =\n this._columnIndexMap.has(focused.field) &&\n this._rowIndexMap.has(focused.rowId);\n\n if (stillValid) {\n ctx.anchorCell = null;\n } else {\n this.blur();\n }\n }\n\n focusCell(cell: CellAddress): void {\n this._fsm.context._pendingCell = cell;\n this._fsm.dispatch('FOCUS');\n }\n\n blur(): void {\n this._fsm.dispatch('BLUR');\n }\n\n doubleClick(clickOffset?: number): void {\n this._fsm.context._pendingTrigger = { type: 'doubleClick', clickOffset };\n this._fsm.dispatch('DOUBLE_CLICK');\n }\n\n enterEdit(): void {\n this._fsm.dispatch('ENTER');\n }\n\n typeChar(char: string): void {\n this._fsm.context._pendingTrigger = { type: 'char', char };\n this._fsm.dispatch('TYPE_CHAR');\n }\n\n commit(): void {\n this._fsm.dispatch('COMMIT');\n }\n\n commitAndMoveDown(): void {\n this._fsm.dispatch('COMMIT_MOVE_DOWN');\n }\n\n cancel(): void {\n this._fsm.dispatch('CANCEL');\n }\n\n moveUp(): void {\n this._fsm.dispatch('MOVE_UP');\n }\n\n moveDown(): void {\n this._fsm.dispatch('MOVE_DOWN');\n }\n\n moveLeft(): void {\n this._fsm.dispatch('MOVE_LEFT');\n }\n\n moveRight(): void {\n this._fsm.dispatch('MOVE_RIGHT');\n }\n\n handleTab(shift: boolean): void {\n this._fsm.context._pendingShift = shift;\n this._fsm.dispatch('TAB');\n }\n\n selectTo(cell: CellAddress): void {\n this._fsm.context._pendingCell = cell;\n this._fsm.dispatch('SELECT_TO');\n }\n\n shiftMoveUp(): void {\n this._fsm.dispatch('SHIFT_MOVE_UP');\n }\n\n shiftMoveDown(): void {\n this._fsm.dispatch('SHIFT_MOVE_DOWN');\n }\n\n shiftMoveLeft(): void {\n this._fsm.dispatch('SHIFT_MOVE_LEFT');\n }\n\n shiftMoveRight(): void {\n this._fsm.dispatch('SHIFT_MOVE_RIGHT');\n }\n\n dragStart(cell: CellAddress): void {\n this._fsm.context._pendingCell = cell;\n this._fsm.dispatch('DRAG_START');\n }\n\n dragExtend(cell: CellAddress): void {\n this._fsm.context._pendingCell = cell;\n this._fsm.dispatch('DRAG_EXTEND');\n }\n\n dispose(): void {\n this._fsm.dispose();\n }\n}\n","import { comparer, computed, makeAutoObservable } from 'mobx';\nimport type { RowModel } from '@revisium/schema-toolkit';\nimport type { ColumnSpec } from '../../Columns/model/types.js';\nimport { FilterFieldType } from '../../shared/field-types.js';\nimport type { CellFSM, EditTrigger, SelectionEdges } from './CellFSM.js';\n\nexport type CellCommitCallback = (\n rowId: string,\n field: string,\n value: unknown,\n previousValue?: unknown,\n) => void;\n\nexport class CellVM {\n private readonly _rowModel: RowModel;\n private readonly _column: ColumnSpec;\n private readonly _rowId: string;\n private readonly _cellFSM: CellFSM;\n private readonly _onCommit: CellCommitCallback | null;\n private readonly _systemValues: Record<string, unknown> | null;\n\n constructor(\n rowModel: RowModel,\n column: ColumnSpec,\n rowId: string,\n cellFSM: CellFSM,\n onCommit?: CellCommitCallback,\n systemValues?: Record<string, unknown>,\n ) {\n this._rowModel = rowModel;\n this._column = column;\n this._rowId = rowId;\n this._cellFSM = cellFSM;\n this._onCommit = onCommit ?? null;\n this._systemValues = systemValues ?? null;\n makeAutoObservable(\n this,\n {\n selectionEdges: computed({ equals: comparer.structural }),\n },\n { autoBind: true },\n );\n }\n\n // --- Data Getters ---\n\n get field(): string {\n return this._column.field;\n }\n\n get jsonPath(): string {\n return `${this._rowId}/${this._column.field}`;\n }\n\n get column(): ColumnSpec {\n return this._column;\n }\n\n get rowId(): string {\n return this._rowId;\n }\n\n get value(): unknown {\n if (this._systemValues) {\n return this._systemValues[this._column.field];\n }\n const node = this._getNode();\n if (!node) {\n return undefined;\n }\n return node.getPlainValue();\n }\n\n get displayValue(): string {\n const val = this.value;\n if (val === null || val === undefined) {\n return '';\n }\n if (typeof val === 'boolean') {\n return String(val);\n }\n if (typeof val === 'number') {\n return String(val);\n }\n if (typeof val === 'string') {\n return val;\n }\n if (Array.isArray(val)) {\n return `[${val.length}]`;\n }\n if (typeof val === 'object') {\n const obj = val as Record<string, unknown>;\n if (typeof obj.fileName === 'string' && obj.fileName) {\n return obj.fileName;\n }\n if (this._column.fieldType === FilterFieldType.File) {\n return '';\n }\n return '{...}';\n }\n return '';\n }\n\n get isReadOnly(): boolean {\n if (this._systemValues) {\n return true;\n }\n if (this._column.fieldType === FilterFieldType.File) {\n const fileNameNode = this._getFileNameNode();\n if (!fileNameNode?.isPrimitive()) {\n return true;\n }\n return fileNameNode.isReadOnly;\n }\n const node = this._getNode();\n if (!node) {\n return true;\n }\n if (node.isPrimitive()) {\n return node.isReadOnly;\n }\n return true;\n }\n\n get foreignKeyTableId(): string | undefined {\n return this._column.foreignKeyTableId;\n }\n\n get fileData(): {\n status: string;\n fileId: string;\n url: string;\n fileName: string;\n mimeType: string;\n width: number;\n height: number;\n } | null {\n if (this._column.fieldType !== FilterFieldType.File) {\n return null;\n }\n const val = this.value;\n if (!val || typeof val !== 'object' || Array.isArray(val)) {\n return null;\n }\n const obj = val as Record<string, unknown>;\n return {\n status: (obj.status as string) ?? '',\n fileId: (obj.fileId as string) ?? '',\n url: (obj.url as string) ?? '',\n fileName: (obj.fileName as string) ?? '',\n mimeType: (obj.mimeType as string) ?? '',\n width: typeof obj.width === 'number' ? obj.width : 0,\n height: typeof obj.height === 'number' ? obj.height : 0,\n };\n }\n\n get isEditable(): boolean {\n if (this._systemValues) {\n return false;\n }\n if (this.isReadOnly) {\n return false;\n }\n if (this._column.fieldType === FilterFieldType.File) {\n return this._getFileNameNode() !== undefined;\n }\n const node = this._getNode();\n if (!node) {\n return false;\n }\n return node.isPrimitive();\n }\n\n // --- FSM State ---\n\n get isFocused(): boolean {\n return this._cellFSM.isCellFocused(this._rowId, this._column.field);\n }\n\n get isEditing(): boolean {\n return this._cellFSM.isCellEditing(this._rowId, this._column.field);\n }\n\n get isAnchor(): boolean {\n return this._cellFSM.isCellAnchor(this._rowId, this._column.field);\n }\n\n get isInSelection(): boolean {\n return this._cellFSM.isCellInSelection(this._rowId, this._column.field);\n }\n\n get selectionEdges(): SelectionEdges | null {\n return this._cellFSM.getCellSelectionEdges(this._rowId, this._column.field);\n }\n\n get hasRangeSelection(): boolean {\n return this._cellFSM.hasSelection;\n }\n\n get navigationVersion(): number {\n return this._cellFSM.navigationVersion;\n }\n\n get editTrigger(): EditTrigger | null {\n if (!this.isEditing) {\n return null;\n }\n return this._cellFSM.editTrigger;\n }\n\n // --- Edit Lifecycle ---\n\n focus(): void {\n this._cellFSM.focusCell({\n rowId: this._rowId,\n field: this._column.field,\n });\n }\n\n startEdit(): void {\n if (!this.isEditable) {\n return;\n }\n this.focus();\n this._cellFSM.enterEdit();\n }\n\n startEditWithChar(char: string): void {\n if (!this.isEditable) {\n return;\n }\n this.focus();\n this._cellFSM.typeChar(char);\n }\n\n startEditWithDoubleClick(clickOffset?: number): void {\n if (!this.isEditable) {\n return;\n }\n this.focus();\n this._cellFSM.doubleClick(clickOffset);\n }\n\n commitEdit(newValue: unknown): void {\n if (this._column.fieldType === FilterFieldType.File) {\n this._commitFileNameEdit(newValue as string);\n this._cellFSM.commit();\n return;\n }\n const node = this._getNode();\n const previousValue = node?.getPlainValue();\n if (node?.isPrimitive()) {\n node.setValue(newValue);\n }\n this._cellFSM.commit();\n this._onCommit?.(this._rowId, this._column.field, newValue, previousValue);\n }\n\n commitEditAndMoveDown(newValue?: unknown): void {\n if (\n this._column.fieldType === FilterFieldType.File &&\n newValue !== undefined\n ) {\n this._commitFileNameEdit(newValue as string);\n this._cellFSM.commitAndMoveDown();\n return;\n }\n let previousValue: unknown;\n if (newValue !== undefined) {\n const node = this._getNode();\n previousValue = node?.getPlainValue();\n if (node?.isPrimitive()) {\n node.setValue(newValue);\n }\n }\n this._cellFSM.commitAndMoveDown();\n if (newValue !== undefined) {\n this._onCommit?.(\n this._rowId,\n this._column.field,\n newValue,\n previousValue,\n );\n }\n }\n\n cancelEdit(): void {\n this._cellFSM.cancel();\n }\n\n commitFileUpload(result: Record<string, unknown>): void {\n const node = this._getNode();\n if (!node?.isObject()) {\n return;\n }\n const previousValue = node.getPlainValue();\n node.setValue(result, { internal: true });\n this._onCommit?.(this._rowId, this._column.field, result, previousValue);\n }\n\n // --- Cell Operations ---\n\n clearToDefault(): void {\n const node = this._getNode();\n if (!node || !node.isPrimitive() || node.isReadOnly) {\n return;\n }\n const previousValue = node.getPlainValue();\n const defaultValue = node.defaultValue;\n node.setValue(defaultValue);\n this._onCommit?.(\n this._rowId,\n this._column.field,\n defaultValue,\n previousValue,\n );\n }\n\n async copyToClipboard(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.displayValue);\n } catch {\n /* clipboard unavailable or permission denied */\n }\n }\n\n async pasteFromClipboard(): Promise<void> {\n if (!this.isEditable) {\n return;\n }\n try {\n const text = await navigator.clipboard.readText();\n this.applyPastedText(text);\n } catch {\n /* clipboard unavailable or permission denied */\n }\n }\n\n applyPastedText(text: string): void {\n const node = this._getNode();\n if (!node?.isPrimitive()) {\n return;\n }\n const previousValue = node.getPlainValue();\n const nodeType = typeof previousValue;\n if (nodeType === 'string') {\n this._applyPastedString(node, text);\n } else if (nodeType === 'number') {\n this._applyPastedNumber(node, text);\n } else if (nodeType === 'boolean') {\n this._applyPastedBoolean(node, text);\n }\n const newValue = node.getPlainValue();\n if (newValue !== previousValue) {\n this._onCommit?.(\n this._rowId,\n this._column.field,\n newValue,\n previousValue,\n );\n }\n }\n\n notifyReadonlyEditAttempt(): void {\n this._cellFSM.notifyReadonlyEditAttempt();\n }\n\n // --- Navigation ---\n\n blur(): void {\n this._cellFSM.blur();\n }\n\n moveUp(): void {\n this._cellFSM.moveUp();\n }\n\n moveDown(): void {\n this._cellFSM.moveDown();\n }\n\n moveLeft(): void {\n this._cellFSM.moveLeft();\n }\n\n moveRight(): void {\n this._cellFSM.moveRight();\n }\n\n handleTab(shift: boolean): void {\n this._cellFSM.handleTab(shift);\n }\n\n // --- Selection ---\n\n selectTo(): void {\n this._cellFSM.selectTo({ rowId: this._rowId, field: this._column.field });\n }\n\n shiftMoveUp(): void {\n this._cellFSM.shiftMoveUp();\n }\n\n shiftMoveDown(): void {\n this._cellFSM.shiftMoveDown();\n }\n\n shiftMoveLeft(): void {\n this._cellFSM.shiftMoveLeft();\n }\n\n shiftMoveRight(): void {\n this._cellFSM.shiftMoveRight();\n }\n\n // --- Drag ---\n\n dragStart(): void {\n this._cellFSM.dragStart({ rowId: this._rowId, field: this._column.field });\n }\n\n dragExtend(): void {\n this._cellFSM.dragExtend({ rowId: this._rowId, field: this._column.field });\n }\n\n // --- Private ---\n\n private _getNode() {\n return this._rowModel.get(this._column.field);\n }\n\n private _getFileNameNode() {\n return this._rowModel.get(`${this._column.field}.fileName`);\n }\n\n private _commitFileNameEdit(newFileName: string): void {\n const fileNameNode = this._getFileNameNode();\n if (!fileNameNode?.isPrimitive()) {\n return;\n }\n const objectNode = this._getNode();\n if (!objectNode) {\n return;\n }\n const previousValue = objectNode.getPlainValue();\n fileNameNode.setValue(newFileName);\n const newValue = objectNode.getPlainValue();\n this._onCommit?.(this._rowId, this._column.field, newValue, previousValue);\n }\n\n private _applyPastedString(\n node: ReturnType<RowModel['get']> & { setValue(v: unknown): void },\n text: string,\n ): void {\n let trimmed = text;\n while (trimmed.endsWith('\\n')) {\n trimmed = trimmed.slice(0, -1);\n }\n if (trimmed !== this.displayValue) {\n node.setValue(trimmed);\n }\n }\n\n private _applyPastedNumber(\n node: ReturnType<RowModel['get']> & { setValue(v: unknown): void },\n text: string,\n ): void {\n const parsed = Number(text);\n if (!Number.isNaN(parsed) && String(parsed) !== this.displayValue) {\n node.setValue(parsed);\n }\n }\n\n private _applyPastedBoolean(\n node: ReturnType<RowModel['get']> & { setValue(v: unknown): void },\n text: string,\n ): void {\n const lower = text.trim().toLowerCase();\n if (lower === 'true' || lower === 'false') {\n const value = lower === 'true';\n if (String(value) !== this.displayValue) {\n node.setValue(value);\n }\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { RowModel } from '@revisium/schema-toolkit';\nimport type { ColumnSpec } from '../../Columns/model/types.js';\nimport type { CellFSM } from './CellFSM.js';\nimport type { SelectionModel } from './SelectionModel.js';\nimport { CellVM, type CellCommitCallback } from './CellVM.js';\n\nexport class RowVM {\n private readonly _rowModel: RowModel;\n private readonly _rowId: string;\n private readonly _cellFSM: CellFSM;\n private readonly _selection: SelectionModel;\n private readonly _onCellCommit: CellCommitCallback | null;\n private readonly _systemValues: Record<string, unknown>;\n private readonly _cellCache = new Map<string, CellVM>();\n\n constructor(\n rowModel: RowModel,\n rowId: string,\n cellFSM: CellFSM,\n selection: SelectionModel,\n onCellCommit?: CellCommitCallback,\n systemValues?: Record<string, unknown>,\n ) {\n this._rowModel = rowModel;\n this._rowId = rowId;\n this._cellFSM = cellFSM;\n this._selection = selection;\n this._onCellCommit = onCellCommit ?? null;\n this._systemValues = systemValues ?? {};\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get rowId(): string {\n return this._rowId;\n }\n\n get rowModel(): RowModel {\n return this._rowModel;\n }\n\n get isSelected(): boolean {\n return this._selection.isSelected(this._rowId);\n }\n\n toggleSelection(): void {\n this._selection.toggle(this._rowId);\n }\n\n getCellVM(column: ColumnSpec): CellVM {\n const cached = this._cellCache.get(column.field);\n if (cached) {\n return cached;\n }\n const cell = new CellVM(\n this._rowModel,\n column,\n this._rowId,\n this._cellFSM,\n this._onCellCommit ?? undefined,\n column.isSystem ? this._systemValues : undefined,\n );\n this._cellCache.set(column.field, cell);\n return cell;\n }\n\n dispose(): void {\n this._cellCache.clear();\n }\n}\n","export const CELL_HEIGHT = 40;\nexport const LINE_HEIGHT = 20;\nexport const VERTICAL_PADDING = (CELL_HEIGHT - LINE_HEIGHT) / 2;\nconst CARET_Y_OFFSET = VERTICAL_PADDING;\n\nexport interface CellPosition {\n top: number;\n left: number;\n width: number;\n}\n\nexport function getClickOffset(\n textElement: HTMLElement | null,\n displayValue: string,\n clientX: number,\n): number {\n if (!textElement || !displayValue) {\n return displayValue.length;\n }\n\n const textNode = textElement.firstChild;\n if (textNode?.nodeType !== Node.TEXT_NODE) {\n return displayValue.length;\n }\n\n const y = textElement.getBoundingClientRect().top + CARET_Y_OFFSET;\n\n if (document.caretPositionFromPoint) {\n const pos = document.caretPositionFromPoint(clientX, y);\n if (pos?.offsetNode === textNode) {\n return pos.offset;\n }\n }\n\n const rect = textElement.getBoundingClientRect();\n const clickX = clientX - rect.left;\n const textWidth = textElement.scrollWidth;\n const charWidth = textWidth / displayValue.length;\n return Math.max(\n 0,\n Math.min(displayValue.length, Math.round(clickX / charWidth)),\n );\n}\n\nexport function resolveCursorPosition(\n appendChar: string | undefined,\n appendLength: number,\n clickOffset: number | undefined,\n valueLength: number,\n): number {\n if (appendChar !== undefined) {\n return appendLength;\n }\n if (clickOffset !== undefined) {\n return Math.min(clickOffset, valueLength);\n }\n return valueLength;\n}\n","import { Portal, Textarea } from '@chakra-ui/react';\nimport { FC, useCallback, useLayoutEffect, useRef, useState } from 'react';\nimport {\n CELL_HEIGHT,\n type CellPosition,\n LINE_HEIGHT,\n resolveCursorPosition,\n VERTICAL_PADDING,\n} from './cellEditorUtils.js';\n\ninterface CellTextareaEditorProps {\n value: string;\n position: CellPosition;\n clickOffset?: number;\n appendChar?: string;\n autoHeight?: boolean;\n allowShiftEnter?: boolean;\n onCommit: (localValue: string) => void;\n onCommitEnter?: (localValue: string) => void;\n onCancel: () => void;\n testId: string;\n textAlign?: 'left' | 'right';\n}\n\nconst MAX_VISIBLE_LINES = 3;\nconst MAX_HEIGHT = MAX_VISIBLE_LINES * LINE_HEIGHT + VERTICAL_PADDING * 2;\n\nexport const CellTextareaEditor: FC<CellTextareaEditorProps> = ({\n value,\n position,\n clickOffset,\n appendChar,\n autoHeight = false,\n allowShiftEnter = false,\n onCommit,\n onCommitEnter,\n onCancel,\n testId,\n textAlign = 'left',\n}) => {\n const initialValue = appendChar ?? value;\n const [localValue, setLocalValue] = useState(initialValue);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const savedRef = useRef(false);\n\n useLayoutEffect(() => {\n if (textareaRef.current) {\n textareaRef.current.focus();\n const cursorPos = resolveCursorPosition(\n appendChar,\n initialValue.length,\n clickOffset,\n value.length,\n );\n textareaRef.current.setSelectionRange(cursorPos, cursorPos);\n }\n }, [clickOffset, value.length, appendChar, initialValue.length]);\n\n useLayoutEffect(() => {\n if (autoHeight && textareaRef.current) {\n textareaRef.current.style.height = `${CELL_HEIGHT}px`;\n const scrollHeight = textareaRef.current.scrollHeight;\n if (scrollHeight > CELL_HEIGHT) {\n textareaRef.current.style.height = `${Math.min(scrollHeight, MAX_HEIGHT)}px`;\n }\n }\n }, [autoHeight, localValue]);\n\n const handleCommit = useCallback(() => {\n if (savedRef.current) {\n return;\n }\n savedRef.current = true;\n onCommit(localValue);\n }, [localValue, onCommit]);\n\n const handleCommitEnter = useCallback(() => {\n if (savedRef.current) {\n return;\n }\n savedRef.current = true;\n if (onCommitEnter) {\n onCommitEnter(localValue);\n } else {\n onCommit(localValue);\n }\n }, [localValue, onCommit, onCommitEnter]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n savedRef.current = true;\n onCancel();\n return;\n }\n if (e.key === 'Enter') {\n if (allowShiftEnter && e.shiftKey) {\n return;\n }\n e.preventDefault();\n handleCommitEnter();\n }\n },\n [handleCommitEnter, onCancel, allowShiftEnter],\n );\n\n const handleBlur = useCallback(() => {\n handleCommit();\n }, [handleCommit]);\n\n return (\n <Portal>\n <Textarea\n ref={textareaRef}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n position=\"fixed\"\n top={`${position.top}px`}\n left={`${position.left}px`}\n width={`${position.width}px`}\n minWidth={`${position.width}px`}\n height={`${CELL_HEIGHT}px`}\n minHeight={`${CELL_HEIGHT}px`}\n zIndex={9999}\n bg=\"white\"\n borderRadius=\"0\"\n border=\"none\"\n outline=\"2px solid\"\n outlineColor=\"blue.500\"\n outlineOffset=\"-2px\"\n px=\"8px\"\n py={`${VERTICAL_PADDING}px`}\n m={0}\n fontFamily=\"inherit\"\n fontSize=\"inherit\"\n fontWeight=\"300\"\n textAlign={textAlign}\n lineHeight={`${LINE_HEIGHT}px`}\n resize=\"both\"\n overflow=\"auto\"\n boxShadow=\"0 4px 12px rgba(0,0,0,0.15)\"\n _focus={{\n outline: '2px solid',\n outlineColor: 'blue.500',\n outlineOffset: '-2px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n }}\n data-testid={testId}\n />\n </Portal>\n );\n};\n","import { createContext } from 'react';\n\nexport interface CellContextActions {\n copyRange: () => void;\n pasteRange: () => void;\n clearRange: () => void;\n}\n\nexport const CellContextActionsContext =\n createContext<CellContextActions | null>(null);\n","import { useContext } from 'react';\nimport { Box, Kbd, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellContextActionsContext } from './CellContextActionsContext.js';\n\ninterface CellContextMenuProps {\n cell: CellVM;\n onEditPointerDown?: () => void;\n}\n\nexport const CellContextMenu = observer(\n ({ cell, onEditPointerDown }: CellContextMenuProps) => {\n const ctx = useContext(CellContextActionsContext);\n const hasRange = cell.hasRangeSelection;\n\n const handleCopyValue = () => {\n void cell.copyToClipboard();\n };\n\n const handleCopyJsonPath = () => {\n void navigator.clipboard.writeText(cell.jsonPath);\n };\n\n const handlePaste = () => {\n void cell.pasteFromClipboard();\n };\n\n const handleClear = () => {\n cell.clearToDefault();\n };\n\n const handleCopyRange = () => {\n ctx?.copyRange();\n };\n\n const handlePasteRange = () => {\n ctx?.pasteRange();\n };\n\n const handleClearRange = () => {\n ctx?.clearRange();\n };\n\n return (\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"180px\">\n {hasRange && ctx ? (\n <>\n <Menu.Item value=\"copy-range\" onClick={handleCopyRange}>\n <Box flex=\"1\">Copy</Box>\n <Kbd size=\"sm\">⌘C</Kbd>\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item value=\"paste-range\" onClick={handlePasteRange}>\n <Box flex=\"1\">Paste</Box>\n <Kbd size=\"sm\">⌘V</Kbd>\n </Menu.Item>\n <Menu.Item value=\"clear-range\" onClick={handleClearRange}>\n <Box flex=\"1\">Clear</Box>\n <Kbd size=\"sm\">Del</Kbd>\n </Menu.Item>\n </>\n ) : (\n <>\n <Menu.Item value=\"copy-value\" onClick={handleCopyValue}>\n <Box flex=\"1\">Copy value</Box>\n <Kbd size=\"sm\">⌘C</Kbd>\n </Menu.Item>\n <Menu.Item value=\"copy-json-path\" onClick={handleCopyJsonPath}>\n Copy JSON path\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item\n value=\"edit\"\n disabled={!cell.isEditable}\n onPointerDown={onEditPointerDown}\n >\n <Box flex=\"1\">Edit</Box>\n <Kbd size=\"sm\">Enter</Kbd>\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item\n value=\"paste\"\n onClick={handlePaste}\n disabled={cell.isReadOnly}\n >\n <Box flex=\"1\">Paste</Box>\n <Kbd size=\"sm\">⌘V</Kbd>\n </Menu.Item>\n <Menu.Item\n value=\"clear\"\n onClick={handleClear}\n disabled={cell.isReadOnly}\n >\n Clear\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n );\n },\n);\n","import type { CellVM } from '../../model/CellVM.js';\n\nexport type CellState =\n | 'display'\n | 'focused'\n | 'editing'\n | 'readonly'\n | 'readonlyFocused'\n | 'selected';\n\nexport const SELECTION_BORDER_COLOR = '#3b82f6';\n\nexport function getCellState(cell: CellVM): CellState {\n if (cell.isReadOnly) {\n if (cell.isFocused && !cell.isInSelection) {\n return 'readonlyFocused';\n }\n if (cell.isInSelection) {\n return 'selected';\n }\n return 'readonly';\n }\n if (cell.isEditing) {\n return 'editing';\n }\n if (cell.isFocused && !cell.isInSelection) {\n return 'focused';\n }\n if (cell.isInSelection) {\n return 'selected';\n }\n return 'display';\n}\n\nexport function isPrintableKey(e: React.KeyboardEvent): boolean {\n if (e.ctrlKey || e.metaKey || e.altKey) {\n return false;\n }\n return e.key.length === 1;\n}\n","import type { SelectionEdges } from '../../model/CellFSM.js';\nimport { SELECTION_BORDER_COLOR, type CellState } from './cellStyles.js';\n\nconst CLS = 'cw';\nconst CLS_DISPLAY = `${CLS} cw-display`;\nconst CLS_READONLY = `${CLS} cw-readonly`;\nconst CLS_FOCUSED = `${CLS} cw-focused`;\nconst CLS_EDITING = `${CLS} cw-editing`;\nconst CLS_READONLY_FOCUSED = `${CLS} cw-readonlyFocused`;\nconst CLS_SELECTED = `${CLS} cw-selected`;\n\nexport const CLS_ANCHOR = 'cw-anchor';\n\nexport const STATE_CLASS: Record<CellState, string> = {\n display: CLS_DISPLAY,\n readonly: CLS_READONLY,\n focused: CLS_FOCUSED,\n editing: CLS_EDITING,\n readonlyFocused: CLS_READONLY_FOCUSED,\n selected: CLS_SELECTED,\n};\n\nconst CELL_STYLE_ID = 'cell-wrapper-styles';\n\nexport function ensureCellStyles(): void {\n if (typeof document === 'undefined') {\n return;\n }\n if (document.getElementById(CELL_STYLE_ID)) {\n return;\n }\n const style = document.createElement('style');\n style.id = CELL_STYLE_ID;\n style.textContent = [\n '.cw{height:40px;padding:0 8px;position:relative;overflow:hidden;cursor:cell;box-shadow:var(--cw-shadow,none)}',\n '.cw:focus,.cw:focus-visible{outline:none;box-shadow:var(--cw-shadow,none)}',\n '.cw-display:hover,.cw-readonly:hover{background-color:var(--chakra-colors-gray-50);box-shadow:inset 0 -1px 0 0 #ededed}',\n '.cw-focused{background-color:var(--chakra-colors-blue-50)}',\n '.cw-focused::before,.cw-editing::before,.cw-readonlyFocused::before,.cw-anchor::before{content:\"\";position:absolute;inset:1px;border-radius:1px;pointer-events:none}',\n '.cw-focused::before{border:2px solid var(--chakra-colors-blue-400)}',\n '.cw-editing{cursor:text;background-color:white;z-index:1}',\n '.cw-editing::before{border:2px solid var(--chakra-colors-blue-500)}',\n '.cw-readonlyFocused{background-color:var(--chakra-colors-gray-50)}',\n '.cw-readonlyFocused::before{border:2px solid var(--chakra-colors-gray-400)}',\n '.cw-selected{background-color:var(--chakra-colors-blue-100);user-select:none}',\n '.cw-anchor::before{border:2px solid var(--chakra-colors-blue-400)}',\n ].join('');\n document.head.appendChild(style);\n}\n\nexport const INNER_STYLE: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n width: '100%',\n minWidth: 0,\n overflow: 'hidden',\n};\n\nexport function buildSelectionBoxShadow(edges: SelectionEdges): string | null {\n const shadows: string[] = [];\n if (edges.top) {\n shadows.push(`inset 0 2px 0 0 ${SELECTION_BORDER_COLOR}`);\n }\n if (edges.bottom) {\n shadows.push(`inset 0 -2px 0 0 ${SELECTION_BORDER_COLOR}`);\n }\n if (edges.left) {\n shadows.push(`inset 2px 0 0 0 ${SELECTION_BORDER_COLOR}`);\n }\n if (edges.right) {\n shadows.push(`inset -2px 0 0 0 ${SELECTION_BORDER_COLOR}`);\n }\n return shadows.length > 0 ? shadows.join(', ') : null;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\n\ninterface PendingContextMenu {\n target: HTMLElement;\n clientX: number;\n clientY: number;\n}\n\nlet pendingContextMenu: PendingContextMenu | null = null;\n\nexport function clearPendingContextMenu(): PendingContextMenu | null {\n const pending = pendingContextMenu;\n pendingContextMenu = null;\n return pending;\n}\n\nexport function setPendingContextMenu(value: PendingContextMenu): void {\n pendingContextMenu = value;\n}\n\ntype OpenMenuFn = (clientX: number, clientY: number) => void;\nexport const cellMenuRegistry = new WeakMap<HTMLElement, OpenMenuFn>();\n\nexport function useCellContextMenu(\n cell: CellVM,\n cellRef: React.RefObject<HTMLDivElement | null>,\n deferredEdit: { triggerIfRequested: () => boolean },\n): {\n menuAnchor: DOMRect | null;\n menuOpen: boolean;\n openContextMenuAt: (clientX: number, clientY: number) => void;\n handleMenuClose: () => void;\n menuCloseRef: React.RefObject<(() => void) | null>;\n} {\n const [menuAnchor, setMenuAnchor] = useState<DOMRect | null>(null);\n const menuOpen = menuAnchor !== null;\n\n const openContextMenuAt = useCallback(\n (clientX: number, clientY: number) => {\n if (!cell.isFocused && !cell.isInSelection) {\n cell.focus();\n }\n const rect = new DOMRect(clientX, clientY, 0, 0);\n setMenuAnchor(rect);\n },\n [cell],\n );\n\n useEffect(() => {\n const el = cellRef.current;\n if (el) {\n cellMenuRegistry.set(el, openContextMenuAt);\n }\n return () => {\n if (el) {\n cellMenuRegistry.delete(el);\n }\n };\n }, [cellRef, openContextMenuAt]);\n\n const menuCloseRef = useRef<(() => void) | null>(null);\n\n const handleMenuClose = useCallback(() => {\n const pending = clearPendingContextMenu();\n\n const didTriggerEdit = deferredEdit.triggerIfRequested();\n if (!pending && !didTriggerEdit && !cell.isEditing) {\n if (cell.isAnchor || (cell.isFocused && !cell.hasRangeSelection)) {\n cellRef.current?.focus();\n } else {\n const table = cellRef.current?.closest('[data-testid=\"table-widget\"]');\n const anchor = table?.querySelector<HTMLElement>(\n '[data-testid^=\"cell-\"][tabindex=\"0\"]',\n );\n anchor?.focus();\n }\n }\n setMenuAnchor(null);\n\n if (pending) {\n const openFn = cellMenuRegistry.get(pending.target);\n if (openFn) {\n setTimeout(() => {\n openFn(pending.clientX, pending.clientY);\n }, 0);\n }\n }\n }, [cell, cellRef, deferredEdit]);\n\n menuCloseRef.current = handleMenuClose;\n\n return {\n menuAnchor,\n menuOpen,\n openContextMenuAt,\n handleMenuClose,\n menuCloseRef,\n };\n}\n","import { useEffect } from 'react';\nimport type { CellState } from './cellStyles.js';\n\nexport function useCellFocus(\n cellRef: React.RefObject<HTMLDivElement | null>,\n state: CellState,\n isAnchorInRange: boolean,\n navVersion: number,\n): void {\n useEffect(() => {\n if (!cellRef.current) {\n return;\n }\n if (state === 'focused' || state === 'readonlyFocused' || isAnchorInRange) {\n cellRef.current.focus();\n } else if (\n state === 'display' ||\n state === 'readonly' ||\n state === 'selected'\n ) {\n cellRef.current.blur();\n }\n }, [cellRef, state, isAnchorInRange, navVersion]);\n}\n","import { useCallback } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { isPrintableKey, type CellState } from './cellStyles.js';\n\nexport interface CellKeyboardCallbacks {\n onStartEdit?: () => void;\n onDoubleClick?: (clientX?: number) => void;\n onTypeChar?: (char: string) => void;\n onDelete?: () => void;\n}\n\nfunction handleArrowKey(\n cell: CellVM,\n e: React.KeyboardEvent,\n shiftAction: () => void,\n moveAction: () => void,\n): void {\n e.preventDefault();\n if (e.shiftKey) {\n shiftAction();\n } else if (cell.hasRangeSelection) {\n cell.focus();\n } else {\n moveAction();\n }\n}\n\nfunction handleEditableKeys(\n cell: CellVM,\n e: React.KeyboardEvent,\n callbacks: CellKeyboardCallbacks,\n): void {\n if (cell.isReadOnly) {\n if (\n e.key === 'Enter' ||\n e.key === 'Delete' ||\n e.key === 'Backspace' ||\n isPrintableKey(e)\n ) {\n e.preventDefault();\n cell.notifyReadonlyEditAttempt();\n }\n return;\n }\n const hasRange = cell.hasRangeSelection;\n if (!hasRange && e.key === 'Enter') {\n e.preventDefault();\n if (callbacks.onStartEdit) {\n callbacks.onStartEdit();\n } else if (callbacks.onDoubleClick) {\n callbacks.onDoubleClick();\n }\n } else if (\n !hasRange &&\n (e.key === 'Delete' || e.key === 'Backspace') &&\n callbacks.onDelete\n ) {\n e.preventDefault();\n callbacks.onDelete();\n } else if (isPrintableKey(e) && callbacks.onTypeChar) {\n e.preventDefault();\n callbacks.onTypeChar(e.key);\n }\n}\n\nexport function useCellKeyboard(\n cell: CellVM,\n state: CellState,\n isAnchorInRange: boolean,\n menuOpen: boolean,\n menuCloseRef: React.RefObject<(() => void) | null>,\n callbacks: CellKeyboardCallbacks,\n): {\n handleKeyDown: (e: React.KeyboardEvent) => void;\n handleDoubleClick: (e: React.MouseEvent) => void;\n} {\n const { onStartEdit, onDoubleClick, onTypeChar, onDelete } = callbacks;\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (menuOpen && e.key === 'Escape') {\n e.preventDefault();\n menuCloseRef.current?.();\n return;\n }\n\n const canHandle =\n state === 'focused' || state === 'readonlyFocused' || isAnchorInRange;\n if (!canHandle) {\n return;\n }\n\n const isMod = e.ctrlKey || e.metaKey;\n if (isMod && e.key === 'c' && !cell.hasRangeSelection) {\n e.preventDefault();\n void cell.copyToClipboard();\n return;\n }\n if (isMod && e.key === 'v') {\n return;\n }\n const arrowActions: Record<string, [() => void, () => void]> = {\n ArrowUp: [cell.shiftMoveUp, cell.moveUp],\n ArrowDown: [cell.shiftMoveDown, cell.moveDown],\n ArrowLeft: [cell.shiftMoveLeft, cell.moveLeft],\n ArrowRight: [cell.shiftMoveRight, cell.moveRight],\n };\n const arrow = arrowActions[e.key];\n if (e.key === 'Escape') {\n e.preventDefault();\n if (cell.hasRangeSelection) {\n cell.focus();\n } else {\n cell.blur();\n }\n } else if (arrow) {\n handleArrowKey(cell, e, arrow[0], arrow[1]);\n } else if (e.key === 'Tab') {\n e.preventDefault();\n cell.handleTab(e.shiftKey);\n } else {\n handleEditableKeys(cell, e, {\n onStartEdit,\n onDoubleClick,\n onTypeChar,\n onDelete,\n });\n }\n },\n [\n state,\n cell,\n isAnchorInRange,\n menuOpen,\n menuCloseRef,\n onStartEdit,\n onDoubleClick,\n onTypeChar,\n onDelete,\n ],\n );\n\n const handleDoubleClick = useCallback(\n (e: React.MouseEvent) => {\n if (state === 'readonly' || state === 'readonlyFocused') {\n cell.notifyReadonlyEditAttempt();\n return;\n }\n onDoubleClick?.(e.clientX);\n },\n [state, cell, onDoubleClick],\n );\n\n return { handleKeyDown, handleDoubleClick };\n}\n","import { useCallback, useEffect, useRef } from 'react';\n\n/**\n * Defers the edit action until after the browser has fully settled\n * following a context menu close.\n *\n * Problem: when clicking \"Edit\" in a Chakra context menu, the menu\n * close triggers DOM cleanup (portal removal, focus-restore microtasks\n * from zag-js) that can race with the textarea editor mount. If the\n * textarea mounts and receives focus before the cleanup finishes,\n * the cleanup steals focus → textarea blur → cancelEdit.\n *\n * Solution: defer startEdit via requestAnimationFrame + setTimeout(0)\n * to ensure it runs after microtasks, React commit, and browser paint.\n */\nexport function useDeferredMenuEdit(editFn: (() => void) | undefined): {\n requestEdit: () => void;\n triggerIfRequested: () => boolean;\n} {\n const requestedRef = useRef(false);\n const rafRef = useRef<number | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cleanup = useCallback(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n return cleanup;\n }, [cleanup]);\n\n const trigger = useCallback(() => {\n requestedRef.current = false;\n rafRef.current = null;\n timerRef.current = null;\n editFn?.();\n }, [editFn]);\n\n const requestEdit = useCallback(() => {\n requestedRef.current = true;\n }, []);\n\n const triggerIfRequested = useCallback(() => {\n if (!requestedRef.current) {\n return false;\n }\n cleanup();\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n timerRef.current = setTimeout(trigger, 0);\n });\n return true;\n }, [trigger, cleanup]);\n\n return { requestEdit, triggerIfRequested };\n}\n","import { Menu } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport {\n type CSSProperties,\n FC,\n PropsWithChildren,\n useCallback,\n useRef,\n} from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellContextMenu } from './CellContextMenu.js';\nimport {\n buildSelectionBoxShadow,\n CLS_ANCHOR,\n ensureCellStyles,\n INNER_STYLE,\n STATE_CLASS,\n} from './cellCss.js';\nimport { getCellState } from './cellStyles.js';\nimport {\n useCellContextMenu,\n setPendingContextMenu,\n} from './useCellContextMenu.js';\nimport { useCellFocus } from './useCellFocus.js';\nimport { useCellKeyboard } from './useCellKeyboard.js';\nimport { useDeferredMenuEdit } from './useDeferredMenuEdit.js';\n\ninterface CellWrapperProps extends PropsWithChildren {\n cell: CellVM;\n onDoubleClick?: (clientX?: number) => void;\n onStartEdit?: () => void;\n onTypeChar?: (char: string) => void;\n onDelete?: () => void;\n}\n\n// ───────────────── Context menu (lazy) ─────────────────\n\ninterface LazyMenuProps {\n cell: CellVM;\n cellRef: React.RefObject<HTMLDivElement | null>;\n anchorRect: DOMRect | null;\n onClose: () => void;\n onEditPointerDown: () => void;\n}\n\nconst LazyContextMenu: FC<LazyMenuProps> = observer(\n ({ cell, cellRef, anchorRect, onClose, onEditPointerDown }) => {\n const handleOpenChange = useCallback(\n (details: { open: boolean }) => {\n if (!details.open) {\n onClose();\n }\n },\n [onClose],\n );\n\n const handleInteractOutside = useCallback((e: Event) => {\n const ce = e as CustomEvent<{ originalEvent?: PointerEvent }>;\n const originalEvent = ce.detail?.originalEvent;\n if (!originalEvent || originalEvent.button !== 2) {\n return;\n }\n const target = originalEvent.target as HTMLElement | null;\n const targetCell = target?.closest(\n '[data-testid^=\"cell-\"]',\n ) as HTMLElement | null;\n if (targetCell) {\n setPendingContextMenu({\n target: targetCell,\n clientX: originalEvent.clientX,\n clientY: originalEvent.clientY,\n });\n }\n }, []);\n\n const getAnchorRect = useCallback(() => {\n return anchorRect ?? (cellRef.current?.getBoundingClientRect() || null);\n }, [anchorRect, cellRef]);\n\n return (\n <Menu.Root\n open\n onOpenChange={handleOpenChange}\n onInteractOutside={handleInteractOutside}\n positioning={{\n placement: 'bottom-start',\n getAnchorRect,\n }}\n >\n <CellContextMenu cell={cell} onEditPointerDown={onEditPointerDown} />\n </Menu.Root>\n );\n },\n);\n\n// ───────────────── Main component ─────────────────\n\nexport const CellWrapper: FC<CellWrapperProps> = observer(\n ({ cell, children, onDoubleClick, onStartEdit, onTypeChar, onDelete }) => {\n ensureCellStyles();\n\n const cellRef = useRef<HTMLDivElement>(null);\n const state = getCellState(cell);\n const selectionEdges = cell.selectionEdges;\n const isAnchorInRange = cell.isAnchor && cell.isInSelection;\n const navVersion = cell.navigationVersion;\n\n const isActive =\n state === 'focused' ||\n state === 'editing' ||\n state === 'readonlyFocused' ||\n isAnchorInRange;\n\n const editFn = onStartEdit ?? onDoubleClick;\n const deferredEdit = useDeferredMenuEdit(editFn);\n\n const {\n menuAnchor,\n menuOpen,\n openContextMenuAt,\n handleMenuClose,\n menuCloseRef,\n } = useCellContextMenu(cell, cellRef, deferredEdit);\n\n useCellFocus(cellRef, state, isAnchorInRange, navVersion);\n\n const { handleKeyDown, handleDoubleClick } = useCellKeyboard(\n cell,\n state,\n isAnchorInRange,\n menuOpen,\n menuCloseRef,\n { onStartEdit, onDoubleClick, onTypeChar, onDelete },\n );\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (\n e.detail === 2 &&\n state !== 'readonly' &&\n state !== 'readonlyFocused'\n ) {\n e.preventDefault();\n }\n if (e.button === 2) {\n openContextMenuAt(e.clientX, e.clientY);\n return;\n }\n if (!e.shiftKey && e.button === 0 && state !== 'editing') {\n e.preventDefault();\n cell.dragStart();\n cellRef.current?.focus();\n }\n },\n [state, cell, openContextMenuAt],\n );\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n if (state === 'editing') {\n return;\n }\n if (e.shiftKey) {\n cell.selectTo();\n } else {\n cell.focus();\n }\n },\n [state, cell],\n );\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n if (e.buttons === 1) {\n cell.dragExtend();\n }\n },\n [cell],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent) => {\n if (!cell.isFocused || cell.isEditing) {\n return;\n }\n if (menuOpen) {\n return;\n }\n const related = e.relatedTarget as HTMLElement | null;\n if (related?.closest('[data-testid^=\"cell-\"]')) {\n return;\n }\n cell.blur();\n },\n [cell, menuOpen],\n );\n\n const selectionShadow = selectionEdges\n ? buildSelectionBoxShadow(selectionEdges)\n : null;\n\n let className = STATE_CLASS[state];\n if (isAnchorInRange) {\n className += ` ${CLS_ANCHOR}`;\n }\n\n const cellStyle = selectionShadow\n ? ({ '--cw-shadow': selectionShadow } as CSSProperties)\n : undefined;\n\n return (\n <>\n <div\n ref={cellRef}\n className={className}\n style={cellStyle}\n tabIndex={isActive ? 0 : -1}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n onMouseEnter={handleMouseEnter}\n onDoubleClick={isActive ? handleDoubleClick : undefined}\n onKeyDown={isActive ? handleKeyDown : undefined}\n onBlur={isActive ? handleBlur : undefined}\n onContextMenu={preventContextMenu}\n data-testid={`cell-${cell.rowId}-${cell.field}`}\n >\n <div style={INNER_STYLE}>{children}</div>\n </div>\n {menuOpen && (\n <LazyContextMenu\n cell={cell}\n cellRef={cellRef}\n anchorRect={menuAnchor}\n onClose={handleMenuClose}\n onEditPointerDown={deferredEdit.requestEdit}\n />\n )}\n </>\n );\n },\n);\n\nfunction preventContextMenu(e: React.MouseEvent): void {\n e.preventDefault();\n}\n","import { type RefObject, useCallback, useRef } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { type CellPosition, getClickOffset } from './cellEditorUtils.js';\n\ninterface TextareaCellState {\n cellRef: RefObject<HTMLDivElement | null>;\n textRef: RefObject<HTMLParagraphElement | null>;\n getEditPosition: () => CellPosition | null;\n clickOffsetValue: number | undefined;\n appendCharValue: string | undefined;\n startEditing: (clientX?: number) => void;\n handleTypeChar: (char: string) => void;\n handleCommit: (localValue: string) => void;\n handleCommitEnter: (localValue: string) => void;\n handleCommitted: () => void;\n handleCancel: () => void;\n handleStartEditFromKeyboard: () => void;\n}\n\nexport function useTextareaCell(cell: CellVM): TextareaCellState {\n const cellRef = useRef<HTMLDivElement>(null);\n const textRef = useRef<HTMLParagraphElement>(null);\n\n const getEditPosition = useCallback((): CellPosition | null => {\n if (!cellRef.current) {\n return null;\n }\n const rect = cellRef.current.getBoundingClientRect();\n return {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n };\n }, []);\n\n const trigger = cell.editTrigger;\n const clickOffsetValue =\n trigger?.type === 'doubleClick' ? trigger.clickOffset : undefined;\n const appendCharValue = trigger?.type === 'char' ? trigger.char : undefined;\n\n const startEditing = useCallback(\n (clientX?: number) => {\n if (!cell.isEditable) {\n return;\n }\n const offset =\n clientX === undefined\n ? undefined\n : getClickOffset(textRef.current, cell.displayValue, clientX);\n cell.startEditWithDoubleClick(offset);\n },\n [cell],\n );\n\n const handleTypeChar = useCallback(\n (char: string) => {\n if (!cell.isEditable) {\n return;\n }\n cell.startEditWithChar(char);\n },\n [cell],\n );\n\n const handleCommitted = useCallback(() => {}, []);\n\n const handleCancel = useCallback(() => {\n cell.cancelEdit();\n }, [cell]);\n\n const handleStartEditFromKeyboard = useCallback(() => {\n if (!cell.isEditable) {\n return;\n }\n cell.startEdit();\n }, [cell]);\n\n const trimValue = useCallback((localValue: string) => {\n let trimmed = localValue;\n while (trimmed.endsWith('\\n')) {\n trimmed = trimmed.slice(0, -1);\n }\n return trimmed;\n }, []);\n\n const handleCommit = useCallback(\n (localValue: string) => {\n const trimmed = trimValue(localValue);\n if (trimmed === cell.displayValue) {\n cell.cancelEdit();\n } else {\n cell.commitEdit(trimmed);\n }\n handleCommitted();\n },\n [cell, handleCommitted, trimValue],\n );\n\n const handleCommitEnter = useCallback(\n (localValue: string) => {\n const trimmed = trimValue(localValue);\n if (trimmed === cell.displayValue) {\n cell.commitEditAndMoveDown();\n } else {\n cell.commitEditAndMoveDown(trimmed);\n }\n handleCommitted();\n },\n [cell, handleCommitted, trimValue],\n );\n\n return {\n cellRef,\n textRef,\n getEditPosition,\n clickOffsetValue,\n appendCharValue,\n startEditing,\n handleTypeChar,\n handleCommit,\n handleCommitEnter,\n handleCommitted,\n handleCancel,\n handleStartEditFromKeyboard,\n };\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box, Text } from '@chakra-ui/react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellTextareaEditor } from './CellTextareaEditor.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { useTextareaCell } from './useTextareaCell.js';\n\ninterface StringCellProps {\n cell: CellVM;\n}\n\nexport const StringCell = observer(({ cell }: StringCellProps) => {\n const {\n cellRef,\n textRef,\n getEditPosition,\n clickOffsetValue,\n appendCharValue,\n startEditing,\n handleTypeChar,\n handleCommit,\n handleCommitEnter,\n handleCancel,\n handleStartEditFromKeyboard,\n } = useTextareaCell(cell);\n\n const editPosition = cell.isEditing ? getEditPosition() : null;\n\n return (\n <Box ref={cellRef}>\n <CellWrapper\n cell={cell}\n onDoubleClick={startEditing}\n onStartEdit={handleStartEditFromKeyboard}\n onTypeChar={handleTypeChar}\n onDelete={() => cell.clearToDefault()}\n >\n <Text\n ref={textRef as React.RefObject<HTMLParagraphElement>}\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n {editPosition && (\n <CellTextareaEditor\n value={cell.displayValue}\n position={editPosition}\n clickOffset={clickOffsetValue}\n appendChar={appendCharValue}\n autoHeight\n allowShiftEnter\n onCommit={handleCommit}\n onCommitEnter={handleCommitEnter}\n onCancel={handleCancel}\n testId=\"string-cell-input\"\n />\n )}\n </Box>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport { Box, Text } from '@chakra-ui/react';\nimport { useCallback } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellTextareaEditor } from './CellTextareaEditor.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { useTextareaCell } from './useTextareaCell.js';\n\ninterface NumberCellProps {\n cell: CellVM;\n}\n\nexport const NumberCell = observer(({ cell }: NumberCellProps) => {\n const {\n cellRef,\n textRef,\n getEditPosition,\n clickOffsetValue,\n appendCharValue,\n startEditing,\n handleTypeChar,\n handleCommitted,\n handleCancel,\n handleStartEditFromKeyboard,\n } = useTextareaCell(cell);\n\n const handleCommit = useCallback(\n (localValue: string) => {\n const parsed = Number(localValue);\n if (Number.isNaN(parsed)) {\n cell.cancelEdit();\n } else if (String(parsed) !== cell.displayValue) {\n cell.commitEdit(parsed);\n } else {\n cell.cancelEdit();\n }\n handleCommitted();\n },\n [cell, handleCommitted],\n );\n\n const handleCommitEnter = useCallback(\n (localValue: string) => {\n const parsed = Number(localValue);\n if (Number.isNaN(parsed) || String(parsed) === cell.displayValue) {\n cell.commitEditAndMoveDown();\n } else {\n cell.commitEditAndMoveDown(parsed);\n }\n handleCommitted();\n },\n [cell, handleCommitted],\n );\n\n const editPosition = cell.isEditing ? getEditPosition() : null;\n\n return (\n <Box ref={cellRef}>\n <CellWrapper\n cell={cell}\n onDoubleClick={startEditing}\n onStartEdit={handleStartEditFromKeyboard}\n onTypeChar={handleTypeChar}\n onDelete={() => cell.clearToDefault()}\n >\n <Text\n ref={textRef as React.RefObject<HTMLParagraphElement>}\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n textAlign=\"right\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n {editPosition && (\n <CellTextareaEditor\n value={cell.displayValue}\n position={editPosition}\n clickOffset={clickOffsetValue}\n appendChar={appendCharValue}\n onCommit={handleCommit}\n onCommitEnter={handleCommitEnter}\n onCancel={handleCancel}\n testId=\"number-cell-input\"\n textAlign=\"right\"\n />\n )}\n </Box>\n );\n});\n","import { useCallback, useRef } from 'react';\n\ninterface PopoverAnchor {\n triggerRef: React.RefObject<HTMLDivElement | null>;\n getAnchorRect: () => DOMRect | null;\n}\n\nexport function usePopoverAnchor(): PopoverAnchor {\n const triggerRef = useRef<HTMLDivElement>(null);\n const lastRectRef = useRef<DOMRect | null>(null);\n\n const getAnchorRect = useCallback(() => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect && rect.width > 0) {\n lastRectRef.current = rect;\n }\n return lastRectRef.current;\n }, []);\n\n return { triggerRef, getAnchorRect };\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box, Popover, Portal, Text } from '@chakra-ui/react';\nimport { useCallback } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { usePopoverAnchor } from './usePopoverAnchor.js';\n\ninterface BooleanCellProps {\n cell: CellVM;\n}\n\nexport const BooleanCell = observer(({ cell }: BooleanCellProps) => {\n const { triggerRef, getAnchorRect } = usePopoverAnchor();\n\n const isOpen = cell.isEditing;\n\n const handleDoubleClick = useCallback(() => {\n if (!cell.isEditable) {\n return;\n }\n cell.startEditWithDoubleClick();\n }, [cell]);\n\n const handleSelect = useCallback(\n (value: boolean) => {\n cell.commitEdit(value);\n },\n [cell],\n );\n\n const handleClose = useCallback(() => {\n cell.cancelEdit();\n }, [cell]);\n\n return (\n <Box ref={triggerRef}>\n <CellWrapper cell={cell} onDoubleClick={handleDoubleClick}>\n <Text\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n <Popover.Root\n lazyMount\n unmountOnExit\n open={isOpen}\n onOpenChange={({ open }) => {\n if (!open) {\n handleClose();\n }\n }}\n autoFocus={true}\n closeOnInteractOutside={true}\n modal={false}\n positioning={{\n placement: 'bottom-start',\n getAnchorRect,\n }}\n >\n <Portal>\n <Popover.Positioner>\n <Popover.Content width=\"80px\" p={1}>\n <Box\n px={2}\n py={1.5}\n cursor=\"pointer\"\n borderRadius=\"md\"\n fontSize=\"sm\"\n _hover={{ bg: 'gray.100' }}\n onClick={() => handleSelect(true)}\n data-testid=\"boolean-option-true\"\n >\n true\n </Box>\n <Box\n px={2}\n py={1.5}\n cursor=\"pointer\"\n borderRadius=\"md\"\n fontSize=\"sm\"\n _hover={{ bg: 'gray.100' }}\n onClick={() => handleSelect(false)}\n data-testid=\"boolean-option-false\"\n >\n false\n </Box>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n </Box>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport { Box, Popover, Portal, Text } from '@chakra-ui/react';\nimport { useCallback } from 'react';\nimport { SearchForeignKey } from '../../../../search-foreign-key/index.js';\nimport type { SearchForeignKeySearchFn } from '../../../../search-foreign-key/index.js';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { usePopoverAnchor } from './usePopoverAnchor.js';\n\ninterface ForeignKeyCellProps {\n cell: CellVM;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n}\n\nexport const ForeignKeyCell = observer(\n ({ cell, onSearchForeignKey }: ForeignKeyCellProps) => {\n const { triggerRef, getAnchorRect } = usePopoverAnchor();\n\n const isOpen = cell.isEditing;\n\n const handleDoubleClick = useCallback(() => {\n if (!cell.isEditable || !onSearchForeignKey) {\n return;\n }\n cell.startEditWithDoubleClick();\n }, [cell, onSearchForeignKey]);\n\n const handleSelect = useCallback(\n (id: string) => {\n cell.commitEdit(id);\n },\n [cell],\n );\n\n const handleClose = useCallback(() => {\n cell.cancelEdit();\n }, [cell]);\n\n const foreignKeyTableId = cell.foreignKeyTableId;\n\n return (\n <Box ref={triggerRef}>\n <CellWrapper cell={cell} onDoubleClick={handleDoubleClick}>\n {cell.displayValue ? (\n <Text\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n ) : (\n <Text\n whiteSpace=\"nowrap\"\n fontWeight=\"300\"\n color=\"gray.400\"\n flex={1}\n minWidth={0}\n >\n Select...\n </Text>\n )}\n </CellWrapper>\n {foreignKeyTableId && onSearchForeignKey && (\n <Popover.Root\n lazyMount\n unmountOnExit\n open={isOpen}\n onOpenChange={({ open }) => {\n if (!open) {\n handleClose();\n }\n }}\n autoFocus={false}\n closeOnInteractOutside={true}\n modal={false}\n positioning={{\n placement: 'bottom-start',\n getAnchorRect,\n }}\n >\n <Portal>\n <Popover.Positioner>\n <Popover.Content width=\"320px\" p={0}>\n <SearchForeignKey\n tableId={foreignKeyTableId}\n onSearch={onSearchForeignKey}\n onSelect={handleSelect}\n onClose={handleClose}\n />\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n )}\n </Box>\n );\n },\n);\n","import { FC, useCallback, useRef } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Box, Flex, HStack, IconButton, Text } from '@chakra-ui/react';\nimport { PiInfo, PiUploadThin } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip/Tooltip.js';\nimport { FileHoverCard } from '../../../../row-editor/ui/editors/FileHoverCard.js';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellTextareaEditor } from './CellTextareaEditor.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { useTextareaCell } from './useTextareaCell.js';\n\ninterface FileCellProps {\n cell: CellVM;\n onUploadFile?: (params: {\n rowId: string;\n fileId: string;\n file: File;\n }) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n}\n\nexport const FileCell: FC<FileCellProps> = observer(\n ({ cell, onUploadFile, onOpenFile }) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const fileData = cell.fileData;\n\n const status = fileData?.status ?? '';\n const fileId = fileData?.fileId ?? '';\n const url = fileData?.url ?? '';\n const mimeType = fileData?.mimeType ?? '';\n const width = fileData?.width ?? 0;\n const height = fileData?.height ?? 0;\n\n const isReadonly = cell.isReadOnly;\n const isEditing = cell.isEditing;\n const availablePreview = mimeType.startsWith('image/');\n const showViewFile = Boolean(url);\n const showUploadFile =\n !isReadonly &&\n Boolean(onUploadFile) &&\n (status === 'ready' || status === 'uploaded');\n const showInfo = !showViewFile && !showUploadFile && isReadonly;\n\n const {\n cellRef,\n textRef,\n getEditPosition,\n clickOffsetValue,\n appendCharValue,\n startEditing,\n handleTypeChar,\n handleCommit,\n handleCommitEnter,\n handleCancel,\n handleStartEditFromKeyboard,\n } = useTextareaCell(cell);\n\n const handleFileChange = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n return;\n }\n event.target.value = '';\n try {\n const result = await onUploadFile?.({\n rowId: cell.rowId,\n fileId,\n file,\n });\n if (result) {\n cell.commitFileUpload(result);\n }\n } catch {\n // upload failed — no-op, caller is responsible for error reporting\n }\n },\n [onUploadFile, fileId, cell],\n );\n\n const handleOpenFile = useCallback(() => {\n if (onOpenFile) {\n onOpenFile(url);\n } else {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n }, [onOpenFile, url]);\n\n const handleUploadClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n fileInputRef.current?.click();\n }, []);\n\n const editPosition = isEditing ? getEditPosition() : null;\n\n return (\n <Box ref={cellRef}>\n <CellWrapper\n cell={cell}\n onDoubleClick={cell.isEditable ? startEditing : undefined}\n onStartEdit={\n cell.isEditable ? handleStartEditFromKeyboard : undefined\n }\n onTypeChar={cell.isEditable ? handleTypeChar : undefined}\n >\n <HStack gap={1} width=\"100%\" justifyContent=\"space-between\">\n <Text\n ref={textRef as React.RefObject<HTMLParagraphElement>}\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n <Flex\n className=\"file-action-buttons\"\n alignItems=\"center\"\n flexShrink={0}\n opacity={0}\n transition=\"opacity 0.15s ease\"\n css={{\n 'td:hover &, &[data-visible]': {\n opacity: 1,\n },\n }}\n {...(showInfo ? { 'data-visible': true } : {})}\n >\n {showInfo && (\n <Tooltip\n openDelay={50}\n closeDelay={50}\n content=\"The file was not uploaded in this revision\"\n >\n <Flex\n width=\"24px\"\n height=\"24px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n color=\"gray.400\"\n >\n <PiInfo />\n </Flex>\n </Tooltip>\n )}\n {showViewFile && (\n <FileHoverCard\n url={url}\n availablePreview={availablePreview}\n width={width}\n height={height}\n onClick={handleOpenFile}\n dataTestId={`cell-file-open-${cell.rowId}-${cell.field}`}\n />\n )}\n {showUploadFile && (\n <Box>\n <input\n ref={fileInputRef}\n type=\"file\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n data-testid={`cell-file-input-${cell.rowId}-${cell.field}`}\n />\n <IconButton\n aria-label=\"Upload file\"\n variant=\"ghost\"\n size=\"2xs\"\n color={showViewFile ? 'gray.300' : 'gray.500'}\n _hover={{ bg: 'gray.100', color: 'black' }}\n onClick={handleUploadClick}\n data-testid={`cell-file-upload-${cell.rowId}-${cell.field}`}\n >\n <PiUploadThin />\n </IconButton>\n </Box>\n )}\n {!showInfo && !showViewFile && !showUploadFile && !isReadonly && (\n <Tooltip\n openDelay={50}\n closeDelay={50}\n content=\"Save the row first, then upload the file\"\n >\n <Flex\n width=\"24px\"\n height=\"24px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n color=\"gray.400\"\n >\n <PiInfo />\n </Flex>\n </Tooltip>\n )}\n </Flex>\n </HStack>\n </CellWrapper>\n {editPosition && (\n <CellTextareaEditor\n value={cell.displayValue}\n position={editPosition}\n clickOffset={clickOffsetValue}\n appendChar={appendCharValue}\n autoHeight\n onCommit={handleCommit}\n onCommitEnter={handleCommitEnter}\n onCancel={handleCancel}\n testId=\"file-cell-input\"\n />\n )}\n </Box>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Text } from '@chakra-ui/react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellWrapper } from './CellWrapper.js';\n\ninterface DateTimeCellProps {\n cell: CellVM;\n}\n\nexport const DateTimeCell = observer(({ cell }: DateTimeCellProps) => {\n return (\n <CellWrapper cell={cell}>\n <Text\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n color=\"gray.600\"\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport { Text } from '@chakra-ui/react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellWrapper } from './CellWrapper.js';\n\ninterface ReadonlyCellProps {\n cell: CellVM;\n}\n\nexport const ReadonlyCell = observer(({ cell }: ReadonlyCellProps) => {\n return (\n <CellWrapper cell={cell}>\n <Text\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontSize=\"14px\"\n color=\"text/primary\"\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport type { SearchForeignKeySearchFn } from '../../../../search-foreign-key/index.js';\nimport { FilterFieldType } from '../../../shared/field-types.js';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { StringCell } from './StringCell.js';\nimport { NumberCell } from './NumberCell.js';\nimport { BooleanCell } from './BooleanCell.js';\nimport { ForeignKeyCell } from './ForeignKeyCell.js';\nimport { FileCell } from './FileCell.js';\nimport { DateTimeCell } from './DateTimeCell.js';\nimport { ReadonlyCell } from './ReadonlyCell.js';\n\ninterface CellRendererProps {\n cell: CellVM;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n onUploadFile?: (params: {\n rowId: string;\n fileId: string;\n file: File;\n }) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n}\n\nexport const CellRenderer = observer(\n ({\n cell,\n onSearchForeignKey,\n onUploadFile,\n onOpenFile,\n }: CellRendererProps) => {\n switch (cell.column.fieldType) {\n case FilterFieldType.String:\n return <StringCell cell={cell} />;\n case FilterFieldType.Number:\n return <NumberCell cell={cell} />;\n case FilterFieldType.Boolean:\n return <BooleanCell cell={cell} />;\n case FilterFieldType.ForeignKey:\n return (\n <ForeignKeyCell cell={cell} onSearchForeignKey={onSearchForeignKey} />\n );\n case FilterFieldType.File:\n return (\n <FileCell\n cell={cell}\n onUploadFile={onUploadFile}\n onOpenFile={onOpenFile}\n />\n );\n case FilterFieldType.DateTime:\n return <DateTimeCell cell={cell} />;\n default:\n return <ReadonlyCell cell={cell} />;\n }\n },\n);\n","function hasNonEmptyField(row: string[]): boolean {\n return row.some((f) => f.length > 0);\n}\n\ninterface ParserState {\n rows: string[][];\n currentRow: string[];\n currentField: string;\n inQuotes: boolean;\n i: number;\n}\n\nfunction processQuotedChar(state: ParserState, text: string): void {\n const ch = text[state.i];\n if (ch === '\"' && state.i + 1 < text.length && text[state.i + 1] === '\"') {\n state.currentField += '\"';\n state.i += 2;\n } else if (ch === '\"') {\n state.inQuotes = false;\n state.i++;\n } else {\n state.currentField += ch;\n state.i++;\n }\n}\n\nfunction finishRow(state: ParserState): void {\n state.currentRow.push(state.currentField);\n state.currentField = '';\n if (hasNonEmptyField(state.currentRow)) {\n state.rows.push(state.currentRow);\n }\n state.currentRow = [];\n}\n\nfunction processUnquotedChar(state: ParserState, text: string): void {\n const ch = text[state.i];\n if (ch === '\"' && state.currentField.length === 0) {\n state.inQuotes = true;\n state.i++;\n } else if (ch === '\\t') {\n state.currentRow.push(state.currentField);\n state.currentField = '';\n state.i++;\n } else if (ch === '\\n') {\n finishRow(state);\n state.i++;\n } else if (\n ch === '\\r' &&\n state.i + 1 < text.length &&\n text[state.i + 1] === '\\n'\n ) {\n finishRow(state);\n state.i += 2;\n } else {\n state.currentField += ch;\n state.i++;\n }\n}\n\nexport function parseTSV(text: string): string[][] {\n if (text.length === 0) {\n return [];\n }\n\n const state: ParserState = {\n rows: [],\n currentRow: [],\n currentField: '',\n inQuotes: false,\n i: 0,\n };\n\n while (state.i < text.length) {\n if (state.inQuotes) {\n processQuotedChar(state, text);\n } else {\n processUnquotedChar(state, text);\n }\n }\n\n state.currentRow.push(state.currentField);\n if (hasNonEmptyField(state.currentRow)) {\n state.rows.push(state.currentRow);\n }\n\n return state.rows;\n}\n","import type { ColumnSpec } from '../../Columns/model/types.js';\nimport type { CellFSM, SelectedRange } from './CellFSM.js';\nimport type { RowVM } from './RowVM.js';\nimport { parseTSV } from './parseTSV.js';\n\nfunction quoteTSVCell(value: string): string {\n if (value.includes('\\t') || value.includes('\\n') || value.includes('\"')) {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n return value;\n}\n\nexport function copyRangeToClipboard(\n range: SelectedRange,\n rows: RowVM[],\n cols: ColumnSpec[],\n): Promise<void> {\n const lines: string[] = [];\n for (let r = range.startRow; r <= range.endRow; r++) {\n const cells: string[] = [];\n for (let c = range.startCol; c <= range.endCol; c++) {\n const row = rows[r];\n const col = cols[c];\n if (row && col) {\n cells.push(quoteTSVCell(row.getCellVM(col).displayValue));\n }\n }\n lines.push(cells.join('\\t'));\n }\n try {\n return navigator.clipboard.writeText(lines.join('\\n'));\n } catch {\n return Promise.resolve();\n }\n}\n\nexport async function pasteRangeFromClipboard(\n focusedRowIndex: number,\n focusedColIndex: number,\n rows: RowVM[],\n cols: ColumnSpec[],\n): Promise<void> {\n let text: string;\n try {\n text = await navigator.clipboard.readText();\n } catch {\n return;\n }\n const grid = parseTSV(text);\n for (const [r, gridRow] of grid.entries()) {\n const rowIndex = focusedRowIndex + r;\n const row = rows[rowIndex];\n if (!row) {\n break;\n }\n for (const [c, cellText] of gridRow.entries()) {\n const colIndex = focusedColIndex + c;\n const col = cols[colIndex];\n if (!col) {\n break;\n }\n const cellVM = row.getCellVM(col);\n if (cellVM.isEditable) {\n cellVM.applyPastedText(cellText);\n }\n }\n }\n}\n\nexport function getFocusedPosition(\n fsm: CellFSM,\n cols: ColumnSpec[],\n rows: RowVM[],\n): { colIndex: number; rowIndex: number } | null {\n const focused = fsm.focusedCell;\n if (!focused) {\n return null;\n }\n const colIndex = cols.findIndex((c) => c.field === focused.field);\n const rowIndex = rows.findIndex((r) => r.rowId === focused.rowId);\n if (colIndex === -1 || rowIndex === -1) {\n return null;\n }\n return { colIndex, rowIndex };\n}\n\nexport function clearRange(\n range: SelectedRange,\n rows: RowVM[],\n cols: ColumnSpec[],\n): void {\n for (let r = range.startRow; r <= range.endRow; r++) {\n for (let c = range.startCol; c <= range.endCol; c++) {\n const row = rows[r];\n const col = cols[c];\n if (row && col) {\n row.getCellVM(col).clearToDefault();\n }\n }\n }\n}\n","import type { SystemStyleObject } from '@chakra-ui/react';\n\nexport const CELL_BORDER_COLOR = '#ededed';\nexport const BOTTOM_BORDER_SHADOW = `inset 0 -1px 0 0 ${CELL_BORDER_COLOR}`;\n\nexport function buildAddColumnShadowCss(): SystemStyleObject {\n return {\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: '8px',\n left: '-8px',\n pointerEvents: 'none',\n transition: 'opacity 0.15s',\n opacity: 'var(--shadow-right-opacity, 0)',\n boxShadow: 'inset -8px 0 12px -8px rgba(0,0,0,0.1)',\n },\n };\n}\n\nexport function adjustRightOffsetCss(\n rightCss: string,\n addColOffset: number,\n): string {\n if (addColOffset <= 0) {\n return rightCss;\n }\n if (rightCss === '0px') {\n return `${addColOffset}px`;\n }\n return `calc(${rightCss} + ${addColOffset}px)`;\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box } from '@chakra-ui/react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\n\nconst MIN_COLUMN_WIDTH = 40;\n\ninterface ResizeHandleProps {\n field: string;\n columnsModel: ColumnsModel;\n}\n\nexport const ResizeHandle = observer(\n ({ field, columnsModel }: ResizeHandleProps) => {\n const [isResizing, setIsResizing] = useState(false);\n const startXRef = useRef(0);\n const startWidthRef = useRef(0);\n const rafRef = useRef(0);\n const cleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, []);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const currentWidth = columnsModel.resolveColumnWidth(field);\n startXRef.current = e.clientX;\n startWidthRef.current = currentWidth;\n setIsResizing(true);\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(() => {\n const delta = moveEvent.clientX - startXRef.current;\n const newWidth = Math.max(\n MIN_COLUMN_WIDTH,\n startWidthRef.current + delta,\n );\n columnsModel.setColumnWidth(field, newWidth);\n });\n };\n\n const cleanup = () => {\n cancelAnimationFrame(rafRef.current);\n columnsModel.commitColumnWidth();\n setIsResizing(false);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n cleanupRef.current = null;\n };\n\n const handleMouseUp = () => {\n cleanup();\n };\n\n cleanupRef.current = cleanup;\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n },\n [field, columnsModel],\n );\n\n return (\n <Box\n role=\"separator\"\n position=\"absolute\"\n right=\"-4px\"\n top={0}\n bottom={0}\n width=\"8px\"\n cursor=\"col-resize\"\n zIndex={10}\n onMouseDown={handleMouseDown}\n data-testid={`resize-${field}`}\n >\n <Box\n position=\"absolute\"\n left=\"3px\"\n top={0}\n bottom={0}\n width=\"2px\"\n bg={isResizing ? 'blue.500' : 'transparent'}\n _groupHover={{ bg: 'blue.500' }}\n transition=\"background 0.1s\"\n />\n </Box>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuArrowDown, LuArrowUp } from 'react-icons/lu';\nimport type { SortModel } from '../../../Sortings/model/SortModel.js';\n\ninterface SortIndicatorProps {\n field: string;\n sortModel: SortModel;\n}\n\nexport const SortIndicator = observer(\n ({ field, sortModel }: SortIndicatorProps) => {\n const direction = sortModel.getSortDirection(field);\n const sortIndex = sortModel.getSortIndex(field);\n const showIndex = sortModel.sortCount > 1;\n\n if (!direction) {\n return null;\n }\n\n return (\n <Flex\n alignItems=\"center\"\n gap=\"1px\"\n color=\"blue.500\"\n fontSize=\"xs\"\n flexShrink={0}\n data-testid={`sort-indicator-${field}`}\n >\n {direction === 'asc' ? (\n <LuArrowUp size={12} />\n ) : (\n <LuArrowDown size={12} />\n )}\n {showIndex && sortIndex !== null && (\n <Box as=\"span\" fontSize=\"10px\" fontWeight=\"medium\" lineHeight={1}>\n {sortIndex}\n </Box>\n )}\n </Flex>\n );\n },\n);\n","import { Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuPin } from 'react-icons/lu';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\n\ninterface PinIndicatorProps {\n field: string;\n columnsModel: ColumnsModel;\n}\n\nexport const PinIndicator = observer(\n ({ field, columnsModel }: PinIndicatorProps) => {\n if (!columnsModel.isPinned(field)) {\n return null;\n }\n\n return (\n <Flex\n alignItems=\"center\"\n color=\"gray.400\"\n flexShrink={0}\n data-testid={`pin-indicator-${field}`}\n >\n <LuPin size={12} />\n </Flex>\n );\n },\n);\n","import { Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuFilter } from 'react-icons/lu';\nimport type { FilterModel } from '../../../Filters/model/FilterModel.js';\n\ninterface FilterIndicatorProps {\n field: string;\n filterModel: FilterModel;\n}\n\nexport const FilterIndicator = observer(\n ({ field, filterModel }: FilterIndicatorProps) => {\n if (!filterModel.hasFilterForField(field)) {\n return null;\n }\n\n return (\n <Flex\n alignItems=\"center\"\n color=\"gray.400\"\n flexShrink={0}\n data-testid={`filter-indicator-${field}`}\n >\n <LuFilter size={12} />\n </Flex>\n );\n },\n);\n","import { Menu, Portal, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport {\n LuArrowDownAZ,\n LuArrowUpAZ,\n LuChevronRight,\n LuX,\n} from 'react-icons/lu';\nimport type { SortModel } from '../../../Sortings/model/SortModel.js';\n\ninterface SortSubmenuProps {\n field: string;\n sortModel: SortModel;\n}\n\nexport const SortSubmenu = observer(\n ({ field, sortModel }: SortSubmenuProps) => {\n const currentDirection = sortModel.getSortDirection(field);\n const isSorted = sortModel.isSorted(field);\n\n const handleSortAsc = () => {\n sortModel.setSingleSort(field, 'asc');\n };\n\n const handleSortDesc = () => {\n sortModel.setSingleSort(field, 'desc');\n };\n\n const handleRemoveSort = () => {\n sortModel.removeSort(field);\n };\n\n return (\n <Menu.Root\n positioning={{ placement: 'right-start', gutter: 2 }}\n lazyMount\n unmountOnExit\n >\n <Menu.TriggerItem>\n <Text flex={1}>Sort</Text>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"160px\">\n <Menu.Item\n value=\"sort-asc\"\n onClick={handleSortAsc}\n color={currentDirection === 'asc' ? 'blue.600' : undefined}\n >\n <LuArrowUpAZ />\n <Text>Sort A → Z</Text>\n </Menu.Item>\n <Menu.Item\n value=\"sort-desc\"\n onClick={handleSortDesc}\n color={currentDirection === 'desc' ? 'blue.600' : undefined}\n >\n <LuArrowDownAZ />\n <Text>Sort Z → A</Text>\n </Menu.Item>\n {isSorted && (\n <>\n <Menu.Separator />\n <Menu.Item value=\"remove-sort\" onClick={handleRemoveSort}>\n <LuX />\n <Text>Remove sort</Text>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Menu, Portal, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport {\n LuArrowLeftToLine,\n LuArrowRightToLine,\n LuChevronLeft,\n LuChevronRight,\n} from 'react-icons/lu';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\n\ninterface MoveColumnSubmenuProps {\n field: string;\n columnsModel: ColumnsModel;\n}\n\nexport const MoveColumnSubmenu = observer(\n ({ field, columnsModel }: MoveColumnSubmenuProps) => {\n const canMoveLeft = columnsModel.canMoveLeft(field);\n const canMoveRight = columnsModel.canMoveRight(field);\n const canMoveToStart = columnsModel.canMoveToStart(field);\n const canMoveToEnd = columnsModel.canMoveToEnd(field);\n\n if (!canMoveLeft && !canMoveRight) {\n return null;\n }\n\n return (\n <Menu.Root\n positioning={{ placement: 'right-start', gutter: 2 }}\n lazyMount\n unmountOnExit\n >\n <Menu.TriggerItem>\n <Text flex={1}>Move column</Text>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"160px\">\n {canMoveLeft && (\n <Menu.Item\n value=\"move-left\"\n onClick={() => columnsModel.moveColumnLeft(field)}\n >\n <LuChevronLeft />\n <Text>Move left</Text>\n </Menu.Item>\n )}\n {canMoveToStart && (\n <Menu.Item\n value=\"move-to-start\"\n onClick={() => columnsModel.moveColumnToStart(field)}\n >\n <LuArrowLeftToLine />\n <Text>Move to start</Text>\n </Menu.Item>\n )}\n {canMoveRight && (\n <Menu.Item\n value=\"move-right\"\n onClick={() => columnsModel.moveColumnRight(field)}\n >\n <LuChevronRight />\n <Text>Move right</Text>\n </Menu.Item>\n )}\n {canMoveToEnd && (\n <Menu.Item\n value=\"move-to-end\"\n onClick={() => columnsModel.moveColumnToEnd(field)}\n >\n <LuArrowRightToLine />\n <Text>Move to end</Text>\n </Menu.Item>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Text } from '@chakra-ui/react';\nimport { memo } from 'react';\nimport type { FilterFieldType } from '../../../shared/field-types.js';\nimport { getFieldTypeIcon } from './getFieldTypeIcon.js';\n\ninterface FieldMenuItemProps {\n field: string;\n name: string;\n fieldType: FilterFieldType;\n valuePrefix?: string;\n onClick: (field: string) => void;\n}\n\nexport const FieldMenuItem = memo(\n ({ field, name, fieldType, valuePrefix, onClick }: FieldMenuItemProps) => {\n const handleClick = () => onClick(field);\n\n return (\n <Menu.Item\n value={valuePrefix ? `${valuePrefix}-${field}` : field}\n onClick={handleClick}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2} width=\"100%\">\n <Box\n as=\"span\"\n fontSize=\"xs\"\n fontWeight=\"medium\"\n color=\"gray.400\"\n fontFamily=\"mono\"\n minWidth=\"20px\"\n >\n {getFieldTypeIcon(fieldType)}\n </Box>\n <Text truncate>{name || '(unnamed)'}</Text>\n </Box>\n </Menu.Item>\n );\n },\n);\n","import { Menu, Portal, Text } from '@chakra-ui/react';\nimport { LuChevronRight } from 'react-icons/lu';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { FieldMenuItem } from './FieldMenuItem.js';\n\ninterface InsertColumnSubmenuProps {\n label: string;\n valuePrefix: string;\n availableFields: ColumnSpec[];\n onSelect: (field: string) => void;\n}\n\nexport const InsertColumnSubmenu = ({\n label,\n valuePrefix,\n availableFields,\n onSelect,\n}: InsertColumnSubmenuProps) => {\n if (availableFields.length === 0) {\n return null;\n }\n\n return (\n <Menu.Root\n positioning={{ placement: 'right-start', gutter: 2 }}\n lazyMount\n unmountOnExit\n >\n <Menu.TriggerItem>\n <Text flex={1}>{label}</Text>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content maxH=\"300px\" minW=\"200px\" overflowY=\"auto\">\n {availableFields.map((col) => (\n <FieldMenuItem\n key={col.field}\n field={col.field}\n name={col.label}\n fieldType={col.fieldType}\n valuePrefix={valuePrefix}\n onClick={onSelect}\n />\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { Menu, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuCopy, LuFilter, LuPin, LuPinOff } from 'react-icons/lu';\nimport { PiEyeSlash, PiListBullets } from 'react-icons/pi';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\nimport type { FilterModel } from '../../../Filters/model/FilterModel.js';\nimport type { SortModel } from '../../../Sortings/model/SortModel.js';\nimport { SortSubmenu } from './SortSubmenu.js';\nimport { MoveColumnSubmenu } from './MoveColumnSubmenu.js';\nimport { InsertColumnSubmenu } from './InsertColumnSubmenu.js';\n\ninterface ColumnHeaderMenuProps {\n column: ColumnSpec;\n columnsModel: ColumnsModel;\n sortModel?: SortModel;\n filterModel?: FilterModel;\n onCopyPath?: (path: string) => void;\n onClose?: () => void;\n}\n\nexport const ColumnHeaderMenu = observer(\n ({\n column,\n columnsModel,\n sortModel,\n filterModel,\n onCopyPath,\n onClose,\n }: ColumnHeaderMenuProps) => {\n const canRemove = columnsModel.canRemoveColumn;\n const insertableFields = columnsModel.availableFieldsToInsert;\n const hasInsertableFields = insertableFields.length > 0;\n const canMove =\n columnsModel.canMoveLeft(column.field) ||\n columnsModel.canMoveRight(column.field);\n\n const isPinned = columnsModel.isPinned(column.field);\n const canPinLeft = columnsModel.canPinLeft(column.field);\n const canPinRight = columnsModel.canPinRight(column.field);\n\n const handleHide = () => {\n columnsModel.hideColumn(column.field);\n };\n\n const handleAddFilter = () => {\n if (filterModel) {\n filterModel.addConditionForField(column.field);\n filterModel.setOpen(true);\n }\n };\n\n const handleCopyPath = () => {\n if (onCopyPath) {\n onCopyPath(column.field);\n } else {\n navigator.clipboard.writeText(column.field).catch(() => {});\n }\n };\n\n const handleInsertBefore = (field: string) => {\n columnsModel.insertColumnBefore(column.field, field);\n onClose?.();\n };\n\n const handleInsertAfter = (field: string) => {\n columnsModel.insertColumnAfter(column.field, field);\n onClose?.();\n };\n\n const handlePinLeft = () => {\n columnsModel.pinLeft(column.field);\n };\n\n const handlePinRight = () => {\n columnsModel.pinRight(column.field);\n };\n\n const handleUnpin = () => {\n columnsModel.unpin(column.field);\n };\n\n return (\n <Menu.Content minW=\"180px\">\n {sortModel && column.isSortable && (\n <>\n <SortSubmenu field={column.field} sortModel={sortModel} />\n <Menu.Separator />\n </>\n )}\n {filterModel && column.isSortable && (\n <>\n <Menu.Item value=\"add-filter\" onClick={handleAddFilter}>\n <LuFilter />\n <Text>Add filter</Text>\n </Menu.Item>\n <Menu.Separator />\n </>\n )}\n {canMove && (\n <>\n <MoveColumnSubmenu\n field={column.field}\n columnsModel={columnsModel}\n />\n <Menu.Separator />\n </>\n )}\n {isPinned ? (\n <>\n <Menu.Item value=\"unpin\" onClick={handleUnpin}>\n <LuPinOff />\n <Text>Unpin column</Text>\n </Menu.Item>\n <Menu.Separator />\n </>\n ) : (\n <>\n {canPinLeft && (\n <Menu.Item value=\"pin-left\" onClick={handlePinLeft}>\n <LuPin />\n <Text>Pin to left</Text>\n </Menu.Item>\n )}\n {canPinRight && (\n <Menu.Item value=\"pin-right\" onClick={handlePinRight}>\n <LuPin />\n <Text>Pin to right</Text>\n </Menu.Item>\n )}\n {(canPinLeft || canPinRight) && <Menu.Separator />}\n </>\n )}\n {hasInsertableFields && (\n <>\n <InsertColumnSubmenu\n label=\"Insert before\"\n valuePrefix=\"before\"\n availableFields={insertableFields}\n onSelect={handleInsertBefore}\n />\n <InsertColumnSubmenu\n label=\"Insert after\"\n valuePrefix=\"after\"\n availableFields={insertableFields}\n onSelect={handleInsertAfter}\n />\n <Menu.Separator />\n </>\n )}\n <Menu.Item value=\"hide\" disabled={!canRemove} onClick={handleHide}>\n <PiEyeSlash />\n <Text>Hide column</Text>\n </Menu.Item>\n <Menu.Item\n value=\"hide-all\"\n disabled={!canRemove}\n onClick={columnsModel.hideAll}\n >\n <PiListBullets />\n <Text>Hide all columns</Text>\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item value=\"copy-path\" onClick={handleCopyPath}>\n <LuCopy />\n <Text>Copy path</Text>\n </Menu.Item>\n </Menu.Content>\n );\n },\n);\n","import { useState } from 'react';\nimport { Box, Flex, Menu, Portal, Text } from '@chakra-ui/react';\nimport type { SystemStyleObject } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\nimport type { FilterModel } from '../../../Filters/model/FilterModel.js';\nimport type { SortModel } from '../../../Sortings/model/SortModel.js';\nimport { CELL_BORDER_COLOR, BOTTOM_BORDER_SHADOW } from '../borderConstants.js';\nimport { ResizeHandle } from '../ResizeHandle.js';\nimport { SortIndicator } from './SortIndicator.js';\nimport { PinIndicator } from './PinIndicator.js';\nimport { FilterIndicator } from './FilterIndicator.js';\nimport { ColumnHeaderMenu } from './ColumnHeaderMenu.js';\nimport { getFieldTypeIcon } from './getFieldTypeIcon.js';\n\nexport interface StickyPosition {\n side: 'left' | 'right';\n offsetCss: string;\n isBoundary: boolean;\n}\n\nfunction buildHeaderShadowCss(position: StickyPosition): SystemStyleObject {\n const cssVar =\n position.side === 'left'\n ? 'var(--shadow-left-opacity, 0)'\n : 'var(--shadow-right-opacity, 0)';\n return {\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: '8px',\n pointerEvents: 'none',\n transition: 'opacity 0.15s',\n opacity: cssVar,\n ...(position.side === 'left'\n ? {\n right: '-8px',\n boxShadow: 'inset 8px 0 12px -8px rgba(0,0,0,0.1)',\n }\n : {\n left: '-8px',\n boxShadow: 'inset -8px 0 12px -8px rgba(0,0,0,0.1)',\n }),\n },\n };\n}\n\nfunction getHeaderBoxShadow(stickyPosition?: StickyPosition): string {\n if (!stickyPosition) {\n return BOTTOM_BORDER_SHADOW;\n }\n const stickyBorder =\n stickyPosition.side === 'left'\n ? `inset -1px 0 0 0 ${CELL_BORDER_COLOR}`\n : `inset 1px 0 0 0 ${CELL_BORDER_COLOR}`;\n return `${BOTTOM_BORDER_SHADOW}, ${stickyBorder}`;\n}\n\ninterface ColumnHeaderProps {\n column: ColumnSpec;\n columnsModel: ColumnsModel;\n sortModel?: SortModel;\n filterModel?: FilterModel;\n onCopyPath?: (path: string) => void;\n stickyPosition?: StickyPosition;\n}\n\nexport const ColumnHeader = observer(\n ({\n column,\n columnsModel,\n sortModel,\n filterModel,\n onCopyPath,\n stickyPosition,\n }: ColumnHeaderProps) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const w = columnsModel.columnWidthCssVar(column.field);\n\n const isSticky = Boolean(stickyPosition);\n\n return (\n <Box\n as=\"th\"\n position={isSticky ? 'sticky' : 'relative'}\n left={\n stickyPosition?.side === 'left' ? stickyPosition.offsetCss : undefined\n }\n right={\n stickyPosition?.side === 'right'\n ? stickyPosition.offsetCss\n : undefined\n }\n zIndex={isSticky ? 2 : undefined}\n width={w}\n minWidth={w}\n maxWidth={w}\n height=\"inherit\"\n bg=\"white\"\n boxShadow={getHeaderBoxShadow(stickyPosition)}\n textAlign=\"left\"\n fontWeight=\"normal\"\n p={0}\n css={\n stickyPosition?.isBoundary\n ? buildHeaderShadowCss(stickyPosition)\n : undefined\n }\n >\n <Menu.Root\n positioning={{ placement: 'bottom-end' }}\n lazyMount\n unmountOnExit\n open={isMenuOpen}\n onOpenChange={(details) => setIsMenuOpen(details.open)}\n >\n <Menu.Trigger asChild>\n <Flex\n alignItems=\"center\"\n height=\"100%\"\n pl=\"8px\"\n pr=\"16px\"\n gap=\"4px\"\n cursor=\"pointer\"\n transition=\"background 0.15s\"\n overflow=\"hidden\"\n _hover={{ bg: 'gray.100' }}\n data-testid={`header-${column.field}`}\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n fontSize=\"xs\"\n color=\"gray.400\"\n width=\"16px\"\n >\n {getFieldTypeIcon(column.fieldType)}\n </Flex>\n <Text\n fontSize=\"sm\"\n fontWeight=\"500\"\n color=\"gray.400\"\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n flex={1}\n minWidth={0}\n textDecoration={\n column.isDeprecated ? 'line-through' : undefined\n }\n >\n {column.label}\n </Text>\n <PinIndicator field={column.field} columnsModel={columnsModel} />\n {filterModel && column.isSortable && (\n <FilterIndicator\n field={column.field}\n filterModel={filterModel}\n />\n )}\n {sortModel && column.isSortable && (\n <SortIndicator field={column.field} sortModel={sortModel} />\n )}\n </Flex>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <ColumnHeaderMenu\n column={column}\n columnsModel={columnsModel}\n sortModel={sortModel}\n filterModel={filterModel}\n onCopyPath={onCopyPath}\n onClose={() => setIsMenuOpen(false)}\n />\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n <ResizeHandle field={column.field} columnsModel={columnsModel} />\n </Box>\n );\n },\n);\n","import { Flex, IconButton, Menu, Portal, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { PiListBullets, PiPlus } from 'react-icons/pi';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\nimport { FieldMenuItem } from './FieldMenuItem.js';\n\ninterface AddColumnButtonProps {\n columnsModel: ColumnsModel;\n}\n\nexport const AddColumnButton = observer(\n ({ columnsModel }: AddColumnButtonProps) => {\n const availableFields = columnsModel.availableFieldsToAdd;\n const availableSystemFields = columnsModel.availableSystemFieldsToAdd;\n const hasHidden = columnsModel.hasHiddenColumns;\n\n if (!hasHidden) {\n return null;\n }\n\n return (\n <Flex alignItems=\"center\" px=\"4px\" height=\"100%\">\n <Menu.Root\n positioning={{ placement: 'bottom-start' }}\n lazyMount\n unmountOnExit\n >\n <Menu.Trigger asChild>\n <IconButton\n aria-label=\"Add column\"\n size=\"xs\"\n variant=\"ghost\"\n color=\"gray.400\"\n _hover={{ bg: 'gray.100', color: 'gray.600' }}\n focusRing=\"none\"\n data-testid=\"add-column-button\"\n >\n <PiPlus />\n </IconButton>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"200px\" maxH=\"340px\" overflowY=\"auto\">\n <Menu.Item value=\"add-all\" onClick={columnsModel.addAll}>\n <PiListBullets />\n <Text>Add all columns</Text>\n </Menu.Item>\n {availableFields.length > 0 && (\n <>\n <Menu.Separator />\n <Menu.ItemGroup>\n <Menu.ItemGroupLabel\n fontWeight=\"medium\"\n color=\"gray.500\"\n fontSize=\"xs\"\n >\n Data fields\n </Menu.ItemGroupLabel>\n {availableFields.map((col) => (\n <FieldMenuItem\n key={col.field}\n field={col.field}\n name={col.label}\n fieldType={col.fieldType}\n onClick={columnsModel.showColumn}\n />\n ))}\n </Menu.ItemGroup>\n </>\n )}\n {availableSystemFields.length > 0 && (\n <>\n <Menu.Separator />\n <Menu.ItemGroup>\n <Menu.ItemGroupLabel\n fontWeight=\"medium\"\n color=\"gray.500\"\n fontSize=\"xs\"\n >\n System fields\n </Menu.ItemGroupLabel>\n {availableSystemFields.map((col) => (\n <FieldMenuItem\n key={col.field}\n field={col.field}\n name={col.label}\n fieldType={col.fieldType}\n onClick={columnsModel.showColumn}\n />\n ))}\n </Menu.ItemGroup>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box } from '@chakra-ui/react';\nimport type { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\nimport type { FilterModel } from '../../Filters/model/FilterModel.js';\nimport type { SortModel } from '../../Sortings/model/SortModel.js';\nimport {\n BOTTOM_BORDER_SHADOW,\n buildAddColumnShadowCss,\n adjustRightOffsetCss,\n} from './borderConstants.js';\nimport { ColumnHeader } from './Header/ColumnHeader.js';\nimport type { StickyPosition } from './Header/ColumnHeader.js';\nimport { AddColumnButton } from './Header/AddColumnButton.js';\n\nconst SELECTION_COLUMN_WIDTH = 40;\nconst ADD_COLUMN_BUTTON_WIDTH = 40;\n\ninterface HeaderRowProps {\n columnsModel: ColumnsModel;\n sortModel?: SortModel;\n filterModel?: FilterModel;\n onCopyPath?: (path: string) => void;\n showSelection?: boolean;\n}\n\nexport const HeaderRow = observer(\n ({\n columnsModel,\n sortModel,\n filterModel,\n onCopyPath,\n showSelection,\n }: HeaderRowProps) => {\n const selectionWidth = showSelection ? SELECTION_COLUMN_WIDTH : 0;\n const addColumnStickyRight = columnsModel.hasHiddenColumns;\n\n return (\n <Box as=\"tr\" height=\"40px\">\n {showSelection && (\n <Box\n as=\"th\"\n width=\"40px\"\n minWidth=\"40px\"\n maxWidth=\"40px\"\n bg=\"white\"\n p={0}\n position=\"sticky\"\n left={0}\n zIndex={2}\n boxShadow={BOTTOM_BORDER_SHADOW}\n />\n )}\n {columnsModel.visibleColumns.map((col) => {\n const stickyPosition = getStickyPosition(\n col.field,\n columnsModel,\n selectionWidth,\n addColumnStickyRight,\n );\n return (\n <ColumnHeader\n key={col.field}\n column={col}\n columnsModel={columnsModel}\n sortModel={sortModel}\n filterModel={filterModel}\n onCopyPath={onCopyPath}\n stickyPosition={stickyPosition}\n />\n );\n })}\n {addColumnStickyRight ? (\n <Box\n as=\"th\"\n width=\"100%\"\n minWidth={`${ADD_COLUMN_BUTTON_WIDTH}px`}\n bg=\"white\"\n p={0}\n position=\"sticky\"\n right={0}\n zIndex={2}\n boxShadow={BOTTOM_BORDER_SHADOW}\n css={\n columnsModel.pinnedRightCount === 0\n ? buildAddColumnShadowCss()\n : undefined\n }\n >\n <AddColumnButton columnsModel={columnsModel} />\n </Box>\n ) : (\n <Box\n as=\"th\"\n width=\"100%\"\n bg=\"white\"\n p={0}\n boxShadow={BOTTOM_BORDER_SHADOW}\n />\n )}\n </Box>\n );\n },\n);\n\nfunction getStickyPosition(\n field: string,\n columnsModel: ColumnsModel,\n selectionWidth: number,\n addColumnStickyRight: boolean,\n): StickyPosition | undefined {\n const leftCss = columnsModel.getColumnStickyLeftCss(field, selectionWidth);\n if (leftCss !== undefined) {\n return {\n side: 'left',\n offsetCss: leftCss,\n isBoundary: columnsModel.isStickyLeftBoundary(field),\n };\n }\n\n const rightCss = columnsModel.getColumnStickyRightCss(field);\n if (rightCss !== undefined) {\n const addColOffset = addColumnStickyRight ? ADD_COLUMN_BUTTON_WIDTH : 0;\n return {\n side: 'right',\n offsetCss: adjustRightOffsetCss(rightCss, addColOffset),\n isBoundary: columnsModel.isStickyRightBoundary(field),\n };\n }\n\n return undefined;\n}\n","import { FC } from 'react';\nimport { Menu, Text } from '@chakra-ui/react';\nimport { LuCopy, LuTrash2 } from 'react-icons/lu';\nimport { PiCheckSquare } from 'react-icons/pi';\n\nexport interface RowActionMenuItemsProps {\n rowId: string;\n testIdPrefix: string;\n onSelect?: (rowId: string) => void;\n onDuplicate?: (rowId: string) => void;\n onDelete?: (rowId: string) => void;\n}\n\nexport const RowActionMenuItems: FC<RowActionMenuItemsProps> = ({\n rowId,\n testIdPrefix,\n onSelect,\n onDuplicate,\n onDelete,\n}) => {\n return (\n <>\n {onSelect && (\n <Menu.Item\n value=\"select\"\n onClick={() => onSelect(rowId)}\n data-testid={`${testIdPrefix}-select-${rowId}`}\n >\n <PiCheckSquare />\n <Text>Select</Text>\n </Menu.Item>\n )}\n {onDuplicate && (\n <Menu.Item\n value=\"duplicate\"\n onClick={() => onDuplicate(rowId)}\n data-testid={`${testIdPrefix}-duplicate-${rowId}`}\n >\n <LuCopy />\n <Text>Duplicate</Text>\n </Menu.Item>\n )}\n {onDelete && (\n <>\n {(onSelect || onDuplicate) && <Menu.Separator />}\n <Menu.Item\n value=\"delete\"\n onClick={() => onDelete(rowId)}\n data-testid={`${testIdPrefix}-delete-${rowId}`}\n >\n <LuTrash2 />\n <Text color=\"red.600\">Delete</Text>\n </Menu.Item>\n </>\n )}\n </>\n );\n};\n","import { FC, useState } from 'react';\nimport { Flex, Icon, Menu, Portal, Text } from '@chakra-ui/react';\nimport {\n PiDotsThreeVerticalBold,\n PiArrowSquareRightLight,\n} from 'react-icons/pi';\nimport { RowActionMenuItems } from './RowActionMenuItems.js';\n\ninterface RowActionOverlayProps {\n rowId: string;\n onOpen?: (rowId: string) => void;\n onSelect?: (rowId: string) => void;\n onDuplicate?: (rowId: string) => void;\n onDelete?: (rowId: string) => void;\n}\n\nexport const RowActionOverlay: FC<RowActionOverlayProps> = ({\n rowId,\n onOpen,\n onSelect,\n onDuplicate,\n onDelete,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n return (\n <Flex\n position=\"absolute\"\n right=\"8px\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n alignItems=\"center\"\n className=\"row-action-buttons\"\n data-menu-open={isMenuOpen || undefined}\n data-testid={`row-action-buttons-${rowId}`}\n >\n <Flex\n alignItems=\"center\"\n height=\"24px\"\n borderRadius=\"6px\"\n bg=\"white\"\n boxShadow=\"0px 2px 8px rgba(0,0,0,0.16)\"\n overflow=\"hidden\"\n data-testid={`row-action-split-${rowId}`}\n >\n {onOpen && (\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n width=\"28px\"\n minWidth=\"28px\"\n cursor=\"pointer\"\n _hover={{ bg: 'gray.100' }}\n onClick={(e) => {\n e.stopPropagation();\n onOpen(rowId);\n }}\n data-testid={`row-action-open-${rowId}`}\n >\n <Icon\n boxSize=\"20px\"\n color=\"gray.400\"\n as={PiArrowSquareRightLight}\n />\n </Flex>\n )}\n <Menu.Root\n lazyMount\n unmountOnExit\n onOpenChange={({ open }) => setIsMenuOpen(open)}\n positioning={{ placement: 'bottom-start' }}\n >\n <Menu.Trigger asChild>\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n width=\"18px\"\n minWidth=\"18px\"\n cursor=\"pointer\"\n borderLeft={onOpen ? '1px solid' : undefined}\n borderColor=\"gray.100\"\n _hover={{ bg: 'gray.100' }}\n onClick={(e) => e.stopPropagation()}\n data-testid={`row-action-trigger-${rowId}`}\n >\n <Icon\n as={PiDotsThreeVerticalBold}\n boxSize=\"16px\"\n color=\"gray.300\"\n />\n </Flex>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content\n minW=\"180px\"\n data-testid={`row-action-menu-${rowId}`}\n >\n {onOpen && (\n <Menu.Item\n value=\"open\"\n onClick={() => onOpen(rowId)}\n data-testid={`row-action-menu-open-${rowId}`}\n >\n <PiArrowSquareRightLight />\n <Text>Open</Text>\n </Menu.Item>\n )}\n {onOpen && (onSelect || onDuplicate || onDelete) && (\n <Menu.Separator />\n )}\n <RowActionMenuItems\n rowId={rowId}\n testIdPrefix=\"row-action\"\n onSelect={onSelect}\n onDuplicate={onDuplicate}\n onDelete={onDelete}\n />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n </Flex>\n </Flex>\n );\n};\n","import { FC } from 'react';\nimport { Box, Checkbox, Flex } from '@chakra-ui/react';\nimport { CELL_BORDER_COLOR } from './borderConstants.js';\n\ninterface SelectionCheckboxCellProps {\n rowId: string;\n isSelected: boolean;\n onToggleSelection: () => void;\n}\n\nexport const SelectionCheckboxCell: FC<SelectionCheckboxCellProps> = ({\n rowId,\n isSelected,\n onToggleSelection,\n}) => {\n return (\n <Box\n as=\"td\"\n width=\"40px\"\n minWidth=\"40px\"\n maxWidth=\"40px\"\n p={0}\n position=\"sticky\"\n left={0}\n zIndex={1}\n bg=\"white\"\n boxShadow={`inset 0 -1px 0 0 ${CELL_BORDER_COLOR}, inset -1px 0 0 0 ${CELL_BORDER_COLOR}`}\n >\n <Flex alignItems=\"center\" justifyContent=\"center\" height=\"100%\">\n <Checkbox.Root\n checked={isSelected}\n onCheckedChange={() => onToggleSelection()}\n size=\"sm\"\n data-testid={`select-${rowId}`}\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n </Checkbox.Root>\n </Flex>\n </Box>\n );\n};\n","import { observer } from 'mobx-react-lite';\nimport { Box } from '@chakra-ui/react';\nimport type { SystemStyleObject } from '@chakra-ui/react';\nimport type { RowVM } from '../model/RowVM.js';\nimport type { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\nimport type { SearchForeignKeySearchFn } from '../../../search-foreign-key/index.js';\nimport {\n CELL_BORDER_COLOR,\n BOTTOM_BORDER_SHADOW,\n buildAddColumnShadowCss,\n adjustRightOffsetCss,\n} from './borderConstants.js';\nimport { CellRenderer } from './Cell/CellRenderer.js';\nimport { RowActionOverlay } from './RowActionOverlay.js';\nimport { SelectionCheckboxCell } from './SelectionCheckboxCell.js';\n\nconst SELECTION_COLUMN_WIDTH = 40;\nconst ADD_COLUMN_BUTTON_WIDTH = 40;\n\ninterface DataRowProps {\n row: RowVM;\n columnsModel: ColumnsModel;\n showSelection: boolean;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n onUploadFile?: (params: {\n rowId: string;\n fileId: string;\n file: File;\n }) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n onOpenRow?: (rowId: string) => void;\n onSelectRow?: (rowId: string) => void;\n onDuplicateRow?: (rowId: string) => void;\n onDeleteRow?: (rowId: string) => void;\n}\n\nfunction buildShadowCss(side: 'left' | 'right'): SystemStyleObject {\n const cssVar =\n side === 'left'\n ? 'var(--shadow-left-opacity, 0)'\n : 'var(--shadow-right-opacity, 0)';\n return {\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: '8px',\n pointerEvents: 'none',\n transition: 'opacity 0.15s',\n opacity: cssVar,\n ...(side === 'left'\n ? {\n right: '-8px',\n boxShadow: 'inset 8px 0 12px -8px rgba(0,0,0,0.1)',\n }\n : {\n left: '-8px',\n boxShadow: 'inset -8px 0 12px -8px rgba(0,0,0,0.1)',\n }),\n },\n };\n}\n\nfunction buildCellCss(\n isBoundary: boolean,\n boundarySide: 'left' | 'right',\n hasRowActions: boolean,\n isFirstColumn: boolean,\n): SystemStyleObject | undefined {\n const needsHover = isFirstColumn && hasRowActions;\n const hoverCss: SystemStyleObject = needsHover\n ? {\n '& .row-action-buttons': {\n opacity: 0,\n },\n '&:hover .row-action-buttons, & .row-action-buttons[data-menu-open]': {\n opacity: 1,\n transition: 'opacity 0.15s ease',\n },\n }\n : {};\n\n if (isBoundary) {\n return {\n ...hoverCss,\n ...buildShadowCss(boundarySide),\n };\n }\n\n if (needsHover) {\n return hoverCss;\n }\n\n return undefined;\n}\n\ninterface StickyColumnProps {\n isSticky: boolean;\n isBoundary: boolean;\n boundarySide: 'left' | 'right';\n leftCss?: string;\n rightCss?: string;\n colWidth?: string;\n}\n\nfunction computeStickyProps(\n col: { field: string },\n columnsModel: ColumnsModel,\n selectionWidth: number,\n addColOffset: number,\n): StickyColumnProps {\n const leftCss = columnsModel.getColumnStickyLeftCss(\n col.field,\n selectionWidth,\n );\n const rightCss = columnsModel.getColumnStickyRightCss(col.field);\n const isStickyLeft = leftCss !== undefined;\n const isStickyRight = rightCss !== undefined;\n const isSticky = isStickyLeft || isStickyRight;\n const isLeftBoundary = columnsModel.isStickyLeftBoundary(col.field);\n const isRightBoundary = columnsModel.isStickyRightBoundary(col.field);\n\n const finalRightCss =\n isStickyRight && rightCss !== undefined\n ? adjustRightOffsetCss(rightCss, addColOffset)\n : rightCss;\n\n return {\n isSticky,\n isBoundary: isLeftBoundary || isRightBoundary,\n boundarySide: isStickyLeft ? 'left' : 'right',\n leftCss: isStickyLeft ? leftCss : undefined,\n rightCss: isStickyRight ? finalRightCss : undefined,\n colWidth: isSticky ? columnsModel.columnWidthCssVar(col.field) : undefined,\n };\n}\n\nfunction getCellBoxShadow(isSticky: boolean, side: 'left' | 'right'): string {\n if (!isSticky) {\n return BOTTOM_BORDER_SHADOW;\n }\n const stickyBorder =\n side === 'left'\n ? `inset -1px 0 0 0 ${CELL_BORDER_COLOR}`\n : `inset 1px 0 0 0 ${CELL_BORDER_COLOR}`;\n return `${BOTTOM_BORDER_SHADOW}, ${stickyBorder}`;\n}\n\nexport const DataRow = observer(\n ({\n row,\n columnsModel,\n showSelection,\n onSearchForeignKey,\n onUploadFile,\n onOpenFile,\n onOpenRow,\n onSelectRow,\n onDuplicateRow,\n onDeleteRow,\n }: DataRowProps) => {\n const hasRowActions = Boolean(\n onOpenRow || onSelectRow || onDuplicateRow || onDeleteRow,\n );\n\n const selectionWidth = showSelection ? SELECTION_COLUMN_WIDTH : 0;\n const addColumnStickyRight = columnsModel.hasHiddenColumns;\n const addColOffset = addColumnStickyRight ? ADD_COLUMN_BUTTON_WIDTH : 0;\n\n return (\n <>\n {showSelection && (\n <SelectionCheckboxCell\n rowId={row.rowId}\n isSelected={row.isSelected}\n onToggleSelection={() => row.toggleSelection()}\n />\n )}\n {columnsModel.visibleColumns.map((col, index) => {\n const cellVM = row.getCellVM(col);\n const isFirstColumn = index === 0;\n const showOverlay =\n isFirstColumn && hasRowActions && !cellVM.isEditing;\n\n const sticky = computeStickyProps(\n col,\n columnsModel,\n selectionWidth,\n addColOffset,\n );\n\n return (\n <Box\n as=\"td\"\n key={col.field}\n width={sticky.colWidth}\n minWidth={sticky.colWidth}\n maxWidth={sticky.isSticky ? sticky.colWidth : '0'}\n overflow={sticky.isBoundary ? 'visible' : 'hidden'}\n borderRight={sticky.isSticky ? undefined : '1px solid'}\n borderColor={sticky.isSticky ? undefined : CELL_BORDER_COLOR}\n p={0}\n position={sticky.isSticky ? 'sticky' : 'relative'}\n left={sticky.leftCss}\n right={sticky.rightCss}\n zIndex={sticky.isSticky ? 1 : undefined}\n bg={sticky.isSticky ? 'white' : undefined}\n boxShadow={getCellBoxShadow(sticky.isSticky, sticky.boundarySide)}\n css={buildCellCss(\n sticky.isBoundary,\n sticky.boundarySide,\n hasRowActions,\n isFirstColumn,\n )}\n >\n {sticky.isBoundary ? (\n <Box overflow=\"hidden\">\n <CellRenderer\n cell={cellVM}\n onSearchForeignKey={onSearchForeignKey}\n onUploadFile={onUploadFile}\n onOpenFile={onOpenFile}\n />\n </Box>\n ) : (\n <CellRenderer\n cell={cellVM}\n onSearchForeignKey={onSearchForeignKey}\n onUploadFile={onUploadFile}\n onOpenFile={onOpenFile}\n />\n )}\n {showOverlay && (\n <RowActionOverlay\n rowId={row.rowId}\n onOpen={onOpenRow}\n onSelect={onSelectRow}\n onDuplicate={onDuplicateRow}\n onDelete={onDeleteRow}\n />\n )}\n </Box>\n );\n })}\n {addColumnStickyRight ? (\n <Box\n as=\"td\"\n width=\"100%\"\n minWidth={`${ADD_COLUMN_BUTTON_WIDTH}px`}\n p={0}\n position=\"sticky\"\n right={0}\n zIndex={1}\n bg=\"white\"\n boxShadow={BOTTOM_BORDER_SHADOW}\n css={\n columnsModel.pinnedRightCount === 0\n ? buildAddColumnShadowCss()\n : undefined\n }\n />\n ) : (\n <Box as=\"td\" width=\"100%\" p={0} boxShadow={BOTTOM_BORDER_SHADOW} />\n )}\n </>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { ActionBar, Button, Portal } from '@chakra-ui/react';\nimport { LuCopy, LuTrash2 } from 'react-icons/lu';\nimport { PiCheckSquare, PiX } from 'react-icons/pi';\nimport type { SelectionModel } from '../model/SelectionModel.js';\n\ninterface SelectionToolbarProps {\n selection: SelectionModel;\n allRowIds: string[];\n onDuplicate?: (ids: string[]) => void;\n onDelete?: (ids: string[]) => void;\n}\n\nexport const SelectionToolbar = observer(\n ({ selection, allRowIds, onDuplicate, onDelete }: SelectionToolbarProps) => {\n const isAllSelected = selection.isAllSelected(allRowIds);\n\n return (\n <ActionBar.Root open={selection.isSelectionMode}>\n <Portal>\n <ActionBar.Positioner>\n <ActionBar.Content data-testid=\"selection-toolbar\">\n <ActionBar.SelectionTrigger>\n {selection.selectedCount} selected\n </ActionBar.SelectionTrigger>\n <ActionBar.Separator />\n {!isAllSelected && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => selection.selectAll(allRowIds)}\n data-testid=\"select-all\"\n >\n <PiCheckSquare />\n Select all\n </Button>\n )}\n {onDuplicate && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onDuplicate(selection.selectedIds)}\n data-testid=\"duplicate-selected\"\n >\n <LuCopy />\n Duplicate\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onDelete(selection.selectedIds)}\n data-testid=\"delete-selected\"\n >\n <LuTrash2 />\n Delete\n </Button>\n )}\n <ActionBar.CloseTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Exit selection\"\n onClick={() => selection.exitSelectionMode()}\n data-testid=\"exit-selection\"\n >\n <PiX />\n </Button>\n </ActionBar.CloseTrigger>\n </ActionBar.Content>\n </ActionBar.Positioner>\n </Portal>\n </ActionBar.Root>\n );\n },\n);\n","import { FC, useRef } from 'react';\nimport { Button, Flex, Portal, Text } from '@chakra-ui/react';\nimport {\n DialogBackdrop,\n DialogBody,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogPositioner,\n DialogRoot,\n DialogTitle,\n} from '@chakra-ui/react/dialog';\n\ninterface DeleteConfirmDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void;\n count?: number;\n}\n\nexport const DeleteConfirmDialog: FC<DeleteConfirmDialogProps> = ({\n isOpen,\n onClose,\n onConfirm,\n count,\n}) => {\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const message =\n count && count > 1\n ? `Are you sure you want to delete ${count} rows?`\n : 'Are you sure you want to delete this row?';\n\n return (\n <DialogRoot\n open={isOpen}\n onOpenChange={({ open }) => {\n if (!open) {\n onClose();\n }\n }}\n initialFocusEl={() => cancelRef.current}\n role=\"alertdialog\"\n >\n <Portal>\n <DialogBackdrop />\n <DialogPositioner>\n <DialogContent maxWidth=\"400px\" data-testid=\"delete-confirm-dialog\">\n <DialogHeader>\n <DialogTitle>Delete confirmation</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Text>{message}</Text>\n </DialogBody>\n <DialogFooter>\n <Flex gap={2}>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n size=\"sm\"\n onClick={onClose}\n data-testid=\"delete-cancel\"\n >\n Cancel\n </Button>\n <Button\n colorPalette=\"red\"\n size=\"sm\"\n onClick={onConfirm}\n data-testid=\"delete-confirm\"\n >\n Delete\n </Button>\n </Flex>\n </DialogFooter>\n </DialogContent>\n </DialogPositioner>\n </Portal>\n </DialogRoot>\n );\n};\n","import React from 'react';\n\ninterface TableProps {\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nexport const TableComponent: React.FC<TableProps> = ({\n style,\n children,\n ...props\n}) => (\n <table\n {...props}\n style={{\n ...style,\n width: 'max-content',\n minWidth: '100%',\n tableLayout: 'fixed',\n borderCollapse: 'separate',\n borderSpacing: 0,\n }}\n >\n {children}\n </table>\n);\n","import React from 'react';\nimport type { TableWidgetContext } from './TableWidget.js';\n\ninterface TableRowProps {\n 'data-index': number;\n context?: TableWidgetContext;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nexport const TableRowComponent: React.FC<TableRowProps> = ({\n 'data-index': index,\n context,\n style,\n children,\n ...props\n}) => {\n const row = context?.rows[index];\n\n return (\n <tr\n {...props}\n className=\"group\"\n data-testid={row ? `row-${row.rowId}` : undefined}\n style={{\n ...style,\n height: '40px',\n }}\n >\n {children}\n </tr>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface ShadowState {\n left: boolean;\n right: boolean;\n}\n\nconst INITIAL_SHADOW: ShadowState = { left: false, right: false };\n\nexport class ScrollShadowModel {\n private _left = false;\n private _right = false;\n private _paused = false;\n private _dirty = false;\n private _onChange: ((state: ShadowState) => void) | null = null;\n\n get showLeftShadow(): boolean {\n return this._left;\n }\n\n get showRightShadow(): boolean {\n return this._right;\n }\n\n setOnChange(cb: ((state: ShadowState) => void) | null): void {\n this._onChange = cb;\n }\n\n pause(): void {\n this._paused = true;\n this._dirty = false;\n }\n\n resume(): void {\n this._paused = false;\n if (this._dirty) {\n this._dirty = false;\n this._notify();\n }\n }\n\n update(left: boolean, right: boolean): void {\n if (this._left === left && this._right === right) {\n return;\n }\n this._left = left;\n this._right = right;\n if (this._paused) {\n this._dirty = true;\n return;\n }\n this._notify();\n }\n\n reset(): void {\n if (!this._left && !this._right) {\n return;\n }\n this._left = false;\n this._right = false;\n if (this._paused) {\n this._dirty = true;\n return;\n }\n this._notify();\n }\n\n private _notify(): void {\n if (this._onChange) {\n this._onChange({ left: this._left, right: this._right });\n }\n }\n}\n\ntype ScrollTarget = HTMLElement | Window;\n\nfunction getScrollElement(target: ScrollTarget): HTMLElement | null {\n if (target instanceof HTMLElement) {\n return target;\n }\n return document.scrollingElement as HTMLElement | null;\n}\n\nexport function useScrollShadow(): {\n shadowCssVars: Record<string, string>;\n shadowModel: ScrollShadowModel;\n setScrollerRef: (el: ScrollTarget | null) => void;\n} {\n const modelRef = useRef<ScrollShadowModel | null>(null);\n if (!modelRef.current) {\n modelRef.current = new ScrollShadowModel();\n }\n const model = modelRef.current;\n\n const [shadow, setShadow] = useState<ShadowState>(INITIAL_SHADOW);\n\n model.setOnChange(setShadow);\n\n useEffect(() => {\n return () => {\n model.setOnChange(null);\n };\n }, [model]);\n\n const shadowCssVars: Record<string, string> = {\n '--shadow-left-opacity': shadow.left ? '1' : '0',\n '--shadow-right-opacity': shadow.right ? '1' : '0',\n };\n\n const targetRef = useRef<ScrollTarget | null>(null);\n const rafRef = useRef<number>(0);\n const roRef = useRef<ResizeObserver | null>(null);\n\n const update = useCallback(() => {\n const target = targetRef.current;\n if (!target) {\n return;\n }\n const el = getScrollElement(target);\n if (!el) {\n return;\n }\n const scrollLeft = el.scrollLeft;\n const maxScroll = el.scrollWidth - el.clientWidth;\n model.update(scrollLeft > 0, maxScroll > 1 && scrollLeft < maxScroll - 1);\n }, [model]);\n\n const handleScroll = useCallback(() => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n rafRef.current = requestAnimationFrame(update);\n }, [update]);\n\n const setScrollerRef = useCallback(\n (el: ScrollTarget | null) => {\n const prev = targetRef.current;\n if (prev) {\n prev.removeEventListener('scroll', handleScroll);\n }\n if (roRef.current) {\n roRef.current.disconnect();\n roRef.current = null;\n }\n if (el) {\n targetRef.current = el;\n el.addEventListener('scroll', handleScroll, { passive: true });\n rafRef.current = requestAnimationFrame(update);\n\n const scrollEl = getScrollElement(el);\n if (scrollEl) {\n const ro = new ResizeObserver(handleScroll);\n const table = scrollEl.querySelector('table');\n if (table) {\n ro.observe(table);\n }\n roRef.current = ro;\n }\n } else {\n targetRef.current = null;\n model.reset();\n }\n },\n [handleScroll, update, model],\n );\n\n useEffect(() => {\n return () => {\n const prev = targetRef.current;\n if (prev) {\n prev.removeEventListener('scroll', handleScroll);\n }\n if (roRef.current) {\n roRef.current.disconnect();\n }\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [handleScroll]);\n\n return { shadowCssVars, shadowModel: model, setScrollerRef };\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box, Spinner, Text } from '@chakra-ui/react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { TableVirtuoso } from 'react-virtuoso';\nimport type { RowVM } from '../model/RowVM.js';\nimport type { CellFSM } from '../model/CellFSM.js';\nimport type { SelectionModel } from '../model/SelectionModel.js';\nimport type { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\nimport type { FilterModel } from '../../Filters/model/FilterModel.js';\nimport type { SortModel } from '../../Sortings/model/SortModel.js';\nimport type { SearchForeignKeySearchFn } from '../../../search-foreign-key/index.js';\nimport {\n copyRangeToClipboard,\n pasteRangeFromClipboard,\n getFocusedPosition,\n clearRange,\n} from '../model/clipboardOperations.js';\nimport { HeaderRow } from './HeaderRow.js';\nimport { DataRow } from './DataRow.js';\nimport { SelectionToolbar } from './SelectionToolbar.js';\nimport { DeleteConfirmDialog } from './DeleteConfirmDialog/DeleteConfirmDialog.js';\nimport type { CellContextActions } from './Cell/CellContextActionsContext.js';\nimport { CellContextActionsContext } from './Cell/CellContextActionsContext.js';\nimport { TableComponent } from './TableComponent.js';\nimport { TableRowComponent } from './TableRowComponent.js';\nimport { useScrollShadow } from './hooks/useScrollShadow.js';\n\ninterface DeleteConfirmState {\n rowId?: string;\n batchIds?: string[];\n}\n\nexport interface TableWidgetContext {\n rows: RowVM[];\n}\n\ninterface TableWidgetProps {\n rows: RowVM[];\n columnsModel: ColumnsModel;\n cellFSM?: CellFSM;\n selection: SelectionModel;\n sortModel?: SortModel;\n filterModel?: FilterModel;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n onUploadFile?: (params: {\n rowId: string;\n fileId: string;\n file: File;\n }) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n onOpenRow?: (rowId: string) => void;\n onDeleteSelected?: (ids: string[]) => void;\n onDuplicateSelected?: (ids: string[]) => void;\n onDeleteRow?: (rowId: string) => void;\n onDuplicateRow?: (rowId: string) => void;\n onCopyPath?: (path: string) => void;\n onEndReached?: () => void;\n isLoadingMore?: boolean;\n useWindowScroll?: boolean;\n}\n\nconst baseComponents = {\n Table: TableComponent,\n TableRow: TableRowComponent,\n};\n\nexport const TableWidget = observer(\n ({\n rows,\n columnsModel,\n cellFSM,\n selection,\n sortModel,\n filterModel,\n onSearchForeignKey,\n onUploadFile,\n onOpenFile,\n onOpenRow,\n onDeleteSelected,\n onDuplicateSelected,\n onDeleteRow,\n onDuplicateRow,\n onCopyPath,\n onEndReached,\n isLoadingMore,\n useWindowScroll: useWindowScrollProp,\n }: TableWidgetProps) => {\n const showSelection = selection.isSelectionMode;\n const allRowIds = rows.map((r) => r.rowId);\n const [deleteConfirm, setDeleteConfirm] =\n useState<DeleteConfirmState | null>(null);\n\n const { shadowCssVars, shadowModel, setScrollerRef } = useScrollShadow();\n\n const isResizing = columnsModel.isResizing;\n useEffect(() => {\n if (isResizing) {\n shadowModel.pause();\n } else {\n shadowModel.resume();\n }\n }, [isResizing, shadowModel]);\n\n const [wrapperEl, setWrapperEl] = useState<HTMLDivElement | null>(null);\n\n const wrapperRefCallback = useCallback(\n (el: HTMLDivElement | null) => {\n setWrapperEl(el);\n columnsModel.setWrapperElement(el);\n },\n [columnsModel],\n );\n\n useEffect(() => {\n if (!useWindowScrollProp || !wrapperEl) {\n return;\n }\n setScrollerRef(wrapperEl);\n return () => {\n setScrollerRef(null);\n };\n }, [useWindowScrollProp, wrapperEl, setScrollerRef]);\n\n const handleSelectRow = useCallback(\n (rowId: string) => {\n selection.enterSelectionMode(rowId);\n },\n [selection],\n );\n\n const handleDeleteRowRequest = useCallback((rowId: string) => {\n setDeleteConfirm({ rowId });\n }, []);\n\n const handleBatchDeleteRequest = useCallback((ids: string[]) => {\n setDeleteConfirm({ batchIds: ids });\n }, []);\n\n const handleDeleteConfirm = useCallback(() => {\n if (deleteConfirm?.rowId) {\n selection.deselect(deleteConfirm.rowId);\n if (onDeleteRow) {\n onDeleteRow(deleteConfirm.rowId);\n } else if (onDeleteSelected) {\n onDeleteSelected([deleteConfirm.rowId]);\n }\n } else if (deleteConfirm?.batchIds) {\n onDeleteSelected?.(deleteConfirm.batchIds);\n selection.exitSelectionMode();\n }\n setDeleteConfirm(null);\n }, [deleteConfirm, onDeleteRow, onDeleteSelected, selection]);\n\n const handleDeleteCancel = useCallback(() => {\n setDeleteConfirm(null);\n }, []);\n\n const deleteCount = deleteConfirm?.batchIds?.length;\n\n const canDeleteRow = Boolean(onDeleteRow || onDeleteSelected);\n const canDuplicateRow = Boolean(onDuplicateRow);\n const canSelect =\n canDeleteRow || canDuplicateRow || Boolean(onDuplicateSelected);\n\n const contextActions = useMemo(\n (): CellContextActions => ({\n copyRange: () => {\n const range = cellFSM?.getSelectedRange();\n const cols = columnsModel.visibleColumns;\n if (range) {\n void copyRangeToClipboard(range, rows, cols);\n }\n },\n pasteRange: () => {\n if (!cellFSM) {\n return;\n }\n const cols = columnsModel.visibleColumns;\n const range = cellFSM.getSelectedRange();\n const focusedPos = getFocusedPosition(cellFSM, cols, rows);\n if (range) {\n void pasteRangeFromClipboard(\n range.startRow,\n range.startCol,\n rows,\n cols,\n );\n } else if (focusedPos) {\n void pasteRangeFromClipboard(\n focusedPos.rowIndex,\n focusedPos.colIndex,\n rows,\n cols,\n );\n }\n },\n clearRange: () => {\n const range = cellFSM?.getSelectedRange();\n const cols = columnsModel.visibleColumns;\n if (range) {\n clearRange(range, rows, cols);\n }\n },\n }),\n [cellFSM, rows, columnsModel],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!cellFSM) {\n return;\n }\n\n const isMod = e.ctrlKey || e.metaKey;\n const cols = columnsModel.visibleColumns;\n\n if (isMod && e.key === 'v' && cellFSM.focusedCell) {\n const range = cellFSM.getSelectedRange();\n const focusedPos = getFocusedPosition(cellFSM, cols, rows);\n if (range) {\n e.preventDefault();\n void pasteRangeFromClipboard(\n range.startRow,\n range.startCol,\n rows,\n cols,\n );\n } else if (focusedPos) {\n e.preventDefault();\n void pasteRangeFromClipboard(\n focusedPos.rowIndex,\n focusedPos.colIndex,\n rows,\n cols,\n );\n }\n return;\n }\n\n if (!cellFSM.hasSelection) {\n return;\n }\n\n if (isMod && e.key === 'c') {\n const range = cellFSM.getSelectedRange();\n if (range) {\n e.preventDefault();\n void copyRangeToClipboard(range, rows, cols);\n }\n return;\n }\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n const range = cellFSM.getSelectedRange();\n if (range) {\n e.preventDefault();\n clearRange(range, rows, cols);\n }\n }\n },\n [cellFSM, rows, columnsModel],\n );\n\n const itemContent = useCallback(\n (_index: number, row: RowVM) => (\n <DataRow\n row={row}\n columnsModel={columnsModel}\n showSelection={showSelection}\n onSearchForeignKey={onSearchForeignKey}\n onUploadFile={onUploadFile}\n onOpenFile={onOpenFile}\n onOpenRow={onOpenRow}\n onSelectRow={canSelect ? handleSelectRow : undefined}\n onDuplicateRow={canDuplicateRow ? onDuplicateRow : undefined}\n onDeleteRow={canDeleteRow ? handleDeleteRowRequest : undefined}\n />\n ),\n [\n columnsModel,\n showSelection,\n onSearchForeignKey,\n onUploadFile,\n onOpenFile,\n onOpenRow,\n canSelect,\n canDeleteRow,\n canDuplicateRow,\n handleSelectRow,\n onDuplicateRow,\n handleDeleteRowRequest,\n ],\n );\n\n const fixedHeaderContent = useCallback(\n () => (\n <HeaderRow\n columnsModel={columnsModel}\n sortModel={sortModel}\n filterModel={filterModel}\n onCopyPath={onCopyPath}\n showSelection={showSelection}\n />\n ),\n [columnsModel, sortModel, filterModel, onCopyPath, showSelection],\n );\n\n const virtuosoContext = useMemo(\n (): TableWidgetContext => ({\n rows,\n }),\n [rows],\n );\n\n const totalColumns =\n columnsModel.visibleColumns.length + (showSelection ? 2 : 1);\n\n const LoadingMoreFooter = useCallback(\n () =>\n isLoadingMore ? (\n <tfoot>\n <tr>\n <td\n colSpan={totalColumns}\n style={{ textAlign: 'center', padding: '16px 0' }}\n >\n <Spinner size=\"sm\" color=\"gray.400\" />\n </td>\n </tr>\n </tfoot>\n ) : null,\n [isLoadingMore, totalColumns],\n );\n\n const tableComponents = useMemo(\n () => ({\n ...baseComponents,\n Footer: LoadingMoreFooter,\n }),\n [LoadingMoreFooter],\n );\n\n if (columnsModel.visibleColumns.length === 0) {\n return (\n <Box p={4}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n No columns to display.\n </Text>\n </Box>\n );\n }\n\n return (\n <CellContextActionsContext.Provider\n value={cellFSM ? contextActions : null}\n >\n <Box\n ref={wrapperRefCallback}\n position=\"relative\"\n height={useWindowScrollProp ? undefined : '100%'}\n overflowX=\"auto\"\n overflowY={useWindowScrollProp ? 'clip' : undefined}\n data-testid=\"table-widget\"\n onKeyDown={handleKeyDown}\n style={\n {\n ...columnsModel.columnWidthCssVars,\n ...shadowCssVars,\n } as React.CSSProperties\n }\n >\n {rows.length === 0 ? (\n <Box>\n <table\n style={{\n width: 'max-content',\n minWidth: '100%',\n tableLayout: 'fixed',\n borderCollapse: 'separate',\n borderSpacing: 0,\n }}\n >\n <thead>\n <HeaderRow\n columnsModel={columnsModel}\n sortModel={sortModel}\n filterModel={filterModel}\n onCopyPath={onCopyPath}\n showSelection={showSelection}\n />\n </thead>\n </table>\n <Box p={4}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n No rows to display.\n </Text>\n </Box>\n </Box>\n ) : (\n <TableVirtuoso\n useWindowScroll={useWindowScrollProp}\n style={useWindowScrollProp ? undefined : { height: '100%' }}\n data={rows}\n context={virtuosoContext}\n defaultItemHeight={40}\n initialItemCount={Math.min(rows.length, 20)}\n increaseViewportBy={40 * 50}\n endReached={onEndReached}\n fixedHeaderContent={fixedHeaderContent}\n itemContent={itemContent}\n components={tableComponents}\n scrollerRef={useWindowScrollProp ? undefined : setScrollerRef}\n />\n )}\n <SelectionToolbar\n selection={selection}\n allRowIds={allRowIds}\n onDuplicate={onDuplicateSelected}\n onDelete={onDeleteSelected ? handleBatchDeleteRequest : undefined}\n />\n </Box>\n <DeleteConfirmDialog\n isOpen={deleteConfirm !== null}\n onClose={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n count={deleteCount}\n />\n </CellContextActionsContext.Provider>\n );\n },\n);\n","import { FC, useState } from 'react';\nimport { Flex, Icon, Menu, Portal, Text } from '@chakra-ui/react';\nimport { LuCopy, LuTrash2 } from 'react-icons/lu';\nimport { PiCheckSquare, PiDotsThreeVerticalBold } from 'react-icons/pi';\n\ninterface RowActionsMenuProps {\n rowId: string;\n onSelect?: (rowId: string) => void;\n onDuplicate?: (rowId: string) => void;\n onDelete?: (rowId: string) => void;\n}\n\nexport const RowActionsMenu: FC<RowActionsMenuProps> = ({\n rowId,\n onSelect,\n onDuplicate,\n onDelete,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n\n const hasItems = Boolean(onSelect || onDuplicate || onDelete);\n if (!hasItems) {\n return null;\n }\n\n return (\n <Menu.Root\n lazyMount\n unmountOnExit\n onOpenChange={({ open }) => setIsOpen(open)}\n >\n <Menu.Trigger asChild>\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n cursor=\"pointer\"\n data-testid={`row-menu-trigger-${rowId}`}\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"24px\"\n width=\"24px\"\n borderRadius=\"4px\"\n bg=\"white\"\n boxShadow=\"0 0 0 1px rgba(0,0,0,0.06), 0 1px 1px rgba(0,0,0,0.08)\"\n opacity={isOpen ? 1 : 0}\n transition={isOpen ? 'opacity 1s ease 0s' : undefined}\n _groupHover={{\n opacity: 1,\n transition: 'opacity 0.15s ease 0s',\n }}\n _hover={{\n boxShadow:\n '0 0 0 1px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.1)',\n }}\n >\n <Icon size=\"sm\" color=\"gray.500\" as={PiDotsThreeVerticalBold} />\n </Flex>\n </Flex>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"160px\" data-testid={`row-menu-${rowId}`}>\n {onSelect && (\n <Menu.Item\n value=\"select\"\n onClick={() => onSelect(rowId)}\n data-testid={`row-menu-select-${rowId}`}\n >\n <PiCheckSquare />\n <Text>Select</Text>\n </Menu.Item>\n )}\n {onDuplicate && (\n <Menu.Item\n value=\"duplicate\"\n onClick={() => onDuplicate(rowId)}\n data-testid={`row-menu-duplicate-${rowId}`}\n >\n <LuCopy />\n <Text>Duplicate</Text>\n </Menu.Item>\n )}\n {onDelete && (\n <>\n {(onSelect || onDuplicate) && <Menu.Separator />}\n <Menu.Item\n value=\"delete\"\n onClick={() => onDelete(rowId)}\n data-testid={`row-menu-delete-${rowId}`}\n >\n <LuTrash2 />\n <Text color=\"red.600\">Delete</Text>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { makeAutoObservable } from 'mobx';\n\nexport class RowCountModel {\n private _totalCount = 0;\n private _baseTotalCount = 0;\n private _isFiltering = false;\n private _isRefetching = false;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get totalCount(): number {\n return this._totalCount;\n }\n\n get baseTotalCount(): number {\n return this._baseTotalCount;\n }\n\n get isFiltering(): boolean {\n return this._isFiltering;\n }\n\n get isRefetching(): boolean {\n return this._isRefetching;\n }\n\n get text(): string {\n if (this._isFiltering) {\n return `${this._totalCount} of ${this._baseTotalCount} ${this._baseTotalCount === 1 ? 'row' : 'rows'}`;\n }\n return `${this._totalCount} ${this._totalCount === 1 ? 'row' : 'rows'}`;\n }\n\n setTotalCount(count: number): void {\n this._totalCount = count;\n }\n\n setBaseTotalCount(count: number): void {\n this._baseTotalCount = count;\n }\n\n setIsFiltering(value: boolean): void {\n this._isFiltering = value;\n }\n\n setRefetching(value: boolean): void {\n this._isRefetching = value;\n }\n\n decrementBaseTotalCount(by: number = 1): void {\n this._baseTotalCount = Math.max(0, this._baseTotalCount - by);\n this._totalCount = Math.max(0, this._totalCount - by);\n }\n}\n","import { makeAutoObservable } from 'mobx';\n\nexport class ViewSettingsBadgeModel {\n private _snapshot: string | null = null;\n private _currentSnapshot: string | null = null;\n private _canSave = false;\n private _isPopoverOpen = false;\n private _onSave: (() => Promise<void>) | null = null;\n private _onRevert: (() => void) | null = null;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get hasChanges(): boolean {\n return this._snapshot !== this._currentSnapshot;\n }\n\n get isVisible(): boolean {\n return this.hasChanges;\n }\n\n get canSave(): boolean {\n return this._canSave;\n }\n\n get isPopoverOpen(): boolean {\n return this._isPopoverOpen;\n }\n\n saveSnapshot(state: unknown): void {\n const json = JSON.stringify(state);\n this._snapshot = json;\n this._currentSnapshot = json;\n }\n\n checkForChanges(state: unknown): void {\n this._currentSnapshot = JSON.stringify(state);\n }\n\n async save(): Promise<void> {\n if (this._onSave) {\n await this._onSave();\n }\n }\n\n revert(): void {\n if (this._onRevert) {\n this._onRevert();\n }\n this._currentSnapshot = this._snapshot;\n }\n\n setCanSave(value: boolean): void {\n this._canSave = value;\n }\n\n setPopoverOpen(value: boolean): void {\n this._isPopoverOpen = value;\n }\n\n setOnSave(cb: (() => Promise<void>) | null): void {\n this._onSave = cb;\n }\n\n setOnRevert(cb: (() => void) | null): void {\n this._onRevert = cb;\n }\n\n dispose(): void {\n this._onSave = null;\n this._onRevert = null;\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport { createTableModel } from '@revisium/schema-toolkit';\nimport { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\nimport type { ViewColumn } from '../../Columns/model/types.js';\nimport { FilterModel } from '../../Filters/model/FilterModel.js';\nimport { SearchModel } from '../../Search/model/SearchModel.js';\nimport { SortModel } from '../../Sortings/model/SortModel.js';\nimport { RowCountModel } from '../../Status/model/RowCountModel.js';\nimport { ViewSettingsBadgeModel } from '../../Status/model/ViewSettingsBadgeModel.js';\nimport { CellFSM } from '../../Table/model/CellFSM.js';\nimport { RowVM } from '../../Table/model/RowVM.js';\nimport { SelectionModel } from '../../Table/model/SelectionModel.js';\nimport type { SearchForeignKeySearchFn } from '../../../search-foreign-key/vm/SearchForeignKeyVM.js';\nimport type {\n ITableDataSource,\n RowDataItem,\n TableQuery,\n} from './ITableDataSource.js';\nimport { SchemaContext, stripDataFieldPrefix } from './SchemaContext.js';\n\nexport interface ViewState {\n columns: ViewColumn[];\n filters: string | null;\n sorts: Array<{ field: string; direction: string }>;\n search: string;\n}\n\nexport interface TableEditorBreadcrumb {\n label: string;\n dataTestId?: string;\n}\n\nexport interface UploadFileParams {\n rowId: string;\n fileId: string;\n file: File;\n}\n\nexport interface TableEditorCallbacks {\n onBreadcrumbClick?: (segment: TableEditorBreadcrumb, index: number) => void;\n onCreateRow?: () => void;\n onOpenRow?: (rowId: string) => void;\n onDuplicateRow?: (rowId: string) => void;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n onCopyPath?: (path: string) => void;\n onUploadFile?: (\n params: UploadFileParams,\n ) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n onReadonlyEditAttempt?: () => void;\n}\n\nexport interface TableEditorOptions {\n tableId: string;\n pageSize?: number;\n breadcrumbs?: TableEditorBreadcrumb[];\n callbacks?: TableEditorCallbacks;\n}\n\nconst DEFAULT_PAGE_SIZE = 50;\n\nexport class TableEditorCore {\n public readonly columns: ColumnsModel;\n public readonly filters: FilterModel;\n public readonly sorts: SortModel;\n public readonly search: SearchModel;\n public readonly viewBadge: ViewSettingsBadgeModel;\n public readonly cellFSM: CellFSM;\n public readonly selection: SelectionModel;\n public readonly rowCount: RowCountModel;\n\n private readonly _dataSource: ITableDataSource;\n private readonly _pageSize: number;\n private readonly _breadcrumbs: TableEditorBreadcrumb[];\n private readonly _callbacks: TableEditorCallbacks;\n\n private readonly _tableId: string;\n private readonly _schemaContext = new SchemaContext();\n private _readonly = false;\n private _rows: RowVM[] = [];\n private _isBootstrapping = true;\n private _isLoadingMore = false;\n private _hasNextPage = false;\n private _endCursor: string | null = null;\n private _savedViewState: ViewState | null = null;\n\n constructor(dataSource: ITableDataSource, options: TableEditorOptions) {\n this._dataSource = dataSource;\n this._tableId = options.tableId;\n this._pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;\n this._breadcrumbs = options.breadcrumbs ?? [];\n this._callbacks = options.callbacks ?? {};\n\n this.columns = new ColumnsModel();\n this.filters = new FilterModel();\n this.sorts = new SortModel();\n this.search = new SearchModel((query) => this._handleSearch(query));\n this.viewBadge = new ViewSettingsBadgeModel();\n this.cellFSM = new CellFSM();\n this.selection = new SelectionModel();\n this.rowCount = new RowCountModel();\n\n this.columns.setOnChange(() => this._handleColumnsChange());\n this.filters.setOnChange(() => this._handleFilterChange());\n this.filters.setOnApply((_where) => this._handleFilterApply());\n this.sorts.setOnChange(() => this._handleSortChange());\n this.sorts.setOnApply((_sorts) => this._handleSortApply());\n this.viewBadge.setOnSave(() => this._handleViewSave());\n this.viewBadge.setOnRevert(() => this._handleViewRevert());\n this.cellFSM.setOnReadonlyEditAttempt(\n this._callbacks.onReadonlyEditAttempt ?? null,\n );\n\n makeAutoObservable(this, {}, { autoBind: true });\n\n queueMicrotask(() => void this._bootstrap());\n }\n\n get rows(): RowVM[] {\n return this._rows;\n }\n\n get isBootstrapping(): boolean {\n return this._isBootstrapping;\n }\n\n get isLoadingMore(): boolean {\n return this._isLoadingMore;\n }\n\n get readonly(): boolean {\n return this._readonly;\n }\n\n get tableId(): string {\n return this._tableId;\n }\n\n get breadcrumbs(): TableEditorBreadcrumb[] {\n return this._breadcrumbs;\n }\n\n get callbacks(): TableEditorCallbacks {\n return this._callbacks;\n }\n\n getViewState(): ViewState {\n return {\n columns: this.columns.serializeToViewColumns(),\n filters: null,\n sorts: this.sorts.serializeToViewSorts(),\n search: '',\n };\n }\n\n applyViewState(state: ViewState): void {\n this.columns.applyViewColumns(state.columns);\n this.sorts.applyViewSorts(state.sorts);\n }\n\n async loadMore(): Promise<void> {\n if (!this._hasNextPage || this._isLoadingMore) {\n return;\n }\n this._isLoadingMore = true;\n try {\n const query = this._buildQuery(this._endCursor);\n const result = await this._dataSource.fetchRows(query);\n runInAction(() => {\n this._appendRowVMs(result.rows);\n this._endCursor = result.endCursor;\n this._hasNextPage = result.hasNextPage;\n this._isLoadingMore = false;\n });\n } catch {\n runInAction(() => {\n this._isLoadingMore = false;\n });\n }\n }\n\n async deleteRows(rowIds: string[]): Promise<void> {\n const result = await this._dataSource.deleteRows(rowIds);\n if (result.ok) {\n runInAction(() => {\n const idSet = new Set(rowIds);\n this._rows = this._rows.filter((r) => !idSet.has(r.rowId));\n this.rowCount.decrementBaseTotalCount(rowIds.length);\n this.selection.exitSelectionMode();\n this._updateNavigationContext();\n });\n }\n }\n\n dispose(): void {\n this.columns.dispose();\n this.filters.dispose();\n this.sorts.dispose();\n this.search.dispose();\n this.viewBadge.dispose();\n this.selection.exitSelectionMode();\n this.cellFSM.blur();\n for (const row of this._rows) {\n row.dispose();\n }\n }\n\n private async _bootstrap(): Promise<void> {\n try {\n const meta = await this._dataSource.fetchMetadata();\n runInAction(() => {\n this._schemaContext.init(meta.dataSchema, meta.refSchemas);\n this._readonly = meta.readonly;\n this.viewBadge.setCanSave(!meta.readonly);\n });\n\n this.columns.init(this._schemaContext.allColumns);\n this.sorts.init(this._schemaContext.sortableFields);\n this.filters.init(this._schemaContext.filterableFields);\n\n if (meta.viewState) {\n this.applyViewState(meta.viewState);\n }\n this._saveViewSnapshot();\n\n await this._loadRows();\n\n runInAction(() => {\n this._isBootstrapping = false;\n });\n } catch {\n runInAction(() => {\n this._isBootstrapping = false;\n });\n }\n }\n\n private _buildQuery(after: string | null = null): TableQuery {\n return {\n where: this.filters.hasActiveFilters\n ? this.filters.buildCurrentWhereClause()\n : null,\n orderBy: this.sorts.serializeToViewSorts().map((s) => ({\n field: stripDataFieldPrefix(s.field),\n direction: s.direction,\n })),\n search: this.search.debouncedQuery,\n first: this._pageSize,\n after,\n };\n }\n\n private async _loadRows(): Promise<void> {\n const query = this._buildQuery();\n const result = await this._dataSource.fetchRows(query);\n runInAction(() => {\n this._replaceRowVMs(result.rows);\n this._endCursor = result.endCursor;\n this._hasNextPage = result.hasNextPage;\n this.rowCount.setTotalCount(result.totalCount);\n this.rowCount.setBaseTotalCount(result.totalCount);\n this.rowCount.setIsFiltering(\n this.filters.hasActiveFilters || this.search.hasActiveSearch,\n );\n this._updateNavigationContext();\n });\n }\n\n private async _reloadRows(): Promise<void> {\n if (this._isBootstrapping) {\n return;\n }\n this.selection.exitSelectionMode();\n this.cellFSM.blur();\n await this._loadRows();\n }\n\n private _replaceRowVMs(rawRows: RowDataItem[]): void {\n for (const row of this._rows) {\n row.dispose();\n }\n this._rows = this._createRowVMs(rawRows);\n }\n\n private _appendRowVMs(rawRows: RowDataItem[]): void {\n const newVMs = this._createRowVMs(rawRows);\n this._rows = [...this._rows, ...newVMs];\n this._updateNavigationContext();\n }\n\n private _createRowVMs(rawRows: RowDataItem[]): RowVM[] {\n const wrappedSchema = this._schemaContext.wrappedDataSchema;\n if (!wrappedSchema) {\n return [];\n }\n const tableModel = createTableModel({\n tableId: this._tableId,\n schema: wrappedSchema,\n rows: rawRows.map((r) => ({ rowId: r.rowId, data: { data: r.data } })),\n refSchemas: this._schemaContext.fullRefSchemas,\n });\n const systemValuesMap = new Map<string, Record<string, unknown>>();\n for (const raw of rawRows) {\n systemValuesMap.set(raw.rowId, this._buildSystemValues(raw));\n }\n return tableModel.rows.map(\n (rowModel) =>\n new RowVM(\n rowModel,\n rowModel.rowId,\n this.cellFSM,\n this.selection,\n (rowId, field, value, previousValue) =>\n this._commitCell(rowId, field, value, previousValue),\n systemValuesMap.get(rowModel.rowId),\n ),\n );\n }\n\n private _buildSystemValues(rawRow: RowDataItem): Record<string, unknown> {\n return {\n ...rawRow.systemFields,\n id: rawRow.rowId,\n };\n }\n\n private _toPatchField(field: string): string {\n return stripDataFieldPrefix(field);\n }\n\n private async _commitCell(\n rowId: string,\n field: string,\n value: unknown,\n previousValue?: unknown,\n ): Promise<void> {\n const patchField = this._toPatchField(field);\n const results = await this._dataSource.patchCells([\n { rowId, field: patchField, value },\n ]);\n const result = results[0];\n if (result && !result.ok) {\n runInAction(() => {\n const row = this._rows.find((r) => r.rowId === rowId);\n if (row && previousValue !== undefined) {\n const node = row.rowModel.get(field);\n if (node?.isPrimitive()) {\n node.setValue(previousValue);\n } else if (node?.isObject()) {\n node.setValue(previousValue as Record<string, unknown>, {\n internal: true,\n });\n }\n }\n });\n }\n }\n\n private _updateNavigationContext(): void {\n this.cellFSM.setNavigationContext(\n this.columns.visibleColumns.map((c) => c.field),\n this._rows.map((r) => r.rowId),\n );\n }\n\n private _handleColumnsChange(): void {\n this.cellFSM.updateNavigationContext(\n this.columns.visibleColumns.map((c) => c.field),\n this.cellFSM.rowIds,\n );\n this._checkViewChanges();\n }\n\n private _handleFilterChange(): void {\n // filters are ephemeral — not persisted in view settings\n }\n\n private _handleFilterApply(): void {\n void this._reloadRows();\n }\n\n private _handleSortChange(): void {\n this._checkViewChanges();\n }\n\n private _handleSortApply(): void {\n void this._reloadRows();\n this._checkViewChanges();\n }\n\n private _handleSearch(_query: string): void {\n void this._reloadRows();\n }\n\n private async _handleViewSave(): Promise<void> {\n try {\n const viewState = this.getViewState();\n const result = await this._dataSource.saveView(viewState);\n if (result.ok) {\n this._saveViewSnapshot();\n }\n } catch {\n // network/data-source error — badge stays visible\n }\n }\n\n private _handleViewRevert(): void {\n if (this._savedViewState) {\n this.applyViewState(this._savedViewState);\n void this._reloadRows();\n }\n }\n\n private _saveViewSnapshot(): void {\n const viewState = this.getViewState();\n this._savedViewState = viewState;\n this.viewBadge.saveSnapshot(viewState);\n }\n\n private _checkViewChanges(): void {\n this.viewBadge.checkForChanges(this.getViewState());\n }\n}\n","import type { JsonSchema, RefSchemas } from '@revisium/schema-toolkit';\nimport type {\n CellPatch,\n CellPatchResult,\n DeleteRowsResult,\n FetchRowsResult,\n ITableDataSource,\n RowDataItem,\n SystemFields,\n TableMetadata,\n TableQuery,\n} from './ITableDataSource.js';\nimport type { ViewState } from './TableEditorCore.js';\n\ninterface MockDataSourceParams {\n dataSchema: JsonSchema;\n rows: RowDataItem[];\n viewState?: ViewState | null;\n readonly?: boolean;\n failPatches?: Set<string>;\n refSchemas?: RefSchemas;\n}\n\nexport class MockDataSource implements ITableDataSource {\n private _allRows: RowDataItem[];\n private readonly _dataSchema: JsonSchema;\n private readonly _viewState: ViewState | null;\n private readonly _readonly: boolean;\n private readonly _failPatches: Set<string>;\n private readonly _refSchemas: RefSchemas | undefined;\n\n readonly fetchMetadataLog: Array<true> = [];\n readonly fetchLog: TableQuery[] = [];\n readonly patchLog: CellPatch[][] = [];\n readonly deleteLog: string[][] = [];\n readonly saveViewLog: ViewState[] = [];\n\n constructor(params: MockDataSourceParams) {\n this._dataSchema = params.dataSchema;\n this._allRows = [...params.rows];\n this._viewState = params.viewState ?? null;\n this._readonly = params.readonly ?? false;\n this._failPatches = params.failPatches ?? new Set();\n this._refSchemas = params.refSchemas;\n }\n\n static createRow(\n rowId: string,\n data: unknown,\n systemFields?: SystemFields,\n ): RowDataItem {\n const clonedData =\n data && typeof data === 'object' && !Array.isArray(data)\n ? { ...(data as Record<string, unknown>) }\n : data;\n const row: RowDataItem = { rowId, data: clonedData };\n if (systemFields) {\n row.systemFields = systemFields;\n }\n return row;\n }\n\n fetchMetadata(): Promise<TableMetadata> {\n this.fetchMetadataLog.push(true);\n return Promise.resolve({\n dataSchema: this._dataSchema,\n viewState: this._viewState,\n readonly: this._readonly,\n refSchemas: this._refSchemas,\n });\n }\n\n fetchRows(query: TableQuery): Promise<FetchRowsResult> {\n this.fetchLog.push(query);\n\n let rows = [...this._allRows];\n\n if (query.search) {\n const lower = query.search.toLowerCase();\n rows = rows.filter((row) => {\n const data = row.data;\n if (data && typeof data === 'object') {\n return Object.values(data).some(\n (val) =>\n typeof val === 'string' && val.toLowerCase().includes(lower),\n );\n }\n if (typeof data === 'string') {\n return data.toLowerCase().includes(lower);\n }\n return false;\n });\n }\n\n if (query.orderBy.length > 0) {\n const firstOrder = query.orderBy[0];\n if (firstOrder) {\n const field = firstOrder.field;\n const dir = firstOrder.direction === 'desc' ? -1 : 1;\n rows.sort((a, b) => {\n const aData = a.data as Record<string, unknown> | null;\n const bData = b.data as Record<string, unknown> | null;\n const aVal = aData?.[field];\n const bVal = bData?.[field];\n if (aVal === bVal) {\n return 0;\n }\n if (aVal == null) {\n return 1;\n }\n if (bVal == null) {\n return -1;\n }\n return aVal < bVal ? -dir : dir;\n });\n }\n }\n\n const totalCount = rows.length;\n\n let startIndex = 0;\n if (query.after) {\n const cursorIndex = rows.findIndex((r) => r.rowId === query.after);\n if (cursorIndex >= 0) {\n startIndex = cursorIndex + 1;\n }\n }\n\n const page = rows.slice(startIndex, startIndex + query.first);\n const hasNextPage = startIndex + query.first < rows.length;\n const lastRow = page.at(-1);\n const endCursor = lastRow ? lastRow.rowId : null;\n\n return Promise.resolve({ rows: page, totalCount, hasNextPage, endCursor });\n }\n\n patchCells(patches: CellPatch[]): Promise<CellPatchResult[]> {\n this.patchLog.push(patches);\n\n const results = patches.map((patch) => {\n const key = `${patch.rowId}/${patch.field}`;\n if (this._failPatches.has(key)) {\n return {\n rowId: patch.rowId,\n field: patch.field,\n ok: false as const,\n error: 'Mock failure',\n };\n }\n\n const row = this._allRows.find((r) => r.rowId === patch.rowId);\n if (\n row?.data &&\n typeof row.data === 'object' &&\n !Array.isArray(row.data)\n ) {\n (row.data as Record<string, unknown>)[patch.field] = patch.value;\n }\n\n return { rowId: patch.rowId, field: patch.field, ok: true as const };\n });\n\n return Promise.resolve(results);\n }\n\n deleteRows(rowIds: string[]): Promise<DeleteRowsResult> {\n this.deleteLog.push(rowIds);\n this._allRows = this._allRows.filter((r) => !rowIds.includes(r.rowId));\n return Promise.resolve({ ok: true });\n }\n\n saveView(viewState: ViewState): Promise<{ ok: boolean }> {\n this.saveViewLog.push(viewState);\n return Promise.resolve({ ok: true });\n }\n}\n","import { observer } from 'mobx-react-lite';\nimport { Flex, Spinner, Text } from '@chakra-ui/react';\nimport type { RowCountModel } from '../model/RowCountModel.js';\n\ninterface RowCountWidgetProps {\n model: RowCountModel;\n}\n\nexport const RowCountWidget = observer(({ model }: RowCountWidgetProps) => {\n return (\n <Flex alignItems=\"center\" gap={2}>\n <Text fontSize=\"sm\" color=\"gray.500\" data-testid=\"row-count-text\">\n {model.text}\n </Text>\n {model.isRefetching && (\n <Spinner size=\"xs\" color=\"gray.400\" data-testid=\"row-count-spinner\" />\n )}\n </Flex>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport {\n Badge,\n Box,\n Button,\n HStack,\n Popover,\n Portal,\n Text,\n} from '@chakra-ui/react';\nimport { LuInfo } from 'react-icons/lu';\nimport type { ViewSettingsBadgeModel } from '../model/ViewSettingsBadgeModel.js';\n\ninterface ViewSettingsBadgeProps {\n model: ViewSettingsBadgeModel;\n}\n\nexport const ViewSettingsBadge = observer(\n ({ model }: ViewSettingsBadgeProps) => {\n if (!model.isVisible) {\n return null;\n }\n\n const badgeColor = model.canSave ? 'orange' : 'gray';\n const dotColor = model.canSave ? 'orange.500' : 'gray.400';\n const badgeLabel = model.canSave ? 'unsaved' : 'local';\n const title = model.canSave\n ? 'Unsaved view settings'\n : 'Local view changes';\n const description = model.canSave\n ? 'Column order, widths, and sort settings will be saved to the Default view and shared with everyone.'\n : 'View settings can only be saved in draft revisions. These changes are temporary and will be lost when you leave.';\n const revertLabel = model.canSave ? 'Revert' : 'Reset';\n\n return (\n <Popover.Root\n open={model.isPopoverOpen}\n onOpenChange={(e) => model.setPopoverOpen(e.open)}\n lazyMount\n unmountOnExit\n >\n <Popover.Trigger asChild>\n <Badge\n variant=\"subtle\"\n size=\"sm\"\n colorPalette={badgeColor}\n cursor=\"pointer\"\n display=\"flex\"\n alignItems=\"center\"\n gap={1}\n _hover={{ opacity: 0.8 }}\n data-testid=\"view-settings-badge\"\n >\n <Box width=\"6px\" height=\"6px\" borderRadius=\"full\" bg={dotColor} />\n {badgeLabel}\n </Badge>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content p={3} maxW=\"300px\">\n <HStack mb={2}>\n <Box color=\"gray.400\">\n <LuInfo size={16} />\n </Box>\n <Text fontWeight=\"semibold\" fontSize=\"sm\">\n {title}\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={3}>\n {description}\n </Text>\n <HStack>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => {\n model.revert();\n model.setPopoverOpen(false);\n }}\n data-testid=\"view-settings-revert\"\n >\n {revertLabel}\n </Button>\n {model.canSave && (\n <Button\n colorPalette=\"blue\"\n size=\"xs\"\n onClick={() => {\n void model.save();\n model.setPopoverOpen(false);\n }}\n data-testid=\"view-settings-save\"\n >\n Save\n </Button>\n )}\n </HStack>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n },\n);\n","import { FC } from 'react';\nimport { Box, Flex, Spinner } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { Breadcrumbs } from '../../../components/Breadcrumbs/Breadcrumbs.js';\nimport { PlusButton } from '../../../components/PlusButton/index.js';\nimport { FilterWidget } from '../../Filters/ui/FilterWidget.js';\nimport { SearchWidget } from '../../Search/ui/SearchWidget.js';\nimport { SortingsWidget } from '../../Sortings/ui/SortingsWidget.js';\nimport { RowCountWidget } from '../../Status/ui/RowCountWidget.js';\nimport { ViewSettingsBadge } from '../../Status/ui/ViewSettingsBadge.js';\nimport { TableWidget } from '../../Table/ui/TableWidget.js';\nimport type { TableEditorCore } from '../model/TableEditorCore.js';\n\nconst noop = () => {};\n\nexport interface TableEditorProps {\n viewModel: TableEditorCore;\n useWindowScroll?: boolean;\n}\n\nexport const TableEditor: FC<TableEditorProps> = observer(\n ({ viewModel, useWindowScroll }) => {\n if (viewModel.isBootstrapping) {\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n >\n <Spinner />\n </Box>\n );\n }\n\n const isReadonly = viewModel.readonly;\n const { breadcrumbs, callbacks } = viewModel;\n\n return (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n height={useWindowScroll ? undefined : '100%'}\n flex={useWindowScroll ? 1 : undefined}\n >\n <Flex\n px={3}\n pt=\"32px\"\n pb=\"48px\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n {...(useWindowScroll && {\n position: 'sticky' as const,\n top: 0,\n zIndex: 3,\n bg: 'white',\n })}\n >\n {breadcrumbs.length > 0 && (\n <Breadcrumbs\n segments={breadcrumbs}\n highlightLast={false}\n onSegmentClick={callbacks.onBreadcrumbClick}\n action={\n !isReadonly && callbacks.onCreateRow ? (\n <PlusButton\n tooltip=\"New row\"\n onClick={callbacks.onCreateRow}\n dataTestId=\"create-row-button\"\n />\n ) : undefined\n }\n />\n )}\n <Flex alignItems=\"center\" gap=\"8px\">\n <SearchWidget model={viewModel.search} />\n <FilterWidget\n model={viewModel.filters}\n availableFields={viewModel.columns.filterableFields}\n />\n <SortingsWidget\n model={viewModel.sorts}\n availableFields={viewModel.columns.sortableFields}\n onChange={noop}\n />\n </Flex>\n </Flex>\n\n <Box flex={1} minHeight={0}>\n <TableWidget\n rows={viewModel.rows}\n columnsModel={viewModel.columns}\n cellFSM={viewModel.cellFSM}\n selection={viewModel.selection}\n sortModel={viewModel.sorts}\n filterModel={viewModel.filters}\n isLoadingMore={viewModel.isLoadingMore}\n onEndReached={viewModel.loadMore}\n onOpenRow={callbacks.onOpenRow}\n onDeleteRow={\n isReadonly ? undefined : (id) => viewModel.deleteRows([id])\n }\n onDuplicateRow={isReadonly ? undefined : callbacks.onDuplicateRow}\n onDeleteSelected={\n isReadonly ? undefined : (ids) => viewModel.deleteRows(ids)\n }\n onSearchForeignKey={callbacks.onSearchForeignKey}\n onUploadFile={isReadonly ? undefined : callbacks.onUploadFile}\n onOpenFile={callbacks.onOpenFile}\n onCopyPath={callbacks.onCopyPath}\n useWindowScroll={useWindowScroll}\n />\n </Box>\n\n <Flex\n px={3}\n py={2}\n justifyContent=\"space-between\"\n {...(useWindowScroll && {\n position: 'sticky' as const,\n bottom: 0,\n bg: 'white',\n zIndex: 3,\n })}\n >\n <RowCountWidget model={viewModel.rowCount} />\n <ViewSettingsBadge model={viewModel.viewBadge} />\n </Flex>\n </Box>\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["observable","SystemSchemaIds","SystemSchemaIds","SystemSchemaIds","fileSchema","rowIdSchema","rowCreatedIdSchema","rowVersionIdSchema","rowCreatedAtSchema","rowPublishedAtSchema","rowUpdatedAtSchema","rowHashSchema","rowSchemaHashSchema","FIELD_NAME_ERROR_MESSAGE","React","ChakraTooltip","Portal","PiTreeViewThin","PiBracketsCurlyThin","PiLinkThin","Menu","Button","Icon","PiCaretDownLight","Portal","IconButton","PiCopy","Flex","Box","CodeMirror","EditorView","githubLight","Text","Flex","Box","Text","Box","Text","Breadcrumb","Text","Flex","Breadcrumb","Fragment","Text","Button","Flex","Box","Text","PiPlusBold","Button","Icon","PiX","Button","Icon","PiCaretLeft","IconButton","PiGear","IconButton","PiPlus","Flex","Box","PiDotOutlineFill","IconButton","MdOutlineChevronRight","Menu","Box","LuChevronRight","Portal","Fragment","Flex","Icon","PiDotsSixVerticalBold","Box","PiWarningCircle","Flex","Text","Box","Flex","Box","PiWarning","PiFunction","PiTextT","Menu","PiTextT","Box","PiCaretRight","Portal","Textarea","Textarea","Box","Menu","PiFunction","PiCaretRight","Portal","Menu","PiEquals","Box","PiCaretRight","Portal","Input","Menu","Portal","Box","PiTrash","Flex","Box","Flex","Text","Flex","Box","Flex","Text","Box","Flex","Text","Flex","Box","PiDotOutlineFill","Text","Box","Text","Box","Box","DialogRoot","Portal","DialogBackdrop","DialogPositioner","DialogContent","DialogHeader","DialogTitle","DialogBody","DialogFooter","Flex","DialogCloseTrigger","Flex","Button","PiPlusLight","PiMinusLight","PiArrowsLeftRightLight","PiPencilSimpleLight","Flex","Icon","Text","Badge","PiPencilSimpleLight","Flex","Text","Box","Badge","VStack","Flex","Text","Badge","Icon","PiArrowRight","Flex","Text","Icon","PiArrowRight","Box","Box","Flex","Icon","PiArrowsLeftRightLight","Text","Box","Flex","Icon","PiWarningCircle","Text","Badge","Popover","Button","Icon","PiArrowCounterClockwiseBold","Text","Flex","VStack","Box","Text","VStack","SegmentGroup","Box","Text","Flex","VStack","SegmentGroup","Box","Flex","Box","Button","observable","SystemSchemaIds","observable","Flex","Box","Flex","PiDotOutlineFill","Box","MdOutlineChevronRight","Box","Flex","PiFunctionLight","Text","Text","Menu","Flex","Icon","PiDotsThreeVerticalBold","Portal","LuChevronRight","Fragment","Box","Flex","Box","Popover","Box","Portal","Box","Flex","IconButton","PiArrowSquareUpRightThin","PiInfo","Flex","Text","IconButton","PiXBold","Box","Input","IconButton","PiXBold","Box","Box","Flex","Text","HStack","Button","PiMagnifyingGlassBold","PiPlusBold","Flex","Spinner","Text","Flex","IconButton","PiFile","HoverCard","Portal","Image","Flex","PiInfo","Box","IconButton","PiUploadThin","Box","Textarea","Virtuoso","Fragment","VStack","SystemSchemaIds","SystemSchemaIds","fileSchema","rowIdSchema","rowCreatedAtSchema","rowCreatedIdSchema","rowVersionIdSchema","rowPublishedAtSchema","rowUpdatedAtSchema","rowHashSchema","rowSchemaHashSchema","SchemaParser","SystemSchemaIds","observable","PiFile","PiCalendar","Menu","Box","Text","Menu","Box","Text","PiCaretDownLight","Menu","Box","Text","PiCaretDownLight","Input","Menu","Box","Text","PiCaretDownLight","Menu","Box","Text","PiCaretDownLight","Box","IconButton","LuX","Menu","Box","LuChevronDown","VStack","Box","Text","Button","LuPlus","Popover","IconButton","LuCode","Portal","Box","CodeMirror","EditorView","githubLight","Popover","Box","IconButton","LuFilter","Portal","Text","Button","LuPlus","IconButton","PiMagnifyingGlass","Box","Input","PiXBold","Menu","Box","Text","PiCaretDownLight","PiArrowUpLight","PiArrowDownLight","Menu","Box","Text","PiCaretDownLight","Box","Text","IconButton","LuX","Popover","Box","IconButton","LuArrowUpDown","Portal","Text","Button","LuPlus","observable","observable","comparer","Portal","Textarea","Portal","Menu","Box","Kbd","Menu","Box","Text","Box","Text","Box","Text","Popover","Portal","Box","Text","Popover","Portal","Box","HStack","Text","Flex","PiInfo","IconButton","PiUploadThin","Text","Text","Box","Flex","LuArrowUp","LuArrowDown","Box","Flex","LuPin","Flex","LuFilter","Flex","PiFunction","Menu","Text","LuChevronRight","Portal","LuArrowUpAZ","LuArrowDownAZ","LuX","Menu","Text","LuChevronRight","Portal","LuChevronLeft","LuArrowLeftToLine","LuArrowRightToLine","Menu","Box","Text","Menu","Box","Text","LuChevronRight","Portal","Menu","Text","LuChevronRight","Portal","Menu","LuFilter","Text","LuPinOff","LuPin","PiEyeSlash","PiListBullets","LuCopy","Box","Menu","Flex","Text","Portal","Flex","Menu","IconButton","PiPlus","Portal","PiListBullets","Text","SELECTION_COLUMN_WIDTH","ADD_COLUMN_BUTTON_WIDTH","Box","Menu","PiCheckSquare","Text","LuCopy","LuTrash2","PiCheckSquare","PiArrowSquareRightLight","Flex","Icon","Menu","PiDotsThreeVerticalBold","Portal","Text","Box","Flex","Checkbox","Box","ActionBar","Portal","Button","PiCheckSquare","LuCopy","LuTrash2","PiX","DialogRoot","Portal","DialogBackdrop","DialogPositioner","DialogContent","DialogHeader","DialogTitle","DialogBody","Text","DialogFooter","Flex","Button","Spinner","Box","Text","TableVirtuoso","Menu","Flex","Icon","PiDotsThreeVerticalBold","Portal","PiCheckSquare","Text","LuCopy","LuTrash2","FilterModel","Flex","Text","Spinner","Popover","Badge","Box","Portal","HStack","LuInfo","Text","Button","Box","Spinner","Flex"],"sources":["../src/schema-editor/model/state/TreeState.ts","../src/schema-editor/model/accessor/NodeAccessor.ts","../src/schema-editor/model/accessor/NodeState.ts","../src/schema-editor/config/schema-type-ids.ts","../src/schema-editor/model/accessor/NodeLabel.ts","../src/schema-editor/model/accessor/NodeFormula.ts","../src/schema-editor/model/accessor/NodeValidation.ts","../src/schema-editor/model/utils/typeIdMapping.ts","../src/schema-editor/model/accessor/NodeActions.ts","../src/schema-editor/model/accessor/NodeAccessorFactory.ts","../src/schema-editor/model/core/AccessorCache.ts","../src/schema-editor/model/core/ValidationTracker.ts","../src/schema-editor/model/core/ViewState.ts","../src/schema-editor/model/utils/DataTransformations.ts","../src/schema-editor/model/utils/DefaultValues.ts","../src/schema-editor/model/utils/traverseTree.ts","../src/schema-editor/model/utils/TreeNavigator.ts","../src/schema-editor/model/core/CollapseManager.ts","../src/schema-editor/model/core/KeyboardNavigation.ts","../src/schema-editor/config/system-schemas.ts","../src/lib/initReactivity.ts","../src/schema-editor/model/core/SchemaEditorCore.ts","../src/schema-editor/model/vm/SchemaTreeVM.ts","../src/schema-editor/model/dialog/CreateTableDialogVM.ts","../src/schema-editor/model/dialog/ReviewErrorsDialogVM.ts","../src/schema-editor/model/vm/CreatingEditorVM.ts","../src/schema-editor/model/dialog/ReviewChangesDialogVM.ts","../src/schema-editor/model/vm/UpdatingEditorVM.ts","../src/components/Tooltip/Tooltip.tsx","../src/schema-editor/types/index.ts","../src/components/ViewerSwitcher/ViewerSwitcher.tsx","../src/components/CopyButton/CopyButton.tsx","../src/components/JsonCard/JsonCard.tsx","../src/hooks/useContentEditable.ts","../src/components/ContentEditable/ContentEditable.tsx","../src/components/Breadcrumbs/constants.ts","../src/components/Breadcrumbs/EditableSegment.tsx","../src/components/Breadcrumbs/SegmentContent.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/GrayButton/GrayButton.tsx","../src/components/CreateButton/CreateButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/BackButton/BackButton.tsx","../src/components/SettingsButton/SettingsButton.tsx","../src/components/PlusButton/PlusButton.tsx","../src/schema-editor/ui/tree/TreeNodeWrapper/TreeNodeWrapper.tsx","../src/schema-editor/ui/TypeMenu/TypeMenu.tsx","../src/schema-editor/ui/tree/TreeNodeField/DragHandle.tsx","../src/schema-editor/ui/tree/TreeNodeField/ErrorIndicator.tsx","../src/schema-editor/ui/tree/TreeNodeField/useDragAndDrop.ts","../src/schema-editor/ui/tree/TreeNodeField/TreeNodeField.tsx","../src/schema-editor/ui/tree/TreeNodeIndicators/TreeNodeIndicators.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/DescriptionSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/FormulaSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/parseDefaultValue.ts","../src/schema-editor/ui/tree/TreeNodeContextMenu/DefaultValueSubmenu.tsx","../src/schema-editor/ui/tree/TreeNodeContextMenu/TreeNodeContextMenu.tsx","../src/schema-editor/ui/tree/TreeNodeRightContent/TreeNodeRightContent.tsx","../src/schema-editor/ui/tree/NodeViewLayout/NodeViewLayout.tsx","../src/schema-editor/ui/tree/ObjectNodeView/ObjectNodeView.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ForeignKeyValue.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayItemsChildren.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayItemsView.tsx","../src/schema-editor/ui/tree/ArrayNodeView/ArrayNodeView.tsx","../src/schema-editor/ui/tree/PrimitiveNodeView/PrimitiveNodeView.tsx","../src/schema-editor/ui/tree/ForeignKeyNodeView/ForeignKeyNodeView.tsx","../src/schema-editor/ui/tree/RefNodeView/RefNodeView.tsx","../src/schema-editor/ui/tree/TreeNodeView/TreeNodeView.tsx","../src/schema-editor/ui/dialog/shared/Highlight/Highlight.tsx","../src/schema-editor/ui/dialog/shared/CodeBox/CodeBox.tsx","../src/schema-editor/ui/dialog/shared/DialogLayout/DialogLayout.tsx","../src/schema-editor/ui/dialog/shared/DialogFooterActions/DialogFooterActions.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/helpers.ts","../src/schema-editor/ui/dialog/shared/PatchRow/OperationDescription.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/DefaultValueRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/DataLossBadge.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/TransformationInfoRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/ValueChangeRow.tsx","../src/schema-editor/ui/dialog/shared/PatchRow/PatchRow.tsx","../src/schema-editor/ui/dialog/shared/TableIdChangeRow/TableIdChangeRow.tsx","../src/schema-editor/ui/dialog/shared/ErrorItem/ErrorItem.tsx","../src/schema-editor/ui/dialog/shared/RevertButton/RevertButton.tsx","../src/schema-editor/ui/dialog/ReviewErrorsDialog/ReviewErrorsDialog.tsx","../src/schema-editor/ui/dialog/ReviewChangesDialog/ReviewChangesDialog.tsx","../src/schema-editor/ui/dialog/CreateTableDialog/CreateTableDialog.tsx","../src/schema-editor/ui/SchemaEditor/SchemaEditor.tsx","../src/schema-editor/ui/CreatingSchemaEditor/CreatingSchemaEditor.tsx","../src/schema-editor/ui/UpdatingSchemaEditor/UpdatingSchemaEditor.tsx","../src/row-editor/vm/flattenNodes.ts","../src/row-editor/vm/state/RowTreeState.ts","../src/row-editor/vm/accessor/RowNodeAccessor.ts","../src/row-editor/vm/accessor/RowNodeState.ts","../src/row-editor/vm/accessor/RowNodeMenu.ts","../src/row-editor/vm/accessor/RowNodeLayout.ts","../src/row-editor/vm/accessor/RowAccessorFactory.ts","../src/row-editor/vm/accessor/RowAccessorCache.ts","../src/row-editor/vm/RowEditorCore.ts","../src/row-editor/vm/RowEditorVM.ts","../src/row-editor/ui/components/Guides.tsx","../src/row-editor/ui/components/Dot.tsx","../src/row-editor/ui/components/Field.tsx","../src/row-editor/ui/components/More.tsx","../src/row-editor/ui/components/NodeMenu/NodeMenu.tsx","../src/row-editor/ui/components/Row.tsx","../src/row-editor/ui/renderers/ContainerRenderer.tsx","../src/row-editor/ui/editors/PrimitiveBox.tsx","../src/row-editor/ui/editors/StringEditor.tsx","../src/row-editor/ui/renderers/StringRenderer.tsx","../src/row-editor/ui/editors/NumberEditor.tsx","../src/row-editor/ui/renderers/NumberRenderer.tsx","../src/row-editor/ui/editors/FocusPopover.tsx","../src/row-editor/ui/editors/FocusPopoverItem.tsx","../src/row-editor/ui/editors/BooleanMenu.tsx","../src/row-editor/ui/editors/BooleanEditor.tsx","../src/row-editor/ui/renderers/BooleanRenderer.tsx","../src/row-editor/ui/editors/ForeignKeyActions.tsx","../src/lib/Debounce.ts","../src/search-foreign-key/vm/SearchForeignKeyVM.ts","../src/search-foreign-key/ui/Header.tsx","../src/search-foreign-key/ui/SearchInput.tsx","../src/search-foreign-key/ui/Item.tsx","../src/search-foreign-key/ui/List.tsx","../src/search-foreign-key/ui/Empty.tsx","../src/search-foreign-key/ui/Footer.tsx","../src/search-foreign-key/ui/SearchForeignKey.tsx","../src/row-editor/ui/editors/ForeignKeyMenu.tsx","../src/row-editor/ui/renderers/ForeignKeyRenderer.tsx","../src/row-editor/ui/editors/FileHoverCard.tsx","../src/row-editor/ui/editors/FileActions.tsx","../src/row-editor/ui/renderers/FileRenderer.tsx","../src/row-editor/ui/editors/MarkdownEditor.tsx","../src/row-editor/ui/renderers/MarkdownRenderer.tsx","../src/row-editor/ui/renderers/NodeRenderers.ts","../src/row-editor/ui/RowEditor/FlatItemView.tsx","../src/row-editor/ui/RowEditor/RowEditor.tsx","../src/row-editor/ui/NodeView/NodeView.tsx","../src/table-editor/shared/field-types.ts","../src/table-editor/shared/system-fields.ts","../src/table-editor/shared/system-field-ids.ts","../src/table-editor/TableEditor/model/SchemaContext.ts","../src/table-editor/Columns/model/extractColumns.ts","../src/table-editor/Columns/model/selectDefaultColumns.ts","../src/table-editor/Columns/model/ColumnsModel.ts","../src/table-editor/Columns/model/groupFileFields.ts","../src/table-editor/Filters/model/utils/operators.ts","../src/table-editor/Filters/model/utils/searchTypes.ts","../src/table-editor/Filters/model/vm/FilterConditionVM.ts","../src/table-editor/Filters/model/vm/FilterGroupVM.ts","../src/table-editor/Filters/model/filterSchema.ts","../src/table-editor/Filters/model/core/FilterTreeOps.ts","../src/table-editor/Filters/model/utils/filterTreeUtils.ts","../src/table-editor/Filters/model/utils/filterBuilder.ts","../src/table-editor/Filters/model/core/FilterSerializer.ts","../src/table-editor/Filters/model/utils/filterValidation.ts","../src/table-editor/Filters/model/core/FilterValidator.ts","../src/table-editor/Filters/model/core/FilterCore.ts","../src/table-editor/Table/ui/Header/getFieldTypeIcon.tsx","../src/table-editor/Filters/ui/FieldSelect/FieldMenuItems.tsx","../src/table-editor/Filters/ui/FieldSelect/FieldSelect.tsx","../src/table-editor/Filters/ui/OperatorSelect/OperatorSelect.tsx","../src/table-editor/Filters/ui/FilterValueInput/FilterValueInput.tsx","../src/table-editor/Filters/ui/SearchLanguageSelect/SearchLanguageSelect.tsx","../src/table-editor/Filters/ui/SearchTypeSelect/SearchTypeSelect.tsx","../src/table-editor/Filters/ui/FilterConditionView/FilterConditionView.tsx","../src/table-editor/Filters/ui/FilterGroupView/LogicDropdown.tsx","../src/table-editor/Filters/ui/FilterGroupView/FilterGroupView.tsx","../src/table-editor/shared/CopyJsonPopover/CopyJsonPopover.tsx","../src/table-editor/Filters/ui/FilterWidget/FilterWidget.tsx","../src/table-editor/Search/model/SearchModel.ts","../src/table-editor/Search/ui/SearchWidget.tsx","../src/table-editor/Sortings/model/sortSchema.ts","../src/table-editor/Sortings/model/SortModel.ts","../src/table-editor/Sortings/ui/SortFieldSelect/SortFieldSelect.tsx","../src/table-editor/Sortings/ui/SortDirectionSelect/SortDirectionSelect.tsx","../src/table-editor/Sortings/ui/SortRow/SortRow.tsx","../src/table-editor/Sortings/ui/SortingsWidget/SortingsWidget.tsx","../src/table-editor/Table/model/SelectionModel.ts","../src/lib/fsm/resolveTransition.ts","../src/lib/fsm/ObservableFSM.ts","../src/table-editor/Table/model/cellFSMConfig.ts","../src/table-editor/Table/model/CellFSM.ts","../src/table-editor/Table/model/CellVM.ts","../src/table-editor/Table/model/RowVM.ts","../src/table-editor/Table/ui/Cell/cellEditorUtils.ts","../src/table-editor/Table/ui/Cell/CellTextareaEditor.tsx","../src/table-editor/Table/ui/Cell/CellContextActionsContext.ts","../src/table-editor/Table/ui/Cell/CellContextMenu.tsx","../src/table-editor/Table/ui/Cell/cellStyles.ts","../src/table-editor/Table/ui/Cell/cellCss.ts","../src/table-editor/Table/ui/Cell/useCellContextMenu.ts","../src/table-editor/Table/ui/Cell/useCellFocus.ts","../src/table-editor/Table/ui/Cell/useCellKeyboard.ts","../src/table-editor/Table/ui/Cell/useDeferredMenuEdit.ts","../src/table-editor/Table/ui/Cell/CellWrapper.tsx","../src/table-editor/Table/ui/Cell/useTextareaCell.ts","../src/table-editor/Table/ui/Cell/StringCell.tsx","../src/table-editor/Table/ui/Cell/NumberCell.tsx","../src/table-editor/Table/ui/Cell/usePopoverAnchor.ts","../src/table-editor/Table/ui/Cell/BooleanCell.tsx","../src/table-editor/Table/ui/Cell/ForeignKeyCell.tsx","../src/table-editor/Table/ui/Cell/FileCell.tsx","../src/table-editor/Table/ui/Cell/DateTimeCell.tsx","../src/table-editor/Table/ui/Cell/ReadonlyCell.tsx","../src/table-editor/Table/ui/Cell/CellRenderer.tsx","../src/table-editor/Table/model/parseTSV.ts","../src/table-editor/Table/model/clipboardOperations.ts","../src/table-editor/Table/ui/borderConstants.ts","../src/table-editor/Table/ui/ResizeHandle.tsx","../src/table-editor/Table/ui/Header/SortIndicator.tsx","../src/table-editor/Table/ui/Header/PinIndicator.tsx","../src/table-editor/Table/ui/Header/FilterIndicator.tsx","../src/table-editor/Table/ui/Header/FormulaIndicator.tsx","../src/table-editor/Table/ui/Header/SortSubmenu.tsx","../src/table-editor/Table/ui/Header/MoveColumnSubmenu.tsx","../src/table-editor/Table/ui/Header/FieldMenuItem.tsx","../src/table-editor/Table/ui/Header/FileFieldSubmenu.tsx","../src/table-editor/Table/ui/Header/InsertColumnSubmenu.tsx","../src/table-editor/Table/ui/Header/ColumnHeaderMenu.tsx","../src/table-editor/Table/ui/Header/ColumnHeader.tsx","../src/table-editor/Table/ui/Header/AddColumnButton.tsx","../src/table-editor/Table/ui/HeaderRow.tsx","../src/table-editor/Table/ui/RowActionMenuItems.tsx","../src/table-editor/Table/ui/RowActionOverlay.tsx","../src/table-editor/Table/ui/SelectionCheckboxCell.tsx","../src/table-editor/Table/ui/DataRow.tsx","../src/table-editor/Table/ui/SelectionToolbar.tsx","../src/table-editor/Table/ui/DeleteConfirmDialog/DeleteConfirmDialog.tsx","../src/table-editor/Table/ui/TableComponent.tsx","../src/table-editor/Table/ui/TableRowComponent.tsx","../src/table-editor/Table/ui/hooks/useScrollShadow.ts","../src/table-editor/Table/ui/TableWidget.tsx","../src/table-editor/Table/ui/RowActionsMenu/RowActionsMenu.tsx","../src/table-editor/Status/model/RowCountModel.ts","../src/table-editor/Status/model/ViewSettingsBadgeModel.ts","../src/table-editor/TableEditor/model/TableEditorCore.ts","../src/table-editor/TableEditor/model/MockDataSource.ts","../src/table-editor/Status/ui/RowCountWidget.tsx","../src/table-editor/Status/ui/ViewSettingsBadge.tsx","../src/table-editor/TableEditor/ui/TableEditor.tsx"],"sourcesContent":["import { makeAutoObservable, observable } from 'mobx';\n\nexport class TreeState {\n private readonly _expandedNodes = observable.map<string, boolean>();\n private readonly _focusedNodes = observable.map<string, boolean>();\n private readonly _menuOpenNodes = observable.map<string, boolean>();\n private readonly _settingsOpenNodes = observable.map<string, boolean>();\n private readonly _dropNodes = observable.map<string, boolean>();\n private readonly _disabledDropNodes = observable.map<string, boolean>();\n private readonly _draggedOverNodes = observable.map<string, boolean>();\n private readonly _focusRequestCounts = observable.map<string, number>();\n private _activeNodeId: string | null = null;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get activeNodeId(): string | null {\n return this._activeNodeId;\n }\n\n public setActiveNodeId(nodeId: string | null): void {\n this._activeNodeId = nodeId;\n }\n\n public isActive(nodeId: string): boolean {\n return this._activeNodeId === nodeId;\n }\n\n public getFocusRequestCount(nodeId: string): number {\n return this._focusRequestCounts.get(nodeId) ?? 0;\n }\n\n public requestFocus(nodeId: string): void {\n const current = this._focusRequestCounts.get(nodeId) ?? 0;\n this._focusRequestCounts.set(nodeId, current + 1);\n }\n\n public isExpanded(nodeId: string): boolean {\n return this._expandedNodes.get(nodeId) ?? true;\n }\n\n public setExpanded(nodeId: string, value: boolean): void {\n this._expandedNodes.set(nodeId, value);\n }\n\n public toggleExpanded(nodeId: string): void {\n this._expandedNodes.set(nodeId, !this.isExpanded(nodeId));\n }\n\n public isFocused(nodeId: string): boolean {\n return this._focusedNodes.get(nodeId) ?? false;\n }\n\n public setFocused(nodeId: string, value: boolean): void {\n this._focusedNodes.set(nodeId, value);\n }\n\n public isMenuOpen(nodeId: string): boolean {\n return this._menuOpenNodes.get(nodeId) ?? false;\n }\n\n public setMenuOpen(nodeId: string, value: boolean): void {\n this._menuOpenNodes.set(nodeId, value);\n }\n\n public isSettingsOpen(nodeId: string): boolean {\n return this._settingsOpenNodes.get(nodeId) ?? false;\n }\n\n public setSettingsOpen(nodeId: string, value: boolean): void {\n this._settingsOpenNodes.set(nodeId, value);\n }\n\n public isDrop(nodeId: string): boolean {\n return this._dropNodes.get(nodeId) ?? false;\n }\n\n public setDrop(nodeId: string, value: boolean): void {\n this._dropNodes.set(nodeId, value);\n }\n\n public isDisabledDrop(nodeId: string): boolean {\n return this._disabledDropNodes.get(nodeId) ?? false;\n }\n\n public setDisabledDrop(nodeId: string, value: boolean): void {\n this._disabledDropNodes.set(nodeId, value);\n }\n\n public isDraggedOver(nodeId: string): boolean {\n return this._draggedOverNodes.get(nodeId) ?? false;\n }\n\n public setDraggedOver(nodeId: string, value: boolean): void {\n this._draggedOverNodes.set(nodeId, value);\n }\n\n public clearNode(nodeId: string): void {\n this._expandedNodes.delete(nodeId);\n this._focusedNodes.delete(nodeId);\n this._menuOpenNodes.delete(nodeId);\n this._settingsOpenNodes.delete(nodeId);\n this._dropNodes.delete(nodeId);\n this._disabledDropNodes.delete(nodeId);\n this._draggedOverNodes.delete(nodeId);\n this._focusRequestCounts.delete(nodeId);\n }\n\n public collapseAll(nodeIds: string[], keepRootExpanded: boolean): void {\n for (const nodeId of nodeIds) {\n this._expandedNodes.set(nodeId, false);\n }\n if (keepRootExpanded) {\n const firstNodeId = nodeIds[0];\n if (firstNodeId !== undefined) {\n this._expandedNodes.set(firstNodeId, true);\n }\n }\n }\n\n public expandAll(nodeIds: string[]): void {\n for (const nodeId of nodeIds) {\n this._expandedNodes.set(nodeId, true);\n }\n }\n\n public reset(): void {\n this._expandedNodes.clear();\n this._focusedNodes.clear();\n this._menuOpenNodes.clear();\n this._settingsOpenNodes.clear();\n this._dropNodes.clear();\n this._disabledDropNodes.clear();\n this._draggedOverNodes.clear();\n this._focusRequestCounts.clear();\n this._activeNodeId = null;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from '@revisium/schema-toolkit';\nimport type { NodeState } from './NodeState';\nimport type { NodeLabel } from './NodeLabel';\nimport type { NodeFormula } from './NodeFormula';\nimport type { NodeValidation } from './NodeValidation';\nimport type { NodeActions } from './NodeActions';\n\nexport interface NodeAccessorDependencies {\n state: NodeState;\n label: NodeLabel;\n formula: NodeFormula;\n validation: NodeValidation;\n actions: NodeActions;\n}\n\nexport class NodeAccessor {\n public readonly state: NodeState;\n public readonly label: NodeLabel;\n public readonly formula: NodeFormula;\n public readonly validation: NodeValidation;\n public readonly actions: NodeActions;\n\n constructor(\n private readonly _node: SchemaNode,\n deps: NodeAccessorDependencies,\n private readonly _isRoot: boolean = false,\n private readonly _isReadonly: boolean = false,\n ) {\n this.state = deps.state;\n this.label = deps.label;\n this.formula = deps.formula;\n this.validation = deps.validation;\n this.actions = deps.actions;\n\n makeAutoObservable(\n this,\n {\n state: false,\n label: false,\n formula: false,\n validation: false,\n actions: false,\n },\n { autoBind: true },\n );\n }\n\n public get nodeId(): string {\n return this._node.id();\n }\n\n public get isRoot(): boolean {\n return this._isRoot;\n }\n\n public get isReadonly(): boolean {\n return this._isReadonly;\n }\n\n public get isObject(): boolean {\n return this._node.isObject();\n }\n\n public get isArray(): boolean {\n return this._node.isArray();\n }\n\n public get isPrimitive(): boolean {\n return this._node.isPrimitive();\n }\n\n public get isRef(): boolean {\n return this._node.isRef();\n }\n\n public get ref(): string | undefined {\n if (this._node.isRef()) {\n return this._node.ref();\n }\n return undefined;\n }\n\n public get isForeignKey(): boolean {\n return this.label.isForeignKey;\n }\n\n public get defaultValue(): unknown {\n return this._node.defaultValue();\n }\n\n public get defaultValueAsString(): string {\n const value = this.defaultValue;\n if (value === undefined || value === null) {\n return '';\n }\n switch (typeof value) {\n case 'string':\n return value;\n case 'number':\n case 'boolean':\n return String(value);\n default:\n return JSON.stringify(value);\n }\n }\n\n public get hoverTargetClass(): string {\n return `hover-target-${this.nodeId}`;\n }\n\n public get shouldApplyFieldStyles(): boolean {\n return (\n !this.state.isFocused &&\n !this.state.isMenuOpen &&\n !this.state.isSettingsOpen\n );\n }\n\n public get showMenu(): boolean {\n return !this._isReadonly;\n }\n\n public handleFieldBlur(): void {\n this.state.setFocused(false);\n if (!this._node.name() && !this._isRoot) {\n this.actions.remove();\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { TreeState } from '../state/TreeState';\n\nexport class NodeState {\n constructor(\n private readonly _nodeId: string,\n private readonly _treeState: TreeState,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get isExpanded(): boolean {\n return this._treeState.isExpanded(this._nodeId);\n }\n\n public toggleExpanded(): void {\n this._treeState.toggleExpanded(this._nodeId);\n }\n\n public get isFocused(): boolean {\n return this._treeState.isFocused(this._nodeId);\n }\n\n public setFocused(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setFocused(this._nodeId, value);\n }\n\n public get isMenuOpen(): boolean {\n return this._treeState.isMenuOpen(this._nodeId);\n }\n\n public setMenuOpen(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setMenuOpen(this._nodeId, value);\n }\n\n public get isSettingsOpen(): boolean {\n return this._treeState.isSettingsOpen(this._nodeId);\n }\n\n public setSettingsOpen(value: boolean): void {\n if (value) {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n this._treeState.setSettingsOpen(this._nodeId, value);\n }\n\n public get isDrop(): boolean {\n return this._treeState.isDrop(this._nodeId);\n }\n\n public setDrop(value: boolean): void {\n this._treeState.setDrop(this._nodeId, value);\n }\n\n public get isDisabledDrop(): boolean {\n return this._treeState.isDisabledDrop(this._nodeId);\n }\n\n public setDisabledDrop(value: boolean): void {\n this._treeState.setDisabledDrop(this._nodeId, value);\n }\n\n public get isDraggedOver(): boolean {\n return this._treeState.isDraggedOver(this._nodeId);\n }\n\n public setDraggedOver(value: boolean): void {\n this._treeState.setDraggedOver(this._nodeId, value);\n }\n\n public get isActive(): boolean {\n return this._treeState.isActive(this._nodeId);\n }\n\n public activate(): void {\n this._treeState.setActiveNodeId(this._nodeId);\n }\n\n public get focusRequestCount(): number {\n return this._treeState.getFocusRequestCount(this._nodeId);\n }\n\n public requestFocus(): void {\n this._treeState.requestFocus(this._nodeId);\n }\n}\n","import { SystemSchemaIds } from '@revisium/schema-toolkit';\n\nconst SYSTEM_SCHEMA_LABELS: Record<string, string> = {\n [SystemSchemaIds.RowId]: 'id',\n [SystemSchemaIds.RowCreatedId]: 'createdId',\n [SystemSchemaIds.RowVersionId]: 'versionId',\n [SystemSchemaIds.RowCreatedAt]: 'createdAt',\n [SystemSchemaIds.RowPublishedAt]: 'publishedAt',\n [SystemSchemaIds.RowUpdatedAt]: 'updatedAt',\n [SystemSchemaIds.RowHash]: 'hash',\n [SystemSchemaIds.RowSchemaHash]: 'schemaHash',\n [SystemSchemaIds.File]: 'File',\n};\n\nexport const getLabelByRef = (ref: string): string => {\n return SYSTEM_SCHEMA_LABELS[ref] ?? ref;\n};\n\nexport enum SchemaTypeIds {\n String = 'String',\n Number = 'Number',\n Boolean = 'Boolean',\n Object = 'Object',\n Array = 'Array',\n ForeignKeyString = 'ForeignKeyString',\n File = 'File',\n RowId = 'RowId',\n RowVersionId = 'RowVersionId',\n RowCreatedId = 'RowCreatedId',\n RowCreatedAt = 'RowCreatedAt',\n RowPublishedAt = 'RowPublishedAt',\n RowUpdatedAt = 'RowUpdatedAt',\n RowHash = 'RowHash',\n RowSchemaHash = 'RowSchemaHash',\n Markdown = 'Markdown',\n}\n\ntype BaseOption = {\n id: string;\n label: string;\n type?: 'item' | 'submenu';\n};\n\nexport type MenuOptionItem =\n | (BaseOption & {\n type?: 'item';\n addDividerAfter?: boolean;\n })\n | (BaseOption & {\n type: 'submenu';\n items: MenuOptionItem[];\n });\n\nexport type MenuGroup = {\n id: string;\n options: MenuOptionItem[];\n addDividerAfter?: boolean;\n};\n\nconst typesOptions: MenuOptionItem[] = [\n { id: SchemaTypeIds.String, label: 'string' },\n { id: SchemaTypeIds.Number, label: 'number' },\n { id: SchemaTypeIds.Boolean, label: 'boolean' },\n { id: SchemaTypeIds.Object, label: 'object' },\n { id: SchemaTypeIds.Array, label: 'array' },\n { id: SchemaTypeIds.ForeignKeyString, label: 'foreign key' },\n];\n\nconst schemasOptions: MenuOptionItem[] = [\n {\n id: 'schemas-submenu',\n label: 'Schemas',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.File, label: getLabelByRef(SystemSchemaIds.File) },\n { id: SchemaTypeIds.Markdown, label: 'Markdown' },\n ],\n },\n];\n\nconst systemFieldsOptions: MenuOptionItem[] = [\n {\n id: 'system-fields-submenu',\n label: 'System fields',\n type: 'submenu',\n items: [\n { id: SchemaTypeIds.RowId, label: getLabelByRef(SystemSchemaIds.RowId) },\n {\n id: SchemaTypeIds.RowVersionId,\n label: getLabelByRef(SystemSchemaIds.RowVersionId),\n },\n {\n id: SchemaTypeIds.RowCreatedId,\n label: getLabelByRef(SystemSchemaIds.RowCreatedId),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowCreatedAt,\n label: getLabelByRef(SystemSchemaIds.RowCreatedAt),\n },\n {\n id: SchemaTypeIds.RowPublishedAt,\n label: getLabelByRef(SystemSchemaIds.RowPublishedAt),\n },\n {\n id: SchemaTypeIds.RowUpdatedAt,\n label: getLabelByRef(SystemSchemaIds.RowUpdatedAt),\n addDividerAfter: true,\n },\n {\n id: SchemaTypeIds.RowHash,\n label: getLabelByRef(SystemSchemaIds.RowHash),\n },\n {\n id: SchemaTypeIds.RowSchemaHash,\n label: getLabelByRef(SystemSchemaIds.RowSchemaHash),\n },\n ],\n },\n];\n\nexport const typeMenuGroups: MenuGroup[] = [\n { id: 'types', options: typesOptions, addDividerAfter: true },\n { id: 'schemas', options: schemasOptions, addDividerAfter: true },\n { id: 'system-fields', options: systemFieldsOptions },\n];\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode } from '@revisium/schema-toolkit';\nimport { getLabelByRef } from '../../config/schema-type-ids';\n\nexport class NodeLabel {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _getTableId: () => string,\n private readonly _isRoot: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get name(): string {\n if (this._isRoot) {\n return this._getTableId();\n }\n return this._node.name();\n }\n\n public get nodeType(): string {\n return this._node.nodeType();\n }\n\n public get typeLabel(): string {\n if (this._node.isRef()) {\n return this.getRefLabel();\n }\n if (this._node.isObject()) {\n return 'object';\n }\n if (this._node.isArray()) {\n return 'array';\n }\n if (this._node.foreignKey() !== undefined) {\n return 'ForeignKey';\n }\n if (this._node.contentMediaType?.() === 'text/markdown') {\n return 'Markdown';\n }\n return this._node.nodeType();\n }\n\n public get description(): string | undefined {\n return this._node.metadata().description;\n }\n\n public get isDeprecated(): boolean {\n return this._node.metadata().deprecated ?? false;\n }\n\n public get foreignKeyTable(): string | undefined {\n return this._node.foreignKey();\n }\n\n public get isForeignKey(): boolean {\n return this._node.foreignKey() !== undefined;\n }\n\n private getRefLabel(): string {\n const ref = this._node.ref();\n if (!ref) {\n return 'Ref';\n }\n return getLabelByRef(ref);\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport type {\n SchemaNode,\n SchemaModel,\n JsonObjectSchema,\n} from '@revisium/schema-toolkit';\n\nexport class NodeFormula {\n private _inputValue: string | null = null;\n private _inputError: string | null = null;\n\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get hasFormula(): boolean {\n return this._node.hasFormula();\n }\n\n public get plainSchema(): JsonObjectSchema {\n return this._schemaModel.plainSchema;\n }\n\n public get rawExpression(): string {\n const formula = this._node.formula();\n return formula?.expression() ?? '';\n }\n\n public get formula(): string {\n if (this._inputValue !== null) {\n return this._inputValue;\n }\n if (!this.hasFormula) {\n return '';\n }\n const serialized = this._schemaModel.serializeFormula(this._node.id());\n if (serialized) {\n return serialized;\n }\n return this.rawExpression;\n }\n\n public get inputValue(): string | null {\n return this._inputValue;\n }\n\n public get inputError(): string | null {\n return this._inputError;\n }\n\n public get schemaError(): string | undefined {\n const errors = this._schemaModel.formulaErrors;\n const error = errors.find((e) => e.nodeId === this._node.id());\n return error?.message;\n }\n\n public get hasError(): boolean {\n return this._inputError !== null || this.schemaError !== undefined;\n }\n\n public get errorMessage(): string | undefined {\n return this._inputError ?? this.schemaError;\n }\n\n public setInputValue(value: string): void {\n this._inputValue = value;\n this._inputError = null;\n }\n\n public clearInput(): void {\n this._inputValue = null;\n this._inputError = null;\n }\n\n private hasFormulaErrorForNode(): boolean {\n const errors = this._schemaModel.formulaErrors;\n return errors.some((e) => e.nodeId === this._node.id());\n }\n\n public applyFormula(): boolean {\n if (this._inputValue === null) {\n return true;\n }\n\n const trimmed = this._inputValue.trim();\n\n try {\n this._schemaModel.updateFormula(this._node.id(), trimmed || undefined);\n\n if (this.hasFormulaErrorForNode()) {\n return false;\n }\n\n this.clearInput();\n return true;\n } catch (error) {\n runInAction(() => {\n this._inputError =\n error instanceof Error ? error.message : 'Invalid formula';\n });\n return false;\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaNode, SchemaModel } from '@revisium/schema-toolkit';\nimport type { NodeFormula } from './NodeFormula';\n\nexport class NodeValidation {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n private readonly _formula: NodeFormula,\n private readonly _getTableIdError: () => string | null,\n private readonly _isRoot: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get schemaError(): string | undefined {\n const errors = this._schemaModel.validationErrors;\n const error = errors.find((e) => e.nodeId === this._node.id());\n return error?.message;\n }\n\n public get tableIdError(): string | null {\n if (this._isRoot) {\n return this._getTableIdError();\n }\n return null;\n }\n\n public get formulaError(): string | undefined {\n return this._formula.errorMessage;\n }\n\n public get hasError(): boolean {\n return (\n this.schemaError !== undefined ||\n this.tableIdError !== null ||\n this.formulaError !== undefined\n );\n }\n\n public get errorMessage(): string | undefined {\n return this.schemaError ?? this.tableIdError ?? this.formulaError;\n }\n}\n","import type { FieldType } from '@revisium/schema-toolkit';\n\nconst TYPE_ID_TO_FIELD_TYPE: Record<string, FieldType> = {\n String: 'string',\n Number: 'number',\n Boolean: 'boolean',\n Object: 'object',\n Array: 'array',\n};\n\nexport function typeIdToFieldType(typeId: string): FieldType | null {\n return TYPE_ID_TO_FIELD_TYPE[typeId] ?? null;\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n SystemSchemaIds,\n type SchemaNode,\n type SchemaModel,\n} from '@revisium/schema-toolkit';\nimport { typeIdToFieldType } from '../utils/typeIdMapping';\n\nexport interface NodeActionsCallbacks {\n renameTable: (name: string) => void;\n onNodeRemoved: (nodeId: string) => void;\n onNodeAdded: (nodeId: string) => void;\n onNodeReplaced: (oldNodeId: string, newNodeId: string) => void;\n selectForeignKey: () => Promise<string | null>;\n}\n\nexport class NodeActions {\n constructor(\n private readonly _node: SchemaNode,\n private readonly _schemaModel: SchemaModel,\n private readonly _callbacks: NodeActionsCallbacks,\n private readonly _isRoot: boolean,\n private readonly _isReadonly: boolean,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get canRemove(): boolean {\n return !this._isReadonly && !this._isRoot;\n }\n\n public get canAddProperty(): boolean {\n return !this._isReadonly && this._node.isObject();\n }\n\n public rename(newName: string): void {\n if (this._isReadonly) {\n return;\n }\n\n if (this._isRoot) {\n this._callbacks.renameTable(newName);\n return;\n }\n\n if (newName !== this._node.name()) {\n this._schemaModel.renameField(this._node.id(), newName);\n }\n }\n\n public changeType(typeId: string): void {\n if (this._isReadonly || this._isRoot) {\n return;\n }\n\n if (typeId === 'ForeignKeyString') {\n this.changeToForeignKey();\n return;\n }\n\n if (typeId === 'Markdown') {\n this.changeToMarkdown();\n return;\n }\n\n const refUri = this.typeIdToRefUri(typeId);\n if (refUri) {\n const oldNodeId = this._node.id();\n const newNode = this._schemaModel.changeFieldType(oldNodeId, {\n $ref: refUri,\n });\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (!fieldType) {\n return;\n }\n\n const oldNodeId = this._node.id();\n const newNode = this._schemaModel.changeFieldType(oldNodeId, fieldType);\n\n if (!newNode.isNull()) {\n this._schemaModel.updateForeignKey(newNode.id(), undefined);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n }\n\n private changeToForeignKey(): void {\n const oldNodeId = this._node.id();\n let nodeId = oldNodeId;\n\n if (this._node.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n nodeId = newNode.id();\n }\n\n this._schemaModel.updateForeignKey(nodeId, '');\n this._callbacks.onNodeReplaced(oldNodeId, nodeId);\n }\n\n private changeToMarkdown(): void {\n const oldNodeId = this._node.id();\n let node = this._node;\n\n if (node.nodeType() !== 'string') {\n node = this._schemaModel.changeFieldType(oldNodeId, 'string');\n }\n\n node.setContentMediaType('text/markdown');\n this._callbacks.onNodeReplaced(oldNodeId, node.id());\n }\n\n public remove(): void {\n if (this._isReadonly || this._isRoot) {\n return;\n }\n\n const nodeId = this._node.id();\n const removed = this._schemaModel.removeField(nodeId);\n\n if (removed) {\n this._callbacks.onNodeRemoved(nodeId);\n }\n }\n\n public addProperty(name: string = ''): SchemaNode | null {\n if (this._isReadonly || !this._node.isObject()) {\n return null;\n }\n\n const newNode = this._schemaModel.addField(this._node.id(), name, 'string');\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeAdded(newNode.id());\n return newNode;\n }\n\n return null;\n }\n\n public insertFieldAt(index: number, name: string): SchemaNode | null {\n if (this._isReadonly || !this._node.isObject()) {\n return null;\n }\n\n const newNode = this._schemaModel.insertFieldAt(\n this._node.id(),\n index,\n name,\n 'string',\n );\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeAdded(newNode.id());\n return newNode;\n }\n\n return null;\n }\n\n public setDescription(description: string | undefined): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateMetadata(this._node.id(), {\n description: description || undefined,\n });\n }\n\n public setDeprecated(deprecated: boolean): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateMetadata(this._node.id(), {\n deprecated: deprecated || undefined,\n });\n }\n\n public setDefaultValue(value: unknown): void {\n if (this._isReadonly) {\n return;\n }\n this._schemaModel.updateDefaultValue(this._node.id(), value);\n }\n\n public setForeignKey(tableId: string | undefined): void {\n if (this._isReadonly) {\n return;\n }\n\n if (tableId === undefined) {\n this._schemaModel.updateForeignKey(this._node.id(), undefined);\n return;\n }\n\n if (this._node.foreignKey() === undefined) {\n const oldNodeId = this._node.id();\n if (this._node.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n this._schemaModel.updateForeignKey(newNode.id(), tableId);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n } else {\n this._schemaModel.updateForeignKey(oldNodeId, tableId);\n }\n } else {\n this._schemaModel.updateForeignKey(this._node.id(), tableId);\n }\n }\n\n public changeItemsType(typeId: string): void {\n if (this._isReadonly || !this._node.isArray()) {\n return;\n }\n\n const items = this._node.items();\n if (items.isNull()) {\n return;\n }\n\n const oldNodeId = items.id();\n\n if (typeId === 'ForeignKeyString') {\n this.changeItemsToForeignKey(items, oldNodeId);\n return;\n }\n\n if (typeId === 'Markdown') {\n this.changeItemsToMarkdown(items, oldNodeId);\n return;\n }\n\n const refUri = this.typeIdToRefUri(typeId);\n if (refUri) {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, {\n $ref: refUri,\n });\n\n if (!newNode.isNull()) {\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (!fieldType) {\n return;\n }\n\n const newNode = this._schemaModel.changeFieldType(oldNodeId, fieldType);\n\n if (!newNode.isNull()) {\n this._schemaModel.updateForeignKey(newNode.id(), undefined);\n this._callbacks.onNodeReplaced(oldNodeId, newNode.id());\n }\n }\n\n private changeItemsToForeignKey(items: SchemaNode, oldNodeId: string): void {\n let nodeId = oldNodeId;\n\n if (items.nodeType() !== 'string') {\n const newNode = this._schemaModel.changeFieldType(oldNodeId, 'string');\n nodeId = newNode.id();\n }\n\n this._schemaModel.updateForeignKey(nodeId, '');\n this._callbacks.onNodeReplaced(oldNodeId, nodeId);\n }\n\n private changeItemsToMarkdown(items: SchemaNode, oldNodeId: string): void {\n let node = items;\n\n if (items.nodeType() !== 'string') {\n node = this._schemaModel.changeFieldType(oldNodeId, 'string');\n }\n\n node.setContentMediaType('text/markdown');\n this._callbacks.onNodeReplaced(oldNodeId, node.id());\n }\n\n public async selectForeignKey(): Promise<void> {\n const tableId = await this._callbacks.selectForeignKey();\n if (tableId !== null) {\n this.setForeignKey(tableId);\n }\n }\n\n private typeIdToRefUri(typeId: string): string | null {\n const mapping: Record<string, string> = {\n File: SystemSchemaIds.File,\n RowId: SystemSchemaIds.RowId,\n RowCreatedId: SystemSchemaIds.RowCreatedId,\n RowVersionId: SystemSchemaIds.RowVersionId,\n RowCreatedAt: SystemSchemaIds.RowCreatedAt,\n RowPublishedAt: SystemSchemaIds.RowPublishedAt,\n RowUpdatedAt: SystemSchemaIds.RowUpdatedAt,\n RowHash: SystemSchemaIds.RowHash,\n RowSchemaHash: SystemSchemaIds.RowSchemaHash,\n };\n return mapping[typeId] ?? null;\n }\n}\n","import type { SchemaNode, SchemaModel } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\nimport { NodeState } from './NodeState';\nimport { NodeLabel } from './NodeLabel';\nimport { NodeFormula } from './NodeFormula';\nimport { NodeValidation } from './NodeValidation';\nimport { NodeActions, type NodeActionsCallbacks } from './NodeActions';\nimport { NodeAccessor } from './NodeAccessor';\n\nexport interface NodeAccessorDependencies {\n state: NodeState;\n label: NodeLabel;\n formula: NodeFormula;\n validation: NodeValidation;\n actions: NodeActions;\n}\n\nexport interface NodeAccessorContext {\n schemaModel: SchemaModel;\n treeState: TreeState;\n getTableId: () => string;\n getTableIdError: () => string | null;\n callbacks: NodeActionsCallbacks;\n}\n\nexport class NodeAccessorFactory {\n public create(\n node: SchemaNode,\n context: NodeAccessorContext,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ): NodeAccessor {\n const state = new NodeState(node.id(), context.treeState);\n const label = new NodeLabel(node, context.getTableId, isRoot);\n const formula = new NodeFormula(node, context.schemaModel);\n const validation = new NodeValidation(\n node,\n context.schemaModel,\n formula,\n context.getTableIdError,\n isRoot,\n );\n const actions = new NodeActions(\n node,\n context.schemaModel,\n context.callbacks,\n isRoot,\n isReadonly,\n );\n\n return new NodeAccessor(\n node,\n { state, label, formula, validation, actions },\n isRoot,\n isReadonly,\n );\n }\n}\n","import type { SchemaModel } from '@revisium/schema-toolkit';\nimport {\n NodeAccessor,\n NodeAccessorFactory,\n type NodeAccessorContext,\n} from '../accessor';\n\nexport class AccessorCache {\n private readonly _cache = new Map<string, NodeAccessor>();\n\n constructor(\n private readonly _getSchemaModel: () => SchemaModel,\n private readonly _getContext: () => NodeAccessorContext,\n private readonly _accessorFactory: NodeAccessorFactory,\n ) {}\n\n public get(\n nodeId: string,\n isRoot: boolean = false,\n isReadonly: boolean = false,\n ): NodeAccessor {\n const cached = this._cache.get(nodeId);\n if (cached) {\n return cached;\n }\n\n const node = this._getSchemaModel().nodeById(nodeId);\n const accessor = this._accessorFactory.create(\n node,\n this._getContext(),\n isRoot,\n isReadonly,\n );\n this._cache.set(nodeId, accessor);\n return accessor;\n }\n\n public getChildren(\n parentNodeId: string,\n parentIsReadonly: boolean = false,\n ): NodeAccessor[] {\n const parentNode = this._getSchemaModel().nodeById(parentNodeId);\n if (parentNode.isNull()) {\n return [];\n }\n\n const childrenReadonly = parentIsReadonly || parentNode.isRef();\n\n if (parentNode.isObject()) {\n return parentNode\n .properties()\n .map((child) => this.get(child.id(), false, childrenReadonly));\n }\n\n if (parentNode.isArray()) {\n const items = parentNode.items();\n if (!items.isNull()) {\n return [this.get(items.id(), false, childrenReadonly)];\n }\n }\n\n return [];\n }\n\n public delete(nodeId: string): void {\n this._cache.delete(nodeId);\n }\n\n public clear(): void {\n this._cache.clear();\n }\n\n public entries(): IterableIterator<[string, NodeAccessor]> {\n return this._cache.entries();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n TableModel,\n SchemaValidationError,\n TreeFormulaValidationError,\n} from '@revisium/schema-toolkit';\nimport type { AccessorCache } from './AccessorCache';\n\nexport class ValidationTracker {\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _accessorCache: AccessorCache,\n private readonly _getTableIdError: () => string | null,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get validationErrors(): readonly SchemaValidationError[] {\n return this._tableModel.schema.validationErrors;\n }\n\n public get formulaErrors(): TreeFormulaValidationError[] {\n const schemaErrors = this._tableModel.schema.formulaErrors;\n const inputErrors = this.collectFormulaInputErrors();\n return [...schemaErrors, ...inputErrors];\n }\n\n public get tableIdError(): string | null {\n return this._getTableIdError();\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public get errorsCount(): number {\n let count = this.validationErrors.length + this.formulaErrors.length;\n if (this.tableIdError !== null) {\n count += 1;\n }\n return count;\n }\n\n public collectFormulaInputErrors(): TreeFormulaValidationError[] {\n const errors: TreeFormulaValidationError[] = [];\n for (const [nodeId, accessor] of this._accessorCache.entries()) {\n const error = accessor.formula.inputError;\n if (error) {\n errors.push({\n nodeId,\n fieldPath: accessor.label.name || undefined,\n message: error,\n });\n }\n }\n return errors;\n }\n}\n","import { makeAutoObservable } from 'mobx';\n\nexport type ViewMode = 'Tree' | 'Json' | 'RefBy';\n\nexport class ViewState {\n private _viewMode: ViewMode = 'Tree';\n private _loading = false;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get viewMode(): ViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public setLoading(value: boolean): void {\n this._loading = value;\n }\n}\n","export type DataLossSeverity = 'none' | 'possible' | 'certain';\n\nexport interface TransformationStep {\n name: string;\n dataLossSeverity: DataLossSeverity;\n}\n\nexport interface TransformationInfo {\n fromType: string;\n toType: string;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n steps: TransformationStep[];\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface TransformationRule {\n fromType: SchemaType;\n toType: SchemaType;\n example: { before: unknown; after: unknown };\n dataLossSeverity: DataLossSeverity;\n stepName: string;\n}\n\ninterface TransformationContext {\n fromType: SchemaType;\n toType: SchemaType;\n fromItemsType?: SchemaType;\n toItemsType?: SchemaType;\n}\n\nconst transformationRules: TransformationRule[] = [\n {\n fromType: 'number',\n toType: 'string',\n example: { before: 123, after: '123' },\n dataLossSeverity: 'none',\n stepName: 'number → string',\n },\n {\n fromType: 'boolean',\n toType: 'string',\n example: { before: true, after: 'true' },\n dataLossSeverity: 'none',\n stepName: 'boolean → string',\n },\n {\n fromType: 'boolean',\n toType: 'number',\n example: { before: true, after: 1 },\n dataLossSeverity: 'none',\n stepName: 'boolean → number',\n },\n {\n fromType: 'string',\n toType: 'number',\n example: { before: '123', after: 123 },\n dataLossSeverity: 'possible',\n stepName: 'string → number',\n },\n {\n fromType: 'string',\n toType: 'boolean',\n example: { before: 'hello', after: true },\n dataLossSeverity: 'possible',\n stepName: 'string → boolean',\n },\n {\n fromType: 'number',\n toType: 'boolean',\n example: { before: 42, after: true },\n dataLossSeverity: 'possible',\n stepName: 'number → boolean',\n },\n {\n fromType: 'object',\n toType: 'string',\n example: { before: { a: 1 }, after: '' },\n dataLossSeverity: 'certain',\n stepName: 'object → string',\n },\n {\n fromType: 'object',\n toType: 'number',\n example: { before: { a: 1 }, after: 0 },\n dataLossSeverity: 'certain',\n stepName: 'object → number',\n },\n {\n fromType: 'object',\n toType: 'boolean',\n example: { before: { a: 1 }, after: false },\n dataLossSeverity: 'certain',\n stepName: 'object → boolean',\n },\n {\n fromType: 'array',\n toType: 'string',\n example: { before: ['a', 'b'], after: 'a' },\n dataLossSeverity: 'possible',\n stepName: 'array → string (first element)',\n },\n {\n fromType: 'array',\n toType: 'number',\n example: { before: [1, 2], after: 1 },\n dataLossSeverity: 'possible',\n stepName: 'array → number (first element)',\n },\n {\n fromType: 'array',\n toType: 'boolean',\n example: { before: [true, false], after: true },\n dataLossSeverity: 'possible',\n stepName: 'array → boolean (first element)',\n },\n {\n fromType: 'string',\n toType: 'object',\n example: { before: 'hello', after: {} },\n dataLossSeverity: 'certain',\n stepName: 'string → object',\n },\n {\n fromType: 'number',\n toType: 'object',\n example: { before: 42, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'number → object',\n },\n {\n fromType: 'boolean',\n toType: 'object',\n example: { before: true, after: {} },\n dataLossSeverity: 'certain',\n stepName: 'boolean → object',\n },\n {\n fromType: 'string',\n toType: 'array',\n example: { before: 'hello', after: ['hello'] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'number',\n toType: 'array',\n example: { before: 42, after: [42] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'boolean',\n toType: 'array',\n example: { before: true, after: [true] },\n dataLossSeverity: 'none',\n stepName: 'wrap in array',\n },\n {\n fromType: 'object',\n toType: 'array',\n example: { before: { a: 1 }, after: [] },\n dataLossSeverity: 'certain',\n stepName: 'object → array',\n },\n {\n fromType: 'array',\n toType: 'object',\n example: { before: [1, 2], after: {} },\n dataLossSeverity: 'certain',\n stepName: 'array → object',\n },\n];\n\nconst sampleValues: Record<SchemaType, unknown> = {\n string: 'hello',\n number: 42,\n boolean: true,\n object: { a: 1 },\n array: [1, 2],\n ref: null,\n unknown: null,\n};\n\nconst validSchemaTypes = new Set<SchemaType>([\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'array',\n 'ref',\n 'unknown',\n]);\n\nfunction toSchemaType(typeStr: string): SchemaType {\n return validSchemaTypes.has(typeStr as SchemaType)\n ? (typeStr as SchemaType)\n : 'unknown';\n}\n\nfunction parseTypeString(typeStr: string): {\n baseType: SchemaType;\n itemsType?: SchemaType;\n} {\n const arrayMatch = /^array<(.+)>$/.exec(typeStr);\n if (arrayMatch?.[1]) {\n return { baseType: 'array', itemsType: toSchemaType(arrayMatch[1]) };\n }\n return { baseType: toSchemaType(typeStr) };\n}\n\nfunction findTransformationRule(\n fromType: SchemaType,\n toType: SchemaType,\n): TransformationRule | null {\n if (fromType === toType) {\n return null;\n }\n return (\n transformationRules.find(\n (rule) => rule.fromType === fromType && rule.toType === toType,\n ) ?? null\n );\n}\n\nfunction transformValue(\n value: unknown,\n fromType: SchemaType,\n toType: SchemaType,\n): unknown {\n if (fromType === toType) {\n return value;\n }\n switch (toType) {\n case 'string':\n return String(value);\n case 'number':\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return typeof value === 'number' ? value : 0;\n case 'boolean':\n return Boolean(value);\n default:\n return value;\n }\n}\n\nfunction getConversionSeverity(\n fromType: SchemaType,\n toType: SchemaType,\n): DataLossSeverity {\n if (fromType === toType) {\n return 'none';\n }\n const rule = findTransformationRule(fromType, toType);\n return rule ? rule.dataLossSeverity : 'certain';\n}\n\nfunction maxSeverity(\n a: DataLossSeverity,\n b: DataLossSeverity,\n): DataLossSeverity {\n const order: DataLossSeverity[] = ['none', 'possible', 'certain'];\n return order[Math.max(order.indexOf(a), order.indexOf(b))] ?? 'certain';\n}\n\nfunction computeOverallSeverity(steps: TransformationStep[]): DataLossSeverity {\n return steps.reduce<DataLossSeverity>(\n (acc, step) => maxSeverity(acc, step.dataLossSeverity),\n 'none',\n );\n}\n\nfunction buildTransformationSteps(\n ctx: TransformationContext,\n): TransformationStep[] {\n const { fromType, toType, fromItemsType, toItemsType } = ctx;\n const steps: TransformationStep[] = [];\n\n if (\n toType === 'array' &&\n toItemsType !== undefined &&\n fromType !== 'array' &&\n fromType !== 'object'\n ) {\n steps.push({ name: 'wrap in array', dataLossSeverity: 'none' });\n if (fromType !== toItemsType) {\n const severity = getConversionSeverity(fromType, toItemsType);\n steps.push({\n name: `${fromType} → ${toItemsType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'array' &&\n fromItemsType !== undefined &&\n toType !== 'array' &&\n toType !== 'object'\n ) {\n steps.push({\n name: 'unwrap array (first element)',\n dataLossSeverity: 'possible',\n });\n if (fromItemsType !== toType) {\n const severity = getConversionSeverity(fromItemsType, toType);\n steps.push({\n name: `${fromItemsType} → ${toType}`,\n dataLossSeverity: severity,\n });\n }\n } else if (\n fromType === 'object' ||\n toType === 'object' ||\n fromType === 'array' ||\n toType === 'array'\n ) {\n steps.push({\n name: `${fromType} → ${toType}`,\n dataLossSeverity: 'certain',\n });\n } else {\n const severity = getConversionSeverity(fromType, toType);\n steps.push({ name: `${fromType} → ${toType}`, dataLossSeverity: severity });\n }\n\n return steps;\n}\n\nfunction computeArrayTransformationExample(\n fromType: SchemaType,\n itemsType: SchemaType,\n): { before: unknown; after: unknown } {\n const before = sampleValues[fromType];\n const transformedValue = transformValue(before, fromType, itemsType);\n return { before, after: [transformedValue] };\n}\n\nfunction computeArrayToPrimitiveExample(\n fromItemsType: SchemaType,\n toType: SchemaType,\n): { before: unknown; after: unknown } {\n const itemValue = sampleValues[fromItemsType];\n const before = [itemValue, itemValue];\n const after = transformValue(itemValue, fromItemsType, toType);\n return { before, after };\n}\n\nexport function getTransformationInfoFromTypeChange(\n fromType: string,\n toType: string,\n): TransformationInfo | null {\n if (fromType === toType) {\n return null;\n }\n\n const from = parseTypeString(fromType);\n const to = parseTypeString(toType);\n\n if (from.baseType === 'unknown' || to.baseType === 'unknown') {\n return null;\n }\n\n if (\n to.baseType === 'array' &&\n to.itemsType &&\n from.baseType !== 'array' &&\n from.baseType !== 'object'\n ) {\n const example = computeArrayTransformationExample(\n from.baseType,\n to.itemsType,\n );\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n toItemsType: to.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n if (\n from.baseType === 'array' &&\n from.itemsType &&\n to.baseType !== 'array' &&\n to.baseType !== 'object'\n ) {\n const example = computeArrayToPrimitiveExample(from.itemsType, to.baseType);\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n fromItemsType: from.itemsType,\n });\n return {\n fromType,\n toType,\n example,\n dataLossSeverity: computeOverallSeverity(steps),\n steps,\n };\n }\n\n const rule = findTransformationRule(from.baseType, to.baseType);\n if (rule) {\n const steps = buildTransformationSteps({\n fromType: from.baseType,\n toType: to.baseType,\n });\n return {\n fromType,\n toType,\n example: rule.example,\n dataLossSeverity: rule.dataLossSeverity,\n steps,\n };\n }\n\n return {\n fromType,\n toType,\n example: { before: '?', after: '?' },\n dataLossSeverity: 'certain',\n steps: [\n {\n name: `${from.baseType} → ${to.baseType}`,\n dataLossSeverity: 'certain',\n },\n ],\n };\n}\n","import type { JsonPatch } from '@revisium/schema-toolkit';\nimport { generateDefaultValue } from '@revisium/schema-toolkit';\n\nexport interface DefaultValueExample {\n value: unknown;\n type: string;\n foreignKeyTableId?: string;\n}\n\ntype SchemaType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'array'\n | 'ref'\n | 'unknown';\n\ninterface SchemaLike {\n $ref?: string;\n type?: string;\n foreignKey?: string;\n}\n\nfunction getTypeFromSchema(schema: SchemaLike): SchemaType {\n if (schema.$ref) {\n return 'ref';\n }\n if (schema.type) {\n return schema.type as SchemaType;\n }\n return 'unknown';\n}\n\nfunction getForeignKeyTableId(schema: SchemaLike): string | undefined {\n if (schema.type === 'string' && schema.foreignKey) {\n return schema.foreignKey || undefined;\n }\n return undefined;\n}\n\nexport function getDefaultValueExample(\n patch: JsonPatch,\n): DefaultValueExample | null {\n if (patch.op !== 'add' || patch.value === undefined) {\n return null;\n }\n\n const schema = patch.value as SchemaLike;\n const value = generateDefaultValue(patch.value, { arrayItemCount: 1 });\n const type = getTypeFromSchema(schema);\n const foreignKeyTableId = getForeignKeyTableId(schema);\n\n return { value, type, foreignKeyTableId };\n}\n","import type { SchemaNode } from '@revisium/schema-toolkit';\n\nexport function traverseTree(\n root: SchemaNode,\n visitor: (node: SchemaNode) => void,\n): void {\n if (root.isNull()) {\n return;\n }\n visitor(root);\n if (root.isObject()) {\n for (const child of root.properties()) {\n traverseTree(child, visitor);\n }\n } else if (root.isArray()) {\n const items = root.items();\n if (!items.isNull()) {\n traverseTree(items, visitor);\n }\n }\n}\n","import type { SchemaModel, SchemaNode } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\n\nexport class TreeNavigator {\n constructor(\n private readonly _getSchemaModel: () => SchemaModel,\n private readonly _treeState: TreeState,\n ) {}\n\n public visibleNodeIds(): string[] {\n const root = this._getSchemaModel().root;\n if (root.isNull()) {\n return [];\n }\n const ids: string[] = [];\n this.collectVisibleNodes(root, ids, true);\n return ids;\n }\n\n public findParentId(nodeId: string): string | null {\n const root = this._getSchemaModel().root;\n if (root.isNull()) {\n return null;\n }\n return this.findParentInTree(root, nodeId);\n }\n\n public isRootId(nodeId: string): boolean {\n return this._getSchemaModel().root.id() === nodeId;\n }\n\n public getNode(nodeId: string): SchemaNode {\n return this._getSchemaModel().nodeById(nodeId);\n }\n\n public nodeHasChildren(node: SchemaNode): boolean {\n if (node.isObject()) {\n return node.properties().length > 0;\n }\n if (node.isArray()) {\n return !node.items().isNull();\n }\n return false;\n }\n\n public getFirstChildId(node: SchemaNode): string | null {\n if (node.isObject()) {\n const first = node.properties()[0];\n if (first) {\n return first.id();\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n return items.id();\n }\n }\n return null;\n }\n\n private collectVisibleNodes(\n node: SchemaNode,\n ids: string[],\n isRoot: boolean,\n ): void {\n if (node.isNull()) {\n return;\n }\n\n ids.push(node.id());\n\n if (!isRoot && !this._treeState.isExpanded(node.id())) {\n return;\n }\n\n if (node.isObject()) {\n for (const child of node.properties()) {\n this.collectVisibleNodes(child, ids, false);\n }\n } else if (node.isArray()) {\n const items = node.items();\n if (!items.isNull()) {\n this.collectVisibleNodes(items, ids, false);\n }\n }\n }\n\n private findParentInTree(node: SchemaNode, targetId: string): string | null {\n if (node.isNull()) {\n return null;\n }\n\n if (node.isObject()) {\n return this.findParentInObject(node, targetId);\n }\n\n if (node.isArray()) {\n return this.findParentInArray(node, targetId);\n }\n\n return null;\n }\n\n private findParentInObject(\n node: SchemaNode,\n targetId: string,\n ): string | null {\n for (const child of node.properties()) {\n if (child.id() === targetId) {\n return node.id();\n }\n const found = this.findParentInTree(child, targetId);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n private findParentInArray(node: SchemaNode, targetId: string): string | null {\n const items = node.items();\n if (items.isNull()) {\n return null;\n }\n if (items.id() === targetId) {\n return node.id();\n }\n return this.findParentInTree(items, targetId);\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaModel } from '@revisium/schema-toolkit';\nimport type { TreeState } from '../state/TreeState';\nimport { traverseTree } from '../utils';\n\nexport class CollapseManager {\n constructor(\n private readonly _treeState: TreeState,\n private readonly _getSchemaModel: () => SchemaModel,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public collapseAll(): void {\n const nodeIds = this.collectAllNodeIds();\n this._treeState.collapseAll(nodeIds, true);\n }\n\n public expandAll(): void {\n const nodeIds = this.collectAllNodeIds();\n this._treeState.expandAll(nodeIds);\n }\n\n public collapseIfComplex(threshold: number): void {\n const nodeCount = this._getSchemaModel().nodeCount;\n if (nodeCount >= threshold) {\n this.collapseAll();\n }\n }\n\n public collapseRefNodes(): void {\n const refNodeIds = this.collectRefNodeIds();\n for (const nodeId of refNodeIds) {\n this._treeState.setExpanded(nodeId, false);\n }\n }\n\n private collectRefNodeIds(): string[] {\n const ids: string[] = [];\n traverseTree(this._getSchemaModel().root, (node) => {\n if (node.isRef() && (node.isObject() || node.isArray())) {\n ids.push(node.id());\n }\n });\n return ids;\n }\n\n private collectAllNodeIds(): string[] {\n const ids: string[] = [];\n traverseTree(this._getSchemaModel().root, (node) => {\n ids.push(node.id());\n });\n return ids;\n }\n}\n","import { makeAutoObservable, reaction, type IReactionDisposer } from 'mobx';\nimport type { TreeState } from '../state/TreeState';\nimport type { AccessorCache } from './AccessorCache';\nimport type { TreeNavigator } from '../utils/TreeNavigator';\n\nexport type KeyboardMode = 'TREE_NAV' | 'EDIT_NAME';\n\ninterface KeyboardEvent {\n key: string;\n shiftKey: boolean;\n preventDefault: () => void;\n}\n\nexport class KeyboardNavigation {\n private _mode: KeyboardMode = 'TREE_NAV';\n private _skipNextEscape = false;\n private _suppressNextReturnFocus = false;\n private _containerRef: HTMLElement | null = null;\n private readonly _disposers: IReactionDisposer[] = [];\n\n constructor(\n private readonly _treeState: TreeState,\n private readonly _navigator: TreeNavigator,\n private readonly _accessors: AccessorCache,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n\n this._disposers.push(\n reaction(\n () => {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return false;\n }\n return this._treeState.isFocused(activeId);\n },\n (isFocused, wasFocused) => {\n if (isFocused && !wasFocused) {\n this._mode = 'EDIT_NAME';\n }\n if (!isFocused && wasFocused) {\n this._mode = 'TREE_NAV';\n this._skipNextEscape = true;\n if (this._suppressNextReturnFocus) {\n this._suppressNextReturnFocus = false;\n } else {\n this.deferReturnFocus();\n }\n }\n },\n ),\n );\n }\n\n public get mode(): KeyboardMode {\n return this._mode;\n }\n\n public get visibleNodeIds(): string[] {\n return this._navigator.visibleNodeIds();\n }\n\n public handleKeyDown(event: KeyboardEvent): void {\n if (this._mode !== 'TREE_NAV') {\n return;\n }\n\n if (event.key !== 'Escape') {\n this._skipNextEscape = false;\n }\n\n if (event.key === 'Tab' && event.shiftKey) {\n event.preventDefault();\n this.moveToPrev();\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n case 'Tab':\n event.preventDefault();\n this.moveToNext();\n return;\n case 'ArrowUp':\n event.preventDefault();\n this.moveToPrev();\n return;\n case 'ArrowRight':\n event.preventDefault();\n this.expandOrMoveToChild();\n return;\n case 'ArrowLeft':\n event.preventDefault();\n this.collapseOrMoveToParent();\n return;\n case ' ':\n event.preventDefault();\n this.toggleExpand();\n return;\n case 'Enter':\n case 'F2':\n case 'i':\n event.preventDefault();\n this.enterEditMode();\n return;\n case 'Insert':\n event.preventDefault();\n this.insertField();\n return;\n case 'Delete':\n case 'Backspace':\n event.preventDefault();\n this.removeNode();\n return;\n case 'Escape':\n event.preventDefault();\n if (this._skipNextEscape) {\n this._skipNextEscape = false;\n return;\n }\n this.deactivateOrRemoveEmpty();\n return;\n }\n }\n\n public setContainerRef(el: HTMLElement | null): void {\n if (this._containerRef && !el) {\n document.removeEventListener('mousedown', this.handleNativeMouseDown);\n }\n this._containerRef = el;\n if (this._containerRef) {\n document.addEventListener('mousedown', this.handleNativeMouseDown);\n }\n }\n\n public returnFocus(): void {\n if (\n this._containerRef &&\n !this._containerRef.contains(document.activeElement)\n ) {\n this._containerRef.focus();\n }\n }\n\n public deactivate(): void {\n this._treeState.setActiveNodeId(null);\n }\n\n private readonly handleNativeMouseDown = (event: Event): void => {\n this._skipNextEscape = false;\n const target = event.target;\n if (!(target instanceof HTMLElement)) {\n return;\n }\n if (this._containerRef?.contains(target)) {\n this._suppressNextReturnFocus = true;\n if (!target.closest('[data-node-id]')) {\n this._treeState.setActiveNodeId(null);\n }\n return;\n }\n const isInsideOverlay = target.closest(\n '[role=\"menu\"], [role=\"listbox\"], [role=\"dialog\"]',\n );\n if (isInsideOverlay) {\n this._suppressNextReturnFocus = true;\n } else {\n this._treeState.setActiveNodeId(null);\n }\n };\n\n public handleEditEnter(): void {\n this.insertField();\n }\n\n public handleNodeAdded(nodeId: string): void {\n this._treeState.setActiveNodeId(nodeId);\n }\n\n public handleNodeReplaced(oldId: string, newId: string): void {\n if (this._treeState.activeNodeId === oldId) {\n this._treeState.setActiveNodeId(newId);\n if (this._mode === 'EDIT_NAME') {\n this._mode = 'TREE_NAV';\n }\n this.deferReturnFocus();\n }\n }\n\n private deferReturnFocus(): void {\n setTimeout(() => this.returnFocus(), 0);\n }\n\n public dispose(): void {\n for (const disposer of this._disposers) {\n disposer();\n }\n this._disposers.length = 0;\n this.setContainerRef(null);\n }\n\n private moveToNext(): void {\n const ids = this.visibleNodeIds;\n if (ids.length === 0) {\n return;\n }\n\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n const firstId = ids[0];\n if (firstId !== undefined) {\n this._treeState.setActiveNodeId(firstId);\n this.scrollToNode(firstId);\n }\n return;\n }\n\n const currentIndex = ids.indexOf(activeId);\n if (currentIndex === -1 || currentIndex >= ids.length - 1) {\n return;\n }\n\n const nextId = ids[currentIndex + 1];\n if (nextId !== undefined) {\n this._treeState.setActiveNodeId(nextId);\n this.scrollToNode(nextId);\n }\n }\n\n private moveToPrev(): void {\n const ids = this.visibleNodeIds;\n if (ids.length === 0) {\n return;\n }\n\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n const lastId = ids.at(-1);\n if (lastId !== undefined) {\n this._treeState.setActiveNodeId(lastId);\n this.scrollToNode(lastId);\n }\n return;\n }\n\n const currentIndex = ids.indexOf(activeId);\n if (currentIndex <= 0) {\n return;\n }\n\n const prevId = ids[currentIndex - 1];\n if (prevId !== undefined) {\n this._treeState.setActiveNodeId(prevId);\n this.scrollToNode(prevId);\n }\n }\n\n private expandOrMoveToChild(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n if (!this._navigator.nodeHasChildren(node)) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && !this._treeState.isExpanded(activeId)) {\n this._treeState.setExpanded(activeId, true);\n return;\n }\n\n const firstChild = this._navigator.getFirstChildId(node);\n if (firstChild) {\n this._treeState.setActiveNodeId(firstChild);\n this.scrollToNode(firstChild);\n }\n }\n\n private collapseOrMoveToParent(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (\n !isRoot &&\n this._navigator.nodeHasChildren(node) &&\n this._treeState.isExpanded(activeId)\n ) {\n this._treeState.setExpanded(activeId, false);\n return;\n }\n\n const parentId = this._navigator.findParentId(activeId);\n if (parentId) {\n this._treeState.setActiveNodeId(parentId);\n this.scrollToNode(parentId);\n }\n }\n\n private toggleExpand(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && this._navigator.nodeHasChildren(node)) {\n this._treeState.toggleExpanded(activeId);\n }\n }\n\n private insertField(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n if (node.isNull()) {\n return;\n }\n\n if (node.isObject()) {\n const accessor = this._accessors.get(activeId);\n accessor.actions.insertFieldAt(0, '');\n return;\n }\n\n const parentId = this._navigator.findParentId(activeId);\n if (!parentId) {\n return;\n }\n\n const parentNode = this._navigator.getNode(parentId);\n if (parentNode.isNull() || !parentNode.isObject()) {\n return;\n }\n\n const siblings = parentNode.properties();\n const currentIndex = siblings.findIndex((s) => s.id() === activeId);\n if (currentIndex === -1) {\n return;\n }\n\n const parentAccessor = this._accessors.get(parentId);\n parentAccessor.actions.insertFieldAt(currentIndex + 1, '');\n }\n\n private enterEditMode(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n this._treeState.requestFocus(activeId);\n }\n\n private deactivateOrRemoveEmpty(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const node = this._navigator.getNode(activeId);\n const isRoot = this._navigator.isRootId(activeId);\n\n if (!isRoot && !node.isNull() && !node.name()) {\n this.removeNode();\n return;\n }\n\n this._treeState.setActiveNodeId(null);\n }\n\n private removeNode(): void {\n const activeId = this._treeState.activeNodeId;\n if (!activeId) {\n return;\n }\n\n const accessor = this._accessors.get(activeId);\n if (!accessor.actions.canRemove) {\n return;\n }\n\n const ids = this.visibleNodeIds;\n const currentIndex = ids.indexOf(activeId);\n\n accessor.actions.remove();\n\n const updatedIds = this.visibleNodeIds;\n if (updatedIds.length === 0) {\n this._treeState.setActiveNodeId(null);\n return;\n }\n\n const nextIndex = Math.min(currentIndex, updatedIds.length - 1);\n const nextId = updatedIds[nextIndex];\n if (nextId !== undefined) {\n this._treeState.setActiveNodeId(nextId);\n }\n }\n\n private scrollToNode(nodeId: string): void {\n if (!this._containerRef) {\n return;\n }\n const el = this._containerRef.querySelector(`[data-node-id=\"${nodeId}\"]`);\n if (el) {\n el.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }\n}\n","import {\n fileSchema,\n rowIdSchema,\n rowCreatedIdSchema,\n rowVersionIdSchema,\n rowCreatedAtSchema,\n rowPublishedAtSchema,\n rowUpdatedAtSchema,\n rowHashSchema,\n rowSchemaHashSchema,\n SystemSchemaIds,\n type RefSchemas,\n} from '@revisium/schema-toolkit';\n\nexport const defaultRefSchemas: RefSchemas = {\n [SystemSchemaIds.File]: fileSchema,\n [SystemSchemaIds.RowId]: rowIdSchema,\n [SystemSchemaIds.RowCreatedId]: rowCreatedIdSchema,\n [SystemSchemaIds.RowVersionId]: rowVersionIdSchema,\n [SystemSchemaIds.RowCreatedAt]: rowCreatedAtSchema,\n [SystemSchemaIds.RowPublishedAt]: rowPublishedAtSchema,\n [SystemSchemaIds.RowUpdatedAt]: rowUpdatedAtSchema,\n [SystemSchemaIds.RowHash]: rowHashSchema,\n [SystemSchemaIds.RowSchemaHash]: rowSchemaHashSchema,\n};\n","import * as mobx from 'mobx';\nimport {\n setReactivityProvider,\n createMobxProvider,\n} from '@revisium/schema-toolkit/core';\n\nlet initialized = false;\n\nexport function ensureReactivityProvider(): void {\n if (initialized) {\n return;\n }\n initialized = true;\n setReactivityProvider(createMobxProvider(mobx));\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n createTableModel,\n type TableModel,\n type SchemaModel,\n type JsonObjectSchema,\n type SchemaPatch,\n type JsonPatch,\n type RefSchemas,\n isValidFieldName,\n FIELD_NAME_ERROR_MESSAGE,\n} from '@revisium/schema-toolkit';\nimport { TreeState } from '../state/TreeState';\nimport {\n NodeAccessor,\n NodeAccessorFactory,\n type NodeActionsCallbacks,\n} from '../accessor';\nimport { AccessorCache } from './AccessorCache';\nimport { ValidationTracker } from './ValidationTracker';\nimport { ViewState } from './ViewState';\nimport { CollapseManager } from './CollapseManager';\nimport { KeyboardNavigation } from './KeyboardNavigation';\nimport { defaultRefSchemas } from '../../config/system-schemas';\nimport { typeIdToFieldType } from '../utils/typeIdMapping';\nimport { TreeNavigator } from '../utils/TreeNavigator';\nimport { ensureReactivityProvider } from '../../../lib/initReactivity';\n\nconst DEFAULT_COLLAPSE_COMPLEXITY = 14;\n\nexport type ForeignKeySelectionCallback = () => Promise<string | null>;\n\nexport interface SchemaEditorCoreOptions {\n tableId?: string;\n refSchemas?: RefSchemas;\n collapseComplexSchemas?: boolean;\n collapseComplexity?: number;\n onCancel?: () => void;\n onSelectForeignKey?: ForeignKeySelectionCallback;\n}\n\nexport class SchemaEditorCore {\n private readonly _tableModel: TableModel;\n private readonly _treeState: TreeState;\n private readonly _onCancel: (() => void) | null;\n private readonly _onSelectForeignKey: ForeignKeySelectionCallback | null;\n\n public readonly accessors: AccessorCache;\n public readonly validation: ValidationTracker;\n public readonly view: ViewState;\n public readonly collapse: CollapseManager;\n public readonly keyboard: KeyboardNavigation;\n\n constructor(\n jsonSchema: JsonObjectSchema,\n options: SchemaEditorCoreOptions = {},\n accessorFactory: NodeAccessorFactory = new NodeAccessorFactory(),\n ) {\n ensureReactivityProvider();\n\n this._tableModel = createTableModel({\n tableId: options.tableId ?? '',\n schema: jsonSchema,\n refSchemas: options.refSchemas ?? defaultRefSchemas,\n });\n\n this._treeState = new TreeState();\n this._onCancel = options.onCancel ?? null;\n this._onSelectForeignKey = options.onSelectForeignKey ?? null;\n\n const callbacks: NodeActionsCallbacks = {\n renameTable: (name) => this.setTableId(name),\n onNodeRemoved: (nodeId) => this.handleNodeRemoved(nodeId),\n onNodeAdded: (nodeId) => this.handleNodeAdded(nodeId),\n onNodeReplaced: (oldId, newId) => this.handleNodeReplaced(oldId, newId),\n selectForeignKey: () => this.selectForeignKey(),\n };\n\n this.accessors = new AccessorCache(\n () => this._tableModel.schema,\n () => ({\n schemaModel: this._tableModel.schema,\n treeState: this._treeState,\n getTableId: () => this._tableModel.tableId,\n getTableIdError: () => this.tableIdError,\n callbacks,\n }),\n accessorFactory,\n );\n\n this.validation = new ValidationTracker(\n this._tableModel,\n this.accessors,\n () => this.tableIdError,\n );\n\n this.view = new ViewState();\n this.collapse = new CollapseManager(\n this._treeState,\n () => this._tableModel.schema,\n );\n this.keyboard = new KeyboardNavigation(\n this._treeState,\n new TreeNavigator(() => this._tableModel.schema, this._treeState),\n this.accessors,\n );\n\n const shouldCollapse = options.collapseComplexSchemas ?? false;\n const complexity =\n options.collapseComplexity ?? DEFAULT_COLLAPSE_COMPLEXITY;\n if (shouldCollapse) {\n this.collapse.collapseIfComplex(complexity);\n }\n\n this.collapse.collapseRefNodes();\n\n makeAutoObservable(\n this,\n {\n accessors: false,\n validation: false,\n view: false,\n collapse: false,\n keyboard: false,\n },\n { autoBind: true },\n );\n }\n\n public get tableModel(): TableModel {\n return this._tableModel;\n }\n\n public get schemaModel(): SchemaModel {\n return this._tableModel.schema;\n }\n\n public get treeState(): TreeState {\n return this._treeState;\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get initialTableId(): string {\n return this._tableModel.baseTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableModel.isRenamed;\n }\n\n public get tableIdError(): string | null {\n const id = this._tableModel.tableId;\n if (id && !isValidFieldName(id)) {\n return FIELD_NAME_ERROR_MESSAGE;\n }\n return null;\n }\n\n public setTableId(value: string): void {\n this._tableModel.rename(value);\n }\n\n public get rootAccessor(): NodeAccessor {\n return this.accessors.get(this._tableModel.schema.root.id(), true);\n }\n\n public get isDirty(): boolean {\n return this._tableModel.isDirty;\n }\n\n public get isValid(): boolean {\n return (\n this._tableModel.schema.isValid &&\n this.tableIdError === null &&\n this._tableModel.tableId.length > 0\n );\n }\n\n public get patchesCount(): number {\n return this.getPatches().length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public markAsSaved(): void {\n this._tableModel.commit();\n this.accessors.clear();\n }\n\n public changeRootType(typeId: string): void {\n const currentRoot = this._tableModel.schema.root;\n if (currentRoot.isNull()) {\n return;\n }\n\n if (typeId === 'Array' && !currentRoot.isArray()) {\n const result = this._tableModel.schema.wrapRootInArray();\n if (result) {\n this.accessors.clear();\n }\n return;\n }\n\n const fieldType = typeIdToFieldType(typeId);\n if (fieldType) {\n const result = this._tableModel.schema.replaceRoot(fieldType);\n if (result) {\n this.accessors.clear();\n }\n }\n }\n\n public async selectForeignKey(): Promise<string | null> {\n if (!this._onSelectForeignKey) {\n return null;\n }\n return this._onSelectForeignKey();\n }\n\n public cancel(): void {\n this._onCancel?.();\n }\n\n public getPatches(): SchemaPatch[] {\n return this._tableModel.schema.patches;\n }\n\n public getJsonPatches(): JsonPatch[] {\n return this._tableModel.schema.jsonPatches;\n }\n\n public getPlainSchema(): JsonObjectSchema {\n return this._tableModel.schema.plainSchema;\n }\n\n public moveNode(fromNodeId: string, toParentId: string): void {\n this._tableModel.schema.moveNode(fromNodeId, toParentId);\n this.accessors.delete(fromNodeId);\n }\n\n public revert(): void {\n this._tableModel.revert();\n this.accessors.clear();\n this._treeState.reset();\n }\n\n public dispose(): void {\n this.keyboard.dispose();\n this.accessors.clear();\n this._treeState.reset();\n }\n\n private handleNodeRemoved(nodeId: string): void {\n this.accessors.delete(nodeId);\n this._treeState.clearNode(nodeId);\n if (this._treeState.activeNodeId === nodeId) {\n this._treeState.setActiveNodeId(null);\n }\n }\n\n private handleNodeAdded(nodeId: string): void {\n this.collapseIfRefNode(nodeId);\n this.keyboard.handleNodeAdded(nodeId);\n }\n\n private handleNodeReplaced(oldNodeId: string, newNodeId: string): void {\n this.accessors.delete(oldNodeId);\n\n if (oldNodeId !== newNodeId) {\n this._treeState.clearNode(oldNodeId);\n }\n\n this._treeState.setMenuOpen(newNodeId, false);\n this.keyboard.handleNodeReplaced(oldNodeId, newNodeId);\n this.collapseIfRefNode(newNodeId);\n }\n\n private collapseIfRefNode(nodeId: string): void {\n const node = this._tableModel.schema.nodeById(nodeId);\n if (node.isRef() && (node.isObject() || node.isArray())) {\n this._treeState.setExpanded(nodeId, false);\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { SchemaModel } from '@revisium/schema-toolkit';\nimport type { SchemaEditorCore } from '../core';\nimport type { KeyboardNavigation } from '../core/KeyboardNavigation';\nimport type { NodeAccessor } from '../accessor';\n\nexport class SchemaTreeVM {\n constructor(private readonly _core: SchemaEditorCore) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get rootAccessor(): NodeAccessor {\n return this._core.rootAccessor;\n }\n\n public get schemaModel(): SchemaModel {\n return this._core.schemaModel;\n }\n\n public getChildAccessors(\n nodeId: string,\n parentIsReadonly: boolean = false,\n ): NodeAccessor[] {\n return this._core.accessors.getChildren(nodeId, parentIsReadonly);\n }\n\n public changeRootType(typeId: string): void {\n this._core.changeRootType(typeId);\n }\n\n public changeNodeType(accessor: NodeAccessor, typeId: string): void {\n if (accessor.isRoot) {\n this._core.changeRootType(typeId);\n } else {\n accessor.actions.changeType(typeId);\n }\n }\n\n public moveNode(fromNodeId: string, toParentId: string): void {\n this._core.moveNode(fromNodeId, toParentId);\n }\n\n public selectForeignKey(): Promise<string | null> {\n return this._core.selectForeignKey();\n }\n\n public get keyboard(): KeyboardNavigation {\n return this._core.keyboard;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n type TableModel,\n type JsonObjectSchema,\n} from '@revisium/schema-toolkit';\n\nexport type CreateTableViewMode = 'Example' | 'Schema';\n\nexport class CreateTableDialogVM {\n private _viewMode: CreateTableViewMode = 'Example';\n private _loading = false;\n\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _onApprove: () => Promise<void>,\n private readonly _onClose: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get viewMode(): CreateTableViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: CreateTableViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public get plainSchema(): JsonObjectSchema {\n return this._tableModel.schema.plainSchema;\n }\n\n public get exampleData(): unknown {\n return this._tableModel.schema.generateDefaultValue({ arrayItemCount: 1 });\n }\n\n public async approve(): Promise<void> {\n this._loading = true;\n try {\n await this._onApprove();\n } finally {\n this._loading = false;\n }\n }\n\n public close(): void {\n this._onClose();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n TableModel,\n SchemaValidationError,\n TreeFormulaValidationError,\n} from '@revisium/schema-toolkit';\n\nexport class ReviewErrorsDialogVM {\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _getTableIdError: () => string | null,\n private readonly _getFormulaInputErrors: () => TreeFormulaValidationError[],\n private readonly _onRevert?: () => void,\n private readonly _onClose?: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get canRevert(): boolean {\n return this._onRevert !== undefined;\n }\n\n public revert(): void {\n this._onRevert?.();\n this._onClose?.();\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get tableIdError(): string | null {\n return this._getTableIdError();\n }\n\n public get validationErrors(): readonly SchemaValidationError[] {\n return this._tableModel.schema.validationErrors;\n }\n\n public get formulaErrors(): TreeFormulaValidationError[] {\n const schemaErrors = this._tableModel.schema.formulaErrors;\n const inputErrors = this._getFormulaInputErrors();\n return [...schemaErrors, ...inputErrors];\n }\n\n public get hasErrors(): boolean {\n return (\n this.validationErrors.length > 0 ||\n this.formulaErrors.length > 0 ||\n this.tableIdError !== null\n );\n }\n\n public get errorsCount(): number {\n let count = this.validationErrors.length + this.formulaErrors.length;\n if (this.tableIdError !== null) {\n count += 1;\n }\n return count;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { JsonObjectSchema } from '@revisium/schema-toolkit';\nimport {\n SchemaEditorCore,\n type SchemaEditorCoreOptions,\n type ViewMode,\n} from '../core';\nimport { SchemaTreeVM } from './SchemaTreeVM';\nimport { CreateTableDialogVM } from '../dialog/CreateTableDialogVM';\nimport { ReviewErrorsDialogVM } from '../dialog/ReviewErrorsDialogVM';\n\nexport type CreateDialogViewMode = 'Example' | 'Schema';\n\nexport interface CreatingEditorVMOptions extends SchemaEditorCoreOptions {\n onApprove?: () => Promise<boolean>;\n}\n\nexport class CreatingEditorVM {\n private readonly _core: SchemaEditorCore;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n\n public readonly tree: SchemaTreeVM;\n\n private _isErrorsDialogOpen = false;\n private _isCreateDialogOpen = false;\n private _createDialogViewMode: CreateDialogViewMode = 'Example';\n\n constructor(\n coreOrSchema: SchemaEditorCore | JsonObjectSchema,\n options: CreatingEditorVMOptions = {},\n ) {\n if (coreOrSchema instanceof SchemaEditorCore) {\n this._core = coreOrSchema;\n } else {\n this._core = new SchemaEditorCore(coreOrSchema, options);\n }\n this._onApprove = options.onApprove ?? null;\n this.tree = new SchemaTreeVM(this._core);\n\n makeAutoObservable(this, { tree: false }, { autoBind: true });\n }\n\n // ============ Mode ============\n\n public get mode(): 'creating' {\n return 'creating';\n }\n\n // ============ Table ID ============\n\n public get tableId(): string {\n return this._core.tableId;\n }\n\n public get initialTableId(): string {\n return this._core.initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._core.isTableIdChanged;\n }\n\n public get tableIdError(): string | null {\n return this._core.tableIdError;\n }\n\n public setTableId(value: string): void {\n this._core.setTableId(value);\n }\n\n // ============ State ============\n\n public get isDirty(): boolean {\n return this._core.isDirty;\n }\n\n public get isValid(): boolean {\n return this._core.isValid;\n }\n\n public markAsSaved(): void {\n this._core.markAsSaved();\n }\n\n // ============ Toolbar ============\n\n public get loading(): boolean {\n return this._core.view.loading;\n }\n\n public get viewMode(): ViewMode {\n return this._core.view.viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._core.view.setViewMode(mode);\n }\n\n public cancel(): void {\n this._core.cancel();\n }\n\n public collapseAll(): void {\n this._core.collapse.collapseAll();\n }\n\n public expandAll(): void {\n this._core.collapse.expandAll();\n }\n\n // ============ Errors Dialog ============\n\n public get showReviewErrorsButton(): boolean {\n return this._core.validation.hasErrors;\n }\n\n public get errorsCount(): number {\n return this._core.validation.errorsCount;\n }\n\n public get isErrorsDialogOpen(): boolean {\n return this._isErrorsDialogOpen;\n }\n\n public openErrorsDialog(): void {\n this._isErrorsDialogOpen = true;\n }\n\n public closeErrorsDialog(): void {\n this._isErrorsDialogOpen = false;\n }\n\n public get errorsDialogVM(): ReviewErrorsDialogVM {\n return new ReviewErrorsDialogVM(\n this._core.tableModel,\n () => this._core.tableIdError,\n () => this._core.validation.collectFormulaInputErrors(),\n );\n }\n\n // ============ Create Dialog ============\n\n public get showCreateTableButton(): boolean {\n return this._core.isValid && !this._core.validation.hasErrors;\n }\n\n public get isCreateDialogOpen(): boolean {\n return this._isCreateDialogOpen;\n }\n\n public openCreateDialog(): void {\n this._isCreateDialogOpen = true;\n }\n\n public closeCreateDialog(): void {\n this._isCreateDialogOpen = false;\n }\n\n public get createDialogViewMode(): CreateDialogViewMode {\n return this._createDialogViewMode;\n }\n\n public setCreateDialogViewMode(mode: CreateDialogViewMode): void {\n this._createDialogViewMode = mode;\n }\n\n public get createDialogVM(): CreateTableDialogVM {\n return new CreateTableDialogVM(\n this._core.tableModel,\n () => this.approve(),\n () => this.closeCreateDialog(),\n );\n }\n\n // ============ Actions ============\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._core.view.setLoading(true);\n try {\n const success = await this._onApprove();\n if (success) {\n this._core.markAsSaved();\n this.closeCreateDialog();\n }\n } finally {\n this._core.view.setLoading(false);\n }\n }\n\n // ============ View Data ============\n\n public getPlainSchema(): JsonObjectSchema {\n return this._core.getPlainSchema();\n }\n\n public dispose(): void {\n this._core.dispose();\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport type {\n TableModel,\n SchemaPatch,\n JsonPatch,\n} from '@revisium/schema-toolkit';\n\nexport type ReviewChangesViewMode = 'Changes' | 'Patches';\n\nexport interface TableIdChangeInfo {\n initialTableId: string;\n currentTableId: string;\n}\n\nexport class ReviewChangesDialogVM {\n private _viewMode: ReviewChangesViewMode = 'Changes';\n private _loading = false;\n\n constructor(\n private readonly _tableModel: TableModel,\n private readonly _onApprove: () => Promise<void>,\n private readonly _onRevert: () => void,\n private readonly _onClose: () => void,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n public get tableId(): string {\n return this._tableModel.tableId;\n }\n\n public get initialTableId(): string {\n return this._tableModel.baseTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._tableModel.isRenamed;\n }\n\n public get tableIdChange(): TableIdChangeInfo | null {\n if (!this.isTableIdChanged) {\n return null;\n }\n return {\n initialTableId: this.initialTableId,\n currentTableId: this.tableId,\n };\n }\n\n public get patches(): SchemaPatch[] {\n return this._tableModel.schema.patches;\n }\n\n public get jsonPatches(): JsonPatch[] {\n return this._tableModel.schema.jsonPatches;\n }\n\n public get patchesCount(): number {\n return this.patches.length;\n }\n\n public get totalChangesCount(): number {\n return this.patchesCount + (this.isTableIdChanged ? 1 : 0);\n }\n\n public get hasChanges(): boolean {\n return this.patchesCount > 0 || this.isTableIdChanged;\n }\n\n public get viewMode(): ReviewChangesViewMode {\n return this._viewMode;\n }\n\n public setViewMode(mode: ReviewChangesViewMode): void {\n this._viewMode = mode;\n }\n\n public get loading(): boolean {\n return this._loading;\n }\n\n public async approve(): Promise<void> {\n this._loading = true;\n try {\n await this._onApprove();\n } finally {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n\n public revert(): void {\n this._onRevert();\n this._onClose();\n }\n\n public close(): void {\n this._onClose();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { JsonObjectSchema } from '@revisium/schema-toolkit';\nimport {\n SchemaEditorCore,\n type SchemaEditorCoreOptions,\n type ViewMode,\n} from '../core';\nimport { SchemaTreeVM } from './SchemaTreeVM';\nimport { ReviewChangesDialogVM } from '../dialog/ReviewChangesDialogVM';\nimport { ReviewErrorsDialogVM } from '../dialog/ReviewErrorsDialogVM';\n\nexport type UpdateDialogViewMode = 'Changes' | 'Patches';\n\nexport interface UpdatingEditorVMOptions extends SchemaEditorCoreOptions {\n onApprove?: () => Promise<boolean>;\n}\n\nexport class UpdatingEditorVM {\n private readonly _core: SchemaEditorCore;\n private readonly _onApprove: (() => Promise<boolean>) | null;\n\n public readonly tree: SchemaTreeVM;\n\n private _isErrorsDialogOpen = false;\n private _isChangesDialogOpen = false;\n private _updateDialogViewMode: UpdateDialogViewMode = 'Changes';\n\n constructor(\n coreOrSchema: SchemaEditorCore | JsonObjectSchema,\n options: UpdatingEditorVMOptions = {},\n ) {\n if (coreOrSchema instanceof SchemaEditorCore) {\n this._core = coreOrSchema;\n } else {\n this._core = new SchemaEditorCore(coreOrSchema, options);\n }\n this._onApprove = options.onApprove ?? null;\n this.tree = new SchemaTreeVM(this._core);\n\n makeAutoObservable(this, { tree: false }, { autoBind: true });\n }\n\n // ============ Mode ============\n\n public get mode(): 'updating' {\n return 'updating';\n }\n\n // ============ Table ID ============\n\n public get tableId(): string {\n return this._core.tableId;\n }\n\n public get initialTableId(): string {\n return this._core.initialTableId;\n }\n\n public get isTableIdChanged(): boolean {\n return this._core.isTableIdChanged;\n }\n\n public get tableIdError(): string | null {\n return this._core.tableIdError;\n }\n\n public setTableId(value: string): void {\n this._core.setTableId(value);\n }\n\n // ============ State ============\n\n public get isDirty(): boolean {\n return this._core.isDirty;\n }\n\n public get isValid(): boolean {\n return this._core.isValid;\n }\n\n public markAsSaved(): void {\n this._core.markAsSaved();\n }\n\n // ============ Toolbar ============\n\n public get loading(): boolean {\n return this._core.view.loading;\n }\n\n public get viewMode(): ViewMode {\n return this._core.view.viewMode;\n }\n\n public setViewMode(mode: ViewMode): void {\n this._core.view.setViewMode(mode);\n }\n\n public cancel(): void {\n this._core.cancel();\n }\n\n public collapseAll(): void {\n this._core.collapse.collapseAll();\n }\n\n public expandAll(): void {\n this._core.collapse.expandAll();\n }\n\n // ============ Errors Dialog ============\n\n public get showReviewErrorsButton(): boolean {\n return this._core.validation.hasErrors;\n }\n\n public get errorsCount(): number {\n return this._core.validation.errorsCount;\n }\n\n public get isErrorsDialogOpen(): boolean {\n return this._isErrorsDialogOpen;\n }\n\n public openErrorsDialog(): void {\n this._isErrorsDialogOpen = true;\n }\n\n public closeErrorsDialog(): void {\n this._isErrorsDialogOpen = false;\n }\n\n public get errorsDialogVM(): ReviewErrorsDialogVM {\n return new ReviewErrorsDialogVM(\n this._core.tableModel,\n () => this._core.tableIdError,\n () => this._core.validation.collectFormulaInputErrors(),\n () => this.revert(),\n () => this.closeErrorsDialog(),\n );\n }\n\n // ============ Changes Dialog ============\n\n public get showApplyChangesButton(): boolean {\n return (\n this._core.isValid &&\n !this._core.validation.hasErrors &&\n (this._core.isDirty || this._core.isTableIdChanged)\n );\n }\n\n public get totalChangesCount(): number {\n return this._core.totalChangesCount;\n }\n\n public get isChangesDialogOpen(): boolean {\n return this._isChangesDialogOpen;\n }\n\n public openChangesDialog(): void {\n this._isChangesDialogOpen = true;\n }\n\n public closeChangesDialog(): void {\n this._isChangesDialogOpen = false;\n }\n\n public get updateDialogViewMode(): UpdateDialogViewMode {\n return this._updateDialogViewMode;\n }\n\n public setUpdateDialogViewMode(mode: UpdateDialogViewMode): void {\n this._updateDialogViewMode = mode;\n }\n\n public get changesDialogVM(): ReviewChangesDialogVM {\n return new ReviewChangesDialogVM(\n this._core.tableModel,\n () => this.approve(),\n () => this.revert(),\n () => this.closeChangesDialog(),\n );\n }\n\n // ============ Actions ============\n\n public revert(): void {\n this._core.revert();\n }\n\n public async approve(): Promise<void> {\n if (!this._onApprove) {\n return;\n }\n this._core.view.setLoading(true);\n try {\n const success = await this._onApprove();\n if (success) {\n this._core.markAsSaved();\n this.closeChangesDialog();\n }\n } finally {\n this._core.view.setLoading(false);\n }\n }\n\n // ============ View Data ============\n\n public getPlainSchema(): JsonObjectSchema {\n return this._core.getPlainSchema();\n }\n\n public getPatches() {\n return this._core.getPatches();\n }\n\n public getJsonPatches() {\n return this._core.getJsonPatches();\n }\n\n public dispose(): void {\n this._core.dispose();\n }\n}\n","import { Tooltip as ChakraTooltip, Portal } from '@chakra-ui/react';\nimport * as React from 'react';\n\nexport interface TooltipProps extends ChakraTooltip.RootProps {\n showArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement>;\n content: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n}\n\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n function Tooltip(props, ref) {\n const {\n showArrow,\n children,\n disabled,\n portalled = true,\n content,\n contentProps,\n portalRef,\n ...rest\n } = props;\n\n if (disabled) {\n return <>{children}</>;\n }\n\n return (\n <ChakraTooltip.Root {...rest}>\n <ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content ref={ref} {...contentProps}>\n {showArrow && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {content}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n },\n);\n","export interface NodeUIState {\n isExpanded: boolean;\n isFocused: boolean;\n isMenuOpen: boolean;\n isSettingsOpen: boolean;\n}\n\nexport interface FormulaState {\n inputValue: string | null;\n errorValue: string | null;\n}\n\nexport interface DragState {\n isDragging: boolean;\n isDraggedOver: boolean;\n}\n\nexport enum ViewerSwitcherMode {\n Tree = 'Tree',\n Json = 'Json',\n RefBy = 'RefBy',\n}\n","import { Button, Icon, Menu, Portal } from '@chakra-ui/react';\nimport React, { useMemo, useState } from 'react';\nimport {\n PiBracketsCurlyThin,\n PiCaretDownLight,\n PiLinkThin,\n PiTreeViewThin,\n} from 'react-icons/pi';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport { ViewerSwitcherMode } from '../../schema-editor/types';\n\nconst modes: {\n mode: ViewerSwitcherMode;\n label: string;\n icon: React.ElementType;\n dataTestId?: string;\n}[] = [\n {\n mode: ViewerSwitcherMode.Tree,\n label: 'Tree',\n icon: PiTreeViewThin,\n dataTestId: 'row-editor-mode-tree',\n },\n {\n mode: ViewerSwitcherMode.Json,\n label: 'JSON',\n icon: PiBracketsCurlyThin,\n dataTestId: 'row-editor-mode-json',\n },\n {\n mode: ViewerSwitcherMode.RefBy,\n label: 'References',\n icon: PiLinkThin,\n dataTestId: 'row-editor-mode-refs',\n },\n];\n\ninterface ViewerSwitcherProps {\n mode: ViewerSwitcherMode;\n availableRefByMode?: boolean;\n onChange?: (mode: ViewerSwitcherMode) => void;\n}\n\nexport const ViewerSwitcher: React.FC<ViewerSwitcherProps> = ({\n mode,\n onChange,\n availableRefByMode,\n}) => {\n const [menuOpen, setMenuOpen] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n const currentModes = useMemo(\n () =>\n modes.filter(\n (item) =>\n !(item.mode === ViewerSwitcherMode.RefBy && !availableRefByMode),\n ),\n [availableRefByMode],\n );\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const currentMode = modes.find((m) => m.mode === mode) ?? modes[0]!;\n\n const handleValueChange = (details: { value: string }) => {\n const selectedMode = modes.find(\n (m) => m.mode === (details.value as ViewerSwitcherMode),\n );\n if (selectedMode) {\n onChange?.(selectedMode.mode);\n }\n };\n\n return (\n <Menu.Root onOpenChange={({ open }) => setMenuOpen(open)}>\n <Menu.Trigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n height=\"2.5rem\"\n color=\"gray.500\"\n _hover={{ backgroundColor: 'gray.50', '& .caret': { opacity: 1 } }}\n _focus={{ outline: 'none', boxShadow: 'none' }}\n _focusVisible={{ outline: 'none', boxShadow: 'none' }}\n data-testid=\"view-mode-switcher\"\n px=\"8px\"\n gap=\"2px\"\n >\n <Tooltip\n open={!menuOpen && tooltipOpen}\n onOpenChange={(details) => setTooltipOpen(details.open)}\n content=\"View mode\"\n openDelay={500}\n closeDelay={0}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: '2px' }}>\n <Icon as={currentMode.icon} boxSize={4} />\n <Icon\n as={PiCaretDownLight}\n boxSize={3}\n color=\"gray.400\"\n className=\"caret\"\n opacity={0}\n transition=\"opacity 0.15s\"\n />\n </span>\n </Tooltip>\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minWidth=\"140px\">\n <Menu.RadioItemGroup value={mode} onValueChange={handleValueChange}>\n {currentModes.map((item) => (\n <Menu.RadioItem\n key={item.mode}\n value={item.mode}\n data-testid={item.dataTestId}\n cursor=\"pointer\"\n >\n <Menu.ItemIndicator />\n <Icon as={item.icon} boxSize={4} mr=\"8px\" />\n {item.label}\n </Menu.RadioItem>\n ))}\n </Menu.RadioItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiCopy } from 'react-icons/pi';\n\ninterface CopyButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const CopyButton: FC<CopyButtonProps> = ({ dataTestId, ...props }) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.100' }}\n color=\"gray.400\"\n variant=\"ghost\"\n {...props}\n >\n <PiCopy />\n </IconButton>\n );\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { githubLight } from '@uiw/codemirror-theme-github';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { json } from '@codemirror/lang-json';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { CopyButton } from '../CopyButton/CopyButton';\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\ninterface JsonCardProps {\n data: JsonValue;\n readonly?: boolean;\n onChange?: (data: JsonValue) => void;\n onBlur?: () => void;\n onCopy?: () => void;\n}\n\nexport const JsonCard: React.FC<JsonCardProps> = ({\n data,\n readonly,\n onChange,\n onBlur,\n onCopy,\n}) => {\n const [error, setError] = useState('');\n const externalText = JSON.stringify(data, null, 3);\n const [internalText, setInternalText] = useState(externalText);\n const isFocusedRef = useRef(false);\n\n const displayText = isFocusedRef.current ? internalText : externalText;\n\n const handleClick = useCallback(() => {\n void navigator.clipboard.writeText(displayText).then(() => {\n onCopy?.();\n });\n }, [displayText, onCopy]);\n\n const handleChange = useCallback(\n (value: string) => {\n setInternalText(value);\n\n try {\n const parsedData = JSON.parse(value) as JsonValue;\n setError('');\n onChange?.(parsedData);\n } catch (e) {\n console.error(e);\n setError('Invalid JSON');\n }\n },\n [onChange],\n );\n\n const handleFocus = useCallback(() => {\n isFocusedRef.current = true;\n setInternalText(externalText);\n }, [externalText]);\n\n const handleBlur = useCallback(() => {\n isFocusedRef.current = false;\n setInternalText(externalText);\n onBlur?.();\n }, [onBlur, externalText]);\n\n const hoverStyles = {\n '&:hover .copy-button': { visibility: 'visible' as const },\n };\n\n return (\n <Flex\n position=\"relative\"\n width=\"100%\"\n flex={1}\n direction=\"column\"\n gap=\"1rem\"\n css={hoverStyles}\n >\n <Box p={1} flex={1}>\n <CodeMirror\n value={displayText}\n extensions={[EditorView.lineWrapping, json()]}\n editable={!readonly}\n theme={githubLight}\n maxWidth=\"100%\"\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n }}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n />\n <CopyButton\n dataTestId=\"json-card-copy-button\"\n aria-label=\"\"\n position=\"absolute\"\n top=\"8px\"\n right=\"8px\"\n className=\"copy-button\"\n visibility=\"hidden\"\n onClick={handleClick}\n />\n </Box>\n <Flex\n height=\"40px\"\n paddingBottom=\"8px\"\n alignItems=\"flex-end\"\n backgroundColor=\"white\"\n width=\"100%\"\n position=\"sticky\"\n bottom={0}\n justifyContent=\"center\"\n >\n <Text color=\"gray\">{error}</Text>\n </Flex>\n </Flex>\n );\n};\n","import {\n FocusEventHandler,\n FormEventHandler,\n KeyboardEventHandler,\n RefCallback,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n} from 'react';\n\nexport interface UseContentEditableOptions {\n value: string;\n onChange?: (value: string) => void;\n onBlur?: () => void;\n onFocus?: () => void;\n onEscape?: () => void;\n onEnter?: () => void;\n restrict?: RegExp;\n autoFocus?: boolean;\n focusTrigger?: number;\n}\n\nexport type UseContentEditableReturn = {\n ref: RefCallback<HTMLElement>;\n contentEditable: true;\n spellCheck: false;\n dangerouslySetInnerHTML: { __html: string };\n onInput: FormEventHandler<HTMLElement>;\n onBlur: FormEventHandler<HTMLElement>;\n onFocus: FocusEventHandler<HTMLElement>;\n onKeyDown: KeyboardEventHandler<HTMLElement>;\n};\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&#039;');\n}\n\nconst allowed = new Set([\n 'Backspace',\n 'Escape',\n 'Enter',\n 'ArrowRight',\n 'ArrowLeft',\n 'Delete',\n]);\n\nexport function useContentEditable(\n options: UseContentEditableOptions,\n): UseContentEditableReturn {\n const { value, autoFocus, focusTrigger } = options;\n\n const elementRef = useRef<HTMLElement | null>(null);\n const cursorPosition = useRef<number | null>(null);\n const prevFocusTriggerRef = useRef(focusTrigger);\n\n const optionsRef = useRef(options);\n optionsRef.current = options;\n\n const ref: RefCallback<HTMLElement> = useCallback((node) => {\n elementRef.current = node;\n }, []);\n\n useEffect(() => {\n if (autoFocus) {\n elementRef.current?.focus();\n }\n }, [autoFocus]);\n\n useLayoutEffect(() => {\n const selection = globalThis.getSelection();\n if (selection && cursorPosition.current !== null && elementRef.current) {\n const maxPosition = (elementRef.current.textContent || '').length;\n const position = Math.min(maxPosition, cursorPosition.current);\n\n const range = document.createRange();\n const sel = globalThis.getSelection();\n const firstChild = elementRef.current.childNodes[0];\n const node: Node = firstChild ?? elementRef.current;\n range.setStart(node, position);\n range.collapse(true);\n\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n });\n\n useEffect(() => {\n if (prevFocusTriggerRef.current === focusTrigger) {\n return;\n }\n prevFocusTriggerRef.current = focusTrigger;\n\n elementRef.current?.focus();\n const selection = globalThis.getSelection();\n\n if (elementRef.current && selection) {\n const range = document.createRange();\n range.selectNodeContents(elementRef.current);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }, [focusTrigger]);\n\n const handleInput: FormEventHandler<HTMLElement> = useCallback((event) => {\n const selection = globalThis.getSelection();\n if (selection && selection.rangeCount > 0) {\n cursorPosition.current = selection.getRangeAt(0).startOffset;\n }\n\n const textValue = event.currentTarget.innerText;\n const val = textValue === '\\n' ? '' : textValue;\n optionsRef.current.onChange?.(val);\n }, []);\n\n const handleBlur: FormEventHandler<HTMLElement> = useCallback(() => {\n optionsRef.current.onBlur?.();\n cursorPosition.current = null;\n }, []);\n\n const handleFocus: FocusEventHandler<HTMLElement> = useCallback(() => {\n optionsRef.current.onFocus?.();\n }, []);\n\n const handleKeyDown: KeyboardEventHandler<HTMLElement> = useCallback(\n (event) => {\n const opts = optionsRef.current;\n\n if (event.key === 'Enter') {\n event.preventDefault();\n\n if (opts.value) {\n elementRef.current?.blur();\n opts.onEnter?.();\n }\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n elementRef.current?.blur();\n opts.onEscape?.();\n }\n\n if (\n opts.restrict &&\n !event.metaKey &&\n !event.ctrlKey &&\n !allowed.has(event.key) &&\n !opts.restrict.test(event.key)\n ) {\n event.preventDefault();\n }\n },\n [],\n );\n\n return {\n ref,\n contentEditable: true,\n spellCheck: false,\n dangerouslySetInnerHTML: { __html: escapeHtml(value) },\n onInput: handleInput,\n onBlur: handleBlur,\n onFocus: handleFocus,\n onKeyDown: handleKeyDown,\n };\n}\n","import { Box, BoxProps, Flex, Text } from '@chakra-ui/react';\nimport React, { useCallback, useRef } from 'react';\nimport {\n useContentEditable,\n type UseContentEditableOptions,\n} from '../../hooks/useContentEditable';\n\nexport interface ContentEditableProps extends Pick<\n UseContentEditableOptions,\n | 'onChange'\n | 'onBlur'\n | 'onFocus'\n | 'onEscape'\n | 'onEnter'\n | 'restrict'\n | 'autoFocus'\n | 'focusTrigger'\n> {\n initValue: string;\n placeholder?: string;\n prefix?: string;\n postfix?: string;\n dataTestId?: string;\n textDecoration?: BoxProps['textDecoration'];\n}\n\nexport const ContentEditable: React.FC<ContentEditableProps> = ({\n initValue,\n placeholder,\n autoFocus,\n onBlur,\n onChange,\n onEscape,\n onEnter,\n onFocus,\n focusTrigger,\n restrict,\n prefix,\n postfix,\n dataTestId,\n textDecoration,\n}) => {\n const elementRef = useRef<HTMLElement | null>(null);\n\n const editableProps = useContentEditable({\n value: initValue,\n onChange,\n onBlur,\n onFocus,\n onEscape,\n onEnter,\n restrict,\n autoFocus,\n focusTrigger,\n });\n\n const hookRef = editableProps.ref;\n const combinedRef = useCallback(\n (node: HTMLElement | null) => {\n elementRef.current = node;\n hookRef(node);\n },\n [hookRef],\n );\n\n const handleParentClick = useCallback(() => {\n elementRef.current?.focus();\n }, []);\n\n const showPlaceholder = !initValue && placeholder;\n\n return (\n <Flex\n minWidth={0}\n width={showPlaceholder ? '100%' : undefined}\n position=\"relative\"\n cursor=\"text\"\n onClick={handleParentClick}\n >\n {!showPlaceholder && prefix}\n <Box\n color=\"blackAlpha.800\"\n textDecoration={textDecoration}\n data-testid={dataTestId}\n ref={combinedRef}\n contentEditable={editableProps.contentEditable}\n spellCheck={editableProps.spellCheck}\n dangerouslySetInnerHTML={editableProps.dangerouslySetInnerHTML}\n outline={0}\n width=\"100%\"\n onBlur={editableProps.onBlur}\n onFocus={editableProps.onFocus}\n onInput={editableProps.onInput}\n onKeyDown={editableProps.onKeyDown}\n ></Box>\n {!showPlaceholder && postfix}\n {showPlaceholder && (\n <Text\n cursor=\"text\"\n userSelect=\"none\"\n pointerEvents=\"none\"\n whiteSpace=\"nowrap\"\n color=\"gray.400\"\n position=\"absolute\"\n >\n {placeholder}\n </Text>\n )}\n </Flex>\n );\n};\n","export const SEGMENT_COLOR = '#71717A';\nexport const SEPARATOR_COLOR = '#a3a3a3';\nexport const CURRENT_COLOR = '#000';\nexport const HOVER_BG = '#F5F5F5';\n\nexport const BREADCRUMB_FONT_SIZE = '16px';\nexport const BREADCRUMB_BORDER_RADIUS = '6px';\nexport const BREADCRUMB_PADDING = '4px';\n","import { Box, Text } from '@chakra-ui/react';\nimport React, { useCallback, useRef, useState } from 'react';\nimport { useContentEditable } from '../../hooks/useContentEditable';\nimport { Tooltip } from '../Tooltip';\nimport { type BreadcrumbEditableProps } from './Breadcrumbs';\nimport {\n BREADCRUMB_BORDER_RADIUS,\n BREADCRUMB_PADDING,\n CURRENT_COLOR,\n HOVER_BG,\n} from './constants';\n\nexport const EditableSegment: React.FC<BreadcrumbEditableProps> = ({\n value,\n onChange,\n onBlur,\n tooltip,\n placeholder,\n dataTestId,\n}) => {\n const [focused, setFocused] = useState(false);\n const elementRef = useRef<HTMLElement | null>(null);\n const valueRef = useRef(value);\n valueRef.current = value;\n const onBlurRef = useRef(onBlur);\n onBlurRef.current = onBlur;\n\n const handleFocus = useCallback(() => {\n setFocused(true);\n }, []);\n\n const handleBlur = useCallback(() => {\n setFocused(false);\n onBlurRef.current?.(valueRef.current);\n }, []);\n\n const editableProps = useContentEditable({\n value,\n onChange,\n onBlur: handleBlur,\n onFocus: handleFocus,\n });\n\n const hookRef = editableProps.ref;\n const combinedRef = useCallback(\n (node: HTMLElement | null) => {\n elementRef.current = node;\n hookRef(node);\n },\n [hookRef],\n );\n\n const handleParentClick = useCallback(() => {\n elementRef.current?.focus();\n }, []);\n\n const showPlaceholder = !value && !focused && !!placeholder;\n\n const box = (\n <Box\n borderRadius={BREADCRUMB_BORDER_RADIUS}\n px={BREADCRUMB_PADDING}\n py={BREADCRUMB_PADDING}\n bg={focused || showPlaceholder ? HOVER_BG : undefined}\n _hover={{ bg: HOVER_BG }}\n cursor=\"text\"\n onClick={handleParentClick}\n position=\"relative\"\n >\n {showPlaceholder && (\n <Text\n pointerEvents=\"none\"\n userSelect=\"none\"\n whiteSpace=\"nowrap\"\n color=\"gray.400\"\n fontWeight=\"400\"\n >\n {placeholder}\n </Text>\n )}\n <Box\n ref={combinedRef}\n color={CURRENT_COLOR}\n fontWeight=\"600\"\n outline={0}\n whiteSpace=\"nowrap\"\n data-testid={dataTestId}\n contentEditable={editableProps.contentEditable}\n spellCheck={editableProps.spellCheck}\n dangerouslySetInnerHTML={editableProps.dangerouslySetInnerHTML}\n onInput={editableProps.onInput}\n onBlur={editableProps.onBlur}\n onFocus={editableProps.onFocus}\n onKeyDown={editableProps.onKeyDown}\n {...(showPlaceholder\n ? { position: 'absolute' as const, inset: 0 }\n : {})}\n />\n </Box>\n );\n\n if (tooltip) {\n return (\n <Tooltip\n content={tooltip}\n openDelay={300}\n open={focused ? false : undefined}\n closeOnClick={false}\n >\n {box}\n </Tooltip>\n );\n }\n\n return box;\n};\n","import { Text } from '@chakra-ui/react';\nimport { Breadcrumb } from '@chakra-ui/react/breadcrumb';\nimport React from 'react';\nimport { type BreadcrumbSegment } from './Breadcrumbs';\nimport {\n BREADCRUMB_BORDER_RADIUS,\n BREADCRUMB_PADDING,\n CURRENT_COLOR,\n HOVER_BG,\n SEGMENT_COLOR,\n} from './constants';\n\ninterface SegmentContentProps {\n segment: BreadcrumbSegment;\n isHighlighted: boolean;\n onClick?: () => void;\n}\n\nexport const SegmentContent: React.FC<SegmentContentProps> = ({\n segment,\n isHighlighted,\n onClick,\n}) => {\n if (isHighlighted) {\n return (\n <Breadcrumb.CurrentLink\n color={CURRENT_COLOR}\n fontWeight=\"600\"\n data-testid={segment.dataTestId}\n >\n {segment.label}\n </Breadcrumb.CurrentLink>\n );\n }\n\n if (onClick) {\n return (\n <Breadcrumb.Link\n as=\"button\"\n color={SEGMENT_COLOR}\n borderRadius={BREADCRUMB_BORDER_RADIUS}\n px={BREADCRUMB_PADDING}\n py={BREADCRUMB_PADDING}\n focusRing=\"none\"\n cursor=\"pointer\"\n _hover={{ bg: HOVER_BG }}\n _focusVisible={{ bg: HOVER_BG }}\n onClick={onClick}\n data-testid={segment.dataTestId}\n >\n {segment.label}\n </Breadcrumb.Link>\n );\n }\n\n return (\n <Text color={SEGMENT_COLOR} data-testid={segment.dataTestId}>\n {segment.label}\n </Text>\n );\n};\n","import { Flex, Text } from '@chakra-ui/react';\nimport { Breadcrumb } from '@chakra-ui/react/breadcrumb';\nimport React, { Fragment } from 'react';\nimport {\n BREADCRUMB_FONT_SIZE,\n BREADCRUMB_PADDING,\n SEPARATOR_COLOR,\n} from './constants';\nimport { EditableSegment } from './EditableSegment';\nimport { SegmentContent } from './SegmentContent';\n\nexport interface BreadcrumbSegment {\n label: string;\n dataTestId?: string;\n}\n\nexport interface BreadcrumbEditableProps {\n value: string;\n onChange?: (value: string) => void;\n onBlur?: (value: string) => void;\n tooltip?: string;\n placeholder?: string;\n dataTestId?: string;\n}\n\nexport interface BreadcrumbsProps {\n segments: BreadcrumbSegment[];\n separator?: string;\n dataTestId?: string;\n highlightLast?: boolean;\n onSegmentClick?: (segment: BreadcrumbSegment, index: number) => void;\n editable?: BreadcrumbEditableProps;\n action?: React.ReactNode;\n}\n\nexport const Breadcrumbs: React.FC<BreadcrumbsProps> = ({\n segments,\n separator = '/',\n dataTestId,\n highlightLast = true,\n onSegmentClick,\n editable,\n action,\n}) => {\n return (\n <Flex alignItems=\"center\" gap={BREADCRUMB_PADDING}>\n <Breadcrumb.Root\n fontWeight=\"400\"\n fontSize={BREADCRUMB_FONT_SIZE}\n data-testid={dataTestId}\n >\n <Breadcrumb.List fontSize={BREADCRUMB_FONT_SIZE}>\n {segments.map((segment, index) => {\n const isLast = index === segments.length - 1 && !editable;\n const isHighlighted = isLast && highlightLast;\n const handleClick = onSegmentClick\n ? () => onSegmentClick(segment, index)\n : undefined;\n\n return (\n <Fragment key={`${segment.label}-${index}`}>\n <Breadcrumb.Item>\n <SegmentContent\n segment={segment}\n isHighlighted={isHighlighted}\n onClick={isLast ? undefined : handleClick}\n />\n </Breadcrumb.Item>\n {(!isLast || editable) && (\n <Breadcrumb.Separator>\n <Text color={SEPARATOR_COLOR}>{separator}</Text>\n </Breadcrumb.Separator>\n )}\n </Fragment>\n );\n })}\n {editable && (\n <Breadcrumb.Item>\n <EditableSegment\n value={editable.value}\n onChange={editable.onChange}\n onBlur={editable.onBlur}\n tooltip={editable.tooltip}\n placeholder={editable.placeholder}\n dataTestId={editable.dataTestId}\n />\n </Breadcrumb.Item>\n )}\n </Breadcrumb.List>\n </Breadcrumb.Root>\n {action}\n </Flex>\n );\n};\n","import { Box, Button, Flex, Text } from '@chakra-ui/react';\nimport React from 'react';\n\ninterface GrayButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n isLoading?: boolean;\n icon?: React.ReactNode;\n height?: string;\n dataTestId?: string;\n}\n\nexport const GrayButton: React.FC<GrayButtonProps> = ({\n height = '2.5rem',\n title,\n onClick,\n disabled,\n isSelected,\n isLoading,\n icon,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n _hover={{ color: 'gray.400', backgroundColor: 'white' }}\n _disabled={\n isSelected\n ? { backgroundColor: 'gray.50', cursor: 'not-allowed' }\n : undefined\n }\n alignSelf=\"flex-start\"\n color=\"gray.300\"\n fontWeight=\"500\"\n fontSize={16}\n height={height}\n disabled={disabled || isSelected}\n loading={isLoading}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Flex alignItems=\"center\" gap=\"0.5rem\">\n {icon && <Box fontSize=\"sm\">{icon}</Box>}\n <Text>{title}</Text>\n </Flex>\n </Button>\n );\n};\n","import React from 'react';\nimport { PiPlusBold } from 'react-icons/pi';\nimport { GrayButton } from '../GrayButton/GrayButton';\n\ninterface CreateButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CreateButton: React.FC<CreateButtonProps> = (props) => {\n return <GrayButton {...props} icon={<PiPlusBold />} />;\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiX } from 'react-icons/pi';\n\ninterface CloseButtonProps {\n onClick?: () => void;\n disabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const CloseButton: React.FC<CloseButtonProps> = ({\n height = '2.5rem',\n onClick,\n disabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={disabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n color=\"gray.400\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n width=\"48px\"\n >\n <Icon as={PiX} size=\"md\" />\n </Button>\n );\n};\n","import { Button, Icon } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiCaretLeft } from 'react-icons/pi';\n\ninterface BackButtonProps {\n onClick?: () => void;\n isDisabled?: boolean;\n height?: string;\n dataTestId?: string;\n}\n\nexport const BackButton: React.FC<BackButtonProps> = ({\n height = '2.5rem',\n onClick,\n isDisabled,\n dataTestId,\n}) => {\n return (\n <Button\n data-testid={dataTestId}\n disabled={isDisabled}\n _hover={{ backgroundColor: 'gray.50' }}\n alignSelf=\"flex-start\"\n height={height}\n variant=\"ghost\"\n onClick={onClick}\n >\n <Icon as={PiCaretLeft} boxSize={4} color=\"gray.500\" />\n </Button>\n );\n};\n","import { IconButton, IconButtonProps } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiGear } from 'react-icons/pi';\n\ninterface SettingsButtonProps extends IconButtonProps {\n dataTestId?: string;\n}\n\nexport const SettingsButton: FC<SettingsButtonProps> = ({\n dataTestId,\n ...props\n}) => {\n return (\n <IconButton\n data-testid={dataTestId}\n _hover={{ backgroundColor: 'gray.50' }}\n color=\"gray.400\"\n variant=\"ghost\"\n size=\"sm\"\n {...props}\n >\n <PiGear />\n </IconButton>\n );\n};\n","import { IconButton } from '@chakra-ui/react';\nimport React from 'react';\nimport { PiPlus } from 'react-icons/pi';\nimport { Tooltip } from '../Tooltip';\n\nexport interface PlusButtonProps {\n onClick?: () => void;\n tooltip?: string;\n disabled?: boolean;\n dataTestId?: string;\n}\n\nexport const PlusButton: React.FC<PlusButtonProps> = ({\n onClick,\n tooltip,\n disabled,\n dataTestId,\n}) => {\n const button = (\n <IconButton\n aria-label={tooltip ?? 'Add'}\n size=\"xs\"\n variant=\"ghost\"\n color=\"gray.400\"\n disabled={disabled}\n focusRing=\"none\"\n _hover={{ bg: 'gray.100', color: 'gray.600' }}\n onClick={onClick}\n data-testid={dataTestId}\n >\n <PiPlus />\n </IconButton>\n );\n\n if (tooltip) {\n return (\n <Tooltip content={tooltip} openDelay={300}>\n {button}\n </Tooltip>\n );\n }\n\n return button;\n};\n","import { Box, Flex, IconButton } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport { MdOutlineChevronRight } from 'react-icons/md';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface TreeNodeWrapperProps {\n accessor: NodeAccessor;\n isCollapsible: boolean;\n isCollapsed: boolean;\n onToggleCollapse?: () => void;\n field: ReactNode;\n hoverTargetClass?: string;\n dataTestId?: string;\n children?: ReactNode;\n}\n\nexport const TreeNodeWrapper: FC<TreeNodeWrapperProps> = observer(\n ({\n accessor,\n isCollapsible,\n isCollapsed,\n onToggleCollapse,\n field,\n hoverTargetClass,\n dataTestId,\n children,\n }) => {\n const dotOutlineClass = `dot-outline-${accessor.nodeId}`;\n const collapseButtonClass = `collapse-button-${accessor.nodeId}`;\n\n const isActiveWithName =\n accessor.state.isActive && Boolean(accessor.label.name);\n\n const collapseHoverStyles =\n isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' },\n }\n : {};\n\n const activeCollapseStyles =\n isActiveWithName && isCollapsible && !isCollapsed\n ? {\n [`& .${dotOutlineClass}`]: { visibility: 'hidden' as const },\n [`& .${collapseButtonClass}`]: { visibility: 'visible' as const },\n }\n : {};\n\n const fieldHoverStyles = hoverTargetClass\n ? {\n [`&:hover .${hoverTargetClass}`]: { opacity: 1 },\n ...(isActiveWithName\n ? { [`& .${hoverTargetClass}`]: { opacity: 1 } }\n : {}),\n }\n : {};\n\n const getCollapseButtonTestId = (): string | undefined => {\n if (!dataTestId) {\n return undefined;\n }\n return isCollapsed\n ? `${dataTestId}-expand-button`\n : `${dataTestId}-collapse-button`;\n };\n\n return (\n <Flex\n flexDirection=\"column\"\n alignSelf=\"flex-start\"\n width=\"100%\"\n _hover={collapseHoverStyles}\n css={activeCollapseStyles}\n data-node-id={accessor.nodeId}\n data-active={accessor.state.isActive || undefined}\n >\n <Flex\n gap=\"4px\"\n alignItems=\"center\"\n height=\"30px\"\n mt=\"2px\"\n mb=\"2px\"\n position=\"relative\"\n css={fieldHoverStyles}\n backgroundColor={accessor.state.isActive ? 'gray.100' : undefined}\n borderRadius=\"4px\"\n cursor=\"default\"\n >\n <Box position=\"absolute\" ml=\"-60px\" height=\"100%\" width=\"60px\" />\n <Box\n className={dotOutlineClass}\n color=\"gray.300\"\n visibility={isCollapsed ? 'hidden' : 'visible'}\n >\n <PiDotOutlineFill />\n </Box>\n {isCollapsible && (\n <IconButton\n data-testid={getCollapseButtonTestId()}\n className={collapseButtonClass}\n visibility={isCollapsed ? 'visible' : 'hidden'}\n _hover={{ backgroundColor: 'transparent' }}\n ml=\"-8px\"\n position=\"absolute\"\n size=\"xs\"\n color=\"gray.400\"\n variant=\"ghost\"\n onClick={onToggleCollapse}\n width=\"26px\"\n height=\"26px\"\n >\n <Box rotate={isCollapsed ? '0' : '90deg'}>\n <MdOutlineChevronRight />\n </Box>\n </IconButton>\n )}\n {field}\n </Flex>\n {children && !isCollapsed && (\n <Flex\n ml=\"7px\"\n pl=\"18px\"\n borderLeftWidth={1}\n borderLeftStyle=\"solid\"\n borderLeftColor=\"white\"\n _hover={{ borderLeftColor: 'blackAlpha.200' }}\n >\n {children}\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Portal } from '@chakra-ui/react';\nimport { Menu } from '@chakra-ui/react/menu';\nimport { FC, Fragment, ReactElement } from 'react';\nimport { LuChevronRight } from 'react-icons/lu';\nimport { typeMenuGroups, type MenuOptionItem } from '../../config';\n\ninterface SubMenuProps {\n label: string;\n options: MenuOptionItem[];\n onSelect: (id: string) => void;\n dataTestIdPrefix?: string;\n triggerId?: string;\n}\n\nconst SubMenu: FC<SubMenuProps> = ({\n label,\n options,\n onSelect,\n dataTestIdPrefix,\n triggerId,\n}) => {\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={triggerId}>\n <Box flex=\"1\">{label}</Box>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {options.map((option) => (\n <Fragment key={option.id}>\n <Menu.Item\n value={option.id}\n data-testid={`${dataTestIdPrefix}-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n {option.type !== 'submenu' && option.addDividerAfter && (\n <Menu.Separator />\n )}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n\ninterface TypeMenuProps {\n menuButton: ReactElement;\n onSelect: (typeId: string) => void;\n dataTestId?: string;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const TypeMenu: FC<TypeMenuProps> = ({\n menuButton,\n onSelect,\n dataTestId,\n open,\n onOpenChange,\n}) => {\n const handleOpenChange = (details: { open: boolean }) => {\n onOpenChange?.(details.open);\n };\n\n return (\n <Menu.Root open={open} onOpenChange={handleOpenChange}>\n <Menu.Trigger asChild>{menuButton}</Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {typeMenuGroups.map((group) => (\n <Fragment key={group.id}>\n {group.options.map((option) =>\n option.type === 'submenu' ? (\n <SubMenu\n key={option.id}\n label={option.label}\n options={option.items}\n onSelect={onSelect}\n triggerId={`${dataTestId}-menu-submenu-${option.id}`}\n dataTestIdPrefix={`${dataTestId}-menu-sub`}\n />\n ) : (\n <Menu.Item\n key={option.id}\n value={option.id}\n data-testid={`${dataTestId}-menu-type-${option.id}`}\n onClick={() => onSelect(option.id)}\n >\n {option.label}\n </Menu.Item>\n ),\n )}\n {group.addDividerAfter && <Menu.Separator />}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { Flex, Icon } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiDotsSixVerticalBold } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip';\n\ninterface DragHandleProps {\n dataTestId: string;\n hoverClass?: string;\n applyHoverStyles: boolean;\n}\n\nexport const DragHandle: FC<DragHandleProps> = ({\n dataTestId,\n hoverClass,\n applyHoverStyles,\n}) => (\n <Tooltip\n content=\"Drag to move field to another object\"\n positioning={{ placement: 'left' }}\n >\n <Flex\n data-testid={`${dataTestId}-drag-button`}\n className={hoverClass}\n position=\"absolute\"\n left=\"-34px\"\n opacity={applyHoverStyles ? 0 : 1}\n cursor=\"grab\"\n _hover={{ backgroundColor: 'gray.50' }}\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"4px\"\n marginLeft=\"-6px\"\n >\n <Icon as={PiDotsSixVerticalBold} size=\"md\" color=\"gray.300\" />\n </Flex>\n </Tooltip>\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiWarningCircle } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip';\n\ninterface ErrorIndicatorProps {\n dataTestId: string;\n errorMessage: string;\n}\n\nexport const ErrorIndicator: FC<ErrorIndicatorProps> = ({\n dataTestId,\n errorMessage,\n}) => (\n <Tooltip\n content={errorMessage}\n positioning={{ placement: 'top' }}\n contentProps={{ maxWidth: '400px' }}\n >\n <Box\n data-testid={`${dataTestId}-error-indicator`}\n color=\"red.500\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n ml=\"4px\"\n >\n <PiWarningCircle />\n </Box>\n </Tooltip>\n);\n","import {\n draggable,\n dropTargetForElements,\n monitorForElements,\n type ElementEventBasePayload,\n type ElementDropTargetEventPayloadMap,\n} from '@atlaskit/drag-and-drop/adapter/element';\nimport type { CleanupFn } from '@atlaskit/drag-and-drop/types';\nimport { useEffect, useRef } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ntype DragAndDropData = Record<string, unknown> & {\n accessor: NodeAccessor;\n};\n\nconst getDragData = (data: Record<string, unknown>): NodeAccessor | null => {\n const accessor = data.accessor;\n if (accessor && typeof accessor === 'object' && 'nodeId' in accessor) {\n return accessor as NodeAccessor;\n }\n return null;\n};\n\ninterface UseDragAndDropOptions {\n accessor: NodeAccessor;\n onDrop?: (fromNodeId: string) => void;\n canDrag: boolean;\n isDropTarget: boolean;\n canAcceptDrop: (fromNodeId: string) => boolean;\n}\n\nexport const useDragAndDrop = ({\n accessor,\n onDrop,\n canDrag,\n isDropTarget,\n canAcceptDrop,\n}: UseDragAndDropOptions) => {\n const dragAndDropRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!canDrag || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = draggable({\n element: dragAndDropRef.current,\n getInitialData: (): DragAndDropData => ({ accessor }),\n });\n\n return () => cleanup();\n }, [accessor, canDrag]);\n\n useEffect(() => {\n if (!isDropTarget || !dragAndDropRef.current) {\n return;\n }\n\n const cleanup: CleanupFn = dropTargetForElements({\n element: dragAndDropRef.current,\n onDrop: (e: ElementDropTargetEventPayloadMap['onDrop']) => {\n const draggingAccessor = getDragData(e.source.data);\n\n if (draggingAccessor && canAcceptDrop(draggingAccessor.nodeId)) {\n if (onDrop) {\n onDrop(draggingAccessor.nodeId);\n }\n }\n\n accessor.state.setDraggedOver(false);\n accessor.state.setDrop(false);\n },\n onDragEnter: (e: ElementDropTargetEventPayloadMap['onDragEnter']) => {\n const draggingAccessor = getDragData(e.source.data);\n if (draggingAccessor) {\n accessor.state.setDraggedOver(canAcceptDrop(draggingAccessor.nodeId));\n }\n },\n onDragLeave: () => accessor.state.setDraggedOver(false),\n });\n\n return () => cleanup();\n }, [accessor, isDropTarget, onDrop, canAcceptDrop]);\n\n useEffect(() => {\n return monitorForElements({\n onDragStart: (e: ElementEventBasePayload) => {\n const draggingAccessor = getDragData(e.source.data);\n\n if (!draggingAccessor) {\n return;\n }\n\n if (isDropTarget) {\n const canAccept = canAcceptDrop(draggingAccessor.nodeId);\n\n if (canAccept) {\n accessor.state.setDrop(true);\n } else {\n accessor.state.setDisabledDrop(true);\n }\n } else {\n accessor.state.setDisabledDrop(true);\n }\n },\n onDrop: () => {\n accessor.state.setDrop(false);\n accessor.state.setDisabledDrop(false);\n },\n });\n }, [accessor, isDropTarget, canAcceptDrop]);\n\n return {\n dragAndDropRef,\n isDraggable: canDrag,\n isDrop: accessor.state.isDrop,\n isDisabledDrop: accessor.state.isDisabledDrop,\n isDraggedOver: accessor.state.isDraggedOver,\n };\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode, useCallback } from 'react';\nimport { ContentEditable } from '../../../../components/ContentEditable';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TypeMenu } from '../../TypeMenu/TypeMenu';\nimport { DragHandle } from './DragHandle';\nimport { ErrorIndicator } from './ErrorIndicator';\nimport { useDragAndDrop } from './useDragAndDrop';\n\ninterface TreeNodeFieldProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n hoverTargetClass?: string;\n onChangeType: (typeId: string) => void;\n rightContent?: ReactNode;\n}\n\nexport const TreeNodeField: FC<TreeNodeFieldProps> = observer(\n ({\n accessor,\n treeVM,\n dataTestId,\n hoverTargetClass,\n onChangeType,\n rightContent,\n }) => {\n const isActiveWithName =\n accessor.state.isActive && Boolean(accessor.label.name);\n const applyHoverStyles = !accessor.state.isFocused && !isActiveWithName;\n const hoverClass =\n applyHoverStyles && hoverTargetClass ? hoverTargetClass : undefined;\n const hasName = Boolean(accessor.label.name);\n\n const hasDropTarget = treeVM.schemaModel.hasValidDropTarget(\n accessor.nodeId,\n );\n const canDrag =\n !accessor.isRoot && !accessor.isReadonly && hasName && hasDropTarget;\n const isDropTarget = accessor.isObject && !accessor.isReadonly;\n\n const canAcceptDrop = useCallback(\n (fromNodeId: string) => {\n return treeVM.schemaModel.canMoveNode(fromNodeId, accessor.nodeId);\n },\n [accessor.nodeId, treeVM.schemaModel],\n );\n\n const handleDrop = useCallback(\n (fromNodeId: string) => {\n treeVM.moveNode(fromNodeId, accessor.nodeId);\n },\n [treeVM, accessor.nodeId],\n );\n\n const {\n dragAndDropRef,\n isDraggable,\n isDrop,\n isDraggedOver,\n isDisabledDrop,\n } = useDragAndDrop({\n accessor,\n canDrag,\n isDropTarget,\n canAcceptDrop,\n onDrop: handleDrop,\n });\n\n const showTypeSelector = !accessor.isReadonly;\n\n return (\n <Flex gap=\"0.5rem\" width=\"100%\" justifyContent=\"flex-start\" outline={0}>\n <Flex\n data-testid={isDrop ? `${dataTestId}-drop` : undefined}\n ref={dragAndDropRef}\n flex={hasName ? 0 : 1}\n position=\"relative\"\n whiteSpace=\"nowrap\"\n borderWidth={1}\n borderStyle=\"dashed\"\n borderColor={isDrop ? 'gray.400' : 'transparent'}\n backgroundColor={isDraggedOver ? 'gray.200' : undefined}\n color={isDisabledDrop ? 'gray.300' : undefined}\n >\n {isDraggable && (\n <DragHandle\n dataTestId={dataTestId}\n hoverClass={hoverClass}\n applyHoverStyles={applyHoverStyles}\n />\n )}\n {accessor.isReadonly ? (\n <Text color=\"gray.400\" data-testid={dataTestId}>\n {accessor.label.name}\n </Text>\n ) : (\n <ContentEditable\n dataTestId={dataTestId}\n autoFocus={!accessor.label.name}\n initValue={accessor.label.name}\n placeholder={\n accessor.isRoot\n ? 'Enter the name of the table'\n : 'Enter the name of the field'\n }\n onBlur={accessor.handleFieldBlur}\n onFocus={() => accessor.state.setFocused(true)}\n onChange={accessor.actions.rename}\n onEnter={treeVM.keyboard.handleEditEnter}\n focusTrigger={accessor.state.focusRequestCount}\n />\n )}\n {hasName && accessor.validation.hasError && (\n <ErrorIndicator\n dataTestId={dataTestId}\n errorMessage={accessor.validation.errorMessage ?? ''}\n />\n )}\n </Flex>\n {hasName && (\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <Box className={hoverClass} opacity={applyHoverStyles ? 0 : 1}>\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n {showTypeSelector ? (\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={onChangeType}\n open={accessor.state.isMenuOpen}\n onOpenChange={accessor.state.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n textDecoration=\"underline\"\n cursor=\"pointer\"\n >\n {accessor.label.typeLabel}\n </Text>\n }\n />\n ) : (\n <Text\n data-testid={`${dataTestId}-type-label`}\n color=\"gray.400\"\n >\n {accessor.label.typeLabel}\n </Text>\n )}\n {rightContent}\n </Flex>\n </Box>\n </Flex>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { PiTextT, PiFunction, PiWarning } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface TreeNodeIndicatorsProps {\n accessor: NodeAccessor;\n}\n\nexport const TreeNodeIndicators: FC<TreeNodeIndicatorsProps> = observer(\n ({ accessor }) => {\n const description = accessor.label.description;\n const hasFormula = accessor.formula.hasFormula;\n const formula = accessor.formula.formula;\n const isDeprecated = accessor.label.isDeprecated;\n\n const hasAnyIndicator = description || hasFormula || isDeprecated;\n\n if (!hasAnyIndicator) {\n return null;\n }\n\n return (\n <Flex gap=\"2px\" alignItems=\"center\">\n {isDeprecated && (\n <Tooltip content=\"Deprecated\" positioning={{ placement: 'top' }}>\n <Box\n color=\"orange.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiWarning />\n </Box>\n </Tooltip>\n )}\n {hasFormula && (\n <Tooltip\n content={`Formula: ${formula}`}\n positioning={{ placement: 'top' }}\n >\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiFunction />\n </Box>\n </Tooltip>\n )}\n {description && (\n <Tooltip content={description} positioning={{ placement: 'top' }}>\n <Box\n color=\"gray.400\"\n cursor=\"default\"\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiTextT />\n </Box>\n </Tooltip>\n )}\n </Flex>\n );\n },\n);\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useCallback, useState } from 'react';\nimport { PiTextT, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface DescriptionSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const DescriptionSubmenu: FC<DescriptionSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const [localValue, setLocalValue] = useState(\n accessor.label.description ?? '',\n );\n\n const handleBlur = () => {\n accessor.actions.setDescription(localValue || undefined);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-description-menu`}>\n <PiTextT />\n <Box flex=\"1\">Description</Box>\n {accessor.label.description && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.label.description}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"280px\">\n <Textarea\n size=\"sm\"\n placeholder=\"Add description...\"\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n rows={3}\n ref={useCallback((el: HTMLTextAreaElement | null) => {\n if (el) {\n requestAnimationFrame(() => {\n el.focus({ preventScroll: true });\n const len = el.value.length;\n el.setSelectionRange(len, len);\n });\n }\n }, [])}\n data-testid={`${dataTestId}-description-input`}\n />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal, Textarea } from '@chakra-ui/react';\nimport {\n validateFormulaAgainstSchema,\n type JsonObjectSchema,\n} from '@revisium/schema-toolkit';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { PiFunction, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface FormulaSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nconst validateLocally = (\n value: string,\n fieldName: string,\n plainSchema: JsonObjectSchema,\n): string | null => {\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n try {\n const error = validateFormulaAgainstSchema(trimmed, fieldName, plainSchema);\n return error ? error.error : null;\n } catch {\n return 'Invalid formula';\n }\n};\n\nconst FormulaInput: FC<{\n accessor: NodeAccessor;\n dataTestId: string;\n}> = observer(({ accessor, dataTestId }) => {\n const initialValue = accessor.formula.formula;\n const initialError = accessor.formula.errorMessage ?? null;\n const [localValue, setLocalValue] = useState(initialValue);\n const [localError, setLocalError] = useState<string | null>(initialError);\n const localValueRef = useRef(localValue);\n const initialValueRef = useRef(initialValue);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const value = e.target.value;\n setLocalValue(value);\n localValueRef.current = value;\n const error = validateLocally(\n value,\n accessor.label.name,\n accessor.formula.plainSchema,\n );\n setLocalError(error);\n };\n\n useEffect(() => {\n const accessorRef = accessor;\n const initialRef = initialValueRef;\n return () => {\n const value = localValueRef.current;\n if (value === initialRef.current) {\n return;\n }\n accessorRef.formula.setInputValue(value);\n accessorRef.formula.applyFormula();\n };\n }, [accessor]);\n\n const hasError = localError !== null;\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n return (\n <>\n <Textarea\n size=\"sm\"\n placeholder=\"e.g. price * quantity\"\n value={localValue}\n onChange={handleChange}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n ref={useCallback((el: HTMLTextAreaElement | null) => {\n if (el) {\n requestAnimationFrame(() => {\n el.focus({ preventScroll: true });\n const len = el.value.length;\n el.setSelectionRange(len, len);\n });\n }\n }, [])}\n rows={2}\n borderColor={hasError ? 'red.300' : undefined}\n data-testid={`${dataTestId}-formula-input`}\n />\n {hasError && (\n <Box\n fontSize=\"xs\"\n color=\"red.500\"\n mt={1}\n data-testid={`${dataTestId}-formula-error`}\n >\n {localError}\n </Box>\n )}\n {!hasError && localValue && (\n <Box fontSize=\"xs\" color=\"gray.500\" mt={1}>\n Field will be readOnly\n </Box>\n )}\n </>\n );\n});\n\nexport const FormulaSubmenu: FC<FormulaSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const hasError = accessor.formula.hasError;\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-formula-menu`}>\n <PiFunction />\n <Box flex=\"1\">Formula</Box>\n {accessor.formula.hasFormula && (\n <Box\n color={hasError ? 'red.400' : 'gray.400'}\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.formula.formula}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content w=\"280px\" p={2}>\n <FormulaInput accessor={accessor} dataTestId={dataTestId} />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import type { NodeAccessor } from '../../../model/accessor';\n\nexport function parseDefaultValue(\n value: string,\n accessor: NodeAccessor,\n): unknown {\n const nodeType = accessor.label.nodeType;\n if (nodeType === 'number') {\n const num = Number(value);\n return Number.isNaN(num) ? 0 : num;\n }\n if (nodeType === 'boolean') {\n return value === 'true';\n }\n return value;\n}\n","import { Box, Input, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport React, { FC, useCallback, useState } from 'react';\nimport { PiEquals, PiCaretRight } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { parseDefaultValue } from './parseDefaultValue';\n\ninterface DefaultValueSubmenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const DefaultValueSubmenu: FC<DefaultValueSubmenuProps> = observer(\n ({ accessor, dataTestId }) => {\n const [localValue, setLocalValue] = useState(accessor.defaultValueAsString);\n\n const handleBlur = () => {\n accessor.actions.setDefaultValue(parseDefaultValue(localValue, accessor));\n };\n\n const handleBooleanChange = (checked: boolean) => {\n accessor.actions.setDefaultValue(checked);\n };\n\n const stopPropagation = (e: React.KeyboardEvent | React.SyntheticEvent) => {\n e.stopPropagation();\n e.nativeEvent.stopImmediatePropagation();\n };\n\n const isBoolean = accessor.label.nodeType === 'boolean';\n const isNumber = accessor.label.nodeType === 'number';\n\n return (\n <Menu.Root positioning={{ placement: 'right-start', gutter: 2 }}>\n <Menu.TriggerItem data-testid={`${dataTestId}-default-menu`}>\n <PiEquals />\n <Box flex=\"1\">Default value</Box>\n {accessor.defaultValueAsString && (\n <Box\n color=\"gray.400\"\n fontSize=\"xs\"\n maxW=\"80px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {accessor.defaultValueAsString}\n </Box>\n )}\n <PiCaretRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content p=\"2\" minW=\"200px\">\n {isBoolean ? (\n <Menu.CheckboxItem\n value=\"default-true\"\n checked={accessor.defaultValue === true}\n onCheckedChange={() =>\n handleBooleanChange(accessor.defaultValue !== true)\n }\n data-testid={`${dataTestId}-default-checkbox`}\n >\n true\n <Menu.ItemIndicator />\n </Menu.CheckboxItem>\n ) : (\n <Input\n size=\"sm\"\n type={isNumber ? 'number' : 'text'}\n placeholder={isNumber ? '0' : 'default value'}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onBlur={handleBlur}\n onKeyDown={stopPropagation}\n onKeyUp={stopPropagation}\n ref={useCallback((el: HTMLInputElement | null) => {\n if (el) {\n requestAnimationFrame(() => {\n el.focus({ preventScroll: true });\n });\n }\n }, [])}\n data-testid={`${dataTestId}-default-input`}\n />\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useRef } from 'react';\nimport { PiTrash } from 'react-icons/pi';\nimport { SettingsButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { DescriptionSubmenu } from './DescriptionSubmenu';\nimport { FormulaSubmenu } from './FormulaSubmenu';\nimport { DefaultValueSubmenu } from './DefaultValueSubmenu';\n\ninterface TreeNodeContextMenuProps {\n accessor: NodeAccessor;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const TreeNodeContextMenu: FC<TreeNodeContextMenuProps> = observer(\n ({\n accessor,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n const handleOpenChange = (details: { open: boolean }) => {\n accessor.state.setSettingsOpen(details.open);\n };\n\n const canDelete = accessor.actions.canRemove;\n\n return (\n <Menu.Root\n open={accessor.state.isSettingsOpen}\n onOpenChange={handleOpenChange}\n positioning={{ placement: 'bottom-start' }}\n >\n <Menu.Trigger asChild>\n <SettingsButton\n height=\"26px\"\n color=\"gray.300\"\n _hover={{ color: 'gray.400' }}\n dataTestId={dataTestId}\n />\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content ref={contentRef} minW=\"220px\">\n <DescriptionSubmenu accessor={accessor} dataTestId={dataTestId} />\n\n {showFormula && (\n <FormulaSubmenu accessor={accessor} dataTestId={dataTestId} />\n )}\n\n {showDefault && (\n <DefaultValueSubmenu\n accessor={accessor}\n dataTestId={dataTestId}\n />\n )}\n\n <Menu.Separator />\n\n <Menu.Item\n value=\"deprecated\"\n onClick={() =>\n accessor.actions.setDeprecated(!accessor.label.isDeprecated)\n }\n data-testid={`${dataTestId}-deprecated`}\n >\n <Box w=\"16px\" />\n {accessor.label.isDeprecated\n ? 'Remove deprecated'\n : 'Mark as deprecated'}\n </Menu.Item>\n\n {showDelete && (\n <>\n <Menu.Separator />\n <Menu.Item\n value=\"delete\"\n color={canDelete ? 'fg.error' : 'gray.400'}\n disabled={!canDelete}\n onClick={canDelete ? onDelete : undefined}\n data-testid={`${dataTestId}-delete`}\n _hover={\n canDelete\n ? { bg: 'bg.error', color: 'fg.error' }\n : undefined\n }\n >\n <PiTrash />\n <Box flex=\"1\">Delete field</Box>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport { TreeNodeIndicators } from '../TreeNodeIndicators';\nimport { TreeNodeContextMenu } from '../TreeNodeContextMenu';\n\ninterface TreeNodeRightContentProps {\n accessor: NodeAccessor;\n dataTestId: string;\n showDelete?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n onDelete?: () => void;\n}\n\nexport const TreeNodeRightContent: FC<TreeNodeRightContentProps> = observer(\n ({\n accessor,\n dataTestId,\n showDelete = true,\n showFormula = false,\n showDefault = false,\n onDelete,\n }) => {\n const showMenu = !accessor.isReadonly;\n\n return (\n <>\n <TreeNodeIndicators accessor={accessor} />\n {showMenu && (\n <TreeNodeContextMenu\n accessor={accessor}\n dataTestId={`${dataTestId}-setting-button`}\n showDelete={showDelete}\n showFormula={showFormula}\n showDefault={showDefault}\n onDelete={onDelete}\n />\n )}\n </>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeWrapper } from '../TreeNodeWrapper';\nimport { TreeNodeField } from '../TreeNodeField';\nimport { TreeNodeRightContent } from '../TreeNodeRightContent';\n\ninterface NodeViewLayoutProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n collapsible?: boolean;\n showFormula?: boolean;\n showDefault?: boolean;\n children?: ReactNode;\n}\n\nexport const NodeViewLayout: FC<NodeViewLayoutProps> = observer(\n ({\n accessor,\n treeVM,\n dataTestId,\n collapsible = false,\n showFormula,\n showDefault,\n children,\n }) => {\n const hoverTargetClass = accessor.hoverTargetClass;\n const isCollapsible = collapsible && !accessor.isRoot;\n const isCollapsed = isCollapsible && !accessor.state.isExpanded;\n\n return (\n <TreeNodeWrapper\n accessor={accessor}\n isCollapsible={isCollapsible}\n isCollapsed={isCollapsed}\n onToggleCollapse={\n isCollapsible ? accessor.state.toggleExpanded : undefined\n }\n hoverTargetClass={hoverTargetClass}\n dataTestId={dataTestId}\n field={\n <TreeNodeField\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n hoverTargetClass={hoverTargetClass}\n onChangeType={(typeId) => treeVM.changeNodeType(accessor, typeId)}\n rightContent={\n <TreeNodeRightContent\n accessor={accessor}\n dataTestId={dataTestId}\n showDelete={!accessor.isRoot}\n showFormula={showFormula}\n showDefault={showDefault}\n onDelete={accessor.actions.remove}\n />\n }\n />\n }\n >\n {children}\n </TreeNodeWrapper>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\nimport { TreeNodeView } from '../TreeNodeView';\n\ninterface ObjectNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ObjectNodeView: FC<ObjectNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const hideContent = accessor.isRoot && !accessor.label.name;\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n const showAddButton = !accessor.isReadonly && !hideContent;\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n collapsible\n >\n {!hideContent && (\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.map((childAccessor, index) => (\n <TreeNodeView\n key={childAccessor.nodeId}\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {showAddButton && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => accessor.actions.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n )}\n </NodeViewLayout>\n );\n },\n);\n","import { Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\n\ninterface ForeignKeyValueProps {\n accessor: NodeAccessor;\n dataTestId: string;\n}\n\nexport const ForeignKeyValue: FC<ForeignKeyValueProps> = observer(\n ({ accessor, dataTestId }) => {\n const value = accessor.label.foreignKeyTable;\n\n return (\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={accessor.actions.selectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {value || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CreateButton } from '../../../../components';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeView } from '../TreeNodeView';\nimport { ArrayItemsView } from './ArrayItemsView';\nimport { ForeignKeyValue } from './ForeignKeyValue';\n\ninterface ArrayItemsChildrenProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayItemsChildren: FC<ArrayItemsChildrenProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n if (accessor.isObject) {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n return (\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.map((childAccessor, index) => (\n <TreeNodeView\n key={childAccessor.nodeId}\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-${index}`}\n />\n ))}\n {accessor.actions.canAddProperty && (\n <Box ml=\"-14px\">\n <CreateButton\n dataTestId={`${dataTestId}-create-field-button`}\n title=\"Field\"\n onClick={() => accessor.actions.addProperty('')}\n />\n </Box>\n )}\n </Flex>\n );\n }\n\n if (accessor.isArray) {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n if (children.length > 0 && children[0]) {\n return (\n <ArrayItemsView\n accessor={accessor}\n childAccessor={children[0]}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n }\n\n if (accessor.isForeignKey) {\n return <ForeignKeyValue accessor={accessor} dataTestId={dataTestId} />;\n }\n\n return null;\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { TreeNodeWrapper } from '../TreeNodeWrapper';\nimport { TreeNodeIndicators } from '../TreeNodeIndicators';\nimport { TreeNodeContextMenu } from '../TreeNodeContextMenu';\nimport { TypeMenu } from '../../TypeMenu/TypeMenu';\nimport { ArrayItemsChildren } from './ArrayItemsChildren';\n\ninterface ArrayItemsViewProps {\n accessor: NodeAccessor;\n childAccessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayItemsView: FC<ArrayItemsViewProps> = observer(\n ({ accessor, childAccessor, treeVM, dataTestId }) => {\n const hoverTargetClass = childAccessor.hoverTargetClass;\n const applyHoverStyles = childAccessor.shouldApplyFieldStyles;\n\n const handleChangeItemsType = (typeId: string) => {\n accessor.actions.changeItemsType(typeId);\n };\n\n return (\n <TreeNodeWrapper\n accessor={childAccessor}\n isCollapsible={false}\n isCollapsed={false}\n hoverTargetClass={hoverTargetClass}\n field={\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <TypeMenu\n dataTestId={dataTestId}\n onSelect={handleChangeItemsType}\n open={childAccessor.state.isMenuOpen}\n onOpenChange={childAccessor.state.setMenuOpen}\n menuButton={\n <Text\n data-testid={`${dataTestId}-select-type-button`}\n color=\"gray.400\"\n cursor=\"pointer\"\n textDecoration=\"underline\"\n outline={0}\n >\n {childAccessor.label.typeLabel}\n </Text>\n }\n />\n <Box\n className={applyHoverStyles ? hoverTargetClass : undefined}\n opacity={applyHoverStyles ? 0 : 1}\n >\n <Flex gap=\"0.5rem\" alignItems=\"center\">\n <TreeNodeIndicators accessor={childAccessor} />\n {childAccessor.showMenu && (\n <TreeNodeContextMenu\n accessor={childAccessor}\n dataTestId={`${dataTestId}-items-setting-button`}\n showDelete={false}\n showFormula={childAccessor.isPrimitive}\n showDefault={childAccessor.isPrimitive}\n />\n )}\n </Flex>\n </Box>\n </Flex>\n }\n >\n <ArrayItemsChildren\n accessor={childAccessor}\n treeVM={treeVM}\n dataTestId={`${dataTestId}-0`}\n />\n </TreeNodeWrapper>\n );\n },\n);\n","import { Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\nimport { ArrayItemsView } from './ArrayItemsView';\n\ninterface ArrayNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ArrayNodeView: FC<ArrayNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const children = treeVM.getChildAccessors(\n accessor.nodeId,\n accessor.isReadonly,\n );\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n collapsible\n >\n <Flex flexDirection=\"column\" width=\"100%\">\n {children.length > 0 && children[0] ? (\n <ArrayItemsView\n accessor={accessor}\n childAccessor={children[0]}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n ) : (\n <Text color=\"gray.400\" fontSize=\"sm\" ml=\"8px\">\n items\n </Text>\n )}\n </Flex>\n </NodeViewLayout>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface PrimitiveNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const PrimitiveNodeView: FC<PrimitiveNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n showFormula={accessor.isPrimitive}\n showDefault={accessor.isPrimitive}\n />\n );\n },\n);\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useCallback } from 'react';\nimport { PiDotOutlineFill } from 'react-icons/pi';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface ForeignKeyNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const ForeignKeyNodeView: FC<ForeignKeyNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n const handleSelectForeignKey = useCallback(async () => {\n const tableId = await treeVM.selectForeignKey();\n if (tableId !== null) {\n accessor.actions.setForeignKey(tableId);\n }\n }, [treeVM, accessor.actions]);\n\n const foreignKeyValue = accessor.label.foreignKeyTable;\n\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n >\n <Flex gap=\"4px\" alignItems=\"center\" height=\"30px\" mt=\"2px\" mb=\"2px\">\n <Box color=\"gray.300\">\n <PiDotOutlineFill />\n </Box>\n <Flex\n gap=\"0.5rem\"\n width=\"100%\"\n justifyContent=\"flex-start\"\n outline={0}\n _hover={{\n textDecoration: 'underline',\n textDecorationColor: 'gray.400',\n }}\n onClick={handleSelectForeignKey}\n cursor=\"pointer\"\n >\n <Text\n color=\"gray.400\"\n data-testid={`${dataTestId}-connect-foreign-key`}\n >\n {foreignKeyValue || '<Connect table>'}\n </Text>\n </Flex>\n </Flex>\n </NodeViewLayout>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { NodeViewLayout } from '../NodeViewLayout';\n\ninterface RefNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n}\n\nexport const RefNodeView: FC<RefNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId }) => {\n return (\n <NodeViewLayout\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n },\n);\n","import { Box, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { NodeAccessor } from '../../../model/accessor';\nimport type { SchemaTreeVM } from '../../../model/vm';\nimport { ObjectNodeView } from '../ObjectNodeView';\nimport { ArrayNodeView } from '../ArrayNodeView';\nimport { PrimitiveNodeView } from '../PrimitiveNodeView';\nimport { ForeignKeyNodeView } from '../ForeignKeyNodeView';\nimport { RefNodeView } from '../RefNodeView';\n\ninterface TreeNodeViewProps {\n accessor: NodeAccessor;\n treeVM: SchemaTreeVM;\n dataTestId: string;\n showItemsLabel?: boolean;\n}\n\nexport const TreeNodeView: FC<TreeNodeViewProps> = observer(\n ({ accessor, treeVM, dataTestId, showItemsLabel }) => {\n const renderNode = () => {\n if (accessor.isObject) {\n return (\n <ObjectNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isArray) {\n return (\n <ArrayNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isForeignKey) {\n return (\n <ForeignKeyNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isRef) {\n return (\n <RefNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n if (accessor.isPrimitive) {\n return (\n <PrimitiveNodeView\n accessor={accessor}\n treeVM={treeVM}\n dataTestId={dataTestId}\n />\n );\n }\n\n return null;\n };\n\n if (showItemsLabel) {\n return (\n <Box>\n <Text color=\"gray.400\" fontSize=\"sm\" ml=\"-6px\" mb=\"-4px\">\n items\n </Text>\n {renderNode()}\n </Box>\n );\n }\n\n return renderNode();\n },\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface HighlightProps {\n children: ReactNode;\n}\n\nexport const Highlight: FC<HighlightProps> = ({ children }) => (\n <Box as=\"span\" px=\"1\" bg=\"gray.100\" borderRadius=\"sm\" whiteSpace=\"nowrap\">\n {children}\n </Box>\n);\n","import { Box } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface CodeBoxProps {\n children: ReactNode;\n}\n\nexport const CodeBox: FC<CodeBoxProps> = ({ children }) => (\n <Box\n as=\"code\"\n px={1}\n py={0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n >\n {children}\n </Box>\n);\n","import { Flex, Portal } from '@chakra-ui/react';\nimport {\n DialogBackdrop,\n DialogBody,\n DialogCloseTrigger,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogPositioner,\n DialogRoot,\n DialogTitle,\n} from '@chakra-ui/react/dialog';\nimport { FC, ReactNode } from 'react';\n\ninterface DialogLayoutProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n children: ReactNode;\n footer?: ReactNode;\n maxWidth?: string;\n}\n\nexport const DialogLayout: FC<DialogLayoutProps> = ({\n isOpen,\n onClose,\n title,\n children,\n footer,\n maxWidth = '700px',\n}) => {\n return (\n <DialogRoot\n open={isOpen}\n onOpenChange={({ open }) => !open && onClose()}\n size=\"lg\"\n >\n <Portal>\n <DialogBackdrop />\n <DialogPositioner>\n <DialogContent maxWidth={maxWidth}>\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n\n <DialogBody>{children}</DialogBody>\n\n {footer && (\n <DialogFooter>\n <Flex justify=\"space-between\" width=\"100%\">\n {footer}\n </Flex>\n </DialogFooter>\n )}\n\n <DialogCloseTrigger />\n </DialogContent>\n </DialogPositioner>\n </Portal>\n </DialogRoot>\n );\n};\n","import { Button, Flex } from '@chakra-ui/react';\nimport { FC, ReactNode } from 'react';\n\ninterface DialogFooterActionsProps {\n leftContent?: ReactNode;\n onCancel: () => void;\n onConfirm?: () => void;\n confirmLabel?: string;\n confirmDisabled?: boolean;\n confirmLoading?: boolean;\n showConfirm?: boolean;\n}\n\nexport const DialogFooterActions: FC<DialogFooterActionsProps> = ({\n leftContent,\n onCancel,\n onConfirm,\n confirmLabel = 'Confirm',\n confirmDisabled = false,\n confirmLoading = false,\n showConfirm = true,\n}) => {\n return (\n <>\n {leftContent ?? <div />}\n <Flex gap={2}>\n <Button variant=\"outline\" onClick={onCancel}>\n Cancel\n </Button>\n {showConfirm && onConfirm && (\n <Button\n variant=\"outline\"\n onClick={onConfirm}\n disabled={confirmDisabled}\n loading={confirmLoading}\n >\n {confirmLabel}\n </Button>\n )}\n </Flex>\n </>\n );\n};\n","import {\n PiPlusLight,\n PiMinusLight,\n PiArrowsLeftRightLight,\n PiPencilSimpleLight,\n} from 'react-icons/pi';\nimport { IconType } from 'react-icons';\nimport { jsonPointerToSimplePath } from '@revisium/schema-toolkit';\nimport type { SchemaPatch, PropertyChange } from '@revisium/schema-toolkit';\nimport type { DefaultValueExample } from '../../../../model/utils';\n\nexport type PatchOp = 'add' | 'remove' | 'move' | 'replace';\n\nexport const operationIcons: Record<PatchOp, IconType> = {\n add: PiPlusLight,\n remove: PiMinusLight,\n move: PiArrowsLeftRightLight,\n replace: PiPencilSimpleLight,\n};\n\nexport const formatDefaultValue = (value: unknown): string => {\n if (typeof value === 'object' && value !== null) {\n return JSON.stringify(value, null, 2);\n }\n return JSON.stringify(value);\n};\n\nexport const formatChangeValue = (value: unknown): string => {\n if (value === undefined) {\n return '(none)';\n }\n if (typeof value === 'string') {\n return value || '\"\"';\n }\n return JSON.stringify(value);\n};\n\nexport const getFromFieldName = (patch: SchemaPatch['patch']): string => {\n if (patch.op === 'move' && patch.from) {\n return jsonPointerToSimplePath(patch.from);\n }\n return '';\n};\n\nexport const getFilteredPropertyChanges = (\n op: string,\n propertyChanges: PropertyChange[],\n defaultExample: DefaultValueExample | null,\n): PropertyChange[] => {\n if (op === 'remove') {\n return [];\n }\n if (op === 'add' && defaultExample) {\n return propertyChanges.filter((c) => c.property !== 'default');\n }\n return propertyChanges;\n};\n","import { Badge, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiPencilSimpleLight } from 'react-icons/pi';\nimport type { SchemaPatch } from '@revisium/schema-toolkit';\nimport { Highlight } from '../Highlight';\nimport { operationIcons, getFromFieldName, PatchOp } from './helpers';\n\ninterface OperationDescriptionProps {\n schemaPatch: SchemaPatch;\n}\n\nexport const OperationDescription: FC<OperationDescriptionProps> = ({\n schemaPatch,\n}) => {\n const { patch, fieldName } = schemaPatch;\n const IconComponent = operationIcons[patch.op as PatchOp];\n\n switch (patch.op) {\n case 'add':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was added\n </Text>\n </Flex>\n );\n case 'remove':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was removed\n </Text>\n </Flex>\n );\n case 'move': {\n const fromField = getFromFieldName(patch);\n if (schemaPatch.isRename) {\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Renamed field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n </Flex>\n );\n }\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Moved field <Highlight>{fromField}</Highlight> to{' '}\n <Highlight>{fieldName}</Highlight>\n </Text>\n {schemaPatch.movesIntoArray && (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data will be cloned\n </Badge>\n )}\n </Flex>\n );\n }\n case 'replace':\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={IconComponent}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was modified\n </Text>\n </Flex>\n );\n default:\n return (\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiPencilSimpleLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Field <Highlight>{fieldName}</Highlight> was changed\n </Text>\n </Flex>\n );\n }\n};\n","import { Box, Flex, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport type { DefaultValueExample } from '../../../../model/utils';\nimport { formatDefaultValue } from './helpers';\n\ninterface DefaultValueRowProps {\n example: DefaultValueExample;\n}\n\nexport const DefaultValueRow: FC<DefaultValueRowProps> = ({ example }) => {\n const { value, type, foreignKeyTableId } = example;\n\n if (foreignKeyTableId) {\n return null;\n }\n\n const formattedValue = formatDefaultValue(value);\n const isMultiline = formattedValue.includes('\\n');\n\n return (\n <Flex\n align={isMultiline ? 'flex-start' : 'center'}\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n >\n <Text color=\"gray.400\">default:</Text>\n <Box\n as=\"code\"\n px={isMultiline ? 2 : 1}\n py={isMultiline ? 1.5 : 0.5}\n bg=\"gray.100\"\n borderRadius=\"sm\"\n fontFamily=\"mono\"\n whiteSpace={isMultiline ? 'pre' : 'nowrap'}\n >\n {formattedValue}\n </Box>\n <Text color=\"gray.400\">({type})</Text>\n </Flex>\n );\n};\n","import { Badge } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport type { DataLossSeverity } from '../../../../model/utils';\n\ninterface DataLossBadgeProps {\n severity: DataLossSeverity;\n}\n\nexport const DataLossBadge: FC<DataLossBadgeProps> = ({ severity }) => {\n if (severity === 'none') {\n return null;\n }\n\n if (severity === 'possible') {\n return (\n <Badge size=\"sm\" colorPalette=\"yellow\" variant=\"subtle\">\n data may be lost\n </Badge>\n );\n }\n\n return (\n <Badge size=\"sm\" colorPalette=\"red\" variant=\"subtle\">\n data loss\n </Badge>\n );\n};\n","import { Badge, Flex, Icon, Text, VStack } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowRight } from 'react-icons/pi';\nimport type { TransformationInfo } from '../../../../model/utils';\nimport { CodeBox } from '../CodeBox';\nimport { DataLossBadge } from './DataLossBadge';\n\ninterface TransformationInfoRowProps {\n info: TransformationInfo;\n}\n\nexport const TransformationInfoRow: FC<TransformationInfoRowProps> = ({\n info,\n}) => {\n return (\n <VStack align=\"stretch\" gap={1} pl={2}>\n <Flex align=\"center\" gap={2} fontSize=\"xs\" flexWrap=\"wrap\">\n {info.steps.map((step, stepIndex) => (\n <Flex key={step.name} align=\"center\" gap={1}>\n {stepIndex > 0 && <Text color=\"gray.400\">+</Text>}\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\">\n {step.name}\n </Badge>\n </Flex>\n ))}\n <DataLossBadge severity={info.dataLossSeverity} />\n </Flex>\n\n <Flex align=\"center\" gap={2} fontSize=\"xs\" color=\"gray.500\">\n <Text color=\"gray.400\">example:</Text>\n <CodeBox>{JSON.stringify(info.example.before)}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{JSON.stringify(info.example.after)}</CodeBox>\n </Flex>\n </VStack>\n );\n};\n","import { Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowRight } from 'react-icons/pi';\nimport { CodeBox } from '../CodeBox';\n\ninterface ValueChangeRowProps {\n label: string;\n fromValue: string;\n toValue: string;\n}\n\nexport const ValueChangeRow: FC<ValueChangeRowProps> = ({\n label,\n fromValue,\n toValue,\n}) => (\n <Flex\n align=\"center\"\n gap={2}\n fontSize=\"xs\"\n color=\"gray.500\"\n pl={2}\n flexWrap=\"wrap\"\n >\n <Text color=\"gray.400\">{label}:</Text>\n <CodeBox>{fromValue}</CodeBox>\n <Icon as={PiArrowRight} color=\"gray.400\" flexShrink={0} />\n <CodeBox>{toValue}</CodeBox>\n </Flex>\n);\n","import { Box } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, useMemo } from 'react';\nimport type { SchemaPatch } from '@revisium/schema-toolkit';\nimport {\n getTransformationInfoFromTypeChange,\n getDefaultValueExample,\n} from '../../../../model/utils';\nimport { OperationDescription } from './OperationDescription';\nimport { DefaultValueRow } from './DefaultValueRow';\nimport { TransformationInfoRow } from './TransformationInfoRow';\nimport { ValueChangeRow } from './ValueChangeRow';\nimport { formatChangeValue, getFilteredPropertyChanges } from './helpers';\n\ninterface PatchRowProps {\n schemaPatch: SchemaPatch;\n}\n\nexport const PatchRow: FC<PatchRowProps> = observer(({ schemaPatch }) => {\n const { patch, typeChange, propertyChanges } = schemaPatch;\n\n const transformationInfo = useMemo(\n () =>\n typeChange\n ? getTransformationInfoFromTypeChange(\n typeChange.fromType,\n typeChange.toType,\n )\n : null,\n [typeChange],\n );\n const defaultExample = useMemo(() => {\n if (patch.op === 'add' && patch.value !== undefined) {\n return getDefaultValueExample({\n op: 'add',\n path: patch.path,\n value: patch.value,\n });\n }\n return null;\n }, [patch]);\n\n const filteredChanges = useMemo(\n () => getFilteredPropertyChanges(patch.op, propertyChanges, defaultExample),\n [patch.op, propertyChanges, defaultExample],\n );\n\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <OperationDescription schemaPatch={schemaPatch} />\n\n {defaultExample && (\n <Box mt={2} ml={8}>\n <DefaultValueRow example={defaultExample} />\n </Box>\n )}\n\n {transformationInfo && (\n <Box mt={2} ml={8}>\n <TransformationInfoRow info={transformationInfo} />\n </Box>\n )}\n\n {filteredChanges.map((change) => (\n <Box key={change.property} mt={2} ml={8}>\n <ValueChangeRow\n label={change.property}\n fromValue={formatChangeValue(change.from)}\n toValue={formatChangeValue(change.to)}\n />\n </Box>\n ))}\n </Box>\n );\n});\n","import { Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowsLeftRightLight } from 'react-icons/pi';\nimport type { TableIdChangeInfo } from '../../../../model/dialog';\nimport { Highlight } from '../Highlight';\n\ninterface TableIdChangeRowProps {\n change: TableIdChangeInfo;\n}\n\nexport const TableIdChangeRow: FC<TableIdChangeRowProps> = ({ change }) => {\n return (\n <Box\n borderBottom=\"1px solid\"\n borderColor=\"gray.100\"\n py={4}\n px={5}\n _last={{ borderBottom: 'none' }}\n _hover={{ bg: 'gray.50' }}\n >\n <Flex align=\"center\" gap={1.5}>\n <Icon\n as={PiArrowsLeftRightLight}\n color=\"gray.400\"\n boxSize={4}\n flexShrink={0}\n />\n <Text fontSize=\"sm\" color=\"gray.600\">\n Table renamed from <Highlight>{change.initialTableId}</Highlight> to{' '}\n <Highlight>{change.currentTableId}</Highlight>\n </Text>\n </Flex>\n </Box>\n );\n};\n","import { Badge, Box, Flex, Icon, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiWarningCircle } from 'react-icons/pi';\n\nexport type ErrorType = 'validation' | 'formula' | 'tableId';\n\ninterface ErrorItemProps {\n message: string;\n type?: ErrorType;\n fieldPath?: string;\n}\n\nexport const ErrorItem: FC<ErrorItemProps> = ({ message, type, fieldPath }) => (\n <Box py={2} px={4}>\n <Flex align=\"center\" gap={2}>\n <Icon as={PiWarningCircle} color=\"gray.400\" boxSize={4} flexShrink={0} />\n <Text fontSize=\"sm\" color=\"gray.600\">\n {type === 'formula' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n formula\n </Badge>\n )}\n {type === 'tableId' && (\n <Badge size=\"sm\" colorPalette=\"gray\" variant=\"subtle\" mr={2}>\n table name\n </Badge>\n )}\n {fieldPath && (\n <Box as=\"span\" fontWeight=\"medium\">\n {fieldPath}:{' '}\n </Box>\n )}\n {message}\n </Text>\n </Flex>\n </Box>\n);\n","import { Button, Flex, Icon, Popover, Text } from '@chakra-ui/react';\nimport { FC } from 'react';\nimport { PiArrowCounterClockwiseBold } from 'react-icons/pi';\n\ninterface RevertButtonProps {\n onRevert: () => void;\n disabled?: boolean;\n}\n\nexport const RevertButton: FC<RevertButtonProps> = ({ onRevert, disabled }) => {\n return (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Button variant=\"ghost\" size=\"sm\" color=\"gray.500\" disabled={disabled}>\n <Icon as={PiArrowCounterClockwiseBold} />\n Revert All\n </Button>\n </Popover.Trigger>\n <Popover.Positioner>\n <Popover.Content>\n <Popover.Arrow />\n <Popover.Body>\n <Text fontSize=\"sm\" mb={3}>\n This will revert all changes. Are you sure?\n </Text>\n <Flex gap={2} justify=\"flex-end\">\n <Popover.CloseTrigger asChild>\n <Button variant=\"outline\" size=\"xs\">\n Cancel\n </Button>\n </Popover.CloseTrigger>\n <Popover.CloseTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"xs\"\n colorPalette=\"red\"\n onClick={onRevert}\n >\n Revert\n </Button>\n </Popover.CloseTrigger>\n </Flex>\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Popover.Root>\n );\n};\n","import { Box, Text, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport type { ReviewErrorsDialogVM } from '../../../model/dialog';\nimport {\n DialogLayout,\n DialogFooterActions,\n ErrorItem,\n RevertButton,\n} from '../shared';\n\ninterface ReviewErrorsDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: ReviewErrorsDialogVM;\n}\n\nexport const ReviewErrorsDialog: FC<ReviewErrorsDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Review Errors for \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n leftContent={\n vm.canRevert ? <RevertButton onRevert={vm.revert} /> : undefined\n }\n onCancel={onClose}\n showConfirm={false}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n bg=\"gray.50\"\n overflow=\"hidden\"\n >\n <Box\n py={2}\n px={4}\n bg=\"gray.100\"\n borderBottom=\"1px solid\"\n borderColor=\"gray.200\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"gray.600\">\n Please fix the following errors before applying changes:\n </Text>\n </Box>\n <VStack\n align=\"stretch\"\n gap={0}\n divideY=\"1px\"\n divideColor=\"gray.100\"\n >\n {vm.tableIdError && (\n <ErrorItem\n key=\"tableId-error\"\n message={vm.tableIdError}\n type=\"tableId\"\n />\n )}\n {vm.validationErrors.map((error) => (\n <ErrorItem\n key={`validation-${error.nodeId}`}\n message={error.message}\n type=\"validation\"\n />\n ))}\n {vm.formulaErrors.map((error) => (\n <ErrorItem\n key={`formula-${error.fieldPath ?? ''}-${error.message}`}\n message={error.message}\n type=\"formula\"\n fieldPath={error.fieldPath}\n />\n ))}\n </VStack>\n </Box>\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, Flex, SegmentGroup, Text, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { JsonCard } from '../../../../components/JsonCard';\nimport type { ReviewChangesDialogVM } from '../../../model/dialog';\nimport {\n DialogLayout,\n DialogFooterActions,\n PatchRow,\n TableIdChangeRow,\n RevertButton,\n} from '../shared';\n\ninterface ReviewChangesDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: ReviewChangesDialogVM;\n}\n\nexport const ReviewChangesDialog: FC<ReviewChangesDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n const applyButtonText = `Apply Changes (${vm.totalChangesCount})`;\n\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Review Changes for \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n leftContent={\n <RevertButton onRevert={vm.revert} disabled={!vm.hasChanges} />\n }\n onCancel={onClose}\n onConfirm={vm.approve}\n confirmLabel={applyButtonText}\n confirmDisabled={!vm.hasChanges}\n confirmLoading={vm.loading}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n {vm.hasChanges ? (\n <>\n <SegmentGroup.Root\n size=\"sm\"\n value={vm.viewMode}\n onValueChange={(details) =>\n vm.setViewMode(details.value as 'Changes' | 'Patches')\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Changes', 'Patches']} />\n </SegmentGroup.Root>\n\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {vm.viewMode === 'Changes' ? (\n <>\n {vm.tableIdChange && (\n <TableIdChangeRow change={vm.tableIdChange} />\n )}\n {vm.patches.map((schemaPatch) => (\n <PatchRow\n key={`${schemaPatch.patch.op}:${schemaPatch.patch.path}`}\n schemaPatch={schemaPatch}\n />\n ))}\n </>\n ) : (\n <JsonCard readonly data={vm.patches.map((p) => p.patch)} />\n )}\n </Box>\n\n <Text fontSize=\"xs\" color=\"gray.500\">\n Data in existing rows will be automatically transformed\n according to the new schema.\n </Text>\n </>\n ) : (\n <Flex justify=\"center\" align=\"center\" minHeight=\"100px\">\n <Text color=\"gray.400\" fontSize=\"sm\">\n No changes to apply\n </Text>\n </Flex>\n )}\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, SegmentGroup, VStack } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { JsonCard } from '../../../../components/JsonCard';\nimport type { CreateTableDialogVM } from '../../../model/dialog';\nimport type { JsonValue } from '@revisium/schema-toolkit';\nimport { DialogLayout, DialogFooterActions } from '../shared';\n\ninterface CreateTableDialogProps {\n isOpen: boolean;\n onClose: () => void;\n vm: CreateTableDialogVM;\n}\n\nexport const CreateTableDialog: FC<CreateTableDialogProps> = observer(\n ({ isOpen, onClose, vm }) => {\n return (\n <DialogLayout\n isOpen={isOpen}\n onClose={onClose}\n title={`Create Table \"${vm.tableId}\"`}\n footer={\n <DialogFooterActions\n onCancel={onClose}\n onConfirm={vm.approve}\n confirmLabel=\"Create Table\"\n confirmLoading={vm.loading}\n />\n }\n >\n <VStack align=\"stretch\" gap={4}>\n <SegmentGroup.Root\n size=\"sm\"\n value={vm.viewMode}\n onValueChange={(details) =>\n vm.setViewMode(details.value as 'Example' | 'Schema')\n }\n >\n <SegmentGroup.Indicator />\n <SegmentGroup.Items items={['Example', 'Schema']} />\n </SegmentGroup.Root>\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n overflow=\"hidden\"\n maxHeight=\"400px\"\n overflowY=\"auto\"\n >\n {vm.viewMode === 'Example' ? (\n <JsonCard readonly data={(vm.exampleData ?? null) as JsonValue} />\n ) : (\n <JsonCard readonly data={(vm.plainSchema ?? null) as JsonValue} />\n )}\n </Box>\n </VStack>\n </DialogLayout>\n );\n },\n);\n","import { Box, Button, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { FC, ReactNode } from 'react';\nimport { ViewerSwitcher } from '../../../components/ViewerSwitcher';\nimport { ViewerSwitcherMode } from '../../types';\nimport { JsonCard } from '../../../components/JsonCard';\nimport type { BaseEditorVM } from '../../model/vm/types';\nimport { TreeNodeView } from '../tree';\nimport { ReviewErrorsDialog } from '../dialog';\nimport type { JsonValue } from '@revisium/schema-toolkit';\n\nexport interface SchemaEditorProps {\n vm: BaseEditorVM;\n dataTestId: string;\n backButton: ReactNode;\n primaryAction?: {\n show: boolean;\n label: string;\n testId: string;\n onClick: () => void;\n };\n dialogs: ReactNode;\n}\n\nexport const SchemaEditor: FC<SchemaEditorProps> = observer(\n ({ vm, dataTestId, backButton, primaryAction, dialogs }) => {\n return (\n <Flex\n flex={1}\n flexDirection=\"column\"\n gap=\"0.5rem\"\n css={{\n '&:hover .editor-hover-target': { opacity: 1 },\n }}\n data-testid={dataTestId}\n >\n <Flex\n justifyContent=\"space-between\"\n width=\"100%\"\n alignItems=\"center\"\n paddingBottom=\"8px\"\n >\n <Box>\n {backButton}\n {vm.showReviewErrorsButton && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={vm.openErrorsDialog}\n data-testid=\"schema-editor-review-errors-button\"\n >\n Review Errors ({vm.errorsCount})\n </Button>\n )}\n {primaryAction?.show && (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={primaryAction.onClick}\n loading={vm.loading}\n data-testid={primaryAction.testId}\n >\n {primaryAction.label}\n </Button>\n )}\n </Box>\n <Box className=\"editor-hover-target\" opacity={0}>\n <ViewerSwitcher\n availableRefByMode={false}\n mode={vm.viewMode as ViewerSwitcherMode}\n onChange={(mode) => vm.setViewMode(mode)}\n />\n </Box>\n </Flex>\n\n {vm.viewMode === ViewerSwitcherMode.Tree && (\n <Box\n ref={(el: HTMLDivElement | null) =>\n vm.tree.keyboard.setContainerRef(el)\n }\n tabIndex={0}\n onKeyDown={vm.tree.keyboard.handleKeyDown}\n outline={0}\n paddingBottom=\"4rem\"\n >\n <TreeNodeView\n accessor={vm.tree.rootAccessor}\n treeVM={vm.tree}\n dataTestId=\"root\"\n />\n </Box>\n )}\n\n {vm.viewMode === ViewerSwitcherMode.Json && (\n <JsonCard\n readonly\n data={vm.getPlainSchema() as unknown as JsonValue}\n />\n )}\n\n <ReviewErrorsDialog\n isOpen={vm.isErrorsDialogOpen}\n onClose={vm.closeErrorsDialog}\n vm={vm.errorsDialogVM}\n />\n\n {dialogs}\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { CloseButton } from '../../../components';\nimport type { CreatingEditorVM } from '../../model/vm';\nimport { SchemaEditor } from '../SchemaEditor';\nimport { CreateTableDialog } from '../dialog';\n\nexport interface CreatingSchemaEditorProps {\n vm: CreatingEditorVM;\n}\n\nexport const CreatingSchemaEditor: FC<CreatingSchemaEditorProps> = observer(\n ({ vm }) => {\n return (\n <SchemaEditor\n vm={vm}\n dataTestId=\"schema-editor-creating\"\n backButton={\n <CloseButton\n dataTestId=\"close-create-table-button\"\n onClick={vm.cancel}\n />\n }\n primaryAction={{\n show: vm.showCreateTableButton,\n label: 'Create Table',\n testId: 'schema-editor-create-button',\n onClick: vm.openCreateDialog,\n }}\n dialogs={\n <CreateTableDialog\n isOpen={vm.isCreateDialogOpen}\n onClose={vm.closeCreateDialog}\n vm={vm.createDialogVM}\n />\n }\n />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { FC } from 'react';\nimport { BackButton } from '../../../components/BackButton';\nimport type { UpdatingEditorVM } from '../../model/vm';\nimport { SchemaEditor } from '../SchemaEditor';\nimport { ReviewChangesDialog } from '../dialog';\n\nexport interface UpdatingSchemaEditorProps {\n vm: UpdatingEditorVM;\n}\n\nexport const UpdatingSchemaEditor: FC<UpdatingSchemaEditorProps> = observer(\n ({ vm }) => {\n return (\n <SchemaEditor\n vm={vm}\n dataTestId=\"schema-editor-updating\"\n backButton={\n <BackButton\n dataTestId=\"back-to-table-list-button\"\n onClick={vm.cancel}\n />\n }\n primaryAction={{\n show: vm.showApplyChangesButton,\n label: `Apply Changes (${vm.totalChangesCount})`,\n testId: 'schema-editor-approve-button',\n onClick: vm.openChangesDialog,\n }}\n dialogs={\n <ReviewChangesDialog\n isOpen={vm.isChangesDialogOpen}\n onClose={vm.closeChangesDialog}\n vm={vm.changesDialogVM}\n />\n }\n />\n );\n },\n);\n","import type { ArrayNodeVM, NodeVM } from './types';\n\nexport type FlatItem =\n | { readonly type: 'node'; readonly node: NodeVM }\n | {\n readonly type: 'add-button';\n readonly array: ArrayNodeVM;\n readonly guides: boolean[];\n };\n\nfunction traverse(node: NodeVM, result: FlatItem[]): void {\n result.push({ type: 'node', node });\n\n if (node.showChildren) {\n for (const child of node.childNodes) {\n traverse(child, result);\n }\n }\n\n if (node.isArray() && node.showAddButton) {\n result.push({\n type: 'add-button',\n array: node,\n guides: [...node.guides, false],\n });\n }\n}\n\nexport function flattenNodes(root: NodeVM): readonly FlatItem[] {\n const result: FlatItem[] = [];\n\n if (root.isObject()) {\n for (const child of root.children) {\n traverse(child, result);\n }\n } else {\n traverse(root, result);\n }\n\n return result;\n}\n","import { makeAutoObservable, observable } from 'mobx';\n\nexport class RowTreeState {\n private readonly _expanded = observable.map<string, boolean>();\n private readonly _focused = observable.map<string, boolean>();\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n isExpanded(nodeId: string): boolean {\n return this._expanded.get(nodeId) ?? true;\n }\n\n setExpanded(nodeId: string, value: boolean): void {\n this._expanded.set(nodeId, value);\n }\n\n toggleExpanded(nodeId: string): void {\n this._expanded.set(nodeId, !this.isExpanded(nodeId));\n }\n\n isFocused(nodeId: string): boolean {\n return this._focused.get(nodeId) ?? false;\n }\n\n setFocused(nodeId: string, value: boolean): void {\n this._focused.set(nodeId, value);\n }\n\n expandAll(nodeIds: string[]): void {\n for (const nodeId of nodeIds) {\n this._expanded.set(nodeId, true);\n }\n }\n\n collapseAll(nodeIds: string[]): void {\n for (const nodeId of nodeIds) {\n this._expanded.set(nodeId, false);\n }\n }\n\n reset(): void {\n this._expanded.clear();\n this._focused.clear();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type {\n ValueNode,\n ValueTreeLike,\n ForeignKeyValueNode,\n} from '@revisium/schema-toolkit';\nimport { isForeignKeyValueNode } from '@revisium/schema-toolkit';\nimport type {\n NodeVM,\n PrimitiveNodeVM,\n ObjectNodeVM,\n ArrayNodeVM,\n ForeignKeyNodeVM,\n FileNodeVM,\n MenuItem,\n NodeRendererType,\n EditorContext,\n RowEditorCallbacks,\n} from '../types';\nimport type { RowNodeState } from './RowNodeState';\nimport type { RowNodeMenu } from './RowNodeMenu';\nimport type { RowNodeLayout } from './RowNodeLayout';\nimport type { ChildResolver } from './ChildResolver';\n\ntype PrimitiveValue = string | number | boolean;\n\ninterface PrimitiveNode extends ValueNode {\n value: PrimitiveValue;\n defaultValue: PrimitiveValue;\n isReadOnly: boolean;\n setValue(value: unknown): void;\n}\n\ninterface ArrayNode extends ValueNode {\n value: readonly ValueNode[];\n length: number;\n at(index: number): ValueNode | undefined;\n pushValue(value: unknown): void;\n removeAt(index: number): void;\n move(fromIndex: number, toIndex: number): void;\n}\n\ninterface DirtyNode {\n isDirty: boolean;\n}\n\nexport class RowNodeAccessor implements NodeVM {\n private _menu!: RowNodeMenu;\n private _layout!: RowNodeLayout;\n\n constructor(\n public readonly node: ValueNode,\n public readonly parent: RowNodeAccessor | null,\n private readonly _state: RowNodeState,\n private readonly _tree: ValueTreeLike,\n public readonly editorContext: EditorContext | null,\n private readonly _childResolver: ChildResolver,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n setMenu(menu: RowNodeMenu): void {\n this._menu = menu;\n }\n\n setLayout(layout: RowNodeLayout): void {\n this._layout = layout;\n }\n\n // --- Identity ---\n\n get id(): string {\n return this.node.id;\n }\n\n get name(): string {\n return this.node.name;\n }\n\n get displayName(): string {\n if (this.parent) {\n return this.node.name;\n }\n return this._rootDisplayName();\n }\n\n get testId(): string {\n if (!this.parent) {\n return 'root';\n }\n const parentId = this.parent.testId;\n if (parentId === 'root' && this.parent.isObject()) {\n return this.name;\n }\n return `${parentId}-${this.name}`;\n }\n\n // --- Type guards ---\n\n isPrimitive(): this is PrimitiveNodeVM {\n return this.node.isPrimitive();\n }\n\n isObject(): this is ObjectNodeVM {\n return this.node.isObject();\n }\n\n isArray(): this is ArrayNodeVM {\n return this.node.isArray();\n }\n\n // --- State (delegated to RowNodeState) ---\n\n get isExpanded(): boolean {\n return this._state.isExpanded;\n }\n\n set isExpanded(value: boolean) {\n this._state.setExpanded(value);\n }\n\n get isFocused(): boolean {\n return this._state.isFocused;\n }\n\n expand(): void {\n this._state.setExpanded(true);\n }\n\n collapse(): void {\n this._state.setExpanded(false);\n }\n\n toggleExpanded(): void {\n this._state.toggleExpanded();\n }\n\n setFocused(focused: boolean): void {\n this._state.setFocused(focused);\n }\n\n // --- Layout (delegated to RowNodeLayout) ---\n\n get depth(): number {\n return this._layout.depth;\n }\n\n get guides(): boolean[] {\n return this._layout.guides;\n }\n\n get isCollapsible(): boolean {\n return this._layout.isCollapsible;\n }\n\n get isCollapsibleTree(): boolean {\n return this._layout.isCollapsibleTree;\n }\n\n get rendererType(): NodeRendererType {\n return this._layout.rendererType;\n }\n\n get isContainer(): boolean {\n return this._layout.isContainer;\n }\n\n get childNodes(): readonly NodeVM[] {\n return this._childResolver.getChildren(this);\n }\n\n get showChildren(): boolean {\n return this._layout.showChildren;\n }\n\n get collapsedLabel(): string {\n return this._layout.collapsedLabel;\n }\n\n get isLongText(): boolean {\n return this._layout.isLongText;\n }\n\n expandAll(): void {\n this._layout.expandAll();\n }\n\n collapseAll(): void {\n this._layout.collapseAll();\n }\n\n // --- Menu ---\n\n get menu(): MenuItem[] {\n return this._menu.menu;\n }\n\n // --- Misc ---\n\n get formula(): string | undefined {\n if (this.node.isPrimitive()) {\n return this.node.formula?.expression;\n }\n return undefined;\n }\n\n get isEditorReadOnly(): boolean {\n return this.editorContext?.isReadOnly ?? false;\n }\n\n get path(): string {\n return this._tree.pathOf(this.node).asString();\n }\n\n get isDirty(): boolean {\n return (this.node as unknown as DirtyNode).isDirty;\n }\n\n // --- Primitive ---\n\n get value(): PrimitiveValue {\n return (this.node as PrimitiveNode).value;\n }\n\n get defaultValue(): PrimitiveValue {\n return (this.node as PrimitiveNode).defaultValue;\n }\n\n get isReadOnly(): boolean {\n return (this.node as PrimitiveNode).isReadOnly;\n }\n\n get isFieldReadOnly(): boolean {\n return this.isReadOnly || this.isEditorReadOnly;\n }\n\n setValue(value: unknown): void {\n (this.node as PrimitiveNode).setValue(value);\n }\n\n // --- Object ---\n\n get children(): readonly NodeVM[] {\n if (!this.node.isObject()) {\n return [];\n }\n return this._childResolver.getChildren(this);\n }\n\n child(name: string): NodeVM | undefined {\n return (this.children as readonly RowNodeAccessor[]).find(\n (c) => c.name === name,\n );\n }\n\n // --- Array ---\n\n get items(): readonly NodeVM[] {\n if (!this.node.isArray()) {\n return [];\n }\n return this._childResolver.getChildren(this);\n }\n\n get length(): number {\n if (!this.node.isArray()) {\n return 0;\n }\n return (this.node as ArrayNode).length;\n }\n\n at(index: number): NodeVM | undefined {\n const allItems = this.items as readonly RowNodeAccessor[];\n if (index < 0 || index >= allItems.length) {\n return undefined;\n }\n return allItems[index];\n }\n\n pushValue(value: unknown): void {\n (this.node as ArrayNode).pushValue(value);\n }\n\n removeAt(index: number): void {\n (this.node as ArrayNode).removeAt(index);\n }\n\n move(fromIndex: number, toIndex: number): void {\n (this.node as ArrayNode).move(fromIndex, toIndex);\n }\n\n insertAt(index: number): void {\n (this.node as ArrayNode).pushValue(null);\n const lastIndex = this.length - 1;\n if (index < lastIndex) {\n (this.node as ArrayNode).move(lastIndex, index);\n }\n }\n\n get showAddButton(): boolean {\n return this.isExpanded && !this.isEditorReadOnly;\n }\n\n // --- ForeignKey ---\n\n isForeignKey(): this is ForeignKeyNodeVM {\n return isForeignKeyValueNode(this.node);\n }\n\n get foreignKeyTableId(): string {\n return (this.node as unknown as ForeignKeyValueNode).foreignKey;\n }\n\n // --- File ---\n\n isFile(): this is FileNodeVM {\n return this.rendererType === 'file';\n }\n\n get fileStatus(): string {\n return this._getFileChildValue('status', '');\n }\n\n get fileId(): string {\n return this._getFileChildValue('fileId', '');\n }\n\n get fileUrl(): string {\n return this._getFileChildValue('url', '');\n }\n\n get fileMimeType(): string {\n return this._getFileChildValue('mimeType', '');\n }\n\n get fileWidth(): number {\n return this._getFileChildNumericValue('width');\n }\n\n get fileHeight(): number {\n return this._getFileChildNumericValue('height');\n }\n\n // --- Callbacks ---\n\n get callbacks(): RowEditorCallbacks | null {\n return this.editorContext?.callbacks ?? null;\n }\n\n // --- Internal ---\n\n getChildAccessors(): readonly RowNodeAccessor[] {\n return this._childResolver.getChildren(this);\n }\n\n // --- Private helpers ---\n\n private _getFileChildValue(name: string, fallback: string): string {\n if (!this.node.isObject()) {\n return fallback;\n }\n const child = this.node.child(name);\n if (child?.isPrimitive()) {\n return String(child.value);\n }\n return fallback;\n }\n\n private _rootDisplayName(): string {\n const schema = this.node.schema;\n if (!('type' in schema)) {\n return this.node.name;\n }\n return `<${schema.type}>`;\n }\n\n private _getFileChildNumericValue(name: string): number {\n if (!this.node.isObject()) {\n return 0;\n }\n const child = this.node.child(name);\n if (child?.isPrimitive()) {\n return Number(child.value) || 0;\n }\n return 0;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { RowTreeState } from '../state/RowTreeState';\n\nexport class RowNodeState {\n constructor(\n private readonly _nodeId: string,\n private readonly _treeState: RowTreeState,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get isExpanded(): boolean {\n return this._treeState.isExpanded(this._nodeId);\n }\n\n setExpanded(value: boolean): void {\n this._treeState.setExpanded(this._nodeId, value);\n }\n\n toggleExpanded(): void {\n this._treeState.toggleExpanded(this._nodeId);\n }\n\n get isFocused(): boolean {\n return this._treeState.isFocused(this._nodeId);\n }\n\n setFocused(value: boolean): void {\n this._treeState.setFocused(this._nodeId, value);\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { ValueNode } from '@revisium/schema-toolkit';\nimport type { MenuItem } from '../types';\nimport type { RowNodeAccessor } from './RowNodeAccessor';\n\ninterface ArrayItemContext {\n index: number;\n arrayLength: number;\n insertAt(index: number): void;\n removeAt(index: number): void;\n move(from: number, to: number): void;\n}\n\nexport class RowNodeMenu {\n constructor(private readonly _accessor: RowNodeAccessor) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get menu(): MenuItem[] {\n return [\n ...this.topMenu,\n ...this.arrayOwnMenu,\n ...this.arrayItemMenu,\n ...this.bottomMenu,\n ];\n }\n\n private get arrayItemContext(): ArrayItemContext | null {\n const parent = this._accessor.parent;\n if (!parent || !parent.node.isArray()) {\n return null;\n }\n const arrayNode = parent.node as ValueNode & {\n value: readonly ValueNode[];\n };\n const index = arrayNode.value.indexOf(this._accessor.node);\n if (index === -1) {\n return null;\n }\n return {\n index,\n arrayLength: arrayNode.value.length,\n insertAt: (i: number) => parent.insertAt(i),\n removeAt: (i: number) => parent.removeAt(i),\n move: (from: number, to: number) => parent.move(from, to),\n };\n }\n\n private get topMenu(): MenuItem[] {\n if (!this._accessor.isCollapsibleTree) {\n return [];\n }\n return [\n {\n value: 'expand',\n label: 'Expand',\n handler: () => this._accessor.expandAll(),\n },\n {\n value: 'collapse',\n label: 'Collapse',\n handler: () => this._accessor.collapseAll(),\n afterSeparator: true,\n },\n ];\n }\n\n private get arrayOwnMenu(): MenuItem[] {\n if (!this._accessor.node.isArray()) {\n return [];\n }\n\n return [\n {\n value: 'array',\n label: 'Array',\n children: [\n ...(this._accessor.length > 0\n ? [\n {\n value: 'add-first',\n label: 'Add item to start',\n handler: () => this._accessor.insertAt(0),\n },\n ]\n : []),\n {\n value: 'add-last',\n label: 'Add item to end',\n handler: () => this._accessor.pushValue(null),\n },\n ],\n },\n ];\n }\n\n private get arrayItemMenu(): MenuItem[] {\n const ctx = this.arrayItemContext;\n if (!ctx) {\n return [];\n }\n\n const moveMenuItem =\n ctx.arrayLength > 1 ? this.buildMoveMenuItem(ctx) : null;\n\n return [\n ...(moveMenuItem ? [moveMenuItem] : []),\n {\n value: 'item',\n label: 'Item',\n children: [\n {\n value: 'add-before',\n label: 'Add before',\n handler: () => ctx.insertAt(ctx.index),\n },\n {\n value: 'add-after',\n label: 'Add after',\n handler: () => ctx.insertAt(ctx.index + 1),\n },\n ],\n },\n {\n value: 'delete',\n label: 'Delete',\n handler: () => ctx.removeAt(ctx.index),\n afterSeparator: true,\n },\n ];\n }\n\n private buildMoveMenuItem(ctx: ArrayItemContext): MenuItem {\n const { index, arrayLength } = ctx;\n const isFirst = index === 0;\n const isLast = index === arrayLength - 1;\n\n const moveChildren: MenuItem[] = [\n ...(arrayLength > 2 && index > 1\n ? [\n {\n value: 'move-to-start',\n label: 'to start',\n handler: () => ctx.move(index, 0),\n },\n ]\n : []),\n ...(!isFirst\n ? [\n {\n value: 'move-up',\n label: 'up',\n handler: () => ctx.move(index, index - 1),\n },\n ]\n : []),\n ...(!isLast\n ? [\n {\n value: 'move-down',\n label: 'down',\n handler: () => ctx.move(index, index + 1),\n },\n ]\n : []),\n ...(arrayLength > 2 && index < arrayLength - 2\n ? [\n {\n value: 'move-to-end',\n label: 'to end',\n handler: () => ctx.move(index, arrayLength - 1),\n },\n ]\n : []),\n ];\n\n return {\n value: 'move',\n label: 'Move',\n children: moveChildren,\n };\n }\n\n private get bottomMenu(): MenuItem[] {\n const copyChildren: MenuItem[] = [\n {\n value: 'json',\n label: 'json',\n handler: () => this.copyJson(),\n },\n ];\n\n const path = this._accessor.path;\n if (path) {\n copyChildren.push({\n value: 'path',\n label: 'path',\n handler: () => this.copyPath(),\n });\n }\n\n return [\n {\n value: 'copy',\n label: 'Copy',\n children: copyChildren,\n },\n ];\n }\n\n private async copyJson(): Promise<void> {\n const json = JSON.stringify(this._accessor.node.getPlainValue(), null, 2);\n await navigator.clipboard.writeText(json);\n }\n\n private async copyPath(): Promise<void> {\n await navigator.clipboard.writeText(this._accessor.path);\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport {\n isForeignKeyValueNode,\n SystemSchemaIds,\n} from '@revisium/schema-toolkit';\nimport type { NodeRendererType } from '../types';\nimport type { RowNodeAccessor } from './RowNodeAccessor';\n\nconst STRING_COLLAPSE_THRESHOLD = 64;\n\nexport class RowNodeLayout {\n constructor(private readonly _accessor: RowNodeAccessor) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get depth(): number {\n let d = 0;\n let current: RowNodeAccessor | null = this._accessor.parent;\n while (current) {\n d++;\n current = current.parent;\n }\n return d;\n }\n\n get guides(): boolean[] {\n const result: boolean[] = [];\n let current: RowNodeAccessor | null = this._accessor.parent;\n while (current) {\n if (current.parent) {\n const siblings = current.parent.getChildAccessors();\n const isLastSibling = siblings.at(-1)?.id === current.id;\n result.unshift(!isLastSibling);\n } else if (!current.isObject()) {\n result.unshift(false);\n }\n current = current.parent;\n }\n return result;\n }\n\n get isCollapsible(): boolean {\n return this._accessor.getChildAccessors().length > 0;\n }\n\n get isCollapsibleTree(): boolean {\n return (\n this.isCollapsible ||\n this._accessor.getChildAccessors().some((c) => c.isCollapsible)\n );\n }\n\n get rendererType(): NodeRendererType {\n if (this._accessor.node.isObject()) {\n const schema = this._accessor.node.schema;\n if ('$ref' in schema && schema.$ref === SystemSchemaIds.File) {\n return 'file';\n }\n return 'container';\n }\n if (this._accessor.node.isArray()) {\n return 'container';\n }\n if (isForeignKeyValueNode(this._accessor.node)) {\n return 'foreignKey';\n }\n if (this._accessor.node.isPrimitive()) {\n const v = this._accessor.value;\n if (typeof v === 'boolean') {\n return 'boolean';\n }\n if (typeof v === 'number') {\n return 'number';\n }\n }\n const schema = this._accessor.node.schema;\n if (\n 'contentMediaType' in schema &&\n schema.contentMediaType === 'text/markdown'\n ) {\n return 'markdown';\n }\n return 'string';\n }\n\n get isContainer(): boolean {\n return this._accessor.node.isObject() || this._accessor.node.isArray();\n }\n\n get isRefNode(): boolean {\n const schema = this._accessor.node.schema;\n return '$ref' in schema && this.isContainer;\n }\n\n get showChildren(): boolean {\n return (\n this.isContainer &&\n this._accessor.isExpanded &&\n this._accessor.getChildAccessors().length > 0\n );\n }\n\n get collapsedLabel(): string {\n if (this._accessor.node.isPrimitive()) {\n return this.primitiveCollapsedLabel;\n }\n if (this._accessor.node.isObject()) {\n return formatCount(this._accessor.children.length, 'key', 'keys');\n }\n if (this._accessor.node.isArray()) {\n return formatCount(this._accessor.length, 'item', 'items');\n }\n return '';\n }\n\n private get primitiveCollapsedLabel(): string {\n const v = this._accessor.value;\n if (typeof v !== 'string') {\n return '';\n }\n if (!v.trim()) {\n return '<empty text>';\n }\n const wordCount = v.trim().split(/\\s+/).length;\n return formatCount(wordCount, 'word', 'words', 'text: ');\n }\n\n get isLongText(): boolean {\n const v = this._accessor.value;\n return typeof v === 'string' && v.length > STRING_COLLAPSE_THRESHOLD;\n }\n\n expandAll(): void {\n this._accessor.expand();\n for (const child of this._accessor.getChildAccessors()) {\n if (child.isCollapsible) {\n child.expandAll();\n }\n }\n }\n\n collapseAll(): void {\n this._accessor.collapse();\n for (const child of this._accessor.getChildAccessors()) {\n if (child.isCollapsible) {\n child.collapseAll();\n }\n }\n }\n}\n\nfunction formatCount(\n count: number,\n singular: string,\n plural: string,\n prefix = '',\n): string {\n return `<${prefix}${count} ${count === 1 ? singular : plural}>`;\n}\n","import type { ValueNode, ValueTreeLike } from '@revisium/schema-toolkit';\nimport type { EditorContext } from '../types';\nimport type { RowTreeState } from '../state/RowTreeState';\nimport { RowNodeAccessor } from './RowNodeAccessor';\nimport { RowNodeState } from './RowNodeState';\nimport { RowNodeMenu } from './RowNodeMenu';\nimport { RowNodeLayout } from './RowNodeLayout';\nimport type { ChildResolver } from './ChildResolver';\n\nexport class RowAccessorFactory {\n constructor(\n private readonly _tree: ValueTreeLike,\n private readonly _treeState: RowTreeState,\n private readonly _editorContext: EditorContext | null,\n ) {}\n\n create(\n node: ValueNode,\n parent: RowNodeAccessor | null,\n childResolver: ChildResolver,\n ): RowNodeAccessor {\n const state = new RowNodeState(node.id, this._treeState);\n\n const accessor: RowNodeAccessor = new RowNodeAccessor(\n node,\n parent,\n state,\n this._tree,\n this._editorContext,\n childResolver,\n );\n\n const layout = new RowNodeLayout(accessor);\n const menu = new RowNodeMenu(accessor);\n accessor.setLayout(layout);\n accessor.setMenu(menu);\n\n if (layout.isRefNode || layout.rendererType === 'markdown') {\n this._treeState.setExpanded(node.id, false);\n }\n\n return accessor;\n }\n}\n","import { observable } from 'mobx';\nimport type { ValueNode } from '@revisium/schema-toolkit';\nimport type { RowNodeAccessor } from './RowNodeAccessor';\nimport type { RowAccessorFactory } from './RowAccessorFactory';\nimport type { ChildResolver } from './ChildResolver';\n\nexport class RowAccessorCache implements ChildResolver {\n private readonly _cache = observable.map<string, RowNodeAccessor>();\n\n constructor(private readonly _factory: RowAccessorFactory) {}\n\n getOrCreate(\n node: ValueNode,\n parent: RowNodeAccessor | null,\n ): RowNodeAccessor {\n const cached = this._cache.get(node.id);\n if (cached) {\n return cached;\n }\n const accessor = this._factory.create(node, parent, this);\n this._cache.set(node.id, accessor);\n return accessor;\n }\n\n getChildren(accessor: RowNodeAccessor): RowNodeAccessor[] {\n const node = accessor.node;\n\n if (node.isObject()) {\n const objectNode = node as ValueNode & {\n children: readonly ValueNode[];\n };\n return objectNode.children.map((childNode) =>\n this.getOrCreate(childNode, accessor),\n );\n }\n\n if (node.isArray()) {\n const arrayNode = node as ValueNode & {\n value: readonly ValueNode[];\n };\n return arrayNode.value.map((itemNode) =>\n this.getOrCreate(itemNode, accessor),\n );\n }\n\n return [];\n }\n\n clear(): void {\n this._cache.clear();\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { ValueTreeLike } from '@revisium/schema-toolkit';\nimport type { EditorContext } from './types';\nimport type { FlatItem } from './flattenNodes';\nimport { flattenNodes } from './flattenNodes';\nimport { RowTreeState } from './state/RowTreeState';\nimport type { RowNodeAccessor } from './accessor/RowNodeAccessor';\nimport { RowAccessorFactory } from './accessor/RowAccessorFactory';\nimport { RowAccessorCache } from './accessor/RowAccessorCache';\n\nexport interface RowEditorCoreOptions {\n collapseComplexity?: number;\n}\n\nexport class RowEditorCore {\n readonly treeState = new RowTreeState();\n private readonly _cache: RowAccessorCache;\n private readonly _root: RowNodeAccessor;\n\n constructor(\n tree: ValueTreeLike,\n editorContext: EditorContext | null,\n options?: RowEditorCoreOptions,\n ) {\n const factory = new RowAccessorFactory(tree, this.treeState, editorContext);\n this._cache = new RowAccessorCache(factory);\n this._root = this._cache.getOrCreate(tree.root, null);\n\n if (options?.collapseComplexity) {\n this._collapseIfComplex(options.collapseComplexity);\n }\n\n makeAutoObservable(this, { treeState: false }, { autoBind: true });\n }\n\n get root(): RowNodeAccessor {\n return this._root;\n }\n\n get flattenedNodes(): readonly FlatItem[] {\n return flattenNodes(this._root);\n }\n\n dispose(): void {\n this._cache.clear();\n this.treeState.reset();\n }\n\n private _collapseIfComplex(threshold: number): void {\n const nodeIds = this._collectAllNodeIds(this._root);\n if (nodeIds.length >= threshold) {\n this.treeState.collapseAll(nodeIds);\n this.treeState.setExpanded(this._root.id, true);\n }\n }\n\n private _collectAllNodeIds(\n accessor: RowNodeAccessor,\n ids: string[] = [],\n ): string[] {\n ids.push(accessor.id);\n for (const child of accessor.getChildAccessors()) {\n this._collectAllNodeIds(child, ids);\n }\n return ids;\n }\n}\n","import { makeAutoObservable, reaction } from 'mobx';\nimport type {\n JsonSchema,\n JsonValuePatch,\n Diagnostic,\n RowModel,\n} from '@revisium/schema-toolkit';\nimport { createRowModel } from '@revisium/schema-toolkit';\nimport { ensureReactivityProvider } from '../../lib/initReactivity';\nimport type { FlatItem } from './flattenNodes';\nimport { RowEditorCore } from './RowEditorCore';\nimport type { NodeVM, EditorContext, RowEditorCallbacks } from './types';\n\nexport type RowEditorMode = 'creating' | 'editing' | 'reading';\n\nexport interface RowEditorVMOptions {\n mode?: RowEditorMode;\n rowId?: string;\n onChange?: (patches: readonly JsonValuePatch[]) => void;\n onSave?: (\n rowId: string,\n value: unknown,\n patches: readonly JsonValuePatch[],\n ) => void;\n onCancel?: () => void;\n callbacks?: RowEditorCallbacks;\n refSchemas?: Record<string, JsonSchema>;\n collapseComplexity?: number;\n}\n\nexport class RowEditorVM implements EditorContext {\n private readonly _rowModel: RowModel;\n private readonly _core: RowEditorCore;\n private readonly _mode: RowEditorMode;\n private readonly _callbacks: RowEditorCallbacks | null;\n private readonly _onChange:\n | ((patches: readonly JsonValuePatch[]) => void)\n | null;\n private readonly _onSave:\n | ((\n rowId: string,\n value: unknown,\n patches: readonly JsonValuePatch[],\n ) => void)\n | null;\n private readonly _onCancel: (() => void) | null;\n private readonly _disposeReaction: (() => void) | null;\n private _prevPatchCount = 0;\n private _rowId: string;\n private _initialRowId: string;\n\n constructor(\n schema: JsonSchema,\n initialValue?: unknown,\n options?: RowEditorVMOptions,\n ) {\n ensureReactivityProvider();\n this._mode = options?.mode ?? 'editing';\n this._rowId = options?.rowId ?? '';\n this._initialRowId = this._rowId;\n this._callbacks = options?.callbacks ?? null;\n this._onChange = options?.onChange ?? null;\n this._onSave = options?.onSave ?? null;\n this._onCancel = options?.onCancel ?? null;\n this._rowModel = createRowModel({\n rowId: 'editor',\n schema,\n data: initialValue,\n refSchemas: options?.refSchemas,\n });\n this._core = new RowEditorCore(this._rowModel.tree, this, {\n collapseComplexity: options?.collapseComplexity,\n });\n\n makeAutoObservable(this, {}, { autoBind: true });\n\n this._disposeReaction = this._onChange\n ? reaction(\n () => this.patches,\n () => this._emitChange(),\n )\n : null;\n }\n\n get root(): NodeVM {\n return this._core.root;\n }\n\n get flattenedNodes(): readonly FlatItem[] {\n return this._core.flattenedNodes;\n }\n\n get rowModel(): RowModel {\n return this._rowModel;\n }\n\n get mode(): RowEditorMode {\n return this._mode;\n }\n\n get rowId(): string {\n return this._rowId;\n }\n\n get initialRowId(): string {\n return this._initialRowId;\n }\n\n get isRowIdChanged(): boolean {\n return this._rowId !== this._initialRowId;\n }\n\n setRowId(value: string): void {\n this._rowId = value;\n }\n\n get isDirty(): boolean {\n return this._rowModel.isDirty;\n }\n\n get hasChanges(): boolean {\n return this.isDirty || this.isRowIdChanged;\n }\n\n get isValid(): boolean {\n return this._rowModel.isValid;\n }\n\n get errors(): readonly Diagnostic[] {\n return this._rowModel.errors;\n }\n\n get isReadOnly(): boolean {\n return this._mode === 'reading';\n }\n\n get callbacks(): RowEditorCallbacks | null {\n return this._callbacks;\n }\n\n get patches(): readonly JsonValuePatch[] {\n return this._rowModel.patches;\n }\n\n getValue(): unknown {\n return this._rowModel.getPlainValue();\n }\n\n save(): void {\n const value = this.getValue();\n const patches = this.patches;\n this.commit();\n this._onSave?.(this._rowId, value, patches);\n }\n\n markAsSaved(): void {\n this.commit();\n }\n\n cancel(): void {\n this._onCancel?.();\n }\n\n commit(): void {\n this._rowModel.commit();\n this._prevPatchCount = 0;\n this._initialRowId = this._rowId;\n }\n\n revert(): void {\n this._rowModel.revert();\n this._prevPatchCount = 0;\n }\n\n dispose(): void {\n this._disposeReaction?.();\n this._core.dispose();\n this._rowModel.dispose();\n }\n\n private _emitChange(): void {\n if (!this._onChange || !this.isValid) {\n return;\n }\n const all = this.patches;\n const newPatches = all.slice(this._prevPatchCount);\n this._prevPatchCount = all.length;\n if (newPatches.length > 0) {\n this._onChange(newPatches);\n }\n }\n}\n","import { FC } from 'react';\nimport { Box, Flex } from '@chakra-ui/react';\n\nexport interface GuidesProps {\n guides: boolean[];\n}\n\ninterface GuideItem {\n key: string;\n showLine: boolean;\n}\n\nfunction toGuideItems(guides: boolean[]): GuideItem[] {\n return guides.map((showLine, i) => ({ key: `d${i}`, showLine }));\n}\n\nexport const Guides: FC<GuidesProps> = ({ guides }) => {\n const items = toGuideItems(guides);\n\n return (\n <Flex position=\"relative\" alignItems=\"center\">\n <Box left=\"-48px\" width=\"48px\" height=\"100%\" position=\"absolute\" />\n {items.map((item) => (\n <Box\n key={item.key}\n position=\"relative\"\n width=\"24px\"\n height=\"100%\"\n _before={\n item.showLine\n ? {\n content: '\"\"',\n position: 'absolute',\n left: '8px',\n top: 0,\n bottom: 0,\n width: '1px',\n backgroundColor: 'blackAlpha.200',\n }\n : undefined\n }\n />\n ))}\n </Flex>\n );\n};\n","import { FC } from 'react';\nimport { Box, Flex } from '@chakra-ui/react';\nimport { MdOutlineChevronRight } from 'react-icons/md';\nimport { PiDotOutlineFill } from 'react-icons/pi';\n\nexport interface DotProps {\n isCollapsed?: boolean;\n isCollapsible?: boolean;\n toggleCollapsed?: () => void;\n testId?: string;\n}\n\nconst getDotTestId = (\n testId: string | undefined,\n isCollapsed: boolean | undefined,\n): string | undefined => {\n if (!testId) {\n return undefined;\n }\n return isCollapsed ? `${testId}-expand` : `${testId}-collapse`;\n};\n\nexport const Dot: FC<DotProps> = ({\n isCollapsed,\n isCollapsible,\n toggleCollapsed,\n testId,\n}) => {\n return (\n <>\n {!isCollapsed && (\n <Flex\n color=\"gray.300\"\n width=\"16px\"\n height=\"28px\"\n _groupHover={{\n display: isCollapsible ? 'none' : 'flex',\n }}\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <PiDotOutlineFill />\n </Flex>\n )}\n {isCollapsible && (\n <Flex\n _groupHover={{\n display: 'inline-flex',\n color: 'gray.500',\n }}\n display={isCollapsed ? 'inline-flex' : 'none'}\n _hover={{\n backgroundColor: 'transparent',\n }}\n color=\"gray.400\"\n onClick={toggleCollapsed}\n width=\"16px\"\n height=\"28px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor=\"pointer\"\n data-testid={getDotTestId(testId, isCollapsed)}\n >\n <Box transform={isCollapsed ? 'rotate(0deg)' : 'rotate(90deg)'}>\n <MdOutlineChevronRight size={16} />\n </Box>\n </Flex>\n )}\n </>\n );\n};\n","import { FC } from 'react';\nimport { Box, Flex, Text } from '@chakra-ui/react';\nimport { PiFunctionLight } from 'react-icons/pi';\nimport { Tooltip } from '../../../components/Tooltip';\n\nexport interface FieldProps {\n name: string;\n formula?: string;\n description?: string;\n isDeprecated?: boolean;\n}\n\nexport const Field: FC<FieldProps> = ({\n name,\n formula,\n description,\n isDeprecated,\n}) => {\n const getTooltipContent = () => {\n if (formula && description) {\n return (\n <Box>\n <Flex\n alignItems=\"center\"\n gap=\"4px\"\n marginBottom=\"4px\"\n fontWeight=\"medium\"\n >\n <PiFunctionLight size={14} />\n <span>{formula}</span>\n </Flex>\n <Box color=\"gray.300\">{description}</Box>\n </Box>\n );\n }\n if (formula) {\n return (\n <Flex alignItems=\"center\" gap=\"4px\">\n <PiFunctionLight size={14} />\n <span>{formula}</span>\n </Flex>\n );\n }\n if (description) {\n return description;\n }\n return null;\n };\n\n const tooltipContent = getTooltipContent();\n\n const fieldContent = (\n <Flex alignItems=\"center\" gap=\"4px\" color=\"gray.400\">\n <Text textDecoration={isDeprecated ? 'line-through' : undefined}>\n {name}:\n </Text>\n {formula && <PiFunctionLight size={14} />}\n </Flex>\n );\n\n return (\n <Flex height=\"28px\" alignItems=\"center\">\n {tooltipContent ? (\n <Tooltip\n openDelay={350}\n content={tooltipContent}\n positioning={{ placement: 'right-end' }}\n showArrow\n >\n {fieldContent}\n </Tooltip>\n ) : (\n fieldContent\n )}\n </Flex>\n );\n};\n","import { FC } from 'react';\nimport { Text } from '@chakra-ui/react';\n\nexport interface MoreProps {\n onClick?: () => void;\n label: string;\n}\n\nexport const More: FC<MoreProps> = ({ onClick, label }) => {\n return (\n <Text ml=\"8px\" color=\"gray.300\" onClick={onClick} cursor=\"pointer\">\n {label}\n </Text>\n );\n};\n","import { FC, Fragment, useState } from 'react';\nimport { Box, Flex, Icon, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuChevronRight } from 'react-icons/lu';\nimport { PiDotsThreeVerticalBold } from 'react-icons/pi';\nimport type { NodeVM } from '../../../vm/types';\n\ninterface NodeMenuProps {\n node: NodeVM;\n}\n\nexport const NodeMenu: FC<NodeMenuProps> = observer(({ node }) => {\n const [isOpen, setIsOpen] = useState(false);\n\n if (node.menu.length === 0) {\n return null;\n }\n\n return (\n <Menu.Root\n lazyMount\n unmountOnExit\n onOpenChange={({ open }) => setIsOpen(open)}\n >\n <Menu.Trigger asChild>\n <Flex\n width=\"24px\"\n left=\"-24px\"\n position=\"absolute\"\n zIndex={1}\n alignItems=\"center\"\n justifyContent=\"center\"\n cursor=\"pointer\"\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n mt=\"2px\"\n height=\"24px\"\n width=\"12px\"\n borderRadius=\"4px\"\n bg=\"blackAlpha.50\"\n backdropFilter=\"blur(4px)\"\n boxShadow=\"0 0 0 1px rgba(0,0,0,0.06), 0 1px 1px rgba(0,0,0,0.08)\"\n opacity={isOpen ? 1 : 0}\n transition={isOpen ? 'opacity 1s ease 0s' : undefined}\n _groupHover={{\n opacity: 1,\n transition: 'opacity 0.5s ease 0s',\n }}\n _hover={{\n boxShadow:\n '0 0 0 1px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.1)',\n }}\n >\n <Icon\n size=\"md\"\n color=\"gray.400\"\n as={PiDotsThreeVerticalBold}\n ></Icon>\n </Flex>\n </Flex>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {node.menu.map((item) =>\n item.children ? (\n <Menu.Root\n key={item.value}\n positioning={{ placement: 'right-start', gutter: 2 }}\n >\n {item.beforeSeparator && <Menu.Separator />}\n <Menu.TriggerItem width=\"100%\" justifyContent=\"space-between\">\n {item.label} <LuChevronRight />\n </Menu.TriggerItem>\n {item.afterSeparator && <Menu.Separator />}\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {item.children.map((childItem) => (\n <Fragment key={childItem.value}>\n {childItem.beforeSeparator && <Menu.Separator />}\n <Menu.Item\n value={childItem.value}\n onClick={childItem.handler}\n >\n <Box flex={1}>{childItem.label}</Box>\n </Menu.Item>\n {childItem.afterSeparator && <Menu.Separator />}\n </Fragment>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n ) : (\n <Fragment key={item.value}>\n {item.beforeSeparator && <Menu.Separator />}\n <Menu.Item value={item.value} onClick={item.handler}>\n <Box flex={1}>{item.label}</Box>\n </Menu.Item>\n {item.afterSeparator && <Menu.Separator />}\n </Fragment>\n ),\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n});\n","import { FC, ReactNode } from 'react';\nimport { Flex } from '@chakra-ui/react';\nimport { Guides } from './Guides';\nimport { Dot } from './Dot';\nimport { Field } from './Field';\nimport { More } from './More';\nimport { NodeMenu } from './NodeMenu';\nimport type { NodeVM } from '../../vm/types';\n\nexport interface RowProps {\n node?: NodeVM;\n name: string;\n guides: boolean[];\n isCollapsible?: boolean;\n isExpanded?: boolean;\n onToggle?: () => void;\n formula?: string;\n description?: string;\n isDeprecated?: boolean;\n skipDot?: boolean;\n skipField?: boolean;\n skipMore?: boolean;\n collapsedLabel?: string;\n isReadOnly?: boolean;\n testId?: string;\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n children?: ReactNode;\n}\n\nexport const Row: FC<RowProps> = ({\n node,\n name,\n guides,\n isCollapsible = false,\n isExpanded = true,\n onToggle,\n formula,\n description,\n isDeprecated,\n skipDot,\n skipField,\n skipMore,\n collapsedLabel,\n isReadOnly,\n testId,\n onMouseEnter,\n onMouseLeave,\n children,\n}) => {\n const isCollapsed = isCollapsible && !isExpanded;\n const showMenu = node && !isReadOnly;\n\n return (\n <Flex\n width=\"100%\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n position=\"relative\"\n className=\"group\"\n data-testid={testId}\n >\n <Guides guides={guides} />\n {showMenu && <NodeMenu node={node} />}\n <Flex width=\"100%\" alignItems=\"center\">\n <Flex flex={skipDot && skipField ? 1 : undefined} minWidth={0}>\n {!skipDot && (\n <Dot\n isCollapsed={isCollapsed}\n isCollapsible={isCollapsible}\n toggleCollapsed={onToggle}\n testId={testId}\n />\n )}\n {!skipField && (\n <Field\n name={name}\n formula={formula}\n description={description}\n isDeprecated={isDeprecated}\n />\n )}\n {children}\n </Flex>\n {!skipMore && isCollapsed && collapsedLabel && (\n <More onClick={onToggle} label={collapsedLabel} />\n )}\n </Flex>\n </Flex>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { ContainerRendererContext } from './types';\nimport { Row } from '../components/Row';\n\nexport const ContainerRendererComponent: FC<ContainerRendererContext> =\n observer(({ node }) => {\n const handleToggle = useCallback(() => {\n node.toggleExpanded();\n }, [node]);\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n isCollapsible={node.isCollapsible}\n isExpanded={node.isExpanded}\n onToggle={handleToggle}\n collapsedLabel={node.collapsedLabel}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n />\n );\n });\n","import { FC, useCallback, useState } from 'react';\nimport { Box } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { ContentEditable } from '../../../components/ContentEditable';\n\nexport interface PrimitiveBoxProps {\n value: string;\n onChange: (value: string) => void;\n readonly?: boolean;\n prefix?: string;\n postfix?: string;\n dataTestId?: string;\n restrict?: RegExp;\n onFocus?: () => void;\n onBlur?: () => void;\n}\n\nexport const PrimitiveBox: FC<PrimitiveBoxProps> = observer(\n ({\n value,\n readonly,\n prefix = '',\n postfix = '',\n restrict,\n dataTestId,\n onChange,\n onFocus,\n onBlur,\n }) => {\n const [focused, setFocused] = useState(false);\n\n const handleFocus = useCallback(() => {\n setFocused(true);\n onFocus?.();\n }, [onFocus]);\n\n const handleBlur = useCallback(() => {\n setFocused(false);\n onBlur?.();\n }, [onBlur]);\n\n return (\n <Box\n borderRadius=\"4px\"\n bgColor={focused ? 'gray.100' : undefined}\n _hover={{\n bgColor: readonly ? undefined : 'gray.100',\n }}\n mt=\"2px\"\n ml=\"2px\"\n pl=\"4px\"\n pr=\"4px\"\n minHeight=\"24px\"\n minWidth=\"15px\"\n cursor={readonly ? 'text' : undefined}\n >\n {readonly ? (\n `${prefix}${value}${postfix}`\n ) : (\n <ContentEditable\n dataTestId={dataTestId}\n prefix={prefix}\n postfix={postfix}\n initValue={value}\n onChange={onChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n restrict={restrict}\n />\n )}\n </Box>\n );\n },\n);\n","import { FC, useCallback, useEffect, useState } from 'react';\nimport { PrimitiveBox } from './PrimitiveBox';\n\nexport interface StringEditorProps {\n value: string;\n setValue: (value: string) => void;\n readonly?: boolean;\n dataTestId?: string;\n}\n\nexport const StringEditor: FC<StringEditorProps> = ({\n value,\n setValue,\n readonly,\n dataTestId,\n}) => {\n const [internalValue, setInternalValue] = useState(value);\n\n useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n const handleChange = useCallback((newValue: string) => {\n setInternalValue(newValue);\n }, []);\n\n const handleBlur = useCallback(() => {\n setValue(internalValue);\n }, [internalValue, setValue]);\n\n const prefix = internalValue ? '' : '\"';\n\n return (\n <PrimitiveBox\n prefix={prefix}\n postfix={prefix}\n value={internalValue}\n readonly={readonly}\n dataTestId={dataTestId}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { PrimitiveRendererContext } from './types';\nimport { Row } from '../components/Row';\nimport { StringEditor } from '../editors/StringEditor';\n\nexport const StringRendererComponent: FC<PrimitiveRendererContext> = observer(\n ({ node }) => {\n const value = String(node.value);\n\n const handleSetValue = useCallback(\n (newValue: string) => {\n node.setValue(newValue);\n },\n [node],\n );\n\n const handleToggle = useCallback(() => {\n node.toggleExpanded();\n }, [node]);\n\n if (node.isLongText) {\n return (\n <>\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isCollapsible\n isExpanded={node.isExpanded}\n onToggle={handleToggle}\n collapsedLabel={node.collapsedLabel}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n />\n {node.isExpanded && (\n <Row name=\"\" guides={[...node.guides, true]} skipDot skipField>\n <StringEditor\n value={value}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n )}\n </>\n );\n }\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n >\n <StringEditor\n value={value}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n );\n },\n);\n","import { FC, useCallback, useEffect, useState, useRef } from 'react';\nimport { PrimitiveBox } from './PrimitiveBox';\n\nconst NUMERIC_CHARS = /^[\\d.eE+-]+$/;\n\nexport interface NumberEditorProps {\n value: number;\n setValue: (value: number) => void;\n readonly?: boolean;\n dataTestId?: string;\n}\n\nexport const NumberEditor: FC<NumberEditorProps> = ({\n value,\n setValue,\n readonly,\n dataTestId,\n}) => {\n const stringValue = value.toString();\n const lastValidValue = useRef(stringValue);\n\n const [state, setState] = useState(stringValue);\n\n useEffect(() => {\n setState(stringValue);\n lastValidValue.current = stringValue;\n }, [stringValue]);\n\n const handleChange = useCallback((newValue: string) => {\n setState(newValue);\n }, []);\n\n const handleBlur = useCallback(() => {\n const trimmed = state.trim();\n const parsedValue = Number(trimmed);\n\n if (trimmed !== '' && Number.isFinite(parsedValue)) {\n setValue(parsedValue);\n setState(parsedValue.toString());\n lastValidValue.current = parsedValue.toString();\n } else {\n setState(lastValidValue.current);\n }\n }, [setValue, state]);\n\n return (\n <PrimitiveBox\n value={state}\n readonly={readonly}\n dataTestId={dataTestId}\n onChange={handleChange}\n onBlur={handleBlur}\n restrict={NUMERIC_CHARS}\n />\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { PrimitiveRendererContext } from './types';\nimport { Row } from '../components/Row';\nimport { NumberEditor } from '../editors/NumberEditor';\n\nexport const NumberRendererComponent: FC<PrimitiveRendererContext> = observer(\n ({ node }) => {\n const handleSetValue = useCallback(\n (value: number) => {\n node.setValue(value);\n },\n [node],\n );\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n >\n <NumberEditor\n value={Number(node.value)}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n );\n },\n);\n","import { FC, ReactNode, useCallback } from 'react';\nimport { Popover, Portal, Box } from '@chakra-ui/react';\n\ninterface FocusPopoverProps {\n isOpen: boolean;\n setIsOpen: (isOpen: boolean) => void;\n trigger: ReactNode;\n children: ReactNode;\n disabled?: boolean;\n width?: string;\n}\n\nexport const FocusPopover: FC<FocusPopoverProps> = ({\n isOpen,\n setIsOpen,\n trigger,\n children,\n disabled,\n width,\n}) => {\n const handleClick = useCallback(() => {\n if (!disabled) {\n setIsOpen(true);\n }\n }, [disabled, setIsOpen]);\n\n return (\n <Popover.Root\n lazyMount\n unmountOnExit\n open={isOpen}\n onOpenChange={({ open }) => {\n if (!disabled) {\n setIsOpen(open);\n }\n }}\n autoFocus={false}\n closeOnInteractOutside={!disabled}\n modal={false}\n positioning={{ placement: 'bottom-start' }}\n >\n <Popover.Trigger asChild>\n <Box onClick={handleClick}>{trigger}</Box>\n </Popover.Trigger>\n {!disabled && (\n <Portal>\n <Popover.Positioner>\n <Popover.Content width={width} p={1}>\n {children}\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n )}\n </Popover.Root>\n );\n};\n","import { FC, ReactNode } from 'react';\nimport { Box } from '@chakra-ui/react';\n\ninterface FocusPopoverItemProps {\n children: ReactNode;\n onClick?: () => void;\n}\n\nexport const FocusPopoverItem: FC<FocusPopoverItemProps> = ({\n children,\n onClick,\n}) => {\n return (\n <Box\n px={2}\n py={1.5}\n cursor=\"pointer\"\n borderRadius=\"md\"\n fontSize=\"sm\"\n _hover={{ bg: 'gray.100' }}\n onClick={onClick}\n >\n {children}\n </Box>\n );\n};\n","import { FC, ReactNode, useState, useCallback } from 'react';\nimport { FocusPopover } from './FocusPopover';\nimport { FocusPopoverItem } from './FocusPopoverItem';\n\ninterface BooleanMenuProps {\n children: ReactNode;\n onChange: (value: boolean) => void;\n disabled?: boolean;\n}\n\nexport const BooleanMenu: FC<BooleanMenuProps> = ({\n children,\n onChange,\n disabled,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n\n const handleSelect = useCallback(\n (value: string) => {\n const boolValue = value === 'true';\n onChange(boolValue);\n setIsOpen(false);\n },\n [onChange],\n );\n\n return (\n <FocusPopover\n width=\"60px\"\n isOpen={isOpen}\n setIsOpen={setIsOpen}\n trigger={children}\n disabled={disabled}\n >\n <FocusPopoverItem onClick={() => handleSelect('true')}>\n true\n </FocusPopoverItem>\n <FocusPopoverItem onClick={() => handleSelect('false')}>\n false\n </FocusPopoverItem>\n </FocusPopover>\n );\n};\n","import { FC, useCallback, useEffect, useState } from 'react';\nimport { PrimitiveBox } from './PrimitiveBox';\nimport { BooleanMenu } from './BooleanMenu';\n\nexport interface BooleanEditorProps {\n value: boolean;\n setValue: (value: boolean) => void;\n readonly?: boolean;\n dataTestId?: string;\n}\n\nexport const BooleanEditor: FC<BooleanEditorProps> = ({\n value,\n setValue,\n readonly,\n dataTestId,\n}) => {\n const stringValue = value.toString();\n\n const [state, setState] = useState(stringValue);\n\n useEffect(() => {\n setState(stringValue);\n }, [stringValue]);\n\n const handleChange = useCallback((value: string) => {\n setState(value);\n }, []);\n\n const handleBlur = useCallback(() => {\n const trimmed = state.trim();\n const boolValue =\n trimmed.toLowerCase() === 'false' || trimmed === '0'\n ? false\n : Boolean(trimmed);\n setState(boolValue.toString());\n setValue(boolValue);\n }, [setValue, state]);\n\n const handleBooleanSelect = useCallback(\n (boolValue: boolean) => {\n setState(boolValue.toString());\n setValue(boolValue);\n },\n [setValue],\n );\n\n return (\n <BooleanMenu onChange={handleBooleanSelect} disabled={readonly}>\n <PrimitiveBox\n value={state}\n readonly={readonly}\n dataTestId={dataTestId}\n onChange={handleChange}\n onBlur={handleBlur}\n />\n </BooleanMenu>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { PrimitiveRendererContext } from './types';\nimport { Row } from '../components/Row';\nimport { BooleanEditor } from '../editors/BooleanEditor';\n\nexport const BooleanRendererComponent: FC<PrimitiveRendererContext> = observer(\n ({ node }) => {\n const handleSetValue = useCallback(\n (value: boolean) => {\n node.setValue(value);\n },\n [node],\n );\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n >\n <BooleanEditor\n value={Boolean(node.value)}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n );\n },\n);\n","import { FC, useCallback } from 'react';\nimport { Flex, IconButton } from '@chakra-ui/react';\nimport { PiArrowSquareUpRightThin, PiInfo } from 'react-icons/pi';\nimport { observer } from 'mobx-react-lite';\nimport { Tooltip } from '../../../components/Tooltip';\nimport type { ForeignKeyNodeVM } from '../../vm/types';\n\ninterface ForeignKeyActionsProps {\n node: ForeignKeyNodeVM;\n}\n\nexport const ForeignKeyActions: FC<ForeignKeyActionsProps> = observer(\n ({ node }) => {\n const value = String(node.value);\n const showNavigate =\n Boolean(value) && Boolean(node.callbacks?.onNavigateToForeignKey);\n const showWarning = !value && !node.isEditorReadOnly;\n\n const handleNavigate = useCallback(() => {\n node.callbacks?.onNavigateToForeignKey?.(node.foreignKeyTableId, value);\n }, [node, value]);\n\n return (\n <Flex alignItems=\"center\" gap=\"4px\">\n {showNavigate && (\n <IconButton\n aria-label=\"Navigate to foreign key\"\n variant=\"ghost\"\n size=\"2xs\"\n color=\"gray.500\"\n _hover={{ color: 'black', bg: 'gray.100' }}\n onClick={handleNavigate}\n data-testid={`${node.testId}-fk-navigate`}\n >\n <PiArrowSquareUpRightThin />\n </IconButton>\n )}\n {showWarning && (\n <Tooltip\n openDelay={50}\n closeDelay={50}\n content=\"This field requires a valid foreign key ID\"\n >\n <Flex\n width=\"24px\"\n height=\"24px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n color=\"gray.400\"\n >\n <PiInfo />\n </Flex>\n </Tooltip>\n )}\n </Flex>\n );\n },\n);\n","export class Debounce {\n private _timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(private readonly _delay: number) {}\n\n schedule(fn: () => void): void {\n if (this._timer) {\n clearTimeout(this._timer);\n }\n this._timer = setTimeout(fn, this._delay);\n }\n\n dispose(): void {\n if (this._timer) {\n clearTimeout(this._timer);\n this._timer = null;\n }\n }\n}\n","import { makeAutoObservable, reaction, runInAction } from 'mobx';\nimport { Debounce } from '../../lib/Debounce';\n\nexport type SearchForeignKeySearchFn = (\n tableId: string,\n search: string,\n) => Promise<{ ids: string[]; hasMore: boolean }>;\n\ntype SearchState = 'loading' | 'empty' | 'list' | 'notFound' | 'error';\n\nexport class SearchForeignKeyVM {\n private _search = '';\n private _state: SearchState = 'loading';\n private _ids: string[] = [];\n private _hasMore = false;\n private _initialized = false;\n private _disposeReaction: (() => void) | null = null;\n private readonly _debounce = new Debounce(300);\n\n constructor(\n private readonly _tableId: string,\n private readonly _onSearch: SearchForeignKeySearchFn | null,\n ) {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get search(): string {\n return this._search;\n }\n\n get state(): SearchState {\n return this._state;\n }\n\n get ids(): string[] {\n return this._ids;\n }\n\n get hasMore(): boolean {\n return this._hasMore;\n }\n\n get showInput(): boolean {\n return (\n this._state === 'list' ||\n this._state === 'notFound' ||\n (this._state === 'loading' && this._initialized)\n );\n }\n\n get showFooter(): boolean {\n return (\n this._state === 'list' ||\n this._state === 'notFound' ||\n this._state === 'error' ||\n this._state === 'empty'\n );\n }\n\n get showLoading(): boolean {\n return this._state === 'loading';\n }\n\n get showNotFound(): boolean {\n return this._state === 'notFound';\n }\n\n get showError(): boolean {\n return this._state === 'error';\n }\n\n get showEmpty(): boolean {\n return this._state === 'empty';\n }\n\n get showList(): boolean {\n return this._state === 'list';\n }\n\n get tableId(): string {\n return this._tableId;\n }\n\n init(): void {\n void this._performSearch();\n this._disposeReaction = reaction(\n () => this._search,\n () => this._debouncedSearch(),\n );\n }\n\n setSearch(value: string): void {\n this._search = value;\n }\n\n dispose(): void {\n this._disposeReaction?.();\n this._disposeReaction = null;\n this._debounce.dispose();\n }\n\n private _debouncedSearch(): void {\n this._debounce.schedule(() => {\n void this._performSearch();\n });\n }\n\n private _resolveState(ids: string[], search: string): SearchState {\n if (ids.length === 0 && !search) {\n return 'empty';\n }\n if (ids.length === 0) {\n return 'notFound';\n }\n return 'list';\n }\n\n private async _performSearch(): Promise<void> {\n if (!this._onSearch) {\n this._state = 'error';\n return;\n }\n\n const searchTerm = this._search;\n try {\n this._state = 'loading';\n const result = await this._onSearch(this._tableId, searchTerm);\n runInAction(() => {\n if (this._search !== searchTerm) {\n return;\n }\n this._initialized = true;\n this._ids = result.ids;\n this._hasMore = result.hasMore;\n this._state = this._resolveState(result.ids, searchTerm);\n });\n } catch {\n runInAction(() => {\n if (this._search !== searchTerm) {\n return;\n }\n this._state = 'error';\n });\n }\n }\n}\n","import { FC } from 'react';\nimport { Flex, Text, IconButton } from '@chakra-ui/react';\nimport { PiXBold } from 'react-icons/pi';\n\ninterface HeaderProps {\n tableId: string;\n onClose?: () => void;\n}\n\nexport const Header: FC<HeaderProps> = ({ tableId, onClose }) => {\n return (\n <Flex p=\"4px\" alignItems=\"center\" justifyContent=\"space-between\">\n <Text fontSize=\"xs\" color=\"gray.600\" fontWeight=\"medium\">\n Select from &quot;{tableId}&quot;\n </Text>\n {onClose && (\n <IconButton\n aria-label=\"Close\"\n variant=\"ghost\"\n size=\"2xs\"\n color=\"gray.500\"\n _hover={{ color: 'black' }}\n onClick={onClose}\n >\n <PiXBold />\n </IconButton>\n )}\n </Flex>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { Box, Input, IconButton } from '@chakra-ui/react';\nimport { PiXBold } from 'react-icons/pi';\n\ninterface SearchInputProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nexport const SearchInput: FC<SearchInputProps> = ({ value, onChange }) => {\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n },\n [onChange],\n );\n\n const handleClear = useCallback(() => {\n onChange('');\n }, [onChange]);\n\n return (\n <Box px=\"4px\" pb=\"4px\" position=\"relative\">\n <Input\n value={value}\n onChange={handleChange}\n placeholder=\"Search by ID...\"\n size=\"sm\"\n data-testid=\"fk-search-input\"\n autoFocus\n />\n {value && (\n <IconButton\n aria-label=\"Clear\"\n variant=\"ghost\"\n size=\"2xs\"\n position=\"absolute\"\n right=\"8px\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n onClick={handleClear}\n color=\"gray.400\"\n _hover={{ color: 'black' }}\n >\n <PiXBold />\n </IconButton>\n )}\n </Box>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { Box } from '@chakra-ui/react';\n\ninterface ItemProps {\n id: string;\n onSelect: (id: string) => void;\n}\n\nexport const Item: FC<ItemProps> = ({ id, onSelect }) => {\n const handleClick = useCallback(() => {\n onSelect(id);\n }, [id, onSelect]);\n\n return (\n <Box\n px={2}\n py={1.5}\n mr=\"12px\"\n cursor=\"pointer\"\n borderRadius=\"md\"\n fontSize=\"sm\"\n _hover={{ bg: 'gray.100' }}\n onClick={handleClick}\n data-testid={`fk-item-${id}`}\n >\n {id}\n </Box>\n );\n};\n","import { FC } from 'react';\nimport { Box } from '@chakra-ui/react';\nimport { Item } from './Item';\n\ninterface ListProps {\n ids: string[];\n onSelect: (id: string) => void;\n}\n\nexport const List: FC<ListProps> = ({ ids, onSelect }) => {\n return (\n <Box flex={1} overflowY=\"auto\" data-testid=\"fk-list\">\n {ids.map((id) => (\n <Item key={id} id={id} onSelect={onSelect} />\n ))}\n </Box>\n );\n};\n","import { FC } from 'react';\nimport { Flex, Text } from '@chakra-ui/react';\n\nexport const Empty: FC = () => {\n return (\n <Flex\n flex={1}\n justifyContent=\"center\"\n alignItems=\"center\"\n data-testid=\"fk-empty\"\n >\n <Text fontSize=\"sm\" color=\"gray.500\">\n No rows found in this table\n </Text>\n </Flex>\n );\n};\n","import { FC } from 'react';\nimport { HStack, Button } from '@chakra-ui/react';\nimport { PiMagnifyingGlassBold, PiPlusBold } from 'react-icons/pi';\n\ninterface FooterProps {\n onOpenTableSearch?: () => void;\n onCreateAndConnect?: () => void;\n}\n\nexport const Footer: FC<FooterProps> = ({\n onOpenTableSearch,\n onCreateAndConnect,\n}) => {\n const hasActions = onOpenTableSearch || onCreateAndConnect;\n\n if (!hasActions) {\n return null;\n }\n\n return (\n <HStack\n mt=\"4px\"\n p=\"4px\"\n gap={2}\n borderTopWidth=\"1px\"\n borderColor=\"gray.200\"\n >\n {onOpenTableSearch && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n color=\"gray.500\"\n onClick={onOpenTableSearch}\n data-testid=\"fk-open-table-search\"\n >\n <PiMagnifyingGlassBold />\n Open Table Search\n </Button>\n )}\n {onCreateAndConnect && (\n <Button\n size=\"xs\"\n variant=\"ghost\"\n color=\"gray.500\"\n onClick={onCreateAndConnect}\n data-testid=\"fk-create-and-connect\"\n >\n <PiPlusBold />\n Create &amp; Connect\n </Button>\n )}\n </HStack>\n );\n};\n","import { FC, useEffect, useState } from 'react';\nimport { Flex, Spinner, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { SearchForeignKeyVM } from '../vm/SearchForeignKeyVM';\nimport type { SearchForeignKeySearchFn } from '../vm/SearchForeignKeyVM';\nimport { Header } from './Header';\nimport { SearchInput } from './SearchInput';\nimport { List } from './List';\nimport { Empty } from './Empty';\nimport { Footer } from './Footer';\n\ninterface SearchForeignKeyProps {\n tableId: string;\n onSearch: SearchForeignKeySearchFn;\n onSelect: (id: string) => void;\n onClose?: () => void;\n onOpenTableSearch?: () => void;\n onCreateAndConnect?: () => void;\n}\n\nexport type { SearchForeignKeyProps };\n\nexport const SearchForeignKey: FC<SearchForeignKeyProps> = observer(\n ({\n tableId,\n onSearch,\n onSelect,\n onClose,\n onOpenTableSearch,\n onCreateAndConnect,\n }) => {\n const [model] = useState(() => new SearchForeignKeyVM(tableId, onSearch));\n\n useEffect(() => {\n model.init();\n return () => model.dispose();\n }, [model]);\n\n return (\n <Flex\n flexDirection=\"column\"\n height=\"290px\"\n width=\"100%\"\n data-testid=\"fk-picker\"\n >\n <Header tableId={tableId} onClose={onClose} />\n {model.showInput && (\n <SearchInput value={model.search} onChange={model.setSearch} />\n )}\n {model.showLoading && (\n <Flex flex={1} justifyContent=\"center\" alignItems=\"center\">\n <Spinner size=\"sm\" color=\"gray.400\" />\n </Flex>\n )}\n {model.showNotFound && (\n <Flex flex={1} justifyContent=\"center\" alignItems=\"center\">\n <Text fontSize=\"sm\" color=\"gray.500\">\n No results found\n </Text>\n </Flex>\n )}\n {model.showError && (\n <Flex flex={1} justifyContent=\"center\" alignItems=\"center\">\n <Text fontSize=\"sm\" color=\"gray.500\">\n Could not load data\n </Text>\n </Flex>\n )}\n {model.showEmpty && <Empty />}\n {model.showList && <List ids={model.ids} onSelect={onSelect} />}\n {model.showFooter && (\n <Footer\n onOpenTableSearch={onOpenTableSearch}\n onCreateAndConnect={onCreateAndConnect}\n />\n )}\n </Flex>\n );\n },\n);\n","import { FC, ReactNode, useState, useCallback } from 'react';\nimport { FocusPopover } from './FocusPopover';\nimport { SearchForeignKey } from '../../../search-foreign-key';\nimport type { ForeignKeyNodeVM } from '../../vm/types';\n\ninterface ForeignKeyMenuProps {\n node: ForeignKeyNodeVM;\n onSelect: (id: string) => void;\n disabled?: boolean;\n children: ReactNode;\n}\n\nexport const ForeignKeyMenu: FC<ForeignKeyMenuProps> = ({\n node,\n onSelect,\n disabled,\n children,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n\n const onSearchForeignKey = node.callbacks?.onSearchForeignKey;\n\n const handleSelect = useCallback(\n (id: string) => {\n onSelect(id);\n setIsOpen(false);\n },\n [onSelect],\n );\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n const handleOpenTableSearch = useCallback(async () => {\n if (!node.callbacks?.onOpenTableSearch) {\n return;\n }\n const selectedId = await node.callbacks.onOpenTableSearch(\n node.foreignKeyTableId,\n );\n if (selectedId) {\n handleSelect(selectedId);\n }\n }, [node.callbacks, node.foreignKeyTableId, handleSelect]);\n\n const handleCreateAndConnect = useCallback(async () => {\n if (!node.callbacks?.onCreateAndConnect) {\n return;\n }\n const createdId = await node.callbacks.onCreateAndConnect(\n node.foreignKeyTableId,\n );\n if (createdId) {\n handleSelect(createdId);\n }\n }, [node.callbacks, node.foreignKeyTableId, handleSelect]);\n\n if (!onSearchForeignKey) {\n return <>{children}</>;\n }\n\n return (\n <FocusPopover\n isOpen={isOpen}\n setIsOpen={setIsOpen}\n trigger={children}\n disabled={disabled}\n width=\"320px\"\n >\n <SearchForeignKey\n tableId={node.foreignKeyTableId}\n onSearch={onSearchForeignKey}\n onSelect={handleSelect}\n onClose={handleClose}\n onOpenTableSearch={\n node.callbacks?.onOpenTableSearch ? handleOpenTableSearch : undefined\n }\n onCreateAndConnect={\n node.callbacks?.onCreateAndConnect\n ? handleCreateAndConnect\n : undefined\n }\n />\n </FocusPopover>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport type { ForeignKeyNodeVM } from '../../vm/types';\nimport { Row } from '../components/Row';\nimport { StringEditor } from '../editors/StringEditor';\nimport { ForeignKeyActions } from '../editors/ForeignKeyActions';\nimport { ForeignKeyMenu } from '../editors/ForeignKeyMenu';\n\ninterface ForeignKeyRendererContext {\n node: ForeignKeyNodeVM;\n}\n\nexport const ForeignKeyRendererComponent: FC<ForeignKeyRendererContext> =\n observer(({ node }) => {\n const value = String(node.value);\n\n const handleSetValue = useCallback(\n (newValue: string) => {\n node.setValue(newValue);\n },\n [node],\n );\n\n const handleSelect = useCallback(\n (id: string) => {\n node.setValue(id);\n },\n [node],\n );\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n >\n <Flex alignItems=\"center\" gap=\"2px\">\n <ForeignKeyMenu\n node={node}\n onSelect={handleSelect}\n disabled={node.isFieldReadOnly}\n >\n <StringEditor\n value={value}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </ForeignKeyMenu>\n <ForeignKeyActions node={node} />\n </Flex>\n </Row>\n );\n });\n","import { FC } from 'react';\nimport { HoverCard, Portal, Image, IconButton } from '@chakra-ui/react';\nimport { PiFile } from 'react-icons/pi';\n\ninterface FileIconProps {\n onClick: () => void;\n dataTestId?: string;\n}\n\nconst FileIcon: FC<FileIconProps> = ({ onClick, dataTestId }) => {\n return (\n <IconButton\n data-testid={dataTestId}\n aria-label=\"Open file\"\n variant=\"ghost\"\n size=\"2xs\"\n color=\"gray.400\"\n _hover={{ bg: 'gray.100', color: 'black' }}\n onClick={onClick}\n >\n <PiFile />\n </IconButton>\n );\n};\n\ninterface FileHoverCardProps {\n url: string;\n availablePreview: boolean;\n width: number;\n height: number;\n onClick: () => void;\n dataTestId?: string;\n}\n\nexport const FileHoverCard: FC<FileHoverCardProps> = ({\n url,\n availablePreview,\n width,\n height,\n onClick,\n dataTestId,\n}) => {\n if (!availablePreview) {\n return <FileIcon onClick={onClick} dataTestId={dataTestId} />;\n }\n\n return (\n <HoverCard.Root\n lazyMount\n unmountOnExit\n openDelay={350}\n closeDelay={100}\n positioning={{ gutter: 16 }}\n >\n <HoverCard.Trigger asChild>\n <span>\n <FileIcon onClick={onClick} dataTestId={dataTestId} />\n </span>\n </HoverCard.Trigger>\n <Portal>\n <HoverCard.Positioner>\n <HoverCard.Content>\n <HoverCard.Arrow>\n <HoverCard.ArrowTip />\n </HoverCard.Arrow>\n <Image\n aspectRatio={height > 0 ? width / height : 1}\n width=\"400px\"\n src={url}\n alt=\"File preview\"\n />\n </HoverCard.Content>\n </HoverCard.Positioner>\n </Portal>\n </HoverCard.Root>\n );\n};\n","import { FC, useCallback, useRef } from 'react';\nimport { Box, Flex, IconButton } from '@chakra-ui/react';\nimport { PiInfo, PiUploadThin } from 'react-icons/pi';\nimport { observer } from 'mobx-react-lite';\nimport { Tooltip } from '../../../components/Tooltip';\nimport { FileHoverCard } from './FileHoverCard';\nimport type { FileNodeVM } from '../../vm/types';\n\ninterface FileActionsProps {\n node: FileNodeVM;\n}\n\nexport const FileActions: FC<FileActionsProps> = observer(({ node }) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const url = node.fileUrl;\n const fileId = node.fileId;\n const status = node.fileStatus;\n const mimeType = node.fileMimeType;\n const width = node.fileWidth;\n const height = node.fileHeight;\n const readonly = node.isEditorReadOnly;\n\n const availablePreview = mimeType.startsWith('image/');\n const showViewFile = Boolean(url);\n const showUploadFile =\n !readonly &&\n Boolean(node.callbacks?.onUploadFile) &&\n (status === 'ready' || status === 'uploaded');\n const showInfo = !showViewFile && !showUploadFile;\n\n const handleFileChange = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n return;\n }\n event.target.value = '';\n const rowId = node.editorContext?.rowId ?? '';\n const result = await node.callbacks?.onUploadFile?.({\n rowId,\n fileId,\n file,\n });\n if (result) {\n const valueNode = node.node as unknown as {\n setValue(v: unknown, o?: { internal?: boolean }): void;\n };\n valueNode.setValue(result, { internal: true });\n }\n },\n [node, fileId],\n );\n\n const handleOpenFile = useCallback(() => {\n if (node.callbacks?.onOpenFile) {\n node.callbacks.onOpenFile(url);\n } else {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n }, [node, url]);\n\n const handleUploadClick = useCallback(() => {\n fileInputRef.current?.click();\n }, []);\n\n return (\n <Flex alignItems=\"center\">\n {showInfo && (\n <Tooltip\n openDelay={50}\n closeDelay={50}\n content={\n readonly\n ? 'The file was not uploaded in this revision'\n : 'Save the row first, then upload the file'\n }\n >\n <Flex\n width=\"24px\"\n height=\"24px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n color=\"gray.400\"\n >\n <PiInfo />\n </Flex>\n </Tooltip>\n )}\n {showViewFile && (\n <FileHoverCard\n url={url}\n availablePreview={availablePreview}\n width={width}\n height={height}\n onClick={handleOpenFile}\n dataTestId={`${node.testId}-open-file`}\n />\n )}\n {showUploadFile && (\n <Box>\n <input\n ref={fileInputRef}\n type=\"file\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n data-testid={`${node.testId}-file-input`}\n />\n <IconButton\n aria-label=\"Upload file\"\n variant=\"ghost\"\n size=\"2xs\"\n color={showViewFile ? 'gray.300' : 'gray.500'}\n _hover={{ bg: 'gray.100', color: 'black' }}\n onClick={handleUploadClick}\n data-testid={`${node.testId}-upload-file`}\n >\n <PiUploadThin />\n </IconButton>\n </Box>\n )}\n </Flex>\n );\n});\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { FileNodeVM } from '../../vm/types';\nimport { Row } from '../components/Row';\nimport { FileActions } from '../editors/FileActions';\n\ninterface FileRendererContext {\n node: FileNodeVM;\n}\n\nexport const FileRendererComponent: FC<FileRendererContext> = observer(\n ({ node }) => {\n const handleToggle = useCallback(() => {\n node.toggleExpanded();\n }, [node]);\n\n return (\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n isCollapsible={node.isCollapsible}\n isExpanded={node.isExpanded}\n onToggle={handleToggle}\n collapsedLabel={node.collapsedLabel}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n skipMore\n >\n <FileActions node={node} />\n </Row>\n );\n },\n);\n","import { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { Box, Textarea } from '@chakra-ui/react';\n\nexport interface MarkdownEditorProps {\n value: string;\n setValue: (value: string) => void;\n readonly?: boolean;\n dataTestId?: string;\n}\n\nexport const MarkdownEditor: FC<MarkdownEditorProps> = ({\n value,\n setValue,\n readonly,\n dataTestId,\n}) => {\n const [internalValue, setInternalValue] = useState(value);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n setInternalValue(value);\n }, [value]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInternalValue(e.target.value);\n },\n [],\n );\n\n const handleBlur = useCallback(() => {\n setValue(internalValue);\n }, [internalValue, setValue]);\n\n return (\n <Box mt=\"2px\" ml=\"2px\" pr=\"4px\" width=\"100%\">\n <Textarea\n ref={textareaRef}\n value={internalValue}\n onChange={handleChange}\n onBlur={handleBlur}\n readOnly={readonly}\n data-testid={dataTestId}\n fontFamily=\"mono\"\n fontSize=\"13px\"\n lineHeight=\"1.5\"\n minHeight=\"120px\"\n resize=\"vertical\"\n borderColor=\"gray.200\"\n _focus={{\n borderColor: 'blue.400',\n boxShadow: '0 0 0 1px var(--chakra-colors-blue-400)',\n }}\n placeholder=\"Markdown content...\"\n />\n </Box>\n );\n};\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { PrimitiveRendererContext } from './types';\nimport { Row } from '../components/Row';\nimport { MarkdownEditor } from '../editors/MarkdownEditor';\n\nexport const MarkdownRendererComponent: FC<PrimitiveRendererContext> = observer(\n ({ node }) => {\n const value = String(node.value);\n\n const handleSetValue = useCallback(\n (newValue: string) => {\n node.setValue(newValue);\n },\n [node],\n );\n\n return (\n <>\n <Row\n node={node}\n name={node.displayName}\n guides={node.guides}\n formula={node.formula}\n isCollapsible\n isExpanded={node.isExpanded}\n onToggle={node.toggleExpanded}\n collapsedLabel={node.collapsedLabel}\n isReadOnly={node.isEditorReadOnly}\n testId={node.testId}\n />\n {node.isExpanded && (\n <Row name=\"\" guides={[...node.guides, true]} skipDot skipField>\n <MarkdownEditor\n value={value}\n setValue={handleSetValue}\n readonly={node.isFieldReadOnly}\n dataTestId={`${node.testId}-editor`}\n />\n </Row>\n )}\n </>\n );\n },\n);\n","import type { FC } from 'react';\nimport type { NodeRendererType, NodeVM } from '../../vm/types';\nimport { ContainerRendererComponent } from './ContainerRenderer';\nimport { StringRendererComponent } from './StringRenderer';\nimport { NumberRendererComponent } from './NumberRenderer';\nimport { BooleanRendererComponent } from './BooleanRenderer';\nimport { ForeignKeyRendererComponent } from './ForeignKeyRenderer';\nimport { FileRendererComponent } from './FileRenderer';\nimport { MarkdownRendererComponent } from './MarkdownRenderer';\n\nexport const NODE_RENDERERS: Record<NodeRendererType, FC<{ node: NodeVM }>> = {\n container: ContainerRendererComponent as FC<{ node: NodeVM }>,\n string: StringRendererComponent as FC<{ node: NodeVM }>,\n number: NumberRendererComponent as FC<{ node: NodeVM }>,\n boolean: BooleanRendererComponent as FC<{ node: NodeVM }>,\n foreignKey: ForeignKeyRendererComponent as FC<{ node: NodeVM }>,\n file: FileRendererComponent as FC<{ node: NodeVM }>,\n markdown: MarkdownRendererComponent as FC<{ node: NodeVM }>,\n};\n","import { FC } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport type { FlatItem } from '../../vm/flattenNodes';\nimport { NODE_RENDERERS } from '../renderers/NodeRenderers';\nimport { Row } from '../components/Row';\nimport { CreateButton } from '../../../components/CreateButton';\n\nexport const FlatItemView: FC<{ item: FlatItem }> = observer(({ item }) => {\n if (item.type === 'node') {\n const Renderer = NODE_RENDERERS[item.node.rendererType];\n return <Renderer node={item.node} />;\n }\n\n const handleAddItem = () => {\n item.array.pushValue(null);\n };\n\n return (\n <Row name=\"\" guides={item.guides} skipDot skipField skipMore>\n <CreateButton\n title=\"Item\"\n onClick={handleAddItem}\n dataTestId={`${item.array.testId}-add-button`}\n />\n </Row>\n );\n});\n","import { FC, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Virtuoso } from 'react-virtuoso';\nimport type { RowEditorVM } from '../../vm/RowEditorVM';\nimport type { FlatItem } from '../../vm/flattenNodes';\nimport { FlatItemView } from './FlatItemView';\n\nexport interface RowEditorProps {\n viewModel: RowEditorVM;\n}\n\nexport const RowEditor: FC<RowEditorProps> = observer(({ viewModel }) => {\n const itemContent = useCallback(\n (_index: number, item: FlatItem) => <FlatItemView item={item} />,\n [],\n );\n\n return (\n <Virtuoso\n data={viewModel.flattenedNodes as FlatItem[]}\n itemContent={itemContent}\n useWindowScroll\n style={{ width: '100%', height: '100%' }}\n />\n );\n});\n","import { FC, Fragment, useCallback } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { VStack } from '@chakra-ui/react';\nimport type { NodeVM } from '../../vm/types';\nimport { NODE_RENDERERS } from '../renderers/NodeRenderers';\nimport { Row } from '../components/Row';\nimport { CreateButton } from '../../../components/CreateButton';\n\nexport interface NodeViewProps {\n viewModel: NodeVM;\n}\n\nexport const NodeView: FC<NodeViewProps> = observer(({ viewModel }) => {\n const Renderer = NODE_RENDERERS[viewModel.rendererType];\n const { showChildren, childNodes } = viewModel;\n const showAddButton = viewModel.isArray() && viewModel.showAddButton;\n\n const handleAddItem = useCallback(() => {\n if (viewModel.isArray()) {\n viewModel.pushValue(null);\n }\n }, [viewModel]);\n\n return (\n <Fragment>\n <Renderer node={viewModel} />\n {showChildren && (\n <VStack align=\"stretch\" gap={0}>\n {childNodes.map((child) => (\n <NodeView key={child.id} viewModel={child} />\n ))}\n </VStack>\n )}\n {showAddButton && (\n <Row\n name=\"\"\n guides={[...viewModel.guides, false]}\n skipDot\n skipField\n skipMore\n >\n <CreateButton\n title=\"Item\"\n onClick={handleAddItem}\n dataTestId={`${viewModel.testId}-add-button`}\n />\n </Row>\n )}\n </Fragment>\n );\n});\n","export enum FilterFieldType {\n String = 'String',\n Number = 'Number',\n Boolean = 'Boolean',\n ForeignKey = 'ForeignKey',\n File = 'File',\n DateTime = 'DateTime',\n}\n","import { SystemSchemaIds } from '@revisium/schema-toolkit';\nimport { FilterFieldType } from './field-types.js';\n\nexport enum SystemFieldId {\n Id = 'id',\n CreatedAt = 'createdAt',\n UpdatedAt = 'updatedAt',\n CreatedId = 'createdId',\n VersionId = 'versionId',\n PublishedAt = 'publishedAt',\n Hash = 'hash',\n SchemaHash = 'schemaHash',\n}\n\nexport interface SystemFieldDef {\n id: SystemFieldId;\n label: string;\n fieldType: FilterFieldType;\n ref: SystemSchemaIds;\n}\n\nexport const SYSTEM_FIELDS: SystemFieldDef[] = [\n {\n id: SystemFieldId.Id,\n label: 'id',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowId,\n },\n {\n id: SystemFieldId.CreatedAt,\n label: 'createdAt',\n fieldType: FilterFieldType.DateTime,\n ref: SystemSchemaIds.RowCreatedAt,\n },\n {\n id: SystemFieldId.UpdatedAt,\n label: 'updatedAt',\n fieldType: FilterFieldType.DateTime,\n ref: SystemSchemaIds.RowUpdatedAt,\n },\n {\n id: SystemFieldId.CreatedId,\n label: 'createdId',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowCreatedId,\n },\n {\n id: SystemFieldId.VersionId,\n label: 'versionId',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowVersionId,\n },\n {\n id: SystemFieldId.PublishedAt,\n label: 'publishedAt',\n fieldType: FilterFieldType.DateTime,\n ref: SystemSchemaIds.RowPublishedAt,\n },\n {\n id: SystemFieldId.Hash,\n label: 'hash',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowHash,\n },\n {\n id: SystemFieldId.SchemaHash,\n label: 'schemaHash',\n fieldType: FilterFieldType.String,\n ref: SystemSchemaIds.RowSchemaHash,\n },\n];\n\nexport const SYSTEM_FIELD_BY_REF: ReadonlyMap<string, SystemFieldDef> = new Map(\n SYSTEM_FIELDS.map((f) => [f.ref, f]),\n);\n","export const SYSTEM_FIELD_IDS: ReadonlySet<string> = new Set([\n 'id',\n 'createdAt',\n 'updatedAt',\n 'createdId',\n 'versionId',\n 'publishedAt',\n 'hash',\n 'schemaHash',\n]);\n","import {\n SchemaParser,\n SystemSchemaIds,\n createSchemaTree,\n fileSchema,\n rowIdSchema,\n rowCreatedAtSchema,\n rowCreatedIdSchema,\n rowVersionIdSchema,\n rowPublishedAtSchema,\n rowUpdatedAtSchema,\n rowHashSchema,\n rowSchemaHashSchema,\n} from '@revisium/schema-toolkit';\nimport type {\n JsonObjectSchema,\n JsonSchema,\n RefSchemas,\n SchemaNode,\n} from '@revisium/schema-toolkit';\nimport { extractColumns } from '../../Columns/model/extractColumns.js';\nimport type { ColumnSpec } from '../../Columns/model/types.js';\nimport { FilterFieldType } from '../../shared/field-types.js';\nimport { SYSTEM_FIELDS } from '../../shared/system-fields.js';\n\nexport const DATA_FIELD = 'data';\n\nexport function stripDataFieldPrefix(field: string): string {\n const prefix = `${DATA_FIELD}.`;\n if (field.startsWith(prefix)) {\n return field.slice(prefix.length);\n }\n if (field === DATA_FIELD) {\n return '';\n }\n return field;\n}\n\nconst SYSTEM_REF_SCHEMAS: RefSchemas = {\n [SystemSchemaIds.File]: fileSchema,\n [SystemSchemaIds.RowId]: rowIdSchema,\n [SystemSchemaIds.RowCreatedAt]: rowCreatedAtSchema,\n [SystemSchemaIds.RowCreatedId]: rowCreatedIdSchema,\n [SystemSchemaIds.RowVersionId]: rowVersionIdSchema,\n [SystemSchemaIds.RowPublishedAt]: rowPublishedAtSchema,\n [SystemSchemaIds.RowUpdatedAt]: rowUpdatedAtSchema,\n [SystemSchemaIds.RowHash]: rowHashSchema,\n [SystemSchemaIds.RowSchemaHash]: rowSchemaHashSchema,\n};\n\nexport function wrapDataSchema(dataSchema: JsonSchema): JsonObjectSchema {\n return {\n type: 'object',\n properties: { [DATA_FIELD]: dataSchema },\n additionalProperties: false,\n required: [DATA_FIELD],\n } as JsonObjectSchema;\n}\n\nfunction buildRowSchema(wrappedDataSchema: JsonObjectSchema): JsonObjectSchema {\n const systemProperties: Record<string, { $ref: string }> = {};\n for (const sf of SYSTEM_FIELDS) {\n systemProperties[sf.id] = { $ref: sf.ref };\n }\n\n return {\n type: 'object',\n properties: {\n ...systemProperties,\n ...wrappedDataSchema.properties,\n },\n additionalProperties: false,\n required: [...Object.keys(systemProperties), ...wrappedDataSchema.required],\n } as JsonObjectSchema;\n}\n\nexport class SchemaContext {\n private _allColumns: ColumnSpec[] = [];\n private _dataSchema: JsonSchema | null = null;\n private _wrappedDataSchema: JsonObjectSchema | null = null;\n private _fullRefSchemas: RefSchemas = {};\n private _rootNode: SchemaNode | null = null;\n\n get allColumns(): ColumnSpec[] {\n return this._allColumns;\n }\n\n get sortableFields(): ColumnSpec[] {\n return this._allColumns.filter(\n (col) => !col.isDeprecated && col.fieldType !== FilterFieldType.File,\n );\n }\n\n get filterableFields(): ColumnSpec[] {\n return this.sortableFields;\n }\n\n get dataSchema(): JsonSchema | null {\n return this._dataSchema;\n }\n\n get wrappedDataSchema(): JsonObjectSchema | null {\n return this._wrappedDataSchema;\n }\n\n get fullRefSchemas(): RefSchemas {\n return this._fullRefSchemas;\n }\n\n get rootNode(): SchemaNode | null {\n return this._rootNode;\n }\n\n init(dataSchema: JsonSchema, refSchemas?: RefSchemas): void {\n this._dataSchema = dataSchema;\n this._fullRefSchemas = { ...SYSTEM_REF_SCHEMAS, ...refSchemas };\n\n const wrapped = wrapDataSchema(dataSchema);\n this._wrappedDataSchema = wrapped;\n const rowSchema = buildRowSchema(wrapped);\n const parser = new SchemaParser();\n this._rootNode = parser.parse(rowSchema, this._fullRefSchemas);\n const tree = createSchemaTree(this._rootNode);\n parser.parseFormulas(tree);\n this._allColumns = extractColumns(this._rootNode);\n }\n}\n","import type { SchemaNode } from '@revisium/schema-toolkit';\nimport { SystemSchemaIds } from '@revisium/schema-toolkit';\nimport { FilterFieldType } from '../../shared/field-types.js';\nimport { SYSTEM_FIELD_BY_REF } from '../../shared/system-fields.js';\nimport { DATA_FIELD } from '../../TableEditor/model/SchemaContext.js';\nimport type { ColumnSpec } from './types.js';\n\nconst NODE_TYPE_TO_FIELD_TYPE: Readonly<\n Record<string, FilterFieldType | undefined>\n> = {\n string: FilterFieldType.String,\n number: FilterFieldType.Number,\n boolean: FilterFieldType.Boolean,\n};\n\nexport function extractColumns(rootNode: SchemaNode): ColumnSpec[] {\n const columns: ColumnSpec[] = [];\n if (!rootNode.isObject()) {\n return columns;\n }\n collectColumns(rootNode, '', columns);\n return columns;\n}\n\nfunction collectColumns(\n node: SchemaNode,\n parentPath: string,\n columns: ColumnSpec[],\n): void {\n for (const child of node.properties()) {\n const fieldPath = buildFieldPath(parentPath, child.name());\n const result = resolveColumn(child, fieldPath);\n\n if (result === 'recurse') {\n collectColumns(child, fieldPath, columns);\n } else if (result) {\n if (Array.isArray(result)) {\n for (const col of result) {\n columns.push(col);\n }\n } else {\n columns.push(result);\n }\n }\n }\n}\n\nfunction buildFieldPath(parentPath: string, fieldName: string): string {\n return parentPath ? `${parentPath}.${fieldName}` : fieldName;\n}\n\nfunction resolveColumn(\n child: SchemaNode,\n fieldPath: string,\n): ColumnSpec | ColumnSpec[] | 'recurse' | null {\n if (child.isArray()) {\n return null;\n }\n\n const refResult = resolveRefColumn(child, fieldPath);\n if (refResult) {\n return refResult;\n }\n\n if (child.isObject() && !child.isRef()) {\n return 'recurse';\n }\n\n if (child.foreignKey() !== undefined) {\n const col = createColumn(fieldPath, child, FilterFieldType.ForeignKey);\n col.foreignKeyTableId = child.foreignKey();\n return col;\n }\n\n const fieldType = NODE_TYPE_TO_FIELD_TYPE[child.nodeType()];\n if (fieldType) {\n return createColumn(fieldPath, child, fieldType);\n }\n\n return null;\n}\n\nfunction resolveRefColumn(\n child: SchemaNode,\n fieldPath: string,\n): ColumnSpec | ColumnSpec[] | null {\n const refValue = child.ref();\n if (!refValue) {\n return null;\n }\n\n const systemDef = SYSTEM_FIELD_BY_REF.get(refValue);\n if (systemDef) {\n const isDeprecated = child.metadata().deprecated ?? false;\n const hasFormula = child.hasFormula();\n return {\n field: systemDef.id,\n label: systemDef.label,\n fieldType: systemDef.fieldType,\n isSystem: true,\n systemFieldId: systemDef.id,\n isDeprecated,\n hasFormula,\n isSortable: !isDeprecated && !hasFormula,\n };\n }\n\n if (refValue === SystemSchemaIds.File) {\n return resolveFileRefColumns(child, fieldPath);\n }\n\n return null;\n}\n\nfunction resolveFileRefColumns(\n child: SchemaNode,\n fieldPath: string,\n): ColumnSpec[] {\n const fileColumn = createColumn(fieldPath, child, FilterFieldType.File);\n const result: ColumnSpec[] = [fileColumn];\n\n if (child.isObject()) {\n for (const subField of child.properties()) {\n const subFieldPath = buildFieldPath(fieldPath, subField.name());\n const fieldType = NODE_TYPE_TO_FIELD_TYPE[subField.nodeType()];\n if (fieldType) {\n const subCol = createColumn(subFieldPath, subField, fieldType);\n subCol.parentFileField = fieldPath;\n result.push(subCol);\n }\n }\n }\n\n return result;\n}\n\nfunction stripDataPrefix(fieldPath: string): string {\n if (fieldPath === DATA_FIELD) {\n return DATA_FIELD;\n }\n if (fieldPath.startsWith(`${DATA_FIELD}.`)) {\n return fieldPath.slice(DATA_FIELD.length + 1);\n }\n return fieldPath;\n}\n\nfunction createColumn(\n fieldPath: string,\n child: SchemaNode,\n fieldType: FilterFieldType,\n): ColumnSpec {\n const isDeprecated = child.metadata().deprecated ?? false;\n const hasFormula = child.hasFormula();\n return {\n field: fieldPath,\n label: stripDataPrefix(fieldPath),\n fieldType,\n isSystem: false,\n isDeprecated,\n hasFormula,\n isSortable:\n !isDeprecated && !hasFormula && fieldType !== FilterFieldType.File,\n };\n}\n","import { FilterFieldType } from '../../shared/field-types.js';\nimport type { ColumnSpec } from './types.js';\n\nconst SEMANTIC_NAME_PATTERNS =\n /^(title|name|label|subject|summary|description|heading|caption|email|username|displayName|firstName|lastName)$/i;\n\nconst PRIORITY_BY_TYPE: Record<FilterFieldType, number> = {\n [FilterFieldType.File]: 2,\n [FilterFieldType.String]: 2,\n [FilterFieldType.Number]: 3,\n [FilterFieldType.Boolean]: 3,\n [FilterFieldType.DateTime]: 3,\n [FilterFieldType.ForeignKey]: 4,\n};\n\nfunction columnPriority(col: ColumnSpec): number {\n if (\n col.fieldType === FilterFieldType.String &&\n SEMANTIC_NAME_PATTERNS.test(col.label)\n ) {\n return 1;\n }\n return PRIORITY_BY_TYPE[col.fieldType];\n}\n\nexport function selectDefaultColumns(\n columns: ColumnSpec[],\n maxVisible: number = 4,\n): ColumnSpec[] {\n const idColumn = columns.find((col) => col.isSystem && col.field === 'id');\n\n const fileFieldPrefixes = columns\n .filter((col) => col.fieldType === FilterFieldType.File)\n .map((col) => `${col.field}.`);\n\n const eligible = columns.filter(\n (col) =>\n !col.isSystem &&\n !col.isDeprecated &&\n !fileFieldPrefixes.some((prefix) => col.field.startsWith(prefix)),\n );\n const sorted = [...eligible].sort(\n (a, b) => columnPriority(a) - columnPriority(b),\n );\n\n const dataSlots = idColumn ? maxVisible - 1 : maxVisible;\n\n let fileIncluded = false;\n const dataColumns: ColumnSpec[] = [];\n for (const col of sorted) {\n if (dataColumns.length >= dataSlots) {\n break;\n }\n if (col.fieldType === FilterFieldType.File) {\n if (fileIncluded) {\n continue;\n }\n fileIncluded = true;\n }\n dataColumns.push(col);\n }\n\n if (idColumn) {\n return [idColumn, ...dataColumns];\n }\n return dataColumns;\n}\n","import { makeAutoObservable, observable, untracked } from 'mobx';\nimport { FilterFieldType } from '../../shared/field-types.js';\nimport type { ColumnSpec, PinSide, ViewColumn } from './types.js';\nimport { selectDefaultColumns } from './selectDefaultColumns.js';\n\nconst DEFAULT_COLUMN_WIDTH = 150;\nconst DEFAULT_ID_COLUMN_WIDTH = 240;\n\nfunction fieldToCssVar(field: string): string {\n return `--cw-${field.replaceAll('.', '-')}`;\n}\n\nfunction isValidPinZoneOrder(\n fields: string[],\n pins: Map<string, PinSide>,\n): boolean {\n let zone: 'left' | 'none' | 'right' = 'left';\n for (const field of fields) {\n const pin = pins.get(field);\n if (zone === 'left') {\n if (pin === 'right') {\n zone = 'right';\n } else if (pin === undefined) {\n zone = 'none';\n }\n } else if (zone === 'none') {\n if (pin === 'left') {\n return false;\n }\n if (pin === 'right') {\n zone = 'right';\n }\n } else {\n if (pin !== 'right') {\n return false;\n }\n }\n }\n return true;\n}\n\nexport class ColumnsModel {\n private _allColumns: ColumnSpec[] = [];\n private _visibleFields: string[] = [];\n private readonly _columnWidths = observable.map<string, number>();\n private readonly _pinnedColumns = observable.map<string, PinSide>();\n private _onChange: (() => void) | null = null;\n private _isResizing = false;\n private _wrapperElement: HTMLElement | null = null;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n // --- Computed Getters ---\n\n get allColumns(): ColumnSpec[] {\n return this._allColumns;\n }\n\n get visibleColumns(): ColumnSpec[] {\n const lookup = this._columnLookup;\n const result: ColumnSpec[] = [];\n for (const field of this._visibleFields) {\n const col = lookup.get(field);\n if (col) {\n result.push(col);\n }\n }\n return result;\n }\n\n get hiddenColumns(): ColumnSpec[] {\n const visible = this._visibleFieldSet;\n return this._allColumns.filter((col) => !visible.has(col.field));\n }\n\n get availableFieldsToAdd(): ColumnSpec[] {\n const visible = this._visibleFieldSet;\n return this._allColumns.filter(\n (col) => !visible.has(col.field) && !col.isSystem,\n );\n }\n\n get availableFieldsToInsert(): ColumnSpec[] {\n const visible = this._visibleFieldSet;\n return this._allColumns.filter((col) => !visible.has(col.field));\n }\n\n get availableSystemFieldsToAdd(): ColumnSpec[] {\n const visible = this._visibleFieldSet;\n return this._allColumns.filter(\n (col) => !visible.has(col.field) && col.isSystem,\n );\n }\n\n get hasHiddenColumns(): boolean {\n return this._visibleFields.length < this._allColumns.length;\n }\n\n get canRemoveColumn(): boolean {\n return this._visibleFields.length > 1;\n }\n\n get sortableFields(): ColumnSpec[] {\n return this._operableFields;\n }\n\n get filterableFields(): ColumnSpec[] {\n return this._operableFields;\n }\n\n private get _operableFields(): ColumnSpec[] {\n return this._allColumns.filter(\n (col) => !col.isDeprecated && col.fieldType !== FilterFieldType.File,\n );\n }\n\n get pinnedLeftCount(): number {\n let count = 0;\n for (const side of this._pinnedColumns.values()) {\n if (side === 'left') {\n count++;\n }\n }\n return count;\n }\n\n get pinnedRightCount(): number {\n let count = 0;\n for (const side of this._pinnedColumns.values()) {\n if (side === 'right') {\n count++;\n }\n }\n return count;\n }\n\n // --- Lifecycle ---\n\n init(columns: ColumnSpec[]): void {\n this._allColumns = columns;\n const defaults = selectDefaultColumns(columns);\n this._visibleFields = defaults.map((col) => col.field);\n this._columnWidths.clear();\n this._pinnedColumns.clear();\n }\n\n // --- Visibility ---\n\n showColumn(field: string): void {\n if (!this._visibleFields.includes(field)) {\n const rightBounds = this._getZoneBounds('right');\n this._visibleFields.splice(rightBounds.start, 0, field);\n this._notifyChange();\n }\n }\n\n hideColumn(field: string): void {\n if (this._visibleFields.length <= 1) {\n return;\n }\n const index = this._visibleFields.indexOf(field);\n if (index !== -1) {\n this._visibleFields.splice(index, 1);\n this._pinnedColumns.delete(field);\n this._notifyChange();\n }\n }\n\n hideAll(): void {\n if (this._visibleFields.length <= 1) {\n return;\n }\n this._visibleFields = this._visibleFields.slice(0, 1);\n this._pinnedColumns.clear();\n this._notifyChange();\n }\n\n addAll(): void {\n this._visibleFields = this._allColumns.map((col) => col.field);\n this._notifyChange();\n }\n\n // --- Query ---\n\n getColumnIndex(field: string): number {\n return this._visibleFields.indexOf(field);\n }\n\n canMoveLeft(field: string): boolean {\n const index = this.getColumnIndex(field);\n if (index <= 0) {\n return false;\n }\n const zone = this._getZone(field);\n const bounds = this._getZoneBounds(zone);\n return index > bounds.start;\n }\n\n canMoveRight(field: string): boolean {\n const index = this.getColumnIndex(field);\n if (index < 0 || index >= this._visibleFields.length - 1) {\n return false;\n }\n const zone = this._getZone(field);\n const bounds = this._getZoneBounds(zone);\n return index < bounds.end - 1;\n }\n\n canMoveToStart(field: string): boolean {\n return this.canMoveLeft(field);\n }\n\n canMoveToEnd(field: string): boolean {\n return this.canMoveRight(field);\n }\n\n // --- Movement ---\n\n moveColumnLeft(field: string): void {\n if (!this.canMoveLeft(field)) {\n return;\n }\n const index = this.getColumnIndex(field);\n this._visibleFields.splice(index, 1);\n this._visibleFields.splice(index - 1, 0, field);\n this._notifyChange();\n }\n\n moveColumnRight(field: string): void {\n if (!this.canMoveRight(field)) {\n return;\n }\n const index = this.getColumnIndex(field);\n this._visibleFields.splice(index, 1);\n this._visibleFields.splice(index + 1, 0, field);\n this._notifyChange();\n }\n\n moveColumnToStart(field: string): void {\n if (!this.canMoveLeft(field)) {\n return;\n }\n const index = this.getColumnIndex(field);\n const zone = this._getZone(field);\n const bounds = this._getZoneBounds(zone);\n this._visibleFields.splice(index, 1);\n this._visibleFields.splice(bounds.start, 0, field);\n this._notifyChange();\n }\n\n moveColumnToEnd(field: string): void {\n if (!this.canMoveRight(field)) {\n return;\n }\n const index = this.getColumnIndex(field);\n const zone = this._getZone(field);\n const bounds = this._getZoneBounds(zone);\n this._visibleFields.splice(index, 1);\n this._visibleFields.splice(bounds.end - 1, 0, field);\n this._notifyChange();\n }\n\n // --- Insertion ---\n\n insertColumnBefore(targetField: string, newField: string): void {\n if (this._visibleFields.includes(newField)) {\n return;\n }\n const targetIndex = this._visibleFields.indexOf(targetField);\n if (targetIndex === -1) {\n return;\n }\n const targetPin = this._pinnedColumns.get(targetField);\n const shouldPin =\n targetPin !== undefined &&\n this._hasNeighborPin(targetIndex, 'before', targetPin);\n this._visibleFields.splice(targetIndex, 0, newField);\n if (shouldPin) {\n this._pinnedColumns.set(newField, targetPin);\n }\n this._notifyChange();\n }\n\n insertColumnAfter(targetField: string, newField: string): void {\n if (this._visibleFields.includes(newField)) {\n return;\n }\n const targetIndex = this._visibleFields.indexOf(targetField);\n if (targetIndex === -1) {\n return;\n }\n const targetPin = this._pinnedColumns.get(targetField);\n const shouldPin =\n targetPin !== undefined &&\n this._hasNeighborPin(targetIndex, 'after', targetPin);\n this._visibleFields.splice(targetIndex + 1, 0, newField);\n if (shouldPin) {\n this._pinnedColumns.set(newField, targetPin);\n }\n this._notifyChange();\n }\n\n reorderColumns(fields: string[]): void {\n this._visibleFields = fields;\n this._notifyChange();\n }\n\n // --- Width ---\n\n get isResizing(): boolean {\n return this._isResizing;\n }\n\n setWrapperElement(el: HTMLElement | null): void {\n this._wrapperElement = el;\n }\n\n setColumnWidth(field: string, width: number): void {\n this._isResizing = true;\n this._columnWidths.set(field, width);\n if (this._wrapperElement) {\n this._wrapperElement.style.setProperty(\n fieldToCssVar(field),\n `${width}px`,\n );\n }\n }\n\n commitColumnWidth(): void {\n this._isResizing = false;\n this._notifyChange();\n }\n\n getColumnWidth(field: string): number | undefined {\n return this._columnWidths.get(field);\n }\n\n resolveColumnWidth(field: string): number {\n return this._resolveWidthUntracked(field);\n }\n\n get columnWidthCssVars(): Record<string, string> {\n if (this._isResizing) {\n return this._buildCssVarsUntracked();\n }\n return this._buildCssVarsTracked();\n }\n\n getWidthCssVarsDuringResize(): Record<string, string> {\n return this._buildCssVarsUntracked();\n }\n\n columnWidthCssVar(field: string): string {\n return `var(${fieldToCssVar(field)}, ${field === 'id' ? DEFAULT_ID_COLUMN_WIDTH : DEFAULT_COLUMN_WIDTH}px)`;\n }\n\n // --- Pinning ---\n\n getPinState(field: string): PinSide | undefined {\n return this._pinnedColumns.get(field);\n }\n\n isPinned(field: string): boolean {\n return this._pinnedColumns.has(field);\n }\n\n canPinLeft(field: string): boolean {\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return false;\n }\n return this._pinnedColumns.get(field) !== 'left';\n }\n\n canPinRight(field: string): boolean {\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return false;\n }\n return this._pinnedColumns.get(field) !== 'right';\n }\n\n canUnpin(field: string): boolean {\n return this._pinnedColumns.has(field);\n }\n\n pinLeft(field: string): void {\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return;\n }\n this._pinnedColumns.set(field, 'left');\n this._visibleFields.splice(index, 1);\n const insertAt = this._pinnedLeftInsertIndex();\n this._visibleFields.splice(insertAt, 0, field);\n this._notifyChange();\n }\n\n pinRight(field: string): void {\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return;\n }\n this._pinnedColumns.set(field, 'right');\n this._visibleFields.splice(index, 1);\n const insertAt = this._pinnedRightInsertIndex();\n this._visibleFields.splice(insertAt, 0, field);\n this._notifyChange();\n }\n\n unpin(field: string): void {\n if (!this._pinnedColumns.has(field)) {\n return;\n }\n const wasLeft = this._pinnedColumns.get(field) === 'left';\n this._pinnedColumns.delete(field);\n const index = this.getColumnIndex(field);\n if (index < 0) {\n return;\n }\n this._visibleFields.splice(index, 1);\n if (wasLeft) {\n const middleBounds = this._getZoneBounds('middle');\n this._visibleFields.splice(middleBounds.start, 0, field);\n } else {\n const middleBounds = this._getZoneBounds('middle');\n this._visibleFields.splice(middleBounds.end, 0, field);\n }\n this._notifyChange();\n }\n\n getColumnStickyLeft(\n field: string,\n selectionWidth: number,\n ): number | undefined {\n if (this._pinnedColumns.get(field) !== 'left') {\n return undefined;\n }\n let offset = selectionWidth;\n for (const f of this._visibleFields) {\n if (f === field) {\n break;\n }\n if (this._pinnedColumns.get(f) === 'left') {\n offset += this._resolveWidthUntracked(f);\n }\n }\n return offset;\n }\n\n getColumnStickyRight(field: string): number | undefined {\n if (this._pinnedColumns.get(field) !== 'right') {\n return undefined;\n }\n let offset = 0;\n let found = false;\n for (const f of this._visibleFields) {\n if (f === field) {\n found = true;\n continue;\n }\n if (found && this._pinnedColumns.get(f) === 'right') {\n offset += this._resolveWidthUntracked(f);\n }\n }\n return offset;\n }\n\n getColumnStickyLeftCss(\n field: string,\n selectionWidth: number,\n ): string | undefined {\n if (this._pinnedColumns.get(field) !== 'left') {\n return undefined;\n }\n const parts: string[] = [];\n if (selectionWidth > 0) {\n parts.push(`${selectionWidth}px`);\n }\n for (const f of this._visibleFields) {\n if (f === field) {\n break;\n }\n if (this._pinnedColumns.get(f) === 'left') {\n parts.push(this.columnWidthCssVar(f));\n }\n }\n if (parts.length === 0) {\n return '0px';\n }\n if (parts.length === 1) {\n return parts[0];\n }\n return `calc(${parts.join(' + ')})`;\n }\n\n getColumnStickyRightCss(field: string): string | undefined {\n if (this._pinnedColumns.get(field) !== 'right') {\n return undefined;\n }\n const parts: string[] = [];\n let found = false;\n for (const f of this._visibleFields) {\n if (f === field) {\n found = true;\n continue;\n }\n if (found && this._pinnedColumns.get(f) === 'right') {\n parts.push(this.columnWidthCssVar(f));\n }\n }\n if (parts.length === 0) {\n return '0px';\n }\n if (parts.length === 1) {\n return parts[0];\n }\n return `calc(${parts.join(' + ')})`;\n }\n\n isStickyLeftBoundary(field: string): boolean {\n if (this._pinnedColumns.get(field) !== 'left') {\n return false;\n }\n const index = this.getColumnIndex(field);\n const nextField = this._visibleFields[index + 1];\n if (!nextField) {\n return true;\n }\n return this._pinnedColumns.get(nextField) !== 'left';\n }\n\n isStickyRightBoundary(field: string): boolean {\n if (this._pinnedColumns.get(field) !== 'right') {\n return false;\n }\n const index = this.getColumnIndex(field);\n if (index <= 0) {\n return true;\n }\n const prevField = this._visibleFields[index - 1];\n if (!prevField) {\n return true;\n }\n return this._pinnedColumns.get(prevField) !== 'right';\n }\n\n // --- Reset ---\n\n resetToDefaults(): void {\n const defaults = selectDefaultColumns(this._allColumns);\n this._visibleFields = defaults.map((col) => col.field);\n this._columnWidths.clear();\n this._pinnedColumns.clear();\n this._notifyChange();\n }\n\n // --- Serialization ---\n\n serializeToViewColumns(): ViewColumn[] {\n return this._visibleFields.map((field) => {\n const viewField = this._toViewField(field);\n const width = this._columnWidths.get(field);\n const pinned = this._pinnedColumns.get(field);\n const result: ViewColumn = { field: viewField };\n if (width !== undefined) {\n result.width = width;\n }\n if (pinned !== undefined) {\n result.pinned = pinned;\n }\n return result;\n });\n }\n\n applyViewColumns(viewColumns: ViewColumn[]): void {\n const lookup = this._columnLookup;\n const fields: string[] = [];\n const widths = new Map<string, number>();\n const pins = new Map<string, PinSide>();\n\n for (const vc of viewColumns) {\n const field = this._fromViewField(vc.field);\n if (lookup.has(field)) {\n fields.push(field);\n if (vc.width !== undefined) {\n widths.set(field, vc.width);\n }\n if (vc.pinned !== undefined) {\n pins.set(field, vc.pinned);\n }\n }\n }\n\n this._columnWidths.clear();\n this._pinnedColumns.clear();\n\n for (const [field, width] of widths) {\n this._columnWidths.set(field, width);\n }\n\n if (isValidPinZoneOrder(fields, pins)) {\n for (const [field, side] of pins) {\n this._pinnedColumns.set(field, side);\n }\n }\n\n if (fields.length === 0) {\n const defaults = selectDefaultColumns(this._allColumns);\n this._visibleFields = defaults.map((col) => col.field);\n } else {\n this._visibleFields = fields;\n }\n }\n\n // --- Events ---\n\n setOnChange(cb: (() => void) | null): void {\n this._onChange = cb;\n }\n\n dispose(): void {\n this._onChange = null;\n }\n\n // --- Private ---\n\n private get _visibleFieldSet(): Set<string> {\n return new Set(this._visibleFields);\n }\n\n private get _columnLookup(): Map<string, ColumnSpec> {\n return new Map(this._allColumns.map((col) => [col.field, col]));\n }\n\n private _getZone(field: string): 'left' | 'middle' | 'right' {\n const pin = this._pinnedColumns.get(field);\n if (pin === 'left') {\n return 'left';\n }\n if (pin === 'right') {\n return 'right';\n }\n return 'middle';\n }\n\n private _getZoneBounds(zone: 'left' | 'middle' | 'right'): {\n start: number;\n end: number;\n } {\n let leftEnd = 0;\n for (let i = 0; i < this._visibleFields.length; i++) {\n const f = this._visibleFields[i];\n if (f && this._pinnedColumns.get(f) === 'left') {\n leftEnd = i + 1;\n } else {\n break;\n }\n }\n\n let rightStart = this._visibleFields.length;\n for (let i = this._visibleFields.length - 1; i >= 0; i--) {\n const f = this._visibleFields[i];\n if (f && this._pinnedColumns.get(f) === 'right') {\n rightStart = i;\n } else {\n break;\n }\n }\n\n switch (zone) {\n case 'left':\n return { start: 0, end: leftEnd };\n case 'right':\n return { start: rightStart, end: this._visibleFields.length };\n case 'middle':\n return { start: leftEnd, end: rightStart };\n }\n }\n\n private _pinnedLeftInsertIndex(): number {\n const bounds = this._getZoneBounds('left');\n return bounds.end;\n }\n\n private _pinnedRightInsertIndex(): number {\n const bounds = this._getZoneBounds('right');\n return bounds.start;\n }\n\n private _hasNeighborPin(\n targetIndex: number,\n direction: 'before' | 'after',\n pin: PinSide,\n ): boolean {\n const neighborIndex =\n direction === 'after' ? targetIndex + 1 : targetIndex - 1;\n const neighbor = this._visibleFields[neighborIndex];\n if (!neighbor) {\n return false;\n }\n return this._pinnedColumns.get(neighbor) === pin;\n }\n\n private _toViewField(field: string): string {\n return field;\n }\n\n private _fromViewField(viewField: string): string {\n return viewField;\n }\n\n private _resolveWidthUntracked(field: string): number {\n return untracked(\n () =>\n this._columnWidths.get(field) ??\n (field === 'id' ? DEFAULT_ID_COLUMN_WIDTH : DEFAULT_COLUMN_WIDTH),\n );\n }\n\n private _buildCssVarsTracked(): Record<string, string> {\n const vars: Record<string, string> = {};\n for (const field of this._visibleFields) {\n const width =\n this._columnWidths.get(field) ??\n (field === 'id' ? DEFAULT_ID_COLUMN_WIDTH : DEFAULT_COLUMN_WIDTH);\n vars[fieldToCssVar(field)] = `${width}px`;\n }\n return vars;\n }\n\n private _buildCssVarsUntracked(): Record<string, string> {\n return untracked(() => {\n const vars: Record<string, string> = {};\n for (const field of this._visibleFields) {\n const width =\n this._columnWidths.get(field) ??\n (field === 'id' ? DEFAULT_ID_COLUMN_WIDTH : DEFAULT_COLUMN_WIDTH);\n vars[fieldToCssVar(field)] = `${width}px`;\n }\n return vars;\n });\n }\n\n private _notifyChange(): void {\n if (this._onChange) {\n this._onChange();\n }\n }\n}\n","import { FilterFieldType } from '../../shared/field-types.js';\nimport type { ColumnSpec } from './types.js';\n\nexport interface FileFieldGroup {\n parent: ColumnSpec;\n children: ColumnSpec[];\n parentVisible: boolean;\n}\n\nexport type ColumnOrFileGroup = ColumnSpec | FileFieldGroup;\n\nexport function isFileFieldGroup(\n item: ColumnOrFileGroup,\n): item is FileFieldGroup {\n return 'parent' in item && 'children' in item;\n}\n\nexport function groupFileFields(\n columns: ColumnSpec[],\n allColumns?: ColumnSpec[],\n): ColumnOrFileGroup[] {\n const allLookup = allColumns\n ? new Map(allColumns.map((c) => [c.field, c]))\n : null;\n const groups = new Map<string, FileFieldGroup>();\n const result: ColumnOrFileGroup[] = [];\n\n for (const col of columns) {\n if (col.fieldType === FilterFieldType.File) {\n const existing = groups.get(col.field);\n if (existing) {\n existing.parent = col;\n existing.parentVisible = false;\n } else {\n const group: FileFieldGroup = {\n parent: col,\n children: [],\n parentVisible: false,\n };\n groups.set(col.field, group);\n result.push(group);\n }\n } else if (col.parentFileField) {\n let group = groups.get(col.parentFileField);\n if (!group) {\n const parentCol = allLookup?.get(col.parentFileField);\n if (parentCol) {\n group = {\n parent: parentCol,\n children: [],\n parentVisible: true,\n };\n groups.set(col.parentFileField, group);\n result.push(group);\n }\n }\n if (group) {\n group.children.push(col);\n } else {\n result.push(col);\n }\n } else {\n result.push(col);\n }\n }\n\n return result;\n}\n","import { FilterFieldType } from '../../../shared/field-types.js';\n\nexport enum FilterOperator {\n Equals = 'equals',\n NotEquals = 'not_equals',\n Contains = 'contains',\n NotContains = 'not_contains',\n StartsWith = 'starts_with',\n EndsWith = 'ends_with',\n IsEmpty = 'is_empty',\n IsNotEmpty = 'is_not_empty',\n Gt = 'gt',\n Gte = 'gte',\n Lt = 'lt',\n Lte = 'lte',\n IsTrue = 'is_true',\n IsFalse = 'is_false',\n Search = 'search',\n}\n\nexport interface OperatorInfo {\n operator: FilterOperator;\n label: string;\n requiresValue: boolean;\n}\n\nconst UNARY_OPERATORS = new Set<FilterOperator>([\n FilterOperator.IsEmpty,\n FilterOperator.IsNotEmpty,\n FilterOperator.IsTrue,\n FilterOperator.IsFalse,\n]);\n\nexport function operatorRequiresValue(operator: FilterOperator): boolean {\n return !UNARY_OPERATORS.has(operator);\n}\n\nfunction op(\n operator: FilterOperator,\n label: string,\n requiresValue = true,\n): OperatorInfo {\n return { operator, label, requiresValue };\n}\n\nconst STRING_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.Equals, 'equals'),\n op(FilterOperator.NotEquals, 'not equals'),\n op(FilterOperator.Contains, 'contains'),\n op(FilterOperator.NotContains, 'not contains'),\n op(FilterOperator.StartsWith, 'starts with'),\n op(FilterOperator.EndsWith, 'ends with'),\n op(FilterOperator.IsEmpty, 'is empty', false),\n op(FilterOperator.IsNotEmpty, 'is not empty', false),\n op(FilterOperator.Search, 'search'),\n];\n\nconst NUMBER_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.Equals, '='),\n op(FilterOperator.NotEquals, '!='),\n op(FilterOperator.Gt, '>'),\n op(FilterOperator.Gte, '>='),\n op(FilterOperator.Lt, '<'),\n op(FilterOperator.Lte, '<='),\n op(FilterOperator.IsEmpty, 'is empty', false),\n op(FilterOperator.IsNotEmpty, 'is not empty', false),\n];\n\nconst BOOLEAN_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.IsTrue, 'is true', false),\n op(FilterOperator.IsFalse, 'is false', false),\n op(FilterOperator.IsEmpty, 'is empty', false),\n op(FilterOperator.IsNotEmpty, 'is not empty', false),\n];\n\nconst FOREIGN_KEY_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.Equals, 'equals'),\n op(FilterOperator.NotEquals, 'not equals'),\n op(FilterOperator.IsEmpty, 'is empty', false),\n op(FilterOperator.IsNotEmpty, 'is not empty', false),\n];\n\nconst DATETIME_OPERATORS: OperatorInfo[] = [\n op(FilterOperator.Equals, 'is'),\n op(FilterOperator.NotEquals, 'is not'),\n op(FilterOperator.Lt, 'before'),\n op(FilterOperator.Gt, 'after'),\n op(FilterOperator.Lte, 'on or before'),\n op(FilterOperator.Gte, 'on or after'),\n];\n\nexport const OPERATORS_BY_TYPE: Readonly<\n Record<FilterFieldType, readonly OperatorInfo[]>\n> = {\n [FilterFieldType.String]: STRING_OPERATORS,\n [FilterFieldType.Number]: NUMBER_OPERATORS,\n [FilterFieldType.Boolean]: BOOLEAN_OPERATORS,\n [FilterFieldType.ForeignKey]: FOREIGN_KEY_OPERATORS,\n [FilterFieldType.File]: STRING_OPERATORS,\n [FilterFieldType.DateTime]: DATETIME_OPERATORS,\n};\n\nexport function getOperatorLabel(\n operator: FilterOperator,\n fieldType: FilterFieldType,\n): string {\n const ops = OPERATORS_BY_TYPE[fieldType];\n const found = ops.find((o) => o.operator === operator);\n if (found) {\n return found.label;\n }\n return operator;\n}\n\nexport function getDefaultOperator(fieldType: FilterFieldType): FilterOperator {\n const operators = OPERATORS_BY_TYPE[fieldType];\n const first = operators[0];\n if (!first) {\n throw new Error(`No operators defined for field type: ${fieldType}`);\n }\n return first.operator;\n}\n\nexport function getOperatorsForType(\n fieldType: FilterFieldType,\n): OperatorInfo[] {\n return [...OPERATORS_BY_TYPE[fieldType]];\n}\n","export enum SearchLanguage {\n Arabic = 'arabic',\n Armenian = 'armenian',\n Basque = 'basque',\n Catalan = 'catalan',\n Danish = 'danish',\n Dutch = 'dutch',\n English = 'english',\n Finnish = 'finnish',\n French = 'french',\n German = 'german',\n Greek = 'greek',\n Hindi = 'hindi',\n Hungarian = 'hungarian',\n Indonesian = 'indonesian',\n Irish = 'irish',\n Italian = 'italian',\n Lithuanian = 'lithuanian',\n Nepali = 'nepali',\n Norwegian = 'norwegian',\n Portuguese = 'portuguese',\n Romanian = 'romanian',\n Russian = 'russian',\n Serbian = 'serbian',\n Simple = 'simple',\n Spanish = 'spanish',\n Swedish = 'swedish',\n Tamil = 'tamil',\n Turkish = 'turkish',\n Yiddish = 'yiddish',\n}\n\nexport enum SearchType {\n Plain = 'plain',\n Phrase = 'phrase',\n Prefix = 'prefix',\n Tsquery = 'tsquery',\n}\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nexport const SEARCH_LANGUAGES: readonly {\n value: SearchLanguage;\n label: string;\n}[] = Object.values(SearchLanguage).map((value) => ({\n value,\n label:\n value === SearchLanguage.Simple\n ? 'Simple (no stemming)'\n : capitalize(value),\n}));\n\nexport const SEARCH_TYPES: readonly { value: SearchType; label: string }[] = [\n { value: SearchType.Plain, label: 'Words (any order)' },\n { value: SearchType.Phrase, label: 'Exact phrase' },\n { value: SearchType.Prefix, label: 'Partial words' },\n { value: SearchType.Tsquery, label: 'Raw tsquery' },\n];\n","import type { FilterFieldType } from '../../../shared/field-types.js';\nimport type { FilterOperator } from '../utils/operators.js';\nimport type { SearchLanguage, SearchType } from '../utils/searchTypes.js';\nimport type { ConditionNode } from '../filterSchema.js';\n\nexport class FilterConditionVM {\n constructor(private readonly _node: ConditionNode) {}\n\n get id(): string {\n return this._node.child('id').value;\n }\n\n get field(): string {\n return this._node.child('field').value;\n }\n\n get fieldType(): FilterFieldType {\n return this._node.child('fieldType').value as FilterFieldType;\n }\n\n get operator(): FilterOperator {\n return this._node.child('operator').value as FilterOperator;\n }\n\n get value(): string {\n return this._node.child('value').value;\n }\n\n get searchLanguage(): SearchLanguage {\n return this._node.child('searchLanguage').value as SearchLanguage;\n }\n\n get searchType(): SearchType {\n return this._node.child('searchType').value as SearchType;\n }\n}\n","import type { FilterRootNode, NestedGroupNode } from '../filterSchema.js';\nimport { FilterConditionVM } from './FilterConditionVM.js';\n\nexport class FilterGroupVM {\n private readonly _isRoot: boolean;\n\n constructor(\n private readonly _node: FilterRootNode | NestedGroupNode,\n isRoot = false,\n ) {\n this._isRoot = isRoot;\n }\n\n get id(): string {\n return this._node.child('id').value;\n }\n\n get logic(): 'and' | 'or' {\n return this._node.child('logic').value as 'and' | 'or';\n }\n\n get conditions(): FilterConditionVM[] {\n const conditionsNode = this._node.child('conditions');\n const result: FilterConditionVM[] = [];\n for (let i = 0; i < conditionsNode.length; i++) {\n const item = conditionsNode.at(i);\n if (item) {\n result.push(new FilterConditionVM(item));\n }\n }\n return result;\n }\n\n get groups(): FilterGroupVM[] {\n if (!this._isRoot) {\n return [];\n }\n const rootNode = this._node as FilterRootNode;\n const groupsNode = rootNode.child('groups');\n const result: FilterGroupVM[] = [];\n for (let i = 0; i < groupsNode.length; i++) {\n const item = groupsNode.at(i);\n if (item) {\n result.push(new FilterGroupVM(item));\n }\n }\n return result;\n }\n}\n","import { obj, arr, str, num } from '@revisium/schema-toolkit';\nimport type { InferNode, InferValue } from '@revisium/schema-toolkit';\n\nexport const CONDITION_SCHEMA = obj({\n id: str(),\n field: str(),\n fieldType: str(),\n operator: str(),\n value: str(),\n searchLanguage: str(),\n searchType: str(),\n});\n\nexport const NESTED_GROUP_SCHEMA = obj({\n id: str(),\n logic: str(),\n conditions: arr(CONDITION_SCHEMA),\n});\n\nexport const FILTER_SCHEMA = obj({\n id: str(),\n logic: str(),\n conditions: arr(CONDITION_SCHEMA),\n groups: arr(NESTED_GROUP_SCHEMA),\n nextConditionId: num(),\n nextGroupId: num(),\n});\n\nexport type ConditionNode = InferNode<typeof CONDITION_SCHEMA>;\nexport type NestedGroupNode = InferNode<typeof NESTED_GROUP_SCHEMA>;\nexport type FilterRootNode = InferNode<typeof FILTER_SCHEMA>;\nexport type FilterData = InferValue<typeof FILTER_SCHEMA>;\n","import type { createRowModel } from '@revisium/schema-toolkit';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { FILTER_SCHEMA } from '../filterSchema.js';\nimport { FilterConditionVM } from '../vm/FilterConditionVM.js';\nimport { FilterOperator, getDefaultOperator } from '../utils/operators.js';\nimport { SearchLanguage, SearchType } from '../utils/searchTypes.js';\n\ntype FilterRowModel = ReturnType<typeof createRowModel<typeof FILTER_SCHEMA>>;\n\nexport class FilterTreeOps {\n constructor(\n private readonly _row: FilterRowModel,\n private readonly _getAvailableFields: () => ColumnSpec[],\n ) {}\n\n addCondition(groupId?: string): void {\n const firstField = this._getAvailableFields()[0];\n if (!firstField) {\n return;\n }\n\n if (groupId) {\n const groupsNode = this._row.root.child('groups');\n const groupIndex = groupsNode.findIndex(\n (g) => g.child('id').value === groupId,\n );\n if (groupIndex < 0) {\n return;\n }\n const groupNode = groupsNode.at(groupIndex);\n if (!groupNode) {\n return;\n }\n groupNode\n .child('conditions')\n .pushValue(this._newConditionData(firstField));\n } else {\n this._row.root\n .child('conditions')\n .pushValue(this._newConditionData(firstField));\n }\n }\n\n addConditionForField(field: string): void {\n const col = this._getAvailableFields().find((c) => c.field === field);\n if (!col) {\n return;\n }\n\n const conditionData = this._newConditionData(col);\n this._row.root.child('conditions').pushValue(conditionData);\n }\n\n updateCondition(\n id: string,\n updates: Partial<\n Pick<\n FilterConditionVM,\n 'field' | 'operator' | 'value' | 'searchLanguage' | 'searchType'\n >\n >,\n ): void {\n const condNode = this._findConditionNode(id);\n if (!condNode) {\n return;\n }\n\n if (\n updates.field !== undefined &&\n updates.field !== condNode.child('field').value\n ) {\n this._applyFieldUpdate(condNode, updates.field);\n } else if (\n updates.operator !== undefined &&\n updates.operator !== condNode.child('operator').value\n ) {\n this._applyOperatorUpdate(condNode, updates.operator);\n } else if (updates.value !== undefined) {\n condNode.child('value').setValue(updates.value);\n } else if (updates.searchLanguage !== undefined) {\n condNode.child('searchLanguage').setValue(updates.searchLanguage);\n } else if (updates.searchType !== undefined) {\n condNode.child('searchType').setValue(updates.searchType);\n }\n }\n\n removeCondition(id: string): void {\n const result = this._findConditionLocation(id);\n if (result) {\n result.conditionsNode.removeAt(result.index);\n }\n }\n\n addGroup(): void {\n const groupData = {\n id: this._generateGroupId(),\n logic: 'and',\n conditions: [],\n };\n this._row.root.child('groups').pushValue(groupData);\n }\n\n removeGroup(id: string): void {\n const groupsNode = this._row.root.child('groups');\n const idx = groupsNode.findIndex((g) => g.child('id').value === id);\n if (idx >= 0) {\n groupsNode.removeAt(idx);\n }\n }\n\n setGroupLogic(id: string, logic: 'and' | 'or'): void {\n if (this._row.root.child('id').value === id) {\n this._row.root.child('logic').setValue(logic);\n return;\n }\n const groupsNode = this._row.root.child('groups');\n const idx = groupsNode.findIndex((g) => g.child('id').value === id);\n if (idx >= 0) {\n groupsNode.at(idx)?.child('logic').setValue(logic);\n }\n }\n\n countConditions(): number {\n let count = this._row.root.child('conditions').length;\n const groups = this._row.root.child('groups');\n for (let i = 0; i < groups.length; i++) {\n const group = groups.at(i);\n if (group) {\n count += group.child('conditions').length;\n }\n }\n return count;\n }\n\n isEmpty(): boolean {\n const conditionsNode = this._row.root.child('conditions');\n const groupsNode = this._row.root.child('groups');\n return conditionsNode.length === 0 && groupsNode.length === 0;\n }\n\n hasConditionForField(field: string): boolean {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n if (rootConditions.at(i)?.child('field').value === field) {\n return true;\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n if (groupConditions.at(ci)?.child('field').value === field) {\n return true;\n }\n }\n }\n }\n return false;\n }\n\n removeEmptyGroups(): void {\n const groupsNode = this._row.root.child('groups');\n for (let i = groupsNode.length - 1; i >= 0; i--) {\n const group = groupsNode.at(i);\n if (group?.child('conditions').length === 0) {\n groupsNode.removeAt(i);\n }\n }\n }\n\n private _applyFieldUpdate(\n condNode: NonNullable<ReturnType<FilterTreeOps['_findConditionNode']>>,\n field: string,\n ): void {\n const col = this._getAvailableFields().find((c) => c.field === field);\n if (!col) {\n return;\n }\n const oldFieldType = condNode.child('fieldType').value;\n condNode.child('field').setValue(col.field);\n condNode.child('fieldType').setValue(col.fieldType);\n if (col.fieldType !== oldFieldType) {\n condNode.child('operator').setValue(getDefaultOperator(col.fieldType));\n condNode.child('value').setValue('');\n condNode.child('searchLanguage').setValue('');\n condNode.child('searchType').setValue('');\n }\n }\n\n private _applyOperatorUpdate(\n condNode: NonNullable<ReturnType<FilterTreeOps['_findConditionNode']>>,\n operator: FilterOperator,\n ): void {\n condNode.child('operator').setValue(operator);\n condNode.child('value').setValue('');\n if (operator === FilterOperator.Search) {\n condNode.child('searchLanguage').setValue(SearchLanguage.Simple);\n condNode.child('searchType').setValue(SearchType.Plain);\n } else {\n condNode.child('searchLanguage').setValue('');\n condNode.child('searchType').setValue('');\n }\n }\n\n private _newConditionData(col: ColumnSpec) {\n return {\n id: this._generateConditionId(),\n field: col.field,\n fieldType: col.fieldType,\n operator: getDefaultOperator(col.fieldType),\n value: '',\n searchLanguage: '',\n searchType: '',\n };\n }\n\n private _generateConditionId(): string {\n const node = this._row.root.child('nextConditionId');\n const current = node.value;\n node.setValue(current + 1);\n return `c-${current}`;\n }\n\n private _generateGroupId(): string {\n const node = this._row.root.child('nextGroupId');\n const current = node.value;\n node.setValue(current + 1);\n return `g-${current}`;\n }\n\n _findConditionNode(id: string) {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n const item = rootConditions.at(i);\n if (item?.child('id').value === id) {\n return item;\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n const item = groupConditions.at(ci);\n if (item?.child('id').value === id) {\n return item;\n }\n }\n }\n }\n return null;\n }\n\n private _findConditionLocation(id: string) {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n const item = rootConditions.at(i);\n if (item?.child('id').value === id) {\n return { conditionsNode: rootConditions, index: i };\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n const item = groupConditions.at(ci);\n if (item?.child('id').value === id) {\n return { conditionsNode: groupConditions, index: ci };\n }\n }\n }\n }\n return null;\n }\n}\n","import type { FilterCondition, FilterGroup } from '../types.js';\n\nexport function findConditionInGroup(\n group: FilterGroup,\n id: string,\n): { condition: FilterCondition; parent: FilterGroup } | null {\n for (const condition of group.conditions) {\n if (condition.id === id) {\n return { condition, parent: group };\n }\n }\n for (const subGroup of group.groups) {\n const found = findConditionInGroup(subGroup, id);\n if (found) {\n return found;\n }\n }\n return null;\n}\n\nexport function findGroupInTree(\n group: FilterGroup,\n id: string,\n): FilterGroup | null {\n if (group.id === id) {\n return group;\n }\n for (const subGroup of group.groups) {\n const found = findGroupInTree(subGroup, id);\n if (found) {\n return found;\n }\n }\n return null;\n}\n\nexport function removeGroupFromTree(parent: FilterGroup, id: string): boolean {\n const index = parent.groups.findIndex((g) => g.id === id);\n if (index !== -1) {\n parent.groups.splice(index, 1);\n return true;\n }\n for (const subGroup of parent.groups) {\n if (removeGroupFromTree(subGroup, id)) {\n return true;\n }\n }\n return false;\n}\n\nexport function countConditions(group: FilterGroup): number {\n let count = group.conditions.length;\n for (const subGroup of group.groups) {\n count += countConditions(subGroup);\n }\n return count;\n}\n\nexport function syncNextIds(group: FilterGroup): {\n nextConditionId: number;\n nextGroupId: number;\n} {\n const extractNum = (id: string, prefix: string): number => {\n if (id.startsWith(prefix)) {\n const num = Number(id.slice(prefix.length));\n if (!Number.isNaN(num)) {\n return num;\n }\n }\n return 0;\n };\n\n let maxCondition = 0;\n let maxGroup = 0;\n\n const walk = (g: FilterGroup): void => {\n maxGroup = Math.max(maxGroup, extractNum(g.id, 'g-'));\n for (const c of g.conditions) {\n maxCondition = Math.max(maxCondition, extractNum(c.id, 'c-'));\n }\n for (const sub of g.groups) {\n walk(sub);\n }\n };\n\n walk(group);\n return { nextConditionId: maxCondition + 1, nextGroupId: maxGroup + 1 };\n}\n","import { stripDataFieldPrefix } from '../../../TableEditor/model/SchemaContext.js';\nimport { FilterFieldType } from '../../../shared/field-types.js';\nimport { SYSTEM_FIELD_IDS } from '../../../shared/system-field-ids.js';\nimport { operatorRequiresValue, FilterOperator } from './operators.js';\nimport type { FilterCondition, FilterGroup } from '../types.js';\n\nfunction parseValue(\n value: string,\n fieldType: FilterFieldType,\n): string | number {\n if (fieldType === FilterFieldType.Number) {\n const num = Number(value);\n if (!Number.isNaN(num)) {\n return num;\n }\n }\n return value;\n}\n\nfunction buildOperatorClause(\n operator: FilterOperator,\n value: string,\n fieldType: FilterFieldType,\n isSystemField: boolean,\n): Record<string, unknown> {\n const parsed = parseValue(value, fieldType);\n\n switch (operator) {\n case FilterOperator.Equals:\n return { equals: parsed };\n case FilterOperator.NotEquals:\n return { not: { equals: parsed } };\n case FilterOperator.Contains:\n return isSystemField ? { contains: value } : { string_contains: value };\n case FilterOperator.NotContains:\n return isSystemField\n ? { not: { contains: value } }\n : { not: { string_contains: value } };\n case FilterOperator.StartsWith:\n return isSystemField\n ? { startsWith: value }\n : { string_starts_with: value };\n case FilterOperator.EndsWith:\n return isSystemField ? { endsWith: value } : { string_ends_with: value };\n case FilterOperator.Gt:\n return { gt: parsed };\n case FilterOperator.Gte:\n return { gte: parsed };\n case FilterOperator.Lt:\n return { lt: parsed };\n case FilterOperator.Lte:\n return { lte: parsed };\n case FilterOperator.IsEmpty:\n return { equals: null };\n case FilterOperator.IsNotEmpty:\n return { not: { equals: null } };\n case FilterOperator.IsTrue:\n return { equals: true };\n case FilterOperator.IsFalse:\n return { equals: false };\n case FilterOperator.Search:\n return { search: value };\n }\n}\n\nfunction buildConditionClause(\n condition: FilterCondition,\n): Record<string, unknown> | null {\n if (operatorRequiresValue(condition.operator) && condition.value === '') {\n return null;\n }\n\n if (condition.operator === FilterOperator.Search) {\n if (SYSTEM_FIELD_IDS.has(condition.field)) {\n return {\n [condition.field]: {\n search: condition.value,\n searchLanguage: condition.searchLanguage || 'simple',\n searchType: condition.searchType || 'plain',\n },\n };\n }\n const path = stripDataFieldPrefix(condition.field);\n return {\n data: {\n path,\n search: condition.value,\n searchLanguage: condition.searchLanguage || 'simple',\n searchType: condition.searchType || 'plain',\n },\n };\n }\n\n const isSystemField = SYSTEM_FIELD_IDS.has(condition.field);\n\n const opClause = buildOperatorClause(\n condition.operator,\n condition.value,\n condition.fieldType,\n isSystemField,\n );\n\n if (isSystemField) {\n return { [condition.field]: opClause };\n }\n\n const path = stripDataFieldPrefix(condition.field);\n return {\n data: {\n path,\n ...opClause,\n },\n };\n}\n\nexport function buildWhereClause(\n group: FilterGroup,\n): Record<string, unknown> | null {\n const clauses: Record<string, unknown>[] = [];\n\n for (const condition of group.conditions) {\n const clause = buildConditionClause(condition);\n if (clause) {\n clauses.push(clause);\n }\n }\n\n for (const subGroup of group.groups) {\n const subClause = buildWhereClause(subGroup);\n if (subClause) {\n clauses.push(subClause);\n }\n }\n\n if (clauses.length === 0) {\n return null;\n }\n\n if (clauses.length === 1) {\n const first = clauses[0];\n if (first) {\n return first;\n }\n return null;\n }\n\n const key = group.logic === 'or' ? 'OR' : 'AND';\n return { [key]: clauses };\n}\n","import type { createRowModel } from '@revisium/schema-toolkit';\nimport type { FILTER_SCHEMA, FilterData } from '../filterSchema.js';\nimport { syncNextIds } from '../utils/filterTreeUtils.js';\nimport { buildWhereClause } from '../utils/filterBuilder.js';\nimport type { FilterGroup } from '../types.js';\n\ntype FilterRowModel = ReturnType<typeof createRowModel<typeof FILTER_SCHEMA>>;\n\nexport class FilterSerializer {\n constructor(private readonly _row: FilterRowModel) {}\n\n serializeRootGroup(): FilterGroup {\n const plain = this._row.root.getPlainValue() as FilterData;\n return {\n id: plain.id,\n logic: plain.logic as 'and' | 'or',\n conditions: plain.conditions.map((c) => ({\n id: c.id,\n field: c.field,\n fieldType: c.fieldType as FilterGroup['conditions'][0]['fieldType'],\n operator: c.operator as FilterGroup['conditions'][0]['operator'],\n value: c.value,\n searchLanguage: c.searchLanguage || undefined,\n searchType: c.searchType || undefined,\n })),\n groups: plain.groups.map((g) => ({\n id: g.id,\n logic: g.logic as 'and' | 'or',\n conditions: g.conditions.map((c) => ({\n id: c.id,\n field: c.field,\n fieldType: c.fieldType as FilterGroup['conditions'][0]['fieldType'],\n operator: c.operator as FilterGroup['conditions'][0]['operator'],\n value: c.value,\n searchLanguage: c.searchLanguage || undefined,\n searchType: c.searchType || undefined,\n })),\n groups: [],\n })),\n };\n }\n\n buildCurrentWhereClause(): Record<string, unknown> | null {\n return buildWhereClause(this.serializeRootGroup());\n }\n\n applySnapshot(serialized: string): boolean {\n const parsed = JSON.parse(serialized) as FilterGroup;\n const ids = syncNextIds(parsed);\n const data = this._groupToData(\n parsed,\n ids.nextConditionId,\n ids.nextGroupId,\n );\n this._row.reset(data);\n return parsed.conditions.length > 0 || parsed.groups.length > 0;\n }\n\n private _conditionToData(c: {\n id: string;\n field: string;\n fieldType: string;\n operator: string;\n value: string;\n searchLanguage?: string;\n searchType?: string;\n }) {\n return {\n id: c.id,\n field: c.field,\n fieldType: c.fieldType,\n operator: c.operator,\n value: c.value,\n searchLanguage: c.searchLanguage ?? '',\n searchType: c.searchType ?? '',\n };\n }\n\n private _groupToData(\n group: FilterGroup,\n nextConditionId: number,\n nextGroupId: number,\n ): FilterData {\n return {\n id: group.id,\n logic: group.logic,\n conditions: group.conditions.map((c) => this._conditionToData(c)),\n groups: group.groups.map((g) => ({\n id: g.id,\n logic: g.logic,\n conditions: g.conditions.map((c) => this._conditionToData(c)),\n })),\n nextConditionId,\n nextGroupId,\n };\n }\n}\n","import { FilterFieldType } from '../../../shared/field-types.js';\nimport { operatorRequiresValue } from './operators.js';\nimport type { FilterCondition, FilterGroup } from '../types.js';\n\nexport function isConditionValueValid(condition: FilterCondition): boolean {\n if (!operatorRequiresValue(condition.operator)) {\n return true;\n }\n if (condition.value === '') {\n return false;\n }\n if (condition.fieldType === FilterFieldType.Number) {\n return !Number.isNaN(Number(condition.value));\n }\n if (condition.fieldType === FilterFieldType.DateTime) {\n return !Number.isNaN(new Date(condition.value).getTime());\n }\n return true;\n}\n\nexport function validateGroup(group: FilterGroup): boolean {\n for (const condition of group.conditions) {\n if (!isConditionValueValid(condition)) {\n return false;\n }\n }\n for (const subGroup of group.groups) {\n if (!validateGroup(subGroup)) {\n return false;\n }\n }\n return true;\n}\n\nexport function getConditionErrorMessage(\n condition: FilterCondition,\n): string | null {\n if (!operatorRequiresValue(condition.operator)) {\n return null;\n }\n\n if (condition.value === '') {\n return 'Value is required';\n }\n\n if (condition.fieldType === FilterFieldType.Number) {\n if (Number.isNaN(Number(condition.value))) {\n return 'Value must be a number';\n }\n }\n\n if (condition.fieldType === FilterFieldType.DateTime) {\n if (Number.isNaN(new Date(condition.value).getTime())) {\n return 'Value must be a valid date';\n }\n }\n\n return null;\n}\n","import type { createRowModel } from '@revisium/schema-toolkit';\nimport type { FILTER_SCHEMA } from '../filterSchema.js';\nimport { FilterConditionVM } from '../vm/FilterConditionVM.js';\nimport {\n isConditionValueValid,\n getConditionErrorMessage,\n} from '../utils/filterValidation.js';\n\ntype FilterRowModel = ReturnType<typeof createRowModel<typeof FILTER_SCHEMA>>;\n\nexport class FilterValidator {\n constructor(private readonly _row: FilterRowModel) {}\n\n get allValid(): boolean {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n const item = rootConditions.at(i);\n if (item && !isConditionValueValid(new FilterConditionVM(item))) {\n return false;\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n const item = groupConditions.at(ci);\n if (item && !isConditionValueValid(new FilterConditionVM(item))) {\n return false;\n }\n }\n }\n }\n return true;\n }\n\n isConditionValid(id: string): boolean {\n const condNode = this._findConditionNode(id);\n if (!condNode) {\n return false;\n }\n return isConditionValueValid(new FilterConditionVM(condNode));\n }\n\n getConditionError(id: string): string | null {\n const condNode = this._findConditionNode(id);\n if (!condNode) {\n return null;\n }\n return getConditionErrorMessage(new FilterConditionVM(condNode));\n }\n\n private _findConditionNode(id: string) {\n const rootConditions = this._row.root.child('conditions');\n for (let i = 0; i < rootConditions.length; i++) {\n const item = rootConditions.at(i);\n if (item?.child('id').value === id) {\n return item;\n }\n }\n const groups = this._row.root.child('groups');\n for (let gi = 0; gi < groups.length; gi++) {\n const groupConditions = groups.at(gi)?.child('conditions');\n if (groupConditions) {\n for (let ci = 0; ci < groupConditions.length; ci++) {\n const item = groupConditions.at(ci);\n if (item?.child('id').value === id) {\n return item;\n }\n }\n }\n }\n return null;\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport { createRowModel } from '@revisium/schema-toolkit';\nimport { ensureReactivityProvider } from '../../../../lib/initReactivity.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { FilterConditionVM } from '../vm/FilterConditionVM.js';\nimport { FilterGroupVM } from '../vm/FilterGroupVM.js';\nimport { FILTER_SCHEMA, type FilterData } from '../filterSchema.js';\nimport type { FilterGroup } from '../types.js';\nimport { FilterTreeOps } from './FilterTreeOps.js';\nimport { FilterSerializer } from './FilterSerializer.js';\nimport { FilterValidator } from './FilterValidator.js';\n\ntype FilterRowModel = ReturnType<typeof createRowModel<typeof FILTER_SCHEMA>>;\n\nexport class FilterCore {\n private readonly _row: FilterRowModel;\n private readonly _treeOps: FilterTreeOps;\n private readonly _serializer: FilterSerializer;\n private readonly _validator: FilterValidator;\n\n private _availableFields: ColumnSpec[] = [];\n private _onChange: (() => void) | null = null;\n private _onApply: ((where: Record<string, unknown> | null) => void) | null =\n null;\n private _isOpen = false;\n private _committedHasFilters = false;\n\n constructor() {\n ensureReactivityProvider();\n\n const emptyData = FilterCore._emptyFilterData();\n this._row = createRowModel<typeof FILTER_SCHEMA>({\n rowId: 'filter',\n schema: FILTER_SCHEMA,\n data: emptyData,\n });\n\n this._treeOps = new FilterTreeOps(this._row, () => this._availableFields);\n this._serializer = new FilterSerializer(this._row);\n this._validator = new FilterValidator(this._row);\n\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n private static _emptyFilterData(): FilterData {\n return {\n id: 'g-1',\n logic: 'and',\n conditions: [],\n groups: [],\n nextConditionId: 1,\n nextGroupId: 2,\n };\n }\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n setOpen(value: boolean): void {\n this._isOpen = value;\n }\n\n get rootGroup(): FilterGroupVM {\n return new FilterGroupVM(this._row.root, true);\n }\n\n get hasPendingChanges(): boolean {\n return this._row.isDirty;\n }\n\n get totalConditionCount(): number {\n return this._treeOps.countConditions();\n }\n\n get hasActiveFilters(): boolean {\n return this._committedHasFilters;\n }\n\n get allFiltersValid(): boolean {\n return this._validator.allValid;\n }\n\n get isEmpty(): boolean {\n return this._treeOps.isEmpty();\n }\n\n hasFilterForField(field: string): boolean {\n if (!this._committedHasFilters) {\n return false;\n }\n return this._treeOps.hasConditionForField(field);\n }\n\n get showBadge(): boolean {\n return this.totalConditionCount > 0 || this.hasActiveFilters;\n }\n\n buildCurrentWhereClause(): Record<string, unknown> | null {\n return this._serializer.buildCurrentWhereClause();\n }\n\n init(availableFields: ColumnSpec[]): void {\n this._availableFields = availableFields;\n this._row.reset(FilterCore._emptyFilterData());\n this._committedHasFilters = false;\n }\n\n addCondition(groupId?: string): void {\n this._treeOps.addCondition(groupId);\n this._notifyChange();\n }\n\n addConditionForField(field: string): void {\n this._treeOps.addConditionForField(field);\n this._notifyChange();\n }\n\n updateCondition(\n id: string,\n updates: Partial<\n Pick<\n FilterConditionVM,\n 'field' | 'operator' | 'value' | 'searchLanguage' | 'searchType'\n >\n >,\n ): void {\n this._treeOps.updateCondition(id, updates);\n this._notifyChange();\n }\n\n removeCondition(id: string): void {\n this._treeOps.removeCondition(id);\n this._notifyChange();\n }\n\n addGroup(): void {\n this._treeOps.addGroup();\n this._notifyChange();\n }\n\n removeGroup(id: string): void {\n this._treeOps.removeGroup(id);\n this._notifyChange();\n }\n\n setGroupLogic(id: string, logic: 'and' | 'or'): void {\n this._treeOps.setGroupLogic(id, logic);\n this._notifyChange();\n }\n\n apply(): void {\n this._treeOps.removeEmptyGroups();\n this._row.commit();\n this._committedHasFilters = !this.isEmpty;\n this._fireOnApply();\n this._notifyChange();\n }\n\n applyAndClose(): void {\n this.apply();\n this.setOpen(false);\n }\n\n reset(): void {\n this._row.revert();\n this._notifyChange();\n }\n\n applySnapshot(serialized: string): void {\n let parsed: FilterGroup;\n try {\n parsed = JSON.parse(serialized) as FilterGroup;\n } catch {\n return;\n }\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n !Array.isArray(parsed.conditions) ||\n !Array.isArray(parsed.groups)\n ) {\n return;\n }\n const validFields = new Set(this._availableFields.map((f) => f.field));\n const cleaned = FilterCore._stripInvalidConditions(parsed, validFields);\n const hasFilters = this._serializer.applySnapshot(JSON.stringify(cleaned));\n this._committedHasFilters = hasFilters;\n this._notifyChange();\n }\n\n private static _stripInvalidConditions(\n group: FilterGroup,\n validFields: Set<string>,\n ): FilterGroup {\n return {\n ...group,\n conditions: group.conditions.filter((c) => validFields.has(c.field)),\n groups: group.groups\n .map((g) => FilterCore._stripInvalidConditions(g, validFields))\n .filter((g) => g.conditions.length > 0 || g.groups.length > 0),\n };\n }\n\n clearAll(): void {\n this._row.reset(FilterCore._emptyFilterData());\n this._committedHasFilters = false;\n this._fireOnApply();\n this._notifyChange();\n }\n\n clearAllAndClose(): void {\n this.clearAll();\n this.setOpen(false);\n }\n\n isConditionValid(id: string): boolean {\n return this._validator.isConditionValid(id);\n }\n\n getConditionError(id: string): string | null {\n return this._validator.getConditionError(id);\n }\n\n serializeRootGroup(): FilterGroup {\n return this._serializer.serializeRootGroup();\n }\n\n setOnChange(cb: (() => void) | null): void {\n this._onChange = cb;\n }\n\n setOnApply(\n cb: ((where: Record<string, unknown> | null) => void) | null,\n ): void {\n this._onApply = cb;\n }\n\n dispose(): void {\n this._onChange = null;\n this._onApply = null;\n this._row.dispose();\n }\n\n private _fireOnApply(): void {\n if (this._onApply) {\n const where = this._serializer.buildCurrentWhereClause();\n this._onApply(where);\n }\n }\n\n private _notifyChange(): void {\n if (this._onChange) {\n this._onChange();\n }\n }\n}\n","import type { ReactNode } from 'react';\nimport { PiCalendar, PiFile } from 'react-icons/pi';\nimport { FilterFieldType } from '../../../shared/field-types.js';\n\nexport const getFieldTypeIcon = (fieldType: FilterFieldType): ReactNode => {\n switch (fieldType) {\n case FilterFieldType.String:\n return 'Aa';\n case FilterFieldType.Number:\n return '#';\n case FilterFieldType.Boolean:\n return '?';\n case FilterFieldType.ForeignKey:\n return '->';\n case FilterFieldType.File:\n return <PiFile size={14} />;\n case FilterFieldType.DateTime:\n return <PiCalendar size={14} />;\n default: {\n const _exhaustiveCheck: never = fieldType;\n return _exhaustiveCheck;\n }\n }\n};\n","import { Box, Menu, Text } from '@chakra-ui/react';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { getFieldTypeIcon } from '../../../Table/ui/Header/getFieldTypeIcon.js';\n\ninterface FieldMenuItemsProps {\n items: ColumnSpec[];\n selectedField: string;\n onChange: (field: string) => void;\n}\n\nexport const FieldMenuItems = ({\n items,\n selectedField,\n onChange,\n}: FieldMenuItemsProps) => (\n <>\n {items.map((f) => (\n <Menu.Item\n key={f.field}\n value={f.field}\n onClick={() => onChange(f.field)}\n bg={f.field === selectedField ? 'gray.100' : undefined}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2} width=\"100%\">\n <Box\n fontSize=\"sm\"\n fontFamily=\"mono\"\n color=\"gray.400\"\n width=\"24px\"\n textAlign=\"center\"\n >\n {getFieldTypeIcon(f.fieldType)}\n </Box>\n <Text truncate>{f.label || '(unnamed)'}</Text>\n </Box>\n </Menu.Item>\n ))}\n </>\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { FilterFieldType } from '../../../shared/field-types.js';\nimport { getFieldTypeIcon } from '../../../Table/ui/Header/getFieldTypeIcon.js';\nimport { FieldMenuItems } from './FieldMenuItems.js';\n\ninterface FieldSelectProps {\n value: string;\n fieldType: FilterFieldType;\n fields: ColumnSpec[];\n onChange: (field: string) => void;\n}\n\nexport const FieldSelect = observer(\n ({ value, fieldType, fields, onChange }: FieldSelectProps) => {\n const currentLabel = fields.find((f) => f.field === value)?.label || value;\n const dataFields = fields.filter((f) => !f.isSystem);\n const systemFields = fields.filter((f) => f.isSystem);\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={4}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"100px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"field-select\"\n >\n <Box fontSize=\"sm\" fontFamily=\"mono\" color=\"gray.400\" minW=\"16px\">\n {getFieldTypeIcon(fieldType)}\n </Box>\n <Text fontSize=\"md\" fontWeight=\"medium\" truncate maxW=\"120px\">\n {currentLabel}\n </Text>\n <Box ml=\"auto\" color=\"gray.400\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content maxH=\"300px\" overflow=\"auto\" minW=\"180px\">\n {dataFields.length > 0 && (\n <Menu.ItemGroup>\n <Menu.ItemGroupLabel\n fontWeight=\"medium\"\n color=\"gray.500\"\n fontSize=\"xs\"\n >\n Data fields\n </Menu.ItemGroupLabel>\n <FieldMenuItems\n items={dataFields}\n selectedField={value}\n onChange={onChange}\n />\n </Menu.ItemGroup>\n )}\n {systemFields.length > 0 && (\n <>\n {dataFields.length > 0 && <Menu.Separator />}\n <Menu.ItemGroup>\n <Menu.ItemGroupLabel\n fontWeight=\"medium\"\n color=\"gray.500\"\n fontSize=\"xs\"\n >\n System fields\n </Menu.ItemGroupLabel>\n <FieldMenuItems\n items={systemFields}\n selectedField={value}\n onChange={onChange}\n />\n </Menu.ItemGroup>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport type { FilterOperator } from '../../model/operators.js';\nimport {\n getOperatorLabel,\n getOperatorsForType,\n} from '../../model/operators.js';\nimport type { FilterFieldType } from '../../../shared/field-types.js';\n\ninterface OperatorSelectProps {\n value: FilterOperator;\n fieldType: FilterFieldType;\n onChange: (operator: FilterOperator) => void;\n}\n\nexport const OperatorSelect = observer(\n ({ value, fieldType, onChange }: OperatorSelectProps) => {\n const operators = getOperatorsForType(fieldType);\n const currentLabel = getOperatorLabel(value, fieldType);\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={4}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"80px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"operator-select\"\n >\n <Text fontSize=\"md\" fontWeight=\"medium\" truncate>\n {currentLabel}\n </Text>\n <Box color=\"gray.400\" ml=\"auto\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content minW=\"120px\">\n {operators.map((op) => (\n <Menu.Item\n key={op.operator}\n value={op.operator}\n onClick={() => onChange(op.operator)}\n bg={op.operator === value ? 'gray.100' : undefined}\n >\n {op.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Input } from '@chakra-ui/react';\nimport { FilterFieldType } from '../../../shared/field-types.js';\n\ninterface FilterValueInputProps {\n value: string;\n fieldType: FilterFieldType;\n onChange: (value: string) => void;\n error?: string | null;\n}\n\nfunction toDateTimeLocalValue(isoString: string): string {\n if (!isoString) {\n return '';\n }\n const date = new Date(isoString);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n return `${year}-${month}-${day}T${hours}:${minutes}`;\n}\n\nfunction fromDateTimeLocalValue(localValue: string): string {\n if (!localValue) {\n return '';\n }\n const date = new Date(localValue);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n return date.toISOString();\n}\n\nexport const FilterValueInput = observer(\n ({ value, fieldType, onChange, error }: FilterValueInputProps) => {\n if (fieldType === FilterFieldType.DateTime) {\n return (\n <Input\n type=\"datetime-local\"\n value={toDateTimeLocalValue(value)}\n onChange={(e) => onChange(fromDateTimeLocalValue(e.target.value))}\n size=\"sm\"\n w=\"160px\"\n h=\"40px\"\n borderRadius=\"lg\"\n borderColor={error ? 'red.500' : 'gray.200'}\n data-testid=\"filter-value-input\"\n />\n );\n }\n\n return (\n <Input\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder=\"value\"\n size=\"sm\"\n w=\"160px\"\n h=\"40px\"\n borderRadius=\"lg\"\n borderColor={error ? 'red.500' : 'gray.200'}\n data-testid=\"filter-value-input\"\n />\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport {\n SEARCH_LANGUAGES,\n type SearchLanguage,\n} from '../../model/searchTypes.js';\n\ninterface SearchLanguageSelectProps {\n value: SearchLanguage;\n onChange: (value: SearchLanguage) => void;\n}\n\nexport const SearchLanguageSelect = observer(\n ({ value, onChange }: SearchLanguageSelectProps) => {\n const currentLabel =\n SEARCH_LANGUAGES.find((l) => l.value === value)?.label ?? value;\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={3}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"80px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"search-language-select\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" truncate>\n {currentLabel}\n </Text>\n <Box color=\"gray.400\" ml=\"auto\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content maxH=\"300px\" overflow=\"auto\" minW=\"180px\">\n {SEARCH_LANGUAGES.map((lang) => (\n <Menu.Item\n key={lang.value}\n value={lang.value}\n onClick={() => onChange(lang.value)}\n bg={lang.value === value ? 'gray.100' : undefined}\n >\n {lang.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport { SEARCH_TYPES, type SearchType } from '../../model/searchTypes.js';\n\ninterface SearchTypeSelectProps {\n value: SearchType;\n onChange: (value: SearchType) => void;\n}\n\nexport const SearchTypeSelect = observer(\n ({ value, onChange }: SearchTypeSelectProps) => {\n const currentLabel =\n SEARCH_TYPES.find((t) => t.value === value)?.label ?? value;\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={3}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"80px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"search-type-select\"\n >\n <Text fontSize=\"sm\" fontWeight=\"medium\" truncate>\n {currentLabel}\n </Text>\n <Box color=\"gray.400\" ml=\"auto\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content minW=\"160px\">\n {SEARCH_TYPES.map((st) => (\n <Menu.Item\n key={st.value}\n value={st.value}\n onClick={() => onChange(st.value)}\n bg={st.value === value ? 'gray.100' : undefined}\n >\n {st.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, IconButton } from '@chakra-ui/react';\nimport { LuX } from 'react-icons/lu';\nimport type { FilterModel } from '../../model/FilterModel.js';\nimport type { FilterConditionVM } from '../../model/FilterConditionVM.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport {\n FilterOperator,\n operatorRequiresValue,\n} from '../../model/operators.js';\nimport { FieldSelect } from '../FieldSelect/FieldSelect.js';\nimport { OperatorSelect } from '../OperatorSelect/OperatorSelect.js';\nimport { FilterValueInput } from '../FilterValueInput/FilterValueInput.js';\nimport { SearchLanguageSelect } from '../SearchLanguageSelect/SearchLanguageSelect.js';\nimport { SearchTypeSelect } from '../SearchTypeSelect/SearchTypeSelect.js';\n\ninterface FilterConditionViewProps {\n model: FilterModel;\n condition: FilterConditionVM;\n availableFields: ColumnSpec[];\n}\n\nexport const FilterConditionView = observer(\n ({ model, condition, availableFields }: FilterConditionViewProps) => {\n const isSearch = condition.operator === FilterOperator.Search;\n\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={2}\n minH=\"40px\"\n flexWrap=\"wrap\"\n data-testid=\"filter-condition\"\n >\n <FieldSelect\n value={condition.field}\n fieldType={condition.fieldType}\n fields={availableFields}\n onChange={(field) => model.updateCondition(condition.id, { field })}\n />\n <OperatorSelect\n value={condition.operator}\n fieldType={condition.fieldType}\n onChange={(operator) =>\n model.updateCondition(condition.id, { operator })\n }\n />\n {operatorRequiresValue(condition.operator) && (\n <FilterValueInput\n value={condition.value}\n fieldType={condition.fieldType}\n onChange={(value) => model.updateCondition(condition.id, { value })}\n error={model.getConditionError(condition.id)}\n />\n )}\n {isSearch && (\n <>\n <SearchLanguageSelect\n value={condition.searchLanguage}\n onChange={(searchLanguage) =>\n model.updateCondition(condition.id, { searchLanguage })\n }\n />\n <SearchTypeSelect\n value={condition.searchType}\n onChange={(searchType) =>\n model.updateCondition(condition.id, { searchType })\n }\n />\n </>\n )}\n <IconButton\n aria-label=\"Remove condition\"\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n color=\"gray.400\"\n _hover={{ bg: 'gray.100', color: 'gray.600' }}\n onClick={() => model.removeCondition(condition.id)}\n data-testid=\"remove-condition\"\n >\n <LuX size={20} />\n </IconButton>\n </Box>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu } from '@chakra-ui/react';\nimport { LuChevronDown } from 'react-icons/lu';\n\ninterface LogicDropdownProps {\n logic: 'and' | 'or';\n onChange: (logic: 'and' | 'or') => void;\n}\n\nexport const LogicDropdown = observer(\n ({ logic, onChange }: LogicDropdownProps) => (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n as=\"button\"\n display=\"flex\"\n alignItems=\"center\"\n gap={1}\n px={3}\n h=\"32px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n fontSize=\"sm\"\n cursor=\"pointer\"\n color=\"black\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"logic-select\"\n >\n {logic === 'and' ? 'All' : 'Any'}\n <LuChevronDown size={14} />\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content>\n <Menu.Item\n value=\"and\"\n onClick={() => onChange('and')}\n data-testid=\"logic-and\"\n >\n All\n </Menu.Item>\n <Menu.Item\n value=\"or\"\n onClick={() => onChange('or')}\n data-testid=\"logic-or\"\n >\n Any\n </Menu.Item>\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n ),\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Button, Text, VStack } from '@chakra-ui/react';\nimport { LuPlus } from 'react-icons/lu';\nimport type { FilterModel } from '../../model/FilterModel.js';\nimport type { FilterGroupVM } from '../../model/FilterGroupVM.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { FilterConditionView } from '../FilterConditionView/FilterConditionView.js';\nimport { LogicDropdown } from './LogicDropdown.js';\n\ninterface FilterGroupViewProps {\n model: FilterModel;\n group: FilterGroupVM;\n availableFields: ColumnSpec[];\n isRoot?: boolean;\n}\n\nexport const FilterGroupView = observer(\n ({ model, group, availableFields, isRoot = false }: FilterGroupViewProps) => {\n if (isRoot) {\n return (\n <VStack gap={3} alignItems=\"stretch\">\n <Box display=\"flex\" alignItems=\"center\" gap={1.5}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n Where\n </Text>\n <LogicDropdown\n logic={group.logic}\n onChange={(logic) => model.setGroupLogic(group.id, logic)}\n />\n <Text fontSize=\"sm\" color=\"gray.500\">\n of the following are true\n </Text>\n </Box>\n\n {group.conditions.length > 0 && (\n <VStack gap={2} alignItems=\"stretch\">\n {group.conditions.map((c) => (\n <FilterConditionView\n key={c.id}\n model={model}\n condition={c}\n availableFields={availableFields}\n />\n ))}\n </VStack>\n )}\n\n {group.groups.map((g) => (\n <FilterGroupView\n key={g.id}\n model={model}\n group={g}\n availableFields={availableFields}\n isRoot={false}\n />\n ))}\n </VStack>\n );\n }\n\n return (\n <Box\n border=\"1px solid\"\n borderColor=\"gray.200\"\n bg=\"rgba(204,204,204,0.1)\"\n p={4}\n borderRadius=\"xl\"\n data-testid=\"filter-group\"\n >\n <VStack gap={3} alignItems=\"stretch\">\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Box display=\"flex\" alignItems=\"center\" gap={1.5}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n Match\n </Text>\n <LogicDropdown\n logic={group.logic}\n onChange={(logic) => model.setGroupLogic(group.id, logic)}\n />\n <Text fontSize=\"sm\" color=\"gray.500\">\n of the following\n </Text>\n </Box>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n fontWeight=\"medium\"\n color=\"red.500\"\n onClick={() => model.removeGroup(group.id)}\n data-testid=\"remove-group\"\n >\n Remove group\n </Button>\n </Box>\n\n {group.conditions.length > 0 && (\n <VStack gap={2} alignItems=\"stretch\">\n {group.conditions.map((c) => (\n <FilterConditionView\n key={c.id}\n model={model}\n condition={c}\n availableFields={availableFields}\n />\n ))}\n </VStack>\n )}\n\n <Box h=\"1px\" bg=\"gray.200\" />\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"gray.500\"\n alignSelf=\"flex-start\"\n onClick={() => model.addCondition(group.id)}\n data-testid=\"add-condition\"\n >\n <LuPlus size={14} />\n <Text ml={1}>Add condition</Text>\n </Button>\n </VStack>\n </Box>\n );\n },\n);\n","import { FC, useCallback, useMemo, useState } from 'react';\nimport { Box, IconButton, Popover, Portal } from '@chakra-ui/react';\nimport { githubLight } from '@uiw/codemirror-theme-github';\nimport CodeMirror, { EditorView } from '@uiw/react-codemirror';\nimport { json } from '@codemirror/lang-json';\nimport { LuCode } from 'react-icons/lu';\nimport { Tooltip } from '../../../components/Tooltip/Tooltip.js';\nimport { CopyButton } from '../../../components/CopyButton/CopyButton.js';\n\ninterface CopyJsonPopoverProps {\n data: object;\n tooltipContent?: string;\n testId?: string;\n}\n\nexport const CopyJsonPopover: FC<CopyJsonPopoverProps> = ({\n data,\n tooltipContent = 'Copy JSON',\n testId,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const text = useMemo(() => JSON.stringify(data, null, 2), [data]);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(text);\n } catch {\n // clipboard write can fail in non-secure contexts or without permissions\n }\n }, [text]);\n\n return (\n <Popover.Root\n open={isOpen}\n onOpenChange={(e) => setIsOpen(e.open)}\n lazyMount\n unmountOnExit\n modal={false}\n >\n <Tooltip\n content={tooltipContent}\n positioning={{ placement: 'top' }}\n disabled={isOpen}\n >\n <Popover.Trigger asChild>\n <IconButton\n aria-label={tooltipContent}\n size=\"xs\"\n variant=\"ghost\"\n colorPalette=\"gray\"\n color=\"gray.400\"\n data-testid={testId}\n >\n <LuCode size={14} />\n </IconButton>\n </Popover.Trigger>\n </Tooltip>\n <Portal>\n <Popover.Positioner>\n <Popover.Content\n minW=\"350px\"\n maxW=\"500px\"\n p={0}\n borderRadius=\"md\"\n boxShadow=\"lg\"\n >\n <Box\n position=\"relative\"\n borderWidth={1}\n borderColor=\"gray.100\"\n borderRadius=\"md\"\n bg=\"white\"\n >\n <Box p={2}>\n <CodeMirror\n value={text}\n extensions={[EditorView.lineWrapping, json()]}\n editable={false}\n theme={githubLight}\n maxWidth=\"100%\"\n maxHeight=\"300px\"\n basicSetup={{\n lineNumbers: true,\n foldGutter: true,\n }}\n />\n </Box>\n <CopyButton\n dataTestId={testId ? `${testId}-copy` : undefined}\n aria-label=\"Copy\"\n position=\"absolute\"\n top=\"8px\"\n right=\"8px\"\n size=\"xs\"\n onClick={handleCopy}\n />\n </Box>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import { observer } from 'mobx-react-lite';\nimport {\n Box,\n Button,\n IconButton,\n Popover,\n Portal,\n Text,\n} from '@chakra-ui/react';\nimport { LuFilter, LuPlus } from 'react-icons/lu';\nimport type { FilterModel } from '../../model/FilterModel.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { FilterGroupView } from '../FilterGroupView/FilterGroupView.js';\nimport { CopyJsonPopover } from '../../../shared/CopyJsonPopover/index.js';\n\ninterface FilterWidgetProps {\n model: FilterModel;\n availableFields: ColumnSpec[];\n}\n\nexport const FilterWidget = observer(\n ({ model, availableFields }: FilterWidgetProps) => {\n return (\n <Popover.Root\n open={model.isOpen}\n onOpenChange={(e) => model.setOpen(e.open)}\n lazyMount\n unmountOnExit\n >\n <Popover.Trigger asChild>\n <Box position=\"relative\" display=\"inline-flex\">\n <IconButton\n aria-label=\"Filters\"\n variant=\"ghost\"\n size=\"xs\"\n color=\"gray.400\"\n data-testid=\"filter-trigger\"\n >\n <LuFilter />\n </IconButton>\n {model.showBadge && (\n <Box\n position=\"absolute\"\n top=\"-1\"\n right=\"-1\"\n borderRadius=\"full\"\n width=\"16px\"\n height=\"16px\"\n fontSize=\"xs\"\n bg={model.hasPendingChanges ? 'red.500' : 'gray.500'}\n color=\"white\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n lineHeight=\"1\"\n data-testid=\"filter-badge\"\n >\n {model.totalConditionCount}\n </Box>\n )}\n </Box>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content p={4} w=\"732px\" borderRadius=\"xl\">\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n mb={3}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2}>\n <Box color=\"gray.500\">\n <LuFilter size={20} />\n </Box>\n <Text fontSize=\"xl\" fontWeight=\"medium\" color=\"gray.500\">\n Filters\n </Text>\n {model.totalConditionCount > 0 && (\n <Box bg=\"gray.100\" px={2} py={1} borderRadius=\"sm\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"black\">\n {model.totalConditionCount}\n </Text>\n </Box>\n )}\n {model.hasPendingChanges && (\n <Box bg=\"#fdedea\" px={2} py={1} borderRadius=\"sm\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"#be3e24\">\n Unsaved\n </Text>\n </Box>\n )}\n </Box>\n <Box display=\"flex\" gap={2} alignItems=\"center\">\n {!model.isEmpty && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"black\"\n onClick={model.clearAllAndClose}\n data-testid=\"clear-all\"\n >\n Clear all\n </Button>\n )}\n {!model.isEmpty && model.allFiltersValid && (\n <CopyJsonPopover\n data={model.buildCurrentWhereClause() ?? {}}\n tooltipContent=\"Copy filter JSON\"\n testId=\"filter-copy-json\"\n />\n )}\n <Button\n size=\"sm\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n onClick={model.applyAndClose}\n disabled={\n !model.allFiltersValid || !model.hasPendingChanges\n }\n color={\n model.hasPendingChanges && model.allFiltersValid\n ? 'black'\n : 'rgba(0,0,0,0.2)'\n }\n _hover={\n model.hasPendingChanges && model.allFiltersValid\n ? { bg: 'gray.200' }\n : undefined\n }\n _disabled={{\n opacity: 1,\n bg: 'gray.100',\n cursor: 'default',\n }}\n data-testid=\"apply-filters\"\n >\n Apply\n </Button>\n </Box>\n </Box>\n\n <Box h=\"1px\" bg=\"gray.200\" mb={3} />\n\n {!model.isEmpty && (\n <FilterGroupView\n model={model}\n group={model.rootGroup}\n availableFields={availableFields}\n isRoot={true}\n />\n )}\n\n <Box mt={model.isEmpty ? 0 : 2}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"gray.500\"\n onClick={() => model.addCondition()}\n data-testid=\"footer-add-condition\"\n >\n <LuPlus size={14} />\n <Text ml={1}>Add condition</Text>\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"gray.500\"\n onClick={() => model.addGroup()}\n data-testid=\"footer-add-group\"\n >\n <LuPlus size={14} />\n <Text ml={1}>Add group</Text>\n </Button>\n </Box>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n },\n);\n","import { makeAutoObservable } from 'mobx';\nimport { Debounce } from '../../../lib/Debounce.js';\n\nexport class SearchModel {\n private _query = '';\n private _debouncedQuery = '';\n private readonly _debounce: Debounce;\n private readonly _onSearch: (query: string) => void;\n\n constructor(onSearch: (query: string) => void, delay: number = 300) {\n this._onSearch = onSearch;\n this._debounce = new Debounce(delay);\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get query(): string {\n return this._query;\n }\n\n get debouncedQuery(): string {\n return this._debouncedQuery;\n }\n\n get hasActiveSearch(): boolean {\n return this._debouncedQuery.length > 0;\n }\n\n setQuery(value: string): void {\n this._query = value;\n this._debounce.schedule(() => {\n this._debouncedQuery = value;\n this._onSearch(value);\n });\n }\n\n clear(): void {\n this._query = '';\n this._debouncedQuery = '';\n this._debounce.dispose();\n this._onSearch('');\n }\n\n dispose(): void {\n this._debounce.dispose();\n }\n}\n","import { useRef, useState } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Box, IconButton, Input } from '@chakra-ui/react';\nimport { PiMagnifyingGlass, PiXBold } from 'react-icons/pi';\nimport type { SearchModel } from '../model/index.js';\n\nconst HEIGHT = '24px';\n\ninterface SearchWidgetProps {\n model: SearchModel;\n}\n\nexport const SearchWidget = observer(({ model }: SearchWidgetProps) => {\n const [expanded, setExpanded] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const isOpen = expanded || model.query !== '';\n\n const handleBlur = () => {\n if (model.query === '') {\n setExpanded(false);\n }\n };\n\n const handleExpand = () => {\n setExpanded(true);\n requestAnimationFrame(() => {\n inputRef.current?.focus();\n });\n };\n\n if (!isOpen) {\n return (\n <IconButton\n aria-label=\"Search\"\n variant=\"ghost\"\n size=\"xs\"\n color=\"gray.400\"\n onClick={handleExpand}\n data-testid=\"search-trigger\"\n >\n <PiMagnifyingGlass />\n </IconButton>\n );\n }\n\n return (\n <Box position=\"relative\" width=\"280px\" height={HEIGHT}>\n <Box\n position=\"absolute\"\n left=\"4px\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n color=\"gray.400\"\n zIndex={1}\n display=\"flex\"\n alignItems=\"center\"\n >\n <PiMagnifyingGlass />\n </Box>\n <Input\n ref={inputRef}\n value={model.query}\n onChange={(e) => model.setQuery(e.target.value)}\n onBlur={handleBlur}\n placeholder=\"Search...\"\n variant=\"flushed\"\n height={HEIGHT}\n fontSize=\"sm\"\n pl=\"24px\"\n autoFocus\n data-testid=\"search-input\"\n />\n {model.query !== '' && (\n <IconButton\n aria-label=\"Clear\"\n variant=\"ghost\"\n size=\"2xs\"\n position=\"absolute\"\n right=\"0\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n onClick={() => {\n model.clear();\n setExpanded(false);\n }}\n color=\"gray.400\"\n _hover={{ color: 'black' }}\n >\n <PiXBold />\n </IconButton>\n )}\n </Box>\n );\n});\n","import { arr, obj, str } from '@revisium/schema-toolkit';\n\nexport const SORT_SCHEMA = arr(\n obj({\n field: str(),\n direction: str(),\n }),\n);\n","import { makeAutoObservable } from 'mobx';\nimport { createRowModel } from '@revisium/schema-toolkit';\nimport { ensureReactivityProvider } from '../../../lib/initReactivity.js';\nimport type { ColumnSpec } from '../../Columns/model/types.js';\nimport { SORT_SCHEMA } from './sortSchema.js';\nimport type { SortEntry, ViewSort } from './types.js';\n\ntype SortRowModel = ReturnType<typeof createRowModel<typeof SORT_SCHEMA>>;\ntype SortRootNode = SortRowModel['root'];\ntype SortItemValue = ReturnType<SortRootNode['getPlainValue']>[number];\n\nexport class SortModel {\n private readonly _row: SortRowModel;\n private _availableFields: ColumnSpec[] = [];\n private _isOpen = false;\n private _onChange: (() => void) | null = null;\n private _onApply:\n | ((sorts: ReturnType<SortModel['serializeToViewSorts']>) => void)\n | null = null;\n\n constructor() {\n ensureReactivityProvider();\n this._row = createRowModel({\n rowId: 'sort',\n schema: SORT_SCHEMA,\n data: [],\n });\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n private get _rootNode(): SortRootNode {\n return this._row.root;\n }\n\n get sorts(): SortEntry[] {\n return this._row.getPlainValue() as SortEntry[];\n }\n\n get hasSorts(): boolean {\n return this._rootNode.length > 0;\n }\n\n get sortCount(): number {\n return this._rootNode.length;\n }\n\n get isOpen(): boolean {\n return this._isOpen;\n }\n\n get hasPendingChanges(): boolean {\n return this._row.isDirty;\n }\n\n setOpen(value: boolean): void {\n this._isOpen = value;\n }\n\n get availableFields(): ColumnSpec[] {\n const used = new Set(this.sorts.map((s) => s.field));\n return this._availableFields.filter((col) => !used.has(col.field));\n }\n\n private get _fieldLookup(): Map<string, ColumnSpec> {\n return new Map(this._availableFields.map((col) => [col.field, col]));\n }\n\n private _findIndex(field: string): number {\n return this._rootNode.findIndex(\n (node) => node.child('field').value === field,\n );\n }\n\n private _setItemChild(\n index: number,\n childName: 'field' | 'direction',\n value: string,\n ): void {\n const itemNode = this._rootNode.at(index);\n if (itemNode) {\n itemNode.child(childName).setValue(value);\n }\n }\n\n init(availableFields: ColumnSpec[]): void {\n this._availableFields = availableFields;\n this._row.reset([]);\n }\n\n apply(): void {\n this._row.commit();\n this._fireOnApply();\n this._notifyChange();\n }\n\n applyAndClose(): void {\n this.apply();\n this.setOpen(false);\n }\n\n addSort(field: string, direction: 'asc' | 'desc' = 'asc'): void {\n if (this._findIndex(field) >= 0) {\n return;\n }\n this._rootNode.pushValue({ field, direction });\n }\n\n replaceField(oldField: string, newField: string): void {\n if (oldField === newField) {\n return;\n }\n const oldIndex = this._findIndex(oldField);\n if (oldIndex < 0) {\n return;\n }\n const dupIndex = this._findIndex(newField);\n if (dupIndex >= 0) {\n this._rootNode.removeAt(dupIndex);\n const adjustedIndex = dupIndex < oldIndex ? oldIndex - 1 : oldIndex;\n this._setItemChild(adjustedIndex, 'field', newField);\n } else {\n this._setItemChild(oldIndex, 'field', newField);\n }\n }\n\n getSortDirection(field: string): 'asc' | 'desc' | null {\n const sort = this.sorts.find((s) => s.field === field);\n return sort ? sort.direction : null;\n }\n\n getSortIndex(field: string): number | null {\n const index = this._findIndex(field);\n return index >= 0 ? index + 1 : null;\n }\n\n isSorted(field: string): boolean {\n return this._findIndex(field) >= 0;\n }\n\n setSingleSort(field: string, direction: 'asc' | 'desc'): void {\n const index = this._findIndex(field);\n if (index >= 0) {\n this._setItemChild(index, 'direction', direction);\n } else {\n this._rootNode.pushValue({ field, direction });\n }\n this.apply();\n }\n\n setDirection(field: string, direction: 'asc' | 'desc'): void {\n const index = this._findIndex(field);\n if (index >= 0) {\n this._setItemChild(index, 'direction', direction);\n }\n }\n\n removeSort(field: string): void {\n const index = this._findIndex(field);\n if (index >= 0) {\n this._rootNode.removeAt(index);\n }\n }\n\n toggleDirection(field: string): void {\n const index = this._findIndex(field);\n if (index >= 0) {\n const current = this.sorts[index]?.direction;\n this._setItemChild(\n index,\n 'direction',\n current === 'asc' ? 'desc' : 'asc',\n );\n }\n }\n\n reorderSorts(fields: string[]): void {\n const plainSorts = this._rootNode.getPlainValue();\n const lookup = new Map(plainSorts.map((s) => [s.field, s]));\n const reordered: SortItemValue[] = [];\n for (const field of fields) {\n const entry = lookup.get(field);\n if (entry) {\n reordered.push(entry);\n }\n }\n this._rootNode.setValue(reordered);\n }\n\n clearAll(): void {\n this._rootNode.clear();\n this._row.commit();\n this._fireOnApply();\n this._notifyChange();\n }\n\n clearAllAndClose(): void {\n this.clearAll();\n this.setOpen(false);\n }\n\n addFirstAvailableSort(): void {\n const firstAvailable = this.availableFields[0];\n if (firstAvailable) {\n this.addSort(firstAvailable.field);\n }\n }\n\n serializeToViewSorts(): ViewSort[] {\n return this.sorts.map((sort) => ({\n field: sort.field,\n direction: sort.direction,\n }));\n }\n\n applyViewSorts(viewSorts: ViewSort[]): void {\n const lookup = this._fieldLookup;\n const sorts: SortItemValue[] = [];\n\n for (const vs of viewSorts) {\n const direction = vs.direction === 'desc' ? 'desc' : 'asc';\n if (lookup.has(vs.field)) {\n sorts.push({ field: vs.field, direction });\n }\n }\n\n this._rootNode.setValue(sorts);\n this._row.commit();\n this._notifyChange();\n }\n\n setOnChange(cb: (() => void) | null): void {\n this._onChange = cb;\n }\n\n setOnApply(\n cb: ((sorts: ReturnType<SortModel['serializeToViewSorts']>) => void) | null,\n ): void {\n this._onApply = cb;\n }\n\n dispose(): void {\n this._onChange = null;\n this._onApply = null;\n this._row.dispose();\n }\n\n private _fireOnApply(): void {\n if (this._onApply) {\n this._onApply(this.serializeToViewSorts());\n }\n }\n\n private _notifyChange(): void {\n if (this._onChange) {\n this._onChange();\n }\n }\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport { PiCaretDownLight } from 'react-icons/pi';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { getFieldTypeIcon } from '../../../Table/ui/Header/getFieldTypeIcon.js';\n\ninterface SortFieldSelectProps {\n currentField: string;\n availableFields: ColumnSpec[];\n onChange: (field: string) => void;\n}\n\nexport const SortFieldSelect = observer(\n ({ currentField, availableFields, onChange }: SortFieldSelectProps) => {\n const currentCol = availableFields.find((f) => f.field === currentField);\n const currentLabel = currentCol?.label || currentField;\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={4}\n h=\"40px\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n cursor=\"pointer\"\n minW=\"100px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"sort-field-select\"\n >\n {currentCol && (\n <Box fontSize=\"sm\" fontFamily=\"mono\" color=\"gray.400\" minW=\"16px\">\n {getFieldTypeIcon(currentCol.fieldType)}\n </Box>\n )}\n <Text fontSize=\"md\" fontWeight=\"medium\" truncate maxW=\"120px\">\n {currentLabel}\n </Text>\n <Box ml=\"auto\" color=\"gray.400\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content maxH=\"300px\" overflow=\"auto\" minW=\"180px\">\n {availableFields.map((field) => (\n <Menu.Item\n key={field.field}\n value={field.field}\n onClick={() => onChange(field.field)}\n bg={field.field === currentField ? 'gray.100' : undefined}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2} width=\"100%\">\n <Box\n fontSize=\"sm\"\n fontFamily=\"mono\"\n color=\"gray.400\"\n width=\"24px\"\n textAlign=\"center\"\n >\n {getFieldTypeIcon(field.fieldType)}\n </Box>\n <Text truncate>{field.label || '(unnamed)'}</Text>\n </Box>\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, Menu, Text } from '@chakra-ui/react';\nimport type { IconType } from 'react-icons';\nimport {\n PiArrowDownLight,\n PiArrowUpLight,\n PiCaretDownLight,\n} from 'react-icons/pi';\n\ninterface SortDirectionSelectProps {\n selectedDirection: 'asc' | 'desc';\n onSelect: (direction: 'asc' | 'desc') => void;\n}\n\nconst directions: {\n value: 'asc' | 'desc';\n label: string;\n icon: IconType;\n}[] = [\n { value: 'asc', label: 'A—Z', icon: PiArrowUpLight },\n { value: 'desc', label: 'Z—A', icon: PiArrowDownLight },\n];\n\nexport const SortDirectionSelect = observer(\n ({ selectedDirection, onSelect }: SortDirectionSelectProps) => {\n const ascDirection = directions[0] as (typeof directions)[number];\n const selected =\n directions.find((d) => d.value === selectedDirection) ?? ascDirection;\n const Icon = selected.icon;\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={1.5}\n px={4}\n h=\"40px\"\n borderRadius=\"lg\"\n bg=\"gray.100\"\n cursor=\"pointer\"\n minW=\"80px\"\n _hover={{ bg: 'gray.200' }}\n data-testid=\"sort-direction-select\"\n >\n <Icon size={18} />\n <Text fontSize=\"md\" fontWeight=\"medium\">\n {selected.label}\n </Text>\n <Box color=\"gray.400\" ml=\"auto\">\n <PiCaretDownLight size={14} />\n </Box>\n </Box>\n </Menu.Trigger>\n <Menu.Positioner>\n <Menu.Content minW=\"120px\">\n {directions.map((dir) => {\n const DirIcon = dir.icon;\n return (\n <Menu.Item\n key={dir.value}\n value={dir.value}\n onClick={() => onSelect(dir.value)}\n bg={selectedDirection === dir.value ? 'gray.100' : undefined}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2}>\n <DirIcon size={18} />\n <Text fontWeight=\"medium\">{dir.label}</Text>\n </Box>\n </Menu.Item>\n );\n })}\n </Menu.Content>\n </Menu.Positioner>\n </Menu.Root>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box, IconButton, Text } from '@chakra-ui/react';\nimport { LuX } from 'react-icons/lu';\nimport type { SortEntry } from '../../model/types.js';\nimport type { SortModel } from '../../model/SortModel.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { SortFieldSelect } from '../SortFieldSelect/SortFieldSelect.js';\nimport { SortDirectionSelect } from '../SortDirectionSelect/SortDirectionSelect.js';\n\ninterface SortRowProps {\n sort: SortEntry;\n index: number;\n model: SortModel;\n availableFields: ColumnSpec[];\n}\n\nexport const SortRow = observer(\n ({ sort, index, model, availableFields }: SortRowProps) => {\n const handleFieldChange = (newField: string) => {\n model.replaceField(sort.field, newField);\n };\n\n const handleDirectionChange = (direction: 'asc' | 'desc') => {\n model.setDirection(sort.field, direction);\n };\n\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n gap={2}\n h=\"40px\"\n data-testid=\"sort-row\"\n >\n <Text fontSize=\"md\" color=\"gray.400\" minW=\"20px\">\n {index + 1}.\n </Text>\n <SortFieldSelect\n currentField={sort.field}\n availableFields={availableFields}\n onChange={handleFieldChange}\n />\n <SortDirectionSelect\n selectedDirection={sort.direction}\n onSelect={handleDirectionChange}\n />\n <IconButton\n aria-label=\"Remove sort\"\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n color=\"gray.400\"\n _hover={{ bg: 'gray.100', color: 'gray.600' }}\n onClick={() => model.removeSort(sort.field)}\n data-testid=\"remove-sort\"\n >\n <LuX size={20} />\n </IconButton>\n </Box>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport {\n Box,\n Button,\n IconButton,\n Popover,\n Portal,\n Text,\n} from '@chakra-ui/react';\nimport { LuArrowUpDown, LuPlus } from 'react-icons/lu';\nimport type { SortModel } from '../../model/SortModel.js';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport { SortRow } from '../SortRow/SortRow.js';\nimport { CopyJsonPopover } from '../../../shared/CopyJsonPopover/index.js';\n\ninterface SortingsWidgetProps {\n model: SortModel;\n availableFields: ColumnSpec[];\n onChange: (sorts: ReturnType<SortModel['serializeToViewSorts']>) => void;\n}\n\nexport const SortingsWidget = observer(\n ({ model, availableFields, onChange }: SortingsWidgetProps) => {\n const handleApply = () => {\n model.applyAndClose();\n onChange(model.serializeToViewSorts());\n };\n\n const handleClearAll = () => {\n model.clearAllAndClose();\n onChange(model.serializeToViewSorts());\n };\n\n return (\n <Popover.Root\n open={model.isOpen}\n onOpenChange={(e) => model.setOpen(e.open)}\n lazyMount\n unmountOnExit\n >\n <Popover.Trigger asChild>\n <Box position=\"relative\" display=\"inline-flex\">\n <IconButton\n aria-label=\"Sort\"\n variant=\"ghost\"\n size=\"xs\"\n color=\"gray.400\"\n data-testid=\"sort-trigger\"\n >\n <LuArrowUpDown />\n </IconButton>\n {(model.hasSorts || model.hasPendingChanges) && (\n <Box\n position=\"absolute\"\n top=\"-1\"\n right=\"-1\"\n borderRadius=\"full\"\n width=\"16px\"\n height=\"16px\"\n fontSize=\"xs\"\n bg={model.hasPendingChanges ? 'red.500' : 'gray.500'}\n color=\"white\"\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n lineHeight=\"1\"\n data-testid=\"sort-badge\"\n >\n {model.sortCount}\n </Box>\n )}\n </Box>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content p={4} minW=\"450px\" borderRadius=\"xl\">\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n mb={model.hasSorts ? 3 : 0}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2}>\n <Box color=\"gray.500\">\n <LuArrowUpDown size={20} />\n </Box>\n <Text fontSize=\"xl\" fontWeight=\"medium\" color=\"gray.500\">\n Sort\n </Text>\n {model.sortCount > 0 && (\n <Box bg=\"gray.100\" px={2} py={1} borderRadius=\"sm\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"black\">\n {model.sortCount}\n </Text>\n </Box>\n )}\n {model.hasPendingChanges && (\n <Box bg=\"#fdedea\" px={2} py={1} borderRadius=\"sm\">\n <Text fontSize=\"sm\" fontWeight=\"medium\" color=\"#be3e24\">\n Unsaved\n </Text>\n </Box>\n )}\n </Box>\n <Box display=\"flex\" gap={2} alignItems=\"center\">\n {model.hasSorts && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"black\"\n onClick={handleClearAll}\n data-testid=\"clear-all-sorts\"\n >\n Clear all\n </Button>\n )}\n {model.hasSorts && (\n <CopyJsonPopover\n data={model.serializeToViewSorts()}\n tooltipContent=\"Copy sort JSON\"\n testId=\"sort-copy-json\"\n />\n )}\n <Button\n size=\"sm\"\n bg=\"gray.100\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n onClick={handleApply}\n disabled={!model.hasPendingChanges}\n color={\n model.hasPendingChanges ? 'black' : 'rgba(0,0,0,0.2)'\n }\n _hover={\n model.hasPendingChanges ? { bg: 'gray.200' } : undefined\n }\n _disabled={{\n opacity: 1,\n bg: 'gray.100',\n cursor: 'default',\n }}\n data-testid=\"apply-sorts\"\n >\n Apply\n </Button>\n </Box>\n </Box>\n\n {model.hasSorts && (\n <>\n <Box h=\"1px\" bg=\"gray.200\" mb={3} />\n <Box display=\"flex\" flexDirection=\"column\" gap={2}>\n {model.sorts.map((sort, index) => (\n <SortRow\n key={sort.field}\n sort={sort}\n index={index}\n model={model}\n availableFields={availableFields}\n />\n ))}\n </Box>\n </>\n )}\n\n {model.availableFields.length > 0 && (\n <Box mt={model.hasSorts ? 2 : 0}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n borderRadius=\"lg\"\n fontWeight=\"medium\"\n color=\"gray.500\"\n onClick={model.addFirstAvailableSort}\n data-testid=\"add-sort\"\n >\n <LuPlus size={14} />\n <Text ml={1}>Add sort</Text>\n </Button>\n </Box>\n )}\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n },\n);\n","import { makeAutoObservable, observable } from 'mobx';\n\nexport class SelectionModel {\n private readonly _selected = observable.map<string, boolean>();\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get isSelectionMode(): boolean {\n return this._selected.size > 0;\n }\n\n get selectedCount(): number {\n return this._selected.size;\n }\n\n get selectedIds(): string[] {\n return Array.from(this._selected.keys());\n }\n\n isSelected(rowId: string): boolean {\n return this._selected.get(rowId) === true;\n }\n\n deselect(rowId: string): void {\n this._selected.delete(rowId);\n }\n\n toggle(rowId: string): void {\n if (this._selected.has(rowId)) {\n this._selected.delete(rowId);\n } else {\n this._selected.set(rowId, true);\n }\n }\n\n selectAll(rowIds: string[]): void {\n for (const id of rowIds) {\n this._selected.set(id, true);\n }\n }\n\n deselectAll(): void {\n this._selected.clear();\n }\n\n enterSelectionMode(rowId?: string): void {\n if (rowId) {\n this._selected.set(rowId, true);\n }\n }\n\n isAllSelected(allRowIds: string[]): boolean {\n if (allRowIds.length === 0) {\n return false;\n }\n return allRowIds.every((id) => this._selected.has(id));\n }\n\n exitSelectionMode(): void {\n this._selected.clear();\n }\n}\n","import type { TransitionConfig, ResolvedTransition } from './types';\n\nexport function resolveTransition<TState extends string, TContext>(\n config: TransitionConfig<TState, TContext>,\n context: TContext,\n): ResolvedTransition<TState, TContext> | null {\n if (typeof config === 'string') {\n return { target: config };\n }\n\n if (typeof config === 'function') {\n const result = config(context);\n return {\n target: result.target,\n context: result.context,\n };\n }\n\n if (config.guard && !config.guard(context)) {\n return null;\n }\n\n return {\n target: config.target,\n action: config.action,\n };\n}\n","import { makeAutoObservable, observable } from 'mobx';\n\nimport type { ObservableFSMConfig, TransitionMap } from './types';\nimport { resolveTransition } from './resolveTransition';\n\nexport class ObservableFSM<\n TState extends string,\n TEvent extends string,\n TContext extends object,\n> {\n private _state: TState;\n private _context: TContext;\n private readonly _transitions: TransitionMap<TState, TEvent, TContext>;\n private readonly _onTransition?: (\n from: TState,\n to: TState,\n event: TEvent,\n ) => void;\n private readonly _onUnhandledEvent?: (state: TState, event: TEvent) => void;\n\n constructor(config: ObservableFSMConfig<TState, TEvent, TContext>) {\n this._state = config.initial;\n this._context = observable.object({ ...config.context }, undefined, {\n deep: false,\n });\n this._transitions = config.transitions;\n this._onTransition = config.onTransition;\n this._onUnhandledEvent = config.onUnhandledEvent;\n\n makeAutoObservable<this, '_context'>(\n this,\n { _context: false },\n { autoBind: true },\n );\n }\n\n get state(): TState {\n return this._state;\n }\n\n get context(): TContext {\n return this._context;\n }\n\n dispatch(event: TEvent): void {\n const config = this._transitions[this._state]?.[event];\n\n if (config === undefined) {\n this._onUnhandledEvent?.(this._state, event);\n return;\n }\n\n const resolved = resolveTransition(config, this._context);\n\n if (!resolved) {\n return;\n }\n\n const from = this._state;\n this._state = resolved.target;\n\n if (resolved.context) {\n Object.assign(this._context, resolved.context);\n }\n\n resolved.action?.(this._context);\n this._onTransition?.(from, resolved.target, event);\n }\n\n matches(state: TState): boolean {\n return this._state === state;\n }\n\n dispose(): void {\n // intentionally empty — reserved for future cleanup\n }\n}\n","import type {\n ObservableFSMConfig,\n TransitionFn,\n} from '../../../lib/fsm/index.js';\n\nexport interface CellAddress {\n rowId: string;\n field: string;\n}\n\nexport type EditTrigger =\n | { type: 'doubleClick'; clickOffset?: number }\n | { type: 'enter' }\n | { type: 'char'; char: string };\n\nexport interface SelectedRange {\n startCol: number;\n endCol: number;\n startRow: number;\n endRow: number;\n}\n\nexport interface SelectionEdges {\n top: boolean;\n bottom: boolean;\n left: boolean;\n right: boolean;\n}\n\nexport type CellState = 'idle' | 'focused' | 'editing';\n\nexport type CellEvent =\n | 'FOCUS'\n | 'BLUR'\n | 'DOUBLE_CLICK'\n | 'ENTER'\n | 'TYPE_CHAR'\n | 'COMMIT'\n | 'COMMIT_MOVE_DOWN'\n | 'CANCEL'\n | 'MOVE_UP'\n | 'MOVE_DOWN'\n | 'MOVE_LEFT'\n | 'MOVE_RIGHT'\n | 'TAB'\n | 'SELECT_TO'\n | 'SHIFT_MOVE_UP'\n | 'SHIFT_MOVE_DOWN'\n | 'SHIFT_MOVE_LEFT'\n | 'SHIFT_MOVE_RIGHT'\n | 'DRAG_START'\n | 'DRAG_EXTEND';\n\nexport interface CellFSMContext {\n focusedCell: CellAddress | null;\n anchorCell: CellAddress | null;\n editTrigger: EditTrigger | null;\n columns: string[];\n rowIds: string[];\n navigationVersion: number;\n _pendingCell: CellAddress | null;\n _pendingTrigger: EditTrigger | null;\n _pendingShift: boolean;\n}\n\nfunction moveFocused(\n colDelta: number,\n rowDelta: number,\n): TransitionFn<CellState, CellFSMContext> {\n return (ctx) => {\n const next = moveCell(ctx, colDelta, rowDelta);\n if (next) {\n return {\n target: 'focused',\n context: { focusedCell: next, anchorCell: null },\n };\n }\n return { target: 'focused', context: { anchorCell: null } };\n };\n}\n\nfunction shiftMoveFocused(\n colDelta: number,\n rowDelta: number,\n): TransitionFn<CellState, CellFSMContext> {\n return (ctx) => {\n const anchor = ctx.anchorCell ?? ctx.focusedCell;\n const next = moveCell(ctx, colDelta, rowDelta);\n if (next) {\n return {\n target: 'focused',\n context: { focusedCell: next, anchorCell: anchor },\n };\n }\n return { target: 'focused', context: { anchorCell: anchor } };\n };\n}\n\nfunction tabFocused(): TransitionFn<CellState, CellFSMContext> {\n return (ctx) => {\n const next = resolveTabTarget(ctx, ctx._pendingShift ? -1 : 1);\n if (next) {\n return {\n target: 'focused',\n context: { focusedCell: next, anchorCell: null },\n };\n }\n return { target: 'focused', context: { anchorCell: null } };\n };\n}\n\nfunction moveCell(\n ctx: CellFSMContext,\n colDelta: number,\n rowDelta: number,\n): CellAddress | null {\n const pos = currentPosition(ctx);\n if (!pos) {\n return null;\n }\n return cellAt(ctx, pos.colIndex + colDelta, pos.rowIndex + rowDelta);\n}\n\nfunction resolveTabTarget(\n ctx: CellFSMContext,\n delta: number,\n): CellAddress | null {\n const pos = currentPosition(ctx);\n if (!pos) {\n return null;\n }\n\n const nextCol = pos.colIndex + delta;\n const sameRow = cellAt(ctx, nextCol, pos.rowIndex);\n if (sameRow) {\n return sameRow;\n }\n\n const wrapCol = delta > 0 ? 0 : ctx.columns.length - 1;\n return cellAt(ctx, wrapCol, pos.rowIndex + delta);\n}\n\nfunction currentPosition(\n ctx: CellFSMContext,\n): { colIndex: number; rowIndex: number } | null {\n if (!ctx.focusedCell) {\n return null;\n }\n const colIndex = ctx.columns.indexOf(ctx.focusedCell.field);\n const rowIndex = ctx.rowIds.indexOf(ctx.focusedCell.rowId);\n if (colIndex === -1 || rowIndex === -1) {\n return null;\n }\n return { colIndex, rowIndex };\n}\n\nfunction cellAt(\n ctx: CellFSMContext,\n colIndex: number,\n rowIndex: number,\n): CellAddress | null {\n const field = ctx.columns[colIndex];\n const rowId = ctx.rowIds[rowIndex];\n if (field === undefined || rowId === undefined) {\n return null;\n }\n return { rowId, field };\n}\n\nexport function cellPosition(\n ctx: CellFSMContext,\n cell: CellAddress,\n): { colIndex: number; rowIndex: number } | null {\n const colIndex = ctx.columns.indexOf(cell.field);\n const rowIndex = ctx.rowIds.indexOf(cell.rowId);\n if (colIndex === -1 || rowIndex === -1) {\n return null;\n }\n return { colIndex, rowIndex };\n}\n\nexport function createConfig(): ObservableFSMConfig<\n CellState,\n CellEvent,\n CellFSMContext\n> {\n return {\n initial: 'idle',\n context: {\n focusedCell: null,\n anchorCell: null,\n editTrigger: null,\n columns: [],\n rowIds: [],\n navigationVersion: 0,\n _pendingCell: null,\n _pendingTrigger: null,\n _pendingShift: false,\n },\n transitions: {\n idle: {\n FOCUS: (ctx) => ({\n target: 'focused',\n context: {\n focusedCell: ctx._pendingCell,\n anchorCell: null,\n editTrigger: null,\n },\n }),\n DRAG_START: (ctx) => ({\n target: 'focused',\n context: {\n anchorCell: ctx._pendingCell,\n focusedCell: ctx._pendingCell,\n editTrigger: null,\n },\n }),\n },\n focused: {\n FOCUS: (ctx) => ({\n target: 'focused',\n context: {\n focusedCell: ctx._pendingCell,\n anchorCell: null,\n editTrigger: null,\n },\n }),\n BLUR: {\n target: 'idle',\n action: (ctx) => {\n ctx.focusedCell = null;\n ctx.anchorCell = null;\n ctx.editTrigger = null;\n },\n },\n DOUBLE_CLICK: (ctx) => ({\n target: 'editing',\n context: {\n anchorCell: null,\n editTrigger: ctx._pendingTrigger,\n },\n }),\n ENTER: {\n target: 'editing',\n action: (ctx) => {\n ctx.anchorCell = null;\n ctx.editTrigger = { type: 'enter' };\n },\n },\n TYPE_CHAR: (ctx) => ({\n target: 'editing',\n context: {\n anchorCell: null,\n editTrigger: ctx._pendingTrigger,\n },\n }),\n MOVE_UP: moveFocused(0, -1),\n MOVE_DOWN: moveFocused(0, 1),\n MOVE_LEFT: moveFocused(-1, 0),\n MOVE_RIGHT: moveFocused(1, 0),\n TAB: tabFocused(),\n SELECT_TO: (ctx) => ({\n target: 'focused',\n context: {\n anchorCell: ctx.anchorCell ?? ctx.focusedCell,\n focusedCell: ctx._pendingCell,\n },\n }),\n SHIFT_MOVE_UP: shiftMoveFocused(0, -1),\n SHIFT_MOVE_DOWN: shiftMoveFocused(0, 1),\n SHIFT_MOVE_LEFT: shiftMoveFocused(-1, 0),\n SHIFT_MOVE_RIGHT: shiftMoveFocused(1, 0),\n DRAG_START: (ctx) => ({\n target: 'focused',\n context: {\n anchorCell: ctx._pendingCell,\n focusedCell: ctx._pendingCell,\n },\n }),\n DRAG_EXTEND: (ctx) => ({\n target: 'focused',\n context: {\n focusedCell: ctx._pendingCell,\n },\n }),\n },\n editing: {\n FOCUS: (ctx) => ({\n target: 'focused',\n context: {\n focusedCell: ctx._pendingCell,\n anchorCell: null,\n editTrigger: null,\n },\n }),\n DRAG_START: (ctx) => ({\n target: 'focused',\n context: {\n anchorCell: ctx._pendingCell,\n focusedCell: ctx._pendingCell,\n editTrigger: null,\n },\n }),\n COMMIT: {\n target: 'focused',\n action: (ctx) => {\n ctx.anchorCell = null;\n ctx.editTrigger = null;\n },\n },\n COMMIT_MOVE_DOWN: (ctx) => {\n const next = moveCell(ctx, 0, 1);\n if (next) {\n return {\n target: 'editing',\n context: {\n focusedCell: next,\n anchorCell: null,\n editTrigger: { type: 'enter' as const },\n },\n };\n }\n return {\n target: 'focused',\n context: {\n anchorCell: null,\n editTrigger: null,\n },\n };\n },\n CANCEL: {\n target: 'focused',\n action: (ctx) => {\n ctx.anchorCell = null;\n ctx.editTrigger = null;\n },\n },\n BLUR: {\n target: 'idle',\n action: (ctx) => {\n ctx.focusedCell = null;\n ctx.anchorCell = null;\n ctx.editTrigger = null;\n },\n },\n },\n },\n };\n}\n","import { computed, makeAutoObservable } from 'mobx';\nimport { ObservableFSM } from '../../../lib/fsm/index.js';\nimport {\n createConfig,\n type CellAddress,\n type CellEvent,\n type CellFSMContext,\n type CellState,\n type EditTrigger,\n type SelectedRange,\n type SelectionEdges,\n} from './cellFSMConfig.js';\n\nexport type {\n CellAddress,\n CellState,\n EditTrigger,\n SelectedRange,\n SelectionEdges,\n} from './cellFSMConfig.js';\n\nconst READONLY_TOAST_THROTTLE_MS = 2000;\n\nfunction buildIndexMap(arr: string[]): Map<string, number> {\n const map = new Map<string, number>();\n arr.forEach((value, i) => {\n map.set(value, i);\n });\n return map;\n}\n\nfunction selectedRangeEquals(\n a: SelectedRange | null,\n b: SelectedRange | null,\n): boolean {\n if (a === b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n return (\n a.startCol === b.startCol &&\n a.endCol === b.endCol &&\n a.startRow === b.startRow &&\n a.endRow === b.endRow\n );\n}\n\nexport class CellFSM {\n private readonly _fsm: ObservableFSM<CellState, CellEvent, CellFSMContext>;\n private _onReadonlyEditAttempt: (() => void) | null = null;\n private _lastReadonlyToastAt = 0;\n private _columnIndexMap: Map<string, number> = new Map();\n private _rowIndexMap: Map<string, number> = new Map();\n\n constructor() {\n this._fsm = new ObservableFSM(createConfig());\n makeAutoObservable(\n this,\n {\n selectedRange: computed({ equals: selectedRangeEquals }),\n },\n { autoBind: true },\n );\n }\n\n setOnReadonlyEditAttempt(cb: (() => void) | null): void {\n this._onReadonlyEditAttempt = cb;\n }\n\n notifyReadonlyEditAttempt(): void {\n const now = Date.now();\n if (now - this._lastReadonlyToastAt < READONLY_TOAST_THROTTLE_MS) {\n return;\n }\n this._lastReadonlyToastAt = now;\n this._onReadonlyEditAttempt?.();\n }\n\n get state(): CellState {\n return this._fsm.state;\n }\n\n get focusedCell(): CellAddress | null {\n return this._fsm.context.focusedCell;\n }\n\n get anchorCell(): CellAddress | null {\n return this._fsm.context.anchorCell;\n }\n\n get editTrigger(): EditTrigger | null {\n return this._fsm.context.editTrigger;\n }\n\n get columns(): string[] {\n return this._fsm.context.columns;\n }\n\n get rowIds(): string[] {\n return this._fsm.context.rowIds;\n }\n\n get navigationVersion(): number {\n return this._fsm.context.navigationVersion;\n }\n\n get columnIndexMap(): Map<string, number> {\n return this._columnIndexMap;\n }\n\n get rowIndexMap(): Map<string, number> {\n return this._rowIndexMap;\n }\n\n get hasSelection(): boolean {\n return this.selectedRange !== null;\n }\n\n isCellFocused(rowId: string, field: string): boolean {\n const cell = this._fsm.context.focusedCell;\n if (!cell) {\n return false;\n }\n return cell.rowId === rowId && cell.field === field;\n }\n\n isCellAnchor(rowId: string, field: string): boolean {\n const cell = this._fsm.context.anchorCell;\n if (!cell) {\n return false;\n }\n return cell.rowId === rowId && cell.field === field;\n }\n\n isCellEditing(rowId: string, field: string): boolean {\n return this._fsm.matches('editing') && this.isCellFocused(rowId, field);\n }\n\n isCellInSelection(rowId: string, field: string): boolean {\n const range = this.selectedRange;\n if (!range) {\n return false;\n }\n const colIndex = this._columnIndexMap.get(field);\n const rowIndex = this._rowIndexMap.get(rowId);\n if (colIndex === undefined || rowIndex === undefined) {\n return false;\n }\n return (\n colIndex >= range.startCol &&\n colIndex <= range.endCol &&\n rowIndex >= range.startRow &&\n rowIndex <= range.endRow\n );\n }\n\n getCellSelectionEdges(rowId: string, field: string): SelectionEdges | null {\n const range = this.selectedRange;\n if (!range) {\n return null;\n }\n const colIndex = this._columnIndexMap.get(field);\n const rowIndex = this._rowIndexMap.get(rowId);\n if (colIndex === undefined || rowIndex === undefined) {\n return null;\n }\n if (\n colIndex < range.startCol ||\n colIndex > range.endCol ||\n rowIndex < range.startRow ||\n rowIndex > range.endRow\n ) {\n return null;\n }\n return {\n top: rowIndex === range.startRow,\n bottom: rowIndex === range.endRow,\n left: colIndex === range.startCol,\n right: colIndex === range.endCol,\n };\n }\n\n get selectedRange(): SelectedRange | null {\n const ctx = this._fsm.context;\n if (!ctx.anchorCell || !ctx.focusedCell) {\n return null;\n }\n if (\n ctx.anchorCell.rowId === ctx.focusedCell.rowId &&\n ctx.anchorCell.field === ctx.focusedCell.field\n ) {\n return null;\n }\n const anchorCol = this._columnIndexMap.get(ctx.anchorCell.field);\n const anchorRow = this._rowIndexMap.get(ctx.anchorCell.rowId);\n const focusCol = this._columnIndexMap.get(ctx.focusedCell.field);\n const focusRow = this._rowIndexMap.get(ctx.focusedCell.rowId);\n if (\n anchorCol === undefined ||\n anchorRow === undefined ||\n focusCol === undefined ||\n focusRow === undefined\n ) {\n return null;\n }\n return {\n startCol: Math.min(anchorCol, focusCol),\n endCol: Math.max(anchorCol, focusCol),\n startRow: Math.min(anchorRow, focusRow),\n endRow: Math.max(anchorRow, focusRow),\n };\n }\n\n getSelectedRange(): SelectedRange | null {\n return this.selectedRange;\n }\n\n setNavigationContext(columns: string[], rowIds: string[]): void {\n Object.assign(this._fsm.context, { columns, rowIds });\n this._columnIndexMap = buildIndexMap(columns);\n this._rowIndexMap = buildIndexMap(rowIds);\n }\n\n updateNavigationContext(columns: string[], rowIds: string[]): void {\n const ctx = this._fsm.context;\n const focused = ctx.focusedCell;\n\n ctx.columns = columns;\n ctx.rowIds = rowIds;\n ctx.navigationVersion++;\n this._columnIndexMap = buildIndexMap(columns);\n this._rowIndexMap = buildIndexMap(rowIds);\n\n if (!focused) {\n return;\n }\n\n const stillValid =\n this._columnIndexMap.has(focused.field) &&\n this._rowIndexMap.has(focused.rowId);\n\n if (stillValid) {\n ctx.anchorCell = null;\n } else {\n this.blur();\n }\n }\n\n focusCell(cell: CellAddress): void {\n this._fsm.context._pendingCell = cell;\n this._fsm.dispatch('FOCUS');\n }\n\n blur(): void {\n this._fsm.dispatch('BLUR');\n }\n\n doubleClick(clickOffset?: number): void {\n this._fsm.context._pendingTrigger = { type: 'doubleClick', clickOffset };\n this._fsm.dispatch('DOUBLE_CLICK');\n }\n\n enterEdit(): void {\n this._fsm.dispatch('ENTER');\n }\n\n typeChar(char: string): void {\n this._fsm.context._pendingTrigger = { type: 'char', char };\n this._fsm.dispatch('TYPE_CHAR');\n }\n\n commit(): void {\n this._fsm.dispatch('COMMIT');\n }\n\n commitAndMoveDown(): void {\n this._fsm.dispatch('COMMIT_MOVE_DOWN');\n }\n\n cancel(): void {\n this._fsm.dispatch('CANCEL');\n }\n\n moveUp(): void {\n this._fsm.dispatch('MOVE_UP');\n }\n\n moveDown(): void {\n this._fsm.dispatch('MOVE_DOWN');\n }\n\n moveLeft(): void {\n this._fsm.dispatch('MOVE_LEFT');\n }\n\n moveRight(): void {\n this._fsm.dispatch('MOVE_RIGHT');\n }\n\n handleTab(shift: boolean): void {\n this._fsm.context._pendingShift = shift;\n this._fsm.dispatch('TAB');\n }\n\n selectTo(cell: CellAddress): void {\n this._fsm.context._pendingCell = cell;\n this._fsm.dispatch('SELECT_TO');\n }\n\n shiftMoveUp(): void {\n this._fsm.dispatch('SHIFT_MOVE_UP');\n }\n\n shiftMoveDown(): void {\n this._fsm.dispatch('SHIFT_MOVE_DOWN');\n }\n\n shiftMoveLeft(): void {\n this._fsm.dispatch('SHIFT_MOVE_LEFT');\n }\n\n shiftMoveRight(): void {\n this._fsm.dispatch('SHIFT_MOVE_RIGHT');\n }\n\n dragStart(cell: CellAddress): void {\n this._fsm.context._pendingCell = cell;\n this._fsm.dispatch('DRAG_START');\n }\n\n dragExtend(cell: CellAddress): void {\n this._fsm.context._pendingCell = cell;\n this._fsm.dispatch('DRAG_EXTEND');\n }\n\n dispose(): void {\n this._fsm.dispose();\n }\n}\n","import { comparer, computed, makeAutoObservable } from 'mobx';\nimport type { RowModel } from '@revisium/schema-toolkit';\nimport type { ColumnSpec } from '../../Columns/model/types.js';\nimport { FilterFieldType } from '../../shared/field-types.js';\nimport type { CellFSM, EditTrigger, SelectionEdges } from './CellFSM.js';\n\nexport type CellCommitCallback = (\n rowId: string,\n field: string,\n value: unknown,\n previousValue?: unknown,\n) => void;\n\nexport class CellVM {\n private readonly _rowModel: RowModel;\n private readonly _column: ColumnSpec;\n private readonly _rowId: string;\n private readonly _cellFSM: CellFSM;\n private readonly _onCommit: CellCommitCallback | null;\n private readonly _systemValues: Record<string, unknown> | null;\n\n constructor(\n rowModel: RowModel,\n column: ColumnSpec,\n rowId: string,\n cellFSM: CellFSM,\n onCommit?: CellCommitCallback,\n systemValues?: Record<string, unknown>,\n ) {\n this._rowModel = rowModel;\n this._column = column;\n this._rowId = rowId;\n this._cellFSM = cellFSM;\n this._onCommit = onCommit ?? null;\n this._systemValues = systemValues ?? null;\n makeAutoObservable(\n this,\n {\n selectionEdges: computed({ equals: comparer.structural }),\n },\n { autoBind: true },\n );\n }\n\n // --- Data Getters ---\n\n get field(): string {\n return this._column.field;\n }\n\n get jsonPath(): string {\n return `${this._rowId}/${this._column.field}`;\n }\n\n get column(): ColumnSpec {\n return this._column;\n }\n\n get rowId(): string {\n return this._rowId;\n }\n\n get value(): unknown {\n if (this._systemValues) {\n return this._systemValues[this._column.field];\n }\n const node = this._getNode();\n if (!node) {\n return undefined;\n }\n return node.getPlainValue();\n }\n\n get displayValue(): string {\n const val = this.value;\n if (val === null || val === undefined) {\n return '';\n }\n if (typeof val === 'boolean') {\n return String(val);\n }\n if (typeof val === 'number') {\n return String(val);\n }\n if (typeof val === 'string') {\n return val;\n }\n if (Array.isArray(val)) {\n return `[${val.length}]`;\n }\n if (typeof val === 'object') {\n const obj = val as Record<string, unknown>;\n if (typeof obj.fileName === 'string' && obj.fileName) {\n return obj.fileName;\n }\n if (this._column.fieldType === FilterFieldType.File) {\n return '';\n }\n return '{...}';\n }\n return '';\n }\n\n get isReadOnly(): boolean {\n if (this._systemValues) {\n return true;\n }\n if (this._column.fieldType === FilterFieldType.File) {\n const fileNameNode = this._getFileNameNode();\n if (!fileNameNode?.isPrimitive()) {\n return true;\n }\n return fileNameNode.isReadOnly;\n }\n const node = this._getNode();\n if (!node) {\n return true;\n }\n if (node.isPrimitive()) {\n return node.isReadOnly;\n }\n return true;\n }\n\n get foreignKeyTableId(): string | undefined {\n return this._column.foreignKeyTableId;\n }\n\n get fileData(): {\n status: string;\n fileId: string;\n url: string;\n fileName: string;\n mimeType: string;\n width: number;\n height: number;\n } | null {\n if (this._column.fieldType !== FilterFieldType.File) {\n return null;\n }\n const val = this.value;\n if (!val || typeof val !== 'object' || Array.isArray(val)) {\n return null;\n }\n const obj = val as Record<string, unknown>;\n return {\n status: (obj.status as string) ?? '',\n fileId: (obj.fileId as string) ?? '',\n url: (obj.url as string) ?? '',\n fileName: (obj.fileName as string) ?? '',\n mimeType: (obj.mimeType as string) ?? '',\n width: typeof obj.width === 'number' ? obj.width : 0,\n height: typeof obj.height === 'number' ? obj.height : 0,\n };\n }\n\n get isEditable(): boolean {\n if (this._systemValues) {\n return false;\n }\n if (this.isReadOnly) {\n return false;\n }\n if (this._column.fieldType === FilterFieldType.File) {\n return this._getFileNameNode() !== undefined;\n }\n const node = this._getNode();\n if (!node) {\n return false;\n }\n return node.isPrimitive();\n }\n\n // --- FSM State ---\n\n get isFocused(): boolean {\n return this._cellFSM.isCellFocused(this._rowId, this._column.field);\n }\n\n get isEditing(): boolean {\n return this._cellFSM.isCellEditing(this._rowId, this._column.field);\n }\n\n get isAnchor(): boolean {\n return this._cellFSM.isCellAnchor(this._rowId, this._column.field);\n }\n\n get isInSelection(): boolean {\n return this._cellFSM.isCellInSelection(this._rowId, this._column.field);\n }\n\n get selectionEdges(): SelectionEdges | null {\n return this._cellFSM.getCellSelectionEdges(this._rowId, this._column.field);\n }\n\n get hasRangeSelection(): boolean {\n return this._cellFSM.hasSelection;\n }\n\n get navigationVersion(): number {\n return this._cellFSM.navigationVersion;\n }\n\n get editTrigger(): EditTrigger | null {\n if (!this.isEditing) {\n return null;\n }\n return this._cellFSM.editTrigger;\n }\n\n // --- Edit Lifecycle ---\n\n focus(): void {\n this._cellFSM.focusCell({\n rowId: this._rowId,\n field: this._column.field,\n });\n }\n\n startEdit(): void {\n if (!this.isEditable) {\n return;\n }\n this.focus();\n this._cellFSM.enterEdit();\n }\n\n startEditWithChar(char: string): void {\n if (!this.isEditable) {\n return;\n }\n this.focus();\n this._cellFSM.typeChar(char);\n }\n\n startEditWithDoubleClick(clickOffset?: number): void {\n if (!this.isEditable) {\n return;\n }\n this.focus();\n this._cellFSM.doubleClick(clickOffset);\n }\n\n commitEdit(newValue: unknown): void {\n if (this._column.fieldType === FilterFieldType.File) {\n this._commitFileNameEdit(newValue as string);\n this._cellFSM.commit();\n return;\n }\n const node = this._getNode();\n const previousValue = node?.getPlainValue();\n if (node?.isPrimitive()) {\n node.setValue(newValue);\n }\n this._cellFSM.commit();\n this._onCommit?.(this._rowId, this._column.field, newValue, previousValue);\n }\n\n commitEditAndMoveDown(newValue?: unknown): void {\n if (\n this._column.fieldType === FilterFieldType.File &&\n newValue !== undefined\n ) {\n this._commitFileNameEdit(newValue as string);\n this._cellFSM.commitAndMoveDown();\n return;\n }\n let previousValue: unknown;\n if (newValue !== undefined) {\n const node = this._getNode();\n previousValue = node?.getPlainValue();\n if (node?.isPrimitive()) {\n node.setValue(newValue);\n }\n }\n this._cellFSM.commitAndMoveDown();\n if (newValue !== undefined) {\n this._onCommit?.(\n this._rowId,\n this._column.field,\n newValue,\n previousValue,\n );\n }\n }\n\n cancelEdit(): void {\n this._cellFSM.cancel();\n }\n\n commitFileUpload(result: Record<string, unknown>): void {\n const node = this._getNode();\n if (!node?.isObject()) {\n return;\n }\n const previousValue = node.getPlainValue();\n node.setValue(result, { internal: true });\n this._onCommit?.(this._rowId, this._column.field, result, previousValue);\n }\n\n // --- Cell Operations ---\n\n clearToDefault(): void {\n const node = this._getNode();\n if (!node || !node.isPrimitive() || node.isReadOnly) {\n return;\n }\n const previousValue = node.getPlainValue();\n const defaultValue = node.defaultValue;\n node.setValue(defaultValue);\n this._onCommit?.(\n this._rowId,\n this._column.field,\n defaultValue,\n previousValue,\n );\n }\n\n async copyToClipboard(): Promise<void> {\n try {\n await navigator.clipboard.writeText(this.displayValue);\n } catch {\n /* clipboard unavailable or permission denied */\n }\n }\n\n async pasteFromClipboard(): Promise<void> {\n if (!this.isEditable) {\n return;\n }\n try {\n const text = await navigator.clipboard.readText();\n this.applyPastedText(text);\n } catch {\n /* clipboard unavailable or permission denied */\n }\n }\n\n applyPastedText(text: string): void {\n const node = this._getNode();\n if (!node?.isPrimitive()) {\n return;\n }\n const previousValue = node.getPlainValue();\n const nodeType = typeof previousValue;\n if (nodeType === 'string') {\n this._applyPastedString(node, text);\n } else if (nodeType === 'number') {\n this._applyPastedNumber(node, text);\n } else if (nodeType === 'boolean') {\n this._applyPastedBoolean(node, text);\n }\n const newValue = node.getPlainValue();\n if (newValue !== previousValue) {\n this._onCommit?.(\n this._rowId,\n this._column.field,\n newValue,\n previousValue,\n );\n }\n }\n\n notifyReadonlyEditAttempt(): void {\n this._cellFSM.notifyReadonlyEditAttempt();\n }\n\n // --- Navigation ---\n\n blur(): void {\n this._cellFSM.blur();\n }\n\n moveUp(): void {\n this._cellFSM.moveUp();\n }\n\n moveDown(): void {\n this._cellFSM.moveDown();\n }\n\n moveLeft(): void {\n this._cellFSM.moveLeft();\n }\n\n moveRight(): void {\n this._cellFSM.moveRight();\n }\n\n handleTab(shift: boolean): void {\n this._cellFSM.handleTab(shift);\n }\n\n // --- Selection ---\n\n selectTo(): void {\n this._cellFSM.selectTo({ rowId: this._rowId, field: this._column.field });\n }\n\n shiftMoveUp(): void {\n this._cellFSM.shiftMoveUp();\n }\n\n shiftMoveDown(): void {\n this._cellFSM.shiftMoveDown();\n }\n\n shiftMoveLeft(): void {\n this._cellFSM.shiftMoveLeft();\n }\n\n shiftMoveRight(): void {\n this._cellFSM.shiftMoveRight();\n }\n\n // --- Drag ---\n\n dragStart(): void {\n this._cellFSM.dragStart({ rowId: this._rowId, field: this._column.field });\n }\n\n dragExtend(): void {\n this._cellFSM.dragExtend({ rowId: this._rowId, field: this._column.field });\n }\n\n // --- Private ---\n\n private _getNode() {\n return this._rowModel.get(this._column.field);\n }\n\n private _getFileNameNode() {\n return this._rowModel.get(`${this._column.field}.fileName`);\n }\n\n private _commitFileNameEdit(newFileName: string): void {\n const fileNameNode = this._getFileNameNode();\n if (!fileNameNode?.isPrimitive()) {\n return;\n }\n const objectNode = this._getNode();\n if (!objectNode) {\n return;\n }\n const previousValue = objectNode.getPlainValue();\n fileNameNode.setValue(newFileName);\n const newValue = objectNode.getPlainValue();\n this._onCommit?.(this._rowId, this._column.field, newValue, previousValue);\n }\n\n private _applyPastedString(\n node: ReturnType<RowModel['get']> & { setValue(v: unknown): void },\n text: string,\n ): void {\n let trimmed = text;\n while (trimmed.endsWith('\\n')) {\n trimmed = trimmed.slice(0, -1);\n }\n if (trimmed !== this.displayValue) {\n node.setValue(trimmed);\n }\n }\n\n private _applyPastedNumber(\n node: ReturnType<RowModel['get']> & { setValue(v: unknown): void },\n text: string,\n ): void {\n const parsed = Number(text);\n if (!Number.isNaN(parsed) && String(parsed) !== this.displayValue) {\n node.setValue(parsed);\n }\n }\n\n private _applyPastedBoolean(\n node: ReturnType<RowModel['get']> & { setValue(v: unknown): void },\n text: string,\n ): void {\n const lower = text.trim().toLowerCase();\n if (lower === 'true' || lower === 'false') {\n const value = lower === 'true';\n if (String(value) !== this.displayValue) {\n node.setValue(value);\n }\n }\n }\n}\n","import { makeAutoObservable } from 'mobx';\nimport type { RowModel } from '@revisium/schema-toolkit';\nimport type { ColumnSpec } from '../../Columns/model/types.js';\nimport type { CellFSM } from './CellFSM.js';\nimport type { SelectionModel } from './SelectionModel.js';\nimport { CellVM, type CellCommitCallback } from './CellVM.js';\n\nexport class RowVM {\n private readonly _rowModel: RowModel;\n private readonly _rowId: string;\n private readonly _cellFSM: CellFSM;\n private readonly _selection: SelectionModel;\n private readonly _onCellCommit: CellCommitCallback | null;\n private readonly _systemValues: Record<string, unknown>;\n private readonly _cellCache = new Map<string, CellVM>();\n\n constructor(\n rowModel: RowModel,\n rowId: string,\n cellFSM: CellFSM,\n selection: SelectionModel,\n onCellCommit?: CellCommitCallback,\n systemValues?: Record<string, unknown>,\n ) {\n this._rowModel = rowModel;\n this._rowId = rowId;\n this._cellFSM = cellFSM;\n this._selection = selection;\n this._onCellCommit = onCellCommit ?? null;\n this._systemValues = systemValues ?? {};\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get rowId(): string {\n return this._rowId;\n }\n\n get rowModel(): RowModel {\n return this._rowModel;\n }\n\n get isSelected(): boolean {\n return this._selection.isSelected(this._rowId);\n }\n\n toggleSelection(): void {\n this._selection.toggle(this._rowId);\n }\n\n getCellVM(column: ColumnSpec): CellVM {\n const cached = this._cellCache.get(column.field);\n if (cached) {\n return cached;\n }\n const cell = new CellVM(\n this._rowModel,\n column,\n this._rowId,\n this._cellFSM,\n this._onCellCommit ?? undefined,\n column.isSystem ? this._systemValues : undefined,\n );\n this._cellCache.set(column.field, cell);\n return cell;\n }\n\n dispose(): void {\n this._cellCache.clear();\n }\n}\n","export const CELL_HEIGHT = 40;\nexport const LINE_HEIGHT = 20;\nexport const VERTICAL_PADDING = (CELL_HEIGHT - LINE_HEIGHT) / 2;\nconst CARET_Y_OFFSET = VERTICAL_PADDING;\n\nexport interface CellPosition {\n top: number;\n left: number;\n width: number;\n}\n\nexport function getClickOffset(\n textElement: HTMLElement | null,\n displayValue: string,\n clientX: number,\n): number {\n if (!textElement || !displayValue) {\n return displayValue.length;\n }\n\n const textNode = textElement.firstChild;\n if (textNode?.nodeType !== Node.TEXT_NODE) {\n return displayValue.length;\n }\n\n const y = textElement.getBoundingClientRect().top + CARET_Y_OFFSET;\n\n if (document.caretPositionFromPoint) {\n const pos = document.caretPositionFromPoint(clientX, y);\n if (pos?.offsetNode === textNode) {\n return pos.offset;\n }\n }\n\n const rect = textElement.getBoundingClientRect();\n const clickX = clientX - rect.left;\n const textWidth = textElement.scrollWidth;\n const charWidth = textWidth / displayValue.length;\n return Math.max(\n 0,\n Math.min(displayValue.length, Math.round(clickX / charWidth)),\n );\n}\n\nexport function resolveCursorPosition(\n appendChar: string | undefined,\n appendLength: number,\n clickOffset: number | undefined,\n valueLength: number,\n): number {\n if (appendChar !== undefined) {\n return appendLength;\n }\n if (clickOffset !== undefined) {\n return Math.min(clickOffset, valueLength);\n }\n return valueLength;\n}\n","import { Portal, Textarea } from '@chakra-ui/react';\nimport { FC, useCallback, useLayoutEffect, useRef, useState } from 'react';\nimport {\n CELL_HEIGHT,\n type CellPosition,\n LINE_HEIGHT,\n resolveCursorPosition,\n VERTICAL_PADDING,\n} from './cellEditorUtils.js';\n\ninterface CellTextareaEditorProps {\n value: string;\n position: CellPosition;\n clickOffset?: number;\n appendChar?: string;\n autoHeight?: boolean;\n allowShiftEnter?: boolean;\n onCommit: (localValue: string) => void;\n onCommitEnter?: (localValue: string) => void;\n onCancel: () => void;\n testId: string;\n textAlign?: 'left' | 'right';\n}\n\nconst MAX_VISIBLE_LINES = 3;\nconst MAX_HEIGHT = MAX_VISIBLE_LINES * LINE_HEIGHT + VERTICAL_PADDING * 2;\n\nexport const CellTextareaEditor: FC<CellTextareaEditorProps> = ({\n value,\n position,\n clickOffset,\n appendChar,\n autoHeight = false,\n allowShiftEnter = false,\n onCommit,\n onCommitEnter,\n onCancel,\n testId,\n textAlign = 'left',\n}) => {\n const initialValue = appendChar ?? value;\n const [localValue, setLocalValue] = useState(initialValue);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const savedRef = useRef(false);\n\n useLayoutEffect(() => {\n if (textareaRef.current) {\n textareaRef.current.focus();\n const cursorPos = resolveCursorPosition(\n appendChar,\n initialValue.length,\n clickOffset,\n value.length,\n );\n textareaRef.current.setSelectionRange(cursorPos, cursorPos);\n }\n }, [clickOffset, value.length, appendChar, initialValue.length]);\n\n useLayoutEffect(() => {\n if (autoHeight && textareaRef.current) {\n textareaRef.current.style.height = `${CELL_HEIGHT}px`;\n const scrollHeight = textareaRef.current.scrollHeight;\n if (scrollHeight > CELL_HEIGHT) {\n textareaRef.current.style.height = `${Math.min(scrollHeight, MAX_HEIGHT)}px`;\n }\n }\n }, [autoHeight, localValue]);\n\n const handleCommit = useCallback(() => {\n if (savedRef.current) {\n return;\n }\n savedRef.current = true;\n onCommit(localValue);\n }, [localValue, onCommit]);\n\n const handleCommitEnter = useCallback(() => {\n if (savedRef.current) {\n return;\n }\n savedRef.current = true;\n if (onCommitEnter) {\n onCommitEnter(localValue);\n } else {\n onCommit(localValue);\n }\n }, [localValue, onCommit, onCommitEnter]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n savedRef.current = true;\n onCancel();\n return;\n }\n if (e.key === 'Enter') {\n if (allowShiftEnter && e.shiftKey) {\n return;\n }\n e.preventDefault();\n handleCommitEnter();\n }\n },\n [handleCommitEnter, onCancel, allowShiftEnter],\n );\n\n const handleBlur = useCallback(() => {\n handleCommit();\n }, [handleCommit]);\n\n return (\n <Portal>\n <Textarea\n ref={textareaRef}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n position=\"fixed\"\n top={`${position.top}px`}\n left={`${position.left}px`}\n width={`${position.width}px`}\n minWidth={`${position.width}px`}\n height={`${CELL_HEIGHT}px`}\n minHeight={`${CELL_HEIGHT}px`}\n zIndex={9999}\n bg=\"white\"\n borderRadius=\"0\"\n border=\"none\"\n outline=\"2px solid\"\n outlineColor=\"blue.500\"\n outlineOffset=\"-2px\"\n px=\"8px\"\n py={`${VERTICAL_PADDING}px`}\n m={0}\n fontFamily=\"inherit\"\n fontSize=\"inherit\"\n fontWeight=\"300\"\n textAlign={textAlign}\n lineHeight={`${LINE_HEIGHT}px`}\n resize=\"both\"\n overflow=\"auto\"\n boxShadow=\"0 4px 12px rgba(0,0,0,0.15)\"\n _focus={{\n outline: '2px solid',\n outlineColor: 'blue.500',\n outlineOffset: '-2px',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n }}\n data-testid={testId}\n />\n </Portal>\n );\n};\n","import { createContext } from 'react';\n\nexport interface CellContextActions {\n copyRange: () => void;\n pasteRange: () => void;\n clearRange: () => void;\n}\n\nexport const CellContextActionsContext =\n createContext<CellContextActions | null>(null);\n","import { useContext } from 'react';\nimport { Box, Kbd, Menu, Portal } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellContextActionsContext } from './CellContextActionsContext.js';\n\ninterface CellContextMenuProps {\n cell: CellVM;\n onEditPointerDown?: () => void;\n}\n\nexport const CellContextMenu = observer(\n ({ cell, onEditPointerDown }: CellContextMenuProps) => {\n const ctx = useContext(CellContextActionsContext);\n const hasRange = cell.hasRangeSelection;\n\n const handleCopyValue = () => {\n void cell.copyToClipboard();\n };\n\n const handleCopyJsonPath = () => {\n void navigator.clipboard.writeText(cell.jsonPath);\n };\n\n const handlePaste = () => {\n void cell.pasteFromClipboard();\n };\n\n const handleClear = () => {\n cell.clearToDefault();\n };\n\n const handleCopyRange = () => {\n ctx?.copyRange();\n };\n\n const handlePasteRange = () => {\n ctx?.pasteRange();\n };\n\n const handleClearRange = () => {\n ctx?.clearRange();\n };\n\n return (\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"180px\">\n {hasRange && ctx ? (\n <>\n <Menu.Item value=\"copy-range\" onClick={handleCopyRange}>\n <Box flex=\"1\">Copy</Box>\n <Kbd size=\"sm\">⌘C</Kbd>\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item value=\"paste-range\" onClick={handlePasteRange}>\n <Box flex=\"1\">Paste</Box>\n <Kbd size=\"sm\">⌘V</Kbd>\n </Menu.Item>\n <Menu.Item value=\"clear-range\" onClick={handleClearRange}>\n <Box flex=\"1\">Clear</Box>\n <Kbd size=\"sm\">Del</Kbd>\n </Menu.Item>\n </>\n ) : (\n <>\n <Menu.Item value=\"copy-value\" onClick={handleCopyValue}>\n <Box flex=\"1\">Copy value</Box>\n <Kbd size=\"sm\">⌘C</Kbd>\n </Menu.Item>\n <Menu.Item value=\"copy-json-path\" onClick={handleCopyJsonPath}>\n Copy JSON path\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item\n value=\"edit\"\n disabled={!cell.isEditable}\n onPointerDown={onEditPointerDown}\n >\n <Box flex=\"1\">Edit</Box>\n <Kbd size=\"sm\">Enter</Kbd>\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item\n value=\"paste\"\n onClick={handlePaste}\n disabled={cell.isReadOnly}\n >\n <Box flex=\"1\">Paste</Box>\n <Kbd size=\"sm\">⌘V</Kbd>\n </Menu.Item>\n <Menu.Item\n value=\"clear\"\n onClick={handleClear}\n disabled={cell.isReadOnly}\n >\n Clear\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n );\n },\n);\n","import type { CellVM } from '../../model/CellVM.js';\n\nexport type CellState =\n | 'display'\n | 'focused'\n | 'editing'\n | 'readonly'\n | 'readonlyFocused'\n | 'selected';\n\nexport const SELECTION_BORDER_COLOR = '#3b82f6';\n\nexport function getCellState(cell: CellVM): CellState {\n if (cell.isReadOnly) {\n if (cell.isFocused && !cell.isInSelection) {\n return 'readonlyFocused';\n }\n if (cell.isInSelection) {\n return 'selected';\n }\n return 'readonly';\n }\n if (cell.isEditing) {\n return 'editing';\n }\n if (cell.isFocused && !cell.isInSelection) {\n return 'focused';\n }\n if (cell.isInSelection) {\n return 'selected';\n }\n return 'display';\n}\n\nexport function isPrintableKey(e: React.KeyboardEvent): boolean {\n if (e.ctrlKey || e.metaKey || e.altKey) {\n return false;\n }\n return e.key.length === 1;\n}\n","import type { SelectionEdges } from '../../model/CellFSM.js';\nimport { SELECTION_BORDER_COLOR, type CellState } from './cellStyles.js';\n\nconst CLS = 'cw';\nconst CLS_DISPLAY = `${CLS} cw-display`;\nconst CLS_READONLY = `${CLS} cw-readonly`;\nconst CLS_FOCUSED = `${CLS} cw-focused`;\nconst CLS_EDITING = `${CLS} cw-editing`;\nconst CLS_READONLY_FOCUSED = `${CLS} cw-readonlyFocused`;\nconst CLS_SELECTED = `${CLS} cw-selected`;\n\nexport const CLS_ANCHOR = 'cw-anchor';\n\nexport const STATE_CLASS: Record<CellState, string> = {\n display: CLS_DISPLAY,\n readonly: CLS_READONLY,\n focused: CLS_FOCUSED,\n editing: CLS_EDITING,\n readonlyFocused: CLS_READONLY_FOCUSED,\n selected: CLS_SELECTED,\n};\n\nconst CELL_STYLE_ID = 'cell-wrapper-styles';\n\nexport function ensureCellStyles(): void {\n if (typeof document === 'undefined') {\n return;\n }\n if (document.getElementById(CELL_STYLE_ID)) {\n return;\n }\n const style = document.createElement('style');\n style.id = CELL_STYLE_ID;\n style.textContent = [\n '.cw{height:40px;padding:0 8px;position:relative;overflow:hidden;cursor:cell;box-shadow:var(--cw-shadow,none)}',\n '.cw:focus,.cw:focus-visible{outline:none;box-shadow:var(--cw-shadow,none)}',\n '.cw-display:hover,.cw-readonly:hover{background-color:var(--chakra-colors-gray-50);box-shadow:inset 0 -1px 0 0 #ededed}',\n '.cw-focused{background-color:var(--chakra-colors-blue-50)}',\n '.cw-focused::before,.cw-editing::before,.cw-readonlyFocused::before,.cw-anchor::before{content:\"\";position:absolute;inset:1px;border-radius:1px;pointer-events:none}',\n '.cw-focused::before{border:2px solid var(--chakra-colors-blue-400)}',\n '.cw-editing{cursor:text;background-color:white;z-index:1}',\n '.cw-editing::before{border:2px solid var(--chakra-colors-blue-500)}',\n '.cw-readonlyFocused{background-color:var(--chakra-colors-gray-50)}',\n '.cw-readonlyFocused::before{border:2px solid var(--chakra-colors-gray-400)}',\n '.cw-selected{background-color:var(--chakra-colors-blue-100);user-select:none}',\n '.cw-anchor::before{border:2px solid var(--chakra-colors-blue-400)}',\n ].join('');\n document.head.appendChild(style);\n}\n\nexport const INNER_STYLE: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n height: '100%',\n width: '100%',\n minWidth: 0,\n overflow: 'hidden',\n};\n\nexport function buildSelectionBoxShadow(edges: SelectionEdges): string | null {\n const shadows: string[] = [];\n if (edges.top) {\n shadows.push(`inset 0 2px 0 0 ${SELECTION_BORDER_COLOR}`);\n }\n if (edges.bottom) {\n shadows.push(`inset 0 -2px 0 0 ${SELECTION_BORDER_COLOR}`);\n }\n if (edges.left) {\n shadows.push(`inset 2px 0 0 0 ${SELECTION_BORDER_COLOR}`);\n }\n if (edges.right) {\n shadows.push(`inset -2px 0 0 0 ${SELECTION_BORDER_COLOR}`);\n }\n return shadows.length > 0 ? shadows.join(', ') : null;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\n\ninterface PendingContextMenu {\n target: HTMLElement;\n clientX: number;\n clientY: number;\n}\n\nlet pendingContextMenu: PendingContextMenu | null = null;\n\nexport function clearPendingContextMenu(): PendingContextMenu | null {\n const pending = pendingContextMenu;\n pendingContextMenu = null;\n return pending;\n}\n\nexport function setPendingContextMenu(value: PendingContextMenu): void {\n pendingContextMenu = value;\n}\n\ntype OpenMenuFn = (clientX: number, clientY: number) => void;\nexport const cellMenuRegistry = new WeakMap<HTMLElement, OpenMenuFn>();\n\nexport function useCellContextMenu(\n cell: CellVM,\n cellRef: React.RefObject<HTMLDivElement | null>,\n deferredEdit: { triggerIfRequested: () => boolean },\n): {\n menuAnchor: DOMRect | null;\n menuOpen: boolean;\n openContextMenuAt: (clientX: number, clientY: number) => void;\n handleMenuClose: () => void;\n menuCloseRef: React.RefObject<(() => void) | null>;\n} {\n const [menuAnchor, setMenuAnchor] = useState<DOMRect | null>(null);\n const menuOpen = menuAnchor !== null;\n\n const openContextMenuAt = useCallback(\n (clientX: number, clientY: number) => {\n if (!cell.isFocused && !cell.isInSelection) {\n cell.focus();\n }\n const rect = new DOMRect(clientX, clientY, 0, 0);\n setMenuAnchor(rect);\n },\n [cell],\n );\n\n useEffect(() => {\n const el = cellRef.current;\n if (el) {\n cellMenuRegistry.set(el, openContextMenuAt);\n }\n return () => {\n if (el) {\n cellMenuRegistry.delete(el);\n }\n };\n }, [cellRef, openContextMenuAt]);\n\n const menuCloseRef = useRef<(() => void) | null>(null);\n\n const handleMenuClose = useCallback(() => {\n const pending = clearPendingContextMenu();\n\n const didTriggerEdit = deferredEdit.triggerIfRequested();\n if (!pending && !didTriggerEdit && !cell.isEditing) {\n if (cell.isAnchor || (cell.isFocused && !cell.hasRangeSelection)) {\n cellRef.current?.focus();\n } else {\n const table = cellRef.current?.closest('[data-testid=\"table-widget\"]');\n const anchor = table?.querySelector<HTMLElement>(\n '[data-testid^=\"cell-\"][tabindex=\"0\"]',\n );\n anchor?.focus();\n }\n }\n setMenuAnchor(null);\n\n if (pending) {\n const openFn = cellMenuRegistry.get(pending.target);\n if (openFn) {\n setTimeout(() => {\n openFn(pending.clientX, pending.clientY);\n }, 0);\n }\n }\n }, [cell, cellRef, deferredEdit]);\n\n menuCloseRef.current = handleMenuClose;\n\n return {\n menuAnchor,\n menuOpen,\n openContextMenuAt,\n handleMenuClose,\n menuCloseRef,\n };\n}\n","import { useEffect } from 'react';\nimport type { CellState } from './cellStyles.js';\n\nexport function useCellFocus(\n cellRef: React.RefObject<HTMLDivElement | null>,\n state: CellState,\n isAnchorInRange: boolean,\n navVersion: number,\n): void {\n useEffect(() => {\n if (!cellRef.current) {\n return;\n }\n if (state === 'focused' || state === 'readonlyFocused' || isAnchorInRange) {\n cellRef.current.focus();\n } else if (\n state === 'display' ||\n state === 'readonly' ||\n state === 'selected'\n ) {\n cellRef.current.blur();\n }\n }, [cellRef, state, isAnchorInRange, navVersion]);\n}\n","import { useCallback } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { isPrintableKey, type CellState } from './cellStyles.js';\n\nexport interface CellKeyboardCallbacks {\n onStartEdit?: () => void;\n onDoubleClick?: (clientX?: number) => void;\n onTypeChar?: (char: string) => void;\n onDelete?: () => void;\n}\n\nfunction handleArrowKey(\n cell: CellVM,\n e: React.KeyboardEvent,\n shiftAction: () => void,\n moveAction: () => void,\n): void {\n e.preventDefault();\n if (e.shiftKey) {\n shiftAction();\n } else if (cell.hasRangeSelection) {\n cell.focus();\n } else {\n moveAction();\n }\n}\n\nfunction handleEditableKeys(\n cell: CellVM,\n e: React.KeyboardEvent,\n callbacks: CellKeyboardCallbacks,\n): void {\n if (cell.isReadOnly) {\n if (\n e.key === 'Enter' ||\n e.key === 'Delete' ||\n e.key === 'Backspace' ||\n isPrintableKey(e)\n ) {\n e.preventDefault();\n cell.notifyReadonlyEditAttempt();\n }\n return;\n }\n const hasRange = cell.hasRangeSelection;\n if (!hasRange && e.key === 'Enter') {\n e.preventDefault();\n if (callbacks.onStartEdit) {\n callbacks.onStartEdit();\n } else if (callbacks.onDoubleClick) {\n callbacks.onDoubleClick();\n }\n } else if (\n !hasRange &&\n (e.key === 'Delete' || e.key === 'Backspace') &&\n callbacks.onDelete\n ) {\n e.preventDefault();\n callbacks.onDelete();\n } else if (isPrintableKey(e) && callbacks.onTypeChar) {\n e.preventDefault();\n callbacks.onTypeChar(e.key);\n }\n}\n\nexport function useCellKeyboard(\n cell: CellVM,\n state: CellState,\n isAnchorInRange: boolean,\n menuOpen: boolean,\n menuCloseRef: React.RefObject<(() => void) | null>,\n callbacks: CellKeyboardCallbacks,\n): {\n handleKeyDown: (e: React.KeyboardEvent) => void;\n handleDoubleClick: (e: React.MouseEvent) => void;\n} {\n const { onStartEdit, onDoubleClick, onTypeChar, onDelete } = callbacks;\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (menuOpen && e.key === 'Escape') {\n e.preventDefault();\n menuCloseRef.current?.();\n return;\n }\n\n const canHandle =\n state === 'focused' || state === 'readonlyFocused' || isAnchorInRange;\n if (!canHandle) {\n return;\n }\n\n const isMod = e.ctrlKey || e.metaKey;\n if (isMod && e.key === 'c' && !cell.hasRangeSelection) {\n e.preventDefault();\n void cell.copyToClipboard();\n return;\n }\n if (isMod && e.key === 'v') {\n return;\n }\n const arrowActions: Record<string, [() => void, () => void]> = {\n ArrowUp: [cell.shiftMoveUp, cell.moveUp],\n ArrowDown: [cell.shiftMoveDown, cell.moveDown],\n ArrowLeft: [cell.shiftMoveLeft, cell.moveLeft],\n ArrowRight: [cell.shiftMoveRight, cell.moveRight],\n };\n const arrow = arrowActions[e.key];\n if (e.key === 'Escape') {\n e.preventDefault();\n if (cell.hasRangeSelection) {\n cell.focus();\n } else {\n cell.blur();\n }\n } else if (arrow) {\n handleArrowKey(cell, e, arrow[0], arrow[1]);\n } else if (e.key === 'Tab') {\n e.preventDefault();\n cell.handleTab(e.shiftKey);\n } else {\n handleEditableKeys(cell, e, {\n onStartEdit,\n onDoubleClick,\n onTypeChar,\n onDelete,\n });\n }\n },\n [\n state,\n cell,\n isAnchorInRange,\n menuOpen,\n menuCloseRef,\n onStartEdit,\n onDoubleClick,\n onTypeChar,\n onDelete,\n ],\n );\n\n const handleDoubleClick = useCallback(\n (e: React.MouseEvent) => {\n if (state === 'readonly' || state === 'readonlyFocused') {\n cell.notifyReadonlyEditAttempt();\n return;\n }\n onDoubleClick?.(e.clientX);\n },\n [state, cell, onDoubleClick],\n );\n\n return { handleKeyDown, handleDoubleClick };\n}\n","import { useCallback, useEffect, useRef } from 'react';\n\n/**\n * Defers the edit action until after the browser has fully settled\n * following a context menu close.\n *\n * Problem: when clicking \"Edit\" in a Chakra context menu, the menu\n * close triggers DOM cleanup (portal removal, focus-restore microtasks\n * from zag-js) that can race with the textarea editor mount. If the\n * textarea mounts and receives focus before the cleanup finishes,\n * the cleanup steals focus → textarea blur → cancelEdit.\n *\n * Solution: defer startEdit via requestAnimationFrame + setTimeout(0)\n * to ensure it runs after microtasks, React commit, and browser paint.\n */\nexport function useDeferredMenuEdit(editFn: (() => void) | undefined): {\n requestEdit: () => void;\n triggerIfRequested: () => boolean;\n} {\n const requestedRef = useRef(false);\n const rafRef = useRef<number | null>(null);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cleanup = useCallback(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n return cleanup;\n }, [cleanup]);\n\n const trigger = useCallback(() => {\n requestedRef.current = false;\n rafRef.current = null;\n timerRef.current = null;\n editFn?.();\n }, [editFn]);\n\n const requestEdit = useCallback(() => {\n requestedRef.current = true;\n }, []);\n\n const triggerIfRequested = useCallback(() => {\n if (!requestedRef.current) {\n return false;\n }\n cleanup();\n rafRef.current = requestAnimationFrame(() => {\n rafRef.current = null;\n timerRef.current = setTimeout(trigger, 0);\n });\n return true;\n }, [trigger, cleanup]);\n\n return { requestEdit, triggerIfRequested };\n}\n","import { Menu } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport {\n type CSSProperties,\n FC,\n PropsWithChildren,\n useCallback,\n useRef,\n} from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellContextMenu } from './CellContextMenu.js';\nimport {\n buildSelectionBoxShadow,\n CLS_ANCHOR,\n ensureCellStyles,\n INNER_STYLE,\n STATE_CLASS,\n} from './cellCss.js';\nimport { getCellState } from './cellStyles.js';\nimport {\n useCellContextMenu,\n setPendingContextMenu,\n} from './useCellContextMenu.js';\nimport { useCellFocus } from './useCellFocus.js';\nimport { useCellKeyboard } from './useCellKeyboard.js';\nimport { useDeferredMenuEdit } from './useDeferredMenuEdit.js';\n\ninterface CellWrapperProps extends PropsWithChildren {\n cell: CellVM;\n onDoubleClick?: (clientX?: number) => void;\n onStartEdit?: () => void;\n onTypeChar?: (char: string) => void;\n onDelete?: () => void;\n}\n\n// ───────────────── Context menu (lazy) ─────────────────\n\ninterface LazyMenuProps {\n cell: CellVM;\n cellRef: React.RefObject<HTMLDivElement | null>;\n anchorRect: DOMRect | null;\n onClose: () => void;\n onEditPointerDown: () => void;\n}\n\nconst LazyContextMenu: FC<LazyMenuProps> = observer(\n ({ cell, cellRef, anchorRect, onClose, onEditPointerDown }) => {\n const handleOpenChange = useCallback(\n (details: { open: boolean }) => {\n if (!details.open) {\n onClose();\n }\n },\n [onClose],\n );\n\n const handleInteractOutside = useCallback((e: Event) => {\n const ce = e as CustomEvent<{ originalEvent?: PointerEvent }>;\n const originalEvent = ce.detail?.originalEvent;\n if (!originalEvent || originalEvent.button !== 2) {\n return;\n }\n const target = originalEvent.target as HTMLElement | null;\n const targetCell = target?.closest(\n '[data-testid^=\"cell-\"]',\n ) as HTMLElement | null;\n if (targetCell) {\n setPendingContextMenu({\n target: targetCell,\n clientX: originalEvent.clientX,\n clientY: originalEvent.clientY,\n });\n }\n }, []);\n\n const getAnchorRect = useCallback(() => {\n return anchorRect ?? (cellRef.current?.getBoundingClientRect() || null);\n }, [anchorRect, cellRef]);\n\n return (\n <Menu.Root\n open\n onOpenChange={handleOpenChange}\n onInteractOutside={handleInteractOutside}\n positioning={{\n placement: 'bottom-start',\n getAnchorRect,\n }}\n >\n <CellContextMenu cell={cell} onEditPointerDown={onEditPointerDown} />\n </Menu.Root>\n );\n },\n);\n\n// ───────────────── Main component ─────────────────\n\nexport const CellWrapper: FC<CellWrapperProps> = observer(\n ({ cell, children, onDoubleClick, onStartEdit, onTypeChar, onDelete }) => {\n ensureCellStyles();\n\n const cellRef = useRef<HTMLDivElement>(null);\n const state = getCellState(cell);\n const selectionEdges = cell.selectionEdges;\n const isAnchorInRange = cell.isAnchor && cell.isInSelection;\n const navVersion = cell.navigationVersion;\n\n const isActive =\n state === 'focused' ||\n state === 'editing' ||\n state === 'readonlyFocused' ||\n isAnchorInRange;\n\n const editFn = onStartEdit ?? onDoubleClick;\n const deferredEdit = useDeferredMenuEdit(editFn);\n\n const {\n menuAnchor,\n menuOpen,\n openContextMenuAt,\n handleMenuClose,\n menuCloseRef,\n } = useCellContextMenu(cell, cellRef, deferredEdit);\n\n useCellFocus(cellRef, state, isAnchorInRange, navVersion);\n\n const { handleKeyDown, handleDoubleClick } = useCellKeyboard(\n cell,\n state,\n isAnchorInRange,\n menuOpen,\n menuCloseRef,\n { onStartEdit, onDoubleClick, onTypeChar, onDelete },\n );\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (\n e.detail === 2 &&\n state !== 'readonly' &&\n state !== 'readonlyFocused'\n ) {\n e.preventDefault();\n }\n if (e.button === 2) {\n openContextMenuAt(e.clientX, e.clientY);\n return;\n }\n if (!e.shiftKey && e.button === 0 && state !== 'editing') {\n e.preventDefault();\n cell.dragStart();\n cellRef.current?.focus();\n }\n },\n [state, cell, openContextMenuAt],\n );\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n if (state === 'editing') {\n return;\n }\n if (e.shiftKey) {\n cell.selectTo();\n } else {\n cell.focus();\n }\n },\n [state, cell],\n );\n\n const handleMouseEnter = useCallback(\n (e: React.MouseEvent) => {\n if (e.buttons === 1) {\n cell.dragExtend();\n }\n },\n [cell],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent) => {\n if (!cell.isFocused || cell.isEditing) {\n return;\n }\n if (menuOpen) {\n return;\n }\n const related = e.relatedTarget as HTMLElement | null;\n if (related?.closest('[data-testid^=\"cell-\"]')) {\n return;\n }\n cell.blur();\n },\n [cell, menuOpen],\n );\n\n const selectionShadow = selectionEdges\n ? buildSelectionBoxShadow(selectionEdges)\n : null;\n\n let className = STATE_CLASS[state];\n if (isAnchorInRange) {\n className += ` ${CLS_ANCHOR}`;\n }\n\n const cellStyle = selectionShadow\n ? ({ '--cw-shadow': selectionShadow } as CSSProperties)\n : undefined;\n\n return (\n <>\n <div\n ref={cellRef}\n className={className}\n style={cellStyle}\n tabIndex={isActive ? 0 : -1}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n onMouseEnter={handleMouseEnter}\n onDoubleClick={isActive ? handleDoubleClick : undefined}\n onKeyDown={isActive ? handleKeyDown : undefined}\n onBlur={isActive ? handleBlur : undefined}\n onContextMenu={preventContextMenu}\n data-testid={`cell-${cell.rowId}-${cell.field}`}\n >\n <div style={INNER_STYLE}>{children}</div>\n </div>\n {menuOpen && (\n <LazyContextMenu\n cell={cell}\n cellRef={cellRef}\n anchorRect={menuAnchor}\n onClose={handleMenuClose}\n onEditPointerDown={deferredEdit.requestEdit}\n />\n )}\n </>\n );\n },\n);\n\nfunction preventContextMenu(e: React.MouseEvent): void {\n e.preventDefault();\n}\n","import { type RefObject, useCallback, useRef } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { type CellPosition, getClickOffset } from './cellEditorUtils.js';\n\ninterface TextareaCellState {\n cellRef: RefObject<HTMLDivElement | null>;\n textRef: RefObject<HTMLParagraphElement | null>;\n getEditPosition: () => CellPosition | null;\n clickOffsetValue: number | undefined;\n appendCharValue: string | undefined;\n startEditing: (clientX?: number) => void;\n handleTypeChar: (char: string) => void;\n handleCommit: (localValue: string) => void;\n handleCommitEnter: (localValue: string) => void;\n handleCommitted: () => void;\n handleCancel: () => void;\n handleStartEditFromKeyboard: () => void;\n}\n\nexport function useTextareaCell(cell: CellVM): TextareaCellState {\n const cellRef = useRef<HTMLDivElement>(null);\n const textRef = useRef<HTMLParagraphElement>(null);\n\n const getEditPosition = useCallback((): CellPosition | null => {\n if (!cellRef.current) {\n return null;\n }\n const rect = cellRef.current.getBoundingClientRect();\n return {\n top: rect.top,\n left: rect.left,\n width: rect.width,\n };\n }, []);\n\n const trigger = cell.editTrigger;\n const clickOffsetValue =\n trigger?.type === 'doubleClick' ? trigger.clickOffset : undefined;\n const appendCharValue = trigger?.type === 'char' ? trigger.char : undefined;\n\n const startEditing = useCallback(\n (clientX?: number) => {\n if (!cell.isEditable) {\n return;\n }\n const offset =\n clientX === undefined\n ? undefined\n : getClickOffset(textRef.current, cell.displayValue, clientX);\n cell.startEditWithDoubleClick(offset);\n },\n [cell],\n );\n\n const handleTypeChar = useCallback(\n (char: string) => {\n if (!cell.isEditable) {\n return;\n }\n cell.startEditWithChar(char);\n },\n [cell],\n );\n\n const handleCommitted = useCallback(() => {}, []);\n\n const handleCancel = useCallback(() => {\n cell.cancelEdit();\n }, [cell]);\n\n const handleStartEditFromKeyboard = useCallback(() => {\n if (!cell.isEditable) {\n return;\n }\n cell.startEdit();\n }, [cell]);\n\n const trimValue = useCallback((localValue: string) => {\n let trimmed = localValue;\n while (trimmed.endsWith('\\n')) {\n trimmed = trimmed.slice(0, -1);\n }\n return trimmed;\n }, []);\n\n const handleCommit = useCallback(\n (localValue: string) => {\n const trimmed = trimValue(localValue);\n if (trimmed === cell.displayValue) {\n cell.cancelEdit();\n } else {\n cell.commitEdit(trimmed);\n }\n handleCommitted();\n },\n [cell, handleCommitted, trimValue],\n );\n\n const handleCommitEnter = useCallback(\n (localValue: string) => {\n const trimmed = trimValue(localValue);\n if (trimmed === cell.displayValue) {\n cell.commitEditAndMoveDown();\n } else {\n cell.commitEditAndMoveDown(trimmed);\n }\n handleCommitted();\n },\n [cell, handleCommitted, trimValue],\n );\n\n return {\n cellRef,\n textRef,\n getEditPosition,\n clickOffsetValue,\n appendCharValue,\n startEditing,\n handleTypeChar,\n handleCommit,\n handleCommitEnter,\n handleCommitted,\n handleCancel,\n handleStartEditFromKeyboard,\n };\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box, Text } from '@chakra-ui/react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellTextareaEditor } from './CellTextareaEditor.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { useTextareaCell } from './useTextareaCell.js';\n\ninterface StringCellProps {\n cell: CellVM;\n}\n\nexport const StringCell = observer(({ cell }: StringCellProps) => {\n const {\n cellRef,\n textRef,\n getEditPosition,\n clickOffsetValue,\n appendCharValue,\n startEditing,\n handleTypeChar,\n handleCommit,\n handleCommitEnter,\n handleCancel,\n handleStartEditFromKeyboard,\n } = useTextareaCell(cell);\n\n const editPosition = cell.isEditing ? getEditPosition() : null;\n\n return (\n <Box ref={cellRef}>\n <CellWrapper\n cell={cell}\n onDoubleClick={startEditing}\n onStartEdit={handleStartEditFromKeyboard}\n onTypeChar={handleTypeChar}\n onDelete={() => cell.clearToDefault()}\n >\n <Text\n ref={textRef as React.RefObject<HTMLParagraphElement>}\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n {editPosition && (\n <CellTextareaEditor\n value={cell.displayValue}\n position={editPosition}\n clickOffset={clickOffsetValue}\n appendChar={appendCharValue}\n autoHeight\n allowShiftEnter\n onCommit={handleCommit}\n onCommitEnter={handleCommitEnter}\n onCancel={handleCancel}\n testId=\"string-cell-input\"\n />\n )}\n </Box>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport { Box, Text } from '@chakra-ui/react';\nimport { useCallback } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellTextareaEditor } from './CellTextareaEditor.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { useTextareaCell } from './useTextareaCell.js';\n\ninterface NumberCellProps {\n cell: CellVM;\n}\n\nexport const NumberCell = observer(({ cell }: NumberCellProps) => {\n const {\n cellRef,\n textRef,\n getEditPosition,\n clickOffsetValue,\n appendCharValue,\n startEditing,\n handleTypeChar,\n handleCommitted,\n handleCancel,\n handleStartEditFromKeyboard,\n } = useTextareaCell(cell);\n\n const handleCommit = useCallback(\n (localValue: string) => {\n const parsed = Number(localValue);\n if (Number.isNaN(parsed)) {\n cell.cancelEdit();\n } else if (String(parsed) !== cell.displayValue) {\n cell.commitEdit(parsed);\n } else {\n cell.cancelEdit();\n }\n handleCommitted();\n },\n [cell, handleCommitted],\n );\n\n const handleCommitEnter = useCallback(\n (localValue: string) => {\n const parsed = Number(localValue);\n if (Number.isNaN(parsed) || String(parsed) === cell.displayValue) {\n cell.commitEditAndMoveDown();\n } else {\n cell.commitEditAndMoveDown(parsed);\n }\n handleCommitted();\n },\n [cell, handleCommitted],\n );\n\n const editPosition = cell.isEditing ? getEditPosition() : null;\n\n return (\n <Box ref={cellRef}>\n <CellWrapper\n cell={cell}\n onDoubleClick={startEditing}\n onStartEdit={handleStartEditFromKeyboard}\n onTypeChar={handleTypeChar}\n onDelete={() => cell.clearToDefault()}\n >\n <Text\n ref={textRef as React.RefObject<HTMLParagraphElement>}\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n textAlign=\"right\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n {editPosition && (\n <CellTextareaEditor\n value={cell.displayValue}\n position={editPosition}\n clickOffset={clickOffsetValue}\n appendChar={appendCharValue}\n onCommit={handleCommit}\n onCommitEnter={handleCommitEnter}\n onCancel={handleCancel}\n testId=\"number-cell-input\"\n textAlign=\"right\"\n />\n )}\n </Box>\n );\n});\n","import { useCallback, useRef } from 'react';\n\ninterface PopoverAnchor {\n triggerRef: React.RefObject<HTMLDivElement | null>;\n getAnchorRect: () => DOMRect | null;\n}\n\nexport function usePopoverAnchor(): PopoverAnchor {\n const triggerRef = useRef<HTMLDivElement>(null);\n const lastRectRef = useRef<DOMRect | null>(null);\n\n const getAnchorRect = useCallback(() => {\n const rect = triggerRef.current?.getBoundingClientRect();\n if (rect && rect.width > 0) {\n lastRectRef.current = rect;\n }\n return lastRectRef.current;\n }, []);\n\n return { triggerRef, getAnchorRect };\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box, Popover, Portal, Text } from '@chakra-ui/react';\nimport { useCallback } from 'react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { usePopoverAnchor } from './usePopoverAnchor.js';\n\ninterface BooleanCellProps {\n cell: CellVM;\n}\n\nexport const BooleanCell = observer(({ cell }: BooleanCellProps) => {\n const { triggerRef, getAnchorRect } = usePopoverAnchor();\n\n const isOpen = cell.isEditing;\n\n const handleDoubleClick = useCallback(() => {\n if (!cell.isEditable) {\n return;\n }\n cell.startEditWithDoubleClick();\n }, [cell]);\n\n const handleSelect = useCallback(\n (value: boolean) => {\n cell.commitEdit(value);\n },\n [cell],\n );\n\n const handleClose = useCallback(() => {\n cell.cancelEdit();\n }, [cell]);\n\n return (\n <Box ref={triggerRef}>\n <CellWrapper cell={cell} onDoubleClick={handleDoubleClick}>\n <Text\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n <Popover.Root\n lazyMount\n unmountOnExit\n open={isOpen}\n onOpenChange={({ open }) => {\n if (!open) {\n handleClose();\n }\n }}\n autoFocus={true}\n closeOnInteractOutside={true}\n modal={false}\n positioning={{\n placement: 'bottom-start',\n getAnchorRect,\n }}\n >\n <Portal>\n <Popover.Positioner>\n <Popover.Content width=\"80px\" p={1}>\n <Box\n px={2}\n py={1.5}\n cursor=\"pointer\"\n borderRadius=\"md\"\n fontSize=\"sm\"\n _hover={{ bg: 'gray.100' }}\n onClick={() => handleSelect(true)}\n data-testid=\"boolean-option-true\"\n >\n true\n </Box>\n <Box\n px={2}\n py={1.5}\n cursor=\"pointer\"\n borderRadius=\"md\"\n fontSize=\"sm\"\n _hover={{ bg: 'gray.100' }}\n onClick={() => handleSelect(false)}\n data-testid=\"boolean-option-false\"\n >\n false\n </Box>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n </Box>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport { Box, Popover, Portal, Text } from '@chakra-ui/react';\nimport { useCallback } from 'react';\nimport { SearchForeignKey } from '../../../../search-foreign-key/index.js';\nimport type { SearchForeignKeySearchFn } from '../../../../search-foreign-key/index.js';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { usePopoverAnchor } from './usePopoverAnchor.js';\n\ninterface ForeignKeyCellProps {\n cell: CellVM;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n}\n\nexport const ForeignKeyCell = observer(\n ({ cell, onSearchForeignKey }: ForeignKeyCellProps) => {\n const { triggerRef, getAnchorRect } = usePopoverAnchor();\n\n const isOpen = cell.isEditing;\n\n const handleDoubleClick = useCallback(() => {\n if (!cell.isEditable || !onSearchForeignKey) {\n return;\n }\n cell.startEditWithDoubleClick();\n }, [cell, onSearchForeignKey]);\n\n const handleSelect = useCallback(\n (id: string) => {\n cell.commitEdit(id);\n },\n [cell],\n );\n\n const handleClose = useCallback(() => {\n cell.cancelEdit();\n }, [cell]);\n\n const foreignKeyTableId = cell.foreignKeyTableId;\n\n return (\n <Box ref={triggerRef}>\n <CellWrapper cell={cell} onDoubleClick={handleDoubleClick}>\n {cell.displayValue ? (\n <Text\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n ) : (\n <Text\n whiteSpace=\"nowrap\"\n fontWeight=\"300\"\n color=\"gray.400\"\n flex={1}\n minWidth={0}\n >\n Select...\n </Text>\n )}\n </CellWrapper>\n {foreignKeyTableId && onSearchForeignKey && (\n <Popover.Root\n lazyMount\n unmountOnExit\n open={isOpen}\n onOpenChange={({ open }) => {\n if (!open) {\n handleClose();\n }\n }}\n autoFocus={false}\n closeOnInteractOutside={true}\n modal={false}\n positioning={{\n placement: 'bottom-start',\n getAnchorRect,\n }}\n >\n <Portal>\n <Popover.Positioner>\n <Popover.Content width=\"320px\" p={0}>\n <SearchForeignKey\n tableId={foreignKeyTableId}\n onSearch={onSearchForeignKey}\n onSelect={handleSelect}\n onClose={handleClose}\n />\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n )}\n </Box>\n );\n },\n);\n","import { FC, useCallback, useRef } from 'react';\nimport { observer } from 'mobx-react-lite';\nimport { Box, Flex, HStack, IconButton, Text } from '@chakra-ui/react';\nimport { PiInfo, PiUploadThin } from 'react-icons/pi';\nimport { Tooltip } from '../../../../components/Tooltip/Tooltip.js';\nimport { FileHoverCard } from '../../../../row-editor/ui/editors/FileHoverCard.js';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellTextareaEditor } from './CellTextareaEditor.js';\nimport { CellWrapper } from './CellWrapper.js';\nimport { useTextareaCell } from './useTextareaCell.js';\n\ninterface FileCellProps {\n cell: CellVM;\n onUploadFile?: (params: {\n rowId: string;\n fileId: string;\n file: File;\n }) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n}\n\nexport const FileCell: FC<FileCellProps> = observer(\n ({ cell, onUploadFile, onOpenFile }) => {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const fileData = cell.fileData;\n\n const status = fileData?.status ?? '';\n const fileId = fileData?.fileId ?? '';\n const url = fileData?.url ?? '';\n const mimeType = fileData?.mimeType ?? '';\n const width = fileData?.width ?? 0;\n const height = fileData?.height ?? 0;\n\n const isReadonly = cell.isReadOnly;\n const isEditing = cell.isEditing;\n const availablePreview = mimeType.startsWith('image/');\n const showViewFile = Boolean(url);\n const showUploadFile =\n !isReadonly &&\n Boolean(onUploadFile) &&\n (status === 'ready' || status === 'uploaded');\n const showInfo = !showViewFile && !showUploadFile && isReadonly;\n\n const {\n cellRef,\n textRef,\n getEditPosition,\n clickOffsetValue,\n appendCharValue,\n startEditing,\n handleTypeChar,\n handleCommit,\n handleCommitEnter,\n handleCancel,\n handleStartEditFromKeyboard,\n } = useTextareaCell(cell);\n\n const handleFileChange = useCallback(\n async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n if (!file) {\n return;\n }\n event.target.value = '';\n try {\n const result = await onUploadFile?.({\n rowId: cell.rowId,\n fileId,\n file,\n });\n if (result) {\n cell.commitFileUpload(result);\n }\n } catch {\n // upload failed — no-op, caller is responsible for error reporting\n }\n },\n [onUploadFile, fileId, cell],\n );\n\n const handleOpenFile = useCallback(() => {\n if (onOpenFile) {\n onOpenFile(url);\n } else {\n window.open(url, '_blank', 'noopener,noreferrer');\n }\n }, [onOpenFile, url]);\n\n const handleUploadClick = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n fileInputRef.current?.click();\n }, []);\n\n const editPosition = isEditing ? getEditPosition() : null;\n\n return (\n <Box ref={cellRef}>\n <CellWrapper\n cell={cell}\n onDoubleClick={cell.isEditable ? startEditing : undefined}\n onStartEdit={\n cell.isEditable ? handleStartEditFromKeyboard : undefined\n }\n onTypeChar={cell.isEditable ? handleTypeChar : undefined}\n >\n <HStack gap={1} width=\"100%\" justifyContent=\"space-between\">\n <Text\n ref={textRef as React.RefObject<HTMLParagraphElement>}\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n flex={1}\n minWidth={0}\n >\n {cell.displayValue}\n </Text>\n <Flex\n className=\"file-action-buttons\"\n alignItems=\"center\"\n flexShrink={0}\n opacity={0}\n transition=\"opacity 0.15s ease\"\n css={{\n 'td:hover &, &[data-visible]': {\n opacity: 1,\n },\n }}\n {...(showInfo ? { 'data-visible': true } : {})}\n >\n {showInfo && (\n <Tooltip\n openDelay={50}\n closeDelay={50}\n content=\"The file was not uploaded in this revision\"\n >\n <Flex\n width=\"24px\"\n height=\"24px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n color=\"gray.400\"\n >\n <PiInfo />\n </Flex>\n </Tooltip>\n )}\n {showViewFile && (\n <FileHoverCard\n url={url}\n availablePreview={availablePreview}\n width={width}\n height={height}\n onClick={handleOpenFile}\n dataTestId={`cell-file-open-${cell.rowId}-${cell.field}`}\n />\n )}\n {showUploadFile && (\n <Box>\n <input\n ref={fileInputRef}\n type=\"file\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n data-testid={`cell-file-input-${cell.rowId}-${cell.field}`}\n />\n <IconButton\n aria-label=\"Upload file\"\n variant=\"ghost\"\n size=\"2xs\"\n color={showViewFile ? 'gray.300' : 'gray.500'}\n _hover={{ bg: 'gray.100', color: 'black' }}\n onClick={handleUploadClick}\n data-testid={`cell-file-upload-${cell.rowId}-${cell.field}`}\n >\n <PiUploadThin />\n </IconButton>\n </Box>\n )}\n {!showInfo && !showViewFile && !showUploadFile && !isReadonly && (\n <Tooltip\n openDelay={50}\n closeDelay={50}\n content=\"Save the row first, then upload the file\"\n >\n <Flex\n width=\"24px\"\n height=\"24px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n color=\"gray.400\"\n >\n <PiInfo />\n </Flex>\n </Tooltip>\n )}\n </Flex>\n </HStack>\n </CellWrapper>\n {editPosition && (\n <CellTextareaEditor\n value={cell.displayValue}\n position={editPosition}\n clickOffset={clickOffsetValue}\n appendChar={appendCharValue}\n autoHeight\n onCommit={handleCommit}\n onCommitEnter={handleCommitEnter}\n onCancel={handleCancel}\n testId=\"file-cell-input\"\n />\n )}\n </Box>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Text } from '@chakra-ui/react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellWrapper } from './CellWrapper.js';\n\ninterface DateTimeCellProps {\n cell: CellVM;\n}\n\nexport const DateTimeCell = observer(({ cell }: DateTimeCellProps) => {\n return (\n <CellWrapper cell={cell}>\n <Text\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontWeight=\"300\"\n color=\"gray.600\"\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport { Text } from '@chakra-ui/react';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { CellWrapper } from './CellWrapper.js';\n\ninterface ReadonlyCellProps {\n cell: CellVM;\n}\n\nexport const ReadonlyCell = observer(({ cell }: ReadonlyCellProps) => {\n return (\n <CellWrapper cell={cell}>\n <Text\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n fontSize=\"14px\"\n color=\"text/primary\"\n >\n {cell.displayValue}\n </Text>\n </CellWrapper>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport type { SearchForeignKeySearchFn } from '../../../../search-foreign-key/index.js';\nimport { FilterFieldType } from '../../../shared/field-types.js';\nimport type { CellVM } from '../../model/CellVM.js';\nimport { StringCell } from './StringCell.js';\nimport { NumberCell } from './NumberCell.js';\nimport { BooleanCell } from './BooleanCell.js';\nimport { ForeignKeyCell } from './ForeignKeyCell.js';\nimport { FileCell } from './FileCell.js';\nimport { DateTimeCell } from './DateTimeCell.js';\nimport { ReadonlyCell } from './ReadonlyCell.js';\n\ninterface CellRendererProps {\n cell: CellVM;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n onUploadFile?: (params: {\n rowId: string;\n fileId: string;\n file: File;\n }) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n}\n\nexport const CellRenderer = observer(\n ({\n cell,\n onSearchForeignKey,\n onUploadFile,\n onOpenFile,\n }: CellRendererProps) => {\n switch (cell.column.fieldType) {\n case FilterFieldType.String:\n return <StringCell cell={cell} />;\n case FilterFieldType.Number:\n return <NumberCell cell={cell} />;\n case FilterFieldType.Boolean:\n return <BooleanCell cell={cell} />;\n case FilterFieldType.ForeignKey:\n return (\n <ForeignKeyCell cell={cell} onSearchForeignKey={onSearchForeignKey} />\n );\n case FilterFieldType.File:\n return (\n <FileCell\n cell={cell}\n onUploadFile={onUploadFile}\n onOpenFile={onOpenFile}\n />\n );\n case FilterFieldType.DateTime:\n return <DateTimeCell cell={cell} />;\n default:\n return <ReadonlyCell cell={cell} />;\n }\n },\n);\n","function hasNonEmptyField(row: string[]): boolean {\n return row.some((f) => f.length > 0);\n}\n\ninterface ParserState {\n rows: string[][];\n currentRow: string[];\n currentField: string;\n inQuotes: boolean;\n i: number;\n}\n\nfunction processQuotedChar(state: ParserState, text: string): void {\n const ch = text[state.i];\n if (ch === '\"' && state.i + 1 < text.length && text[state.i + 1] === '\"') {\n state.currentField += '\"';\n state.i += 2;\n } else if (ch === '\"') {\n state.inQuotes = false;\n state.i++;\n } else {\n state.currentField += ch;\n state.i++;\n }\n}\n\nfunction finishRow(state: ParserState): void {\n state.currentRow.push(state.currentField);\n state.currentField = '';\n if (hasNonEmptyField(state.currentRow)) {\n state.rows.push(state.currentRow);\n }\n state.currentRow = [];\n}\n\nfunction processUnquotedChar(state: ParserState, text: string): void {\n const ch = text[state.i];\n if (ch === '\"' && state.currentField.length === 0) {\n state.inQuotes = true;\n state.i++;\n } else if (ch === '\\t') {\n state.currentRow.push(state.currentField);\n state.currentField = '';\n state.i++;\n } else if (ch === '\\n') {\n finishRow(state);\n state.i++;\n } else if (\n ch === '\\r' &&\n state.i + 1 < text.length &&\n text[state.i + 1] === '\\n'\n ) {\n finishRow(state);\n state.i += 2;\n } else {\n state.currentField += ch;\n state.i++;\n }\n}\n\nexport function parseTSV(text: string): string[][] {\n if (text.length === 0) {\n return [];\n }\n\n const state: ParserState = {\n rows: [],\n currentRow: [],\n currentField: '',\n inQuotes: false,\n i: 0,\n };\n\n while (state.i < text.length) {\n if (state.inQuotes) {\n processQuotedChar(state, text);\n } else {\n processUnquotedChar(state, text);\n }\n }\n\n state.currentRow.push(state.currentField);\n if (hasNonEmptyField(state.currentRow)) {\n state.rows.push(state.currentRow);\n }\n\n return state.rows;\n}\n","import type { ColumnSpec } from '../../Columns/model/types.js';\nimport type { CellFSM, SelectedRange } from './CellFSM.js';\nimport type { RowVM } from './RowVM.js';\nimport { parseTSV } from './parseTSV.js';\n\nfunction quoteTSVCell(value: string): string {\n if (value.includes('\\t') || value.includes('\\n') || value.includes('\"')) {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n }\n return value;\n}\n\nexport function copyRangeToClipboard(\n range: SelectedRange,\n rows: RowVM[],\n cols: ColumnSpec[],\n): Promise<void> {\n const lines: string[] = [];\n for (let r = range.startRow; r <= range.endRow; r++) {\n const cells: string[] = [];\n for (let c = range.startCol; c <= range.endCol; c++) {\n const row = rows[r];\n const col = cols[c];\n if (row && col) {\n cells.push(quoteTSVCell(row.getCellVM(col).displayValue));\n }\n }\n lines.push(cells.join('\\t'));\n }\n try {\n return navigator.clipboard.writeText(lines.join('\\n'));\n } catch {\n return Promise.resolve();\n }\n}\n\nexport async function pasteRangeFromClipboard(\n focusedRowIndex: number,\n focusedColIndex: number,\n rows: RowVM[],\n cols: ColumnSpec[],\n): Promise<void> {\n let text: string;\n try {\n text = await navigator.clipboard.readText();\n } catch {\n return;\n }\n const grid = parseTSV(text);\n for (const [r, gridRow] of grid.entries()) {\n const rowIndex = focusedRowIndex + r;\n const row = rows[rowIndex];\n if (!row) {\n break;\n }\n for (const [c, cellText] of gridRow.entries()) {\n const colIndex = focusedColIndex + c;\n const col = cols[colIndex];\n if (!col) {\n break;\n }\n const cellVM = row.getCellVM(col);\n if (cellVM.isEditable) {\n cellVM.applyPastedText(cellText);\n }\n }\n }\n}\n\nexport function getFocusedPosition(\n fsm: CellFSM,\n cols: ColumnSpec[],\n rows: RowVM[],\n): { colIndex: number; rowIndex: number } | null {\n const focused = fsm.focusedCell;\n if (!focused) {\n return null;\n }\n const colIndex = cols.findIndex((c) => c.field === focused.field);\n const rowIndex = rows.findIndex((r) => r.rowId === focused.rowId);\n if (colIndex === -1 || rowIndex === -1) {\n return null;\n }\n return { colIndex, rowIndex };\n}\n\nexport function clearRange(\n range: SelectedRange,\n rows: RowVM[],\n cols: ColumnSpec[],\n): void {\n for (let r = range.startRow; r <= range.endRow; r++) {\n for (let c = range.startCol; c <= range.endCol; c++) {\n const row = rows[r];\n const col = cols[c];\n if (row && col) {\n row.getCellVM(col).clearToDefault();\n }\n }\n }\n}\n","import type { SystemStyleObject } from '@chakra-ui/react';\n\nexport const CELL_BORDER_COLOR = '#ededed';\nexport const BOTTOM_BORDER_SHADOW = `inset 0 -1px 0 0 ${CELL_BORDER_COLOR}`;\n\nexport function buildAddColumnShadowCss(): SystemStyleObject {\n return {\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: '8px',\n left: '-8px',\n pointerEvents: 'none',\n transition: 'opacity 0.15s',\n opacity: 'var(--shadow-right-opacity, 0)',\n boxShadow: 'inset -8px 0 12px -8px rgba(0,0,0,0.1)',\n },\n };\n}\n\nexport function adjustRightOffsetCss(\n rightCss: string,\n addColOffset: number,\n): string {\n if (addColOffset <= 0) {\n return rightCss;\n }\n if (rightCss === '0px') {\n return `${addColOffset}px`;\n }\n return `calc(${rightCss} + ${addColOffset}px)`;\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box } from '@chakra-ui/react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\n\nconst MIN_COLUMN_WIDTH = 40;\n\ninterface ResizeHandleProps {\n field: string;\n columnsModel: ColumnsModel;\n}\n\nexport const ResizeHandle = observer(\n ({ field, columnsModel }: ResizeHandleProps) => {\n const [isResizing, setIsResizing] = useState(false);\n const startXRef = useRef(0);\n const startWidthRef = useRef(0);\n const rafRef = useRef(0);\n const cleanupRef = useRef<(() => void) | null>(null);\n\n useEffect(() => {\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, []);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const currentWidth = columnsModel.resolveColumnWidth(field);\n startXRef.current = e.clientX;\n startWidthRef.current = currentWidth;\n setIsResizing(true);\n\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = requestAnimationFrame(() => {\n const delta = moveEvent.clientX - startXRef.current;\n const newWidth = Math.max(\n MIN_COLUMN_WIDTH,\n startWidthRef.current + delta,\n );\n columnsModel.setColumnWidth(field, newWidth);\n });\n };\n\n const cleanup = () => {\n cancelAnimationFrame(rafRef.current);\n columnsModel.commitColumnWidth();\n setIsResizing(false);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n cleanupRef.current = null;\n };\n\n const handleMouseUp = () => {\n cleanup();\n };\n\n cleanupRef.current = cleanup;\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n },\n [field, columnsModel],\n );\n\n return (\n <Box\n role=\"separator\"\n position=\"absolute\"\n right=\"-4px\"\n top={0}\n bottom={0}\n width=\"8px\"\n cursor=\"col-resize\"\n zIndex={10}\n onMouseDown={handleMouseDown}\n data-testid={`resize-${field}`}\n >\n <Box\n position=\"absolute\"\n left=\"3px\"\n top={0}\n bottom={0}\n width=\"2px\"\n bg={isResizing ? 'blue.500' : 'transparent'}\n _groupHover={{ bg: 'blue.500' }}\n transition=\"background 0.1s\"\n />\n </Box>\n );\n },\n);\n","import { Box, Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuArrowDown, LuArrowUp } from 'react-icons/lu';\nimport type { SortModel } from '../../../Sortings/model/SortModel.js';\n\ninterface SortIndicatorProps {\n field: string;\n sortModel: SortModel;\n}\n\nexport const SortIndicator = observer(\n ({ field, sortModel }: SortIndicatorProps) => {\n const direction = sortModel.getSortDirection(field);\n const sortIndex = sortModel.getSortIndex(field);\n const showIndex = sortModel.sortCount > 1;\n\n if (!direction) {\n return null;\n }\n\n return (\n <Flex\n alignItems=\"center\"\n gap=\"1px\"\n color=\"blue.500\"\n fontSize=\"xs\"\n flexShrink={0}\n data-testid={`sort-indicator-${field}`}\n >\n {direction === 'asc' ? (\n <LuArrowUp size={12} />\n ) : (\n <LuArrowDown size={12} />\n )}\n {showIndex && sortIndex !== null && (\n <Box as=\"span\" fontSize=\"10px\" fontWeight=\"medium\" lineHeight={1}>\n {sortIndex}\n </Box>\n )}\n </Flex>\n );\n },\n);\n","import { Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuPin } from 'react-icons/lu';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\n\ninterface PinIndicatorProps {\n field: string;\n columnsModel: ColumnsModel;\n}\n\nexport const PinIndicator = observer(\n ({ field, columnsModel }: PinIndicatorProps) => {\n if (!columnsModel.isPinned(field)) {\n return null;\n }\n\n return (\n <Flex\n alignItems=\"center\"\n color=\"gray.400\"\n flexShrink={0}\n data-testid={`pin-indicator-${field}`}\n >\n <LuPin size={12} />\n </Flex>\n );\n },\n);\n","import { Flex } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuFilter } from 'react-icons/lu';\nimport type { FilterModel } from '../../../Filters/model/FilterModel.js';\n\ninterface FilterIndicatorProps {\n field: string;\n filterModel: FilterModel;\n}\n\nexport const FilterIndicator = observer(\n ({ field, filterModel }: FilterIndicatorProps) => {\n if (!filterModel.hasFilterForField(field)) {\n return null;\n }\n\n return (\n <Flex\n alignItems=\"center\"\n color=\"gray.400\"\n flexShrink={0}\n data-testid={`filter-indicator-${field}`}\n >\n <LuFilter size={12} />\n </Flex>\n );\n },\n);\n","import { Flex } from '@chakra-ui/react';\nimport { PiFunction } from 'react-icons/pi';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\n\ninterface FormulaIndicatorProps {\n column: ColumnSpec;\n}\n\nexport const FormulaIndicator = ({ column }: FormulaIndicatorProps) => {\n if (!column.hasFormula) {\n return null;\n }\n\n return (\n <Flex\n alignItems=\"center\"\n color=\"gray.400\"\n flexShrink={0}\n data-testid={`formula-indicator-${column.field}`}\n >\n <PiFunction size={12} />\n </Flex>\n );\n};\n","import { Menu, Portal, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport {\n LuArrowDownAZ,\n LuArrowUpAZ,\n LuChevronRight,\n LuX,\n} from 'react-icons/lu';\nimport type { SortModel } from '../../../Sortings/model/SortModel.js';\n\ninterface SortSubmenuProps {\n field: string;\n sortModel: SortModel;\n}\n\nexport const SortSubmenu = observer(\n ({ field, sortModel }: SortSubmenuProps) => {\n const currentDirection = sortModel.getSortDirection(field);\n const isSorted = sortModel.isSorted(field);\n\n const handleSortAsc = () => {\n sortModel.setSingleSort(field, 'asc');\n };\n\n const handleSortDesc = () => {\n sortModel.setSingleSort(field, 'desc');\n };\n\n const handleRemoveSort = () => {\n sortModel.removeSort(field);\n };\n\n return (\n <Menu.Root\n positioning={{ placement: 'right-start', gutter: 2 }}\n lazyMount\n unmountOnExit\n >\n <Menu.TriggerItem>\n <Text flex={1}>Sort</Text>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"160px\">\n <Menu.Item\n value=\"sort-asc\"\n onClick={handleSortAsc}\n color={currentDirection === 'asc' ? 'blue.600' : undefined}\n >\n <LuArrowUpAZ />\n <Text>Sort A → Z</Text>\n </Menu.Item>\n <Menu.Item\n value=\"sort-desc\"\n onClick={handleSortDesc}\n color={currentDirection === 'desc' ? 'blue.600' : undefined}\n >\n <LuArrowDownAZ />\n <Text>Sort Z → A</Text>\n </Menu.Item>\n {isSorted && (\n <>\n <Menu.Separator />\n <Menu.Item value=\"remove-sort\" onClick={handleRemoveSort}>\n <LuX />\n <Text>Remove sort</Text>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Menu, Portal, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport {\n LuArrowLeftToLine,\n LuArrowRightToLine,\n LuChevronLeft,\n LuChevronRight,\n} from 'react-icons/lu';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\n\ninterface MoveColumnSubmenuProps {\n field: string;\n columnsModel: ColumnsModel;\n}\n\nexport const MoveColumnSubmenu = observer(\n ({ field, columnsModel }: MoveColumnSubmenuProps) => {\n const canMoveLeft = columnsModel.canMoveLeft(field);\n const canMoveRight = columnsModel.canMoveRight(field);\n const canMoveToStart = columnsModel.canMoveToStart(field);\n const canMoveToEnd = columnsModel.canMoveToEnd(field);\n\n if (!canMoveLeft && !canMoveRight) {\n return null;\n }\n\n return (\n <Menu.Root\n positioning={{ placement: 'right-start', gutter: 2 }}\n lazyMount\n unmountOnExit\n >\n <Menu.TriggerItem>\n <Text flex={1}>Move column</Text>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"160px\">\n {canMoveLeft && (\n <Menu.Item\n value=\"move-left\"\n onClick={() => columnsModel.moveColumnLeft(field)}\n >\n <LuChevronLeft />\n <Text>Move left</Text>\n </Menu.Item>\n )}\n {canMoveToStart && (\n <Menu.Item\n value=\"move-to-start\"\n onClick={() => columnsModel.moveColumnToStart(field)}\n >\n <LuArrowLeftToLine />\n <Text>Move to start</Text>\n </Menu.Item>\n )}\n {canMoveRight && (\n <Menu.Item\n value=\"move-right\"\n onClick={() => columnsModel.moveColumnRight(field)}\n >\n <LuChevronRight />\n <Text>Move right</Text>\n </Menu.Item>\n )}\n {canMoveToEnd && (\n <Menu.Item\n value=\"move-to-end\"\n onClick={() => columnsModel.moveColumnToEnd(field)}\n >\n <LuArrowRightToLine />\n <Text>Move to end</Text>\n </Menu.Item>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n },\n);\n","import { Box, Menu, Text } from '@chakra-ui/react';\nimport { memo } from 'react';\nimport type { FilterFieldType } from '../../../shared/field-types.js';\nimport { getFieldTypeIcon } from './getFieldTypeIcon.js';\n\ninterface FieldMenuItemProps {\n field: string;\n name: string;\n fieldType: FilterFieldType;\n valuePrefix?: string;\n onClick: (field: string) => void;\n}\n\nexport const FieldMenuItem = memo(\n ({ field, name, fieldType, valuePrefix, onClick }: FieldMenuItemProps) => {\n const handleClick = () => onClick(field);\n\n return (\n <Menu.Item\n value={valuePrefix ? `${valuePrefix}-${field}` : field}\n onClick={handleClick}\n >\n <Box display=\"flex\" alignItems=\"center\" gap={2} width=\"100%\">\n <Box\n as=\"span\"\n fontSize=\"xs\"\n fontWeight=\"medium\"\n color=\"gray.400\"\n fontFamily=\"mono\"\n minWidth=\"20px\"\n >\n {getFieldTypeIcon(fieldType)}\n </Box>\n <Text truncate>{name || '(unnamed)'}</Text>\n </Box>\n </Menu.Item>\n );\n },\n);\n","import { Box, Menu, Portal, Text } from '@chakra-ui/react';\nimport { LuChevronRight } from 'react-icons/lu';\nimport type { FileFieldGroup } from '../../../Columns/model/groupFileFields.js';\nimport { getFieldTypeIcon } from './getFieldTypeIcon.js';\nimport { FieldMenuItem } from './FieldMenuItem.js';\n\ninterface FileFieldSubmenuProps {\n group: FileFieldGroup;\n parentVisible?: boolean;\n valuePrefix?: string;\n onClick: (field: string) => void;\n}\n\nexport const FileFieldSubmenu = ({\n group,\n parentVisible,\n valuePrefix,\n onClick,\n}: FileFieldSubmenuProps) => {\n if (group.children.length === 0 && !parentVisible) {\n return (\n <FieldMenuItem\n field={group.parent.field}\n name={group.parent.label}\n fieldType={group.parent.fieldType}\n valuePrefix={valuePrefix}\n onClick={onClick}\n />\n );\n }\n\n return (\n <Menu.Root\n positioning={{ placement: 'right-start', gutter: 2 }}\n lazyMount\n unmountOnExit\n >\n <Menu.TriggerItem data-testid={`file-group-${group.parent.field}`}>\n <Box display=\"flex\" alignItems=\"center\" gap={2} flex={1}>\n <Box\n as=\"span\"\n fontSize=\"xs\"\n fontWeight=\"medium\"\n color=\"gray.400\"\n fontFamily=\"mono\"\n minWidth=\"20px\"\n >\n {getFieldTypeIcon(group.parent.fieldType)}\n </Box>\n <Text truncate>{group.parent.label}</Text>\n </Box>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content maxH=\"300px\" minW=\"200px\" overflowY=\"auto\">\n {!parentVisible && (\n <>\n <FieldMenuItem\n field={group.parent.field}\n name={group.parent.label}\n fieldType={group.parent.fieldType}\n valuePrefix={valuePrefix}\n onClick={onClick}\n />\n <Menu.Separator />\n </>\n )}\n {group.children.map((col) => (\n <FieldMenuItem\n key={col.field}\n field={col.field}\n name={col.label}\n fieldType={col.fieldType}\n valuePrefix={valuePrefix}\n onClick={onClick}\n />\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { Menu, Portal, Text } from '@chakra-ui/react';\nimport { LuChevronRight } from 'react-icons/lu';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport {\n groupFileFields,\n isFileFieldGroup,\n} from '../../../Columns/model/groupFileFields.js';\nimport { FieldMenuItem } from './FieldMenuItem.js';\nimport { FileFieldSubmenu } from './FileFieldSubmenu.js';\n\ninterface InsertColumnSubmenuProps {\n label: string;\n valuePrefix: string;\n availableFields: ColumnSpec[];\n allColumns?: ColumnSpec[];\n onSelect: (field: string) => void;\n}\n\nexport const InsertColumnSubmenu = ({\n label,\n valuePrefix,\n availableFields,\n allColumns,\n onSelect,\n}: InsertColumnSubmenuProps) => {\n if (availableFields.length === 0) {\n return null;\n }\n\n const groupedFields = groupFileFields(availableFields, allColumns);\n\n return (\n <Menu.Root\n positioning={{ placement: 'right-start', gutter: 2 }}\n lazyMount\n unmountOnExit\n >\n <Menu.TriggerItem>\n <Text flex={1}>{label}</Text>\n <LuChevronRight />\n </Menu.TriggerItem>\n <Portal>\n <Menu.Positioner>\n <Menu.Content maxH=\"300px\" minW=\"200px\" overflowY=\"auto\">\n {groupedFields.map((item) =>\n isFileFieldGroup(item) ? (\n <FileFieldSubmenu\n key={item.parent.field}\n group={item}\n parentVisible={item.parentVisible}\n valuePrefix={valuePrefix}\n onClick={onSelect}\n />\n ) : (\n <FieldMenuItem\n key={item.field}\n field={item.field}\n name={item.label}\n fieldType={item.fieldType}\n valuePrefix={valuePrefix}\n onClick={onSelect}\n />\n ),\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { Menu, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { LuCopy, LuFilter, LuPin, LuPinOff } from 'react-icons/lu';\nimport { PiEyeSlash, PiListBullets } from 'react-icons/pi';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\nimport type { FilterModel } from '../../../Filters/model/FilterModel.js';\nimport type { SortModel } from '../../../Sortings/model/SortModel.js';\nimport { SortSubmenu } from './SortSubmenu.js';\nimport { MoveColumnSubmenu } from './MoveColumnSubmenu.js';\nimport { InsertColumnSubmenu } from './InsertColumnSubmenu.js';\n\ninterface ColumnHeaderMenuProps {\n column: ColumnSpec;\n columnsModel: ColumnsModel;\n sortModel?: SortModel;\n filterModel?: FilterModel;\n onCopyPath?: (path: string) => void;\n onClose?: () => void;\n}\n\nexport const ColumnHeaderMenu = observer(\n ({\n column,\n columnsModel,\n sortModel,\n filterModel,\n onCopyPath,\n onClose,\n }: ColumnHeaderMenuProps) => {\n const canRemove = columnsModel.canRemoveColumn;\n const insertableFields = columnsModel.availableFieldsToInsert;\n const hasInsertableFields = insertableFields.length > 0;\n const canMove =\n columnsModel.canMoveLeft(column.field) ||\n columnsModel.canMoveRight(column.field);\n\n const isPinned = columnsModel.isPinned(column.field);\n const canPinLeft = columnsModel.canPinLeft(column.field);\n const canPinRight = columnsModel.canPinRight(column.field);\n\n const handleHide = () => {\n columnsModel.hideColumn(column.field);\n };\n\n const handleAddFilter = () => {\n if (filterModel) {\n filterModel.addConditionForField(column.field);\n filterModel.setOpen(true);\n }\n };\n\n const handleCopyPath = () => {\n if (onCopyPath) {\n onCopyPath(column.field);\n } else {\n navigator.clipboard.writeText(column.field).catch(() => {});\n }\n };\n\n const handleInsertBefore = (field: string) => {\n columnsModel.insertColumnBefore(column.field, field);\n onClose?.();\n };\n\n const handleInsertAfter = (field: string) => {\n columnsModel.insertColumnAfter(column.field, field);\n onClose?.();\n };\n\n const handlePinLeft = () => {\n columnsModel.pinLeft(column.field);\n };\n\n const handlePinRight = () => {\n columnsModel.pinRight(column.field);\n };\n\n const handleUnpin = () => {\n columnsModel.unpin(column.field);\n };\n\n return (\n <Menu.Content minW=\"180px\">\n {sortModel && column.isSortable && (\n <>\n <SortSubmenu field={column.field} sortModel={sortModel} />\n <Menu.Separator />\n </>\n )}\n {filterModel && column.isSortable && (\n <>\n <Menu.Item value=\"add-filter\" onClick={handleAddFilter}>\n <LuFilter />\n <Text>Add filter</Text>\n </Menu.Item>\n <Menu.Separator />\n </>\n )}\n {isPinned ? (\n <>\n <Menu.Item value=\"unpin\" onClick={handleUnpin}>\n <LuPinOff />\n <Text>Unpin column</Text>\n </Menu.Item>\n <Menu.Separator />\n </>\n ) : (\n <>\n {canPinLeft && (\n <Menu.Item value=\"pin-left\" onClick={handlePinLeft}>\n <LuPin />\n <Text>Pin to left</Text>\n </Menu.Item>\n )}\n {canPinRight && (\n <Menu.Item value=\"pin-right\" onClick={handlePinRight}>\n <LuPin />\n <Text>Pin to right</Text>\n </Menu.Item>\n )}\n {(canPinLeft || canPinRight) && <Menu.Separator />}\n </>\n )}\n {canMove && (\n <>\n <MoveColumnSubmenu\n field={column.field}\n columnsModel={columnsModel}\n />\n <Menu.Separator />\n </>\n )}\n {hasInsertableFields && (\n <>\n <InsertColumnSubmenu\n label=\"Insert before\"\n valuePrefix=\"before\"\n availableFields={insertableFields}\n allColumns={columnsModel.allColumns}\n onSelect={handleInsertBefore}\n />\n <InsertColumnSubmenu\n label=\"Insert after\"\n valuePrefix=\"after\"\n availableFields={insertableFields}\n allColumns={columnsModel.allColumns}\n onSelect={handleInsertAfter}\n />\n <Menu.Separator />\n </>\n )}\n <Menu.Item value=\"hide\" disabled={!canRemove} onClick={handleHide}>\n <PiEyeSlash />\n <Text>Hide column</Text>\n </Menu.Item>\n <Menu.Item\n value=\"hide-all\"\n disabled={!canRemove}\n onClick={columnsModel.hideAll}\n >\n <PiListBullets />\n <Text>Hide all columns</Text>\n </Menu.Item>\n <Menu.Separator />\n <Menu.Item value=\"copy-path\" onClick={handleCopyPath}>\n <LuCopy />\n <Text>Copy path</Text>\n </Menu.Item>\n </Menu.Content>\n );\n },\n);\n","import { useState } from 'react';\nimport { Box, Flex, Menu, Portal, Text } from '@chakra-ui/react';\nimport type { SystemStyleObject } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport type { ColumnSpec } from '../../../Columns/model/types.js';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\nimport type { FilterModel } from '../../../Filters/model/FilterModel.js';\nimport type { SortModel } from '../../../Sortings/model/SortModel.js';\nimport { CELL_BORDER_COLOR, BOTTOM_BORDER_SHADOW } from '../borderConstants.js';\nimport { ResizeHandle } from '../ResizeHandle.js';\nimport { SortIndicator } from './SortIndicator.js';\nimport { PinIndicator } from './PinIndicator.js';\nimport { FilterIndicator } from './FilterIndicator.js';\nimport { FormulaIndicator } from './FormulaIndicator.js';\nimport { ColumnHeaderMenu } from './ColumnHeaderMenu.js';\nimport { getFieldTypeIcon } from './getFieldTypeIcon.js';\n\nexport interface StickyPosition {\n side: 'left' | 'right';\n offsetCss: string;\n isBoundary: boolean;\n}\n\nfunction buildHeaderShadowCss(position: StickyPosition): SystemStyleObject {\n const cssVar =\n position.side === 'left'\n ? 'var(--shadow-left-opacity, 0)'\n : 'var(--shadow-right-opacity, 0)';\n return {\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: '8px',\n pointerEvents: 'none',\n transition: 'opacity 0.15s',\n opacity: cssVar,\n ...(position.side === 'left'\n ? {\n right: '-8px',\n boxShadow: 'inset 8px 0 12px -8px rgba(0,0,0,0.1)',\n }\n : {\n left: '-8px',\n boxShadow: 'inset -8px 0 12px -8px rgba(0,0,0,0.1)',\n }),\n },\n };\n}\n\nfunction getHeaderBoxShadow(stickyPosition?: StickyPosition): string {\n if (!stickyPosition) {\n return BOTTOM_BORDER_SHADOW;\n }\n const stickyBorder =\n stickyPosition.side === 'left'\n ? `inset -1px 0 0 0 ${CELL_BORDER_COLOR}`\n : `inset 1px 0 0 0 ${CELL_BORDER_COLOR}`;\n return `${BOTTOM_BORDER_SHADOW}, ${stickyBorder}`;\n}\n\ninterface ColumnHeaderProps {\n column: ColumnSpec;\n columnsModel: ColumnsModel;\n sortModel?: SortModel;\n filterModel?: FilterModel;\n onCopyPath?: (path: string) => void;\n stickyPosition?: StickyPosition;\n}\n\nexport const ColumnHeader = observer(\n ({\n column,\n columnsModel,\n sortModel,\n filterModel,\n onCopyPath,\n stickyPosition,\n }: ColumnHeaderProps) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n const w = columnsModel.columnWidthCssVar(column.field);\n\n const isSticky = Boolean(stickyPosition);\n\n return (\n <Box\n as=\"th\"\n position={isSticky ? 'sticky' : 'relative'}\n left={\n stickyPosition?.side === 'left' ? stickyPosition.offsetCss : undefined\n }\n right={\n stickyPosition?.side === 'right'\n ? stickyPosition.offsetCss\n : undefined\n }\n zIndex={isSticky ? 2 : undefined}\n width={w}\n minWidth={w}\n maxWidth={w}\n height=\"inherit\"\n bg=\"white\"\n boxShadow={getHeaderBoxShadow(stickyPosition)}\n textAlign=\"left\"\n fontWeight=\"normal\"\n p={0}\n css={\n stickyPosition?.isBoundary\n ? buildHeaderShadowCss(stickyPosition)\n : undefined\n }\n >\n <Menu.Root\n positioning={{ placement: 'bottom-end' }}\n lazyMount\n unmountOnExit\n open={isMenuOpen}\n onOpenChange={(details) => setIsMenuOpen(details.open)}\n >\n <Menu.Trigger asChild>\n <Flex\n alignItems=\"center\"\n height=\"100%\"\n pl=\"8px\"\n pr=\"16px\"\n gap=\"4px\"\n cursor=\"pointer\"\n transition=\"background 0.15s\"\n overflow=\"hidden\"\n _hover={{ bg: 'gray.100' }}\n data-testid={`header-${column.field}`}\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n flexShrink={0}\n fontSize=\"xs\"\n color=\"gray.400\"\n width=\"16px\"\n >\n {getFieldTypeIcon(column.fieldType)}\n </Flex>\n <Text\n fontSize=\"sm\"\n fontWeight=\"500\"\n color=\"gray.400\"\n whiteSpace=\"nowrap\"\n textOverflow=\"ellipsis\"\n overflow=\"hidden\"\n flex={1}\n minWidth={0}\n textDecoration={\n column.isDeprecated ? 'line-through' : undefined\n }\n >\n {column.label}\n </Text>\n <FormulaIndicator column={column} />\n <PinIndicator field={column.field} columnsModel={columnsModel} />\n {filterModel && column.isSortable && (\n <FilterIndicator\n field={column.field}\n filterModel={filterModel}\n />\n )}\n {sortModel && column.isSortable && (\n <SortIndicator field={column.field} sortModel={sortModel} />\n )}\n </Flex>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <ColumnHeaderMenu\n column={column}\n columnsModel={columnsModel}\n sortModel={sortModel}\n filterModel={filterModel}\n onCopyPath={onCopyPath}\n onClose={() => setIsMenuOpen(false)}\n />\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n <ResizeHandle field={column.field} columnsModel={columnsModel} />\n </Box>\n );\n },\n);\n","import { Flex, IconButton, Menu, Portal, Text } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { PiListBullets, PiPlus } from 'react-icons/pi';\nimport type { ColumnsModel } from '../../../Columns/model/ColumnsModel.js';\nimport {\n groupFileFields,\n isFileFieldGroup,\n} from '../../../Columns/model/groupFileFields.js';\nimport { FieldMenuItem } from './FieldMenuItem.js';\nimport { FileFieldSubmenu } from './FileFieldSubmenu.js';\n\ninterface AddColumnButtonProps {\n columnsModel: ColumnsModel;\n}\n\nexport const AddColumnButton = observer(\n ({ columnsModel }: AddColumnButtonProps) => {\n const availableFields = columnsModel.availableFieldsToAdd;\n const availableSystemFields = columnsModel.availableSystemFieldsToAdd;\n const hasHidden = columnsModel.hasHiddenColumns;\n\n if (!hasHidden) {\n return null;\n }\n\n const groupedFields = groupFileFields(\n availableFields,\n columnsModel.allColumns,\n );\n\n return (\n <Flex alignItems=\"center\" px=\"4px\" height=\"100%\">\n <Menu.Root\n positioning={{ placement: 'bottom-start' }}\n lazyMount\n unmountOnExit\n >\n <Menu.Trigger asChild>\n <IconButton\n aria-label=\"Add column\"\n size=\"xs\"\n variant=\"ghost\"\n color=\"gray.400\"\n _hover={{ bg: 'gray.100', color: 'gray.600' }}\n focusRing=\"none\"\n data-testid=\"add-column-button\"\n >\n <PiPlus />\n </IconButton>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"200px\" maxH=\"340px\" overflowY=\"auto\">\n <Menu.Item value=\"add-all\" onClick={columnsModel.addAll}>\n <PiListBullets />\n <Text>Add all columns</Text>\n </Menu.Item>\n {groupedFields.length > 0 && (\n <>\n <Menu.Separator />\n <Menu.ItemGroup>\n <Menu.ItemGroupLabel\n fontWeight=\"medium\"\n color=\"gray.500\"\n fontSize=\"xs\"\n >\n Data fields\n </Menu.ItemGroupLabel>\n {groupedFields.map((item) =>\n isFileFieldGroup(item) ? (\n <FileFieldSubmenu\n key={item.parent.field}\n group={item}\n parentVisible={item.parentVisible}\n onClick={columnsModel.showColumn}\n />\n ) : (\n <FieldMenuItem\n key={item.field}\n field={item.field}\n name={item.label}\n fieldType={item.fieldType}\n onClick={columnsModel.showColumn}\n />\n ),\n )}\n </Menu.ItemGroup>\n </>\n )}\n {availableSystemFields.length > 0 && (\n <>\n <Menu.Separator />\n <Menu.ItemGroup>\n <Menu.ItemGroupLabel\n fontWeight=\"medium\"\n color=\"gray.500\"\n fontSize=\"xs\"\n >\n System fields\n </Menu.ItemGroupLabel>\n {availableSystemFields.map((col) => (\n <FieldMenuItem\n key={col.field}\n field={col.field}\n name={col.label}\n fieldType={col.fieldType}\n onClick={columnsModel.showColumn}\n />\n ))}\n </Menu.ItemGroup>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n </Flex>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { Box } from '@chakra-ui/react';\nimport type { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\nimport type { FilterModel } from '../../Filters/model/FilterModel.js';\nimport type { SortModel } from '../../Sortings/model/SortModel.js';\nimport {\n BOTTOM_BORDER_SHADOW,\n buildAddColumnShadowCss,\n adjustRightOffsetCss,\n} from './borderConstants.js';\nimport { ColumnHeader } from './Header/ColumnHeader.js';\nimport type { StickyPosition } from './Header/ColumnHeader.js';\nimport { AddColumnButton } from './Header/AddColumnButton.js';\n\nconst SELECTION_COLUMN_WIDTH = 40;\nconst ADD_COLUMN_BUTTON_WIDTH = 40;\n\ninterface HeaderRowProps {\n columnsModel: ColumnsModel;\n sortModel?: SortModel;\n filterModel?: FilterModel;\n onCopyPath?: (path: string) => void;\n showSelection?: boolean;\n}\n\nexport const HeaderRow = observer(\n ({\n columnsModel,\n sortModel,\n filterModel,\n onCopyPath,\n showSelection,\n }: HeaderRowProps) => {\n const selectionWidth = showSelection ? SELECTION_COLUMN_WIDTH : 0;\n const addColumnStickyRight = columnsModel.hasHiddenColumns;\n\n return (\n <Box as=\"tr\" height=\"40px\">\n {showSelection && (\n <Box\n as=\"th\"\n width=\"40px\"\n minWidth=\"40px\"\n maxWidth=\"40px\"\n bg=\"white\"\n p={0}\n position=\"sticky\"\n left={0}\n zIndex={2}\n boxShadow={BOTTOM_BORDER_SHADOW}\n />\n )}\n {columnsModel.visibleColumns.map((col) => {\n const stickyPosition = getStickyPosition(\n col.field,\n columnsModel,\n selectionWidth,\n addColumnStickyRight,\n );\n return (\n <ColumnHeader\n key={col.field}\n column={col}\n columnsModel={columnsModel}\n sortModel={sortModel}\n filterModel={filterModel}\n onCopyPath={onCopyPath}\n stickyPosition={stickyPosition}\n />\n );\n })}\n {addColumnStickyRight ? (\n <Box\n as=\"th\"\n width=\"100%\"\n minWidth={`${ADD_COLUMN_BUTTON_WIDTH}px`}\n bg=\"white\"\n p={0}\n position=\"sticky\"\n right={0}\n zIndex={2}\n boxShadow={BOTTOM_BORDER_SHADOW}\n css={\n columnsModel.pinnedRightCount === 0\n ? buildAddColumnShadowCss()\n : undefined\n }\n >\n <AddColumnButton columnsModel={columnsModel} />\n </Box>\n ) : (\n <Box\n as=\"th\"\n width=\"100%\"\n bg=\"white\"\n p={0}\n boxShadow={BOTTOM_BORDER_SHADOW}\n />\n )}\n </Box>\n );\n },\n);\n\nfunction getStickyPosition(\n field: string,\n columnsModel: ColumnsModel,\n selectionWidth: number,\n addColumnStickyRight: boolean,\n): StickyPosition | undefined {\n const leftCss = columnsModel.getColumnStickyLeftCss(field, selectionWidth);\n if (leftCss !== undefined) {\n return {\n side: 'left',\n offsetCss: leftCss,\n isBoundary: columnsModel.isStickyLeftBoundary(field),\n };\n }\n\n const rightCss = columnsModel.getColumnStickyRightCss(field);\n if (rightCss !== undefined) {\n const addColOffset = addColumnStickyRight ? ADD_COLUMN_BUTTON_WIDTH : 0;\n return {\n side: 'right',\n offsetCss: adjustRightOffsetCss(rightCss, addColOffset),\n isBoundary: columnsModel.isStickyRightBoundary(field),\n };\n }\n\n return undefined;\n}\n","import { FC } from 'react';\nimport { Menu, Text } from '@chakra-ui/react';\nimport { LuCopy, LuTrash2 } from 'react-icons/lu';\nimport { PiCheckSquare } from 'react-icons/pi';\n\nexport interface RowActionMenuItemsProps {\n rowId: string;\n testIdPrefix: string;\n onSelect?: (rowId: string) => void;\n onDuplicate?: (rowId: string) => void;\n onDelete?: (rowId: string) => void;\n}\n\nexport const RowActionMenuItems: FC<RowActionMenuItemsProps> = ({\n rowId,\n testIdPrefix,\n onSelect,\n onDuplicate,\n onDelete,\n}) => {\n return (\n <>\n {onSelect && (\n <Menu.Item\n value=\"select\"\n onClick={() => onSelect(rowId)}\n data-testid={`${testIdPrefix}-select-${rowId}`}\n >\n <PiCheckSquare />\n <Text>Select</Text>\n </Menu.Item>\n )}\n {onDuplicate && (\n <Menu.Item\n value=\"duplicate\"\n onClick={() => onDuplicate(rowId)}\n data-testid={`${testIdPrefix}-duplicate-${rowId}`}\n >\n <LuCopy />\n <Text>Duplicate</Text>\n </Menu.Item>\n )}\n {onDelete && (\n <>\n {(onSelect || onDuplicate) && <Menu.Separator />}\n <Menu.Item\n value=\"delete\"\n onClick={() => onDelete(rowId)}\n data-testid={`${testIdPrefix}-delete-${rowId}`}\n >\n <LuTrash2 />\n <Text color=\"red.600\">Delete</Text>\n </Menu.Item>\n </>\n )}\n </>\n );\n};\n","import { FC, useState } from 'react';\nimport { Flex, Icon, Menu, Portal, Text } from '@chakra-ui/react';\nimport {\n PiDotsThreeVerticalBold,\n PiArrowSquareRightLight,\n PiCheckSquare,\n} from 'react-icons/pi';\nimport { RowActionMenuItems } from './RowActionMenuItems.js';\n\ninterface RowActionOverlayProps {\n rowId: string;\n onOpen?: (rowId: string) => void;\n onPick?: (rowId: string) => void;\n onSelect?: (rowId: string) => void;\n onDuplicate?: (rowId: string) => void;\n onDelete?: (rowId: string) => void;\n}\n\nexport const RowActionOverlay: FC<RowActionOverlayProps> = ({\n rowId,\n onOpen,\n onPick,\n onSelect,\n onDuplicate,\n onDelete,\n}) => {\n const [isMenuOpen, setIsMenuOpen] = useState(false);\n\n const primaryAction = onPick ?? onOpen;\n const primaryIcon = onPick ? PiCheckSquare : PiArrowSquareRightLight;\n const primaryTestId = onPick\n ? `row-action-pick-${rowId}`\n : `row-action-open-${rowId}`;\n\n const hasMenuItems = Boolean(onOpen || onSelect || onDuplicate || onDelete);\n\n return (\n <Flex\n position=\"absolute\"\n right=\"8px\"\n top=\"50%\"\n transform=\"translateY(-50%)\"\n alignItems=\"center\"\n className=\"row-action-buttons\"\n data-menu-open={isMenuOpen || undefined}\n data-testid={`row-action-buttons-${rowId}`}\n >\n <Flex\n alignItems=\"center\"\n height=\"24px\"\n borderRadius=\"6px\"\n bg=\"white\"\n boxShadow=\"0px 2px 8px rgba(0,0,0,0.16)\"\n overflow=\"hidden\"\n data-testid={`row-action-split-${rowId}`}\n >\n {primaryAction && (\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n width=\"28px\"\n minWidth=\"28px\"\n cursor=\"pointer\"\n _hover={{ bg: 'gray.100' }}\n onClick={(e) => {\n e.stopPropagation();\n primaryAction(rowId);\n }}\n data-testid={primaryTestId}\n >\n <Icon boxSize=\"20px\" color=\"gray.400\" as={primaryIcon} />\n </Flex>\n )}\n {hasMenuItems && (\n <Menu.Root\n lazyMount\n unmountOnExit\n onOpenChange={({ open }) => setIsMenuOpen(open)}\n positioning={{ placement: 'bottom-start' }}\n >\n <Menu.Trigger asChild>\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n width=\"18px\"\n minWidth=\"18px\"\n cursor=\"pointer\"\n borderLeft={primaryAction ? '1px solid' : undefined}\n borderColor=\"gray.100\"\n _hover={{ bg: 'gray.100' }}\n onClick={(e) => e.stopPropagation()}\n data-testid={`row-action-trigger-${rowId}`}\n >\n <Icon\n as={PiDotsThreeVerticalBold}\n boxSize=\"16px\"\n color=\"gray.300\"\n />\n </Flex>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content\n minW=\"180px\"\n data-testid={`row-action-menu-${rowId}`}\n >\n {onOpen && (\n <Menu.Item\n value=\"open\"\n onClick={() => onOpen(rowId)}\n data-testid={`row-action-menu-open-${rowId}`}\n >\n <PiArrowSquareRightLight />\n <Text>Open</Text>\n </Menu.Item>\n )}\n {onOpen && (onSelect || onDuplicate || onDelete) && (\n <Menu.Separator />\n )}\n <RowActionMenuItems\n rowId={rowId}\n testIdPrefix=\"row-action\"\n onSelect={onSelect}\n onDuplicate={onDuplicate}\n onDelete={onDelete}\n />\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n )}\n </Flex>\n </Flex>\n );\n};\n","import { FC } from 'react';\nimport { Box, Checkbox, Flex } from '@chakra-ui/react';\nimport { CELL_BORDER_COLOR } from './borderConstants.js';\n\ninterface SelectionCheckboxCellProps {\n rowId: string;\n isSelected: boolean;\n onToggleSelection: () => void;\n}\n\nexport const SelectionCheckboxCell: FC<SelectionCheckboxCellProps> = ({\n rowId,\n isSelected,\n onToggleSelection,\n}) => {\n return (\n <Box\n as=\"td\"\n width=\"40px\"\n minWidth=\"40px\"\n maxWidth=\"40px\"\n p={0}\n position=\"sticky\"\n left={0}\n zIndex={1}\n bg=\"white\"\n boxShadow={`inset 0 -1px 0 0 ${CELL_BORDER_COLOR}, inset -1px 0 0 0 ${CELL_BORDER_COLOR}`}\n >\n <Flex alignItems=\"center\" justifyContent=\"center\" height=\"100%\">\n <Checkbox.Root\n checked={isSelected}\n onCheckedChange={() => onToggleSelection()}\n size=\"sm\"\n data-testid={`select-${rowId}`}\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n </Checkbox.Root>\n </Flex>\n </Box>\n );\n};\n","import { observer } from 'mobx-react-lite';\nimport { Box } from '@chakra-ui/react';\nimport type { SystemStyleObject } from '@chakra-ui/react';\nimport type { RowVM } from '../model/RowVM.js';\nimport type { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\nimport type { SearchForeignKeySearchFn } from '../../../search-foreign-key/index.js';\nimport {\n CELL_BORDER_COLOR,\n BOTTOM_BORDER_SHADOW,\n buildAddColumnShadowCss,\n adjustRightOffsetCss,\n} from './borderConstants.js';\nimport { CellRenderer } from './Cell/CellRenderer.js';\nimport { RowActionOverlay } from './RowActionOverlay.js';\nimport { SelectionCheckboxCell } from './SelectionCheckboxCell.js';\n\nconst SELECTION_COLUMN_WIDTH = 40;\nconst ADD_COLUMN_BUTTON_WIDTH = 40;\n\ninterface DataRowProps {\n row: RowVM;\n columnsModel: ColumnsModel;\n showSelection: boolean;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n onUploadFile?: (params: {\n rowId: string;\n fileId: string;\n file: File;\n }) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n onOpenRow?: (rowId: string) => void;\n onPickRow?: (rowId: string) => void;\n onSelectRow?: (rowId: string) => void;\n onDuplicateRow?: (rowId: string) => void;\n onDeleteRow?: (rowId: string) => void;\n}\n\nfunction buildShadowCss(side: 'left' | 'right'): SystemStyleObject {\n const cssVar =\n side === 'left'\n ? 'var(--shadow-left-opacity, 0)'\n : 'var(--shadow-right-opacity, 0)';\n return {\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: '8px',\n pointerEvents: 'none',\n transition: 'opacity 0.15s',\n opacity: cssVar,\n ...(side === 'left'\n ? {\n right: '-8px',\n boxShadow: 'inset 8px 0 12px -8px rgba(0,0,0,0.1)',\n }\n : {\n left: '-8px',\n boxShadow: 'inset -8px 0 12px -8px rgba(0,0,0,0.1)',\n }),\n },\n };\n}\n\nfunction buildCellCss(\n isBoundary: boolean,\n boundarySide: 'left' | 'right',\n hasRowActions: boolean,\n isFirstColumn: boolean,\n): SystemStyleObject | undefined {\n const needsHover = isFirstColumn && hasRowActions;\n const hoverCss: SystemStyleObject = needsHover\n ? {\n '& .row-action-buttons': {\n opacity: 0,\n },\n '&:hover .row-action-buttons, & .row-action-buttons[data-menu-open]': {\n opacity: 1,\n transition: 'opacity 0.15s ease',\n },\n }\n : {};\n\n if (isBoundary) {\n return {\n ...hoverCss,\n ...buildShadowCss(boundarySide),\n };\n }\n\n if (needsHover) {\n return hoverCss;\n }\n\n return undefined;\n}\n\ninterface StickyColumnProps {\n isSticky: boolean;\n isBoundary: boolean;\n boundarySide: 'left' | 'right';\n leftCss?: string;\n rightCss?: string;\n colWidth?: string;\n}\n\nfunction computeStickyProps(\n col: { field: string },\n columnsModel: ColumnsModel,\n selectionWidth: number,\n addColOffset: number,\n): StickyColumnProps {\n const leftCss = columnsModel.getColumnStickyLeftCss(\n col.field,\n selectionWidth,\n );\n const rightCss = columnsModel.getColumnStickyRightCss(col.field);\n const isStickyLeft = leftCss !== undefined;\n const isStickyRight = rightCss !== undefined;\n const isSticky = isStickyLeft || isStickyRight;\n const isLeftBoundary = columnsModel.isStickyLeftBoundary(col.field);\n const isRightBoundary = columnsModel.isStickyRightBoundary(col.field);\n\n const finalRightCss =\n isStickyRight && rightCss !== undefined\n ? adjustRightOffsetCss(rightCss, addColOffset)\n : rightCss;\n\n return {\n isSticky,\n isBoundary: isLeftBoundary || isRightBoundary,\n boundarySide: isStickyLeft ? 'left' : 'right',\n leftCss: isStickyLeft ? leftCss : undefined,\n rightCss: isStickyRight ? finalRightCss : undefined,\n colWidth: isSticky ? columnsModel.columnWidthCssVar(col.field) : undefined,\n };\n}\n\nfunction getCellBoxShadow(isSticky: boolean, side: 'left' | 'right'): string {\n if (!isSticky) {\n return BOTTOM_BORDER_SHADOW;\n }\n const stickyBorder =\n side === 'left'\n ? `inset -1px 0 0 0 ${CELL_BORDER_COLOR}`\n : `inset 1px 0 0 0 ${CELL_BORDER_COLOR}`;\n return `${BOTTOM_BORDER_SHADOW}, ${stickyBorder}`;\n}\n\nexport const DataRow = observer(\n ({\n row,\n columnsModel,\n showSelection,\n onSearchForeignKey,\n onUploadFile,\n onOpenFile,\n onOpenRow,\n onPickRow,\n onSelectRow,\n onDuplicateRow,\n onDeleteRow,\n }: DataRowProps) => {\n const hasRowActions = Boolean(\n onOpenRow || onPickRow || onSelectRow || onDuplicateRow || onDeleteRow,\n );\n\n const selectionWidth = showSelection ? SELECTION_COLUMN_WIDTH : 0;\n const addColumnStickyRight = columnsModel.hasHiddenColumns;\n const addColOffset = addColumnStickyRight ? ADD_COLUMN_BUTTON_WIDTH : 0;\n\n return (\n <>\n {showSelection && (\n <SelectionCheckboxCell\n rowId={row.rowId}\n isSelected={row.isSelected}\n onToggleSelection={() => row.toggleSelection()}\n />\n )}\n {columnsModel.visibleColumns.map((col, index) => {\n const cellVM = row.getCellVM(col);\n const isFirstColumn = index === 0;\n const showOverlay =\n isFirstColumn && hasRowActions && !cellVM.isEditing;\n\n const sticky = computeStickyProps(\n col,\n columnsModel,\n selectionWidth,\n addColOffset,\n );\n\n return (\n <Box\n as=\"td\"\n key={col.field}\n width={sticky.colWidth}\n minWidth={sticky.colWidth}\n maxWidth={sticky.isSticky ? sticky.colWidth : '0'}\n overflow={sticky.isBoundary ? 'visible' : 'hidden'}\n borderRight={sticky.isSticky ? undefined : '1px solid'}\n borderColor={sticky.isSticky ? undefined : CELL_BORDER_COLOR}\n p={0}\n position={sticky.isSticky ? 'sticky' : 'relative'}\n left={sticky.leftCss}\n right={sticky.rightCss}\n zIndex={sticky.isSticky ? 1 : undefined}\n bg={sticky.isSticky ? 'white' : undefined}\n boxShadow={getCellBoxShadow(sticky.isSticky, sticky.boundarySide)}\n css={buildCellCss(\n sticky.isBoundary,\n sticky.boundarySide,\n hasRowActions,\n isFirstColumn,\n )}\n >\n {sticky.isBoundary ? (\n <Box overflow=\"hidden\">\n <CellRenderer\n cell={cellVM}\n onSearchForeignKey={onSearchForeignKey}\n onUploadFile={onUploadFile}\n onOpenFile={onOpenFile}\n />\n </Box>\n ) : (\n <CellRenderer\n cell={cellVM}\n onSearchForeignKey={onSearchForeignKey}\n onUploadFile={onUploadFile}\n onOpenFile={onOpenFile}\n />\n )}\n {showOverlay && (\n <RowActionOverlay\n rowId={row.rowId}\n onOpen={onOpenRow}\n onPick={onPickRow}\n onSelect={onSelectRow}\n onDuplicate={onDuplicateRow}\n onDelete={onDeleteRow}\n />\n )}\n </Box>\n );\n })}\n {addColumnStickyRight ? (\n <Box\n as=\"td\"\n width=\"100%\"\n minWidth={`${ADD_COLUMN_BUTTON_WIDTH}px`}\n p={0}\n position=\"sticky\"\n right={0}\n zIndex={1}\n bg=\"white\"\n boxShadow={BOTTOM_BORDER_SHADOW}\n css={\n columnsModel.pinnedRightCount === 0\n ? buildAddColumnShadowCss()\n : undefined\n }\n />\n ) : (\n <Box as=\"td\" width=\"100%\" p={0} boxShadow={BOTTOM_BORDER_SHADOW} />\n )}\n </>\n );\n },\n);\n","import { observer } from 'mobx-react-lite';\nimport { ActionBar, Button, Portal } from '@chakra-ui/react';\nimport { LuCopy, LuTrash2 } from 'react-icons/lu';\nimport { PiCheckSquare, PiX } from 'react-icons/pi';\nimport type { SelectionModel } from '../model/SelectionModel.js';\n\ninterface SelectionToolbarProps {\n selection: SelectionModel;\n allRowIds: string[];\n onDuplicate?: (ids: string[]) => void;\n onDelete?: (ids: string[]) => void;\n}\n\nexport const SelectionToolbar = observer(\n ({ selection, allRowIds, onDuplicate, onDelete }: SelectionToolbarProps) => {\n const isAllSelected = selection.isAllSelected(allRowIds);\n\n return (\n <ActionBar.Root open={selection.isSelectionMode}>\n <Portal>\n <ActionBar.Positioner zIndex={5}>\n <ActionBar.Content data-testid=\"selection-toolbar\">\n <ActionBar.SelectionTrigger>\n {selection.selectedCount} selected\n </ActionBar.SelectionTrigger>\n <ActionBar.Separator />\n {!isAllSelected && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => selection.selectAll(allRowIds)}\n data-testid=\"select-all\"\n >\n <PiCheckSquare />\n Select all\n </Button>\n )}\n {onDuplicate && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onDuplicate(selection.selectedIds)}\n data-testid=\"duplicate-selected\"\n >\n <LuCopy />\n Duplicate\n </Button>\n )}\n {onDelete && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => onDelete(selection.selectedIds)}\n data-testid=\"delete-selected\"\n >\n <LuTrash2 />\n Delete\n </Button>\n )}\n <ActionBar.CloseTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Exit selection\"\n onClick={() => selection.exitSelectionMode()}\n data-testid=\"exit-selection\"\n >\n <PiX />\n </Button>\n </ActionBar.CloseTrigger>\n </ActionBar.Content>\n </ActionBar.Positioner>\n </Portal>\n </ActionBar.Root>\n );\n },\n);\n","import { FC, useRef } from 'react';\nimport { Button, Flex, Portal, Text } from '@chakra-ui/react';\nimport {\n DialogBackdrop,\n DialogBody,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogPositioner,\n DialogRoot,\n DialogTitle,\n} from '@chakra-ui/react/dialog';\n\ninterface DeleteConfirmDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void;\n count?: number;\n}\n\nexport const DeleteConfirmDialog: FC<DeleteConfirmDialogProps> = ({\n isOpen,\n onClose,\n onConfirm,\n count,\n}) => {\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const message =\n count && count > 1\n ? `Are you sure you want to delete ${count} rows?`\n : 'Are you sure you want to delete this row?';\n\n return (\n <DialogRoot\n open={isOpen}\n onOpenChange={({ open }) => {\n if (!open) {\n onClose();\n }\n }}\n initialFocusEl={() => cancelRef.current}\n role=\"alertdialog\"\n >\n <Portal>\n <DialogBackdrop />\n <DialogPositioner>\n <DialogContent maxWidth=\"400px\" data-testid=\"delete-confirm-dialog\">\n <DialogHeader>\n <DialogTitle>Delete confirmation</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <Text>{message}</Text>\n </DialogBody>\n <DialogFooter>\n <Flex gap={2}>\n <Button\n ref={cancelRef}\n variant=\"outline\"\n size=\"sm\"\n onClick={onClose}\n data-testid=\"delete-cancel\"\n >\n Cancel\n </Button>\n <Button\n colorPalette=\"red\"\n size=\"sm\"\n onClick={onConfirm}\n data-testid=\"delete-confirm\"\n >\n Delete\n </Button>\n </Flex>\n </DialogFooter>\n </DialogContent>\n </DialogPositioner>\n </Portal>\n </DialogRoot>\n );\n};\n","import React from 'react';\n\ninterface TableProps {\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nexport const TableComponent: React.FC<TableProps> = ({\n style,\n children,\n ...props\n}) => (\n <table\n {...props}\n style={{\n ...style,\n width: 'max-content',\n minWidth: '100%',\n tableLayout: 'fixed',\n borderCollapse: 'separate',\n borderSpacing: 0,\n }}\n >\n {children}\n </table>\n);\n","import React from 'react';\nimport type { TableWidgetContext } from './TableWidget.js';\n\ninterface TableRowProps {\n 'data-index': number;\n context?: TableWidgetContext;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nexport const TableRowComponent: React.FC<TableRowProps> = ({\n 'data-index': index,\n context,\n style,\n children,\n ...props\n}) => {\n const row = context?.rows[index];\n\n return (\n <tr\n {...props}\n className=\"group\"\n data-testid={row ? `row-${row.rowId}` : undefined}\n style={{\n ...style,\n height: '40px',\n }}\n >\n {children}\n </tr>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface ShadowState {\n left: boolean;\n right: boolean;\n}\n\nconst INITIAL_SHADOW: ShadowState = { left: false, right: false };\n\nexport class ScrollShadowModel {\n private _left = false;\n private _right = false;\n private _paused = false;\n private _dirty = false;\n private _onChange: ((state: ShadowState) => void) | null = null;\n\n get showLeftShadow(): boolean {\n return this._left;\n }\n\n get showRightShadow(): boolean {\n return this._right;\n }\n\n setOnChange(cb: ((state: ShadowState) => void) | null): void {\n this._onChange = cb;\n }\n\n pause(): void {\n this._paused = true;\n this._dirty = false;\n }\n\n resume(): void {\n this._paused = false;\n if (this._dirty) {\n this._dirty = false;\n this._notify();\n }\n }\n\n update(left: boolean, right: boolean): void {\n if (this._left === left && this._right === right) {\n return;\n }\n this._left = left;\n this._right = right;\n if (this._paused) {\n this._dirty = true;\n return;\n }\n this._notify();\n }\n\n reset(): void {\n if (!this._left && !this._right) {\n return;\n }\n this._left = false;\n this._right = false;\n if (this._paused) {\n this._dirty = true;\n return;\n }\n this._notify();\n }\n\n private _notify(): void {\n if (this._onChange) {\n this._onChange({ left: this._left, right: this._right });\n }\n }\n}\n\ntype ScrollTarget = HTMLElement | Window;\n\nfunction getScrollElement(target: ScrollTarget): HTMLElement | null {\n if (target instanceof HTMLElement) {\n return target;\n }\n return document.scrollingElement as HTMLElement | null;\n}\n\nexport function useScrollShadow(): {\n shadowCssVars: Record<string, string>;\n shadowModel: ScrollShadowModel;\n setScrollerRef: (el: ScrollTarget | null) => void;\n} {\n const modelRef = useRef<ScrollShadowModel | null>(null);\n if (!modelRef.current) {\n modelRef.current = new ScrollShadowModel();\n }\n const model = modelRef.current;\n\n const [shadow, setShadow] = useState<ShadowState>(INITIAL_SHADOW);\n\n model.setOnChange(setShadow);\n\n useEffect(() => {\n return () => {\n model.setOnChange(null);\n };\n }, [model]);\n\n const shadowCssVars: Record<string, string> = {\n '--shadow-left-opacity': shadow.left ? '1' : '0',\n '--shadow-right-opacity': shadow.right ? '1' : '0',\n };\n\n const targetRef = useRef<ScrollTarget | null>(null);\n const rafRef = useRef<number>(0);\n const roRef = useRef<ResizeObserver | null>(null);\n\n const update = useCallback(() => {\n const target = targetRef.current;\n if (!target) {\n return;\n }\n const el = getScrollElement(target);\n if (!el) {\n return;\n }\n const scrollLeft = el.scrollLeft;\n const maxScroll = el.scrollWidth - el.clientWidth;\n model.update(scrollLeft > 0, maxScroll > 1 && scrollLeft < maxScroll - 1);\n }, [model]);\n\n const handleScroll = useCallback(() => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n rafRef.current = requestAnimationFrame(update);\n }, [update]);\n\n const setScrollerRef = useCallback(\n (el: ScrollTarget | null) => {\n const prev = targetRef.current;\n if (prev) {\n prev.removeEventListener('scroll', handleScroll);\n }\n if (roRef.current) {\n roRef.current.disconnect();\n roRef.current = null;\n }\n if (el) {\n targetRef.current = el;\n el.addEventListener('scroll', handleScroll, { passive: true });\n rafRef.current = requestAnimationFrame(update);\n\n const scrollEl = getScrollElement(el);\n if (scrollEl) {\n const ro = new ResizeObserver(handleScroll);\n const table = scrollEl.querySelector('table');\n if (table) {\n ro.observe(table);\n }\n roRef.current = ro;\n }\n } else {\n targetRef.current = null;\n model.reset();\n }\n },\n [handleScroll, update, model],\n );\n\n useEffect(() => {\n return () => {\n const prev = targetRef.current;\n if (prev) {\n prev.removeEventListener('scroll', handleScroll);\n }\n if (roRef.current) {\n roRef.current.disconnect();\n }\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [handleScroll]);\n\n return { shadowCssVars, shadowModel: model, setScrollerRef };\n}\n","import { observer } from 'mobx-react-lite';\nimport { Box, Spinner, Text } from '@chakra-ui/react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { TableVirtuoso } from 'react-virtuoso';\nimport type { RowVM } from '../model/RowVM.js';\nimport type { CellFSM } from '../model/CellFSM.js';\nimport type { SelectionModel } from '../model/SelectionModel.js';\nimport type { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\nimport type { FilterModel } from '../../Filters/model/FilterModel.js';\nimport type { SortModel } from '../../Sortings/model/SortModel.js';\nimport type { SearchForeignKeySearchFn } from '../../../search-foreign-key/index.js';\nimport {\n copyRangeToClipboard,\n pasteRangeFromClipboard,\n getFocusedPosition,\n clearRange,\n} from '../model/clipboardOperations.js';\nimport { HeaderRow } from './HeaderRow.js';\nimport { DataRow } from './DataRow.js';\nimport { SelectionToolbar } from './SelectionToolbar.js';\nimport { DeleteConfirmDialog } from './DeleteConfirmDialog/DeleteConfirmDialog.js';\nimport type { CellContextActions } from './Cell/CellContextActionsContext.js';\nimport { CellContextActionsContext } from './Cell/CellContextActionsContext.js';\nimport { TableComponent } from './TableComponent.js';\nimport { TableRowComponent } from './TableRowComponent.js';\nimport { useScrollShadow } from './hooks/useScrollShadow.js';\n\ninterface DeleteConfirmState {\n rowId?: string;\n batchIds?: string[];\n}\n\nexport interface TableWidgetContext {\n rows: RowVM[];\n}\n\ninterface TableWidgetProps {\n rows: RowVM[];\n columnsModel: ColumnsModel;\n cellFSM?: CellFSM;\n selection: SelectionModel;\n sortModel?: SortModel;\n filterModel?: FilterModel;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n onUploadFile?: (params: {\n rowId: string;\n fileId: string;\n file: File;\n }) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n onOpenRow?: (rowId: string) => void;\n onPickRow?: (rowId: string) => void;\n onDeleteSelected?: (ids: string[]) => void;\n onDuplicateSelected?: (ids: string[]) => void;\n onDeleteRow?: (rowId: string) => void;\n onDuplicateRow?: (rowId: string) => void;\n onCopyPath?: (path: string) => void;\n onEndReached?: () => void;\n isLoadingMore?: boolean;\n useWindowScroll?: boolean;\n}\n\nconst baseComponents = {\n Table: TableComponent,\n TableRow: TableRowComponent,\n};\n\nexport const TableWidget = observer(\n ({\n rows,\n columnsModel,\n cellFSM,\n selection,\n sortModel,\n filterModel,\n onSearchForeignKey,\n onUploadFile,\n onOpenFile,\n onOpenRow,\n onPickRow,\n onDeleteSelected,\n onDuplicateSelected,\n onDeleteRow,\n onDuplicateRow,\n onCopyPath,\n onEndReached,\n isLoadingMore,\n useWindowScroll: useWindowScrollProp,\n }: TableWidgetProps) => {\n const showSelection = selection.isSelectionMode;\n const allRowIds = rows.map((r) => r.rowId);\n const [deleteConfirm, setDeleteConfirm] =\n useState<DeleteConfirmState | null>(null);\n\n const { shadowCssVars, shadowModel, setScrollerRef } = useScrollShadow();\n\n const isResizing = columnsModel.isResizing;\n useEffect(() => {\n if (isResizing) {\n shadowModel.pause();\n } else {\n shadowModel.resume();\n }\n }, [isResizing, shadowModel]);\n\n const [wrapperEl, setWrapperEl] = useState<HTMLDivElement | null>(null);\n\n const wrapperRefCallback = useCallback(\n (el: HTMLDivElement | null) => {\n setWrapperEl(el);\n columnsModel.setWrapperElement(el);\n },\n [columnsModel],\n );\n\n useEffect(() => {\n if (!useWindowScrollProp || !wrapperEl) {\n return;\n }\n setScrollerRef(wrapperEl);\n return () => {\n setScrollerRef(null);\n };\n }, [useWindowScrollProp, wrapperEl, setScrollerRef]);\n\n const handleSelectRow = useCallback(\n (rowId: string) => {\n selection.enterSelectionMode(rowId);\n },\n [selection],\n );\n\n const handleDeleteRowRequest = useCallback((rowId: string) => {\n setDeleteConfirm({ rowId });\n }, []);\n\n const handleBatchDeleteRequest = useCallback((ids: string[]) => {\n setDeleteConfirm({ batchIds: ids });\n }, []);\n\n const handleDeleteConfirm = useCallback(() => {\n if (deleteConfirm?.rowId) {\n selection.deselect(deleteConfirm.rowId);\n if (onDeleteRow) {\n onDeleteRow(deleteConfirm.rowId);\n } else if (onDeleteSelected) {\n onDeleteSelected([deleteConfirm.rowId]);\n }\n } else if (deleteConfirm?.batchIds) {\n onDeleteSelected?.(deleteConfirm.batchIds);\n selection.exitSelectionMode();\n }\n setDeleteConfirm(null);\n }, [deleteConfirm, onDeleteRow, onDeleteSelected, selection]);\n\n const handleDeleteCancel = useCallback(() => {\n setDeleteConfirm(null);\n }, []);\n\n const deleteCount = deleteConfirm?.batchIds?.length;\n\n const canDeleteRow = Boolean(onDeleteRow || onDeleteSelected);\n const canDuplicateRow = Boolean(onDuplicateRow);\n const canSelect =\n canDeleteRow || canDuplicateRow || Boolean(onDuplicateSelected);\n\n const contextActions = useMemo(\n (): CellContextActions => ({\n copyRange: () => {\n const range = cellFSM?.getSelectedRange();\n const cols = columnsModel.visibleColumns;\n if (range) {\n void copyRangeToClipboard(range, rows, cols);\n }\n },\n pasteRange: () => {\n if (!cellFSM) {\n return;\n }\n const cols = columnsModel.visibleColumns;\n const range = cellFSM.getSelectedRange();\n const focusedPos = getFocusedPosition(cellFSM, cols, rows);\n if (range) {\n void pasteRangeFromClipboard(\n range.startRow,\n range.startCol,\n rows,\n cols,\n );\n } else if (focusedPos) {\n void pasteRangeFromClipboard(\n focusedPos.rowIndex,\n focusedPos.colIndex,\n rows,\n cols,\n );\n }\n },\n clearRange: () => {\n const range = cellFSM?.getSelectedRange();\n const cols = columnsModel.visibleColumns;\n if (range) {\n clearRange(range, rows, cols);\n }\n },\n }),\n [cellFSM, rows, columnsModel],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!cellFSM) {\n return;\n }\n\n const isMod = e.ctrlKey || e.metaKey;\n const cols = columnsModel.visibleColumns;\n\n if (isMod && e.key === 'v' && cellFSM.focusedCell) {\n const range = cellFSM.getSelectedRange();\n const focusedPos = getFocusedPosition(cellFSM, cols, rows);\n if (range) {\n e.preventDefault();\n void pasteRangeFromClipboard(\n range.startRow,\n range.startCol,\n rows,\n cols,\n );\n } else if (focusedPos) {\n e.preventDefault();\n void pasteRangeFromClipboard(\n focusedPos.rowIndex,\n focusedPos.colIndex,\n rows,\n cols,\n );\n }\n return;\n }\n\n if (!cellFSM.hasSelection) {\n return;\n }\n\n if (isMod && e.key === 'c') {\n const range = cellFSM.getSelectedRange();\n if (range) {\n e.preventDefault();\n void copyRangeToClipboard(range, rows, cols);\n }\n return;\n }\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n const range = cellFSM.getSelectedRange();\n if (range) {\n e.preventDefault();\n clearRange(range, rows, cols);\n }\n }\n },\n [cellFSM, rows, columnsModel],\n );\n\n const itemContent = useCallback(\n (_index: number, row: RowVM) => (\n <DataRow\n row={row}\n columnsModel={columnsModel}\n showSelection={showSelection}\n onSearchForeignKey={onSearchForeignKey}\n onUploadFile={onUploadFile}\n onOpenFile={onOpenFile}\n onOpenRow={onOpenRow}\n onPickRow={onPickRow}\n onSelectRow={canSelect ? handleSelectRow : undefined}\n onDuplicateRow={canDuplicateRow ? onDuplicateRow : undefined}\n onDeleteRow={canDeleteRow ? handleDeleteRowRequest : undefined}\n />\n ),\n [\n columnsModel,\n showSelection,\n onSearchForeignKey,\n onUploadFile,\n onOpenFile,\n onOpenRow,\n onPickRow,\n canSelect,\n canDeleteRow,\n canDuplicateRow,\n handleSelectRow,\n onDuplicateRow,\n handleDeleteRowRequest,\n ],\n );\n\n const fixedHeaderContent = useCallback(\n () => (\n <HeaderRow\n columnsModel={columnsModel}\n sortModel={sortModel}\n filterModel={filterModel}\n onCopyPath={onCopyPath}\n showSelection={showSelection}\n />\n ),\n [columnsModel, sortModel, filterModel, onCopyPath, showSelection],\n );\n\n const virtuosoContext = useMemo(\n (): TableWidgetContext => ({\n rows,\n }),\n [rows],\n );\n\n const totalColumns =\n columnsModel.visibleColumns.length + (showSelection ? 2 : 1);\n\n const LoadingMoreFooter = useCallback(\n () =>\n isLoadingMore ? (\n <tfoot>\n <tr>\n <td\n colSpan={totalColumns}\n style={{ textAlign: 'center', padding: '16px 0' }}\n >\n <Spinner size=\"sm\" color=\"gray.400\" />\n </td>\n </tr>\n </tfoot>\n ) : null,\n [isLoadingMore, totalColumns],\n );\n\n const tableComponents = useMemo(\n () => ({\n ...baseComponents,\n Footer: LoadingMoreFooter,\n }),\n [LoadingMoreFooter],\n );\n\n if (columnsModel.visibleColumns.length === 0) {\n return (\n <Box p={4}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n No columns to display.\n </Text>\n </Box>\n );\n }\n\n return (\n <CellContextActionsContext.Provider\n value={cellFSM ? contextActions : null}\n >\n <Box\n ref={wrapperRefCallback}\n position=\"relative\"\n height={useWindowScrollProp ? undefined : '100%'}\n overflowX=\"auto\"\n overflowY={useWindowScrollProp ? 'clip' : undefined}\n data-testid=\"table-widget\"\n onKeyDown={handleKeyDown}\n style={\n {\n ...columnsModel.columnWidthCssVars,\n ...shadowCssVars,\n } as React.CSSProperties\n }\n >\n {rows.length === 0 ? (\n <Box>\n <table\n style={{\n width: 'max-content',\n minWidth: '100%',\n tableLayout: 'fixed',\n borderCollapse: 'separate',\n borderSpacing: 0,\n }}\n >\n <thead>\n <HeaderRow\n columnsModel={columnsModel}\n sortModel={sortModel}\n filterModel={filterModel}\n onCopyPath={onCopyPath}\n showSelection={showSelection}\n />\n </thead>\n </table>\n <Box p={4}>\n <Text fontSize=\"sm\" color=\"gray.500\">\n No rows to display.\n </Text>\n </Box>\n </Box>\n ) : (\n <TableVirtuoso\n useWindowScroll={useWindowScrollProp}\n style={useWindowScrollProp ? undefined : { height: '100%' }}\n data={rows}\n context={virtuosoContext}\n defaultItemHeight={40}\n initialItemCount={Math.min(rows.length, 20)}\n increaseViewportBy={40 * 50}\n endReached={onEndReached}\n fixedHeaderContent={fixedHeaderContent}\n itemContent={itemContent}\n components={tableComponents}\n scrollerRef={useWindowScrollProp ? undefined : setScrollerRef}\n />\n )}\n <SelectionToolbar\n selection={selection}\n allRowIds={allRowIds}\n onDuplicate={onDuplicateSelected}\n onDelete={onDeleteSelected ? handleBatchDeleteRequest : undefined}\n />\n </Box>\n <DeleteConfirmDialog\n isOpen={deleteConfirm !== null}\n onClose={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n count={deleteCount}\n />\n </CellContextActionsContext.Provider>\n );\n },\n);\n","import { FC, useState } from 'react';\nimport { Flex, Icon, Menu, Portal, Text } from '@chakra-ui/react';\nimport { LuCopy, LuTrash2 } from 'react-icons/lu';\nimport { PiCheckSquare, PiDotsThreeVerticalBold } from 'react-icons/pi';\n\ninterface RowActionsMenuProps {\n rowId: string;\n onSelect?: (rowId: string) => void;\n onDuplicate?: (rowId: string) => void;\n onDelete?: (rowId: string) => void;\n}\n\nexport const RowActionsMenu: FC<RowActionsMenuProps> = ({\n rowId,\n onSelect,\n onDuplicate,\n onDelete,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n\n const hasItems = Boolean(onSelect || onDuplicate || onDelete);\n if (!hasItems) {\n return null;\n }\n\n return (\n <Menu.Root\n lazyMount\n unmountOnExit\n onOpenChange={({ open }) => setIsOpen(open)}\n >\n <Menu.Trigger asChild>\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n cursor=\"pointer\"\n data-testid={`row-menu-trigger-${rowId}`}\n >\n <Flex\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"24px\"\n width=\"24px\"\n borderRadius=\"4px\"\n bg=\"white\"\n boxShadow=\"0 0 0 1px rgba(0,0,0,0.06), 0 1px 1px rgba(0,0,0,0.08)\"\n opacity={isOpen ? 1 : 0}\n transition={isOpen ? 'opacity 1s ease 0s' : undefined}\n _groupHover={{\n opacity: 1,\n transition: 'opacity 0.15s ease 0s',\n }}\n _hover={{\n boxShadow:\n '0 0 0 1px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.1)',\n }}\n >\n <Icon size=\"sm\" color=\"gray.500\" as={PiDotsThreeVerticalBold} />\n </Flex>\n </Flex>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"160px\" data-testid={`row-menu-${rowId}`}>\n {onSelect && (\n <Menu.Item\n value=\"select\"\n onClick={() => onSelect(rowId)}\n data-testid={`row-menu-select-${rowId}`}\n >\n <PiCheckSquare />\n <Text>Select</Text>\n </Menu.Item>\n )}\n {onDuplicate && (\n <Menu.Item\n value=\"duplicate\"\n onClick={() => onDuplicate(rowId)}\n data-testid={`row-menu-duplicate-${rowId}`}\n >\n <LuCopy />\n <Text>Duplicate</Text>\n </Menu.Item>\n )}\n {onDelete && (\n <>\n {(onSelect || onDuplicate) && <Menu.Separator />}\n <Menu.Item\n value=\"delete\"\n onClick={() => onDelete(rowId)}\n data-testid={`row-menu-delete-${rowId}`}\n >\n <LuTrash2 />\n <Text color=\"red.600\">Delete</Text>\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n","import { makeAutoObservable } from 'mobx';\n\nexport class RowCountModel {\n private _totalCount = 0;\n private _baseTotalCount = 0;\n private _isFiltering = false;\n private _isRefetching = false;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get totalCount(): number {\n return this._totalCount;\n }\n\n get baseTotalCount(): number {\n return this._baseTotalCount;\n }\n\n get isFiltering(): boolean {\n return this._isFiltering;\n }\n\n get isRefetching(): boolean {\n return this._isRefetching;\n }\n\n get text(): string {\n if (this._isFiltering) {\n return `${this._totalCount} of ${this._baseTotalCount} ${this._baseTotalCount === 1 ? 'row' : 'rows'}`;\n }\n return `${this._totalCount} ${this._totalCount === 1 ? 'row' : 'rows'}`;\n }\n\n setTotalCount(count: number): void {\n this._totalCount = count;\n }\n\n setBaseTotalCount(count: number): void {\n this._baseTotalCount = count;\n }\n\n setIsFiltering(value: boolean): void {\n this._isFiltering = value;\n }\n\n setRefetching(value: boolean): void {\n this._isRefetching = value;\n }\n\n decrementBaseTotalCount(by: number = 1): void {\n this._baseTotalCount = Math.max(0, this._baseTotalCount - by);\n this._totalCount = Math.max(0, this._totalCount - by);\n }\n}\n","import { makeAutoObservable } from 'mobx';\n\nexport class ViewSettingsBadgeModel {\n private _snapshot: string | null = null;\n private _currentSnapshot: string | null = null;\n private _canSave = false;\n private _isPopoverOpen = false;\n private _onSave: (() => Promise<void>) | null = null;\n private _onRevert: (() => void) | null = null;\n\n constructor() {\n makeAutoObservable(this, {}, { autoBind: true });\n }\n\n get hasChanges(): boolean {\n return this._snapshot !== this._currentSnapshot;\n }\n\n get isVisible(): boolean {\n return this.hasChanges;\n }\n\n get canSave(): boolean {\n return this._canSave;\n }\n\n get isPopoverOpen(): boolean {\n return this._isPopoverOpen;\n }\n\n saveSnapshot(state: unknown): void {\n const json = JSON.stringify(state);\n this._snapshot = json;\n this._currentSnapshot = json;\n }\n\n checkForChanges(state: unknown): void {\n this._currentSnapshot = JSON.stringify(state);\n }\n\n async save(): Promise<void> {\n if (this._onSave) {\n await this._onSave();\n }\n }\n\n revert(): void {\n if (this._onRevert) {\n this._onRevert();\n }\n this._currentSnapshot = this._snapshot;\n }\n\n setCanSave(value: boolean): void {\n this._canSave = value;\n }\n\n setPopoverOpen(value: boolean): void {\n this._isPopoverOpen = value;\n }\n\n setOnSave(cb: (() => Promise<void>) | null): void {\n this._onSave = cb;\n }\n\n setOnRevert(cb: (() => void) | null): void {\n this._onRevert = cb;\n }\n\n dispose(): void {\n this._onSave = null;\n this._onRevert = null;\n }\n}\n","import { makeAutoObservable, runInAction } from 'mobx';\nimport { createTableModel } from '@revisium/schema-toolkit';\nimport { ColumnsModel } from '../../Columns/model/ColumnsModel.js';\nimport type { ViewColumn } from '../../Columns/model/types.js';\nimport { FilterModel } from '../../Filters/model/FilterModel.js';\nimport { SearchModel } from '../../Search/model/SearchModel.js';\nimport { SortModel } from '../../Sortings/model/SortModel.js';\nimport { RowCountModel } from '../../Status/model/RowCountModel.js';\nimport { ViewSettingsBadgeModel } from '../../Status/model/ViewSettingsBadgeModel.js';\nimport { CellFSM } from '../../Table/model/CellFSM.js';\nimport { RowVM } from '../../Table/model/RowVM.js';\nimport { SelectionModel } from '../../Table/model/SelectionModel.js';\nimport type { SearchForeignKeySearchFn } from '../../../search-foreign-key/vm/SearchForeignKeyVM.js';\nimport type {\n ITableDataSource,\n RowDataItem,\n TableQuery,\n} from './ITableDataSource.js';\nimport { SchemaContext, stripDataFieldPrefix } from './SchemaContext.js';\n\nexport interface ViewState {\n columns: ViewColumn[];\n filters: string | null;\n sorts: Array<{ field: string; direction: string }>;\n search: string;\n}\n\nexport interface TableEditorBreadcrumb {\n label: string;\n dataTestId?: string;\n}\n\nexport interface UploadFileParams {\n rowId: string;\n fileId: string;\n file: File;\n}\n\nexport interface TableEditorCallbacks {\n onBreadcrumbClick?: (segment: TableEditorBreadcrumb, index: number) => void;\n onCreateRow?: () => void;\n onOpenRow?: (rowId: string) => void;\n onPickRow?: (rowId: string) => void;\n onDuplicateRow?: (rowId: string) => void;\n onSearchForeignKey?: SearchForeignKeySearchFn;\n onCopyPath?: (path: string) => void;\n onUploadFile?: (\n params: UploadFileParams,\n ) => Promise<Record<string, unknown> | null>;\n onOpenFile?: (url: string) => void;\n onReadonlyEditAttempt?: () => void;\n}\n\nexport interface TableEditorOptions {\n tableId: string;\n pageSize?: number;\n breadcrumbs?: TableEditorBreadcrumb[];\n callbacks?: TableEditorCallbacks;\n}\n\nconst DEFAULT_PAGE_SIZE = 50;\n\nexport class TableEditorCore {\n public readonly columns: ColumnsModel;\n public readonly filters: FilterModel;\n public readonly sorts: SortModel;\n public readonly search: SearchModel;\n public readonly viewBadge: ViewSettingsBadgeModel;\n public readonly cellFSM: CellFSM;\n public readonly selection: SelectionModel;\n public readonly rowCount: RowCountModel;\n\n private readonly _dataSource: ITableDataSource;\n private readonly _pageSize: number;\n private readonly _breadcrumbs: TableEditorBreadcrumb[];\n private readonly _callbacks: TableEditorCallbacks;\n\n private readonly _tableId: string;\n private readonly _schemaContext = new SchemaContext();\n private _readonly = false;\n private _rows: RowVM[] = [];\n private _isBootstrapping = true;\n private _isLoadingMore = false;\n private _hasNextPage = false;\n private _endCursor: string | null = null;\n private _savedViewState: ViewState | null = null;\n\n constructor(dataSource: ITableDataSource, options: TableEditorOptions) {\n this._dataSource = dataSource;\n this._tableId = options.tableId;\n this._pageSize = options.pageSize ?? DEFAULT_PAGE_SIZE;\n this._breadcrumbs = options.breadcrumbs ?? [];\n this._callbacks = options.callbacks ?? {};\n\n this.columns = new ColumnsModel();\n this.filters = new FilterModel();\n this.sorts = new SortModel();\n this.search = new SearchModel((query) => this._handleSearch(query));\n this.viewBadge = new ViewSettingsBadgeModel();\n this.cellFSM = new CellFSM();\n this.selection = new SelectionModel();\n this.rowCount = new RowCountModel();\n\n this.columns.setOnChange(() => this._handleColumnsChange());\n this.filters.setOnChange(() => this._handleFilterChange());\n this.filters.setOnApply((_where) => this._handleFilterApply());\n this.sorts.setOnChange(() => this._handleSortChange());\n this.sorts.setOnApply((_sorts) => this._handleSortApply());\n this.viewBadge.setOnSave(() => this._handleViewSave());\n this.viewBadge.setOnRevert(() => this._handleViewRevert());\n this.cellFSM.setOnReadonlyEditAttempt(\n this._callbacks.onReadonlyEditAttempt ?? null,\n );\n\n makeAutoObservable(this, {}, { autoBind: true });\n\n queueMicrotask(() => void this._bootstrap());\n }\n\n get rows(): RowVM[] {\n return this._rows;\n }\n\n get isBootstrapping(): boolean {\n return this._isBootstrapping;\n }\n\n get isLoadingMore(): boolean {\n return this._isLoadingMore;\n }\n\n get readonly(): boolean {\n return this._readonly;\n }\n\n get tableId(): string {\n return this._tableId;\n }\n\n get breadcrumbs(): TableEditorBreadcrumb[] {\n return this._breadcrumbs;\n }\n\n get callbacks(): TableEditorCallbacks {\n return this._callbacks;\n }\n\n getViewState(): ViewState {\n return {\n columns: this.columns.serializeToViewColumns(),\n filters: null,\n sorts: this.sorts.serializeToViewSorts(),\n search: '',\n };\n }\n\n applyViewState(state: ViewState): void {\n this.columns.applyViewColumns(state.columns);\n this.sorts.applyViewSorts(state.sorts);\n }\n\n async loadMore(): Promise<void> {\n if (!this._hasNextPage || this._isLoadingMore) {\n return;\n }\n this._isLoadingMore = true;\n try {\n const query = this._buildQuery(this._endCursor);\n const result = await this._dataSource.fetchRows(query);\n runInAction(() => {\n this._appendRowVMs(result.rows);\n this._endCursor = result.endCursor;\n this._hasNextPage = result.hasNextPage;\n this._isLoadingMore = false;\n });\n } catch {\n runInAction(() => {\n this._isLoadingMore = false;\n });\n }\n }\n\n async deleteRows(rowIds: string[]): Promise<void> {\n const result = await this._dataSource.deleteRows(rowIds);\n if (result.ok) {\n runInAction(() => {\n const idSet = new Set(rowIds);\n this._rows = this._rows.filter((r) => !idSet.has(r.rowId));\n this.rowCount.decrementBaseTotalCount(rowIds.length);\n this.selection.exitSelectionMode();\n this._updateNavigationContext();\n });\n }\n }\n\n dispose(): void {\n this.columns.dispose();\n this.filters.dispose();\n this.sorts.dispose();\n this.search.dispose();\n this.viewBadge.dispose();\n this.selection.exitSelectionMode();\n this.cellFSM.blur();\n for (const row of this._rows) {\n row.dispose();\n }\n }\n\n private async _bootstrap(): Promise<void> {\n try {\n const meta = await this._dataSource.fetchMetadata();\n runInAction(() => {\n this._schemaContext.init(meta.dataSchema, meta.refSchemas);\n this._readonly = meta.readonly;\n this.viewBadge.setCanSave(!meta.readonly);\n });\n\n this.columns.init(this._schemaContext.allColumns);\n this.sorts.init(this._schemaContext.sortableFields);\n this.filters.init(this._schemaContext.filterableFields);\n\n if (meta.viewState) {\n this.applyViewState(meta.viewState);\n }\n this._saveViewSnapshot();\n\n await this._loadRows();\n\n runInAction(() => {\n this._isBootstrapping = false;\n });\n } catch {\n runInAction(() => {\n this._isBootstrapping = false;\n });\n }\n }\n\n private _buildQuery(after: string | null = null): TableQuery {\n return {\n where: this.filters.hasActiveFilters\n ? this.filters.buildCurrentWhereClause()\n : null,\n orderBy: this.sorts.serializeToViewSorts().map((s) => ({\n field: stripDataFieldPrefix(s.field),\n direction: s.direction,\n })),\n search: this.search.debouncedQuery,\n first: this._pageSize,\n after,\n };\n }\n\n private async _loadRows(): Promise<void> {\n const query = this._buildQuery();\n const result = await this._dataSource.fetchRows(query);\n runInAction(() => {\n this._replaceRowVMs(result.rows);\n this._endCursor = result.endCursor;\n this._hasNextPage = result.hasNextPage;\n this.rowCount.setTotalCount(result.totalCount);\n this.rowCount.setBaseTotalCount(result.totalCount);\n this.rowCount.setIsFiltering(\n this.filters.hasActiveFilters || this.search.hasActiveSearch,\n );\n this._updateNavigationContext();\n });\n }\n\n private async _reloadRows(): Promise<void> {\n if (this._isBootstrapping) {\n return;\n }\n this.selection.exitSelectionMode();\n this.cellFSM.blur();\n await this._loadRows();\n }\n\n private _replaceRowVMs(rawRows: RowDataItem[]): void {\n for (const row of this._rows) {\n row.dispose();\n }\n this._rows = this._createRowVMs(rawRows);\n }\n\n private _appendRowVMs(rawRows: RowDataItem[]): void {\n const newVMs = this._createRowVMs(rawRows);\n this._rows = [...this._rows, ...newVMs];\n this._updateNavigationContext();\n }\n\n private _createRowVMs(rawRows: RowDataItem[]): RowVM[] {\n const wrappedSchema = this._schemaContext.wrappedDataSchema;\n if (!wrappedSchema) {\n return [];\n }\n const tableModel = createTableModel({\n tableId: this._tableId,\n schema: wrappedSchema,\n rows: rawRows.map((r) => ({ rowId: r.rowId, data: { data: r.data } })),\n refSchemas: this._schemaContext.fullRefSchemas,\n });\n const systemValuesMap = new Map<string, Record<string, unknown>>();\n for (const raw of rawRows) {\n systemValuesMap.set(raw.rowId, this._buildSystemValues(raw));\n }\n return tableModel.rows.map(\n (rowModel) =>\n new RowVM(\n rowModel,\n rowModel.rowId,\n this.cellFSM,\n this.selection,\n (rowId, field, value, previousValue) =>\n this._commitCell(rowId, field, value, previousValue),\n systemValuesMap.get(rowModel.rowId),\n ),\n );\n }\n\n private _buildSystemValues(rawRow: RowDataItem): Record<string, unknown> {\n return {\n ...rawRow.systemFields,\n id: rawRow.rowId,\n };\n }\n\n private _toPatchField(field: string): string {\n return stripDataFieldPrefix(field);\n }\n\n private async _commitCell(\n rowId: string,\n field: string,\n value: unknown,\n previousValue?: unknown,\n ): Promise<void> {\n const patchField = this._toPatchField(field);\n const results = await this._dataSource.patchCells([\n { rowId, field: patchField, value },\n ]);\n const result = results[0];\n if (result && !result.ok) {\n runInAction(() => {\n const row = this._rows.find((r) => r.rowId === rowId);\n if (row && previousValue !== undefined) {\n const node = row.rowModel.get(field);\n if (node?.isPrimitive()) {\n node.setValue(previousValue);\n } else if (node?.isObject()) {\n node.setValue(previousValue as Record<string, unknown>, {\n internal: true,\n });\n }\n }\n });\n }\n }\n\n private _updateNavigationContext(): void {\n this.cellFSM.setNavigationContext(\n this.columns.visibleColumns.map((c) => c.field),\n this._rows.map((r) => r.rowId),\n );\n }\n\n private _handleColumnsChange(): void {\n this.cellFSM.updateNavigationContext(\n this.columns.visibleColumns.map((c) => c.field),\n this.cellFSM.rowIds,\n );\n this._checkViewChanges();\n }\n\n private _handleFilterChange(): void {\n // filters are ephemeral — not persisted in view settings\n }\n\n private _handleFilterApply(): void {\n void this._reloadRows();\n }\n\n private _handleSortChange(): void {\n this._checkViewChanges();\n }\n\n private _handleSortApply(): void {\n void this._reloadRows();\n this._checkViewChanges();\n }\n\n private _handleSearch(_query: string): void {\n void this._reloadRows();\n }\n\n private async _handleViewSave(): Promise<void> {\n try {\n const viewState = this.getViewState();\n const result = await this._dataSource.saveView(viewState);\n if (result.ok) {\n this._saveViewSnapshot();\n }\n } catch {\n // network/data-source error — badge stays visible\n }\n }\n\n private _handleViewRevert(): void {\n if (this._savedViewState) {\n this.applyViewState(this._savedViewState);\n void this._reloadRows();\n }\n }\n\n private _saveViewSnapshot(): void {\n const viewState = this.getViewState();\n this._savedViewState = viewState;\n this.viewBadge.saveSnapshot(viewState);\n }\n\n private _checkViewChanges(): void {\n this.viewBadge.checkForChanges(this.getViewState());\n }\n}\n","import type { JsonSchema, RefSchemas } from '@revisium/schema-toolkit';\nimport type {\n CellPatch,\n CellPatchResult,\n DeleteRowsResult,\n FetchRowsResult,\n ITableDataSource,\n RowDataItem,\n SystemFields,\n TableMetadata,\n TableQuery,\n} from './ITableDataSource.js';\nimport type { ViewState } from './TableEditorCore.js';\n\ninterface MockDataSourceParams {\n dataSchema: JsonSchema;\n rows: RowDataItem[];\n viewState?: ViewState | null;\n readonly?: boolean;\n failPatches?: Set<string>;\n refSchemas?: RefSchemas;\n}\n\nexport class MockDataSource implements ITableDataSource {\n private _allRows: RowDataItem[];\n private readonly _dataSchema: JsonSchema;\n private readonly _viewState: ViewState | null;\n private readonly _readonly: boolean;\n private readonly _failPatches: Set<string>;\n private readonly _refSchemas: RefSchemas | undefined;\n\n readonly fetchMetadataLog: Array<true> = [];\n readonly fetchLog: TableQuery[] = [];\n readonly patchLog: CellPatch[][] = [];\n readonly deleteLog: string[][] = [];\n readonly saveViewLog: ViewState[] = [];\n\n constructor(params: MockDataSourceParams) {\n this._dataSchema = params.dataSchema;\n this._allRows = [...params.rows];\n this._viewState = params.viewState ?? null;\n this._readonly = params.readonly ?? false;\n this._failPatches = params.failPatches ?? new Set();\n this._refSchemas = params.refSchemas;\n }\n\n static createRow(\n rowId: string,\n data: unknown,\n systemFields?: SystemFields,\n ): RowDataItem {\n const clonedData =\n data && typeof data === 'object' && !Array.isArray(data)\n ? { ...(data as Record<string, unknown>) }\n : data;\n const row: RowDataItem = { rowId, data: clonedData };\n if (systemFields) {\n row.systemFields = systemFields;\n }\n return row;\n }\n\n fetchMetadata(): Promise<TableMetadata> {\n this.fetchMetadataLog.push(true);\n return Promise.resolve({\n dataSchema: this._dataSchema,\n viewState: this._viewState,\n readonly: this._readonly,\n refSchemas: this._refSchemas,\n });\n }\n\n fetchRows(query: TableQuery): Promise<FetchRowsResult> {\n this.fetchLog.push(query);\n\n let rows = [...this._allRows];\n\n if (query.search) {\n const lower = query.search.toLowerCase();\n rows = rows.filter((row) => {\n const data = row.data;\n if (data && typeof data === 'object') {\n return Object.values(data).some(\n (val) =>\n typeof val === 'string' && val.toLowerCase().includes(lower),\n );\n }\n if (typeof data === 'string') {\n return data.toLowerCase().includes(lower);\n }\n return false;\n });\n }\n\n if (query.orderBy.length > 0) {\n const firstOrder = query.orderBy[0];\n if (firstOrder) {\n const field = firstOrder.field;\n const dir = firstOrder.direction === 'desc' ? -1 : 1;\n rows.sort((a, b) => {\n const aData = a.data as Record<string, unknown> | null;\n const bData = b.data as Record<string, unknown> | null;\n const aVal = aData?.[field];\n const bVal = bData?.[field];\n if (aVal === bVal) {\n return 0;\n }\n if (aVal == null) {\n return 1;\n }\n if (bVal == null) {\n return -1;\n }\n return aVal < bVal ? -dir : dir;\n });\n }\n }\n\n const totalCount = rows.length;\n\n let startIndex = 0;\n if (query.after) {\n const cursorIndex = rows.findIndex((r) => r.rowId === query.after);\n if (cursorIndex >= 0) {\n startIndex = cursorIndex + 1;\n }\n }\n\n const page = rows.slice(startIndex, startIndex + query.first);\n const hasNextPage = startIndex + query.first < rows.length;\n const lastRow = page.at(-1);\n const endCursor = lastRow ? lastRow.rowId : null;\n\n return Promise.resolve({ rows: page, totalCount, hasNextPage, endCursor });\n }\n\n patchCells(patches: CellPatch[]): Promise<CellPatchResult[]> {\n this.patchLog.push(patches);\n\n const results = patches.map((patch) => {\n const key = `${patch.rowId}/${patch.field}`;\n if (this._failPatches.has(key)) {\n return {\n rowId: patch.rowId,\n field: patch.field,\n ok: false as const,\n error: 'Mock failure',\n };\n }\n\n const row = this._allRows.find((r) => r.rowId === patch.rowId);\n if (\n row?.data &&\n typeof row.data === 'object' &&\n !Array.isArray(row.data)\n ) {\n (row.data as Record<string, unknown>)[patch.field] = patch.value;\n }\n\n return { rowId: patch.rowId, field: patch.field, ok: true as const };\n });\n\n return Promise.resolve(results);\n }\n\n deleteRows(rowIds: string[]): Promise<DeleteRowsResult> {\n this.deleteLog.push(rowIds);\n this._allRows = this._allRows.filter((r) => !rowIds.includes(r.rowId));\n return Promise.resolve({ ok: true });\n }\n\n saveView(viewState: ViewState): Promise<{ ok: boolean }> {\n this.saveViewLog.push(viewState);\n return Promise.resolve({ ok: true });\n }\n}\n","import { observer } from 'mobx-react-lite';\nimport { Flex, Spinner, Text } from '@chakra-ui/react';\nimport type { RowCountModel } from '../model/RowCountModel.js';\n\ninterface RowCountWidgetProps {\n model: RowCountModel;\n}\n\nexport const RowCountWidget = observer(({ model }: RowCountWidgetProps) => {\n return (\n <Flex alignItems=\"center\" gap={2}>\n <Text fontSize=\"sm\" color=\"gray.500\" data-testid=\"row-count-text\">\n {model.text}\n </Text>\n {model.isRefetching && (\n <Spinner size=\"xs\" color=\"gray.400\" data-testid=\"row-count-spinner\" />\n )}\n </Flex>\n );\n});\n","import { observer } from 'mobx-react-lite';\nimport {\n Badge,\n Box,\n Button,\n HStack,\n Popover,\n Portal,\n Text,\n} from '@chakra-ui/react';\nimport { LuInfo } from 'react-icons/lu';\nimport type { ViewSettingsBadgeModel } from '../model/ViewSettingsBadgeModel.js';\n\ninterface ViewSettingsBadgeProps {\n model: ViewSettingsBadgeModel;\n}\n\nexport const ViewSettingsBadge = observer(\n ({ model }: ViewSettingsBadgeProps) => {\n if (!model.isVisible) {\n return null;\n }\n\n const badgeColor = model.canSave ? 'orange' : 'gray';\n const dotColor = model.canSave ? 'orange.500' : 'gray.400';\n const badgeLabel = model.canSave ? 'unsaved' : 'local';\n const title = model.canSave\n ? 'Unsaved view settings'\n : 'Local view changes';\n const description = model.canSave\n ? 'Column order, widths, and sort settings will be saved to the Default view and shared with everyone.'\n : 'View settings can only be saved in draft revisions. These changes are temporary and will be lost when you leave.';\n const revertLabel = model.canSave ? 'Revert' : 'Reset';\n\n return (\n <Popover.Root\n open={model.isPopoverOpen}\n onOpenChange={(e) => model.setPopoverOpen(e.open)}\n lazyMount\n unmountOnExit\n >\n <Popover.Trigger asChild>\n <Badge\n variant=\"subtle\"\n size=\"sm\"\n colorPalette={badgeColor}\n cursor=\"pointer\"\n display=\"flex\"\n alignItems=\"center\"\n gap={1}\n _hover={{ opacity: 0.8 }}\n data-testid=\"view-settings-badge\"\n >\n <Box width=\"6px\" height=\"6px\" borderRadius=\"full\" bg={dotColor} />\n {badgeLabel}\n </Badge>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content p={3} maxW=\"300px\">\n <HStack mb={2}>\n <Box color=\"gray.400\">\n <LuInfo size={16} />\n </Box>\n <Text fontWeight=\"semibold\" fontSize=\"sm\">\n {title}\n </Text>\n </HStack>\n <Text fontSize=\"sm\" color=\"gray.600\" mb={3}>\n {description}\n </Text>\n <HStack>\n <Button\n variant=\"ghost\"\n size=\"xs\"\n onClick={() => {\n model.revert();\n model.setPopoverOpen(false);\n }}\n data-testid=\"view-settings-revert\"\n >\n {revertLabel}\n </Button>\n {model.canSave && (\n <Button\n colorPalette=\"blue\"\n size=\"xs\"\n onClick={() => {\n void model.save();\n model.setPopoverOpen(false);\n }}\n data-testid=\"view-settings-save\"\n >\n Save\n </Button>\n )}\n </HStack>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n },\n);\n","import { FC } from 'react';\nimport { Box, Flex, Spinner } from '@chakra-ui/react';\nimport { observer } from 'mobx-react-lite';\nimport { Breadcrumbs } from '../../../components/Breadcrumbs/Breadcrumbs.js';\nimport { PlusButton } from '../../../components/PlusButton/index.js';\nimport { FilterWidget } from '../../Filters/ui/FilterWidget.js';\nimport { SearchWidget } from '../../Search/ui/SearchWidget.js';\nimport { SortingsWidget } from '../../Sortings/ui/SortingsWidget.js';\nimport { RowCountWidget } from '../../Status/ui/RowCountWidget.js';\nimport { ViewSettingsBadge } from '../../Status/ui/ViewSettingsBadge.js';\nimport { TableWidget } from '../../Table/ui/TableWidget.js';\nimport type { TableEditorCore } from '../model/TableEditorCore.js';\n\nconst noop = () => {};\n\nexport interface TableEditorProps {\n viewModel: TableEditorCore;\n useWindowScroll?: boolean;\n}\n\nexport const TableEditor: FC<TableEditorProps> = observer(\n ({ viewModel, useWindowScroll }) => {\n if (viewModel.isBootstrapping) {\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n height=\"100%\"\n >\n <Spinner />\n </Box>\n );\n }\n\n const isReadonly = viewModel.readonly;\n const { breadcrumbs, callbacks } = viewModel;\n\n return (\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n height={useWindowScroll ? undefined : '100%'}\n flex={useWindowScroll ? 1 : undefined}\n >\n <Flex\n px={3}\n pt=\"32px\"\n pb=\"48px\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n {...(useWindowScroll && {\n position: 'sticky' as const,\n top: 0,\n zIndex: 3,\n bg: 'white',\n })}\n >\n {breadcrumbs.length > 0 && (\n <Breadcrumbs\n segments={breadcrumbs}\n highlightLast={false}\n onSegmentClick={callbacks.onBreadcrumbClick}\n action={\n !isReadonly && callbacks.onCreateRow ? (\n <PlusButton\n tooltip=\"New row\"\n onClick={callbacks.onCreateRow}\n dataTestId=\"create-row-button\"\n />\n ) : undefined\n }\n />\n )}\n <Flex alignItems=\"center\" gap=\"8px\">\n <SearchWidget model={viewModel.search} />\n <FilterWidget\n model={viewModel.filters}\n availableFields={viewModel.columns.filterableFields}\n />\n <SortingsWidget\n model={viewModel.sorts}\n availableFields={viewModel.columns.sortableFields}\n onChange={noop}\n />\n </Flex>\n </Flex>\n\n <Box flex={1} minHeight={0}>\n <TableWidget\n rows={viewModel.rows}\n columnsModel={viewModel.columns}\n cellFSM={viewModel.cellFSM}\n selection={viewModel.selection}\n sortModel={viewModel.sorts}\n filterModel={viewModel.filters}\n isLoadingMore={viewModel.isLoadingMore}\n onEndReached={viewModel.loadMore}\n onOpenRow={callbacks.onOpenRow}\n onPickRow={callbacks.onPickRow}\n onDeleteRow={\n isReadonly ? undefined : (id) => viewModel.deleteRows([id])\n }\n onDuplicateRow={isReadonly ? undefined : callbacks.onDuplicateRow}\n onDeleteSelected={\n isReadonly ? undefined : (ids) => viewModel.deleteRows(ids)\n }\n onSearchForeignKey={callbacks.onSearchForeignKey}\n onUploadFile={isReadonly ? undefined : callbacks.onUploadFile}\n onOpenFile={callbacks.onOpenFile}\n onCopyPath={callbacks.onCopyPath}\n useWindowScroll={useWindowScroll}\n />\n </Box>\n\n <Flex\n px={3}\n py={2}\n justifyContent=\"space-between\"\n {...(useWindowScroll && {\n position: 'sticky' as const,\n bottom: 0,\n bg: 'white',\n zIndex: 3,\n })}\n >\n <RowCountWidget model={viewModel.rowCount} />\n <ViewSettingsBadge model={viewModel.viewBadge} />\n </Flex>\n </Box>\n );\n },\n);\n"],"mappings":"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"}