@praxisui/dynamic-form 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 +92 -0
- package/ai/component-registry.json +630 -156
- package/docs/custom-fields-enterprise-review.md +229 -0
- package/docs/dynamic-form-authoring-document-semantics.md +68 -2
- package/docs/evidence/form-authoring-635-20261023/final-review.md +46 -0
- package/docs/evidence/form-authoring-635-20261023/independent-review-vb-form.md +50 -0
- package/docs/evidence/form-authoring-635-20261023/validation.md +76 -0
- package/docs/evidence/p1-authoring-20261022/validation.md +134 -0
- package/docs/governed-page-widget-adapter.md +58 -0
- package/docs/hot-metadata-updates.md +16 -0
- package/fesm2022/praxisui-dynamic-form.mjs +4177 -1130
- package/package.json +8 -8
- package/src/lib/config-editor/praxis-dynamic-form-config-editor.json-api.md +11 -3
- package/src/lib/praxis-dynamic-form.json-api.md +41 -7
- package/types/praxisui-dynamic-form.d.ts +310 -27
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/dynamic-form",
|
|
3
|
-
"version": "10.0.0-rc.
|
|
3
|
+
"version": "10.0.0-rc.41",
|
|
4
4
|
"description": "Angular dynamic form engine for Praxis UI: metadata-driven forms, hooks, and services integrating @praxisui/* packages.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^21.0.0",
|
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
"@angular/forms": "^21.0.0",
|
|
10
10
|
"@angular/material": "^21.0.0",
|
|
11
11
|
"@angular/router": "^21.0.0",
|
|
12
|
-
"@praxisui/ai": "^10.0.0-rc.
|
|
13
|
-
"@praxisui/dynamic-fields": "^10.0.0-rc.
|
|
14
|
-
"@praxisui/metadata-editor": "^10.0.0-rc.
|
|
15
|
-
"@praxisui/rich-content": "^10.0.0-rc.
|
|
16
|
-
"@praxisui/settings-panel": "^10.0.0-rc.
|
|
17
|
-
"@praxisui/visual-builder": "^10.0.0-rc.
|
|
18
|
-
"@praxisui/core": "^10.0.0-rc.
|
|
12
|
+
"@praxisui/ai": "^10.0.0-rc.41",
|
|
13
|
+
"@praxisui/dynamic-fields": "^10.0.0-rc.41",
|
|
14
|
+
"@praxisui/metadata-editor": "^10.0.0-rc.41",
|
|
15
|
+
"@praxisui/rich-content": "^10.0.0-rc.41",
|
|
16
|
+
"@praxisui/settings-panel": "^10.0.0-rc.41",
|
|
17
|
+
"@praxisui/visual-builder": "^10.0.0-rc.41",
|
|
18
|
+
"@praxisui/core": "^10.0.0-rc.41",
|
|
19
19
|
"rxjs": "^7.8.0"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
@@ -57,7 +57,7 @@ Este documento e a referencia canonica da API JSON de praxis-dynamic-form-config
|
|
|
57
57
|
|
|
58
58
|
- Em Geral → Dados do formulário, `Modo de dados` e `Modo de exibição` são preferências independentes.
|
|
59
59
|
- `bindings.presentationModeGlobal` reutiliza o input runtime existente: `true` = Apresentação (efetiva somente em `view`), `false` = Campos de formulário, `null`/ausência = Automático, seguindo `layoutPolicy`.
|
|
60
|
-
- Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado.
|
|
60
|
+
- Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado. A UI prefere os três modos de operação; documentos nativos também aceitam e preservam `presentation` e `dossier`, já suportados pelo runtime.
|
|
61
61
|
- O Page Builder projeta a preferência nos inputs do widget, preservando ausência de `config` em formulários schema-driven. No editor do runtime, Apply/Save também publicam `mode` e `presentationModeGlobal` em `configPatchChange.inputPatch`.
|
|
62
62
|
- `contextSnapshot.presentation` continua reservado aos estilos (tipografia, densidade e alinhamento), editáveis nos dois caminhos pela aba Estilo da apresentação; não é o seletor de ativação. O Filter Form não oferece o seletor de exibição porque seu runtime não suporta apresentação.
|
|
63
63
|
|
|
@@ -226,6 +226,14 @@ contrato explicito -> aliases legados (quando suportados) -> defaults internos -
|
|
|
226
226
|
|
|
227
227
|
Campos e aliases preservados do documento anterior devem convergir progressivamente para paths canonicos declarados.
|
|
228
228
|
|
|
229
|
+
The Rules tab separates structural completeness, property editing, sample-data
|
|
230
|
+
simulation, and form/runtime diagnostics. Review both branches and every effect
|
|
231
|
+
before applying. A successful preview does not validate target availability or
|
|
232
|
+
grant field access. Presentation rules and conditional command rules retain
|
|
233
|
+
separate channels. JSON rule replacement and Reset refresh the visual draft and
|
|
234
|
+
structured effects panel; a valid stale visual projection cannot override the
|
|
235
|
+
canonical `formRules` list. Clearing that list clears residual visual state.
|
|
236
|
+
|
|
229
237
|
### Precedence rules
|
|
230
238
|
|
|
231
239
|
Quando houver conflito entre alias e path canonico, priorizar path canonico e manter alias apenas para backward compatibility.
|
|
@@ -287,7 +295,7 @@ A entrada operacional vem via `SETTINGS_PANEL_DATA` (injetado pelo settings pane
|
|
|
287
295
|
| `backConfig` | `BackConfig` | Nao | Active | Configuracao de retorno do CRUD; fallback local quando ausente. |
|
|
288
296
|
| `formId` | `string` | Nao | Active | Identidade para persistencia auxiliar e chave de painel. |
|
|
289
297
|
| `componentKeyId` | `string` | Nao | Active | Prioridade para chave de persistencia quando informado. |
|
|
290
|
-
| `mode` | `'create' \| 'edit' \| 'view'` | Nao | Active | Inicializa `inputMode`; invalido cai para `create`. |
|
|
298
|
+
| `mode` | `'create' \| 'edit' \| 'view' \| 'presentation' \| 'dossier'` | Nao | Active | Inicializa `inputMode`; invalido cai para `create`. |
|
|
291
299
|
| `presentationMode` | `boolean` | Nao | Active | Controla exibicao da aba "Modo Apresentacao". |
|
|
292
300
|
| `runtimeContext` | `DynamicFormRuntimeContext` | Nao | Active | Contexto operacional somente leitura; pode expor `resolvedContract.schemaUrl/submitUrl/submitMethod` para diagnosticos visuais, sem persistencia no documento autoral. |
|
|
293
301
|
|
|
@@ -318,7 +326,7 @@ A entrada operacional vem via `SETTINGS_PANEL_DATA` (injetado pelo settings pane
|
|
|
318
326
|
labelAlign?: 'start' | 'center' | 'end';
|
|
319
327
|
valueAlign?: 'start' | 'center' | 'end';
|
|
320
328
|
};
|
|
321
|
-
inputsPatch: { mode: 'create' | 'edit' | 'view' };
|
|
329
|
+
inputsPatch: { mode: 'create' | 'edit' | 'view' | 'presentation' | 'dossier' };
|
|
322
330
|
schemaPrefs: {
|
|
323
331
|
notifyIfOutdated: 'inline' | 'snackbar' | 'both' | 'none';
|
|
324
332
|
snoozeMs: number;
|
|
@@ -38,7 +38,7 @@ source_of_truth:
|
|
|
38
38
|
- "projects/praxis-core/src/lib/models/form/rule-property.schema.ts"
|
|
39
39
|
- "projects/praxis-dynamic-form/docs/layout-items-visual-blocks.md"
|
|
40
40
|
source_of_truth_last_verified: "2026-08-12"
|
|
41
|
-
last_updated: "2026-
|
|
41
|
+
last_updated: "2026-10-27"
|
|
42
42
|
toc: true
|
|
43
43
|
sidebar: true
|
|
44
44
|
tags:
|
|
@@ -59,6 +59,10 @@ related_components: []
|
|
|
59
59
|
|
|
60
60
|
Este documento e a referencia canonica da API JSON de praxis-dynamic-form.
|
|
61
61
|
|
|
62
|
+
## Form runtime ownership (breaking beta correction)
|
|
63
|
+
|
|
64
|
+
Every mounted form owns its mutable `GenericCrudService` and editor field/rule context. Replacing a service in an ancestor injector no longer changes the form's client. Configure the form through `resourcePath`, `apiEndpointKey`, `apiUrlEntry`, and `customEndpoints` for a directly mounted form. Shared `HttpClient` interceptors, `API_URL` and infrastructure remain inherited. No new JSON/config field is introduced by this correction. In component tests, replace the local client with `TestBed.overrideComponent(PraxisDynamicForm, { add: { providers: [{ provide: GenericCrudService, useValue: crudMock }] } })` so the i18n provider is retained.
|
|
65
|
+
|
|
62
66
|
## Summary
|
|
63
67
|
|
|
64
68
|
- Tipo documental: API reference canonica de contrato JSON.
|
|
@@ -70,9 +74,19 @@ Este documento e a referencia canonica da API JSON de praxis-dynamic-form.
|
|
|
70
74
|
|
|
71
75
|
- Em Geral → Dados do formulário, `Modo de dados` e `Modo de exibição` são preferências independentes.
|
|
72
76
|
- `bindings.presentationModeGlobal` reutiliza o input runtime existente: `true` = Apresentação (efetiva somente em `view`), `false` = Campos de formulário, `null`/ausência = Automático, seguindo `layoutPolicy`.
|
|
73
|
-
- Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado.
|
|
77
|
+
- Em replace-all, omitir a preferência remove o override anterior; `false` deve ser preservado. A UI prefere os três modos de operação; documentos nativos preservam também `presentation` e `dossier` suportados pelo runtime.
|
|
74
78
|
- O Page Builder projeta a preferência nos inputs do widget, preservando ausência de `config` em formulários schema-driven. No editor do runtime, Apply/Save também publicam `mode` e `presentationModeGlobal` em `configPatchChange.inputPatch`.
|
|
75
79
|
- `contextSnapshot.presentation` continua reservado aos estilos (tipografia, densidade e alinhamento), editáveis nos dois caminhos pela aba Estilo da apresentação; não é o seletor de ativação. O Filter Form não oferece o seletor de exibição porque seu runtime não suporta apresentação.
|
|
80
|
+
- `presentationPreset` (`'corporate-dossier' | 'editorial-card' | 'compact-presentation' | 'default'`) define o preset visual nativo em modo apresentação (`view`). Pode ser configurado via `@Input() presentationPreset`, em `FormPresentationConfig.preset` / `FormPresentationConfig.presentationPreset`, em `FormConfigMetadata.presentationPreset`, ou por seção via `FormSection.presentationPreset` para sobrescrever o estilo de uma seção específica sem recorrer a regras CSS ad hoc com `::ng-deep`.
|
|
81
|
+
- `layout` (`FormLayoutOptions`) governa a organização e navegação estrutural das seções do formulário:
|
|
82
|
+
- `mode`: `'vertical' | 'tabs' | 'accordion'` (padrão `'vertical'`).
|
|
83
|
+
- `defaultTabId`: identificador da aba selecionada inicialmente em modo abas.
|
|
84
|
+
- `tabsAppearance`: estilo visual dos botões de abas (`'pills' | 'underline' | 'buttons'`, padrão `'pills'`).
|
|
85
|
+
- `tabs`: lista declarativa de abas (`FormLayoutTabItem` com `id`, `label`, `icon`, `sectionIds`, `badge`, `disabled`, `tooltip`). Quando omitido, o runtime auto-deriva deterministicamente 1 aba por seção visível.
|
|
86
|
+
- `accordionMulti`: quando `mode === 'accordion'`, permite manter múltiplos painéis expandidos simultaneamente (padrão `false`, fechando os outros ao abrir um).
|
|
87
|
+
- `hideSectionHeaderInTabs`: suprime cabeçalho redundante de seção dentro do painel da aba ativa (padrão `false`).
|
|
88
|
+
- Entradas `@Input() layoutMode` e `@Input() formLayout` expostas diretamente em `PraxisDynamicForm`.
|
|
89
|
+
- Saídas `@Output() tabChange` (emite ID) e `@Output() tabSelected` (emite objeto completo) emitidas na alternância de abas.
|
|
76
90
|
|
|
77
91
|
|
|
78
92
|
- `DynamicFormAuthoringDocument` e o snapshot canonico completo de autoria de `praxis-dynamic-form`.
|
|
@@ -162,16 +176,22 @@ Essa fronteira preserva a premissa de plataforma: o formulario materializa e exp
|
|
|
162
176
|
| `helpPresentation` | `FormHelpPresentationConfig` | No | `{ display: "inline" }` | Active | Politica visual para exibir `hint`/`helpText` dos campos sem alterar semantica dos DTOs; erros de validacao continuam inline. |
|
|
163
177
|
| `presentation` | `FormPresentationConfig` | No | runtime defaults | Active | Preferencias tipadas de label/value para modos read-only e presentation. Valores numericos de tamanho e largura sao materializados como comprimentos CSS em `px`; o mesmo shape alimenta o snapshot canonico do editor. |
|
|
164
178
|
| `fieldMetadata[].array` | `FieldArrayConfig` | No | n/a | Active | Contrato de Editable Collection apenas quando `fieldMetadata[].controlType === "array"` ou quando `x-ui.array` foi publicado explicitamente. |
|
|
179
|
+
| `fieldMetadata[].items` | `FieldScalarItemsSchema` | No | n/a | Active | Subconjunto escalar do JSON Schema items: type string/integer/number/boolean, format e enum opcionais. Separado de array.itemSchema.fields de objetos; constraints vêm do schema de operação e não podem ser ampliadas pela config salva. |
|
|
165
180
|
|
|
166
181
|
Nota editorial:
|
|
167
182
|
- `praxis-dynamic-form` carrega e orquestra `FieldMetadata`, mas a resolução de `valuePresentation` em display/read-only pertence ao runtime de `@praxisui/dynamic-fields`.
|
|
168
183
|
- `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.
|
|
169
184
|
- `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.
|
|
185
|
+
- Campos de schema `customFields.<key>` preservam `customField`, `customFieldKey` e `customFieldScope` projetados pelo core. O nome pontuado identifica um controle aninhado; `formData`/payload HTTP continuam `{ "customFields": { "<key>": valor } }`. Hidratação de datas, serialização de datas/lookups e políticas de omissão usam esse caminho, sem adapter do host. Valores ausentes não criam containers; campos vazios dirty ou obrigatórios mantêm a semântica dos campos planos.
|
|
186
|
+
- A normalização temporal usa metadata de campo e `array.itemSchema.fields`: tuples legadas de data e strings datetime locais são convertidas apenas em campos temporais declarados. Arrays numéricos/desconhecidos como `[2026, 10, 27]` não viram datas; strings comuns/desconhecidas conservam espaços e texto semelhante a datetime. `DateInput` segue a serialização de data sem horário.
|
|
187
|
+
- Arrays escalares com `items` usam `normalizeScalarArrayValue` de Core na validação e projeção do payload. Tokens devem corresponder ao tipo declarado (números JSON finitos, inteiros seguros, booleanos exatos e formatos date/date-time suportados), e o enum é aplicado após conversão. Não há conversão parcial nem descarte de itens inválidos; item `null` é inválido, enquanto container opcional `null`/ausente e `[]` permanecem distintos. `array.itemSchema.fields` de objetos é outro contrato. Isso permite materializar operandos `IN` tipados sem inferir semântica de busca a partir de arrays ou labels.
|
|
188
|
+
- O rebuild no mesmo contexto preserva dirty/touched por caminhos aninhados de controles e itens, sem marcar irmãos não tocados. Isso não é autosave universal entre resets, retries ou troca de registro/tenant.
|
|
189
|
+
- Na migração de configuração salva, um container colidente cede aos filhos diretos do schema, mesmo com `source: "local"`; campos locais não colidentes continuam preservados. Restrições herdadas de UI não equivalem a política de omissão no submit.
|
|
170
190
|
- 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.
|
|
171
191
|
- 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.
|
|
172
|
-
- O evento `payloadPreviewChange` projeta o payload persistível atual sem executar hooks de submit nem disparar HTTP. `formData` usa o mesmo pipeline síncrono de normalização/políticas do submit, `rawFormData` preserva o estado completo e `changedFields` lista somente paths de controles dirty.
|
|
192
|
+
- O evento `payloadPreviewChange` projeta o payload persistível atual sem executar hooks de submit nem disparar HTTP. `formData` usa o mesmo pipeline síncrono de normalização/políticas do submit, `rawFormData` preserva o estado completo e `changedFields` lista somente paths de controles dirty. Uma projeção scalar inválida emite `formData: null` e `isValid: false`, preservando `rawFormData` para correção; consumidores não devem aplicá-la.
|
|
173
193
|
- Botões com `type="reset"` preservam a semântica canônica de reset mesmo quando recebem um `id` editorial próprio. O runtime impede o reset nativo do navegador, restaura o snapshot hidratado, marca o formulário como pristine/untouched e publica nova prévia com `reason: "reset"`.
|
|
174
|
-
- Configs persistidas
|
|
194
|
+
- Configs persistidas passam pela reconciliação com o schema estrutural antes da montagem, inclusive quando a leitura bem-sucedida retorna definições vazias. Falhas de leitura/normalização/reconciliação bloqueiam a inicialização em vez de declarar pronta a configuração salva. Campos locais explícitos não colidentes são preservados, mas campos server-backed recebem novamente a semântica publicada pelo backend, incluindo `endpoint`, `resourcePath`, `optionLabelKey` e `optionValueKey`.
|
|
175
195
|
- 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`.
|
|
176
196
|
|
|
177
197
|
### Supported legacy paths
|
|
@@ -268,7 +288,7 @@ of initial values: a contextual `resourceId` never triggers entity hydration.
|
|
|
268
288
|
| `config` | `FormConfig` | Conditional | component-input | `normalizeFormConfig(config)` | Contrato principal quando fornecido diretamente pelo host. |
|
|
269
289
|
| `resourcePath` | `string \| undefined` | Conditional | component-input | `crud.configure(resourcePath)` | Endpoint base para schema e dados remotos. Alternativa canônica: `schemaUrl` explícito. |
|
|
270
290
|
| `resourceId` | `string \| number \| undefined` | No | component-input | update `pendingEntityId`; hydrate only in `edit/view` | Carrega entidade em modo `edit/view`. Em `create`, pode identificar o item dono de um comando sem iniciar leitura nem bloquear os campos. |
|
|
271
|
-
| `mode` | `'create' \| 'edit' \| 'view'` | No | component-input/storage | persistido em `formInputsKey` | Preferência de modo pode ser hidratada do storage. |
|
|
291
|
+
| `mode` | `'create' \| 'edit' \| 'view' \| 'presentation' \| 'dossier'` | No | component-input/storage | persistido em `formInputsKey` | Preferência de modo pode ser hidratada do storage. |
|
|
272
292
|
| `schemaSource` | `'resource' \| 'filter'` | No | component-input | runtime branch | Seleciona caminho de obtenção de schema quando `schemaUrl` não é informado. |
|
|
273
293
|
| `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`. |
|
|
274
294
|
| `readUrl` | `string \| null \| undefined` | No | component-input | resolved via API origin and `{id}` placeholders | URL concreta de leitura publicada por surface `VIEW`/`READ_PROJECTION`; quando presente, substitui `crud.getById` na hidratação da entidade. |
|
|
@@ -613,7 +633,7 @@ No ecossistema Praxis, ele funciona tanto como runtime final quanto como superfi
|
|
|
613
633
|
| `config` | `FormConfig` | `{ sections: [] }` | Active | Contrato principal consumido no ciclo inteiro. `sections` é opcional somente para forms schema-driven com grounding explícito (`metadata.source='schema'`, schema metadata ou fonte runtime como `schemaUrl`/`resourcePath`); ausência de layout manual é normalizada internamente como array vazio e permite que `layoutPolicy`/schema materializem agrupamentos. |
|
|
614
634
|
| `resourcePath` | `string \| undefined` | `undefined` | Active | Habilita carga de schema/dados remotos. Opcional quando `schemaUrl` explícito é fornecido. |
|
|
615
635
|
| `resourceId` | `string \| number \| undefined` | `undefined` | Active | Carrega entidade no modo `edit/view`; em `create`, funciona apenas como contexto do item e não dispara hidratação. |
|
|
616
|
-
| `mode` | `'create' \| 'edit' \| 'view'` | `'create'` | Active | Governa submit, leitura e apresentacao. |
|
|
636
|
+
| `mode` | `'create' \| 'edit' \| 'view' \| 'presentation' \| 'dossier'` | `'create'` | Active | Governa submit, leitura e apresentacao. |
|
|
617
637
|
| `schemaSource` | `'resource' \| 'filter'` | `'resource'` | Active | Seleciona origem do schema remoto. |
|
|
618
638
|
| `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`. |
|
|
619
639
|
| `readUrl` | `string \| undefined` | `undefined` | Active | Hidrata dados de surfaces de leitura/projecao pelo endpoint publicado, preservando `resourcePath` como recurso dono. |
|
|
@@ -631,7 +651,7 @@ No ecossistema Praxis, ele funciona tanto como runtime final quanto como superfi
|
|
|
631
651
|
| `enableCustomization` | `boolean` | `false` | Active | Habilita UX de customizacao do layout. |
|
|
632
652
|
| `formId` | `string \| undefined` | `undefined` | Active | Chave de persistencia e identidade logica. |
|
|
633
653
|
| `componentInstanceId` | `string \| undefined` | `undefined` | Active | Isola instancias com mesmo `formId`. |
|
|
634
|
-
| `configPersistenceStrategy` | `'local-first' \| 'input-first'` | `'local-first'` | Active | Em `input-first`, os inputs fornecidos pelo host, inclusive `mode`, permanecem autoritativos sobre preferencias persistidas da mesma instancia.
|
|
654
|
+
| `configPersistenceStrategy` | `'local-first' \| 'input-first' \| 'volatile'` | `'local-first'` | Active | Em `input-first`, os inputs fornecidos pelo host, inclusive `mode`, permanecem autoritativos sobre preferencias persistidas da mesma instancia. Use `volatile` para filhos controlados pela página: não lê, grava nem limpa preferências próprias ou conexão persistida. `layoutPolicy.persistence='transient'` continua governando a persistência do layout gerado. |
|
|
635
655
|
| `layout` | `FormLayout \| undefined` | `undefined` | Partial | Funciona como override estrutural em parte dos fluxos de layout/editor. |
|
|
636
656
|
| `generatedLayoutPreset` | `'default' \| 'compactPresentation'` | `'default'` | Active | Usado apenas ao criar a configuracao inicial a partir de schema/metadata; nao reprocessa layouts persistidos ou authorados. |
|
|
637
657
|
| `layoutPolicy` | `DynamicFormLayoutPolicy \| null` | `null` | Active | Politica opt-in para materializar layout a partir do schema atual. Use `source: 'schema'` com `persistence: 'transient'` para detalhe/read-only e command forms schema-driven sem persistir `sections` geradas nem reabrir configuracao local salva; politicas de host em `config`, como `helpPresentation`, continuam sendo aplicadas ao layout materializado. Em `mode='view'`, `intent: 'detail'` ou `preset: 'compactPresentation'` ativa apresentacao quando `presentationModeGlobal` nao foi informado; use `[presentationModeGlobal]=false` para controles read-only tradicionais. No preset `compactPresentation`, `x-ui.width` explicito empacota campos em linhas de 12 colunas e tem precedencia sobre `detailSummary.columns` por default; campos sem width permanecem full-width, a menos que `detailSummary.columns`/`responsiveColumns` declare a densidade do resumo. Use `detailSummary.widthPrecedence='summary'` quando a densidade do resumo read-only deve sobrescrever `x-ui.width` apenas nessa surface compacta. No preset `groupedCommand`, `groupedCommand.orphanFieldExpansion` controla linhas logicas com um unico campo: `medium-and-wide` (default) expande spans 6/8, `preserve` mantem o width publicado e `all` tambem expande campos compactos. `groupedCommand.partialRowStrategy` usa `preserve` por default; `fill-compatible` particiona o grupo nas linhas visuais depois de resolver visibilidade responsiva, CSS `order` e wrap em cada breakpoint/container, projeta cada linha parcial elegivel em spans canônicos que completam 12 colunas e mapeia o resultado de volta as colunas authoradas apenas para renderizacao, sem alterar `x-ui.width`, `sections` ou o documento de authoring. Um singleton elegivel criado por wrap pode preencher sua linha visual; controles compactos, uploads e tipos desconhecidos preservam seus spans. `groupedCommand.contextFields` identifica campos schema-backed já hidratados pela surface: eles permanecem no `FormGroup` e no payload, mas não renderizam controles redundantes. Use `responsiveColumns`, por exemplo `{ lg: 3, md: 2, sm: 1 }`, para drawers, side sheets e painéis corporativos estreitos sem copiar `FormConfig.sections` locais. `schemaType` e `schemaOperation` sao validados contra `schemaUrl` quando a URL declara esses parametros. |
|
|
@@ -944,6 +964,13 @@ O runtime emite `target-not-found` quando uma regra aponta para `section`, `row`
|
|
|
944
964
|
3. Cobertura de `messages` e parcial para chaves fora do fluxo principal de submit/confirmacao.
|
|
945
965
|
4. Ainda falta bateria de stress dedicada para corrida teardown/render alem de `NG0205`.
|
|
946
966
|
5. `hints` permanece no contrato/editor sem exposicao no template principal.
|
|
967
|
+
6. A política canônica Metadata rejeita nomes reservados que colidem com controles Angular; suporte own-key no helper de payload não relaxa essa admissão. Definições persistidas antigas exigem migração backend.
|
|
968
|
+
7. Read-only/disabled não significa omissão automática. O request de comando canônico exclui custom fields read-only; o schema response continua disponível para leitura. Use o request exato da operação, sem mesclar response ou inventar um mapping local de `x-ui.submitPolicy`.
|
|
969
|
+
8. Record paths de regras calculadas não atravessam arrays intermediários. A recursão por `array.itemSchema.fields` no submit é um caminho distinto; scalar `items` também tem contrato próprio.
|
|
970
|
+
9. Um novo ciclo revalida HTTP; L1 compilado não estabelece readiness. Cache só fornece corpo após 304 correspondente, nunca como fallback de status 0/401/403. Loading/erro de schema e contexto enterprise conhecido não confirmado bloqueiam submit. Retry não promete autosave entre registros, tenants ou resets.
|
|
971
|
+
10. Schema vazio bem-sucedido é autoritativo. Reconciliação e sync manual ocultam/desabilitam e omitem órfãos server-backed; Filter também bloqueia sua validação e projeção aplicável, mantendo locais explícitos e campos hidden legítimos. Reaparecimento usa as restrições atuais do servidor. Identidade invisível ao snapshot de headers continua exigindo versão confirmada de contexto ou invalidação de todo o escopo cache/sessão no host.
|
|
972
|
+
|
|
973
|
+
Consulte a [revisão de adoção corporativa](https://github.com/codexrodrigues/praxis-ui-angular/pull/658) para fontes, cenários, gates e pendências.
|
|
947
974
|
|
|
948
975
|
### Source references
|
|
949
976
|
|
|
@@ -1138,3 +1165,10 @@ O editor nativo, em **Geral → Sem registro selecionado**, materializa o contra
|
|
|
1138
1165
|
As opções de aparência ficam em disclosure avançado: `tone` (`neutral`, `primary`, `secondary`), `variant` (`card`, `inline`, `panel`, `transparent`), `alignment` (`start`, `center`), `density` (`compact`, `comfortable`) e `iconContainer` (`none`, `circle`, `soft`). Ausência de opção herda o padrão do componente; JSON inválido produz diagnóstico.
|
|
1139
1166
|
|
|
1140
1167
|
A orientação aparece somente em `mode=view`, sem registro selecionado nem snapshot local. Criar e Editar preservam a configuração sem exibi-la. Desligar grava `null`, que impede reativação por uma preferência antiga; substituir um documento que omite o binding também limpa a orientação. Em `input-first`, a página governa o valor. Filter Form não expõe essa seção, pois não possui contexto de seleção equivalente.
|
|
1168
|
+
### Item revision custody
|
|
1169
|
+
|
|
1170
|
+
Automatic edit PUT/PATCH sends the strong ETag from the same hydration GET that supplied the form values, including `readUrl` and custom `getById`. A successful response containing the corresponding item representation replaces both cached data and revision together, including server normalization. A command acknowledgment or incomplete representation cannot rotate that snapshot. Missing/weak ETags are not synthesized; 412/428 requires explicit reload before another automatic submit.
|
|
1171
|
+
|
|
1172
|
+
Item/API-context changes, reload and destruction invalidate the transient read generation, including identity or enterprise-scope A→B→A. Automatic preparation captures its original binding/generation before asynchronous hooks or determinations. An obsolete preparation does not submit; if its hook retained the reused form group, another submit requires explicit reload to reconcile any contaminated draft. Obsolete success/error responses cannot publish formSubmit stages, run submit result hooks, change fields/errors, close the new surface or reset a newer submit's loading/snackbar state.
|
|
1173
|
+
|
|
1174
|
+
This adds no persisted configuration field. Explicit `submitResourceVersion` and cross-resource version-target inputs retain their command precedence and response/event semantics; their responses do not hydrate or rotate the originating item snapshot.
|