From 6017eb6a2fca14fa7b2fe89d8fc4593684f6f962 Mon Sep 17 00:00:00 2001 From: Alicia Sykes Date: Fri, 24 Apr 2026 09:46:29 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20New=20and=20improved=20YAML=20edito?= =?UTF-8?q?r,=20with=20schema=20validation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Configuration/ConfigContainer.vue | 26 +- src/components/Configuration/JsonEditor.vue | 574 +++++++++++++----- src/components/FormElements/Tabs.vue | 12 +- src/utils/config/schemaHover.js | 82 +++ src/utils/config/schemaLinter.js | 93 +++ src/utils/config/schemaPath.js | 94 +++ 6 files changed, 731 insertions(+), 150 deletions(-) create mode 100644 src/utils/config/schemaHover.js create mode 100644 src/utils/config/schemaLinter.js create mode 100644 src/utils/config/schemaPath.js diff --git a/src/components/Configuration/ConfigContainer.vue b/src/components/Configuration/ConfigContainer.vue index 4eac7229..d85dfb94 100644 --- a/src/components/Configuration/ConfigContainer.vue +++ b/src/components/Configuration/ConfigContainer.vue @@ -86,7 +86,7 @@ import { localStorageKeys, modalNames } from '@/utils/config/defaults'; import { getUsersLanguage } from '@/utils/config/ConfigHelpers'; import ErrorHandler from '@/utils/logging/ErrorHandler'; import StoreKeys from '@/utils/StoreMutations'; -import JsonEditor from '@/components/Configuration/JsonEditor'; +import { defineAsyncComponent, h } from 'vue'; import CustomCssEditor from '@/components/Configuration/CustomCss'; import CloudBackupRestore from '@/components/Configuration/CloudBackupRestore'; import RebuildApp from '@/components/Configuration/RebuildApp'; @@ -105,6 +105,14 @@ import RebuildIcon from '@/assets/interface-icons/application-rebuild.svg'; import LanguageIcon from '@/assets/interface-icons/config-language.svg'; import IconAbout from '@/assets/interface-icons/application-about.svg'; +const EditorLoading = { + render: () => h('p', { class: 'editor-loading-placeholder' }, 'Loading editor…'), +}; +const JsonEditor = defineAsyncComponent({ + loader: () => import('@/components/Configuration/JsonEditor.vue'), + loadingComponent: EditorLoading, +}); + export default { name: 'ConfigContainer', data() { @@ -306,12 +314,11 @@ div.code-container { } .tab-item { + flex: 1 1 auto; + min-height: 0; overflow-y: auto; @extend .scroll-bar; background: var(--config-settings-background); - &.main-tab { - min-height: 500px; - } } .main-options-container { @@ -388,4 +395,15 @@ p.small-screen-note { background: var(--config-settings-background) !important; } +.editor-loading-placeholder { + display: flex; + align-items: center; + justify-content: center; + height: 55vh; + margin: 0; + font-size: 1rem; + color: var(--config-settings-color); + opacity: var(--dimming-factor); +} + diff --git a/src/components/Configuration/JsonEditor.vue b/src/components/Configuration/JsonEditor.vue index 4a15952a..57293773 100644 --- a/src/components/Configuration/JsonEditor.vue +++ b/src/components/Configuration/JsonEditor.vue @@ -1,22 +1,30 @@