Add remaining public + admin pages (parallel build, 26 files)
Built via two parallel agent workflows reading the real Prisma schema, then integrated + verified. Public: /shop (categories + storefront), /community hub, /rankings (top by credits), /staff, /photos (camera_web gallery), /help (categories + rules), /help/tickets (auth-gated user tickets + create), /settings (auth-gated, update motto via RCON). Admin: /admin/catalog (+[id] items), /admin/radio (shouts/apps/schedules + delete shout), /admin/teams (CRUD), /admin/permissions (read), /admin/wordfilter (CRUD + RCON push), /admin/ip (whitelist/blacklist CRUD), /admin/applications (list + dismiss), /admin/logs (chat/command/alert read), /admin/achievements (read). Server actions all staff-gated. Header + admin nav extended. Verified: tsc exit 0, vitest 48/48, next build exit 0 (33 routes); curl-probed every route — public 200/<main>, auth+admin correctly 307-redirect when unauthorized.
This commit is contained in:
1 parent
9a79acebe7
commit
e96b606e1e
27 files changed
+2400
No files matched your search
@@ -0,0 +1,46 @@
|
||||
import Link from "next/link";
|
||||
|
||||
export const dynamic = "force-dynamic";
|
||||
|
||||
const LINKS = [
|
||||
{
|
||||
href: "/rankings",
|
||||
title: "Rankings",
|
||||
text: "See the wealthiest players in the hotel, ranked by credits.",
|
||||
},
|
||||
{
|
||||
href: "/staff",
|
||||
title: "Staff",
|
||||
text: "Meet the team that keeps the hotel running every day.",
|
||||
},
|
||||
{
|
||||
href: "/news",
|
||||
title: "News",
|
||||
text: "The latest announcements, events and updates.",
|
||||
},
|
||||
];
|
||||
|
||||
export default function CommunityPage() {
|
||||
return (
|
||||
<main>
|
||||
<div className="hero">
|
||||
<h1 style={{ margin: "0 0 0.35rem" }}>Community</h1>
|
||||
<p className="muted" style={{ margin: 0 }}>
|
||||
Everything happening around the hotel in one place.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid cols-3">
|
||||
{LINKS.map((l) => (
|
||||
<Link key={l.href} href={l.href} className="card hover" style={{ color: "inherit" }}>
|
||||
<h3 style={{ margin: "0 0 0.35rem" }}>{l.title}</h3>
|
||||
<p className="muted" style={{ margin: "0 0 0.75rem" }}>
|
||||
{l.text}
|
||||
</p>
|
||||
<span className="btn btn-outline">Open →</span>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</main>
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user