@praxisui/dynamic-form 8.0.0-beta.19 → 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 +15 -4
- package/docs/dynamic-form-authoring-document-semantics.md +80 -0
- package/docs/dynamic-form-llm-rule-authoring-guide.md +313 -0
- package/docs/dynamic-form-rules-authoring-plan.md +369 -0
- package/docs/hot-metadata-updates.md +141 -0
- package/docs/layout-items-visual-blocks.md +406 -0
- package/fesm2022/praxisui-dynamic-form.mjs +482 -15
- package/index.d.ts +25 -2
- package/package.json +12 -6
- package/src/lib/components/praxis-form-actions/praxis-form-actions.json-api.md +441 -0
- package/src/lib/config-editor/praxis-dynamic-form-config-editor.json-api.md +480 -0
- package/src/lib/filter-form/praxis-filter-form.json-api.md +507 -0
- package/src/lib/json-config-editor/form-json-config-editor.json-api.md +491 -0
- package/src/lib/layout-editor/praxis-layout-editor.json-api.md +432 -0
- package/src/lib/praxis-dynamic-form.json-api.md +955 -0
|
@@ -0,0 +1,955 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "praxis-dynamic-form JSON API (Canonical)"
|
|
3
|
+
slug: "praxis-dynamic-form-json-api"
|
|
4
|
+
doc_type: "api-reference"
|
|
5
|
+
component: "praxis-dynamic-form"
|
|
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 componente praxis-dynamic-form."
|
|
11
|
+
category: "components"
|
|
12
|
+
sub_category: "dynamic-form"
|
|
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-dynamic-form/src/lib/praxis-dynamic-form.ts"
|
|
22
|
+
- "projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.html"
|
|
23
|
+
- "projects/praxis-dynamic-form/src/lib/config-editor/praxis-dynamic-form-config-editor.ts"
|
|
24
|
+
- "projects/praxis-dynamic-form/src/lib/utils/prepare-submit-payload.ts"
|
|
25
|
+
- "projects/praxis-dynamic-fields/src/lib/directives/dynamic-field-loader.directive.ts"
|
|
26
|
+
- "projects/praxis-dynamic-fields/src/lib/components/editable-collection/editable-collection.component.ts"
|
|
27
|
+
- "projects/praxis-core/src/lib/models/form/form-config.model.ts"
|
|
28
|
+
- "projects/praxis-core/src/lib/models/form/form-layout.model.ts"
|
|
29
|
+
- "projects/praxis-core/src/lib/services/schema-normalizer.service.ts"
|
|
30
|
+
- "projects/praxis-core/src/lib/services/dynamic-form.service.ts"
|
|
31
|
+
- "projects/praxis-core/src/lib/models/form/rule-property.schema.ts"
|
|
32
|
+
- "projects/praxis-dynamic-form/docs/layout-items-visual-blocks.md"
|
|
33
|
+
source_of_truth_last_verified: "2026-04-18"
|
|
34
|
+
last_updated: "2026-04-22"
|
|
35
|
+
toc: true
|
|
36
|
+
sidebar: true
|
|
37
|
+
tags:
|
|
38
|
+
- "json-api"
|
|
39
|
+
- "canonical-contract"
|
|
40
|
+
- "praxis-dynamic-form"
|
|
41
|
+
api_stability: "canonical"
|
|
42
|
+
schema_verified: true
|
|
43
|
+
runtime_verified: true
|
|
44
|
+
editor_coverage_verified: true
|
|
45
|
+
runtime_scope: "public"
|
|
46
|
+
legacy_paths_present: false
|
|
47
|
+
has_known_mismatches: false
|
|
48
|
+
related_components: []
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
# praxis-dynamic-form
|
|
52
|
+
|
|
53
|
+
Este documento e a referencia canonica da API JSON de praxis-dynamic-form.
|
|
54
|
+
|
|
55
|
+
## Summary
|
|
56
|
+
|
|
57
|
+
- Tipo documental: API reference canonica de contrato JSON.
|
|
58
|
+
- Source of truth: runtime e codigo declarados no frontmatter.
|
|
59
|
+
- Objetivo operacional: consulta rapida, auditavel e deterministica sob pressao.
|
|
60
|
+
- Resumo funcional herdado: Referencia canonica da JSON API do `praxis-dynamic-form`, com foco em:
|
|
61
|
+
|
|
62
|
+
## Canonical authoring semantics
|
|
63
|
+
|
|
64
|
+
- `DynamicFormAuthoringDocument` e o snapshot canonico completo de autoria de `praxis-dynamic-form`.
|
|
65
|
+
- Quando aplicado por fluxos canonicos de editor, `config`, `bindings` e `contextSnapshot` possuem semantica `replace-all`.
|
|
66
|
+
- Ausencia de `bindings.mode` limpa o binding persistido e restaura o modo default efetivo do host.
|
|
67
|
+
- Ausencia de `backConfig`, `presentation` ou `schemaPrefs` no documento canonico significa remocao explicita do bloco ausente.
|
|
68
|
+
- `backConfig`, `presentation` e `schemaPrefs` permanecem fora de `FormConfig`, mas fazem parte oficialmente do documento autoral persistivel em `contextSnapshot`.
|
|
69
|
+
- APIs de compatibilidade como `applyConfigFromAdapter(...)` continuam aceitando payloads legados/parciais com semantica `merge-compat`, preservando campos nao informados.
|
|
70
|
+
|
|
71
|
+
## Scope and positioning
|
|
72
|
+
|
|
73
|
+
- Escopo: contrato JSON publico e limites de comportamento observavel.
|
|
74
|
+
- Fora de escopo: tutorial de adocao e walkthrough operacional detalhado.
|
|
75
|
+
- Posicionamento: referencia canonicamente governada para consumidores, arquitetos e mantenedores.
|
|
76
|
+
|
|
77
|
+
## Source of truth
|
|
78
|
+
|
|
79
|
+
| Source | Kind | Notes |
|
|
80
|
+
| --- | --- | --- |
|
|
81
|
+
| projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.ts | runtime-code | Source de implementacao declarado no repositorio. |
|
|
82
|
+
| projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.html | template-style | Source de implementacao declarado no repositorio. |
|
|
83
|
+
| projects/praxis-dynamic-form/src/lib/config-editor/praxis-dynamic-form-config-editor.ts | runtime-code | Source de implementacao declarado no repositorio. |
|
|
84
|
+
| projects/praxis-dynamic-fields/src/lib/directives/dynamic-field-loader.directive.ts | runtime-code | Source de implementacao declarado no repositorio. |
|
|
85
|
+
| projects/praxis-core/src/lib/models/form/form-config.model.ts | runtime-code | Source de implementacao declarado no repositorio. |
|
|
86
|
+
| projects/praxis-core/src/lib/models/form/form-layout.model.ts | runtime-code | Source de implementacao declarado no repositorio. |
|
|
87
|
+
|
|
88
|
+
## Support legend
|
|
89
|
+
|
|
90
|
+
- Active: suportado e observado no runtime atual.
|
|
91
|
+
- Partial: suporte parcial, com restricoes conhecidas.
|
|
92
|
+
- Declared-only: declarado em tipos/schema sem ligacao runtime confirmada.
|
|
93
|
+
- Schema-only: presente em schema/modelo sem confirmacao de execucao.
|
|
94
|
+
- Deprecated: mantido por compatibilidade legada com migracao prevista.
|
|
95
|
+
|
|
96
|
+
## Contract classification
|
|
97
|
+
|
|
98
|
+
### Canonical paths (public contract)
|
|
99
|
+
|
|
100
|
+
| Path | Type | Required | Default | Status | Notes |
|
|
101
|
+
| --- | --- | --- | --- | --- | --- |
|
|
102
|
+
| `sections[]` | not-specified | not-specified | n/a | Active | Render estrutural principal (section/row/column). |
|
|
103
|
+
| `fieldMetadata[]` | not-specified | not-specified | n/a | Active | Fonte de campos para `DynamicFieldLoader`. |
|
|
104
|
+
| `metadata` | not-specified | not-specified | n/a | Active | Usado em reconciliacao/snapshot/status de schema. |
|
|
105
|
+
| `actions` | not-specified | not-specified | n/a | Active | Render de `praxis-form-actions` e roteamento de eventos. |
|
|
106
|
+
| `behavior` | not-specified | not-specified | n/a | Partial | Subset funcional (detalhado abaixo). |
|
|
107
|
+
| `api` | not-specified | not-specified | n/a | Declared-only | Declarado no modelo; sem binding operacional direto no runtime atual. |
|
|
108
|
+
| `messages` | not-specified | not-specified | n/a | Partial | Chaves principais de submit/confirmacao usadas; contrato e mais amplo. |
|
|
109
|
+
| `formRules` | not-specified | not-specified | n/a | Active | Aplicadas no pipeline de regras do runtime. |
|
|
110
|
+
| `formRulesState` | not-specified | not-specified | n/a | Active | Persistido para round-trip do builder visual. |
|
|
111
|
+
| `hooks` | not-specified | not-specified | n/a | Active | Integracao de ciclo (before/after) via runtime de hooks. |
|
|
112
|
+
| `hints` | not-specified | not-specified | n/a | Declared-only | Mantido no contrato/editor; sem render dedicado no template principal. |
|
|
113
|
+
| `fieldMetadata[].array` | `FieldArrayConfig` | No | n/a | Active | Contrato de Editable Collection apenas quando `fieldMetadata[].controlType === "array"` ou quando `x-ui.array` foi publicado explicitamente. |
|
|
114
|
+
|
|
115
|
+
Nota editorial:
|
|
116
|
+
- `praxis-dynamic-form` carrega e orquestra `FieldMetadata`, mas a resolução de `valuePresentation` em display/read-only pertence ao runtime de `@praxisui/dynamic-fields`.
|
|
117
|
+
- `fieldMetadata[].source`, `fieldMetadata[].transient` e `fieldMetadata[].submitPolicy` governam campos locais do host. Campos com `source: "local"` ou `transient: true` participam de validação, regras, visibilidade e `valueChange`, mas são omitidos de `formSubmit.formData` e do payload HTTP por default.
|
|
118
|
+
- `fieldMetadata[].submitPolicy` tem prioridade sobre `source` e `transient`: `include` força envio, `omit` força omissão e `includeWhenDirty` envia apenas quando o controle estiver dirty.
|
|
119
|
+
- Dentro de `array.itemSchema.fields`, `includeWhenDirty` considera o item ou subcampo especifico dirty, como `participantes.0` ou `participantes.0.observacao`. O `FormArray` pai dirty, como `participantes`, nao torna todos os subcampos de todos os itens elegiveis para submit.
|
|
120
|
+
- O evento `formSubmit` mantém `formData` como payload persistível filtrado e expõe `rawFormData` para hosts que precisam ler os campos locais/transientes no contexto de UI.
|
|
121
|
+
- Configs persistidas são reconciliadas com o schema estrutural antes da montagem. Campos locais explícitos são preservados, mas campos server-backed recebem novamente a semântica publicada pelo backend, incluindo `endpoint`, `resourcePath`, `optionLabelKey` e `optionValueKey`.
|
|
122
|
+
- Para selects com `x-ui.endpoint` terminando em `/options/filter`, `endpoint` é a operação concreta de opções e `resourcePath` é o recurso dono. O runtime deve chamar `/options/filter`; não deve converter esse endpoint para `/filter`.
|
|
123
|
+
|
|
124
|
+
### Supported legacy paths
|
|
125
|
+
|
|
126
|
+
Nenhum path legado suportado foi identificado nesta revisão baseada em evidência textual preservada.
|
|
127
|
+
|
|
128
|
+
### Internal-only paths
|
|
129
|
+
|
|
130
|
+
| Path | Internal consumer | Runtime presence | Public support | Notes |
|
|
131
|
+
| --- | --- | --- | --- | --- |
|
|
132
|
+
| `__formConfigKey` (storage key derivado) | persistencia interna (`ASYNC_CONFIG_STORAGE`) | Yes | No | Chave computada por `formId/componentInstanceId`; não faz parte do contrato JSON. |
|
|
133
|
+
| `schema-meta:*` (storage namespace) | verificação de drift de schema | Yes | No | Usado por `verifyServerSchemaVersion()` para status/outdated. |
|
|
134
|
+
|
|
135
|
+
### Experimental paths
|
|
136
|
+
|
|
137
|
+
| Path | Enablement (flag/guard) | Stability | Rollout notes | Notes |
|
|
138
|
+
| --- | --- | --- | --- | --- |
|
|
139
|
+
| `behavior.reactiveValidation` | feature flag no contrato + runtime checks | Partial | Disponível; requer validação de carga para forms grandes | Debounce configurável por `reactiveValidationDebounceMs`. |
|
|
140
|
+
|
|
141
|
+
## Overview
|
|
142
|
+
|
|
143
|
+
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.
|
|
144
|
+
|
|
145
|
+
## Public contract surface
|
|
146
|
+
|
|
147
|
+
### Top-level configuration blocks
|
|
148
|
+
|
|
149
|
+
| Block | Purpose | Required | Merge strategy | Notes |
|
|
150
|
+
| --- | --- | --- | --- | --- |
|
|
151
|
+
| `sections[]` | Estrutura principal de layout (section/row/column) | Yes | replace-array | Base para render e ordenação visual. |
|
|
152
|
+
| `fieldMetadata[]` | Definição dos campos e componentes dinâmicos | Yes | replace-array | Consumido por `DynamicFieldLoaderDirective`. |
|
|
153
|
+
| `metadata` | Metadados de versão/origem/schema | No | deep-merge | Usado em status, drift e rastreabilidade. |
|
|
154
|
+
| `actions` | Ações de formulário (submit/cancel/custom) | No | deep-merge | Roteadas para outputs e confirmação condicional. |
|
|
155
|
+
| `behavior` | Regras de UX/validação/edição | No | deep-merge | Inclui confirmação em dirty, validação reativa e overlays. |
|
|
156
|
+
| `messages` | Mensagens de UX e feedback | No | deep-merge | Fallback para mensagens default quando ausente. |
|
|
157
|
+
| `formRules` | Regras declarativas de runtime | No | replace-array | Aplicadas no pipeline de `rulesService`. |
|
|
158
|
+
| `hooks` | Hooks before/after por estágio | No | replace-array per stage | `@Input() hooks` pode sobrescrever `config.hooks`. |
|
|
159
|
+
|
|
160
|
+
### Nested configuration blocks
|
|
161
|
+
|
|
162
|
+
| Path | Type | Required | Default | Constraints | Notes |
|
|
163
|
+
| --- | --- | --- | --- | --- | --- |
|
|
164
|
+
| `sections[]` | not-specified | not-specified | n/a | component-defined | Render estrutural principal (section/row/column). |
|
|
165
|
+
| `fieldMetadata[]` | not-specified | not-specified | n/a | component-defined | Fonte de campos para `DynamicFieldLoader`. |
|
|
166
|
+
| `metadata` | not-specified | not-specified | n/a | component-defined | Usado em reconciliacao/snapshot/status de schema. |
|
|
167
|
+
| `actions` | not-specified | not-specified | n/a | component-defined | Render de `praxis-form-actions` e roteamento de eventos. |
|
|
168
|
+
| `behavior` | not-specified | not-specified | n/a | component-defined | Subset funcional (detalhado abaixo). |
|
|
169
|
+
| `api` | not-specified | not-specified | n/a | component-defined | Declarado no modelo; sem binding operacional direto no runtime atual. |
|
|
170
|
+
| `messages` | not-specified | not-specified | n/a | component-defined | Chaves principais de submit/confirmacao usadas; contrato e mais amplo. |
|
|
171
|
+
| `formRules` | not-specified | not-specified | n/a | component-defined | Aplicadas no pipeline de regras do runtime. |
|
|
172
|
+
| `formRulesState` | not-specified | not-specified | n/a | component-defined | Persistido para round-trip do builder visual. |
|
|
173
|
+
| `hooks` | not-specified | not-specified | n/a | component-defined | Integracao de ciclo (before/after) via runtime de hooks. |
|
|
174
|
+
| `sections[].sectionHeader` | `FormSectionHeaderConfig` | No | n/a | Active | Header visual rico da seção com suporte a avatar dinâmico resolvido a partir de `formData`. |
|
|
175
|
+
|
|
176
|
+
### Editable Collection field contract
|
|
177
|
+
|
|
178
|
+
Editable Collection e o contrato publico para listas editaveis de objetos dentro de `fieldMetadata[]`.
|
|
179
|
+
|
|
180
|
+
O runtime trata um campo como Editable Collection somente quando o campo declara `controlType: "array"` ou quando a metadata veio com `array` explicitamente. Um schema OpenAPI com `type: "array"` usado por controles simples, como `chipInput` ou `multiSelect`, nao deve receber `fieldMetadata[].array` por normalizacao implicita.
|
|
181
|
+
|
|
182
|
+
Subconjunto suportado no beta atual:
|
|
183
|
+
|
|
184
|
+
| Path | Type | Required | Default | Status | Notes |
|
|
185
|
+
| --- | --- | --- | --- | --- | --- |
|
|
186
|
+
| `fieldMetadata[].controlType` | `"array"` | Yes | n/a | Active | Seleciona `pdx-editable-collection` via Dynamic Fields. |
|
|
187
|
+
| `fieldMetadata[].array.itemType` | `"object"` | Yes | `"object"` | Active | O MVP monta cada item como `FormGroup`. Arrays simples usam controles proprios, nao Editable Collection. |
|
|
188
|
+
| `fieldMetadata[].array.mode` | `"cards"` | No | `"cards"` | Active | Primeiro renderizador oficial. Modos `table`, `drawer`, `accordion`, `wizard`, `chips` permanecem fora do contrato beta. |
|
|
189
|
+
| `fieldMetadata[].array.itemSchemaRef` | `string` | Conditional | n/a | Active | Referencia OpenAPI do DTO de item quando publicada pelo backend. |
|
|
190
|
+
| `fieldMetadata[].array.itemSchema.fields` | `FieldMetadata[]` | Conditional | `[]` | Active | Metadata resolvida/inline usada para criar os subcontroles do item. |
|
|
191
|
+
| `fieldMetadata[].array.itemIdentityField` | `string` | No | n/a | Active | Preserva identidade de item existente quando o valor inicial contem o campo. |
|
|
192
|
+
| `fieldMetadata[].array.minItems` | `number` | No | n/a | Active | Validador agregado do `FormArray`. |
|
|
193
|
+
| `fieldMetadata[].array.maxItems` | `number` | No | n/a | Active | Validador agregado e limite operacional de adicao. |
|
|
194
|
+
| `fieldMetadata[].array.operations.add` | `boolean` | No | `true` | Active | Governanca metadata-driven da acao adicionar. |
|
|
195
|
+
| `fieldMetadata[].array.operations.edit` | `boolean` | No | `true` | Active | Quando falso, subcampos de item entram em modo somente leitura. |
|
|
196
|
+
| `fieldMetadata[].array.operations.remove` | `boolean` | No | `true` | Active | Governanca metadata-driven da acao remover. |
|
|
197
|
+
| `fieldMetadata[].array.deleteMode` | `"removeFromPayload"` | No | `"removeFromPayload"` | Active | Remocao exclui a linha do array final em `formSubmit.formData`. |
|
|
198
|
+
| `fieldMetadata[].array.collectionValidation.uniqueBy` | `string[]` | No | n/a | Active | Detecta duplicidade somente em chaves completas; linhas incompletas nao geram erro prematuro. |
|
|
199
|
+
| `fieldMetadata[].array.collectionValidation.exactlyOne` | `{ field, value, message? }` | No | n/a | Active | Exige exatamente um item com valor tipado estritamente igual. |
|
|
200
|
+
| `fieldMetadata[].array.collectionValidation.atLeastOne` | `{ field, value, message? }` | No | n/a | Active | Exige pelo menos um item com valor tipado estritamente igual. |
|
|
201
|
+
|
|
202
|
+
O host deve persistir `formSubmit.formData` para fluxos normais. `formSubmit.rawFormData` existe para auditoria, diagnostico e hooks de UI, mas nao substitui o payload normalizado.
|
|
203
|
+
|
|
204
|
+
### Input bindings
|
|
205
|
+
|
|
206
|
+
`initialValue` is an active component input for host-authored or complementary
|
|
207
|
+
field values. The runtime applies it as local initial state without redefining
|
|
208
|
+
the canonical remote entity loaded through `resourcePath` and `resourceId`.
|
|
209
|
+
|
|
210
|
+
| Binding/Path | Type | Required | Source | Runtime normalization | Notes |
|
|
211
|
+
| --- | --- | --- | --- | --- | --- |
|
|
212
|
+
| `config` | `FormConfig` | Conditional | component-input | `normalizeFormConfig(config)` | Contrato principal quando fornecido diretamente pelo host. |
|
|
213
|
+
| `resourcePath` | `string \| undefined` | Conditional | component-input | `crud.configure(resourcePath)` | Endpoint base para schema e dados remotos. Alternativa canônica: `schemaUrl` explícito. |
|
|
214
|
+
| `resourceId` | `string \| number \| undefined` | No | component-input | update `pendingEntityId` + `loadEntity()` | Carrega entidade em modo `edit/view`. |
|
|
215
|
+
| `mode` | `'create' \| 'edit' \| 'view'` | No | component-input/storage | persistido em `formInputsKey` | Preferência de modo pode ser hidratada do storage. |
|
|
216
|
+
| `schemaSource` | `'resource' \| 'filter'` | No | component-input | runtime branch | Seleciona caminho de obtenção de schema quando `schemaUrl` não é informado. |
|
|
217
|
+
| `schemaUrl` | `string \| null \| undefined` | Conditional | component-input | parsed as `/schemas/filtered` contract | Fonte canônica explícita para inicialização schema-backed sem depender de `resourcePath`. |
|
|
218
|
+
| `submitUrl` | `string \| null \| undefined` | Conditional | component-input | resolved via API origin | URL concreta de submit publicada por surface/action; exige `submitMethod` quando usada para envio HTTP. |
|
|
219
|
+
| `submitMethod` | `'post' \| 'put' \| 'patch' \| null \| undefined` | Conditional | component-input | normalized lowercase | Método HTTP concreto de submit publicado por surface/action; exige `submitUrl` quando usado para envio HTTP. |
|
|
220
|
+
| `responseSchemaUrl` | `string \| null \| undefined` | No | component-input | diagnostic only | Schema de resposta para diagnóstico e follow-up de runtime. |
|
|
221
|
+
| `enableCustomization` | `boolean` | No | component-input | boolean coercion | Alterna UX de edição visual/configuração. |
|
|
222
|
+
| `formId` | `string \| undefined` | Yes (corporate flow) | component-input | component key scoping | Obrigatório para ciclo corporativo com persistência e sync. |
|
|
223
|
+
| `componentInstanceId` | `string \| undefined` | No | component-input | component key scoping | Isola persistência por instância. |
|
|
224
|
+
| `layout` | `FormLayout \| undefined` | No | component-input | apply as runtime override | Override estrutural de layout quando fornecido. |
|
|
225
|
+
| `backConfig` | `BackConfig \| undefined` | No | component-input/storage | precedence over `behavior.confirmOnUnsavedChanges` | Política de retorno/confirm on dirty. |
|
|
226
|
+
| `hooks` | `FormHooksLayout \| undefined` | No | component-input | overrides `config.hooks` | Fonte de hooks prioritária quando presente. |
|
|
227
|
+
| `customEndpoints` | `EndpointConfig` | No | component-input | service-level override | Sobrescreve endpoints do CRUD interno. |
|
|
228
|
+
|
|
229
|
+
### Section header visual contract
|
|
230
|
+
|
|
231
|
+
| Path | Type | Required | Default | Status | Notes |
|
|
232
|
+
| --- | --- | --- | --- | --- | --- |
|
|
233
|
+
| `sections[].icon` | `string` | No | n/a | Active | Ícone estático tradicional da seção; continua suportado. |
|
|
234
|
+
| `sections[].sectionHeader.mode` | `'icon' \| 'avatar-image' \| 'avatar-initials' \| 'auto'` | No | `icon` | Active | Seleciona a estratégia visual do header. |
|
|
235
|
+
| `sections[].sectionHeader.sourceField` | `string` | No | n/a | Active | Field do `formData` usado como origem de foto/avatar. |
|
|
236
|
+
| `sections[].sectionHeader.initialsSourceField` | `string` | No | n/a | Active | Field textual usado para derivar iniciais. |
|
|
237
|
+
| `sections[].sectionHeader.altField` | `string` | No | n/a | Active | Field usado como texto acessível do avatar e fallback textual para iniciais. |
|
|
238
|
+
| `sections[].sectionHeader.fallbackIcon` | `string` | No | `sections[].icon` | Active | Ícone usado quando a fonte dinâmica estiver vazia/inválida. |
|
|
239
|
+
| `sections[].sectionHeader.emptyState` | `'fallback-icon' \| 'placeholder-avatar' \| 'none'` | No | `placeholder-avatar` | Active | Resolve o estado inicial comum em formulários de inclusão com default neutro para qualquer domínio; `fallback-icon` preserva a moldura/avatar e respeita `size`. |
|
|
240
|
+
| `sections[].sectionHeader.size` | `'sm' \| 'md' \| 'lg'` | No | `md` | Active | Tamanho semântico do avatar; o runtime materializa via tokens `--pfx-form-section-avatar-size*`. |
|
|
241
|
+
| `sections[].sectionHeader.initialsMaxLength` | `number` | No | `2` | Active | Limita a quantidade de letras no avatar textual e é normalizado para `1..4`. |
|
|
242
|
+
| `sections[].headerActions` | `FormSectionHeaderAction[]` | No | n/a | Active | Ações iconográficas renderizadas na borda direita do header da seção e emitidas pelo mesmo output `customAction`. |
|
|
243
|
+
| `sections[].headerActions[].id` | `string` | Yes | n/a | Active | Identificador estável da ação usado por rules, host e automações. |
|
|
244
|
+
| `sections[].headerActions[].label` | `string` | Yes | n/a | Active | Label acessível usada como fallback de tooltip e `aria-label`. |
|
|
245
|
+
| `sections[].headerActions[].icon` | `string` | Yes | n/a | Active | Ícone Material/Praxis renderizado no botão do header. |
|
|
246
|
+
| `sections[].headerActions[].action` | `string` | No | `sections[].headerActions[].id` | Active | Nome lógico emitido no `customAction`; quando informado, também é a base para mensagens e rules dessa ação. |
|
|
247
|
+
| `sections[].headerActions[].tooltip` | `string` | No | `sections[].headerActions[].label` | Active | Tooltip opcional da ação do header. |
|
|
248
|
+
| `sections[].headerActions[].color` | `'primary' \| 'accent' \| 'warn' \| 'basic'` | No | `basic` | Active | Tom visual mapeado para `mat-icon-button`. |
|
|
249
|
+
| `sections[].headerActions[].visible` | `boolean` | No | `true` | Active | Permite ocultar a ação no runtime sem removê-la do contrato. |
|
|
250
|
+
| `sections[].headerActions[].disabled` | `boolean` | No | `false` | Active | Trava interação da ação do header. |
|
|
251
|
+
| `sections[].headerActions[].loading` | `boolean` | No | `false` | Active | Renderiza spinner e marca a ação como busy/indisponível enquanto durar o estado de loading. |
|
|
252
|
+
| `sections[].headerActions[].className` | `string` | No | n/a | Active | Classe CSS opcional aplicada ao botão da ação no header. |
|
|
253
|
+
| `sections[].headerActions[].style` | `Record<string, any>` | No | n/a | Active | Estilo inline opcional aplicado ao botão da ação; propriedades inválidas podem ser saneadas pelo pipeline de rules/editor. |
|
|
254
|
+
|
|
255
|
+
- `avatar-image` aceita URL, data URL, `File`, `Blob`, `ArrayBuffer`, views tipadas e objetos com chaves como `url`, `src`, `dataUrl`, `base64` ou `bytes`.
|
|
256
|
+
- `auto` tenta imagem, depois iniciais vindas de `initialsSourceField` ou `altField`, e por fim o `emptyState`.
|
|
257
|
+
- Se nenhum valor estiver disponível ainda, o runtime não falha: aplica `emptyState` e mantém o cabeçalho estável em fluxos `create`.
|
|
258
|
+
- Nas superfícies de authoring da lib, `sections[].headerActions[].action` sugere o catálogo global canônico do core e mantém fallback para valor customizado livre por compatibilidade.
|
|
259
|
+
- Quando a ação global selecionada exigir payload/param obrigatório, o authoring deve sinalizar isso explicitamente ao usuário antes da persistência; no caso de `surface.open`, o authoring canônico usa editor especializado em vez de texto cru.
|
|
260
|
+
- Em `formRules` para `targetType: 'section'`, o builder pode governar tanto `sectionHeader` inteiro quanto subpaths tipados como `sectionHeader.mode`, `sectionHeader.emptyState` e `sectionHeader.size`, além de `headerActions` como objeto agregado.
|
|
261
|
+
- Em `formRules`, `targets` usam IDs canônicos do alvo. Para ações globais de formulário isso continua sendo o ID lógico da action; para ações de header de seção, o ID canônico é `section:<sectionId>:header-action:<actionLogicalId>`, evitando colisão com actions globais do form e entre seções.
|
|
262
|
+
- Se a seção ainda não tiver `id`, o runtime aceita o fallback `header-action:<actionLogicalId>` por compatibilidade; para contratos persistidos, prefira sempre materializar `section.id`.
|
|
263
|
+
|
|
264
|
+
### Visual block rule contract
|
|
265
|
+
|
|
266
|
+
Itens de layout `kind: "richContent"` podem ser alvo de `formRules` com `targetType: "visualBlock"`. O `target` é sempre o `id` do item em `sections[].rows[].columns[].items[]`; o bloco visual não recebe entrada em `fieldMetadata[]`, não cria `FormControl` e não entra em `formSubmit.formData` nem no payload HTTP.
|
|
267
|
+
|
|
268
|
+
Subconjunto público de propriedades suportadas para `targetType: "visualBlock"`:
|
|
269
|
+
|
|
270
|
+
| Propriedade | Tipo | Status | Notes |
|
|
271
|
+
| --- | --- | --- | --- |
|
|
272
|
+
| `visible` / `hidden` | `boolean` | Active | Exibe ou oculta o bloco no runtime. |
|
|
273
|
+
| `layout` | `"block" \| "inline"` | Active | Alterna a apresentação do item quando o layout aceita a variação. |
|
|
274
|
+
| `className` / `rootClassName` | `string` | Active | Aplica classes controladas pelo host/design system. |
|
|
275
|
+
| `style` | `Record<string, any>` | Active | Estilo visual saneado pelo pipeline de regras/runtime. |
|
|
276
|
+
| `text` | `string` | Active | Sobrescreve texto apenas em documento simples ou node textual seguro. |
|
|
277
|
+
| `title` | `string` | Active | Sobrescreve título apenas em documento simples, card/media/timeline suportado ou node identificado. |
|
|
278
|
+
| `message` | `string` | Active | Sobrescreve mensagem apenas em documento simples, card/media suportado ou node identificado. |
|
|
279
|
+
| `textNodeId` / `titleNodeId` / `messageNodeId` | `string` | Active | Seleciona explicitamente o node que receberá `text`, `title` ou `message`; o editor deve tratar como detalhe técnico guiado por seletor. |
|
|
280
|
+
|
|
281
|
+
Exemplo canônico:
|
|
282
|
+
|
|
283
|
+
```json
|
|
284
|
+
{
|
|
285
|
+
"formRules": [
|
|
286
|
+
{
|
|
287
|
+
"id": "employee-guidance-by-status",
|
|
288
|
+
"targetType": "visualBlock",
|
|
289
|
+
"targets": ["employee-guidance-block"],
|
|
290
|
+
"effect": {
|
|
291
|
+
"condition": { "===": [{ "var": "ativo" }, false] },
|
|
292
|
+
"properties": {
|
|
293
|
+
"title": "Revise a inativação",
|
|
294
|
+
"titleNodeId": "custom-title",
|
|
295
|
+
"message": "Informe justificativa antes de salvar.",
|
|
296
|
+
"messageNodeId": "custom-message",
|
|
297
|
+
"className": "employee-guidance-warning"
|
|
298
|
+
},
|
|
299
|
+
"propertiesWhenFalse": {
|
|
300
|
+
"title": "Cadastro ativo",
|
|
301
|
+
"titleNodeId": "custom-title",
|
|
302
|
+
"message": "Mantenha os dados funcionais atualizados.",
|
|
303
|
+
"messageNodeId": "custom-message",
|
|
304
|
+
"className": "employee-guidance-success"
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
]
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
Limites de segurança:
|
|
313
|
+
|
|
314
|
+
- `text`, `title` e `message` não aceitam HTML arbitrário, handlers, scripts ou substituição completa do `RichContentDocument`.
|
|
315
|
+
- Em documentos compostos, prefira sempre `textNodeId`, `titleNodeId` ou `messageNodeId`; sem node explícito, o runtime só aplica override quando encontra alvo simples ou convencional seguro.
|
|
316
|
+
- Regras de `visualBlock` são visual-only. Use campo local (`fieldMetadata[].source: "local"`) quando a experiência precisar de valor, validação de campo, leitura em `rawFormData` ou participação explícita no payload via `submitPolicy`.
|
|
317
|
+
|
|
318
|
+
### Output events
|
|
319
|
+
|
|
320
|
+
| Event | Payload | Trigger | Stability | Notes |
|
|
321
|
+
| --- | --- | --- | --- | --- |
|
|
322
|
+
| `formSubmit` | `FormSubmitEvent` | Submit validado do formulario. | Partial | `formData` e o payload persistivel filtrado; `rawFormData` preserva o valor completo do formulario, incluindo campos locais/transientes. |
|
|
323
|
+
| `formCancel` | `void` | Acao cancelar. | Partial | Preservado da documentação anterior. |
|
|
324
|
+
| `formReset` | `void` | Acao reset. | Partial | Preservado da documentação anterior. |
|
|
325
|
+
| `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. | Partial | Preservado da documentação anterior. |
|
|
326
|
+
| `formReady` | `FormReadyEvent` | Form pronto para interacao. | Partial | Preservado da documentação anterior. |
|
|
327
|
+
| `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. | Partial | Preservado da documentação anterior. |
|
|
328
|
+
| `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. | Partial | Preservado da documentação anterior. |
|
|
329
|
+
| `initializationError` | `FormInitializationError` | Falha de inicializacao. | Partial | Preservado da documentação anterior. |
|
|
330
|
+
| `loadingStateChange` | `LoadingState` | Mudanca de loading (`config/schema/render/data`). | Partial | Preservado da documentação anterior. |
|
|
331
|
+
| `enableCustomizationChange` | `boolean` | Alternancia do modo de customizacao. | Partial | Preservado da documentação anterior. |
|
|
332
|
+
| `ruleDiagnosticsChange` | `RuleApplicationDiagnostic[]` | Mudanca nos diagnosticos de aplicacao de `formRules` no runtime. | Active | Emite somente quando a assinatura dos diagnosticos muda; hosts podem exibir alerta, bloquear publicacao ou enviar telemetria. |
|
|
333
|
+
| `customAction` | `FormCustomActionEvent` | Acao custom definida no contrato ou ação do header de seção. | Partial | `source` pode ser `button`, `shortcut` ou `section-header`; quando vier de header, o payload inclui `sectionId`. |
|
|
334
|
+
| `actionConfirmation` | `FormActionConfirmationEvent` | Pedido de confirmacao de acao sensivel. | Partial | Preservado da documentação anterior. |
|
|
335
|
+
|
|
336
|
+
### External side channels
|
|
337
|
+
|
|
338
|
+
| Channel | Direction | Contract | Failure mode | Notes |
|
|
339
|
+
| --- | --- | --- | --- | --- |
|
|
340
|
+
| `ASYNC_CONFIG_STORAGE` | bidirectional | `loadConfig/saveConfig/clearConfig` | fail-open | Persistência de config, prefs de input e status de schema. |
|
|
341
|
+
| `CONNECTION_STORAGE` | bidirectional | `loadConnection/saveConnection` | fail-open | Hidrata/salva `resourcePath` quando não vem por input. |
|
|
342
|
+
| `SettingsPanelService` | bidirectional | `open(...).applied$/saved$` | fail-open | Atualiza config em runtime sem recarregar host. |
|
|
343
|
+
| `GenericCrudService` | outbound I/O | `configure/getSchema/filter/...` | fail-soft | Integração de schema/dados remotos com fallback controlado. |
|
|
344
|
+
|
|
345
|
+
### Host/runtime dependencies
|
|
346
|
+
|
|
347
|
+
| Dependency | Required | Environment | Purpose | Notes |
|
|
348
|
+
| --- | --- | --- | --- | --- |
|
|
349
|
+
| `GenericCrudService` | Yes | browser/dev/prod | schema/data runtime | Fonte remota para criação/sincronização de config. |
|
|
350
|
+
| `ASYNC_CONFIG_STORAGE` | Yes | browser/dev/prod | persistência | Armazena config por `formId`/instância e flags de schema. |
|
|
351
|
+
| `CONNECTION_STORAGE` | Yes | browser/dev/prod | persistência de conexão | Reutiliza `resourcePath` salvo previamente. |
|
|
352
|
+
| `FormRulesService` | Yes | browser/dev/prod/ssr | execução de regras | Aplica `formRules` e recalcula comportamento de campos. |
|
|
353
|
+
| `FormConfigService` | Yes | browser/dev/prod/ssr | validação e normalização | Validação estrutural e utilitários de config. |
|
|
354
|
+
| `MatDialog` | Optional | browser/dev/prod | confirmações e fluxos de ação | Acionada em ações sensíveis conforme contrato. |
|
|
355
|
+
|
|
356
|
+
## Coverage matrix
|
|
357
|
+
|
|
358
|
+
| Surface | Verified | Coverage status | Evidence | Notes |
|
|
359
|
+
| --- | --- | --- | --- | --- |
|
|
360
|
+
| Runtime | false | Partial | source_of_truth + conteudo preservado | Revisao estrutural concluida; validacao comportamental fina pode exigir follow-up. |
|
|
361
|
+
| Schema/Types | true | Partial | interfaces/modelos citados | Mapeamento formal de todos os campos ainda pode requerer refinamento. |
|
|
362
|
+
| Editor/Tooling | false | Partial | secoes de editor quando presentes | Cobertura de editor/tooling nem sempre confirmada por evidencia direta. |
|
|
363
|
+
|
|
364
|
+
## Runtime coverage boundaries
|
|
365
|
+
|
|
366
|
+
- Cobertura consolidada com base em documentacao existente e source of truth declarado.
|
|
367
|
+
- Comportamentos fora de evidencia direta foram marcados como not-yet-verified ou Partial.
|
|
368
|
+
- Compatibilidade legada, quando detectada, foi separada em classificacao explicita.
|
|
369
|
+
|
|
370
|
+
## Resolution model
|
|
371
|
+
|
|
372
|
+
### Merge order
|
|
373
|
+
|
|
374
|
+
1. inputs explícitos (`config`, `resourcePath`, `mode`, flags globais)
|
|
375
|
+
2. hidratação de preferências de input (`formInputsKey`) e conexão persistida
|
|
376
|
+
3. `initializeForm()`: config local persistida (`formConfigKey`) ou criação a partir do servidor
|
|
377
|
+
4. normalização final via `normalizeFormConfig()`
|
|
378
|
+
5. overrides de runtime (`hooks`, `backConfig`, `customEndpoints`, presentation vars)
|
|
379
|
+
|
|
380
|
+
### Fallback order
|
|
381
|
+
|
|
382
|
+
config local persistida -> config default criada do schema remoto -> erro de inicialização (quando `formId` e uma fonte schema-backed, `resourcePath` ou `schemaUrl`, estão ausentes no fluxo corporativo).
|
|
383
|
+
|
|
384
|
+
### Override points
|
|
385
|
+
|
|
386
|
+
- `@Input()` públicos (`config`, `hooks`, `layout`, `backConfig`, `customEndpoints`)
|
|
387
|
+
- edição em runtime via `SettingsPanelService`
|
|
388
|
+
- persistência de host (`ASYNC_CONFIG_STORAGE`, `CONNECTION_STORAGE`)
|
|
389
|
+
|
|
390
|
+
### Runtime normalization
|
|
391
|
+
|
|
392
|
+
- `normalizeFormConfig()` estabiliza ids e estrutura antes do build/render.
|
|
393
|
+
- `applyPresentationVars()` resolve precedência entre configuração persistida e config em memória.
|
|
394
|
+
- `resolveSchemaPrefs()` consolida preferências locais e fallback global de notificação de drift.
|
|
395
|
+
|
|
396
|
+
### Precedence rules
|
|
397
|
+
|
|
398
|
+
- `@Input() hooks` sobrescreve `config.hooks` por estágio.
|
|
399
|
+
- `backConfig.confirmOnDirty` sobrescreve `behavior.confirmOnUnsavedChanges`.
|
|
400
|
+
- `resourcePath` explícito no input tem precedência sobre conexão persistida.
|
|
401
|
+
|
|
402
|
+
## Validation and error semantics
|
|
403
|
+
|
|
404
|
+
### Validation model
|
|
405
|
+
|
|
406
|
+
| Path/Rule | Validation phase | Behavior on fail | Error code / warning | Notes |
|
|
407
|
+
| --- | --- | --- | --- | --- |
|
|
408
|
+
| `formId` + (`resourcePath` ou `schemaUrl`) no fluxo corporativo | init | hard-fail + `initializationError` | `config-load` | Inicialização não prossegue sem identidade e fonte schema-backed. |
|
|
409
|
+
| `presentationModeGlobal=true` com `mode != view` | input-change | warning + ignore | runtime warning | Sem bloqueio; render segue em input mode. |
|
|
410
|
+
| `config` recebido por input | input-change | normalize + rebuild | n/a | `normalizeFormConfig` antes de renderização. |
|
|
411
|
+
| validação de config (editor/runtime) | pre-apply | reject when invalid | `FormConfigService.validateConfig` | Erros retornados ao host via outputs/eventos. |
|
|
412
|
+
| verificação de hash de schema remoto | background runtime | mark outdated + emit status | `schemaStatusChange` | Não aplica schema remoto automaticamente em background. |
|
|
413
|
+
|
|
414
|
+
### Error semantics
|
|
415
|
+
|
|
416
|
+
Falhas de inicialização (`config-load`/`form-build`) são bloqueantes e emitem `initializationError`. Divergências de schema são tratadas como estado (`schemaOutdated`) com emissão de evento, sem interromper formulário já carregado.
|
|
417
|
+
|
|
418
|
+
### Fail-open / fail-closed behavior
|
|
419
|
+
|
|
420
|
+
| Condition | Mode | Runtime behavior | Consumer impact |
|
|
421
|
+
| --- | --- | --- | --- |
|
|
422
|
+
| Falha ao ler config local/prefs | fail-open | segue com fluxo remoto/default | formulário ainda inicia quando possível |
|
|
423
|
+
| `formId` ausente ou sem `resourcePath`/`schemaUrl` (fluxo corporativo) | fail-closed | aborta inicialização | host recebe `initializationError` |
|
|
424
|
+
| schema remoto indisponível com fallback legado disponível | fail-open | usa fonte legada (`crud.getSchema`) | mantém operação com cobertura parcial |
|
|
425
|
+
| payload de config inválido | reject | não aplica configuração | prevenir estado inconsistente no runtime |
|
|
426
|
+
|
|
427
|
+
### Invalid or unknown field handling
|
|
428
|
+
|
|
429
|
+
- Campos desconhecidos: comportamento depende da estrategia do componente (ignore, warn ou reject).
|
|
430
|
+
- Campos invalidos: podem gerar fallback, warning ou falha conforme implementacao.
|
|
431
|
+
- Registrar divergencias observadas em Known limitations and mismatches.
|
|
432
|
+
|
|
433
|
+
### Runtime warnings vs hard failures
|
|
434
|
+
|
|
435
|
+
| Condition | Severity | Observability | Consumer action |
|
|
436
|
+
| --- | --- | --- | --- |
|
|
437
|
+
| partial-or-declared-only-coverage | warning | logs/eventos do componente | confirmar ligacao runtime antes de uso critico |
|
|
438
|
+
|
|
439
|
+
## Detailed API
|
|
440
|
+
|
|
441
|
+
### Preserved technical reference (normalized from previous revision)
|
|
442
|
+
|
|
443
|
+
Referencia canonica da JSON API do `praxis-dynamic-form`, com foco em:
|
|
444
|
+
|
|
445
|
+
- contrato declarado (`FormConfig` + inputs/outputs do componente);
|
|
446
|
+
- comportamento que o runtime consome de fato;
|
|
447
|
+
- limites conhecidos para uso corporativo (governanca, observabilidade, UX e risco).
|
|
448
|
+
|
|
449
|
+
Legenda de suporte:
|
|
450
|
+
|
|
451
|
+
- `Active`: consumido no runtime atual.
|
|
452
|
+
- `Partial`: consumido parcialmente (subconjunto funcional).
|
|
453
|
+
- `Declared-only`: declarado no contrato, sem consumo direto no runtime atual.
|
|
454
|
+
|
|
455
|
+
### Table of contents
|
|
456
|
+
|
|
457
|
+
- [Overview](#overview)
|
|
458
|
+
- [Checklist corporativo pre-flight](#checklist-corporativo-pre-flight)
|
|
459
|
+
- [API](#api)
|
|
460
|
+
- [Component inputs](#component-inputs)
|
|
461
|
+
- [Component outputs](#component-outputs)
|
|
462
|
+
- [Data mode e fluxo](#data-mode-e-fluxo)
|
|
463
|
+
- [FormConfig coverage matrix](#formconfig-coverage-matrix)
|
|
464
|
+
- [Behavior e Messages coverage detalhado](#behavior-e-messages-coverage-detalhado)
|
|
465
|
+
- [DynamicFieldLoader error bridge](#dynamicfieldloader-error-bridge)
|
|
466
|
+
- [Seguranca e fronteiras de responsabilidade](#seguranca-e-fronteiras-de-responsabilidade)
|
|
467
|
+
- [Exemplos JSON](#exemplos-json)
|
|
468
|
+
- [Known limitations and pending investigation](#known-limitations-and-pending-investigation)
|
|
469
|
+
- [Source references](#source-references)
|
|
470
|
+
|
|
471
|
+
### Overview
|
|
472
|
+
|
|
473
|
+
`praxis-dynamic-form` e um runtime de formulario schema-driven orientado por `FormConfig`.
|
|
474
|
+
|
|
475
|
+
Fluxo macro:
|
|
476
|
+
|
|
477
|
+
1. Resolve configuracao (local, remota ou defaults).
|
|
478
|
+
2. Normaliza estrutura (`sections/rows/columns/fieldMetadata`) e IDs.
|
|
479
|
+
3. Monta `FormGroup`, aplica regras e estados globais.
|
|
480
|
+
4. Renderiza campos via `DynamicFieldLoaderDirective`.
|
|
481
|
+
5. Executa submit/cancel/reset/custom actions com hooks e mensagens.
|
|
482
|
+
6. Emite eventos para host (estado, erros, sincronizacao e acao).
|
|
483
|
+
|
|
484
|
+
No ecossistema Praxis, ele funciona tanto como runtime final quanto como superficie de edicao (settings panel + config editor) para round-trip de JSON.
|
|
485
|
+
|
|
486
|
+
### Checklist corporativo pre-flight
|
|
487
|
+
|
|
488
|
+
- Defina `formId` estavel por tela/uso para evitar colisao de persistencia.
|
|
489
|
+
- Em cenarios multi-instancia na mesma pagina, use `componentInstanceId`.
|
|
490
|
+
- Se o formulario for remoto, valide `resourcePath` e ciclo de schema (`schemaStatusChange`).
|
|
491
|
+
- Declare explicitamente estrategia de modos (`create/edit/view`) no host.
|
|
492
|
+
- Trate `fieldRenderError` no host para observabilidade de render por campo.
|
|
493
|
+
- Garanta autorizacao no backend para submit/custom actions; regras visuais no front nao sao controle de acesso.
|
|
494
|
+
|
|
495
|
+
### API
|
|
496
|
+
|
|
497
|
+
#### Component inputs
|
|
498
|
+
|
|
499
|
+
`initialValue` is part of the public runtime contract and accepts
|
|
500
|
+
`Record<string, unknown> | null` for local initial values.
|
|
501
|
+
|
|
502
|
+
| Input | Tipo | Default | Status | Runtime notes |
|
|
503
|
+
| --- | --- | --- | --- | --- |
|
|
504
|
+
| `config` | `FormConfig` | `{ sections: [] }` | Active | Contrato principal consumido no ciclo inteiro. |
|
|
505
|
+
| `resourcePath` | `string \| undefined` | `undefined` | Active | Habilita carga de schema/dados remotos. Opcional quando `schemaUrl` explícito é fornecido. |
|
|
506
|
+
| `resourceId` | `string \| number \| undefined` | `undefined` | Active | Carrega entidade no modo `edit/view`. |
|
|
507
|
+
| `mode` | `'create' \| 'edit' \| 'view'` | `'create'` | Active | Governa submit, leitura e apresentacao. |
|
|
508
|
+
| `schemaSource` | `'resource' \| 'filter'` | `'resource'` | Active | Seleciona origem do schema remoto. |
|
|
509
|
+
| `schemaUrl` | `string \| undefined` | `undefined` | Active | Permite usar schema canonico publicado pelo backend sem heuristica local de path e pode iniciar o fluxo corporativo sem `resourcePath`. |
|
|
510
|
+
| `apiEndpointKey` | `ApiEndpoint \| string \| undefined` | `undefined` | Active | Resolve `schemaUrl` e `submitUrl` relativos contra a origem canonica correta em hosts destacados. |
|
|
511
|
+
| `apiUrlEntry` | `ApiUrlEntry \| undefined` | `undefined` | Active | Porta a entrada de API ja resolvida para overlays/dialogs que nao herdam o provider de `API_URL` da rota atual. |
|
|
512
|
+
| `domainRules` | `PraxisDynamicFormDomainRulesOptions \| boolean \| null` | `null` | Active | Opt-in para carregar materializacoes de regras compartilhadas em `/api/praxis/config/domain-rules/materializations` e combina-las com `config.formRules`. |
|
|
513
|
+
| `submitUrl` | `string \| undefined` | `undefined` | Active | Executa submit canonico publicado por `surface` ou `action`, sem inferencia local de CRUD. |
|
|
514
|
+
| `submitMethod` | `'post' \| 'put' \| 'patch' \| undefined` | `undefined` | Active | Metodo HTTP do submit canonico; deve acompanhar `submitUrl`. |
|
|
515
|
+
| `responseSchemaUrl` | `string \| undefined` | `undefined` | Active | Porta diagnóstica/read-only para hosts que precisem inspecionar o contrato de resposta do backend. |
|
|
516
|
+
| `enableCustomization` | `boolean` | `false` | Active | Habilita UX de customizacao do layout. |
|
|
517
|
+
| `formId` | `string \| undefined` | `undefined` | Active | Chave de persistencia e identidade logica. |
|
|
518
|
+
| `componentInstanceId` | `string \| undefined` | `undefined` | Active | Isola instancias com mesmo `formId`. |
|
|
519
|
+
| `layout` | `FormLayout \| undefined` | `undefined` | Partial | Funciona como override estrutural em parte dos fluxos de layout/editor. |
|
|
520
|
+
| `backConfig` | `BackConfig \| undefined` | `undefined` | Active | Integra retorno/navegacao no painel de configuracao; `confirmOnDirty` tem precedencia sobre `behavior.confirmOnUnsavedChanges` no cancel. |
|
|
521
|
+
| `hooks` | `FormHooksLayout \| undefined` | `undefined` | Active | Override direto de hooks sobre `config.hooks`. |
|
|
522
|
+
| `customEndpoints` | `EndpointConfig` | `{}` | Active | Override de endpoints no CRUD service interno. |
|
|
523
|
+
| `removeEmptyContainersOnSave` | `boolean` | `false` | Active | Sanitiza secoes/linhas/colunas vazias na persistencia de config. |
|
|
524
|
+
| `reactiveValidation` | `boolean \| null` | `null` | Active | Override de validacao reativa (`valueChanges`). |
|
|
525
|
+
| `reactiveValidationDebounceMs` | `number \| null` | `null` | Active | Debounce da validacao reativa. |
|
|
526
|
+
| `notifyIfOutdated` | `'inline' \| 'snackbar' \| 'both' \| 'none'` | `'both'` | Active | Canal de aviso de schema desatualizado quando a customizacao estiver ativa. |
|
|
527
|
+
| `snoozeMs` | `number` | `86400000` | Active | Janela de supressao de notificacao. |
|
|
528
|
+
| `autoOpenSettingsOnOutdated` | `boolean` | `false` | Active | Auto-abertura do settings quando schema diverge. |
|
|
529
|
+
| `readonlyModeGlobal` | `boolean \| null` | `null` | Active | Estado global de leitura propagado para loader. |
|
|
530
|
+
| `disabledModeGlobal` | `boolean \| null` | `null` | Active | Estado global de desabilitado propagado para loader. |
|
|
531
|
+
| `presentationModeGlobal` | `boolean \| null` | `null` | Active | Modo apresentacao global (efetivo em `view`). |
|
|
532
|
+
| `visibleGlobal` | `boolean \| null` | `null` | Active | Visibilidade global propagada para loader. |
|
|
533
|
+
|
|
534
|
+
#### Regras compartilhadas materializadas
|
|
535
|
+
|
|
536
|
+
`domainRules` separa regra corporativa compartilhavel de regra materializada no `FormConfig`. Quando habilitado, o componente consulta o backend de configuracao via `DomainRuleFormRulesService`, transforma cada materializacao em `FormLayoutRule` e aplica a lista combinada:
|
|
537
|
+
|
|
538
|
+
1. `config.formRules`
|
|
539
|
+
2. regras vindas de `domain_rule_materialization.materializedPayload`
|
|
540
|
+
|
|
541
|
+
Exemplo:
|
|
542
|
+
|
|
543
|
+
```html
|
|
544
|
+
<praxis-dynamic-form
|
|
545
|
+
formId="funcionarios-form-demo"
|
|
546
|
+
[config]="formConfig"
|
|
547
|
+
[domainRules]="{
|
|
548
|
+
enabled: true,
|
|
549
|
+
targetArtifactKey: 'funcionarios-form-demo',
|
|
550
|
+
targetLayer: 'form_config',
|
|
551
|
+
targetArtifactType: 'praxis-dynamic-form',
|
|
552
|
+
status: 'applied'
|
|
553
|
+
}">
|
|
554
|
+
</praxis-dynamic-form>
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
Campos de `PraxisDynamicFormDomainRulesOptions`:
|
|
558
|
+
|
|
559
|
+
| Campo | Tipo | Default | Observacao |
|
|
560
|
+
| --- | --- | --- | --- |
|
|
561
|
+
| `enabled` | `boolean` | `false` | Deve ser `true` para consultar o backend. |
|
|
562
|
+
| `targetArtifactKey` | `string \| null` | `formId || componentInstanceId` | Chave alvo da materializacao. |
|
|
563
|
+
| `targetLayer` | `string \| null` | `'form_config'` | Camada alvo persistida no backend. |
|
|
564
|
+
| `targetArtifactType` | `string \| null` | `'praxis-dynamic-form'` | Tipo do artefato alvo. |
|
|
565
|
+
| `status` | `string \| null` | `undefined` | Filtro opcional. Para consumo runtime, prefira `applied`; `pending_review` pertence a etapas de governanca antes da aplicacao. |
|
|
566
|
+
|
|
567
|
+
Materializacoes diretas podem persistir um `FormLayoutRule` em `materializedPayload`. O adaptador tambem reconhece `operation: "rule.visualBlockGuidance.add"` e converte para regra `targetType: "visualBlock"` como projecao visual derivada, preservando rastreabilidade em `metadata.domainRule` sem transformar o formulario em fonte primaria da regra de negocio.
|
|
568
|
+
Quando o backend enviar `decisionDiagnostics`, o adaptador carrega esse envelope para `metadata.domainRule.decisionDiagnostics`, incluindo `sourceHashPresent` e `sourceHash` quando disponiveis, mantendo a explicacao canonica da decisao semanticamente authorada por IA junto da regra derivada, sem transformar o formulario em fonte primaria da regra de negocio.
|
|
569
|
+
|
|
570
|
+
Teste vivo de referencia:
|
|
571
|
+
|
|
572
|
+
```bash
|
|
573
|
+
PAX_PROXY_TARGET=https://praxis-api-quickstart.onrender.com \
|
|
574
|
+
node scripts/run-playwright-with-dev-host.js \
|
|
575
|
+
--port 4003 \
|
|
576
|
+
--path /funcionarios-form-demo \
|
|
577
|
+
--spec projects/praxis-dynamic-form/test-dev/e2e/funcionarios-form-demo-domain-rules.playwright.spec.ts
|
|
578
|
+
```
|
|
579
|
+
|
|
580
|
+
Validado em 2026-04-23 contra `praxis-api-quickstart` publicado no Render com
|
|
581
|
+
`praxis-config-starter:0.1.0-rc.22`: o spec confirmou resposta 200 de
|
|
582
|
+
`/api/praxis/config/domain-rules/materializations` e presença de materialização
|
|
583
|
+
`form_config` com `operation: "rule.visualBlockGuidance.add"`.
|
|
584
|
+
|
|
585
|
+
#### Component outputs
|
|
586
|
+
|
|
587
|
+
| Output | Payload | Quando emite |
|
|
588
|
+
| --- | --- | --- |
|
|
589
|
+
| `formSubmit` | `FormSubmitEvent` | Submit validado do formulario. |
|
|
590
|
+
| `formCancel` | `void` | Acao cancelar. |
|
|
591
|
+
| `formReset` | `void` | Acao reset. |
|
|
592
|
+
| `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. |
|
|
593
|
+
| `formReady` | `FormReadyEvent` | Form pronto para interacao. |
|
|
594
|
+
| `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. |
|
|
595
|
+
| `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. |
|
|
596
|
+
| `initializationError` | `FormInitializationError` | Falha de inicializacao. |
|
|
597
|
+
| `loadingStateChange` | `LoadingState` | Mudanca de loading (`config/schema/render/data`). |
|
|
598
|
+
| `enableCustomizationChange` | `boolean` | Alternancia do modo de customizacao. |
|
|
599
|
+
| `customAction` | `FormCustomActionEvent` | Acao custom definida no contrato ou ação do header de seção. |
|
|
600
|
+
| `actionConfirmation` | `FormActionConfirmationEvent` | Pedido de confirmacao de acao sensivel. |
|
|
601
|
+
| `schemaStatusChange` | `{ outdated, serverHash?, lastVerifiedAt?, formId? }` | Mudanca de estado de desatualizacao de schema. |
|
|
602
|
+
| `fieldRenderError` | `{ phase, fieldName, error, fatal }` | Erro de render de campo emitido pelo `DynamicFieldLoader`. |
|
|
603
|
+
| `ruleDiagnosticsChange` | `RuleApplicationDiagnostic[]` | Diagnosticos de regras invalidas, incompletas ou parcialmente saneadas durante aplicacao runtime. |
|
|
604
|
+
|
|
605
|
+
#### Data mode e fluxo
|
|
606
|
+
|
|
607
|
+
- `mode='create'`: cria registro, carga de entidade opcional.
|
|
608
|
+
- `mode='edit'`: carrega entidade por `resourceId` quando disponivel.
|
|
609
|
+
- `mode='view'`: foco em leitura/apresentacao; actions de edicao podem ser suprimidas.
|
|
610
|
+
|
|
611
|
+
Precedencias importantes:
|
|
612
|
+
|
|
613
|
+
1. Inputs explicitos do host (ex.: `reactiveValidation`) sobrescrevem comportamento no `config.behavior`.
|
|
614
|
+
2. `hooks` input sobrescreve `config.hooks`.
|
|
615
|
+
3. Preferencias de outdated schema combinam input + widget/global defaults.
|
|
616
|
+
|
|
617
|
+
### FormConfig coverage matrix
|
|
618
|
+
|
|
619
|
+
| JSON path | Status | Runtime notes |
|
|
620
|
+
| --- | --- | --- |
|
|
621
|
+
| `sections[]` | Active | Render estrutural principal (section/row/column). |
|
|
622
|
+
| `fieldMetadata[]` | Active | Fonte de campos para `DynamicFieldLoader`. |
|
|
623
|
+
| `metadata` | Active | Usado em reconciliacao/snapshot/status de schema. |
|
|
624
|
+
| `actions` | Active | Render de `praxis-form-actions` e roteamento de eventos. |
|
|
625
|
+
| `behavior` | Partial | Subset funcional (detalhado abaixo). |
|
|
626
|
+
| `api` | Declared-only | Declarado no modelo; sem binding operacional direto no runtime atual. |
|
|
627
|
+
| `messages` | Partial | Chaves principais de submit/confirmacao usadas; contrato e mais amplo. |
|
|
628
|
+
| `formRules` | Active | Aplicadas no pipeline de regras do runtime. |
|
|
629
|
+
| `formRulesState` | Active | Persistido para round-trip do builder visual. |
|
|
630
|
+
| `hooks` | Active | Integracao de ciclo (before/after) via runtime de hooks. |
|
|
631
|
+
| `hints` | Declared-only | Mantido no contrato/editor; sem render dedicado no template principal. |
|
|
632
|
+
|
|
633
|
+
### Behavior e Messages coverage detalhado
|
|
634
|
+
|
|
635
|
+
#### `behavior.*`
|
|
636
|
+
|
|
637
|
+
| Caminho | Status | Observacao |
|
|
638
|
+
| --- | --- | --- |
|
|
639
|
+
| `behavior.confirmOnUnsavedChanges` | Active | Governa confirmacao antes de cancelar quando `backConfig.confirmOnDirty` nao estiver definido; sem politica explicita, cancel dirty usa fallback seguro com confirmacao. |
|
|
640
|
+
| `behavior.disableMountAnimation` | Active | Desliga animacao inicial do form. |
|
|
641
|
+
| `behavior.mountAnimation.durationMs/offsetPx/staggerMs` | Active | Ajuste fino da animacao de montagem. |
|
|
642
|
+
| `behavior.reactiveValidation` | Active | Liga validacao reativa com hooks `afterValidate`. |
|
|
643
|
+
| `behavior.reactiveValidationDebounceMs` | Active | Debounce da validacao reativa. |
|
|
644
|
+
| `behavior.trackHistory` | Declared-only | Sem consumo direto no runtime atual. |
|
|
645
|
+
| `behavior.focusFirstError` | Active | No submit invalido, foca o primeiro campo invalido encontrado. |
|
|
646
|
+
| `behavior.scrollToErrors` | Active | No submit invalido, faz scroll para o primeiro campo invalido. |
|
|
647
|
+
| `behavior.clearAfterSave` | Active | No submit com sucesso, limpa o formulario quando habilitado. |
|
|
648
|
+
| `behavior.redirectAfterSave` | Active | No submit com sucesso navega via `Router.navigateByUrl` quando Router estiver disponivel; sem Router, emite warning e nao navega. |
|
|
649
|
+
|
|
650
|
+
#### `messages.*`
|
|
651
|
+
|
|
652
|
+
| Caminho | Status | Observacao |
|
|
653
|
+
| --- | --- | --- |
|
|
654
|
+
| `messages.loading.submit` | Active | Mensagem de loading durante submit. |
|
|
655
|
+
| `messages.confirmations.*` | Active | Confirmacoes pre-acao (submit/cancel/reset/custom). |
|
|
656
|
+
| `messages.customActions[actionId].confirmation` | Active | Prioridade sobre `confirmations[actionId]`. |
|
|
657
|
+
| `messages.customActions.submit.success/error` | Active | Mensagens de resultado no submit customizado. |
|
|
658
|
+
| `messages.createRegistrySuccess/updateRegistrySuccess` | Active | Feedback de sucesso create/edit. |
|
|
659
|
+
| `messages.createRegistryError/updateRegistryError` | Active | Feedback de erro create/edit. |
|
|
660
|
+
| Campos extras em `messages` | Partial | Contrato aceita extensao, mas nem todas as chaves sao exibidas no runtime atual. |
|
|
661
|
+
|
|
662
|
+
### DynamicFieldLoader error bridge
|
|
663
|
+
|
|
664
|
+
`praxis-dynamic-form` encaminha erros de render por campo para o host via `fieldRenderError`.
|
|
665
|
+
|
|
666
|
+
Payload:
|
|
667
|
+
|
|
668
|
+
```ts
|
|
669
|
+
{
|
|
670
|
+
phase: 'executeRendering' | 'detectChanges';
|
|
671
|
+
fieldName: string;
|
|
672
|
+
error: unknown;
|
|
673
|
+
fatal: boolean;
|
|
674
|
+
}
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
Politica atual do loader:
|
|
678
|
+
|
|
679
|
+
- Erro por campo nao derruba automaticamente o formulario inteiro.
|
|
680
|
+
- Erros de lifecycle Angular (`NG0205`, injector/view destroyed) sao marcados como `fatal=true` para o ciclo atual.
|
|
681
|
+
- O runtime evita emissao duplicada quando o erro fatal ja foi reportado em etapa anterior.
|
|
682
|
+
|
|
683
|
+
Recomendacao corporativa:
|
|
684
|
+
|
|
685
|
+
- Capture `fieldRenderError` no host e envie para telemetria com `formId`, `resourcePath`, `mode` e `fieldName`.
|
|
686
|
+
- Use alerta operacional apenas para `fatal=true` repetido em ambiente de producao.
|
|
687
|
+
|
|
688
|
+
### Seguranca e fronteiras de responsabilidade
|
|
689
|
+
|
|
690
|
+
- `hidden`, `readonly`, `disabled`, `presentation` sao controles de UX no front-end.
|
|
691
|
+
- Validacao e autorizacao de negocio devem ser reforcadas no backend.
|
|
692
|
+
- Acoes custom emitidas pelo componente (`customAction`) nao substituem checagens de permissao server-side.
|
|
693
|
+
|
|
694
|
+
### Exemplos JSON
|
|
695
|
+
|
|
696
|
+
#### 1) Baseline create/edit (foco em contrato ativo)
|
|
697
|
+
|
|
698
|
+
```json
|
|
699
|
+
{
|
|
700
|
+
"sections": [
|
|
701
|
+
{
|
|
702
|
+
"id": "main",
|
|
703
|
+
"title": "Cadastro",
|
|
704
|
+
"rows": [
|
|
705
|
+
{
|
|
706
|
+
"id": "r1",
|
|
707
|
+
"columns": [
|
|
708
|
+
{ "id": "c1", "fields": ["name", "email"] }
|
|
709
|
+
]
|
|
710
|
+
}
|
|
711
|
+
]
|
|
712
|
+
}
|
|
713
|
+
],
|
|
714
|
+
"fieldMetadata": [
|
|
715
|
+
{ "name": "name", "label": "Nome", "controlType": "input", "required": true },
|
|
716
|
+
{ "name": "email", "label": "Email", "controlType": "input" }
|
|
717
|
+
],
|
|
718
|
+
"behavior": {
|
|
719
|
+
"confirmOnUnsavedChanges": true,
|
|
720
|
+
"reactiveValidation": true,
|
|
721
|
+
"reactiveValidationDebounceMs": 200
|
|
722
|
+
},
|
|
723
|
+
"messages": {
|
|
724
|
+
"loading": { "submit": "Salvando cadastro..." },
|
|
725
|
+
"confirmations": { "cancel": "Descartar alteracoes?" },
|
|
726
|
+
"createRegistrySuccess": "Registro criado com sucesso",
|
|
727
|
+
"updateRegistrySuccess": "Registro atualizado com sucesso"
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
#### 2) View + apresentacao global
|
|
733
|
+
|
|
734
|
+
```json
|
|
735
|
+
{
|
|
736
|
+
"sections": [
|
|
737
|
+
{
|
|
738
|
+
"id": "view-main",
|
|
739
|
+
"title": "Resumo",
|
|
740
|
+
"rows": [
|
|
741
|
+
{
|
|
742
|
+
"id": "vr1",
|
|
743
|
+
"columns": [
|
|
744
|
+
{ "id": "vc1", "fields": ["status", "owner"] }
|
|
745
|
+
]
|
|
746
|
+
}
|
|
747
|
+
]
|
|
748
|
+
}
|
|
749
|
+
],
|
|
750
|
+
"fieldMetadata": [
|
|
751
|
+
{ "name": "status", "label": "Status", "controlType": "input" },
|
|
752
|
+
{ "name": "owner", "label": "Responsavel", "controlType": "input" }
|
|
753
|
+
],
|
|
754
|
+
"actions": {
|
|
755
|
+
"submit": { "visible": false, "label": "Salvar" },
|
|
756
|
+
"cancel": { "visible": true, "label": "Voltar" },
|
|
757
|
+
"reset": { "visible": false, "label": "Limpar" }
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
No host Angular:
|
|
763
|
+
|
|
764
|
+
```html
|
|
765
|
+
<praxis-dynamic-form
|
|
766
|
+
[config]="formConfig"
|
|
767
|
+
mode="view"
|
|
768
|
+
[presentationModeGlobal]="true"
|
|
769
|
+
(fieldRenderError)="onFieldRenderError($event)"
|
|
770
|
+
(ruleDiagnosticsChange)="onRuleDiagnosticsChange($event)">
|
|
771
|
+
</praxis-dynamic-form>
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
`ruleDiagnosticsChange` nao aplica UI propria no formulario. Ele existe para governanca do host: logar regras invalidas, sinalizar configuracao inconsistente ao autor ou impedir publicacao de metadata sem esconder o problema dentro do runtime.
|
|
775
|
+
O runtime emite `target-not-found` quando uma regra aponta para `section`, `row`, `column`, `action` ou `visualBlock` inexistente no `FormConfig` resolvido; para campos, o codigo legado `field-target-not-found` permanece.
|
|
776
|
+
|
|
777
|
+
### Known limitations and pending investigation
|
|
778
|
+
|
|
779
|
+
1. `FormConfig.api` segue `Declared-only` no runtime principal.
|
|
780
|
+
2. Cobertura de `behavior` e parcial; varios campos continuam sem binding dedicado.
|
|
781
|
+
3. Cobertura de `messages` e parcial para chaves fora do fluxo principal de submit/confirmacao.
|
|
782
|
+
4. Ainda falta bateria de stress dedicada para corrida teardown/render alem de `NG0205`.
|
|
783
|
+
5. `hints` permanece no contrato/editor sem exposicao no template principal.
|
|
784
|
+
|
|
785
|
+
### Source references
|
|
786
|
+
|
|
787
|
+
- `projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.ts`
|
|
788
|
+
- `projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.html`
|
|
789
|
+
- `projects/praxis-dynamic-form/src/lib/config-editor/praxis-dynamic-form-config-editor.ts`
|
|
790
|
+
- `projects/praxis-dynamic-fields/src/lib/directives/dynamic-field-loader.directive.ts`
|
|
791
|
+
- `projects/praxis-core/src/lib/models/form/form-config.model.ts`
|
|
792
|
+
- `projects/praxis-core/src/lib/models/form/form-layout.model.ts`
|
|
793
|
+
|
|
794
|
+
## JSON path index
|
|
795
|
+
|
|
796
|
+
| Path | Type | Required | Default | Status | Notes |
|
|
797
|
+
| --- | --- | --- | --- | --- | --- |
|
|
798
|
+
| `sections[]` | not-specified | not-specified | n/a | Active | Render estrutural principal (section/row/column). |
|
|
799
|
+
| `fieldMetadata[]` | not-specified | not-specified | n/a | Active | Fonte de campos para `DynamicFieldLoader`. |
|
|
800
|
+
| `metadata` | not-specified | not-specified | n/a | Active | Usado em reconciliacao/snapshot/status de schema. |
|
|
801
|
+
| `actions` | not-specified | not-specified | n/a | Active | Render de `praxis-form-actions` e roteamento de eventos. |
|
|
802
|
+
| `behavior` | not-specified | not-specified | n/a | Partial | Subset funcional (detalhado abaixo). |
|
|
803
|
+
| `api` | not-specified | not-specified | n/a | Declared-only | Declarado no modelo; sem binding operacional direto no runtime atual. |
|
|
804
|
+
| `messages` | not-specified | not-specified | n/a | Partial | Chaves principais de submit/confirmacao usadas; contrato e mais amplo. |
|
|
805
|
+
| `formRules` | not-specified | not-specified | n/a | Active | Aplicadas no pipeline de regras do runtime. |
|
|
806
|
+
| `formRulesState` | not-specified | not-specified | n/a | Active | Persistido para round-trip do builder visual. |
|
|
807
|
+
| `hooks` | not-specified | not-specified | n/a | Active | Integracao de ciclo (before/after) via runtime de hooks. |
|
|
808
|
+
| `hints` | not-specified | not-specified | n/a | Declared-only | Mantido no contrato/editor; sem render dedicado no template principal. |
|
|
809
|
+
|
|
810
|
+
## Events
|
|
811
|
+
|
|
812
|
+
| Event | Payload | Trigger | Stability | Notes |
|
|
813
|
+
| --- | --- | --- | --- | --- |
|
|
814
|
+
| `formSubmit` | `FormSubmitEvent` | Submit validado do formulario. | Partial | `formData` e o payload persistivel filtrado; `rawFormData` preserva o valor completo do formulario, incluindo campos locais/transientes. |
|
|
815
|
+
| `formCancel` | `void` | Acao cancelar. | Partial | Preservado da documentação anterior. |
|
|
816
|
+
| `formReset` | `void` | Acao reset. | Partial | Preservado da documentação anterior. |
|
|
817
|
+
| `configChange` | `FormConfig` | Alteracoes de layout/config durante edicao. | Partial | Preservado da documentação anterior. |
|
|
818
|
+
| `formReady` | `FormReadyEvent` | Form pronto para interacao. | Partial | Preservado da documentação anterior. |
|
|
819
|
+
| `valueChange` | `FormValueChangeEvent` | Alteracao de valor no form runtime. | Partial | Preservado da documentação anterior. |
|
|
820
|
+
| `syncCompleted` | `SyncResult` | Sincronizacao de schema/config concluida. | Partial | Preservado da documentação anterior. |
|
|
821
|
+
| `initializationError` | `FormInitializationError` | Falha de inicializacao. | Partial | Preservado da documentação anterior. |
|
|
822
|
+
| `loadingStateChange` | `LoadingState` | Mudanca de loading (`config/schema/render/data`). | Partial | Preservado da documentação anterior. |
|
|
823
|
+
| `enableCustomizationChange` | `boolean` | Alternancia do modo de customizacao. | Partial | Preservado da documentação anterior. |
|
|
824
|
+
| `customAction` | `FormCustomActionEvent` | Acao custom definida no contrato ou ação do header de seção. | Partial | `source` pode ser `button`, `shortcut` ou `section-header`; quando vier de header, o payload inclui `sectionId`. |
|
|
825
|
+
| `actionConfirmation` | `FormActionConfirmationEvent` | Pedido de confirmacao de acao sensivel. | Partial | Preservado da documentação anterior. |
|
|
826
|
+
|
|
827
|
+
## Styling API
|
|
828
|
+
|
|
829
|
+
| Token/Class | Scope | Purpose | Notes |
|
|
830
|
+
| --- | --- | --- | --- |
|
|
831
|
+
| `.praxis-dynamic-form` | root container | raiz visual/estrutural do runtime | Recebe classes derivadas de modo, estado e montagem no template principal. |
|
|
832
|
+
| `.form-loading` / `.form-error` | state containers | feedback de carregamento e falha de inicializacao | Acionados durante bootstrap/config/schema e erros de inicializacao. |
|
|
833
|
+
| `.pfx-form-info-banner` | schema-drift banner | aviso de schema desatualizado + CTA de reconciliacao | Exibicao condicionada por `notifyIfOutdated` e estado de drift. |
|
|
834
|
+
| `--pdx-form-mount-duration` / `--pdx-form-mount-offset` / `--pdx-form-mount-stagger` | css vars (host style) | controle de animacao de montagem | Definidos por bindings de estilo no host da raiz do formulario. |
|
|
835
|
+
|
|
836
|
+
## Editor and tooling notes
|
|
837
|
+
|
|
838
|
+
- Cobertura de editor/tooling foi separada da cobertura de runtime para evitar confusao de suporte.
|
|
839
|
+
- Quando nao houver evidencia direta no codigo, o status deve permanecer not yet verified.
|
|
840
|
+
|
|
841
|
+
## Examples
|
|
842
|
+
|
|
843
|
+
### Minimal valid
|
|
844
|
+
|
|
845
|
+
```json
|
|
846
|
+
{
|
|
847
|
+
"sections": []
|
|
848
|
+
}
|
|
849
|
+
```
|
|
850
|
+
|
|
851
|
+
### Typical/common
|
|
852
|
+
|
|
853
|
+
```json
|
|
854
|
+
{
|
|
855
|
+
"sections": [
|
|
856
|
+
{
|
|
857
|
+
"id": "main",
|
|
858
|
+
"title": "Dados",
|
|
859
|
+
"sectionHeader": {
|
|
860
|
+
"mode": "auto",
|
|
861
|
+
"sourceField": "employeePhoto",
|
|
862
|
+
"initialsSourceField": "fullName",
|
|
863
|
+
"altField": "fullName"
|
|
864
|
+
},
|
|
865
|
+
"rows": [
|
|
866
|
+
{
|
|
867
|
+
"id": "r1",
|
|
868
|
+
"columns": [
|
|
869
|
+
{
|
|
870
|
+
"id": "c1",
|
|
871
|
+
"span": 12,
|
|
872
|
+
"fields": ["fullName"]
|
|
873
|
+
}
|
|
874
|
+
]
|
|
875
|
+
}
|
|
876
|
+
]
|
|
877
|
+
}
|
|
878
|
+
],
|
|
879
|
+
"fieldMetadata": [
|
|
880
|
+
{ "name": "employeePhoto", "label": "Foto", "controlType": "input" },
|
|
881
|
+
{ "name": "fullName", "label": "Nome", "controlType": "input" }
|
|
882
|
+
]
|
|
883
|
+
}
|
|
884
|
+
```
|
|
885
|
+
|
|
886
|
+
### Advanced
|
|
887
|
+
|
|
888
|
+
```json
|
|
889
|
+
{
|
|
890
|
+
"sections": [],
|
|
891
|
+
"behavior": {
|
|
892
|
+
"reactiveValidation": true,
|
|
893
|
+
"reactiveValidationDebounceMs": 300
|
|
894
|
+
},
|
|
895
|
+
"messages": {
|
|
896
|
+
"customActions": {
|
|
897
|
+
"submit": {
|
|
898
|
+
"success": "Registro salvo com sucesso."
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
},
|
|
902
|
+
"hooks": {
|
|
903
|
+
"beforeSubmit": [
|
|
904
|
+
{
|
|
905
|
+
"type": "custom",
|
|
906
|
+
"handler": "sanitizePayload"
|
|
907
|
+
}
|
|
908
|
+
]
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
```
|
|
912
|
+
|
|
913
|
+
### Enterprise scenario
|
|
914
|
+
|
|
915
|
+
```json
|
|
916
|
+
{
|
|
917
|
+
"sections": [],
|
|
918
|
+
"api": {
|
|
919
|
+
"resourcePath": "customers",
|
|
920
|
+
"schemaSource": "resource"
|
|
921
|
+
},
|
|
922
|
+
"behavior": {
|
|
923
|
+
"notifyIfOutdated": "both",
|
|
924
|
+
"autoOpenSettingsOnOutdated": true
|
|
925
|
+
},
|
|
926
|
+
"messages": {
|
|
927
|
+
"global": {
|
|
928
|
+
"saveError": "Nao foi possivel salvar no momento."
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
## Known limitations and mismatches
|
|
935
|
+
|
|
936
|
+
| Path/Behavior | Observed behavior (runtime) | Desired behavior | Impact | Tracking issue | Target fix |
|
|
937
|
+
| --- | --- | --- | --- | --- | --- |
|
|
938
|
+
| 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 |
|
|
939
|
+
|
|
940
|
+
## Compatibility and migration notes
|
|
941
|
+
|
|
942
|
+
| Concern | Affected versions | Migration action | Deadline | Notes |
|
|
943
|
+
| --- | --- | --- | --- | --- |
|
|
944
|
+
| legacy aliases and mixed status vocabulary | pre-canonical docs | unificar para taxonomia canonica (Active/Partial/Declared-only/...) | next-doc-cycle | manter backward compatibility documentada |
|
|
945
|
+
|
|
946
|
+
## Source references
|
|
947
|
+
|
|
948
|
+
| Source type | Path/URL | Why it is source of truth | Last verified (YYYY-MM-DD) | Notes |
|
|
949
|
+
| --- | --- | --- | --- | --- |
|
|
950
|
+
| local-file | projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
951
|
+
| local-file | projects/praxis-dynamic-form/src/lib/praxis-dynamic-form.html | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
952
|
+
| local-file | projects/praxis-dynamic-form/src/lib/config-editor/praxis-dynamic-form-config-editor.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
953
|
+
| local-file | projects/praxis-dynamic-fields/src/lib/directives/dynamic-field-loader.directive.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
954
|
+
| local-file | projects/praxis-core/src/lib/models/form/form-config.model.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|
|
955
|
+
| local-file | projects/praxis-core/src/lib/models/form/form-layout.model.ts | Evidencia de implementacao e contrato. | 2026-03-05 | referencia preservada da versao anterior |
|