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 { Label } from '@/components/ui/label'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { SlidersHorizontal, Search, CheckCircle2, Save, RotateCcw, Shield, Factory, Eye, Edit3, Trash2, Mail, Phone, MessageSquare, AlertTriangle, FileText, Layers, Flame, Zap, Box, ExternalLink, Truck, Wrench, FileSpreadsheet, Info, Sparkles, Lock, Plus, BookmarkPlus, X, } from 'lucide-react'; import { useSmartPermissions } from '@/hooks/useSmartPermissions'; import { SMART_SUBMODULES, SmartCustomTemplate } from '@/types/smartPermissions'; import { CriarSmartTemplateModal } from './CriarSmartTemplateModal'; interface MatrizSmartAvancadoModalProps { isOpen: boolean; onClose: () => void; } export const MatrizSmartAvancadoModal: React.FC = ({ isOpen, onClose, }) => { const { loading, saving, users, templates, selectedUserId, setSelectedUserId, selectedUser, togglePermission, updateNotificationConfig, salvarConfiguracaoUsuario, aplicarTemplate, criarNovoTemplate, removerTemplateCustom, recarregar, } = useSmartPermissions(); const [busca, setBusca] = useState(''); const [modalCriarTemplateOpen, setModalCriarTemplateOpen] = useState(false); 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 getIconComponent = (icone: string) => { switch (icone) { case 'FileText': return ; case 'Layers': return ; case 'Flame': return ; case 'CheckCircle2': return ; case 'Zap': return ; case 'Box': return ; case 'ExternalLink': return ; case 'Truck': return ; case 'Wrench': return ; case 'FileSpreadsheet': return ; case 'Shield': return ; case 'Factory': return ; case 'Eye': return ; default: return ; } }; return ( !open && onClose()}> {/* CABEÇALHO DO MODAL */}
Gestão Avançada de Privilégios & Notificações Modo Smart Controle granular de acesso por submódulo e canais de notificação (E-mail e WhatsApp via única).
{/* CORPO PRINCIPAL COM SIDEBAR DE USUÁRIOS E ÁREA DE CONFIGURAÇÃO */}
{/* 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; return ( ); }) )}
{/* ÁREA DE CONFIGURAÇÃO DO USUÁRIO SELECIONADO */}
{selectedUser ? (
{/* CABEÇALHO DO USUÁRIO + PERFIL */}
{selectedUser.fullName.substring(0, 2).toUpperCase()}

{selectedUser.fullName}

{selectedUser.email} • {selectedUser.functionName}

{/* BOTÃO PRINCIPAL DE SALVAR ALTERAÇÕES */}
{/* BARRA DE TEMPLATES RÁPIDOS & CRIAR NOVO TEMPLATE */}
Templates de Acesso em 1 Clique
{/* CHIPS DE TEMPLATES */}
{templates.map((tpl) => (
{/* Botão para deletar template customizado */} {tpl.isCustom && ( )}
))}
{/* SEÇÃO 1: MATRIZ DE ACESSO AOS SUBMÓDULOS */}

1. Permissões Granulares nos Submódulos (Modo Smart)

Controle de Visualização, Edição/Apontamento e Exclusão
{SMART_SUBMODULES.map((sub) => { const perm = selectedUser.permissions[sub.key] || { can_view: false, can_edit: false, can_delete: false, }; return ( {/* VISUALIZAR */} {/* EDITAR / APONTAR */} {/* EXCLUIR */} ); })}
Submódulo / Recurso Visualizar Apontar / Editar Excluir
{getIconComponent(sub.icone)}

{sub.nome}

{sub.descricao}

togglePermission(selectedUser.userId, sub.key, 'can_view') } />
togglePermission(selectedUser.userId, sub.key, 'can_edit') } />
togglePermission(selectedUser.userId, sub.key, 'can_delete') } />
{/* SEÇÃO 2: NOTIFICAÇÕES & CANAL WHATSAPP VIA ÚNICA */}

2. Notificações do Usuário (E-mail & WhatsApp BrainSteel)

{/* BANNER INFORMATIVO: ALTO CONTRASTE NO MODO CLARO E ESCURO */}

Comunicação Estritamente Unidirecional (Via Única) no WhatsApp

O número oficial da BrainSteel é configurado para somente enviar alertas, relatórios e métricas de produção. Mensagens de resposta enviadas pelo colaborador não serão recebidas nem respondidas pelo sistema.

{/* GRID DE CONFIGURAÇÕES DE CANAL */}
{/* CANAL WHATSAPP */}
Canal WhatsApp do Colaborador
updateNotificationConfig( selectedUser.userId, 'whatsappNumber', e.target.value ) } className="h-8 text-xs bg-background dark:bg-card border-slate-300 dark:border-border text-foreground font-medium placeholder:text-slate-500 dark:placeholder:text-muted-foreground/80" /> Informe o número com DDD para receber avisos automáticos.

Notificar sobre novos apontamentos ou avanços forçados

updateNotificationConfig( selectedUser.userId, 'notifWhatsappApontamentos', val ) } />

Receber fechamento diário de produção (peso e peças)

updateNotificationConfig( selectedUser.userId, 'notifWhatsappMetricas', val ) } />
{/* CANAL E-MAIL */}
Canal de E-mail ({selectedUser.email})

Receber e-mail informativo a cada lote apontado

updateNotificationConfig( selectedUser.userId, 'notifEmailApontamentos', val ) } />

Receber resumos periódicos e PDFs automáticos

updateNotificationConfig( selectedUser.userId, 'notifEmailMetricas', val ) } />
) : (
Selecione um colaborador na barra lateral para configurar.
)}
{/* RODAPÉ DO MODAL */}
As alterações passam a valer imediatamente no Modo Smart após salvar.
{/* MODAL PARA SALVAR NOVO TEMPLATE PERSONALIZADO */} {selectedUser && ( setModalCriarTemplateOpen(false)} currentPermissions={selectedUser.permissions} onSalvarTemplate={criarNovoTemplate} /> )}
); };