Satelliten-Dialoge: embedded-Mode + GeschossDialog auch als echtes Fenster
Zwei Dinge: 1. embedded-Mode in den Dialog-Komponenten — wenn TRUE, kein Backdrop + keine MaxWidth-Constraint, das Dialog fuellt das ganze WebView statt wie ein kleines zentriertes Fenster IN dem WebView gerendert zu werden (= "Fenster im Fenster"-Effekt). Betroffen: - GeschossSettingsDialog - EbenenSettingsDialog - GeschossDialog Satelliten-Apps (GeschossSettingsApp, EbenenSettingsApp, GeschossDialogApp) passen jetzt `embedded` durch. 2. GeschossDialog (= der grosse Mehrfach-Editor hinter dem Pencil-Button) laeuft jetzt auch als Satelliten-Fenster — selbe Architektur wie die Settings-Dialoge. Backend hat neuen Handler _open_geschoss_dialog und neuen Message OPEN_GESCHOSS_DIALOG. Auf Save: ganze z-Liste replace + _apply(save_z=True). GeschossManager braucht den inline-Dialog-State nicht mehr; Pencil-Button ruft openGeschossDialog(zeichnungsebenen). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
import { useEffect } from 'react'
|
||||
import GeschossDialog from './components/GeschossDialog'
|
||||
import { notifyReady } from './lib/rhinoBridge'
|
||||
|
||||
function bridgeSend(type, payload = {}) {
|
||||
if (!window.RHINO_MODE) { console.log('[Bridge] →', type, payload); return }
|
||||
const json = JSON.stringify({ type, payload })
|
||||
document.title = 'RHINOMSG::' + json
|
||||
}
|
||||
|
||||
// recalcOkff direkt hier — gleiche Logik wie in ZeichnungsebenenApp.jsx,
|
||||
// damit der Dialog die OKFF-Werte beim Editieren live updaten kann.
|
||||
function recalcOkff(list) {
|
||||
let acc = 0
|
||||
return list.map(z => {
|
||||
if (z.isGeschoss) {
|
||||
const next = { ...z, okff: parseFloat(acc.toFixed(3)) }
|
||||
acc += (z.hoehe ?? 3.0)
|
||||
return next
|
||||
}
|
||||
return { ...z, okff: undefined }
|
||||
})
|
||||
}
|
||||
|
||||
export default function GeschossDialogApp() {
|
||||
const initial = (typeof window !== 'undefined' && window.PANEL_PARAMS) || {}
|
||||
|
||||
useEffect(() => {
|
||||
notifyReady()
|
||||
const blockContext = (ev) => ev.preventDefault()
|
||||
document.addEventListener('contextmenu', blockContext)
|
||||
return () => document.removeEventListener('contextmenu', blockContext)
|
||||
}, [])
|
||||
|
||||
const z = initial.zeichnungsebenen || initial
|
||||
if (!Array.isArray(z) || z.length === 0) {
|
||||
return <div style={{ padding: 20, color: 'var(--text-muted)' }}>Keine Daten</div>
|
||||
}
|
||||
|
||||
return (
|
||||
<GeschossDialog
|
||||
embedded
|
||||
zeichnungsebenen={z}
|
||||
recalcOkff={recalcOkff}
|
||||
onSave={(updated) => bridgeSend('SAVE', { zeichnungsebenen: updated })}
|
||||
onClose={() => bridgeSend('CANCEL', {})}
|
||||
/>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user