Atualizacoes
This commit is contained in:
parent
461bf3b413
commit
46104c7b24
@ -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%);
|
||||
}
|
||||
|
||||
@ -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)) {
|
||||
@ -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>
|
||||
|
||||
@ -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">
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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>
|
||||
);
|
||||
};
|
||||
@ -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 && (
|
||||
@ -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'}>
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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";
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user