Files
Dashboard/features/dashboard/components/layout/PageHeader.tsx
T
dejanandClaude Opus 5 7183fad27a feat(dashboard): Platzhalterseite statt Hinweis-Toast
Der Menüpunkt 'Dashboard' löste bisher nur einen Toast aus. Ein
Navigationseintrag, der nirgendwohin führt, lässt den Leser im Unklaren, ob
etwas fehlt oder etwas kaputt ist.

Jetzt führt er auf /dashboard: ein Leerzustand nach dem Hausmuster
(ui/components/EmptyState), der benennt, warum hier nichts steht, was später
hinkommt (drei Rollen-Layouts, Widgets teils aus Analytics, teils nicht — offene
HR-Anträge, Aufgaben, Termine) und wo der Zuschnitt dokumentiert ist. Mit einem
Weg zurück nach Analytics.

Dabei:
- EmptyState aus der Cloud-Fassung nachgezogen; unsere Kopie hatte den
  action-Slot noch nicht.
- PageHeader bekommt 'standardAktionen': Auf einer leeren Seite gibt es nichts
  zu aktualisieren oder zu exportieren, also stehen dort auch keine
  Schaltflächen dafür.
- Die Variante 'software' in NavZiel entfällt — jeder Eintrag führt jetzt auf
  eine echte Seite, der Toast-Zweig in der AppShell war damit toter Code.
- verify-layout deckt /dashboard mit ab (jetzt 7 Seiten x 7 Breiten).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QPeZNwSeU7qG3RRCwaxEZX
2026-08-29 20:56:35 +02:00

70 lines
2.6 KiB
TypeScript

"use client";
import React from "react";
import { FeatherDownload, FeatherRefreshCw, FeatherShare2 } from "@subframe/core";
import { useToast } from "../../context/ToastContext";
/**
* Kopf einer Analyse-Seite: Titel, Einordnung, Seitenaktionen.
* Die Aktionen sind im Prototyp bewusst folgenlos (Toast statt Export) —
* siehe HANDOVER.md, Abschnitt "Was noch Logik braucht".
*/
export function PageHeader({
titel,
beschreibung,
aktionen,
/**
* Aktualisieren, Export und Teilen. Auf Seiten ohne Inhalt gibt es nichts zu
* aktualisieren oder zu exportieren — dort schaltet man sie ab, statt
* Schaltflächen anzubieten, die ins Leere greifen.
*/
standardAktionen = true,
}: {
titel: string;
beschreibung: string;
aktionen?: React.ReactNode;
standardAktionen?: boolean;
}) {
const { zeigeToast } = useToast();
return (
<div className="flex flex-wrap items-start justify-between gap-4 px-6 pb-6 pt-6">
<div className="flex min-w-0 flex-col gap-0">
<h1 className="text-[22px] font-semibold leading-tight tracking-[-0.02em] text-text-neutral-primary">
{titel}
</h1>
<p className="text-[13px] leading-relaxed text-text-neutral-tertiary">{beschreibung}</p>
</div>
<div className="dv-no-print flex flex-none items-center gap-2">
{aktionen}
{standardAktionen ? (
<>
<button
onClick={() => zeigeToast("Ansicht aktualisiert", "Demo-Daten, Stichtag 30.07.2026")}
className="flex h-9 items-center gap-2 rounded-md border border-solid border-border-default bg-white px-3 text-[13px] font-medium text-text-neutral-secondary hover:bg-neutral-50"
>
<FeatherRefreshCw className="text-[15px]" />
Aktualisieren
</button>
<button
onClick={() => zeigeToast("Export vorgemerkt", "PDF/CSV folgt in der Umsetzung")}
className="flex h-9 items-center gap-2 rounded-md border border-solid border-border-default bg-white px-3 text-[13px] font-medium text-text-neutral-secondary hover:bg-neutral-50"
>
<FeatherDownload className="text-[15px]" />
Export
</button>
<button
onClick={() => zeigeToast("Link kopiert", "Teilen wird serverseitig umgesetzt")}
className="flex h-9 w-9 items-center justify-center rounded-md border border-solid border-border-default bg-white text-text-neutral-tertiary hover:bg-neutral-50"
aria-label="Ansicht teilen"
>
<FeatherShare2 className="text-[15px]" />
</button>
</>
) : null}
</div>
</div>
);
}