183 lines
5.7 KiB
JavaScript
Executable File
183 lines
5.7 KiB
JavaScript
Executable File
// frontend/app/(protected)/layout.jsx
|
|
import Link from "next/link";
|
|
import { redirect } from "next/navigation";
|
|
import { getSession } from "@/lib/auth";
|
|
import { can } from "@/lib/rbac";
|
|
|
|
export const metadata = { title: "DMS | Protected" };
|
|
|
|
export default async function ProtectedLayout({ children }) {
|
|
// ตรวจ session ฝั่งเซิร์ฟเวอร์ ด้วยคุกกี้จริง
|
|
const session = await getSession();
|
|
if (!session) {
|
|
redirect("/login");
|
|
}
|
|
const { user } = session;
|
|
|
|
return (
|
|
<section className="grid grid-cols-12 gap-6 p-4 mx-auto max-w-7xl">
|
|
<aside className="col-span-12 lg:col-span-3 xl:col-span-3">
|
|
<div className="p-4 border rounded-3xl bg-white/70">
|
|
<div className="mb-3 text-sm">
|
|
RBAC: <b>{user.role}</b>
|
|
</div>
|
|
|
|
<nav className="space-y-2">
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/dashboard"
|
|
>
|
|
แดชบอร์ด
|
|
</Link>
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/drawings"
|
|
>
|
|
Drawings
|
|
</Link>
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/rfas"
|
|
>
|
|
RFAs
|
|
</Link>
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/transmittals"
|
|
>
|
|
Transmittals
|
|
</Link>
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/correspondences"
|
|
>
|
|
Correspondences
|
|
</Link>
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/contracts-volumes"
|
|
>
|
|
Contracts & Volumes
|
|
</Link>
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/reports"
|
|
>
|
|
Reports
|
|
</Link>
|
|
|
|
{can(user, "workflow:view") && (
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/workflow"
|
|
>
|
|
Workflow (n8n)
|
|
</Link>
|
|
)}
|
|
{can(user, "health:view") && (
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/health"
|
|
>
|
|
Health
|
|
</Link>
|
|
)}
|
|
{can(user, "users:manage") && (
|
|
<Link
|
|
className="block px-4 py-2 rounded-xl bg-white/60 hover:bg-white"
|
|
href="/users"
|
|
>
|
|
ผู้ใช้/บทบาท
|
|
</Link>
|
|
)}
|
|
</nav>
|
|
</div>
|
|
</aside>
|
|
|
|
<main className="col-span-12 space-y-6 lg:col-span-9 xl:col-span-9">
|
|
{/* System / Quick Actions */}
|
|
<div className="flex items-center gap-2">
|
|
<div className="flex-1 text-lg font-semibold">
|
|
Document Management System — LCP3 Phase 3
|
|
</div>
|
|
|
|
{can(user, "admin:view") && (
|
|
<a
|
|
className="px-3 py-2 text-white rounded-xl"
|
|
style={{ background: "#0D5C75" }}
|
|
href="/admin"
|
|
>
|
|
Admin
|
|
</a>
|
|
)}
|
|
{can(user, "users:manage") && (
|
|
<a
|
|
className="px-3 py-2 text-white rounded-xl"
|
|
style={{ background: "#0D5C75" }}
|
|
href="/users"
|
|
>
|
|
ผู้ใช้/บทบาท
|
|
</a>
|
|
)}
|
|
{can(user, "health:view") && (
|
|
<a
|
|
className="px-3 py-2 text-white rounded-xl"
|
|
style={{ background: "#0D5C75" }}
|
|
href="/health"
|
|
>
|
|
Health
|
|
</a>
|
|
)}
|
|
{can(user, "workflow:view") && (
|
|
<a
|
|
className="px-3 py-2 text-white rounded-xl"
|
|
style={{ background: "#0D5C75" }}
|
|
href="/workflow"
|
|
>
|
|
Workflow
|
|
</a>
|
|
)}
|
|
{can(user, "rfa:create") && (
|
|
<a
|
|
className="px-3 py-2 text-white rounded-xl"
|
|
style={{ background: "#0D5C75" }}
|
|
href="/rfas/new"
|
|
>
|
|
+ RFA
|
|
</a>
|
|
)}
|
|
{can(user, "drawing:upload") && (
|
|
<a
|
|
className="px-3 py-2 text-white rounded-xl"
|
|
style={{ background: "#0D5C75" }}
|
|
href="/drawings/upload"
|
|
>
|
|
+ Upload Drawing
|
|
</a>
|
|
)}
|
|
{can(user, "transmittal:create") && (
|
|
<a
|
|
className="px-3 py-2 text-white rounded-xl"
|
|
style={{ background: "#0D5C75" }}
|
|
href="/transmittals/new"
|
|
>
|
|
+ Transmittal
|
|
</a>
|
|
)}
|
|
{can(user, "correspondence:create") && (
|
|
<a
|
|
className="px-3 py-2 text-white rounded-xl"
|
|
style={{ background: "#0D5C75" }}
|
|
href="/correspondences/new"
|
|
>
|
|
+ หนังสือสื่อสาร
|
|
</a>
|
|
)}
|
|
</div>
|
|
|
|
{children}
|
|
</main>
|
|
</section>
|
|
);
|
|
}
|