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
70 lines
2.6 KiB
TypeScript
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>
|
|
);
|
|
}
|