# 🎨 Side Card - Guia de Implementação ## ✨ Visão Geral O **Side Card** é uma nova funcionalidade que permite exibir um cartão lateral ao lado dos formulários de tabs, ideal para mostrar resumos, informações principais ou contexto adicional durante a edição de registros. ## 🏗️ Configuração Básica ### 1️⃣ Interface de Configuração ```typescript interface SideCardConfig { enabled: boolean; title: string; position?: 'right' | 'left'; // Posição do card (padrão: 'right') width?: string; // Largura do card (padrão: '300px') component?: 'summary' | 'custom'; // Tipo de card (padrão: 'summary') data?: { imageField?: string; // Campo que contém a imagem principal displayFields?: Array<{ key: string; label: string; type?: 'text' | 'currency' | 'status' | 'badge' | 'image'; format?: string; // Para formatação específica }>; statusField?: string; // Campo para status/badge statusConfig?: { [status: string]: { label: string; color: string; icon?: string; }; }; }; } ``` ### 2️⃣ Configuração no TabFormConfig ```typescript const tabFormConfig: TabFormConfig = { title: "Editar Veículo", entityType: "vehicle", fields: [ // ... seus campos do formulário ], subTabs: [ { id: 'dados', label: 'Dados Gerais', icon: 'fa-info-circle' }, { id: 'multas', label: 'Multas', icon: 'fa-exclamation-triangle' }, { id: 'rastreadores', label: 'Rastreadores', icon: 'fa-map-marked-alt' } ], // ✨ Configuração do Side Card sideCard: { enabled: true, title: "Resumo do Veículo", position: "right", width: "320px", component: "summary", data: { imageField: "vehicle_image", // Campo da imagem principal displayFields: [ { key: "brand_model", label: "Marca/Modelo", type: "text", format: "capitalize" }, { key: "license_plate", label: "Placa", type: "text", format: "uppercase" }, { key: "year", label: "Ano", type: "text" }, { key: "mileage", label: "Quilometragem", type: "text" }, { key: "status", label: "Status", type: "status" }, { key: "driver_name", label: "Motorista", type: "text" }, { key: "fipe_value", label: "Valor FIPE", type: "currency" } ], statusField: "status", statusConfig: { "active": { label: "Em operação", color: "#10b981", icon: "fa-check-circle" }, "maintenance": { label: "Manutenção", color: "#f59e0b", icon: "fa-wrench" }, "inactive": { label: "Inativo", color: "#6b7280", icon: "fa-pause-circle" }, "repair": { label: "Em reparo", color: "#ef4444", icon: "fa-tools" } } } } }; ``` ## 🎯 Exemplos de Uso ### 📋 Exemplo 1: Card Simples de Motorista ```typescript const driverFormConfig: TabFormConfig = { title: "Editar Motorista", entityType: "driver", fields: [/* campos do formulário */], subTabs: [ { id: 'dados', label: 'Dados Pessoais', icon: 'fa-user' }, { id: 'endereco', label: 'Endereço', icon: 'fa-map-marker-alt' }, { id: 'documentos', label: 'Documentos', icon: 'fa-file-alt' } ], sideCard: { enabled: true, title: "Resumo do Motorista", width: "280px", data: { imageField: "profile_photo", displayFields: [ { key: "full_name", label: "Nome Completo", type: "text" }, { key: "cpf", label: "CPF", type: "text" }, { key: "cnh_number", label: "CNH", type: "text" }, { key: "phone", label: "Telefone", type: "text" }, { key: "status", label: "Status", type: "status" } ], statusConfig: { "active": { label: "Ativo", color: "#10b981" }, "inactive": { label: "Inativo", color: "#6b7280" }, "suspended": { label: "Suspenso", color: "#ef4444" } } } } }; ``` ### 💰 Exemplo 2: Card com Valores Financeiros ```typescript const contractFormConfig: TabFormConfig = { title: "Editar Contrato", entityType: "contract", fields: [/* campos do formulário */], sideCard: { enabled: true, title: "Resumo Financeiro", position: "right", width: "350px", data: { displayFields: [ { key: "contract_number", label: "Número do Contrato", type: "text" }, { key: "client_name", label: "Cliente", type: "text" }, { key: "total_value", label: "Valor Total", type: "currency" }, { key: "monthly_payment", label: "Parcela Mensal", type: "currency" }, { key: "due_date", label: "Vencimento", type: "text", format: "date" }, { key: "status", label: "Status", type: "status" } ], statusConfig: { "active": { label: "Ativo", color: "#10b981", icon: "fa-check" }, "pending": { label: "Pendente", color: "#f59e0b", icon: "fa-clock" }, "overdue": { label: "Vencido", color: "#ef4444", icon: "fa-exclamation" } } } } }; ``` ## 🎨 Tipos de Campos Disponíveis ### 📝 `text` - Texto Simples ```typescript { key: "name", label: "Nome", type: "text", format: "capitalize" // opcional: "uppercase", "lowercase", "capitalize" } ``` ### 💰 `currency` - Valores Monetários ```typescript { key: "price", label: "Preço", type: "currency" // Automaticamente formatado como R$ 1.234,56 } ``` ### 🏷️ `status` - Status com Badge Colorido ```typescript { key: "status", label: "Status", type: "status" // Usa a configuração de statusConfig } ``` ### 📅 Formatação de Data ```typescript { key: "created_at", label: "Criado em", type: "text", format: "date" // ou "datetime" } ``` ## 🎯 Configurações de Status ### 🎨 Cores Recomendadas ```typescript statusConfig: { // ✅ Estados Positivos "active": { label: "Ativo", color: "#10b981", icon: "fa-check-circle" }, "completed": { label: "Concluído", color: "#059669", icon: "fa-check" }, "approved": { label: "Aprovado", color: "#16a34a", icon: "fa-thumbs-up" }, // ⚠️ Estados de Atenção "pending": { label: "Pendente", color: "#f59e0b", icon: "fa-clock" }, "maintenance": { label: "Manutenção", color: "#d97706", icon: "fa-wrench" }, "review": { label: "Em Análise", color: "#eab308", icon: "fa-search" }, // 🔴 Estados Críticos "inactive": { label: "Inativo", color: "#6b7280", icon: "fa-pause-circle" }, "cancelled": { label: "Cancelado", color: "#dc2626", icon: "fa-times-circle" }, "error": { label: "Erro", color: "#ef4444", icon: "fa-exclamation-triangle" }, // 🔵 Estados Neutros "draft": { label: "Rascunho", color: "#64748b", icon: "fa-edit" }, "scheduled": { label: "Agendado", color: "#0ea5e9", icon: "fa-calendar" } } ``` ## 📱 Responsividade O Side Card é **automaticamente responsivo**: - **Desktop (>1200px)**: Card lateral fixo - **Tablet (768px-1200px)**: Card fica acima do formulário - **Mobile (<768px)**: Card em layout de coluna única ## 🔧 Quando Usar ### ✅ Recomendado para: - **Formulários de edição** com dados existentes - **Exibir informações contextuais** importantes - **Resumos visuais** de entidades complexas - **Status e indicadores** relevantes ### ❌ Não recomendado para: - **Formulários de criação** (dados vazios) - **Formulários muito simples** (poucas informações) - **Telas já sobrecarregadas** visualmente ## 🚀 Exemplo Completo de Implementação ```typescript // No seu componente de domínio private openTabForm(vehicle?: Vehicle) { const config: TabFormConfig = { title: vehicle ? "Editar Veículo" : "Novo Veículo", entityType: "vehicle", fields: [ { key: "license_plate", label: "Placa", type: "text", required: true }, { key: "brand", label: "Marca", type: "text", required: true }, { key: "model", label: "Modelo", type: "text", required: true }, // ... outros campos ], subTabs: [ { id: 'dados', label: 'Dados Gerais', icon: 'fa-car' }, { id: 'documentos', label: 'Documentos', icon: 'fa-file-alt' }, { id: 'multas', label: 'Multas', icon: 'fa-exclamation-triangle' } ], // ✨ Side Card aparece apenas quando editando sideCard: vehicle ? { enabled: true, title: "Resumo do Veículo", position: "right", width: "300px", component: "summary", data: { imageField: "main_photo", displayFields: [ { key: "brand_model", label: "Marca/Modelo", type: "text" }, { key: "license_plate", label: "Placa", type: "text", format: "uppercase" }, { key: "year", label: "Ano", type: "text" }, { key: "status", label: "Status", type: "status" } ], statusConfig: { "active": { label: "Em operação", color: "#10b981", icon: "fa-check-circle" }, "inactive": { label: "Inativo", color: "#6b7280", icon: "fa-pause-circle" } } } } : undefined }; // Abrir o formulário com tab system const tabRef = this.tabSystem.openTab({ id: vehicle?.id || 'new', title: vehicle ? `Veículo: ${vehicle.license_plate}` : 'Novo Veículo', type: 'vehicle', data: vehicle, config: config }); } ``` ## 🎉 Resultado Com essa configuração, você terá: 1. **Layout responsivo** com card lateral 2. **Imagem do veículo** (ou placeholder se não houver) 3. **Informações principais** bem organizadas 4. **Status colorido** com ícones 5. **Valores formatados** automaticamente 6. **Experiência consistente** em todo o sistema --- **🚀 Próximos passos:** Teste a funcionalidade, ajuste as configurações conforme necessário e aproveite a nova experiência de usuário!