diff --git a/src/pages/DoctorTable.jsx b/src/pages/DoctorTable.jsx index 019f7f7..3c67b7d 100644 --- a/src/pages/DoctorTable.jsx +++ b/src/pages/DoctorTable.jsx @@ -2,30 +2,40 @@ import React, { useState, useEffect } from "react"; import API_KEY from "../components/utils/apiKeys"; import { useAuth } from "../components/utils/AuthProvider"; import { Link } from "react-router-dom"; +import "./style/TableDoctor.css"; function TableDoctor() { const { getAuthorizationHeader, isAuthenticated } = useAuth(); const [medicos, setMedicos] = useState([]); const [search, setSearch] = useState(""); + const [filtroEspecialidade, setFiltroEspecialidade] = useState("Todos"); + // REMOVIDO: const [filtroVIP, setFiltroVIP] = useState(false); const [filtroAniversariante, setFiltroAniversariante] = useState(false); - // estados do modal + // Estados para filtros avançados + const [showFiltrosAvancados, setShowFiltrosAvancados] = useState(false); + const [filtroCidade, setFiltroCidade] = useState(""); + const [filtroEstado, setFiltroEstado] = useState(""); + const [idadeMinima, setIdadeMinima] = useState(""); + const [idadeMaxima, setIdadeMaxima] = useState(""); + const [dataInicial, setDataInicial] = useState(""); + const [dataFinal, setDataFinal] = useState(""); + + // estados do modal const [showDeleteModal, setShowDeleteModal] = useState(false); const [selectedDoctorId, setSelectedDoctorId] = useState(null); // Função para excluir médicos const deleteDoctor = async (id) => { - const authHeader = getAuthorizationHeader() console.log(id, 'teu id') - + var myHeaders = new Headers(); - myHeaders.append('apikey', API_KEY); - myHeaders.append("Authorization", authHeader) - - - var requestOptions = { method: "DELETE", redirect: "follow", headers:myHeaders }; + myHeaders.append('apikey', API_KEY); + myHeaders.append("Authorization", authHeader) + + var requestOptions = { method: "DELETE", redirect: "follow", headers: myHeaders }; try { const result = await fetch( @@ -53,90 +63,323 @@ function TableDoctor() { ); }; - // Buscar médicos da API - useEffect(() => { + // Função para calcular idade a partir da data de nascimento + const calcularIdade = (dataNascimento) => { + if (!dataNascimento) return 0; + const hoje = new Date(); + const nascimento = new Date(dataNascimento); + let idade = hoje.getFullYear() - nascimento.getFullYear(); + const mes = hoje.getMonth() - nascimento.getMonth(); - const authHeader = getAuthorizationHeader() - - console.log(authHeader, 'aqui autorização') - - var myHeaders = new Headers(); - myHeaders.append("apikey", API_KEY); - myHeaders.append("Authorization", `${authHeader}`); - var requestOptions = { - method: 'GET', - headers: myHeaders, - redirect: 'follow' + if (mes < 0 || (mes === 0 && hoje.getDate() < nascimento.getDate())) { + idade--; + } + return idade; }; - fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctors", requestOptions) - .then(response => response.json()) - .then(result => setMedicos(result)) - .catch(error => console.log('error', error)); - }, []); + // Função para limpar todos os filtros + const limparFiltros = () => { + setSearch(""); + setFiltroEspecialidade("Todos"); + // REMOVIDO: setFiltroVIP(false); + setFiltroAniversariante(false); + setShowFiltrosAvancados(false); // Adicionado para fechar os avançados + setFiltroCidade(""); + setFiltroEstado(""); + setIdadeMinima(""); + setIdadeMaxima(""); + setDataInicial(""); + setDataFinal(""); + }; - // ✨ CORREÇÃO AQUI: Verificamos se 'medicos' é um array antes de filtrar. - const medicosFiltrados = Array.isArray(medicos) ? medicos.filter( - (medico) => - `${medico.nome} ${medico.cpf} ${medico.email} ${medico.telefone}` - .toLowerCase() - .includes(search.toLowerCase()) && - (filtroAniversariante ? ehAniversariante(medico.data_nascimento) : true) - ) : []; // Se não for um array, usamos um array vazio como fallback. + // Buscar médicos da API + useEffect(() => { + const authHeader = getAuthorizationHeader() + console.log(authHeader, 'aqui autorização') + + var myHeaders = new Headers(); + myHeaders.append("apikey", API_KEY); + myHeaders.append("Authorization", `${authHeader}`); + var requestOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch("https://yuanqfswhberkoevtmfr.supabase.co/rest/v1/doctors", requestOptions) + .then(response => response.json()) + .then(result => setMedicos(result)) + .catch(error => console.log('error', error)); + }, [isAuthenticated, getAuthorizationHeader]); + + // ✨ FILTRO CORRIGIDO - Baseado na estrutura real dos dados + const medicosFiltrados = Array.isArray(medicos) ? medicos.filter((medico) => { + // Filtro por nome OU CPF - usando campos reais da API + const buscaNome = medico.full_name?.toLowerCase().includes(search.toLowerCase()); + const buscaCPF = medico.cpf?.toLowerCase().includes(search.toLowerCase()); + const buscaEmail = medico.email?.toLowerCase().includes(search.toLowerCase()); + const passaBusca = search === "" || buscaNome || buscaCPF || buscaEmail; + + // Filtro por especialidade - ajustando para campo real + const passaEspecialidade = filtroEspecialidade === "Todos" || medico.specialty === filtroEspecialidade; + + // REMOVIDO: Filtro VIP - Não é mais utilizado + // const passaVIP = filtroVIP ? medico.vip === true : true; + + // Filtro aniversariante + const passaAniversario = filtroAniversariante + ? ehAniversariante(medico.birth_date) + : true; + + // Filtros avançados - ajustando para campos reais + const passaCidade = filtroCidade ? + medico.city?.toLowerCase().includes(filtroCidade.toLowerCase()) : true; + + const passaEstado = filtroEstado ? + medico.state?.toLowerCase().includes(filtroEstado.toLowerCase()) : true; + + // Filtro por idade - usando birth_date + const idade = calcularIdade(medico.birth_date); + const passaIdadeMinima = idadeMinima ? idade >= parseInt(idadeMinima) : true; + const passaIdadeMaxima = idadeMaxima ? idade <= parseInt(idadeMaxima) : true; + + // Filtro por data de cadastro - usando created_at ou similar + const passaDataInicial = dataInicial ? + medico.created_at && new Date(medico.created_at) >= new Date(dataInicial) : true; + + const passaDataFinal = dataFinal ? + medico.created_at && new Date(medico.created_at) <= new Date(dataFinal) : true; + + // Combinação de todos os filtros (passaVIP removido) + const resultado = passaBusca && passaEspecialidade && passaAniversario && + passaCidade && passaEstado && passaIdadeMinima && passaIdadeMaxima && + passaDataInicial && passaDataFinal; + + return resultado; + }) : []; + + // Contador de médicos filtrados + useEffect(() => { + console.log(` Médicos totais: ${medicos.length}, Filtrados: ${medicosFiltrados.length}`); + }, [medicos, medicosFiltrados, search]); return ( <>
| Nome | CPF | +Especialidade | Telefone | -Ações | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {medico.full_name} | -{medico.cpf} | -{medico.email} | -{medico.telefone} |
-
- {medico.ativo}
+
+ {medico.full_name}
+ {ehAniversariante(medico.birth_date) && (
+
+
+
+ )}
+ {/* REMOVIDO: Badge VIP
+ {medico.vip && (
+
+ VIP
+
+ )} */}
+
+ |
+ {medico.cpf} | ++ + {medico.specialty || 'Não informado'} | - +{medico.email || 'Não informado'} |
- {/* Ver Detalhes */}
-
- {/* Modal de confirmação de exclusão */}
+ {/* Modal de confirmação */}
{showDeleteModal && (
+ |
Nenhum médico encontrado.
|
-
- Confirmação de Exclusão+
+
+
+ Confirmação de Exclusão +
-
+
+ Tem certeza que deseja excluir este médico? Lista de Pacientes
+
-
-
+
+ Pacientes Cadastrados-
-
+ {/* Seção de Filtros */}
+ {" "} Filtros-
+ {/* Busca por nome ou CPF */}
+
+ {/* Informações dos filtros ativos */}
+ {(search || filtroConvenio !== "Todos" || filtroVIP || filtroAniversariante ||
+ filtroCidade || filtroEstado || idadeMinima || idadeMaxima || dataInicial || dataFinal) && (
+
setSearch(e.target.value)}
- style={{
- minWidth: 250,
- maxWidth: 300,
- width: 260,
- flex: "0 0 auto",
- }}
/>
+
+ Digite o nome completo ou número do CPF
+
+
+ {/* Filtros Básicos */}
+
+
+
+ {/* Filtros Avançados */}
+ {showFiltrosAvancados && (
+
+
+ )}
Filtros Avançados+ +
+ {/* Localização */}
+
+
+
+ setFiltroCidade(e.target.value)}
+ />
+
+
+
+ setFiltroEstado(e.target.value)}
+ />
+
+
+ {/* Intervalo de Idade */}
+
+
+ setIdadeMinima(e.target.value)}
+ min="0"
+ max="150"
+ />
+
+
+
+ setIdadeMaxima(e.target.value)}
+ min="0"
+ max="150"
+ />
+
+
+ {/* Data do Último Atendimento */}
+
+
+ setDataInicial(e.target.value)}
+ />
+
+
+
+ setDataFinal(e.target.value)}
+ />
+
+
+ Filtros ativos:
+
+ )}
+
+ {/* Contador de resultados */}
+
+ {search && Busca: "{search}"}
+ {filtroConvenio !== "Todos" && Convênio: {filtroConvenio}}
+ {filtroVIP && VIP}
+ {filtroAniversariante && Aniversariantes}
+ {filtroCidade && Cidade: {filtroCidade}}
+ {filtroEstado && Estado: {filtroEstado}}
+ {idadeMinima && Idade mín: {idadeMinima}}
+ {idadeMaxima && Idade máx: {idadeMaxima}}
+ {dataInicial && Data inicial: {dataInicial}}
+ {dataFinal && Data final: {dataFinal}}
+
+
+
+ {pacientesFiltrados.length} de {pacientes.length} pacientes encontrados
+
+
+
+ {/* Tabela de Pacientes */}
-
| ||||||||||||||||||||||||||||||||||||||