@revisium/schema-toolkit-ui 0.2.2 → 0.2.3

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.mjs","names":["createTableModel","React","ChakraTooltip","Menu"],"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/GrayButton/GrayButton.tsx","../src/components/CreateButton/CreateButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/BackButton/BackButton.tsx","../src/components/SettingsButton/SettingsButton.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"],"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 type {\n SchemaNode,\n SchemaModel,\n FieldType,\n} from '@revisium/schema-toolkit';\n\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport type NodeType =\n | 'object'\n | 'array'\n | 'string'\n | 'number'\n | 'boolean'\n | 'ref'\n | 'foreignKey';\n\nexport 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 isFirstRender = useRef(true);\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 (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\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","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 { 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 '../../../types';\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 '../../types';\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["React","ChakraTooltip","Menu"],"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/GrayButton/GrayButton.tsx","../src/components/CreateButton/CreateButton.tsx","../src/components/CloseButton/CloseButton.tsx","../src/components/BackButton/BackButton.tsx","../src/components/SettingsButton/SettingsButton.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"],"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 isFirstRender = useRef(true);\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 (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\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","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 { 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"],"mappings":"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"}