add-dark-mode-and-removing-pages #35

Merged
Jonasbomfim merged 10 commits from feature/fix-erros into develop 2025-10-03 17:28:33 +00:00
8 changed files with 2 additions and 398 deletions
Showing only changes of commit ca3ec16c27 - Show all commits

View File

@ -1,34 +0,0 @@
"use client"
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"
export default function AgendaConfigPage() {
return (
<div className="p-6 space-y-6">
<h1 className="text-2xl font-bold">Configurações da Agenda</h1>
<Card>
<CardHeader>
<CardTitle>Tempo padrão de consulta</CardTitle>
</CardHeader>
<CardContent>
<select className="border rounded p-2">
<option>15 minutos</option>
<option>30 minutos</option>
<option>1 hora</option>
</select>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Horário de funcionamento</CardTitle>
</CardHeader>
<CardContent>
<input type="time" className="border rounded p-2 mr-2" /> até
<input type="time" className="border rounded p-2 ml-2" />
</CardContent>
</Card>
</div>
)
}

View File

@ -1,36 +0,0 @@
"use client"
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"
export default function ComunicacaoConfigPage() {
return (
<div className="p-6 space-y-6">
<h1 className="text-2xl font-bold">Configurações de Comunicação</h1>
<Card>
<CardHeader>
<CardTitle>Modelo de Lembrete</CardTitle>
</CardHeader>
<CardContent>
<textarea
className="w-full border rounded p-2"
placeholder="Exemplo: Olá {nome}, sua consulta está marcada para {data} às {hora}."
/>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Frequência de Lembretes</CardTitle>
</CardHeader>
<CardContent>
<select className="border rounded p-2">
<option>24 horas antes</option>
<option>4 horas antes</option>
<option>1 hora antes</option>
</select>
</CardContent>
</Card>
</div>
)
}

View File

@ -1,25 +0,0 @@
"use client"
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"
export default function NotificacoesConfigPage() {
return (
<div className="p-6 space-y-6">
<h1 className="text-2xl font-bold">Configurações de Notificações</h1>
<Card>
<CardHeader>
<CardTitle>Alertas Internos</CardTitle>
</CardHeader>
<CardContent>
<label className="flex items-center space-x-2">
<input type="checkbox" className="h-4 w-4" /> <span>Notificar quando consulta for cancelada</span>
</label>
<label className="flex items-center space-x-2 mt-2">
<input type="checkbox" className="h-4 w-4" /> <span>Notificar quando novo paciente for cadastrado</span>
</label>
</CardContent>
</Card>
</div>
)
}

View File

@ -1,77 +0,0 @@
"use client"
import Link from "next/link"
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"
import {
Calendar,
MessageSquare,
Bell,
Users,
ShieldCheck,
} from "lucide-react"
export default function ConfiguracaoPage() {
const items = [
{
title: "Agenda",
desc: "Defina horários e bloqueios",
href: "/dashboard/configuracao/agenda",
icon: Calendar,
},
{
title: "Comunicação",
desc: "Gerencie mensagens automáticas",
href: "/dashboard/configuracao/comunicacao",
icon: MessageSquare,
},
{
title: "Notificações",
desc: "Configure alertas internos",
href: "/dashboard/configuracao/notificacoes",
icon: Bell,
},
{
title: "Usuários",
desc: "Controle acessos e permissões",
href: "/dashboard/configuracao/usuarios",
icon: Users,
},
{
title: "Segurança",
desc: "Senhas, privacidade e LGPD",
href: "/dashboard/configuracao/seguranca",
icon: ShieldCheck,
},
]
return (
<div className="p-6 space-y-6 bg-background">
{/* título */}
<h1 className="text-2xl font-bold text-foreground">Configurações</h1>
{/* introdução */}
<p className="text-muted-foreground">
Ajuste os principais parâmetros do sistema. Escolha uma das seções abaixo
para configurar horários, mensagens, notificações internas, permissões de usuários
e regras de segurança da clínica.
</p>
{/* grid de cards */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{items.map((item) => (
<Link key={item.title} href={item.href}>
<Card className="cursor-pointer hover:shadow-md transition">
<CardHeader className="flex flex-row items-center gap-2">
<item.icon className="w-5 h-5 text-primary" />
<CardTitle>{item.title}</CardTitle>
</CardHeader>
<CardContent>
<p className="text-sm text-muted-foreground">{item.desc}</p>
</CardContent>
</Card>
</Link>
))}
</div>
</div>
)
}

View File

@ -1,33 +0,0 @@
"use client"
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"
export default function SegurancaConfigPage() {
return (
<div className="p-6 space-y-6">
<h1 className="text-2xl font-bold">Configurações de Segurança</h1>
<Card>
<CardHeader>
<CardTitle>Alterar Senha</CardTitle>
</CardHeader>
<CardContent>
<input type="password" placeholder="Senha atual" className="w-full border rounded p-2 mb-2" />
<input type="password" placeholder="Nova senha" className="w-full border rounded p-2 mb-2" />
<input type="password" placeholder="Confirmar nova senha" className="w-full border rounded p-2" />
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Política de Dados (LGPD)</CardTitle>
</CardHeader>
<CardContent>
<label className="flex items-center space-x-2">
<input type="checkbox" className="h-4 w-4" /> <span>Solicitar consentimento do paciente no cadastro</span>
</label>
</CardContent>
</Card>
</div>
)
}

View File

@ -1,37 +0,0 @@
"use client"
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"
export default function UsuariosConfigPage() {
return (
<div className="p-6 space-y-6">
<h1 className="text-2xl font-bold">Gerenciamento de Usuários</h1>
<Card>
<CardHeader>
<CardTitle>Usuários da Clínica</CardTitle>
</CardHeader>
<CardContent>
<table className="w-full border">
<thead>
<tr className="bg-gray-100">
<th className="p-2 text-left">Nome</th>
<th className="p-2 text-left">Email</th>
<th className="p-2 text-left">Permissão</th>
<th className="p-2">Ações</th>
</tr>
</thead>
<tbody>
<tr>
<td className="p-2">Maria Silva</td>
<td className="p-2">maria@clinica.com</td>
<td className="p-2">Secretária</td>
<td className="p-2">[Editar] [Remover]</td>
</tr>
</tbody>
</table>
</CardContent>
</Card>
</div>
)
}

View File

@ -583,150 +583,11 @@ const ProfissionalPage = () => {
handleAbrirProntuario: (paciente: any) => void;
setActiveSection: (section: string) => void;
}) {
// Estados para busca de pacientes
const [buscaPaciente, setBuscaPaciente] = useState("");
const [pacientesBusca, setPacientesBusca] = useState<any[]>([]);
const [carregandoBusca, setCarregandoBusca] = useState(false);
const [erroBusca, setErroBusca] = useState<string | null>(null);
// Função para buscar pacientes
const handleBuscarPaciente = async () => {
if (!buscaPaciente.trim()) {
setPacientesBusca([]);
setErroBusca(null);
return;
}
setCarregandoBusca(true);
setErroBusca(null);
try {
// Importa a função de busca
const { buscarPacientes } = await import("@/lib/api");
const resultados = await buscarPacientes(buscaPaciente.trim());
if (resultados.length === 0) {
setErroBusca("Nenhum paciente encontrado com os critérios informados.");
setPacientesBusca([]);
} else {
// Transforma os dados da API para o formato usado no componente
const pacientesFormatados = resultados.map(p => ({
nome: p.full_name || "Nome não informado",
cpf: p.cpf || "CPF não informado",
idade: p.birth_date ? new Date().getFullYear() - new Date(p.birth_date).getFullYear() : "N/A",
statusLaudo: "Pendente", // Status padrão
id: p.id
}));
setPacientesBusca(pacientesFormatados);
setErroBusca(null);
}
} catch (error: any) {
console.error("Erro ao buscar pacientes:", error);
setErroBusca(error.message || "Erro ao buscar pacientes. Tente novamente.");
setPacientesBusca([]);
} finally {
setCarregandoBusca(false);
}
};
const handleLimparBusca = () => {
setBuscaPaciente("");
setPacientesBusca([]);
setErroBusca(null);
};
return (
<div className="bg-card shadow-md rounded-lg p-6">
<h2 className="text-2xl font-bold mb-4">Gerenciamento de Pacientes</h2>
{/* Campo de busca */}
<div className="mb-6 p-4 bg-muted rounded-lg">
<h3 className="text-lg font-semibold mb-3">Buscar Paciente</h3>
<div className="flex gap-2">
<div className="flex-1">
<Input
placeholder="Digite ID, CPF, nome ou email do paciente..."
value={buscaPaciente}
onChange={(e) => setBuscaPaciente(e.target.value)}
onKeyDown={(e) => e.key === "Enter" && handleBuscarPaciente()}
className="w-full"
/>
</div>
<Button
onClick={handleBuscarPaciente}
disabled={carregandoBusca}
className="flex items-center gap-2"
>
{carregandoBusca ? (
<>
<div className="animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full"></div>
Buscando...
</>
) : (
<>
<User className="h-4 w-4" />
Buscar
</>
)}
</Button>
{(buscaPaciente || pacientesBusca.length > 0 || erroBusca) && (
<Button
variant="outline"
onClick={handleLimparBusca}
className="flex items-center gap-2"
>
<X className="h-4 w-4" />
Limpar
</Button>
)}
</div>
{/* Resultados da busca */}
{erroBusca && (
<div className="mt-3 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md">
<p className="text-red-700 dark:text-red-300 text-sm">{erroBusca}</p>
</div>
)}
{pacientesBusca.length > 0 && (
<div className="mt-4">
<h4 className="text-md font-medium mb-2">Resultados da busca ({pacientesBusca.length}):</h4>
<div className="space-y-2">
{pacientesBusca.map((paciente, index) => (
<div key={index} className="flex items-center justify-between p-3 bg-card border rounded-lg hover:shadow-sm">
<div>
<p className="font-medium">{paciente.nome}</p>
<p className="text-sm text-muted-foreground">CPF: {paciente.cpf} Idade: {paciente.idade} anos</p>
</div>
<div className="flex items-center gap-2">
<Button
size="sm"
onClick={() => {
handleAbrirProntuario(paciente);
setActiveSection('prontuario');
}}
className="flex items-center gap-2"
>
<FolderOpen className="h-4 w-4" />
Prontuário
</Button>
<Button
size="sm"
variant="outline"
onClick={() => handleEditarLaudo(paciente)}
className="flex items-center gap-2 border-green-600 text-green-600 hover:bg-green-600 hover:text-white"
>
<FileText className="h-4 w-4" />
Editar Laudo
</Button>
</div>
</div>
))}
</div>
</div>
)}
</div>
{/* Tabela de pacientes padrão */}
<div>
@ -767,20 +628,7 @@ const ProfissionalPage = () => {
<div className="absolute top-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-l-4 border-r-4 border-t-4 border-transparent border-t-gray-900 dark:border-t-gray-100"></div>
</div>
</div>
<div className="relative group">
<Button
variant="outline"
size="sm"
className="border-green-600 text-green-600 hover:bg-green-600 hover:text-white cursor-pointer"
onClick={() => handleEditarLaudo(paciente)}
>
<FileText className="h-4 w-4" />
</Button>
<div className="absolute bottom-full left-1/2 transform -translate-x-1/2 mb-2 px-3 py-1 bg-gray-900 dark:bg-gray-100 text-white dark:text-gray-900 text-xs rounded-md opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none whitespace-nowrap z-50">
Editar laudo do paciente
<div className="absolute top-full left-1/2 transform -translate-x-1/2 w-0 h-0 border-l-4 border-r-4 border-t-4 border-transparent border-t-gray-900 dark:border-t-gray-100"></div>
</div>
</div>
</div>
</TableCell>
</TableRow>

View File

@ -24,7 +24,6 @@ import {
UserCheck,
FileText,
BarChart3,
Settings,
Stethoscope,
User,
} from "lucide-react"
@ -36,7 +35,6 @@ const navigation = [
{ name: "Médicos", href: "/doutores", icon: User },
{ name: "Consultas", href: "/consultas", icon: UserCheck },
{ name: "Relatórios", href: "/dashboard/relatorios", icon: BarChart3 },
{ name: "Configurações", href: "/configuracao", icon: Settings },
]
export function Sidebar() {