# PLATAFORMA — Views e UX

> Fonte: `v6/resources/views/**` (1.659 arquivos Blade) e
> `v6/public/assets/**` (2.026 arquivos `.js`).

---

## 1. Divisão das views

| Árvore | Arquivos `.blade.php` | Consumidor |
|---|---|---|
| `v6/resources/views/portal/` | **1.069** | Portal público |
| `v6/resources/views/prefecture/` | **452** | CMS (conteúdo e módulos) |
| `v6/resources/views/admin/` | **62** | CMS (admin, dashboard, permissões) |
| `v6/resources/views/components/` | (compartilhado) | Portal + CMS |
| `v6/resources/views/exports/` | (planilhas) | `App\Exports\*` (Maatwebsite Excel `FromView`) |
| `v6/resources/views/shared/`, `swagger/`, `vendor/` | — | — |

Comparação v5 → v6: portal 1.524 → **1.659** Blades no total (+135).

---

## 2. Os 6 temas do portal + `default`

### 2.1 Estrutura de diretórios

`v6/resources/views/portal/layouts/` contém 7 árvores:

| Árvore | Blades | Linhas (soma) | Papel |
|---|---|---|---|
| `modelo5` | 177 | 13.046 | **Tema mais completo** — é o tema referenciado pela tabela `layouts` |
| `modelo6` | 153 | 10.820 | Variante do modelo 5 |
| `modelo1` | 144 | 10.344 | Tema de estrutura "flat" (blocos `aviso`, `elementos`, `destaque`, `eventos`) |
| `modelo2` | 143 | — | Variante do modelo 1 |
| `modelo3` | 136 | — | Variante |
| `modelo4` | 136 | — | Variante |
| `default` | 75 | 6.428 | **Legado** — tema inicial anterior ao sistema de modelos |

> A task description menciona "6 layouts (`default`, `modelo1`..`modelo5`)". O
> repositório real tem **7 árvores**: `default` + `modelo1`..`modelo6`. Verificar
> antes de assumir 6.

### 2.2 Sub-estrutura de cada modelo

Cada `modeloN` tem a mesma taxonomia de pastas:

```
v6/resources/views/portal/layouts/modelo5/
├── home/                 # home (index, destaques, covid, news, super-banners, transparencia, sessoes, vereadores)
├── layout/               # cabeçalho, rodapé, sidebar, breadcrumb
├── generic/              # listagem e visualização genérica de conteúdo
├── noticias/  publicacoes/  legislacao/  licitacao/  carta-servicos/
├── atas-e-pontos/  pauta-do-dia/  enquetes/  pergunta-frequentes/
├── glossario/  feriados-municipais/  comite-de-investimentos/
├── dynamics-forms/  cultural-mapping/  informacoes-instituicao/
├── busca/  generic/  components/  apoio-ao-usuario/
```

**Duplicação:** essa taxonomia está replicada **6 vezes** (modelo1..modelo6) +
`default`. São ~1.000 Blades que são variantes de layout do **mesmo**
conteúdo. É a maior fonte de retrabalho do frontend.

### 2.3 Diferenças entre modelo1 e modelo5 (home)

Comparação dos arquivos de `home/` (via `diff` recursivo de nomes):

| modelo1 | modelo5 |
|---|---|
| `acesso-rapido.blade.php` | `news/sidebar/acesso-rapido.blade.php` |
| `aviso.blade.php` | `covid.blade.php` + `covid/vacinometro.blade.php` |
| `destaque.blade.php` | `destaques/carousel-noticias.blade.php` + `destaques/noticias-destaque.blade.php` |
| `elementos.blade.php` | `news/home-news.blade.php`, `news/more-news/*`, `news/sidebar/banners*` |
| `eventos.blade.php` | `sessoes.blade.php` + `sessoes/sessoes-list.blade.php` |
| `modalVideo.blade.php` | `super-banners/super-banners*.blade.php` (4 arquivos) |
| `sessions.blade.php` | `transparencia/image-transparencia-fiscal.blade.php` |
| `index.blade.php` | `index.blade.php` |
| — | `news/category-news/*` (3 arquivos) |

Ou seja: **modelo1 é "flat"** (blocos no mesmo nível, com `elementos.blade.php`
como agregador), **modelo5 é "estruturado"** (seções aninhadas com nomes
semânticos: `destaques`, `news`, `super-banners`, `transparencia`).

### 2.4 Escolha do layout em runtime

O tema é uma **configuração chave/valor** na tabela `configurations`:

```
key = 'layout'   →   value = 'modelo1'   (estado no banco implantado)
```

Criada pelo seeder `v6/database/seeds/ConfigurationsTableSeeder.php:754-763`:

```php
$config = Configuration::updateOrCreate(['key' => 'layout'],
    [
        'order' => 46,
        'title' => 'Layout',
        'type' => 'text',
        'category_configurations_id' => $category['temas'],
        'status_create' => 1
    ]
);
$config->value ?? $config->update(['value' => 'modelo1']);
```

#### Função global `getActualLayout()`

`v6/app/Helpers/functions.php:1130-1133`:

```php
function getActualLayout(){
    $layout = Configuration::where('key', 'layout')->first();
    return $layout->value;
}
```

Usada em apenas **1 lugar**: `v6/resources/views/components/weather-box.blade.php:111`.

#### Método `getTemplateActived()` (o caminho realmente usado)

`v6/app/Http/Traits/GetInformationsPrefectureTrait.php:92-102`:

```php
public function getTemplateActived()
{
    $templateActived = Configuration::where('key', 'layout')->first()->value;

    if (!View::exists('portal.layouts.' . $templateActived . '.home.index')) {
        DB::table('configurations')->where('key', 'pagina_em_manutencao')->update(['value' => 1]);
        abort(404, 'view_inexistente');
    }

    return $templateActived;
}
```

**Duplicado** em `v6/app/Http/Controllers/Admin/Controller.php:39-47` (código
idêntico).

**Comportamento crítico:** se o layout configurado não tiver
`home/index.blade.php`, o sistema **liga a página de manutenção
automaticamente** e aborta com 404. É um autoproteção contra config inválida,
mas é um **efeito colateral perigoso**: salvar `layout = 'modelo9'` no CMS
derruba o portal inteiro.

**Custo:** `getTemplateActived()` faz **1 query por controller** e é chamado
dentro de `view('portal.layouts.' . $this->getTemplateActived() . …)` — ou
seja, tipicamente 1-2 vezes por requisição. Não há cache. (O
`ModulosServiceProvider` usa `Cache::rememberForever('modulos', …)`, mas o
layout não.)

#### Uso nos controllers

Padrão universal (exemplos reais):

```php
// v6/app/Http/Controllers/Portal/PortalController.php:220
return view('portal.layouts.' . $this->getTemplateActived() . '.home.index', compact(…));

// v6/app/Http/Controllers/Portal/PortalController.php:271
'portal.layouts.' . $this->getTemplateActived() . '.busca.index',

// v6/app/Http/Controllers/Portal/PortalController.php:351
return view('portal.layouts.' . $this->getTemplateActived() . '.generic.view', compact(…));
```

**Nomes de view dinâmicos por concatenação** — 60+ ocorrências no portal
(ver `03-ROTAS-E-CONTROLADORES.md`). Isso impede o analisador estático de
Laravel de descobrir views e quebra o cache de views em deploy.

**Exceção hardcoded** — `v6/app/Http/Controllers/Portal/ContactController.php:140`:

```php
$view = 'portal.layouts.modelo1.informacoes-instituicao.ouvidoria.teste.email_admin';
```

Fixar `modelo1` ignora o tema configurado. Também
`v6/app/Http/Controllers/Portal/SelosController.php:23`:

```php
$viewPath = 'portal.layouts.modelo1.selos.index';
```

E `v6/app/Http/Controllers/Portal/OmbudsmanController.php` etc.

**`default` é legado**: `default` ainda é usado diretamente em 7 pontos
(contato, tutorial, perguntas frequentes, e-SIC, download de anexos), mas
**não** é selecionável como `layout` — a home `default/index` não é referenciada
pelo `getTemplateActived()` no fluxo normal.

---
