Der Prototyp hatte eine eigene Seitenleiste mit den fünf Analyse-Seiten als Menüpunkten. Die Software hat eine andere Navigation, in der Analytics noch gar nicht vorkommt. Beides zusammen ergab kein Bild davon, wo die Analyse später sitzt. Jetzt: - Die Seitenleiste spiegelt die von HiveGrid Cloud — dieselbe Komponente (SidebarWithSections aus der Cloud-Fassung portiert, inkl. der dortigen lokalen Fixes: Collapse-Breite, verdrahteter Toggle, Logo-Slot, Hover-Sweep), dieselben Gruppen, dieselbe Reihenfolge, dasselbe Logo. - 'Analytics' ist ein einzelner Menüpunkt, gleichrangig neben 'Dashboard'. - Die fünf Analyse-Seiten sind darin über Reiter erreichbar, nicht als Unterpunkte in der Navigation. Zwei Navigationsebenen für dieselbe Sache würden nur konkurrieren. Die Reiter folgen dem Hausmuster aus SettingsHubShell (Link um Tabs.Item), damit jeder Reiter eine echte Adresse hat und mittelklickbar bleibt. - Routen: /analytics, /analytics/finanzen, /auftraege, /kunden, /team. '/' leitet auf /analytics; das Dashboard liegt in der Software unter '/'. - Alle übrigen Einträge sind Kontext: Sie zeigen den Ort in der fertigen Anwendung und melden beim Klick, dass sie zur Software gehören. Kopfzeile und Filterleiste sind aus den fünf Seiten in die Analytics-Hülle gewandert — sie sind für alle gleich, und der Filterzustand gilt bereichsweit. Nebenbei: @radix-ui/react-slot war eine Phantom-Dependency (nur transitiv über @subframe/core vorhanden, vom portierten IconButton direkt importiert) und ist jetzt deklariert. verify-layout prüfte noch die alten Routen und lief damit auf 404-Seiten, die naturgemäß keine Kollisionen haben — Routen korrigiert und eine Absicherung ergänzt, die bei Statuscode >= 400 abbricht. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QPeZNwSeU7qG3RRCwaxEZX
157 lines
5.1 KiB
TypeScript
157 lines
5.1 KiB
TypeScript
import type { SeitenId } from "../../data/filtering";
|
|
|
|
/**
|
|
* Navigationsstruktur — Spiegel der Seitenleiste von HiveGrid Cloud.
|
|
*
|
|
* Die Gruppen, ihre Reihenfolge und die Einträge entsprechen
|
|
* `apps/web/app/application/sidebar/AppSidebar.tsx` im Zielsystem. Der Grund
|
|
* ist die Übergabe: Wer diesen Prototyp neben der Software öffnet, soll dieselbe
|
|
* Navigation sehen und nicht erst übersetzen müssen.
|
|
*
|
|
* **Nur „Analytics" ist in diesem Prototyp echt.** Alle anderen Einträge sind
|
|
* Kontext — sie zeigen, wo die Analyse in der fertigen Anwendung sitzt. Sie
|
|
* führen bewusst nirgendwohin und melden das beim Klick, statt still zu bleiben.
|
|
*
|
|
* Icons: Die Software nutzt eigene Icon-Komponenten (`AddressBookIcon`,
|
|
* `BoardIcon` …), die auf einem hausinternen Set aufsetzen. Hier stehen die
|
|
* nächstliegenden Feather-Icons aus `@subframe/core`, das beide Repos teilen —
|
|
* optisch praktisch deckungsgleich, ohne ein ganzes Icon-Set mitzuschleppen.
|
|
*/
|
|
|
|
export type NavZiel = { art: "route"; href: string } | { art: "software" };
|
|
|
|
export interface NavEintrag {
|
|
id: string;
|
|
label: string;
|
|
/** Icon-Name aus @subframe/core (ohne das Präfix "Feather"). */
|
|
icon: string;
|
|
ziel: NavZiel;
|
|
}
|
|
|
|
export interface NavGruppe {
|
|
id: string;
|
|
/** Leerer Titel = Startgruppe ohne Überschrift, wie in der Software. */
|
|
titel: string;
|
|
eintraege: NavEintrag[];
|
|
}
|
|
|
|
/** Einstieg des Analytics-Bereichs — auch das Ziel der Weiterleitung von „/". */
|
|
export const ANALYTICS_START = "/analytics";
|
|
|
|
export const NAV_GRUPPEN: NavGruppe[] = [
|
|
{
|
|
id: "start",
|
|
titel: "",
|
|
eintraege: [
|
|
{
|
|
id: "dashboard",
|
|
label: "Dashboard",
|
|
icon: "LayoutDashboard",
|
|
ziel: { art: "software" },
|
|
},
|
|
{
|
|
// Der neue Menüpunkt. In der Software gibt es ihn noch nicht — die
|
|
// fünf Analyse-Seiten sind ausschließlich hier drin navigierbar,
|
|
// nicht als Unterpunkte in der Seitenleiste.
|
|
id: "analytics",
|
|
label: "Analytics",
|
|
icon: "BarChart",
|
|
ziel: { art: "route", href: ANALYTICS_START },
|
|
},
|
|
{ id: "aufgaben", label: "Aufgaben", icon: "Clipboard", ziel: { art: "software" } },
|
|
],
|
|
},
|
|
{
|
|
id: "kunden",
|
|
titel: "Kunden",
|
|
eintraege: [
|
|
{ id: "kontakte", label: "Kontakte", icon: "Contact", ziel: { art: "software" } },
|
|
{ id: "leads", label: "Leads", icon: "TrendingUp", ziel: { art: "software" } },
|
|
],
|
|
},
|
|
{
|
|
id: "projekte",
|
|
titel: "Projekte",
|
|
eintraege: [
|
|
{ id: "pipelines", label: "Pipelines", icon: "Trello", ziel: { art: "software" } },
|
|
{ id: "plantafel", label: "Plantafel", icon: "CalendarRange", ziel: { art: "software" } },
|
|
{ id: "dateien", label: "Dateien", icon: "FileText", ziel: { art: "software" } },
|
|
],
|
|
},
|
|
{
|
|
id: "kommunikation",
|
|
titel: "Kommunikation",
|
|
eintraege: [
|
|
{ id: "postfach", label: "Postfach", icon: "Mail", ziel: { art: "software" } },
|
|
{ id: "formulare", label: "Formulare", icon: "Table", ziel: { art: "software" } },
|
|
{ id: "telefonie", label: "Telefonie", icon: "Phone", ziel: { art: "software" } },
|
|
],
|
|
},
|
|
{
|
|
id: "organisation",
|
|
titel: "Organisation",
|
|
eintraege: [
|
|
{ id: "termine", label: "Termine", icon: "CalendarDays", ziel: { art: "software" } },
|
|
],
|
|
},
|
|
];
|
|
|
|
/** Unterer Bereich, durch einen Trenner abgesetzt — wie in der Software. */
|
|
export const NAV_SEKUNDAER: NavEintrag[] = [
|
|
{
|
|
// Gehört nicht zur Software, sondern zum Prototyp: die Bausteingalerie
|
|
// für die Entwicklung.
|
|
id: "komponenten",
|
|
label: "Komponenten",
|
|
icon: "Component",
|
|
ziel: { art: "route", href: "/komponenten" },
|
|
},
|
|
{ id: "einstellungen", label: "Einstellungen", icon: "Settings", ziel: { art: "software" } },
|
|
];
|
|
|
|
/**
|
|
* Die fünf Analyse-Seiten. Sie erscheinen **nicht** in der Seitenleiste,
|
|
* sondern als Reiter innerhalb des Menüpunkts „Analytics" — dem Hausmuster
|
|
* für Unter-Navigation in HiveGrid (`SettingsHubShell.tsx`: ein `Link` um ein
|
|
* `Tabs.Item`, damit jeder Reiter eine echte Navigation ist).
|
|
*/
|
|
export interface AnalyseSeite {
|
|
id: SeitenId;
|
|
label: string;
|
|
href: string;
|
|
beschreibung: string;
|
|
}
|
|
|
|
export const ANALYSE_SEITEN: AnalyseSeite[] = [
|
|
{
|
|
id: "uebersicht",
|
|
label: "Übersicht",
|
|
href: "/analytics",
|
|
beschreibung: "Die Kennzahlen, nach denen der Betrieb gesteuert wird — Umsatz, Auslastung, offene Posten und Handlungsbedarf.",
|
|
},
|
|
{
|
|
id: "finanzen",
|
|
label: "Finanzen",
|
|
href: "/analytics/finanzen",
|
|
beschreibung: "Umsatz, Zahlungseingang und offene Forderungen — die Sicht der Buchhaltung auf den Betrieb.",
|
|
},
|
|
{
|
|
id: "auftraege",
|
|
label: "Aufträge",
|
|
href: "/analytics/auftraege",
|
|
beschreibung: "Von der Anfrage bis zur Abnahme — wo die Vorgänge stehen, was gebunden ist und was über Termin läuft.",
|
|
},
|
|
{
|
|
id: "kunden",
|
|
label: "Kunden",
|
|
href: "/analytics/kunden",
|
|
beschreibung: "Woher Kunden kommen, wie viel sie bringen und wo Nachfassen lohnt.",
|
|
},
|
|
{
|
|
id: "team",
|
|
label: "Team",
|
|
href: "/analytics/team",
|
|
beschreibung: "Auslastung, produktive Stunden und Abschlüsse der Monteure — die Kennzahl hinter der Terminplanung.",
|
|
},
|
|
];
|