Tela: Listagem de Eventos da Agenda (/Agenda)
?? Tela: Listagem de Eventos da Agenda
Rota: /Agenda ou /Agenda/Index
Tipo: Tela de listagem interativa com múltiplas visualizações (Calendário, Lista, Timeline)
Permissão necessária: Administrador ou Gerente
?? Visão Geral da Tela
A tela de Agenda é uma interface completa para visualização e gerenciamento de eventos das turmas. Oferece 3 modos de visualização: Calendário (FullCalendar interativo), Listagem (tabela detalhada) e Timeline (linha do tempo visual).
?? Elementos da Interface
1. Hero Section (Cabeçalho Principal)
- Badge: "Agenda inteligente" com ícone sparkles
- Título: "Planejamento completo em um só lugar"
- Subtitle dinâmico: Exibe quantidade de eventos futuros organizados por status, turma e tipo
- Botão primário: "+ Adicionar Agenda" (redireciona para /Agenda/Create)
- Ilustração: Ícone de calendário com fundo gradient
2. Cards de Estatísticas (4 cards)
| Card | Métrica | Ícone | Cor |
|---|---|---|---|
| Total de Eventos | Contador absoluto | ti-calendar-event | Primary (Azul) |
| Próximos Eventos | Eventos futuros (data >= hoje) | ti-calendar-check | Success (Verde) |
| Eventos Hoje | Eventos com data = hoje | ti-sun | Warning (Amarelo) |
| Turmas com Eventos | Turmas distintas com eventos | ti-school | Info (Ciano) |
3. Barra de Visualizações (View Toggle)
Grupo de 3 botões pill com ícones para alternar entre visualizações:
- Calendário (ti-calendar-week) - Ativo por padrão
- Listagem (ti-list-details) - Tabela completa
- Timeline (ti-timeline) - Linha do tempo
4. Painel de Filtros (5 campos)
- Busca por evento: Input text (busca em título, descrição, local)
- Tipo de evento: Select com tipos dinâmicos do ViewBag.EventTypes
- Status: Select (Agendado, Confirmado, Cancelado, Concluído)
- Turma: Select com ViewBag.Turmas (ordenado por nome, com curso)
- Data específica: Input date + Botão "Limpar" filtros
5. Legenda de Status
Dots coloridos com labels:
- ? Agendado (Primary)
- ? Confirmado (Success)
- ? Hoje (Warning)
- ? Cancelado (Danger)
- ? Concluído (Secondary)
?? Visualização: Calendário (Padrão)
FullCalendar 6.1.8
- Locale: pt-br
- Views: dayGridMonth (padrão), timeGridWeek, listWeek
- Toolbar: prev/next/today (esquerda), título (centro), botões de view (direita)
- Cores personalizadas: Baseadas em status (via CSS classes)
- Eventos: Exibidos como cards coloridos com emoji + título + horário
- Interatividade:
- dateClick: Seleciona data e renderiza eventos do dia abaixo do calendário
- eventClick: Seleciona evento e renderiza detalhes mini-card
- eventDidMount: Aplica classes de status para cores customizadas
Eventos do Dia Selecionado (Mini-Cards)
Abaixo do calendário, exibe lista horizontal de mini-cards para eventos do dia clicado:
- Emoji: Baseado em tipo (?? formatura, ?? festa, ?? reunião, etc.)
- Título do evento
- Meta: Horário (início-fim), local (se disponível), badge de status
- Badge de tipo: Pill com label do tipo
- Accent color: Barra superior colorida baseada em tipo
?? Visualização: Listagem
Tabela Responsiva
| Coluna | Conteúdo |
|---|---|
| Evento | Avatar com emoji + título + badges (tipo, hoje/próximo, descrição truncada) |
| Data | Data formatada (dd/MM/yyyy) + dia da semana (por extenso) |
| Horário | Início-Fim (ou "Horário a definir") + local (se disponível) |
| Turma | Badge com ícone de escola + nome da turma |
| Status | Badge colorido com ícone + label |
| Participação | Progress bar (confirmados/capacidade) com % - Se capacidade null, exibe "-" |
| Ações | Botões: Ver detalhes (eye), Editar (edit) |
Empty State (Lista)
Exibido quando nenhum evento corresponde aos filtros:
- Ícone: ti-calendar-off (opacidade 35%)
- Título: "Sem eventos por aqui"
- Texto: Instruções para aplicar outros filtros ou criar evento
?? Visualização: Timeline
Linha do Tempo Vertical
- Linha central: Gradient vertical (primary ? secondary)
- Markers: Círculos coloridos (baseados em tipo de evento) com border branco e shadow
- Cards de evento:
- Título + badge de status (no header)
- Data por extenso (dia da semana, dia, mês, ano)
- Descrição do evento (se disponível)
- Meta: Horário, local, turma, tipo (com ícones)
Empty State (Timeline)
Exibido quando nenhum evento corresponde aos filtros:
- Ícone: ti-timeline (opacidade 35%)
- Título: "Timeline vazia"
- Texto: Instruções sobre filtros atuais
?? Sistema de Cores e Tipos
Paleta de Tipos (typePalette)
| Tipo (key) | Label | Cor | Emoji |
|---|---|---|---|
| meeting / reuniao | Reunião | #667eea | ?? |
| rehearsal / ensaio | Ensaio | #f093fb | ?? |
| graduation / colacao | Formatura | #43e97b | ?? |
| party / festa | Festa | #4facfe | ?? |
| workshop | Workshop | #ff9f43 | ??? |
| planning | Planejamento | #ffb74d | ?? |
| producao | Produção | #26c6da | ??? |
| default | Evento | #6c757d | ?? |
Tipos Dinâmicos
Tipos não mapeados (vindos de ViewBag.EventTypes) recebem cores e emojis ciclados de arrays pré-definidos.
Paleta de Status (statusPalette)
| Status | Label | Badge Class | Ícone |
|---|---|---|---|
| agendado | Agendado | badge-soft-primary | ti-calendar-stats |
| confirmado | Confirmado | badge-soft-success | ti-check |
| cancelado | Cancelado | badge-soft-danger | ti-circle-x |
| concluido | Concluído | badge-soft-secondary | ti-checks |
?? Funcionalidades JavaScript
Funções de Normalização
- normalizeString: Lowercase + remove acentos + trim
- normalizeTime: Converte diversos formatos (HH:mm:ss, Date, string) para HH:mm
- parseDateOnly: Extrai date sem hora de diversos formatos
- formatDateDisplay: Converte yyyy-MM-dd para dd/MM/yyyy
Funções de Renderização
- renderSelectedDayEvents(): Renderiza mini-cards de eventos do dia selecionado
- renderList(): Renderiza tabela de listagem com todos os eventos filtrados
- renderTimeline(): Renderiza timeline vertical com eventos filtrados
- buildCalendarEvents(): Transforma eventos em formato FullCalendar
- updateCalendarEvents(): Remove e re-adiciona eventos no calendário
Sistema de Filtros
- applyFilters(): Filtra eventos baseado em 5 critérios (busca, tipo, status, turma, data)
- updateStats(): Recalcula estatísticas baseado em eventos filtrados
- updateFilterInfo(): Exibe mensagem "X de Y eventos após aplicar os filtros"
- Debounce: Filtros de input tem delay de 50ms para performance
Troca de Visualizações
- Botões com data-view (calendar, list, timeline)
- Toggle de classes .active e .d-none
- Renderização específica ao trocar para cada view
- FullCalendar só é inicializado quando view=calendar
?? Notificações e Feedback
Info de Filtros
Exibido abaixo dos filtros quando algum filtro está ativo: "X de Y eventos após aplicar os filtros."
Empty States
3 empty states diferentes (calendário, lista, timeline) com ícones e mensagens contextuais.
?? Regras de Negócio
- Eventos sem título são exibidos como "Evento sem título"
- Eventos sem turma são exibidos como "Evento geral"
- Eventos sem horário exibem "Horário a definir"
- Eventos sem local exibem campo vazio ou "Local a definir" (dependendo do contexto)
- Eventos passados são marcados com badge "Realizado"
- Eventos de hoje são marcados com badge "Hoje" (warning)
- Eventos futuros são marcados com badge "Próximo"
- Participação só é exibida se capacidadeMaxima for informada
- Data selecionada é mantida ao aplicar filtros (se ainda existir evento naquela data)
- Calendário navega automaticamente para a data selecionada
?? Integração com API
GET /Agenda/Index: Retorna Model (List<Evento>) + ViewBag.EventTypes + ViewBag.Turmas
?? Navegação
- Ao clicar em "+ Adicionar Agenda": Redireciona para /Agenda/Create
- Ao clicar em "Ver detalhes" (listagem): Redireciona para /Agenda/Details/{id}
- Ao clicar em "Editar" (listagem): Redireciona para /Agenda/Edit/{id}
- Home (breadcrumb): /Dashboard
- Agenda (breadcrumb): /Agenda/Index
?? Responsividade
- Hero: Centralizado em mobile, horizontal em desktop
- Stats cards: 1 coluna (mobile) ? 2 colunas (tablet) ? 4 colunas (desktop)
- Filtros: Empilhados em mobile, grid responsivo em desktop
- Tabela: Scrollável horizontalmente em mobile
- Timeline: Padding reduzido em mobile
- Mini-cards: Flex-wrap com scroll horizontal em mobile
?? Bibliotecas Externas
- FullCalendar 6.1.8: Calendário interativo
- Bootstrap 5: Grid, cards, badges, modals
- Tabler Icons: Ícones de interface