From e8962d19993eafd13e0fdb2576e8afc5caf7fe1a Mon Sep 17 00:00:00 2001 From: Felix Neubauer Date: Wed, 22 Apr 2026 17:13:08 +0200 Subject: [PATCH 1/3] Make Ace Editor cursor update not change focus --- .../src/components/panels/code-editor/aceUtility.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/meta_configurator/src/components/panels/code-editor/aceUtility.ts b/meta_configurator/src/components/panels/code-editor/aceUtility.ts index 8a1120522..ba9bda223 100644 --- a/meta_configurator/src/components/panels/code-editor/aceUtility.ts +++ b/meta_configurator/src/components/panels/code-editor/aceUtility.ts @@ -30,7 +30,9 @@ export function updateCursorPositionBasedOnPath( currentPath: Path ) { const position = determineCursorPosition(editor, editorContent, currentPath); - editor.gotoLine(position.row + 1, position.column, true); // row is 1-based, column is 0-based + editor.clearSelection(); + editor.moveCursorToPosition(position); + editor.renderer.scrollCursorIntoView(); } /** From 1da3220d98b5387d3d5c8192674356e9fe1f60bb Mon Sep 17 00:00:00 2001 From: Felix Neubauer Date: Wed, 22 Apr 2026 17:13:28 +0200 Subject: [PATCH 2/3] Add copy and paste functionality to schema diagram --- .../panels/schema-diagram/VueFlowPanel.vue | 36 ++- .../schema-diagram/schemaClipboardUtils.ts | 268 ++++++++++++++++++ .../src/schema/schemaManipulationUtils.ts | 28 +- 3 files changed, 324 insertions(+), 8 deletions(-) create mode 100644 meta_configurator/src/components/panels/schema-diagram/schemaClipboardUtils.ts diff --git a/meta_configurator/src/components/panels/schema-diagram/VueFlowPanel.vue b/meta_configurator/src/components/panels/schema-diagram/VueFlowPanel.vue index 039d9f520..bcc9cea4f 100644 --- a/meta_configurator/src/components/panels/schema-diagram/VueFlowPanel.vue +++ b/meta_configurator/src/components/panels/schema-diagram/VueFlowPanel.vue @@ -48,7 +48,11 @@ import SchemaExternalReferenceNode from '@/components/panels/schema-diagram/Sche import $RefParser from '@apidevtools/json-schema-ref-parser'; import {useErrorService} from '@/utility/errorServiceInstance.ts'; import {pathToJsonPointer} from '@/utility/pathUtils.ts'; -import {stringToIdentifier, urlStringToIdentifier} from '@/utility/stringToIdentifier.ts'; +import {urlStringToIdentifier} from '@/utility/stringToIdentifier.ts'; +import { + copySelectedSchemaToClipboard, + pasteSchemaFromClipboard, +} from '@/components/panels/schema-diagram/schemaClipboardUtils'; const emit = defineEmits<{ (e: 'update_current_path', path: Path): void; @@ -110,6 +114,34 @@ onMounted(() => { }); }); + +async function handleCopy(event?: ClipboardEvent) { + await copyToClipboard(event); + event?.preventDefault(); // override default browser copy +} +async function handlePaste(event?: ClipboardEvent) { + await pasteFromClipboard(event); + event?.preventDefault(); // override default browser paste +} + +async function copyToClipboard(event?: ClipboardEvent) { + await copySelectedSchemaToClipboard( + event, + schemaData, + selectedData.value, + schemaSession.currentSelectedElement.value + ); +} + +async function pasteFromClipboard(event?: ClipboardEvent) { + try { + const pastedPath = await pasteSchemaFromClipboard(event, schemaData, selectedData.value); + selectElement(pastedPath); + } catch (err) { + console.error('Failed to read from clipboard:', err); + } +} + // scroll to the current selected element when it changes watch( schemaSession.currentSelectedElement, @@ -424,7 +456,7 @@ function updateExternalReferenceValue(