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;
|
handleAbrirProntuario: (paciente: any) => void;
|
||||||
setActiveSection: (section: string) => 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 (
|
return (
|
||||||
<div className="bg-card shadow-md rounded-lg p-6">
|
<div className="bg-card shadow-md rounded-lg p-6">
|
||||||
<h2 className="text-2xl font-bold mb-4">Gerenciamento de Pacientes</h2>
|
<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 */}
|
{/* Tabela de pacientes padrão */}
|
||||||
<div>
|
<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 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>
|
</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>
|
</div>
|
||||||
</TableCell>
|
</TableCell>
|
||||||
</TableRow>
|
</TableRow>
|
||||||
|
|||||||
@ -24,7 +24,6 @@ import {
|
|||||||
UserCheck,
|
UserCheck,
|
||||||
FileText,
|
FileText,
|
||||||
BarChart3,
|
BarChart3,
|
||||||
Settings,
|
|
||||||
Stethoscope,
|
Stethoscope,
|
||||||
User,
|
User,
|
||||||
} from "lucide-react"
|
} from "lucide-react"
|
||||||
@ -36,7 +35,6 @@ const navigation = [
|
|||||||
{ name: "Médicos", href: "/doutores", icon: User },
|
{ name: "Médicos", href: "/doutores", icon: User },
|
||||||
{ name: "Consultas", href: "/consultas", icon: UserCheck },
|
{ name: "Consultas", href: "/consultas", icon: UserCheck },
|
||||||
{ name: "Relatórios", href: "/dashboard/relatorios", icon: BarChart3 },
|
{ name: "Relatórios", href: "/dashboard/relatorios", icon: BarChart3 },
|
||||||
{ name: "Configurações", href: "/configuracao", icon: Settings },
|
|
||||||
]
|
]
|
||||||
|
|
||||||
export function Sidebar() {
|
export function Sidebar() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user