Bestückungs-Pflege: Fach-Sidebar + Verwaltung linksbündig statt zentriert
CI / backend-tests (push) Failing after 1m20s
CI / frontend-build (push) Successful in 24s

ObjektPositionenPanel: Fach-Sidebar (Vorlagen-Feature "feste Fächer-Liste")
links, damit die Bestückung übersichtlich bleibt und auch Dritte (Vertretung
ohne die Kontrollperson) sehen, wo welches Material im Rucksack hingehört.
Gruppierungslogik aus KontrollPage in gemeinsames Util (utils/fachGruppierung)
ausgelagert, da jetzt zweimal gebraucht.

.page-wide: margin:0 statt zentriert (Nutzer-Vorgabe: bei 1200px sonst viel
verschenkter Platz links/rechts auf breiten Monitoren).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
This commit is contained in:
2026-09-04 22:51:43 +02:00
co-authored by Claude Sonnet 5
parent a7b670f6f8
commit d8e3f3aa21
7 changed files with 187 additions and 37 deletions
+30
View File
@@ -0,0 +1,30 @@
export const OHNE_FACH = "Ohne Fach";
/**
* Gruppierung nach Fach (Vorlagen-Feature "feste Fächer-Liste je Objekttyp"):
* Reihenfolge folgt dem ersten Auftreten in der Eingabeliste (die wiederum
* die Vorlagen-Reihenfolge widerspiegelt), "Ohne Fach" immer zuletzt - bleibt
* damit nah am Regal-/Fahrzeug-Layout statt alphabetisch zu springen.
* Geteilt zwischen Kontroll-Erfassung (KontrollPage) und Bestückungs-Pflege
* (ObjektPositionenPanel) - gleiche Gruppierungslogik, unterschiedliche
* Eintragstypen.
*/
export function gruppiereNachFach<T>(eintraege: T[], fachVon: (eintrag: T) => string | null): [string, T[]][] {
const gruppen = new Map<string, T[]>();
for (const eintrag of eintraege) {
const fach = fachVon(eintrag) ?? OHNE_FACH;
const liste = gruppen.get(fach);
if (liste) {
liste.push(eintrag);
} else {
gruppen.set(fach, [eintrag]);
}
}
const gruppenListe = [...gruppen.entries()];
gruppenListe.sort(([a], [b]) => {
if (a === OHNE_FACH) return 1;
if (b === OHNE_FACH) return -1;
return 0;
});
return gruppenListe;
}