|
|
@@ -6,12 +6,16 @@ import { useEffect } from "react"
|
|
|
import AuthenticatedLayout from "@/components/AuthenticatedLayout"
|
|
|
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
|
|
|
import { Button } from "@/components/ui/button"
|
|
|
-import { Users, FileText, Activity, TrendingUp, UserCheck, AlertTriangle } from "lucide-react"
|
|
|
+import { Users, FileText, Activity, TrendingUp, Calendar } from "lucide-react"
|
|
|
import Link from "next/link"
|
|
|
+import { useDashboard } from "@/hooks/useDashboard"
|
|
|
+import { Skeleton } from "@/components/ui/skeleton"
|
|
|
+import RecentActivityCard from "@/components/admin/RecentActivityCard"
|
|
|
|
|
|
export default function AdminPage() {
|
|
|
const { data: session, status } = useSession()
|
|
|
const router = useRouter()
|
|
|
+ const stats = useDashboard()
|
|
|
|
|
|
useEffect(() => {
|
|
|
if (status === "unauthenticated") {
|
|
|
@@ -71,7 +75,11 @@ export default function AdminPage() {
|
|
|
</div>
|
|
|
<div>
|
|
|
<p className="text-sm font-medium text-gray-600">Pacientes</p>
|
|
|
- <p className="text-2xl font-bold text-gray-900">24</p>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-8 w-12" />
|
|
|
+ ) : (
|
|
|
+ <p className="text-2xl font-bold text-gray-900">{stats.totalPatients}</p>
|
|
|
+ )}
|
|
|
</div>
|
|
|
</div>
|
|
|
</CardContent>
|
|
|
@@ -85,7 +93,11 @@ export default function AdminPage() {
|
|
|
</div>
|
|
|
<div>
|
|
|
<p className="text-sm font-medium text-gray-600">Reportes</p>
|
|
|
- <p className="text-2xl font-bold text-gray-900">156</p>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-8 w-12" />
|
|
|
+ ) : (
|
|
|
+ <p className="text-2xl font-bold text-gray-900">{stats.totalReports}</p>
|
|
|
+ )}
|
|
|
</div>
|
|
|
</div>
|
|
|
</CardContent>
|
|
|
@@ -99,7 +111,11 @@ export default function AdminPage() {
|
|
|
</div>
|
|
|
<div>
|
|
|
<p className="text-sm font-medium text-gray-600">Consultas Hoy</p>
|
|
|
- <p className="text-2xl font-bold text-gray-900">12</p>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-8 w-12" />
|
|
|
+ ) : (
|
|
|
+ <p className="text-2xl font-bold text-gray-900">{stats.consultsToday}</p>
|
|
|
+ )}
|
|
|
</div>
|
|
|
</div>
|
|
|
</CardContent>
|
|
|
@@ -113,7 +129,11 @@ export default function AdminPage() {
|
|
|
</div>
|
|
|
<div>
|
|
|
<p className="text-sm font-medium text-gray-600">Crecimiento</p>
|
|
|
- <p className="text-2xl font-bold text-gray-900">+15%</p>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-8 w-12" />
|
|
|
+ ) : (
|
|
|
+ <p className="text-2xl font-bold text-gray-900">{stats.reportsTrend}</p>
|
|
|
+ )}
|
|
|
</div>
|
|
|
</div>
|
|
|
</CardContent>
|
|
|
@@ -121,7 +141,7 @@ export default function AdminPage() {
|
|
|
</div>
|
|
|
|
|
|
{/* Main Actions */}
|
|
|
- <div className="grid md:grid-cols-2 gap-8 mb-8">
|
|
|
+ <div className="grid md:grid-cols-3 gap-8 mb-8">
|
|
|
<Card className="hover:shadow-lg transition-shadow">
|
|
|
<CardHeader>
|
|
|
<CardTitle className="flex items-center">
|
|
|
@@ -136,16 +156,28 @@ export default function AdminPage() {
|
|
|
</p>
|
|
|
<div className="space-y-2">
|
|
|
<div className="flex items-center justify-between text-sm">
|
|
|
- <span>Pacientes activos</span>
|
|
|
- <span className="font-semibold">24</span>
|
|
|
+ <span>Pacientes totales</span>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-4 w-8" />
|
|
|
+ ) : (
|
|
|
+ <span className="font-semibold">{stats.totalPatients}</span>
|
|
|
+ )}
|
|
|
</div>
|
|
|
<div className="flex items-center justify-between text-sm">
|
|
|
- <span>Nuevos este mes</span>
|
|
|
- <span className="font-semibold text-green-600">+8</span>
|
|
|
+ <span>Pacientes activos</span>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-4 w-8" />
|
|
|
+ ) : (
|
|
|
+ <span className="font-semibold text-green-600">{stats.activePatients}</span>
|
|
|
+ )}
|
|
|
</div>
|
|
|
<div className="flex items-center justify-between text-sm">
|
|
|
- <span>Consultas pendientes</span>
|
|
|
- <span className="font-semibold text-orange-600">3</span>
|
|
|
+ <span>Reportes esta semana</span>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-4 w-8" />
|
|
|
+ ) : (
|
|
|
+ <span className="font-semibold text-orange-600">{stats.reportsThisWeek}</span>
|
|
|
+ )}
|
|
|
</div>
|
|
|
</div>
|
|
|
<Link href="/admin/patients">
|
|
|
@@ -159,98 +191,87 @@ export default function AdminPage() {
|
|
|
<Card className="hover:shadow-lg transition-shadow">
|
|
|
<CardHeader>
|
|
|
<CardTitle className="flex items-center">
|
|
|
- <FileText className="w-5 h-5 mr-2 text-green-600" />
|
|
|
- Reportes Médicos
|
|
|
+ <Calendar className="w-5 h-5 mr-2 text-purple-600" />
|
|
|
+ Gestión de Citas
|
|
|
</CardTitle>
|
|
|
</CardHeader>
|
|
|
<CardContent>
|
|
|
<p className="text-gray-600 mb-4">
|
|
|
- Accede a todos los reportes médicos generados por el sistema
|
|
|
- y mantén un registro completo de las consultas.
|
|
|
+ Supervisa todas las citas del sistema, revisa su estado y
|
|
|
+ gestiona las solicitudes de pacientes.
|
|
|
</p>
|
|
|
<div className="space-y-2">
|
|
|
<div className="flex items-center justify-between text-sm">
|
|
|
- <span>Total de reportes</span>
|
|
|
- <span className="font-semibold">156</span>
|
|
|
+ <span>Citas pendientes</span>
|
|
|
+ <span className="font-semibold text-orange-600">-</span>
|
|
|
</div>
|
|
|
<div className="flex items-center justify-between text-sm">
|
|
|
- <span>Este mes</span>
|
|
|
- <span className="font-semibold text-green-600">+23</span>
|
|
|
+ <span>Citas aprobadas</span>
|
|
|
+ <span className="font-semibold text-green-600">-</span>
|
|
|
</div>
|
|
|
<div className="flex items-center justify-between text-sm">
|
|
|
- <span>Pendientes de revisión</span>
|
|
|
- <span className="font-semibold text-orange-600">7</span>
|
|
|
+ <span>Completadas este mes</span>
|
|
|
+ <span className="font-semibold">-</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <Link href="/records">
|
|
|
+ <Link href="/appointments/doctor">
|
|
|
<Button className="w-full mt-4">
|
|
|
- Ver Todos los Reportes
|
|
|
+ Ver Todas las Citas
|
|
|
</Button>
|
|
|
</Link>
|
|
|
</CardContent>
|
|
|
</Card>
|
|
|
- </div>
|
|
|
|
|
|
- {/* Recent Activity */}
|
|
|
- <div className="grid md:grid-cols-2 gap-8">
|
|
|
- <Card>
|
|
|
+ <Card className="hover:shadow-lg transition-shadow">
|
|
|
<CardHeader>
|
|
|
<CardTitle className="flex items-center">
|
|
|
- <UserCheck className="w-5 h-5 mr-2 text-blue-600" />
|
|
|
- Actividad Reciente
|
|
|
+ <FileText className="w-5 h-5 mr-2 text-green-600" />
|
|
|
+ Reportes Médicos
|
|
|
</CardTitle>
|
|
|
</CardHeader>
|
|
|
<CardContent>
|
|
|
- <div className="space-y-4">
|
|
|
- <div className="flex items-center space-x-3">
|
|
|
- <div className="w-2 h-2 bg-green-500 rounded-full"></div>
|
|
|
- <div className="flex-1">
|
|
|
- <p className="text-sm font-medium">Nuevo paciente registrado</p>
|
|
|
- <p className="text-xs text-gray-500">María González - hace 2 horas</p>
|
|
|
- </div>
|
|
|
+ <p className="text-gray-600 mb-4">
|
|
|
+ Accede a todos los reportes médicos generados por el sistema
|
|
|
+ y mantén un registro completo de las consultas.
|
|
|
+ </p>
|
|
|
+ <div className="space-y-2">
|
|
|
+ <div className="flex items-center justify-between text-sm">
|
|
|
+ <span>Total de reportes</span>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-4 w-8" />
|
|
|
+ ) : (
|
|
|
+ <span className="font-semibold">{stats.totalReports}</span>
|
|
|
+ )}
|
|
|
</div>
|
|
|
- <div className="flex items-center space-x-3">
|
|
|
- <div className="w-2 h-2 bg-blue-500 rounded-full"></div>
|
|
|
- <div className="flex-1">
|
|
|
- <p className="text-sm font-medium">Reporte médico generado</p>
|
|
|
- <p className="text-xs text-gray-500">Juan Pérez - hace 4 horas</p>
|
|
|
- </div>
|
|
|
+ <div className="flex items-center justify-between text-sm">
|
|
|
+ <span>Esta semana</span>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-4 w-8" />
|
|
|
+ ) : (
|
|
|
+ <span className="font-semibold text-green-600">{stats.reportsThisWeek}</span>
|
|
|
+ )}
|
|
|
</div>
|
|
|
- <div className="flex items-center space-x-3">
|
|
|
- <div className="w-2 h-2 bg-purple-500 rounded-full"></div>
|
|
|
- <div className="flex-1">
|
|
|
- <p className="text-sm font-medium">Consulta completada</p>
|
|
|
- <p className="text-xs text-gray-500">Ana López - hace 6 horas</p>
|
|
|
- </div>
|
|
|
+ <div className="flex items-center justify-between text-sm">
|
|
|
+ <span>Crecimiento</span>
|
|
|
+ {stats.loading ? (
|
|
|
+ <Skeleton className="h-4 w-12" />
|
|
|
+ ) : (
|
|
|
+ <span className="font-semibold text-orange-600">{stats.reportsTrend}</span>
|
|
|
+ )}
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <Link href="/records">
|
|
|
+ <Button className="w-full mt-4">
|
|
|
+ Ver Todos los Reportes
|
|
|
+ </Button>
|
|
|
+ </Link>
|
|
|
</CardContent>
|
|
|
</Card>
|
|
|
+ </div>
|
|
|
|
|
|
- <Card>
|
|
|
- <CardHeader>
|
|
|
- <CardTitle className="flex items-center">
|
|
|
- <AlertTriangle className="w-5 h-5 mr-2 text-orange-600" />
|
|
|
- Alertas del Sistema
|
|
|
- </CardTitle>
|
|
|
- </CardHeader>
|
|
|
- <CardContent>
|
|
|
- <div className="space-y-4">
|
|
|
- <div className="p-3 bg-yellow-50 rounded-lg">
|
|
|
- <p className="text-sm font-medium text-yellow-800">3 reportes pendientes de revisión</p>
|
|
|
- <p className="text-xs text-yellow-600">Revisar antes del final del día</p>
|
|
|
- </div>
|
|
|
- <div className="p-3 bg-blue-50 rounded-lg">
|
|
|
- <p className="text-sm font-medium text-blue-800">2 nuevos pacientes este mes</p>
|
|
|
- <p className="text-xs text-blue-600">Crecimiento del 15% vs mes anterior</p>
|
|
|
- </div>
|
|
|
- <div className="p-3 bg-green-50 rounded-lg">
|
|
|
- <p className="text-sm font-medium text-green-800">Sistema funcionando correctamente</p>
|
|
|
- <p className="text-xs text-green-600">Todas las funciones operativas</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </CardContent>
|
|
|
- </Card>
|
|
|
+ {/* Recent Activity */}
|
|
|
+ <div className="grid md:grid-cols-1 gap-8">
|
|
|
+ <RecentActivityCard limit={6} />
|
|
|
</div>
|
|
|
</div>
|
|
|
</AuthenticatedLayout>
|