From 581f36643744ccecb56734ba8ad2e7242f7d6492 Mon Sep 17 00:00:00 2001 From: karim Date: Tue, 19 May 2026 00:43:45 +0200 Subject: [PATCH] Ebene/Zeichnungsebene Erzeugen: window.prompt raus (macOS WKWebView-Bug) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Symptom: erster +-Klick hat funktioniert, alle weiteren nicht (kein APPLY im Log). Diagnose: macOS WKWebView in Rhino blockiert WIEDERHOLTE window.prompt-Aufrufe — der erste zeigt einen Dialog, nachfolgende returnen direkt null. Mein `if (!name) return` beendet dann ohne Add → kein APPLY → User sieht nichts. Plus: das nach Anlegen direkt onActiveChange(code) erzeugte einen SET_ACTIVE_LAYER race (Layer war noch nicht durch build_layers erstellt → Warning "Sublayer mit Code X nicht gefunden"). Beide Probleme weg durch: - EbenenManager.addNew: silent append mit Default-Name "NEU", Code-Feld bekommt autoEdit-Fokus → User kann direkt tippen, Tab springt zum Name-Feld. Code = nextFreeAfter(activeCode) bleibt (eine nach der aktiven). - GeschossManager.addQuick: silent append mit Default-Name "NOG" (basiert auf Anzahl Geschosse), kein onActiveChange. User editiert ueber den Geschoss-Settings-Cog am Row falls noetig. Tradeoff: keine Dialog-Bestätigung mehr wie ursprünglich vom User gewünscht — aber dafür funktioniert's überhaupt. Falls Dialog wieder gewünscht, müsste ein React-Modal statt window.prompt her. Co-Authored-By: Claude Opus 4.7 --- src/components/EbenenManager.jsx | 16 +++++++++------- src/components/GeschossManager.jsx | 14 +++++--------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/components/EbenenManager.jsx b/src/components/EbenenManager.jsx index 4cad100..43cbd44 100644 --- a/src/components/EbenenManager.jsx +++ b/src/components/EbenenManager.jsx @@ -367,18 +367,20 @@ export default function EbenenManager({ } const addNew = () => { - const name = (window.prompt('Name für neue Ebene:', 'NEU') || '').trim() - if (!name) return + // KEIN window.prompt — macOS WKWebView blockiert wiederholte + // JavaScript-Dialoge (erster zeigt, nachfolgende returnen null). + // Silent-Append mit autoEdit damit der User direkt den Namen + // eintippen kann. const code = nextFreeAfter(activeCode) const newEbene = { - code, name: name.toUpperCase(), + code, name: 'NEU', color: '#888888', lw: 0.18, visible: true, locked: false, } - console.log('[EBENEN-UI] addNew →', { activeCode, code, name: newEbene.name, ebenenCountBefore: ebenen.length }) + console.log('[EBENEN-UI] addNew →', { activeCode, code, ebenenCountBefore: ebenen.length }) onChange([...ebenen, newEbene]) - // Neue Ebene direkt als aktiv setzen → Pill-Highlight, sofort sichtbar - // und der User kann gleich anfangen Geometrie auf diese Ebene zu zeichnen. - if (onActiveChange) onActiveChange(code) + // Code-Feld der neuen Ebene fokussieren — User kann sofort tippen + // (Tab springt dann zum Name-Feld). + setAutoEdit({ code, field: 'code', token: Date.now() }) } const duplicateEbene = (code) => { diff --git a/src/components/GeschossManager.jsx b/src/components/GeschossManager.jsx index 66c992d..caefbe3 100644 --- a/src/components/GeschossManager.jsx +++ b/src/components/GeschossManager.jsx @@ -94,15 +94,13 @@ export default function GeschossManager({ .reduce((s, z) => s + (z.hoehe ?? 0), 0) const addQuick = () => { - const defaultName = `${zeichnungsebenen.filter(z => z.isGeschoss).length + 1}OG` - const name = (window.prompt( - 'Name für neue Zeichnungsebene (Geschoss):', - defaultName - ) || '').trim() - if (!name) return + // KEIN window.prompt — macOS WKWebView blockiert wiederholte + // JavaScript-Dialoge. Silent-Append mit Default-Name; User editiert + // ueber den Geschoss-Settings-Dialog falls noetig. + const geschossCount = zeichnungsebenen.filter(z => z.isGeschoss).length const newZ = { id: `z_${Date.now()}`, - name, + name: `${geschossCount + 1}OG`, isGeschoss: true, hoehe: 3.0, schnitthoehe: 1.0, @@ -110,8 +108,6 @@ export default function GeschossManager({ } console.log('[ZEICHNUNGSEBENEN-UI] addQuick →', { newZ, countBefore: zeichnungsebenen.length }) onChange([...zeichnungsebenen, newZ]) - // Direkt als aktiv setzen → Pill-Highlight, klar sichtbar - if (onActiveChange) onActiveChange(newZ.id) } const toggleVisible = (id) => {