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

View File

@ -1,6 +1,6 @@
import { useState, useEffect } from "react"; import { useState, useEffect } from "react";
import { useAuth } from "../../_assets/utils/AuthProvider"; 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 API_KEY from "../../_assets/utils/apiKeys";
import "../../_assets/css/components/agendamento/FormAgendamento.css"; import "../../_assets/css/components/agendamento/FormAgendamento.css";
@ -11,6 +11,7 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
const { getAuthorizationHeader, user, getUserInfo } = useAuth(); const { getAuthorizationHeader, user, getUserInfo } = useAuth();
const [dadosAtendimento, setDadosAtendimento] = useState({ const [dadosAtendimento, setDadosAtendimento] = useState({
profissional: doctorID || '', profissional: doctorID || '',
crm: '',
tipoAtendimento: '', tipoAtendimento: '',
dataAtendimento: '', dataAtendimento: '',
inicio: '', 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(() => { useEffect(() => {
const loadDoctors = async () => { const loadDoctors = async () => {
setSearchingDoctor(true); setSearchingDoctor(true);
@ -40,7 +99,38 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
try { authHeader = getAuthorizationHeader ? getAuthorizationHeader() : ''; } catch {} try { authHeader = getAuthorizationHeader ? getAuthorizationHeader() : ''; } catch {}
try { try {
const Medicos = await GetAllDoctors(authHeader); 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) { } catch (err) {
console.error('Erro ao carregar médicos:', err); console.error('Erro ao carregar médicos:', err);
setTodosProfissionais([]); setTodosProfissionais([]);
@ -49,7 +139,7 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
} }
}; };
loadDoctors(); loadDoctors();
}, [getAuthorizationHeader]); }, [getAuthorizationHeader, doctorID, user]);
const handleSearchProfissional = (e) => { const handleSearchProfissional = (e) => {
const term = e.target.value; const term = e.target.value;
@ -60,17 +150,16 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
return; return;
} }
const filtered = todosProfissionais.filter(p => 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); setProfissionaisFiltrados(filtered);
setIsDropdownOpen(filtered.length > 0); setIsDropdownOpen(filtered.length > 0);
}; };
const handleSelectProfissional = (profissional) => { const handleSelectProfissional = (profissional) => {
setDadosAtendimento(prev => ({ const crmValue = profissional.crm || profissional.crm_number || profissional.crmFormatted || '';
...prev, setDadosAtendimento(prev => ({ ...prev, profissional: profissional.id, crm: crmValue }));
profissional: profissional.id
}));
setDoctorSearchName(profissional.full_name || ''); setDoctorSearchName(profissional.full_name || '');
setProfissionaisFiltrados([]); setProfissionaisFiltrados([]);
setIsDropdownOpen(false); setIsDropdownOpen(false);
@ -83,13 +172,40 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
e.preventDefault(); e.preventDefault();
console.log("Tentando criar Exceção."); 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) { // agora a validação principal é pelo CRM (campo obrigatório)
alert("Por favor, preencha o ID do Profissional, Data, Tipo e Motivo."); if (!crm || !dataAtendimento || !tipoAtendimento || !motivo) {
alert("Por favor, preencha o CRM do médico, Data, Tipo e Motivo.");
return; 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 // usa diretamente o value selecionado (já definido no <select>) e valida
const mappedKind = tipoAtendimento; const mappedKind = tipoAtendimento;
if (!ALLOWED_KINDS.includes(mappedKind)) { if (!ALLOWED_KINDS.includes(mappedKind)) {
@ -202,14 +318,15 @@ const FormCriarExcecao = ({ onCancel, doctorID }) => {
{searchingDoctor && <small>Carregando médicos...</small>} {searchingDoctor && <small>Carregando médicos...</small>}
</div> </div>
{/* ID do profissional (preenchido ao selecionar) */} {/* CRM do profissional (agora campo obrigatório de validação) */}
<div className="campo-de-input"> <div className="campo-de-input">
<label>ID do profissional *</label> <label>CRM do médico *</label>
<input <input
type="text" type="text"
name="profissional" name="crm"
required required
value={dadosAtendimento.profissional} placeholder="Ex: 12345-SP"
value={dadosAtendimento.crm}
onChange={handleAtendimentoChange} onChange={handleAtendimentoChange}
/> />
</div> </div>

View File

@ -116,6 +116,7 @@ const ChatComponent = () => { // Renomeei para ChatComponent para clareza
<header className="sidebar-header"> <header className="sidebar-header">
<h1>Mensagens</h1> <h1>Mensagens</h1>
<div className="search-container"> <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 <input
type="text" type="text"
placeholder="Pesquisar paciente..." placeholder="Pesquisar paciente..."
@ -123,7 +124,6 @@ const ChatComponent = () => { // Renomeei para ChatComponent para clareza
value={searchTerm} value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)} 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> </div>
</header> </header>
<div className="conversation-list"> <div className="conversation-list">

View File

@ -164,7 +164,7 @@ const ExcecoesDisponibilidadeDoctor = () => {
<button <button
className="btn-primary" className="btn-primary"
onClick={() => setMostrarForm(true)} 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 + Criar Nova Exceção
</button> </button>

View File

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

View File

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

View File

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

View File

@ -13,7 +13,7 @@ import PatientCadastroManager from "../../pages/secretaria/CadastroPaciente";
import DoctorCadastroManager from "../../pages/secretaria/CadastroMedico"; import DoctorCadastroManager from "../../pages/secretaria/CadastroMedico";
import DoctorTable from "../../pages/secretaria/ListaMedicos"; import DoctorTable from "../../pages/secretaria/ListaMedicos";
import Agendamento from "../../pages/secretaria/ListaAgendamentos"; 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 Details from "../../pages/secretaria/DetalhesPaciente";
import EditPage from "../../pages/secretaria/EditarPaciente"; import EditPage from "../../pages/secretaria/EditarPaciente";
import DoctorDetails from "../../pages/secretaria/DetalhesMedico"; import DoctorDetails from "../../pages/secretaria/DetalhesMedico";

View File

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

View File

@ -9,7 +9,7 @@ import Sidebar from "../../components/Sidebar/Sidebar";
//Pages //Pages
import InicioPaciente from "../../pages/paciente/DashboardPaciente"; 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 ConsultaCadastroManager from "../../pages/paciente/CadastroConsulta";
import ConsultasPaciente from "../../pages/paciente/ListaConsulta"; import ConsultasPaciente from "../../pages/paciente/ListaConsulta";
import ConsultaEditPage from "../../pages/paciente/EditarConsulta"; 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 DoctorCadastroManager from "../../pages/secretaria/CadastroMedico";
import DoctorTable from "../../pages/secretaria/ListaMedicos"; import DoctorTable from "../../pages/secretaria/ListaMedicos";
import Agendamento from "../../pages/secretaria/ListaAgendamentos"; 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 Details from "../../pages/secretaria/DetalhesPaciente";
import EditPage from "../../pages/secretaria/EditarPaciente"; import EditPage from "../../pages/secretaria/EditarPaciente";
import DoctorDetails from "../../pages/secretaria/DetalhesMedico"; import DoctorDetails from "../../pages/secretaria/DetalhesMedico";