@praxisui/table 8.0.0-beta.2 → 8.0.0-beta.20
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.
- package/README.md +81 -8
- package/docs/DSL-Extensions-Guide.md +23 -0
- package/docs/adr/2026-03-dynamic-filter-cross-lib-coupling.md +107 -0
- package/docs/adr/2026-03-filter-drawer-adapter-light-entrypoint.md +105 -0
- package/docs/adr/2026-03-table-editor-idfield-decision.md +85 -0
- package/docs/column-resize-reorder-implementation-plan.md +338 -0
- package/docs/column-resize-reorder-review-prompt.md +34 -0
- package/docs/dynamic-filter-architecture-overview.md +207 -0
- package/docs/dynamic-filter-backend-contract-cheatsheet.md +167 -0
- package/docs/dynamic-filter-editor-settings-guide.md +229 -0
- package/docs/dynamic-filter-host-integration-guide.md +217 -0
- package/docs/dynamic-filter-payload-contract.md +331 -0
- package/docs/dynamic-filter-range-filters-guide.md +289 -0
- package/docs/dynamic-filter-troubleshooting-guide.md +220 -0
- package/docs/dynamic-inline-filter-catalog.md +147 -0
- package/docs/e2e-column-drag-playwright.md +62 -0
- package/docs/expandable-rows-enterprise-big-leagues-plan.md +1080 -0
- package/docs/json-logic-operators-and-helpers.md +57 -0
- package/docs/local-data-mode-precedence.md +12 -0
- package/docs/local-data-pre-implementation-baseline.md +22 -0
- package/docs/local-data-preimplementation-go-no-go.md +39 -0
- package/docs/local-data-support-implementation-plan.md +524 -0
- package/docs/local-data-support-pr-package.md +66 -0
- package/docs/localization-persistence-merge.md +22 -0
- package/docs/performance-hardening-v2-implementation-plan.md +479 -0
- package/docs/playground-scenario-curation-plan.md +482 -0
- package/docs/playground-scenario-second-opinion-prompt.md +121 -0
- package/docs/playground-scenario-second-opinion-review.md +234 -0
- package/docs/release-notes-p1-hardening.md +76 -0
- package/docs/table-authoring-document-completeness-checklist.md +120 -0
- package/docs/table-editor-capability-review-prompt.md +349 -0
- package/docs/visual-rules-editor-transition.md +29 -0
- package/fesm2022/{praxisui-table-table-ai.adapter-DxjDaQqy.mjs → praxisui-table-table-ai.adapter-fS74fZ7o.mjs} +14 -5
- package/fesm2022/praxisui-table.mjs +3650 -324
- package/index.d.ts +120 -51
- package/package.json +15 -9
- package/src/lib/praxis-table.json-api.md +1315 -0
|
@@ -0,0 +1,1315 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "praxis-table JSON API (Canonical)"
|
|
3
|
+
slug: "praxis-table-json-api"
|
|
4
|
+
doc_type: "api-reference"
|
|
5
|
+
component: "praxis-table"
|
|
6
|
+
document_kind: "json-api-canonical"
|
|
7
|
+
reference_mode: "canonical"
|
|
8
|
+
contract_format: "json"
|
|
9
|
+
contract_source: "runtime-and-code"
|
|
10
|
+
description: "Referencia canonica do contrato JSON do praxis-table com cobertura de runtime, precedencia, defaults e compatibilidade."
|
|
11
|
+
category: "components"
|
|
12
|
+
sub_category: "table"
|
|
13
|
+
audience:
|
|
14
|
+
- "frontend"
|
|
15
|
+
- "architect"
|
|
16
|
+
- "platform-team"
|
|
17
|
+
level: "advanced"
|
|
18
|
+
status: "active"
|
|
19
|
+
owner: "praxis-ui"
|
|
20
|
+
source_of_truth:
|
|
21
|
+
- "projects/praxis-table/src/lib/praxis-table.ts"
|
|
22
|
+
- "projects/praxis-table/src/lib/praxis-table.html"
|
|
23
|
+
- "projects/praxis-table/src/lib/praxis-table.scss"
|
|
24
|
+
- "projects/praxis-table/src/lib/praxis-table-toolbar.ts"
|
|
25
|
+
- "projects/praxis-table/src/lib/praxis-table-config-editor.ts"
|
|
26
|
+
- "projects/praxis-table/src/lib/behavior-config-editor/behavior-config-editor.component.ts"
|
|
27
|
+
- "projects/praxis-table/src/lib/header-appearance-editor/header-appearance-editor.component.ts"
|
|
28
|
+
- "projects/praxis-table/src/lib/columns-config-editor/columns-config-editor.component.ts"
|
|
29
|
+
- "projects/praxis-table/src/lib/rules-editor/table-rules-editor.component.ts"
|
|
30
|
+
- "projects/praxis-table/src/lib/toolbar-actions-editor/toolbar-actions-editor.component.ts"
|
|
31
|
+
- "projects/praxis-table/src/lib/filter-settings/filter-settings.component.ts"
|
|
32
|
+
- "projects/praxis-table/src/lib/messages-localization-editor/messages-localization-editor.component.ts"
|
|
33
|
+
- "projects/praxis-table/src/lib/dialogs/confirm-dialog-appearance-editor.component.ts"
|
|
34
|
+
- "projects/praxis-table/src/lib/crud-integration-editor/crud-integration-editor.component.ts"
|
|
35
|
+
- "projects/praxis-core/src/lib/models/table-config-v2.model.ts"
|
|
36
|
+
- "projects/praxis-table/src/lib/utils/action-utils.ts"
|
|
37
|
+
- "projects/praxis-core/src/lib/tokens/global-action.catalog.ts"
|
|
38
|
+
- "projects/praxis-core/src/lib/models/global-action.model.ts"
|
|
39
|
+
- "projects/praxis-core/src/lib/actions/global-action-ui.ts"
|
|
40
|
+
source_of_truth_last_verified: "2026-03-05"
|
|
41
|
+
publish_source_of_truth: false
|
|
42
|
+
last_updated: "2026-03-05"
|
|
43
|
+
toc: true
|
|
44
|
+
sidebar: true
|
|
45
|
+
tags:
|
|
46
|
+
- "json-api"
|
|
47
|
+
- "canonical-contract"
|
|
48
|
+
- "praxis-table"
|
|
49
|
+
api_stability: "canonical"
|
|
50
|
+
schema_verified: true
|
|
51
|
+
runtime_verified: true
|
|
52
|
+
editor_coverage_verified: false
|
|
53
|
+
runtime_scope: "public"
|
|
54
|
+
legacy_paths_present: false
|
|
55
|
+
has_known_mismatches: true
|
|
56
|
+
related_components: []
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
# praxis-table
|
|
60
|
+
|
|
61
|
+
Este documento e a referencia canonica da API JSON de praxis-table.
|
|
62
|
+
|
|
63
|
+
## Summary
|
|
64
|
+
|
|
65
|
+
- Tipo documental: API reference canonica de contrato JSON.
|
|
66
|
+
- Evidencia canonica permanece governada no frontmatter para auditoria interna, sem expor paths na publicacao.
|
|
67
|
+
- Objetivo operacional: consulta rapida, auditavel e deterministica sob pressao.
|
|
68
|
+
- Resumo funcional herdado: Referencia canonica da API JSON do `praxis-table`.
|
|
69
|
+
|
|
70
|
+
## Authoring contract
|
|
71
|
+
|
|
72
|
+
- O contrato primario de autoria do `praxis-table` e `TableAuthoringDocument` (`kind: "praxis.table.editor"`).
|
|
73
|
+
- `TableAuthoringDocument` encapsula `config` + `bindings` e e o formato correto para editor visual, editor JSON, playground e fluxos de IA.
|
|
74
|
+
- `TableConfig` continua sendo a projeção canonica de runtime consumida pela tabela apos normalizacao e apply plan.
|
|
75
|
+
- `meta.schemaId` e `meta.serverHash` devem ser tratados como snapshot persistido de reconciliacao, nao como fonte primaria do runtime.
|
|
76
|
+
- Em contexto de `praxis-crud`, o authoring canonico de `CrudMetadata` pertence a `@praxisui/crud`, mesmo que o ponto visual de entrada continue sendo o icone da tabela.
|
|
77
|
+
- A superficie `crud-integration-editor` da tabela existe apenas para overrides operacionais de runtime e nao deve ser tratada como editor canonico do documento CRUD.
|
|
78
|
+
|
|
79
|
+
## Scope and positioning
|
|
80
|
+
|
|
81
|
+
- Escopo: contrato JSON publico e limites de comportamento observavel.
|
|
82
|
+
- Fora de escopo: tutorial de adocao e walkthrough operacional detalhado.
|
|
83
|
+
- Posicionamento: referencia canonicamente governada para consumidores, arquitetos e mantenedores.
|
|
84
|
+
|
|
85
|
+
## Collection export actions
|
|
86
|
+
|
|
87
|
+
- `config.export.enabled` habilita o pipeline nativo de exportacao da tabela e deve declarar os formatos permitidos em `config.export.formats`.
|
|
88
|
+
- O menu nativo de exportacao dispara `exportAction` e baixa o artefato retornado por `PraxisCollectionExportService`.
|
|
89
|
+
- Acoes em massa podem acionar o mesmo pipeline quando usam uma chave claramente de exportacao, como `bulk-export` ou `export-selected`, ou quando declaram `exportFormat`.
|
|
90
|
+
- Quando `exportFormat` e declarado, o formato precisa estar habilitado em `config.export.formats`; a tabela nao deve substituir silenciosamente por outro formato.
|
|
91
|
+
- Acoes genericas de download, como `download-contract`, permanecem no output `bulkAction` enquanto nao declararem `exportFormat`; isso evita capturar workflows corporativos que nao sejam exportacao tabular.
|
|
92
|
+
- Para exportar apenas a selecao, combine `behavior.selection.enabled`, `config.export.general.scope: "selected"` e uma bulk action visivel apenas quando `selectedCount > 0`.
|
|
93
|
+
- Quando `config.export.general.scope` e `"selected"`, a exportacao sem linhas selecionadas e bloqueada com feedback de usuario em vez de gerar um arquivo vazio.
|
|
94
|
+
|
|
95
|
+
## Rich content convergence
|
|
96
|
+
|
|
97
|
+
- `mapTableRendererToRichContentP0(...)` e a ponte publica e restrita entre a taxonomia atual de cell renderers do `praxis-table` e o vocabulario compartilhado `1.0` de rich content em `@praxisui/core`.
|
|
98
|
+
- O subconjunto promovido nesta fase e intencionalmente pequeno: `icon`, `image`, `badge`, `chip -> badge`, `avatar`, `progress` e `compose`.
|
|
99
|
+
- Renderers interativos como `button`, `toggle`, `menu`, `link`, `html` e `rating`, alem do shell de detail/expansion, continuam table-owned e fora do contrato compartilhado `1.0` ate promocao semantica explicita.
|
|
100
|
+
|
|
101
|
+
## Detail rich surfaces
|
|
102
|
+
- `actionBar` entra na mesma fronteira canônica de detail row para agrupar ações contextuais host-mediated.
|
|
103
|
+
- `actionBar` é host-mediated:
|
|
104
|
+
- o host resolve visibilidade, disabled e dispatch
|
|
105
|
+
- o conteúdo visual de cada botão continua em `PraxisRichContent`
|
|
106
|
+
- `timeline` entra na mesma fronteira canônica de detail row ao lado de `detailList` e `cardGrid`.
|
|
107
|
+
- `timeline` e host-mediated:
|
|
108
|
+
- a colecao vem de `field` ou `items`
|
|
109
|
+
- cada entrada usa `itemSchema` para mapear `title`, `subtitle`, `meta`, `icon` e `badge`
|
|
110
|
+
- o host resolve dados e fallback, mas o rendering cronologico final fica no `PraxisRichContent`
|
|
111
|
+
|
|
112
|
+
- `behavior.expansion.detail.schemaContract.allowedNodes` inclui `detailList` e `cardGrid` como surfaces canônicas de detail row.
|
|
113
|
+
- `list` continua sendo lista simples e nao aceita subtree declarativa por item.
|
|
114
|
+
- `mediaBlock` tambem faz parte da fronteira canonica do detail row, como primitive compartilhada para avatar/imagem, headline, subtitle, meta e trailing leve.
|
|
115
|
+
- `detailList` e host-mediated:
|
|
116
|
+
- a colecao vem de `field` ou `items`
|
|
117
|
+
- cada item usa `itemSchema.nodes` com `RichBlockNode[]`
|
|
118
|
+
- o contexto do item expõe `detailItem` e `detailIndex`, com aliases opcionais via `itemContext`
|
|
119
|
+
- `itemActions` permanecem no host, mas o conteudo visual do botao usa `PraxisRichContent`
|
|
120
|
+
- `cardGrid` tambem e host-mediated:
|
|
121
|
+
- o host resolve o shell do grid
|
|
122
|
+
- cada card e convertido para `RichCardNode` e renderizado por `PraxisRichContent`
|
|
123
|
+
- o conteudo dos cards e limitado a `RichPresenterNode | RichComposeNode`
|
|
124
|
+
- `mediaBlock` e primitive compartilhada:
|
|
125
|
+
- a tabela nao cria renderer proprio; ela delega diretamente para `PraxisRichContent`
|
|
126
|
+
- o shape e voltado a avatar/imagem, headline, subtitle, meta e trailing leve
|
|
127
|
+
- O contrato alvo do primeiro corte de colecao rica e:
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
type DetailListNode = {
|
|
131
|
+
type: 'detailList';
|
|
132
|
+
title?: string;
|
|
133
|
+
field?: string;
|
|
134
|
+
items?: unknown[];
|
|
135
|
+
emptyText?: string;
|
|
136
|
+
itemKeyField?: string;
|
|
137
|
+
itemSchema: {
|
|
138
|
+
layout?: 'stack' | 'row' | 'card-list';
|
|
139
|
+
nodes: RichBlockNode[];
|
|
140
|
+
};
|
|
141
|
+
itemContext?: {
|
|
142
|
+
itemAlias?: string;
|
|
143
|
+
indexAlias?: string;
|
|
144
|
+
};
|
|
145
|
+
itemActions?: Array<{
|
|
146
|
+
actionId: string;
|
|
147
|
+
label: string;
|
|
148
|
+
icon?: string;
|
|
149
|
+
payloadExpr?: string;
|
|
150
|
+
visibleWhen?: JsonLogicExpression | null;
|
|
151
|
+
disabledWhen?: JsonLogicExpression | null;
|
|
152
|
+
}>;
|
|
153
|
+
};
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
- O contrato alvo do segundo corte de cards densos e:
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
type CardGridNode = {
|
|
160
|
+
type: 'cardGrid';
|
|
161
|
+
title?: string;
|
|
162
|
+
subtitle?: string;
|
|
163
|
+
columns?: 1 | 2 | 3 | 4 | 'auto';
|
|
164
|
+
minCardWidth?: number;
|
|
165
|
+
cards: Array<{
|
|
166
|
+
id?: string;
|
|
167
|
+
title?: string;
|
|
168
|
+
subtitle?: string;
|
|
169
|
+
content: Array<RichPresenterNode | RichComposeNode>;
|
|
170
|
+
}>;
|
|
171
|
+
};
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
- O contrato alvo do terceiro corte de topo rico e:
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
type MediaBlockNode = {
|
|
178
|
+
type: 'mediaBlock';
|
|
179
|
+
avatar?: RichAvatarNode;
|
|
180
|
+
title?: RichTextNode;
|
|
181
|
+
subtitle?: RichTextNode;
|
|
182
|
+
meta?: RichComposeNode;
|
|
183
|
+
trailing?: RichBlockNode[];
|
|
184
|
+
};
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
- O contrato alvo do quarto corte cronologico e:
|
|
188
|
+
|
|
189
|
+
```ts
|
|
190
|
+
type TimelineNode = {
|
|
191
|
+
type: 'timeline';
|
|
192
|
+
title?: string;
|
|
193
|
+
field?: string;
|
|
194
|
+
items?: unknown[];
|
|
195
|
+
emptyText?: string;
|
|
196
|
+
itemSchema?: {
|
|
197
|
+
titleField?: string;
|
|
198
|
+
subtitleField?: string;
|
|
199
|
+
metaField?: string;
|
|
200
|
+
iconField?: string;
|
|
201
|
+
badgeField?: string;
|
|
202
|
+
};
|
|
203
|
+
};
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
```ts
|
|
207
|
+
type ActionBarNode = {
|
|
208
|
+
type: 'actionBar';
|
|
209
|
+
title?: string;
|
|
210
|
+
emptyText?: string;
|
|
211
|
+
actions: Array<{
|
|
212
|
+
actionId: string;
|
|
213
|
+
label: string;
|
|
214
|
+
icon?: string;
|
|
215
|
+
payloadExpr?: string;
|
|
216
|
+
visibleWhen?: JsonLogicExpression | null;
|
|
217
|
+
disabledWhen?: JsonLogicExpression | null;
|
|
218
|
+
}>;
|
|
219
|
+
};
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Support legend
|
|
223
|
+
|
|
224
|
+
- Active: suportado e observado no runtime atual.
|
|
225
|
+
- Partial: suporte parcial, com restricoes conhecidas.
|
|
226
|
+
- Declared-only: declarado em tipos/schema sem ligacao runtime confirmada.
|
|
227
|
+
- Schema-only: presente em schema/modelo sem confirmacao de execucao.
|
|
228
|
+
- Deprecated: mantido por compatibilidade legada com migracao prevista.
|
|
229
|
+
|
|
230
|
+
## Contract classification
|
|
231
|
+
|
|
232
|
+
### Canonical runtime paths (public contract)
|
|
233
|
+
|
|
234
|
+
| Path | Type | Required | Default | Status | Notes |
|
|
235
|
+
| --- | --- | --- | --- | --- | --- |
|
|
236
|
+
| `meta` | object | No | `{}` | Active | Metadados de versao/hash/contexto da configuracao. |
|
|
237
|
+
| `columns[]` | array | Yes | `[]` | Active | Definicao estrutural principal da tabela. |
|
|
238
|
+
| `behavior` | object | No | component-defaults | Active | Regras de paginação, sort, filter, selection, expansion, loading. |
|
|
239
|
+
| `appearance` | object | No | component-defaults | Active | Densidade, responsividade, tokens e comportamento visual. |
|
|
240
|
+
| `toolbar` | object | No | component-defaults | Active | Ações globais, busca e controles de topo. |
|
|
241
|
+
| `actions` | object | No | component-defaults | Active | Ações por linha/lote e integrações de comando. |
|
|
242
|
+
| `messages` | object | No | component-defaults | Active | Textos de UX e feedbacks operacionais. |
|
|
243
|
+
| `data` | object | No | component-defaults | Partial | Configuração de integração de dados server/client. |
|
|
244
|
+
| `localization` | object | No | component-defaults | Partial | i18n/localização em campos e mensagens. |
|
|
245
|
+
| `accessibility` | object | No | component-defaults | Partial | A11y semântica e atalhos de interação. |
|
|
246
|
+
| `rowConditionalStyles[]` | array | No | `[]` | Partial | Estilos condicionais por linha. |
|
|
247
|
+
| `_rowStyleRulesState` | any | No | `undefined` | Partial | Estado serializado do editor (round-trip). |
|
|
248
|
+
|
|
249
|
+
### Supported legacy paths
|
|
250
|
+
|
|
251
|
+
Nenhum path legado suportado foi identificado nesta revisão baseada em evidência textual preservada.
|
|
252
|
+
|
|
253
|
+
### Canonical authoring envelope
|
|
254
|
+
|
|
255
|
+
```ts
|
|
256
|
+
type TableAuthoringDocument = {
|
|
257
|
+
kind: 'praxis.table.editor';
|
|
258
|
+
version: 1;
|
|
259
|
+
config: TableConfig;
|
|
260
|
+
bindings?: {
|
|
261
|
+
resourcePath?: string | null;
|
|
262
|
+
horizontalScroll?: 'auto' | 'wrap' | 'none';
|
|
263
|
+
};
|
|
264
|
+
};
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Internal-only paths
|
|
268
|
+
|
|
269
|
+
| Path | Internal consumer | Runtime presence | Public support | Notes |
|
|
270
|
+
| --- | --- | --- | --- | --- |
|
|
271
|
+
| `__forceRemoteMode__` | reconciliacao de modo de dados | Yes | No | Flag interna para forcar modo remoto em cenarios de editor/runtime. |
|
|
272
|
+
|
|
273
|
+
### Experimental paths
|
|
274
|
+
|
|
275
|
+
| Path | Enablement (flag/guard) | Stability | Rollout notes | Notes |
|
|
276
|
+
| --- | --- | --- | --- | --- |
|
|
277
|
+
| `behavior.expansion.detail.source.resourcePath` | `resourceAllowList` + `schemaContract` + renderer contract | Partial | Guard rails ativos; requer evidência de host para produção | Fluxo com fail-closed quando contrato/allowlist falha. |
|
|
278
|
+
| `behavior.expansion.detail.source.hypermedia` | `_links.capabilities` + `schemaContract` + renderer contract | Partial | Usa discovery canônico do backend; fail-closed sem `rel="capabilities"` | Primeiro corte gera detail schema leve a partir do snapshot agregado. |
|
|
279
|
+
|
|
280
|
+
### Hypermedia detail semantics
|
|
281
|
+
|
|
282
|
+
- `behavior.expansion.detail.source.mode = "hypermedia"` começa sempre em `_links.capabilities`.
|
|
283
|
+
- `surfaces`, `actions` e `canonicalOperations` são lidos do `ResourceCapabilitySnapshot` retornado pelo backend.
|
|
284
|
+
- O primeiro corte monta um detail schema leve de resumo contextual; ele não embute execução inline de `surface.open` nem de workflow.
|
|
285
|
+
- O runtime faz prefetch por linha apenas quando `actions.row.enabled=true`. Em cenários com expansion `hypermedia` sem row actions, o discovery contextual é resolvido sob demanda na expansão da linha.
|
|
286
|
+
- `actions.row.discovery.enabled=false` desliga somente o enriquecimento automático de ações por linha. Use este modo para telas corporativas curadas, nas quais o host quer expor apenas `actions.row.actions[]` e evitar overflow/actions descobertas por HATEOAS/capabilities. O default permanece habilitado quando o campo é omitido.
|
|
287
|
+
|
|
288
|
+
## Overview
|
|
289
|
+
|
|
290
|
+
Este arquivo foi adaptado para o padrao canonico atual sem remover conteudo tecnico existente. O conteudo detalhado anterior foi preservado para manter rastreabilidade historica e reduzir perda de contexto.
|
|
291
|
+
|
|
292
|
+
## Public contract surface
|
|
293
|
+
|
|
294
|
+
### Top-level configuration blocks
|
|
295
|
+
|
|
296
|
+
| Block | Purpose | Required | Merge strategy | Notes |
|
|
297
|
+
| --- | --- | --- | --- | --- |
|
|
298
|
+
| `meta` | Identidade/versionamento da configuração | No | shallow-merge | Pode carregar `schemaId` e `serverHash` como snapshot persistido de reconciliação; o runtime usa estado transitório para verificação ativa de schema. |
|
|
299
|
+
| `columns[]` | Estrutura de colunas e renderers | Yes | replace-array | Nucleo funcional do runtime de tabela. |
|
|
300
|
+
| `behavior` | Regras operacionais (sort/filter/paginação/expansion) | No | deep-merge | Defaults internos aplicados por `ensureConfigDefaults()`. |
|
|
301
|
+
| `appearance` | Densidade, responsividade e tema | No | deep-merge | Inclui normalização de `horizontalScroll` e breakpoints. |
|
|
302
|
+
| `toolbar` | Ações e UX de topo | No | deep-merge | Integrado com editor e quick actions. |
|
|
303
|
+
| `actions` | Ações de linha/lote | No | deep-merge | Roteia para eventos `rowAction`, `bulkAction` e flows de delete. |
|
|
304
|
+
| `messages` | Mensagens de feedback/runtime | No | deep-merge | Fallback para mensagens padrão quando ausente. |
|
|
305
|
+
| `data` | Estratégia de integração de dados | No | deep-merge | Convivência de modo remoto e local com `data` input. |
|
|
306
|
+
|
|
307
|
+
### Nested configuration blocks
|
|
308
|
+
|
|
309
|
+
| Path | Type | Required | Default | Constraints | Notes |
|
|
310
|
+
| --- | --- | --- | --- | --- | --- |
|
|
311
|
+
| `behavior.pagination` | object | No | component-defaults | component-defined | Estratégia client/server e tamanho de página. |
|
|
312
|
+
| `behavior.filtering` | object | No | component-defaults | component-defined | Filtros simples/avançados e debounce. |
|
|
313
|
+
| `behavior.selection` | object | No | component-defaults | component-defined | Single/multiple, persistência e UX visual. |
|
|
314
|
+
| `behavior.expansion` | object | No | component-defaults | contract-version-aware | Contrato de detail row e políticas fail-closed/fallback. |
|
|
315
|
+
| `behavior.expansion.interaction.toggleIcon` | object | No | runtime-defaults | icon-name strings | Customiza ícones recolhido/expandido e `ariaLabelCollapsed`/`ariaLabelExpanded` do toggle sem alterar a lógica de expansão; usa o pipeline `[praxisIcon]` do host e preserva fallback legado para `ariaLabel`. |
|
|
316
|
+
| `behavior.expansion.interaction.motion` | object | No | runtime-defaults | preset-driven | Presets controlados (`none`, `subtle-slide`, `accordion`, `fade-scale`) com respeito a `prefers-reduced-motion`; `durationMs` aceita `0` para desabilitar motion temporal. |
|
|
317
|
+
| `appearance.responsive` | object | No | component-defaults | numeric-breakpoint | Breakpoint móvel inválido é normalizado para `768`. |
|
|
318
|
+
| `toolbar.actions[]` | array | No | `[]` | action-contract | Ações de toolbar com roteamento para `toolbarAction`/`bulkAction`. |
|
|
319
|
+
| `actions.row.discovery.enabled` | boolean | No | `true` | row-action-discovery | Controla se row actions podem ser enriquecidas por HATEOAS/capabilities. Configure `false` para manter somente ações declaradas em `actions.row.actions[]`. |
|
|
320
|
+
| `columns[].renderer` | object | No | field-type-driven | renderer-contract | Renderers condicionais, payload expr e ações interativas. |
|
|
321
|
+
|
|
322
|
+
### Toolbar contract
|
|
323
|
+
|
|
324
|
+
- O bloco `toolbar` continua parte do contrato público principal.
|
|
325
|
+
- Use `toolbar.actions[]` para quick actions e `toolbar.search` para busca quando o host não injeta shell própria.
|
|
326
|
+
- Para localizar paths específicos de toolbar, complemente a leitura com o `Appendix: JSON path index`.
|
|
327
|
+
|
|
328
|
+
### Messages contract
|
|
329
|
+
|
|
330
|
+
- O bloco `messages` governa copy operacional, affordances de confirmação, labels de toolbar e feedbacks corporativos.
|
|
331
|
+
- Prefira `messages` para texto/public contract; reserve providers globais para políticas de tenant.
|
|
332
|
+
- Para busca rápida de paths e defaults parciais, complemente a leitura com o `Appendix: JSON path index`.
|
|
333
|
+
|
|
334
|
+
### Input bindings
|
|
335
|
+
|
|
336
|
+
| Binding/Path | Type | Required | Source | Runtime normalization | Notes |
|
|
337
|
+
| --- | --- | --- | --- | --- | --- |
|
|
338
|
+
| `config` | `TableConfig` | Yes (logical) | component-input | `ensureConfigDefaults` + guards | Contrato JSON principal da tabela. |
|
|
339
|
+
| `resourcePath` | `string` | Conditional | component-input | `crudService.configure(resourcePath)` | Fonte remota de dados/schema quando em modo remoto. |
|
|
340
|
+
| `data` | `any[] \| null` | No | component-input | `dataSource.data = data` | Ativa caminho de dados locais. |
|
|
341
|
+
| `tableId` | `string` | Yes | component-input | trim + component key builder | Necessário para persistência/configuração por instância. |
|
|
342
|
+
| `componentInstanceId` | `string \| undefined` | No | component-input | component key scoping | Isola preferências por instância em mesma rota. |
|
|
343
|
+
| `title` | `string` | No | component-input | host-surface passthrough | Título opcional consumido por superfícies auxiliares, quick connect e contextos host. |
|
|
344
|
+
| `subtitle` | `string` | No | component-input | host-surface passthrough | Subtítulo opcional para contexto operacional do host. |
|
|
345
|
+
| `icon` | `string` | No | component-input | host-surface passthrough | Ícone opcional usado em affordances auxiliares do runtime. |
|
|
346
|
+
| `autoDelete` | `boolean` | No | component-input | boolean coercion | Ativa deleção automática quando o host delega esse fluxo ao runtime. |
|
|
347
|
+
| `enableCustomization` | `boolean` | No | component-input | boolean coercion | Controla entrada em editor/configuração; default canônico `false`. |
|
|
348
|
+
| `dense` | `boolean` | No | component-input | boolean coercion | Força modo compacto quando o host precisa sobrepor densidade do contrato. |
|
|
349
|
+
| `notifyIfOutdated` | `'inline' \| 'snackbar' \| 'both' \| 'none'` | No | component-input | enum validation + prefs fallback | Política de aviso de drift de schema; o host escolhe banner inline, snackbar, ambos ou silêncio explícito. |
|
|
350
|
+
| `snoozeMs` | `number` | No | component-input | numeric fallback + prefs fallback | Janela de snooze para avisos de drift; default do input é `86400000` (24h) e políticas globais podem complementar. |
|
|
351
|
+
| `autoOpenSettingsOnOutdated` | `boolean` | No | component-input | schema-prefs resolution | Abre automaticamente o settings panel quando drift de schema é detectado. |
|
|
352
|
+
| `crudContext` | `any` | No | component-input | host-context passthrough | Contexto opcional usado por flows compostos e integrações host/CRUD. |
|
|
353
|
+
|
|
354
|
+
Migration note:
|
|
355
|
+
- `enableCustomization=false` is now the canonical default.
|
|
356
|
+
- Hosts that need runtime authoring/settings must pass `enableCustomization=true` explicitly.
|
|
357
|
+
|
|
358
|
+
### Output events
|
|
359
|
+
|
|
360
|
+
`selectionChange` is an active output for Dynamic Page composition. It emits
|
|
361
|
+
`{ trigger, row?, selectedRows, selectedCount, tableId? }` when the user changes
|
|
362
|
+
row selection through table affordances.
|
|
363
|
+
|
|
364
|
+
| Event | Payload | Trigger | Stability | Notes |
|
|
365
|
+
| --- | --- | --- | --- | --- |
|
|
366
|
+
| `rowClick` | `{ row, index }` | Clique em linha. | Partial | Preservado da documentação anterior. |
|
|
367
|
+
| `rowDoubleClick` | `{ action, row }` | Duplo clique quando habilitado. | Partial | Preservado da documentação anterior. |
|
|
368
|
+
| `rowExpansionChange` | `RowExpansionChangeEvent` | Evento canônico para expand/collapse de detail row no runtime P0A (caminho não virtualizado), com payload discriminado por política de exposição (`allowRawExposure` + `eventExposureDefault`). | Partial | Preservado da documentação anterior. |
|
|
369
|
+
| `rowAction` | `{ action, row, payload?, actionConfig?, localMode?, preventedHttp? }` | Acao de linha (coluna `_actions` ou renderer interativo). `payload` e emitido quando houver `payloadExpr` em renderer interativo. Quando `actionConfig.globalAction` aponta para `navigation.openRoute`, o runtime resolve templates como `${row.id}` antes de executar a navegação interna. Para actions como `surface.open`, `payload.*` continua sendo o envelope canônico do evento entregue ao destino. | Partial | Preservado da documentação anterior. |
|
|
370
|
+
| `toolbarAction` | `{ action, actionConfig? }` | Acao clicada em `toolbar.actions[]` que nao foi roteada para fluxo bulk; `actionConfig` carrega o objeto da acao quando disponivel. | Partial | Preservado da documentação anterior. |
|
|
371
|
+
| `exportAction` | `{ format, request?, result?, error?, tableId? }` | Acao de exportacao acionada pelo menu `export.formats[]`; `request` segue `PraxisCollectionExportRequest`. | Active | Usa o contrato canonico de Collection Export em `@praxisui/core`. |
|
|
372
|
+
| `exportAction` | `{ format, request?, result?, error?, tableId? }` | Acao de exportacao acionada pelo menu `export.formats[]`; `request` segue `PraxisCollectionExportRequest`. | Active | Usa o contrato canonico de Collection Export em `@praxisui/core`. |
|
|
373
|
+
| `bulkAction` | `{ action, rows, actionConfig? }` | Acao em lote; `actionConfig` carrega a configuracao da acao quando disponivel. | Partial | Preservado da documentação anterior. |
|
|
374
|
+
| `columnReorder` | `ColumnReorderEvent` | Reordenação de coluna concluída (drag/keyboard). | Partial | Inclui metadados de origem, destino e operação. |
|
|
375
|
+
| `columnReorderAttempt` | `ColumnReorderAttemptEvent` | Tentativa bloqueada por política de drop-zone. | Partial | Evento diagnóstico para observabilidade e auditoria. |
|
|
376
|
+
| `beforeDelete` | `row` | Antes de delete de linha. | Partial | Preservado da documentação anterior. |
|
|
377
|
+
| `afterDelete` | `row` | Depois de delete com sucesso. | Partial | Preservado da documentação anterior. |
|
|
378
|
+
| `deleteError` | `{ row, error }` | Erro no delete de linha. | Partial | Preservado da documentação anterior. |
|
|
379
|
+
| `beforeBulkDelete` | `rows[]` | Antes de bulk delete. | Partial | Preservado da documentação anterior. |
|
|
380
|
+
| `afterBulkDelete` | `rows[]` | Depois de bulk delete com sucesso. | Partial | Preservado da documentação anterior. |
|
|
381
|
+
| `bulkDeleteError` | `{ rows, error }` | Erro em operação de delete em lote. | Partial | Preservado da documentação anterior. |
|
|
382
|
+
| `schemaStatusChange` | `{ outdated, serverHash?, lastVerifiedAt?, trigger?, tableId? }` | Verificação de versão de schema concluída. | Partial | Usado para notificação de drift entre runtime e servidor. |
|
|
383
|
+
| `metadataChange` | `{ trigger, meta, tableId? }` | Metadados operacionais atualizados pelo runtime/editor. | Partial | Emite contexto de trigger e a carga corrente de `config.meta`. |
|
|
384
|
+
| `loadingStateChange` | `LoadingState` | Mudança de estado (`config/schema/data/render`). | Active | Emitido por `emitLoadingState()`. |
|
|
385
|
+
|
|
386
|
+
### External side channels
|
|
387
|
+
|
|
388
|
+
| Channel | Direction | Contract | Failure mode | Notes |
|
|
389
|
+
| --- | --- | --- | --- | --- |
|
|
390
|
+
| `ASYNC_CONFIG_STORAGE` | bidirectional | `loadConfig/saveConfig/clearConfig` | fail-open | Persistência de config e inputs por `tableId`/instância. |
|
|
391
|
+
| `CONNECTION_STORAGE` | bidirectional | `loadConnection/saveConnection` | fail-open | Persistência de `resourcePath` para quick-connect. |
|
|
392
|
+
| `SettingsPanelService` | bidirectional | `open(...).applied$/saved$` | fail-open | Canal de edição em runtime (quick connect/editor). |
|
|
393
|
+
| `Global resolver: PAX_EXPANSION_DETAIL_RESOURCE_RESOLVER` | outbound call | function contract | fail-closed | Resolução externa de detail schema por `resource`. |
|
|
394
|
+
|
|
395
|
+
### Host/runtime dependencies
|
|
396
|
+
|
|
397
|
+
| Dependency | Required | Environment | Purpose | Notes |
|
|
398
|
+
| --- | --- | --- | --- | --- |
|
|
399
|
+
| `GenericCrudService` | Yes | browser/dev/prod | data + schema I/O | Configura endpoint e executa `filter/getSchema`. |
|
|
400
|
+
| `TableDefaultsProvider` | Yes | browser/dev/prod/ssr | defaults canônicos | Base para merge inicial e fallback de configuração. |
|
|
401
|
+
| `SettingsPanelService` | Yes | browser/dev/prod | edição runtime | Abre editor e quick setup/quick connect. |
|
|
402
|
+
| `ASYNC_CONFIG_STORAGE` | Yes | browser/dev/prod | persistência | Guarda configurações por escopo de componente. |
|
|
403
|
+
| `CONNECTION_STORAGE` | Yes | browser/dev/prod | persistência de conexão | Mantém vínculo `tableId -> resourcePath`. |
|
|
404
|
+
| `LoadingOrchestrator` | Yes | browser/dev/prod/ssr | estado de loading | Coordena bloqueio/feedback por fase. |
|
|
405
|
+
| `PRAXIS_LOADING_RENDERER` | Optional | browser/dev/prod/ssr | render de loading custom | Quando ausente, fluxo segue sem renderizador dedicado. |
|
|
406
|
+
|
|
407
|
+
## Coverage matrix
|
|
408
|
+
|
|
409
|
+
| Surface | Verified | Coverage status | Evidence | Notes |
|
|
410
|
+
| --- | --- | --- | --- | --- |
|
|
411
|
+
| Runtime | true | Active | source_of_truth + conteudo preservado | Revisao estrutural concluida; validacao comportamental fina pode exigir follow-up. |
|
|
412
|
+
| Schema/Types | true | Partial | interfaces/modelos citados | Mapeamento formal de todos os campos ainda pode requerer refinamento. |
|
|
413
|
+
| Editor/Tooling | false | Partial | secoes de editor quando presentes | Cobertura de editor/tooling nem sempre confirmada por evidencia direta. |
|
|
414
|
+
|
|
415
|
+
## Runtime coverage boundaries
|
|
416
|
+
|
|
417
|
+
- Cobertura consolidada com base em documentacao existente e source of truth declarado.
|
|
418
|
+
- Comportamentos fora de evidencia direta foram marcados como not-yet-verified ou Partial.
|
|
419
|
+
- Compatibilidade legada, quando detectada, foi separada em classificacao explicita.
|
|
420
|
+
|
|
421
|
+
## Resolution model
|
|
422
|
+
|
|
423
|
+
### Merge order
|
|
424
|
+
|
|
425
|
+
1. defaults base (`createDefaultTableConfig` + `TableDefaultsProvider`)
|
|
426
|
+
2. contrato recebido em `@Input() config`
|
|
427
|
+
3. hidratação opcional de config persistida (`table-config:*`) e inputs persistidos (`table-inputs:*`)
|
|
428
|
+
4. ajustes de runtime (`ensureConfigDefaults`, guards de recursos não suportados, reconciliação de modo de dados)
|
|
429
|
+
5. alterações vindas de editor/settings panel (`applied$`/`saved$`)
|
|
430
|
+
|
|
431
|
+
### Fallback order
|
|
432
|
+
|
|
433
|
+
`resourcePath` explícito -> conexão persistida (`CONNECTION_STORAGE`) -> `data` local -> tabela sem fetch remoto.
|
|
434
|
+
|
|
435
|
+
### Override points
|
|
436
|
+
|
|
437
|
+
- `@Input() config`, `@Input() resourcePath`, `@Input() data`
|
|
438
|
+
- edição via `SettingsPanelService` (config editor, quick connect, quick setup)
|
|
439
|
+
- persistência de host (`ASYNC_CONFIG_STORAGE` e `CONNECTION_STORAGE`)
|
|
440
|
+
|
|
441
|
+
### Runtime normalization
|
|
442
|
+
|
|
443
|
+
- `ensureConfigDefaults()` preenche blocos ausentes sem sobrescrever intenção explícita do contrato.
|
|
444
|
+
- `parseLegacyOrTableDocument()` absorve payloads legados do editor e converte para o envelope canônico de autoria antes do apply plan.
|
|
445
|
+
- `sanitizeExpansionDetailSchema()` aplica contrato de nós permitidos e política de fallback.
|
|
446
|
+
|
|
447
|
+
### Precedence rules
|
|
448
|
+
|
|
449
|
+
- input explícito de runtime tem precedência sobre persistência local.
|
|
450
|
+
- paths canônicos têm precedência sobre aliases internos remanescentes (`__forceRemoteMode__`).
|
|
451
|
+
- em `behavior.expansion.detail`, contrato inválido aplica fail-closed para detail row.
|
|
452
|
+
- `behavior.expansion.detail.source.mode = "hypermedia"` usa `_links.capabilities` como ponto único de entrada e não executa `surface.open` inline no primeiro corte.
|
|
453
|
+
|
|
454
|
+
Observação adicional:
|
|
455
|
+
- no primeiro corte, `behavior.expansion.detail.source.mode = "hypermedia"` usa `_links.capabilities` como ponto único de entrada, consome `surfaces/actions/canonicalOperations` do snapshot agregado e não executa `surface.open` inline.
|
|
456
|
+
|
|
457
|
+
## Validation and error semantics
|
|
458
|
+
|
|
459
|
+
### Validation model
|
|
460
|
+
|
|
461
|
+
| Path/Rule | Validation phase | Behavior on fail | Error code / warning | Notes |
|
|
462
|
+
| --- | --- | --- | --- | --- |
|
|
463
|
+
| `tableId` para persistência | init/runtime | warn + disable persistence | `praxis-table:missing-table-id` | Tabela segue funcional sem persistir preferências. |
|
|
464
|
+
| `appearance.responsive.breakpoints.mobile` | runtime normalization | fallback para `768` | `praxis-table:responsive-breakpoint-mobile-invalid` | Comportamento fail-open com warning deduplicado. |
|
|
465
|
+
| `behavior.expansion.detail.schemaContract.kind/version` | runtime validation | fail-closed (sem render de detail) | `praxis-table:expansion:detail:schema-contract-kind-version-invalid` | Bloqueia detail schema inválido. |
|
|
466
|
+
| `behavior.expansion.detail.source.resourcePath` allowlist | runtime validation | fail-closed | `praxis-table:expansion:detail:resource-path-not-allowlisted` | Bloqueia path fora de allowlist/URL absoluta. |
|
|
467
|
+
| `behavior.expansion.detail.source.hypermedia` sem `_links.capabilities` | runtime validation | fail-closed | `praxis-table:expansion:detail:hypermedia-links-missing` | Bloqueia detail hypermedia quando o item não expõe affordance canônica. |
|
|
468
|
+
| `detail rendering contract` | runtime validation | fail-closed | `praxis-table:expansion:detail:rendering-invalid` | Exige estratégia/registry consistentes. |
|
|
469
|
+
|
|
470
|
+
### Error semantics
|
|
471
|
+
|
|
472
|
+
Warnings cobrem preferências inválidas e ausência de `tableId` para persistência. Falhas de contratos de detail schema aplicam bloqueio local (detail row) sem derrubar renderização base da tabela.
|
|
473
|
+
|
|
474
|
+
### Fail-open / fail-closed behavior
|
|
475
|
+
|
|
476
|
+
| Condition | Mode | Runtime behavior | Consumer impact |
|
|
477
|
+
| --- | --- | --- | --- |
|
|
478
|
+
| Configuração persistida indisponível | fail-open | ignora storage e usa defaults/inputs | componente continua operacional |
|
|
479
|
+
| `resourcePath` inválido para detail schema | fail-closed (escopo detail) | não expande detail row e registra warning/error | linha segue visível sem detalhe |
|
|
480
|
+
| Contrato `schemaContract` inválido | fail-closed (escopo detail) | bloqueia render de detail | evita execução de contrato não confiável |
|
|
481
|
+
| Campos opcionais desconhecidos no JSON | fail-open | ignorados ou mantidos sem efeito | baixo impacto, requer revisão de contrato |
|
|
482
|
+
|
|
483
|
+
### Invalid or unknown field handling
|
|
484
|
+
|
|
485
|
+
- Campos desconhecidos: comportamento depende da estrategia do componente (ignore, warn ou reject).
|
|
486
|
+
- Campos invalidos: podem gerar fallback, warning ou falha conforme implementacao.
|
|
487
|
+
- Registrar divergencias observadas em Known limitations and mismatches.
|
|
488
|
+
|
|
489
|
+
### Runtime warnings vs hard failures
|
|
490
|
+
|
|
491
|
+
| Condition | Severity | Observability | Consumer action |
|
|
492
|
+
| --- | --- | --- | --- |
|
|
493
|
+
| partial-or-declared-only-coverage | warning | logs/eventos do componente | confirmar ligacao runtime antes de uso critico |
|
|
494
|
+
|
|
495
|
+
## Detailed API
|
|
496
|
+
|
|
497
|
+
### Preserved technical reference (normalized from previous revision)
|
|
498
|
+
|
|
499
|
+
### Summary
|
|
500
|
+
|
|
501
|
+
Referencia canonica da API JSON do `praxis-table`.
|
|
502
|
+
- O componente consome `TableConfig` + inputs externos (`resourcePath`, `data`, `tableId`) e side-channels de integracao.
|
|
503
|
+
- Este documento cobre contrato, cobertura de runtime, precedencia, defaults, eventos e exemplos copiaveis.
|
|
504
|
+
- Fora de escopo: implementacao detalhada do host app, backend e UI de editores alem dos contratos que afetam runtime.
|
|
505
|
+
|
|
506
|
+
### Support legend
|
|
507
|
+
|
|
508
|
+
- **Active**
|
|
509
|
+
- **Partial**
|
|
510
|
+
- **Declared-only**
|
|
511
|
+
- **Schema-only**
|
|
512
|
+
- **Deprecated**
|
|
513
|
+
|
|
514
|
+
### Overview
|
|
515
|
+
`praxis-table` nao e apenas um grid ou uma tabela convencional. Ele funciona
|
|
516
|
+
como um motor de renderizacao dinamico orientado a contrato (`TableConfig`).
|
|
517
|
+
Em vez de criar um template para cada tela de listagem, voce entrega a planta
|
|
518
|
+
(JSON) e o runtime monta a obra em tempo de execucao.
|
|
519
|
+
|
|
520
|
+
Em arquiteturas tradicionais, cada variacao de colunas, acoes e filtros costuma
|
|
521
|
+
virar nova camada de HTML + estado + condicionais. Aqui, a estrategia e inverter
|
|
522
|
+
o custo: a mudanca fica na configuracao. Quando o requisito muda, o contrato muda
|
|
523
|
+
e a interface se adapta sem reescrever o componente.
|
|
524
|
+
|
|
525
|
+
Em linguagem simples: o JSON e a planta; a tabela e a obra. Troque a planta e o
|
|
526
|
+
resultado muda sem retrabalho de template.
|
|
527
|
+
|
|
528
|
+
Conceitos-chave:
|
|
529
|
+
|
|
530
|
+
- UI declarativa / schema-driven: um contrato JSON define estrutura, dados e UX.
|
|
531
|
+
- Self-describing APIs: backend pode publicar OpenAPI + `x-ui` para derivar UI.
|
|
532
|
+
- Separacao de dados e apresentacao: `columns` descreve dado; `appearance` e
|
|
533
|
+
`behavior` definem como apresentar/interagir.
|
|
534
|
+
- Motor de regras condicional: JSON Logic como contrato canonico para estilos, visibilidade e renderizacao sem
|
|
535
|
+
ifs espalhados no template.
|
|
536
|
+
- Pipeline de dados: fluxo remoto/local com estrategias de pagina, ordenacao e filtro.
|
|
537
|
+
|
|
538
|
+
#### Porque este componente e diferente
|
|
539
|
+
`praxis-table` nao e apenas um grid. E um runtime configuravel que interpreta um
|
|
540
|
+
contrato JSON extenso e coordena varias superficies ao mesmo tempo. Em tabelas
|
|
541
|
+
convencionais, cada mudanca de coluna, filtro, acao ou visual pede codigo e
|
|
542
|
+
template; aqui, essas mudancas entram no JSON e o runtime responde na hora:
|
|
543
|
+
|
|
544
|
+
- Configuracao declarativa profunda (TableConfig) que governa UI, dados e regras.
|
|
545
|
+
- Dois modos de dados (remoto/local) com pipelines diferentes e impactos no UX.
|
|
546
|
+
- Editor e runtime convivendo (settings panel, reconciliacao e marcadores).
|
|
547
|
+
- JSON Logic para regras de estilos, renderizacao e comportamento condicional.
|
|
548
|
+
- Persistencia e identidade atraves de `tableId` + `componentInstanceId`.
|
|
549
|
+
|
|
550
|
+
O resultado e um componente "plataforma": cada bloco do contrato vira um modulo
|
|
551
|
+
do runtime, e as interacoes entre esses modulos tornam o comportamento realmente
|
|
552
|
+
disruptivo.
|
|
553
|
+
|
|
554
|
+
#### Pitch de 30 segundos (valor)
|
|
555
|
+
Uma tabela que vira plataforma. `praxis-table` transforma configuracao em
|
|
556
|
+
experiencia: colunas, acoes, filtros, mensagens e regras vivem no mesmo contrato
|
|
557
|
+
JSON, pronto para dados remotos ou locais, sem retrabalho de template.
|
|
558
|
+
|
|
559
|
+
- **Entrega rapida**: ajuste comportamento e visual por JSON.
|
|
560
|
+
- **Padrao de UX**: regras, acoes e mensagens consistentes entre telas.
|
|
561
|
+
- **Escalavel**: JSON Logic e actions permitem crescer a complexidade sem fork do runtime.
|
|
562
|
+
|
|
563
|
+
#### O fim do boilerplate
|
|
564
|
+
Uma tabela que vira plataforma. Em vez de programar features de grade do zero,
|
|
565
|
+
voce ativa capacidades nativas via contrato:
|
|
566
|
+
|
|
567
|
+
- **Zero-code iteration**: adicionar botoes, trocar densidade, ajustar colunas,
|
|
568
|
+
filtros e dialogs apenas alterando JSON.
|
|
569
|
+
- **Logica desacoplada (rules engine)**: destaque de linha, visibilidade de acao
|
|
570
|
+
e variacao de renderer ficam em expressoes condicionais canonicas, nao em `*ngIf` espalhado.
|
|
571
|
+
- **Ecossistema embutido**: paginacao remota, virtual scroll, reorder de colunas,
|
|
572
|
+
exportacao e `praxis-filter` avancado como capacidades prontas.
|
|
573
|
+
- **Eventos estruturados**: `rowAction`, `bulkAction`, `toolbarAction`, `exportAction`,
|
|
574
|
+
`columnReorder` e eventos de delete padronizam a integracao com o host.
|
|
575
|
+
- **Governanca de estado**: `tableId` + `componentInstanceId` organizam
|
|
576
|
+
persistencia, reconciliacao e isolamento de instancia.
|
|
577
|
+
|
|
578
|
+
#### Receitas de impacto para o overview (live-first)
|
|
579
|
+
Para o overview no estilo Angular Material (`demo vivo + view code` na mesma
|
|
580
|
+
card), a melhor estrategia e mostrar poucos cenarios com alta densidade de
|
|
581
|
+
valor. Sugestao de ordem para a primeira dobra:
|
|
582
|
+
|
|
583
|
+
1. **Dashboard financeiro**: prova `computed` + densidade + regra visual.
|
|
584
|
+
2. **Micro-layout compose (CRM)**: prova poder de layout sem componente custom.
|
|
585
|
+
3. **Backoffice seguro**: prova bulk com travas de negocio e confirmacao.
|
|
586
|
+
4. **Rastreador de SLA**: prova de regra temporal em JSON Logic + alerta visual declarativo.
|
|
587
|
+
|
|
588
|
+
Snippets curtos (prontos para cards de overview):
|
|
589
|
+
|
|
590
|
+
**Receita 1 - Dashboard Financeiro**
|
|
591
|
+
```json
|
|
592
|
+
{
|
|
593
|
+
"appearance": { "density": "compact" },
|
|
594
|
+
"columns": [
|
|
595
|
+
{ "field": "asset", "header": "Ativo" },
|
|
596
|
+
{ "field": "costPrice", "header": "Custo", "type": "currency", "format": "BRL|symbol|2" },
|
|
597
|
+
{ "field": "salePrice", "header": "Venda", "type": "currency", "format": "BRL|symbol|2" },
|
|
598
|
+
{
|
|
599
|
+
"field": "margin",
|
|
600
|
+
"header": "Margem",
|
|
601
|
+
"type": "currency",
|
|
602
|
+
"format": "BRL|symbol|2",
|
|
603
|
+
"computed": { "expression": { "-": [{ "var": "salePrice" }, { "var": "costPrice" }] }, "outputType": "number" }
|
|
604
|
+
}
|
|
605
|
+
],
|
|
606
|
+
"rowConditionalStyles": [
|
|
607
|
+
{ "condition": { "<": [{ "var": "computed.margin" }, 0] }, "cssClass": "row--danger" }
|
|
608
|
+
]
|
|
609
|
+
}
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
**Receita 2 - Micro-layout sem scroll (compose)**
|
|
613
|
+
```json
|
|
614
|
+
{
|
|
615
|
+
"columns": [
|
|
616
|
+
{
|
|
617
|
+
"field": "contact",
|
|
618
|
+
"header": "Cliente",
|
|
619
|
+
"renderer": {
|
|
620
|
+
"type": "compose",
|
|
621
|
+
"compose": {
|
|
622
|
+
"layout": { "direction": "row", "gap": 8, "align": "center" },
|
|
623
|
+
"items": [
|
|
624
|
+
{ "type": "avatar", "avatar": { "srcField": "photoUrl", "initialsField": "name" } },
|
|
625
|
+
{ "type": "value", "field": "name" },
|
|
626
|
+
{ "type": "badge", "badge": { "textField": "status", "variant": "soft" } }
|
|
627
|
+
]
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
]
|
|
632
|
+
}
|
|
633
|
+
```
|
|
634
|
+
|
|
635
|
+
**Receita 3 - Backoffice Seguro (acoes em lote)**
|
|
636
|
+
```json
|
|
637
|
+
{
|
|
638
|
+
"actions": {
|
|
639
|
+
"row": {
|
|
640
|
+
"enabled": true,
|
|
641
|
+
"actions": [
|
|
642
|
+
{
|
|
643
|
+
"id": "approve",
|
|
644
|
+
"label": "Aprovar",
|
|
645
|
+
"action": "approve",
|
|
646
|
+
"visibleWhen": { "===": [{ "var": "status" }, "PENDENTE"] }
|
|
647
|
+
}
|
|
648
|
+
]
|
|
649
|
+
},
|
|
650
|
+
"bulk": {
|
|
651
|
+
"enabled": true,
|
|
652
|
+
"position": "toolbar",
|
|
653
|
+
"actions": [
|
|
654
|
+
{
|
|
655
|
+
"id": "delete",
|
|
656
|
+
"label": "Excluir selecionados",
|
|
657
|
+
"action": "delete",
|
|
658
|
+
"minSelections": 1,
|
|
659
|
+
"requiresConfirmation": true
|
|
660
|
+
}
|
|
661
|
+
]
|
|
662
|
+
}
|
|
663
|
+
},
|
|
664
|
+
"messages": {
|
|
665
|
+
"actions": {
|
|
666
|
+
"confirmations": {
|
|
667
|
+
"deleteMultiple": "Tem certeza que deseja excluir os itens selecionados?"
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
### Internal route global action
|
|
675
|
+
|
|
676
|
+
```json
|
|
677
|
+
{
|
|
678
|
+
"actions": {
|
|
679
|
+
"row": {
|
|
680
|
+
"enabled": true,
|
|
681
|
+
"actions": [
|
|
682
|
+
{
|
|
683
|
+
"id": "open-details",
|
|
684
|
+
"label": "Abrir detalhe",
|
|
685
|
+
"icon": "open_in_new",
|
|
686
|
+
"globalAction": {
|
|
687
|
+
"actionId": "navigation.openRoute",
|
|
688
|
+
"payload": {
|
|
689
|
+
"path": "/funcionarios/detalhe",
|
|
690
|
+
"query": { "id": "${row.id}" },
|
|
691
|
+
"state": { "source": "table", "selectedId": "${row.id}" }
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
]
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
**Receita 4 - Rastreador de SLA (tempo + alerta visual)**
|
|
702
|
+
```json
|
|
703
|
+
{
|
|
704
|
+
"columns": [
|
|
705
|
+
{
|
|
706
|
+
"field": "ageDays",
|
|
707
|
+
"header": "Dias em aberto",
|
|
708
|
+
"computed": { "expression": { "daysSince": [{ "var": "createdAt" }] }, "outputType": "number" }
|
|
709
|
+
}
|
|
710
|
+
],
|
|
711
|
+
"rowConditionalStyles": [
|
|
712
|
+
{
|
|
713
|
+
"condition": {
|
|
714
|
+
"and": [
|
|
715
|
+
{ ">": [{ "var": "computed.ageDays" }, 5] },
|
|
716
|
+
{ "!==": [{ "var": "status" }, "RESOLVIDO"] }
|
|
717
|
+
]
|
|
718
|
+
},
|
|
719
|
+
"cssClass": "row--danger text-bold"
|
|
720
|
+
}
|
|
721
|
+
],
|
|
722
|
+
"rowConditionalRenderers": [
|
|
723
|
+
{
|
|
724
|
+
"condition": {
|
|
725
|
+
"and": [
|
|
726
|
+
{ ">": [{ "var": "computed.ageDays" }, 5] },
|
|
727
|
+
{ "!==": [{ "var": "status" }, "RESOLVIDO"] }
|
|
728
|
+
]
|
|
729
|
+
},
|
|
730
|
+
"tooltip": { "text": "SLA violado: acao imediata necessaria", "position": "top" },
|
|
731
|
+
"animation": { "preset": "warning-attention", "repeat": 3 }
|
|
732
|
+
}
|
|
733
|
+
]
|
|
734
|
+
}
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
Para manter o overview leve, publique somente essas 4 receitas na landing da
|
|
738
|
+
doc. Os demais casos (filtros avancados, logs massivos, overrides CRUD, etc.)
|
|
739
|
+
ficam na aba de exemplos completos.
|
|
740
|
+
|
|
741
|
+
#### Dominando a cauda longa das interfaces
|
|
742
|
+
Em sistemas corporativos e aplicacoes complexas, o esforco de engenharia
|
|
743
|
+
raramente esta nos fluxos principais. O custo aparece na cauda longa dos
|
|
744
|
+
requisitos de UI: variacoes de regras condicionais, formatacoes especificas,
|
|
745
|
+
tooltips baseados em estado e permissoes de acao que mudam por linha ou usuario.
|
|
746
|
+
|
|
747
|
+
`praxis-table` foi desenhado para reduzir drasticamente esse custo de
|
|
748
|
+
manutencao. Em vez de espalhar condicionais `*ngIf` no codigo, o componente
|
|
749
|
+
move o poder de decisao para uma API de regras em JSON Logic e renderizadores
|
|
750
|
+
condicionais/compostos. Quem define o contrato ganha controle fino da
|
|
751
|
+
experiencia, com mais autonomia para produto e menos acoplamento no frontend.
|
|
752
|
+
|
|
753
|
+
Impacto pratico:
|
|
754
|
+
|
|
755
|
+
- Menos ramificacao de codigo no front.
|
|
756
|
+
- Mais autonomia para evoluir UX por configuracao.
|
|
757
|
+
- Menor risco de regressao ao escalar regras condicionais.
|
|
758
|
+
|
|
759
|
+
#### Mapa de contrato e superficies
|
|
760
|
+
O contrato governa 6 superficies principais:
|
|
761
|
+
|
|
762
|
+
| Superficie | O que governa no JSON/API | Impacto no runtime |
|
|
763
|
+
| --- | --- | --- |
|
|
764
|
+
| Declarativa (UI e UX) | `columns`, `appearance`, `behavior`, `messages`, `localization` | Define estrutura visual, densidade, textos, ordenacao e comportamento base da tabela. |
|
|
765
|
+
| Dados e operacao | `resourcePath`, `data[]`, `behavior.pagination.*`, `behavior.filtering.*`, `behavior.localDataMode.*` | Resolve modo (`remote/local/empty`), estrategia de pagina/filtro/sort e pipeline de dados. |
|
|
766
|
+
| Regras condicionais | `rules`, `conditionalStyles`, `rowConditionalStyles`, `conditionalRenderers` | Avalia JSON Logic por linha/celula para estilo, visibilidade e renderer dinamico. |
|
|
767
|
+
| Acoes e jornada | `actions`, `toolbar`, `dialogs`, `export` | Materializa acoes de linha/lote/toolbar e fluxos de confirmacao/export. |
|
|
768
|
+
| Integracao externa | `tableId`, `componentInstanceId`, overrides CRUD, marcadores de painel | Conecta persistencia, reconciliacao e extensoes de host sem quebrar o contrato base. |
|
|
769
|
+
| Eventos de saida | `rowAction`, `bulkAction`, `toolbarAction`, `exportAction`, `columnReorder`, `schemaStatusChange` | Entrega intencoes do usuario como eventos padronizados para o app hospedeiro reagir. |
|
|
770
|
+
|
|
771
|
+
A API detalha cada superficie e explicita onde o runtime realmente consome
|
|
772
|
+
(Active/Partial/Declared-only/Schema-only).
|
|
773
|
+
|
|
774
|
+
#### Arquitetura orientada a contrato (como funciona)
|
|
775
|
+
O componente separa estritamente dados, apresentacao e interacao, operando em
|
|
776
|
+
dois eixos principais: motor interno da tabela e integracoes externas.
|
|
777
|
+
|
|
778
|
+
Fluxo simplificado de execucao:
|
|
779
|
+
|
|
780
|
+
1. **Interpretacao do contrato**: le `TableConfig` e resolve o modo de operacao
|
|
781
|
+
(`remote` via API, `local` via array, ou `empty`).
|
|
782
|
+
2. **Montagem da superficie**: renderiza colunas, toolbar, filtros e
|
|
783
|
+
comportamentos visuais definidos em `appearance` e `behavior`.
|
|
784
|
+
3. **Pipeline de dados + motor de regras**:
|
|
785
|
+
- remoto: integra `crudService` + estrategia de pagina/sort/filtro;
|
|
786
|
+
- local: aplica `computeLocalViewPipeline()` + filtros avancados;
|
|
787
|
+
- regras: executa JSON Logic para estilos condicionais, visibilidade de acoes e
|
|
788
|
+
renderizadores dinamicos por linha.
|
|
789
|
+
4. **Ciclo de eventos**: emite acoes estruturadas (`rowAction`, `bulkAction`,
|
|
790
|
+
`toolbarAction`, etc.) para que a aplicacao hospedeira reaja as intencoes do usuario.
|
|
791
|
+
|
|
792
|
+
#### Integracao com ecossistema Praxis (frontend e backend)
|
|
793
|
+
`praxis-table` compoe o ecossistema Praxis de ponta a ponta. O mapa de
|
|
794
|
+
integracao cobre frontend, contratos e backend.
|
|
795
|
+
|
|
796
|
+
Frontend (UI):
|
|
797
|
+
|
|
798
|
+
| Componente | Papel na experiencia | Como se conecta |
|
|
799
|
+
| --- | --- | --- |
|
|
800
|
+
| `praxis-table-toolbar` | Barra superior/inferior com acoes, bulk e export | `toolbar`, `actions`, `export`, `behavior.filtering.*` |
|
|
801
|
+
| `praxis-filter` | Filtro avancado acoplado a toolbar | `behavior.filtering.advancedFilters.*`, `behavior.filtering.debounceTime`, `resourcePath` |
|
|
802
|
+
| `praxis-empty-state-card` | Estado inicial quando nao ha conexao remota | exibido quando nao ha `resourcePath` valido |
|
|
803
|
+
| `praxis-ai-assistant` | Assistente opcional nos slots de toolbar | habilitado pelo runtime (nao exposto no JSON) |
|
|
804
|
+
| Angular Material + CDK | Base de tabela, menus, selecao e virtual scroll | `behavior.pagination.*`, `behavior.selection.*`, `behavior.virtualization.*`, `appearance.spacing.*` |
|
|
805
|
+
|
|
806
|
+
Backend e contratos:
|
|
807
|
+
|
|
808
|
+
| Componente | Papel na experiencia | Como se conecta |
|
|
809
|
+
| --- | --- | --- |
|
|
810
|
+
| `praxis-metadata-starter` | Publica OpenAPI + `x-ui` e o endpoint `GET /schemas/filtered` | A tabela deriva colunas, filtros e validacoes a partir do contrato |
|
|
811
|
+
| `praxis-api-quickstart` | Exemplo pronto com recursos, filtros e CRUD padronizados | Demonstra o fluxo completo com `resourcePath` apontando para a API |
|
|
812
|
+
|
|
813
|
+
No modo de edicao (quando `enableCustomization` esta ativo), a tabela exibe o painel
|
|
814
|
+
de configuracao para ajustar colunas, behavior, appearance e regras sem editar
|
|
815
|
+
codigo. Esse painel usa editores internos (`praxis-table-config-editor`,
|
|
816
|
+
`behavior-config-editor`, `columns-config-editor`, `toolbar-actions-editor`,
|
|
817
|
+
`messages-localization-editor`, etc.) para compor o JSON com consistencia e evitar
|
|
818
|
+
divergencia entre UI e contrato.
|
|
819
|
+
|
|
820
|
+
#### Checklist de integracao (pre-flight)
|
|
821
|
+
Antes de plugar a tabela em um host, valide estes pontos:
|
|
822
|
+
|
|
823
|
+
- `tableId` esta definido e estavel (persiste e evita colisao de storage).
|
|
824
|
+
- Modo de dados decidido: `resourcePath` (remoto) ou `data[]` + flag local.
|
|
825
|
+
- `columns[]` descreve o dataset real e define renderers coerentes.
|
|
826
|
+
- Acoes e toolbar estao alinhadas com o roteamento `bulkAction` vs `toolbarAction`.
|
|
827
|
+
- Regras condicionais: JSON Logic é o contrato canônico.
|
|
828
|
+
- UX e mensagens: configure `appearance`, `messages` e `localization` para evitar
|
|
829
|
+
inconsistencias entre defaults e o comportamento esperado.
|
|
830
|
+
|
|
831
|
+
### Top-level contract
|
|
832
|
+
|
|
833
|
+
O contrato principal e `TableConfig` (alias de `TableConfigV2`) com extensoes de runtime aceitas no JSON:
|
|
834
|
+
- Base tipada: `meta`, `columns`, `behavior`, `appearance`, `toolbar`, `actions`, `export`, `messages`, `localization`.
|
|
835
|
+
- Extensoes fora do tipo estrito: `dialogs.confirm.delete`, `rowConditionalRenderers[]`, aliases legados de `behavior.virtualScroll.*` e chaves legadas de header em `actions.row.*`.
|
|
836
|
+
- Artefatos auxiliares fora do `TableConfig`: `crud-overrides:<componentKeyId>` e o envelope autorado `TableAuthoringDocument`, que carrega `bindings.resourcePath` e `bindings.horizontalScroll`. A chave operacional da linha pertence ao `TableConfig` em `config.meta.idField`.
|
|
837
|
+
|
|
838
|
+
### Coverage matrix
|
|
839
|
+
|
|
840
|
+
Resumo de cobertura por bloco:
|
|
841
|
+
|
|
842
|
+
| Bloco | Leitura executiva | Referencia detalhada |
|
|
843
|
+
| --- | --- | --- |
|
|
844
|
+
| `TableConfig + extensoes` | Contrato canônico consumido pelo runtime | `### JSON coverage matrix (TableConfig + extras)` |
|
|
845
|
+
| Inputs/outputs do componente | API pública para host Angular | `### Component inputs` e `### Component outputs` |
|
|
846
|
+
| Caminhos JSON completos | Índice detalhado para escrita manual e validação | `## JSON path index` |
|
|
847
|
+
|
|
848
|
+
### Preserved source snapshot
|
|
849
|
+
|
|
850
|
+
| Source | Kind | Notes |
|
|
851
|
+
| --- | --- | --- |
|
|
852
|
+
| `projects/praxis-table/src/lib/praxis-table.ts` | local-file | referencia preservada da versao anterior |
|
|
853
|
+
| `projects/praxis-table/src/lib/praxis-table.html` | local-file | referencia preservada da versao anterior |
|
|
854
|
+
| `projects/praxis-table/src/lib/praxis-table.scss` | local-file | referencia preservada da versao anterior |
|
|
855
|
+
| `projects/praxis-table/src/lib/praxis-table-toolbar.ts` | local-file | referencia preservada da versao anterior |
|
|
856
|
+
| `projects/praxis-table/src/lib/praxis-table-config-editor.ts` | local-file | referencia preservada da versao anterior |
|
|
857
|
+
| `projects/praxis-table/src/lib/behavior-config-editor/behavior-config-editor.component.ts` | local-file | referencia preservada da versao anterior |
|
|
858
|
+
| `projects/praxis-table/src/lib/header-appearance-editor/header-appearance-editor.component.ts` | local-file | referencia preservada da versao anterior |
|
|
859
|
+
| `projects/praxis-table/src/lib/columns-config-editor/columns-config-editor.component.ts` | local-file | referencia preservada da versao anterior |
|
|
860
|
+
| `projects/praxis-table/src/lib/rules-editor/table-rules-editor.component.ts` | local-file | referencia preservada da versao anterior |
|
|
861
|
+
| `projects/praxis-table/src/lib/toolbar-actions-editor/toolbar-actions-editor.component.ts` | local-file | referencia preservada da versao anterior |
|
|
862
|
+
| `projects/praxis-table/src/lib/filter-settings/filter-settings.component.ts` | local-file | referencia preservada da versao anterior |
|
|
863
|
+
| `projects/praxis-table/src/lib/messages-localization-editor/messages-localization-editor.component.ts` | local-file | referencia preservada da versao anterior |
|
|
864
|
+
| `projects/praxis-table/src/lib/dialogs/confirm-dialog-appearance-editor.component.ts` | local-file | referencia preservada da versao anterior |
|
|
865
|
+
|
|
866
|
+
## Events
|
|
867
|
+
|
|
868
|
+
`selectionChange` is an active output for Dynamic Page composition. It emits
|
|
869
|
+
`{ trigger, row?, selectedRows, selectedCount, tableId? }` when the user changes
|
|
870
|
+
row selection through table affordances.
|
|
871
|
+
|
|
872
|
+
| Event | Payload | Trigger | Stability | Notes |
|
|
873
|
+
| --- | --- | --- | --- | --- |
|
|
874
|
+
| `rowClick` | `{ row, index }` | Clique em linha. | Partial | Preservado da documentação anterior. |
|
|
875
|
+
| `rowDoubleClick` | `{ action, row }` | Duplo clique quando habilitado. | Partial | Preservado da documentação anterior. |
|
|
876
|
+
| `rowExpansionChange` | `RowExpansionChangeEvent` | Evento canônico para expand/collapse de detail row no runtime P0A (caminho não virtualizado), com payload discriminado por política de exposição (`allowRawExposure` + `eventExposureDefault`). | Partial | Preservado da documentação anterior. |
|
|
877
|
+
| `rowAction` | `{ action, row, payload?, actionConfig?, localMode?, preventedHttp? }` | Acao de linha (coluna `_actions` ou renderer interativo). `payload` e emitido quando houver `payloadExpr` em renderer interativo. | Partial | Preservado da documentação anterior. |
|
|
878
|
+
| `toolbarAction` | `{ action, actionConfig? }` | Acao clicada em `toolbar.actions[]` que nao foi roteada para fluxo bulk; `actionConfig` carrega o objeto da acao quando disponivel. | Partial | Preservado da documentação anterior. |
|
|
879
|
+
| `bulkAction` | `{ action, rows, actionConfig? }` | Acao em lote; `actionConfig` carrega a configuracao da acao quando disponivel. | Partial | Preservado da documentação anterior. |
|
|
880
|
+
| `columnReorder` | `{ action, trigger: 'drag' \ | 'keyboard' \ | Partial | Preservado da documentação anterior. |
|
|
881
|
+
| `columnReorderAttempt` | `{ action: 'columnReorderAttempt', trigger: 'drag' \ | 'keyboard', operationId, tableId, sourceField, targetField, previousIndex, currentIndex, sourceZone, targetZone, result: 'blocked', reasonCode: 'drop-zone-policy-blocked', configuredColumnDropZones[] }` | Partial | Preservado da documentação anterior. |
|
|
882
|
+
| `beforeDelete` | `row` | Antes de delete de linha. | Partial | Preservado da documentação anterior. |
|
|
883
|
+
| `afterDelete` | `row` | Depois de delete com sucesso. | Partial | Preservado da documentação anterior. |
|
|
884
|
+
| `deleteError` | `{ row, error }` | Erro no delete de linha. | Partial | Preservado da documentação anterior. |
|
|
885
|
+
| `beforeBulkDelete` | `rows[]` | Antes de bulk delete. | Partial | Preservado da documentação anterior. |
|
|
886
|
+
|
|
887
|
+
## Styling API
|
|
888
|
+
|
|
889
|
+
#### CSS vars principais
|
|
890
|
+
| CSS var | Efeito |
|
|
891
|
+
| --- | --- |
|
|
892
|
+
| `--p-table-header-bg` | fundo do header |
|
|
893
|
+
| `--p-table-header-fg` | cor de texto/icone do header |
|
|
894
|
+
| `--p-table-border-color` | cor de borda da tabela |
|
|
895
|
+
| `--p-table-row-even-bg` | zebra row |
|
|
896
|
+
| `--p-table-row-hover-bg` | hover row |
|
|
897
|
+
| `--p-table-row-selected-bg` | row selecionada |
|
|
898
|
+
| `--p-header-padding` | padding do header |
|
|
899
|
+
| `--p-header-font-size` | fonte do header |
|
|
900
|
+
| `--p-header-font-weight` | peso do header |
|
|
901
|
+
| `--p-header-letter-spacing` | tracking do header |
|
|
902
|
+
| `--p-header-text-transform` | caixa do texto do header |
|
|
903
|
+
| `--p-table-drag-handle-size` | tamanho do handle de drag (preset padrao do runtime) |
|
|
904
|
+
| `--p-table-drag-handle-color` | cor do handle de drag |
|
|
905
|
+
| `--p-table-drag-handle-base-opacity` | opacidade base do handle em repouso |
|
|
906
|
+
| `--p-table-drag-handle-idle-bg` | fundo base do handle em repouso |
|
|
907
|
+
| `--p-table-drag-handle-idle-border` | borda base do handle em repouso |
|
|
908
|
+
| `--p-table-drag-handle-hover-bg` | fundo do handle em hover/focus |
|
|
909
|
+
| `--p-table-drag-handle-hover-border` | borda do handle em hover/focus |
|
|
910
|
+
| `--p-table-drag-handle-active-bg` | fundo do handle em estado ativo |
|
|
911
|
+
| `--p-table-drag-handle-active-border` | borda do handle em estado ativo |
|
|
912
|
+
| `--p-table-drag-handle-focus-ring` | cor do anel de foco do handle |
|
|
913
|
+
| `--p-table-drag-handle-transition-duration` | duracao das transicoes do handle |
|
|
914
|
+
| `--p-table-reorder-transition-duration` | duracao da animacao de reorder das colunas |
|
|
915
|
+
| `--p-table-drag-preview-scale` | escala visual do preview durante drag |
|
|
916
|
+
| `--p-table-drag-preview-shadow` | sombra do preview durante drag |
|
|
917
|
+
| `--p-table-drag-status-enter-duration` | duracao da entrada da mensagem visual de reorder |
|
|
918
|
+
| `--p-actions-btn-size` | tamanho de botoes de acao |
|
|
919
|
+
| `--p-actions-icon-size` | tamanho de icones de acao |
|
|
920
|
+
| `--p-table-state-success-*` | tokens de estado success |
|
|
921
|
+
| `--p-table-state-warning-*` | tokens de estado warning |
|
|
922
|
+
| `--p-table-state-danger-*` | tokens de estado danger |
|
|
923
|
+
| `--p-table-state-highlight-*` | tokens de estado highlight |
|
|
924
|
+
|
|
925
|
+
#### Host classes
|
|
926
|
+
| Classe no host | Efeito |
|
|
927
|
+
| --- | --- |
|
|
928
|
+
| `density-compact` | densidade compacta |
|
|
929
|
+
| `density-comfortable` | densidade padrao |
|
|
930
|
+
| `density-spacious` | densidade espacada |
|
|
931
|
+
| `row-borders` | bordas horizontais entre linhas |
|
|
932
|
+
| `col-borders` | bordas verticais entre colunas |
|
|
933
|
+
| `pfx-column-drag-enabled` | habilita layout base de DnD de colunas |
|
|
934
|
+
| `pfx-column-drag-indicator` | habilita indicador visual de drag |
|
|
935
|
+
|
|
936
|
+
#### DnD classes (globais)
|
|
937
|
+
| Classe CSS | Escopo | Efeito |
|
|
938
|
+
| --- | --- | --- |
|
|
939
|
+
| `pfx-column-drag-preview` | preview gerado pelo CDK (inserido globalmente) | card visual do header durante drag (gradiente, borda, sombra e escala leve) |
|
|
940
|
+
|
|
941
|
+
#### Horizontal scroll classes
|
|
942
|
+
A superficie usa `horizontalScroll` com classes:
|
|
943
|
+
|
|
944
|
+
- `scroll-auto`
|
|
945
|
+
- `scroll-wrap`
|
|
946
|
+
- `scroll-none`
|
|
947
|
+
|
|
948
|
+
#### Row/cell conditional styling
|
|
949
|
+
- `rowConditionalStyles` aplica classes/estilo por linha.
|
|
950
|
+
- `columns[].conditionalStyles` aplica por celula.
|
|
951
|
+
- Presets uteis no SCSS: `row--success`, `row--warning`, `row--danger`, `row--highlight`, `row--muted`.
|
|
952
|
+
|
|
953
|
+
### Examples
|
|
954
|
+
|
|
955
|
+
### Minimal valid
|
|
956
|
+
|
|
957
|
+
```json
|
|
958
|
+
{
|
|
959
|
+
"appearance": { "density": "compact" },
|
|
960
|
+
"columns": [
|
|
961
|
+
{ "field": "asset", "header": "Ativo" },
|
|
962
|
+
{ "field": "costPrice", "header": "Custo", "type": "currency", "format": "BRL|symbol|2" },
|
|
963
|
+
{ "field": "salePrice", "header": "Venda", "type": "currency", "format": "BRL|symbol|2" },
|
|
964
|
+
{
|
|
965
|
+
"field": "margin",
|
|
966
|
+
"header": "Margem",
|
|
967
|
+
"type": "currency",
|
|
968
|
+
"format": "BRL|symbol|2",
|
|
969
|
+
"computed": { "expression": { "-": [{ "var": "salePrice" }, { "var": "costPrice" }] }, "outputType": "number" }
|
|
970
|
+
}
|
|
971
|
+
],
|
|
972
|
+
"rowConditionalStyles": [
|
|
973
|
+
{ "condition": { "<": [{ "var": "computed.margin" }, 0] }, "cssClass": "row--danger" }
|
|
974
|
+
]
|
|
975
|
+
}
|
|
976
|
+
```
|
|
977
|
+
|
|
978
|
+
### Typical/common
|
|
979
|
+
|
|
980
|
+
```json
|
|
981
|
+
{
|
|
982
|
+
"columns": [
|
|
983
|
+
{
|
|
984
|
+
"field": "contact",
|
|
985
|
+
"header": "Cliente",
|
|
986
|
+
"renderer": {
|
|
987
|
+
"type": "compose",
|
|
988
|
+
"compose": {
|
|
989
|
+
"layout": { "direction": "row", "gap": 8, "align": "center" },
|
|
990
|
+
"items": [
|
|
991
|
+
{ "type": "avatar", "avatar": { "srcField": "photoUrl", "initialsField": "name" } },
|
|
992
|
+
{ "type": "value", "field": "name" },
|
|
993
|
+
{ "type": "badge", "badge": { "textField": "status", "variant": "soft" } }
|
|
994
|
+
]
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
]
|
|
999
|
+
}
|
|
1000
|
+
```
|
|
1001
|
+
|
|
1002
|
+
### Advanced
|
|
1003
|
+
|
|
1004
|
+
```json
|
|
1005
|
+
{
|
|
1006
|
+
"actions": {
|
|
1007
|
+
"row": {
|
|
1008
|
+
"enabled": true,
|
|
1009
|
+
"actions": [
|
|
1010
|
+
{
|
|
1011
|
+
"id": "approve",
|
|
1012
|
+
"label": "Aprovar",
|
|
1013
|
+
"action": "approve",
|
|
1014
|
+
"visibleWhen": { "===": [{ "var": "status" }, "PENDENTE"] }
|
|
1015
|
+
}
|
|
1016
|
+
]
|
|
1017
|
+
},
|
|
1018
|
+
"bulk": {
|
|
1019
|
+
"enabled": true,
|
|
1020
|
+
"position": "toolbar",
|
|
1021
|
+
"actions": [
|
|
1022
|
+
{
|
|
1023
|
+
"id": "delete",
|
|
1024
|
+
"label": "Excluir selecionados",
|
|
1025
|
+
"action": "delete",
|
|
1026
|
+
"minSelections": 1,
|
|
1027
|
+
"requiresConfirmation": true
|
|
1028
|
+
}
|
|
1029
|
+
]
|
|
1030
|
+
}
|
|
1031
|
+
},
|
|
1032
|
+
"messages": {
|
|
1033
|
+
"actions": {
|
|
1034
|
+
"confirmations": {
|
|
1035
|
+
"deleteMultiple": "Tem certeza que deseja excluir os itens selecionados?"
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
```
|
|
1041
|
+
|
|
1042
|
+
### Enterprise scenario
|
|
1043
|
+
|
|
1044
|
+
```json
|
|
1045
|
+
{
|
|
1046
|
+
"columns": [
|
|
1047
|
+
{
|
|
1048
|
+
"field": "ageDays",
|
|
1049
|
+
"header": "Dias em aberto",
|
|
1050
|
+
"computed": { "expression": { "daysSince": [{ "var": "createdAt" }] }, "outputType": "number" }
|
|
1051
|
+
}
|
|
1052
|
+
],
|
|
1053
|
+
"rowConditionalStyles": [
|
|
1054
|
+
{
|
|
1055
|
+
"condition": {
|
|
1056
|
+
"and": [
|
|
1057
|
+
{ ">": [{ "var": "computed.ageDays" }, 5] },
|
|
1058
|
+
{ "!==": [{ "var": "status" }, "RESOLVIDO"] }
|
|
1059
|
+
]
|
|
1060
|
+
},
|
|
1061
|
+
"cssClass": "row--danger text-bold"
|
|
1062
|
+
}
|
|
1063
|
+
],
|
|
1064
|
+
"rowConditionalRenderers": [
|
|
1065
|
+
{
|
|
1066
|
+
"condition": {
|
|
1067
|
+
"and": [
|
|
1068
|
+
{ ">": [{ "var": "computed.ageDays" }, 5] },
|
|
1069
|
+
{ "!==": [{ "var": "status" }, "RESOLVIDO"] }
|
|
1070
|
+
]
|
|
1071
|
+
},
|
|
1072
|
+
"tooltip": { "text": "SLA violado: acao imediata necessaria", "position": "top" },
|
|
1073
|
+
"animation": { "preset": "warning-attention", "repeat": 3 }
|
|
1074
|
+
}
|
|
1075
|
+
]
|
|
1076
|
+
}
|
|
1077
|
+
```
|
|
1078
|
+
|
|
1079
|
+
## Known limitations and mismatches
|
|
1080
|
+
|
|
1081
|
+
| Path/Behavior | Observed behavior (runtime) | Desired behavior | Impact | Tracking issue | Target fix |
|
|
1082
|
+
| --- | --- | --- | --- | --- | --- |
|
|
1083
|
+
| coverage/mapping | Evidência textual preservada indica itens Partial/Declared-only. | Cobertura confirmada por evidência runtime + schema + editor. | Pode gerar uso de paths não totalmente ligados. | to-be-linked | next-doc-cycle |
|
|
1084
|
+
|
|
1085
|
+
## Compatibility and migration notes
|
|
1086
|
+
|
|
1087
|
+
- Paths e aliases legados continuam aceitos para compatibilidade (`behavior.virtualScroll.*`, chaves legadas de header em `actions.row.*`), mas novos contratos devem usar caminhos canonicos atuais.
|
|
1088
|
+
- O side-channel de overrides CRUD (`crud-overrides:<componentKeyId>`) nao faz parte do `TableConfig`; mantenha migracao/backup dessa chave separado do payload principal.
|
|
1089
|
+
- Para regex em regras, a forma canonica persistida e infixa (`field matches value`); `matches(field, value)` permanece como legado suportado.
|
|
1090
|
+
- O editor manual de regras da tabela autora apenas JSON Logic.
|
|
1091
|
+
- Se houver comportamento divergente entre schema e runtime, priorize as indicacoes desta pagina em `Known limitations and mismatches` e mantenha `has_known_mismatches=true` no frontmatter enquanto a lacuna existir.
|
|
1092
|
+
|
|
1093
|
+
### Source references
|
|
1094
|
+
- `projects/praxis-table/src/lib/praxis-table.ts`
|
|
1095
|
+
- `projects/praxis-table/src/lib/praxis-table.html`
|
|
1096
|
+
- `projects/praxis-table/src/lib/praxis-table.scss`
|
|
1097
|
+
- `projects/praxis-table/src/lib/praxis-table-toolbar.ts`
|
|
1098
|
+
- `projects/praxis-table/src/lib/praxis-table-config-editor.ts`
|
|
1099
|
+
- `projects/praxis-table/src/lib/behavior-config-editor/behavior-config-editor.component.ts`
|
|
1100
|
+
- `projects/praxis-table/src/lib/header-appearance-editor/header-appearance-editor.component.ts`
|
|
1101
|
+
- `projects/praxis-table/src/lib/columns-config-editor/columns-config-editor.component.ts`
|
|
1102
|
+
- `projects/praxis-table/src/lib/rules-editor/table-rules-editor.component.ts`
|
|
1103
|
+
- `projects/praxis-table/src/lib/toolbar-actions-editor/toolbar-actions-editor.component.ts`
|
|
1104
|
+
- `projects/praxis-table/src/lib/filter-settings/filter-settings.component.ts`
|
|
1105
|
+
- `projects/praxis-table/src/lib/messages-localization-editor/messages-localization-editor.component.ts`
|
|
1106
|
+
- `projects/praxis-table/src/lib/dialogs/confirm-dialog-appearance-editor.component.ts`
|
|
1107
|
+
- `projects/praxis-table/src/lib/crud-integration-editor/crud-integration-editor.component.ts`
|
|
1108
|
+
- `projects/praxis-core/src/lib/models/table-config-v2.model.ts`
|
|
1109
|
+
- `projects/praxis-table/src/lib/utils/action-utils.ts`
|
|
1110
|
+
- `projects/praxis-core/src/lib/tokens/global-action.catalog.ts`
|
|
1111
|
+
- `projects/praxis-core/src/lib/models/global-action.model.ts`
|
|
1112
|
+
- `projects/praxis-core/src/lib/actions/global-action-ui.ts`
|
|
1113
|
+
|
|
1114
|
+
## Appendix: JSON path index
|
|
1115
|
+
|
|
1116
|
+
| Path | Type | Required | Default | Status | Notes |
|
|
1117
|
+
| --- | --- | --- | --- | --- | --- |
|
|
1118
|
+
| `columns[]` | `TableColumnConfig[]` | Yes | `[]` | Active | Definicao de colunas, renderers e regras de exibicao. |
|
|
1119
|
+
| `behavior` | `TableBehaviorConfig` | No | defaults do runtime | Partial | Inclui paginacao, filtro, selecao e expansao por blocos. |
|
|
1120
|
+
| `toolbar.actions[]` | `ToolbarActionConfig[]` | No | `[]` | Partial | Acoes de toolbar com roteamento para `toolbarAction` e `bulkAction`. |
|
|
1121
|
+
| `messages` | `TableMessagesConfig` | No | defaults internos | Partial | Overrides de i18n e mensagens operacionais. |
|
|
1122
|
+
| `data` | `TableDataConfig` | No | modo local/remoto autodetectado | Partial | Integra origem local ou remota conforme `resourcePath`/inputs. |
|
|
1123
|
+
|
|
1124
|
+
## Appendix: Events summary
|
|
1125
|
+
|
|
1126
|
+
`selectionChange` emits `{ trigger, row?, selectedRows, selectedCount, tableId? }`
|
|
1127
|
+
for row selection changes initiated by the user.
|
|
1128
|
+
|
|
1129
|
+
| Event | Payload | Trigger | Stability |
|
|
1130
|
+
| --- | --- | --- | --- |
|
|
1131
|
+
| `rowClick` | `{ row, index }` | clique de linha no corpo da tabela | Partial |
|
|
1132
|
+
| `rowAction` | `{ action, row, payload?, actionConfig? }` | acao interativa de linha (`_actions`/renderer); `navigation.openRoute` resolve templates de linha antes da execucao e `surface.open` preserva `payload.*` como envelope canonico do evento | Partial |
|
|
1133
|
+
| `toolbarAction` | `{ action, actionConfig? }` | acao de toolbar fora de fluxo bulk | Partial |
|
|
1134
|
+
| `exportAction` | `{ format, request?, result?, error?, tableId? }` | exportacao por `PraxisCollectionExportRequest` | Active |
|
|
1135
|
+
| `bulkAction` | `{ action, rows, actionConfig? }` | acao em lote sobre linhas selecionadas | Partial |
|
|
1136
|
+
| `loadingStateChange` | `LoadingState` | mudanca de estado (`config/schema/data/render`) | Active |
|
|
1137
|
+
|
|
1138
|
+
## Appendix: Styling API summary
|
|
1139
|
+
|
|
1140
|
+
| Token/Class | Scope | Purpose | Notes |
|
|
1141
|
+
| --- | --- | --- | --- |
|
|
1142
|
+
| `--p-table-header-bg` / `--p-table-header-fg` | css vars | aparencia de cabecalho e contraste | Tokens principais de tema para header. |
|
|
1143
|
+
| `--p-table-row-*` | css vars | zebra, hover e estado selecionado de linha | Aplicados no runtime de render da tabela. |
|
|
1144
|
+
| `density-compact` / `density-comfortable` / `density-spacious` | host classes | controle de densidade visual | Derivadas de `appearance.density`. |
|
|
1145
|
+
| `.pfx-column-drag-enabled` | host class | habilita feedback visual de reordenacao | Ativada quando contrato de reorder esta habilitado. |
|
|
1146
|
+
| `.pfx-column-drag-indicator` | host class | indicador visual durante drag/drop | Integrada ao runtime de `columnReorder`. |
|
|
1147
|
+
|
|
1148
|
+
### Fallback global de aparencia
|
|
1149
|
+
|
|
1150
|
+
Quando o host salva `GlobalConfig.table.appearance`, a tabela usa esses valores como fallback corporativo para:
|
|
1151
|
+
|
|
1152
|
+
- `appearance.density`
|
|
1153
|
+
- `appearance.spacing.cellPadding`
|
|
1154
|
+
- `appearance.spacing.headerPadding`
|
|
1155
|
+
- `appearance.typography.fontSize`
|
|
1156
|
+
- `appearance.typography.headerFontSize`
|
|
1157
|
+
|
|
1158
|
+
Precedencia efetiva:
|
|
1159
|
+
|
|
1160
|
+
1. `TableConfig` local informado pelo host
|
|
1161
|
+
2. `GlobalConfig.table.appearance`
|
|
1162
|
+
3. defaults hardcoded de `createDefaultTableConfig()`
|
|
1163
|
+
|
|
1164
|
+
Campos fora de `table.appearance` mantem a semantica anterior de fallback do provider.
|
|
1165
|
+
|
|
1166
|
+
## Editor and tooling notes
|
|
1167
|
+
|
|
1168
|
+
- Cobertura de editor/tooling foi separada da cobertura de runtime para evitar confusao de suporte.
|
|
1169
|
+
- Quando nao houver evidencia direta no codigo, o status deve permanecer not yet verified.
|
|
1170
|
+
|
|
1171
|
+
## Appendix: Examples summary
|
|
1172
|
+
|
|
1173
|
+
### Appendix minimal valid
|
|
1174
|
+
|
|
1175
|
+
```json
|
|
1176
|
+
{
|
|
1177
|
+
"columns": []
|
|
1178
|
+
}
|
|
1179
|
+
```
|
|
1180
|
+
|
|
1181
|
+
### Appendix typical/common
|
|
1182
|
+
|
|
1183
|
+
```json
|
|
1184
|
+
{
|
|
1185
|
+
"columns": [
|
|
1186
|
+
{
|
|
1187
|
+
"field": "name",
|
|
1188
|
+
"header": "Nome"
|
|
1189
|
+
}
|
|
1190
|
+
],
|
|
1191
|
+
"behavior": {
|
|
1192
|
+
"pagination": {
|
|
1193
|
+
"enabled": true,
|
|
1194
|
+
"pageSize": 25
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
```
|
|
1199
|
+
|
|
1200
|
+
### Appendix advanced
|
|
1201
|
+
|
|
1202
|
+
```json
|
|
1203
|
+
{
|
|
1204
|
+
"columns": [
|
|
1205
|
+
{
|
|
1206
|
+
"field": "status",
|
|
1207
|
+
"header": "Status",
|
|
1208
|
+
"renderer": {
|
|
1209
|
+
"type": "badge"
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
],
|
|
1213
|
+
"toolbar": {
|
|
1214
|
+
"actions": [
|
|
1215
|
+
{
|
|
1216
|
+
"id": "refresh",
|
|
1217
|
+
"label": "Atualizar"
|
|
1218
|
+
}
|
|
1219
|
+
]
|
|
1220
|
+
},
|
|
1221
|
+
"behavior": {
|
|
1222
|
+
"selection": {
|
|
1223
|
+
"mode": "multiple"
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
```
|
|
1228
|
+
|
|
1229
|
+
### Appendix enterprise scenario
|
|
1230
|
+
|
|
1231
|
+
```json
|
|
1232
|
+
{
|
|
1233
|
+
"columns": [],
|
|
1234
|
+
"messages": {
|
|
1235
|
+
"emptyState": "Nenhum registro encontrado."
|
|
1236
|
+
},
|
|
1237
|
+
"behavior": {
|
|
1238
|
+
"expansion": {
|
|
1239
|
+
"enabled": true
|
|
1240
|
+
}
|
|
1241
|
+
},
|
|
1242
|
+
"data": {
|
|
1243
|
+
"mode": "remote",
|
|
1244
|
+
"resourcePath": "customers/table"
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
```
|
|
1248
|
+
|
|
1249
|
+
Nota: exemplos especificos do componente foram preservados na secao detalhada para evitar perda de cobertura durante esta migracao canonicamente orientada.
|
|
1250
|
+
|
|
1251
|
+
## Known limitations and mismatches
|
|
1252
|
+
|
|
1253
|
+
| Path/Behavior | Observed behavior (runtime) | Desired behavior | Impact | Tracking issue | Target fix |
|
|
1254
|
+
| --- | --- | --- | --- | --- | --- |
|
|
1255
|
+
| coverage/mapping | Documento anterior indica cobertura parcial ou declared-only. | Cobertura totalmente rastreada por superficie. | Pode haver diferenca entre schema e runtime/editor. | to-be-linked | next-doc-cycle |
|
|
1256
|
+
|
|
1257
|
+
## Compatibility and migration notes
|
|
1258
|
+
|
|
1259
|
+
| Concern | Affected versions | Migration action | Deadline | Notes |
|
|
1260
|
+
| --- | --- | --- | --- | --- |
|
|
1261
|
+
| legacy aliases and mixed status vocabulary | pre-canonical docs | unificar para taxonomia canonica (Active/Partial/Declared-only/...) | next-doc-cycle | manter backward compatibility documentada |
|
|
1262
|
+
|
|
1263
|
+
## Governed embeds
|
|
1264
|
+
|
|
1265
|
+
- `behavior.expansion.detail.schemaContract.allowedNodes` agora tambem pode incluir `formRef`, `tableRef`, `chartRef`, `templateRef` e `diagramEmbed`.
|
|
1266
|
+
- Esses nodes continuam host-mediated:
|
|
1267
|
+
- o host resolve discovery, registry, abertura e policy
|
|
1268
|
+
- a tabela padroniza o shell, os metadados e a CTA do embed
|
|
1269
|
+
- o miolo visual continua delegado para `PraxisRichContent`
|
|
1270
|
+
- `diagramEmbed` adiciona `provider`, `source` ou `sourceField` para preview governado de diagrama, sem abrir uma segunda DSL de detail row.
|
|
1271
|
+
|
|
1272
|
+
```ts
|
|
1273
|
+
type DetailEmbedNode = {
|
|
1274
|
+
type: 'formRef' | 'tableRef' | 'chartRef' | 'templateRef';
|
|
1275
|
+
title?: string;
|
|
1276
|
+
subtitle?: string;
|
|
1277
|
+
description?: string;
|
|
1278
|
+
caption?: string;
|
|
1279
|
+
emptyText?: string;
|
|
1280
|
+
schemaId?: string;
|
|
1281
|
+
templateId?: string;
|
|
1282
|
+
inputs?: Record<string, unknown>;
|
|
1283
|
+
presetRef?: CorePresetRef;
|
|
1284
|
+
action?: {
|
|
1285
|
+
actionId: string;
|
|
1286
|
+
label: string;
|
|
1287
|
+
icon?: string;
|
|
1288
|
+
payloadExpr?: string;
|
|
1289
|
+
visibleWhen?: JsonLogicExpression | null;
|
|
1290
|
+
disabledWhen?: JsonLogicExpression | null;
|
|
1291
|
+
};
|
|
1292
|
+
};
|
|
1293
|
+
|
|
1294
|
+
type DiagramEmbedNode = {
|
|
1295
|
+
type: 'diagramEmbed';
|
|
1296
|
+
title?: string;
|
|
1297
|
+
subtitle?: string;
|
|
1298
|
+
description?: string;
|
|
1299
|
+
caption?: string;
|
|
1300
|
+
emptyText?: string;
|
|
1301
|
+
provider: 'mermaid' | 'bpmn' | 'custom';
|
|
1302
|
+
source?: string;
|
|
1303
|
+
sourceField?: string;
|
|
1304
|
+
inputs?: Record<string, unknown>;
|
|
1305
|
+
presetRef?: CorePresetRef;
|
|
1306
|
+
action?: {
|
|
1307
|
+
actionId: string;
|
|
1308
|
+
label: string;
|
|
1309
|
+
icon?: string;
|
|
1310
|
+
payloadExpr?: string;
|
|
1311
|
+
visibleWhen?: JsonLogicExpression | null;
|
|
1312
|
+
disabledWhen?: JsonLogicExpression | null;
|
|
1313
|
+
};
|
|
1314
|
+
};
|
|
1315
|
+
```
|