# Agenda de Eventos — Views, UX e Assets

> Views do CMS: `v6/resources/views/prefecture/calendar-events/` e
> `v6/resources/views/prefecture/category-calendar-events/`.
> Views do portal: `v6/resources/views/portal/layouts/calendar-events/`.

---

## 1. CMS — telas do operador

| Arquivo | Função |
|---|---|
| `v6/resources/views/prefecture/calendar-events/index.blade.php` | Listagem (DataTable `#tabela_agenda_evento`), botões "Cadastrar Evento", "Categorias da Agenda de Eventos" e exclusão em lote. Estende `admin.layouts.app` |
| `v6/resources/views/prefecture/calendar-events/create.blade.php` | Wrapper do formulário de cadastro (`Form::open(['route' => ['agenda-evento.store'], 'files' => true])`) + editor de imagem (cropper) |
| `v6/resources/views/prefecture/calendar-events/edit.blade.php` | Wrapper do formulário de edição (`Form::model($content, ['route' => ['agenda-evento.update', ...], 'method' => 'PUT'])`) + scripts da galeria |
| `v6/resources/views/prefecture/calendar-events/form.blade.php` | Formulário compartilhado entre create/edit (abas "Evento" e "Galeria") |
| `v6/resources/views/prefecture/category-calendar-events/create.blade.php` | Tela **dupla**: formulário de cadastro **e** listagem de categorias já existentes (tabela `#dataTableList`) |
| `v6/resources/views/prefecture/category-calendar-events/edit.blade.php` | Formulário de edição de categoria |
| `v6/resources/views/prefecture/category-calendar-events/form.blade.php` | Campo único "Nome" (maxlen 120) + bloco de erros |

### 1.1 Campos do formulário do evento (`form.blade.php`)

| Campo | Componente | Obrigatório | Observações |
|---|---|:---:|---|
| Categoria | `components.inputs.select` | sim | Lista `CategoryCalendarEvent::get(['name','id'])`; botão "Nova Categoria" ao lado |
| Secretaria | `components.inputs.select` | não | `getContentByCategoryWith('secretarias', ['title as name','id'])` |
| Órgãos | `components.inputs.select` | não | `getContentByCategoryWith('orgaos', ['title as name','id'])` |
| Título | `components.inputs.input` | sim | maxlen 120 |
| Data Inicial | `components.inputs.date` | sim | máscara `br-data-tempo`, formato `d/m/Y H:i`; jQuery `.mask('00/00/0000 00:00')` |
| Data de encerramento | `components.inputs.date` | não | idem |
| Local | `components.inputs.input` | não | maxlen 120, placeholder "Endereço" |
| Fonte | `components.inputs.input` | não | maxlen 120 |
| Imagem Principal | `components.inputs.image` | não | input `name="archive_highlight"`; preview, recorte (cropper) e botão "Remover Imagem" (chama `ajax.delete.files`) |
| Texto | `components.inputs.textarea` | sim | Summernote (`mask' => 'summernote'`) |
| Ativar Galeria | `components.inputs.checkbox` | — | `name="galery"`; habilita a aba "Galeria" |
| Publicar | `components.inputs.checkbox` | — | `name="status"`; desmarcado = rascunho |

Campo oculto `verificaImg = true`.

### 1.2 Aba Galeria (CMS)

- Componente: `v6/resources/views/prefecture/contents/components/galerias/index.blade.php`
  (div `#galeria`, `#multipleupload`, campo de busca `#searchInput`, área `#imageBox`).
- Upload: `public/assets/js/custom/contents/midias/index.js` ->
  `POST /cms/galeria` com `formData: { id: <evento>, table: 'calendar_event' }`.
- Listagem: `GET /cms/galeria/calendar_events_id/{id}` (`chargeGallery`), com scroll infinito
  (`IntersectionObserver`) e paginação de 50 em 50.
- No controller, `table = 'calendar_event'` faz o servidor gravar
  `calendar_events_id` na tabela `archives` e storing em
  `storage/calendar-events/<slug-categoria>/<id>/galeria/`
  (`v6/app/Http/Controllers/Prefecture/ArchiveController.php:99-107`).
- Exclusão: `POST /cms/galeria/delete/{id}`; ordenação: `POST /cms/galeria/update-order`.

### 1.3 Layout do CMS

Todos os eventos usam `admin.layouts.app` (AdminLTE 1.22). A listagem carrega
`assets/js/custom/utilities/deleteAll.js` (exclusão em lote com Swal) e
`assets/js/custom/contents/agenda-eventos/datatable.js`.

---

## 2. Portal — telas do cidadão

| Arquivo | Função |
|---|---|
| `v6/resources/views/portal/layouts/calendar-events/index.blade.php` | Grade de eventos (lista geral ou filtrada por categoria) + barra de categorias + paginação |
| `v6/resources/views/portal/layouts/calendar-events/show.blade.php` | Detalhe do evento |

### 2.1 Lista (`index.blade.php`)

- `@extends("portal.layouts.$modelo.layout.layout")` — o **template é dinâmico**,
  conforme a configuração `layout` (`getTemplateActived()`).
- Estilo adicional: `layouts/{modelo}/css/style.css`.
- Breadcrumb: `Breadcrumbs::view("portal.layouts.$modelo.layout.breadcrumb", 'calendar-events')`
  ou `'category-calendar-events'`.
- Barra de categorias: botão "Todas Categorias" + um botão por `CategoryCalendarEvent`
  (navegação por `location=`). A categoria ativa recebe a classe `bg-color-active`.
- Grade: 3 colunas (`col-lg-4 col-md-6`), cada card com
  - imagem de destaque — a view usa a sintaxe `@getMinFile(...)`, mas **não há diretiva
    Blade registrada** para `getMinFile` (só existe a função PHP `getMinFile()` em
    `v6/app/Helpers/functions.php:977`); o token é renderizado literalmente na imagem de
    fundo. Fallback pretendido: `/storage/img/exemplos/sem-imagem.png`.
  - badge com `date('d.m.Y', strtotime($eventList->initial_date))`,
  - título com clamp de 4 linhas,
  - badge com o nome da categoria.
- Paginação: `{{ $eventsList->links() }}` (12 por página).
- Caso vazio: "Nenhuma registro encontrado."
- Modo *iframe*: se `$_GET['iframe'] == 1`, a barra de categorias é ocultada e os links
  abrem em nova aba.

### 2.2 Detalhe (`show.blade.php`)

- Meta tags Open Graph (`og:type`, `og:image`, `og:description` com
  `strip_tags(html_entity_decode(str_limit($content->text,150)))`).
- Título (exceto no `modelo4`), barra colorida `border-title`, período completo:
  `Data do evento: dd/mm/aaaa às hh:mm até dd/mm/aaaa às hh:mm`, local.
- Botões de compartilhamento (`addthis_inline_share_toolbox`).
- Imagem de destaque ampliada via `getLargFile($path)` + atributo `data-webp`.
- Texto renderizado com `{!! $content->text !!}` (HTML do Summernote, sem escape).
- Galeria: `@include("portal.components.galerias.index")` quando `galery == true`.
- Sidebar: `@include("portal.layouts.$modelo.layout.sidebar.layout")`.
- Fallback de "evento não encontrado" (`NOTÍCIA NÃO ENCONTRADA.`) — inalcançável na
  prática, pois o controller acessa `$content->id` antes de testar `$content` (ver
  `08-GAPS-E-DIVIDAS.md`).

### 2.3 Galeria do portal (`v6/resources/views/portal/components/galerias/index.blade.php`)

- Filtra os `archives` por extensão (jpg, jpeg, png, gif, bmp, tiff, svg, webp, ico, heic, raw).
- Renderiza com **lightgallery** (`data-thumb` = miniatura, `data-src` = grande).
- Usa `getMinFile()` / `getLargFile()` para as variantes geradas por `FileTrait::compress`.

### 2.4 Templates do portal (`modelo1`..`modelo5`)

| Template | Arquivos relevantes |
|---|---|
| `modelo1`..`modelo4` | `v6/resources/views/portal/layouts/modelo1/layout/layout.blade.php` (idem para `modelo2`..`modelo5`), `breadcrumb.blade.php`, `sidebar/layout.blade.php` |
| `modelo5` | `v6/resources/views/portal/layouts/modelo5/layout/layout.blade.php` (+ `breadcrumb.blade.php`, `sidebar/layout.blade.php`) |
| `default` | `v6/resources/views/portal/layouts/default/` **não possui** a pasta `layout/` — as views da agenda **quebram** se o template ativo for `default` (ver `08-GAPS-E-DIVIDAS.md`) |

---

## 3. JavaScript e Ajax

| Arquivo | Papel |
|---|---|
| `v6/public/assets/js/custom/contents/agenda-eventos/datatable.js` | Colunas e renderização da DataTable do CMS; chama `runDatatables('agenda_evento', collums, true, 'ASC', null, true)` |
| `v6/public/assets/js/custom/utilities/table.js` | `runDatatables`, `createBTN`, `createSingleButton`, `createGaleryButton` (habilita o botão de galeria conforme `data.galery`) |
| `v6/public/assets/js/custom/utilities/deleteAll.js` | Exclusão em lote: monta o array `toDelete` e faz `POST` na rota `ajax.calendar-event.deleteByLote` |
| `v6/public/assets/js/custom/contents/midias/index.js` | Upload da galeria (`#multipleupload` -> `POST /cms/galeria`), `chargeGallery`, busca, exclusão, reordenação |
| `v6/public/assets/js/custom/utilities/helpers/editor-de-imagem.js` | Editor/crop da imagem de destaque (`archive_highlight`) |
| `v6/public/assets/js/custom/utilities/helpers/select-image.js` | Seleção do arquivo de destaque |
| `v6/public/assets/js/custom/utilities/helpers/validacao-texto.js` | Validações auxiliares do formulário |
| `v6/public/assets/plugins/jquery-upload-files/jquery.uploadfile.min.js` | Plugin de upload múltiplo da galeria |
| `v6/public/assets/plugins/summernote/summernote.min.js` + `summernote-pt-BR.js` | Editor WYSIWYG do texto |
| `v6/public/assets/plugins/lightgallery/` | Lightbox da galeria do portal |

**Endpoints chamados pelo front:**

| Endpoint | Chamador | Payload |
|---|---|---|
| `GET /cms/datatable/agenda_evento` | `datatable.js` | parâmetros padrão do DataTables (filtros, ordenação, paginação) |
| `POST /cms/agenda-evento/delete-por-lote` | `deleteAll.js` | `_token`, `toDelete[]` |
| `POST /cms/galeria` | `midias/index.js` | `file` (multipart), `id`, `table=calendar_event`, `_token` |
| `GET /cms/galeria/calendar_events_id/{id}` | `midias/index.js` | — |
| `POST /cms/galeria/delete/{id}` | `midias/index.js` | — |
| `POST /cms/ajax-delete-files` | `edit.blade.php` (`deleteHighlightArchive`) | `content`, `archive_id` |
| `POST /cms/ajax-upload-files-calendar-event` | **sem chamador no front atual** (rota legada) | `archive_galery`, `titulo`, `event` |

> Não há *polling* nem atualização automática nas telas do módulo.

---

## 4. Exportações

A listagem do CMS usa os botões padrão de `runDatatables`
(`v6/public/assets/js/custom/utilities/table.js`): **Excel** e **PDF** com DataTables
Buttons, exportando as colunas visíveis exceto `.column-actions`
(`exportOptions: { columns: ':visible:not(.column-actions)', stripHtml: true }`).
O portal **não** oferece exportação.

---

## 5. Resumo do que cada público enxerga

| Público | Elementos visíveis |
|---|---|
| Cidadão (portal) | Grade de eventos com imagem, data, título e categoria; filtro por categoria; detalhe com período, local, compartilhamento, imagem, texto e galeria; breadcrumb Home > Agenda de Eventos > Categoria > Evento |
| Operador (CMS) | DataTable com ID, título, status (Publicado/Rascunho), datas, categoria e botões (link público, galeria, editar, excluir); formulário completo; aba de galeria; tela de categorias; botões condicionados a `has_access` |
