atualização do laudo

This commit is contained in:
Jessica_Faro 2025-09-13 15:44:47 -03:00
parent 1af8268943
commit d5d03b0dd0

View File

@ -1,5 +1,5 @@
// src/pages/LaudoManager.jsx // src/pages/LaudoManager.jsx
import React, { useState, useRef, useEffect } from "react"; import React, { useState, useEffect } from "react";
/* ===== Estilos embutidos ===== */ /* ===== Estilos embutidos ===== */
/* Eu coloquei os estilos aqui para simplificar a edição. */ /* Eu coloquei os estilos aqui para simplificar a edição. */
@ -32,8 +32,8 @@ const styles = `
.small-muted { color:#7f95a8; font-size:13px; } .small-muted { color:#7f95a8; font-size:13px; }
.empty { padding:40px; text-align:center; color:#7d97b4; } .empty { padding:40px; text-align:center; color:#7d97b4; }
/* notificação simples (sem backdrop escuro) */ /* notificação simples (centralizada) */
.notice-card { position:fixed; top:20vh; left:50%; transform:translateX(-50%); background:#fff; border-radius:8px; padding:14px 18px; box-shadow:0 8px 30px rgba(10,20,40,0.12); z-index:13000; pointer-events:auto; } .notice-card { position:fixed; top:50%; left:50%; transform:translate(-50%,-50%); background:#fff; border-radius:8px; padding:14px 18px; box-shadow:0 8px 30px rgba(10,20,40,0.12); z-index:13000; pointer-events:auto; max-width:720px; }
`; `;
/* ===== Mock data (simula APIDOG) ===== */ /* ===== Mock data (simula APIDOG) ===== */
@ -94,8 +94,11 @@ export default function LaudoManager() {
/* notificação simples (sem backdrop) para 'sem permissão' */ /* notificação simples (sem backdrop) para 'sem permissão' */
const [showNoPermission, setShowNoPermission] = useState(false); const [showNoPermission, setShowNoPermission] = useState(false);
/* pesquisa */
const [query, setQuery] = useState("");
/* Para simplificar: eu assumo aqui que estamos na visão da secretaria */ /* Para simplificar: eu assumo aqui que estamos na visão da secretaria */
const isSecretary = true; // eu deixei true para forçar o comportamento "somente leitura" const isSecretary = true; // permanece true (somente leitura)
useEffect(() => { useEffect(() => {
const el = document.createElement("style"); const el = document.createElement("style");
@ -122,35 +125,34 @@ export default function LaudoManager() {
setOpenDropdownId(prev => (prev === id ? null : id)); setOpenDropdownId(prev => (prev === id ? null : id));
} }
/* Quando clicar em Editar: /* (botao editar) */
- se for secretaria eu mostro um aviso simples sem fundo escuro
- se for médico (isSecretary=false) eu abriria o editor (aqui eu deixei o mecanismo) */
function handleOpenViewer(laudo) { function handleOpenViewer(laudo) {
setOpenDropdownId(null); setOpenDropdownId(null);
if (isSecretary) { if (isSecretary) {
// eu mostro um aviso simples (sem modal que bloqueia) // (notificação sem bloquear)
setShowNoPermission(true); setShowNoPermission(true);
return; return;
} }
setViewerLaudo(laudo); setViewerLaudo(laudo);
} }
/* Ao pedir impressão: eu fecho qualquer viewer aberto e abro a preview /* (botao imprimir) */
- a pré-visualização NÃO bloqueia a página (removi backdrop) */
function handlePrint(laudo) { function handlePrint(laudo) {
// Evito o bug: fechar viewer antes de abrir preview // evitar bug: fechar viewer antes de abrir preview
setViewerLaudo(null); setViewerLaudo(null);
setPreviewLaudo(laudo); setPreviewLaudo(laudo);
setShowPreview(true); setShowPreview(true);
setOpenDropdownId(null); setOpenDropdownId(null);
} }
/* (botao excluir) */
function handleRequestDelete(laudo) { function handleRequestDelete(laudo) {
setToDelete(laudo); setToDelete(laudo);
setOpenDropdownId(null); setOpenDropdownId(null);
setShowConfirmDelete(true); setShowConfirmDelete(true);
} }
/* (funcionalidade do botao de excluir) */
async function doConfirmDelete(confirm) { async function doConfirmDelete(confirm) {
if (!toDelete) return; if (!toDelete) return;
if (!confirm) { if (!confirm) {
@ -162,7 +164,7 @@ export default function LaudoManager() {
try { try {
const resp = await mockDeleteLaudo(toDelete.id); const resp = await mockDeleteLaudo(toDelete.id);
if (resp.ok || resp === true) { if (resp.ok || resp === true) {
// eu removo o laudo da lista local // removo o laudo da lista local
setLaudos(curr => curr.filter(l => l.id !== toDelete.id)); setLaudos(curr => curr.filter(l => l.id !== toDelete.id));
setShowConfirmDelete(false); setShowConfirmDelete(false);
setToDelete(null); setToDelete(null);
@ -177,25 +179,40 @@ export default function LaudoManager() {
} }
} }
/* filtro de pesquisa (por pedido ou nome do paciente) */
const normalized = (s = "") => String(s).toLowerCase();
const filteredLaudos = laudos.filter(l => {
const q = normalized(query).trim();
if (!q) return true;
if (normalized(l.pedido).includes(q)) return true;
if (normalized(l.paciente?.nome).includes(q)) return true;
return false;
});
return ( return (
<div className="laudo-wrap"> <div className="laudo-wrap">
<div className="left-col"> <div className="left-col">
<div className="title-row"> <div className="title-row">
<div> <div>
<div className="page-title">Gerenciamento de Laudo</div> <div className="page-title">Gerenciamento de Laudo</div>
<div style={{color:"#7f95a8", marginTop:6}}>Visualização: Secretaria (Somente leitura)</div> {/* removi a linha "Visualização: Secretaria" conforme pedido */}
</div> </div>
</div> </div>
<div style={{ marginBottom:12 }}> <div style={{ marginBottom:12 }}>
<input placeholder="Pesquisar paciente ou pedido..." style={{ width:"100%", padding:12, borderRadius:8, border:"1px solid #e6eef8" }} /> <input
placeholder="Pesquisar paciente ou pedido..."
value={query}
onChange={e => setQuery(e.target.value)}
style={{ width:"100%", padding:12, borderRadius:8, border:"1px solid #e6eef8" }}
/>
</div> </div>
{laudos.length === 0 ? ( {filteredLaudos.length === 0 ? (
<div className="empty">Nenhum laudo encontrado.</div> <div className="empty">Nenhum laudo encontrado.</div>
) : ( ) : (
<div style={{ borderRadius:8, overflow:"visible", boxShadow:"0 0 0 1px #eef6ff" }}> <div style={{ borderRadius:8, overflow:"visible", boxShadow:"0 0 0 1px #eef6ff" }}>
{laudos.map((l) => ( {filteredLaudos.map((l) => (
<div className="laudo-row" key={l.id}> <div className="laudo-row" key={l.id}>
<div className="col" style={{ flex: "0 0 160px" }}> <div className="col" style={{ flex: "0 0 160px" }}>
<div style={{ fontWeight:700 }}>{l.pedido}</div> <div style={{ fontWeight:700 }}>{l.pedido}</div>
@ -312,7 +329,7 @@ export default function LaudoManager() {
</div> </div>
)} )}
{/* Notificação simples: Sem permissão (exibe sem backdrop escuro) */} {/* Notificação simples: Sem permissão (exibe sem backdrop escuro) - centralizada */}
{showNoPermission && ( {showNoPermission && (
<div className="notice-card" role="alert" aria-live="polite"> <div className="notice-card" role="alert" aria-live="polite">
<div style={{ fontWeight:700, marginBottom:6 }}>Sem permissão para editar</div> <div style={{ fontWeight:700, marginBottom:6 }}>Sem permissão para editar</div>
@ -354,4 +371,4 @@ function computeAge(birth) {
const dd = today.getDate(); const dd = today.getDate();
if (mm < m || (mm === m && dd < d)) age--; if (mm < m || (mm === m && dd < d)) age--;
return age; return age;
} }