diff --git a/src/components/AgendarConsulta/CardConsulta.jsx b/src/components/AgendarConsulta/CardConsulta.jsx index a1f1eaf..f760ae1 100644 --- a/src/components/AgendarConsulta/CardConsulta.jsx +++ b/src/components/AgendarConsulta/CardConsulta.jsx @@ -4,7 +4,7 @@ import { useAuth } from '../utils/AuthProvider'; import { useNavigate } from 'react-router-dom'; import { useMemo } from 'react'; -const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal} ) => { +const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal, setDictInfo, setSelectedId} ) => { const navigate = useNavigate(); const {getAuthorizationHeader} = useAuth() @@ -45,6 +45,7 @@ const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal} ) let nameArrayMedico = Medico?.full_name.split(' ') + console.log(DadosConsulta.status) return (
@@ -67,9 +68,14 @@ const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal} )
@@ -78,11 +84,11 @@ const CardConsulta = ( {DadosConsulta, TabelaAgendamento, setShowDeleteModal} ) className="btn btn-sm btn-delete-custom" onClick={() => { console.log(DadosConsulta.id) - //setSelectedPatientId(DadosConsulta.id); + setSelectedId(DadosConsulta.id); setShowDeleteModal(true); }} > - Excluir +
diff --git a/src/components/AgendarConsulta/FormNovaConsulta.jsx b/src/components/AgendarConsulta/FormNovaConsulta.jsx index bdae91d..318a93a 100644 --- a/src/components/AgendarConsulta/FormNovaConsulta.jsx +++ b/src/components/AgendarConsulta/FormNovaConsulta.jsx @@ -2,32 +2,33 @@ import InputMask from "react-input-mask"; import "./style/formagendamentos.css"; import { useState, useEffect } from "react"; import { GetPatientByCPF } from "../utils/Functions-Endpoints/Patient"; -import { GetDoctorByName } from "../utils/Functions-Endpoints/Doctor"; +import { GetDoctorByName, GetAllDoctors } from "../utils/Functions-Endpoints/Doctor"; import { useAuth } from "../utils/AuthProvider"; +import API_KEY from "../utils/apiKeys"; const FormNovaConsulta = ({ onCancel, onSave, setAgendamento, agendamento }) => { const {getAuthorizationHeader} = useAuth() + console.log(agendamento, 'aqui2') + const [selectedFile, setSelectedFile] = useState(null); const [anexos, setAnexos] = useState([]); const [loadingAnexos, setLoadingAnexos] = useState(false); - - const [acessibilidade, setAcessibilidade] = useState({cadeirante:false,idoso:false,gravida:false,bebe:false, autista:false }) + +const [todosProfissionais, setTodosProfissionais] = useState([]) +const [profissionaisFiltrados, setProfissionaisFiltrados] = useState([]); +const [isDropdownOpen, setIsDropdownOpen] = useState(false); + + + const [horarioInicio, setHorarioInicio] = useState(''); + const [horarioTermino, setHorarioTermino] = useState(''); + + const [horariosDisponiveis, sethorariosDisponiveis] = useState([]) + let authHeader = getAuthorizationHeader() - - - const handleclickAcessibilidade = (id) => { - let resultado = acessibilidade[id] - - if(resultado === false){ setAcessibilidade({...acessibilidade, [id]:true}); console.log('mudou')} - - else if(resultado === true){ setAcessibilidade({...acessibilidade, [id]:false})} - console.log(id) - } - - + const FormatCPF = (valor) => { const digits = String(valor).replace(/\D/g, '').slice(0, 11); return digits @@ -39,15 +40,29 @@ const FormNovaConsulta = ({ onCancel, onSave, setAgendamento, agendamento }) => const handleChange = (e) => { - const {value, name} = e.target; + console.log(value, name, agendamento) + if(name === 'email'){ setAgendamento({...agendamento, contato:{ ...agendamento.contato, email:value - }}) - - }else if(name === 'cpf'){ + }})} + else if(name === 'status'){ + if(agendamento.status==='requested'){ + setAgendamento((prev) => ({ + ...prev, + status:'confirmed', + })); + }else if(agendamento.status === 'confirmed'){ + console.log(value) + setAgendamento((prev) => ({ + ...prev, + status:'requested', + })); + }} + + else if(name === 'paciente_cpf'){ let cpfFormatted = FormatCPF(value) const fetchPatient = async () => { @@ -55,7 +70,7 @@ const FormNovaConsulta = ({ onCancel, onSave, setAgendamento, agendamento }) => if (patientData) { setAgendamento((prev) => ({ ...prev, - nome: patientData.full_name, + pacinte_nome: patientData.full_name, patient_id: patientData.id })); }} @@ -63,28 +78,97 @@ const FormNovaConsulta = ({ onCancel, onSave, setAgendamento, agendamento }) => fetchPatient() }else if(name==='convenio'){ setAgendamento({...agendamento,insurance_provider:value}) - }else if(name ==='profissional'){ - - - const fetchDoctor = async () => { - let DoctorData = await GetDoctorByName(value, authHeader) - if(DoctorData){ - setAgendamento((prev) => ({ - ...prev, - doctor_id:DoctorData.id - })) - }} - fetchDoctor() } else{ setAgendamento({...agendamento,[name]:value}) } } - const handleSubmit = (e) => { + + + +useEffect(() => { + const ChamarMedicos = async () => { + const Medicos = await GetAllDoctors(authHeader) + setTodosProfissionais(Medicos) + } + ChamarMedicos(); + + var myHeaders = new Headers(); + myHeaders.append("Content-Type", "application/json"); + myHeaders.append("apikey", API_KEY) + myHeaders.append("Authorization", `Bearer ${authHeader.split(' ')[1]}`); + +var raw = JSON.stringify({ + "doctor_id": agendamento.doctor_id, + "start_date": agendamento.dataAtendimento, + "end_date": `${agendamento.dataAtendimento}T23:59:59.999Z`, + +}); + +var requestOptions = { + method: 'POST', + headers: myHeaders, + body: raw, + redirect: 'follow' +}; + +fetch("https://yuanqfswhberkoevtmfr.supabase.co/functions/v1/get-available-slots", requestOptions) + .then(response => response.json()) + .then(result => {console.log(result); sethorariosDisponiveis(result)}) + .catch(error => console.log('error', error)); + +}, [agendamento.dataAtendimento, agendamento.doctor_id]) + + +// FUNÇÃO DE BUSCA E FILTRAGEM +const handleSearchProfissional = (e) => { + const term = e.target.value; + handleChange(e); + // 2. Lógica de filtragem: + if (term.trim() === '') { + setProfissionaisFiltrados([]); + setIsDropdownOpen(false); + return; + } + // Adapte o nome da propriedade (ex: 'nome', 'full_name') + const filtered = todosProfissionais.filter(p => + p.full_name.toLowerCase().includes(term.toLowerCase()) + ); + + setProfissionaisFiltrados(filtered); + setIsDropdownOpen(filtered.length > 0); // Abre se houver resultados +}; + + +// FUNÇÃO PARA SELECIONAR UM ITEM DO DROPDOWN +const handleSelectProfissional = async (profissional) => { + setAgendamento(prev => ({ + ...prev, + doctor_id: profissional.id, + medico_nome: profissional.full_name + })); + // 2. Fecha o dropdown + setProfissionaisFiltrados([]); + setIsDropdownOpen(false); + }; + + +const formatarHora = (datetimeString) => { + return datetimeString.substring(11, 16); + }; + + const opcoesDeHorario = horariosDisponiveis?.slots?.map(item => ({ + + value: formatarHora(item.datetime), + label: formatarHora(item.datetime), + disabled: !item.available + })); + +const handleSubmit = (e) => { e.preventDefault(); alert("Agendamento salvo!"); - onSave(agendamento) + onSave({...agendamento, horarioInicio:horarioInicio}) }; return ( @@ -95,26 +179,21 @@ const FormNovaConsulta = ({ onCancel, onSave, setAgendamento, agendamento }) =>

Informações do paciente

+
- - -
- -
- - - + +
- - + +
+ + +
- - -
-
+
setSelectedFile(e.target.files[0])} - /> - {selectedFile && ( - - )} -
- {loadingAnexos ? ( -

Carregando anexos...

- ) : ( - anexos.map((anexo, index) => ( -
- {anexo.nome || anexo.fileName} -
- )) - )} -

Informações do atendimento

- -
- -
handleclickAcessibilidade(e.currentTarget.id)}> - - accessible -
- -
handleclickAcessibilidade(e.currentTarget.id)}> - elderly -
- -
handleclickAcessibilidade(e.currentTarget.id)}> - pregnant_woman -
- -
handleclickAcessibilidade(e.currentTarget.id)}> - - -
- -
handleclickAcessibilidade(e.currentTarget.id)}> - -
- -
-
- - -
- +
{/* NOVO CONTAINER PAI */} +
+ + +
-
+ {/* DROPDOWN - RENDERIZAÇÃO CONDICIONAL */} + {isDropdownOpen && profissionaisFiltrados.length > 0 && ( +
+ {profissionaisFiltrados.map((profissional) => ( +
handleSelectProfissional(profissional)} + > + {profissional.full_name} +
+ ))} +
+ )} +
+ +
- +
+ +
+ + +
@@ -211,30 +272,68 @@ const FormNovaConsulta = ({ onCancel, onSave, setAgendamento, agendamento }) =>
- +
-
-
- - -
-
- - -
- -
- - -
-
+
+
+ + +
+ +
+ +
+ + + + {/* Dropdown de Término */} +
+ + +
+
+ + +
diff --git a/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx b/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx index 5263229..2949ca6 100644 --- a/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx +++ b/src/components/AgendarConsulta/TabelaAgendamentoDia.jsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'; import CardConsulta from './CardConsulta'; import "./style/styleTabelas/tabeladia.css"; -const TabelaAgendamentoDia = ({ handleClickAgendamento, agendamentos, setShowDeleteModal }) => { +const TabelaAgendamentoDia = ({ handleClickAgendamento, agendamentos, setShowDeleteModal, setDictInfo, setSelectedId }) => { const [indiceAcesso, setIndiceAcesso] = useState(0) const [Dia, setDia] = useState() const agendamentosDoDia = agendamentos?.semana1?.segunda || []; @@ -24,7 +24,9 @@ const TabelaAgendamentoDia = ({ handleClickAgendamento, agendamentos, setShowDel
-

{Dia}

+ + +

{Dia ? `${Dia?.split('-')[2]}/${Dia?.split('-')[1]}/${Dia?.split('-')[0]}`: ''}

@@ -37,16 +39,21 @@ const TabelaAgendamentoDia = ({ handleClickAgendamento, agendamentos, setShowDel - {agendamentos[Dia]?.map((agendamento, index) => ( + {agendamentos[Dia]?.map((agendamento, index) => { + + let Data =agendamento.scheduled_at.split("T") + let horario = Data[1].split(':') + return( -

{agendamento.horario}

+ +

{`${horario[0]}:${horario[1]}`}

handleClickAgendamento(agendamento)}> - +
- ))} + )})}
diff --git a/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx b/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx index 26dcb31..92cbea7 100644 --- a/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx +++ b/src/components/AgendarConsulta/TabelaAgendamentoMes.jsx @@ -6,7 +6,7 @@ import "./style/styleTabelas/tabelames.css"; import { useEffect, useState } from 'react'; import { useMemo } from 'react'; -const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos }) => { +const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos, setShowDeleteModal, setSelectedId ,setDictInfo }) => { const dataHoje = dayjs(); const AnoAtual = dataHoje.year(); @@ -88,8 +88,6 @@ const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos }) => { useEffect(() => { console.log(OrganizarAgendamentosMensais) - - }, []) useEffect(() => { @@ -183,13 +181,13 @@ const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos }) => {
- + - - - - - + + + + + @@ -204,9 +202,9 @@ const TabelaAgendamentoMes = ({ ListarDiasdoMes, agendamentos }) => { { semana && typeof semana === "object" && Object.keys(semana).map((dia) => ( diff --git a/src/components/AgendarConsulta/style/formagendamentos.css b/src/components/AgendarConsulta/style/formagendamentos.css index f9ca9d7..b42fd96 100644 --- a/src/components/AgendarConsulta/style/formagendamentos.css +++ b/src/components/AgendarConsulta/style/formagendamentos.css @@ -303,4 +303,90 @@ html[data-bs-theme="dark"] .icons-div:hover .icon { html[data-bs-theme="dark"] .icon, html[data-bs-theme="dark"] svg { color: #e0e0e0 !important; +} + +/* CONTAINER PAI - ESSENCIAL PARA POSICIONAMENTO */ +.campo-de-input-container { + position: relative; /* Define o contexto para o dropdown */ + /* ... outros estilos de layout (display, margin, etc.) ... */ +} + +/* ESTILO DA LISTA DROPDOWN */ +.dropdown-profissionais { + position: absolute; /* Flutua em relação ao pai (.campo-de-input-container) */ + top: 100%; /* Começa logo abaixo do input */ + left: 0; + width: 100%; /* Ocupa toda a largura do container pai */ + + /* Estilos visuais */ + background-color: white; + border: 1px solid #ccc; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + z-index: 100; /* Alto z-index para garantir que fique acima de outros elementos */ + max-height: 200px; + overflow-y: auto; +} + +/* ESTILO DE CADA ITEM DO DROPDOWN */ +.dropdown-item { + padding: 10px; + cursor: pointer; +} + +.dropdown-item:hover { + background-color: #f0f0f0; +} + +.tipo_atendimento{ + margin-left: 3rem; + +} + + + +/* 1. Estilização Básica e Tamanho (Estado Padrão - Antes de Clicar) */ +.checkbox-customs { + /* Remove a aparência padrão do navegador/Bootstrap */ + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + + /* Define o tamanho desejado */ + width: 1.2rem; /* Ajuste conforme o seu gosto (ex: 1.2rem = 19.2px) */ + height: 1.2rem; + + /* Define o visual "branco com borda preta" */ + background-color: #fff; /* Fundo branco */ + border: 1px solid #000; /* Borda preta de 1px */ + border-radius: 0.25rem; /* Borda levemente arredondada (opcional, imita Bootstrap) */ + + /* Centraliza o 'check' (quando aparecer) */ + display: inline-block; + vertical-align: middle; + cursor: pointer; /* Indica que é clicável */ + + /* Adiciona a transição suave */ + transition: all 0.5s ease; /* Transição em 0.5 segundos para todas as propriedades */ +} + +/* 2. Estilização no Estado Clicado (:checked) */ +.checkbox-customs:checked { + /* Quando clicado, mantém o fundo branco (se quiser mudar, altere aqui) */ + background-color: #fff; + + /* Se você quiser que a borda mude de cor ao clicar, altere aqui. */ + /* border-color: #007bff; */ /* Exemplo: borda azul */ +} + +/* 3. Ocultar o 'Check' Padrão e Criar um Check Customizado */ +/* O Bootstrap/Navegador insere um ícone de 'check'. Vamos controlá-lo com background-image. */ +.checkbox-customs:checked { + /* Este código do Bootstrap usa um SVG para o ícone de 'check' */ + /* Aqui, estamos forçando o ícone de 'check' a ser preto para combinar com a borda preta. */ + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); + + /* Garante que o ícone fique centralizado e preencha o espaço */ + background-size: 100% 100%; + background-position: center; + background-repeat: no-repeat; } \ No newline at end of file diff --git a/src/components/AgendarConsulta/style/styleTabelas/tabelames.css b/src/components/AgendarConsulta/style/styleTabelas/tabelames.css index 99a3bd1..707823c 100644 --- a/src/components/AgendarConsulta/style/styleTabelas/tabelames.css +++ b/src/components/AgendarConsulta/style/styleTabelas/tabelames.css @@ -18,7 +18,7 @@ /* Cabeçalho */ .tabelamensal thead th { background-color: #0078d7; - color: #0078d7; + color: white; font-weight: 600; border-bottom: 2px solid #0078d7; /* borda inferior mais forte no cabeçalho */ } diff --git a/src/pages/Agendamento.jsx b/src/pages/Agendamento.jsx index 8be99ee..5d1e82c 100644 --- a/src/pages/Agendamento.jsx +++ b/src/pages/Agendamento.jsx @@ -6,8 +6,8 @@ import TabelaAgendamentoDia from '../components/AgendarConsulta/TabelaAgendament import TabelaAgendamentoSemana from '../components/AgendarConsulta/TabelaAgendamentoSemana'; import TabelaAgendamentoMes from '../components/AgendarConsulta/TabelaAgendamentoMes'; import FormNovaConsulta from '../components/AgendarConsulta/FormNovaConsulta'; - -import { GetAllDoctors } from '../components/utils/Functions-Endpoints/Doctor.js'; +import { GetPatientByID } from '../components/utils/Functions-Endpoints/Patient.js'; +import { GetAllDoctors, GetDoctorByID } from '../components/utils/Functions-Endpoints/Doctor.js'; import { useAuth } from '../components/utils/AuthProvider.js'; // ✨ NOVO: Caminho de importação corrigido com base na sua estrutura de pastas @@ -21,9 +21,11 @@ import { Search } from 'lucide-react'; -const Agendamento = () => { +const Agendamento = ({setDictInfo}) => { const navigate = useNavigate(); + const [selectedID, setSelectedId] = useState('0') + const [filaEsperaData, setfilaEsperaData] = useState([]) const [FiladeEspera, setFiladeEspera] = useState(false); const [tabela, setTabela] = useState('diario'); const [PageNovaConsulta, setPageConsulta] = useState(false); @@ -42,28 +44,78 @@ const Agendamento = () => { let authHeader = getAuthorizationHeader() - const FiltrarAgendamentos = (listaTodosAgendamentos) => { - let DictAgendamentosOrganizados = {}; + const FiltrarAgendamentos = async (listaTodosAgendamentos) => { + const ConfigurarFiladeEspera = async (patient_id, doctor_id, agendamento) => { + // Assumindo que GetDoctorByID e GetPatientByID estão definidos no seu escopo + let medico = await GetDoctorByID(doctor_id, authHeader); + let paciente = await GetPatientByID(patient_id, authHeader); - for (let i = 0; i < listaTodosAgendamentos.length; i++) { - const agendamento = listaTodosAgendamentos[i]; - const DiaAgendamento = agendamento.scheduled_at.split("T")[0]; + let dicionario = { + agendamento: agendamento, + Infos: { + nome_nedico: medico.full_name, + doctor_id: medico.id, + patient_id: paciente[0].id, + paciente_nome: paciente[0].full_name, + paciente_cpf: paciente[0].cpf + } + }; + return dicionario; + }; - //console.log(DictAgendamentosOrganizados) + let DictAgendamentosOrganizados = {}; + let ListaFilaDeEspera = []; - if (DiaAgendamento in DictAgendamentosOrganizados) { - // já existe a data → adiciona na lista - DictAgendamentosOrganizados[DiaAgendamento].push(agendamento); - } else { - // não existe → cria nova key com uma lista - DictAgendamentosOrganizados[DiaAgendamento] = [agendamento]; + // 1. Agrupamento (igual ao seu código original) + for (const agendamento of listaTodosAgendamentos) { + if (agendamento.status === 'requested') { + // Recomenda-se usar Promise.all para melhorar a performance + // mas, para manter a estrutura, mantemos o await no loop. + let v = await ConfigurarFiladeEspera(agendamento.patient_id, agendamento.doctor_id, agendamento); + ListaFilaDeEspera.push(v); + } else { + const DiaAgendamento = agendamento.scheduled_at.split("T")[0]; + + if (DiaAgendamento in DictAgendamentosOrganizados) { + DictAgendamentosOrganizados[DiaAgendamento].push(agendamento); + } else { + DictAgendamentosOrganizados[DiaAgendamento] = [agendamento]; + } + } } - } - - setAgendamentosOrganizados(DictAgendamentosOrganizados); +// ---------------------------------------------------------------------- + // 2. Ordenação Interna: Ordenar os agendamentos por HORÁRIO (do menor para o maior) + for (const DiaAgendamento in DictAgendamentosOrganizados) { + DictAgendamentosOrganizados[DiaAgendamento].sort((a, b) => { + // Compara as strings de data/hora (ISO 8601) diretamente, + // que funcionam para ordenação cronológica. + if (a.scheduled_at < b.scheduled_at) return -1; + if (a.scheduled_at > b.scheduled_at) return 1; + return 0; + }); + } - } +// ---------------------------------------------------------------------- + // 3. Ordenação Externa: Ordenar os DIAS (as chaves do objeto) + // Para garantir que as chaves fiquem na sequência cronológica correta. + + // Pega as chaves (datas) + const chavesOrdenadas = Object.keys(DictAgendamentosOrganizados).sort((a, b) => { + // Compara as chaves de data (strings 'YYYY-MM-DD') + if (a < b) return -1; + if (a > b) return 1; + return 0; + }); + + // Cria um novo objeto no formato desejado, garantindo a ordem das chaves + let DictAgendamentosFinal = {}; + for (const data of chavesOrdenadas) { + DictAgendamentosFinal[data] = DictAgendamentosOrganizados[data]; + } + setAgendamentosOrganizados(DictAgendamentosFinal); // Use o objeto final ordenado + setfilaEsperaData(ListaFilaDeEspera); +}; // Requisição inicial para mostrar os agendamentos do banco de dados useEffect(() => { @@ -86,7 +138,6 @@ const Agendamento = () => { let lista = [] const TodosOsMedicos = await GetAllDoctors(authHeader) - //console.log(TodosOsMedicos, "tentativa") for(let d = 0; TodosOsMedicos.length > d; d++){ lista.push({nomeMedico: TodosOsMedicos[d].full_name, idMedico: TodosOsMedicos[d].id })} setListaDeMedicos(lista) @@ -96,45 +147,43 @@ const Agendamento = () => { }, []) useEffect(() => { - - console.log("mudou FiltredTodosMedicos:", FiltredTodosMedicos); - - if (FiltredTodosMedicos.length === 1) { - + console.log("mudou FiltredTodosMedicos:", FiltredTodosMedicos); + if (FiltredTodosMedicos.length === 1) { const unicoMedico = FiltredTodosMedicos[0]; console.log(unicoMedico) - const idMedicoFiltrado = unicoMedico.idMedico; - console.log(`Médico único encontrado: ${unicoMedico.nomeMedico}. ID: ${idMedicoFiltrado}`); - - const agendamentosDoMedico = filtrarAgendamentosPorMedico( DictAgendamentosOrganizados, idMedicoFiltrado - ); - - // ========================================================================= - + ); console.log(`Total de agendamentos filtrados para este médico: ${agendamentosDoMedico.length}`); console.log("Lista completa de Agendamentos do Médico:", agendamentosDoMedico); FiltrarAgendamentos(agendamentosDoMedico) - - // AQUI VOCÊ PODE APLICAR SUA LÓGICA FINAL: - // Ex: setar um novo estado com os agendamentos filtrados, se for necessário: - // setAgendamentosFiltrados(agendamentosDoMedico); - - - } else { - // Opcional: Limpar a lista filtrada se a busca não for mais única - // setAgendamentosFiltrados([]); - } - + } }, [FiltredTodosMedicos]); +const deleteConsulta = (selectedPatientId) => { + console.log("tentando apagar") + var myHeaders = new Headers(); + myHeaders.append("Authorization", authHeader); + myHeaders.append("apikey", API_KEY) +var requestOptions = { + method: 'DELETE', + redirect: 'follow', + headers: myHeaders +}; + +fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${selectedPatientId}`, requestOptions) + .then(response => response.json()) + .then(result => console.log(result)) + .catch(error => console.log('error', error)); + +} + /** * Filtra todos os agendamentos em um objeto aninhado (data -> [agendamentos]) @@ -158,28 +207,7 @@ const filtrarAgendamentosPorMedico = (dictAgendamentos, idMedicoFiltrado) => { return agendamentosFiltrados; }; - - - - // 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' }, - { nome: 'João Souza', email: 'joao.souza@gmail.com', cpf: '987.654.321-00', telefone: '(79) 98888-2222', entrada: '25/09/2025 às 14:00' }, - { nome: 'Maria Silva', email: 'maria.silva@gmail.com', cpf: '123.456.789-00', telefone: '(79) 99999-1111', entrada: '25/09/2025 às 14:30' }, - { 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' }, - ]; - - // 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) - ); + // Lógica para filtrar os dados da AGENDA (AgendamentosMes) const filteredAgendamentos = useMemo(() => { @@ -253,6 +281,10 @@ const handleSearchMedicos = (term) => { Mudar Disponibilidade + + {!PageNovaConsulta ? (
@@ -351,9 +383,9 @@ const handleSearchMedicos = (term) => {
- {tabela === "diario" && } - {tabela === 'semanal' && } - {tabela === 'mensal' && } + {tabela === "diario" && } + {tabela === 'semanal' && } + {tabela === 'mensal' && } ) @@ -374,20 +406,43 @@ const handleSearchMedicos = (term) => { - - + + + - {filteredFila.map((item, index) => ( + {filaEsperaData.map((item, index) => ( - - - - - + + + + + ))} @@ -429,7 +484,7 @@ const handleSearchMedicos = (term) => {

- Tem certeza que deseja excluir este paciente? + Tem certeza que deseja excluir este agendamento?

@@ -447,7 +502,8 @@ const handleSearchMedicos = (term) => { diff --git a/src/pages/AgendamentoCadastroManager.jsx b/src/pages/AgendamentoCadastroManager.jsx index 7c97640..392023d 100644 --- a/src/pages/AgendamentoCadastroManager.jsx +++ b/src/pages/AgendamentoCadastroManager.jsx @@ -2,17 +2,33 @@ import React from 'react' import FormNovaConsulta from '../components/AgendarConsulta/FormNovaConsulta' import API_KEY from '../components/utils/apiKeys' import { useAuth } from '../components/utils/AuthProvider' -import { useState } from 'react' +import { useEffect,useState } from 'react' import dayjs from 'dayjs' - +import { UserInfos } from '../components/utils/Functions-Endpoints/General' const AgendamentoCadastroManager = () => { const {getAuthorizationHeader} = useAuth() - const [agendamento, setAgendamento] = useState({}) - + const [agendamento, setAgendamento] = useState({status:'confirmed'}) + const [idUsuario, setIDusuario] = useState('0') let authHeader = getAuthorizationHeader() + + useEffect(() => { + + const ColherInfoUsuario =async () => { + const result = await UserInfos(authHeader) + + setIDusuario(result?.profile?.id) + + } + ColherInfoUsuario() + + + }, []) + + + const handleSave = (Dict) => { let DataAtual = dayjs() var myHeaders = new Headers(); @@ -23,13 +39,14 @@ const AgendamentoCadastroManager = () => { var raw = JSON.stringify({ "patient_id": Dict.patient_id, "doctor_id": Dict.doctor_id, - "scheduled_at": DataAtual, + "scheduled_at": `${Dict.dataAtendimento}T${Dict.horarioInicio}:00.000Z`, "duration_minutes": 30, - "appointment_type": "presencial", - "chief_complaint": "Dor de cabeça há 3 ", + "appointment_type": Dict.tipo_consulta, + "patient_notes": "Prefiro horário pela manhã", - "insurance_provider": "Unimed", - "created_by": "87f2662c-9da7-45c0-9e05-521d9d92d105" + "insurance_provider": Dict.convenio, + "status": Dict.status, + "created_by": idUsuario }); var requestOptions = { diff --git a/src/pages/AgendamentoEditPage.jsx b/src/pages/AgendamentoEditPage.jsx index 46f3711..6e93eb6 100644 --- a/src/pages/AgendamentoEditPage.jsx +++ b/src/pages/AgendamentoEditPage.jsx @@ -1,23 +1,42 @@ import React from 'react' import FormNovaConsulta from '../components/AgendarConsulta/FormNovaConsulta' -import { useState } from 'react' +import { useState, useEffect } from 'react' import { useParams } from 'react-router-dom' import API_KEY from '../components/utils/apiKeys' import { useAuth } from '../components/utils/AuthProvider' import dayjs from 'dayjs' +import { UserInfos } from '../components/utils/Functions-Endpoints/General' +const AgendamentoEditPage = ({setDictInfo, DictInfo}) => { -const AgendamentoEditPage = () => { - - let DataAtual = dayjs() + const [idUsuario, setIDusuario] = useState('0') + //let DataAtual = dayjs() const {getAuthorizationHeader} = useAuth() const params = useParams() const [PatientToPatch, setPatientToPatch] = useState({}) let id = params.id - console.log(id) + //console.log(DictInfo, 'aqui') + useEffect(() => { + setDictInfo({...DictInfo?.Infos,...DictInfo?.agendamento}) + + + const ColherInfoUsuario =async () => { + const result = await UserInfos(authHeader) + + setIDusuario(result?.profile?.id) + + } + ColherInfoUsuario() + + + + }, []) + + + let authHeader = getAuthorizationHeader() const handleSave = (DictParaPatch) => { @@ -30,13 +49,21 @@ const AgendamentoEditPage = () => { var raw = JSON.stringify({"patient_id": DictParaPatch.patient_id, "doctor_id": DictParaPatch.doctor_id, - "scheduled_at": DataAtual, + "duration_minutes": 30, - "appointment_type": "presencial", + "chief_complaint": "Dor de cabeça há 3 ", + + "created_by": idUsuario, + + "scheduled_at": `${DictParaPatch.dataAtendimento}T${DictParaPatch.horarioInicio}:00.000Z`, + + "appointment_type": DictParaPatch.tipo_consulta, + "patient_notes": "Prefiro horário pela manhã", - "insurance_provider": "Unimed", - "created_by": "87f2662c-9da7-45c0-9e05-521d9d92d105" + "insurance_provider": DictParaPatch.convenio, + "status": DictParaPatch.status, + "created_by": idUsuario }); @@ -51,7 +78,7 @@ const AgendamentoEditPage = () => { redirect: 'follow' }; - fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${id}`, requestOptions) + fetch(`https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/appointments?id=eq.${DictInfo.id}`, requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error)); @@ -60,7 +87,7 @@ const AgendamentoEditPage = () => { return (
- +
diff --git a/src/pages/DoctorTable.jsx b/src/pages/DoctorTable.jsx index 3b89be5..9b88010 100644 --- a/src/pages/DoctorTable.jsx +++ b/src/pages/DoctorTable.jsx @@ -104,7 +104,7 @@ function TableDoctor() { fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctors", requestOptions) .then(response => response.json()) - .then(result => setMedicos(result)) + .then(result => {setMedicos(result); console.log(result)}) .catch(error => console.log('error', error)); }, [isAuthenticated, getAuthorizationHeader]); diff --git a/src/pages/style/Agendamento.css b/src/pages/style/Agendamento.css index be2ea14..e84f292 100644 --- a/src/pages/style/Agendamento.css +++ b/src/pages/style/Agendamento.css @@ -91,7 +91,7 @@ background-color: #2c5e37; } -.legenda-item-confirmado{ +.legenda-item-confirmed{ background-color: #1e90ff; } .legenda-item-cancelado{ @@ -102,7 +102,7 @@ background-color: #f0ad4e; } -#status-card-consulta-realizado, .legenda-item-realizado { +#status-card-consulta-completed, .legenda-item-realizado { background-color: #b7ffbd; border:3px solid #91d392; padding: 5px; @@ -110,7 +110,7 @@ border-radius: 10px; } -#status-card-consulta-cancelado, .legenda-item-cancelado { +#status-card-consulta-cancelled, .legenda-item-cancelado { background-color: #ffb7cc; border:3px solid #ff6c84; padding: 5px; @@ -118,7 +118,7 @@ border-radius: 10px; } -#status-card-consulta-confirmado, .legenda-item-confirmed { +#status-card-consulta-confirmed, .legenda-item-confirmed { background-color: #eef8fb; border:3px solid #d8dfe7; padding: 5px; @@ -358,26 +358,18 @@ html[data-bs-theme="dark"] { #tabela-seletor-container i { pointer-events: none; } -/* 1. Contêiner de Limitação de Largura e Posicionamento */ -/* Este é o elemento mais importante. Ele deve envolver o input e o dropdown. */ + + .input-e-dropdown-wrapper { position: relative; - /* IMPORTANTE: Defina aqui a largura EXATA que você deseja para o input - e para o dropdown. Na sua imagem, o input parece ter cerca de 300px ou mais. - */ - width: 350px; /* Ajuste este valor conforme a largura desejada do seu input */ - - /* Se o input original estava alinhado à direita (como na imagem), - você pode precisar de um float ou margin para posicionar este wrapper. - */ - margin-left: auto; /* Exemplo para alinhar o wrapper à direita se for o caso */ + + width: 350px; + margin-left: auto; } -/* 2. Estilização da Área de Busca (Input) */ -/* Garante que o input utilize toda a largura do wrapper */ .busca-atendimento { - /* ... seus estilos de layout (flex, margin, etc.) para o busca-atendimento, se houver ... */ + } .busca-atendimento > div { diff --git a/src/perfis/perfil_secretaria/PerfilSecretaria.jsx b/src/perfis/perfil_secretaria/PerfilSecretaria.jsx index de6d35d..041ab95 100644 --- a/src/perfis/perfil_secretaria/PerfilSecretaria.jsx +++ b/src/perfis/perfil_secretaria/PerfilSecretaria.jsx @@ -1,6 +1,6 @@ //import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; import { Routes, Route } from "react-router-dom"; - +import { useState } from "react"; import Sidebar from "../../components/Sidebar"; import FinanceiroDashboard from "../../pages/FinanceiroDashboard"; import SecretariaItems from "../../data/sidebar-items-secretaria.json"; @@ -19,6 +19,7 @@ import ExcecoesDisponibilidade from "../../pages/ExcecoesDisponibilidade"; import AgendamentoEditPage from "../../pages/AgendamentoEditPage"; function PerfilSecretaria({ onLogout }) { + const [DictInfo, setDictInfo] = useState({}) return ( //
@@ -34,8 +35,8 @@ function PerfilSecretaria({ onLogout }) { } /> } /> } /> - } /> - } /> + } /> + } /> } /> Página não encontrada} /> } />
SegTerQuaQuiSexSegundaTerçaQuartaQuintaSexta
- - - + + + {semana[dia].length > 3 ? (

{` +${semana[dia].length - 2}`}

diff --git a/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx b/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx index b6cf99f..abadc2f 100644 --- a/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx +++ b/src/components/AgendarConsulta/TabelaAgendamentoSemana.jsx @@ -6,7 +6,7 @@ import { useEffect, useState, useMemo } from 'react'; import weekOfYear from 'dayjs/plugin/weekOfYear' dayjs.extend(weekOfYear) -const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes }) => { +const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes, setShowDeleteModal ,setSelectedId ,setDictInfo}) => { // Armazena o objeto COMPLETO das semanas organizadas const [semanasOrganizadas, setSemanasOrganizadas] = useState({}); @@ -164,31 +164,31 @@ const TabelaAgendamentoSemana = ({ agendamentos, ListarDiasdoMes }) => { {/* Mapeamento de COLUNAS (dias) */}
{semanaParaRenderizar.segunda[indiceLinha] - ? + ? : null } {semanaParaRenderizar.terça[indiceLinha] - ? + ? : null } {semanaParaRenderizar.quarta[indiceLinha] - ? + ? : null } {semanaParaRenderizar.quinta[indiceLinha] - ? + ? : null } {semanaParaRenderizar.sexta[indiceLinha] - ? + ? : null }
NomeEmailCPFTelefoneTelefone Entrou na fila de esperaAções
{item.nome}{item.email}{item.cpf}{item.telefone}{item.entrada}

{item.Infos?.paciente_nome}

{}

{}{}
+ + + + + +