Skip to content

Commit

Permalink
feat: Change the admin page to be tabbed similar to that of the setti…
Browse files Browse the repository at this point in the history
…ngs page
  • Loading branch information
MohamedBassem committed Dec 30, 2024
1 parent aff4e60 commit 179f00b
Show file tree
Hide file tree
Showing 18 changed files with 156 additions and 33 deletions.
5 changes: 5 additions & 0 deletions apps/web/app/admin/actions/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import AdminActions from "@/components/admin/AdminActions";

export default function AdminActionsPage() {
return <AdminActions />;
}
40 changes: 40 additions & 0 deletions apps/web/app/admin/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { redirect } from "next/navigation";
import { AdminCard } from "@/components/admin/AdminCard";
import { AdminNotices } from "@/components/admin/AdminNotices";
import MobileAdminSidebar from "@/components/admin/sidebar/MobileSidebar";
import AdminSidebar from "@/components/admin/sidebar/Sidebar";
import Header from "@/components/dashboard/header/Header";
import { Separator } from "@/components/ui/separator";
import { getServerAuthSession } from "@/server/auth";

export default async function AdminLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
const session = await getServerAuthSession();
if (!session || session.user.role !== "admin") {
redirect("/");
}

return (
<div>
<Header />
<div className="flex min-h-[calc(100vh-64px)] w-screen flex-col sm:h-[calc(100vh-64px)] sm:flex-row">
<div className="hidden flex-none sm:flex">
<AdminSidebar />
</div>
<main className="flex-1 bg-muted sm:overflow-y-auto">
<div className="block w-full sm:hidden">
<MobileAdminSidebar />
<Separator />
</div>
<div className="min-h-30 container flex flex-col gap-1 p-4">
<AdminNotices />
<AdminCard>{children}</AdminCard>
</div>
</main>
</div>
</div>
);
}
5 changes: 5 additions & 0 deletions apps/web/app/admin/overview/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import ServerStats from "@/components/admin/ServerStats";

export default function AdminOverviewPage() {
return <ServerStats />;
}
6 changes: 6 additions & 0 deletions apps/web/app/admin/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { redirect } from "next/navigation";

export default function AdminHomepage() {
redirect("/admin/overview");
return null;
}
5 changes: 5 additions & 0 deletions apps/web/app/admin/users/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import UserList from "@/components/admin/UserList";

export default function AdminUsersPage() {
return <UserList />;
}
26 changes: 0 additions & 26 deletions apps/web/app/dashboard/admin/page.tsx

This file was deleted.

File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export default function AdminActions() {

return (
<div>
<div className="mb-2 mt-8 text-xl font-medium">{t("common.actions")}</div>
<div className="mb-2 text-xl font-medium">{t("common.actions")}</div>
<div className="flex flex-col gap-2 sm:w-1/2">
<ActionButton
variant="destructive"
Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export default function ServerStats() {
}

return (
<>
<div className="flex flex-col gap-4">
<div className="mb-2 text-xl font-medium">
{t("admin.server_stats.server_stats")}
</div>
Expand Down Expand Up @@ -143,6 +143,6 @@ export default function ServerStats() {
</TableBody>
</Table>
</div>
</>
</div>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export default function UsersSection() {
}

return (
<>
<div className="flex flex-col gap-4">
<div className="mb-2 flex items-center justify-between text-xl font-medium">
<span>{t("admin.users_list.users_list")}</span>
<AddUserDialog>
Expand Down Expand Up @@ -125,6 +125,6 @@ export default function UsersSection() {
))}
</TableBody>
</Table>
</>
</div>
);
}
21 changes: 21 additions & 0 deletions apps/web/components/admin/sidebar/MobileSidebar.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import MobileSidebarItem from "@/components/shared/sidebar/ModileSidebarItem";
import { useTranslation } from "@/lib/i18n/server";

import { adminSidebarItems } from "./items";

export default async function MobileSidebar() {
const { t } = await useTranslation();
return (
<aside className="w-full">
<ul className="flex justify-between space-x-2 border-b-black px-5 py-2 pt-5">
{adminSidebarItems(t).map((item) => (
<MobileSidebarItem
key={item.name}
logo={item.icon}
path={item.path}
/>
))}
</ul>
</aside>
);
}
36 changes: 36 additions & 0 deletions apps/web/components/admin/sidebar/Sidebar.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { redirect } from "next/navigation";
import SidebarItem from "@/components/shared/sidebar/SidebarItem";
import { useTranslation } from "@/lib/i18n/server";
import { getServerAuthSession } from "@/server/auth";

import serverConfig from "@hoarder/shared/config";

import { adminSidebarItems } from "./items";

export default async function Sidebar() {
const { t } = await useTranslation();
const session = await getServerAuthSession();
if (!session) {
redirect("/");
}

return (
<aside className="flex h-[calc(100vh-64px)] w-60 flex-col gap-5 border-r p-4 ">
<div>
<ul className="space-y-2 text-sm font-medium">
{adminSidebarItems(t).map((item) => (
<SidebarItem
key={item.name}
logo={item.icon}
name={item.name}
path={item.path}
/>
))}
</ul>
</div>
<div className="mt-auto flex items-center border-t pt-2 text-sm text-gray-400">
Hoarder v{serverConfig.serverVersion}
</div>
</aside>
);
}
31 changes: 31 additions & 0 deletions apps/web/components/admin/sidebar/items.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { TFunction } from "i18next";
import { Activity, ArrowLeft, Settings, Users } from "lucide-react";

export const adminSidebarItems = (
t: TFunction,
): {
name: string;
icon: JSX.Element;
path: string;
}[] => [
{
name: t("settings.back_to_app"),
icon: <ArrowLeft size={18} />,
path: "/dashboard/bookmarks",
},
{
name: t("admin.server_stats.server_stats"),
icon: <Activity size={18} />,
path: "/admin/overview",
},
{
name: t("admin.users_list.users_list"),
icon: <Users size={18} />,
path: "/admin/users",
},
{
name: t("common.actions"),
icon: <Settings size={18} />,
path: "/admin/actions",
},
];
4 changes: 2 additions & 2 deletions apps/web/components/dashboard/header/ProfileOptions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { LogOut, Moon, Paintbrush, Settings, Shield, Sun } from "lucide-react";
import { signOut, useSession } from "next-auth/react";
import { useTheme } from "next-themes";

import { AdminNoticeBadge } from "../admin/AdminNotices";
import { AdminNoticeBadge } from "../../admin/AdminNotices";

function DarkModeToggle() {
const { t } = useTranslation();
Expand Down Expand Up @@ -74,7 +74,7 @@ export default function SidebarProfileOptions() {
</DropdownMenuItem>
{session.user.role == "admin" && (
<DropdownMenuItem asChild>
<Link href="/dashboard/admin" className="flex justify-between">
<Link href="/admin" className="flex justify-between">
<div className="items-cente flex gap-2">
<Shield className="size-4" />
{t("admin.admin_settings")}
Expand Down

0 comments on commit 179f00b

Please sign in to comment.