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 741da1ef..ea99a6e0 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';
@@ -52,7 +52,7 @@ const EditPageRelatorio = () => {
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)
@@ -101,8 +101,11 @@ const EditPageRelatorio = () => {
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');
+ 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 });
@@ -114,7 +117,8 @@ 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');
}
@@ -150,4 +154,3 @@ const EditPageRelatorio = () => {
};
export default EditPageRelatorio;
-
diff --git a/src/PagesMedico/FormNovoRelatorio.jsx b/src/PagesMedico/FormNovoRelatorio.jsx
index 44bff898..b212a579 100644
--- a/src/PagesMedico/FormNovoRelatorio.jsx
+++ b/src/PagesMedico/FormNovoRelatorio.jsx
@@ -1,3 +1,4 @@
+// src/PagesMedico/FormNovoRelatorio.jsx
import React, { useEffect, useState, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
import API_KEY from '../components/utils/apiKeys';
@@ -39,7 +40,7 @@ const FormNovoRelatorio = () => {
const doctorRef = useRef();
useEffect(() => {
- // carregar pacientes
+ // carregar pacientes e médicos
let mounted = true;
const loadPatients = async () => {
setLoadingPatients(true);
@@ -109,7 +110,7 @@ const FormNovoRelatorio = () => {
patient_id: patient.id,
patient_name: patient.full_name || '',
patient_birth: patient.birth_date || '',
- contentHtml: generateTemplate(patient.full_name || '', patient.birth_date || '', form.doctor_name)
+ contentHtml: generateTemplate(patient.full_name || '', patient.birth_date || '', prev.doctor_name)
}));
setPatientQuery('');
setShowPatientDropdown(false);
@@ -120,7 +121,7 @@ const FormNovoRelatorio = () => {
...prev,
doctor_id: doctor.id,
doctor_name: doctor.full_name || '',
- contentHtml: generateTemplate(form.patient_name, form.patient_birth, doctor.full_name || '')
+ contentHtml: generateTemplate(prev.patient_name, prev.patient_birth, doctor.full_name || '')
}));
setDoctorQuery('');
setShowDoctorDropdown(false);
@@ -137,7 +138,7 @@ const FormNovoRelatorio = () => {
const handleEditorChange = (html) => setForm(prev => ({ ...prev, contentHtml: html }));
- // salvar novo relatório
+ // salvar novo relatório (agora com Prefer: return=representation e dispatch para refresh)
const handleSubmit = async (e) => {
e.preventDefault();
if (!form.patient_id) return alert('Selecione o paciente (clicando no item) antes de salvar.');
@@ -146,35 +147,51 @@ const FormNovoRelatorio = () => {
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');
+ myHeaders.append('Accept', 'application/json');
+ // pedir que o Supabase retorne a representação do registro criado
+ myHeaders.append('Prefer', 'return=representation');
- const body = JSON.stringify({
+ // monta o payload apenas com campos válidos
+ const payload = {
patient_id: form.patient_id,
content: form.contentHtml,
content_html: form.contentHtml,
- requested_by: form.doctor_name || '',
- created_by: form.doctor_id || null,
- status: 'draft'
- });
+ requested_by: form.doctor_name || ''
+ };
+ // só inclui created_by se tiver um id válido
+ if (form.doctor_id) payload.created_by = form.doctor_id;
+ payload.status = 'draft';
const res = await fetch('https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/reports', {
method: 'POST',
headers: myHeaders,
- body,
+ body: JSON.stringify(payload),
});
if (!res.ok) {
- const txt = await res.text();
+ // tenta ler JSON, se não for JSON lê o texto
+ let txt;
+ try {
+ txt = await res.json();
+ } catch (err) {
+ txt = await res.text();
+ }
console.error('Erro POST criar relatório:', res.status, txt);
- // mostra mensagem mais útil
- return alert(`Erro ao criar relatório (ver console). Status ${res.status}`);
+ return alert(`Erro ao criar relatório (ver console). Status ${res.status}\nMensagem: ${JSON.stringify(txt)}`);
}
+ const created = await res.json();
+ console.log('Relatório criado:', created);
+
+ // dispara refresh global para a lista (DoctorRelatorioManager está escutando)
+ window.dispatchEvent(new Event('reports:refresh'));
+
alert('Relatório criado com sucesso!');
navigate('/medico/relatorios');
} catch (err) {
- console.error('Erro salvar relatório:', err);
+ console.error('Erro salvar relatório (catch):', err);
alert('Erro ao salvar relatório. Veja console.');
}
};
@@ -185,7 +202,7 @@ const FormNovoRelatorio = () => {