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 {/* Typ und Kategorie an fester Position – VOR den typ-spezifischen
Feldern, damit der Umschalter nicht je nach Auswahl springt. */} Feldern, damit der Umschalter nicht je nach Auswahl springt. */}
<div className="row"> <div className="row">
<label className="seg-label"> <label style={{ maxWidth: 240 }}>
Typ Typ
<div className="segmented"> <select value={modus} disabled={readOnly}
<button type="button" className={modus === "food" ? "active" : ""} onChange={(e) => changeModus(e.target.value)}>
onClick={() => changeModus("food")} disabled={readOnly}> <option value="food">Lebensmittel</option>
Lebensmittel <option value="object">Gegenstand</option>
</button> </select>
<button type="button" className={modus === "object" ? "active" : ""}
onClick={() => changeModus("object")} disabled={readOnly}>
Gegenstand
</button>
</div>
</label> </label>
</div> </div>
<div className="row"> <div className="row">
@@ -812,16 +807,14 @@ export default function ProductForm() {
Verbrauchsgegenstand (= wie ein Lebensmittel als Charge geführt). */} Verbrauchsgegenstand (= wie ein Lebensmittel als Charge geführt). */}
{isObject && ( {isObject && (
<div className="row"> <div className="row">
<label className="grow seg-label"> <label style={{ maxWidth: 320 }}>
Verwaltung Verwaltung
<div className="segmented seg-wrap"> <select value={objMode} disabled={readOnly}
<button type="button" className={objMode === "count" ? "active" : ""} onChange={(e) => setObjMode(e.target.value)}>
onClick={() => setObjMode("count")} disabled={readOnly}>Menge je Lagerort</button> <option value="count">Menge je Lagerort</option>
<button type="button" className={objMode === "individual" ? "active" : ""} <option value="individual">Einzelstücke</option>
onClick={() => setObjMode("individual")} disabled={readOnly}>Einzelstücke</button> <option value="bulk">Verbrauchsgegenstand</option>
<button type="button" className={objMode === "bulk" ? "active" : ""} </select>
onClick={() => setObjMode("bulk")} disabled={readOnly}>Verbrauchsgegenstand</button>
</div>
</label> </label>
</div> </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 + button { border-left: 1px solid var(--border); }
.segmented button.active { background: var(--accent); color: #fff; } .segmented button.active { background: var(--accent); color: #fff; }
.segmented button:disabled { cursor: default; opacity: 0.6; } .segmented button:disabled { cursor: default; opacity: 0.6; }
/* Beschriftung (z.B. „Typ") neben einem Umschalter mit etwas Abstand statt /* Beschriftung neben einem Umschalter mit etwas Abstand statt direkt daneben
direkt daneben geklebt. */ geklebt (Mindestbestände). */
.seg-label { display: flex; align-items: center; gap: var(--sp-3); } .seg-label { display: flex; align-items: center; gap: var(--sp-3); }
.seg-label .segmented { margin-top: 0; } .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 */ /* Artikelfoto mit Aufnahme-/Galerie-Knöpfen */
.produkt-foto { display: flex; flex-direction: column; gap: var(--sp-2); align-items: center; } .produkt-foto { display: flex; flex-direction: column; gap: var(--sp-2); align-items: center; }