@praxisui/dynamic-form 9.0.4-rc.15 → 9.0.4-rc.17

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.
@@ -6013,7 +6013,7 @@ function pruneUndefined(value) {
6013
6013
  * Manifesto de authoring canônico para o componente praxis-dynamic-form.
6014
6014
  * Este arquivo define as operações permitidas pela IA para editar formulários.
6015
6015
  *
6016
- * @version 1.5.0
6016
+ * @version 1.5.1
6017
6017
  * @status COMPLIANT - Alinhado com contrato v2, gate de aceitação e semântica local/schema-backed.
6018
6018
  */
6019
6019
  const PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST = {
@@ -6021,13 +6021,14 @@ const PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST = {
6021
6021
  componentId: 'praxis-dynamic-form',
6022
6022
  ownerPackage: '@praxisui/dynamic-form',
6023
6023
  configSchemaId: 'FormConfig',
6024
- manifestVersion: '1.5.0',
6024
+ manifestVersion: '1.5.1',
6025
6025
  runtimeInputs: [
6026
6026
  { name: 'showAiAssistant', type: 'boolean', description: 'Mostra os gatilhos do copiloto semantico Praxis' },
6027
6027
  { name: 'config', type: 'FormConfig', description: 'Configuração do formulário; sections é opcional em forms schema-driven e não deve ser criado como array vazio apenas para satisfazer TypeScript.' },
6028
6028
  { name: 'resourcePath', type: 'string', description: 'Caminho do recurso (API)' },
6029
6029
  { name: 'readUrl', type: 'string', description: 'Endpoint canonico de leitura para surfaces VIEW/READ_PROJECTION' },
6030
6030
  { name: 'mode', type: 'string', allowedValues: ['create', 'edit', 'view'], description: 'Modo de operação' },
6031
+ { name: 'configPersistenceStrategy', type: 'string', allowedValues: ['local-first', 'input-first'], description: 'Precedência entre configuração persistida e contrato explícito do host. Use input-first em dialogs e surfaces transitórias governadas por schema para preservar mode e estados operacionais publicados pelo servidor.' },
6031
6032
  { name: 'generatedLayoutPreset', type: 'string', allowedValues: ['default', 'compactPresentation'], description: 'Preset usado apenas ao gerar a configuracao inicial a partir de metadata/schema; nao reprocessa layouts persistidos ou autorados.' },
6032
6033
  { name: 'layoutPolicy', type: 'DynamicFormLayoutPolicy', description: 'Politica opt-in para layout schema-driven transient. Use source=schema apenas quando o backend schema for a fonte canonica do agrupamento; use detailSummary para seleção de campos e densidade responsiva do resumo read-only compacto sem FormConfig.sections locais. Quando o resumo precisar vencer x-ui.width publicado para outras surfaces, use detailSummary.widthPrecedence=summary. Em groupedCommand, orphanFieldExpansion governa linhas com um unico campo; medium-and-wide e o default corporativo.' },
6033
6034
  { name: 'fieldIconPolicy', type: 'string', allowedValues: ['all', 'presentation-only', 'none'], description: 'Politica visual do host para icones prefix/suffix de campos vindos da metadata. Use presentation-only para manter icones decorativos em apresentacao e ocultar em controles tradicionais.' },
@@ -11756,7 +11757,9 @@ class PraxisDynamicForm {
11756
11757
  inputsLoadTimeout = setTimeout(finishInputsLoad, FORM_INPUT_PREFS_LOAD_TIMEOUT_MS);
11757
11758
  this.asyncConfigStorage.loadConfig(inputsKey).pipe(take(1)).subscribe({
11758
11759
  next: (inputsPref) => {
11759
- if (inputsPref && typeof inputsPref === 'object') {
11760
+ if (this.configPersistenceStrategy !== 'input-first' &&
11761
+ inputsPref &&
11762
+ typeof inputsPref === 'object') {
11760
11763
  if (inputsPref.mode === 'create' || inputsPref.mode === 'edit' || inputsPref.mode === 'view') {
11761
11764
  this.mode = inputsPref.mode;
11762
11765
  this.debugLog('🔧 Applied persisted input mode', { mode: this.mode });
@@ -12390,6 +12393,23 @@ class PraxisDynamicForm {
12390
12393
  }
12391
12394
  loadEntity() {
12392
12395
  this.debugLog('[PDF] loadEntity:start', { id: this.pendingEntityId });
12396
+ // CREATE may still carry a resourceId when the form materializes an
12397
+ // item-scoped command (approve, deactivate, reactivate, etc.). In that
12398
+ // case the id belongs to the command context and must not trigger an
12399
+ // entity read/hydration cycle. Command defaults are supplied explicitly
12400
+ // through initialValue.
12401
+ if (this.mode === 'create') {
12402
+ this.entityHydrationPending = false;
12403
+ const normalized = this.getNormalizedInitialValue();
12404
+ if (normalized && Object.keys(this.form.controls || {}).length) {
12405
+ this.form.patchValue(normalized, { emitEvent: false });
12406
+ }
12407
+ this.flushEntityHydrationState();
12408
+ this.debugLog('[PDF] loadEntity:skipped-create-mode', {
12409
+ id: this.pendingEntityId,
12410
+ });
12411
+ return;
12412
+ }
12393
12413
  if (this.pendingEntityId == null) {
12394
12414
  this.entityHydrationPending = false;
12395
12415
  return;
@@ -30965,7 +30985,7 @@ const PRAXIS_DYNAMIC_FORM_COMPONENT_METADATA = {
30965
30985
  { name: 'showAiAssistant', type: 'boolean', default: true, description: 'Mostra os gatilhos do copiloto semantico Praxis para esta instancia do formulario' },
30966
30986
  { name: 'formId', type: 'string', description: 'Chave para persistencia local da configuracao' },
30967
30987
  { name: 'componentInstanceId', type: 'string', description: 'Identificador estavel para instancias multiplas do formulario' },
30968
- { name: 'configPersistenceStrategy', type: "'local-first' | 'input-first'", default: 'local-first', description: 'Define se a configuracao local persistida ou a configuracao recebida por input tem precedencia na hidratacao.' },
30988
+ { name: 'configPersistenceStrategy', type: "'local-first' | 'input-first'", default: 'local-first', description: 'Define se a configuracao local persistida ou os inputs do host tem precedencia; input-first preserva inclusive o mode explicito contra preferencias persistidas.' },
30969
30989
  { name: 'layout', type: 'FormLayout', description: 'Layout opcional em vez do gerado' },
30970
30990
  { name: 'generatedLayoutPreset', type: "'default' | 'compactPresentation'", default: 'default', description: 'Preset usado apenas ao criar a configuracao inicial a partir de metadata/schema.' },
30971
30991
  { name: 'layoutPolicy', type: 'DynamicFormLayoutPolicy | null', description: 'Politica opt-in para materializar layout a partir do schema sem persistir sections geradas por padrao.' },
@@ -34994,6 +35014,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
34994
35014
  */
34995
35015
  const ENUMS = {
34996
35016
  mode: ['create', 'edit', 'view'],
35017
+ configPersistenceStrategy: ['local-first', 'input-first'],
34997
35018
  schemaSource: ['resource', 'filter'],
34998
35019
  generatedLayoutPreset: ['default', 'compactPresentation'],
34999
35020
  layoutPolicySource: ['authored', 'schema'],
@@ -35171,6 +35192,14 @@ const FORM_COMPONENT_AI_CAPABILITIES = {
35171
35192
  description: 'Preset usado somente na criacao inicial de FormConfig a partir de schema/metadata.',
35172
35193
  safetyNotes: 'Nao reprocessa layouts ja persistidos ou authorados.',
35173
35194
  },
35195
+ {
35196
+ path: 'inputs.configPersistenceStrategy',
35197
+ category: 'inputs',
35198
+ valueKind: 'enum',
35199
+ allowedValues: ENUMS.configPersistenceStrategy,
35200
+ description: 'Define se preferências locais persistidas ou o contrato explícito do host governam a materialização corrente.',
35201
+ safetyNotes: 'Use input-first em commands e surfaces transitórias; isso impede que mode e estados operacionais antigos sobrescrevam o schema atual.',
35202
+ },
35174
35203
  {
35175
35204
  path: 'inputs.layoutPolicy',
35176
35205
  category: 'inputs',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-form",
3
- "version": "9.0.4-rc.15",
3
+ "version": "9.0.4-rc.17",
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": "^9.0.4-rc.15",
13
- "@praxisui/dynamic-fields": "^9.0.4-rc.15",
14
- "@praxisui/metadata-editor": "^9.0.4-rc.15",
15
- "@praxisui/rich-content": "^9.0.4-rc.15",
16
- "@praxisui/settings-panel": "^9.0.4-rc.15",
17
- "@praxisui/visual-builder": "^9.0.4-rc.15",
18
- "@praxisui/core": "^9.0.4-rc.15",
12
+ "@praxisui/ai": "^9.0.4-rc.17",
13
+ "@praxisui/dynamic-fields": "^9.0.4-rc.17",
14
+ "@praxisui/metadata-editor": "^9.0.4-rc.17",
15
+ "@praxisui/rich-content": "^9.0.4-rc.17",
16
+ "@praxisui/settings-panel": "^9.0.4-rc.17",
17
+ "@praxisui/visual-builder": "^9.0.4-rc.17",
18
+ "@praxisui/core": "^9.0.4-rc.17",
19
19
  "rxjs": "^7.8.0"
20
20
  },
21
21
  "dependencies": {
@@ -232,14 +232,16 @@ O host deve persistir `formSubmit.formData` para fluxos normais. `formSubmit.raw
232
232
  ### Input bindings
233
233
 
234
234
  `initialValue` is an active component input for host-authored or complementary
235
- field values. The runtime applies it as local initial state without redefining
236
- the canonical remote entity loaded through `resourcePath` and `resourceId`.
235
+ field values. In `edit/view`, the runtime applies it without redefining the
236
+ canonical remote entity loaded through `resourcePath` and `resourceId`. In
237
+ `create`, including item-scoped command forms, it is the only supported source
238
+ of initial values: a contextual `resourceId` never triggers entity hydration.
237
239
 
238
240
  | Binding/Path | Type | Required | Source | Runtime normalization | Notes |
239
241
  | --- | --- | --- | --- | --- | --- |
240
242
  | `config` | `FormConfig` | Conditional | component-input | `normalizeFormConfig(config)` | Contrato principal quando fornecido diretamente pelo host. |
241
243
  | `resourcePath` | `string \| undefined` | Conditional | component-input | `crud.configure(resourcePath)` | Endpoint base para schema e dados remotos. Alternativa canônica: `schemaUrl` explícito. |
242
- | `resourceId` | `string \| number \| undefined` | No | component-input | update `pendingEntityId` + `loadEntity()` | Carrega entidade em modo `edit/view`. |
244
+ | `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. |
243
245
  | `mode` | `'create' \| 'edit' \| 'view'` | No | component-input/storage | persistido em `formInputsKey` | Preferência de modo pode ser hidratada do storage. |
244
246
  | `schemaSource` | `'resource' \| 'filter'` | No | component-input | runtime branch | Seleciona caminho de obtenção de schema quando `schemaUrl` não é informado. |
245
247
  | `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`. |
@@ -569,7 +571,7 @@ No ecossistema Praxis, ele funciona tanto como runtime final quanto como superfi
569
571
  | --- | --- | --- | --- | --- |
570
572
  | `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. |
571
573
  | `resourcePath` | `string \| undefined` | `undefined` | Active | Habilita carga de schema/dados remotos. Opcional quando `schemaUrl` explícito é fornecido. |
572
- | `resourceId` | `string \| number \| undefined` | `undefined` | Active | Carrega entidade no modo `edit/view`. |
574
+ | `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. |
573
575
  | `mode` | `'create' \| 'edit' \| 'view'` | `'create'` | Active | Governa submit, leitura e apresentacao. |
574
576
  | `schemaSource` | `'resource' \| 'filter'` | `'resource'` | Active | Seleciona origem do schema remoto. |
575
577
  | `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`. |
@@ -586,6 +588,7 @@ No ecossistema Praxis, ele funciona tanto como runtime final quanto como superfi
586
588
  | `enableCustomization` | `boolean` | `false` | Active | Habilita UX de customizacao do layout. |
587
589
  | `formId` | `string \| undefined` | `undefined` | Active | Chave de persistencia e identidade logica. |
588
590
  | `componentInstanceId` | `string \| undefined` | `undefined` | Active | Isola instancias com mesmo `formId`. |
591
+ | `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. |
589
592
  | `layout` | `FormLayout \| undefined` | `undefined` | Partial | Funciona como override estrutural em parte dos fluxos de layout/editor. |
590
593
  | `generatedLayoutPreset` | `'default' \| 'compactPresentation'` | `'default'` | Active | Usado apenas ao criar a configuracao inicial a partir de schema/metadata; nao reprocessa layouts persistidos ou authorados. |
591
594
  | `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 com um unico campo: `medium-and-wide` (default) expande spans 6/8, `preserve` mantem o width publicado e `all` tambem expande campos compactos. 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. |
@@ -703,7 +706,7 @@ Validado em 2026-04-23 contra `praxis-api-quickstart` publicado no Render com
703
706
 
704
707
  #### Data mode e fluxo
705
708
 
706
- - `mode='create'`: cria registro, carga de entidade opcional.
709
+ - `mode='create'`: cria registro ou materializa um comando; nunca carrega a entidade por `resourceId`, e valores iniciais devem vir de `initialValue`.
707
710
  - `mode='edit'`: carrega entidade por `resourceId` quando disponivel.
708
711
  - `mode='view'`: foco em leitura/apresentacao; actions de edicao podem ser suprimidas.
709
712
 
@@ -2776,7 +2776,7 @@ declare function buildDynamicFormRuleAuthoringContext(config: Pick<FormConfig, '
2776
2776
  * Manifesto de authoring canônico para o componente praxis-dynamic-form.
2777
2777
  * Este arquivo define as operações permitidas pela IA para editar formulários.
2778
2778
  *
2779
- * @version 1.5.0
2779
+ * @version 1.5.1
2780
2780
  * @status COMPLIANT - Alinhado com contrato v2, gate de aceitação e semântica local/schema-backed.
2781
2781
  */
2782
2782
  declare const PRAXIS_DYNAMIC_FORM_AUTHORING_MANIFEST: ComponentAuthoringManifest;