From eb7a066c4c1b15977f4a44d9bbb7b16fe23a2e95 Mon Sep 17 00:00:00 2001 From: biersoeckli Date: Sun, 1 Dec 2024 13:56:42 +0000 Subject: [PATCH] added Sidebar Navigation --- bun.lockb | Bin 294204 -> 0 bytes package.json | 8 +- src/app/globals.css | 16 + src/app/layout.tsx | 45 +- .../project/app/[appId]/app-breadcrumbs.tsx | 17 + src/app/project/app/[appId]/app-tabs.tsx | 2 + src/app/project/app/[appId]/layout.tsx | 17 +- src/app/project/app/[appId]/page.tsx | 15 +- src/app/project/apps-table.tsx | 9 +- src/app/project/page.tsx | 17 +- src/app/project/project-breadcrumbs.tsx | 15 + src/app/projects/create-project-dialog.tsx | 4 +- src/app/projects/project-page.tsx | 17 +- src/app/projects/projects-breadcrumbs.tsx | 14 + src/app/projects/projects-table.tsx | 3 +- src/app/settings/cluster/nodeInfo.tsx | 10 +- src/app/settings/cluster/page.tsx | 2 +- src/app/settings/layout.tsx | 25 - src/app/settings/profile/page.tsx | 4 +- .../settings/profile/profile-breadcrumbs.tsx | 18 + src/app/settings/server/page.tsx | 4 +- .../settings/server/server-breadcrumbs.tsx | 15 + src/app/settings/settings-nav.tsx | 46 -- src/app/sidebar-logout-button.tsx | 51 ++ src/app/sidebar.tsx | 195 +++++ .../custom/breadcrumbs-generator.tsx | 47 ++ src/components/ui/button.tsx | 2 +- src/components/ui/collapsible.tsx | 11 + src/components/ui/dropdown-menu.tsx | 8 +- src/components/ui/input.tsx | 7 +- src/components/ui/separator.tsx | 31 + src/components/ui/sheet.tsx | 140 ++++ src/components/ui/sidebar.tsx | 763 ++++++++++++++++++ src/components/ui/skeleton.tsx | 1 + src/frontend/hooks/use-mobile.tsx | 19 + src/frontend/states/zustand.states.ts | 30 +- src/shared/model/generated-zod/account.ts | 2 +- src/shared/model/generated-zod/app.ts | 2 +- src/shared/model/generated-zod/appdomain.ts | 2 +- src/shared/model/generated-zod/appvolume.ts | 2 +- .../model/generated-zod/authenticator.ts | 2 +- src/shared/model/generated-zod/parameter.ts | 2 +- src/shared/model/generated-zod/project.ts | 2 +- src/shared/model/generated-zod/session.ts | 2 +- src/shared/model/generated-zod/user.ts | 2 +- .../model/generated-zod/verificationtoken.ts | 2 +- tailwind.config.ts | 150 ++-- 47 files changed, 1555 insertions(+), 243 deletions(-) delete mode 100755 bun.lockb create mode 100644 src/app/project/app/[appId]/app-breadcrumbs.tsx create mode 100644 src/app/project/project-breadcrumbs.tsx create mode 100644 src/app/projects/projects-breadcrumbs.tsx delete mode 100644 src/app/settings/layout.tsx create mode 100644 src/app/settings/profile/profile-breadcrumbs.tsx create mode 100644 src/app/settings/server/server-breadcrumbs.tsx delete mode 100644 src/app/settings/settings-nav.tsx create mode 100644 src/app/sidebar-logout-button.tsx create mode 100644 src/app/sidebar.tsx create mode 100644 src/components/custom/breadcrumbs-generator.tsx create mode 100644 src/components/ui/collapsible.tsx create mode 100644 src/components/ui/separator.tsx create mode 100644 src/components/ui/sheet.tsx create mode 100644 src/components/ui/sidebar.tsx create mode 100644 src/frontend/hooks/use-mobile.tsx diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index 8ec2709a21941a9d28cb5e082de21b5b7a45e74c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294204 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ŵ|8x=5qbpDDLy+I|aNwdXU9B|fnf zySXrHa5T}@+e=L($vcBD2jk-u07;gMwt>||N^BR^0LZVE+Uto1Je2SntwyS&$mGOc z=5VE_N{)jJ^C6%Y^(3$ar)QF5K1~M@@K?XZ-gz8?ihZ-7!c86Ygh~^bV_+L6av*r^ z(=?gark$gexsHx`j!K%SwGxK$+VK26^gl# z6l&}#A*08B=t&Yis3qNFpv-rS4_LG(=vX{u0boP{Lz)5@4Qpdx(_aSt^oOMH=slp0 zWE(nTJsV*LJu5eCcM7950!pz4a7B1vmI(!kKoHr!+zD*zk^VADNPo!n;AW#m2s+_P zPd&o}e6 z()zY)RohA3-|zU?#t;b3-qt4y@dYr(nAnLbcA0|Ry%!N)~!aypOIvFxE(c z_01?y+qb4!GRreSU&`obelJy10&xA8@Y#80#W+x`YKVp6dVhRft%uMOrLU7=+kgO( zjTTOACdj9!e1(r@y%%9^Sq#O5o7SKJ6Kw@Hw%63-9Oj9@7h6TVxvAc1Z6ex{9BxK; zH`XO{((sf|KSyk5B?x3)k6aOwjQVa#rz;4&oGAG#KHlX!D*8cs8l);_2MY<2H|Eva z!gCl1W-~dwb#@CKbP}z*HlS|j>lq;<+u?j05R?UZ6}MtpaqW_Y4y!Xb!s~5%(9c$e zdH#XO?*QtNNtA7jC*b4H0wX-XOVc9;1NywU;N*?>E;63mNd@V)f@?X|oVVNQr>@kF?2W{oZOd!i*v=R$HNfmmz8{1KLFH9+~_lFYtoI3pn-~i?1E4Q-ZI4>oNF-;sk2R;Faid~ Q>1soo09o;*{_;) { + const cookieStore = await cookies() + const defaultOpen = cookieStore.get("sidebar:state")?.value === "true"; + const session = await getUserSession(); + const userIsLoggedIn = !!session; + return ( - -
+ + +
+
+
+ {userIsLoggedIn && } + }> + {children} + +
+
+
+
+ + + + + + ); +} + +/* +
}> @@ -39,10 +70,4 @@ export default function RootLayout({
- - - - - ); -} - +*/ diff --git a/src/app/project/app/[appId]/app-breadcrumbs.tsx b/src/app/project/app/[appId]/app-breadcrumbs.tsx new file mode 100644 index 0000000..aed8465 --- /dev/null +++ b/src/app/project/app/[appId]/app-breadcrumbs.tsx @@ -0,0 +1,17 @@ +'use client'; + +import { Card, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { useBreadcrumbs } from "@/frontend/states/zustand.states"; +import { useEffect } from "react"; +import { AppExtendedModel } from "@/shared/model/app-extended.model"; + +export default function AppBreadcrumbs({ app }: { app: AppExtendedModel }) { + const { setBreadcrumbs } = useBreadcrumbs(); + useEffect(() => setBreadcrumbs([ + { name: "Projects", url: "/" }, + { name: app.project.name, url: "/project?projectId=" + app.projectId }, + { name: app.name }, + ]), []); + return <>; +} \ No newline at end of file diff --git a/src/app/project/app/[appId]/app-tabs.tsx b/src/app/project/app/[appId]/app-tabs.tsx index 181e6b9..b510ff4 100644 --- a/src/app/project/app/[appId]/app-tabs.tsx +++ b/src/app/project/app/[appId]/app-tabs.tsx @@ -15,6 +15,8 @@ import Logs from "./overview/logs"; import MonitoringTab from "./overview/monitoring-app"; import InternalHostnames from "./domains/internal-hostnames"; import TerminalStreamed from "./overview/terminal-streamed"; +import { useEffect } from "react"; +import { useBreadcrumbs } from "@/frontend/states/zustand.states"; export default function AppTabs({ app, diff --git a/src/app/project/app/[appId]/layout.tsx b/src/app/project/app/[appId]/layout.tsx index bb1ddbe..7698e4e 100644 --- a/src/app/project/app/[appId]/layout.tsx +++ b/src/app/project/app/[appId]/layout.tsx @@ -27,22 +27,7 @@ export default async function RootLayout({ const app = await appService.getExtendedById(appId); return ( -
- - - - Projects - - - - {app.project.name} - - - - {app.name} - - - +
diff --git a/src/app/project/app/[appId]/page.tsx b/src/app/project/app/[appId]/page.tsx index 28ba856..fec3a9d 100644 --- a/src/app/project/app/[appId]/page.tsx +++ b/src/app/project/app/[appId]/page.tsx @@ -1,16 +1,7 @@ import { getAuthUserSession } from "@/server/utils/action-wrapper.utils"; import appService from "@/server/services/app.service"; -import { - Breadcrumb, - BreadcrumbItem, - BreadcrumbLink, - BreadcrumbList, - BreadcrumbSeparator, -} from "@/components/ui/breadcrumb" -import PageTitle from "@/components/custom/page-title"; import AppTabs from "./app-tabs"; -import AppActionButtons from "./app-action-buttons"; -import buildService from "@/server/services/build.service"; +import AppBreadcrumbs from "./app-breadcrumbs"; export default async function AppPage({ searchParams, @@ -26,7 +17,9 @@ export default async function AppPage({ } const app = await appService.getExtendedById(appId); - return ( + return (<> + + ) } diff --git a/src/app/project/apps-table.tsx b/src/app/project/apps-table.tsx index 58850d4..de64b7d 100644 --- a/src/app/project/apps-table.tsx +++ b/src/app/project/apps-table.tsx @@ -8,13 +8,14 @@ import { formatDateTime } from "@/frontend/utils/format.utils"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { MoreHorizontal } from "lucide-react"; import { Toast } from "@/frontend/utils/toast.utils"; -import { App } from "@prisma/client"; +import { App, Project } from "@prisma/client"; import { deleteApp } from "./actions"; -import { useConfirmDialog } from "@/frontend/states/zustand.states"; +import { useBreadcrumbs, useConfirmDialog } from "@/frontend/states/zustand.states"; +import { useEffect } from "react"; -export default function AppTable({ data }: { data: App[] }) { +export default function AppTable({ app }: { app: App[] }) { const { openDialog } = useConfirmDialog(); @@ -31,7 +32,7 @@ export default function AppTable({ data }: { data: App[] }) { ["createdAt", "Created At", true, (item) => formatDateTime(item.createdAt)], ["updatedAt", "Updated At", false, (item) => formatDateTime(item.updatedAt)], ]} - data={data} + data={app} onItemClickLink={(item) => `/project/app/${item.id}`} actionCol={(item) => <> diff --git a/src/app/project/page.tsx b/src/app/project/page.tsx index 672e0e6..6a3dde3 100644 --- a/src/app/project/page.tsx +++ b/src/app/project/page.tsx @@ -17,6 +17,7 @@ import { BreadcrumbSeparator, } from "@/components/ui/breadcrumb" import PageTitle from "@/components/custom/page-title"; +import ProjectBreadcrumbs from "./project-breadcrumbs"; export default async function AppsPage({ @@ -33,24 +34,14 @@ export default async function AppsPage({ const project = await projectService.getById(projectId); const data = await appService.getAllAppsByProjectID(projectId); return ( -
- - - - Projects - - - - {project.name} - - - +
- + +
) } diff --git a/src/app/project/project-breadcrumbs.tsx b/src/app/project/project-breadcrumbs.tsx new file mode 100644 index 0000000..a5f21b7 --- /dev/null +++ b/src/app/project/project-breadcrumbs.tsx @@ -0,0 +1,15 @@ +'use client'; + +import { Card, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { useBreadcrumbs } from "@/frontend/states/zustand.states"; +import { useEffect } from "react"; + +export default function ProjectBreadcrumbs({ project }: { project: { name: string } }) { + const { setBreadcrumbs } = useBreadcrumbs(); + useEffect(() => setBreadcrumbs([ + { name: "Projects", url: "/" }, + { name: project.name } + ]), []); + return <>; +} \ No newline at end of file diff --git a/src/app/projects/create-project-dialog.tsx b/src/app/projects/create-project-dialog.tsx index ef05ab0..a589163 100644 --- a/src/app/projects/create-project-dialog.tsx +++ b/src/app/projects/create-project-dialog.tsx @@ -6,7 +6,7 @@ import { Toast } from "@/frontend/utils/toast.utils"; import { createProject } from "./actions"; -export function CreateProjectDialog() { +export function CreateProjectDialog({ children }: { children?: React.ReactNode }) { const createProj = async (name: string | undefined) => { if (!name) { @@ -21,6 +21,6 @@ export function CreateProjectDialog() { description="Name your new project." fieldName="Name" onResult={createProj}> - + {children} } \ No newline at end of file diff --git a/src/app/projects/project-page.tsx b/src/app/projects/project-page.tsx index 9b0d68a..b905101 100644 --- a/src/app/projects/project-page.tsx +++ b/src/app/projects/project-page.tsx @@ -15,25 +15,24 @@ import { BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb" +import { useBreadcrumbs } from "@/frontend/states/zustand.states"; +import ProjectsBreadcrumbs from "./projects-breadcrumbs"; export default async function ProjectPage() { await getAuthUserSession(); const data = await projectService.getAllProjects(); + return ( -
- - - - Projects - - - +

Projects

- + + +
+
) } diff --git a/src/app/projects/projects-breadcrumbs.tsx b/src/app/projects/projects-breadcrumbs.tsx new file mode 100644 index 0000000..14bda4b --- /dev/null +++ b/src/app/projects/projects-breadcrumbs.tsx @@ -0,0 +1,14 @@ +'use client'; + +import { Card, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { useBreadcrumbs } from "@/frontend/states/zustand.states"; +import { useEffect } from "react"; + +export default function ProjectsBreadcrumbs() { + const { setBreadcrumbs } = useBreadcrumbs(); + useEffect(() => setBreadcrumbs([ + { name: "Projects", url: "/" } + ]), []); + return <>; +} \ No newline at end of file diff --git a/src/app/projects/projects-table.tsx b/src/app/projects/projects-table.tsx index 438c358..aba0259 100644 --- a/src/app/projects/projects-table.tsx +++ b/src/app/projects/projects-table.tsx @@ -10,7 +10,8 @@ import { MoreHorizontal } from "lucide-react"; import { Toast } from "@/frontend/utils/toast.utils"; import { Project } from "@prisma/client"; import { deleteProject } from "./actions"; -import { useConfirmDialog } from "@/frontend/states/zustand.states"; +import { useBreadcrumbs, useConfirmDialog } from "@/frontend/states/zustand.states"; +import { useEffect } from "react"; diff --git a/src/app/settings/cluster/nodeInfo.tsx b/src/app/settings/cluster/nodeInfo.tsx index f5ef9e6..c27140e 100644 --- a/src/app/settings/cluster/nodeInfo.tsx +++ b/src/app/settings/cluster/nodeInfo.tsx @@ -6,12 +6,20 @@ import { Code } from "@/components/custom/code"; import { Toast } from "@/frontend/utils/toast.utils"; import { setNodeStatus } from "./actions"; import { Button } from "@/components/ui/button"; -import { useConfirmDialog } from "@/frontend/states/zustand.states"; +import { useBreadcrumbs, useConfirmDialog } from "@/frontend/states/zustand.states"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; +import { useEffect } from "react"; export default async function NodeInfo({ nodeInfos }: { nodeInfos: NodeInfoModel[] }) { const { openDialog } = useConfirmDialog(); + + const { setBreadcrumbs } = useBreadcrumbs(); + useEffect(() => setBreadcrumbs([ + { name: "Settings", url: "/settings/profile" }, + { name: "Cluster" }, + ]), []); + const setNodeStatusClick = async (nodeName: string, schedulable: boolean) => { const confirmation = await openDialog({ title: 'Update Node Status', diff --git a/src/app/settings/cluster/page.tsx b/src/app/settings/cluster/page.tsx index b60d85f..2e36fac 100644 --- a/src/app/settings/cluster/page.tsx +++ b/src/app/settings/cluster/page.tsx @@ -14,7 +14,7 @@ export default async function ClusterInfoPage() { const nodeInfo = await clusterService.getNodeInfo(); const clusterJoinToken = await paramService.getString(ParamService.K3S_JOIN_TOKEN); return ( -
+
diff --git a/src/app/settings/layout.tsx b/src/app/settings/layout.tsx deleted file mode 100644 index cba2712..0000000 --- a/src/app/settings/layout.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Suspense } from "react"; -import FullLoadingSpinner from "@/components/ui/full-loading-spinnter"; -import { Button } from "@/components/ui/button"; -import SettingsNav from "./settings-nav"; - - -export default function SettingsLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( -
-
- -
-
- }> - {children} - -
-
- ); -} - diff --git a/src/app/settings/profile/page.tsx b/src/app/settings/profile/page.tsx index e00e130..976368f 100644 --- a/src/app/settings/profile/page.tsx +++ b/src/app/settings/profile/page.tsx @@ -11,17 +11,19 @@ import PageTitle from "@/components/custom/page-title"; import ProfilePasswordChange from "./profile-password-change"; import ToTpSettings from "./totp-settings"; import userService from "@/server/services/user.service"; +import BreadcrumbsSettings from "./profile-breadcrumbs"; export default async function ProjectPage() { const session = await getAuthUserSession(); const data = await userService.getUserByEmail(session.email); return ( -
+
+
diff --git a/src/app/settings/profile/profile-breadcrumbs.tsx b/src/app/settings/profile/profile-breadcrumbs.tsx new file mode 100644 index 0000000..7f04fb2 --- /dev/null +++ b/src/app/settings/profile/profile-breadcrumbs.tsx @@ -0,0 +1,18 @@ +'use client'; + +import { Card, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { deactivate2fa } from "./actions"; +import { Toast } from "@/frontend/utils/toast.utils"; +import TotpCreateDialog from "./totp-create-dialog"; +import { Button } from "@/components/ui/button"; +import { useBreadcrumbs } from "@/frontend/states/zustand.states"; +import { useEffect } from "react"; + +export default function BreadcrumbsSettings() { + const { setBreadcrumbs } = useBreadcrumbs(); + useEffect(() => setBreadcrumbs([ + { name: "Settings", url: "/settings/profile" }, + { name: "Profile" }, + ]), []); + return <>; +} \ No newline at end of file diff --git a/src/app/settings/server/page.tsx b/src/app/settings/server/page.tsx index 3ee71c4..0608da1 100644 --- a/src/app/settings/server/page.tsx +++ b/src/app/settings/server/page.tsx @@ -15,6 +15,7 @@ import QuickStackLetsEncryptSettings from "./qs-letsencrypt-settings"; import QuickStackMaintenanceSettings from "./qs-maintenance-settings"; import podService from "@/server/services/pod.service"; import { Constants } from "@/shared/utils/constants"; +import ServerBreadcrumbs from "./server-breadcrumbs"; export default async function ProjectPage() { @@ -26,11 +27,12 @@ export default async function ProjectPage() { console.log(qsPodInfos) const qsPodInfo = qsPodInfos.find(p => !!p); return ( -
+
+
diff --git a/src/app/settings/server/server-breadcrumbs.tsx b/src/app/settings/server/server-breadcrumbs.tsx new file mode 100644 index 0000000..ee6cadd --- /dev/null +++ b/src/app/settings/server/server-breadcrumbs.tsx @@ -0,0 +1,15 @@ +'use client'; + +import { Card, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card"; +import { Button } from "@/components/ui/button"; +import { useBreadcrumbs } from "@/frontend/states/zustand.states"; +import { useEffect } from "react"; + +export default function ServerBreadcrumbs() { + const { setBreadcrumbs } = useBreadcrumbs(); + useEffect(() => setBreadcrumbs([ + { name: "Settings", url: "/settings/profile" }, + { name: "QuickStack Server" }, + ]), []); + return <>; +} \ No newline at end of file diff --git a/src/app/settings/settings-nav.tsx b/src/app/settings/settings-nav.tsx deleted file mode 100644 index 0aeded5..0000000 --- a/src/app/settings/settings-nav.tsx +++ /dev/null @@ -1,46 +0,0 @@ -'use client' -import { Suspense } from "react"; -import FullLoadingSpinner from "@/components/ui/full-loading-spinnter"; -import { Button } from "@/components/ui/button"; -import { Info, Server, Settings, Settings2, User } from "lucide-react"; -import { usePathname } from "next/navigation"; -import Link from "next/link"; - - -export default function SettingsNav() { - - const pathname = usePathname(); - - const selectedCss = ` - inline-flex gap-2 items-center w-full - whitespace-nowrap rounded-md text-sm font-medium - ring-offset-background transition-colors focus-visible:outline-none - focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 - disabled:pointer-events-none disabled:opacity-50 bg-secondary text-secondary-foreground - hover:bg-secondary/80 h-10 px-4 py-2 w-full text-left - [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0`; - - const notSelectedCss = ` - inline-flex items-center gap-2 whitespace-nowrap rounded-md w-full - text-sm font-medium ring-offset-background transition-colors - focus-visible:outline-none focus-visible:ring-2 - focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none - disabled:opacity-50 hover:text-accent-foreground hover:bg-secondary/80 h-10 px-4 py-2 - [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0` - - return ( -
-

Settings

-
- -
-
- -
-
- -
-
- ); -} - diff --git a/src/app/sidebar-logout-button.tsx b/src/app/sidebar-logout-button.tsx new file mode 100644 index 0000000..eba5954 --- /dev/null +++ b/src/app/sidebar-logout-button.tsx @@ -0,0 +1,51 @@ +'use client' + +import { signOut } from "next-auth/react"; +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible" +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" +import { + Sidebar, + SidebarContent, + SidebarGroup, + SidebarGroupContent, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + SidebarHeader, + SidebarFooter, + SidebarMenuSub, + SidebarMenuSubItem +} from "@/components/ui/sidebar" +import { AppleIcon, Calendar, ChartNoAxesCombined, ChevronDown, ChevronUp, FolderClosed, Home, Inbox, LogOut, Plus, Search, Server, Settings, Settings2, User, User2 } from "lucide-react" +import Link from "next/link" +import { CreateProjectDialog } from "./projects/create-project-dialog" +import projectService from "@/server/services/project.service" +import { getAuthUserSession } from "@/server/utils/action-wrapper.utils" +import { useConfirmDialog } from "@/frontend/states/zustand.states"; + +export function SidebarLogoutButton() { + + const { openDialog } = useConfirmDialog(); + + const signOutAsync = async () => { + if (!await openDialog({ + title: "Sign out", + description: "Are you sure you want to sign out?", + yesButton: "Sign out", + })) { + return; + } + await signOut({ + callbackUrl: undefined, + redirect: false + }); + window.open("/auth", "_self"); + } + return ( + signOutAsync()}> + + Sign out + + ) +} diff --git a/src/app/sidebar.tsx b/src/app/sidebar.tsx new file mode 100644 index 0000000..63d2d4f --- /dev/null +++ b/src/app/sidebar.tsx @@ -0,0 +1,195 @@ +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible" +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" +import { + Sidebar, + SidebarContent, + SidebarGroup, + SidebarGroupContent, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + SidebarHeader, + SidebarFooter, + SidebarMenuSub, + SidebarMenuSubItem +} from "@/components/ui/sidebar" +import { AppleIcon, Calendar, ChartNoAxesCombined, ChevronDown, ChevronUp, FolderClosed, Home, Inbox, Plus, Search, Server, Settings, Settings2, User, User2 } from "lucide-react" +import Link from "next/link" +import { CreateProjectDialog } from "./projects/create-project-dialog" +import projectService from "@/server/services/project.service" +import { getAuthUserSession, getUserSession } from "@/server/utils/action-wrapper.utils" +import { SidebarLogoutButton } from "./sidebar-logout-button" + +const monitoringMenu = [ + { + title: "Overall Cluster", + url: "/Montioring", + icon: Home, + }, +] + +const settingsMenu = [ + { + title: "Profile", + url: "/settings/profile", + icon: User, + }, + { + title: "QuickStack Settings", + url: "/settings/server", + icon: Settings, + }, + { + title: "Cluster", + url: "/settings/cluster", + icon: Server, + }, +] + +export async function AppSidebar() { + + const session = await getUserSession(); + + if (!session) { + return <> + } + + const projects = await projectService.getAllProjects(); + + return ( + + + + + Menu + + + + + + + + + Projects + + + + + + + + + {projects.map((item) => ( + + + + {item.name} + + + + ))} + + + + + + + + + + + + + + + + + + Monitoring + + + + + + {monitoringMenu.map((item) => ( + + + + {item.title} + + + + ))} + + + + + + + + + + + + + + + + + + + Settings + + + + + + {settingsMenu.map((item) => ( + + + + + {item.title} + + + + ))} + + + + + + + + + + + + + + + + {session.email} + + + + + + + + Profile + + + + + + + + + + ) +} diff --git a/src/components/custom/breadcrumbs-generator.tsx b/src/components/custom/breadcrumbs-generator.tsx new file mode 100644 index 0000000..c0630d7 --- /dev/null +++ b/src/components/custom/breadcrumbs-generator.tsx @@ -0,0 +1,47 @@ +'use client' + +import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible" +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" +import { + Sidebar, + SidebarContent, + SidebarGroup, + SidebarGroupContent, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + SidebarHeader, + SidebarFooter, + SidebarMenuSub, + SidebarMenuSubItem, + SidebarTrigger +} from "@/components/ui/sidebar" +import { AppleIcon, Calendar, ChartNoAxesCombined, ChevronDown, ChevronUp, FolderClosed, Home, Inbox, Plus, Search, Server, Settings, Settings2, User, User2 } from "lucide-react" +import Link from "next/link" +import { CreateProjectDialog } from "../../app/projects/create-project-dialog" +import projectService from "@/server/services/project.service" +import { getAuthUserSession } from "@/server/utils/action-wrapper.utils" +import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbSeparator } from "@/components/ui/breadcrumb"; +import { useBreadcrumbs } from "@/frontend/states/zustand.states" + +export function BreadcrumbsGenerator() { + + const { breadcrumbs } = useBreadcrumbs(); + + return ( +
+ + {breadcrumbs && + + {breadcrumbs.map((x, index) => (<> + {index > 0 && } + + {x.name} + + ))} + + } +
+ ) +} diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index aa45a8c..6e325cb 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -1,9 +1,9 @@ import * as React from "react" import { Slot } from "@radix-ui/react-slot" import { cva, type VariantProps } from "class-variance-authority" - import { cn } from "@/frontend/utils/utils" + const buttonVariants = cva( "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", { diff --git a/src/components/ui/collapsible.tsx b/src/components/ui/collapsible.tsx new file mode 100644 index 0000000..9fa4894 --- /dev/null +++ b/src/components/ui/collapsible.tsx @@ -0,0 +1,11 @@ +"use client" + +import * as CollapsiblePrimitive from "@radix-ui/react-collapsible" + +const Collapsible = CollapsiblePrimitive.Root + +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger + +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent + +export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx index 159608f..cdfb011 100644 --- a/src/components/ui/dropdown-menu.tsx +++ b/src/components/ui/dropdown-menu.tsx @@ -3,9 +3,9 @@ import * as React from "react" import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" import { Check, ChevronRight, Circle } from "lucide-react" - import { cn } from "@/frontend/utils/utils" + const DropdownMenu = DropdownMenuPrimitive.Root const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger @@ -27,14 +27,14 @@ const DropdownMenuSubTrigger = React.forwardRef< {children} - + )) DropdownMenuSubTrigger.displayName = @@ -83,7 +83,7 @@ const DropdownMenuItem = React.forwardRef< {} - -const Input = React.forwardRef( +const Input = React.forwardRef>( ({ className, type, ...props }, ref) => { return ( , + React.ComponentPropsWithoutRef +>( + ( + { className, orientation = "horizontal", decorative = true, ...props }, + ref + ) => ( + + ) +) +Separator.displayName = SeparatorPrimitive.Root.displayName + +export { Separator } diff --git a/src/components/ui/sheet.tsx b/src/components/ui/sheet.tsx new file mode 100644 index 0000000..e297403 --- /dev/null +++ b/src/components/ui/sheet.tsx @@ -0,0 +1,140 @@ +"use client" + +import * as React from "react" +import * as SheetPrimitive from "@radix-ui/react-dialog" +import { cva, type VariantProps } from "class-variance-authority" +import { X } from "lucide-react" + +import { cn } from "@/frontend/utils/utils" + +const Sheet = SheetPrimitive.Root + +const SheetTrigger = SheetPrimitive.Trigger + +const SheetClose = SheetPrimitive.Close + +const SheetPortal = SheetPrimitive.Portal + +const SheetOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetOverlay.displayName = SheetPrimitive.Overlay.displayName + +const sheetVariants = cva( + "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500", + { + variants: { + side: { + top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top", + bottom: + "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom", + left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm", + right: + "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm", + }, + }, + defaultVariants: { + side: "right", + }, + } +) + +interface SheetContentProps + extends React.ComponentPropsWithoutRef, + VariantProps {} + +const SheetContent = React.forwardRef< + React.ElementRef, + SheetContentProps +>(({ side = "right", className, children, ...props }, ref) => ( + + + + {children} + + + Close + + + +)) +SheetContent.displayName = SheetPrimitive.Content.displayName + +const SheetHeader = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +SheetHeader.displayName = "SheetHeader" + +const SheetFooter = ({ + className, + ...props +}: React.HTMLAttributes) => ( +
+) +SheetFooter.displayName = "SheetFooter" + +const SheetTitle = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetTitle.displayName = SheetPrimitive.Title.displayName + +const SheetDescription = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SheetDescription.displayName = SheetPrimitive.Description.displayName + +export { + Sheet, + SheetPortal, + SheetOverlay, + SheetTrigger, + SheetClose, + SheetContent, + SheetHeader, + SheetFooter, + SheetTitle, + SheetDescription, +} diff --git a/src/components/ui/sidebar.tsx b/src/components/ui/sidebar.tsx new file mode 100644 index 0000000..730b067 --- /dev/null +++ b/src/components/ui/sidebar.tsx @@ -0,0 +1,763 @@ +"use client" + +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { VariantProps, cva } from "class-variance-authority" +import { PanelLeft } from "lucide-react" + +import { cn } from "@/frontend/utils/utils" +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Separator } from "@/components/ui/separator" +import { Sheet, SheetContent } from "@/components/ui/sheet" +import { Skeleton } from "@/components/ui/skeleton" +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip" +import { useIsMobile } from "@/frontend/hooks/use-mobile" + +const SIDEBAR_COOKIE_NAME = "sidebar:state" +const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7 +const SIDEBAR_WIDTH = "16rem" +const SIDEBAR_WIDTH_MOBILE = "18rem" +const SIDEBAR_WIDTH_ICON = "3rem" +const SIDEBAR_KEYBOARD_SHORTCUT = "b" + +type SidebarContext = { + state: "expanded" | "collapsed" + open: boolean + setOpen: (open: boolean) => void + openMobile: boolean + setOpenMobile: (open: boolean) => void + isMobile: boolean + toggleSidebar: () => void +} + +const SidebarContext = React.createContext(null) + +function useSidebar() { + const context = React.useContext(SidebarContext) + if (!context) { + throw new Error("useSidebar must be used within a SidebarProvider.") + } + + return context +} + +const SidebarProvider = React.forwardRef< + HTMLDivElement, + React.ComponentProps<"div"> & { + defaultOpen?: boolean + open?: boolean + onOpenChange?: (open: boolean) => void + } +>( + ( + { + defaultOpen = true, + open: openProp, + onOpenChange: setOpenProp, + className, + style, + children, + ...props + }, + ref + ) => { + const isMobile = useIsMobile() + const [openMobile, setOpenMobile] = React.useState(false) + + // This is the internal state of the sidebar. + // We use openProp and setOpenProp for control from outside the component. + const [_open, _setOpen] = React.useState(defaultOpen) + const open = openProp ?? _open + const setOpen = React.useCallback( + (value: boolean | ((value: boolean) => boolean)) => { + const openState = typeof value === "function" ? value(open) : value + if (setOpenProp) { + setOpenProp(openState) + } else { + _setOpen(openState) + } + + // This sets the cookie to keep the sidebar state. + document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}` + }, + [setOpenProp, open] + ) + + // Helper to toggle the sidebar. + const toggleSidebar = React.useCallback(() => { + return isMobile + ? setOpenMobile((open) => !open) + : setOpen((open) => !open) + }, [isMobile, setOpen, setOpenMobile]) + + // Adds a keyboard shortcut to toggle the sidebar. + React.useEffect(() => { + const handleKeyDown = (event: KeyboardEvent) => { + if ( + event.key === SIDEBAR_KEYBOARD_SHORTCUT && + (event.metaKey || event.ctrlKey) + ) { + event.preventDefault() + toggleSidebar() + } + } + + window.addEventListener("keydown", handleKeyDown) + return () => window.removeEventListener("keydown", handleKeyDown) + }, [toggleSidebar]) + + // We add a state so that we can do data-state="expanded" or "collapsed". + // This makes it easier to style the sidebar with Tailwind classes. + const state = open ? "expanded" : "collapsed" + + const contextValue = React.useMemo( + () => ({ + state, + open, + setOpen, + isMobile, + openMobile, + setOpenMobile, + toggleSidebar, + }), + [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar] + ) + + return ( + + +
+ {children} +
+
+
+ ) + } +) +SidebarProvider.displayName = "SidebarProvider" + +const Sidebar = React.forwardRef< + HTMLDivElement, + React.ComponentProps<"div"> & { + side?: "left" | "right" + variant?: "sidebar" | "floating" | "inset" + collapsible?: "offcanvas" | "icon" | "none" + } +>( + ( + { + side = "left", + variant = "sidebar", + collapsible = "offcanvas", + className, + children, + ...props + }, + ref + ) => { + const { isMobile, state, openMobile, setOpenMobile } = useSidebar() + + if (collapsible === "none") { + return ( +
+ {children} +
+ ) + } + + if (isMobile) { + return ( + + +
{children}
+
+
+ ) + } + + return ( +
+ {/* This is what handles the sidebar gap on desktop */} +
+ +
+ ) + } +) +Sidebar.displayName = "Sidebar" + +const SidebarTrigger = React.forwardRef< + React.ElementRef, + React.ComponentProps +>(({ className, onClick, ...props }, ref) => { + const { toggleSidebar } = useSidebar() + + return ( + + ) +}) +SidebarTrigger.displayName = "SidebarTrigger" + +const SidebarRail = React.forwardRef< + HTMLButtonElement, + React.ComponentProps<"button"> +>(({ className, ...props }, ref) => { + const { toggleSidebar } = useSidebar() + + return ( +