@praxisui/table 10.0.0-rc.4 → 10.0.0-rc.41
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 +100 -3
- package/ai/component-registry.json +1276 -258
- package/docs/dynamic-filter-host-integration-guide.md +44 -1
- package/docs/dynamic-filter-payload-contract.md +29 -6
- package/docs/governed-page-widget-adapter.md +55 -0
- package/docs/local-data-mode-precedence.md +21 -0
- package/fesm2022/praxisui-table-authoring.mjs +2205 -0
- package/fesm2022/{praxisui-table-filter-form-dialog-host.component-DANYIQs6.mjs → praxisui-table-filter-form-dialog-host.component-Cst6rkAK.mjs} +51 -8
- package/fesm2022/{praxisui-table-praxisui-table-DKvwb6v1.mjs → praxisui-table-praxisui-table-CdEy3SYM.mjs} +17416 -2456
- package/fesm2022/{praxisui-table-table-agentic-authoring-turn-flow-BzjYuDvo.mjs → praxisui-table-table-agentic-authoring-turn-flow-sQz0BpSY.mjs} +1 -1
- package/fesm2022/{praxisui-table-table-ai.adapter-CPgpIGoi.mjs → praxisui-table-table-ai.adapter-DEetBMv9.mjs} +6 -5
- package/fesm2022/praxisui-table.mjs +2 -1
- package/package.json +14 -10
- package/src/lib/praxis-table.json-api.md +39 -9
- package/types/praxisui-table-authoring.d.ts +132 -0
- package/types/praxisui-table.d.ts +1008 -36
|
@@ -42,7 +42,7 @@ source_of_truth:
|
|
|
42
42
|
- "projects/praxis-table/src/lib/praxis-table.html"
|
|
43
43
|
- "projects/praxis-table/src/lib/components/praxis-filter/praxis-filter.component.ts"
|
|
44
44
|
- "projects/praxis-table/src/lib/services/filter-config.service.ts"
|
|
45
|
-
last_updated: "2026-
|
|
45
|
+
last_updated: "2026-10-27"
|
|
46
46
|
---
|
|
47
47
|
|
|
48
48
|
# Dynamic Filter Host Integration Guide
|
|
@@ -108,6 +108,28 @@ O host precisa garantir que a fonte de metadata do filtro e o backend estejam al
|
|
|
108
108
|
|
|
109
109
|
Sem isso, o runtime até renderiza o formulário, mas o payload não será previsível.
|
|
110
110
|
|
|
111
|
+
### Projetar tipos e validar antes de buscar/salvar
|
|
112
|
+
|
|
113
|
+
Para filtros escalares em array, mantenha `items`/`enumValues` do schema de operação
|
|
114
|
+
nos metadados dos campos. `items` descreve tipo, formato e enum dos itens; não
|
|
115
|
+
substitui o schema de uma coleção de objetos. O normalizador compartilhado de Core
|
|
116
|
+
interpreta somente os tokens admitidos por esse contrato, sem parser específico no
|
|
117
|
+
host ou no controle de filtro.
|
|
118
|
+
|
|
119
|
+
Use os payloads de `change`/`submit` do componente. O caminho avançado/modal usa a
|
|
120
|
+
projeção do `PraxisFilterForm` filho ao aplicar e salvar, em vez de ler valores raw
|
|
121
|
+
que podem conter strings de UI ou campos com política de omissão. O merge com
|
|
122
|
+
`initialDto` para um atalho é novamente projetado para não restaurar campos
|
|
123
|
+
omitidos. Campos sempre visíveis e avançados seguem a mesma regra; salvar um
|
|
124
|
+
atalho não altera o contrato do backend.
|
|
125
|
+
|
|
126
|
+
Grupos inválidos/pendentes ou tokens fora do tipo/enum não emitem busca nem atalho,
|
|
127
|
+
e um debounce anterior também precisa respeitar o estado atual. Preserve o
|
|
128
|
+
rascunho para correção. Sem filtros ativos, o DTO vazio pode representar limpeza;
|
|
129
|
+
não transformar o status `DISABLED` desse grupo vazio em bloqueio de clear. Essas
|
|
130
|
+
regras não tornam `contextChange` um DTO: somente sua propriedade `filter` contém
|
|
131
|
+
a consulta; labels e metadata permanecem evidência de apresentação.
|
|
132
|
+
|
|
111
133
|
### 2. Configurar `advancedFilters.settings`
|
|
112
134
|
|
|
113
135
|
Essas chaves são as mais importantes na prática:
|
|
@@ -231,6 +253,27 @@ Os eventos principais para integração são:
|
|
|
231
253
|
- `selectedFieldIdsChange`: acompanha customização de campos visíveis;
|
|
232
254
|
- `metaChanged` e `schemaStatusChange`: importantes para observabilidade e reconciliação de schema.
|
|
233
255
|
|
|
256
|
+
### 5. Teleporte da barra de filtros para `<praxis-scope-bar>` ou container externo
|
|
257
|
+
|
|
258
|
+
Em páginas orientadas a recurso (`<praxis-resource-page>` ou `<praxis-crud>`), os filtros inline (`alwaysVisibleFields` / `inlineFields`) e o acionador de filtros avançados podem ser exibidos na barra de ferramentas da tabela (`placement: 'table-toolbar'`, padrão) ou teleportados para dentro do card superior `<praxis-scope-bar>` (`placement: 'scope-bar'` ou `scopeBar.includeInlineFilters: true`):
|
|
259
|
+
|
|
260
|
+
```ts
|
|
261
|
+
export const FOLHA_PAGAMENTO_CRUD_METADATA: CrudMetadata = {
|
|
262
|
+
component: 'praxis-crud',
|
|
263
|
+
resource: { path: 'human-resources/folhas-pagamento', idField: 'id' },
|
|
264
|
+
filterBar: {
|
|
265
|
+
placement: 'scope-bar',
|
|
266
|
+
inlineFields: ['mesBetween', 'anoBetween', 'funcionarioId', 'salarioLiquidoBetween'],
|
|
267
|
+
},
|
|
268
|
+
// ...
|
|
269
|
+
};
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Quando `placement: 'scope-bar'` está ativo:
|
|
273
|
+
- O `<praxis-table>` ativa `filterTeleport`, suprimindo a renderização duplicada na toolbar interna e expondo o `TemplateRef` reativo via `filterTemplateSignal`.
|
|
274
|
+
- O `<praxis-resource-page>` projeta `<praxis-filter-outlet scope-bar-filters [target]="crudSurface()" />` na segunda faixa dedicada (`.prx-scope-bar__filters`) do `<praxis-scope-bar>`.
|
|
275
|
+
- Os chips de escopo rápido (`quickFilters`) e os controles inline operam sobre o mesmo DTO de filtro com sincronização bidirecional (`filterCriteriaChange`), preservando filtros ortogonais preenchidos pelo operador ao alternar entre escopos rápidos.
|
|
276
|
+
|
|
234
277
|
## Exemplo mental de integração
|
|
235
278
|
|
|
236
279
|
O fluxo típico é:
|
|
@@ -33,7 +33,6 @@ related_docs:
|
|
|
33
33
|
- "dynamic-filter-range-filters-guide"
|
|
34
34
|
- "dynamic-fields-inline-components-guide"
|
|
35
35
|
- "dynamic-fields-inline-filter-runtime-contract"
|
|
36
|
-
- "table-overview"
|
|
37
36
|
keywords:
|
|
38
37
|
- "submit"
|
|
39
38
|
- "change"
|
|
@@ -42,11 +41,9 @@ keywords:
|
|
|
42
41
|
source_of_truth:
|
|
43
42
|
- "projects/praxis-table/src/lib/components/praxis-filter/praxis-filter.component.ts"
|
|
44
43
|
- "projects/praxis-table/src/lib/components/praxis-filter/praxis-filter.component.spec.ts"
|
|
45
|
-
- "
|
|
46
|
-
- "
|
|
47
|
-
|
|
48
|
-
- "../praxis-metadata-starter/docs/guides/FILTROS-E-PAGINACAO.md"
|
|
49
|
-
last_updated: "2026-03-07"
|
|
44
|
+
- "projects/praxis-table/src/lib/components/praxis-filter/filter-payload-projection.ts"
|
|
45
|
+
- "projects/praxis-core/src/lib/helpers/scalar-array-value.ts"
|
|
46
|
+
last_updated: "2026-10-27"
|
|
50
47
|
---
|
|
51
48
|
|
|
52
49
|
# Dynamic Filter Payload Contract
|
|
@@ -131,6 +128,32 @@ Aspectos relevantes do runtime:
|
|
|
131
128
|
- estado avançado e preferências visuais podem ser persistidos localmente;
|
|
132
129
|
- aliases inline e metadata overrides influenciam a UI, mas não devem gerar um contrato HTTP arbitrário.
|
|
133
130
|
|
|
131
|
+
### Arrays escalares, enum e campos omitidos
|
|
132
|
+
|
|
133
|
+
O schema de operação pode publicar um array escalar com `items`, por exemplo
|
|
134
|
+
`{ "type": ["array", "null"], "items": { "type": "integer" } }` para um operando
|
|
135
|
+
`IN`. Core conserva `FieldScalarItemsSchema` em `FieldMetadata.items`; o mesmo
|
|
136
|
+
`normalizeScalarArrayValue` valida e converte tokens na projeção do payload.
|
|
137
|
+
`array.itemSchema.fields`, usado para coleções de objetos, é um contrato distinto.
|
|
138
|
+
|
|
139
|
+
A projeção interna de Table alcança os campos sempre visíveis, o painel avançado,
|
|
140
|
+
`change`, `submit` e atalhos salvos. Ela conserva o shape flat ou aninhado do DTO,
|
|
141
|
+
aplica `submitPolicy: "omit"` e as constraints `items`/`enumValues` publicadas, sem
|
|
142
|
+
modificar o rascunho. Para um request com container, o payload pode ser
|
|
143
|
+
`{ "customFields": { "years": [2024, 2025, 2026] } }`; números não viram datas por
|
|
144
|
+
terem três posições e labels não viram valores de consulta.
|
|
145
|
+
|
|
146
|
+
Tokens inválidos, valor fora do enum e grupos inválidos/pendentes impedem a emissão,
|
|
147
|
+
inclusive de um debounce agendado antes da invalidez. Não há descarte parcial de
|
|
148
|
+
itens inválidos. `null`/ausência do container e `[]` opcionais não significam que um
|
|
149
|
+
item `null` seja válido. Um grupo sem filtros ativos e `DISABLED` pode produzir a
|
|
150
|
+
limpeza intencional do filtro; isso não equivale a autorizar emissão de um grupo
|
|
151
|
+
com campos ativos inválidos.
|
|
152
|
+
|
|
153
|
+
O host deve consumir a projeção emitida, não reconstruir o DTO a partir de
|
|
154
|
+
`getRawValue()`, chips ou labels. O backend continua validando o DTO e a operação;
|
|
155
|
+
validação no browser não concede autorização nem certifica execução da consulta.
|
|
156
|
+
|
|
134
157
|
### 2. Envio HTTP
|
|
135
158
|
|
|
136
159
|
O host é responsável por:
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Table em páginas governadas
|
|
2
|
+
|
|
3
|
+
O adapter do owner mantém `definition.inputs.config` como a única fonte de configuração do filho.
|
|
4
|
+
A página guarda autoria; o documento nativo é reconstruído a partir desses inputs. A projeção de
|
|
5
|
+
execução é transitória e nunca deve ser gravada de volta no documento da página.
|
|
6
|
+
|
|
7
|
+
O perfil inicial vem do contrato P0 `page-publication-p0` de `praxis-config-starter` (PR #506).
|
|
8
|
+
Core valida estrutura, referências, limites e exige validators dos owners. Este adapter valida o
|
|
9
|
+
perfil nativo local; não autoriza uma fonte, registra uma seed ou substitui a admissão no servidor.
|
|
10
|
+
|
|
11
|
+
`decodeTablePageInputs` reconstrói `praxis.table.editor` v1 com config e somente os bindings
|
|
12
|
+
presentes (`resourcePath`, `horizontalScroll`). `resourcePath: null` é desconexão explícita;
|
|
13
|
+
ausência não é desconexão. Config precisa ser autoria compacta: `columns: []` e
|
|
14
|
+
`columnProjection.source: 'schema'`. Null em qualquer nível de config é negado.
|
|
15
|
+
|
|
16
|
+
`encodeTablePageInputs` é a projeção inversa sem defaults. Campos fora do perfil,
|
|
17
|
+
blocos vazios sem representação nos inputs, identidade/storage e dados de execução recebem
|
|
18
|
+
diagnóstico. O adapter não filtra silenciosamente autoria incompatível.
|
|
19
|
+
|
|
20
|
+
`projectTablePageEditorChanges(authoredInputs, editorBaseline, editorValue)` aplica apenas
|
|
21
|
+
deltas explícitos sobre a autoria original usando o reconciliador nativo do owner. Capture o
|
|
22
|
+
baseline após a normalização/montagem do editor e preserve-o durante aquela sessão. Alterar
|
|
23
|
+
bindings ou contexto do mesmo widget retorna `seed.replacement-required`; a página precisa
|
|
24
|
+
substituir o widget com nova key e nova fonte admitida. A API de projeção altera somente o draft
|
|
25
|
+
que o chamador recebe; ela não salva preferências nem persiste a página.
|
|
26
|
+
|
|
27
|
+
`materializeTablePageRuntimeInputs(inputs, pageId, widgetKey)` usa o helper canônico Core para
|
|
28
|
+
identidades `page:<pageId>:widget:<widgetKey>`, projeta `configPersistenceStrategy: 'volatile'`
|
|
29
|
+
e desabilita customização/copiloto independentes no filho. Submit e dados continuam nos contratos
|
|
30
|
+
de domínio existentes. Não existe input runtime `authoringDocument`.
|
|
31
|
+
|
|
32
|
+
A estratégia `volatile` impede leitura, gravação e limpeza de preferências próprias e conexão
|
|
33
|
+
persistida. Table também repassa o `disablePersistence` existente ao filtro embutido e impede
|
|
34
|
+
reset por chave do filtro; largura, densidade e outros ajustes não escrevem preferências.
|
|
35
|
+
Defaults visuais/materializações transitórias permanecem internos ao runtime e ao editor.
|
|
36
|
+
|
|
37
|
+
Limites: JSON lossless, 256 KiB UTF-8 e profundidade 64 pelo helper Core compartilhado; o documento
|
|
38
|
+
integral da página também tem o mesmo orçamento. Não há host publicado, endpoint de publicação,
|
|
39
|
+
fonte admitida, banco ou release novos neste incremento. A integração Page Builder/host governado
|
|
40
|
+
é trabalho posterior; os wrappers comuns continuam atendendo os fluxos não governados existentes.
|
|
41
|
+
|
|
42
|
+
`volatile` também exclui overlays pessoais de configuração global nos defaults/estado de autoria
|
|
43
|
+
que o owner consome. A instância compartilhada `GlobalConfigService` pode ler sua chave global;
|
|
44
|
+
isso não é prova de zero leitura na aplicação. Tenant, cache, locale e CSP continuam infraestrutura
|
|
45
|
+
do host. O gate comprova ausência de I/O nas chaves do filho e ausência de influência da autoria
|
|
46
|
+
pessoal sobre a configuração publicada. Em Table, `TableDefaultsProvider.getDefaults(id,
|
|
47
|
+
{ includeGlobal: false })` preserva defaults nativos sem duplicá-los; mudanças globais e reset
|
|
48
|
+
seguem a mesma política, inclusive o fallback de timezone usado em regras JSON Logic.
|
|
49
|
+
|
|
50
|
+
Native Table diagnostics historically use dot paths without escaping dynamic override field names.
|
|
51
|
+
For those diagnostics, the page adapter deliberately points to the exact `columnProjection.overrides`
|
|
52
|
+
ancestor rather than inventing a JSON Pointer by splitting a field such as `a.b` or `a[0]`.
|
|
53
|
+
The diagnostic code still names the rejected native constraint.
|
|
54
|
+
|
|
55
|
+
Respostas e filas de preferências capturam a geração, a identidade e a estratégia do filho. Trocar identidade, documento ou estratégia (inclusive A → volatile → A), ou destruir a instância, invalida a continuação antiga antes do próximo I/O ou da materialização. Uma requisição já enviada não é cancelada retroativamente. Respostas tardias de erro também passam pelo mesmo fence.
|
|
@@ -11,6 +11,27 @@ Regras de conflito:
|
|
|
11
11
|
- `resourcePath` + `data` ao mesmo tempo resolve para `remote`.
|
|
12
12
|
- Limpar `document.bindings.resourcePath` no documento autorado é a forma explícita de remover a conexão remota via editor.
|
|
13
13
|
|
|
14
|
+
## Estratégia contextual de paginação e ordenação
|
|
15
|
+
|
|
16
|
+
`pagination.strategy` e `sorting.strategy` são opcionais. Quando ausentes, o
|
|
17
|
+
runtime usa `server` para uma origem remota e `client` para dados locais. Os
|
|
18
|
+
defaults compartilhados e o reset dos editores preservam essa ausência; não
|
|
19
|
+
transformam uma configuração parcial em uma escolha explícita de cliente.
|
|
20
|
+
|
|
21
|
+
Os editores apresentam **Automática (pela fonte de dados)**. Essa opção
|
|
22
|
+
remove a propriedade do documento. As únicas estratégias públicas continuam
|
|
23
|
+
sendo `client` e `server`; não existe um valor serializado `auto`. Uma escolha
|
|
24
|
+
explícita é preservada, respeitando as restrições e diagnostics do modo local.
|
|
25
|
+
Uma operação parcial de authoring que omite a estratégia mantém uma escolha
|
|
26
|
+
anterior; omissão em um patch não significa limpar essa escolha.
|
|
27
|
+
|
|
28
|
+
Na paginação remota, o total vem da resposta do backend. O paginator e o sort
|
|
29
|
+
cliente do `MatTableDataSource` não devem ser anexados nessa estratégia, pois
|
|
30
|
+
seus callbacks assíncronos podem substituir o total pela quantidade de registros
|
|
31
|
+
da página e voltar o índice para zero. A prova deve aguardar esses callbacks e
|
|
32
|
+
as materializações de capabilities, navegar à segunda página e confirmar que o
|
|
33
|
+
total e o intervalo continuam corretos. Uma captura intermediária não basta.
|
|
34
|
+
|
|
14
35
|
## Ciclo da primeira consulta remota
|
|
15
36
|
|
|
16
37
|
Quando `resourcePath`, `config` e `queryContext` chegam no primeiro ciclo de inputs, o
|