# 🏗️ BaseDomainComponent - Arquitetura Principal ## 🎯 Visão Geral O `BaseDomainComponent` é o componente base abstrato que padroniza todos os domínios ERP do sistema PraFrota. Ele encapsula funcionalidades comuns como CRUD operations, sistema de abas, paginação server-side, e agora inclui suporte a **Dashboard Tabs**. ## ✨ Funcionalidades Principais - ✅ **Sistema de Abas Integrado** (TabSystem) - ✅ **CRUD Operations Padronizadas** - ✅ **Paginação Server-Side** - ✅ **Gerenciamento de Estado Unificado** - ✅ **Header Actions Configuráveis** - ✅ **Prevenção de Duplicatas** - ✅ **Event Handling Padronizado** - ✅ **Dashboard Tab System** ⭐ **NOVO** - ✅ **Filtros Avançados** - ✅ **Ações em Lote (Bulk Actions)** ## 🚀 Como Usar ### Template Básico ```typescript @Component({ selector: 'app-clients', standalone: true, imports: [CommonModule, TabSystemComponent], providers: [DatePipe], templateUrl: './clients.component.html', styleUrl: './clients.component.scss' }) export class ClientsComponent extends BaseDomainComponent { constructor( service: ClientsService, titleService: TitleService, headerActionsService: HeaderActionsService, cdr: ChangeDetectorRef ) { super(titleService, headerActionsService, cdr, service); } protected override getDomainConfig(): DomainConfig { return { domain: 'client', title: 'Clientes', entityName: 'cliente', subTabs: ['dados', 'contatos'], showDashboardTab: true, // ⭐ NOVO: Aba Dashboard columns: [ { field: "id", header: "Id", sortable: true }, { field: "name", header: "Nome", sortable: true } ] }; } } ``` ### Template HTML Obrigatório ```html
``` ## 📊 Dashboard Tab System ⭐ **NOVO** ### Configuração Básica ```typescript protected override getDomainConfig(): DomainConfig { return { // ... configurações existentes ... showDashboardTab: true, // Habilita aba Dashboard dashboardConfig: { title: 'Dashboard de Clientes', showKPIs: true, showCharts: true, showRecentItems: true, customKPIs: [ { id: 'premium-clients', label: 'Clientes Premium', value: 45, icon: 'fas fa-crown', color: 'warning', trend: 'up', change: '+12%' } ] } }; } ``` ### Ordem das Abas 1. **Dashboard de [Domínio]** (se `showDashboardTab: true`) 2. **Lista de [Domínio]** (sempre presente) 3. **Abas de Edição** (conforme necessário) ### KPIs Automáticos O sistema gera automaticamente: - **Total de Registros**: Baseado em `totalItems` - **Registros Ativos**: Se existir campo `status` - **Registros Recentes**: Últimos 7 dias (baseado em `created_at`) ## 🔧 DomainConfig Interface ```typescript export interface DomainConfig { domain: string; // ID do domínio title: string; // Título para header entityName: string; // Nome da entidade subTabs: string[]; // Sub-abas para edição columns: any[]; // Configuração das colunas pageSize?: number; // Tamanho padrão da página maxTabs?: number; // Máximo de abas abertas allowDuplicates?: boolean; // Permitir abas duplicadas customActions?: any[]; // Ações customizadas sideCard?: SideCardConfig; // Configuração do card lateral filterConfig?: FilterConfig; // Configuração de filtros bulkActions?: BulkAction[]; // Ações em lote showDashboardTab?: boolean; // ⭐ NOVO: Mostrar aba Dashboard dashboardConfig?: DashboardTabConfig; // ⭐ NOVO: Config do dashboard } ``` ## 🎯 Métodos Principais ### Métodos Abstratos (Obrigatórios) ```typescript // Deve ser implementado em cada domínio protected abstract getDomainConfig(): DomainConfig; // Opcional: customizar dados de nova entidade protected getNewEntityData(): Partial { return {}; } ``` ### Métodos de CRUD ```typescript // Carregar entidades com paginação loadEntities(currentPage = 1, itemsPerPage = 50): void // Criar nova entidade async createNew(): Promise // Editar entidade existente async editEntity(entityData: any): Promise ``` ### Métodos de Dashboard ⭐ **NOVO** ```typescript // Criar aba dashboard private async createDashboardTab(): Promise // Gerar KPIs automáticos private generateAutomaticKPIs(): DashboardKPI[] // Criar abas iniciais (Dashboard + Lista) private async createInitialTabs(): Promise // Atualizar dados do dashboard private updateDashboardTabData(): void ``` ## 📋 Event Handling ### Eventos de Tabela ```typescript onTableEvent(eventData: { event: string, data: any }): void { const { event, data } = eventData; switch (event) { case 'sort': this.onSort(data); break; case 'page': this.onPage(data); break; case 'filter': this.onFilter(data); break; case 'actionClick': this.onActionClick(data); break; case 'formSubmit': this.onFormSubmit(data); break; case 'advancedFiltersChanged': this.onAdvancedFiltersChanged(data); break; case 'rowSelectionChanged': this.onRowSelectionChanged(data); break; } } ``` ### Eventos de Abas ```typescript onTabSelected(tab: TabItem): void onTabClosed(tab: TabItem): void onTabAdded(tab: TabItem): void ``` ## 🔄 Ciclo de Vida ```mermaid graph TD A[ngOnInit] --> B[setupDomain] B --> C[loadEntities] C --> D{Primeira vez?} D -->|Sim| E[createInitialTabs] D -->|Não| F[updateTabsData] E --> G{showDashboardTab?} G -->|Sim| H[createDashboardTab] G -->|Não| I[createListTab] H --> I F --> J{Dashboard existe?} J -->|Sim| K[updateDashboardTabData] J -->|Não| L[updateListTabData] K --> L ``` ## 🎨 Customizações Avançadas ### Filtros Especiais ```typescript filterConfig: { specialFilters: [ { id: 'date-range', label: 'Período', type: 'date-range', required: false } ], companyFilter: true, dateRangeFilter: false } ``` ### Ações em Lote ```typescript bulkActions: [ { id: 'activate', label: 'Ativar Selecionados', icon: 'fas fa-check', color: 'success', action: (selectedItems) => this.activateItems(selectedItems) } ] ``` ### Side Card ```typescript sideCard: { title: 'Informações Adicionais', component: 'custom-info-card', data: { /* dados específicos */ } } ``` ## 📚 Exemplos Completos ### Exemplo 1: Domínio Simples ```typescript // vehicles.component.ts export class VehiclesComponent extends BaseDomainComponent { protected override getDomainConfig(): DomainConfig { return { domain: 'vehicle', title: 'Veículos', entityName: 'veículo', subTabs: ['dados', 'documentos'], showDashboardTab: true, columns: [ { field: "license_plate", header: "Placa", sortable: true }, { field: "brand", header: "Marca", sortable: true }, { field: "model", header: "Modelo", sortable: true } ] }; } } ``` ### Exemplo 2: Domínio Avançado ```typescript // drivers.component.ts export class DriversComponent extends BaseDomainComponent { protected override getDomainConfig(): DomainConfig { return { domain: 'driver', title: 'Motoristas', entityName: 'motorista', subTabs: ['dados', 'photos', 'documents', 'fines'], showDashboardTab: true, dashboardConfig: { title: 'Dashboard de Motoristas', customKPIs: [ { id: 'drivers-with-license', label: 'Com CNH Válida', value: '85%', icon: 'fas fa-id-card', color: 'success', trend: 'up', change: '+3%' } ] }, filterConfig: { companyFilter: true, specialFilters: [ { id: 'license-status', label: 'Status da CNH', type: 'custom-select', config: { options: [ { value: 'valid', label: 'Válida' }, { value: 'expired', label: 'Vencida' }, { value: 'suspended', label: 'Suspensa' } ] } } ] }, bulkActions: [ { id: 'send-notification', label: 'Enviar Notificação', icon: 'fas fa-bell', color: 'primary' } ], columns: [ { field: "id", header: "Id", sortable: true }, { field: "name", header: "Nome", sortable: true }, { field: "cpf", header: "CPF", sortable: true }, { field: "phone", header: "Telefone", sortable: true }, { field: "license_number", header: "CNH", sortable: true } ] }; } } ``` ## 🔗 Componentes Relacionados - [TabSystemComponent](../tab-system/README.md) - [DomainDashboardComponent](../components/DASHBOARD_TAB_SYSTEM.md) - [DataTableComponent](../data-table/) - [GenericTabFormComponent](../generic-tab-form/) ## 📈 Métricas e Performance - **Prevenção de Loops**: Proteção contra chamadas duplicadas - **Lazy Loading**: Componentes carregados sob demanda - **Server-Side Pagination**: Otimização para grandes datasets - **Change Detection**: Controle otimizado de atualizações --- **Atualizado em**: Janeiro 2025 **Versão**: 2.0 (Dashboard Tab System) **Autor**: Sistema PraFrota