add-dark-mode-and-removing-pages #35
@ -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>
|
||||
)
|
||||
}
|
||||
@ -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>
|
||||
)
|
||||
}
|
||||
@ -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>
|
||||
)
|
||||
}
|
||||
@ -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>
|
||||
)
|
||||
}
|
||||
@ -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>
|
||||
)
|
||||
}
|
||||
@ -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>
|
||||
)
|
||||
}
|
||||
@ -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>
|
||||
|
||||
@ -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() {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user