Admin Portal - Dashboard¶
📊 Visão Geral¶
O Dashboard é a página inicial do Admin Portal, fornecendo uma visão consolidada das métricas e estatísticas da plataforma.
🎯 Componentes do Dashboard¶
1. Cards de Estatísticas¶
Exibe métricas principais em cards destacados:
- Total de Prestadores: Contagem total de providers cadastrados
- Prestadores Ativos: Providers com status "Active"
- Documentos Pendentes: Documentos aguardando verificação
- Verificações Pendentes: Providers aguardando aprovação
<MudGrid>
<MudItem xs="12" sm="6" md="3">
<MudCard>
<MudCardContent>
<MudText Typo="Typo.h5">@DashboardState.Value.TotalProviders</MudText>
<MudText Typo="Typo.body2">Total de Prestadores</MudText>
</MudCardContent>
</MudCard>
</MudItem>
<!-- Outros cards... -->
</MudGrid>
2. Gráfico de Status de Verificação¶
Tipo: Gráfico de Pizza (Pie Chart)
Biblioteca: MudBlazor MudChart
Dados: Distribuição de providers por status de verificação
Status Mapeados: - Pendente (Warning - Amarelo) - Em Progresso (Info - Azul) - Verificado (Success - Verde) - Rejeitado (Error - Vermelho) - Suspenso (Default - Cinza)
// Lógica de agrupamento
var statusGroups = providers
.Where(p => !string.IsNullOrEmpty(p.VerificationStatus))
.GroupBy(p => p.VerificationStatus)
.OrderBy(g => Array.IndexOf(StatusOrder, g.Key));
verificationStatusLabels = statusGroups
.Select(g => VerificationStatus.ToDisplayName(int.Parse(g.Key)))
.ToArray();
verificationStatusData = statusGroups
.Select(g => (double)g.Count())
.ToArray();
3. Gráfico de Tipos de Prestadores¶
Tipo: Gráfico de Pizza (Pie Chart)
Dados: Distribuição de providers por tipo (Pessoa Física vs Pessoa Jurídica)
Implementação:
var typeGroups = providers
.Where(p => !string.IsNullOrEmpty(p.ProviderType))
.GroupBy(p => p.ProviderType)
.OrderBy(g => g.Key);
providerTypeLabels = typeGroups.Select(g => {
if (Enum.TryParse<ProviderType>(g.Key, true, out var typeEnum))
{
return GetProviderTypeDisplayName(typeEnum);
}
return g.Key ?? "Desconhecido";
}).ToArray();
providerTypeData = typeGroups
.Select(g => (double)g.Count())
.ToArray();
Helper Method:
private string GetProviderTypeDisplayName(ProviderType type)
{
return type switch
{
ProviderType.Individual => "Pessoa Física",
ProviderType.Company => "Pessoa Jurídica",
_ => type.ToString()
};
}
4. Atividades Recentes (Placeholder)¶
Status: Planejado para Fase 3+
Descrição: Feed de atividades recentes do sistema
[!NOTE] Esta funcionalidade está planejada para implementação futura. Ver Roadmap - Recent Activity Widget
🔄 Fluxo de Dados¶
sequenceDiagram
participant UI as Dashboard.razor
participant State as DashboardState
participant Effects as DashboardEffects
participant API as IProvidersApi
participant Backend as Backend API
UI->>State: Dispatch LoadDashboardStatsAction
State->>Effects: Handle LoadDashboardStatsAction
Effects->>API: GetProvidersAsync()
API->>Backend: GET /api/providers
Backend-->>API: PagedResponse<ProviderDto>
API-->>Effects: Result<PagedResult<ModuleProviderDto>>
Effects->>State: Dispatch LoadDashboardStatsSuccessAction
State-->>UI: StateHasChanged (gráficos atualizados)
🛠️ State Management (Fluxor)¶
DashboardState¶
[FeatureState]
public record DashboardState
{
public int TotalProviders { get; init; }
public int ActiveProviders { get; init; }
public int PendingDocuments { get; init; }
public int PendingVerifications { get; init; }
public bool IsLoading { get; init; }
public string? ErrorMessage { get; init; }
}
Actions¶
public record LoadDashboardStatsAction;
public record LoadDashboardStatsSuccessAction(
int TotalProviders,
int ActiveProviders,
int PendingDocuments,
int PendingVerifications);
public record LoadDashboardStatsFailureAction(string ErrorMessage);
Effects¶
[EffectMethod]
public async Task HandleLoadDashboardStatsAction(
LoadDashboardStatsAction action,
IDispatcher dispatcher)
{
var result = await _errorHandler.ExecuteWithErrorHandlingAsync(
ct => _providersApi.GetProvidersAsync(1, 1000, ct),
"Load dashboard stats");
if (result.IsSuccess)
{
var stats = CalculateStats(result.Value.Items);
dispatcher.Dispatch(new LoadDashboardStatsSuccessAction(
stats.Total,
stats.Active,
stats.PendingDocs,
stats.PendingVerifications));
}
else
{
dispatcher.Dispatch(new LoadDashboardStatsFailureAction(
result.Error?.Message ?? "Erro ao carregar estatísticas"));
}
}
🐛 Problemas Resolvidos¶
Sprint 7.20 - Dashboard Charts Fixes¶
Problema 1: Gráfico "Provedores por Tipo" Vazio¶
Causa: Property name mismatch entre backend (type) e frontend (ProviderType)
Solução: Adicionado [JsonPropertyName("type")] em ModuleProviderDto
public sealed record ModuleProviderDto(
// ...
[property: JsonPropertyName("type")]
string ProviderType,
// ...
);
Problema 2: Mensagens de Debug Visíveis¶
Causa: Código de debug não removido antes do merge
Solução: Removidas linhas <MudText>Chart disabled for debugging</MudText>
📈 Métricas de Performance¶
| Operação | Tempo Médio |
|---|---|
| Carregar Dashboard | ~500ms |
| Renderizar Gráficos | ~150ms |
| Atualizar Stats | ~300ms |
🔮 Melhorias Futuras¶
- Gráfico de Distribuição Geográfica: Mapa com providers por cidade
- Gráfico de Documentos Pendentes: Timeline de uploads
- Filtros de Data: Selecionar período para estatísticas
- Export de Dados: Download de relatórios em CSV/PDF
- Real-time Updates: SignalR para atualização automática
- Drill-down: Clicar em gráfico para ver detalhes