diff --git a/src/PagesMedico/Agendamento.jsx b/src/PagesMedico/Agendamento.jsx index e0afc24..db3b20f 100644 --- a/src/PagesMedico/Agendamento.jsx +++ b/src/PagesMedico/Agendamento.jsx @@ -1,19 +1,27 @@ -import React, { useState, useMemo } from "react"; -import dayjs from "dayjs"; +import React, { useState, useMemo } from 'react'; -// Importe os componentes que você está usando -import TabelaAgendamentoDia from "../components/AgendarConsulta/TabelaAgendamentoDia"; -import TabelaAgendamentoSemana from "../components/AgendarConsulta/TabelaAgendamentoSemana"; -import TabelaAgendamentoMes from "../components/AgendarConsulta/TabelaAgendamentoMes"; -import FormNovaConsulta from "../components/AgendarConsulta/FormNovaConsulta"; +import TabelaAgendamentoDia from '../components/AgendarConsulta/TabelaAgendamentoDia'; +import TabelaAgendamentoSemana from '../components/AgendarConsulta/TabelaAgendamentoSemana'; +import TabelaAgendamentoMes from '../components/AgendarConsulta/TabelaAgendamentoMes'; +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 import "./styleMedico/Agendamento.css"; import "./styleMedico/FilaEspera.css"; -// --- DADOS E FUNÇÕES FORA DO COMPONENTE --- +const Agendamento = () => { -const filaEsperaData = [ + 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 = [ { 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: 'Lucas Martins', email: 'lucas.martins@gmail.com', cpf: '777.666.555-33', telefone: '(79) 99654-3210', entrada: '25/09/2025 às 09:00' }, @@ -22,188 +30,197 @@ const filaEsperaData = [ { nome: 'Fernanda Lima', email: 'fernanda.lima@gmail.com', cpf: '888.999.000-22', telefone: '(79) 98877-6655', entrada: '26/09/2025 às 09:30' }, { nome: 'Carlos Andrade', email: 'carlos.andrade@gmail.com', cpf: '222.555.888-11', telefone: '(79) 99876-5432', entrada: '26/09/2025 às 10:00' }, { 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) => { - const diasDaSemana = [[], [], [], [], [], [], []]; // 0: Domingo, 1: Segunda, ... - const base = dayjs(`${ano}-${mes}-01`); - const diasNoMes = base.daysInMonth(); + // Filtro da fila de espera (sem alteração) + const filteredFila = filaEsperaData.filter(item => + item.nome.toLowerCase().includes(searchTerm.toLowerCase()) || + item.email.toLowerCase().includes(searchTerm.toLowerCase()) || + item.cpf.includes(searchTerm) || + item.telefone.includes(searchTerm) + ); - 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); + // Lógica para filtrar os dados da AGENDA (AgendamentosMes) + const filteredAgendamentos = useMemo(() => { + if (!searchTerm.trim()) { + return AgendamentosMes; } - // 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 - ]; -}; + 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]); -// --- COMPONENTE PRINCIPAL --- + 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 Agendamento = () => { - const [FiladeEspera, setFiladeEspera] = useState(false); - const [tabela, setTabela] = useState('diario'); - const [PageNovaConsulta, setPageConsulta] = useState(false); - const [searchTerm, setSearchTerm] = useState(''); + const handleClickAgendamento = (agendamento) => { + if (agendamento.status !== 'vazio') return + else setPageConsulta(true) + } - const filteredFila = useMemo(() => - filaEsperaData.filter(item => - item.nome.toLowerCase().includes(searchTerm.toLowerCase()) || - item.email.toLowerCase().includes(searchTerm.toLowerCase()) || - item.cpf.includes(searchTerm) || - item.telefone.includes(searchTerm) - ), [searchTerm]); + const handleClickCancel = () => setPageConsulta(false) - const handleClickAgendamento = (agendamento) => { - if (agendamento.status !== 'vazio') return; - setPageConsulta(true); - }; + return ( +
+

Agendar nova consulta

- const handleClickCancel = () => setPageConsulta(false); + {!PageNovaConsulta ? ( +
+
+
+ + setSearchTerm(e.target.value)} + /> +
+
+ +
+
- return ( -
-

Agendar nova consulta

+
+ + +
- {!PageNovaConsulta ? ( -
- - {/* ✅ BARRA DE BUSCA E FILTRO FOI MOVIDA PARA DENTRO DO CALENDÁRIO */} +
+ + +
- {/* ✅ BARRA DE UNIDADE E PROFISSIONAL REMOVIDA (COMENTADA) */} - {/* -
- - -
- */} - - {/* Botões para alternar Agenda / Fila de Espera */} -
- - -
- -
- {!FiladeEspera ? ( -
-
-
-
- - - -
-
-
Realizado
-
Confirmado
-
Agendado
-
Cancelado
-
-
- - {/* ✅ BARRA DE BUSCA MOVIDA PARA CÁ */} -
-
- - -
-
- -
-
- - {tabela === "diario" && } - {tabela === 'semanal' && } - {tabela === 'mensal' && } -
-
- ) : ( -
-
- setSearchTerm(e.target.value)} - /> -

Fila de Espera

-
- - - - - - - - - - - - {filteredFila.map((item, index) => ( - - - - - - - - ))} - -
NomeEmailCPFTelefoneEntrou na fila de espera
{item.nome}{item.email}{item.cpf}{item.telefone}{item.entrada}
-
- )} + +
+
+
Realizado
+
Confirmado
+
Agendado
+
Cancelado
+
+ + {tabela === "diario" && } + {tabela === 'semanal' && } + {tabela === 'mensal' && } +
- ) : ( - - )} + ) + : + ( +
+
+ setSearchTerm(e.target.value)} + /> +

Fila de Espera

+
+ + + + + + + + + + + + {filteredFila.map((item, index) => ( + + + + + + + + ))} + +
NomeEmailCPFTelefoneEntrou na fila de espera
{item.nome}{item.email}{item.cpf}{item.telefone}{item.entrada}
+
+ ) + } +
- ); -}; + ) : ( + + )} + + ) +} export default Agendamento; \ No newline at end of file diff --git a/src/PagesMedico/Chat.jsx b/src/PagesMedico/Chat.jsx index 7ba817b..9d626e4 100644 --- a/src/PagesMedico/Chat.jsx +++ b/src/PagesMedico/Chat.jsx @@ -91,6 +91,7 @@ const App = () => { const [conversations, setConversations] = useState(conversationsData); const [activeConversationId, setActiveConversationId] = useState(1); const [newMessage, setNewMessage] = useState(''); + const [searchTerm, setSearchTerm] = useState(''); // ✅ 1. Estado para a busca const chatEndRef = useRef(null); const activeConversation = conversations.find(c => c.id === activeConversationId); @@ -134,6 +135,11 @@ const App = () => { setConversations(updatedConversations); }; + // ✅ 2. Lógica para filtrar as conversas + const filteredConversations = conversations.filter(conversation => + conversation.patientName.toLowerCase().includes(searchTerm.toLowerCase()) + ); + return (
{/* Barra Lateral de Conversas */} @@ -141,12 +147,20 @@ const App = () => {

Mensagens

- + {/* ✅ 3. Conecta o input ao estado e à função de atualização */} + setSearchTerm(e.target.value)} + />
- {conversations.map(convo => ( + {/* ✅ 4. Usa a lista filtrada para renderizar os itens */} + {filteredConversations.map(convo => ( { ) : (
-

Selecione uma conversa para começar.

+ {/* Adicionado uma verificação para quando a busca não encontra resultados */} + {searchTerm && filteredConversations.length === 0 ? ( +

Nenhum paciente encontrado com o nome "{searchTerm}".

+ ) : ( +

Selecione uma conversa para começar.

+ )}
)} @@ -200,5 +219,4 @@ const App = () => { ); }; -export default App; - +export default App; \ No newline at end of file diff --git a/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx b/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx index 5c0c0ef..da73a5a 100644 --- a/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx +++ b/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx @@ -1,48 +1,37 @@ -import React from 'react' -import CardConsulta from './CardConsulta' -import AgendamentosMes from './DadosConsultasMock' +import React from 'react'; +import CardConsulta from './CardConsulta'; import "./style/styleTabelas/tabeladia.css"; -const TabelaAgendamentoDia = ({handleClickAgendamento}) => { - let agendamentosDessaSemana = AgendamentosMes.semana1 - - let agendamentos = agendamentosDessaSemana.segunda - - console.log(agendamentos) +const TabelaAgendamentoDia = ({ handleClickAgendamento, agendamentos }) => { + const agendamentosDoDia = agendamentos?.semana1?.segunda || []; + const nomeMedico = agendamentosDoDia.find(item => item.medico)?.medico || 'Profissional'; return ( -
- - - - - - - +
+
{agendamentos.medico}
+ + + + + + - - - {agendamentos.map((agendamento) => ( - - - - - - ))} - - - -
Horário{}

{agendamento.horario}

- -
handleClickAgendamento(agendamento)} > - -
- -
-
- - ) + + {agendamentosDoDia.map((agendamento, index) => ( + +

{agendamento.horario}

+ +
handleClickAgendamento(agendamento)}> + +
+ + + ))} + + +
+ ); } -export default TabelaAgendamentoDia \ No newline at end of file +export default TabelaAgendamentoDia; \ No newline at end of file diff --git a/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx b/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx index 55d8cf9..7e40408 100644 --- a/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx +++ b/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx @@ -1,133 +1,139 @@ -import React from 'react' -import AgendamentosMes from './DadosConsultasMock' -import dayjs from "dayjs" -import CardConsulta from './CardConsulta' +import React from 'react'; + +import dayjs from "dayjs"; +import CardConsulta from './CardConsulta'; import "./style/styleTabelas/tabelames.css"; -const TabelaAgendamentoMes = ({ListarDiasdoMes}) => { +const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos }) => { - const dataHoje = dayjs() - const AnoAtual = dataHoje.year() - const mes = dataHoje.month() + 1 + const dataHoje = dayjs(); + const AnoAtual = dataHoje.year(); + const mes = dataHoje.month() + 1; - let ListaDiasDatas = ListarDiasdoMes(AnoAtual, mes) + let ListaDiasDatas = ListarDiasdoMes(AnoAtual, mes); let segundas = ListaDiasDatas[0]; let tercas = ListaDiasDatas[1]; let quartas = ListaDiasDatas[2]; let quintas = ListaDiasDatas[3]; - let sextas = ListaDiasDatas[4] + let sextas = ListaDiasDatas[4]; - console.log(AnoAtual, 'ano', mes, 'mes') - return (
- - - - - - - - - {Object.entries(AgendamentosMes).map(([semanas, dias], index) => ( - - - - - - - - - - + + + + + + + - ))} + + + {agendamentos && Object.entries(agendamentos).map(([semana, dias], index) => ( + + {/* Coluna de Segunda-feira */} + + + {/* Coluna de Terça-feira */} + + + {/* Coluna de Quarta-feira */} + + + {/* Coluna de Quinta-feira */} + + + {/* Coluna de Sexta-feira */} + + + ))} +
SegTerQuaQuiSex
-
-

{segundas[index]}

-
- {dias.segunda.slice(0,4).map((consulta, idx) => ( - - ))} -
- {dias.segunda.length > 3 ? -

+ {dias.segunda.length - 3}

- : null} -
-
-
- {tercas[index]} -
- {dias.terca.slice(0,4).map((consulta, idx) => ( - - ))} -
- {dias.terca.length > 3 ? -

+ {dias.terca.length - 3}

- : null} -
-
-
- {quartas[index]} -
- {dias.quarta.slice(0,4).map((consulta, idx) => ( - - ))} -
- {dias.quarta.length > 3 ? -

+ {dias.quarta.length - 3}

- : null} -
-
-
- {quintas[index]} -
- {dias.quinta.slice(0,4).map((consulta, idx) => ( - - ))} -
- {dias.quinta.length > 3 ? -

+ {dias.quinta.length - 3}

- : null} -
-
-
- {sextas[index]} -
- {dias.sexta.slice(0,4).map((consulta, idx) => ( - - ))} -
- {dias.sexta.length > 3 ? -

+ {dias.sexta.length - 3}

- : null} -
-
SegTerQuaQuiSex
+
+

{segundas[index]}

+
+ {(dias.segunda || []).slice(0, 3).map((consulta, idx) => ( + + ))} +
+ {(dias.segunda || []).length > 3 ? +

+ {(dias.segunda || []).length - 3}

+ : null} +
+
+
+

{tercas[index]}

+
+ {(dias.terca || []).slice(0, 3).map((consulta, idx) => ( + + ))} +
+ {(dias.terca || []).length > 3 ? +

+ {(dias.terca || []).length - 3}

+ : null} +
+
+
+

{quartas[index]}

+
+ {(dias.quarta || []).slice(0, 3).map((consulta, idx) => ( + + ))} +
+ {(dias.quarta || []).length > 3 ? +

+ {(dias.quarta || []).length - 3}

+ : null} +
+
+
+

{quintas[index]}

+
+ {(dias.quinta || []).slice(0, 3).map((consulta, idx) => ( + + ))} +
+ {(dias.quinta || []).length > 3 ? +

+ {(dias.quinta || []).length - 3}

+ : null} +
+
+
+

{sextas[index]}

+
+ {(dias.sexta || []).slice(0, 3).map((consulta, idx) => ( + + ))} +
+ {(dias.sexta || []).length > 3 ? +

+ {(dias.sexta || []).length - 3}

+ : null} +
+
) } -export default TabelaAgendamentoMes +export default TabelaAgendamentoMes; \ No newline at end of file diff --git a/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx b/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx index 386864f..3f3c2b6 100644 --- a/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx +++ b/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx @@ -1,54 +1,69 @@ -import React from 'react' - -import AgendamentosMes from './DadosConsultasMock' -import CardConsulta from './CardConsulta' +import React from 'react'; +import CardConsulta from './CardConsulta'; import "./style/styleTabelas/tabelasemana.css"; -const TabelaAgendamentoSemana = () => { - let AgendamentosDesseMes = AgendamentosMes +const TabelaAgendamentoSemana = ({ agendamentos }) => { - let AgendamentoSemana = AgendamentosDesseMes.semana1 + + const agendamentoSemana = agendamentos?.semana1 || {}; + + const agendamentosDeSegunda = agendamentoSemana.segunda || []; + const agendamentosDeTerca = agendamentoSemana.terca || []; + const agendamentosDeQuarta = agendamentoSemana.quarta || []; + const agendamentosDeQuinta = agendamentoSemana.quinta || []; + const agendamentosDeSexta = agendamentoSemana.sexta || []; - let AgendamentosdeSegunda = AgendamentoSemana.segunda - let AgendamentosdeTerca = AgendamentoSemana.terca - let AgendamentosdeQuarta = AgendamentoSemana.quarta - let AgendamentosdeQuinta = AgendamentoSemana.quinta - let AgendamentosdeSexta = AgendamentoSemana.sexta - + + const numLinhas = Math.max( + agendamentosDeSegunda.length, + agendamentosDeTerca.length, + agendamentosDeQuarta.length, + agendamentosDeQuinta.length, + agendamentosDeSexta.length + ); return ( -
+
+ + + + + + + + + + + + + {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]; -
HorárioSegundaTerçaQuartaQuintaSexta
- - - - - - - - - - - {AgendamentosdeSegunda.map((consulta, index) => ( - - - - - - - - - - ))} - - -
SegundaTerçaQuartaQuintaSexta
{consulta.horario}
+ + const horarioDaLinha = consultaSeg?.horario || consultaTer?.horario || consultaQua?.horario || consultaQui?.horario || consultaSex?.horario; + return ( + + {horarioDaLinha} + {consultaSeg && } + {consultaTer && } + {consultaQua && } + {consultaQui && } + {consultaSex && } + + ); + })} + +
- ) + ); } -export default TabelaAgendamentoSemana \ No newline at end of file +export default TabelaAgendamentoSemana; \ No newline at end of file diff --git a/src/components/AgendarConsulta/style/styleTabelas/tabelasemana.css b/src/components/AgendarConsulta/style/styleTabelas/tabelasemana.css index 70cdeef..d5b9146 100644 --- a/src/components/AgendarConsulta/style/styleTabelas/tabelasemana.css +++ b/src/components/AgendarConsulta/style/styleTabelas/tabelasemana.css @@ -15,13 +15,11 @@ border: 1px solid #e0e0e0; } -/* Cabeçalho da semanal */ +/* Estilo aplicado APENAS às células do cabeçalho da tabela */ .tabelasemanal thead th, -.tabelasemanal thead td, -.tabelasemanal tr:first-child th, -.tabelasemanal tr:first-child td { - background-color: #0078d7 !important; - color: #ffffff !important; +.tabelasemanal thead td { + background-color: #0078d7; + color: #ffffff; font-weight: 600; text-align: center; border-bottom: 2px solid #005a9e; diff --git a/src/components/doctors/DoctorForm.jsx b/src/components/doctors/DoctorForm.jsx index 7e3681c..2b193ad 100644 --- a/src/components/doctors/DoctorForm.jsx +++ b/src/components/doctors/DoctorForm.jsx @@ -1,49 +1,37 @@ import React, { useState } from 'react'; -import {Link} from 'react-router-dom' +import { Link } from 'react-router-dom'; function DoctorForm({ onSave, onCancel, formData, setFormData }) { const FormatTelefones = (valor) => { - - const digits = String(valor).replace(/\D/g, '').slice(0, 11); - - - return digits - .replace(/(\d)/, '($1') // 123 -> 123. - .replace(/(\d{2})(\d)/, '$1) $2' ) - .replace(/(\d)(\d{4})/, '$1 $2') - .replace(/(\d{4})(\d{4})/, '$1-$2') - } - + const digits = String(valor).replace(/\D/g, '').slice(0, 11); + return digits + .replace(/(\d)/, '($1') + .replace(/(\d{2})(\d)/, '$1) $2') + .replace(/(\d)(\d{4})/, '$1 $2') + .replace(/(\d{4})(\d{4})/, '$1-$2'); + }; 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 + .replace(/(\d{3})(\d)/, '$1.$2') + .replace(/(\d{3})(\d)/, '$1.$2') + .replace(/(\d{3})(\d{1,2})$/, '$1-$2'); + }; - - - return digits - .replace(/(\d{3})(\d)/, '$1.$2') // 123 -> 123. - .replace(/(\d{3})(\d)/, '$1.$2') // 123.456 -> 123.456. - .replace(/(\d{3})(\d{1,2})$/, '$1-$2'); // 123.456.789 -> 123.456.789-01 - - } - - - // Estado para armazenar a URL da foto do avatar 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({ - dadosPessoais: true, // Alterado para true para a seção ficar aberta por padrão + dadosPessoais: true, infoMedicas: false, infoConvenio: false, endereco: false, contato: false, }); - // Função para alternar o estado de colapso de uma seção const handleToggleCollapse = (section) => { setCollapsedSections(prevState => ({ ...prevState, @@ -53,15 +41,12 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) { const handleChange = (e) => { const { name, value, type, checked, files } = e.target; - - console.log(name, value) if (type === 'checkbox') { setFormData({ ...formData, [name]: checked }); } else if (type === 'file') { setFormData({ ...formData, [name]: files[0] }); - // Lógica para pré-visualizar a imagem no avatar if (name === 'foto' && files[0]) { const reader = new FileReader(); reader.onloadend = () => { @@ -69,26 +54,25 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) { }; reader.readAsDataURL(files[0]); } else if (name === 'foto' && !files[0]) { - setAvatarUrl(null); // Limpa o avatar se nenhum arquivo for selecionado + setAvatarUrl(null); } - } - - if (name.includes('cpf')) { + } else if (name.includes('cpf')) { let cpfFormatado = FormatCPF(value); setFormData(prev => ({ ...prev, [name]: cpfFormatado })); } else if (name.includes('telefone')) { let telefoneFormatado = FormatTelefones(value); setFormData(prev => ({ ...prev, [name]: telefoneFormatado })); - }else { + } else { setFormData({ ...formData, [name]: value }); } }; - // Função para buscar endereço pelo CEP + // Modal const [showModal, setShowModal] = useState(false); const [modalMsg, setModalMsg] = useState(''); + // Buscar endereço via CEP const handleCepBlur = async () => { const cep = formData.cep.replace(/\D/g, ''); if (cep.length === 8) { @@ -114,256 +98,334 @@ function DoctorForm({ onSave, onCancel, formData, setFormData }) { } }; + // Salvar médico const handleSubmit = () => { - if (!formData.full_name || !formData.cpf || !formData.birth_date ) { - setModalMsg('Por favor, preencha: Nome, CPF, Data de Nascimento.'); + if (!formData.full_name || !formData.cpf || !formData.birth_date) { + setModalMsg("Por favor, preencha:\n- Nome\n- CPF\n- Data de Nascimento"); setShowModal(true); - - + return; // impede que continue } - onSave( - { - ...formData - } - - ); - setModalMsg('Médico salvo com sucesso!'); + onSave({ ...formData }); + + setModalMsg("Médico salvo com sucesso!"); setShowModal(true); }; - return ( <> - {/* Modal de feedback */} + {/* Modal */} {showModal && ( -
-
-
-
-
Atenção
- -
-
-

{modalMsg}

-
-
- -
-
-
-
- )} -
-

MediConnect

- - {/* DADOS PESSOAIS */} -
-

handleToggleCollapse('dadosPessoais')} style={{ fontSize: '1.8rem' }}> - Dados Pessoais - - {collapsedSections.dadosPessoais ? '▲' : '▼'} - -

-
-
- {/* AVATAR E INPUT DE FOTO */} -
-
- {avatarUrl ? ( - Avatar do Médico - ) : ( -
- ☤ -
- )} -
-
- - - {formData.foto && {formData.foto.name}} -
-
- {/* CADASTRO */} -
- - -
-
- - -
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
-
-
- - {/* ENDEREÇO */} -
-

handleToggleCollapse('endereco')} style={{ fontSize: '1.8rem' }}> - Endereço - - {collapsedSections.endereco ? '▲' : '▼'} - -

-
-
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
-
- - {/* CONTATO */} -
-

handleToggleCollapse('contato')} style={{ fontSize: '1.8rem' }}> - Contato - - {collapsedSections.contato ? '▲' : '▼'} - -

-
-
-
- - -
-
- - -
-
- - -
- -
-
-
- - {/* Botões */} -
- - - -
+ {/* Body */} +
+

+ {modalMsg} +

+
+ + {/* Footer */} +
+ +
+
+)} + + + +
+

MediConnect

+ + {/* DADOS PESSOAIS */} +
+

handleToggleCollapse('dadosPessoais')} + style={{ fontSize: '1.8rem' }}> + Dados Pessoais + + {collapsedSections.dadosPessoais ? '▲' : '▼'} + +

+
+
+ {/* Avatar */} +
+
+ {avatarUrl ? ( + Avatar do Médico + ) : ( +
+ ☤ +
+ )} +
+
+ + + {formData.foto && {formData.foto.name}} +
+
+ + {/* Inputs */} +
+ + +
+
+ + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+ + {/* ENDEREÇO */} +
+

handleToggleCollapse('endereco')} + style={{ fontSize: '1.8rem' }}> + Endereço + + {collapsedSections.endereco ? '▲' : '▼'} + +

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + {/* CONTATO */} +
+

handleToggleCollapse('contato')} + style={{ fontSize: '1.8rem' }}> + Contato + + {collapsedSections.contato ? '▲' : '▼'} + +

+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + {/* BOTÕES */} +
+ + + + +
+
); } diff --git a/src/components/patients/PatientForm.jsx b/src/components/patients/PatientForm.jsx index fc76e97..eacf08f 100644 --- a/src/components/patients/PatientForm.jsx +++ b/src/components/patients/PatientForm.jsx @@ -507,28 +507,7 @@ function PatientForm({ onSave, onCancel, formData, setFormData }) {
)} - {showModal404 && ( -
-
-
-
-
Atenção
- -
-
-

{errorModalMsg || '(Erro 404).Por favor, tente novamente mais tarde'}

-
-
- - - -
-
-
-
- )} + ); } diff --git a/src/pages/Agendamento.jsx b/src/pages/Agendamento.jsx index cbecf75..d693cfe 100644 --- a/src/pages/Agendamento.jsx +++ b/src/pages/Agendamento.jsx @@ -1,22 +1,25 @@ -import React, { useState } from 'react' +import React, { useState, useMemo } from 'react'; import TabelaAgendamentoDia from '../components/AgendarConsulta/TabelaAgendamentoDia'; import TabelaAgendamentoSemana from '../components/AgendarConsulta/TabelaAgendamentoSemana'; import TabelaAgendamentoMes from '../components/AgendarConsulta/TabelaAgendamentoMes'; 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/FilaEspera.css'; const Agendamento = () => { - const [FiladeEspera, setFiladeEspera] = useState(false) - const [tabela, setTabela] = useState('diario') - const [PageNovaConsulta, setPageConsulta] = useState(false) - const [searchTerm, setSearchTerm] = useState('') // 🔹 Estado da busca + const [FiladeEspera, setFiladeEspera] = useState(false); + const [tabela, setTabela] = useState('diario'); + const [PageNovaConsulta, setPageConsulta] = useState(false); + const [searchTerm, setSearchTerm] = useState(''); - // 🔹 Dados da fila de espera + // Dados da fila de espera (sem alteração) 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: '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' }, ]; - // 🔹 Filtra a fila de espera com base no searchTerm + // Filtro da fila de espera (sem alteração) const filteredFila = filaEsperaData.filter(item => item.nome.toLowerCase().includes(searchTerm.toLowerCase()) || item.email.toLowerCase().includes(searchTerm.toLowerCase()) || @@ -36,16 +39,34 @@ const Agendamento = () => { 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) => { 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 @@ -55,7 +76,6 @@ const Agendamento = () => { default: break } } - let ListaDiasDatas = [segundas, tercas, quartas, quintas, sextas] return ListaDiasDatas } @@ -72,16 +92,17 @@ const Agendamento = () => {

Agendar nova consulta

{!PageNovaConsulta ? ( -
- - {/* 🔍 Busca e filtro */}
- + setSearchTerm(e.target.value)} + />
-
@@ -100,22 +120,25 @@ const Agendamento = () => { -
- {/* Botões para alternar Agenda / Fila de Espera */}
- @@ -128,63 +151,43 @@ const Agendamento = () => {
- - - - -
-
Realizado
Confirmado
Agendado
Cancelado
-
- - {tabela === "diario" && } - {tabela === 'semanal' && } - {tabela === 'mensal' && } + + {tabela === "diario" && } + {tabela === 'semanal' && } + {tabela === 'mensal' && }
) : (
-
- setSearchTerm(e.target.value)} - /> - -

Fila de Espera

-
- - - +
+ setSearchTerm(e.target.value)} + /> +

Fila de Espera

+
@@ -212,7 +215,6 @@ const Agendamento = () => { } - ) : ( )} @@ -220,4 +222,4 @@ const Agendamento = () => { ) } -export default Agendamento \ No newline at end of file +export default Agendamento; \ No newline at end of file diff --git a/src/pages/DoctorCadastroManager.jsx b/src/pages/DoctorCadastroManager.jsx index 4b29732..0af6c44 100644 --- a/src/pages/DoctorCadastroManager.jsx +++ b/src/pages/DoctorCadastroManager.jsx @@ -55,24 +55,7 @@ function DoctorCadastroManager( ) { return ( <> {/* Modal de feedback */} - {showModal && ( -
-
-
-
-
Sucesso
- -
-
-

{modalMsg}

-
-
- -
-
-
-
- )} +

Cadastro de Médicos

diff --git a/src/pages/DoctorTable.jsx b/src/pages/DoctorTable.jsx index 16b49f6..14daabc 100644 --- a/src/pages/DoctorTable.jsx +++ b/src/pages/DoctorTable.jsx @@ -75,6 +75,8 @@ function TableDoctor({ setCurrentPage, setPatientID }) { .catch(error => console.log('error', error)); }, []); + + // Filtrar médicos pelo campo de pesquisa e aniversariantes const medicosFiltrados = medicos.filter( (medico) => diff --git a/src/pages/TablePaciente.jsx b/src/pages/TablePaciente.jsx index 5259792..2adfad1 100644 --- a/src/pages/TablePaciente.jsx +++ b/src/pages/TablePaciente.jsx @@ -131,20 +131,19 @@ function TablePaciente({ setCurrentPage, setPatientID }) { ); }; - const pacientesFiltrados = pacientes.filter((paciente) => { - const texto = `${paciente.nome}`.toLowerCase(); +const pacientesFiltrados = pacientes.filter((paciente) => { + const textoCompletoPaciente = `${paciente.nome} ${paciente.cpf} ${paciente.email} ${paciente.telefone}`.toLowerCase(); + const passaBusca = textoCompletoPaciente.includes(search.toLowerCase()); + const passaVIP = filtroVIP ? paciente.vip === true : true; + const passaConvenio = filtroConvenio === "Todos" || paciente.convenio === filtroConvenio; + const passaAniversario = filtroAniversariante + ? ehAniversariante(paciente.data_nascimento) + : true; - const passaBusca = texto.includes(search.toLowerCase()); - const passaVIP = filtroVIP ? paciente.vip === true : true; - const passaConvenio = - filtroConvenio === "Todos" || paciente.convenio === filtroConvenio; - const passaAniversario = filtroAniversariante - ? ehAniversariante(paciente.data_nascimento) - : true; - - return passaBusca && passaVIP && passaConvenio && passaAniversario; - }); + return passaBusca && passaVIP && passaConvenio && passaAniversario; +}); + return ( <>