# Usuários — Views e UX

> O módulo **não tem telas no portal público**. Tudo acontece no CMS
> (AdminLTE 1.22, Bootstrap 3), dentro do layout `admin.layouts.app`.

---

## 1. Layouts e parcials

| View | Caminho | Papel |
|---|---|---|
| Layout do CMS | `v6/resources/views/admin/layouts/app.blade.php` | Container AdminLTE; carrega `assets/js/utilities/table.js`, `assets/js/modulos/sweetalert/sweetalert2.min.js`, `toastr` |
| Layout do menu | `v6/resources/views/vendor/adminlte/page.blade.php` | Menu lateral (AdminLTE) + rodapé com versão e fornecedor ativo |
| Menu de navegação | `v6/app/Providers/MenuServiceProvider.php:336-356` | Submenu "Usuários" (Listar / Editar Meu Usuário / Perfis / Recursos / Permissões) |
| Filtro do menu | `v6/resources/views/vendor/adminlte/page.blade.php:452-500` | Input "Filtrar menus..." que filtra os `<li>` da sidebar |
| Partials de input | `v6/resources/views/components/inputs/*` | `input`, `textarea`, `checkbox` usados nos formulários |

> O portal público (`v6/resources/views/portal/**`, variantes `modelo1`..`modelo6`
> e `default`) **não** é utilizado por este módulo.

---

## 2. Telas do CMS

### 2.1 Lista de usuários

`v6/resources/views/admin/user/index.blade.php` — "Lista de Todos Usuários".

- Botão "Cadastrar usuário" → `route('usuario.create')`.
- Inclui o partial `v6/resources/views/admin/user/list.blade.php`, que
  desenha a tabela e a barra de filtros:
  - Todos → `route('usuario.all')`
  - Ativos → `route('usuario.active')`
  - Inativos → `route('usuario.inactive')`
- Tabela: `#tabela_listar_todos_usuarios`, colunas ID / Nome / E-mail /
  Criado Em / Ações.
- Script: `assets\js\custom\contents\usuarios\listar_todos\datatable.js`
  (**caminho com barras invertidas** — ver `08-GAPS-E-DIVIDAS.md`).

### 2.2 Lista de usuários ativos

`v6/resources/views/admin/user/active.blade.php` — mesma estrutura, id
`#tabela_listar_usuarios`, script
`assets\js\custom\contents\usuarios\listar\datatable.js`.

### 2.3 Lista de usuários inativos

`v6/resources/views/admin/user/inactive.blade.php` — id
`#tabela_listar_usuarios_inativos`, script
`assets\js\custom\contents\usuarios\listar_inativos\datatable.js`.

### 2.4 Formulário de usuário

`v6/resources/views/admin/user/create.blade.php` +
`v6/resources/views/admin/user/form.blade.php` +
`v6/resources/views/admin/user/edit.blade.php`.

| Campo | Componente | Observações |
|---|---|---|
| `name` | `components.inputs.input` | obrigatório |
| `email` | `components.inputs.input` | obrigatório |
| `password` / `password_confirmation` | `components.inputs.input` | só no create; no edit ficam em um **modal** "Mudar a Senha" |
| `selectProfiles[]` | `Form::select` múltiplo | só aparece se `has_access('perfil.create')`; caso contrário os perfis do ator são exibidos como labels desabilitadas |

O `create` abre `Form::open(['url' => '/cms/usuario', 'id' => 'form'])`; o
`edit` usa `Form::model($user, ['route' => ['usuario.update', $user->id],
'method' => 'PUT'])`.

### 2.5 Lista de perfis

`v6/resources/views/admin/role/index.blade.php` — tabela `#tabela_perfis`
(ID / Nome / Ações), carregada por
`assets/js/custom/contents/usuarios/perfis/datatable.js`.

### 2.6 Matriz de permissões (perfil)

`v6/resources/views/admin/role/create.blade.php`, `edit.blade.php` e
`form.blade.php`.

A matriz é um `<table>` com:

- **linhas** = `resources` (módulos do sistema);
- **colunas** = `permissions` (as 9 ações atômicas);
- **célula** = checkbox `permissions[<recurso-slug>.<permissao-slug>]`.

Regras de exibição (em `v6/resources/views/admin/role/form.blade.php:43-44`):

```blade
@if($resource->modulo == null || $resource->modulo->status)
    @if(Sentinel::getUser()->inRole('super-admin') || Sentinel::getUser()->hasAnyAccess(["$resource->slug.index", "$resource->slug.create", ...]))
```

Ou seja: **uma linha só aparece se o módulo estiver ativo** (`modulos.status`)
**e** o ator tiver ao menos uma permissão sobre aquele recurso. O estado
marcado vem de `$role->permissions[$recurso.'.'.$permissao]`.

### 2.7 Lista de permissões e de recursos

`v6/resources/views/admin/permission/index.blade.php` (tabela
`#tabela_permissoes`, script
`assets/js/custom/contents/permissoes/datatable.js`) e
`v6/resources/views/admin/resource/index.blade.php`.

### 2.8 Telas órfãs

`v6/resources/views/admin/user_new/**` contém `index`, `create`, `edit`,
`show`, `roles`, `forms/*` e `profile/edit` — uma reescrita parcial do CRUD
de usuários que **não é referenciada por nenhum controller** (busca por
`admin.user_new` em `v6/` não retorna nenhum resultado). São telas mortas.

---

## 3. JavaScript / Ajax

### 3.1 Listeners da listagem de usuários

`v6/public/assets/js/custom/contents/usuarios/listar/datatable.js`:

```js
+ createActiveButton(data.status, data.id, 'item', data.active, data.inactivate, `/cms/usuario/${data.id}/status`)
+ createBTN(data.id, `/cms/usuario/${data.id}/edit`, data.edit, data.id == 1 ? false : data.delete, `/cms/usuario/${data.id}/inactivate`)
```

- `createActiveButton` chama `POST /cms/usuario/{id}/status` (alternativa
  ativado/inativado);
- `createBTN` monta o botão de edição e o de inativar (DELETE
  `/cms/usuario/{id}/inactivate`);
- o usuário `id == 1` nunca pode ser inativado (proteção hardcoded no JS).

### 3.2 Listeners de perfis

`v6/public/assets/js/custom/contents/usuarios/perfis/datatable.js`:
edição em `perfil/{id}/edit` e exclusão em `perfil/{id}`.

### 3.3 Helper de DataTables

`v6/public/assets/js/custom/utilities/table.js` — função `runDatatables(url,
columns, ordenavel, type_order, callback, deleteAll, customButtons,
order_column)`. O primeiro argumento é o **nome do endpoint** (o prefixo
`/cms/datatable/` é acrescentado internamente) e o `id` da tabela é
`#tabela_<url>`.

`v6/public/assets/js/custom/utilities/deleteAll.js` — deleção em lote
(usada por outros módulos, não por este).

### 3.4 Ausência de polling

Não há polling nem atualização automática neste módulo; o dado é recarregado
pelo próprio DataTables.

---

## 4. Exportações

**Nenhuma.** Não há geração de Excel/PDF/CSV no módulo de usuários. As
listas são consumidas apenas na tela (JSON do Yajra).

---

## 5. O que o operador vê (resumo)

1. Menu lateral → **Usuários** → **Listar**: tabela com Todos/Ativos/Inativos.
2. "Cadastrar usuário": nome, e-mail, senha + confirmação e (se tiver
   `perfil.create`) multi-seletor de perfis.
3. "Editar Meu Usuário": o próprio operador edita nome/e-mail/senha.
4. `/cms/perfil`: lista de perfis; "Cadastrar perfil" abre a matriz de
   permissões (módulo x ação).
5. `/cms/permissao` e `/cms/recurso`: catálogos (só `super-admin`).

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

**Nada.** O módulo não tem representação no portal público. O único efeito
indireto é o rodapé do CMS, que exibe a versão do sistema
(`UpdateLogs`) e o fornecedor ativo (`Supplier`), e o submenu do AdminLTE,
que muda conforme o perfil do operador.

---

## 7. Itens de UX a preservar na v7

- O filtro Todos/Ativos/Inativos na mesma tela.
- A matriz "módulo x ação" com marcação em lote por linha ("Marcar Todos").
- A edição inline da senha do próprio usuário sem sair da edição.
- A distinção visual entre "sem permissão" (mensagem `flash` + redirect) e
  "sem registro" (tabela vazia).
