Wand-Stil im Elemente-Panel editierbar

Backend
- wand-State enthaelt jetzt styleId (aus _KEY_WAND_STYLE_ID)
- STATE-Payload sendet wandStyles (analog oeffStyles)
- _update_wall_body handhabt styleId-Patch: bei Stil-Wechsel uebernimmt die
  dicke aus dem Stil (wenn nicht explizit im selben Patch ueberschrieben);
  wand_style_id wird per _attach_meta auf die Achse persistiert

Frontend
- WallProperties bekommt wandStyles-Prop + zeigt Stil-Picker zwischen
  Geschoss und Aufbau (nur wenn Stile vorhanden)
- Dropdown: "kein Stil" + alle definierten Stile mit (dicke, prio)
- PropertiesView + ElementeApp + ElementePropertiesApp propagieren wandStyles
This commit is contained in:
2026-05-30 16:48:54 +02:00
parent 080659ab95
commit 98824c1680
3 changed files with 42 additions and 3 deletions
+22 -2
View File
@@ -527,12 +527,13 @@ function NeuesElementSection({ noGeschoss, activeName, elementsCount, treppe2DSh
// PropertiesView: gemeinsame Komponente, rendert die passende Property-
// Form je nach Element-Typ. Wiederverwendbar in Inline + Satellite-Window.
export function PropertiesView({ selected, geschosse, materials, hatchPatterns, oeffStyles, fonts, raumStempelStile, stempelStile }) {
export function PropertiesView({ selected, geschosse, materials, hatchPatterns, oeffStyles, wandStyles, fonts, raumStempelStile, stempelStile }) {
if (!selected) return null
const upd = (p) => updateElement(selected.id, p)
const del = (label) => () => { if (window.confirm(`${label} löschen?`)) deleteElement(selected.id) }
if (selected.kind === 'wand')
return <WallProperties wall={selected} geschosse={geschosse} materials={materials || []}
wandStyles={wandStyles || []}
onUpdate={upd} onDelete={del('Wand')} />
if (selected.kind === 'decke')
return <DeckenProperties decke={selected} geschosse={geschosse}
@@ -610,6 +611,7 @@ export default function ElementeApp() {
hatchPatterns={state.hatchPatterns}
fonts={state.fonts || []}
oeffStyles={state.oeffStyles || []}
wandStyles={state.wandStyles || []}
raumStempelStile={state.raumStempelStile || []}
stempelStile={state.stempelStile || []} />
</div>
@@ -1469,7 +1471,7 @@ function AussparungProperties({ aussp, onDelete }) {
)
}
function WallProperties({ wall, geschosse, materials, onUpdate, onDelete }) {
function WallProperties({ wall, geschosse, materials, wandStyles, onUpdate, onDelete }) {
const [dicke, setDicke] = useState(String(wall.dicke))
const [ukOver, setUkOver] = useState(wall.ukOverride)
const [okOver, setOkOver] = useState(wall.okOverride)
@@ -1481,6 +1483,7 @@ function WallProperties({ wall, geschosse, materials, onUpdate, onDelete }) {
const ukAuto = ukOver === '' || ukOver == null
const okAuto = okOver === '' || okOver == null
const styles = wandStyles || []
return (
<div style={{
@@ -1508,6 +1511,23 @@ function WallProperties({ wall, geschosse, materials, onUpdate, onDelete }) {
</select>
</div>
{styles.length > 0 && (
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
<span style={{ fontSize: 10, color: 'var(--text-secondary)', width: 50 }}>Stil</span>
<select value={wall.styleId || ''}
onChange={(e) => onUpdate({ styleId: e.target.value })}
style={{ flex: 1, fontSize: 11 }}
title="Wand-Stil aus den Projekt-Einstellungen. Stil-Wechsel uebernimmt dicke aus dem Stil.">
<option value=""> kein Stil </option>
{styles.map(s => (
<option key={s.id} value={s.id}>
{s.name || s.id} ({(s.dicke || 0).toFixed(2)} m, prio {s.prio || 0})
</option>
))}
</select>
</div>
)}
<div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
<span style={{ fontSize: 10, color: 'var(--text-secondary)', width: 50 }}>Aufbau</span>
<div style={{ flex: 1, display: 'flex', gap: 3 }}>
+1
View File
@@ -37,6 +37,7 @@ export default function ElementePropertiesApp() {
hatchPatterns={state.hatchPatterns}
fonts={state.fonts || []}
oeffStyles={state.oeffStyles || []}
wandStyles={state.wandStyles || []}
raumStempelStile={state.raumStempelStile || []}
stempelStile={state.stempelStile || []}
/>