@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,234 @@
|
|
|
1
|
+
# Praxis Table Playground Scenario Second Opinion Review
|
|
2
|
+
|
|
3
|
+
## Veredito executivo
|
|
4
|
+
|
|
5
|
+
O plano está **forte, mas ainda um pouco largo e levemente enviesado para “capability completeness” em detrimento de “navegabilidade editorial”**.
|
|
6
|
+
|
|
7
|
+
Em termos de diagnóstico, ele acerta quase tudo:
|
|
8
|
+
|
|
9
|
+
- identifica corretamente a redundância do catálogo atual;
|
|
10
|
+
- reposiciona o componente como plataforma governada, não só demo de regras;
|
|
11
|
+
- respeita melhor os limites reais do runtime do que o catálogo existente.
|
|
12
|
+
|
|
13
|
+
Mas o catálogo alvo ainda tem dois problemas:
|
|
14
|
+
|
|
15
|
+
1. ele pode ficar grande demais para um playground principal;
|
|
16
|
+
2. alguns cenários propostos estão muito próximos entre si do ponto de vista do usuário final.
|
|
17
|
+
|
|
18
|
+
Minha leitura: o plano está correto como direção estratégica, mas precisa de uma camada final de poda editorial para não substituir “muitos demos redundantes” por “muitos demos corretos”.
|
|
19
|
+
|
|
20
|
+
## Principais achados
|
|
21
|
+
|
|
22
|
+
### 1. O diagnóstico do catálogo atual está correto e não superficial
|
|
23
|
+
|
|
24
|
+
O ponto mais sólido do plano é reconhecer que o playground atual varia mais o domínio do que a capacidade.
|
|
25
|
+
|
|
26
|
+
Isso é especialmente verdadeiro em:
|
|
27
|
+
|
|
28
|
+
- fluxos operacionais;
|
|
29
|
+
- demos de regras;
|
|
30
|
+
- expansão genérica.
|
|
31
|
+
|
|
32
|
+
Essa crítica é estruturalmente correta.
|
|
33
|
+
|
|
34
|
+
### 2. O plano acerta ao tratar filtro dinâmico como cenário flagship
|
|
35
|
+
|
|
36
|
+
Isso é talvez o melhor acerto do plano.
|
|
37
|
+
|
|
38
|
+
Se `praxis-table` continuar sendo apresentado sem um showcase forte de filtro dinâmico, o playground vai seguir comunicando um produto menor do que a lib realmente é.
|
|
39
|
+
|
|
40
|
+
`Dynamic Filter Workbench` não é acessório. É uma peça central da tese do componente.
|
|
41
|
+
|
|
42
|
+
### 3. “Schema Reconciliation” está corretamente promovido de detalhe técnico para capability de produto
|
|
43
|
+
|
|
44
|
+
Outro acerto forte.
|
|
45
|
+
|
|
46
|
+
O mecanismo de ETag, banner, badge, snooze/ignore e reconciliação é diferencial de plataforma. Se isso não aparece no playground, o usuário conclui que a tabela é só mais uma grid configurável.
|
|
47
|
+
|
|
48
|
+
### 4. O catálogo alvo ainda está amplo demais
|
|
49
|
+
|
|
50
|
+
Onze cenários é melhor do que o catálogo atual, mas ainda parece alto para uma primeira superfície de playground.
|
|
51
|
+
|
|
52
|
+
Se todos forem tratados como cenários principais e equivalentes, existe risco de:
|
|
53
|
+
|
|
54
|
+
- fadiga de navegação;
|
|
55
|
+
- dispersão cognitiva;
|
|
56
|
+
- dificuldade de entender “por onde começar”.
|
|
57
|
+
|
|
58
|
+
Minha recomendação é trabalhar com:
|
|
59
|
+
|
|
60
|
+
- 6 cenários principais;
|
|
61
|
+
- 2 ou 3 avançados;
|
|
62
|
+
- variações extras via patches.
|
|
63
|
+
|
|
64
|
+
### 5. “Renderer Gallery” e “Rules and DSL Playground” ainda estão parcialmente sobrepostos
|
|
65
|
+
|
|
66
|
+
A separação conceitual faz sentido para quem conhece a arquitetura, mas não necessariamente para quem está explorando o playground.
|
|
67
|
+
|
|
68
|
+
Hoje, um usuário pode perceber ambos como:
|
|
69
|
+
|
|
70
|
+
- “cenários visuais com destaque condicional e células especiais”.
|
|
71
|
+
|
|
72
|
+
Se mantidos separados, a tese de cada um precisa ser muito explícita:
|
|
73
|
+
|
|
74
|
+
- `Renderer Gallery`: prova a superfície visual dos renderizadores
|
|
75
|
+
- `Rules and DSL Playground`: prova lógica, critérios, condições e governança de regras
|
|
76
|
+
|
|
77
|
+
Sem essa diferenciação forte, eles tendem a colapsar editorialmente.
|
|
78
|
+
|
|
79
|
+
### 6. “Settings-Driven Authoring” é importante, mas não está claro se deve ser cenário flagship
|
|
80
|
+
|
|
81
|
+
Aqui eu discordo parcialmente do plano.
|
|
82
|
+
|
|
83
|
+
Esse tema é relevante, mas pode ser avançado demais para a primeira leitura do playground. Dependendo do público, ele funciona melhor como:
|
|
84
|
+
|
|
85
|
+
- patch/aba de um cenário de reconciliação/governança; ou
|
|
86
|
+
- cenário avançado, não um dos primeiros.
|
|
87
|
+
|
|
88
|
+
Se virar cenário principal, precisa provar valor muito rapidamente. Caso contrário, vai parecer “editor interno do componente”, não capability consumível.
|
|
89
|
+
|
|
90
|
+
### 7. “Virtualized High Volume” merece existir, mas com framing mais honesto e restrito
|
|
91
|
+
|
|
92
|
+
Concordo com a criação, mas ele deve ser apresentado como:
|
|
93
|
+
|
|
94
|
+
- cenário de performance e limites;
|
|
95
|
+
- não cenário de feature breadth.
|
|
96
|
+
|
|
97
|
+
O perigo aqui é o usuário entrar nesse cenário esperando combinação com expansão, governança rica, renderers pesados e tudo mais. A comunicação precisa enfatizar:
|
|
98
|
+
|
|
99
|
+
- o que está validado;
|
|
100
|
+
- o que é explicitamente limitado.
|
|
101
|
+
|
|
102
|
+
### 8. Falta um cenário forte de “toolbar and action orchestration”
|
|
103
|
+
|
|
104
|
+
O plano cobre isso parcialmente em `Selection and Bulk Operations` e `Remote CRUD Baseline`, mas ainda não há um cenário cujo foco explícito seja:
|
|
105
|
+
|
|
106
|
+
- toolbar actions;
|
|
107
|
+
- row actions;
|
|
108
|
+
- confirm flows;
|
|
109
|
+
- feedback states;
|
|
110
|
+
- diferença entre ação emitida, ação automatizada e ação com side effect remoto.
|
|
111
|
+
|
|
112
|
+
Talvez isso não exija um cenário extra, mas exige que um dos cenários existentes assuma essa tese com clareza.
|
|
113
|
+
|
|
114
|
+
### 9. O plano poderia distinguir melhor “cenários de aprendizado” de “cenários de prova”
|
|
115
|
+
|
|
116
|
+
Nem todo cenário serve ao mesmo propósito.
|
|
117
|
+
|
|
118
|
+
Alguns deveriam ser:
|
|
119
|
+
|
|
120
|
+
- “start here”
|
|
121
|
+
- “power features”
|
|
122
|
+
- “advanced governance”
|
|
123
|
+
|
|
124
|
+
Hoje o plano lista um catálogo bom, mas ainda não hierarquiza o percurso.
|
|
125
|
+
|
|
126
|
+
## Ajustes recomendados no catálogo
|
|
127
|
+
|
|
128
|
+
### Manter como principais
|
|
129
|
+
|
|
130
|
+
- `Remote CRUD Baseline`
|
|
131
|
+
- `Dynamic Filter Workbench`
|
|
132
|
+
- `Local Data Projection`
|
|
133
|
+
- `Selection and Bulk Operations`
|
|
134
|
+
- `Schema Reconciliation`
|
|
135
|
+
- `Expansion Lab`
|
|
136
|
+
|
|
137
|
+
### Manter, mas como avançados
|
|
138
|
+
|
|
139
|
+
- `Column Governance`
|
|
140
|
+
- `Virtualized High Volume`
|
|
141
|
+
- `Settings-Driven Authoring`
|
|
142
|
+
|
|
143
|
+
### Fundir ou recalibrar
|
|
144
|
+
|
|
145
|
+
- `Renderer Gallery` + `Rules and DSL Playground`
|
|
146
|
+
Resultado recomendado:
|
|
147
|
+
- manter dois cenários apenas se a diferenciação ficar extremamente clara;
|
|
148
|
+
- caso contrário, fundir em `Renderers and Rules Lab`
|
|
149
|
+
|
|
150
|
+
### Criar ou reforçar como tese dentro de cenário existente
|
|
151
|
+
|
|
152
|
+
- `Action Orchestration`
|
|
153
|
+
Não precisa necessariamente ser cenário próprio.
|
|
154
|
+
Pode virar a tese explícita de `Selection and Bulk Operations`.
|
|
155
|
+
|
|
156
|
+
### Remover do catálogo principal como cenários equivalentes
|
|
157
|
+
|
|
158
|
+
- qualquer cenário operacional temático extra além de um baseline remoto
|
|
159
|
+
- múltiplos presets de expansão genérica
|
|
160
|
+
- múltiplos rules demos orientados por domínio
|
|
161
|
+
|
|
162
|
+
## Riscos de comunicação
|
|
163
|
+
|
|
164
|
+
### 1. Oversell de recursos schema-only
|
|
165
|
+
|
|
166
|
+
O playground precisa marcar claramente o que é:
|
|
167
|
+
|
|
168
|
+
- ativo no runtime;
|
|
169
|
+
- parcial;
|
|
170
|
+
- previsto no contrato, mas ainda não plenamente executado.
|
|
171
|
+
|
|
172
|
+
Sem isso, o usuário lê o cenário e conclui maturidade falsa.
|
|
173
|
+
|
|
174
|
+
### 2. Subestimar a dimensão “host integration”
|
|
175
|
+
|
|
176
|
+
Se os cenários ficarem muito focados em visual/configuração local, o playground ainda pode esconder o caráter host-governed da tabela.
|
|
177
|
+
|
|
178
|
+
Isso é especialmente importante para:
|
|
179
|
+
|
|
180
|
+
- filtro dinâmico;
|
|
181
|
+
- schema reconciliation;
|
|
182
|
+
- settings-driven authoring.
|
|
183
|
+
|
|
184
|
+
### 3. Tornar authoring/editor mais importante do que o uso normal
|
|
185
|
+
|
|
186
|
+
Se `Settings-Driven Authoring` ganhar peso excessivo no catálogo principal, o playground pode parecer mais uma ferramenta de configuração interna do que um componente consumível de runtime.
|
|
187
|
+
|
|
188
|
+
### 4. Misturar performance com amplitude funcional
|
|
189
|
+
|
|
190
|
+
No cenário de virtualização, a mensagem precisa ser:
|
|
191
|
+
|
|
192
|
+
- performance first;
|
|
193
|
+
- limites explícitos.
|
|
194
|
+
|
|
195
|
+
Não “modo turbo que faz tudo”.
|
|
196
|
+
|
|
197
|
+
### 5. Confundir renderers com DSL
|
|
198
|
+
|
|
199
|
+
Se a curadoria não explicar a diferença entre:
|
|
200
|
+
|
|
201
|
+
- exibir conteúdo rico;
|
|
202
|
+
- aplicar lógica/condições/regras;
|
|
203
|
+
|
|
204
|
+
o usuário pode não entender o valor específico de cada trilha.
|
|
205
|
+
|
|
206
|
+
## Catálogo final recomendado
|
|
207
|
+
|
|
208
|
+
### Cenários principais
|
|
209
|
+
|
|
210
|
+
1. `Remote CRUD Baseline`
|
|
211
|
+
2. `Dynamic Filter Workbench`
|
|
212
|
+
3. `Local Data Projection`
|
|
213
|
+
4. `Selection and Bulk Operations`
|
|
214
|
+
5. `Schema Reconciliation`
|
|
215
|
+
6. `Expansion Lab`
|
|
216
|
+
|
|
217
|
+
### Cenários avançados
|
|
218
|
+
|
|
219
|
+
7. `Column Governance`
|
|
220
|
+
8. `Renderers and Rules Lab`
|
|
221
|
+
9. `Virtualized High Volume`
|
|
222
|
+
10. `Settings-Driven Authoring`
|
|
223
|
+
|
|
224
|
+
## Recomendação final
|
|
225
|
+
|
|
226
|
+
Se o objetivo é um playground forte e legível, eu **não publicaria 11 cenários de primeira**.
|
|
227
|
+
|
|
228
|
+
Eu publicaria:
|
|
229
|
+
|
|
230
|
+
- 6 cenários principais na superfície inicial;
|
|
231
|
+
- 3 ou 4 cenários avançados;
|
|
232
|
+
- o restante como patches ou trilhas secundárias.
|
|
233
|
+
|
|
234
|
+
Isso preserva a ambição do plano sem repetir o erro original em outra forma.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# @praxisui/table - Release Notes (P1 Hardening)
|
|
2
|
+
|
|
3
|
+
Data de congelamento da baseline de docs: **2026-02-26**.
|
|
4
|
+
|
|
5
|
+
## Escopo consolidado
|
|
6
|
+
|
|
7
|
+
Nota historica: esta baseline e anterior a canonicalizacao de Json Logic. As referencias a DSL abaixo descrevem o estado de `2026-02-26`; para regras novas, use Json Logic canonico.
|
|
8
|
+
|
|
9
|
+
- DSL runtime com helpers corporativos embutidos:
|
|
10
|
+
- `jsonType`, `coalesce`, `eqIgnoreCase`, `between`, `dateBetween`, `containsAny`, `containsAll`.
|
|
11
|
+
- Helpers anteriores mantidos (`jsonGet/jsonEq/jsonIn`, `isBlank`, `today/now`, `len*`, etc.).
|
|
12
|
+
- Normalização legada preservada para expressões antigas.
|
|
13
|
+
- Limitação documentada: parser atual não suporta comparação direta de retorno de função (`fn(...) == valor`).
|
|
14
|
+
- `toolbar.actions.visibleWhen` com politica por ambiente:
|
|
15
|
+
- `prod/qa`: fail-closed.
|
|
16
|
+
- `dev/hml`: fail-open para diagnostico.
|
|
17
|
+
- `shortcutScope` canonico com validacao (`toolbar|global`) e fallback seguro.
|
|
18
|
+
- Guards schema-only para:
|
|
19
|
+
- `behavior.sorting.multiSort`
|
|
20
|
+
- `behavior.filtering.columnFilters.enabled`
|
|
21
|
+
- `appearance.colors.*` com binding real no runtime:
|
|
22
|
+
- `background`, `hoverBackground`, `selectedBackground`, `textColor`, `states.*`.
|
|
23
|
+
- `messages.actions.success/errors` por `actionId` em `rowAction`, `toolbarAction` e `bulkAction`.
|
|
24
|
+
|
|
25
|
+
## Baseline de contrato/documentacao
|
|
26
|
+
|
|
27
|
+
- Contrato principal alinhado em:
|
|
28
|
+
- `projects/praxis-table/src/lib/praxis-table.json-api.md`
|
|
29
|
+
- Guia historico de remocao da DSL em:
|
|
30
|
+
- `projects/praxis-table/docs/DSL-Extensions-Guide.md`
|
|
31
|
+
- README de uso atualizado em:
|
|
32
|
+
- `projects/praxis-table/README.md`
|
|
33
|
+
- Changelog atualizado em:
|
|
34
|
+
- `projects/praxis-table/CHANGELOG.md`
|
|
35
|
+
|
|
36
|
+
## Evidencia MCP (Angular CLI)
|
|
37
|
+
|
|
38
|
+
- Ferramentas listadas:
|
|
39
|
+
- `get_best_practices`
|
|
40
|
+
- `search_documentation`
|
|
41
|
+
- `list_projects`
|
|
42
|
+
- Recomendacoes aplicadas nesta release:
|
|
43
|
+
- bindings visuais via classe/style declarativos (evitando logica visual difusa em template).
|
|
44
|
+
- validacao via testes de DOM para classes e estilos efetivos (viewport/classes + cores).
|
|
45
|
+
- fluxo de testes async padronizado com ambiente `zone.js/testing` para specs com `fakeAsync`.
|
|
46
|
+
- manutencao de fallback seguro e comportamento previsivel no runtime/documentacao.
|
|
47
|
+
- helper DSL puros/deterministicos com tratamento explicito de nulos e tipos.
|
|
48
|
+
- Referencias oficiais retornadas por `search_documentation`:
|
|
49
|
+
- `https://angular.dev/best-practices/security`
|
|
50
|
+
- `https://angular.dev/guide/testing/zone-js-testing-utilities`
|
|
51
|
+
- `https://angular.dev/guide/testing`
|
|
52
|
+
|
|
53
|
+
## Checklist de compatibilidade (PR final)
|
|
54
|
+
|
|
55
|
+
- [x] Sem quebra de retrocompatibilidade de payload dos eventos (`action`, `row/rows`, `actionConfig`).
|
|
56
|
+
- [x] Fallbacks seguros para contrato invalido (`type` invalido, `shortcutScope` invalido, `visibleWhen` invalido).
|
|
57
|
+
- [x] Features schema-only com bloqueio explicito no editor e guard no runtime.
|
|
58
|
+
- [x] `appearance.colors.*` com precedencia documentada: custom > tokens > defaults.
|
|
59
|
+
- [x] Matriz de limitações conhecida atualizada para refletir guards e status reais.
|
|
60
|
+
- [x] Suite dirigida executada para runtime, toolbar, viewport, behavior editor e filtro.
|
|
61
|
+
- [x] Suite de regras DSL atualizada para novos helpers corporativos e fuzzing deterministico.
|
|
62
|
+
|
|
63
|
+
## Suite de regressao consolidada
|
|
64
|
+
|
|
65
|
+
Comando base de fechamento:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
node_modules/.bin/ng test praxis-table --watch=false --browsers=ChromeHeadless \
|
|
69
|
+
--polyfills=zone.js --polyfills=zone.js/testing \
|
|
70
|
+
--include=projects/praxis-table/src/lib/praxis-table.local-runtime.spec.ts \
|
|
71
|
+
--include=projects/praxis-table/src/lib/praxis-table-toolbar.spec.ts \
|
|
72
|
+
--include=projects/praxis-table/src/lib/praxis-table.viewport-classes.spec.ts \
|
|
73
|
+
--include=projects/praxis-table/src/lib/behavior-config-editor/behavior-config-editor.component.spec.ts \
|
|
74
|
+
--include=projects/praxis-table/src/lib/components/praxis-filter/praxis-filter.component.spec.ts \
|
|
75
|
+
--include=projects/praxis-table/src/lib/components/praxis-filter/filter-form-dialog-host.component.spec.ts
|
|
76
|
+
```
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Checklist de Completude: `TableAuthoringDocument`
|
|
2
|
+
|
|
3
|
+
## Objetivo
|
|
4
|
+
|
|
5
|
+
Este checklist existe para validar se o `TableAuthoringDocument` é realmente canônico.
|
|
6
|
+
|
|
7
|
+
Regra central:
|
|
8
|
+
|
|
9
|
+
> O documento persistível precisa carregar tudo que é semanticamente necessário para reconstruir o estado aplicado da tabela, sem depender do estado previamente aplicado do componente.
|
|
10
|
+
|
|
11
|
+
Se qualquer item abaixo depender de fallback vindo do runtime anterior, o round-trip ainda está incompleto.
|
|
12
|
+
|
|
13
|
+
## Critério de aceite
|
|
14
|
+
|
|
15
|
+
O documento será considerado completo quando:
|
|
16
|
+
|
|
17
|
+
1. editor visual e editor JSON produzirem o mesmo envelope persistível;
|
|
18
|
+
2. `toCanonicalConfig(document, context)` for suficiente para reconstruir o estado aplicado;
|
|
19
|
+
3. `buildApplyPlan(...)` não depender de `previousAppliedState` como mecanismo arquitetural;
|
|
20
|
+
4. o runtime adapter apenas executar o plano, sem recompor semântica ausente.
|
|
21
|
+
|
|
22
|
+
## Itens obrigatórios
|
|
23
|
+
|
|
24
|
+
### 1. Envelope persistível
|
|
25
|
+
|
|
26
|
+
- [ ] O JSON oficial de autoria é o envelope versionado (`kind`, `version`, `config`, `bindings`).
|
|
27
|
+
- [ ] O editor JSON da tabela edita esse envelope, não `TableConfig` cru.
|
|
28
|
+
- [ ] O editor visual devolve esse mesmo envelope.
|
|
29
|
+
- [ ] O parser aceita payload legado `__resourcePath__`, `__idField__`, `__horizontalScroll__`, mas a serialização nova não escreve esses campos.
|
|
30
|
+
|
|
31
|
+
### 2. Config principal
|
|
32
|
+
|
|
33
|
+
- [ ] `config.columns` é emitido integralmente pelo documento.
|
|
34
|
+
- [ ] `config.behavior` é emitido integralmente pelo documento.
|
|
35
|
+
- [ ] `config.toolbar`, `config.actions`, `config.export`, `config.messages`, `config.dialogs` e demais áreas editáveis são emitidas integralmente pelo documento.
|
|
36
|
+
- [ ] Nenhuma área semanticamente relevante depende de defaults implícitos não determinísticos do runtime.
|
|
37
|
+
|
|
38
|
+
### 3. Bindings persistíveis
|
|
39
|
+
|
|
40
|
+
- [ ] `resourcePath` tem representação canônica única em `bindings`.
|
|
41
|
+
- [ ] `horizontalScroll` tem representação canônica única em `bindings`.
|
|
42
|
+
- [ ] `idField` tem decisão provisória/documentada e não fica “metade bindings, metade meta” sem regra explícita.
|
|
43
|
+
|
|
44
|
+
### 4. `advancedFilters.settings`
|
|
45
|
+
|
|
46
|
+
- [ ] `advancedFilters.settings` é parte do documento quando semanticamente necessário.
|
|
47
|
+
- [ ] O pipeline visual da tabela reemite `advancedFilters.settings` de forma completa.
|
|
48
|
+
- [ ] `toCanonicalConfig()` não precisa buscar `advancedFilters.settings` no estado anterior do componente.
|
|
49
|
+
- [ ] `applyTableConfig()` não depende mais de fallback implícito baseado no estado interno previamente aplicado.
|
|
50
|
+
|
|
51
|
+
### 5. Coerções contextuais
|
|
52
|
+
|
|
53
|
+
- [ ] Coerção de `pagination.strategy` e `sorting.strategy` em modo local acontece em `toCanonicalConfig()`, não em `normalizeDocument()`.
|
|
54
|
+
- [ ] Essa coerção é puramente determinística e depende apenas de `document + projection context`.
|
|
55
|
+
- [ ] A coerção não reescreve silenciosamente o documento persistível.
|
|
56
|
+
|
|
57
|
+
### 6. Metadados de servidor
|
|
58
|
+
|
|
59
|
+
- [ ] `serverIdField`, `schemaId`, `schemaHash` não fazem parte do documento persistível por padrão.
|
|
60
|
+
- [ ] Divergências com servidor são tratadas como diagnóstico via contexto de validação.
|
|
61
|
+
- [ ] Anexar `schemaId`/`schemaHash` ao config persistido, quando necessário, é decisão explícita do runtime adapter/save flow.
|
|
62
|
+
|
|
63
|
+
### 7. Persistência paralela
|
|
64
|
+
|
|
65
|
+
- [ ] O design considera explicitamente artefatos persistidos fora do `TableConfig`.
|
|
66
|
+
- [ ] Overrides CRUD fora do `TableConfig` têm estratégia definida:
|
|
67
|
+
- ou entram no documento de autoria,
|
|
68
|
+
- ou permanecem explicitamente fora do escopo do piloto.
|
|
69
|
+
- [ ] Dirty state do editor não depende de informação que o documento não consegue representar.
|
|
70
|
+
|
|
71
|
+
## Itens de revisão arquitetural
|
|
72
|
+
|
|
73
|
+
### Documento
|
|
74
|
+
|
|
75
|
+
- [ ] O documento contém somente informação persistível e round-trippable.
|
|
76
|
+
- [ ] Nada transitório do host/sessão é serializado no envelope.
|
|
77
|
+
- [ ] A versão do documento está explícita e pronta para migração futura.
|
|
78
|
+
|
|
79
|
+
### Contexto
|
|
80
|
+
|
|
81
|
+
- [ ] Contexto de validação está separado de contexto de projeção.
|
|
82
|
+
- [ ] Contexto de runtime está separado de autoria.
|
|
83
|
+
- [ ] Nenhum dado transitório da execução vaza para o envelope persistível.
|
|
84
|
+
|
|
85
|
+
### Apply plan
|
|
86
|
+
|
|
87
|
+
- [ ] `buildApplyPlan(...)` produz um plano suficientemente explícito para o adapter não precisar recalcular a lógica principal.
|
|
88
|
+
- [ ] O plano informa diff suficiente para decisões de runtime relevantes.
|
|
89
|
+
- [ ] O adapter não recompõe semântica ausente do documento.
|
|
90
|
+
|
|
91
|
+
## Itens de teste obrigatórios
|
|
92
|
+
|
|
93
|
+
- [ ] `parseLegacyOrDocument()` migra corretamente payload legado.
|
|
94
|
+
- [ ] `serializeDocument()` nunca escreve campos `__...__`.
|
|
95
|
+
- [ ] `normalizeDocument()` é idempotente.
|
|
96
|
+
- [ ] `validateDocument()` acusa inconsistências estruturais do envelope.
|
|
97
|
+
- [ ] `toCanonicalConfig()` reconstrói config efetiva sem ler estado anterior do componente.
|
|
98
|
+
- [ ] `buildApplyPlan()` gera plano consistente para:
|
|
99
|
+
- bind remoto
|
|
100
|
+
- bind local/sem `resourcePath`
|
|
101
|
+
- mudança de `horizontalScroll`
|
|
102
|
+
- mudança de `idField`
|
|
103
|
+
- mudança de `resourcePath`
|
|
104
|
+
- [ ] Editor visual -> serialize -> parse -> canonicalize produz o mesmo resultado que editor JSON -> canonicalize.
|
|
105
|
+
|
|
106
|
+
## Sinais de falha
|
|
107
|
+
|
|
108
|
+
Se qualquer um dos itens abaixo acontecer, o documento ainda não é canônico:
|
|
109
|
+
|
|
110
|
+
- o runtime precisa olhar para o estado anteriormente aplicado para “fechar” a configuração;
|
|
111
|
+
- o editor visual perde informação que o editor JSON preserva;
|
|
112
|
+
- o envelope persistido não basta para reproduzir o apply;
|
|
113
|
+
- `idField` ou outro campo crítico muda de significado conforme a superfície de edição;
|
|
114
|
+
- o adapter de runtime continua sendo o verdadeiro dono da inteligência semântica.
|
|
115
|
+
|
|
116
|
+
## Decisão prática do piloto
|
|
117
|
+
|
|
118
|
+
Antes de promover a arquitetura como padrão do ecossistema, este checklist deve estar majoritariamente verde no `praxis-table`.
|
|
119
|
+
|
|
120
|
+
Enquanto houver dependência real de recomposição por estado anterior, especialmente em `advancedFilters.settings`, a arquitetura deve ser tratada como piloto e não como padrão fechado.
|