diff --git a/frontend/src/app/(app)/page.tsx b/frontend/src/app/(app)/page.tsx index 5d963e5..66a0deb 100644 --- a/frontend/src/app/(app)/page.tsx +++ b/frontend/src/app/(app)/page.tsx @@ -2,60 +2,46 @@ import { useEffect, useState } from "react"; import StatsCard from "@/components/StatsCard"; -import BadgeStatus from "@/components/BadgeStatus"; -import BadgePriority from "@/components/BadgePriority"; -import { getTicketStats, getTickets, type DashboardStats, type Ticket } from "@/lib/api"; +import { getTicketStats, type DashboardStats } from "@/lib/api"; import { useAuth } from "@/lib/auth"; -import { formatDate } from "@/lib/format"; import Link from "next/link"; import { useRouter } from "next/navigation"; -const emptyStats: DashboardStats = { - totalTickets: 0, - openTickets: 0, - inProgressTickets: 0, - resolvedTickets: 0, - closedTickets: 0, - unassignedTickets: 0, - criticalTickets: 0, - dailyCounts: [], -}; - export default function DashboardPage() { const { user, isLoading: authLoading } = useAuth(); const router = useRouter(); const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); - const [myTickets, setMyTickets] = useState([]); - const [myTotal, setMyTotal] = useState(0); - // Equipo (ve todo o su área) vs usuario normal (solo sus tickets). - // El backend ya filtra stats y tickets por solicitante cuando no es equipo. + // Dashboard solo para el equipo. Los usuarios normales solo ven + // Tickets y Base de Conocimientos: se les redirige a sus tickets. const isTeam = user?.role === "admin" || user?.role === "agent" || user?.role === "supervisor"; useEffect(() => { if (authLoading) return; + if (!isTeam) { + router.replace("/tickets"); + return; + } getTicketStats() .then(setStats) .catch(() => { - setStats(emptyStats); + setStats({ + totalTickets: 0, + openTickets: 0, + inProgressTickets: 0, + resolvedTickets: 0, + closedTickets: 0, + unassignedTickets: 0, + criticalTickets: 0, + dailyCounts: [], + }); }) .finally(() => setLoading(false)); - if (!isTeam) { - getTickets({ page: 1, pageSize: 10 }) - .then((data) => { - setMyTickets(data.items || []); - setMyTotal(data.total || 0); - }) - .catch(() => { - setMyTickets([]); - setMyTotal(0); - }); - } - }, [authLoading, isTeam]); + }, [authLoading, isTeam, router]); - if (authLoading || loading) { + if (authLoading || loading || !isTeam) { return (
@@ -63,95 +49,6 @@ export default function DashboardPage() { ); } - // Usuario normal: sin mensaje de permisos, solo sus tickets. - if (!isTeam) { - return ( -
-
-

Mis Tickets

- - - Nuevo Ticket - -
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- - - Últimos tickets ({myTotal}) - - - Ver todos - -
-
- - - - - - - - - - - - {myTickets.length === 0 ? ( - - - - ) : ( - myTickets.map((ticket) => ( - router.push(`/tickets/${ticket.id}`)} - style={{ cursor: "pointer" }} - > - - - - - - - )) - )} - -
#AsuntoEstadoPrioridadActualizado
- -
Sin tickets
-

Aún no has creado ningún ticket

-
- {ticket.ticketNumber || `#${ticket.id}`} - -
{ticket.title}
-
- {formatDate(ticket.updatedAt)} -
-
-
-
- ); - } - const maxDaily = Math.max(...(stats?.dailyCounts?.map((d) => d.count) || [1])); return ( diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index 9ecfe67..e6cc1f1 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -451,6 +451,7 @@ body { border: none; box-shadow: var(--card-shadow); transition: all 0.2s ease; + height: 100%; } .stats-card:hover { @@ -693,6 +694,13 @@ body { padding: 0.5rem 0.75rem; } +/* Botones de la barra de filtros al mismo alto que selects e inputs */ +.filter-bar .btn { + padding: 0.5rem 0.75rem; + font-size: 0.85rem; + line-height: 1.5; +} + /* Ticket Detail */ .ticket-header { background: #fff; @@ -855,6 +863,7 @@ body { /* Dashboard: tarjetas clicables que filtran tickets */ .stats-card-anchor { display: block; + height: 100%; color: inherit; } diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx index abb17cf..4e42ca2 100644 --- a/frontend/src/components/Sidebar.tsx +++ b/frontend/src/components/Sidebar.tsx @@ -8,10 +8,15 @@ export default function Sidebar() { const pathname = usePathname(); const { user, logout } = useAuth(); + const isTeam = + user?.role === "admin" || user?.role === "agent" || user?.role === "supervisor"; + const navItems = [ - // Dashboard para todos: el equipo ve el global (o su área) y los - // usuarios normales ven solo sus tickets (sin mensaje de permisos). - { href: "/", icon: "bi-speedometer2", label: "Dashboard" }, + // Dashboard solo para el equipo. Los usuarios normales solo ven + // Tickets y Base de Conocimientos. + ...(isTeam + ? [{ href: "/", icon: "bi-speedometer2", label: "Dashboard" }] + : []), { href: "/tickets", icon: "bi-ticket-detailed", label: "Tickets" }, { href: "/knowledge-base", icon: "bi-journal-bookmark", label: "Knowledge Base" }, ];