diff --git a/src/PagesAdm/gestao.css b/src/PagesAdm/gestao.css index 17c8e49..9951eae 100644 --- a/src/PagesAdm/gestao.css +++ b/src/PagesAdm/gestao.css @@ -1,26 +1,3 @@ -:root { - --primary-blue: #1e3a8a; - --light-blue: #E6F2FF; - --medium-blue: #D1E7FF; - --border-blue: #B8D4F0; - --warning-light: #FFF3CD; - --warning-dark: #856404; - --warning-border: #FFEAA7; - --danger-light: #F8D7DA; - --danger-dark: #721C24; - --danger-border: #F5C6CB; - --bg-light: #f8f9fa; - --border-light: #dee2e6; - --text-muted: #6c757d; - --text-dark: #495057; - --spacing-xs: 0.25rem; - --spacing-sm: 0.5rem; - --spacing-md: 1rem; - --spacing-lg: 1.5rem; - --border-radius: 0.375rem; -} - -/* ===== ESTILOS EXISTENTES DO DASHBOARD ===== */ .dashboard-container { padding: 2rem; font-family: 'Arial', sans-serif; @@ -67,6 +44,68 @@ box-shadow: 0 4px 12px rgba(30, 58, 138, 0.4); } +.filters-container { + background: #fff; + border-radius: 12px; + padding: 1.2rem; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + margin-bottom: 2rem; +} + +.filters-title { + font-size: 16px; + font-weight: bold; + margin-bottom: 0.3rem; + color: #333; +} + +.filters-subtitle { + font-size: 0.85rem; + color: #666; + margin-bottom: 1rem; +} + +.filters-content { + display: flex; + gap: 0.8rem; + align-items: center; +} + +.filters-input { + flex: 1; + padding: 0.5rem 0.8rem; + border: 1px solid #d1d5db; + border-radius: 6px; + font-size: 0.9rem; + color: #333; + min-width: 200px; + transition: all 0.2s ease; +} + +.filters-input:focus { + border-color: #1e3a8a; + box-shadow: 0 0 0 2px rgba(30, 58, 138, 0.1); + outline: none; +} + +.filters-select { + padding: 0.5rem 0.8rem; + border: 1px solid #d1d5db; + border-radius: 6px; + font-size: 0.9rem; + background: #fff; + color: #333; + cursor: pointer; + min-width: 140px; + transition: all 0.2s ease; +} + +.filters-select:focus { + border-color: #1e3a8a; + box-shadow: 0 0 0 2px rgba(30, 58, 138, 0.1); + outline: none; +} + .cards-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); @@ -117,396 +156,283 @@ .user-table-container { background: #fff; border-radius: 12px; - padding: 1.5rem; + padding: 1.2rem; box-shadow: 0 2px 8px rgba(0,0,0,0.1); - margin-top: 1rem; + margin-top: 2rem; } -/* ===== ESTILOS DA TABELA AVANÇADA ===== */ -.table-paciente-filters { - background-color: var(--bg-light); - border: 1px solid var(--border-light); - border-radius: var(--border-radius); - padding: var(--spacing-md); - margin-bottom: var(--spacing-md); +.user-table-container h2 { + font-size: 18px; + font-weight: bold; + margin-bottom: 0.3rem; + color: #333; } -.table-paciente-filters h5 { - color: var(--text-dark); - font-weight: 600; - font-size: 1.1rem; +.user-table-container p { + font-size: 0.9rem; + color: #666; + margin-bottom: 1rem; } -.table-paciente-table { +.user-table { width: 100%; border-collapse: collapse; - margin-top: 1rem; } -.table-paciente-table th { - background-color: var(--bg-light); - color: var(--text-dark); +.user-table th, +.user-table td { + padding: 10px 12px; + text-align: left; + border-bottom: 1px solid #e0e0e0; +} + +.user-table th { + background-color: #f3f4f6; + color: #333; font-weight: 600; - padding: 12px 8px; - border-bottom: 2px solid var(--border-light); - vertical-align: middle; font-size: 0.9rem; } -.table-paciente-table td { - padding: 12px 8px; - vertical-align: middle; - border-bottom: 1px solid var(--border-light); - font-size: 0.875rem; +.user-table tr { + transition: background-color 0.2s ease; } -.table-paciente-table tbody tr:hover { - background-color: rgba(0, 0, 0, 0.025); +.user-table tr:hover { + background-color: #f0f4ff; } -.insurance-badge { - background-color: transparent !important; - color: var(--text-dark) !important; - padding: 0.35em 0.65em; - font-size: 0.75em; +.profile-badge { + background-color: #1e3a8a; + color: white; + padding: 4px 10px; + border-radius: 6px; + font-size: 0.8rem; font-weight: 500; - border: 1px solid var(--border-light); - border-radius: var(--border-radius); + display: inline-block; } .status-badge { - padding: 0.35em 0.65em; - font-size: 0.75em; + padding: 4px 10px; + border-radius: 6px; + font-size: 0.8rem; + color: #fff; font-weight: 500; - border-radius: var(--border-radius); display: inline-block; text-transform: capitalize; } .status-badge.ativo { - background-color: var(--primary-blue); - color: white; + background-color: #1e3a8a; } .status-badge.inativo { - background-color: var(--text-muted); - color: white; + background-color: #6c757d; } -.anniversary-badge { - background-color: #ffc107; - color: #000; - padding: 0.35em 0.65em; - font-size: 0.75em; - border-radius: 50%; +.actions { + display: flex; + gap: 8px; + flex-wrap: wrap; } -.btn-view { - background-color: var(--light-blue) !important; - color: #004085 !important; - border: 1px solid var(--border-blue); - padding: 0.375rem 0.75rem; - font-size: 0.875rem; - border-radius: var(--border-radius); - transition: all 0.15s ease-in-out; -} - -.btn-view:hover { - background-color: var(--medium-blue) !important; - border-color: #9EC5FE; -} - -.btn-edit { - background-color: var(--warning-light) !important; - color: var(--warning-dark) !important; - border: 1px solid var(--warning-border); - padding: 0.375rem 0.75rem; - font-size: 0.875rem; - border-radius: var(--border-radius); - transition: all 0.15s ease-in-out; -} - -.btn-edit:hover { - background-color: #FFEEBA !important; - border-color: #FFE087; -} - -.btn-delete { - background-color: var(--danger-light) !important; - color: var(--danger-dark) !important; - border: 1px solid var(--danger-border); - padding: 0.375rem 0.75rem; - font-size: 0.875rem; - border-radius: var(--border-radius); - transition: all 0.15s ease-in-out; -} - -.btn-delete:hover { - background-color: #F1B0B7 !important; - border-color: #ED969E; -} - -.advanced-filters { - border: 1px solid var(--border-light); - border-radius: var(--border-radius); - background-color: white; -} - -.advanced-filters h6 { - color: var(--text-dark); - font-size: 0.9rem; - font-weight: 600; -} - -.form-label.fw-bold { - color: var(--text-dark); - font-size: 0.875rem; -} - -.delete-modal .modal-header { - background-color: rgba(220, 53, 69, 0.1); - border-bottom: 1px solid rgba(220, 53, 69, 0.2); -} - -.delete-modal .modal-title { - color: #dc3545; - font-weight: 600; -} - -.contador-pacientes { - background-color: var(--primary-blue); - color: white; - padding: 0.5em 0.75em; - font-size: 0.875em; - font-weight: 500; - border-radius: var(--border-radius); - text-align: center; - display: inline-block; -} - -/* Paginação */ -.pagination { - margin-bottom: 0; -} - -.page-link { - color: var(--text-dark); - border: 1px solid var(--border-light); - padding: 0.375rem 0.75rem; - font-size: 0.875rem; -} - -.page-link:hover { - color: var(--primary-blue); - background-color: #e9ecef; - border-color: var(--border-light); -} - -.page-item.active .page-link { - background-color: var(--primary-blue); - border-color: var(--primary-blue); - color: white; -} - -.page-item.disabled .page-link { - color: var(--text-muted); - background-color: var(--bg-light); - border-color: var(--border-light); -} - -/* ===== AJUSTES ESPECÍFICOS PARA OS FILTROS ===== */ -.table-paciente-filters .form-select-sm { - font-size: 0.825rem; - padding: 0.35rem 0.5rem; - border-radius: 0.25rem; -} - -.table-paciente-filters .form-label.small { +.action-btn { + border: none; + padding: 6px 12px; font-size: 0.8rem; font-weight: 500; - color: #6c757d; - min-width: auto; - white-space: nowrap; -} - -/* Alinhamento dos grupos de filtro */ -.table-paciente-filters .d-flex.align-items-center.gap-2 { - flex-wrap: nowrap; -} - -/* Ajuste do contador */ -.contador-pacientes { - background-color: #1e3a8a; - color: white; - padding: 0.4rem 0.8rem; - font-size: 0.8rem; - font-weight: 600; - border-radius: 0.375rem; - text-align: center; - display: inline-block; - letter-spacing: 0.5px; -} - -/* Botão de filtros avançados */ -.btn-link { - color: #1e3a8a !important; - font-weight: 500; + cursor: pointer; transition: all 0.2s ease; + border-radius: 4px; + display: inline-flex; + align-items: center; + gap: 4px; } -.btn-link:hover { - color: #162d6b !important; +.action-btn.detalhes { + background-color: #e6f2ff; + color: #004085; + border: 1px solid #b8d4ff; +} + +.action-btn.detalhes:hover { + background-color: #cce4ff; transform: translateY(-1px); } -/* Ajustes responsivos para mobile */ -@media (max-width: 768px) { - .dashboard-container { - padding: 1rem; - } - - .dashboard-header { - flex-direction: column; - gap: 1rem; - align-items: flex-start; - } - - .table-paciente-filters .d-flex.flex-wrap.align-items-center.gap-3 { - gap: 1rem !important; - flex-direction: column; - align-items: flex-start; - } - - .table-paciente-filters .d-flex.align-items-center.gap-2 { - width: 100%; - justify-content: space-between; - } - - .table-paciente-filters .form-select-sm.compact-select { - min-width: 100% !important; - margin-top: 0.25rem; - } - - .vr.d-none.d-md-block { - display: none !important; - } - - .table-paciente-table { - font-size: 0.875rem; - } - - .table-paciente-table th, - .table-paciente-table td { - padding: 10px 6px; - } - - .btn-view, - .btn-edit, - .btn-delete { - padding: 0.25rem 0.5rem; - font-size: 0.75rem; - } - - .table-paciente-filters .d-flex { - flex-direction: column; - gap: 0.5rem; - } - - .table-paciente-filters .form-select { - min-width: 100% !important; - } - - .patient-name-container { - flex-direction: column; - align-items: flex-start !important; - gap: 0.25rem; - } - - .d-flex.justify-content-between.align-items-center { - flex-direction: column; - gap: 1rem; - align-items: stretch !important; - } - - .table-paciente-table thead th:nth-child(6), - .table-paciente-table tbody td:nth-child(6) { - display: none; - } +.action-btn.editar { + background-color: #fff3cd; + color: #856405; + border: 1px solid #ffeaa7; } -/* Estilo para os selects quando estão ativos */ -.form-select-sm:focus { - border-color: #1e3a8a; - box-shadow: 0 0 0 0.2rem rgba(30, 58, 138, 0.25); +.action-btn.editar:hover { + background-color: #ffeaa7; + transform: translateY(-1px); } -/* Ajuste do botão limpar filtros */ -.btn-outline-secondary.btn-sm { - border-color: #6c757d; - color: #6c757d; - font-size: 0.8rem; - padding: 0.35rem 0.75rem; +.action-btn.excluir { + background-color: #f8d7da; + color: #721c24; + border: 1px solid #f1b0b7; } -.btn-outline-secondary.btn-sm:hover { - background-color: #6c757d; +.action-btn.excluir:hover { + background-color: #f1b0b7; + transform: translateY(-1px); +} + +.save-btn { + background-color: #1e3a8a; color: white; -} - -/* Melhoria na aparência dos filtros avançados */ -.advanced-filters { - background-color: #f8f9fa; - border: 1px solid #dee2e6 !important; -} - -.advanced-filters .form-control-sm { - font-size: 0.825rem; -} - -.advanced-filters h6 { - color: #495057; - font-size: 0.9rem; + border: none; + padding: 8px 16px; + border-radius: 6px; font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; } -.compact-select { - font-size: 0.9rem; - padding: 0.45rem 0.5rem; - min-width: 150px; +.save-btn:hover { + background-color: #162d6b; + transform: translateY(-1px); + box-shadow: 0 4px 8px rgba(30, 58, 138, 0.3); } -/* Badge de Perfil */ -.badge-medico { +.edit-btn { + background-color: #fff3cd; + color: #856405; + border: 1px solid #ffeaa7; + padding: 8px 16px; + border-radius: 6px; + font-weight: 600; + cursor: pointer; + transition: all 0.3s ease; +} + +.edit-btn:hover { + background-color: #ffeaa7; + transform: translateY(-1px); +} + +html[data-bs-theme="dark"] .dashboard-container { + background-color: #121212; + color: #e0e0e0; +} + +html[data-bs-theme="dark"] .dashboard-header, +html[data-bs-theme="dark"] .dashboard-title, +html[data-bs-theme="dark"] .dashboard-subtitle { + color: #e0e0e0; +} + +html[data-bs-theme="dark"] .new-user-btn { background-color: #1e3a8a; - color: white; - padding: 0.35rem 0.75rem; - border-radius: 0.375rem; - font-size: 0.85rem; - font-weight: 500; } -.badge-paciente { +html[data-bs-theme="dark"] .new-user-btn:hover { + background-color: #162d6b; +} + +html[data-bs-theme="dark"] .filters-container, +html[data-bs-theme="dark"] .user-table-container { + background: #1a1a1a; + box-shadow: 0 2px 8px rgba(0,0,0,0.4); +} + +html[data-bs-theme="dark"] .filters-title, +html[data-bs-theme="dark"] .user-table-container h2 { + color: #e0e0e0; +} + +html[data-bs-theme="dark"] .filters-subtitle, +html[data-bs-theme="dark"] .user-table-container p { + color: #bdbdbd; +} + +html[data-bs-theme="dark"] .filters-input, +html[data-bs-theme="dark"] .filters-select { + background: #232323; + color: #e0e0e0; + border-color: #333; +} + +html[data-bs-theme="dark"] .filters-input:focus, +html[data-bs-theme="dark"] .filters-select:focus { + border-color: #1e3a8a; + box-shadow: 0 0 0 2px rgba(30, 58, 138, 0.2); +} + +html[data-bs-theme="dark"] .cards-container .card { + background-color: #181818; + color: #e0e0e0; + box-shadow: 0 2px 6px rgba(0,0,0,0.4); +} + +html[data-bs-theme="dark"] .highlight:hover { + background: #1a1f2e; + border: 1px solid #1e3a8a33; +} + +html[data-bs-theme="dark"] .card-label { + color: #888; +} + +html[data-bs-theme="dark"] .card-value { + color: #e0e0e0; +} + +html[data-bs-theme="dark"] .card-extra { + color: #bdbdbd; +} + +html[data-bs-theme="dark"] .card-extra.positive { + color: #1e3a8a; +} + +html[data-bs-theme="dark"] .user-table th { + background-color: #232323; + color: #e0e0e0; +} + +html[data-bs-theme="dark"] .user-table td { + color: #e0e0e0; + border-bottom: 1px solid #333; +} + +html[data-bs-theme="dark"] .user-table tr:hover { + background-color: #1a1f2e; +} + +html[data-bs-theme="dark"] .profile-badge { background-color: #1e3a8a; - color: white; - padding: 0.35rem 0.75rem; - border-radius: 0.375rem; - font-size: 0.85rem; - font-weight: 500; } -@media (max-width: 576px) { - .cards-container { - grid-template-columns: 1fr; - } - - .table-paciente-table thead th:nth-child(3), - .table-paciente-table thead th:nth-child(4), - .table-paciente-table tbody td:nth-child(3), - .table-paciente-table tbody td:nth-child(4) { - display: none; - } - - .user-table-container { - padding: 1rem; - } +html[data-bs-theme="dark"] .action-btn.detalhes { + background-color: #e6f2ff; + color: #004085; + border: 1px solid #b8d4ff; +} + +html[data-bs-theme="dark"] .action-btn.detalhes:hover { + background-color: #cce4ff; +} + +html[data-bs-theme="dark"] .action-btn.editar { + background-color: #fff3cd; + color: #856405; + border: 1px solid #ffeaa7; +} + +html[data-bs-theme="dark"] .action-btn.editar:hover { + background-color: #ffeaa7; +} + +html[data-bs-theme="dark"] .action-btn.excluir { + background-color: #f8d7da; + color: #721c24; + border: 1px solid #f1b0b7; +} + +html[data-bs-theme="dark"] .action-btn.excluir:hover { + background-color: #f1b0b7; } \ No newline at end of file diff --git a/src/PagesAdm/gestao.jsx b/src/PagesAdm/gestao.jsx index 3494da6..a5ecd88 100644 --- a/src/PagesAdm/gestao.jsx +++ b/src/PagesAdm/gestao.jsx @@ -1,186 +1,9 @@ -import React, { useState, useEffect } from "react"; +import React from "react"; import "./gestao.css"; -import { GetAllDoctors } from "../components/utils/Functions-Endpoints/Doctor"; -import { GetAllPatients } from "../components/utils/Functions-Endpoints/Patient"; -import API_KEY from "../components/utils/apiKeys"; function UserDashboard() { - // Estados principais - const [usuarios, setUsuarios] = useState([]); - const [busca, setBusca] = useState(""); - const [filtroPerfil, setFiltroPerfil] = useState("Todos"); - const [filtroStatus, setFiltroStatus] = useState("Todos"); - const [filtroDepartamento, setFiltroDepartamento] = useState("Todos"); - const [showFiltrosAvancados, setShowFiltrosAvancados] = useState(false); - const [loading, setLoading] = useState(true); - - // Estados de paginação - const [paginaAtual, setPaginaAtual] = useState(1); - const [itensPorPagina, setItensPorPagina] = useState(10); - - // Estados de ordenação - const [sortKey, setSortKey] = useState(null); - const [sortDir, setSortDir] = useState('asc'); - - // Estados para modais - const [showDeleteModal, setShowDeleteModal] = useState(false); - const [selectedUserId, setSelectedUserId] = useState(null); - - // Buscar dados reais da API - useEffect(() => { - const fetchUsuarios = async () => { - try { - setLoading(true); - const access_token = localStorage.getItem("access_token"); - const authHeader = access_token ? `Bearer ${access_token}` : null; - - // Buscar médicos e pacientes em paralelo - const [medicos, pacientes] = await Promise.all([ - GetAllDoctors(authHeader), - GetAllPatients(authHeader) - ]); - - console.log("Médicos:", medicos); - console.log("Pacientes:", pacientes); - - // Transformar médicos - const usuariosMedicos = medicos.map(medico => ({ - id: `doctor-${medico.id}`, - nome: medico.full_name || "Nome não informado", - email: medico.email || "Email não informado", - perfil: "Médico", - departamento: medico.specialization || "Não informado", - status: "ativo", - ultimoAcesso: medico.updated_at || medico.created_at || new Date().toISOString(), - dataCadastro: medico.created_at || new Date().toISOString(), - telefone: medico.phone || "Não informado", - crm: medico.crm - })); - - // Transformar pacientes - const usuariosPacientes = pacientes.map(paciente => ({ - id: `patient-${paciente.id}`, - nome: paciente.full_name || "Nome não informado", - email: paciente.email || "Email não informado", - perfil: "Paciente", - departamento: "Pacientes", - status: "ativo", - ultimoAcesso: paciente.updated_at || paciente.created_at || new Date().toISOString(), - dataCadastro: paciente.created_at || new Date().toISOString(), - telefone: paciente.phone || "Não informado", - cpf: paciente.cpf - })); - - // Combinar todos os usuários - const todosUsuarios = [...usuariosMedicos, ...usuariosPacientes]; - setUsuarios(todosUsuarios); - } catch (error) { - console.error("Erro ao buscar usuários:", error); - } finally { - setLoading(false); - } - }; - - fetchUsuarios(); - }, []); - - // Funções auxiliares - const formatarData = (dataString) => { - const data = new Date(dataString); - return data.toLocaleDateString('pt-BR', { - day: '2-digit', - month: '2-digit', - year: 'numeric', - hour: '2-digit', - minute: '2-digit' - }); - }; - - const calcularDiasDesdeUltimoAcesso = (dataString) => { - const ultimoAcesso = new Date(dataString); - const hoje = new Date(); - const diffTime = Math.abs(hoje - ultimoAcesso); - return Math.ceil(diffTime / (1000 * 60 * 60 * 24)); - }; - - // Filtragem - const usuariosFiltrados = usuarios.filter(usuario => { - const passaBusca = busca === "" || - usuario.nome.toLowerCase().includes(busca.toLowerCase()) || - usuario.email.toLowerCase().includes(busca.toLowerCase()); - - const passaPerfil = filtroPerfil === "Todos" || usuario.perfil === filtroPerfil; - const passaStatus = filtroStatus === "Todos" || usuario.status === filtroStatus; - const passaDepartamento = filtroDepartamento === "Todos" || usuario.departamento === filtroDepartamento; - - return passaBusca && passaPerfil && passaStatus && passaDepartamento; - }); - - // Ordenação - const aplicarOrdenacao = (arr) => { - if (!sortKey) return arr; - - const copia = [...arr]; - copia.sort((a, b) => { - if (sortKey === 'nome') { - return a.nome.localeCompare(b.nome); - } else if (sortKey === 'dataCadastro') { - return new Date(a.dataCadastro) - new Date(b.dataCadastro); - } else if (sortKey === 'ultimoAcesso') { - return new Date(a.ultimoAcesso) - new Date(b.ultimoAcesso); - } - return 0; - }); - - return sortDir === 'desc' ? copia.reverse() : copia; - }; - - const usuariosOrdenados = aplicarOrdenacao(usuariosFiltrados); - - // Paginação - const totalPaginas = Math.ceil(usuariosFiltrados.length / itensPorPagina); - const indiceInicial = (paginaAtual - 1) * itensPorPagina; - const indiceFinal = indiceInicial + itensPorPagina; - const usuariosPaginados = usuariosOrdenados.slice(indiceInicial, indiceFinal); - - // Navegação de páginas - const irParaPagina = (pagina) => setPaginaAtual(pagina); - const avancarPagina = () => paginaAtual < totalPaginas && setPaginaAtual(p => p + 1); - const voltarPagina = () => paginaAtual > 1 && setPaginaAtual(p => p - 1); - - const gerarNumerosPaginas = () => { - const paginas = []; - const paginasParaMostrar = 5; - let inicio = Math.max(1, paginaAtual - Math.floor(paginasParaMostrar / 2)); - let fim = Math.min(totalPaginas, inicio + paginasParaMostrar - 1); - inicio = Math.max(1, fim - paginasParaMostrar + 1); - - for (let i = inicio; i <= fim; i++) paginas.push(i); - return paginas; - }; - - // Funções de ação - const limparFiltros = () => { - setBusca(""); - setFiltroPerfil("Todos"); - setFiltroStatus("Todos"); - setFiltroDepartamento("Todos"); - setPaginaAtual(1); - }; - - const excluirUsuario = (id) => { - setUsuarios(prev => prev.filter(u => u.id !== id)); - setShowDeleteModal(false); - }; - - // Resetar paginação quando filtros mudarem - useEffect(() => { - setPaginaAtual(1); - }, [busca, filtroPerfil, filtroStatus, filtroDepartamento, sortKey, sortDir]); - return (
Total de Usuários
-{loading ? "..." : usuarios.length}
-Médicos e Pacientes
-Médicos
-{loading ? "..." : usuarios.filter(u => u.perfil === 'Médico').length}
-Profissionais cadastrados
-Pacientes
-{loading ? "..." : usuarios.filter(u => u.perfil === 'Paciente').length}
-Pacientes cadastrados
+15
++3 este mês
Usuários Ativos
-{loading ? "..." : usuarios.filter(u => u.status === 'ativo').length}
-{usuarios.length > 0 ? ((usuarios.filter(u => u.status === 'ativo').length / usuarios.length) * 100).toFixed(1) : 0}% do total
+12
+80.0% do total
+Tempo Médio Sessão
+2h 30min
+Última semana
+Usuários Hoje
+10
++2 desde ontem
+Filtros
++ Use os filtros abaixo para encontrar usuários específicos +
+Carregando usuários...
-| Nome | -Perfil | -Especialização/Categoria | -Ações | -|
|---|---|---|---|---|
|
-
- {usuario.nome}
-
- |
- {usuario.email} | -- - {usuario.perfil} - - | -{usuario.departamento} | -
-
-
-
-
-
- |
-
|
-
-
-
- Nenhum usuário encontrado com os filtros aplicados. - {(busca || filtroPerfil !== "Todos" || filtroStatus !== "Todos" || filtroDepartamento !== "Todos") && ( - - )} - |
- ||||
Lista completa de usuários e suas permissões
+| Nome | +Perfil | +Departamento | +Status | +Último Acesso | +Ações | +|
|---|---|---|---|---|---|---|
| Ana Silva | +ana.silva@mediconnect.com | +Gestão / Coordenação | +Administração | +Ativo | +20/12/2024, 08:30 | ++ + + + | +
| Dr. Carlos Santos | +carlos.santos@mediconnect.com | +Médico | +Cardiologia | +Ativo | +19/12/2024, 14:20 | ++ + + + | +
| Maria Oliveira | +maria.oliveira@mediconnect.com | +Secretária | +Recepção | +Ativo | +20/12/2024, 07:45 | ++ + + + | +
| Dr. João Pereira | +joao.pereira@mediconnect.com | +Médico | +Ortopedia | +Inativo | +15/12/2024, 16:30 | ++ + + + | +
- Tem certeza que deseja excluir este usuário? -
-- Esta ação não pode ser desfeita. -
-| Nome do Paciente | -CPF | -Médico Solicitado | -Data da Solicitação | -Ações | -
|---|---|---|---|---|
| {item?.Infos?.paciente_nome} | -{item?.Infos?.paciente_cpf} | -{item?.Infos?.medico_nome} | -- {dayjs(item.agendamento.scheduled_at).format("DD/MM/YYYY")} - | -- | -
|
-
- {showSpinner ? (
-
- Nenhuma solicitação encontrada. - > - )} + + + + + |
- ||||
| Paciente | -CPF | -Exame | -Data | -Ações | -
|---|---|---|---|---|
|
-
- {paciente?.full_name || 'Carregando...'}
-
- |
- {paciente?.cpf || 'Carregando...'} | -- - {relatorio.exam || '—'} - - | -- - {dataFormatada} - - | -
-
-
- |
-
|
-
-
-
- Nenhum relatório encontrado com os filtros aplicados. - {(termoPesquisa || filtroExame) && ( - |
- ||||
| Paciente | +CPF | +Exame | ++ |
|---|---|---|---|
| {paciente?.full_name || 'Carregando...'} | +{paciente?.cpf || 'Carregando...'} | +{relatorio.exam} | +
+
+
+ |
+
| Nenhum relatório encontrado. | |||
| Médico Solicitado | -Data da Solicitação | -Ações | -||||||
|---|---|---|---|---|---|---|---|---|
| Dr(a). {item.Infos?.medico_nome} | -{dayjs(item.agendamento.created_at).format('DD/MM/YYYY HH:mm')} | -
- |
+ ||||||
| Médico Solicitado | +Data da Solicitação | +Ações |
|---|---|---|
|
-
-
-
- Nenhuma solicitação na fila de espera. - |
- ||
Deseja realmente cancelar esta consulta?
-Esta ação não pode ser desfeita.
- - - -Qual o motivo do cancelamento?
+ +{medico.nomeMedico}
+| Nome do Paciente | -CPF | -Médico Solicitado | -Data da Solicitação | -Ações | -||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {item?.Infos?.paciente_nome} | -{item?.Infos?.paciente_cpf} | -{item?.Infos?.nome_medico} | -{dayjs(item.agendamento.scheduled_at).format('DD/MM/YYYY')} | -
-
+
| ||||||||||||||||||||
| Nome | +CPF | +Especialidade | +Ações | +|||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
+
+ {medico.full_name}
+ {ehAniversariante(medico.birth_date) && (
+
+
+
+ )}
+
+ |
+ {medico.cpf} | ++ + {medico.specialty || 'Não informado'} + + | +{medico.email || 'Não informado'} | +
+
+
+
-
+
)}
-
+ Itens por página:
+
+
+
+
+
+ Página {paginaAtual} de {totalPaginas} •
+ Mostrando {indiceInicial + 1}-{Math.min(indiceFinal, medicosFiltrados.length)} de {medicosFiltrados.length} médicos
+
+
+
+
| ||||||||||||||||||||
Tem certeza que deseja excluir este médico?
-Esta ação não pode ser desfeita.
++ Tem certeza que deseja excluir este médico? +