diff --git a/app/dashboard/admin/page.tsx b/app/dashboard/admin/page.tsx index e5bb6a7..41f7fa2 100644 --- a/app/dashboard/admin/page.tsx +++ b/app/dashboard/admin/page.tsx @@ -1,10 +1,10 @@ -import AdminNavbar from "@/components/dashboard/admin-navbar"; +import DashboardNavbar from "@/components/dashboard/dashboard-navbar"; import AdminTable from "@/components/table/admin-table"; export default function AdminPage() { return (
- +
diff --git a/app/dashboard/approver/detail/[id]/page.tsx b/app/dashboard/approver/detail/[id]/page.tsx index c9b25bf..4e4f11a 100644 --- a/app/dashboard/approver/detail/[id]/page.tsx +++ b/app/dashboard/approver/detail/[id]/page.tsx @@ -1,11 +1,10 @@ -import ApproverNavbar from "@/components/dashboard/approver-navbar"; +import DashboardNavbar from "@/components/dashboard/dashboard-navbar"; import ApproverDetail from "@/components/form/approver-detail"; -import ApproverTable from "@/components/table/approver-table"; export default function ApproverDetailPage() { return (
- +
diff --git a/app/dashboard/approver/page.tsx b/app/dashboard/approver/page.tsx index cfb5175..1739993 100644 --- a/app/dashboard/approver/page.tsx +++ b/app/dashboard/approver/page.tsx @@ -1,10 +1,11 @@ import ApproverNavbar from "@/components/dashboard/approver-navbar"; +import DashboardNavbar from "@/components/dashboard/dashboard-navbar"; import ApproverTable from "@/components/table/approver-table"; export default function ApproverPage() { return (
- +
diff --git a/app/dashboard/supervisor/page.tsx b/app/dashboard/supervisor/page.tsx index d659df5..2a8b3a4 100644 --- a/app/dashboard/supervisor/page.tsx +++ b/app/dashboard/supervisor/page.tsx @@ -1,3 +1,4 @@ +import DashboardNavbar from "@/components/dashboard/dashboard-navbar"; import UserNavbar from "@/components/dashboard/user-navbar"; import SupervisorData from "@/components/table/supervisor-data"; import UserTable from "@/components/table/user-table"; @@ -5,7 +6,7 @@ import UserTable from "@/components/table/user-table"; export default function SupervisorPage() { return (
- +
diff --git a/app/dashboard/user/create/page.tsx b/app/dashboard/user/create/page.tsx index 04018ef..76f1299 100644 --- a/app/dashboard/user/create/page.tsx +++ b/app/dashboard/user/create/page.tsx @@ -1,10 +1,11 @@ +import DashboardNavbar from "@/components/dashboard/dashboard-navbar"; import UserNavbar from "@/components/dashboard/user-navbar"; import FormCampaign from "@/components/form/campaign-form"; export default function UserCreatePage() { return (
- +
diff --git a/app/dashboard/user/page.tsx b/app/dashboard/user/page.tsx index 543e0d0..f331f40 100644 --- a/app/dashboard/user/page.tsx +++ b/app/dashboard/user/page.tsx @@ -1,10 +1,11 @@ +import DashboardNavbar from "@/components/dashboard/dashboard-navbar"; import UserNavbar from "@/components/dashboard/user-navbar"; import UserTable from "@/components/table/user-table"; export default function UserPage() { return (
- +
diff --git a/components/dashboard/dashboard-navbar.tsx b/components/dashboard/dashboard-navbar.tsx new file mode 100644 index 0000000..5c45865 --- /dev/null +++ b/components/dashboard/dashboard-navbar.tsx @@ -0,0 +1,195 @@ +"use client"; + +import Image from "next/image"; +import { Bell, LogOut } from "lucide-react"; +import Link from "next/link"; +import { usePathname, useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; +import Cookies from "js-cookie"; + +import { + Breadcrumb, + BreadcrumbItem, + BreadcrumbLink, + BreadcrumbList, + BreadcrumbSeparator, + BreadcrumbPage, +} from "@/components/ui/breadcrumb"; + +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +export default function DashboardNavbar() { + const router = useRouter(); + const pathname = usePathname(); + const [role, setRole] = useState(null); + const [activeTab, setActiveTab] = useState("Manajemen User"); + const [approverTab, setApproverTab] = useState("Kurasi Konten"); + + const segments = pathname.split("/").filter(Boolean); + + useEffect(() => { + const userRole = Cookies.get("userRole"); + setRole(userRole || null); + }, []); + + const handleLogout = () => { + Cookies.remove("userRole"); + router.push("/auth"); + }; + + if (!role) return null; + + return ( +
+ {/* === Kiri: Logo + Breadcrumb === */} +
+ + Logo + + + {/* Breadcrumb selalu tampil */} + + + + Home + + + {segments.map((segment, index) => { + const href = "/" + segments.slice(0, index + 1).join("/"); + const isLast = index === segments.length - 1; + const label = + segment.charAt(0).toUpperCase() + + segment.slice(1).replace(/-/g, " "); + return ( +
+ + + {isLast ? ( + {label} + ) : ( + {label} + )} + +
+ ); + })} +
+
+
+ + {/* === Tengah: Menu berdasarkan Role === */} +
+ {/* ADMIN */} + {role === "admin" && ( +
+ +
+ )} + + {/* APPROVER */} + {role === "approver" && ( +
+ {["Kurasi Konten", "Publish Konten"].map((tab) => ( + + ))} +
+ )} + + {/* SUPERVISOR */} + {role === "supervisor" && ( +
+ Supervisor Dashboard +
+ )} + + {/* USER */} + {role === "user" && ( +
+ User Dashboard +
+ )} +
+ + {/* === Kanan: Notifikasi + Profil === */} +
+ + + + + + + + + My Account + + + + Logout + + + +
+
+ ); +} diff --git a/components/form/login.tsx b/components/form/login.tsx index d94e7a5..40bea48 100644 --- a/components/form/login.tsx +++ b/components/form/login.tsx @@ -1,6 +1,7 @@ "use client"; import { useState } from "react"; +import Cookies from "js-cookie"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; @@ -54,10 +55,10 @@ export default function Login() { return; } - // ✅ Simpan data user ke localStorage agar bisa diakses di halaman lain - localStorage.setItem("userRole", foundUser.role); + // ✅ Simpan data user ke cookies agar bisa diakses dari mana saja + Cookies.set("userRole", foundUser.role, { expires: 1 }); // expires 1 day - // ✅ Redirect ke halaman sesuai role + // ✅ Redirect sesuai role switch (foundUser.role) { case "admin": router.push("/dashboard/admin"); diff --git a/components/ui/breadcrumb.tsx b/components/ui/breadcrumb.tsx new file mode 100644 index 0000000..eb88f32 --- /dev/null +++ b/components/ui/breadcrumb.tsx @@ -0,0 +1,109 @@ +import * as React from "react" +import { Slot } from "@radix-ui/react-slot" +import { ChevronRight, MoreHorizontal } from "lucide-react" + +import { cn } from "@/lib/utils" + +function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { + return