Feste Fächer-Liste je Objekttyp (Vorlagen-Positionen: Dropdown + Sonstiges)
CI / backend-tests (push) Successful in 1m0s
CI / frontend-build (push) Successful in 5m56s

Nutzer-Vorgabe: Rucksack-Fächer sollen aus einer festen, je Objekttyp
gepflegten Liste gewählt werden können statt jedes Mal Freitext einzutippen.
Neue Tabelle fach (Migration 0004), CRUD-Endpoints /faecher, Admin-Tab
Struktur bekommt Fach-Verwaltung, Vorlagen-Editor nutzt Dropdown mit
"Sonstiges"-Freitext-Fallback.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L85hmKbvX7Cqkq47KnQhFt
This commit is contained in:
2026-09-04 10:24:15 +02:00
co-authored by Claude Sonnet 5
parent 2f11011ed1
commit a2877f5672
11 changed files with 493 additions and 17 deletions
+12 -14
View File
@@ -1,7 +1,8 @@
import { useState } from "react";
import { apiRequest } from "../../api/client";
import type { Beladungsvorlage, Material, Objekttyp } from "../../api/types";
import type { Beladungsvorlage, Fach, Material, Objekttyp } from "../../api/types";
import { FachAuswahl } from "./FachAuswahl";
interface PositionZeile {
materialId: number | "";
@@ -15,11 +16,12 @@ interface Props {
vorlagen: Beladungsvorlage[];
objekttypen: Objekttyp[];
materialien: Material[];
faecher: Fach[];
onGeaendert: () => Promise<void>;
onFehler: (text: string) => void;
}
export function VorlageSection({ vorlagen, objekttypen, materialien, onGeaendert, onFehler }: Props) {
export function VorlageSection({ vorlagen, objekttypen, materialien, faecher, onGeaendert, onFehler }: Props) {
const [name, setName] = useState("");
const [objekttypId, setObjekttypId] = useState<number | "">("");
const [zeilen, setZeilen] = useState<PositionZeile[]>([LEERE_ZEILE]);
@@ -129,12 +131,10 @@ export function VorlageSection({ vorlagen, objekttypen, materialien, onGeaendert
</option>
))}
</select>
<input
className="input"
style={{ width: "8rem" }}
value={zeile.fach}
onChange={(e) => zeileAendern(i, { fach: e.target.value })}
placeholder="Fach"
<FachAuswahl
faecher={faecher.filter((f) => f.objekttyp_id === objekttypId)}
wert={zeile.fach}
onAendern={(wert) => zeileAendern(i, { fach: wert })}
/>
<input
className="input"
@@ -189,12 +189,10 @@ export function VorlageSection({ vorlagen, objekttypen, materialien, onGeaendert
</option>
))}
</select>
<input
className="input"
style={{ width: "8rem" }}
value={zeile.fach}
onChange={(e) => neueVersionZeileAendern(i, { fach: e.target.value })}
placeholder="Fach"
<FachAuswahl
faecher={faecher.filter((f) => f.objekttyp_id === v.objekttyp_id)}
wert={zeile.fach}
onAendern={(wert) => neueVersionZeileAendern(i, { fach: wert })}
/>
<input
className="input"