# Mais Conteúdos — Views e UX

## 1. Telas do CMS

| Arquivo | Função |
|---|---|
| `v6/resources/views/prefecture/category-contents/index.blade.php` | Lista (pills) das categorias "Mais Conteúdos" |
| `v6/resources/views/prefecture/category-contents/create.blade.php` | Formulário de cadastro |
| `v6/resources/views/prefecture/category-contents/edit.blade.php` | Formulário de edição |
| `v6/resources/views/prefecture/category-contents/form.blade.php` | Bloco compartilhado (Nome + Categoria Pai) |
| `v6/resources/views/prefecture/category-contents/show.blade.php` | Detalhe da categoria com os conteúdos |
| `v6/resources/views/prefecture/category-contents/legislacao/*` | Variantes por família (`legislacao`, `publicacoes`, `noticias`, …) |
| `v6/resources/views/prefecture/contents/index.blade.php` | Lista genérica de conteúdos (todas as categorias) |
| `v6/resources/views/prefecture/contents/create.blade.php` | Formulário de conteúdo (select com as categorias "Mais Conteúdos") |
| `v6/resources/views/prefecture/contents/edit.blade.php` | Formulário de edição de conteúdo |

> **Não existe** a pasta `v6/resources/views/prefecture/contents/categories-contents/`
> (verificado). As telas de categorias ficam em
> `v6/resources/views/prefecture/category-contents/`.

### 1.1 Lista (`category-contents/index.blade.php`)

A listagem é uma **pilha de pills** (uma por categoria), não uma tabela:

```blade
<ul class="nav nav-pills nav-stacked  ">
    @foreach ($categoryContents as $categoryContent)
        <li>
            <a href="{{route('categoria-conteudo.show', $categoryContent->id)}}">{{ $categoryContent->name }} <i class="fa fa-angle-right text-muted float-right"></i> </a>
        </li>
    @endforeach
</ul>
```

Botão "Cadastrar Categoria" condicionado a `has_access(['categoria-conteudo.create'])`.

### 1.2 Formulário (`category-contents/form.blade.php`)

| Campo | Componente | Observações |
|---|---|---|
| `generic` | `<input type="hidden" value="1">` | Sinaliza ao request que a categoria é de topo (sem pai obrigatório) |
| `name` | `components.inputs.input` | `Nome` |
| `category_contents_id` | `components.inputs.select` | "Categoria Pai", alimentado por `$categories` (as categorias "Mais Conteúdos" de topo) |

> O formulário **genérico** só tem Nome e Categoria Pai. Os campos `order`,
> `quantidade_itens`, `layout`, `display_type`, `description` e `custom_icon` só
> aparecem nas variantes específicas por família (notícias, transparência fiscal etc.).

### 1.3 Formulário de conteúdo (`prefecture/contents/create.blade.php`)

O select de categoria é preenchido com as subcategorias "Mais Conteúdos":

```php
// v6/app/Http/Controllers/Prefecture/ContentController.php:341-344
$categories = $this->categoryContent->where('status_create', 0)->whereNull('category_contents_id')->get()->pluck('id');
$categoryContents = $this->categoryContent->where('status_create', false)->whereIn('category_contents_id', $categories)->get();

return view('prefecture.contents.create', ['categoryContent' => $categoryContents, 'title' => $title]);
```

### 1.4 JavaScript

| Arquivo | Uso |
|---|---|
| `v6/public/assets/js/custom/contents/category-contents/` | Scripts das telas de categoria (a pasta existe) |
| `v6/public/assets/js/custom/contents/menus/` | Scripts de ordenação (drag & drop) |

A tela de listagem de categorias inclui apenas o bloco de tooltips/confirmation
embutido no próprio Blade (`$('[data-toggle=delete_btn]').confirmation(...)`).

## 2. Portal — views genéricas

As categorias "Mais Conteúdos" são renderizadas pelas views **genéricas** do modelo de
layout ativo. Cada modelo tem o seu conjunto:

| Modelo | Arquivos |
|---|---|
| modelo1 | `v6/resources/views/portal/layouts/modelo1/generic/index.blade.php`, `.../generic/show.blade.php`, `.../generic/view.blade.php`, `.../generic/cat-nav.blade.php`, `.../generic/list.blade.php` |
| default | `v6/resources/views/portal/layouts/default/pages/contents/generic/view.blade.php` (entre outras) |

> A view do portal é escolhida por `getTemplateActived()` — o layout ativo em
> `configurations.key = 'layout'`.

### 2.1 Listagem de subcategorias (`generic.index`)

Controller (`v6/app/Http/Controllers/Portal/PortalController.php:341-357`):

```php
$title = $category->name;
$categoryFather = $category;
$categories = CategoryContent::whereHas('categoryContents', function ($query) use ($slug) {
    $query->where('slug', '=', $slug);
})->get();
```

### 2.2 Lista de conteúdos (`generic.show`)

```php
$contents = Content::where('category_contents_id', $category->id)->orderBy('publication_date', 'desc')->paginate(12);
$anos = DB::select("select extract(year from publication_date) as ano from contents WHERE category_contents_id = {$category->id} AND deleted_at IS NULL GROUP BY ano order by ano desc;");
```

- 12 conteúdos por página.
- Filtro por ano de publicação, com **SQL interpolado** (`{$category->id}`) — o valor
  vem de um `int` do Eloquent, mas a construção é textual.

### 2.3 Página do conteúdo (`generic.view`)

```php
$content = Content::where('slug', $slug3)->first();
if ($content && $content->status == true && strtotime($content->publication_date) <= time()) {
    $archives = Archive::where('contents_id', $content->id)->where('highlight', null)->get();
    $galery = ($content->galery == 1) ? $archives : 0;
    $content->increment('clicks');
    return view('portal.layouts.' . $this->getTemplateActived() . '.generic.view', compact('title', 'category', 'content', 'null', 'archives', 'galery'));
}
```

Comportamento observável:

- Conteúdo **não publicado** (`status != true`) ou com data futura → a view não é
  renderizada (o `catch (\Throwable $th) {}` silencioso engole a exceção e a resposta
  fica vazia).
- O contador `clicks` é incrementado a cada visita.

## 3. Árvore de categorias no portal

`v6/resources/views/portal/components/categories-contents/recursive-list.blade.php`
renderiza a hierarquia recursivamente:

```blade
<ul class="categories scrollbar-sm list-group list-unstyled list-group-flush ...">
    @foreach ($categories as $cat)
        <a href="{{ route($route, $cat->slug) }}" id="{{ $cat->slug }}" class="list-group-item ...">
            <button class="btn btn-sm" ...><i class="fa fa-angle-right ..."></i></button>
            <li class="text-md-left text-center" ...>{{ $cat->name }}</li>
        </a>
        @if (data_get($cat, 'rightWayToGetCategoryContents'))
            @include('portal.components.categories-contents.recursive-list', [
                'route' => $route,
                'categories' => $cat->rightWayToGetCategoryContents,
                'child' => true,
                'index' => $index + 1,
            ])
        @endif
    @endforeach
</ul>
```

- A recursão usa a relação `rightWayToGetCategoryContents` (filhos diretos).
- O `padding-left` cresce `1.05rem` por nível.
- classes `active bg-color-3` na categoria corrente.

## 4. Bloco "mais-conteudos" desativado no portal

`v6/resources/views/portal/layouts/modelo5/home/transparencia/transparencia-fiscal-grid.blade.php:117`:

```blade
@if(false){{-- bloco vazio: mais-conteudos removido do select --}}@else
```

O `else` contém o grid completo de transparência (com `display_type`, `custom_icon` e
`description`), mas **nunca é renderizado**. O comentário indica que o bloco "mais
conteúdos" foi removido do `<select>` de categorias da transparência fiscal.

## 5. Variável `$null` (breadcrumb)

Documentada em `v6/.agents/docs/mais-conteudos.md`: as views usam `$null` para
controlar a exibição do breadcrumb.

- `$null = false` → breadcrumb exibido.
- `$null = true` → breadcrumb oculto.

O `PortalController@contentList` inicializa `$null = false` antes do `switch`
(`v6/app/Http/Controllers/Portal/PortalController.php:315`). A inicialização é
obrigatória: sem ela, a view quebra com "Undefined variable: null".

## 6. Exportações

Não há exportação específica de "Mais Conteúdos". O portal oferece filtros por ano e
por mês; a API Swagger (`v6/app/Http/Controllers/Swagger/V1/Portal/`) cobre apenas
notícias, publicações, legislação, órgãos e secretarias.

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

| Público | Onde | O quê |
|---|---|---|
| Operador | Menu lateral | Item "Mais Conteúdos" com submenu por categoria |
| Operador | `/cms/categoria-conteudo` | Pills com as categorias criadas |
| Operador | `/cms/categoria-conteudo/create` | Formulário (Nome, Categoria Pai) |
| Operador | `/cms/conteudo/create` | Select com as categorias "Mais Conteúdos" e subcategorias |
| Cidadão | `/portal/<slug>` | Lista de subcategorias |
| Cidadão | `/portal/<slug>/<subslug>` | Lista paginada de conteúdos + filtro por ano |
| Cidadão | `/portal/<slug>/<subslug>/<slug-conteudo>` | Conteúdo completo |
