Admin-Portal: Tab-Menü statt einer langen Scroll-Seite
CI / backend-tests (push) Successful in 58s
CI / frontend-build (push) Successful in 7m5s

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 09:29:56 +02:00
co-authored by Claude Sonnet 5
parent 032126c605
commit 2c9ca3ed3e
+58 -18
View File
@@ -10,6 +10,16 @@ import { ObjekttypSection } from "./admin/ObjekttypSection";
import { StandortSection } from "./admin/StandortSection";
import { VorlageSection } from "./admin/VorlageSection";
type Tab = "objekte" | "vorlagen" | "material" | "struktur" | "standorte";
const TABS: { key: Tab; label: string }[] = [
{ key: "objekte", label: "Objekte" },
{ key: "vorlagen", label: "Vorlagen" },
{ key: "material", label: "Material" },
{ key: "struktur", label: "Struktur" },
{ key: "standorte", label: "Standorte" },
];
/**
* Admin-Seite (Stammdaten/Objekt-Anlage), nachgezogen weil das Frontend
* bisher nur den Mitarbeiter-Kontrollflow (Sprint 7) abdeckte und
@@ -29,6 +39,7 @@ export function AdminPage() {
const [materialien, setMaterialien] = useState<Material[]>([]);
const [fehler, setFehler] = useState<string | null>(null);
const [laedt, setLaedt] = useState(true);
const [tab, setTab] = useState<Tab>("objekte");
async function ladeAlles() {
const [be, ka, ot, s, v, o, m] = await Promise.all([
@@ -68,24 +79,19 @@ export function AdminPage() {
<h1>Administration</h1>
{fehler && <div className="alert alert-danger">{fehler}</div>}
<BereichSection bereiche={bereiche} onGeaendert={ladeAlles} onFehler={setFehler} />
<KategorieSection bereiche={bereiche} kategorien={kategorien} onGeaendert={ladeAlles} onFehler={setFehler} />
<ObjekttypSection
bereiche={bereiche}
kategorien={kategorien}
objekttypen={objekttypen}
onGeaendert={ladeAlles}
onFehler={setFehler}
/>
<MaterialSection materialien={materialien} onGeaendert={ladeAlles} onFehler={setFehler} />
<VorlageSection
vorlagen={vorlagen}
objekttypen={objekttypen}
materialien={materialien}
onGeaendert={ladeAlles}
onFehler={setFehler}
/>
<StandortSection standorte={standorte} onGeaendert={ladeAlles} onFehler={setFehler} />
<nav className="row" style={{ marginBottom: "1.25rem", flexWrap: "wrap", gap: "0.5rem" }}>
{TABS.map((t) => (
<button
key={t.key}
className={tab === t.key ? "btn btn-primary" : "btn btn-secondary"}
onClick={() => setTab(t.key)}
>
{t.label}
</button>
))}
</nav>
{tab === "objekte" && (
<ObjektSection
objekte={objekte}
vorlagen={vorlagen.filter((v) => v.status === "aktiv")}
@@ -94,6 +100,40 @@ export function AdminPage() {
onGeaendert={ladeAlles}
onFehler={setFehler}
/>
)}
{tab === "vorlagen" && (
<VorlageSection
vorlagen={vorlagen}
objekttypen={objekttypen}
materialien={materialien}
onGeaendert={ladeAlles}
onFehler={setFehler}
/>
)}
{tab === "material" && (
<MaterialSection materialien={materialien} onGeaendert={ladeAlles} onFehler={setFehler} />
)}
{tab === "struktur" && (
<>
<BereichSection bereiche={bereiche} onGeaendert={ladeAlles} onFehler={setFehler} />
<KategorieSection
bereiche={bereiche}
kategorien={kategorien}
onGeaendert={ladeAlles}
onFehler={setFehler}
/>
<ObjekttypSection
bereiche={bereiche}
kategorien={kategorien}
objekttypen={objekttypen}
onGeaendert={ladeAlles}
onFehler={setFehler}
/>
</>
)}
{tab === "standorte" && (
<StandortSection standorte={standorte} onGeaendert={ladeAlles} onFehler={setFehler} />
)}
</main>
);
}