Adapt frontend to SAM API: RUT auth, new types, helpdesk endpoints

- Login: RUT-based (SAM auth) instead of email
- API client: updated all endpoints to /api/helpdesk/*
- Types: match SAM response format (nombre, apPaterno, perfil)
- Dashboard: uses new DashboardStats with dailyCounts
- Tickets: title instead of subject, requesterName/assigneeName
- KB: categoryName/authorName instead of nested objects
- Removed register page (SAM manages users)
This commit is contained in:
Nurfog committed 2026-09-10 11:27:35 -03:00
1 parent 0cca57f21e
commit f56f6365d2
11 files changed
+285 -718

No files matched your search

+15 -21
View File
@@ -29,16 +29,11 @@ export default function TicketsPage() {
page,
pageSize,
});
setTickets(data.tickets || []);
setTickets(data.items || []);
setTotal(data.total || 0);
} catch {
setTickets([
{ id: 1, ticketNumber: "#TK-001", subject: "No puedo acceder a mi correo", description: "", status: "open", priority: "high", category: "Software", requesterId: 1, groupId: null, requester: { id: 1, name: "María García", email: "maria@test.com", role: "customer" }, assigneeId: 2, assignee: { id: 2, name: "Carlos Méndez", email: "carlos@test.com", role: "agent" }, createdAt: "2026-09-01", updatedAt: "2026-09-07" },
{ id: 2, ticketNumber: "#TK-002", subject: "Impresora del piso 3 no funciona", description: "", status: "pending", priority: "medium", category: "Hardware", requesterId: 3, groupId: null, requester: { id: 3, name: "Pedro Soto", email: "pedro@test.com", role: "customer" }, assigneeId: 4, assignee: { id: 4, name: "Ana García", email: "ana@test.com", role: "agent" }, createdAt: "2026-09-05", updatedAt: "2026-09-07" },
{ id: 3, ticketNumber: "#TK-003", subject: "Solicitud de acceso al sistema contable", description: "", status: "resolved", priority: "low", category: "Acceso", requesterId: 5, groupId: null, requester: { id: 5, name: "Laura Fuentes", email: "laura@test.com", role: "customer" }, assigneeId: null, createdAt: "2026-09-03", updatedAt: "2026-09-06" },
{ id: 4, ticketNumber: "#TK-004", subject: "Laptop con pantalla parpadeante", description: "", status: "in_progress", priority: "urgent", category: "Hardware", requesterId: 6, groupId: null, requester: { id: 6, name: "Roberto Díaz", email: "roberto@test.com", role: "customer" }, assigneeId: 2, assignee: { id: 2, name: "Carlos Méndez", email: "carlos@test.com", role: "agent" }, createdAt: "2026-09-08", updatedAt: "2026-09-08" },
]);
setTotal(4);
setTickets([]);
setTotal(0);
} finally {
setLoading(false);
}
@@ -74,11 +69,11 @@ export default function TicketsPage() {
onChange={(e) => { setStatusFilter(e.target.value); setPage(1); }}
>
<option value="">Todos los estados</option>
<option value="open">Abierto</option>
<option value="pending">Pendiente</option>
<option value="in_progress">En Progreso</option>
<option value="resolved">Resuelto</option>
<option value="closed">Cerrado</option>
<option value="Open">Abierto</option>
<option value="Pending">Pendiente</option>
<option value="InProgress">En Progreso</option>
<option value="Resolved">Resuelto</option>
<option value="Closed">Cerrado</option>
</select>
<select
@@ -88,10 +83,10 @@ export default function TicketsPage() {
onChange={(e) => { setPriorityFilter(e.target.value); setPage(1); }}
>
<option value="">Todas las prioridades</option>
<option value="low">Baja</option>
<option value="medium">Media</option>
<option value="high">Alta</option>
<option value="urgent">Urgente</option>
<option value="Low">Baja</option>
<option value="Medium">Media</option>
<option value="High">Alta</option>
<option value="Critical">Crítica</option>
</select>
<div className="position-relative flex-grow-1" style={{ maxWidth: "280px" }}>
@@ -147,13 +142,12 @@ export default function TicketsPage() {
{ticket.ticketNumber || `#${ticket.id}`}
</td>
<td>
<div className="fw-medium">{ticket.subject}</div>
<small className="text-muted">{ticket.category}</small>
<div className="fw-medium">{ticket.title}</div>
</td>
<td>{ticket.requester?.name || "N/A"}</td>
<td>{ticket.requesterName || "N/A"}</td>
<td><BadgeStatus status={ticket.status} /></td>
<td><BadgePriority priority={ticket.priority} /></td>
<td>{ticket.assignee?.name || <span className="text-muted">Sin asignar</span>}</td>
<td>{ticket.assigneeName || <span className="text-muted">Sin asignar</span>}</td>
<td className="text-muted" style={{ fontSize: "0.85rem" }}>
{new Date(ticket.updatedAt).toLocaleDateString("es-CL")}
</td>