import React, { useState } from 'react'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Switch } from '@/components/ui/switch'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { SlidersHorizontal, Search, CheckCircle2, Save, RotateCcw, Shield, Factory, Box, Truck, HardHat, Sparkles, Lock, ArrowUpDown, Layers, AlertTriangle, Download, Network, UploadCloud, Compass, Barcode, PackageCheck, CheckSquare, Activity, Settings, Crown, Wrench, Calendar, Trash2, FileSpreadsheet, PlusCircle, PlusSquare, Edit3, FileText, Printer, FileInput, ShoppingCart, CheckCheck, AlertCircle, Settings2, Users, ShieldCheck, KeyRound, } from 'lucide-react'; import { useGrupoAvancadoPermissions } from '@/hooks/useGrupoAvancadoPermissions'; interface MatrizGrupoAvancadoModalProps { grupoKey: string | null; isOpen: boolean; onClose: () => void; } export const MatrizGrupoAvancadoModal: React.FC = ({ grupoKey, isOpen, onClose, }) => { const { config, loading, saving, users, selectedUserId, setSelectedUserId, selectedUser, toggleRegra, aplicarTemplate, salvarConfiguracaoUsuario, recarregar, } = useGrupoAvancadoPermissions(isOpen ? grupoKey : null); const [busca, setBusca] = useState(''); if (!config) return null; const usersFiltrados = users.filter((u) => { const termo = busca.toLowerCase(); return ( u.fullName.toLowerCase().includes(termo) || u.email.toLowerCase().includes(termo) || u.functionName.toLowerCase().includes(termo) ); }); const corBadge: Record = { sky: 'bg-sky-500/15 text-sky-400 border-sky-500/40', indigo: 'bg-indigo-500/15 text-indigo-400 border-indigo-500/40', amber: 'bg-amber-500/15 text-amber-400 border-amber-500/40', teal: 'bg-teal-500/15 text-teal-400 border-teal-500/40', rose: 'bg-rose-500/15 text-rose-400 border-rose-500/40', }; const corFundoIcone: Record = { sky: 'bg-sky-500/15 text-sky-400 border-sky-500/30', indigo: 'bg-indigo-500/15 text-indigo-400 border-indigo-500/30', amber: 'bg-amber-500/15 text-amber-400 border-amber-500/30', teal: 'bg-teal-500/15 text-teal-400 border-teal-500/30', rose: 'bg-rose-500/15 text-rose-400 border-rose-500/30', }; const getIconComponent = (icone: string) => { switch (icone) { case 'Calendar': return ; case 'Lock': return ; case 'ArrowUpDown': return ; case 'Layers': return ; case 'Trash2': return ; case 'FileSpreadsheet': return ; case 'PlusCircle': return ; case 'PlusSquare': return ; case 'Edit3': return ; case 'UploadCloud': return ; case 'Network': return ; case 'Download': return ; case 'FileText': return ; case 'PackageCheck': return ; case 'CheckSquare': return ; case 'RotateCcw': return ; case 'Printer': return ; case 'SlidersHorizontal': return ; case 'FileInput': return ; case 'ShoppingCart': return ; case 'CheckCheck': return ; case 'AlertCircle': return ; case 'Settings2': return ; case 'Users': return ; case 'ShieldCheck': return ; case 'KeyRound': return ; case 'Activity': return ; case 'Settings': return ; case 'Crown': return ; case 'Shield': return ; case 'Wrench': return ; case 'Compass': return ; case 'Barcode': return ; case 'Box': return ; default: return ; } }; return ( !open && onClose()}> {/* CABEÇALHO DO MODAL */}
Regras & Governança Avançada {config.titulo} {config.descricao}
{/* CORPO PRINCIPAL: SIDEBAR DE USUÁRIOS + ÁREA DE REGRAS */}
{/* SIDEBAR DE USUÁRIOS */}
setBusca(e.target.value)} className="pl-8 text-xs h-8 bg-card border-slate-300 dark:border-border text-foreground font-medium" />
{loading ? (
Carregando colaboradores...
) : usersFiltrados.length === 0 ? (
Nenhum colaborador encontrado.
) : ( usersFiltrados.map((user) => { const isSelected = user.userId === selectedUserId; const totalAtivas = Object.values(user.regras).filter(Boolean).length; return ( ); }) )}
{/* ÁREA DE CONFIGURAÇÃO DO USUÁRIO */}
{selectedUser ? (
{/* CABEÇALHO DO USUÁRIO SELECIONADO */}
{selectedUser.fullName.substring(0, 2).toUpperCase()}

{selectedUser.fullName}

{selectedUser.email} • {selectedUser.functionName}

{/* TEMPLATES RÁPIDOS */}
Presets Rápidos: {config.templates.map((tpl) => ( ))}
{/* LISTAGEM DE REGRAS GRANULARES */}
{config.regras.map((regra) => { const ativo = Boolean(selectedUser.regras[regra.key]); return (
toggleRegra(regra.key)} className={`p-3.5 rounded-xl border transition-all cursor-pointer flex items-center justify-between gap-4 ${ ativo ? 'bg-muted/40 border-primary/40 shadow-sm' : 'bg-background border-border/50 opacity-70 hover:opacity-100 hover:border-border' }`} >
{getIconComponent(regra.icone)}
{regra.nome} {ativo && ( LIBERADO )}

{regra.descricao}

e.stopPropagation()}> toggleRegra(regra.key)} />
); })}
) : (
Selecione um colaborador ao lado para configurar as regras avançadas.
)}
); };