Skip to content

ADR-801: Admin UI & Portal

Status: Accepted

Contexto

middag-account precisa de duas interfaces: admin UI no wp-admin para equipe interna (backoffice), e portal headless para clientes (self-service). Admin UI deve ser React SPA dentro do WordPress sem conflito de CSS. Portal deve consumir REST API v1 — qualquer frontend serve. Tema legado usava Inertia.js com sucesso (96% alinhado).

Decisão

Admin UI — Inertia.js + React no wp-admin

AspectoDetalhe
FrameworkInertia.js v2 + React 19 + Tailwind v4
BuildVite 6 → IIFE → assets/dist/app.js
CSS Isolation#middag-app { all: initial; } previne vazamento WP
MenuItem único no wp-admin sidebar → páginas Inertia
RoutingInertia router (client-side), não page reloads

Build IIFE

Vite compila React app em formato IIFE — um único app.js carregado via wp_enqueue_script. Sem módulos ES externos, sem conflito com outros plugins.

CSS Isolation

css
#middag-app {
    all: initial;
    /* Tailwind styles dentro deste scope */
}

Previne que CSS do wp-admin vaze para UI middag-account e vice-versa.

Páginas na v5.0

PáginaDomínioFuncionalidade
DashboardCross-domainQuotes pendentes, entitlements expirando, atividade
OrganizationsOrganizationLista + detalhe + edição
CollaboratorsCollaboratorLista + detalhe + convite
EntitlementsEntitlementLista + detalhe + gerenciamento de status
QuotesQuoteLista + detalhe + ações de lifecycle
LicensesLicenseLista + detalhe
OrdersOrderLista + detalhe
InvoicesInvoiceLista + detalhe
Tax InvoicesTaxInvoiceLista + detalhe + PDF
ContractsContractLista + detalhe + PDF
DocumentsDocumentLista + detalhe + download
EnvironmentsEnvironmentLista + detalhe + service requests
ServicesServiceLista + detalhe + service requests
Service RequestsServiceRequestLista + detalhe + criação

Headless-Ready

REST API v1 é a interface canônica. Admin UI consome a mesma API que qualquer portal externo. Se admin UI pode fazer, a API também pode.

Portal NextJS — app.middag.io

AspectoDetalhe
URLapp.middag.io — UM portal para TODOS os clientes
FrameworkNextJS (frontend separado, repo separado)
AuthJWT RS256 via REST API v1
ConteúdoEntitlements, quotes, invoices, licenses, SRs, equipe
Moeda/idiomaSegue Organization (preferred_currency, billing_entity)

Arquitetura de Portal

app.middag.io               → Portal cliente (todos os produtos, todos os clientes)
account.middag.com.br       → Admin UI wp-admin (apenas equipe interna)
account.middag.pro (futuro)  → Portal branded SaaS (mesmo backend API)

Portal por marca é possível — frontend diferente, mesma API.

UI Não É Contrato

Admin UI pode mudar entre versões MINOR. Adotantes NÃO devem depender de classes CSS, estrutura DOM ou IDs de elementos. A API é o contrato — a UI é fluida.

Consequências

Positivas:

  • React SPA dentro do wp-admin — UX moderna sem sair do WordPress
  • CSS isolation previne conflitos com wp-admin e outros plugins
  • Headless-ready — qualquer frontend pode consumir a API
  • Portal branded possível via mesma API (white-label futuro)

Negativas:

  • IIFE bundle único = tamanho grande (mitigado por code splitting futuro)
  • Inertia.js v2 é dependência nicho no ecossistema WP
  • Dois frontends (admin + portal) para manter
  • CSS isolation com all: initial pode causar edge cases

Especificação Técnica

Detalhes de implementação em REF-801-01:

  • InertiaAdapter API (4 métodos, shared props, page object)
  • Hybrid Page System (Contract vs Direct pages, Block Registry)
  • 14 Page Controllers (method convention, ScopeGuardTrait, DI)
  • Vite Build Pipeline (IIFE, config, artifacts)
  • CSS Isolation Strategy (3 camadas, portal container)
  • WordPress Integration (menu, routing, interception, assets)
  • Portal NextJS — 15 módulos e API mapping

Referências

  • REF-801-01 — Admin UI Inertia Spec
  • ADR-102 — Architecture Foundation (Vite, build pipeline)
  • ADR-701 — API & Authentication (REST API consumida por ambos)
  • ../reference/personas.md §2-5 — Quem usa cada interface
  • operations/03-brand-architecture.md §2 — Arquitetura de portal e domínios