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 (
Carregando anexos...
- ) : ( - anexos.map((anexo, index) => ( -{Dia}
+ + +{Dia ? `${Dia?.split('-')[2]}/${Dia?.split('-')[1]}/${Dia?.split('-')[0]}`: ''}
{agendamento.horario}
{`${horario[0]}:${horario[1]}`}
| Seg | -Ter | -Qua | -Qui | -Sex | +Segunda | +Terça | +Quarta | +Quinta | +Sexta |
- {` +${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]
- ? |
{semanaParaRenderizar.terça[indiceLinha]
- ? |
{semanaParaRenderizar.quarta[indiceLinha]
- ? |
{semanaParaRenderizar.quinta[indiceLinha]
- ? |
{semanaParaRenderizar.sexta[indiceLinha]
- ? |
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" && Nome |
- Email |
- CPF |
+ Telefone |
+
Telefone |
Entrou na fila de espera |
+ Ações |
{item.nome} |
- {item.email} |
- {item.cpf} |
- {item.telefone} |
- {item.entrada} |
+ |
+ {item.Infos?.paciente_nome} |
+ {} {} |
+ {} |
+ |
+
+
+
+
+
+ - Tem certeza que deseja excluir este paciente? + Tem certeza que deseja excluir este agendamento?
-
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 }) {
|
|---|