Tela: Visualização em Calendário (/Agenda/Calendario)
?? Tela: Visualização em Calendário
Rota: /Agenda/Calendario
Tipo: Tela dedicada de calendário (alternativa à view de Index)
Permissão necessária: Administrador ou Gerente
?? Visão Geral da Tela
Tela simplificada focada exclusivamente na visualização em calendário dos eventos. Oferece uma interface mais limpa sem os filtros e estatísticas da tela Index.
?? Elementos da Interface
1. Header do Card
- Título: "Calendário de Eventos" com ícone ti-calendar
- Botões de toggle:
- Lista (outline-primary) - Link para /Agenda/Index
- Calendário (primary active) - Página atual
2. Calendário FullCalendar
- Container: #calendar
- Views disponíveis: dayGridMonth, timeGridWeek, timeGridDay, listMonth
- Locale: pt-br
- Toolbar:
- Left: prev, next, today
- Center: title (mês/ano atual)
- Right: dayGridMonth, timeGridWeek, timeGridDay, listMonth
- Height: auto (min 650px)
3. Eventos no Calendário
- Cor: Cinza minimalista (#808080) - Sem diferenciação por tipo
- Padding: 2px-4px com border-radius de 4px
- Conteúdo: Título do evento
- Cursor: pointer (clicável)
- Hover: Opacidade reduzida (0.8)
?? Modal de Detalhes do Evento
Estrutura
- ID: #eventDetailModal
- Tamanho: modal-lg
- Trigger: Click em evento do calendário
Conteúdo do Modal
| Campo | Ícone | Dados |
|---|---|---|
| Título | - | No header do modal |
| Data | ti-calendar | dd/MM/yyyy |
| Horário | ti-clock | HH:mm - HH:mm ou "Dia inteiro" |
| Tipo | ti-tag | Badge bg-light-primary com label traduzido |
| Local | ti-map-pin | String ou "Não definido" |
| Turma | ti-school | Badge bg-light-info com nome da turma ou "Geral" |
| Status | ti-activity | Badge colorido (primary/success/danger/secondary) |
| Descrição | ti-file-text | Texto ou "Sem descrição" |
| Participantes | ti-users | Progress bar (confirmados/capacidade) - Condicional |
Participantes (Condicional)
Exibido apenas se capacidadeMaxima e participantesConfirmados estiverem disponíveis:
- Progress bar: Altura 20px
- Cores:
- Verde (bg-success): < 70%
- Amarelo (bg-warning): 70-89%
- Vermelho (bg-danger): = 90%
- Label: "X/Y" (confirmados/capacidade)
?? Mapeamento de Dados
Modelo Evento (C#) ? FullCalendar Event
{
id: evento.id,
title: evento.titulo,
start: startTime (Date com hora se disponível),
allDay: !evento.horaInicio && !evento.horaEvento,
className: "event-meeting" (sempre cinza nesta tela),
extendedProps: {
description: evento.descricao || "Sem descrição",
location: evento.local || "Não definido",
type: evento.tipo,
turma: evento.turmaNome || "Geral",
status: evento.status || "agendado",
horaInicio: evento.horaInicio,
horaFim: evento.horaFim,
capacidade: evento.capacidadeMaxima,
confirmados: evento.participantesConfirmados
}
}
Tipos de Evento (typeMap)
| Valor no DB | Label Exibido |
|---|---|
| meeting | Reunião |
| rehearsal | Ensaio |
| graduation | Formatura |
| party | Festa |
| workshop | Workshop |
| Outros | Valor original do DB |
Status (statusMap)
| Valor no DB | Label | Classe do Badge |
|---|---|---|
| agendado | Agendado | bg-light-primary |
| confirmado | Confirmado | bg-light-success |
| cancelado | Cancelado | bg-light-danger |
| concluido | Concluído | bg-light-secondary |
| Outros | Valor original | bg-light-warning |
?? Funcionalidades JavaScript
Inicialização do Calendário
const calendar = new FullCalendar.Calendar(calendarEl, {
initialView: "dayGridMonth",
locale: "pt-br",
events: calendarEvents,
eventClick: function(info) { showEventDetails(info.event); },
eventMouseEnter: opacity 0.8,
eventMouseLeave: opacity 1,
height: "auto",
contentHeight: 650
});
Função showEventDetails(event)
Preenche modal com dados do evento:
- Extrai extendedProps do evento FullCalendar
- Formata datas e horários para pt-BR
- Aplica badges com classes corretas
- Calcula % de ocupação para progress bar
- Exibe modal via Bootstrap
?? Regras de Negócio
- Eventos sem horário são marcados como allDay
- horaInicio tem prioridade sobre horaEvento
- Eventos sem descrição exibem "Sem descrição"
- Eventos sem local exibem "Não definido"
- Eventos sem turma exibem "Geral"
- Participantes só aparecem se capacidade for informada
- Cor é sempre cinza (#808080) - Design minimalista
?? Integração com API
GET /Agenda/Calendario: Retorna Model (List<Evento>) serializado como JSON no script
?? Navegação
- Ao clicar em "Lista": Redireciona para /Agenda/Index
- Ao clicar em "Calendário": Permanece na página atual
- Modal: Apenas visualização, sem botões de ação
?? Responsividade
- FullCalendar é responsivo por padrão
- Modal é modal-lg (adapta em mobile)
- Eventos com título longo quebram linha (white-space: normal)
?? Bibliotecas Externas
- FullCalendar 6.1.8: Calendário interativo
- Bootstrap 5: Modal e badges
- Tabler Icons: Ícones de interface