From 98fac55ffd1db0b15a4da061353d1d66b4e33422 Mon Sep 17 00:00:00 2001 From: fixclean Date: Thu, 12 Feb 2026 09:05:36 +0100 Subject: [PATCH] svg editor gut --- app/assets/js/device-type-shape-editor.js | 42 +++++++++++++++++++++++ app/assets/js/network-view.js | 2 ++ app/assets/js/svg-editor.js | 2 ++ app/modules/device_types/edit.php | 5 ++- 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/assets/js/device-type-shape-editor.js b/app/assets/js/device-type-shape-editor.js index a4b75c9..e82e014 100644 --- a/app/assets/js/device-type-shape-editor.js +++ b/app/assets/js/device-type-shape-editor.js @@ -8,6 +8,8 @@ '10': { width: 420, height: 80 } }; + let portOptionsInput = null; + function initEditor() { const editor = document.getElementById('device-type-shape-editor'); const svg = document.getElementById('shape-canvas'); @@ -36,6 +38,7 @@ portNameLabel: document.getElementById('shape-port-name-label'), deleteButton: document.getElementById('shape-delete') }; + portOptionsInput = document.getElementById('shape-port-options'); const metaInputs = { formFactor: document.getElementById('shape-meta-form-factor'), @@ -68,6 +71,7 @@ let selectedShapeId = null; let shapes = []; let meta = getDefaultMeta(); + let portNameOptions = readPortOptions(); const definition = readDefinition(hiddenInput.value); shapes = normalizeShapeList(definition.shapes); @@ -78,6 +82,7 @@ bindOverlayEvents(overlay); bindMetaEvents(); applyFormFactorPreset(); + populatePortSelect(); applyMetaToInputs(); persist(); render(); @@ -250,6 +255,20 @@ }); } + function populatePortSelect() { + if (!overlay.portName) { + return; + } + portNameOptions = readPortOptions(); + overlay.portName.innerHTML = ''; + portNameOptions.forEach((name) => { + const option = document.createElement('option'); + option.value = name; + option.textContent = name; + overlay.portName.appendChild(option); + }); + } + function handleMetaInputChange(event) { const targetId = event?.target?.id; applyMetaFromInputs(); @@ -402,6 +421,8 @@ return; } + populatePortSelect(); + overlay.type.value = selected.type; overlay.x.value = selected.x; overlay.y.value = selected.y; @@ -662,6 +683,27 @@ } } + function readPortOptions() { + if (!portOptionsInput) { + return []; + } + + const raw = String(portOptionsInput.value || '').trim(); + if (!raw) { + return []; + } + + try { + const parsed = JSON.parse(raw); + if (!Array.isArray(parsed)) { + return []; + } + return parsed.filter((value) => typeof value === 'string'); + } catch (error) { + return []; + } + } + function readDefinition(raw) { const parsed = readJson(raw); if (Array.isArray(parsed)) { diff --git a/app/assets/js/network-view.js b/app/assets/js/network-view.js index ae7c1c1..e5fd5d6 100644 --- a/app/assets/js/network-view.js +++ b/app/assets/js/network-view.js @@ -12,6 +12,7 @@ * -> bewusst simpel & erweiterbar */ +(() => { /* ========================= * Konfiguration * ========================= */ @@ -287,3 +288,4 @@ document.addEventListener('keydown', (e) => { // TODO: Delete -> Gerät entfernen? }); +})(); diff --git a/app/assets/js/svg-editor.js b/app/assets/js/svg-editor.js index 709fb4c..e94e4a3 100644 --- a/app/assets/js/svg-editor.js +++ b/app/assets/js/svg-editor.js @@ -12,6 +12,7 @@ * Abhängigkeiten: keine (Vanilla JS) */ +(() => { /* ========================= * Konfiguration * ========================= */ @@ -256,3 +257,4 @@ document.addEventListener('keydown', (e) => { deleteSelectedPort(); } }); +})(); diff --git a/app/modules/device_types/edit.php b/app/modules/device_types/edit.php index f8d413b..e642bee 100644 --- a/app/modules/device_types/edit.php +++ b/app/modules/device_types/edit.php @@ -234,7 +234,9 @@ $pageTitle = $isEdit ? "Gerätetyp bearbeiten: " . htmlspecialchars($deviceType[ @@ -299,6 +301,7 @@ $pageTitle = $isEdit ? "Gerätetyp bearbeiten: " . htmlspecialchars($deviceType[ +