From 01c93d8b2cf3bc39dc6b13d64745fc4d97e7fdbc Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sun, 16 Aug 2026 10:36:48 +0200 Subject: [PATCH] Web: Mindestbestaende in festen Spalten, Detail-Spalten verschiebbar Die Eingabefelder auf der Mindestbestaende-Seite standen je Zeile woanders. Die Zeile war ein .field-inline, und dort waechst sowohl der Name als auch das Eingabefeld (.field-inline > input { flex: 1 1 auto }) - beide teilten sich den Restplatz, also verschob ein laengerer Name das Feld nach rechts und machte es schmaler. Jetzt ist die Zeile ein Raster mit festen Spalten (Name, Menge, Einheit, Bestand, Ort, Loeschen); ohne Adminrechte bleiben die letzten beiden Zellen leer, damit die Zeilen trotzdem fluchten. Schmale Fenster stellen den Namen ueber die volle Breite. Die "Details"-Spalte liess sich nicht verschieben: sie war fixed und hatte zusaetzlich einen leeren Kopf - es gab also nichts zu greifen. Sie ist jetzt frei und traegt einen sichtbaren Titel. Dasselbe fuer die gleichartigen Link-Spalten in der Einzelstueck- und der Chargenliste ("Artikel", "Aufteilen"). Sortieren bleibt dort aus, weil toggleSort ohne sortValue ohnehin aussteigt. Bild- und Auswahlspalten bleiben fest - die haben keinen sinnvollen Titel und gehoeren an den Anfang. Co-Authored-By: Claude Opus 5 --- web/src/pages/Charges.jsx | 4 ++-- web/src/pages/ItemList.jsx | 2 +- web/src/pages/MinStock.jsx | 21 ++++++++++++--------- web/src/pages/Products.jsx | 4 +++- web/src/styles.css | 20 ++++++++++++++++++++ 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/web/src/pages/Charges.jsx b/web/src/pages/Charges.jsx index ddcf528..b184aa4 100644 --- a/web/src/pages/Charges.jsx +++ b/web/src/pages/Charges.jsx @@ -139,12 +139,12 @@ export default function Charges() { { key: "created", header: "Eingelagert", width: 130, sortValue: (l) => new Date(l.created_at).getTime(), render: (l) => {new Date(l.created_at).toLocaleDateString("de-DE")} }, - { key: "split", header: "", label: "Aufteilen", fixed: true, width: 118, align: "num", + { key: "split", header: "Aufteilen", label: "Aufteilen", width: 118, align: "num", render: (l) => (isAdmin ? ( ) : null) }, - { key: "details", header: "", label: "Artikel", fixed: true, width: 84, align: "num", + { key: "details", header: "Artikel", label: "Artikel", width: 90, align: "num", render: (l) => Artikel }, ]; diff --git a/web/src/pages/ItemList.jsx b/web/src/pages/ItemList.jsx index 797caa2..d35f8cd 100644 --- a/web/src/pages/ItemList.jsx +++ b/web/src/pages/ItemList.jsx @@ -88,7 +88,7 @@ export default function ItemList() { render: (it) => preis(it) || "–" }, { key: "note", header: "Notiz", width: 160, filterText: (it) => it.note || "", render: (it) => {it.note || "–"} }, - { key: "open", header: "", label: "Produkt öffnen", fixed: true, width: 84, align: "num", + { key: "open", header: "Artikel", label: "Produkt öffnen", width: 90, align: "num", render: (it) => Produkt }, ]; diff --git a/web/src/pages/MinStock.jsx b/web/src/pages/MinStock.jsx index 3e090bc..6b58d8d 100644 --- a/web/src/pages/MinStock.jsx +++ b/web/src/pages/MinStock.jsx @@ -259,8 +259,8 @@ export default function MinStock() { function zeile(r) { const g = r.kind === "group" ? r.entity : null; return ( -
- +
+ {r.name} {g && Gruppe} {g?.child_ids?.length > 0 && ( @@ -272,21 +272,21 @@ export default function MinStock() { {isAdmin ? ( - saveSoll(r, e.target.value)} /> - ) : {fmt(r.soll)}} + ) : {fmt(r.soll)}} {/* Einheit: bei Packungsartikeln und Gruppen mit Einheit umschaltbar. */} {isAdmin && r.kind === "product" && hasPkg(r.entity) ? ( - ) : isAdmin && g && g.min_stock_unit_id ? ( - ) : ( - {r.unit || "–"} + {r.unit || "–"} )} - + {r.bestand != null ? `Bestand ${fmt(r.bestand)} ${r.bestandUnit || ""}` : ""} {isAdmin && ( <> -