From 48e845c243ae21d750e87c98d42136eff7554094 Mon Sep 17 00:00:00 2001 From: Marcos Reifonas Date: Thu, 24 Sep 2026 17:32:17 +0000 Subject: [PATCH] fix(users): resolve visibility of new users and persistence of matrix templates & 3D rotation --- src/hooks/useMatrizAcessos.ts | 31 +++++++++++++++++++++++++++++++ src/hooks/useUserManagement.tsx | 14 +++++++------- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/hooks/useMatrizAcessos.ts b/src/hooks/useMatrizAcessos.ts index 282336b..2ff85fe 100644 --- a/src/hooks/useMatrizAcessos.ts +++ b/src/hooks/useMatrizAcessos.ts @@ -345,6 +345,22 @@ export const useMatrizAcessos = () => { ); try { + // Garantir que a chave do recurso exista em interface_resources para evitar erro de Foreign Key + const { error: resourceError } = await supabase + .from('interface_resources') + .upsert( + { + resource_key: resourceKey, + resource_name: resourceKey, + is_submenu: false + }, + { onConflict: 'resource_key' } + ); + + if (resourceError) { + console.error('Erro ao registrar recurso na tabela interface_resources:', resourceError); + } + // 1. Gravação direta e individual por usuário na tabela user_interface_permissions (Prioridade Máxima) const dbPermission = novoNivel === 'criar' @@ -403,6 +419,21 @@ export const useMatrizAcessos = () => { ); try { + // Garantir que todos os recursos do template existam em interface_resources + const resourceRecords = Object.keys(novoMap).map(resKey => ({ + resource_key: resKey, + resource_name: resKey, + is_submenu: false + })); + + const { error: resourceError } = await supabase + .from('interface_resources') + .upsert(resourceRecords, { onConflict: 'resource_key' }); + + if (resourceError) { + console.error('Erro ao registrar recursos na tabela interface_resources:', resourceError); + } + // 1. Gravação direta em lote na tabela user_interface_permissions const uipRecords = Object.entries(novoMap).map(([resKey, nivel]) => ({ user_id: userId, diff --git a/src/hooks/useUserManagement.tsx b/src/hooks/useUserManagement.tsx index 4136a18..3963a68 100644 --- a/src/hooks/useUserManagement.tsx +++ b/src/hooks/useUserManagement.tsx @@ -94,14 +94,14 @@ export function useUserManagement() { .from('profiles') .select(` *, - functions (name, description), - privileges (name, description, permissions) + functions:function_id (name, description), + privileges:privilege_id (name, description, permissions) `) .neq('status', 'pending') .order('created_at', { ascending: false }); if (error) throw error; - setUsers(data || []); + setUsers((data as any) || []); } catch (error) { console.error('Error fetching users:', error); toast.error('Erro ao carregar usuários'); @@ -150,7 +150,7 @@ export function useUserManagement() { .order('name'); if (error) throw error; - setPrivileges(data || []); + setPrivileges((data as any) || []); } catch (error) { console.error('Error fetching privileges:', error); toast.error('Erro ao carregar privilégios'); @@ -215,7 +215,7 @@ export function useUserManagement() { const err = error as Error; if (err.message?.includes('User with this email already exists')) { toast.error('Este e-mail já está em uso'); - } else if (error.message?.includes('Only admins can create new users')) { + } else if (err.message?.includes('Only admins can create new users')) { toast.error('Apenas administradores podem criar usuários'); } else { toast.error('Erro ao criar usuário'); @@ -403,7 +403,7 @@ export function useUserManagement() { .from('privileges') .insert({ ...data, - permissions: data.permissions || {} + permissions: (data.permissions as any) || {} }) .select() .single(); @@ -429,7 +429,7 @@ export function useUserManagement() { try { const { error } = await supabase .from('privileges') - .update(data) + .update(data as any) .eq('id', id); if (error) throw error;