feat: implement LGPD compliance features including data request management, consent tracking, and statistics display in the dashboard for enhanced data protection compliance

This commit is contained in:
2025-12-01 22:37:43 -03:00
parent 95c3b48ae6
commit fec5f5c33d
14 changed files with 3231 additions and 5 deletions

View File

@@ -2,11 +2,12 @@
import { useQuery, useConvexClient } from "convex-svelte";
import { api } from "@sgse-app/backend/convex/_generated/api";
import StatsCard from "$lib/components/ti/StatsCard.svelte";
import { BarChart3, Users, CheckCircle2, Ban, Clock, Plus, Layers, FileText, Info } from "lucide-svelte";
import { BarChart3, Users, CheckCircle2, Ban, Clock, Plus, Layers, FileText, Info, Shield, AlertTriangle } from "lucide-svelte";
import { resolve } from "$app/paths";
const client = useConvexClient();
const usuariosQuery = useQuery(api.usuarios.listar, {});
const estatisticasLGPD = useQuery(api.lgpd.obterEstatisticasLGPD, {});
// Verificar se está carregando
const carregando = $derived(usuariosQuery === undefined);
@@ -96,6 +97,54 @@
</div>
{/if}
<!-- LGPD Stats Cards -->
{#if estatisticasLGPD}
<div class="card bg-base-100 shadow-xl mb-8">
<div class="card-body">
<div class="flex items-center justify-between mb-4">
<h2 class="card-title text-2xl">LGPD - Proteção de Dados</h2>
<a href={resolve("/ti/lgpd")} class="btn btn-sm btn-primary">
<Shield class="h-4 w-4" />
Acessar LGPD
</a>
</div>
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
<StatsCard
title="Solicitações Pendentes"
value={estatisticasLGPD.solicitacoesPendentes}
description="Aguardando resposta"
Icon={AlertTriangle}
color="warning"
/>
<StatsCard
title="Solicitações Vencendo"
value={estatisticasLGPD.solicitacoesVencendo}
description="Prazo próximo"
Icon={AlertTriangle}
color="error"
/>
<StatsCard
title="Total de Solicitações"
value={estatisticasLGPD.totalSolicitacoes}
description="Todas as solicitações"
Icon={FileText}
color="info"
/>
<StatsCard
title="Consentimentos Ativos"
value={estatisticasLGPD.consentimentosAtivos}
description="Consentimentos válidos"
Icon={CheckCircle2}
color="success"
/>
</div>
</div>
</div>
{/if}
<!-- Ações Rápidas -->
<div class="card bg-base-100 shadow-xl mb-8">
<div class="card-body">
@@ -115,6 +164,11 @@
<FileText class="h-5 w-5" strokeWidth={2} />
Ver Logs
</a>
<a href={resolve("/ti/lgpd")} class="btn btn-info">
<Shield class="h-5 w-5" strokeWidth={2} />
LGPD
</a>
</div>
</div>
</div>