import { Component, OnInit, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { RoleService } from '../../services/role.service'; import { HlmButton } from '@spartan-ng/helm/button'; interface ResourceItem { name: string; label: string; } @Component({ selector: 'app-role-permissions', standalone: true, imports: [CommonModule, FormsModule, HlmButton], templateUrl: './role-permissions.component.html', styleUrl: './role-permissions.component.css' }) export class RolePermissionsComponent implements OnInit { private roleService = inject(RoleService); roles: any[] = []; selectedRole: any = null; newRoleName = ''; isSaving = false; successMessage = ''; errorMessage = ''; resources: ResourceItem[] = [ { name: 'cabin', label: 'Cabines' }, { name: 'company', label: 'Empresas' }, { name: 'role', label: 'Perfis de Acesso' } ]; ngOnInit(): void { this.loadRoles(); } loadRoles(): void { this.roleService.list({}).subscribe({ next: (res: any) => { this.roles = res?.items || []; if (this.roles.length > 0 && !this.selectedRole) { this.selectRole(this.roles[0]); } else if (this.selectedRole) { const updated = this.roles.find(r => r.id === this.selectedRole.id); if (updated) this.selectRole(updated); } }, error: (err: any) => { this.errorMessage = 'Erro ao carregar perfis de acesso.'; } }); } selectRole(role: any): void { // Clona para evitar modificar a referência original antes de salvar this.selectedRole = { ...role, permissions: [...(role.permissions || [])] }; this.successMessage = ''; this.errorMessage = ''; } createRole(): void { if (!this.newRoleName.trim()) return; this.roleService.create({ name: this.newRoleName.trim(), permissions: [] }).subscribe({ next: (created: any) => { this.newRoleName = ''; this.successMessage = 'Perfil de acesso criado com sucesso!'; this.selectedRole = created; this.loadRoles(); }, error: (err: any) => { this.errorMessage = err?.error?.message || 'Erro ao criar perfil de acesso.'; } }); } hasPermission(action: string, resource: string): boolean { if (!this.selectedRole) return false; if (this.selectedRole.permissions.includes('*')) return true; const permission = `${action}:${resource}`; return this.selectedRole.permissions.includes(permission); } togglePermission(action: string, resource: string): void { if (!this.selectedRole) return; const permission = `${action}:${resource}`; const index = this.selectedRole.permissions.indexOf(permission); if (index > -1) { this.selectedRole.permissions.splice(index, 1); } else { this.selectedRole.permissions.push(permission); } } hasSpecialPermission(permission: string): boolean { if (!this.selectedRole) return false; if (this.selectedRole.permissions.includes('*')) return true; return this.selectedRole.permissions.includes(permission); } toggleSpecialPermission(permission: string): void { if (!this.selectedRole) return; const index = this.selectedRole.permissions.indexOf(permission); if (index > -1) { this.selectedRole.permissions.splice(index, 1); } else { this.selectedRole.permissions.push(permission); } } savePermissions(): void { if (!this.selectedRole) return; this.isSaving = true; this.successMessage = ''; this.errorMessage = ''; // Se for o perfil do Administrador, garantimos que a permissão curinga '*' continue salva if (this.selectedRole.name === 'Administrador' && !this.selectedRole.permissions.includes('*')) { this.selectedRole.permissions.push('*'); } this.roleService.update(this.selectedRole.id, this.selectedRole).subscribe({ next: (updated: any) => { this.isSaving = false; this.successMessage = 'Permissões do perfil atualizadas com sucesso!'; // Atualiza a lista local com os novos valores this.loadRoles(); }, error: (err: any) => { this.isSaving = false; this.errorMessage = err?.error?.message || 'Erro ao salvar permissões do perfil.'; } }); } }