Alterações do conflito
This commit is contained in:
parent
246f7cebe5
commit
4d1522fac5
6269
package-lock.json
generated
6269
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -34,15 +34,6 @@ const ConsultasPaciente = ({ setDictInfo }) => {
|
||||
const [coresConsultas,setCoresConsultas] = useState([])
|
||||
|
||||
const [showConfirmModal, setShowConfirmModal] = useState(false)
|
||||
<<<<<<< HEAD
|
||||
=======
|
||||
|
||||
// Estados para a tabela da fila de espera
|
||||
const [searchTermFila, setSearchTermFila] = useState('');
|
||||
const [filtroMedicoFila, setFiltroMedicoFila] = useState('Todos');
|
||||
const [paginaAtualFila, setPaginaAtualFila] = useState(1);
|
||||
const [itensPorPaginaFila, setItensPorPaginaFila] = useState(10);
|
||||
>>>>>>> Modificacoes
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
@ -218,7 +209,6 @@ const confirmConsulta = (selectedPatientId) => {
|
||||
|
||||
|
||||
{viewFila ?
|
||||
<<<<<<< HEAD
|
||||
<div className="fila-container">
|
||||
<div className="fila-header">
|
||||
<input
|
||||
@ -274,299 +264,6 @@ const confirmConsulta = (selectedPatientId) => {
|
||||
listaConsultasID={listaConsultasID} setShowConfirmModal={setShowConfirmModal}
|
||||
/>
|
||||
</div>
|
||||
=======
|
||||
<div className="page-content table-paciente-container">
|
||||
<section className="row">
|
||||
<div className="col-12">
|
||||
<div className="card table-paciente-card">
|
||||
<div className="card-header">
|
||||
<h4 className="card-title mb-0">Fila de Espera</h4>
|
||||
</div>
|
||||
|
||||
<div className="card-body">
|
||||
{/* Filtros */}
|
||||
<div className="card p-3 mb-3 table-paciente-filters">
|
||||
<h5 className="mb-3">
|
||||
<i className="bi bi-funnel-fill me-2 text-primary"></i> Filtros
|
||||
</h5>
|
||||
|
||||
<div className="mb-3">
|
||||
<input
|
||||
type="text"
|
||||
className="form-control"
|
||||
placeholder="Buscar por nome do paciente ou CPF..."
|
||||
value={searchTermFila}
|
||||
onChange={(e) => setSearchTermFila(e.target.value)}
|
||||
/>
|
||||
<small className="text-muted">
|
||||
Digite o nome completo ou número do CPF
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div className="mb-3">
|
||||
<input
|
||||
type="text"
|
||||
className="form-control"
|
||||
placeholder="Filtrar por nome do médico..."
|
||||
value={filtroMedicoFila === 'Todos' ? '' : filtroMedicoFila}
|
||||
onChange={(e) => setFiltroMedicoFila(e.target.value || 'Todos')}
|
||||
/>
|
||||
<small className="text-muted">
|
||||
Digite o nome do médico para filtrar
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div className="d-flex justify-content-end">
|
||||
<button
|
||||
className="btn btn-outline-secondary btn-sm"
|
||||
onClick={() => {
|
||||
setSearchTermFila('');
|
||||
setFiltroMedicoFila('Todos');
|
||||
setPaginaAtualFila(1);
|
||||
}}
|
||||
>
|
||||
<i className="bi bi-arrow-clockwise me-1"></i> Limpar Filtros
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="mt-3">
|
||||
<div className="contador-pacientes">
|
||||
{(() => {
|
||||
const filtrados = filaDeEspera.filter((item) => {
|
||||
const buscaNome = item?.paciente_nome?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const buscaCPF = item?.paciente_cpf?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const passaBusca = searchTermFila === "" || buscaNome || buscaCPF;
|
||||
const passaMedico = filtroMedicoFila === "Todos" || item?.medico_nome?.toLowerCase().includes(filtroMedicoFila.toLowerCase());
|
||||
return passaBusca && passaMedico;
|
||||
});
|
||||
return filtrados.length;
|
||||
})()} DE {filaDeEspera.length} SOLICITAÇÕES ENCONTRADAS
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Filtros Ativos */}
|
||||
{(searchTermFila || filtroMedicoFila !== "Todos") && (
|
||||
<div className="alert alert-info mb-3 filters-active">
|
||||
<strong>Filtros ativos:</strong>
|
||||
<div className="mt-1">
|
||||
{searchTermFila && <span className="badge bg-primary me-2">Busca: "{searchTermFila}"</span>}
|
||||
{filtroMedicoFila !== "Todos" && <span className="badge bg-primary me-2">Médico: {filtroMedicoFila}</span>}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Tabela */}
|
||||
<div className="table-responsive">
|
||||
<table className="table table-striped table-hover table-paciente-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nome do Paciente</th>
|
||||
<th>CPF</th>
|
||||
<th>Médico Solicitado</th>
|
||||
<th>Data da Solicitação</th>
|
||||
<th>Ações</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{(() => {
|
||||
// Filtrar dados
|
||||
const filaFiltrada = filaDeEspera.filter((item) => {
|
||||
const buscaNome = item?.paciente_nome?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const buscaCPF = item?.paciente_cpf?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const passaBusca = searchTermFila === "" || buscaNome || buscaCPF;
|
||||
const passaMedico = filtroMedicoFila === "Todos" || item?.medico_nome?.toLowerCase().includes(filtroMedicoFila.toLowerCase());
|
||||
return passaBusca && passaMedico;
|
||||
});
|
||||
|
||||
// Paginação
|
||||
const totalPaginasFila = Math.ceil(filaFiltrada.length / itensPorPaginaFila);
|
||||
const indiceInicial = (paginaAtualFila - 1) * itensPorPaginaFila;
|
||||
const indiceFinal = indiceInicial + itensPorPaginaFila;
|
||||
const filaPaginada = filaFiltrada.slice(indiceInicial, indiceFinal);
|
||||
|
||||
if (filaPaginada.length > 0) {
|
||||
return filaPaginada.map((item, index) => (
|
||||
<tr key={index}>
|
||||
<td>
|
||||
<div className="d-flex align-items-center">
|
||||
{item?.paciente_nome}
|
||||
</div>
|
||||
</td>
|
||||
<td>{item?.paciente_cpf}</td>
|
||||
<td>
|
||||
<span className="badge insurance-badge">
|
||||
{item?.medico_nome || 'Não informado'}
|
||||
</span>
|
||||
</td>
|
||||
<td>{dayjs(item?.created_at).format('DD/MM/YYYY HH:mm')}</td>
|
||||
<td>
|
||||
<div className="d-flex gap-2">
|
||||
<button
|
||||
className="btn btn-sm btn-delete"
|
||||
onClick={() => {
|
||||
setSelectedId(item.id);
|
||||
setShowDeleteModal(true);
|
||||
}}
|
||||
>
|
||||
<i className="bi bi-trash me-1"></i> Excluir
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
));
|
||||
} else {
|
||||
return (
|
||||
<tr>
|
||||
<td colSpan="5" className="text-center py-4">
|
||||
<div className="text-muted">
|
||||
<i className="bi bi-search display-4"></i>
|
||||
<p className="mt-2">Nenhuma solicitação encontrada com os filtros aplicados.</p>
|
||||
{(searchTermFila || filtroMedicoFila !== "Todos") && (
|
||||
<button
|
||||
className="btn btn-outline-primary btn-sm mt-2"
|
||||
onClick={() => {
|
||||
setSearchTermFila('');
|
||||
setFiltroMedicoFila('Todos');
|
||||
setPaginaAtualFila(1);
|
||||
}}
|
||||
>
|
||||
Limpar filtros
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
})()}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{/* Paginação */}
|
||||
{(() => {
|
||||
const filaFiltrada = filaDeEspera.filter((item) => {
|
||||
const buscaNome = item?.paciente_nome?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const buscaCPF = item?.paciente_cpf?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const passaBusca = searchTermFila === "" || buscaNome || buscaCPF;
|
||||
const passaMedico = filtroMedicoFila === "Todos" || item?.medico_nome?.toLowerCase().includes(filtroMedicoFila.toLowerCase());
|
||||
return passaBusca && passaMedico;
|
||||
});
|
||||
|
||||
const totalPaginasFila = Math.ceil(filaFiltrada.length / itensPorPaginaFila);
|
||||
const indiceInicial = (paginaAtualFila - 1) * itensPorPaginaFila;
|
||||
const indiceFinal = indiceInicial + itensPorPaginaFila;
|
||||
|
||||
if (filaFiltrada.length > 0) {
|
||||
return (
|
||||
<div className="d-flex justify-content-between align-items-center mt-3">
|
||||
<div className="d-flex align-items-center">
|
||||
<span className="me-2 text-muted">Itens por página:</span>
|
||||
<select
|
||||
className="form-select form-select-sm"
|
||||
style={{ width: '80px' }}
|
||||
value={itensPorPaginaFila}
|
||||
onChange={(e) => {
|
||||
setItensPorPaginaFila(Number(e.target.value));
|
||||
setPaginaAtualFila(1);
|
||||
}}
|
||||
>
|
||||
<option value={5}>5</option>
|
||||
<option value={10}>10</option>
|
||||
<option value={20}>20</option>
|
||||
<option value={50}>50</option>
|
||||
</select>
|
||||
<span className="ms-3 text-muted">
|
||||
Mostrando {indiceInicial + 1}-{Math.min(indiceFinal, filaFiltrada.length)} de {filaFiltrada.length}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<nav>
|
||||
<ul className="pagination pagination-sm mb-0">
|
||||
<li className={`page-item ${paginaAtualFila === 1 ? 'disabled' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => setPaginaAtualFila(1)}
|
||||
disabled={paginaAtualFila === 1}
|
||||
>
|
||||
Primeira
|
||||
</button>
|
||||
</li>
|
||||
<li className={`page-item ${paginaAtualFila === 1 ? 'disabled' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => setPaginaAtualFila(paginaAtualFila - 1)}
|
||||
disabled={paginaAtualFila === 1}
|
||||
>
|
||||
Anterior
|
||||
</button>
|
||||
</li>
|
||||
|
||||
{[...Array(totalPaginasFila)].map((_, i) => {
|
||||
const pageNum = i + 1;
|
||||
if (
|
||||
pageNum === 1 ||
|
||||
pageNum === totalPaginasFila ||
|
||||
(pageNum >= paginaAtualFila - 1 && pageNum <= paginaAtualFila + 1)
|
||||
) {
|
||||
return (
|
||||
<li key={pageNum} className={`page-item ${paginaAtualFila === pageNum ? 'active' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => setPaginaAtualFila(pageNum)}
|
||||
>
|
||||
{pageNum}
|
||||
</button>
|
||||
</li>
|
||||
);
|
||||
} else if (pageNum === paginaAtualFila - 2 || pageNum === paginaAtualFila + 2) {
|
||||
return <li key={pageNum} className="page-item disabled"><span className="page-link">...</span></li>;
|
||||
}
|
||||
return null;
|
||||
})}
|
||||
|
||||
<li className={`page-item ${paginaAtualFila === totalPaginasFila ? 'disabled' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => setPaginaAtualFila(paginaAtualFila + 1)}
|
||||
disabled={paginaAtualFila === totalPaginasFila}
|
||||
>
|
||||
Próxima
|
||||
</button>
|
||||
</li>
|
||||
<li className={`page-item ${paginaAtualFila === totalPaginasFila ? 'disabled' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => setPaginaAtualFila(totalPaginasFila)}
|
||||
disabled={paginaAtualFila === totalPaginasFila}
|
||||
>
|
||||
Última
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return null;
|
||||
})()}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
:
|
||||
<div>
|
||||
<h2 className='fila-titulo'>Suas proximas consultas</h2>
|
||||
|
||||
<TabelaAgendamentoDia agendamentos={consultasOrganizadas} setDictInfo={setDictInfo}
|
||||
selectedID={selectedID} setSelectedId={setSelectedId} setShowDeleteModal={setShowDeleteModal}
|
||||
coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID}
|
||||
listaConsultasID={listaConsultasID} setShowConfirmModal={setShowConfirmModal}
|
||||
/>
|
||||
</div>
|
||||
>>>>>>> Modificacoes
|
||||
}
|
||||
|
||||
{showDeleteModal && (
|
||||
|
||||
@ -20,10 +20,6 @@ import './style/FilaEspera.css';
|
||||
import { Search } from 'lucide-react';
|
||||
|
||||
import Spinner from '../components/Spinner.jsx';
|
||||
<<<<<<< HEAD
|
||||
|
||||
=======
|
||||
>>>>>>> Modificacoes
|
||||
|
||||
|
||||
|
||||
@ -55,7 +51,6 @@ const Agendamento = ({ setDictInfo }) => {
|
||||
|
||||
|
||||
const [cacheAgendamentos, setCacheAgendamentos] = useState([])
|
||||
<<<<<<< HEAD
|
||||
|
||||
const [showConfirmModal, setShowConfirmModal] = useState(false)
|
||||
const [motivoCancelamento, setMotivoCancelamento] = useState("")
|
||||
@ -69,50 +64,15 @@ const Agendamento = ({ setDictInfo }) => {
|
||||
|
||||
const cacheMedicos = {};
|
||||
const cachePacientes = {};
|
||||
=======
|
||||
|
||||
const [showConfirmModal, setShowConfirmModal] = useState(false)
|
||||
|
||||
const [motivoCancelamento, setMotivoCancelamento] = useState("")
|
||||
|
||||
const [corModal, setCorModal] = useState("")
|
||||
|
||||
const [listaConsultasID, setListaConsultaID] = useState([])
|
||||
const [coresConsultas, setCoresConsultas] = useState([])
|
||||
|
||||
// Estados para a tabela da fila de espera
|
||||
const [searchTermFila, setSearchTermFila] = useState('');
|
||||
const [filtroMedicoFila, setFiltroMedicoFila] = useState('Todos');
|
||||
const [paginaAtualFila, setPaginaAtualFila] = useState(1);
|
||||
const [itensPorPaginaFila, setItensPorPaginaFila] = useState(10);
|
||||
|
||||
let authHeader = getAuthorizationHeader()
|
||||
|
||||
const cacheMedicos = {};
|
||||
const cachePacientes = {};
|
||||
>>>>>>> Modificacoes
|
||||
|
||||
useMemo(() => {
|
||||
if (!listaTodosAgendamentos.length) return { agendamentosOrganizados: {}, filaEsperaData: [] };
|
||||
useEffect(() => {
|
||||
if (!listaTodosAgendamentos.length) return;
|
||||
console.log("recarregando")
|
||||
const DictAgendamentosOrganizados = {};
|
||||
const ListaFilaDeEspera = [];
|
||||
|
||||
const fetchDados = async () => {
|
||||
for (const agendamento of listaTodosAgendamentos) {
|
||||
if (agendamento.status === "requested") {
|
||||
// Cache de médico e paciente
|
||||
if (!cacheMedicos[agendamento.doctor_id]) {
|
||||
cacheMedicos[agendamento.doctor_id] = await GetDoctorByID(agendamento.doctor_id, authHeader);
|
||||
}
|
||||
if (!cachePacientes[agendamento.patient_id]) {
|
||||
cachePacientes[agendamento.patient_id] = await GetPatientByID(agendamento.patient_id, authHeader);
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
const fetchDados = async () => {
|
||||
for (const agendamento of listaTodosAgendamentos) {
|
||||
|
||||
// Cache de médico e paciente
|
||||
if (!cacheMedicos[agendamento.doctor_id]) {
|
||||
cacheMedicos[agendamento.doctor_id] = await GetDoctorByID(agendamento.doctor_id, authHeader);
|
||||
@ -125,34 +85,6 @@ const cachePacientes = {};
|
||||
const paciente = cachePacientes[agendamento.patient_id];
|
||||
|
||||
if (agendamento.status === "requested") {
|
||||
ListaFilaDeEspera.push({
|
||||
agendamento,
|
||||
Infos: {
|
||||
nome_medico: medico[0]?.full_name,
|
||||
doctor_id: medico[0]?.id,
|
||||
patient_id: paciente[0]?.id,
|
||||
paciente_nome: paciente[0]?.full_name,
|
||||
paciente_cpf: paciente[0]?.cpf,
|
||||
|
||||
},
|
||||
});
|
||||
} else {
|
||||
const DiaAgendamento = agendamento.scheduled_at.split("T")[0];
|
||||
|
||||
let agendamentoMelhorado = {...agendamento, medico_nome: medico[0]?.full_name,
|
||||
doctor_id: medico[0]?.id,
|
||||
patient_id: paciente[0]?.id,
|
||||
paciente_nome: paciente[0]?.full_name,
|
||||
paciente_cpf: paciente[0]?.cpf, }
|
||||
|
||||
if (DiaAgendamento in DictAgendamentosOrganizados) {
|
||||
DictAgendamentosOrganizados[DiaAgendamento].push(agendamentoMelhorado);
|
||||
} else {
|
||||
DictAgendamentosOrganizados[DiaAgendamento] = [agendamentoMelhorado];
|
||||
=======
|
||||
const medico = cacheMedicos[agendamento.doctor_id];
|
||||
const paciente = cachePacientes[agendamento.patient_id];
|
||||
|
||||
ListaFilaDeEspera.push({
|
||||
agendamento,
|
||||
Infos: {
|
||||
@ -166,12 +98,17 @@ const cachePacientes = {};
|
||||
} else {
|
||||
const DiaAgendamento = agendamento.scheduled_at.split("T")[0];
|
||||
|
||||
let agendamentoMelhorado = {...agendamento, medico_nome: medico[0]?.full_name,
|
||||
doctor_id: medico[0]?.id,
|
||||
patient_id: paciente[0]?.id,
|
||||
paciente_nome: paciente[0]?.full_name,
|
||||
paciente_cpf: paciente[0]?.cpf, }
|
||||
|
||||
if (DiaAgendamento in DictAgendamentosOrganizados) {
|
||||
DictAgendamentosOrganizados[DiaAgendamento].push(agendamento);
|
||||
DictAgendamentosOrganizados[DiaAgendamento].push(agendamentoMelhorado);
|
||||
} else {
|
||||
DictAgendamentosOrganizados[DiaAgendamento] = [agendamento];
|
||||
DictAgendamentosOrganizados[DiaAgendamento] = [agendamentoMelhorado];
|
||||
}
|
||||
>>>>>>> Modificacoes
|
||||
}
|
||||
}
|
||||
|
||||
@ -192,8 +129,6 @@ const cachePacientes = {};
|
||||
};
|
||||
|
||||
fetchDados();
|
||||
|
||||
return { agendamentosOrganizados: DictAgendamentosOrganizados, filaEsperaData: ListaFilaDeEspera };
|
||||
}, [listaTodosAgendamentos]); // 👉 só recalcula quando a lista muda
|
||||
|
||||
|
||||
@ -233,38 +168,11 @@ const cachePacientes = {};
|
||||
myHeaders.append('apikey', API_KEY)
|
||||
myHeaders.append("authorization", authHeader)
|
||||
|
||||
<<<<<<< HEAD
|
||||
const confirmConsulta = (selectedPatientId) => {
|
||||
var myHeaders = new Headers();
|
||||
myHeaders.append("Content-Type", "application/json");
|
||||
myHeaders.append('apikey', API_KEY)
|
||||
myHeaders.append("authorization", authHeader)
|
||||
|
||||
|
||||
var raw = JSON.stringify({ "status":"confirmed"
|
||||
});
|
||||
|
||||
|
||||
var requestOptions = {
|
||||
method: 'PATCH',
|
||||
headers: myHeaders,
|
||||
body: raw,
|
||||
redirect: 'follow'
|
||||
};
|
||||
|
||||
fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${selectedPatientId}`, requestOptions)
|
||||
.then(response => {if(response.status !== 200)(console.log(response))})
|
||||
.then(result => console.log(result))
|
||||
.catch(error => console.log('error', error));
|
||||
}
|
||||
=======
|
||||
|
||||
var raw = JSON.stringify({
|
||||
"status": "cancelled",
|
||||
"cancellation_reason": motivoCancelamento
|
||||
var raw = JSON.stringify({
|
||||
"status":"cancelled",
|
||||
"cancellation_reason": motivoCancelamento
|
||||
});
|
||||
|
||||
|
||||
var requestOptions = {
|
||||
method: 'PATCH',
|
||||
headers: myHeaders,
|
||||
@ -273,7 +181,7 @@ const confirmConsulta = (selectedPatientId) => {
|
||||
};
|
||||
|
||||
fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${selectedPatientId}`, requestOptions)
|
||||
.then(response => { if (response.status !== 200) (console.log(response)) })
|
||||
.then(response => {if(response.status !== 200)(console.log(response))})
|
||||
.then(result => console.log(result))
|
||||
.catch(error => console.log('error', error));
|
||||
}
|
||||
@ -284,11 +192,7 @@ const confirmConsulta = (selectedPatientId) => {
|
||||
myHeaders.append('apikey', API_KEY)
|
||||
myHeaders.append("authorization", authHeader)
|
||||
|
||||
|
||||
var raw = JSON.stringify({
|
||||
"status": "confirmed"
|
||||
});
|
||||
|
||||
var raw = JSON.stringify({ "status":"confirmed" });
|
||||
|
||||
var requestOptions = {
|
||||
method: 'PATCH',
|
||||
@ -298,12 +202,10 @@ const confirmConsulta = (selectedPatientId) => {
|
||||
};
|
||||
|
||||
fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${selectedPatientId}`, requestOptions)
|
||||
.then(response => { if (response.status !== 200) (console.log(response)) })
|
||||
.then(response => {if(response.status !== 200)(console.log(response))})
|
||||
.then(result => console.log(result))
|
||||
.catch(error => console.log('error', error));
|
||||
|
||||
}
|
||||
>>>>>>> Modificacoes
|
||||
|
||||
|
||||
|
||||
@ -347,23 +249,10 @@ const confirmConsulta = (selectedPatientId) => {
|
||||
}
|
||||
|
||||
|
||||
<<<<<<< HEAD
|
||||
useEffect(() => {
|
||||
console.log("mudou FiltredTodosMedicos:", FiltredTodosMedicos);
|
||||
if (MedicoFiltrado.id != "vazio" ) {
|
||||
const unicoMedico = MedicoFiltrado;
|
||||
=======
|
||||
const handleClickAgendamento = (agendamento) => {
|
||||
if (agendamento.status !== 'vazio') return
|
||||
else setPageConsulta(true)
|
||||
};
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
console.log("mudou FiltredTodosMedicos:", FiltredTodosMedicos);
|
||||
if (MedicoFiltrado.id != "vazio") {
|
||||
const unicoMedico = MedicoFiltrado;
|
||||
>>>>>>> Modificacoes
|
||||
console.log(unicoMedico)
|
||||
const idMedicoFiltrado = unicoMedico.idMedico;
|
||||
console.log(`Médico único encontrado: ${unicoMedico.nomeMedico}. ID: ${idMedicoFiltrado}`);
|
||||
@ -419,7 +308,6 @@ const confirmConsulta = (selectedPatientId) => {
|
||||
medico.nomeMedico.toLowerCase().includes(term.toLowerCase())
|
||||
);
|
||||
setFiltredTodosMedicos(filtered);
|
||||
<<<<<<< HEAD
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
@ -431,17 +319,6 @@ useEffect(() => {
|
||||
|
||||
<h1>Agendar nova consulta</h1>
|
||||
|
||||
=======
|
||||
};
|
||||
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className='spinner'></div>
|
||||
<h1>Agendar nova consulta</h1>
|
||||
|
||||
|
||||
>>>>>>> Modificacoes
|
||||
<div className="btns-gerenciamento-e-consulta" style={{ display: 'flex', gap: '10px', marginBottom: '20px' }}>
|
||||
<button className="btn btn-primary" onClick={() => setPageConsulta(true)}>
|
||||
<i className="bi bi-plus-circle"></i> Adicionar Consulta
|
||||
@ -463,7 +340,6 @@ useEffect(() => {
|
||||
|
||||
{!PageNovaConsulta ? (
|
||||
<div className='atendimento-eprocura'>
|
||||
<<<<<<< HEAD
|
||||
<div className='unidade-selecionarprofissional'>
|
||||
|
||||
{/* Bloco de busca por médico */}
|
||||
@ -478,22 +354,6 @@ useEffect(() => {
|
||||
value={searchTermDoctor}
|
||||
onChange={(e) => handleSearchMedicos(e.target.value)}
|
||||
/>
|
||||
=======
|
||||
<div className='unidade-selecionarprofissional'>
|
||||
|
||||
{/* Bloco de busca por médico */}
|
||||
<div className='busca-atendimento-container'>
|
||||
<div className='input-e-dropdown-wrapper'>
|
||||
<div className='busca-atendimento'>
|
||||
<div>
|
||||
<i className="fa-solid fa-calendar-day"></i>
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Filtrar atendimento por médico..."
|
||||
value={searchTermDoctor}
|
||||
onChange={(e) => handleSearchMedicos(e.target.value)}
|
||||
/>
|
||||
>>>>>>> Modificacoes
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -567,19 +427,11 @@ useEffect(() => {
|
||||
<div className='legenda-item-cancelado'><span>Cancelado</span></div>
|
||||
</div>
|
||||
</section>
|
||||
<<<<<<< HEAD
|
||||
|
||||
{/* Componentes de Tabela - Adicionado props de delete da main */}
|
||||
{tabela === "diario" && <TabelaAgendamentoDia agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID} />}
|
||||
{tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={DictAgendamentosOrganizados} ListarDiasdoMes={ListarDiasdoMes} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID}/>}
|
||||
{tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID}/>}
|
||||
=======
|
||||
|
||||
{/* Componentes de Tabela - Adicionado props de delete da main */}
|
||||
{tabela === "diario" && <TabelaAgendamentoDia handleClickAgendamento={handleClickAgendamento} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID} />}
|
||||
{tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={DictAgendamentosOrganizados} ListarDiasdoMes={ListarDiasdoMes} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID} />}
|
||||
{tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={DictAgendamentosOrganizados} setShowDeleteModal={setShowDeleteModal} setSelectedId={setSelectedId} selectedID={selectedID} setDictInfo={setDictInfo} setShowConfirmModal={setShowConfirmModal} coresConsultas={coresConsultas} setListaConsultaID={setListaConsultaID} listaConsultasID={listaConsultasID} />}
|
||||
>>>>>>> Modificacoes
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
@ -592,108 +444,9 @@ useEffect(() => {
|
||||
<div className="card-header">
|
||||
<h4 className="card-title mb-0">Fila de Espera</h4>
|
||||
</div>
|
||||
|
||||
<<<<<<< HEAD
|
||||
<button
|
||||
className="btn btn-sm btn-delete"
|
||||
onClick={() => {
|
||||
setSelectedId(item.agendamento.id)
|
||||
setShowDeleteModal(true);
|
||||
}}
|
||||
>
|
||||
<i className="bi bi-trash me-1"></i> Excluir
|
||||
</button>
|
||||
</div></td>
|
||||
</tr>
|
||||
))}
|
||||
{showSpinner &&
|
||||
<tr>
|
||||
<td colspan='6'>
|
||||
<Spinner/>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
=======
|
||||
<div className="card-body">
|
||||
{/* Filtros */}
|
||||
<div className="card p-3 mb-3 table-paciente-filters">
|
||||
<h5 className="mb-3">
|
||||
<i className="bi bi-funnel-fill me-2 text-primary"></i> Filtros
|
||||
</h5>
|
||||
|
||||
<div className="mb-3">
|
||||
<input
|
||||
type="text"
|
||||
className="form-control"
|
||||
placeholder="Buscar por nome do paciente ou CPF..."
|
||||
value={searchTermFila}
|
||||
onChange={(e) => setSearchTermFila(e.target.value)}
|
||||
/>
|
||||
<small className="text-muted">
|
||||
Digite o nome completo ou número do CPF
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div className="mb-3">
|
||||
<input
|
||||
type="text"
|
||||
className="form-control"
|
||||
placeholder="Filtrar por nome do médico..."
|
||||
value={filtroMedicoFila === 'Todos' ? '' : filtroMedicoFila}
|
||||
onChange={(e) => setFiltroMedicoFila(e.target.value || 'Todos')}
|
||||
/>
|
||||
<small className="text-muted">
|
||||
Digite o nome do médico para filtrar
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div className="d-flex justify-content-end">
|
||||
<button
|
||||
className="btn btn-outline-secondary btn-sm"
|
||||
onClick={() => {
|
||||
setSearchTermFila('');
|
||||
setFiltroMedicoFila('Todos');
|
||||
setPaginaAtualFila(1);
|
||||
}}
|
||||
>
|
||||
<i className="bi bi-arrow-clockwise me-1"></i> Limpar Filtros
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div className="mt-3">
|
||||
<div className="contador-pacientes">
|
||||
{(() => {
|
||||
const filtrados = filaEsperaData.filter((item) => {
|
||||
const buscaNome = item.Infos?.paciente_nome?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const buscaCPF = item.Infos?.paciente_cpf?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const passaBusca = searchTermFila === "" || buscaNome || buscaCPF;
|
||||
const passaMedico = filtroMedicoFila === "Todos" || item.Infos?.nome_medico?.toLowerCase().includes(filtroMedicoFila.toLowerCase());
|
||||
return passaBusca && passaMedico;
|
||||
});
|
||||
return filtrados.length;
|
||||
})()} DE {filaEsperaData.length} SOLICITAÇÕES ENCONTRADAS
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Filtros Ativos */}
|
||||
{(searchTermFila || filtroMedicoFila !== "Todos") && (
|
||||
<div className="alert alert-info mb-3 filters-active">
|
||||
<strong>Filtros ativos:</strong>
|
||||
<div className="mt-1">
|
||||
{searchTermFila && <span className="badge bg-primary me-2">Busca: "{searchTermFila}"</span>}
|
||||
{filtroMedicoFila !== "Todos" && <span className="badge bg-primary me-2">Médico: {filtroMedicoFila}</span>}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Tabela */}
|
||||
<div className="table-responsive">
|
||||
<table className="table table-striped table-hover table-paciente-table">
|
||||
<table className="fila-tabela">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nome do Paciente</th>
|
||||
@ -704,182 +457,39 @@ useEffect(() => {
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{(() => {
|
||||
// Filtrar dados
|
||||
const filaFiltrada = filaEsperaData.filter((item) => {
|
||||
const buscaNome = item.Infos?.paciente_nome?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const buscaCPF = item.Infos?.paciente_cpf?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const passaBusca = searchTermFila === "" || buscaNome || buscaCPF;
|
||||
const passaMedico = filtroMedicoFila === "Todos" || item.Infos?.nome_medico?.toLowerCase().includes(filtroMedicoFila.toLowerCase());
|
||||
return passaBusca && passaMedico;
|
||||
});
|
||||
|
||||
// Paginação
|
||||
const totalPaginasFila = Math.ceil(filaFiltrada.length / itensPorPaginaFila);
|
||||
const indiceInicial = (paginaAtualFila - 1) * itensPorPaginaFila;
|
||||
const indiceFinal = indiceInicial + itensPorPaginaFila;
|
||||
const filaPaginada = filaFiltrada.slice(indiceInicial, indiceFinal);
|
||||
|
||||
if (filaPaginada.length > 0) {
|
||||
return filaPaginada.map((item, index) => (
|
||||
<tr key={index}>
|
||||
<td>
|
||||
<div className="d-flex align-items-center">
|
||||
{item.Infos?.paciente_nome}
|
||||
</div>
|
||||
</td>
|
||||
<td>{item.Infos?.paciente_cpf}</td>
|
||||
<td>
|
||||
<span className="badge insurance-badge">
|
||||
{item.Infos?.nome_medico || 'Não informado'}
|
||||
</span>
|
||||
</td>
|
||||
<td>{dayjs(item.agendamento.created_at).format('DD/MM/YYYY HH:mm')}</td>
|
||||
<td>
|
||||
<div className="d-flex gap-2">
|
||||
<button
|
||||
className="btn btn-sm btn-edit"
|
||||
onClick={() => {
|
||||
console.log(item, 'item');
|
||||
navigate(`${2}/edit`);
|
||||
setDictInfo(item);
|
||||
}}
|
||||
>
|
||||
<i className="bi bi-pencil me-1"></i> Editar
|
||||
</button>
|
||||
|
||||
<button
|
||||
className="btn btn-sm btn-delete"
|
||||
onClick={() => {
|
||||
setSelectedId(item.agendamento.id);
|
||||
setShowDeleteModal(true);
|
||||
}}
|
||||
>
|
||||
<i className="bi bi-trash me-1"></i> Excluir
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
));
|
||||
} else {
|
||||
return (
|
||||
<tr>
|
||||
<td colSpan="5" className="text-center py-4">
|
||||
<div className="text-muted">
|
||||
<i className="bi bi-search display-4"></i>
|
||||
<p className="mt-2">Nenhuma solicitação encontrada com os filtros aplicados.</p>
|
||||
{(searchTermFila || filtroMedicoFila !== "Todos") && (
|
||||
<button
|
||||
className="btn btn-outline-primary btn-sm mt-2"
|
||||
onClick={() => {
|
||||
setSearchTermFila('');
|
||||
setFiltroMedicoFila('Todos');
|
||||
setPaginaAtualFila(1);
|
||||
}}
|
||||
>
|
||||
Limpar filtros
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
})()}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{/* Paginação */}
|
||||
{(() => {
|
||||
const filaFiltrada = filaEsperaData.filter((item) => {
|
||||
const buscaNome = item.Infos?.paciente_nome?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const buscaCPF = item.Infos?.paciente_cpf?.toLowerCase().includes(searchTermFila.toLowerCase());
|
||||
const passaBusca = searchTermFila === "" || buscaNome || buscaCPF;
|
||||
const passaMedico = filtroMedicoFila === "Todos" || item.Infos?.nome_medico?.toLowerCase().includes(filtroMedicoFila.toLowerCase());
|
||||
return passaBusca && passaMedico;
|
||||
});
|
||||
|
||||
const totalPaginasFila = Math.ceil(filaFiltrada.length / itensPorPaginaFila);
|
||||
const indiceInicial = (paginaAtualFila - 1) * itensPorPaginaFila;
|
||||
const indiceFinal = indiceInicial + itensPorPaginaFila;
|
||||
|
||||
if (filaFiltrada.length > 0) {
|
||||
return (
|
||||
<div className="d-flex justify-content-between align-items-center mt-3">
|
||||
<div className="d-flex align-items-center">
|
||||
<span className="me-2 text-muted">Itens por página:</span>
|
||||
<select
|
||||
className="form-select form-select-sm w-auto"
|
||||
value={itensPorPaginaFila}
|
||||
onChange={(e) => {
|
||||
setItensPorPaginaFila(Number(e.target.value));
|
||||
setPaginaAtualFila(1);
|
||||
{filaEsperaData.map((item, index) => (
|
||||
<tr key={index}>
|
||||
<td><p>{item?.Infos?.paciente_nome}</p></td>
|
||||
<td>{item?.Infos?.paciente_cpf}</td>
|
||||
<td>{item?.Infos?.nome_medico}</td>
|
||||
<td>{dayjs(item.agendamento.scheduled_at).format('DD/MM/YYYY')}</td>
|
||||
<td>
|
||||
<button
|
||||
className="btn btn-sm btn-delete"
|
||||
onClick={() => {
|
||||
setSelectedId(item.agendamento.id)
|
||||
setShowDeleteModal(true);
|
||||
}}
|
||||
>
|
||||
<option value={5}>5</option>
|
||||
<option value={10}>10</option>
|
||||
<option value={25}>25</option>
|
||||
<option value={50}>50</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div className="d-flex align-items-center">
|
||||
<span className="me-3 text-muted">
|
||||
Página {paginaAtualFila} de {totalPaginasFila} •
|
||||
Mostrando {indiceInicial + 1}-{Math.min(indiceFinal, filaFiltrada.length)} de {filaFiltrada.length} solicitações
|
||||
</span>
|
||||
|
||||
<nav>
|
||||
<ul className="pagination pagination-sm mb-0">
|
||||
<li className={`page-item ${paginaAtualFila === 1 ? 'disabled' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => setPaginaAtualFila(paginaAtualFila - 1)}
|
||||
>
|
||||
<i className="bi bi-chevron-left"></i>
|
||||
</button>
|
||||
</li>
|
||||
|
||||
{Array.from({ length: Math.min(5, totalPaginasFila) }, (_, i) => {
|
||||
const startPage = Math.max(1, paginaAtualFila - 2);
|
||||
const pageNum = startPage + i;
|
||||
if (pageNum <= totalPaginasFila) {
|
||||
return (
|
||||
<li key={pageNum} className={`page-item ${pageNum === paginaAtualFila ? 'active' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => setPaginaAtualFila(pageNum)}
|
||||
>
|
||||
{pageNum}
|
||||
</button>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
return null;
|
||||
})}
|
||||
|
||||
<li className={`page-item ${paginaAtualFila === totalPaginasFila ? 'disabled' : ''}`}>
|
||||
<button
|
||||
className="page-link"
|
||||
onClick={() => setPaginaAtualFila(paginaAtualFila + 1)}
|
||||
>
|
||||
<i className="bi bi-chevron-right"></i>
|
||||
</button>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return null;
|
||||
})()}
|
||||
<i className="bi bi-trash me-1"></i> Excluir
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
{showSpinner &&
|
||||
<tr>
|
||||
<td colSpan='5'>
|
||||
<Spinner/>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
>>>>>>> Modificacoes
|
||||
</div>
|
||||
)
|
||||
}
|
||||
@ -969,15 +579,7 @@ useEffect(() => {
|
||||
</div>
|
||||
</div>)}
|
||||
|
||||
<<<<<<< HEAD
|
||||
{showConfirmModal &&(
|
||||
=======
|
||||
|
||||
|
||||
|
||||
|
||||
{showConfirmModal && (
|
||||
>>>>>>> Modificacoes
|
||||
<div
|
||||
className="modal fade show"
|
||||
style={{
|
||||
@ -1028,31 +630,17 @@ useEffect(() => {
|
||||
lista.push(selectedID)
|
||||
lista_cores.push("confirmed")
|
||||
|
||||
<<<<<<< HEAD
|
||||
setListaConsultaID(lista)
|
||||
}}
|
||||
|
||||
=======
|
||||
setCoresConsultas(lista_cores)
|
||||
|
||||
setListaConsultaID(lista)
|
||||
|
||||
|
||||
}}
|
||||
|
||||
>>>>>>> Modificacoes
|
||||
>
|
||||
<i className="bi bi-trash me-1"></i> Confirmar
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>)
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
</div>
|
||||
)}
|
||||
|
||||
</div>
|
||||
)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user