@praxisui/dynamic-form 10.0.0-rc.4 → 10.0.0-rc.40

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-form",
3
- "version": "10.0.0-rc.4",
3
+ "version": "10.0.0-rc.40",
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.4",
13
- "@praxisui/dynamic-fields": "^10.0.0-rc.4",
14
- "@praxisui/metadata-editor": "^10.0.0-rc.4",
15
- "@praxisui/rich-content": "^10.0.0-rc.4",
16
- "@praxisui/settings-panel": "^10.0.0-rc.4",
17
- "@praxisui/visual-builder": "^10.0.0-rc.4",
18
- "@praxisui/core": "^10.0.0-rc.4",
12
+ "@praxisui/ai": "^10.0.0-rc.40",
13
+ "@praxisui/dynamic-fields": "^10.0.0-rc.40",
14
+ "@praxisui/metadata-editor": "^10.0.0-rc.40",
15
+ "@praxisui/rich-content": "^10.0.0-rc.40",
16
+ "@praxisui/settings-panel": "^10.0.0-rc.40",
17
+ "@praxisui/visual-builder": "^10.0.0-rc.40",
18
+ "@praxisui/core": "^10.0.0-rc.40",
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. Não existe um quarto valor em `bindings.mode`.
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-08-12"
41
+ last_updated: "2026-10-22"
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. Não existe um quarto valor em `bindings.mode`.
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`.
@@ -268,7 +282,7 @@ of initial values: a contextual `resourceId` never triggers entity hydration.
268
282
  | `config` | `FormConfig` | Conditional | component-input | `normalizeFormConfig(config)` | Contrato principal quando fornecido diretamente pelo host. |
269
283
  | `resourcePath` | `string \| undefined` | Conditional | component-input | `crud.configure(resourcePath)` | Endpoint base para schema e dados remotos. Alternativa canônica: `schemaUrl` explícito. |
270
284
  | `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. |
285
+ | `mode` | `'create' \| 'edit' \| 'view' \| 'presentation' \| 'dossier'` | No | component-input/storage | persistido em `formInputsKey` | Preferência de modo pode ser hidratada do storage. |
272
286
  | `schemaSource` | `'resource' \| 'filter'` | No | component-input | runtime branch | Seleciona caminho de obtenção de schema quando `schemaUrl` não é informado. |
273
287
  | `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
288
  | `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 +627,7 @@ No ecossistema Praxis, ele funciona tanto como runtime final quanto como superfi
613
627
  | `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
628
  | `resourcePath` | `string \| undefined` | `undefined` | Active | Habilita carga de schema/dados remotos. Opcional quando `schemaUrl` explícito é fornecido. |
615
629
  | `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. |
630
+ | `mode` | `'create' \| 'edit' \| 'view' \| 'presentation' \| 'dossier'` | `'create'` | Active | Governa submit, leitura e apresentacao. |
617
631
  | `schemaSource` | `'resource' \| 'filter'` | `'resource'` | Active | Seleciona origem do schema remoto. |
618
632
  | `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
633
  | `readUrl` | `string \| undefined` | `undefined` | Active | Hidrata dados de surfaces de leitura/projecao pelo endpoint publicado, preservando `resourcePath` como recurso dono. |
@@ -631,7 +645,7 @@ No ecossistema Praxis, ele funciona tanto como runtime final quanto como superfi
631
645
  | `enableCustomization` | `boolean` | `false` | Active | Habilita UX de customizacao do layout. |
632
646
  | `formId` | `string \| undefined` | `undefined` | Active | Chave de persistencia e identidade logica. |
633
647
  | `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. Combine com `layoutPolicy.persistence='transient'` em commands efemeros para nao carregar nem gravar layout local. |
648
+ | `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
649
  | `layout` | `FormLayout \| undefined` | `undefined` | Partial | Funciona como override estrutural em parte dos fluxos de layout/editor. |
636
650
  | `generatedLayoutPreset` | `'default' \| 'compactPresentation'` | `'default'` | Active | Usado apenas ao criar a configuracao inicial a partir de schema/metadata; nao reprocessa layouts persistidos ou authorados. |
637
651
  | `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. |
@@ -1138,3 +1152,10 @@ O editor nativo, em **Geral → Sem registro selecionado**, materializa o contra
1138
1152
  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
1153
 
1140
1154
  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.
1155
+ ### Item revision custody
1156
+
1157
+ 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.
1158
+
1159
+ 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.
1160
+
1161
+ 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.