@oondemand/create-central-oon 0.3.10 → 0.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,9 @@
1
1
  # Padrões Frontend
2
2
 
3
- O frontend da Central deve ser declarativo. Shell, providers, rotas, menu, datagrid, formulários, documentos e esteiras pertencem ao `@oondemand/oon-core-front`.
3
+ O frontend da Central deve ser declarativo. Shell, providers, rotas, menu, datagrid, formulários, documentos, esteiras, modais de detalhe e grids relacionados pertencem ao `@oondemand/oon-core-front`.
4
4
 
5
5
  Para a lista completa de opções do manifesto, use `FRONTEND_MANIFEST_REFERENCE.md`.
6
+ Para UX avançada com abas e itens relacionados, use também `ADVANCED_UX_PATTERNS.md` e `DETAIL_MODAL_AND_RELATED_GRIDS.md`.
6
7
 
7
8
  ## Estrutura esperada
8
9
 
@@ -34,14 +35,79 @@ Use `central.ui.json` como entrada principal para declarar:
34
35
  - agrupamentos;
35
36
  - layout v2;
36
37
  - páginas por blocos;
37
- - renderers por chave.
38
+ - renderers por chave;
39
+ - modais de detalhe;
40
+ - abas;
41
+ - relações;
42
+ - grids relacionados;
43
+ - edição inline;
44
+ - ações por linha.
38
45
 
39
46
  ## Manifesto v1 e v2
40
47
 
41
48
  - Manifesto sem `schemaVersion` mantém compatibilidade v1.
42
- - Manifesto com `schemaVersion: 2` habilita composição por `layout`, `navigation`, `pages` e `blocks`.
49
+ - Manifesto com `schemaVersion: 2` habilita composição por `layout`, `navigation`, `pages`, `blocks`, coleções avançadas e componentes declarativos.
43
50
  - Componentes React não devem ser serializados no JSON; use chaves e registre os componentes no `registry` em TypeScript.
44
51
 
52
+ ## Padrão de tela operacional
53
+
54
+ A tela principal de uma coleção operacional deve ser simples:
55
+
56
+ ```txt
57
+ Título
58
+ Filtros
59
+ Busca
60
+ Botão novo
61
+ Grid principal
62
+ Ações por linha
63
+ ```
64
+
65
+ Ela não deve acumular detalhe de filhos, formulários longos ou fluxos complexos abaixo do grid. Use `detailModal` para concentrar a operação do registro.
66
+
67
+ ## Padrão de detalhe avançado
68
+
69
+ Quando a operação envolve um registro principal e seus relacionamentos, use:
70
+
71
+ ```txt
72
+ CoreDetailModal
73
+ ├── Resumo
74
+ ├── Dados Principais
75
+ ├── RelatedGrid editável
76
+ └── ReadonlyGrid
77
+ ```
78
+
79
+ Exemplos:
80
+
81
+ - Projeto -> Itens -> Pagamentos
82
+ - Pedido -> Produtos -> Entregas
83
+ - Contrato -> Parcelas -> Documentos
84
+ - Cliente -> Atividades -> Histórico
85
+
86
+ ## Formulários agrupados
87
+
88
+ Campos longos devem ser agrupados por sentido de negócio:
89
+
90
+ - Identificação;
91
+ - Evento/Faturamento;
92
+ - Equipe;
93
+ - Regras;
94
+ - Totais;
95
+ - Observações.
96
+
97
+ Prefira `form.groups` em vez de criar uma tela customizada apenas para organizar campos.
98
+
99
+ ## Grids relacionados
100
+
101
+ Quando o usuário precisa operar filhos do registro principal, use `relatedGrid`.
102
+
103
+ Regras:
104
+
105
+ - Relação deve usar `foreignKey` + `parentKey`.
106
+ - Edição inline deve ser usada para ajustes rápidos de muitos itens.
107
+ - Ação por linha deve ser declarada como `rowActions`.
108
+ - A regra de negócio da ação fica no backend da Central.
109
+ - O Core deve executar e atualizar a interface.
110
+
45
111
  ## Regras
46
112
 
47
113
  - Não recrie layout completo se o Core já renderiza.
@@ -50,6 +116,7 @@ Use `central.ui.json` como entrada principal para declarar:
50
116
  - Não hardcode endpoints quando a metadata puder fornecer.
51
117
  - Não crie variações visuais fora do padrão sem necessidade real.
52
118
  - Use overrides pequenos, específicos e documentados.
119
+ - Não crie página React customizada para resolver apenas: filtro, modal, abas, agrupamento de campos, grid relacionado ou ação por linha.
53
120
 
54
121
  ## Overrides
55
122
 
@@ -60,7 +127,8 @@ Overrides são permitidos para:
60
127
  - card customizado;
61
128
  - cabeçalho customizado;
62
129
  - dashboard customizado;
63
- - integração visual pontual.
130
+ - integração visual pontual;
131
+ - aba customizada dentro de `detailModal`.
64
132
 
65
133
  Overrides não devem virar uma reimplementação do Core.
66
134
 
@@ -74,4 +142,10 @@ A Central deve manter o padrão OonCore:
74
142
  - feedback visual;
75
143
  - status por badges;
76
144
  - ações rastreáveis;
77
- - responsividade.
145
+ - responsividade;
146
+ - edição inline quando melhora a produtividade;
147
+ - detalhe em modal quando o registro possui relações operacionais.
148
+
149
+ ## Contrato avançado implementado
150
+
151
+ Para telas mestre-detalhe, declare `detailModal` diretamente na coleção. A aba `form` salva o registro principal, `relatedGrid` busca filhos por `foreignKey=parent[parentKey]` e permite edição inline quando `editable: true` e `editMode: "inline"`, e `readonlyGrid` lista relações sem edição. Use `refresh` nas ações para coordenar recarga de `self`, `parent`, `all` ou abas específicas.
@@ -0,0 +1,150 @@
1
+ # Portal/Cockpit com OonCore
2
+
3
+ Este padrão atende aplicações como **Meus Apps**, Portal do Cliente, Portal de Parceiros, Suporte, Copilotos e outros Cockpits first-party.
4
+
5
+ O objetivo é evitar que um portal precise recriar Shell, Router, AuthProvider, Menu, Guards e SDK HTTP. O portal deve usar o `central.ui.json` + `startFromManifest` e registrar apenas os componentes realmente customizados.
6
+
7
+ ## Perfis arquiteturais
8
+
9
+ O OonCore diferencia três perfis:
10
+
11
+ | Perfil | Uso |
12
+ | --- | --- |
13
+ | `root-central` | Central de Ativações, raiz de confiança. |
14
+ | `member-central` | Central cliente/licenciada, ativada por instância. |
15
+ | `portal-cockpit` | Portal/Cockpit first-party, autenticado por AppClient/BFF. |
16
+
17
+ ## Auth modes
18
+
19
+ | `auth.mode` | Uso |
20
+ | --- | --- |
21
+ | `bearer` | Token local simples, compatível com Centrais existentes. |
22
+ | `cookie` | Sessão futura via cookie HTTP-only. |
23
+ | `external-sso` | Redireciona para login externo. |
24
+ | `central-instance` | Central membro usando instância ativada. |
25
+ | `central-client` | Portal/Cockpit usando AppClient/BFF. |
26
+
27
+ ## Capabilities no manifesto
28
+
29
+ Além de `permissions`, o manifesto pode declarar `capabilities`. Elas são permissões dinâmicas vindas da Central de Ativações e evitam criar campos fixos para cada produto.
30
+
31
+ Exemplos:
32
+
33
+ ```txt
34
+ apps:read
35
+ users:manage
36
+ tickets:read
37
+ tickets:assign
38
+ copilots:read
39
+ copilots:test
40
+ billing:read
41
+ ```
42
+
43
+ O Core trata `permissions` e `capabilities` como requisitos de UI. A segurança real continua no backend.
44
+
45
+ ## Manifesto recomendado
46
+
47
+ ```json
48
+ {
49
+ "schemaVersion": 2,
50
+ "name": "Portal Cliente",
51
+ "slug": "portal-cliente",
52
+ "appKind": "portal-cockpit",
53
+ "auth": {
54
+ "mode": "central-client",
55
+ "tokenParam": "code"
56
+ },
57
+ "layout": {
58
+ "shell": "portal",
59
+ "sidebar": "core",
60
+ "topbar": "none",
61
+ "header": "none",
62
+ "footer": "core"
63
+ },
64
+ "navigation": {
65
+ "mode": "manual",
66
+ "items": [
67
+ { "label": "Meus Apps", "href": "/apps", "capabilities": ["apps:read"], "order": 10 },
68
+ { "label": "Suporte", "href": "/suporte", "capabilities": ["tickets:read"], "order": 20 },
69
+ { "label": "Copilotos", "href": "/copilotos", "capabilities": ["copilots:read"], "order": 30 },
70
+ { "label": "Usuários", "href": "/usuarios", "capabilities": ["users:manage"], "order": 40 }
71
+ ]
72
+ },
73
+ "pages": [
74
+ { "path": "/apps", "label": "Meus Apps", "component": "AppsPortalPage", "capabilities": ["apps:read"] },
75
+ { "path": "/suporte", "label": "Suporte", "component": "SupportPage", "capabilities": ["tickets:read"] },
76
+ { "path": "/copilotos", "label": "Copilotos", "component": "CopilotsPage", "capabilities": ["copilots:read"] },
77
+ { "path": "/usuarios", "label": "Usuários", "component": "UsersPermissionsPage", "capabilities": ["users:manage"] }
78
+ ],
79
+ "collections": [],
80
+ "pipelines": [],
81
+ "documents": []
82
+ }
83
+ ```
84
+
85
+ ## Bootstrap recomendado
86
+
87
+ ```ts
88
+ import { startFromManifest } from "@oondemand/oon-core-front";
89
+ import manifest from "../central.ui.json";
90
+ import { AppsPortalPage } from "./custom/AppsPortalPage";
91
+ import { SupportPage } from "./custom/SupportPage";
92
+ import { CopilotsPage } from "./custom/CopilotsPage";
93
+ import { UsersPermissionsPage } from "./custom/UsersPermissionsPage";
94
+
95
+ startFromManifest(manifest, {
96
+ apiBaseUrl: import.meta.env.VITE_API_URL,
97
+ appKind: "portal-cockpit",
98
+ auth: {
99
+ mode: "central-client"
100
+ },
101
+ customComponents: {
102
+ AppsPortalPage,
103
+ SupportPage,
104
+ CopilotsPage,
105
+ UsersPermissionsPage
106
+ }
107
+ });
108
+ ```
109
+
110
+ ## Contrato esperado do BFF
111
+
112
+ O frontend conversa apenas com o BFF do portal. O BFF fala com a Central de Ativações usando AppClient.
113
+
114
+ Rotas genéricas esperadas no BFF podem espelhar a Central de Ativações:
115
+
116
+ ```http
117
+ GET /api/portal/contexto
118
+ GET /api/portal/apps
119
+ GET /api/portal/apps/:appCode
120
+ GET /api/portal/apps/:appCode/capabilities
121
+ POST /api/portal/apps/:appCode/authorize
122
+ ```
123
+
124
+ O BFF também pode expor rotas de domínio próprias, como:
125
+
126
+ ```http
127
+ GET /api/suporte/tickets
128
+ POST /api/suporte/tickets
129
+ GET /api/copilotos/assistentes
130
+ POST /api/copilotos/assistentes/:id/testar
131
+ ```
132
+
133
+ Essas rotas de domínio validam capability na Central de Ativações antes de executar a ação.
134
+
135
+ ## Regra de segurança
136
+
137
+ O frontend nunca deve receber `clientSecret`, `x-oon-instance-token`, hash de credencial ou segredo completo. Portais devem falar com um BFF próprio, e o BFF fala com a Central de Ativações usando AppClient.
138
+
139
+ ## Quando usar página custom
140
+
141
+ Use página custom apenas quando a tela não for CRUD/esteira/documento declarativo, por exemplo:
142
+
143
+ - cards de apps licenciados;
144
+ - matriz de permissões;
145
+ - cockpit de status;
146
+ - tickets de suporte;
147
+ - gestão de copilotos;
148
+ - onboarding orientado por negócio.
149
+
150
+ Mesmo nesses casos, o Shell, Router, Auth, Menu, Guards e SDK HTTP devem continuar no Core.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oondemand/create-central-oon",
3
- "version": "0.3.10",
3
+ "version": "0.3.12",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/oondemand/oon-platform.git",
@@ -12,6 +12,6 @@
12
12
  "deploy": "oonCore-back deploy"
13
13
  },
14
14
  "dependencies": {
15
- "@oondemand/oon-core-back": "^0.3.10"
15
+ "@oondemand/oon-core-back": "^0.3.12"
16
16
  }
17
17
  }
@@ -10,7 +10,7 @@
10
10
  "sync:metadata": "oonCore-front sync:metadata"
11
11
  },
12
12
  "dependencies": {
13
- "@oondemand/oon-core-front": "^0.3.10",
13
+ "@oondemand/oon-core-front": "^0.3.12",
14
14
  "@chakra-ui/react": "^3.13.0",
15
15
  "@emotion/react": "^11.14.0",
16
16
  "@tanstack/react-query": "^5.65.0",