Visões do calendário e detalhe do dia
O módulo Calendário tem duas abas e uma barra de filtros sempre visível. Os padrões são ajustados para "o que está acontecendo este mês, na minha filial" — a pergunta mais comum — mas os filtros e o seletor de visão permitem ampliar ou estreitar conforme necessário.

A grade mensal
A aba Calendário é a superfície de aterrissagem padrão. Ela renderiza uma grade mensal tradicional com a data selecionada destacada e três camadas visuais em cada célula do dia:
- Pontos de evento — coloridos pela cor escolhida do evento. Um ponto por evento, com limite visual para que um dia cheio não transborde.
- Marcadores de aniversário — um pequeno ícone de bolo. Puxado diretamente de
members.date_of_birth, não de uma linha de evento. - Sublinhado de hoje — a data atual é sublinhada, independentemente de qual data você selecionou.
Clique em qualquer data para carregar o painel de detalhes do dia abaixo da grade. Clique no nome do mês no cabeçalho para pular para o seletor de mês; clique nas setas para avançar um mês por vez. A data selecionada persiste quando você muda de mês — o painel ainda mostra o que foi escolhido por último.
TIP
Você não precisa clicar em um dia para ler seus eventos — passe o mouse sobre um ponto de evento e um cartão de prévia aparece com o título, a hora e o local.
O que a grade realmente consulta
A grade mensal roda uma consulta do Supabase para a janela visível: cada evento cuja event_date cai no mês ou cuja recurring = true independentemente da data. O navegador então expande as linhas recorrentes em ocorrências individuais usando a RRULE, filtrando datas de exceção e datas além de recurrence_end_date. Não há cron no servidor pré-computando linhas de ocorrência — tudo é derivado na hora.
Isso significa que mudanças propagam instantaneamente. Edite a RRULE de um evento recorrente e as novas datas renderizam no próximo render; adicione uma exceção e a data cancelada desaparece no momento em que a consulta revalida.
O painel de detalhes do dia
Abaixo da grade, um cartão mostra tudo na data atualmente selecionada — eventos primeiro, depois aniversários, separados por um divisor quando ambos estão presentes. Cada cartão de evento carrega:
- Uma barra colorida correspondendo à cor do evento.
- Título, hora de início/fim, local.
- Um ícone de repetição se a data veio de uma expansão recorrente.
- Um badge de filial se o evento tem escopo para uma unidade-org específica.
- Botões editar e excluir (visíveis apenas se você tem
events.edit/events.delete).
Clique em qualquer lugar no cartão para abrir a caixa de diálogo de edição; clique no ícone de lixeira para a confirmação de exclusão suave. Cartões de aniversário são clicáveis e levam direto ao perfil do membro.
O estado vazio é intencional: se nada está na data e você tem events.create, um pequeno link "+ Adicionar evento" aparece no painel vazio para que você possa preenchê-lo sem sair da tela.
A lista de próximos
A aba Próximos vira o calendário ao contrário: em vez de dispor um mês, mostra os próximos vinte eventos a partir de hoje, em ordem cronológica. Cada linha é o mesmo cartão de evento compacto que você vê no painel do dia, mais um rótulo de data.
Use esta aba quando estiver respondendo a "o que vem a seguir?" em vez de "o que tem em 14 de março?" — é a visão certa para uma reunião de líderes na manhã de segunda em que você revisa a semana que vem.
A consulta de próximos é limitada pelo filtro de filial e pelo papel do usuário. Um pastor de cuidado atribuído a uma filial vê apenas os eventos daquela filial; um administrador global vê todos os vinte através da org.
Filtrando por unidade-org
A barra de ferramentas carrega um único menu suspenso rotulado com um ícone de filial. Por padrão mostra sua filial atribuída; administradores com escopo global veem "Todas as filiais".
O filtro aplica uma cláusula OR org_unit_id IS NULL, o que significa que eventos de toda a org permanecem visíveis não importa qual filial você escolher. Um culto de Natal marcado como de toda a org aparece no calendário de cada filial. Apenas eventos específicos de filial (com um org_unit_id concreto) ficam fora do escopo.
Usuários cujo papel não abrange a org inteira só veem as filiais às quais estão atribuídos no menu suspenso. Não há "vazamento" — escolher uma filial à qual você não está atribuído não é uma opção para começar.
WARNING
O filtro atualmente não suporta seleção múltipla. Se você precisa comparar duas filiais específicas, alterne entre elas; se precisa de uma visão transversal real, escolha "Todas as filiais".
Filtrando por categoria de evento
Cada evento tem uma coluna de texto category (definida no formulário de evento, separada da cor) — valores como service, outreach, meeting, social. O calendário não expõe a categoria como filtro de nível superior hoje; é registrada para uso pelos relatórios e por futuras passadas de filtro.
Se você está procurando um subconjunto de uma única categoria agora, a solução é a lista de próximos — escaneie visualmente pela cor, já que a maioria das orgs mapeia cor para categoria um-a-um (azul = serviço, verde = outreach, etc.).
Permissões e o que cada papel vê
As regras de visão são simples:
| Papel | Vê |
|---|---|
| Admin | Tudo na org, cada filial. |
| Pastor | Tudo nas filiais atribuídas. |
| Pastor de cuidado | Eventos de toda a org + eventos da sua filial atribuída. |
| Membro | Eventos de toda a org + eventos na sua filial principal. |
A mesma permissão events.view controla a página inteiramente. Sem ela, o item de menu fica oculto.
Mobile e telas pequenas
Em um celular, a grade mensal mantém seu layout completo, mas cada célula encolhe; pontos de evento colapsam de barras coloridas para pequenos círculos preenchidos. O painel de detalhes do dia se empilha abaixo da grade como um cartão separado — toque na data que você quer, role para baixo. O filtro de filial e o seletor de aba se movem ambos para a barra de ferramentas fixa para que continuem acessíveis.
A instalação do PWA é a melhor experiência se você vive no mobile — as visões do calendário parecem nativas e o alvo de toque do detalhe do dia é maior. Notificações push também se tornam possíveis uma vez instalado, o que alimenta o fluxo de lembretes sem passar por créditos de SMS ou WhatsApp.
