111 lines
3.9 KiB
TypeScript
111 lines
3.9 KiB
TypeScript
import { auth } from "@/auth";
|
|
import { sair } from "@/app/(auth)/actions";
|
|
import { Badge } from "@/components/ui/badge";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
|
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
|
|
import { getAdminDashboard } from "@/lib/admin-service";
|
|
import Link from "next/link";
|
|
|
|
export default async function AdminPage() {
|
|
const session = await auth();
|
|
const dashboard = await getAdminDashboard();
|
|
const countByStatus = Object.fromEntries(
|
|
dashboard.porStatus.map((item) => [item.status, item._count._all])
|
|
);
|
|
|
|
return (
|
|
<main className="container py-8">
|
|
<header className="mb-8 flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
|
|
<div>
|
|
<h1 className="text-3xl font-semibold">Painel administrativo</h1>
|
|
<p className="mt-2 text-sm text-muted-foreground">
|
|
Area restrita para {session?.user.email}.
|
|
</p>
|
|
</div>
|
|
<form action={sair}>
|
|
<Button variant="outline" type="submit">
|
|
Sair
|
|
</Button>
|
|
</form>
|
|
</header>
|
|
|
|
<div className="mb-6 flex flex-wrap gap-3">
|
|
<Button asChild variant="outline">
|
|
<Link href="/admin/clientes">Clientes</Link>
|
|
</Button>
|
|
<Button asChild variant="outline">
|
|
<Link href="/admin/perguntas">Perguntas</Link>
|
|
</Button>
|
|
</div>
|
|
|
|
<div className="grid gap-4 md:grid-cols-4">
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="text-base">Briefings enviados</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<p className="text-3xl font-semibold">{countByStatus.ENVIADO ?? 0}</p>
|
|
</CardContent>
|
|
</Card>
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="text-base">Em analise</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<p className="text-3xl font-semibold">{countByStatus.EM_ANALISE ?? 0}</p>
|
|
</CardContent>
|
|
</Card>
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="text-base">Concluidos</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<p className="text-3xl font-semibold">{countByStatus.CONCLUIDO ?? 0}</p>
|
|
</CardContent>
|
|
</Card>
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle className="text-base">Novos em 7 dias</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<p className="text-3xl font-semibold">{dashboard.novosUltimos7Dias}</p>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
|
|
<Card className="mt-6">
|
|
<CardHeader>
|
|
<CardTitle>Ultimos envios</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<Table>
|
|
<TableHeader>
|
|
<TableRow>
|
|
<TableHead>Briefing</TableHead>
|
|
<TableHead>Cliente</TableHead>
|
|
<TableHead>Status</TableHead>
|
|
<TableHead>Enviado em</TableHead>
|
|
</TableRow>
|
|
</TableHeader>
|
|
<TableBody>
|
|
{dashboard.ultimosEnvios.map((briefing) => (
|
|
<TableRow key={briefing.id}>
|
|
<TableCell>
|
|
<Link className="font-medium text-primary hover:underline" href={`/admin/briefings/${briefing.id}`}>
|
|
{briefing.titulo}
|
|
</Link>
|
|
</TableCell>
|
|
<TableCell>{briefing.cliente.nomeCompleto}</TableCell>
|
|
<TableCell><Badge variant="muted">{briefing.status}</Badge></TableCell>
|
|
<TableCell>{briefing.enviadoEm?.toLocaleString("pt-BR")}</TableCell>
|
|
</TableRow>
|
|
))}
|
|
</TableBody>
|
|
</Table>
|
|
</CardContent>
|
|
</Card>
|
|
</main>
|
|
);
|
|
}
|