# Destaques — Views e UX

## 1. Telas do CMS

| Arquivo | Função |
|---|---|
| `v6/resources/views/prefecture/highlight/index.blade.php` | Lista de destaques (DataTable) |
| `v6/resources/views/prefecture/highlight/create.blade.php` | Formulário de cadastro |
| `v6/resources/views/prefecture/highlight/edit.blade.php` | Formulário de edição |
| `v6/resources/views/prefecture/highlight/form.blade.php` | Bloco compartilhado entre create/edit |

Todas estendem `admin.layouts.app` (AdminLTE 1.22 / Bootstrap 3).

> Observação: as telas do módulo **não** ficam em `v6/resources/views/prefecture/contents/`
> (pasta usada pelos módulos genéricos de conteúdo). Elas ficam em
> `v6/resources/views/prefecture/highlight/`, pois o módulo tem controller e model
> próprios.

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

Estrutura da tabela:

| Coluna | Origem do dado |
|---|---|
| Checkbox master | `prefecture.components.deleteByLoteMasterCheckbox` |
| ID | `id` |
| Título | `titulo` (campo da view SQL/tabela) |
| Posição | `posicao` |
| Ações | `createActiveButton` + `createBTN` (JS) |

Botões condicionais:

```blade
@if (has_access(['destaques.create']))
    <a href="{{ route('destaques.create') }}" class="btn btn-success font-weight-bold btn-sm" role="button">
        <i class="fa fa-plus"></i> Cadastrar Destaque
    </a>
@endif
```

A exclusão em lote usa a rota `ajax.generic.content.deleteAll`
(`v6/routes/basepro.php:141`), compartilhada com o módulo de conteúdos genéricos —
**atenção**: essa rota opera sobre `contents`, não sobre `highlights`.

### 1.2 Formulário (`form.blade.php`)

| Campo | Componente | Observações |
|---|---|---|
| Publicar | `components.inputs.checkbox` | Default `true`; desmarcado = rascunho |
| Título | `components.inputs.input` | `maxlen => 150` na UI, `max:255` no request |
| Subtítulo | `<textarea name="subtitle">` | `rows=4` |
| Imagem Principal | `components.inputs.image` | Recebe `content` e `destaque` (o `Archive`) |
| URL | `components.inputs.input` | `maxlen => 2999` |
| Texto do botão | `components.inputs.input` | `maxlen => 255` |
| Layout de exibição | `components.inputs.layout-highlight` | radio `layout-1` (Largura da página) / `layout-2` (Centralizado) |
| Posição | `components.inputs.input` (number) | Default = posição do model ou `old('position')` |
| Exibir botão | `components.inputs.checkbox` | default `true` |

Componente de layout (`v6/resources/views/components/inputs/layout-highlight.blade.php`):
desenha dois SVG ilustrativos e emite `<input type="radio" name="layout" value="1|2">`.

> O bloco de layout é inserido **fora** do `@include('components.inputs.input')`, logo o
> valor não passa pelo `old()` em caso de erro de validação.

### 1.3 Edição — JavaScript específico

`v6/resources/views/prefecture/highlight/edit.blade.php` inclui:

- `assets/js/custom/contents/midias/index.js` e as funções `chargeGallery(id,'contents_id')`
  e `setupGallery(id,'content')` — **herança de código do módulo de mídias**: o destaque
  não tem galeria própria, mas a tela reaproveita o mesmo componente.
- `deleteHighlightArchive(archive_id)`, que faz `POST` em `route('ajax.delete.files')`
  passando `content` e `category_contents_id` — para um destaque **não existe**
  `category_contents_id` (a coluna é do model `contents`), resultando em
  `content.category_contents_id` vazio na requisição.

## 2. DataTable (JS)

Arquivo: `v6/public/assets/js/custom/contents/highlight/datatable.js`

```js
let collums = [
    { data: 'titulo',  render: function (data) { ... } },
    { data: 'posicao', render: function (data) { ... } },
    {
        data: null, name: "actions", orderable: false,
        render: function (data) {
            return `<div class='flex justify-center'>`
                + createActiveButton(data.status, data.id, 'destaques', data.active, data.inactivate, `/cms/destaques/${data.id}/status`)
                + createBTN(data.id, `destaques/${data.id}/edit`, data.edit, data.delete, `destaques/${data.id}`)
                + `</div>`;
        }
    },
];

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

Pontos:

- A URL do toggle é **hardcoded** (`/cms/destaques/{id}/status`), não vem de
  `route()` — acopla o JS ao prefixo do CMS.
- Os campos `titulo` e `posicao` são os nomes esperados do backend; o grid consulta a
  view SQL `highlight` (`DB::table('highlight')`), que expõe exatamente essas colunas
  — a listagem funciona, mas só mostra `value`, `titulo`, `subtitulo`, `status`,
  `posicao` e `id`.

## 3. Portal — carrossel de destaques

### 3.1 Layouts

| Layout | Arquivo |
|---|---|
| modelo1 | `v6/resources/views/portal/layouts/modelo1/home/destaque.blade.php` |
| modelo2 | `v6/resources/views/portal/layouts/modelo2/home/destaque.blade.php` |
| modelo3 | `v6/resources/views/portal/layouts/modelo3/home/destaque.blade.php` |
| modelo4 | `v6/resources/views/portal/layouts/modelo4/home/destaque.blade.php` |
| modelo5 | `v6/resources/views/portal/layouts/modelo5/home/destaque.blade.php` |
| modelo6 | `v6/resources/views/portal/layouts/modelo6/home/destaque.blade.php` |

Cada `home/index.blade.php` do modelo faz `@include('portal.layouts.modeloN.home.destaque')`.

### 3.2 Renderização (modelo1 — referência)

```blade
@if (isset($modulos['noticias']) && $modulos['noticias'])
    @if(count($highlights))
        <section id="main-news" class="main-news mb-3 w-100 @if(!$highlightFullScreen)px-3 @endif" style="min-height: 400px;">
            <div class="@if(!$highlightFullScreen) width-container @endif mx-auto position-relative">
                <ul id="image-gallery" class="list-unstyled cS-hidden">
                    @foreach ($highlights as $highlight)
                        <li style="background: url({{ getLargFile($highlight->archive->path ?? null) }}) no-repeat center; background-size: cover;">
                            <a href="{{ $highlight->url ?? '#' }}" class="d-flex align-items-center justify-content-center w-100" ...>
                                <div class="text-center text-white box-text-highligh">
                                    <h1 class="title-highligh">{{ $highlight->title }}</h1>
                                    <p class="mb-0 subtitle-highligh">{{ $highlight->subtitle }}</p>
                                    @if($highlight->status_button)
                                        <button class="btn bg-color-1 txt-color-dinamic-1 mt-2">{{ $highlight->text_button }}</button>
                                    @endif
                                </div>
                            </a>
                        </li>
                    @endforeach
                </ul>
                // trecho omitido do código original
```

Comportamento observável:

1. Se o módulo `noticias` estiver desligado **ou** não houver destaques com
   `status = true`, o portal mostra o **carrossel de notícias** (fallback).
2. A imagem é usada como **background** do `<li>` (não como `<img>`), com
   `background-size: cover`.
3. `is_blank` **não é aplicado**: o `<a>` não recebe `target="_blank"`.
4. O botão CTA é renderizado apenas com `status_button` verdadeiro.
5. O carrossel usa o plugin `lightslider.js`
   (`assets/vendor/portal/js/lightslider.js` + `assets/js/custom/portal/lightslider.js`).

### 3.3 Fullscreen

`v6/app/Providers/ConfigHeaderServiceProvider.php:103` injeta
`$highlightFullScreen` (primeiro destaque com `layout = 1` e `status = true`). Com ele,
a seção deixa de usar a classe `width-container` e o texto ganha `max-width: 600px`
em vez de `500px`.

## 4. Elementos de "destaque" em outras telas do portal

Cuidado ao pesquisar por "destaque" no portal: a maioria das ocorrências **não**
pertence a este módulo, e sim ao campo `archives.highlight` (imagem principal de um
conteúdo):

| Arquivo | Uso |
|---|---|
| `v6/resources/views/portal/components/secretarias/show.blade.php` | `$event->archives->where('highlight', true)->first()->path` |
| `v6/resources/views/portal/layouts/modelo1/layout/sidebar/orgaosNews.blade.php` | idem, para notícias de órgãos |
| `v6/resources/views/portal/layouts/modelo1/informacoes-instituicao/components/components-a-prefeitura/index.blade.php` | idem |
| `v6/resources/views/portal/layouts/modelo1/sessoes/show.blade.php` | `og:image` de sessões |
| `v6/resources/views/portal/layouts/modelo3/noticias/index.blade.php` | "Imagem de destaque" de notícias |
| `v6/resources/views/portal/components/view_pdf/files-list.blade.php` | "imagem destaque" de PDFs |

Além disso, existem pastas/arquivos com o nome "destaques" que pertencem a **outro**
conceito:

- `v6/resources/views/portal/layouts/modelo5/home/destaques/noticias-destaque.blade.php`
- `v6/resources/views/portal/layouts/modelo6/home/destaques/destaque-1.blade.php` … `destaque-4.blade.php`

Esses são blocos do **modelo personalizável** (tabela `layouts`, seções `destaques` /
`destaque`), não do módulo `highlights`.

## 5. Exportações

Não há exportação (Excel/PDF/CSV) no módulo de destaques.

## 6. Resumo do que o usuário vê

| Público | Onde | O quê |
|---|---|---|
| Operador | `/cms/destaques` | Lista com `titulo`/`posicao` vindos da view `highlight` (sem `text_button`, `url`, `layout`, `is_blank`) |
| Operador | `/cms/destaques/create` | Formulário de cadastro com upload de imagem |
| Cidadão | `/` (home) | Carrossel de destaques; fallback para notícias |
