Artikelformular: Typ und Verwaltung als Auswahlliste

Zwei Umschalter mit zusammen fuenf Knoepfen beanspruchten zwei volle Zeilen im
Formular - der dreifache ("Menge je Lagerort / Einzelstuecke /
Verbrauchsgegenstand") brauchte dafuer sogar eine eigene Umbruch-Regel. Als
Auswahllisten stehen sie kompakt untereinander und sehen aus wie die
Kategorie-Auswahl direkt dazwischen.

Am Verhalten aendert sich nichts: changeModus und setObjMode bekommen denselben
Wert, nur aus onChange statt onClick.

.seg-wrap wird dadurch nirgends mehr gebraucht und faellt weg. .segmented und
.seg-label bleiben - die nutzen Mindestbestaende, Produkte und Kategorien
weiterhin.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-09-22 14:16:01 +02:00
co-authored by Claude Opus 5
parent a3fd9819c4
commit 1553e36b78
2 changed files with 15 additions and 24 deletions
+13 -20
View File
@@ -741,18 +741,13 @@ export default function ProductForm() {
{/* Typ und Kategorie an fester Position – VOR den typ-spezifischen
Feldern, damit der Umschalter nicht je nach Auswahl springt. */}
<div className="row">
<label className="seg-label">
<label style={{ maxWidth: 240 }}>
Typ
<div className="segmented">
<button type="button" className={modus === "food" ? "active" : ""}
onClick={() => changeModus("food")} disabled={readOnly}>
Lebensmittel
</button>
<button type="button" className={modus === "object" ? "active" : ""}
onClick={() => changeModus("object")} disabled={readOnly}>
Gegenstand
</button>
</div>
<select value={modus} disabled={readOnly}
onChange={(e) => changeModus(e.target.value)}>
<option value="food">Lebensmittel</option>
<option value="object">Gegenstand</option>
</select>
</label>
</div>
<div className="row">
@@ -812,16 +807,14 @@ export default function ProductForm() {
Verbrauchsgegenstand (= wie ein Lebensmittel als Charge geführt). */}
{isObject && (
<div className="row">
<label className="grow seg-label">
<label style={{ maxWidth: 320 }}>
Verwaltung
<div className="segmented seg-wrap">
<button type="button" className={objMode === "count" ? "active" : ""}
onClick={() => setObjMode("count")} disabled={readOnly}>Menge je Lagerort</button>
<button type="button" className={objMode === "individual" ? "active" : ""}
onClick={() => setObjMode("individual")} disabled={readOnly}>Einzelstücke</button>
<button type="button" className={objMode === "bulk" ? "active" : ""}
onClick={() => setObjMode("bulk")} disabled={readOnly}>Verbrauchsgegenstand</button>
</div>
<select value={objMode} disabled={readOnly}
onChange={(e) => setObjMode(e.target.value)}>
<option value="count">Menge je Lagerort</option>
<option value="individual">Einzelstücke</option>
<option value="bulk">Verbrauchsgegenstand</option>
</select>
</label>
</div>
)}
+2 -4
View File
@@ -1154,12 +1154,10 @@ tr.row-active { background: var(--surface-2); }
.segmented button + button { border-left: 1px solid var(--border); }
.segmented button.active { background: var(--accent); color: #fff; }
.segmented button:disabled { cursor: default; opacity: 0.6; }
/* Beschriftung (z.B. „Typ") neben einem Umschalter mit etwas Abstand statt
direkt daneben geklebt. */
/* Beschriftung neben einem Umschalter mit etwas Abstand statt direkt daneben
geklebt (Mindestbestände). */
.seg-label { display: flex; align-items: center; gap: var(--sp-3); }
.seg-label .segmented { margin-top: 0; }
/* Dreifach-Umschalter (Verwaltung) darf bei Platznot umbrechen. */
.segmented.seg-wrap { flex-wrap: wrap; }
/* Artikelfoto mit Aufnahme-/Galerie-Knöpfen */
.produkt-foto { display: flex; flex-direction: column; gap: var(--sp-2); align-items: center; }