refactor: update user role management and enhance UI components

- Updated the user role management logic to improve type safety and error handling, including better handling of role permissions and user associations.
- Refactored the UI components for user management, enhancing the layout and styling for better user experience.
- Removed outdated code related to menu permissions and streamlined the database schema for roles and profiles.
- Improved the overall structure and readability of the codebase, ensuring consistency across components.
This commit is contained in:
2025-11-03 15:12:10 -03:00
parent 5cb63f9437
commit c1d9958c9f
10 changed files with 749 additions and 494 deletions

View File

@@ -4,18 +4,35 @@
import StatsCard from "$lib/components/ti/StatsCard.svelte";
const client = useConvexClient();
const usuarios = useQuery(api.usuarios.listar, {});
const usuariosQuery = useQuery(api.usuarios.listar, {});
// Verificar se está carregando
const carregando = $derived(usuariosQuery === undefined);
// Extrair dados dos usuários
const usuarios = $derived(usuariosQuery?.data ?? []);
// Estatísticas derivadas
const stats = $derived.by(() => {
if (!usuarios?.data || !Array.isArray(usuarios.data)) return null;
// Se ainda está carregando, retorna null para mostrar loading
if (carregando) return null;
const ativos = usuarios.data.filter(u => u.ativo && !u.bloqueado).length;
const bloqueados = usuarios.data.filter(u => u.bloqueado).length;
const inativos = usuarios.data.filter(u => !u.ativo).length;
// Se não há usuários, retorna stats zeradas (mas não null para não mostrar loading)
if (!Array.isArray(usuarios) || usuarios.length === 0) {
return {
total: 0,
ativos: 0,
bloqueados: 0,
inativos: 0
};
}
const ativos = usuarios.filter(u => u.ativo && !u.bloqueado).length;
const bloqueados = usuarios.filter(u => u.bloqueado === true).length;
const inativos = usuarios.filter(u => !u.ativo).length;
return {
total: usuarios.data.length,
total: usuarios.length,
ativos,
bloqueados,
inativos
@@ -52,7 +69,7 @@
<StatsCard
title="Usuários Ativos"
value={stats.ativos}
description="{((stats.ativos / stats.total) * 100).toFixed(1)}% do total"
description="{stats.total > 0 ? ((stats.ativos / stats.total) * 100).toFixed(1) + '% do total' : '0% do total'}"
icon='<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" />'
color="success"
/>