diff --git a/src/App.js b/src/App.js index d232aea..20c54ee 100644 --- a/src/App.js +++ b/src/App.js @@ -1,11 +1,11 @@ import PerfilMedico from "./perfis/Perfil_medico/PerfilMedico"; //Mude para (import PerfilMedico from "./perfis/perfil_secretaria/PerfilSecretaria";) para ve a secretaria - - + //Mude para (import Perfiladm from "./perfis/Perfil_adm/Perfiladm.jsx";) para ver o ADM +//Perfiladm function App() { return ( <> - + ); } diff --git a/src/PagesAdm/gestao.css b/src/PagesAdm/gestao.css new file mode 100644 index 0000000..c881f06 --- /dev/null +++ b/src/PagesAdm/gestao.css @@ -0,0 +1,255 @@ + +.dashboard-container { + padding: 2rem; + font-family: 'Arial', sans-serif; + background-color: #f5f6fa; + min-height: 100vh; +} + + +.dashboard-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 2rem; +} + +.dashboard-title { + font-size: 20px; + font-weight: bold; + margin: 0; + color: #333; +} + +.dashboard-subtitle { + margin: 0.2rem 0 0 0; + color: #000; + font-size: 0.95rem; +} + +.new-user-btn { + background-color: #1e3a8a; + color: white; + padding: 0.6rem 1.2rem; + border: none; + border-radius: 8px; + font-size: 1rem; + cursor: pointer; + transition: background-color 0.3s, transform 0.25s ease, box-shadow 0.25s ease; +} + +.new-user-btn:hover { + background-color: #162d6b; + transform: translateY(-2px); + box-shadow: 0px 4px 12px rgba(30, 58, 138, 0.3); +} + + +.filters-container { + background: #fff; + border-radius: 12px; + padding: 1.5rem; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + margin-bottom: 2rem; + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.filters-container:hover { + transform: translateY(-3px); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); +} + +.filters-title { + font-size: 18px; + font-weight: bold; + margin-bottom: 0.3rem; + color: #333; +} + +.filters-subtitle { + font-size: 0.9rem; + color: #666; + margin-bottom: 1rem; +} + +.filters-content { + display: flex; + gap: 1rem; + align-items: center; +} + +.filters-input { + flex: 1; + padding: 0.6rem 1rem; + border: 1px solid #d1d5db; + border-radius: 8px; + font-size: 0.95rem; + color: #333; + transition: border-color 0.2s, box-shadow 0.2s; +} + +.filters-input:focus { + border-color: #1e3a8a; + box-shadow: 0px 0px 0px 3px rgba(30, 58, 138, 0.2); + outline: none; +} + +.filters-select { + padding: 0.6rem 1rem; + border: 1px solid #d1d5db; + border-radius: 8px; + font-size: 0.95rem; + background: #fff; + color: #333; + cursor: pointer; + transition: border-color 0.2s, box-shadow 0.2s; +} + +.filters-select:focus { + border-color: #1e3a8a; + box-shadow: 0px 0px 0px 3px rgba(30, 58, 138, 0.2); + outline: none; +} + + +.cards-container { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1.5rem; + margin-bottom: 2rem; +} + +.card { + background-color: white; + padding: 1.5rem; + border-radius: 12px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + border: 1px solid transparent; + transition: transform 0.25s ease, box-shadow 0.25s ease, border 0.25s ease, background 0.25s ease; + cursor: pointer; +} + +.card:hover { + transform: translateY(-6px); + box-shadow: 0 8px 20px rgba(30, 58, 138, 0.2); + background: #f8faff; + border: 1px solid #1e3a8a33; +} + +.card-label { + font-size: 0.9rem; + color: #999; + margin-bottom: 0.5rem; +} + +.card-value { + font-size: 1.8rem; + font-weight: bold; + margin: 0; + color: #333; +} + +.card-extra { + font-size: 0.85rem; + color: #666; +} + +.card-extra.positive { + color: #1e3a8a; +} + + +.user-table-container { + background: #fff; + border-radius: 12px; + padding: 1.5rem; + box-shadow: 0 4px 6px rgba(0,0,0,0.1); + margin-top: 2rem; + transition: transform 0.25s ease, box-shadow 0.25s ease; +} + +.user-table-container:hover { + transform: translateY(-4px); + box-shadow: 0 6px 14px rgba(0,0,0,0.15); +} + +.user-table-container h2 { + font-size: 18px; + font-weight: bold; + margin-bottom: 0.3rem; + color: #333; +} + +.user-table-container p { + font-size: 0.9rem; + color: #666; + margin-bottom: 1rem; +} + +.user-table { + width: 100%; + border-collapse: collapse; +} + +.user-table th, +.user-table td { + padding: 12px 15px; + text-align: left; + border-bottom: 1px solid #e0e0e0; +} + +.user-table th { + background-color: #f3f4f6; + color: #333; + font-weight: 600; +} + +.user-table tr { + transition: background-color 0.25s ease; +} + +.user-table tr:hover { + background-color: #f0f4ff; +} + +.profile-badge { + background-color: #1e3a8a; + color: #f7f7f7; + padding: 3px 8px; + border-radius: 8px; + font-size: 0.85rem; + display: inline-block; +} + +.status-badge { + padding: 3px 8px; + border-radius: 8px; + font-size: 0.85rem; + color: #fff; + display: inline-block; + text-transform: capitalize; +} + +.status-badge.ativo { + background-color: #28a745; +} + +.status-badge.inativo { + background-color: #dc3545; +} + +.actions { + display: flex; + gap: 10px; +} + +.action-icon { + cursor: pointer; + color: #555; + transition: color 0.2s, transform 0.2s; +} + +.action-icon:hover { + color: #1e3a8a; + transform: scale(1.2); +} diff --git a/src/PagesAdm/gestao.jsx b/src/PagesAdm/gestao.jsx new file mode 100644 index 0000000..40dd7f1 --- /dev/null +++ b/src/PagesAdm/gestao.jsx @@ -0,0 +1,142 @@ + +import React from "react"; +import "./gestao.css"; +import { FaEdit, FaTrash } from "react-icons/fa"; + + +function UserDashboard() { + return ( + +
+ +
+
+

Gestão de Usuários

+

+ Gerencie usuários, perfis e permissões do sistema +

+
+ +
+ +
+
+

Total de Usuários

+

15

+

+3 este mês

+
+
+

Usuários Ativos

+

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 +

+
+ + + +
+
+ +
+

Usuários do Sistema

+

Lista completa de usuários e suas permissões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NomeEmailPerfilDepartamentoStatusÚltimo AcessoAções
Ana Silvaana.silva@mediconnect.comGestão / CoordenaçãoAdministraçãoAtivo20/12/2024, 08:30 + + +
Dr. Carlos Santoscarlos.santos@mediconnect.comMédicoCardiologiaAtivo19/12/2024, 14:20 + + +
Maria Oliveiramaria.oliveira@mediconnect.comSecretáriaRecepçãoAtivo20/12/2024, 07:45 + + +
Dr. João Pereirajoao.pereira@mediconnect.comMédicoOrtopediaInativo15/12/2024, 16:30 + + +
+
+
+ ); +} + + +export default UserDashboard; \ No newline at end of file diff --git a/src/PagesAdm/painel.css b/src/PagesAdm/painel.css new file mode 100644 index 0000000..d476105 --- /dev/null +++ b/src/PagesAdm/painel.css @@ -0,0 +1,214 @@ +.painel-container { + padding: 2rem; + font-family: Arial, sans-serif; +} + +.painel-titulo { + font-size: 24px; + font-weight: bold; + margin-bottom: 0.5rem; +} + +.painel-subtitulo { + color: #666; + margin-bottom: 2rem; +} + +.painel-cards { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 1rem; +} + +.painel-card { + background: white; + border-radius: 10px; + padding: 1rem; + box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.1); + transition: transform 0.25s ease, box-shadow 0.25s ease, background 0.25s ease; + cursor: pointer; + border: 1px solid transparent; +} + + +.painel-card:hover { + transform: translateY(-6px); + box-shadow: 0px 8px 20px rgba(0, 102, 255, 0.2); + background: #f8faff; + border: 1px solid #0066ff33; +} + +.card-header { + display: flex; + justify-content: space-between; + font-size: 14px; + margin-bottom: 0.5rem; +} + +.badge { + background: #0066ff; + color: white; + padding: 2px 6px; + border-radius: 6px; + font-size: 12px; +} + +.card-numero { + font-size: 22px; + font-weight: bold; + margin: 0.3rem 0; +} + +.card-info { + font-size: 14px; + color: #666; +} + +.progress-bar { + background: #eee; + border-radius: 8px; + height: 8px; + margin-top: 0.5rem; + overflow: hidden; +} + +.progress-fill { + background: #0066ff; + height: 100%; + width: 80%; + border-radius: 8px; + transition: width 0.3s ease; +} + + +.painel-card:hover .progress-fill { + width: 90%; +} + +.painel-graficos { + margin-top: 2rem; + display: flex; + gap: 1.5rem; + flex-wrap: wrap; +} + +.grafico-card { + flex: 1; + min-width: 300px; + background: white; + border-radius: 10px; + padding: 1rem; + box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.1); + transition: transform 0.25s ease, box-shadow 0.25s ease; +} + + +.grafico-card:hover { + transform: translateY(-4px); + box-shadow: 0px 6px 16px rgba(0, 0, 0, 0.15); +} + +.grafico-titulo { + font-size: 16px; + font-weight: bold; + margin-bottom: 0.2rem; +} + +.grafico-subtitulo { + font-size: 13px; + color: #666; + margin-bottom: 1rem; +} + + +.performance-container { + background: #fff; + border-radius: 10px; + padding: 1.5rem; + box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.1); + margin-top: 2rem; +} + +.performance-titulo { + font-size: 20px; + font-weight: bold; + margin-bottom: 0.2rem; +} + +.performance-subtitulo { + font-size: 14px; + color: #666; + margin-bottom: 1.5rem; +} + +.departamento { + margin-bottom: 1.2rem; +} + +.departamento-label { + display: flex; + justify-content: space-between; + font-size: 14px; + margin-bottom: 0.4rem; +} + +.departamento-barra { + background: #f0f2f5; + border-radius: 6px; + height: 10px; + overflow: hidden; +} + +.departamento-fill { + background: #001a40; + height: 100%; + width: 0%; + border-radius: 6px; + transition: width 0.4s ease; +} + + +.departamento-fill.ativo { + width: var(--percent, 0%); +} +.department-row { + display: flex; + align-items: center; + justify-content: space-between; + margin: 0.5rem 0; +} + +.department-name { + font-weight: bold; + color: #000; + min-width: 120px; +} + +.progress-wrapper { + display: flex; + align-items: center; + flex: 1; + gap: 0.5rem; +} + +.progress-bar { + flex: 1; + background: #eee; + border-radius: 8px; + height: 8px; + overflow: hidden; +} + +.progress-fill { + background: #0066ff; + height: 100%; + border-radius: 8px; + transition: width 0.3s ease; +} + +.department-info { + font-size: 13px; + color: #333; + white-space: nowrap; +} + diff --git a/src/PagesAdm/painel.jsx b/src/PagesAdm/painel.jsx new file mode 100644 index 0000000..f37716b --- /dev/null +++ b/src/PagesAdm/painel.jsx @@ -0,0 +1,193 @@ +import React from "react"; +import { + PieChart, + Pie, + Cell, + Tooltip, + BarChart, + Bar, + XAxis, + YAxis, + CartesianGrid, + ResponsiveContainer +} from "recharts"; +import "./painel.css"; + +export default function PainelAdministrativo() { + + const profileData = [ + { name: "Médico", value: 8 }, + { name: "Secretária", value: 5 }, + { name: "Gestão / Coordena", value: 3 }, + ]; + const COLORS = ["#1e3a8a", "#051AFF", "#0066ff"]; + + + const activityData = [ + { name: "Hoje", value: 10 }, + { name: "Esta Semana", value: 14 }, + { name: "Este Mês", value: 15 }, + ]; + + + const departamentos = [ + { nome: "Cardiologia", ativos: 3, total: 3 }, + { nome: "Ortopedia", ativos: 1, total: 2 }, + { nome: "Neurologia", ativos: 2, total: 2 }, + { nome: "Administração", ativos: 2, total: 2 }, + { nome: "Recepção", ativos: 5, total: 6 }, + ]; + + return ( +
+

Painel Administrativo

+

+ Visão geral completa do sistema MediConnect +

+ + +
+ +
+
+ Total de Usuários + 15 +
+

12

+

3 inativos

+
+
+
+
+ + +
+
+ Novos Usuários + +3 +
+

Este Mês

+

+20% comparado ao mês anterior

+
+ + +
+
+ Tempo Médio de Sessão +
+

2h 30min

+

+5% comparado à semana anterior

+
+ + +
+
+ Taxa de Atividade +
+

80.0%

+

Usuários ativos vs total

+
+
+ + +
+
+

Distribuição por Perfil

+

+ Quantidade de usuários por tipo de perfil +

+ + + `${name}: ${value}`} + > + {profileData.map((entry, index) => ( + + ))} + + + + +
+ + +
+

Atividade de Usuários

+

Usuários ativos por período

+ + + + + + + + + +
+
+ + +
+

Performance por Departamento

+

+ Atividade e engajamento dos usuários por departamento +

+ {departamentos.map((dep, index) => { + const percentual = Math.round((dep.ativos / dep.total) * 100); + return ( +
+ + + {dep.nome} + + + +
+
+
+ + + + {dep.ativos}/{dep.total} ({percentual}%) + +
+ ); + })} +
+
+ ); +} diff --git a/src/components/Sidebar.jsx b/src/components/Sidebar.jsx index 67fdde0..d9c065a 100644 --- a/src/components/Sidebar.jsx +++ b/src/components/Sidebar.jsx @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { Link } from "react-router-dom"; -import menuItems from "../data/sidebar-items-medico.json"; // Use "sidebar-items-secretaria.json" para secretaria +import menuItems from "../data/sidebar-items-medico.json"; // Use "sidebar-items-secretaria.json" para secretaria e "sidebar-items-adm.json" para ADM function Sidebar() { const [isActive, setIsActive] = useState(true); diff --git a/src/data/sidebar-items-adm.json b/src/data/sidebar-items-adm.json new file mode 100644 index 0000000..907d2a3 --- /dev/null +++ b/src/data/sidebar-items-adm.json @@ -0,0 +1,60 @@ +[ + { + "name": "Menu", + "isTitle": true + }, + + { + "name":"Início", + "url": "/", + "icon": "house" + }, + + { + "name": "Cadastro de Pacientes", + "url": "/pacientes/cadastro", + "icon": "heart-pulse-fill" + }, + + { + "name": "Cadastro do Médico", + "url": "/medicos/cadastro", + "icon": "capsule" + }, + + { + "name": "Lista de Pacientes", + "icon": "clipboard-heart-fill", + "url": "/pacientes" + }, + + { + "name": "Lista de Médico", + "icon": "hospital-fill", + "url": "/medicos" + }, + { + "name": "Agendar consulta", + "icon": "calendar-plus-fill", + "url": "/agendamento" + }, + + { + "name": "Gestão de Usuários", + "icon": "person-badge-fill", + "url": "/gestao" + }, + + { + "name": "Painel Administrativo", + "icon": "file-bar-graph-fill", + "url": "/painel" + }, + + { + "name": "Laudo do Paciente", + "icon": "table", + "url": "/laudo" + } + +] \ No newline at end of file diff --git a/src/perfis/Perfil_adm/Perfiladm.jsx b/src/perfis/Perfil_adm/Perfiladm.jsx new file mode 100644 index 0000000..cc32f5f --- /dev/null +++ b/src/perfis/Perfil_adm/Perfiladm.jsx @@ -0,0 +1,46 @@ +import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; +import Sidebar from "../../components/Sidebar"; +import Inicio from "../../pages/Inicio"; +import TablePaciente from "../../pages/TablePaciente"; +import PatientCadastroManager from "../../pages/PatientCadastroManager"; +import DoctorCadastroManager from "../../pages/DoctorCadastroManager"; +import DoctorTable from "../../pages/DoctorTable"; +import Agendamento from "../../pages/Agendamento"; +import LaudoManager from "../../pages/LaudoManager"; +import Details from "../../pages/Details"; +import EditPage from "../../pages/EditPage"; +import DoctorDetails from "../../pages/DoctorDetails"; +import DoctorEditPage from "../../pages/DoctorEditPage"; +import UserDashboard from '../../PagesAdm/gestao.jsx'; +import PainelAdministrativo from '../../PagesAdm/painel.jsx'; +// ...restante do código... +function Perfiladm() { + return ( + +
+ +
+ + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + Página não encontrada} /> + +
+
+
+ ); +} + +export default Perfiladm; \ No newline at end of file