fix-search-laudo
This commit is contained in:
parent
905caa14ad
commit
369846f1c2
@ -849,7 +849,23 @@ const ProfissionalPage = () => {
|
|||||||
try {
|
try {
|
||||||
if (isMaybeId(term)) {
|
if (isMaybeId(term)) {
|
||||||
try {
|
try {
|
||||||
const r = await buscarRelatorioPorId(term);
|
let r: any = null;
|
||||||
|
// Try direct API lookup first
|
||||||
|
try {
|
||||||
|
r = await buscarRelatorioPorId(term);
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('[SearchBox] buscarRelatorioPorId failed, will try loadReportById fallback', e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback: use hook loader if direct API didn't return
|
||||||
|
if (!r) {
|
||||||
|
try {
|
||||||
|
r = await loadReportById(term);
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('[SearchBox] loadReportById fallback failed', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (r) {
|
if (r) {
|
||||||
// If token exists, attempt batch enrichment like useReports
|
// If token exists, attempt batch enrichment like useReports
|
||||||
const enriched: any = { ...r };
|
const enriched: any = { ...r };
|
||||||
@ -935,8 +951,14 @@ const ProfissionalPage = () => {
|
|||||||
|
|
||||||
const handleClear = async () => {
|
const handleClear = async () => {
|
||||||
setSearchTerm('');
|
setSearchTerm('');
|
||||||
await loadReports();
|
try {
|
||||||
setLaudos(reports || []);
|
// Reuse the same logic as initial load so Clear restores the doctor's assigned laudos
|
||||||
|
await loadAssignedLaudos();
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('[SearchBox] erro ao restaurar laudos do médico ao limpar busca:', err);
|
||||||
|
// Safe fallback to whatever reports are available
|
||||||
|
setLaudos(reports || []);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -965,82 +987,44 @@ const ProfissionalPage = () => {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// carregar laudos ao montar - somente dos pacientes atribuídos ao médico logado
|
// helper to load laudos for the patients assigned to the logged-in user
|
||||||
useEffect(() => {
|
const loadAssignedLaudos = async () => {
|
||||||
let mounted = true;
|
try {
|
||||||
(async () => {
|
const assignments = await import('@/lib/assignment').then(m => m.listAssignmentsForUser(user?.id || ''));
|
||||||
|
const patientIds = Array.isArray(assignments) ? assignments.map(a => String(a.patient_id)).filter(Boolean) : [];
|
||||||
|
|
||||||
|
if (patientIds.length === 0) {
|
||||||
|
setLaudos([]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// obter assignments para o usuário logado
|
const reportsMod = await import('@/lib/reports');
|
||||||
const assignments = await import('@/lib/assignment').then(m => m.listAssignmentsForUser(user?.id || ''));
|
if (typeof reportsMod.listarRelatoriosPorPacientes === 'function') {
|
||||||
const patientIds = Array.isArray(assignments) ? assignments.map(a => String(a.patient_id)).filter(Boolean) : [];
|
const batch = await reportsMod.listarRelatoriosPorPacientes(patientIds);
|
||||||
|
const mineOnly = (batch || []).filter((r: any) => {
|
||||||
|
const requester = ((r.requested_by ?? r.created_by ?? r.executante ?? r.requestedBy ?? r.createdBy) || '').toString();
|
||||||
|
return user?.id && requester && requester === user.id;
|
||||||
|
});
|
||||||
|
|
||||||
if (patientIds.length === 0) {
|
const enriched = await (async (reportsArr: any[]) => {
|
||||||
if (mounted) setLaudos([]);
|
if (!reportsArr || !reportsArr.length) return reportsArr;
|
||||||
return;
|
const pids = reportsArr.map(r => String(getReportPatientId(r))).filter(Boolean);
|
||||||
}
|
if (!pids.length) return reportsArr;
|
||||||
|
try {
|
||||||
// Tentar carregar todos os relatórios em uma única chamada usando in.(...)
|
const patients = await buscarPacientesPorIds(pids);
|
||||||
try {
|
const map = new Map((patients || []).map((p: any) => [String(p.id), p]));
|
||||||
const reportsMod = await import('@/lib/reports');
|
return reportsArr.map((r: any) => {
|
||||||
if (typeof reportsMod.listarRelatoriosPorPacientes === 'function') {
|
const pid = String(getReportPatientId(r));
|
||||||
const batch = await reportsMod.listarRelatoriosPorPacientes(patientIds);
|
return { ...r, paciente: r.paciente ?? map.get(pid) ?? r.paciente } as any;
|
||||||
// Filtrar apenas relatórios criados/solicitados por este usuário (evita mostrar laudos de outros médicos)
|
});
|
||||||
const mineOnly = (batch || []).filter((r: any) => {
|
} catch (e) {
|
||||||
const requester = ((r.requested_by ?? r.created_by ?? r.executante ?? r.requestedBy ?? r.createdBy) || '').toString();
|
return reportsArr;
|
||||||
return user?.id && requester && requester === user.id;
|
|
||||||
});
|
|
||||||
// Enrich reports with paciente objects so UI shows name/cpf immediately
|
|
||||||
const enriched = await (async (reportsArr: any[]) => {
|
|
||||||
if (!reportsArr || !reportsArr.length) return reportsArr;
|
|
||||||
const pids = reportsArr.map(r => String(getReportPatientId(r))).filter(Boolean);
|
|
||||||
if (!pids.length) return reportsArr;
|
|
||||||
try {
|
|
||||||
const patients = await buscarPacientesPorIds(pids);
|
|
||||||
const map = new Map((patients || []).map((p: any) => [String(p.id), p]));
|
|
||||||
return reportsArr.map(r => {
|
|
||||||
const pid = String(getReportPatientId(r));
|
|
||||||
return { ...r, paciente: r.paciente ?? map.get(pid) ?? r.paciente };
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
return reportsArr;
|
|
||||||
}
|
|
||||||
})(mineOnly);
|
|
||||||
if (mounted) setLaudos(enriched || []);
|
|
||||||
} else {
|
|
||||||
// fallback: 请求 por paciente individual
|
|
||||||
const allReports: any[] = [];
|
|
||||||
for (const pid of patientIds) {
|
|
||||||
try {
|
|
||||||
const rels = await import('@/lib/reports').then(m => m.listarRelatoriosPorPaciente(pid));
|
|
||||||
if (Array.isArray(rels) && rels.length) {
|
|
||||||
// filtrar por autor (requested_by / created_by / executante)
|
|
||||||
const mine = rels.filter((r: any) => {
|
|
||||||
const requester = ((r.requested_by ?? r.created_by ?? r.executante ?? r.requestedBy ?? r.createdBy) || '').toString();
|
|
||||||
return user?.id && requester && requester === user.id;
|
|
||||||
});
|
|
||||||
if (mine.length) allReports.push(...mine);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.warn('[LaudoManager] falha ao carregar relatórios para paciente', pid, err);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// enrich fallback results too
|
})(mineOnly);
|
||||||
const enrichedAll = await (async (reportsArr: any[]) => {
|
setLaudos(enriched || []);
|
||||||
if (!reportsArr || !reportsArr.length) return reportsArr;
|
return;
|
||||||
const pids = reportsArr.map(r => String(getReportPatientId(r))).filter(Boolean);
|
} else {
|
||||||
if (!pids.length) return reportsArr;
|
|
||||||
try {
|
|
||||||
const patients = await buscarPacientesPorIds(pids);
|
|
||||||
const map = new Map((patients || []).map((p: any) => [String(p.id), p]));
|
|
||||||
return reportsArr.map(r => ({ ...r, paciente: r.paciente ?? map.get(String(getReportPatientId(r))) ?? r.paciente }));
|
|
||||||
} catch (e) {
|
|
||||||
return reportsArr;
|
|
||||||
}
|
|
||||||
})(allReports);
|
|
||||||
if (mounted) setLaudos(enrichedAll);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.warn('[LaudoManager] erro ao carregar relatórios em batch, tentando por paciente individual', err);
|
|
||||||
const allReports: any[] = [];
|
const allReports: any[] = [];
|
||||||
for (const pid of patientIds) {
|
for (const pid of patientIds) {
|
||||||
try {
|
try {
|
||||||
@ -1052,10 +1036,11 @@ const ProfissionalPage = () => {
|
|||||||
});
|
});
|
||||||
if (mine.length) allReports.push(...mine);
|
if (mine.length) allReports.push(...mine);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (err) {
|
||||||
console.warn('[LaudoManager] falha ao carregar relatórios para paciente', pid, e);
|
console.warn('[LaudoManager] falha ao carregar relatórios para paciente', pid, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const enrichedAll = await (async (reportsArr: any[]) => {
|
const enrichedAll = await (async (reportsArr: any[]) => {
|
||||||
if (!reportsArr || !reportsArr.length) return reportsArr;
|
if (!reportsArr || !reportsArr.length) return reportsArr;
|
||||||
const pids = reportsArr.map(r => String(getReportPatientId(r))).filter(Boolean);
|
const pids = reportsArr.map(r => String(getReportPatientId(r))).filter(Boolean);
|
||||||
@ -1063,17 +1048,58 @@ const ProfissionalPage = () => {
|
|||||||
try {
|
try {
|
||||||
const patients = await buscarPacientesPorIds(pids);
|
const patients = await buscarPacientesPorIds(pids);
|
||||||
const map = new Map((patients || []).map((p: any) => [String(p.id), p]));
|
const map = new Map((patients || []).map((p: any) => [String(p.id), p]));
|
||||||
return reportsArr.map(r => ({ ...r, paciente: r.paciente ?? map.get(String(getReportPatientId(r))) ?? r.paciente }));
|
return reportsArr.map((r: any) => ({ ...r, paciente: r.paciente ?? map.get(String(getReportPatientId(r))) ?? r.paciente } as any));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return reportsArr;
|
return reportsArr;
|
||||||
}
|
}
|
||||||
})(allReports);
|
})(allReports);
|
||||||
if (mounted) setLaudos(enrichedAll);
|
setLaudos(enrichedAll);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (err) {
|
||||||
console.warn('[LaudoManager] erro ao carregar laudos para pacientes atribuídos:', e);
|
console.warn('[LaudoManager] erro ao carregar relatórios em batch, tentando por paciente individual', err);
|
||||||
if (mounted) setLaudos(reports || []);
|
const allReports: any[] = [];
|
||||||
|
for (const pid of patientIds) {
|
||||||
|
try {
|
||||||
|
const rels = await import('@/lib/reports').then(m => m.listarRelatoriosPorPaciente(pid));
|
||||||
|
if (Array.isArray(rels) && rels.length) {
|
||||||
|
const mine = rels.filter((r: any) => {
|
||||||
|
const requester = ((r.requested_by ?? r.created_by ?? r.executante ?? r.requestedBy ?? r.createdBy) || '').toString();
|
||||||
|
return user?.id && requester && requester === user.id;
|
||||||
|
});
|
||||||
|
if (mine.length) allReports.push(...mine);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('[LaudoManager] falha ao carregar relatórios para paciente', pid, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const enrichedAll = await (async (reportsArr: any[]) => {
|
||||||
|
if (!reportsArr || !reportsArr.length) return reportsArr;
|
||||||
|
const pids = reportsArr.map(r => String(getReportPatientId(r))).filter(Boolean);
|
||||||
|
if (!pids.length) return reportsArr;
|
||||||
|
try {
|
||||||
|
const patients = await buscarPacientesPorIds(pids);
|
||||||
|
const map = new Map((patients || []).map((p: any) => [String(p.id), p]));
|
||||||
|
return reportsArr.map((r: any) => ({ ...r, paciente: r.paciente ?? map.get(String(getReportPatientId(r))) ?? r.paciente } as any));
|
||||||
|
} catch (e) {
|
||||||
|
return reportsArr;
|
||||||
|
}
|
||||||
|
})(allReports);
|
||||||
|
setLaudos(enrichedAll);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('[LaudoManager] erro ao carregar laudos para pacientes atribuídos:', e);
|
||||||
|
setLaudos(reports || []);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// carregar laudos ao montar - somente dos pacientes atribuídos ao médico logado
|
||||||
|
useEffect(() => {
|
||||||
|
let mounted = true;
|
||||||
|
(async () => {
|
||||||
|
// call the helper and bail if the component unmounted during async work
|
||||||
|
await loadAssignedLaudos();
|
||||||
})();
|
})();
|
||||||
return () => { mounted = false; };
|
return () => { mounted = false; };
|
||||||
}, [user?.id]);
|
}, [user?.id]);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user