# Spec 034-UI β€” VisΓ£o processo Console (Carbonio + Nextcloud) **Criado:** 2026-06-21 **Solicitado por:** Roger **Status:** πŸ“‹ Draft β€” design aprovado conceptualmente **URL:** `https://console.ligbox.com.br` (shell Spec [035-UX](../035-ligbox-mail-bundles-foss-openpanel/ligbox-console-shell.md)) **ReferΓͺncia layout:** Spec **030** (Mission Board) Β· Spec **035** (bundles, toggle Mail NC) --- ## 1. Objectivo Documentar **como a visΓ£o de processo** da Spec 034 (mail hot + Files warm + provision NC-1β†’NC-5) aparece no **Ligbox Console** β€” sem expor Carbonio, Nextcloud ou OCS ao utilizador. **PrincΓ­pio Roger:** mesma shell Spec 030 (status bar Β· 3 colunas Β· cards Β· contexto), **componentes novos** para quotas duplas e pipeline de provisionamento. --- ## 2. AvaliaΓ§Γ£o Spec 030 como referΓͺncia | Área | Nota | DecisΓ£o | |------|------|---------| | Shell 3 colunas + status bar | 8/10 | βœ… Herdar directo | | Staff ops / health / falhas NC | 8/10 | βœ… Mission Board para incidentes | | Gerente: lista contas | 6/10 | ⚠️ Adaptar cards | | Pipeline NC-1β†’NC-5 | 4/10 | βž• Componente **`ProvisionPipeline`** novo | | Quotas mail + Files | 5/10 | βž• Componente **`QuotaDualBar`** novo | | Forms CRUD (criar conta) | 4/10 | βž• Modal / context panel com forms | **ConclusΓ£o:** Spec 030 = **chassis**; Spec 034-UI = **indicadores e fluxos** do motor hΓ­brido. --- ## 3. VocabulΓ‘rio UI (nunca mostrar motores) | Backend | UI Ligbox Console | |---------|-------------------| | Carbonio VM112 | **Email** Β· quota **caixa** | | Nextcloud VM116 Files | **Files** Β· quota **armazenamento** | | OCS Provisioning API | *(invisΓ­vel)* β€” Β«A criar Files…» | | NC-1…NC-5 | **`ProvisionPipeline`** β€” passos humanos | | Hot / Warm tier | **`StorageTierBadge`** β€” Β«CaixaΒ» / Β«FilesΒ» | | `nextcloud_mail_enabled` | Toggle **Β«Mail no NextcloudΒ»** | | VM116 health | **Β«ArmazenamentoΒ»** ● online / offline | --- ## 4. Processos Spec 034 β†’ ecrΓ£s Console ### 4.1 Mapa processo β†’ rota | Processo Spec 034 | Role | Rota Console | Componente principal | |-------------------|------|--------------|----------------------| | Onboarding conta (Carbonio + NC) | Gerente | `/admin/contas` | `ProvisionPipeline` + modal criar | | Quotas duplas por conta | Gerente | `/admin/contas` | `QuotaDualBar` no card + context | | Toggle Mail Nextcloud domΓ­nio | Gerente | `/admin/files` | `DomainFilesToggle` | | Ver uso domΓ­nio mail + Files | Gerente | `/admin` InΓ­cio | Status bar + cards resumo | | Health VM116 + VM112 | Staff | `/ops` ou `/comercial/dominios` | `StackHealthTile` | | Falha provision OCS | Staff | `/ops` Mission Board | `IncidentCard` (Spec 030) | | Provision manual ops | Staff | `/ops` context | Form + `ProvisionPipeline` | | Purge domΓ­nio (017+034) | Staff | `/ops` runbook | Fora UI 034 β€” link runbook | | Offload anexo grande | Utilizador | webmail Carbonio | Banner Β«Guarde em FilesΒ» β€” **nΓ£o** Console | ### 4.2 Pipeline NC-1 β†’ NC-5 (componente novo) Backend Spec 034 Β§IntegraΓ§Γ£o VM112: ``` NC-1 Criar user Nextcloud (OCS) NC-2 Quota Files conforme plano NC-3 Mail app prΓ©-config (se toggle ON) NC-4 Registar estado domΓ­nio NC-5 Webhook Desk provisioned ``` **UI `ProvisionPipeline`** β€” barra horizontal de passos: ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Criando vendas@empresa.com.br β”‚ β”‚ β”‚ β”‚ ● Email ─── ● Files ─── β—‹ Mail NC ─── β—‹ Finalizar β”‚ β”‚ OK OK (skip) … β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` | Estado | Visual | Mensagem PT-BR | |--------|--------|----------------| | `pending` | β—‹ cinza | Β«Aguardando…» | | `running` | ◐ animado | Β«A criar Files…» | | `ok` | ● verde | Β«ProntoΒ» | | `skipped` | β—‹ tracejado | Β«NΓ£o activoΒ» (NC-3 OFF) | | `error` | ● vermelho | Β«NΓ£o foi possΓ­vel β€” tentar novamenteΒ» | **Regra:** utilizador vΓͺ **uma** barra β€” nunca Β«OCS APIΒ» ou Β«NC-3Β». ### 4.3 Quotas duplas (componente novo) **`QuotaDualBar`** β€” duas barras empilhadas por conta: ``` Email (caixa) β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘ 24 / 30 GB Files β–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘ 60 / 200 GB ``` | Prop | Fonte API | |------|-----------| | Mail usado/mΓ‘x | Wizard `/api/domain-admin/accounts` | | Files usado/mΓ‘x | Desk `/api/v1/nextcloud/domains/{domain}/users` | **`StorageTierBadge`** no card: | Badge | Significado | |-------|-------------| | `Caixa` | Quota Carbonio (hot) | | `Files` | Quota Nextcloud (warm) | | `Arquivo` | Fase 3 S3 β€” futuro | --- ## 5. Wireframes β€” Gerente (`/admin`) Shell Spec 030 adaptada Β· tokens Desk creme ([035-UX Β§5](../035-ligbox-mail-bundles-foss-openpanel/ligbox-console-shell.md)). ### 5.1 InΓ­cio β€” `/admin` ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ STATUS BAR Β· Business Β· 12/25 contas Β· Certif. βœ… Β· Pagamento em dia β”‚ β”‚ Armazenamento Files ● online Β· 2.1 TB usados no domΓ­nio β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ NAV β”‚ RESUMO β”‚ CONTEXTO β”‚ β”‚ InΓ­cio ● β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ PrΓ³xima acΓ§Γ£o: β”‚ β”‚ Contas β”‚ β”‚ Email β”‚ β”‚ Files β”‚ β”‚ Β«13 vagas β€” β”‚ β”‚ Files β”‚ β”‚ 360 GB usadoβ”‚ β”‚ 2.1 TB usadoβ”‚ β”‚ criar contaΒ» β”‚ β”‚ Plano β”‚ β”‚ 12 contas β”‚ β”‚ 12 contas β”‚ β”‚ [+ Nova conta] β”‚ β”‚ … β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` ### 5.2 Contas β€” `/admin/contas` ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ STATUS BAR Β· 12/25 contas Β· Plano Business β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ NAV β”‚ CONTAS (cards β€” Spec 030 board) β”‚ CONTEXTO β”‚ β”‚ Contas ● β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ vendas@ β”‚ β”‚ β”‚ β”‚ vendas@empresa.com.br [Caixa][Files]β”‚ β”‚ QuotaDualBar β”‚ β”‚ β”‚ β”‚ ● activa Β· Email 24/30GB Β· Files 60/200β”‚ β”‚ [Editar quotas] β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ [Reset senha] β”‚ β”‚ β”‚ [+ Nova conta] β†’ modal + ProvisionPipelineβ”‚ [Abrir webmail] β”‚ β”‚ β”‚ β”‚ [Abrir Files] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` **Modal criar conta:** ``` Email: [ vendas ] @empresa.com.br Nome: [ Vendas ] Quota email: [ 30 GB β–Ό ] Quota Files: [ 200 GB β–Ό ] β˜‘ Criar armazenamento Files ( Mail no Nextcloud: controlado em Files β€” toggle domΓ­nio ) [ Cancelar ] [ Criar ] β†’ ProvisionPipeline inline atΓ© concluir ``` ### 5.3 Files β€” `/admin/files` ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ DomainFilesToggle β”‚ β”‚ ☐ Activar Mail no Nextcloud (email dentro do Files) β”‚ β”‚ Webmail mail.{dom} continua sempre disponΓ­vel β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ NAV β”‚ Lista contas (quota Files β€” espelho) β”‚ CONTEXTO β”‚ β”‚ Files ● β”‚ vendas@ Β· 60/200 GB Β· Files βœ… β”‚ editar quota Filesβ”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` Ver Spec 035 Β§2.2.1 β€” default toggle **OFF**. --- ## 6. Wireframes β€” Staff (`/ops`) Mission Board Spec 030 Β· zona escura `agentic-ops.css` para incidentes; tiles health podem usar creme. ### 6.1 Stack health β€” domΓ­nio ou global **`StackHealthTile`** (novo β€” tile ou status bar): ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Stack domΓ­nio empresa.com.br β”‚ β”‚ Email (VM112) ● OK β”‚ β”‚ Files (VM116) ● OK β”‚ β”‚ Último provision hΓ‘ 2 min β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` API: Desk `GET /api/v1/nextcloud/health` + wizard domain status. ### 6.2 Incidentes provision (Mission Board) Cards Spec 030 quando NC falha: ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ [ALTO] Files nΓ£o criado β”‚ β”‚ empresa.com.br Β· vendas@ β”‚ β”‚ Detectado hΓ‘ 6 min Β· 2 tentativas β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ AcΓ§Γ£o: Repetir criaΓ§Γ£o Files β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ [Abrir domΓ­nio] [Retry] [Ack] β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` Context panel: `ProvisionPipeline` com passo em erro + log sanitizado (staff only). --- ## 7. Componentes React (packages Console) | Componente | Spec origem | Fase | |------------|-------------|------| | `AppLayout` | 030 / 035-UX | UI-0 | | `StatusBar` | 030 | UI-0 | | `ContextPanel` | 030 | UI-0 | | `IncidentCard` | 030 | `/ops` | | **`ProvisionPipeline`** | **034** | UI-034-A | | **`QuotaDualBar`** | **034** | UI-034-A | | **`StorageTierBadge`** | **034** | UI-034-A | | **`DomainFilesToggle`** | **034 / 035** | UI-034-B | | **`StackHealthTile`** | **034 / 033** | UI-034-B | | **`AccountCard`** | 030 card + 034 badges | UI-034-A | **Monorepo:** `ligbox-console-ui/packages/domain-admin/` β€” rotas `/admin/*`. --- ## 8. APIs consumidas (034 β†’ UI) | UI | Endpoint | Spec | |----|----------|------| | QuotaDualBar (mail) | Wizard `GET/PUT /api/domain-admin/accounts` | 010 | | QuotaDualBar (Files) | Desk `GET .../nextcloud/domains/{d}/users` | [contract](./contracts/nextcloud-provisioning-api.md) | | ProvisionPipeline | Wizard `POST accounts` + webhook progress | 034 Β§NC | | DomainFilesToggle | Wizard `PATCH .../nextcloud-mail` | 035 Β§2.2.1 | | StackHealthTile | Desk `/api/v1/nextcloud/health` | 034 | | Incident retry | Desk `POST .../nextcloud/domains/{d}/users` | 034 | **Eventos websocket/poll (fase 2):** `onboarding.nextcloud.provisioned` β†’ actualiza pipeline sem reload. --- ## 9. Fases de entrega UI-034 | Fase | Entrega | Depende infra | |------|---------|---------------| | **UI-034-A** | `QuotaDualBar` + `AccountCard` + modal criar + `ProvisionPipeline` mock | Wizard API (parcial OK) | | **UI-034-B** | `DomainFilesToggle` + secΓ§Γ£o `/admin/files` | VM116 + OCS | | **UI-034-C** | `StackHealthTile` staff + incident cards retry | Desk nextcloud routes | | **UI-034-D** | Poll pipeline live + empty/error states | Webhooks NC-5 | **Ordem Roger:** UI-034-A integrada na **UX-A** gerente ([035 tasks](../035-ligbox-mail-bundles-foss-openpanel/tasks.md)) β€” pode mockar Files atΓ© VM116. --- ## 10. CritΓ©rios de aceite UI - [ ] Gerente vΓͺ quota **Email** e **Files** na mesma conta β€” zero menΓ§Γ£o Β«NextcloudΒ» - [ ] Criar conta mostra `ProvisionPipeline` com passos NC humanizados - [ ] Toggle Mail NC domΓ­nio default OFF β€” Spec 035 - [ ] Falha OCS β†’ mensagem PT-BR + retry β€” staff vΓͺ card Mission Board - [ ] Layout 3 colunas Spec 030 em `/admin/contas` e `/admin/files` - [ ] Mobile: tabs Contas | Files | Detalhe (Spec 030 mobile pattern) - [ ] Zero regressΓ£o login `admin@{dom}` β†’ `/admin` --- ## 11. Fora de scope (034-UI) - UI offload anexo no webmail Carbonio (banner link Files β€” fase separada) - Purge UI (Spec 017 runbook) - OIDC senha ΓΊnica (034 fase 2 auth) - React rewrite completo Desk tickets (opcional futuro) --- ## 12. Documentos relacionados | Doc | ConteΓΊdo | |-----|----------| | [spec.md](./spec.md) | Arquitectura 034 | | [035-UX shell](../035-ligbox-mail-bundles-foss-openpanel/ligbox-console-shell.md) | Console unificado | | [035 domain-manager-ui](../035-ligbox-mail-bundles-foss-openpanel/domain-manager-console-ui.md) | SecΓ§Γ΅es `/admin` | | [030-agentic-ops-ui](../030-agentic-ops-ui/spec.md) | Mission Board referΓͺncia | | [nextcloud-provisioning-api.md](./contracts/nextcloud-provisioning-api.md) | Contrato API |