diff --git a/src/PagesMedico/DoctorRelatorioManager.jsx b/src/PagesMedico/DoctorRelatorioManager.jsx
index cf5d2c44..c15db0c1 100644
--- a/src/PagesMedico/DoctorRelatorioManager.jsx
+++ b/src/PagesMedico/DoctorRelatorioManager.jsx
@@ -19,45 +19,59 @@ const DoctorRelatorioManager = () => {
const [showModal, setShowModal] = useState(false);
const [index, setIndex] = useState();
- // busca lista de relatórios
useEffect(() => {
+ let mounted = true;
+
const fetchReports = async () => {
try {
var myHeaders = new Headers();
myHeaders.append('apikey', API_KEY);
- myHeaders.append('Authorization', authHeader);
+ if (authHeader) myHeaders.append('Authorization', authHeader);
var requestOptions = { method: 'GET', headers: myHeaders, redirect: 'follow' };
const res = await fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/reports?select=*", requestOptions);
const data = await res.json();
- setRelatorios(data || []);
+
+ const uniqueMap = new Map();
+ (Array.isArray(data) ? data : []).forEach(r => {
+ if (r && r.id) uniqueMap.set(r.id, r);
+ });
+ const unique = Array.from(uniqueMap.values())
+ .sort((a, b) => new Date(b.created_at || 0) - new Date(a.created_at || 0));
+
+ if (mounted) setRelatorios(unique);
} catch (err) {
console.error('Erro listar relatórios', err);
- setRelatorios([]);
+ if (mounted) setRelatorios([]);
}
};
+
fetchReports();
+
+ const refreshHandler = () => fetchReports();
+ window.addEventListener('reports:refresh', refreshHandler);
+
+ return () => {
+ mounted = false;
+ window.removeEventListener('reports:refresh', refreshHandler);
+ };
}, [authHeader]);
- // depois que RelatoriosFiltrados mudar, busca pacientes e médicos correspondentes
useEffect(() => {
const fetchRelData = async () => {
const pacientes = [];
const medicos = [];
for (let i = 0; i < RelatoriosFiltrados.length; i++) {
const rel = RelatoriosFiltrados[i];
- // paciente
try {
const pacienteRes = await GetPatientByID(rel.patient_id, authHeader);
pacientes.push(Array.isArray(pacienteRes) ? pacienteRes[0] : pacienteRes);
} catch (err) {
pacientes.push(null);
}
- // médico: tenta created_by ou requested_by id se existir
try {
const doctorId = rel.created_by || rel.requested_by || null;
if (doctorId) {
- // se created_by é id (uuid) usamos GetDoctorByID, senão se requested_by for nome, guardamos nome
const docRes = await GetDoctorByID(doctorId, authHeader);
medicos.push(Array.isArray(docRes) ? docRes[0] : docRes);
} else {
@@ -77,54 +91,73 @@ const DoctorRelatorioManager = () => {
}
}, [RelatoriosFiltrados, authHeader]);
- const BaixarPDFdoRelatorio = (nome_paciente) => {
- const elemento = document.getElementById("folhaA4");
- const opt = { margin: 0, filename: `relatorio_${nome_paciente || "paciente"}.pdf`, html2canvas: { scale: 2 }, jsPDF: { unit: "mm", format: "a4", orientation: "portrait" } };
+ const BaixarPDFdoRelatorio = (nome_paciente, idx) => {
+ const elemento = document.getElementById(`folhaA4-${idx}`);
+ if (!elemento) {
+ console.error('Elemento para gerar PDF não encontrado:', `folhaA4-${idx}`);
+ return;
+ }
+ const opt = {
+ margin: 0,
+ filename: `relatorio_${nome_paciente || "paciente"}.pdf`,
+ html2canvas: { scale: 2 },
+ jsPDF: { unit: "mm", format: "a4", orientation: "portrait" }
+ };
html2pdf().set(opt).from(elemento).save();
};
return (
{showModal && (
-
-
+
setShowModal(false)}>
+ {/* aqui: classe modal-dialog-square para ficar quadrado */}
+
e.stopPropagation()}>
-
-
Relatório de {PacientesComRelatorios[index]?.full_name}
-
+
+
Relatório de {PacientesComRelatorios[index]?.full_name}
+
+
-
-
)}
+ {/* restante da página (lista) permanece igual */}
Lista de Relatórios
@@ -173,7 +206,7 @@ const DoctorRelatorioManager = () => {
))
) : (
- | Nenhum paciente encontrado. |
+ | Nenhum paciente encontrado. |
)}
diff --git a/src/PagesMedico/EditPageRelatorio.jsx b/src/PagesMedico/EditPageRelatorio.jsx
index 54592117..5e2c6345 100644
--- a/src/PagesMedico/EditPageRelatorio.jsx
+++ b/src/PagesMedico/EditPageRelatorio.jsx
@@ -1,4 +1,4 @@
-// EditPageRelatorio.jsx
+// src/PagesMedico/EditPageRelatorio.jsx
import React, { useEffect, useState } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import API_KEY from '../components/utils/apiKeys';
@@ -7,7 +7,6 @@ import TiptapEditor from '../PagesMedico/TiptapEditor';
import { GetPatientByID } from '../components/utils/Functions-Endpoints/Patient';
import { GetDoctorByID } from '../components/utils/Functions-Endpoints/Doctor';
-
const EditPageRelatorio = () => {
const params = useParams();
const navigate = useNavigate();
@@ -19,7 +18,6 @@ const EditPageRelatorio = () => {
const [doctor, setDoctor] = useState(null);
const [html, setHtml] = useState('');
-
const generateTemplate = (r = {}, p = {}, d = {}) => {
const patientName = p?.full_name || '[NOME DO PACIENTE]';
const birthDate = p?.birth_date || '';
@@ -48,34 +46,29 @@ const EditPageRelatorio = () => {
`;
};
-
useEffect(() => {
const load = async () => {
setLoading(true);
try {
const myHeaders = new Headers();
myHeaders.append("apikey", API_KEY);
- myHeaders.append("Authorization", authHeader);
+ if (authHeader) myHeaders.append("Authorization", authHeader);
const requestOptions = { method: 'GET', headers: myHeaders, redirect: 'follow' };
-
// Pega relatório por id (supabase geralmente retorna array para ?id=eq.X)
const resp = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/reports?id=eq.${params.id}`, requestOptions);
const data = await resp.json();
const rep = Array.isArray(data) ? data[0] : data;
if (!rep) throw new Error('Relatório não encontrado');
-
setReport(rep);
-
// busca paciente
if (rep.patient_id) {
const p = await GetPatientByID(rep.patient_id, authHeader);
setPatient(Array.isArray(p) ? p[0] : p);
}
-
// busca doctor se tiver created_by/requested_by id (tentamos fallback)
if (rep.created_by) {
try {
@@ -86,7 +79,6 @@ const EditPageRelatorio = () => {
}
}
-
// content_html preferencial
let initial = rep.content_html || rep.content || rep.diagnosis || rep.conclusion || '';
if (!initial || initial.trim() === '') {
@@ -104,16 +96,15 @@ const EditPageRelatorio = () => {
// eslint-disable-next-line
}, [params.id, authHeader]);
-
const handleSave = async () => {
setLoading(true);
try {
const myHeaders = new Headers();
myHeaders.append('apikey', API_KEY);
- myHeaders.append('Authorization', authHeader);
+ if (authHeader) myHeaders.append('Authorization', authHeader);
myHeaders.append('Content-Type', 'application/json');
-
- // Adicionado para que a API retorne o registro atualizado
+ myHeaders.append('Accept', 'application/json');
+ // pedir que o Supabase retorne a representação do registro atualizado (opcional)
myHeaders.append('Prefer', 'return=representation');
const body = JSON.stringify({ content_html: html });
@@ -125,15 +116,21 @@ const EditPageRelatorio = () => {
});
if (!res.ok) {
- const txt = await res.text();
+ let txt;
+ try { txt = await res.text(); } catch (e) { txt = 'erro lendo resposta'; }
console.error('Erro PATCH', res.status, txt);
throw new Error('Erro na API');
}
// Recebe o dado atualizado e atualiza o estado do componente
- const updatedData = await res.json();
+ let updatedData;
+ try {
+ updatedData = await res.json();
+ } catch (e) {
+ updatedData = null;
+ }
const updatedReport = Array.isArray(updatedData) ? updatedData[0] : updatedData;
-
+
if (updatedReport) {
setReport(updatedReport);
setHtml(updatedReport.content_html || '');
@@ -150,21 +147,17 @@ const EditPageRelatorio = () => {
}
};
-
if (loading) return Carregando...
;
-
return (
Editar Relatório do Paciente: {patient?.full_name || '...'}
-
Conteúdo do Relatório
setHtml(newHtml)} />
-