Adopt proc-card pattern (fixed min-height, icons, spec labels, 2-line desc) per UX research; move purge forms and rich content to infra-process-modal; document catalog in Spec 033. Co-authored-by: Cursor <cursoragent@cursor.com>
141 lines
5.2 KiB
Markdown
141 lines
5.2 KiB
Markdown
# Spec 033 — Desk Infra Console UI (process cards)
|
||
|
||
**Criado:** 2026-06-19
|
||
**Actualizado:** 2026-06-19 (padronização `proc-card`)
|
||
**Solicitado por:** Roger
|
||
**Prioridade:** P2 (UX operacional)
|
||
**Status:** ✅ Implementado (Desk VM122 frontend)
|
||
**Sistema:** Desk VM122 · menu **Infraestrutura** (`view-infra`)
|
||
**Relacionado:** Spec **028** (OpenPanel API) · Spec **032** (códigos purge) · Spec **002** (Wazuh) · módulo `infra` (015)
|
||
|
||
---
|
||
|
||
## Resumo
|
||
|
||
Página **Infraestrutura** do Desk com **process cards** uniformes (`proc-card`): mesmo tamanho, tipografia, ícone, badge de status e acções no rodapé. Conteúdo rico (métricas, formulários, JSON) abre em **modal largo** (`#infra-process-modal`).
|
||
|
||
**Motivo:** painéis `ws-panel` de alturas variadas quebravam o alinhamento visual; inputs inline (purge) inflavam cards.
|
||
|
||
---
|
||
|
||
## Referência de design (pesquisa)
|
||
|
||
Padrões adoptados de boas práticas de UI card (Material UI equal-height, UX Collective, CSS Grid auto-fill):
|
||
|
||
| Regra | Valor Desk |
|
||
|-------|------------|
|
||
| Grid | `repeat(auto-fill, minmax(220px, 1fr))` · gap **16px** (sistema 8pt) |
|
||
| Altura mínima card | **168px** · `flex-column` + `justify` implícito via footer |
|
||
| Padding card | **16px** |
|
||
| Título | **0.88rem** · weight 600 |
|
||
| Spec label | **0.62rem** uppercase · letter-spacing 0.05em |
|
||
| Descrição | **0.75rem** · **2 linhas** (`line-clamp: 2`) |
|
||
| Ícone | **32×32px** · fundo pastel por accent |
|
||
| Badge status | canto superior direito · classes `badge` existentes |
|
||
| Inputs / tabelas / JSON | **modal** `modal-panel-lg` — nunca no card |
|
||
| Testes (webhook, OpenPanel) | botão rápido no card **ou** no modal · resultado em `#soc-test-modal` |
|
||
|
||
**Alinhamento igual altura:** grid `align-items: stretch` + `min-height` fixo no card (não aspect-ratio — conteúdo operacional, não media).
|
||
|
||
---
|
||
|
||
## Onde na UI
|
||
|
||
| Menu Desk | View ID | Render |
|
||
|-------------|---------|--------|
|
||
| Infraestrutura | `view-infra` | `renderInfra()` em `frontend/assets/app.js` |
|
||
|
||
**Não** cobre Infra 2 / SOC visual (`view-infra2` → `renderInfra2()`).
|
||
|
||
---
|
||
|
||
## Catálogo de process cards (Infra)
|
||
|
||
| ID | Ícone | Título | Spec label | Accent | Status | Acções card |
|
||
|----|-------|--------|------------|--------|--------|-------------|
|
||
| `soc` | 📡 | SOC VM112 | Webhook | teal | `health.status` | Detalhes · Testar |
|
||
| `openpanel` | 🎛️ | OpenPanel API | Spec 028 | orange | online/check | Detalhes · Testar |
|
||
| `purge` | 🔐 | Códigos purge | Spec 032 | rose | N domínios | Gerir códigos → modal |
|
||
| `vm112` | 🌐 | VM112 Onboard | Portal | aqua | online/check | Ver status |
|
||
| `wazuh` | 🛡️ | Wazuh SOC | Spec 002 | slate | online/check | Ver status |
|
||
| `integrations` | 🔗 | Integrações | JSON | violet | activas | Ver JSON |
|
||
|
||
Mapa de ícones: constante `PROC_CARD_ICONS` em `app.js`.
|
||
|
||
---
|
||
|
||
## Modais
|
||
|
||
| Modal | Uso |
|
||
|-------|-----|
|
||
| `#infra-process-modal` | Detalhes, formulário purge, JSON integrações |
|
||
| `#soc-test-modal` | Resultado testes webhook / OpenPanel multidomínio |
|
||
|
||
Funções: `openInfraProcessModal()`, `openInfraProcessDetail(procId)`, `closeInfraProcessModal()`, `bindInfraProcessModal()`.
|
||
|
||
Snapshot API: `state.infraSnapshot` (reutilizado ao abrir detalhe sem re-fetch).
|
||
|
||
---
|
||
|
||
## APIs consumidas
|
||
|
||
| Endpoint | Uso |
|
||
|----------|-----|
|
||
| `GET /api/v1/infra/vm112/status` | Card VM112 + modal |
|
||
| `GET /api/v1/infra/wazuh/status` | Card Wazuh + modal |
|
||
| `GET /api/v1/integrations` | Card + modal JSON |
|
||
| `GET /api/v1/integrations/health` | Card SOC + modal |
|
||
| `GET /api/v1/vm123/health` | Card OpenPanel + modal |
|
||
| `GET /api/v1/infra/purge-auth-domains` | Card purge + modal |
|
||
| `GET/POST /api/v1/infra/purge-auth-codes` | Modal purge (Spec 032) |
|
||
| `POST /api/v1/vm123/openpanel/test-confirm` | Teste OpenPanel |
|
||
|
||
---
|
||
|
||
## CSS (`frontend/assets/styles.css`)
|
||
|
||
Classes **proc-card** (padrão reutilizável em outras páginas):
|
||
|
||
- `.proc-grid`, `.proc-card`, `.proc-card--{teal|orange|rose|slate|violet|aqua}`
|
||
- `.proc-card-head`, `.proc-card-icon`, `.proc-card-spec`, `.proc-card-badge`
|
||
- `.proc-card-title`, `.proc-card-desc`, `.proc-card-foot`
|
||
|
||
Helpers Infra (modais): `.infra-kv`, `.infra-actions`, `.infra-hint`, `.purge-auth-form`
|
||
|
||
Helper JS: `procCardHtml(opts)` — gera HTML uniforme.
|
||
|
||
---
|
||
|
||
## Ficheiros
|
||
|
||
| Ficheiro | Função |
|
||
|----------|--------|
|
||
| `frontend/assets/app.js` | `renderInfra()`, `procCardHtml()`, modais Infra |
|
||
| `frontend/assets/styles.css` | `.proc-card` + Infra |
|
||
| `frontend/index.html` | `#infra-content`, `#infra-process-modal` |
|
||
|
||
---
|
||
|
||
## Critérios de aceitação
|
||
|
||
1. Grid com **6 cards** de **mesma altura mínima** e alinhamento visual.
|
||
2. Cada card: ícone + spec label + título + descrição (2 linhas) + badge + acções.
|
||
3. Purge: formulário e tabela **só no modal** «Gerir códigos».
|
||
4. OpenPanel / SOC: teste rápido no card; detalhes no modal.
|
||
5. Responsivo: 1 coluna em mobile (`max-width: 480px`).
|
||
|
||
---
|
||
|
||
## Extensão futura
|
||
|
||
O sistema `proc-card` pode ser adoptado em **Serviços** (substituir `servicos-tile` gradualmente) e **Dashboard** — manter o mesmo catálogo de accents e ícones.
|
||
|
||
---
|
||
|
||
## Conclusão
|
||
|
||
**Spec 033** = layout e padronização visual da Infra. Funcionalidades:
|
||
|
||
- OpenPanel → **Spec 028**
|
||
- Códigos purge → **Spec 032**
|
||
- Webhook SOC → health integrations / Spec **001**
|