2025-04-12 22:05:42 +02:00
|
|
|
import { AppSidebar } from "@/components/app-sidebar";
|
|
|
|
|
import {
|
|
|
|
|
Breadcrumb,
|
|
|
|
|
BreadcrumbItem,
|
|
|
|
|
BreadcrumbLink,
|
|
|
|
|
BreadcrumbList,
|
|
|
|
|
BreadcrumbPage,
|
|
|
|
|
BreadcrumbSeparator,
|
|
|
|
|
} from "@/components/ui/breadcrumb";
|
|
|
|
|
import { Separator } from "@/components/ui/separator";
|
|
|
|
|
import {
|
|
|
|
|
SidebarInset,
|
|
|
|
|
SidebarProvider,
|
|
|
|
|
SidebarTrigger,
|
|
|
|
|
} from "@/components/ui/sidebar";
|
2025-04-13 21:10:17 +02:00
|
|
|
import { ReactFlow, Controls, Background, ConnectionLineType } from "@xyflow/react";
|
2025-04-12 22:05:42 +02:00
|
|
|
import "@xyflow/react/dist/style.css";
|
|
|
|
|
import { useEffect, useState } from "react";
|
2025-04-29 19:38:48 +02:00
|
|
|
import { useTranslations } from "next-intl";
|
2025-04-12 22:05:42 +02:00
|
|
|
|
|
|
|
|
export default function Dashboard() {
|
2025-04-29 19:38:48 +02:00
|
|
|
const t = useTranslations();
|
2025-04-12 22:05:42 +02:00
|
|
|
const [nodes, setNodes] = useState<any[]>([]);
|
|
|
|
|
const [edges, setEdges] = useState<any[]>([]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
const fetchFlowData = async () => {
|
|
|
|
|
try {
|
|
|
|
|
const response = await fetch("/api/flowchart");
|
|
|
|
|
const data = await response.json();
|
|
|
|
|
|
|
|
|
|
setNodes(data.nodes);
|
|
|
|
|
setEdges(data.edges);
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error("Error loading flowchart:", error);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
fetchFlowData();
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<SidebarProvider>
|
|
|
|
|
<AppSidebar />
|
|
|
|
|
<SidebarInset className="flex flex-col h-screen">
|
2025-04-15 16:25:01 +02:00
|
|
|
<header className="flex h-16 shrink-0 items-center gap-2 border-b bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60">
|
2025-04-12 22:05:42 +02:00
|
|
|
<div className="flex items-center gap-2 px-4">
|
|
|
|
|
<SidebarTrigger className="-ml-1 dark:text-white" />
|
|
|
|
|
<Separator
|
|
|
|
|
orientation="vertical"
|
|
|
|
|
className="mr-2 h-4 dark:bg-slate-700"
|
|
|
|
|
/>
|
|
|
|
|
<Breadcrumb>
|
|
|
|
|
<BreadcrumbList>
|
|
|
|
|
<BreadcrumbItem className="hidden md:block">
|
|
|
|
|
<BreadcrumbPage className="dark:text-slate-300">
|
|
|
|
|
/
|
|
|
|
|
</BreadcrumbPage>
|
|
|
|
|
</BreadcrumbItem>
|
|
|
|
|
<BreadcrumbSeparator className="hidden md:block dark:text-slate-500" />
|
|
|
|
|
<BreadcrumbItem>
|
|
|
|
|
<BreadcrumbPage className="dark:text-slate-300">
|
2025-04-29 19:38:48 +02:00
|
|
|
{t('Network.Breadcrumb.MyInfrastructure')}
|
2025-04-12 22:05:42 +02:00
|
|
|
</BreadcrumbPage>
|
|
|
|
|
</BreadcrumbItem>
|
|
|
|
|
<BreadcrumbSeparator className="hidden md:block dark:text-slate-500" />
|
|
|
|
|
<BreadcrumbItem>
|
|
|
|
|
<BreadcrumbPage className="dark:text-slate-300">
|
2025-04-29 19:38:48 +02:00
|
|
|
{t('Network.Breadcrumb.Network')}
|
2025-04-12 22:05:42 +02:00
|
|
|
</BreadcrumbPage>
|
|
|
|
|
</BreadcrumbItem>
|
|
|
|
|
</BreadcrumbList>
|
|
|
|
|
</Breadcrumb>
|
|
|
|
|
</div>
|
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
<div className="flex-1 pl-4 pr-4">
|
|
|
|
|
<div
|
|
|
|
|
style={{ height: "100%" }}
|
|
|
|
|
className="dark:bg-black rounded-lg"
|
|
|
|
|
>
|
|
|
|
|
<ReactFlow
|
2025-04-13 21:10:17 +02:00
|
|
|
nodes={nodes}
|
|
|
|
|
edges={edges}
|
|
|
|
|
fitView
|
|
|
|
|
fitViewOptions={{ padding: 0.2 }}
|
|
|
|
|
connectionLineType={ConnectionLineType.Straight}
|
|
|
|
|
className="dark:[&_.react-flow__edge-path]:stroke-slate-500"
|
2025-04-12 22:05:42 +02:00
|
|
|
>
|
|
|
|
|
<Background
|
|
|
|
|
color="#64748b"
|
|
|
|
|
gap={40}
|
|
|
|
|
className="dark:opacity-20"
|
|
|
|
|
/>
|
|
|
|
|
</ReactFlow>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</SidebarInset>
|
|
|
|
|
</SidebarProvider>
|
|
|
|
|
);
|
|
|
|
|
}
|