From 1a471357b75e6fed702ca852a1b6ba347002b69d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Gustavo?= <166467972+JoaoGustavo-dev@users.noreply.github.com> Date: Sat, 11 Oct 2025 22:30:05 -0300 Subject: [PATCH] add-userID --- .../app/(main-routes)/doutores/page.tsx | 76 +++++++++++++++++-- .../app/(main-routes)/pacientes/page.tsx | 2 +- susconecta/app/profissional/page.tsx | 42 +++++++--- .../components/admin/AssignmentForm.tsx | 9 ++- .../forms/doctor-registration-form.tsx | 35 +++++++-- .../forms/patient-registration-form.tsx | 18 +++++ susconecta/lib/api.ts | 33 ++++++++ susconecta/lib/assignment.ts | 6 +- susconecta/lib/reports.ts | 65 ++++++++++++++++ 9 files changed, 255 insertions(+), 31 deletions(-) diff --git a/susconecta/app/(main-routes)/doutores/page.tsx b/susconecta/app/(main-routes)/doutores/page.tsx index 64fcf5e..50612db 100644 --- a/susconecta/app/(main-routes)/doutores/page.tsx +++ b/susconecta/app/(main-routes)/doutores/page.tsx @@ -7,12 +7,13 @@ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; -import { MoreHorizontal, Plus, Search, Edit, Trash2, ArrowLeft, Eye } from "lucide-react"; +import { MoreHorizontal, Plus, Search, Edit, Trash2, ArrowLeft, Eye, Users } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { DoctorRegistrationForm } from "@/components/forms/doctor-registration-form"; -import { listarMedicos, excluirMedico, buscarMedicos, buscarMedicoPorId, Medico } from "@/lib/api"; +import { listarMedicos, excluirMedico, buscarMedicos, buscarMedicoPorId, buscarPacientesPorIds, Medico } from "@/lib/api"; +import { listAssignmentsForUser } from '@/lib/assignment'; function normalizeMedico(m: any): Medico { return { @@ -64,6 +65,10 @@ export default function DoutoresPage() { const [showForm, setShowForm] = useState(false); const [editingId, setEditingId] = useState(null); const [viewingDoctor, setViewingDoctor] = useState(null); + const [assignedDialogOpen, setAssignedDialogOpen] = useState(false); + const [assignedPatients, setAssignedPatients] = useState([]); + const [assignedLoading, setAssignedLoading] = useState(false); + const [assignedDoctor, setAssignedDoctor] = useState(null); const [searchResults, setSearchResults] = useState([]); const [searchMode, setSearchMode] = useState(false); const [searchTimeout, setSearchTimeout] = useState(null); @@ -179,7 +184,7 @@ export default function DoutoresPage() { // Handler para o botão de busca function handleClickBuscar() { - handleBuscarServidor(); + void handleBuscarServidor(); } useEffect(() => { @@ -253,6 +258,28 @@ export default function DoutoresPage() { setViewingDoctor(doctor); } + async function handleViewAssignedPatients(doctor: Medico) { + setAssignedDoctor(doctor); + setAssignedLoading(true); + setAssignedPatients([]); + try { + const assigns = await listAssignmentsForUser(String(doctor.user_id ?? doctor.id)); + const patientIds = Array.isArray(assigns) ? assigns.map((a:any) => String(a.patient_id)).filter(Boolean) : []; + if (patientIds.length) { + const patients = await buscarPacientesPorIds(patientIds); + setAssignedPatients(patients || []); + } else { + setAssignedPatients([]); + } + } catch (e) { + console.warn('[DoutoresPage] erro ao carregar pacientes atribuídos:', e); + setAssignedPatients([]); + } finally { + setAssignedLoading(false); + setAssignedDialogOpen(true); + } + } + async function handleDelete(id: string) { if (!confirm("Excluir este médico?")) return; @@ -326,9 +353,9 @@ export default function DoutoresPage() { onKeyDown={handleSearchKeyDown} /> - - + handleView(doctor)}> Ver + + {/* Ver pacientes atribuídos ao médico */} + handleViewAssignedPatients(doctor)}> + + Ver pacientes atribuídos + + handleEdit(String(doctor.id))}> Editar @@ -466,6 +500,36 @@ export default function DoutoresPage() {
Mostrando {displayedDoctors.length} {searchMode ? 'resultado(s) da busca' : `de ${doctors.length}`}
+ {/* Dialog para pacientes atribuídos */} + { if (!open) { setAssignedDialogOpen(false); setAssignedPatients([]); setAssignedDoctor(null); } }}> + + + Pacientes atribuídos{assignedDoctor ? ` - ${assignedDoctor.full_name}` : ''} + + Lista de pacientes atribuídos a este médico. + + +
+ {assignedLoading ? ( +
Carregando pacientes...
+ ) : assignedPatients && assignedPatients.length ? ( +
+ {assignedPatients.map((p:any) => ( +
+
{p.full_name ?? p.nome ?? p.name ?? '(sem nome)'}
+
ID: {p.id} {p.cpf ? `• CPF: ${p.cpf}` : ''}
+
+ ))} +
+ ) : ( +
Nenhum paciente atribuído encontrado.
+ )} +
+ + + +
+
); } diff --git a/susconecta/app/(main-routes)/pacientes/page.tsx b/susconecta/app/(main-routes)/pacientes/page.tsx index c331bf9..0442b83 100644 --- a/susconecta/app/(main-routes)/pacientes/page.tsx +++ b/susconecta/app/(main-routes)/pacientes/page.tsx @@ -207,7 +207,7 @@ export default function PacientesPage() { onKeyDown={(e) => e.key === "Enter" && handleBuscarServidor()} /> - +