Compare commits
4 Commits
7ea6c89e83
...
0bf19ab6f2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0bf19ab6f2 | ||
|
|
086bf2b700 | ||
|
|
d76264f36e | ||
|
|
f793e29272 |
@ -1,18 +1,26 @@
|
|||||||
import React, { useState, useMemo } from "react";
|
import React, { useState, useMemo } from 'react';
|
||||||
import dayjs from "dayjs";
|
|
||||||
|
|
||||||
// Importe os componentes que você está usando
|
import TabelaAgendamentoDia from '../components/AgendarConsulta/TabelaAgendamentoDia';
|
||||||
import TabelaAgendamentoDia from "../components/AgendarConsulta/TabelaAgendamentoDia";
|
import TabelaAgendamentoSemana from '../components/AgendarConsulta/TabelaAgendamentoSemana';
|
||||||
import TabelaAgendamentoSemana from "../components/AgendarConsulta/TabelaAgendamentoSemana";
|
import TabelaAgendamentoMes from '../components/AgendarConsulta/TabelaAgendamentoMes';
|
||||||
import TabelaAgendamentoMes from "../components/AgendarConsulta/TabelaAgendamentoMes";
|
import FormNovaConsulta from '../components/AgendarConsulta/FormNovaConsulta';
|
||||||
import FormNovaConsulta from "../components/AgendarConsulta/FormNovaConsulta";
|
|
||||||
|
|
||||||
|
// ✨ NOVO: Caminho de importação corrigido com base na sua estrutura de pastas
|
||||||
|
import AgendamentosMes from '../components/AgendarConsulta/DadosConsultasMock.js';
|
||||||
|
|
||||||
|
import dayjs from 'dayjs';
|
||||||
// Importe os estilos
|
// Importe os estilos
|
||||||
import "./styleMedico/Agendamento.css";
|
import "./styleMedico/Agendamento.css";
|
||||||
import "./styleMedico/FilaEspera.css";
|
import "./styleMedico/FilaEspera.css";
|
||||||
|
|
||||||
// --- DADOS E FUNÇÕES FORA DO COMPONENTE ---
|
const Agendamento = () => {
|
||||||
|
|
||||||
|
const [FiladeEspera, setFiladeEspera] = useState(false);
|
||||||
|
const [tabela, setTabela] = useState('diario');
|
||||||
|
const [PageNovaConsulta, setPageConsulta] = useState(false);
|
||||||
|
const [searchTerm, setSearchTerm] = useState('');
|
||||||
|
|
||||||
|
// Dados da fila de espera (sem alteração)
|
||||||
const filaEsperaData = [
|
const filaEsperaData = [
|
||||||
{ nome: 'Ricardo Pereira', email: 'ricardo.pereira@gmail.com', cpf: '444.777.666-55', telefone: '(79) 99123-4567', entrada: '25/09/2025 às 08:00' },
|
{ nome: 'Ricardo Pereira', email: 'ricardo.pereira@gmail.com', cpf: '444.777.666-55', telefone: '(79) 99123-4567', entrada: '25/09/2025 às 08:00' },
|
||||||
{ nome: 'Ana Costa', email: 'ana.costa@gmail.com', cpf: '321.654.987-00', telefone: '(79) 97777-3333', entrada: '25/09/2025 às 08:30' },
|
{ nome: 'Ana Costa', email: 'ana.costa@gmail.com', cpf: '321.654.987-00', telefone: '(79) 97777-3333', entrada: '25/09/2025 às 08:30' },
|
||||||
@ -24,50 +32,61 @@ const filaEsperaData = [
|
|||||||
{ nome: 'Juliana Oliveira', email: 'juliana.o@gmail.com', cpf: '111.222.333-44', telefone: '(79) 98765-1234', entrada: '26/09/2025 às 11:30' },
|
{ nome: 'Juliana Oliveira', email: 'juliana.o@gmail.com', cpf: '111.222.333-44', telefone: '(79) 98765-1234', entrada: '26/09/2025 às 11:30' },
|
||||||
];
|
];
|
||||||
|
|
||||||
const ListarDiasdoMes = (ano, mes) => {
|
// Filtro da fila de espera (sem alteração)
|
||||||
const diasDaSemana = [[], [], [], [], [], [], []]; // 0: Domingo, 1: Segunda, ...
|
const filteredFila = filaEsperaData.filter(item =>
|
||||||
const base = dayjs(`${ano}-${mes}-01`);
|
|
||||||
const diasNoMes = base.daysInMonth();
|
|
||||||
|
|
||||||
for (let d = 1; d <= diasNoMes; d++) {
|
|
||||||
const data = dayjs(`${ano}-${mes}-${d}`);
|
|
||||||
const diaDaSemana = data.day(); // Retorna um número de 0 (Dom) a 6 (Sáb)
|
|
||||||
diasDaSemana[diaDaSemana].push(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retornando apenas os dias úteis (Segunda a Sexta)
|
|
||||||
return [
|
|
||||||
diasDaSemana[1], // Segundas
|
|
||||||
diasDaSemana[2], // Terças
|
|
||||||
diasDaSemana[3], // Quartas
|
|
||||||
diasDaSemana[4], // Quintas
|
|
||||||
diasDaSemana[5], // Sextas
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// --- COMPONENTE PRINCIPAL ---
|
|
||||||
|
|
||||||
const Agendamento = () => {
|
|
||||||
const [FiladeEspera, setFiladeEspera] = useState(false);
|
|
||||||
const [tabela, setTabela] = useState('diario');
|
|
||||||
const [PageNovaConsulta, setPageConsulta] = useState(false);
|
|
||||||
const [searchTerm, setSearchTerm] = useState('');
|
|
||||||
|
|
||||||
const filteredFila = useMemo(() =>
|
|
||||||
filaEsperaData.filter(item =>
|
|
||||||
item.nome.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
item.nome.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
||||||
item.email.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
item.email.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
||||||
item.cpf.includes(searchTerm) ||
|
item.cpf.includes(searchTerm) ||
|
||||||
item.telefone.includes(searchTerm)
|
item.telefone.includes(searchTerm)
|
||||||
), [searchTerm]);
|
);
|
||||||
|
|
||||||
|
// Lógica para filtrar os dados da AGENDA (AgendamentosMes)
|
||||||
|
const filteredAgendamentos = useMemo(() => {
|
||||||
|
if (!searchTerm.trim()) {
|
||||||
|
return AgendamentosMes;
|
||||||
|
}
|
||||||
|
|
||||||
|
const lowerCaseSearchTerm = searchTerm.toLowerCase();
|
||||||
|
const filteredData = {};
|
||||||
|
|
||||||
|
for (const semana in AgendamentosMes) {
|
||||||
|
filteredData[semana] = {};
|
||||||
|
for (const dia in AgendamentosMes[semana]) {
|
||||||
|
filteredData[semana][dia] = AgendamentosMes[semana][dia].filter(agendamento =>
|
||||||
|
agendamento.status === 'vazio' ||
|
||||||
|
(agendamento.paciente && agendamento.paciente.toLowerCase().includes(lowerCaseSearchTerm))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filteredData;
|
||||||
|
}, [searchTerm]);
|
||||||
|
|
||||||
|
const ListarDiasdoMes = (ano, mes) => {
|
||||||
|
let segundas = []; let tercas = []; let quartas = []; let quintas = []; let sextas = []
|
||||||
|
const base = dayjs(`${ano}-${mes}-01`)
|
||||||
|
const DiasnoMes = base.daysInMonth()
|
||||||
|
for (let d = 1; d <= DiasnoMes; d++) {
|
||||||
|
const data = dayjs(`${ano}-${mes}-${d}`)
|
||||||
|
const dia = data.format('dddd')
|
||||||
|
switch (dia) {
|
||||||
|
case 'Monday': segundas.push(d); break
|
||||||
|
case 'Tuesday': tercas.push(d); break
|
||||||
|
case 'Wednesday': quartas.push(d); break
|
||||||
|
case 'Thursday': quintas.push(d); break
|
||||||
|
case 'Friday': sextas.push(d); break
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let ListaDiasDatas = [segundas, tercas, quartas, quintas, sextas]
|
||||||
|
return ListaDiasDatas
|
||||||
|
}
|
||||||
|
|
||||||
const handleClickAgendamento = (agendamento) => {
|
const handleClickAgendamento = (agendamento) => {
|
||||||
if (agendamento.status !== 'vazio') return;
|
if (agendamento.status !== 'vazio') return
|
||||||
setPageConsulta(true);
|
else setPageConsulta(true)
|
||||||
};
|
}
|
||||||
|
|
||||||
const handleClickCancel = () => setPageConsulta(false);
|
const handleClickCancel = () => setPageConsulta(false)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
@ -75,60 +94,71 @@ const Agendamento = () => {
|
|||||||
|
|
||||||
{!PageNovaConsulta ? (
|
{!PageNovaConsulta ? (
|
||||||
<div className='atendimento-eprocura'>
|
<div className='atendimento-eprocura'>
|
||||||
|
<div className='busca-atendimento'>
|
||||||
|
<div>
|
||||||
|
<i className="fa-solid fa-calendar-day"></i>
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Buscar atendimento por paciente..."
|
||||||
|
value={searchTerm}
|
||||||
|
onChange={(e) => setSearchTerm(e.target.value)}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<select>
|
||||||
|
<option value="" disabled selected>Agendar</option>
|
||||||
|
<option value="">Atendimento</option>
|
||||||
|
<option value="">Sessões</option>
|
||||||
|
<option value="">Urgência</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* ✅ BARRA DE BUSCA E FILTRO FOI MOVIDA PARA DENTRO DO CALENDÁRIO */}
|
|
||||||
|
|
||||||
{/* ✅ BARRA DE UNIDADE E PROFISSIONAL REMOVIDA (COMENTADA) */}
|
|
||||||
{/*
|
|
||||||
<div className='unidade-selecionarprofissional'>
|
<div className='unidade-selecionarprofissional'>
|
||||||
<select defaultValue="">
|
<select>
|
||||||
<option value="" disabled >Unidade</option>
|
<option value="" disabled selected >Unidade</option>
|
||||||
<option value="central">Unidade Central</option>
|
<option value="">Unidade Central</option>
|
||||||
<option value="norte">Unidade Zona Norte</option>
|
<option value="">Unidade Zona Norte</option>
|
||||||
<option value="oeste">Unidade Zona Oeste</option>
|
<option value="">Unidade Zona Oeste</option>
|
||||||
</select>
|
</select>
|
||||||
<input type="text" placeholder='Selecionar profissional' />
|
<input type="text" placeholder='Selecionar profissional' />
|
||||||
</div>
|
</div>
|
||||||
*/}
|
|
||||||
|
|
||||||
{/* Botões para alternar Agenda / Fila de Espera */}
|
|
||||||
<div className='container-btns-agenda-fila_esepera'>
|
<div className='container-btns-agenda-fila_esepera'>
|
||||||
<button
|
<button
|
||||||
className={`btn-agenda ${!FiladeEspera ? "opc-agenda-ativo" : ""}`}
|
className={`btn-agenda ${FiladeEspera === false ? "opc-agenda-ativo" : ""}`}
|
||||||
onClick={() => setFiladeEspera(false)}
|
onClick={() => {
|
||||||
|
setFiladeEspera(false);
|
||||||
|
setSearchTerm('');
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
Agenda
|
Agenda
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
className={`btn-fila-espera ${FiladeEspera ? "opc-filaespera-ativo" : ""}`}
|
className={`btn-fila-espera ${FiladeEspera === true ? "opc-filaespera-ativo" : ""}`}
|
||||||
onClick={() => setFiladeEspera(true)}
|
onClick={() => {
|
||||||
|
setFiladeEspera(true);
|
||||||
|
setSearchTerm('');
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
Fila de espera
|
Fila de espera
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<section className='calendario-ou-filaespera'>
|
<section className='calendario-ou-filaespera'>
|
||||||
{!FiladeEspera ? (
|
{FiladeEspera === false ?
|
||||||
|
(
|
||||||
<div className='calendario'>
|
<div className='calendario'>
|
||||||
<div>
|
<div>
|
||||||
<section className='btns-e-legenda-container'>
|
<section className='btns-e-legenda-container'>
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button className={`btn-selecionar-tabeladia ${tabela === "diario" ? "ativo" : ""}`} onClick={() => setTabela("diario")}>
|
||||||
className={`btn-selecionar-tabeladia ${tabela === "diario" ? "ativo" : ""}`}
|
|
||||||
onClick={() => setTabela("diario")}
|
|
||||||
>
|
|
||||||
<i className="fa-solid fa-calendar-day"></i> Dia
|
<i className="fa-solid fa-calendar-day"></i> Dia
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button className={`btn-selecionar-tabelasemana ${tabela === 'semanal' ? 'ativo' : ""}`} onClick={() => setTabela("semanal")}>
|
||||||
className={`btn-selecionar-tabelasemana ${tabela === 'semanal' ? 'ativo' : ""}`}
|
|
||||||
onClick={() => setTabela("semanal")}
|
|
||||||
>
|
|
||||||
<i className="fa-solid fa-calendar-day"></i> Semana
|
<i className="fa-solid fa-calendar-day"></i> Semana
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button className={`btn-selecionar-tabelames ${tabela === 'mensal' ? 'ativo' : ''}`} onClick={() => setTabela("mensal")}>
|
||||||
className={`btn-selecionar-tabelames ${tabela === 'mensal' ? 'ativo' : ''}`}
|
|
||||||
onClick={() => setTabela("mensal")}
|
|
||||||
>
|
|
||||||
<i className="fa-solid fa-calendar-day"></i> Mês
|
<i className="fa-solid fa-calendar-day"></i> Mês
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -140,33 +170,19 @@ const Agendamento = () => {
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* ✅ BARRA DE BUSCA MOVIDA PARA CÁ */}
|
{tabela === "diario" && <TabelaAgendamentoDia handleClickAgendamento={handleClickAgendamento} agendamentos={filteredAgendamentos} />}
|
||||||
<div className='busca-atendimento'>
|
{tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={filteredAgendamentos} />}
|
||||||
<div>
|
{tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={filteredAgendamentos} />}
|
||||||
<i className="fa-solid fa-calendar-day"></i>
|
|
||||||
<input type="text" placeholder="Buscar atendimento" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<select defaultValue="" >
|
|
||||||
<option value="" disabled>Agendar</option>
|
|
||||||
<option value="atendimento">Atendimento</option>
|
|
||||||
<option value="sessoes">Sessões</option>
|
|
||||||
<option value="urgencia">Urgência</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
)
|
||||||
{tabela === "diario" && <TabelaAgendamentoDia handleClickAgendamento={handleClickAgendamento} />}
|
:
|
||||||
{tabela === 'semanal' && <TabelaAgendamentoSemana />}
|
(
|
||||||
{tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} />}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
<div className="fila-container">
|
<div className="fila-container">
|
||||||
<div className="fila-header">
|
<div className="fila-header">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Pesquisar..."
|
placeholder="Pesquisar na fila de espera..."
|
||||||
className="busca-fila-espera"
|
className="busca-fila-espera"
|
||||||
value={searchTerm}
|
value={searchTerm}
|
||||||
onChange={(e) => setSearchTerm(e.target.value)}
|
onChange={(e) => setSearchTerm(e.target.value)}
|
||||||
@ -196,14 +212,15 @@ const Agendamento = () => {
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)
|
||||||
|
}
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<FormNovaConsulta onCancel={handleClickCancel} />
|
<FormNovaConsulta onCancel={handleClickCancel} />
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
)
|
||||||
};
|
}
|
||||||
|
|
||||||
export default Agendamento;
|
export default Agendamento;
|
||||||
@ -91,6 +91,7 @@ const App = () => {
|
|||||||
const [conversations, setConversations] = useState(conversationsData);
|
const [conversations, setConversations] = useState(conversationsData);
|
||||||
const [activeConversationId, setActiveConversationId] = useState(1);
|
const [activeConversationId, setActiveConversationId] = useState(1);
|
||||||
const [newMessage, setNewMessage] = useState('');
|
const [newMessage, setNewMessage] = useState('');
|
||||||
|
const [searchTerm, setSearchTerm] = useState(''); // ✅ 1. Estado para a busca
|
||||||
const chatEndRef = useRef(null);
|
const chatEndRef = useRef(null);
|
||||||
|
|
||||||
const activeConversation = conversations.find(c => c.id === activeConversationId);
|
const activeConversation = conversations.find(c => c.id === activeConversationId);
|
||||||
@ -134,6 +135,11 @@ const App = () => {
|
|||||||
setConversations(updatedConversations);
|
setConversations(updatedConversations);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ✅ 2. Lógica para filtrar as conversas
|
||||||
|
const filteredConversations = conversations.filter(conversation =>
|
||||||
|
conversation.patientName.toLowerCase().includes(searchTerm.toLowerCase())
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="chat-app-container">
|
<div className="chat-app-container">
|
||||||
{/* Barra Lateral de Conversas */}
|
{/* Barra Lateral de Conversas */}
|
||||||
@ -141,12 +147,20 @@ const App = () => {
|
|||||||
<header className="sidebar-header">
|
<header className="sidebar-header">
|
||||||
<h1>Mensagens</h1>
|
<h1>Mensagens</h1>
|
||||||
<div className="search-container">
|
<div className="search-container">
|
||||||
<input type="text" placeholder="Pesquisar paciente..." className="search-input" />
|
{/* ✅ 3. Conecta o input ao estado e à função de atualização */}
|
||||||
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Pesquisar paciente..."
|
||||||
|
className="search-input"
|
||||||
|
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>
|
<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">
|
||||||
{conversations.map(convo => (
|
{/* ✅ 4. Usa a lista filtrada para renderizar os itens */}
|
||||||
|
{filteredConversations.map(convo => (
|
||||||
<ConversationListItem
|
<ConversationListItem
|
||||||
key={convo.id}
|
key={convo.id}
|
||||||
conversation={convo}
|
conversation={convo}
|
||||||
@ -192,7 +206,12 @@ const App = () => {
|
|||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<div className="no-conversation-selected">
|
<div className="no-conversation-selected">
|
||||||
|
{/* Adicionado uma verificação para quando a busca não encontra resultados */}
|
||||||
|
{searchTerm && filteredConversations.length === 0 ? (
|
||||||
|
<p>Nenhum paciente encontrado com o nome "{searchTerm}".</p>
|
||||||
|
) : (
|
||||||
<p>Selecione uma conversa para começar.</p>
|
<p>Selecione uma conversa para começar.</p>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</main>
|
</main>
|
||||||
@ -201,4 +220,3 @@ const App = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export default App;
|
export default App;
|
||||||
|
|
||||||
|
|||||||
@ -1,37 +1,11 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState } from 'react';
|
||||||
import { FaUser, FaUserPlus, FaCalendarAlt, FaCalendarCheck } from 'react-icons/fa';
|
import { FaUser, FaUserPlus, FaCalendarAlt, FaCalendarCheck } from 'react-icons/fa';
|
||||||
import './style/Inicio.css';
|
import './style/Inicio.css';
|
||||||
|
import { useNavigate } from 'react-router-dom';
|
||||||
function Inicio({ setCurrentPage }) {
|
function Inicio() {
|
||||||
const [pacientes, setPacientes] = useState([]);
|
const [pacientes, setPacientes] = useState([]);
|
||||||
const [agendamentos, setAgendamentos] = useState([]);
|
const [agendamentos, setAgendamentos] = useState([]);
|
||||||
|
const navigate = useNavigate();
|
||||||
useEffect(() => {
|
|
||||||
const fetchPacientes = async () => {
|
|
||||||
try {
|
|
||||||
const res = await fetch("https://mock.apidog.com/m1/1053378-0-default/pacientes");
|
|
||||||
const data = await res.json();
|
|
||||||
console.log(data)
|
|
||||||
//setPacientes(data.data);
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Erro ao buscar pacientes:", error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const fetchAgendamentos = async () => {
|
|
||||||
return; // <===serve para que nao cause erro
|
|
||||||
// try {
|
|
||||||
// const res = await fetch();
|
|
||||||
// const data = await res.json();
|
|
||||||
// setAgendamentos(data.data);
|
|
||||||
// } catch (error) {
|
|
||||||
// console.error("Erro ao buscar agendamentos:", error);
|
|
||||||
// }
|
|
||||||
};
|
|
||||||
|
|
||||||
fetchPacientes();
|
|
||||||
fetchAgendamentos();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const totalPacientes = pacientes.length;
|
const totalPacientes = pacientes.length;
|
||||||
const novosEsseMes = pacientes.filter(p => p.createdAt && new Date(p.createdAt).getMonth() === new Date().getMonth()).length;
|
const novosEsseMes = pacientes.filter(p => p.createdAt && new Date(p.createdAt).getMonth() === new Date().getMonth()).length;
|
||||||
@ -87,21 +61,21 @@ function Inicio({ setCurrentPage }) {
|
|||||||
<div className="quick-actions">
|
<div className="quick-actions">
|
||||||
<h2>Ações Rápidas</h2>
|
<h2>Ações Rápidas</h2>
|
||||||
<div className="actions-grid">
|
<div className="actions-grid">
|
||||||
<div className="action-button" onClick={() => setCurrentPage('form-layout')}>
|
<div className="action-button" onClick={() => navigate('/form-layout')}>
|
||||||
<FaUserPlus className="action-icon" />
|
<FaUserPlus className="action-icon" />
|
||||||
<div className="action-info">
|
<div className="action-info">
|
||||||
<span className="action-title">Novo Paciente</span>
|
<span className="action-title">Novo Pacient</span>
|
||||||
<span className="action-desc">Cadastrar um novo paciente</span>
|
<span className="action-desc">Cadastrar um novo paciente</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="action-button" onClick={() => setCurrentPage('table')}>
|
<div className="action-button" onClick={() => navigate('/table')}>
|
||||||
<FaUser className="action-icon" />
|
<FaUser className="action-icon" />
|
||||||
<div className="action-info">
|
<div className="action-info">
|
||||||
<span className="action-title">Lista de Pacientes</span>
|
<span className="action-title">Lista de Pacientes</span>
|
||||||
<span className="action-desc">Ver todos os pacientes</span>
|
<span className="action-desc">Ver todos os pacientes</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="action-button" onClick={() => setCurrentPage('agendamento')}>
|
<div className="action-button" onClick={() => navigate('agendamento')}>
|
||||||
<FaCalendarCheck className="action-icon" />
|
<FaCalendarCheck className="action-icon" />
|
||||||
<div className="action-info">
|
<div className="action-info">
|
||||||
<span className="action-title">Agendamentos</span>
|
<span className="action-title">Agendamentos</span>
|
||||||
@ -126,7 +100,7 @@ function Inicio({ setCurrentPage }) {
|
|||||||
<div className="no-appointments-content">
|
<div className="no-appointments-content">
|
||||||
<FaCalendarCheck className="no-appointments-icon" />
|
<FaCalendarCheck className="no-appointments-icon" />
|
||||||
<p>Nenhum agendamento para hoje</p>
|
<p>Nenhum agendamento para hoje</p>
|
||||||
<button className="manage-button" onClick={() => setCurrentPage('agendamento')}>
|
<button className="manage-button" onClick={() => navigate('/medico/agendamento')}>
|
||||||
Gerenciar Agendamentos
|
Gerenciar Agendamentos
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,48 +1,37 @@
|
|||||||
import React from 'react'
|
import React from 'react';
|
||||||
import CardConsulta from './CardConsulta'
|
import CardConsulta from './CardConsulta';
|
||||||
import AgendamentosMes from './DadosConsultasMock'
|
|
||||||
import "./style/styleTabelas/tabeladia.css";
|
import "./style/styleTabelas/tabeladia.css";
|
||||||
|
|
||||||
const TabelaAgendamentoDia = ({handleClickAgendamento}) => {
|
|
||||||
|
|
||||||
let agendamentosDessaSemana = AgendamentosMes.semana1
|
const TabelaAgendamentoDia = ({ handleClickAgendamento, agendamentos }) => {
|
||||||
|
const agendamentosDoDia = agendamentos?.semana1?.segunda || [];
|
||||||
let agendamentos = agendamentosDessaSemana.segunda
|
const nomeMedico = agendamentosDoDia.find(item => item.medico)?.medico || 'Profissional';
|
||||||
|
|
||||||
console.log(agendamentos)
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<table className='tabeladiaria'>
|
<table className='tabeladiaria'>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th>Horário</th>
|
||||||
<th>{agendamentos.medico}</th>
|
<th>{}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
||||||
<tbody>
|
<tbody>
|
||||||
|
{agendamentosDoDia.map((agendamento, index) => (
|
||||||
{agendamentos.map((agendamento) => (
|
<tr key={index}>
|
||||||
<tr key={agendamento.id} border='2' >
|
|
||||||
<td><p>{agendamento.horario}</p></td>
|
<td><p>{agendamento.horario}</p></td>
|
||||||
<td className='mostrar-horario'>
|
<td className='mostrar-horario'>
|
||||||
|
|
||||||
<div onClick={() => handleClickAgendamento(agendamento)}>
|
<div onClick={() => handleClickAgendamento(agendamento)}>
|
||||||
<CardConsulta DadosConsulta={agendamento} TabelaAgendamento={'dia'} />
|
<CardConsulta DadosConsulta={agendamento} TabelaAgendamento={'dia'} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
))}
|
))}
|
||||||
|
|
||||||
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
);
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default TabelaAgendamentoDia
|
export default TabelaAgendamentoDia;
|
||||||
@ -1,29 +1,28 @@
|
|||||||
import React from 'react'
|
import React from 'react';
|
||||||
import AgendamentosMes from './DadosConsultasMock'
|
|
||||||
import dayjs from "dayjs"
|
import dayjs from "dayjs";
|
||||||
import CardConsulta from './CardConsulta'
|
import CardConsulta from './CardConsulta';
|
||||||
import "./style/styleTabelas/tabelames.css";
|
import "./style/styleTabelas/tabelames.css";
|
||||||
|
|
||||||
const TabelaAgendamentoMes = ({ListarDiasdoMes}) => {
|
|
||||||
|
|
||||||
|
const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos }) => {
|
||||||
|
|
||||||
const dataHoje = dayjs()
|
const dataHoje = dayjs();
|
||||||
const AnoAtual = dataHoje.year()
|
const AnoAtual = dataHoje.year();
|
||||||
const mes = dataHoje.month() + 1
|
const mes = dataHoje.month() + 1;
|
||||||
|
|
||||||
let ListaDiasDatas = ListarDiasdoMes(AnoAtual, mes)
|
let ListaDiasDatas = ListarDiasdoMes(AnoAtual, mes);
|
||||||
|
|
||||||
let segundas = ListaDiasDatas[0];
|
let segundas = ListaDiasDatas[0];
|
||||||
let tercas = ListaDiasDatas[1];
|
let tercas = ListaDiasDatas[1];
|
||||||
let quartas = ListaDiasDatas[2];
|
let quartas = ListaDiasDatas[2];
|
||||||
let quintas = ListaDiasDatas[3];
|
let quintas = ListaDiasDatas[3];
|
||||||
let sextas = ListaDiasDatas[4]
|
let sextas = ListaDiasDatas[4];
|
||||||
|
|
||||||
console.log(AnoAtual, 'ano', mes, 'mes')
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<table className='tabelamensal'>
|
<table className='tabelamensal'>
|
||||||
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Seg</th>
|
<th>Seg</th>
|
||||||
<th>Ter</th>
|
<th>Ter</th>
|
||||||
@ -31,14 +30,16 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => {
|
|||||||
<th>Qui</th>
|
<th>Qui</th>
|
||||||
<th>Sex</th>
|
<th>Sex</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
</thead>
|
||||||
{Object.entries(AgendamentosMes).map(([semanas, dias], index) => (
|
<tbody>
|
||||||
|
{agendamentos && Object.entries(agendamentos).map(([semana, dias], index) => (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
|
{/* Coluna de Segunda-feira */}
|
||||||
<td>
|
<td>
|
||||||
<div>
|
<div>
|
||||||
<p>{segundas[index]}</p>
|
<p>{segundas[index]}</p>
|
||||||
<div>
|
<div>
|
||||||
{dias.segunda.slice(0,4).map((consulta, idx) => (
|
{(dias.segunda || []).slice(0, 3).map((consulta, idx) => (
|
||||||
<CardConsulta
|
<CardConsulta
|
||||||
key={idx}
|
key={idx}
|
||||||
DadosConsulta={consulta}
|
DadosConsulta={consulta}
|
||||||
@ -46,17 +47,18 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => {
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
{dias.segunda.length > 3 ?
|
{(dias.segunda || []).length > 3 ?
|
||||||
<div><p className='cards-que-faltam'>+ {dias.segunda.length - 3}</p></div>
|
<div><p className='cards-que-faltam'>+ {(dias.segunda || []).length - 3}</p></div>
|
||||||
: null}
|
: null}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
{/* Coluna de Terça-feira */}
|
||||||
<td>
|
<td>
|
||||||
<div>
|
<div>
|
||||||
{tercas[index]}
|
<p>{tercas[index]}</p>
|
||||||
<div>
|
<div>
|
||||||
{dias.terca.slice(0,4).map((consulta, idx) => (
|
{(dias.terca || []).slice(0, 3).map((consulta, idx) => (
|
||||||
<CardConsulta
|
<CardConsulta
|
||||||
key={idx}
|
key={idx}
|
||||||
DadosConsulta={consulta}
|
DadosConsulta={consulta}
|
||||||
@ -64,17 +66,18 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => {
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
{dias.terca.length > 3 ?
|
{(dias.terca || []).length > 3 ?
|
||||||
<div><p className='cards-que-faltam'>+ {dias.terca.length - 3}</p></div>
|
<div><p className='cards-que-faltam'>+ {(dias.terca || []).length - 3}</p></div>
|
||||||
: null}
|
: null}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
{/* Coluna de Quarta-feira */}
|
||||||
<td>
|
<td>
|
||||||
<div>
|
<div>
|
||||||
{quartas[index]}
|
<p>{quartas[index]}</p>
|
||||||
<div>
|
<div>
|
||||||
{dias.quarta.slice(0,4).map((consulta, idx) => (
|
{(dias.quarta || []).slice(0, 3).map((consulta, idx) => (
|
||||||
<CardConsulta
|
<CardConsulta
|
||||||
key={idx}
|
key={idx}
|
||||||
DadosConsulta={consulta}
|
DadosConsulta={consulta}
|
||||||
@ -82,17 +85,18 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => {
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
{dias.quarta.length > 3 ?
|
{(dias.quarta || []).length > 3 ?
|
||||||
<div><p className='cards-que-faltam'>+ {dias.quarta.length - 3}</p></div>
|
<div><p className='cards-que-faltam'>+ {(dias.quarta || []).length - 3}</p></div>
|
||||||
: null}
|
: null}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
{/* Coluna de Quinta-feira */}
|
||||||
<td>
|
<td>
|
||||||
<div>
|
<div>
|
||||||
{quintas[index]}
|
<p>{quintas[index]}</p>
|
||||||
<div>
|
<div>
|
||||||
{dias.quinta.slice(0,4).map((consulta, idx) => (
|
{(dias.quinta || []).slice(0, 3).map((consulta, idx) => (
|
||||||
<CardConsulta
|
<CardConsulta
|
||||||
key={idx}
|
key={idx}
|
||||||
DadosConsulta={consulta}
|
DadosConsulta={consulta}
|
||||||
@ -100,17 +104,18 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => {
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
{dias.quinta.length > 3 ?
|
{(dias.quinta || []).length > 3 ?
|
||||||
<div><p className='cards-que-faltam'>+ {dias.quinta.length - 3}</p></div>
|
<div><p className='cards-que-faltam'>+ {(dias.quinta || []).length - 3}</p></div>
|
||||||
: null}
|
: null}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
|
{/* Coluna de Sexta-feira */}
|
||||||
<td>
|
<td>
|
||||||
<div>
|
<div>
|
||||||
{sextas[index]}
|
<p>{sextas[index]}</p>
|
||||||
<div>
|
<div>
|
||||||
{dias.sexta.slice(0,4).map((consulta, idx) => (
|
{(dias.sexta || []).slice(0, 3).map((consulta, idx) => (
|
||||||
<CardConsulta
|
<CardConsulta
|
||||||
key={idx}
|
key={idx}
|
||||||
DadosConsulta={consulta}
|
DadosConsulta={consulta}
|
||||||
@ -118,16 +123,17 @@ const TabelaAgendamentoMes = ({ListarDiasdoMes}) => {
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
{dias.sexta.length > 3 ?
|
{(dias.sexta || []).length > 3 ?
|
||||||
<div><p className='cards-que-faltam'>+ {dias.sexta.length - 3}</p></div>
|
<div><p className='cards-que-faltam'>+ {(dias.sexta || []).length - 3}</p></div>
|
||||||
: null}
|
: null}
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
))}
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default TabelaAgendamentoMes
|
export default TabelaAgendamentoMes;
|
||||||
@ -1,54 +1,69 @@
|
|||||||
import React from 'react'
|
import React from 'react';
|
||||||
|
import CardConsulta from './CardConsulta';
|
||||||
import AgendamentosMes from './DadosConsultasMock'
|
|
||||||
import CardConsulta from './CardConsulta'
|
|
||||||
import "./style/styleTabelas/tabelasemana.css";
|
import "./style/styleTabelas/tabelasemana.css";
|
||||||
|
|
||||||
const TabelaAgendamentoSemana = () => {
|
|
||||||
|
|
||||||
let AgendamentosDesseMes = AgendamentosMes
|
const TabelaAgendamentoSemana = ({ agendamentos }) => {
|
||||||
|
|
||||||
let AgendamentoSemana = AgendamentosDesseMes.semana1
|
|
||||||
|
|
||||||
|
|
||||||
let AgendamentosdeSegunda = AgendamentoSemana.segunda
|
const agendamentoSemana = agendamentos?.semana1 || {};
|
||||||
let AgendamentosdeTerca = AgendamentoSemana.terca
|
|
||||||
let AgendamentosdeQuarta = AgendamentoSemana.quarta
|
|
||||||
let AgendamentosdeQuinta = AgendamentoSemana.quinta
|
|
||||||
let AgendamentosdeSexta = AgendamentoSemana.sexta
|
|
||||||
|
|
||||||
|
|
||||||
|
const agendamentosDeSegunda = agendamentoSemana.segunda || [];
|
||||||
|
const agendamentosDeTerca = agendamentoSemana.terca || [];
|
||||||
|
const agendamentosDeQuarta = agendamentoSemana.quarta || [];
|
||||||
|
const agendamentosDeQuinta = agendamentoSemana.quinta || [];
|
||||||
|
const agendamentosDeSexta = agendamentoSemana.sexta || [];
|
||||||
|
|
||||||
|
|
||||||
|
const numLinhas = Math.max(
|
||||||
|
agendamentosDeSegunda.length,
|
||||||
|
agendamentosDeTerca.length,
|
||||||
|
agendamentosDeQuarta.length,
|
||||||
|
agendamentosDeQuinta.length,
|
||||||
|
agendamentosDeSexta.length
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
<table className='tabelasemanal'>
|
<table className='tabelasemanal'>
|
||||||
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th>Horário</th>
|
||||||
<th>Segunda</th>
|
<th>Segunda</th>
|
||||||
<th>Terça</th>
|
<th>Terça</th>
|
||||||
<th>Quarta</th>
|
<th>Quarta</th>
|
||||||
<th>Quinta</th>
|
<th>Quinta</th>
|
||||||
<th>Sexta</th>
|
<th>Sexta</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{Array.from({ length: numLinhas }).map((_, index) => {
|
||||||
|
|
||||||
|
const consultaSeg = agendamentosDeSegunda[index];
|
||||||
|
const consultaTer = agendamentosDeTerca[index];
|
||||||
|
const consultaQua = agendamentosDeQuarta[index];
|
||||||
|
const consultaQui = agendamentosDeQuinta[index];
|
||||||
|
const consultaSex = agendamentosDeSexta[index];
|
||||||
|
|
||||||
|
|
||||||
{AgendamentosdeSegunda.map((consulta, index) => (
|
const horarioDaLinha = consultaSeg?.horario || consultaTer?.horario || consultaQua?.horario || consultaQui?.horario || consultaSex?.horario;
|
||||||
|
|
||||||
|
return (
|
||||||
<tr key={index}>
|
<tr key={index}>
|
||||||
<td>{consulta.horario}</td>
|
<td>{horarioDaLinha}</td>
|
||||||
<td className='coluna-tipo1'> <CardConsulta DadosConsulta={AgendamentosdeSegunda[index]} /> </td>
|
<td>{consultaSeg && <CardConsulta DadosConsulta={consultaSeg} />}</td>
|
||||||
<td> <CardConsulta DadosConsulta={AgendamentosdeTerca[index]} /> </td>
|
<td>{consultaTer && <CardConsulta DadosConsulta={consultaTer} />}</td>
|
||||||
<td> <CardConsulta DadosConsulta={AgendamentosdeQuarta[index]} /> </td>
|
<td>{consultaQua && <CardConsulta DadosConsulta={consultaQua} />}</td>
|
||||||
<td><CardConsulta DadosConsulta={AgendamentosdeQuinta[index]} /></td>
|
<td>{consultaQui && <CardConsulta DadosConsulta={consultaQui} />}</td>
|
||||||
<td><CardConsulta DadosConsulta={AgendamentosdeSexta[index]} /></td>
|
<td>{consultaSex && <CardConsulta DadosConsulta={consultaSex} />}</td>
|
||||||
</tr>
|
</tr>
|
||||||
))}
|
);
|
||||||
|
})}
|
||||||
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default TabelaAgendamentoSemana
|
export default TabelaAgendamentoSemana;
|
||||||
@ -15,13 +15,11 @@
|
|||||||
border: 1px solid #e0e0e0;
|
border: 1px solid #e0e0e0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cabeçalho da semanal */
|
/* Estilo aplicado APENAS às células do cabeçalho da tabela */
|
||||||
.tabelasemanal thead th,
|
.tabelasemanal thead th,
|
||||||
.tabelasemanal thead td,
|
.tabelasemanal thead td {
|
||||||
.tabelasemanal tr:first-child th,
|
background-color: #0078d7;
|
||||||
.tabelasemanal tr:first-child td {
|
color: #ffffff;
|
||||||
background-color: #0078d7 !important;
|
|
||||||
color: #ffffff !important;
|
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border-bottom: 2px solid #005a9e;
|
border-bottom: 2px solid #005a9e;
|
||||||
|
|||||||
@ -1,49 +1,37 @@
|
|||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
import {Link} from 'react-router-dom'
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
||||||
|
|
||||||
const FormatTelefones = (valor) => {
|
const FormatTelefones = (valor) => {
|
||||||
|
|
||||||
const digits = String(valor).replace(/\D/g, '').slice(0, 11);
|
const digits = String(valor).replace(/\D/g, '').slice(0, 11);
|
||||||
|
|
||||||
|
|
||||||
return digits
|
return digits
|
||||||
.replace(/(\d)/, '($1') // 123 -> 123.
|
.replace(/(\d)/, '($1')
|
||||||
.replace(/(\d{2})(\d)/, '$1) $2')
|
.replace(/(\d{2})(\d)/, '$1) $2')
|
||||||
.replace(/(\d)(\d{4})/, '$1 $2')
|
.replace(/(\d)(\d{4})/, '$1 $2')
|
||||||
.replace(/(\d{4})(\d{4})/, '$1-$2')
|
.replace(/(\d{4})(\d{4})/, '$1-$2');
|
||||||
}
|
};
|
||||||
|
|
||||||
|
|
||||||
const FormatCPF = (valor) => {
|
const FormatCPF = (valor) => {
|
||||||
|
|
||||||
const digits = String(valor).replace(/\D/g, '').slice(0, 11);
|
const digits = String(valor).replace(/\D/g, '').slice(0, 11);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return digits
|
return digits
|
||||||
.replace(/(\d{3})(\d)/, '$1.$2') // 123 -> 123.
|
.replace(/(\d{3})(\d)/, '$1.$2')
|
||||||
.replace(/(\d{3})(\d)/, '$1.$2') // 123.456 -> 123.456.
|
.replace(/(\d{3})(\d)/, '$1.$2')
|
||||||
.replace(/(\d{3})(\d{1,2})$/, '$1-$2'); // 123.456.789 -> 123.456.789-01
|
.replace(/(\d{3})(\d{1,2})$/, '$1-$2');
|
||||||
|
};
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Estado para armazenar a URL da foto do avatar
|
// Estado para armazenar a URL da foto do avatar
|
||||||
const [avatarUrl, setAvatarUrl] = useState(null);
|
const [avatarUrl, setAvatarUrl] = useState(null);
|
||||||
|
|
||||||
// Estado para controlar quais seções estão colapsadas
|
// Estado para controlar seções abertas/fechadas
|
||||||
const [collapsedSections, setCollapsedSections] = useState({
|
const [collapsedSections, setCollapsedSections] = useState({
|
||||||
dadosPessoais: true, // Alterado para true para a seção ficar aberta por padrão
|
dadosPessoais: true,
|
||||||
infoMedicas: false,
|
infoMedicas: false,
|
||||||
infoConvenio: false,
|
infoConvenio: false,
|
||||||
endereco: false,
|
endereco: false,
|
||||||
contato: false,
|
contato: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Função para alternar o estado de colapso de uma seção
|
|
||||||
const handleToggleCollapse = (section) => {
|
const handleToggleCollapse = (section) => {
|
||||||
setCollapsedSections(prevState => ({
|
setCollapsedSections(prevState => ({
|
||||||
...prevState,
|
...prevState,
|
||||||
@ -54,14 +42,11 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
const handleChange = (e) => {
|
const handleChange = (e) => {
|
||||||
const { name, value, type, checked, files } = e.target;
|
const { name, value, type, checked, files } = e.target;
|
||||||
|
|
||||||
console.log(name, value)
|
|
||||||
|
|
||||||
if (type === 'checkbox') {
|
if (type === 'checkbox') {
|
||||||
setFormData({ ...formData, [name]: checked });
|
setFormData({ ...formData, [name]: checked });
|
||||||
} else if (type === 'file') {
|
} else if (type === 'file') {
|
||||||
setFormData({ ...formData, [name]: files[0] });
|
setFormData({ ...formData, [name]: files[0] });
|
||||||
|
|
||||||
// Lógica para pré-visualizar a imagem no avatar
|
|
||||||
if (name === 'foto' && files[0]) {
|
if (name === 'foto' && files[0]) {
|
||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
reader.onloadend = () => {
|
reader.onloadend = () => {
|
||||||
@ -69,12 +54,10 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
};
|
};
|
||||||
reader.readAsDataURL(files[0]);
|
reader.readAsDataURL(files[0]);
|
||||||
} else if (name === 'foto' && !files[0]) {
|
} else if (name === 'foto' && !files[0]) {
|
||||||
setAvatarUrl(null); // Limpa o avatar se nenhum arquivo for selecionado
|
setAvatarUrl(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
} else if (name.includes('cpf')) {
|
||||||
|
|
||||||
if (name.includes('cpf')) {
|
|
||||||
let cpfFormatado = FormatCPF(value);
|
let cpfFormatado = FormatCPF(value);
|
||||||
setFormData(prev => ({ ...prev, [name]: cpfFormatado }));
|
setFormData(prev => ({ ...prev, [name]: cpfFormatado }));
|
||||||
} else if (name.includes('telefone')) {
|
} else if (name.includes('telefone')) {
|
||||||
@ -85,10 +68,11 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Função para buscar endereço pelo CEP
|
// Modal
|
||||||
const [showModal, setShowModal] = useState(false);
|
const [showModal, setShowModal] = useState(false);
|
||||||
const [modalMsg, setModalMsg] = useState('');
|
const [modalMsg, setModalMsg] = useState('');
|
||||||
|
|
||||||
|
// Buscar endereço via CEP
|
||||||
const handleCepBlur = async () => {
|
const handleCepBlur = async () => {
|
||||||
const cep = formData.cep.replace(/\D/g, '');
|
const cep = formData.cep.replace(/\D/g, '');
|
||||||
if (cep.length === 8) {
|
if (cep.length === 8) {
|
||||||
@ -114,51 +98,123 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Salvar médico
|
||||||
const handleSubmit = () => {
|
const handleSubmit = () => {
|
||||||
if (!formData.full_name || !formData.cpf || !formData.birth_date) {
|
if (!formData.full_name || !formData.cpf || !formData.birth_date) {
|
||||||
setModalMsg('Por favor, preencha: Nome, CPF, Data de Nascimento.');
|
setModalMsg("Por favor, preencha:\n- Nome\n- CPF\n- Data de Nascimento");
|
||||||
setShowModal(true);
|
setShowModal(true);
|
||||||
|
return; // impede que continue
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
onSave(
|
onSave({ ...formData });
|
||||||
{
|
|
||||||
...formData
|
|
||||||
}
|
|
||||||
|
|
||||||
);
|
setModalMsg("Médico salvo com sucesso!");
|
||||||
setModalMsg('Médico salvo com sucesso!');
|
|
||||||
setShowModal(true);
|
setShowModal(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{/* Modal de feedback */}
|
{/* Modal */}
|
||||||
{showModal && (
|
{showModal && (
|
||||||
<div className="modal fade show" style={{ display: 'block', alignItems: 'flex-start', justifyContent: 'center' }} tabIndex="-1">
|
<div
|
||||||
<div className="modal-dialog" style={{ marginTop: '32px' }}>
|
style={{
|
||||||
<div className="modal-content">
|
position: "fixed",
|
||||||
<div className="modal-header" style={{ backgroundColor: '# ' }}>
|
top: 0,
|
||||||
<h5 className="modal-title text-black">Atenção</h5>
|
left: 0,
|
||||||
<button type="button" className="btn-close" style={{ filter: 'invert(0)' }} onClick={() => setShowModal(false)}></button>
|
width: "100%",
|
||||||
|
height: "100%",
|
||||||
|
backgroundColor: "rgba(0,0,0,0.5)",
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "center",
|
||||||
|
justifyContent: "center",
|
||||||
|
zIndex: 9999
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
background: "#fff",
|
||||||
|
borderRadius: "10px",
|
||||||
|
width: "400px",
|
||||||
|
maxWidth: "90%",
|
||||||
|
boxShadow: "0 6px 20px rgba(0,0,0,0.2)",
|
||||||
|
overflow: "hidden"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{/* Header */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
background: "#1e3a8a",
|
||||||
|
padding: "12px 16px",
|
||||||
|
borderBottom: "1px solid #dee2e6",
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "center",
|
||||||
|
justifyContent: "space-between"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<h5 style={{ margin: 0, fontSize: "1.2rem", fontWeight: 600, color: "#ffffffff" }}>Atenção</h5>
|
||||||
|
<button
|
||||||
|
onClick={() => setShowModal(false)}
|
||||||
|
style={{
|
||||||
|
background: "transparent",
|
||||||
|
border: "none",
|
||||||
|
fontSize: "1.2rem",
|
||||||
|
cursor: "pointer"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
×
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div className="modal-body text-black">
|
|
||||||
<p style={{ fontSize: '1.3rem', fontWeight: 500 }}>{modalMsg}</p>
|
{/* Body */}
|
||||||
</div>
|
<div style={{ padding: "16px", color: "#000" }}>
|
||||||
<div className="modal-footer">
|
<p
|
||||||
<button type="button" className="btn btn-primary" onClick={() => setShowModal(false)}>Fechar</button>
|
style={{
|
||||||
|
fontSize: "1.1rem",
|
||||||
|
fontWeight: 500,
|
||||||
|
whiteSpace: "pre-line" // <-- garante quebra de linha no texto
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{modalMsg}
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Footer */}
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
padding: "12px 16px",
|
||||||
|
borderTop: "1px solid #dee2e6",
|
||||||
|
display: "flex",
|
||||||
|
justifyContent: "flex-end"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
onClick={() => setShowModal(false)}
|
||||||
|
style={{
|
||||||
|
background: "#0d6efd",
|
||||||
|
border: "none",
|
||||||
|
padding: "8px 16px",
|
||||||
|
borderRadius: "6px",
|
||||||
|
color: "#fff",
|
||||||
|
fontSize: "1rem",
|
||||||
|
cursor: "pointer"
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Fechar
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<div className="card p-3 shadow-sm">
|
<div className="card p-3 shadow-sm">
|
||||||
<h3 className="mb-4 text-center" style={{ fontSize: '2.5rem' }}>MediConnect</h3>
|
<h3 className="mb-4 text-center" style={{ fontSize: '2.5rem' }}>MediConnect</h3>
|
||||||
|
|
||||||
{/* DADOS PESSOAIS */}
|
{/* DADOS PESSOAIS */}
|
||||||
<div className="mb-5 p-4 border rounded shadow-sm">
|
<div className="mb-5 p-4 border rounded shadow-sm">
|
||||||
<h4 className="mb-4 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('dadosPessoais')} style={{ fontSize: '1.8rem' }}>
|
<h4 className="mb-4 cursor-pointer d-flex justify-content-between align-items-center"
|
||||||
|
onClick={() => handleToggleCollapse('dadosPessoais')}
|
||||||
|
style={{ fontSize: '1.8rem' }}>
|
||||||
Dados Pessoais
|
Dados Pessoais
|
||||||
<span className="fs-5">
|
<span className="fs-5">
|
||||||
{collapsedSections.dadosPessoais ? '▲' : '▼'}
|
{collapsedSections.dadosPessoais ? '▲' : '▼'}
|
||||||
@ -166,7 +222,7 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
</h4>
|
</h4>
|
||||||
<div className={`collapse${collapsedSections.dadosPessoais ? ' show' : ''}`}>
|
<div className={`collapse${collapsedSections.dadosPessoais ? ' show' : ''}`}>
|
||||||
<div className="row mt-3">
|
<div className="row mt-3">
|
||||||
{/* AVATAR E INPUT DE FOTO */}
|
{/* Avatar */}
|
||||||
<div className="col-md-6 mb-3 d-flex align-items-center">
|
<div className="col-md-6 mb-3 d-flex align-items-center">
|
||||||
<div className="me-3">
|
<div className="me-3">
|
||||||
{avatarUrl ? (
|
{avatarUrl ? (
|
||||||
@ -206,24 +262,25 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
{formData.foto && <span className="ms-2" style={{ fontSize: '1rem' }}>{formData.foto.name}</span>}
|
{formData.foto && <span className="ms-2" style={{ fontSize: '1rem' }}>{formData.foto.name}</span>}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/* CADASTRO */}
|
|
||||||
|
{/* Inputs */}
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Nome: *</label>
|
<label style={{ fontSize: '1.1rem' }}>Nome: *</label>
|
||||||
<input type="text" className="form-control" name="full_name" value={formData.full_name} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="full_name" value={formData.full_name} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Data de nascimento: *</label>
|
<label style={{ fontSize: '1.1rem' }}>Data de nascimento: *</label>
|
||||||
<input type="date" className="form-control" name="birth_date" value={formData.birth_date} onChange={handleChange} style={{ fontSize: '1.1rem' }} min="1900-01-01" max="2025-09-24" />
|
<input type="date" className="form-control" name="birth_date" value={formData.birth_date} onChange={handleChange} min="1900-01-01" max="2025-09-24" />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>CPF: *</label>
|
<label style={{ fontSize: '1.1rem' }}>CPF: *</label>
|
||||||
<input type="text" className="form-control" name="cpf" value={formData.cpf} onChange={ handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="cpf" value={formData.cpf} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Estado do CRM:</label>
|
<label style={{ fontSize: '1.1rem' }}>Estado do CRM:</label>
|
||||||
<select className="form-control" name="crm_uf" value={formData.crm_uf} onChange={handleChange} style={{ fontSize: '1.1rem' }}>
|
<select className="form-control" name="crm_uf" value={formData.crm_uf} onChange={handleChange}>
|
||||||
<option value="" disabled selected>Selecione</option>
|
<option value="">Selecione</option>
|
||||||
<option value="AP">AP</option>
|
<option value="AP">AP</option>
|
||||||
<option value="AL">AL</option>
|
<option value="AL">AL</option>
|
||||||
<option value="AM">AM</option>
|
<option value="AM">AM</option>
|
||||||
@ -255,36 +312,37 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
|
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>CRM:</label>
|
<label style={{ fontSize: '1.1rem' }}>CRM:</label>
|
||||||
<input type="text" className="form-control" name="crm" value={formData.crm} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="crm" value={formData.crm} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Especialização:</label>
|
<label style={{ fontSize: '1.1rem' }}>Especialização:</label>
|
||||||
<select className="form-control" name="specialty" value={formData.specialty} onChange={handleChange} style={{ fontSize: '1.1rem' }}>
|
<select className="form-control" name="specialty" value={formData.specialty} onChange={handleChange}>
|
||||||
<option value="">Selecione</option>
|
<option value="">Selecione</option>
|
||||||
<option value="Cardiologia">Clínica médica (clínico geral)</option>
|
<option value="Clínica Geral">Clínica médica (clínico geral)</option>
|
||||||
<option value="Dermatologia">Pediatria</option>
|
<option value="Pediatria">Pediatria</option>
|
||||||
<option value="Ginecologia">Ginecologia e obstetrícia</option>
|
<option value="Ginecologia">Ginecologia e obstetrícia</option>
|
||||||
<option value="Pediatria">Cardiologia</option>
|
<option value="Cardiologia">Cardiologia</option>
|
||||||
<option value="Ortopedia">Ortopedia e traumatologia</option>
|
<option value="Ortopedia">Ortopedia e traumatologia</option>
|
||||||
<option value="Oftalmologia">Oftalmologia</option>
|
<option value="Oftalmologia">Oftalmologia</option>
|
||||||
<option value="Neurologia">Otorrinolaringologia</option>
|
<option value="Otorrinolaringologia">Otorrinolaringologia</option>
|
||||||
<option value="Psiquiatria">Dermatologia</option>
|
<option value="Dermatologia">Dermatologia</option>
|
||||||
<option value="Endocrinologia">Neurologia</option>
|
<option value="Neurologia">Neurologia</option>
|
||||||
<option value="Oncologia">Psiquiatria</option>
|
<option value="Psiquiatria">Psiquiatria</option>
|
||||||
<option value="Oncologia">Endocrinologia</option>
|
<option value="Endocrinologia">Endocrinologia</option>
|
||||||
<option value="Oncologia">Gastroenterologia</option>
|
<option value="Gastroenterologia">Gastroenterologia</option>
|
||||||
<option value="Oncologia">Urologia</option>
|
<option value="Urologia">Urologia</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* ENDEREÇO */}
|
{/* ENDEREÇO */}
|
||||||
<div className="mb-5 p-4 border rounded shadow-sm">
|
<div className="mb-5 p-4 border rounded shadow-sm">
|
||||||
<h4 className="mb-4 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('endereco')} style={{ fontSize: '1.8rem' }}>
|
<h4 className="mb-4 cursor-pointer d-flex justify-content-between align-items-center"
|
||||||
|
onClick={() => handleToggleCollapse('endereco')}
|
||||||
|
style={{ fontSize: '1.8rem' }}>
|
||||||
Endereço
|
Endereço
|
||||||
<span className="fs-5">
|
<span className="fs-5">
|
||||||
{collapsedSections.endereco ? '▲' : '▼'}
|
{collapsedSections.endereco ? '▲' : '▼'}
|
||||||
@ -293,32 +351,32 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
<div className={`collapse${collapsedSections.endereco ? ' show' : ''}`}>
|
<div className={`collapse${collapsedSections.endereco ? ' show' : ''}`}>
|
||||||
<div className="row mt-3">
|
<div className="row mt-3">
|
||||||
<div className="col-md-4 mb-3">
|
<div className="col-md-4 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>CEP:</label>
|
<label>CEP:</label>
|
||||||
<input type="text" className="form-control" name="cep" value={formData.cep} onChange={handleChange} onBlur={handleCepBlur} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="cep" value={formData.cep} onChange={handleChange} onBlur={handleCepBlur} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-8 mb-3">
|
<div className="col-md-8 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Rua:</label>
|
<label>Rua:</label>
|
||||||
<input type="text" className="form-control" name="street" value={formData.street} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="street" value={formData.street} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Bairro:</label>
|
<label>Bairro:</label>
|
||||||
<input type="text" className="form-control" name="neighborhood" value={formData.neighborhood} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="neighborhood" value={formData.neighborhood} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-4 mb-3">
|
<div className="col-md-4 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Cidade:</label>
|
<label>Cidade:</label>
|
||||||
<input type="text" className="form-control" name="city" value={formData.city} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="city" value={formData.city} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-2 mb-3">
|
<div className="col-md-2 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Estado:</label>
|
<label>Estado:</label>
|
||||||
<input type="text" className="form-control" name="state" value={formData.state} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="state" value={formData.state} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-4 mb-3">
|
<div className="col-md-4 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Número:</label>
|
<label>Número:</label>
|
||||||
<input type="text" className="form-control" name="number" value={formData.number} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="number" value={formData.number} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-8 mb-3">
|
<div className="col-md-8 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Complemento:</label>
|
<label>Complemento:</label>
|
||||||
<input type="text" className="form-control" name="complement" value={formData.complement} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="complement" value={formData.complement} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -326,7 +384,9 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
|
|
||||||
{/* CONTATO */}
|
{/* CONTATO */}
|
||||||
<div className="mb-5 p-4 border rounded shadow-sm">
|
<div className="mb-5 p-4 border rounded shadow-sm">
|
||||||
<h4 className="mb-4 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('contato')} style={{ fontSize: '1.8rem' }}>
|
<h4 className="mb-4 cursor-pointer d-flex justify-content-between align-items-center"
|
||||||
|
onClick={() => handleToggleCollapse('contato')}
|
||||||
|
style={{ fontSize: '1.8rem' }}>
|
||||||
Contato
|
Contato
|
||||||
<span className="fs-5">
|
<span className="fs-5">
|
||||||
{collapsedSections.contato ? '▲' : '▼'}
|
{collapsedSections.contato ? '▲' : '▼'}
|
||||||
@ -335,26 +395,29 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
<div className={`collapse${collapsedSections.contato ? ' show' : ''}`}>
|
<div className={`collapse${collapsedSections.contato ? ' show' : ''}`}>
|
||||||
<div className="row mt-3">
|
<div className="row mt-3">
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Email: </label>
|
<label>Email:</label>
|
||||||
<input type="email" className="form-control" name="email" value={formData.email} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="email" className="form-control" name="email" value={formData.email} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Telefone: </label>
|
<label>Telefone:</label>
|
||||||
<input type="text" className="form-control" name="phone_mobile" value={formData.phone_mobile} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="phone_mobile" value={formData.phone_mobile} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Telefone 2:</label>
|
<label>Telefone 2:</label>
|
||||||
<input type="text" className="form-control" name="phone2" value={formData.phone2} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" className="form-control" name="phone2" value={formData.phone2} onChange={handleChange} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Botões */}
|
{/* BOTÕES */}
|
||||||
<div className="mt-3 text-center">
|
<div className="mt-3 text-center">
|
||||||
<button className="btn btn-success me-3" onClick={handleSubmit} style={{ fontSize: '1.2rem', padding: '0.75rem 1.5rem' }}>
|
<button
|
||||||
Salvar Paciente
|
className="btn btn-success me-3"
|
||||||
|
onClick={handleSubmit}
|
||||||
|
style={{ fontSize: '1.2rem', padding: '0.75rem 1.5rem' }}
|
||||||
|
>
|
||||||
|
Salvar Médico
|
||||||
</button>
|
</button>
|
||||||
<Link to={'/medicos'}>
|
<Link to={'/medicos'}>
|
||||||
<button className="btn btn-light" onClick={onCancel} style={{ fontSize: '1.2rem', padding: '0.75rem 1.5rem' }}>
|
<button className="btn btn-light" onClick={onCancel} style={{ fontSize: '1.2rem', padding: '0.75rem 1.5rem' }}>
|
||||||
@ -362,7 +425,6 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
</button>
|
</button>
|
||||||
</Link>
|
</Link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -281,20 +281,19 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="col-md-12 mb-3 mt-3">
|
||||||
|
<div className="form-check">
|
||||||
|
<input className="form-check-input" type="checkbox" name="vip" checked={formData.vip} onChange={handleChange} id="vip" style={{ transform: 'scale(1.2)' }} />
|
||||||
|
<label className="form-check-label ms-2" htmlFor="vip" style={{ fontSize: '1.1rem' }}>
|
||||||
|
Paciente VIP
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* CAMPOS MOVIDOS */}
|
|
||||||
<div className="col-md-12 mb-3 mt-3">
|
<div className="col-md-12 mb-3 mt-3">
|
||||||
<label style={{ fontSize: '1.1rem' }}>Observações:</label>
|
<label style={{ fontSize: '1.1rem' }}>Observações:</label>
|
||||||
<textarea className="form-control" name="notes" value={formData.notes} onChange={handleChange} style={{ fontSize: '1.1rem' }} placeholder='alergias, doenças crônicas, informações sobre porteses ou marca-passo, etc'></textarea>
|
<textarea className="form-control" name="notes" value={formData.notes} onChange={handleChange} style={{ fontSize: '1.1rem' }} placeholder='alergias, doenças crônicas, informações sobre porteses ou marca-passo, etc'></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-12 mb-3">
|
|
||||||
<label style={{ fontSize: '1.1rem' }}>Anexos do Paciente:</label>
|
|
||||||
<div>
|
|
||||||
<label htmlFor="anexos-input" className="btn btn-secondary" style={{ fontSize: '1.1rem' }}>Escolher arquivo</label>
|
|
||||||
<input type="file" className="form-control d-none" name="anexos" id="anexos-input" onChange={handleChange} />
|
|
||||||
<span className="ms-2" style={{ fontSize: '1.1rem' }}>{formData.anexos ? formData.anexos.name : 'Nenhum arquivo escolhido'}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -332,64 +331,8 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
<label style={{ fontSize: '1.1rem' }}>Altura (m):</label>
|
<label style={{ fontSize: '1.1rem' }}>Altura (m):</label>
|
||||||
<input type="text" step="0.01" className="form-control" name="height_m" value={formData.height_m} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
<input type="text" step="0.01" className="form-control" name="height_m" value={formData.height_m} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-2 mb-3">
|
|
||||||
<label style={{ fontSize: '1.1rem' }}>IMC (kg/m²):</label>
|
|
||||||
<input type="text" className="form-control" name="bmi" value={formData.bmi} readOnly disabled style={{ fontSize: '1.1rem' }} />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* INFORMAÇÕES DE CONVÊNIO */}
|
|
||||||
<div className="mb-5 p-4 border rounded shadow-sm">
|
|
||||||
<h4 className="mb-4 cursor-pointer d-flex justify-content-between align-items-center" onClick={() => handleToggleCollapse('infoConvenio')} style={{ fontSize: '1.8rem' }}>
|
|
||||||
Informações de convênio
|
|
||||||
<span className="fs-5">
|
|
||||||
{collapsedSections.infoConvenio ? '▲' : '▼'}
|
|
||||||
</span>
|
|
||||||
</h4>
|
|
||||||
<div className={`collapse${collapsedSections.infoConvenio ? ' show' : ''}`}>
|
|
||||||
<div className="row mt-3">
|
|
||||||
<div className="col-md-6 mb-3">
|
|
||||||
<label style={{ fontSize: '1.1rem' }}>Convênio:</label>
|
|
||||||
<select className="form-control" name="convenio" value={formData.convenio} onChange={handleChange} style={{ fontSize: '1.1rem' }}>
|
|
||||||
<option value="">Selecione</option>
|
|
||||||
<option value="Amil">Amil</option>
|
|
||||||
<option value="Bradesco Saúde">Bradesco Saúde</option>
|
|
||||||
<option value="SulAmérica">SulAmérica</option>
|
|
||||||
<option value="Unimed">Unimed</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div className="col-md-6 mb-3">
|
|
||||||
<label style={{ fontSize: '1.1rem' }}>Plano:</label>
|
|
||||||
<input type="text" className="form-control" name="plano" value={formData.plano} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
|
||||||
</div>
|
|
||||||
<div className="col-md-6 mb-3">
|
|
||||||
<label style={{ fontSize: '1.1rem' }}>Nº de matrícula:</label>
|
|
||||||
<input type="text" className="form-control" name="numeroMatricula" value={formData.numeroMatricula} onChange={handleChange} style={{ fontSize: '1.1rem' }} />
|
|
||||||
</div>
|
|
||||||
<div className="col-md-4 mb-3">
|
|
||||||
<label style={{ fontSize: '1.1rem' }}>Validade da Carteira:</label>
|
|
||||||
<input type="date" className="form-control" name="validadeCarteira" value={formData.validadeCarteira} onChange={handleChange} disabled={formData.validadeIndeterminada} style={{ fontSize: '1.1rem' }} />
|
|
||||||
</div>
|
|
||||||
<div className="col-md-2 d-flex align-items-end mb-3">
|
|
||||||
<div className="form-check">
|
|
||||||
<input className="form-check-input" type="checkbox" name="validadeIndeterminada" checked={formData.validadeIndeterminada} onChange={handleChange} id="validadeIndeterminada" style={{ transform: 'scale(1.2)' }} />
|
|
||||||
<label className="form-check-label ms-2" htmlFor="validadeIndeterminada" style={{ fontSize: '1.1rem' }}>
|
|
||||||
Validade indeterminada
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{/* PACIENTE VIP */}
|
|
||||||
<div className="col-md-12 mb-3 mt-3">
|
|
||||||
<div className="form-check">
|
|
||||||
<input className="form-check-input" type="checkbox" name="vip" checked={formData.vip} onChange={handleChange} id="vip" style={{ transform: 'scale(1.2)' }} />
|
|
||||||
<label className="form-check-label ms-2" htmlFor="vip" style={{ fontSize: '1.1rem' }}>
|
|
||||||
Paciente VIP
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -507,28 +450,7 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{showModal404 && (
|
|
||||||
<div className="modal" style={{ display: 'block', backgroundColor: 'rgba(0,0,0,0.5)' }}>
|
|
||||||
<div className="modal-dialog">
|
|
||||||
<div className="modal-content">
|
|
||||||
<div className="modal-header" style={{ backgroundColor: '#f2fa0dff' }}>
|
|
||||||
<h5 className="modal-title"><span className="text-dark">Atenção</span></h5>
|
|
||||||
<button type="button" className="btn-close btn-close-black" onClick={() => setShowModal404(false)}></button>
|
|
||||||
</div>
|
|
||||||
<div className="modal-body">
|
|
||||||
<p style={{ color: '#111', fontSize: '1.4rem' }}>{errorModalMsg || '(Erro 404).Por favor, tente novamente mais tarde'}</p>
|
|
||||||
</div>
|
|
||||||
<div className="modal-footer">
|
|
||||||
|
|
||||||
|
|
||||||
<button type="button" className="btn btn-primary" onClick={() => setShowModal404(false)}>
|
|
||||||
Fechar
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,12 +3,6 @@
|
|||||||
"name": "Menu",
|
"name": "Menu",
|
||||||
"isTitle": true
|
"isTitle": true
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
|
||||||
"name":"Início",
|
|
||||||
"url": "/admin/",
|
|
||||||
"icon": "house"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Lista de Pacientes",
|
"name": "Lista de Pacientes",
|
||||||
"icon": "clipboard-heart-fill",
|
"icon": "clipboard-heart-fill",
|
||||||
@ -20,11 +14,6 @@
|
|||||||
"icon": "hospital-fill",
|
"icon": "hospital-fill",
|
||||||
"url": "/admin/medicos"
|
"url": "/admin/medicos"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Agendar consulta",
|
|
||||||
"icon": "calendar-plus-fill",
|
|
||||||
"url": "/admin/agendamento"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "Gestão de Usuários",
|
"name": "Gestão de Usuários",
|
||||||
|
|||||||
@ -3,25 +3,6 @@
|
|||||||
"name": "Menu-Financeiro",
|
"name": "Menu-Financeiro",
|
||||||
"isTitle": true
|
"isTitle": true
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
|
||||||
"name":"Início",
|
|
||||||
"url": "/financeiro/inicio",
|
|
||||||
"icon": "house"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"name": "Lista de Pacientes",
|
|
||||||
"icon": "clipboard-heart-fill",
|
|
||||||
"url": "/financeiro/pacientes"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"name": "Lista de Médico",
|
|
||||||
"icon": "hospital-fill",
|
|
||||||
"url": "/financeiro/medicos"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "Controle Financeiro",
|
"name": "Controle Financeiro",
|
||||||
"icon": "cash-coin",
|
"icon": "cash-coin",
|
||||||
|
|||||||
@ -4,12 +4,6 @@
|
|||||||
"isTitle": true
|
"isTitle": true
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
|
||||||
"name":"Início",
|
|
||||||
"url": "/medico/",
|
|
||||||
"icon": "house"
|
|
||||||
},
|
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "Prontuário",
|
"name": "Prontuário",
|
||||||
"icon": "calendar-plus-fill",
|
"icon": "calendar-plus-fill",
|
||||||
|
|||||||
@ -1,22 +1,25 @@
|
|||||||
import React, { useState } from 'react'
|
import React, { useState, useMemo } from 'react';
|
||||||
|
|
||||||
import TabelaAgendamentoDia from '../components/AgendarConsulta/TabelaAgendamentoDia';
|
import TabelaAgendamentoDia from '../components/AgendarConsulta/TabelaAgendamentoDia';
|
||||||
import TabelaAgendamentoSemana from '../components/AgendarConsulta/TabelaAgendamentoSemana';
|
import TabelaAgendamentoSemana from '../components/AgendarConsulta/TabelaAgendamentoSemana';
|
||||||
import TabelaAgendamentoMes from '../components/AgendarConsulta/TabelaAgendamentoMes';
|
import TabelaAgendamentoMes from '../components/AgendarConsulta/TabelaAgendamentoMes';
|
||||||
import FormNovaConsulta from '../components/AgendarConsulta/FormNovaConsulta';
|
import FormNovaConsulta from '../components/AgendarConsulta/FormNovaConsulta';
|
||||||
|
|
||||||
import dayjs from 'dayjs'
|
// ✨ NOVO: Caminho de importação corrigido com base na sua estrutura de pastas
|
||||||
|
import AgendamentosMes from '../components/AgendarConsulta/DadosConsultasMock.js';
|
||||||
|
|
||||||
|
import dayjs from 'dayjs';
|
||||||
import "./style/Agendamento.css";
|
import "./style/Agendamento.css";
|
||||||
import './style/FilaEspera.css';
|
import './style/FilaEspera.css';
|
||||||
|
|
||||||
const Agendamento = () => {
|
const Agendamento = () => {
|
||||||
|
|
||||||
const [FiladeEspera, setFiladeEspera] = useState(false)
|
const [FiladeEspera, setFiladeEspera] = useState(false);
|
||||||
const [tabela, setTabela] = useState('diario')
|
const [tabela, setTabela] = useState('diario');
|
||||||
const [PageNovaConsulta, setPageConsulta] = useState(false)
|
const [PageNovaConsulta, setPageConsulta] = useState(false);
|
||||||
const [searchTerm, setSearchTerm] = useState('') // 🔹 Estado da busca
|
const [searchTerm, setSearchTerm] = useState('');
|
||||||
|
|
||||||
// 🔹 Dados da fila de espera
|
// Dados da fila de espera (sem alteração)
|
||||||
const filaEsperaData = [
|
const filaEsperaData = [
|
||||||
{ nome: 'Ricardo Pereira', email: 'ricardo.pereira@gmail.com', cpf: '444.777.666-55', telefone: '(79) 99123-4567', entrada: '25/09/2025 às 08:00' },
|
{ nome: 'Ricardo Pereira', email: 'ricardo.pereira@gmail.com', cpf: '444.777.666-55', telefone: '(79) 99123-4567', entrada: '25/09/2025 às 08:00' },
|
||||||
{ nome: 'Ana Costa', email: 'ana.costa@gmail.com', cpf: '321.654.987-00', telefone: '(79) 97777-3333', entrada: '25/09/2025 às 08:30' },
|
{ nome: 'Ana Costa', email: 'ana.costa@gmail.com', cpf: '321.654.987-00', telefone: '(79) 97777-3333', entrada: '25/09/2025 às 08:30' },
|
||||||
@ -28,7 +31,7 @@ const Agendamento = () => {
|
|||||||
{ nome: 'Juliana Oliveira', email: 'juliana.o@gmail.com', cpf: '111.222.333-44', telefone: '(79) 98765-1234', entrada: '26/09/2025 às 11:30' },
|
{ nome: 'Juliana Oliveira', email: 'juliana.o@gmail.com', cpf: '111.222.333-44', telefone: '(79) 98765-1234', entrada: '26/09/2025 às 11:30' },
|
||||||
];
|
];
|
||||||
|
|
||||||
// 🔹 Filtra a fila de espera com base no searchTerm
|
// Filtro da fila de espera (sem alteração)
|
||||||
const filteredFila = filaEsperaData.filter(item =>
|
const filteredFila = filaEsperaData.filter(item =>
|
||||||
item.nome.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
item.nome.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
||||||
item.email.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
item.email.toLowerCase().includes(searchTerm.toLowerCase()) ||
|
||||||
@ -36,16 +39,34 @@ const Agendamento = () => {
|
|||||||
item.telefone.includes(searchTerm)
|
item.telefone.includes(searchTerm)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Lógica para filtrar os dados da AGENDA (AgendamentosMes)
|
||||||
|
const filteredAgendamentos = useMemo(() => {
|
||||||
|
if (!searchTerm.trim()) {
|
||||||
|
return AgendamentosMes;
|
||||||
|
}
|
||||||
|
|
||||||
|
const lowerCaseSearchTerm = searchTerm.toLowerCase();
|
||||||
|
const filteredData = {};
|
||||||
|
|
||||||
|
for (const semana in AgendamentosMes) {
|
||||||
|
filteredData[semana] = {};
|
||||||
|
for (const dia in AgendamentosMes[semana]) {
|
||||||
|
filteredData[semana][dia] = AgendamentosMes[semana][dia].filter(agendamento =>
|
||||||
|
agendamento.status === 'vazio' ||
|
||||||
|
(agendamento.paciente && agendamento.paciente.toLowerCase().includes(lowerCaseSearchTerm))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filteredData;
|
||||||
|
}, [searchTerm]);
|
||||||
|
|
||||||
const ListarDiasdoMes = (ano, mes) => {
|
const ListarDiasdoMes = (ano, mes) => {
|
||||||
let segundas = []; let tercas = []; let quartas = []; let quintas = []; let sextas = []
|
let segundas = []; let tercas = []; let quartas = []; let quintas = []; let sextas = []
|
||||||
|
|
||||||
const base = dayjs(`${ano}-${mes}-01`)
|
const base = dayjs(`${ano}-${mes}-01`)
|
||||||
const DiasnoMes = base.daysInMonth()
|
const DiasnoMes = base.daysInMonth()
|
||||||
|
|
||||||
for (let d = 1; d <= DiasnoMes; d++) {
|
for (let d = 1; d <= DiasnoMes; d++) {
|
||||||
const data = dayjs(`${ano}-${mes}-${d}`)
|
const data = dayjs(`${ano}-${mes}-${d}`)
|
||||||
const dia = data.format('dddd')
|
const dia = data.format('dddd')
|
||||||
|
|
||||||
switch (dia) {
|
switch (dia) {
|
||||||
case 'Monday': segundas.push(d); break
|
case 'Monday': segundas.push(d); break
|
||||||
case 'Tuesday': tercas.push(d); break
|
case 'Tuesday': tercas.push(d); break
|
||||||
@ -55,7 +76,6 @@ const Agendamento = () => {
|
|||||||
default: break
|
default: break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let ListaDiasDatas = [segundas, tercas, quartas, quintas, sextas]
|
let ListaDiasDatas = [segundas, tercas, quartas, quintas, sextas]
|
||||||
return ListaDiasDatas
|
return ListaDiasDatas
|
||||||
}
|
}
|
||||||
@ -72,16 +92,17 @@ const Agendamento = () => {
|
|||||||
<h1>Agendar nova consulta</h1>
|
<h1>Agendar nova consulta</h1>
|
||||||
|
|
||||||
{!PageNovaConsulta ? (
|
{!PageNovaConsulta ? (
|
||||||
|
|
||||||
<div className='atendimento-eprocura'>
|
<div className='atendimento-eprocura'>
|
||||||
|
|
||||||
{/* 🔍 Busca e filtro */}
|
|
||||||
<div className='busca-atendimento'>
|
<div className='busca-atendimento'>
|
||||||
<div>
|
<div>
|
||||||
<i className="fa-solid fa-calendar-day"></i>
|
<i className="fa-solid fa-calendar-day"></i>
|
||||||
<input type="text" placeholder="Buscar atendimento" />
|
<input
|
||||||
|
type="text"
|
||||||
|
placeholder="Buscar atendimento por paciente..."
|
||||||
|
value={searchTerm}
|
||||||
|
onChange={(e) => setSearchTerm(e.target.value)}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<select>
|
<select>
|
||||||
<option value="" disabled selected>Agendar</option>
|
<option value="" disabled selected>Agendar</option>
|
||||||
@ -92,7 +113,6 @@ const Agendamento = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 🏥 Unidade e profissional */}
|
|
||||||
<div className='unidade-selecionarprofissional'>
|
<div className='unidade-selecionarprofissional'>
|
||||||
<select>
|
<select>
|
||||||
<option value="" disabled selected >Unidade</option>
|
<option value="" disabled selected >Unidade</option>
|
||||||
@ -100,22 +120,25 @@ const Agendamento = () => {
|
|||||||
<option value="">Unidade Zona Norte</option>
|
<option value="">Unidade Zona Norte</option>
|
||||||
<option value="">Unidade Zona Oeste</option>
|
<option value="">Unidade Zona Oeste</option>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<input type="text" placeholder='Selecionar profissional' />
|
<input type="text" placeholder='Selecionar profissional' />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Botões para alternar Agenda / Fila de Espera */}
|
|
||||||
<div className='container-btns-agenda-fila_esepera'>
|
<div className='container-btns-agenda-fila_esepera'>
|
||||||
<button
|
<button
|
||||||
className={`btn-agenda ${FiladeEspera === false ? "opc-agenda-ativo" : ""}`}
|
className={`btn-agenda ${FiladeEspera === false ? "opc-agenda-ativo" : ""}`}
|
||||||
onClick={() => setFiladeEspera(false)}
|
onClick={() => {
|
||||||
|
setFiladeEspera(false);
|
||||||
|
setSearchTerm('');
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
Agenda
|
Agenda
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
className={`btn-fila-espera ${FiladeEspera === true ? "opc-filaespera-ativo" : ""}`}
|
className={`btn-fila-espera ${FiladeEspera === true ? "opc-filaespera-ativo" : ""}`}
|
||||||
onClick={() => setFiladeEspera(true)}
|
onClick={() => {
|
||||||
|
setFiladeEspera(true);
|
||||||
|
setSearchTerm('');
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
Fila de espera
|
Fila de espera
|
||||||
</button>
|
</button>
|
||||||
@ -128,43 +151,27 @@ const Agendamento = () => {
|
|||||||
<div>
|
<div>
|
||||||
<section className='btns-e-legenda-container'>
|
<section className='btns-e-legenda-container'>
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button className={`btn-selecionar-tabeladia ${tabela === "diario" ? "ativo" : ""}`} onClick={() => setTabela("diario")}>
|
||||||
className={`btn-selecionar-tabeladia ${tabela === "diario" ? "ativo" : ""}`}
|
<i className="fa-solid fa-calendar-day"></i> Dia
|
||||||
onClick={() => setTabela("diario")}
|
|
||||||
>
|
|
||||||
<i className="fa-solid fa-calendar-day"></i>
|
|
||||||
Dia
|
|
||||||
</button>
|
</button>
|
||||||
|
<button className={`btn-selecionar-tabelasemana ${tabela === 'semanal' ? 'ativo' : ""}`} onClick={() => setTabela("semanal")}>
|
||||||
<button
|
<i className="fa-solid fa-calendar-day"></i> Semana
|
||||||
className={`btn-selecionar-tabelasemana ${tabela === 'semanal' ? 'ativo' : ""}`}
|
|
||||||
onClick={() => setTabela("semanal")}
|
|
||||||
>
|
|
||||||
<i className="fa-solid fa-calendar-day"></i>
|
|
||||||
Semana
|
|
||||||
</button>
|
</button>
|
||||||
|
<button className={`btn-selecionar-tabelames ${tabela === 'mensal' ? 'ativo' : ''}`} onClick={() => setTabela("mensal")}>
|
||||||
<button
|
<i className="fa-solid fa-calendar-day"></i> Mês
|
||||||
className={`btn-selecionar-tabelames ${tabela === 'mensal' ? 'ativo' : ''}`}
|
|
||||||
onClick={() => setTabela("mensal")}
|
|
||||||
>
|
|
||||||
<i className="fa-solid fa-calendar-day"></i>
|
|
||||||
Mês
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='legenda-tabela'>
|
<div className='legenda-tabela'>
|
||||||
<div className='legenda-item-realizado'><span>Realizado</span></div>
|
<div className='legenda-item-realizado'><span>Realizado</span></div>
|
||||||
<div className='legenda-item-confirmado'><span>Confirmado</span></div>
|
<div className='legenda-item-confirmado'><span>Confirmado</span></div>
|
||||||
<div className='legenda-item-agendado'><span>Agendado</span></div>
|
<div className='legenda-item-agendado'><span>Agendado</span></div>
|
||||||
<div className='legenda-item-cancelado'><span>Cancelado</span></div>
|
<div className='legenda-item-cancelado'><span>Cancelado</span></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{tabela === "diario" && <TabelaAgendamentoDia handleClickAgendamento={handleClickAgendamento} />}
|
{tabela === "diario" && <TabelaAgendamentoDia handleClickAgendamento={handleClickAgendamento} agendamentos={filteredAgendamentos} />}
|
||||||
{tabela === 'semanal' && <TabelaAgendamentoSemana />}
|
{tabela === 'semanal' && <TabelaAgendamentoSemana agendamentos={filteredAgendamentos} />}
|
||||||
{tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} />}
|
{tabela === 'mensal' && <TabelaAgendamentoMes ListarDiasdoMes={ListarDiasdoMes} aplicarCores={true} agendamentos={filteredAgendamentos} />}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
@ -174,17 +181,13 @@ const Agendamento = () => {
|
|||||||
<div className="fila-header">
|
<div className="fila-header">
|
||||||
<input
|
<input
|
||||||
type="text"
|
type="text"
|
||||||
placeholder="Pesquisar..."
|
placeholder="Pesquisar na fila de espera..."
|
||||||
className="busca-fila-espera"
|
className="busca-fila-espera"
|
||||||
value={searchTerm}
|
value={searchTerm}
|
||||||
onChange={(e) => setSearchTerm(e.target.value)}
|
onChange={(e) => setSearchTerm(e.target.value)}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<h2 className="fila-titulo">Fila de Espera</h2>
|
<h2 className="fila-titulo">Fila de Espera</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<table className="fila-tabela">
|
<table className="fila-tabela">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -212,7 +215,6 @@ const Agendamento = () => {
|
|||||||
}
|
}
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
) : (
|
) : (
|
||||||
<FormNovaConsulta onCancel={handleClickCancel} />
|
<FormNovaConsulta onCancel={handleClickCancel} />
|
||||||
)}
|
)}
|
||||||
@ -220,4 +222,4 @@ const Agendamento = () => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Agendamento
|
export default Agendamento;
|
||||||
@ -1,22 +1,26 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import avatarPlaceholder from '../assets/images/avatar_placeholder.png';
|
import avatarPlaceholder from '../assets/images/avatar_placeholder.png';
|
||||||
import { useParams } from "react-router-dom";
|
import { useParams, useNavigate, useLocation, Navigate } from "react-router-dom";
|
||||||
import API_KEY from "../components/utils/apiKeys";
|
import API_KEY from "../components/utils/apiKeys";
|
||||||
import {GetByID} from "../components/utils/Functions-Endpoints/Patient"
|
import {GetByID} from "../components/utils/Functions-Endpoints/Patient"
|
||||||
import { Link } from "react-router-dom";
|
import { Link } from "react-router-dom";
|
||||||
import { useAuth } from "../components/utils/AuthProvider";
|
import { useAuth } from "../components/utils/AuthProvider";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const Details = () => {
|
const Details = () => {
|
||||||
const parametros = useParams();
|
const parametros = useParams();
|
||||||
const {getAuthorizationHeader, isAuthenticated} = useAuth();
|
const {getAuthorizationHeader, isAuthenticated} = useAuth();
|
||||||
const [paciente, setPaciente] = useState({});
|
const [paciente, setPaciente] = useState({});
|
||||||
const [anexos, setAnexos] = useState([]);
|
const [anexos, setAnexos] = useState([]);
|
||||||
const [selectedFile, setSelectedFile] = useState(null);
|
const [selectedFile, setSelectedFile] = useState(null);
|
||||||
|
const location = useLocation();
|
||||||
|
const navigate = useNavigate();
|
||||||
const patientID = parametros.id
|
const patientID = parametros.id
|
||||||
|
|
||||||
|
const Voltar = () => {
|
||||||
|
const prefixo = location.pathname.split("/")[1];
|
||||||
|
navigate(`/${prefixo}/pacientes`);
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!patientID) return;
|
if (!patientID) return;
|
||||||
@ -30,36 +34,8 @@ const Details = () => {
|
|||||||
})
|
})
|
||||||
.catch((err) => console.error("Erro ao buscar paciente:", err));
|
.catch((err) => console.error("Erro ao buscar paciente:", err));
|
||||||
|
|
||||||
/*fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${patientID}/anexos`)
|
|
||||||
.then(res => res.json())
|
|
||||||
.then(data => setAnexos(data.data || []))
|
|
||||||
.catch(err => console.error("Erro ao buscar anexos:", err));
|
|
||||||
*/
|
|
||||||
}, [patientID]);
|
}, [patientID]);
|
||||||
|
|
||||||
const handleUpload = async () => {
|
|
||||||
if (!selectedFile) return;
|
|
||||||
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append('file', selectedFile);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await fetch(`https://mock.apidog.com/m1/1053378-0-default/pacientes/${patientID}/anexos`, {
|
|
||||||
method: 'POST',
|
|
||||||
body: formData,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (response.ok) {
|
|
||||||
const newAnexo = await response.json();
|
|
||||||
setAnexos(prev => [...prev, newAnexo]);
|
|
||||||
setSelectedFile(null);
|
|
||||||
} else {
|
|
||||||
console.error('Erro ao enviar anexo');
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
console.error('Erro ao enviar anexo:', err);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleDelete = async (anexoId) => {
|
const handleDelete = async (anexoId) => {
|
||||||
try {
|
try {
|
||||||
@ -89,11 +65,10 @@ const Details = () => {
|
|||||||
<h3 className="mb-3 text-center">MediConnect</h3>
|
<h3 className="mb-3 text-center">MediConnect</h3>
|
||||||
<hr />
|
<hr />
|
||||||
<div className="d-flex justify-content-between align-items-center mb-3">
|
<div className="d-flex justify-content-between align-items-center mb-3">
|
||||||
<Link to={'pacientes'}>
|
<button className="btn btn-success me-2" onClick={() => Voltar()}>
|
||||||
<button className="btn btn-success me-2" >
|
|
||||||
<i className="bi bi-chevron-left"></i> Voltar
|
<i className="bi bi-chevron-left"></i> Voltar
|
||||||
</button>
|
</button>
|
||||||
</Link>
|
|
||||||
|
|
||||||
<div className="d-flex mb-3">
|
<div className="d-flex mb-3">
|
||||||
<div className="avatar avatar-xl">
|
<div className="avatar avatar-xl">
|
||||||
@ -197,10 +172,7 @@ const Details = () => {
|
|||||||
<label className="font-extrabold">Estado civil:</label>
|
<label className="font-extrabold">Estado civil:</label>
|
||||||
<p>{paciente.marital_status || "-"}</p>
|
<p>{paciente.marital_status || "-"}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-6 mb-3">
|
|
||||||
<label className="font-extrabold">Nome do esposo(a):</label>
|
|
||||||
<p>{paciente.nome_conjuge || "-"}</p>
|
|
||||||
</div>
|
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label className="font-extrabold">Identificador de outro sistema:</label>
|
<label className="font-extrabold">Identificador de outro sistema:</label>
|
||||||
<p>{paciente.legacy_code || "-"}</p>
|
<p>{paciente.legacy_code || "-"}</p>
|
||||||
@ -210,28 +182,18 @@ const Details = () => {
|
|||||||
<input className="form-check-input" type="checkbox" checked={paciente.rn_in_insurance} disabled/>
|
<input className="form-check-input" type="checkbox" checked={paciente.rn_in_insurance} disabled/>
|
||||||
<label className="font-extrabold">RN na Guia do convênio:</label>
|
<label className="font-extrabold">RN na Guia do convênio:</label>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="col-md-2 d-flex align-items-end mb-3">
|
||||||
|
<div className="form-check">
|
||||||
|
<input className="form-check-input" type="checkbox" checked={paciente.vip} disabled/>
|
||||||
|
<label className="font-extrabold">Paciente VIP: </label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-6 mb-3">
|
<div className="col-md-6 mb-3">
|
||||||
<label className="font-extrabold">Observações:</label>
|
<label className="font-extrabold">Observações:</label>
|
||||||
<p>{paciente.notes || "-"}</p>
|
<p>{paciente.notes || "-"}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="col-md-6 mb-3">
|
|
||||||
<label className="font-extrabold">Anexos do Paciente:</label>
|
|
||||||
{anexos.length > 0 ?(
|
|
||||||
<ul>
|
|
||||||
{anexos.map((anexo) => (
|
|
||||||
<li key={anexo.id} className="d-flex aling-items-center">
|
|
||||||
<a href={anexo.url} target="-blank" rel="noopener noreferrer">
|
|
||||||
{anexo.nome}
|
|
||||||
</a>
|
|
||||||
<button className="btn btn-danger btn-sm" onclick={() => handleDelete(anexo.id)} >Remover</button>
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
) : (
|
|
||||||
<p>-</p>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -260,42 +222,6 @@ const Details = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* ------------------ INFORMAÇÕES DE CONVÊNIO ------------------ */}
|
|
||||||
<div className="card p-3 shadow-sm">
|
|
||||||
<h5>Informações de Convênio</h5>
|
|
||||||
<hr />
|
|
||||||
<div className="row">
|
|
||||||
<div className="col-md-6 mb-3">
|
|
||||||
<label className="font-extrabold">Convênio:</label>
|
|
||||||
<p>{paciente.convenio || "-"}</p>
|
|
||||||
</div>
|
|
||||||
<div className="col-md-6 mb-3">
|
|
||||||
<label className="font-extrabold">Plano:</label>
|
|
||||||
<p>{paciente.plano || "-"}</p>
|
|
||||||
</div>
|
|
||||||
<div className="col-md-6 mb-3">
|
|
||||||
<label className="font-extrabold">Nº de matrícula:</label>
|
|
||||||
<p>{paciente.numeroMatricula || "-"}</p>
|
|
||||||
</div>
|
|
||||||
<div className="col-md-3 mb-3">
|
|
||||||
<label className="font-extrabold">Validade da Carteira:</label>
|
|
||||||
<p>{paciente.validadeCarteira || "-"}</p>
|
|
||||||
</div>
|
|
||||||
<div className="col-md-2 d-flex align-items-end mb-3">
|
|
||||||
<div className="form-check">
|
|
||||||
<input className="form-check-input" type="checkbox" checked={paciente.validadeIndeterminada} disabled/>
|
|
||||||
<label className="font-extrabold">Validade indeterminada:</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div className="col-md-2 d-flex align-items-end mb-3">
|
|
||||||
<div className="form-check">
|
|
||||||
<input className="form-check-input" type="checkbox" checked={paciente.vip} disabled/>
|
|
||||||
<label className="font-extrabold">Paciente VIP: </label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* ------------------ ENDEREÇO ------------------ */}
|
{/* ------------------ ENDEREÇO ------------------ */}
|
||||||
<div className="card p-3 shadow-sm">
|
<div className="card p-3 shadow-sm">
|
||||||
<h5>Endereço</h5>
|
<h5>Endereço</h5>
|
||||||
|
|||||||
@ -55,24 +55,7 @@ function DoctorCadastroManager( ) {
|
|||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{/* Modal de feedback */}
|
{/* Modal de feedback */}
|
||||||
{showModal && (
|
|
||||||
<div className="modal fade show" style={{ display: 'block' }} tabIndex="-1">
|
|
||||||
<div className="modal-dialog modal-dialog-centered">
|
|
||||||
<div className="modal-content">
|
|
||||||
<div className="modal-header">
|
|
||||||
<h5 className="modal-title">Sucesso</h5>
|
|
||||||
<button type="button" className="btn-close" onClick={() => setShowModal(false)}></button>
|
|
||||||
</div>
|
|
||||||
<div className="modal-body">
|
|
||||||
<p>{modalMsg}</p>
|
|
||||||
</div>
|
|
||||||
<div className="modal-footer">
|
|
||||||
<button type="button" className="btn btn-primary" onClick={() => setShowModal(false)}>Fechar</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<div className="page-heading">
|
<div className="page-heading">
|
||||||
<h3>Cadastro de Médicos</h3>
|
<h3>Cadastro de Médicos</h3>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,13 +1,20 @@
|
|||||||
import React, { useEffect, useState } from "react";
|
import React, { useEffect, useState } from "react";
|
||||||
import avatarPlaceholder from '../assets/images/avatar_placeholder.png';
|
import avatarPlaceholder from '../assets/images/avatar_placeholder.png';
|
||||||
import { useParams,Link } from "react-router-dom";
|
import { useParams,Link, useNavigate, useLocation } from "react-router-dom";
|
||||||
import { GetDoctorByID } from "../components/utils/Functions-Endpoints/Doctor";
|
import { GetDoctorByID } from "../components/utils/Functions-Endpoints/Doctor";
|
||||||
import { useAuth } from "../components/utils/AuthProvider";
|
import { useAuth } from "../components/utils/AuthProvider";
|
||||||
|
|
||||||
const Details = ({setCurrentPage }) => {
|
const Details = () => {
|
||||||
const {getAuthorizationHeader, isAuthenticated} = useAuth();
|
const {getAuthorizationHeader} = useAuth();
|
||||||
const [doctor, setDoctor] = useState({});
|
const [doctor, setDoctor] = useState({});
|
||||||
const Parametros = useParams()
|
const Parametros = useParams()
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const location = useLocation();
|
||||||
|
|
||||||
|
const Voltar = () => {
|
||||||
|
const prefixo = location.pathname.split("/")[1];
|
||||||
|
navigate(`/${prefixo}/medicos`);
|
||||||
|
}
|
||||||
|
|
||||||
const doctorID = Parametros.id
|
const doctorID = Parametros.id
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -34,11 +41,10 @@ const Details = ({setCurrentPage }) => {
|
|||||||
<h3 className="mb-3 text-center">MediConnect</h3>
|
<h3 className="mb-3 text-center">MediConnect</h3>
|
||||||
<hr />
|
<hr />
|
||||||
<div className="d-flex justify-content-between align-items-center mb-3">
|
<div className="d-flex justify-content-between align-items-center mb-3">
|
||||||
<Link to={'/medicos'}>
|
<button className="btn btn-success me-2" onClick={() => Voltar()}>
|
||||||
<button className="btn btn-success me-2" >
|
|
||||||
<i className="bi bi-chevron-left"></i> Voltar
|
<i className="bi bi-chevron-left"></i> Voltar
|
||||||
</button>
|
</button>
|
||||||
</Link>
|
|
||||||
<div className="d-flex mb-3">
|
<div className="d-flex mb-3">
|
||||||
<div className="avatar avatar-xl">
|
<div className="avatar avatar-xl">
|
||||||
<img src={avatarPlaceholder} alt="" />
|
<img src={avatarPlaceholder} alt="" />
|
||||||
@ -48,7 +54,7 @@ const Details = ({setCurrentPage }) => {
|
|||||||
<p>{doctor.cpf || "CPF"}</p>
|
<p>{doctor.cpf || "CPF"}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<Link to={`/medicos/${doctor.id}/edit`}>
|
<Link to={`edit`}>
|
||||||
<button className="btn btn-light" onClick={() => {console.log(doctor.id)}} >
|
<button className="btn btn-light" onClick={() => {console.log(doctor.id)}} >
|
||||||
<i className="bi bi-pencil-square"></i> Editar
|
<i className="bi bi-pencil-square"></i> Editar
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@ -50,11 +50,6 @@ const authHeader = getAuthorizationHeader()
|
|||||||
try {
|
try {
|
||||||
const response = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctors?id=eq.${DoctorID}`,requestOptions);
|
const response = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctors?id=eq.${DoctorID}`,requestOptions);
|
||||||
|
|
||||||
// se o backend retorna JSON
|
|
||||||
const result = await response.json();
|
|
||||||
console.log("ATUALIZADO COM SUCESSO", result);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Erro ao atualizar paciente:", error);
|
console.error("Erro ao atualizar paciente:", error);
|
||||||
throw error;
|
throw error;
|
||||||
|
|||||||
@ -75,6 +75,8 @@ function TableDoctor({ setCurrentPage, setPatientID }) {
|
|||||||
.catch(error => console.log('error', error));
|
.catch(error => console.log('error', error));
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Filtrar médicos pelo campo de pesquisa e aniversariantes
|
// Filtrar médicos pelo campo de pesquisa e aniversariantes
|
||||||
const medicosFiltrados = medicos.filter(
|
const medicosFiltrados = medicos.filter(
|
||||||
(medico) =>
|
(medico) =>
|
||||||
|
|||||||
@ -53,11 +53,11 @@ const HandlePutPatient = async () => {
|
|||||||
try {
|
try {
|
||||||
const response = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients?id=eq.${PatientID}`,requestOptions);
|
const response = await fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients?id=eq.${PatientID}`,requestOptions);
|
||||||
|
|
||||||
// se o backend retorna JSON
|
|
||||||
console.log("Resposta do servidor:", response.ok);
|
|
||||||
if(response.ok === false){
|
if(response.ok === false){
|
||||||
const errorText = await response.text();
|
|
||||||
console.error("Erro ao atualizar paciente:", errorText);
|
console.error("Erro ao atualizar paciente:");
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
|
||||||
|
|||||||
@ -37,8 +37,6 @@ function PatientCadastroManager( {} ) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// 23505 - cpf duplicadoo
|
|
||||||
// 23514 - cpf invalido
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients", requestOptions);
|
const response = await fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/patients", requestOptions);
|
||||||
console.log(response.ok, 'aqui')
|
console.log(response.ok, 'aqui')
|
||||||
@ -55,7 +53,7 @@ function PatientCadastroManager( {} ) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
console.log("ATUALIZADO COM SUCESSO");
|
console.log("Salvo com sucesso");
|
||||||
navigate('/pacientes')
|
navigate('/pacientes')
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@ -132,12 +132,10 @@ function TablePaciente({ setCurrentPage, setPatientID }) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const pacientesFiltrados = pacientes.filter((paciente) => {
|
const pacientesFiltrados = pacientes.filter((paciente) => {
|
||||||
const texto = `${paciente.nome}`.toLowerCase();
|
const textoCompletoPaciente = `${paciente.nome} ${paciente.cpf} ${paciente.email} ${paciente.telefone}`.toLowerCase();
|
||||||
|
const passaBusca = textoCompletoPaciente.includes(search.toLowerCase());
|
||||||
const passaBusca = texto.includes(search.toLowerCase());
|
|
||||||
const passaVIP = filtroVIP ? paciente.vip === true : true;
|
const passaVIP = filtroVIP ? paciente.vip === true : true;
|
||||||
const passaConvenio =
|
const passaConvenio = filtroConvenio === "Todos" || paciente.convenio === filtroConvenio;
|
||||||
filtroConvenio === "Todos" || paciente.convenio === filtroConvenio;
|
|
||||||
const passaAniversario = filtroAniversariante
|
const passaAniversario = filtroAniversariante
|
||||||
? ehAniversariante(paciente.data_nascimento)
|
? ehAniversariante(paciente.data_nascimento)
|
||||||
: true;
|
: true;
|
||||||
@ -145,6 +143,7 @@ function TablePaciente({ setCurrentPage, setPatientID }) {
|
|||||||
return passaBusca && passaVIP && passaConvenio && passaAniversario;
|
return passaBusca && passaVIP && passaConvenio && passaAniversario;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="page-heading">
|
<div className="page-heading">
|
||||||
|
|||||||
@ -22,7 +22,7 @@ function Perfiladm() {
|
|||||||
<Sidebar menuItems={admItems} />
|
<Sidebar menuItems={admItems} />
|
||||||
<div id="main">
|
<div id="main">
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<Inicio />} />
|
<Route path="/" element={<UserDashboard />} />
|
||||||
<Route path="/pacientes/cadastro" element={<PatientCadastroManager />} />
|
<Route path="/pacientes/cadastro" element={<PatientCadastroManager />} />
|
||||||
<Route path="/medicos/cadastro" element={<DoctorCadastroManager />} />
|
<Route path="/medicos/cadastro" element={<DoctorCadastroManager />} />
|
||||||
<Route path="/pacientes" element={<TablePaciente />} />
|
<Route path="/pacientes" element={<TablePaciente />} />
|
||||||
@ -33,7 +33,7 @@ function Perfiladm() {
|
|||||||
<Route path="/medicos/:id/edit" element={<DoctorEditPage />} />
|
<Route path="/medicos/:id/edit" element={<DoctorEditPage />} />
|
||||||
<Route path="/agendamento" element={<Agendamento />} />
|
<Route path="/agendamento" element={<Agendamento />} />
|
||||||
<Route path="/laudo" element={<LaudoManager />} />
|
<Route path="/laudo" element={<LaudoManager />} />
|
||||||
<Route path="/laudo" element={<LaudoManager />} />
|
|
||||||
<Route path="/gestao" element={<UserDashboard />} />
|
<Route path="/gestao" element={<UserDashboard />} />
|
||||||
<Route path="/painel" element={<PainelAdministrativo />} />
|
<Route path="/painel" element={<PainelAdministrativo />} />
|
||||||
<Route path="*" element={<h2>Página não encontrada</h2>} />
|
<Route path="*" element={<h2>Página não encontrada</h2>} />
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
|
import { Routes, Route } from "react-router-dom";
|
||||||
import Sidebar from "../../components/Sidebar";
|
import Sidebar from "../../components/Sidebar";
|
||||||
|
|
||||||
import Inicio from "../../pages/Inicio";
|
|
||||||
import LaudoManager from "../../pages/LaudoManager";
|
import LaudoManager from "../../pages/LaudoManager";
|
||||||
import Prontuario from "../../PagesMedico/prontuario";
|
import Prontuario from "../../PagesMedico/prontuario";
|
||||||
import Relatorio from "../../PagesMedico/relatorio";
|
import Relatorio from "../../PagesMedico/relatorio";
|
||||||
@ -17,7 +16,7 @@ function PerfilMedico() {
|
|||||||
<Sidebar menuItems={DoctorItems} />
|
<Sidebar menuItems={DoctorItems} />
|
||||||
<div id="main">
|
<div id="main">
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<Inicio />} />
|
<Route path="/" element={<LaudoManager />} />
|
||||||
<Route path="/laudo" element={<LaudoManager />} />
|
<Route path="/laudo" element={<LaudoManager />} />
|
||||||
<Route path="/prontuario" element={<Prontuario />} />
|
<Route path="/prontuario" element={<Prontuario />} />
|
||||||
<Route path="/relatorios" element={<Relatorio />} />
|
<Route path="/relatorios" element={<Relatorio />} />
|
||||||
|
|||||||
@ -2,11 +2,8 @@ import { Routes, Route } from "react-router-dom";
|
|||||||
import Sidebar from "../../components/Sidebar";
|
import Sidebar from "../../components/Sidebar";
|
||||||
import FinanceiroItems from "../../data/sidebar-items-financeiro.json";
|
import FinanceiroItems from "../../data/sidebar-items-financeiro.json";
|
||||||
import Inicio from "../../pages/Inicio";
|
import Inicio from "../../pages/Inicio";
|
||||||
import TablePaciente from "../../pages/TablePaciente";
|
|
||||||
import FinanceiroDashboard from "../../pages/FinanceiroDashboard";
|
import FinanceiroDashboard from "../../pages/FinanceiroDashboard";
|
||||||
import DoctorTable from "../../pages/DoctorTable";
|
|
||||||
import Details from "../../pages/Details";
|
|
||||||
import DoctorDetails from "../../pages/DoctorDetails";
|
|
||||||
|
|
||||||
function PerfilFinanceiro({ onLogout }) {
|
function PerfilFinanceiro({ onLogout }) {
|
||||||
return (
|
return (
|
||||||
@ -15,12 +12,9 @@ function PerfilFinanceiro({ onLogout }) {
|
|||||||
<div id="main">
|
<div id="main">
|
||||||
<Routes>
|
<Routes>
|
||||||
<Route path="/" element={<FinanceiroDashboard/>}/>
|
<Route path="/" element={<FinanceiroDashboard/>}/>
|
||||||
<Route path="inicio" element={<Inicio />} />
|
|
||||||
<Route path="controlefinanceiro" element={<FinanceiroDashboard/>}/>
|
<Route path="controlefinanceiro" element={<FinanceiroDashboard/>}/>
|
||||||
<Route path="pacientes" element={<TablePaciente />} />
|
|
||||||
<Route path="medicos" element={<DoctorTable />} />
|
|
||||||
<Route path="pacientes/:id" element={<Details />} />
|
|
||||||
<Route path="medicos/:id" element={<DoctorDetails />} />
|
|
||||||
<Route path="*" element={<h2>Página não encontrada</h2>} />
|
<Route path="*" element={<h2>Página não encontrada</h2>} />
|
||||||
</Routes>
|
</Routes>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user