Atualizacoes

This commit is contained in:
Eduarda-SS 2025-12-04 09:56:19 -03:00
parent 461bf3b413
commit 46104c7b24
11 changed files with 145 additions and 32 deletions

View File

@ -52,6 +52,8 @@
.search-container {
position: relative;
margin-top: 1rem;
border: none;
box-shadow: none;
}
.search-input {
@ -71,7 +73,7 @@
height: 1.25rem;
color: var(--cor-texto-secundario);
position: absolute;
left: 0.75rem;
left: 1.75rem;
top: 50%;
transform: translateY(-50%);
}

View File

@ -1,6 +1,6 @@
import { useState, useEffect } from "react";
import { useAuth } from "../../_assets/utils/AuthProvider";
import { GetAllDoctors } from '../../_assets/utils/Functions-Endpoints/Doctor';
import { GetAllDoctors, GetDoctorByName } from '../../_assets/utils/Functions-Endpoints/Doctor';
import API_KEY from "../../_assets/utils/apiKeys";
import "../../_assets/css/components/agendamento/FormAgendamento.css";
@ -11,6 +11,7 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
const { getAuthorizationHeader, user, getUserInfo } = useAuth();
const [dadosAtendimento, setDadosAtendimento] = useState({
profissional: doctorID || '',
crm: '',
tipoAtendimento: '',
dataAtendimento: '',
inicio: '',
@ -33,6 +34,64 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
}));
};
// Preencher automaticamente usando GetDoctorByName (se disponível) ou dados do usuário como fallback
useEffect(() => {
let cancelled = false;
const loggedDoctorId = doctorID || user?.doctor_id || user?.id || null;
const userName = user?.full_name || user?.name || user?.username || '';
const userCrm = user?.crm || user?.crm_number || user?.crmFormatted || '';
const tryFill = async () => {
// se não há nome para buscar, usa fallback local
if (!userName) {
setDadosAtendimento(prev => ({
...prev,
profissional: prev.profissional || loggedDoctorId || '',
crm: prev.crm || userCrm || ''
}));
setDoctorSearchName(prev => prev || '');
return;
}
try {
const authHeader = getAuthorizationHeader ? getAuthorizationHeader() : '';
const doctor = await GetDoctorByName(userName, authHeader);
if (cancelled) return;
if (doctor) {
const crmValue = doctor.crm || doctor.crm_number || doctor.crmFormatted || userCrm || '';
const idValue = doctor.id || loggedDoctorId || '';
setDadosAtendimento(prev => ({
...prev,
profissional: prev.profissional || idValue,
crm: prev.crm || crmValue
}));
setDoctorSearchName(prev => prev || (doctor.full_name || userName));
} else {
// fallback para dados do usuário quando busca não retorna resultado
setDadosAtendimento(prev => ({
...prev,
profissional: prev.profissional || loggedDoctorId || '',
crm: prev.crm || userCrm || ''
}));
setDoctorSearchName(prev => prev || userName);
}
} catch (err) {
console.warn('GetDoctorByName falhou, usando fallback do usuário:', err);
if (cancelled) return;
setDadosAtendimento(prev => ({
...prev,
profissional: prev.profissional || loggedDoctorId || '',
crm: prev.crm || userCrm || ''
}));
setDoctorSearchName(prev => prev || userName);
}
};
tryFill();
return () => { cancelled = true; };
}, [doctorID, user, getAuthorizationHeader]);
useEffect(() => {
const loadDoctors = async () => {
setSearchingDoctor(true);
@ -40,7 +99,38 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
try { authHeader = getAuthorizationHeader ? getAuthorizationHeader() : ''; } catch {}
try {
const Medicos = await GetAllDoctors(authHeader);
setTodosProfissionais(Array.isArray(Medicos) ? Medicos : []);
const medicosArray = Array.isArray(Medicos) ? Medicos : [];
setTodosProfissionais(medicosArray);
// preencher automaticamente com médico logado (se encontrado na lista)
const loggedDoctorId = doctorID || user?.doctor_id || user?.id || null;
if (loggedDoctorId) {
const match = medicosArray.find(d =>
String(d.id) === String(loggedDoctorId) ||
String(d.doctor_id || '').toLowerCase() === String(loggedDoctorId).toLowerCase()
);
if (match) {
const crmValue = match.crm || match.crm_number || match.crmFormatted || '';
setDadosAtendimento(prev => ({
...prev,
profissional: prev.profissional || match.id,
crm: prev.crm || crmValue
}));
setDoctorSearchName(prev => prev || (match.full_name || ''));
} else {
// se não encontrou na lista mas user tem crm, preenche crm
const userCrm = user?.crm || user?.crm_number || '';
if (userCrm) {
setDadosAtendimento(prev => ({ ...prev, crm: prev.crm || userCrm }));
}
}
} else {
// se não há loggedDoctorId, mas user tem crm, preenche crm
const userCrm = user?.crm || user?.crm_number || '';
if (userCrm) {
setDadosAtendimento(prev => ({ ...prev, crm: prev.crm || userCrm }));
}
}
} catch (err) {
console.error('Erro ao carregar médicos:', err);
setTodosProfissionais([]);
@ -49,7 +139,7 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
}
};
loadDoctors();
}, [getAuthorizationHeader]);
}, [getAuthorizationHeader, doctorID, user]);
const handleSearchProfissional = (e) => {
const term = e.target.value;
@ -60,17 +150,16 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
return;
}
const filtered = todosProfissionais.filter(p =>
(p.full_name || '').toLowerCase().includes(term.toLowerCase())
((p.full_name || '').toLowerCase().includes(term.toLowerCase()) ||
(String(p.crm || p.crm_number || '').toLowerCase().includes(term.toLowerCase())))
);
setProfissionaisFiltrados(filtered);
setIsDropdownOpen(filtered.length > 0);
};
const handleSelectProfissional = (profissional) => {
setDadosAtendimento(prev => ({
...prev,
profissional: profissional.id
}));
const crmValue = profissional.crm || profissional.crm_number || profissional.crmFormatted || '';
setDadosAtendimento(prev => ({ ...prev, profissional: profissional.id, crm: crmValue }));
setDoctorSearchName(profissional.full_name || '');
setProfissionaisFiltrados([]);
setIsDropdownOpen(false);
@ -83,13 +172,40 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
e.preventDefault();
console.log("Tentando criar Exceção.");
const { profissional, dataAtendimento, tipoAtendimento, inicio, termino, motivo } = dadosAtendimento;
let { profissional, crm, dataAtendimento, tipoAtendimento, inicio, termino, motivo } = dadosAtendimento;
if (!profissional || !dataAtendimento || !tipoAtendimento || !motivo) {
alert("Por favor, preencha o ID do Profissional, Data, Tipo e Motivo.");
// agora a validação principal é pelo CRM (campo obrigatório)
if (!crm || !dataAtendimento || !tipoAtendimento || !motivo) {
alert("Por favor, preencha o CRM do médico, Data, Tipo e Motivo.");
return;
}
// se o ID do profissional não foi selecionado, tenta resolver pelo CRM usando lista carregada
if (!profissional) {
const match = todosProfissionais.find(d => {
const dcrm = String(d.crm || d.crm_number || d.crmFormatted || '').trim();
return dcrm && dcrm.toLowerCase() === String(crm).toLowerCase();
});
if (match) {
profissional = match.id;
} else {
alert("Médico com o CRM informado não encontrado. Selecione a partir da lista ou verifique o CRM.");
return;
}
} else {
// se ID estiver setado, opcional: conferir se CRM coincide com o cadastrado (se tiver)
const sel = todosProfissionais.find(d => d.id === profissional);
if (sel) {
const dcrm = String(sel.crm || sel.crm_number || sel.crmFormatted || '').trim();
if (dcrm && dcrm.toLowerCase() !== String(crm).toLowerCase()) {
// apenas alerta, não bloqueia mantém ID para envio como pedido
if (!window.confirm("O CRM informado não corresponde ao CRM do médico selecionado. Deseja continuar?")) {
return;
}
}
}
}
// usa diretamente o value selecionado (já definido no <select>) e valida
const mappedKind = tipoAtendimento;
if (!ALLOWED_KINDS.includes(mappedKind)) {
@ -179,7 +295,7 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
<h2 className="section-title">Informações da Nova Exceção</h2>
<div className="campo-informacoes-atendimento">
{/* Busca por nome usando filtragem local */}
{/* Busca por nome usando filtragem local */}
<div className="campo-de-input campo-de-input-container">
<label>Nome do médico</label>
<input
@ -202,14 +318,15 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
{searchingDoctor && <small>Carregando médicos...</small>}
</div>
{/* ID do profissional (preenchido ao selecionar) */}
{/* CRM do profissional (agora campo obrigatório de validação) */}
<div className="campo-de-input">
<label>ID do profissional *</label>
<label>CRM do médico *</label>
<input
type="text"
name="profissional"
name="crm"
required
value={dadosAtendimento.profissional}
placeholder="Ex: 12345-SP"
value={dadosAtendimento.crm}
onChange={handleAtendimentoChange}
/>
</div>

View File

@ -116,6 +116,7 @@ const ChatComponent = () => { // Renomeei para ChatComponent para clareza
<header className="sidebar-header">
<h1>Mensagens</h1>
<div className="search-container">
<svg className="search-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg>
<input
type="text"
placeholder="Pesquisar paciente..."
@ -123,7 +124,6 @@ const ChatComponent = () => { // Renomeei para ChatComponent para clareza
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
/>
<svg className="search-icon" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"></path></svg>
</div>
</header>
<div className="conversation-list">

View File

@ -164,7 +164,7 @@ const ExcecoesDisponibilidadeDoctor = () => {
<button
className="btn-primary"
onClick={() => setMostrarForm(true)}
style={{ padding: '10px 20px', fontSize: '14px', whiteSpace: 'nowrap' }}
style={{ margin: '30px 0 0 0', padding: '10px 20px', fontSize: '14px', whiteSpace: 'nowrap' }}
>
+ Criar Nova Exceção
</button>

View File

@ -305,11 +305,10 @@ const DoctorRelatorioManager = () => {
)}
<div className="page-heading"><h3>Lista de Relatórios</h3></div>
<div className="page-content">
<section className="row">
<div className="col-12">
<div className="card">
<div className="card-header d-flex justify-content-between align-items-center">
<div className="card-header d-flex justify-content-between">
<h4 className="card-title mb-0">Relatórios Cadastrados</h4>
<Link to={'criar'}>
<button className="btn btn-primary">
@ -455,7 +454,6 @@ const DoctorRelatorioManager = () => {
</div>
</div>
</section>
</div>
</div>
);
};

View File

@ -241,11 +241,9 @@ const LaudoManager = () => {
return (
<div>
<div className="page-heading"><h3>Lista de Relatórios</h3></div>
<div className="page-content">
<section className="row">
<div className="col-12">
<div className="card">
<div className="card-header d-flex justify-content-between align-items-center">
<div className="card-header d-flex justify-content-between">
<h4 className="card-title mb-0">Relatórios Cadastrados</h4>
<div>
<button
@ -404,9 +402,7 @@ const LaudoManager = () => {
</div>
</div>
</div>
</div>
</section>
</div>
{/* Modal principal (detalhes) */}
{showModal && relatorioModal && (

View File

@ -216,7 +216,7 @@ function TableDoctor({setDictInfo}) {
<div className="page-content table-doctor-container">
<section className="row">
<div className="col-12">
<div className="card table-doctor-card">
<div className="table-doctor-card">
<div className="card-header">
<h4 className="card-title mb-0">Médicos Cadastrados</h4>
<Link to={'cadastro'}>

View File

@ -13,7 +13,7 @@ import PatientCadastroManager from "../../pages/secretaria/CadastroPaciente";
import DoctorCadastroManager from "../../pages/secretaria/CadastroMedico";
import DoctorTable from "../../pages/secretaria/ListaMedicos";
import Agendamento from "../../pages/secretaria/ListaAgendamentos";
import LaudoManager from "../../pages/secretaria/CadastroLaudos";
import LaudoManager from "../../pages/secretaria/ListaLaudos";
import Details from "../../pages/secretaria/DetalhesPaciente";
import EditPage from "../../pages/secretaria/EditarPaciente";
import DoctorDetails from "../../pages/secretaria/DetalhesMedico";

View File

@ -8,7 +8,7 @@ import Sidebar from "../../components/Sidebar/Sidebar";
import BotaoVideoChamada from '../../components/VideoChamada/BotaoVideoChamada';
//Pages
import DoctorRelatorioManager from "../../pages/medico/CadastroRelatorio";
import DoctorRelatorioManager from "../../pages/medico/ListaLaudosMedico";
import Prontuario from "../../pages/medico/Prontuario";
import DoctorAgendamentoManager from "../../pages/medico/CadastroAgendamento";
import Chat from "../../pages/medico/Chat";

View File

@ -9,7 +9,7 @@ import Sidebar from "../../components/Sidebar/Sidebar";
//Pages
import InicioPaciente from "../../pages/paciente/DashboardPaciente";
import LaudoManager from "../../pages/secretaria/CadastroLaudos";
import LaudoManager from "../../pages/secretaria/ListaLaudos";
import ConsultaCadastroManager from "../../pages/paciente/CadastroConsulta";
import ConsultasPaciente from "../../pages/paciente/ListaConsulta";
import ConsultaEditPage from "../../pages/paciente/EditarConsulta";

View File

@ -14,7 +14,7 @@ import PatientCadastroManager from "../../pages/secretaria/CadastroPaciente";
import DoctorCadastroManager from "../../pages/secretaria/CadastroMedico";
import DoctorTable from "../../pages/secretaria/ListaMedicos";
import Agendamento from "../../pages/secretaria/ListaAgendamentos";
import LaudoManager from "../../pages/secretaria/CadastroLaudos";
import LaudoManager from "../../pages/secretaria/ListaLaudos";
import Details from "../../pages/secretaria/DetalhesPaciente";
import EditPage from "../../pages/secretaria/EditarPaciente";
import DoctorDetails from "../../pages/secretaria/DetalhesMedico";