# Feriados Municipais — Views e UX

## 1. Views do portal público

Uma view por tema, em
`v6/resources/views/portal/layouts/{modelo}/feriados-municipais/index.blade.php`.

| Tema | Arquivo | Componente de acordeão | CSS referenciado | CSS existe? |
|---|---|---|---|---|
| `modelo1` | `v6/resources/views/portal/layouts/modelo1/feriados-municipais/index.blade.php` | `card-accordion` | `layouts/modelo1/css/feriados-municipais.css` | sim |
| `modelo2` | `v6/resources/views/portal/layouts/modelo2/feriados-municipais/index.blade.php` | `card-accordion` | `layouts/modelo2/css/feriados-municipais.css` | sim |
| `modelo3` | `v6/resources/views/portal/layouts/modelo3/feriados-municipais/index.blade.php` | `card-accordion` | `layouts/modelo3/css/feriados-municipais.css` | sim |
| `modelo4` | `v6/resources/views/portal/layouts/modelo4/feriados-municipais/index.blade.php` | `card-accordion` | `layouts/modelo4/css/feriados-municipais.css` | sim |
| `modelo5` | `v6/resources/views/portal/layouts/modelo5/feriados-municipais/index.blade.php` | `accordion-item` | `layouts/modelo5/css/feriados-municipais.css` | sim |
| `modelo6` | `v6/resources/views/portal/layouts/modelo6/feriados-municipais/index.blade.php` | `card-accordion` | `layouts/modelo6/css/feriados-municipais.css` | **NÃO** |
| `default` | — | — | — | **não existe** |

O tema ativo vem da chave `layout` da tabela `configurations`
(`v6/app/Http/Traits/GetInformationsPrefectureTrait.php:92`,
`getTemplateActived()`). No ambiente de desenvolvimento o valor é `modelo1`.

### 1.1 Estrutura da view (modelo1)

`v6/resources/views/portal/layouts/modelo1/feriados-municipais/index.blade.php`

```blade
@section('content')
    <div class="col-xl-9 col-lg-9">
        <h4 class="text-uppercase txt-color-2 font-or">Feriados municipais</h4>
        <div class="border-title d-block bg-color-1 mb-4"></div>
        <h2 class="text-center border-0 p-0 h4 titulo-ano my-5">Feriados Municipais - {{date('Y')}}</h2>

        <div id="accordion">
            @include('portal.components.feriados-municipais.card-accordion')
        </div>
    </div>
@endsection
```

| Bloco | Conteúdo |
|---|---|
| `other-heads` | `<link>` para o CSS específico do tema |
| `breadcrumb` | `Breadcrumbs::view('portal.layouts.{modelo}.layout.breadcrumb', 'feriados-municipais')` |
| `content` | Título, separador, título do ano e o acordeão |
| `side-bar` | `@include('portal.layouts.{modelo}.layout.sidebar.layout')` |

O `modelo5` usa `<div class="accordion" id="accordionExample">` (Bootstrap 5) e o
`modelo6` usa `<div id="accordion">` com o componente Bootstrap 4.

### 1.2 Componente `card-accordion` (Bootstrap 4)

`v6/resources/views/portal/components/feriados-municipais/card-accordion.blade.php`

```blade
@foreach ($feriados as $key => $items)
    <div class="card">
        <div class="card-header pb-0" id="heading{{translateMonth($key)}}">
            <div class="mb-0">
                <button class="btn btn-link bg-color-1 txt-color-dinamic-1" data-toggle="collapse" data-target="#collapse{{translateMonth($key)}}" aria-expanded="true" aria-controls="collapse{{translateMonth($key)}}">
                    {{translateMonth($key)}}
                </button>
            </div>
        </div>
        <div id="collapse{{translateMonth($key)}}" class="collapse show" aria-labelledby="heading{{translateMonth($key)}}" data-parent="#accordion">
            <div class="card-body">
                @foreach ($items as $item)
                    <div class="d-flex align-items-center my-3">
                        <div class="icone-feriado d-flex align-items-center justify-content-center color-border-1 mr-3">
                            <i class="{{ $item->icon }}"></i>
                            <div class="dia-feriado bg-color-1 txt-color-dinamic-1"> {{ date('d', strtotime($item->date)) }} </div>
                        </div>
                        <span class="ml-5 texto-feriado">{{ $item->description }}</span>
                    </div>
                @endforeach
            </div>
        </div>
    </div>
@endforeach
```

| Elemento | Origem |
|---|---|
| Nome do mês | `translateMonth($key)` (`v6/app/Helpers/functions.php:93`) |
| `id` do cartão | `collapse{ nome do mês }` (ex.: `collapseJaneiro`) |
| `id` do cabeçalho | `heading{ nome do mês }` |
| Ícone | `{{ $item->icon }}` — classe CSS gravada no banco |
| Dia | `date('d', strtotime($item->date))` — apenas o dia |
| Descrição | `{{ $item->description }}` (escapado) |

Os cartões já vêm **abertos** (`class="collapse show"`), e o agrupamento por
mês garante apenas um cartão por mês.

### 1.3 Componente `accordion-item` (Bootstrap 5)

`v6/resources/views/portal/components/feriados-municipais/accordion-item.blade.php`
— equivalente, mas com `accordion-item` / `accordion-button` /
`accordion-collapse` e `data-bs-toggle` / `data-bs-target`. É usado apenas pelo
`modelo5`.

### 1.4 CSS

| Arquivo | Conteúdo esperado |
|---|---|
| `v6/public/layouts/modelo1/css/feriados-municipais.css` | `.icone-feriado`, `.dia-feriado`, `.texto-feriado`, `.titulo-ano` |

Existe CSS para `modelo1` a `modelo5`. **Não existe**
`v6/public/layouts/modelo6/css/feriados-municipais.css`, embora a view do
`modelo6` o referencie — a requisição do CSS retorna 404 e a página aparece sem
estilo.

## 2. Views do CMS

### 2.1 `index.blade.php` — listagem

`v6/resources/views/prefecture/contents/feriados-municipais/index.blade.php`

| Elemento | Detalhe |
|---|---|
| Título da caixa | "Lista de {{ $title }}" (`$title` = "Feriados Municipais") |
| Botão de cadastro | `route('painel.feriados-municipais.create')`, visível com `has_access(['feriados-municipais.create'])` |
| Botão de exclusão em lote | Componente `prefecture.components.deleteByLoteSubmitButton` com `route('painel.feriados-municipais.destroyAll')`, visível com `has_access(['feriados-municipais.delete'])` |
| Tabela | `#tabela_feriados_municipais`, colunas: (checkbox), ID, Data, Descrição, Ações |
| Checkbox master | Componente `prefecture.components.deleteByLoteMasterCheckbox` (`#checkAll`) |
| Scripts | `assets/js/custom/Utilities/deleteAll.js` e `assets/js/custom/contents/feriados-municipais/datatable.js` |

**Bug:** o script é referenciado como `assets/js/custom/Utilities/deleteAll.js`
(U maiúsculo), mas o arquivo real é
`v6/public/assets/js/custom/utilities/deleteAll.js` (u minúsculo). Em Linux, o
servidor responde 404 e a exclusão em lote deixa de funcionar.

O corpo da tabela (`<tbody>`) é **vazio** no HTML — as linhas são preenchidas
pelo DataTable via AJAX.

### 2.2 `create.blade.php` — formulário

`v6/resources/views/prefecture/contents/feriados-municipais/create.blade.php`

| Elemento | Detalhe |
|---|---|
| Título | "Editar {{ $title }}" se `$data` existir, senão "Cadastrar {{ $title }}" |
| Rota do form | `['painel.feriados-municipais.store']` ou `['painel.feriados-municipais.update', $data->id]` |
| Método | `method_field('PUT')` quando é edição |
| CSRF | `{!! csrf_field() !!}` |
| Campos | `@include('prefecture.contents.feriados-municipais.form')` |

**Bug:** o link "Voltar" aponta para `route('servidor.index')` — ou seja, para a
tela de **Servidores**, não para a lista de feriados (texto copiado do módulo
Servidor).

### 2.3 `form.blade.php` — campos

`v6/resources/views/prefecture/contents/feriados-municipais/form.blade.php`

| Campo | Componente | Detalhes |
|---|---|---|
| `date` | `components.inputs.date` | Título "Data do feriado"; obrigatório; `classes => 'input-date'`; máscara `br-data`; valor `date('d/m/Y', strtotime($data->date))` (ou hoje, em criação) |
| `icon` | `components.inputs.icon` | Título "Ícone"; obrigatório; valor padrão `fab fa-500px` |
| `description` | `components.inputs.textarea` | Título "Descrição do feriado"; obrigatório; `size => 12` |

Componente de data (`v6/resources/views/components/inputs/date.blade.php`):
gera um `<input>` com a classe `input-date`, que vira **datetimepicker** via
`v6/public/assets/js/custom/utilities/exec.js` (`format: "d/m/Y"`,
`timepicker: false`). A máscara `br-data` é aplicada por
`$(".br-data").mask("00/00/0000")` no mesmo arquivo.

## 3. JavaScript

### 3.1 CMS — DataTable

`v6/public/assets/js/custom/contents/feriados-municipais/datatable.js`:

```javascript
let collums = [
    {
        data: 'data',
        render: function (data) {
            return `<div class='vertical-middle' style='padding:8px 0'>${data}</div>`;
        }
    },
    {
        data: 'descricao',
        render: function (data) {
            return `<div class='vertical-middle' style='padding:8px 0'>${data}</div>`;
        }
    },
    {
        data: null,
        orderable: false,
        render: function (data) {
            return `<div class='flex justify-center'>`
                + createBTN(data.id, `feriados-municipais/${data.id}/edit`, data.edit, data.delete, `feriados-municipais/${data.id}`)
                + `</div>`;
        }
    }
];

runDatatables('feriados_municipais', collums, true, 'ASC', null, true);
```

| Parâmetro | Valor | Efeito |
|---|---|---|
| `url` | `feriados_municipais` | `/cms/datatable/feriados_municipais` |
| `ordenavel` | `true` | Ordenação habilitada |
| `type_order` | `ASC` | Ordena pela 2ª coluna (`data`) |
| `callback` | `null` | — |
| `deleteAll` | `true` | Insere a coluna de seleção e o botão de exclusão em lote |

O botão de editar aponta para `feriados-municipais/{id}/edit` (URL relativa,
resolvida a partir de `/cms/feriados-municipais` → `/cms/feriados-municipais/{id}/edit`).

O botão de excluir recebe o atributo `target="feriados-municipais/{id}"`, usado
por `addDelete()` em `v6/public/assets/js/custom/utilities/table.js` para fazer
`DELETE /cms/feriados-municipais/{id}` via `myFetch`
(`v6/public/assets/js/custom/utilities/functions.js:64`), que envia o header
`X-CSRF-TOKEN`.

### 3.2 CMS — exclusão em lote

`v6/public/assets/js/custom/utilities/deleteAll.js`:

```javascript
const toDelete = $('input[name="toDeleteAll[]"]:checked').map(function () {
    return this.value
}).get();

if (!toDelete.length) return Swal.fire('Erro', 'Nenhum registro foi selecionado para exclusão.', 'info');

$.ajax({
    url: routeDelete,
    method: 'POST',
    dataType: 'json',
    data: {
        _token: $('meta[name="csrf-token"]').attr('content'),
        toDelete: toDelete
    },
    success: function (response) {
        let message = 'Registro(s) deletados com sucesso!';
        if (response.success) message = response.success;

        Swal.fire(message, '', 'success').then(() => {
            datatable ? datatable.ajax.reload() : window.location.reload();
            $('#checkAll').prop('checked', false);
            $('#countDeleteLote').html(`(0)`);
        });
    },
    error: function (err) {
        if (err.responseJSON.erro) {
            return Swal.fire('Erro', err.responseJSON.erro, 'error');
        } else {
            return Swal.fire('Erro', 'Ocorreu um erro! Por favor entre em contato com o suporte técnico.', 'error');
        }
    }
});
```

O array é serializado pelo jQuery como `toDelete[]=1&toDelete[]=2`, e o
controller lê `$request->toDelete`.

### 3.3 Portal

**Não há JavaScript próprio** do módulo no portal. O acordeão usa apenas o
Bootstrap (`data-toggle`/`data-target` no Bootstrap 4 e `data-bs-toggle`/
`data-bs-target` no Bootstrap 5). Não há AJAX, polling, nem endpoint
adicional.

## 4. Exportações

| Contexto | Formato | Como é gerado |
|---|---|---|
| CMS (DataTable) | Excel, PDF, CSV | DataTables Buttons (client-side) em `v6/public/assets/js/custom/utilities/table.js`; exclui a coluna `.column-actions`; título "Prefeitura de {cidade} - {data}" |
| Portal | — | Não há exportação |

## 5. O que o cidadão vê

1. Breadcrumb "Home > Feriados municipais".
2. Título "Feriados municipais" e subtítulo "Feriados Municipais - {ano}".
3. Um cartão (ou item de acordeão) por mês, com o nome do mês em português.
4. Em cada feriado: o ícone, o dia dentro de um selo circular colorido e a
   descrição ao lado.
5. Nada é exibido para feriados de **outros anos** (o portal filtra o ano
   corrente).

## 6. O que o operador vê

1. Item de menu "Feriados Municipais" (ícone `calendar-check-o`), exibido só se
   `modulos.status = true`.
2. Listagem DataTable: ID, Data (`DD/MM/YYYY`), Descrição e Ações.
3. Botão "Cadastrar Feriados Municipais" e botão "Excluir Registro(s) (N)".
4. Formulário único (create/edit) com três campos.
5. Sem visualização de detalhe: a rota `show` existe mas não renderiza nada.

## 7. Assets

| Asset | Caminho | Uso |
|---|---|---|
| CSS do portal (temas 1-5) | `v6/public/layouts/modelo1/css/feriados-municipais.css` | Estilo do selo do dia |
| CSS do portal (modelo6) | `v6/public/layouts/modelo6/css/feriados-municipais.css` | **Ausente** (404) |
| JS do DataTable | `v6/public/assets/js/custom/contents/feriados-municipais/datatable.js` | Colunas do DataTable |
| JS genérico de tabela | `v6/public/assets/js/custom/utilities/table.js` | `runDatatables`, `createBTN` |
| JS de exclusão em lote | `v6/public/assets/js/custom/utilities/deleteAll.js` | `submitDeleteAll` |
| JS de requisição | `v6/public/assets/js/custom/utilities/functions.js` | `myFetch` |
| JS de máscaras/datepicker | `v6/public/assets/js/custom/utilities/exec.js` | `br-data`, `input-date` |
| SweetAlert2 | carregado pelo layout AdminLTE | Confirmações de exclusão |
