feat(admin): P1 — clearer tickets labels, pagination, min_staff_rank, analytics errors
Deploy / release (push) Skipped
Deploy / deploy (push) Successful in 1m37s

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
SimoandCursor committed 2026-07-22 19:04:45 +02:00
1 parent 75cdfdebe4
commit f150aea8b9
13 files changed
+311 -101

No files matched your search

+5 -1
View File
@@ -12,6 +12,7 @@ import { redirect } from "next/navigation";
import { StatsCard } from "@/components/admin/stats-card";
import { Badge } from "@/components/ui/badge";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { getMinStaffRank } from "@/lib/admin/min-staff-rank";
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
import { prisma } from "@/lib/prisma";
@@ -34,6 +35,7 @@ export default async function ModerationDashboard() {
const now = Math.floor(Date.now() / 1000);
const todayStart = now - (now % 86400);
const minStaffRank = await getMinStaffRank();
const [
openCfh,
@@ -46,7 +48,9 @@ export default async function ModerationDashboard() {
prisma.supportTickets.count({ where: { state: 0 } }),
prisma.supportTickets.count({ where: { state: 1 } }),
prisma.ban.count({ where: { timestamp: { gte: todayStart } } }),
prisma.user.count({ where: { online: "1", rank: { gte: 4 } } }),
prisma.user.count({
where: { online: "1", rank: { gte: minStaffRank } },
}),
prisma.supportTickets.findMany({
orderBy: { id: "desc" },
take: 10,
+5 -4
View File
@@ -3,6 +3,7 @@ import { redirect } from "next/navigation";
import { AvatarImage } from "@/components/shared/avatar-image";
import { Badge } from "@/components/ui/badge";
import { Card, CardContent } from "@/components/ui/card";
import { getMinStaffRank } from "@/lib/admin/min-staff-rank";
import { canAccess, getAdminContext, PERMS } from "@/lib/permissions";
import { prisma } from "@/lib/prisma";
@@ -11,9 +12,9 @@ export default async function ModTeamPage() {
if (!canAccess(permissions, PERMS.MODERATION_VIEW, session.user.rank))
redirect("/admin");
// Get all staff (rank >= 4)
const minStaffRank = await getMinStaffRank();
const staff = await prisma.user.findMany({
where: { rank: { gte: 4 } },
where: { rank: { gte: minStaffRank } },
select: {
id: true,
username: true,
@@ -77,9 +78,9 @@ export default async function ModTeamPage() {
<Card>
<CardContent className="pt-4 text-center">
<p className="text-2xl font-bold text-primary">
{staff.filter((s) => s.rank >= 7).length}
{staff.filter((s) => s.rank > minStaffRank).length}
</p>
<p className="text-xs text-muted-foreground">Super Admins</p>
<p className="text-xs text-muted-foreground">Above min rank</p>
</CardContent>
</Card>
</div>