# Perguntas Frequentes — Views e UX

> CMS (AdminLTE) e portal (Bootstrap 4). A mesma listagem está replicada em 7 arquivos
> de portal, com **duas implementações diferentes** do filtro de texto.

---

## 1. CMS — `v6/resources/views/prefecture/contents/perguntas-frequentes/`

| Arquivo | Função | Observações |
|---|---|---|
| `index.blade.php` | Listagem com DataTable `#tabela_perguntas_frequentes` | Colunas: checkbox de lote, ID, Título, Ações; botão "Cadastrar Pergunta" (`cadastrar/perguntas-frequentes`) |
| `create.blade.php` | Formulário de cadastro | `@include('prefecture.contents.perguntas-frequentes.form')` |
| `edit.blade.php` | Formulário de edição | `Form::model($content, ['route' => ['conteudo.update', $content->id], 'method' => 'PUT'])` |
| `form.blade.php` | Campos | `category_contents_id` (hidden), **Título** (`Form::text`), **Resposta** (`Form::textarea`) |
| `show.blade.php` | Tabela simples de perguntas | **Código morto**: nenhuma rota/controller renderiza esta view (o CMS usa `index.blade.php` + DataTable) |

Formulário (real):

```blade
{{-- v6/resources/views/prefecture/contents/perguntas-frequentes/form.blade.php --}}
<div class="form-group {{ $errors->has('title') ? 'has-error' : '' }}">
    <label for="name">Título <strong class="text-red" style="bottom: 8px; font-size: 7px; position: relative;"><i class="fa  fa-asterisk"></i></strong></label>
    <div class="form-group has-feedback ">
        {{ Form::text( 'title', (isset($content)) ? $content->title : old('title'),
        [
            'class' => 'form-control',
            'placeholder' => 'Título'
        ]) }}
    </div>
</div>
<div class="form-group {{ $errors->has('text') ? 'has-error' : '' }}">
    <label for="text">Resposta <strong class="text-red" style="bottom: 8px; font-size: 7px; position: relative;"><i class="fa  fa-asterisk"></i></strong></label>
    <div class="form-group has-feedback ">
        {{ Form::textarea( 'text', (isset($content)) ? $content->text : old('text'),
        [
            'id' => 'text',
            'class' => 'form-control',
            'placeholder' => 'Texto'
        ]) }}
    </div>
</div>
```

## 2. CMS — JavaScript do DataTable

Arquivo: `v6/public/assets/js/custom/contents/perguntas-frequentes/datatable.js`

```js
let collums = [
    {
        data: 'titulo',
        render: function (data) {
            return `<div class='p-10-0'>${data}</div>`;
        }
    },
    {
        data: null,
        name: "actions",
        orderable: false,
        render: function (data) {
            return `<div class='flex justify-center vertical-middle'>`
                + createBTN(data.id, `editar/perguntas-frequentes/${data.id}`, data.edit, data.delete)
                + `</div>`;
        }
    }
];

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

- O DataTable consome `/cms/datatable/perguntas_frequentes`
  (`v6/public/assets/js/custom/utilities/table.js:181-184`).
- A exclusão em lote usa `assets/js/custom/utilities/deleteAll.js`
  (`index.blade.php:53`).
- Botões de exportação Excel/PDF herdados de `runDatatables`
  (`v6/public/assets/js/custom/utilities/table.js:29-33`).

## 3. Portal — arquivos por layout

| Layout | Arquivo | Função |
|---|---|---|
| modelo1..modelo6 | `v6/resources/views/portal/layouts/modelo1/informacoes-instituicao/acesso-rapido/perguntas-frequentes.blade.php` (idem nos demais) | **View em uso** — renderizada pelo `QuickAccessController` |
| newsbit | `v6/resources/views/portal/layouts/newsbit/informacoes-instituicao/acesso-rapido/perguntas-frequentes.blade.php` | Idem |
| modelo1..modelo6 | `v6/resources/views/portal/layouts/modelo1/perguntas-frequentes/show.blade.php` (idem nos demais) | Página do item individual (resultado da busca) |
| default | `v6/resources/views/portal/layouts/default/pages/contents/perguntas-frequentes/index.blade.php` | **Código morto**: o layout `default` não tem `home/index` (o que faz `getTemplateActived()` abortar com 404) e esta view não é referenciada por nenhum controller |

## 4. Portal — a listagem em uso (modelo1)

```blade
{{-- v6/resources/views/portal/layouts/modelo1/informacoes-instituicao/acesso-rapido/perguntas-frequentes.blade.php --}}
<div id="perguntas" class="col-12 mb-5">
    <div class="card text-white bg-color-2 mb-3 d-inline-block p-3 common-questions-card">
        <div class="d-table-cell align-middle px-sm-4 p-2">
            <i class="fas fa-question-circle fa-4x"></i>
        </div>
        <div class="card-body d-table-cell px-sm-4 p-2">
            <h5 class="card-title">Perguntas</h5>
            <h3 class="card-text">Frequentes</h3>
        </div>
        <div class="align-middle  common-questions-search d-sm-none d-none d-md-table-cell px-4">
            <div id="custom-search-input" class="mx-auto mb-1">
                <div class="input-group">
                    <input type="text" name="filter" id="txtBusca" class="form-control input-sm p-1" placeholder="Digite para filtrar:" />
                    <span class="input-group-btn">
                        <button class="btn btn-info btn-sm" type="button">
                            <i class="fas fa-search"></i>
                        </button>
                    </span>
                </div>
            </div>
        </div>
    </div>

    <ul class="list-unstyled text-secondary" id="ulItens" >
        @foreach($contents as $content)
            <li>
                <h5>{{$content->title}}</h5>
                <p>
                    <strong>R.</strong> {!!$content->text!!}
                </p>
                <hr>
            </li>
        @endforeach
    </ul>
</div>
```

Filtro client-side (implementação do modelo1):

```js
$('#txtBusca').bind('keyup', function() {
    var searchString = $(this).val();
    $('#ulItens li').each(function(index, value) {
        currentName = $(value).text();
        if( currentName.toUpperCase().indexOf(searchString.toUpperCase()) > -1 ) {
            $(value).show();
        } else {
            $(value).hide();
        }
    });
});
```

Características:

| Aspecto | Comportamento |
|---|---|
| Filtro | Oculta/mostra `<li>` já renderizados; sem requisição ao servidor |
| Casamento | `indexOf` sobre o texto completo do item (pergunta + resposta), sem acento |
| Variável global | `currentName` é criada **sem `var`** (vaza para o escopo global) |
| Botão de lupa | Não tem handler: apenas o `keyup` do input filtra |
| Resposta | Renderizada como HTML sem escape (`{!! !!}`) — conteúdo do CMS |
| Paginação | Não existe: todas as perguntas são entregues em uma página |

## 5. Segunda implementação do filtro (layout `default`, morta)

```js
// v6/resources/views/portal/layouts/default/pages/contents/perguntas-frequentes/index.blade.php:49-66
$("#txtBusca").keyup(function () {
    var filter = $(this).val(),
        count = 0,
        filtro = $('#ulItens li h5, #ulItens li p');
    filtro.each(function () {
        var parent = $(this).closest('li').next(),
            length = $(this).text().length > 0;
        if (length && $(this).text().search(new RegExp(filter, 'i')) < 0) {
            parent.hide();
        } else {
            parent.removeAttr('style');
            count++;
        }
    });
});
```

Essa versão usa `closest('li').next()` (o `li` seguinte, não o próprio) e `RegExp` com o
texto digitado **sem escape** — um filtro com caractere especial (`(`, `[`) lança erro de
regex no console. É a implementação duplicada que a v7 deve eliminar.

## 6. Página do item individual (resultado da busca)

`v6/resources/views/portal/layouts/modelo1/perguntas-frequentes/show.blade.php` — usada por
`PortalController@searchContentShow`, que resolve a view por
`getViewToBeReturned()` (`12 => 'perguntas-frequentes.show'`).

**Não existem** `default/perguntas-frequentes/show.blade.php` nem
`newsbit/perguntas-frequentes/show.blade.php`: nesses layouts o clique no resultado da
busca falha com "view not found".

## 7. O que o usuário final vê

1. Menu/atalho "Perguntas Frequentes" no bloco **Acesso Rápido** -> `/acesso-rapido/perguntas-frequentes`.
2. Cartão azul com ícone de interrogação e o título "Perguntas Frequentes".
3. Campo "Digite para filtrar:" (funciona apenas com o teclado).
4. Lista de perguntas (título em negrito) com o prefixo "**R.**" e a resposta em HTML.
5. Breadcrumb "Home > Perguntas Frequentes".

## 8. Exportações

Não há exportação específica de FAQ. O CMS exporta a listagem (Excel/PDF) pelos botões
client-side do DataTable; o portal não exporta.
