@praxisui/dynamic-fields 9.0.0-beta.7 → 9.0.0-beta.71

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.
Files changed (21) hide show
  1. package/README.md +9 -1
  2. package/ai/component-registry.json +266480 -0
  3. package/docs/dynamic-fields-field-catalog.md +2 -3
  4. package/docs/dynamic-fields-field-selection-guide.md +27 -3
  5. package/docs/dynamic-fields-inline-components-guide.md +27 -6
  6. package/docs/dynamic-fields-inline-filter-runtime-contract.md +11 -0
  7. package/fesm2022/praxisui-dynamic-fields.mjs +2043 -607
  8. package/package.json +8 -4
  9. package/src/lib/base/pdx-base-input-runtime-contract.json-api.md +16 -0
  10. package/src/lib/components/field-shell/praxis-field-shell.json-api.md +33 -3
  11. package/src/lib/components/inline-date/pdx-inline-date.json-api.md +1 -1
  12. package/src/lib/components/inline-entity-lookup/pdx-inline-entity-lookup.json-api.md +1 -0
  13. package/src/lib/components/inline-number/pdx-inline-number.json-api.md +1 -0
  14. package/src/lib/components/inline-relative-period/pdx-inline-relative-period.json-api.md +2 -2
  15. package/src/lib/components/inline-time-range/pdx-inline-time-range.json-api.md +2 -2
  16. package/src/lib/components/material-async-select/pdx-material-async-select.json-api.md +13 -4
  17. package/src/lib/components/material-checkbox-group/pdx-material-checkbox-group.json-api.md +5 -3
  18. package/src/lib/components/material-file-upload/pdx-material-file-upload.json-api.md +58 -27
  19. package/src/lib/components/material-searchable-select/pdx-material-searchable-select.json-api.md +10 -3
  20. package/src/lib/components/material-textarea/pdx-material-textarea.json-api.md +1 -1
  21. package/types/praxisui-dynamic-fields.d.ts +113 -11
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-fields",
3
- "version": "9.0.0-beta.7",
3
+ "version": "9.0.0-beta.71",
4
4
  "description": "Angular Material-based dynamic form fields for Praxis UI with lazy loading and metadata-driven rendering.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
@@ -11,8 +11,8 @@
11
11
  "@angular/platform-browser": "^21.0.0",
12
12
  "@angular/router": "^21.0.0",
13
13
  "rxjs": "^7.8.0",
14
- "@praxisui/core": "^9.0.0-beta.7",
15
- "@praxisui/cron-builder": "^9.0.0-beta.7"
14
+ "@praxisui/core": "^9.0.0-beta.71",
15
+ "@praxisui/cron-builder": "^9.0.0-beta.71"
16
16
  },
17
17
  "dependencies": {
18
18
  "libphonenumber-js": "^1.12.41",
@@ -26,6 +26,7 @@
26
26
  "keywords": [
27
27
  "angular",
28
28
  "praxisui",
29
+ "praxis",
29
30
  "dynamic-fields",
30
31
  "material",
31
32
  "metadata-driven",
@@ -42,7 +43,10 @@
42
43
  ".": {
43
44
  "types": "./types/praxisui-dynamic-fields.d.ts",
44
45
  "default": "./fesm2022/praxisui-dynamic-fields.mjs"
46
+ },
47
+ "./ai/component-registry.json": {
48
+ "default": "./ai/component-registry.json"
45
49
  }
46
50
  },
47
51
  "type": "module"
48
- }
52
+ }
@@ -349,6 +349,9 @@ Limites:
349
349
  | `metadata.validators.showInlineErrors` | `boolean` | Active | Forca/desliga exibicao inline de erros. |
350
350
  | `metadata.errorStateMatcher` | enum | Active | Estrategia de estado de erro usada pelo matcher utilitario. |
351
351
  | `metadata.hint` | `string` | Active | Exibe dica quando nao ha erro. |
352
+ | `metadata.helpText` | `string` | Active | Texto de ajuda semantica publicado por DTO/schema; usado como fallback quando `hint` nao foi informado. |
353
+ | `metadata.helpDisplay` | `'auto' \| 'inline' \| 'popover' \| 'hidden'` | Active | Politica efetiva de apresentacao de `hint`/`helpText`; normalmente materializada pelo host `praxis-dynamic-form` a partir de `FormConfig.helpPresentation`. |
354
+ | `metadata.helpInlineMaxLength` | `number` | Active | Limite local usado quando `metadata.helpDisplay` e `auto`; textos acima do limite migram para affordance de ajuda. |
352
355
  | `metadata.hintAlign` | `'start' \| 'end'` | Active | Alinhamento da dica. |
353
356
  | `metadata.materialDesign.appearance` | `'fill' \| 'outline'` | Active | Aparencia do `mat-form-field`. |
354
357
  | `metadata.materialDesign.color` | `'primary' \| 'accent' \| 'warn'` | Active | Cor do `mat-form-field`. |
@@ -373,6 +376,19 @@ Limites:
373
376
  | `metadata.ariaDescribedby` | `string` | Active | `aria-describedby` no elemento nativo. |
374
377
  | `metadata.ariaLabelledby` | `string` | Active | `aria-labelledby` no elemento nativo. |
375
378
 
379
+ #### Ajuda contextual em migracoes corporativas
380
+
381
+ `metadata.helpText` pertence ao DTO/schema quando descreve semantica de negocio, impacto operacional ou criterio de decisao do campo. Ele nao deve ser gerado a partir de label, nome tecnico ou heuristica local.
382
+
383
+ Use `metadata.helpDisplay` para excecoes por campo:
384
+
385
+ - `inline`: texto curto que deve permanecer visivel para evitar erro operacional;
386
+ - `popover`: texto longo, raro ou de apoio decisorio;
387
+ - `hidden`: ajuda publicada mas inadequada para a superficie atual;
388
+ - `auto`: delega a politica do host e ao limite `helpInlineMaxLength`.
389
+
390
+ Em formularios densos, o host deve preferir uma politica global como `FormConfig.helpPresentation.display = "auto"` e mover textos longos para a affordance de ajuda. Mensagens de validacao continuam no canal de erro do campo e nao devem ser convertidas em `helpText`.
391
+
376
392
  #### Politica de label com prefixos e sufixos
377
393
 
378
394
  Quando um campo usa `metadata.prefixIcon`, `metadata.suffixIcon`, `clearButton`,
@@ -22,8 +22,9 @@ source_of_truth:
22
22
  - "projects/praxis-dynamic-fields/src/lib/utils/field-state.util.ts"
23
23
  - "projects/praxis-dynamic-fields/src/lib/utils/format-display.util.ts"
24
24
  - "projects/praxis-core/src/lib/models/component-metadata.interface.ts"
25
- source_of_truth_last_verified: "2026-05-18"
26
- last_updated: "2026-05-18"
25
+ - "projects/praxis-core/src/lib/models/field-presentation.model.ts"
26
+ source_of_truth_last_verified: "2026-06-25"
27
+ last_updated: "2026-06-25"
27
28
  toc: true
28
29
  sidebar: true
29
30
  tags:
@@ -78,6 +79,7 @@ Este documento e a referencia canonica da API JSON de praxis-field-shell.
78
79
  | projects/praxis-dynamic-fields/src/lib/utils/field-state.util.ts | runtime-code | Arquivo presente no repositorio e usado como evidencia de contrato. |
79
80
  | projects/praxis-dynamic-fields/src/lib/utils/format-display.util.ts | runtime-code | Arquivo presente no repositorio e usado como evidencia de contrato. |
80
81
  | projects/praxis-core/src/lib/models/component-metadata.interface.ts | schema-types | Arquivo presente no repositorio e usado como evidencia de contrato. |
82
+ | projects/praxis-core/src/lib/models/field-presentation.model.ts | schema-types/runtime-helper | Resolve `presentation` e `presentationRules` para presentationMode sem mutar valores. |
81
83
 
82
84
  ## Support legend
83
85
 
@@ -157,6 +159,9 @@ Nao ha paths experimentais confirmados no contrato publico desta revisao.
157
159
  | `field.controlType` | string | false | n/a | component-defined | Partial; verify per source_of_truth. |
158
160
  | `field.controlType='avatar'` | unknown | false | n/a | component-defined | Partial; verify per source_of_truth. |
159
161
  | `field.transformDisplayValue` | unknown | false | n/a | component-defined | Partial; verify per source_of_truth. |
162
+ | `field.valuePresentation` | object | false | n/a | component-defined | Canonical value formatter for readonly/display surfaces. |
163
+ | `field.presentation` | object | false | n/a | component-defined | Semantic readonly/display presentation state. |
164
+ | `field.presentationRules` | array | false | n/a | component-defined | Ordered Json Logic rules that override semantic presentation state. |
160
165
 
161
166
  ### Input bindings (inbound data)
162
167
 
@@ -321,6 +326,8 @@ Resumo de composicao deste componente:
321
326
  ### 4. Mapeamento de Comportamento
322
327
  - Sempre cria o `insertionPoint` (`vc`) para o componente real do campo.
323
328
  - Em modo apresentacao sem excecao de tipo, esconde conteudo editavel e mostra bloco textual.
329
+ - Em modo apresentacao, `field.valuePresentation` formata o valor e `field.presentation`/`field.presentationRules` ajustam presenter, tone, icon, label, badge, tooltip e appearance por semantica declarativa.
330
+ - `presentationRules` sao avaliadas com Json Logic contra o contexto do campo. Regras invalidas falham fechadas e nao alteram o `FormControl`.
324
331
  - `readonlyMode` aplica overlay bloqueando interacao, mantendo controle habilitado.
325
332
  - `canvasMode` injeta semantica de evento para editores visuais.
326
333
 
@@ -346,7 +353,24 @@ Uso: shell padrao para um campo dinamico simples.
346
353
  "name": "approvalStatus",
347
354
  "label": "Aprovacao",
348
355
  "controlType": "select",
349
- "readOnly": true
356
+ "readOnly": true,
357
+ "presentation": {
358
+ "presenter": "status",
359
+ "tone": "neutral",
360
+ "icon": "schedule",
361
+ "label": "Em analise"
362
+ },
363
+ "presentationRules": [
364
+ {
365
+ "when": { "===": [{ "var": "value" }, "BLOQUEADO"] },
366
+ "set": {
367
+ "tone": "danger",
368
+ "icon": "lock",
369
+ "label": "Bloqueado",
370
+ "appearance": "filled"
371
+ }
372
+ }
373
+ ]
350
374
  },
351
375
  "readonlyMode": false,
352
376
  "presentationMode": true,
@@ -374,6 +398,9 @@ Correcao: garantir `canvasMode=true`.
374
398
  5. Valor mostrado em apresentacao esta incorreto.
375
399
  Correcao: revisar `transformDisplayValue` e formato do valor no `control`.
376
400
 
401
+ 6. Regra de apresentacao nao muda o visual.
402
+ Correcao: validar o Json Logic em `field.presentationRules[].when`; o contexto minimo expoe `value`, `rawValue`, `fieldName` e o nome do campo.
403
+
377
404
  ### 8. Cross-links
378
405
  - `projects/praxis-dynamic-fields/src/lib/utils/field-state.util.ts`
379
406
  - `projects/praxis-dynamic-fields/src/lib/utils/format-display.util.ts`
@@ -403,6 +430,9 @@ Correcao: revisar `transformDisplayValue` e formato do valor no `control`.
403
430
  | `field.controlType` | string | false | n/a | Partial | See Detailed API reference. |
404
431
  | `field.controlType='avatar'` | unknown | false | n/a | Partial | See Detailed API reference. |
405
432
  | `field.transformDisplayValue` | unknown | false | n/a | Partial | See Detailed API reference. |
433
+ | `field.valuePresentation` | object | false | n/a | Active | Formats values in presentation mode. |
434
+ | `field.presentation` | object | false | n/a | Active | Semantic state for presentation mode. |
435
+ | `field.presentationRules` | array | false | n/a | Active | Json Logic conditional presentation state. |
406
436
  | `presentationMode` | boolean | false | n/a | Partial | See Detailed API reference. |
407
437
  | `readonlyMode` | boolean | false | n/a | Partial | See Detailed API reference. |
408
438
  | `disabledMode` | boolean | false | n/a | Partial | See Detailed API reference. |
@@ -154,7 +154,7 @@ Nao ha paths experimentais confirmados no contrato publico desta revisao.
154
154
  | `metadata.touchUi` | boolean | false | n/a | component-defined | Partial; verify per source_of_truth. |
155
155
  | `metadata.clearButton` | object | false | n/a | component-defined | Partial; verify per source_of_truth. |
156
156
  | `metadata.inlineAutoSize.*` | object | false | n/a | component-defined | Partial; verify per source_of_truth. |
157
- | `metadata.inlineOverlay.applyMode` | string | false | `auto` | `auto`, `explicit`, `confirm` | Shared inline overlay commit mode; `confirm` is accepted as explicit compatibility. |
157
+ | `metadata.inlineOverlay.applyMode` | string | false | `auto` | `auto`, `explicit` | Shared inline overlay commit mode. |
158
158
  | `metadata.inlineOverlay.actions.apply` | object | false | n/a | component-defined | Theme-aware Apply action metadata. |
159
159
  | `metadata.inlineOverlay.actions.cancel` | object | false | n/a | component-defined | Theme-aware Cancel action metadata. |
160
160
  | `metadata.ariaLabel` | string | false | n/a | component-defined | Partial; verify per source_of_truth. |
@@ -366,6 +366,7 @@ Resumo de composicao deste componente:
366
366
  - `metadata.optionSource.display` e a fonte preferencial de UX para a entidade; campos top-level como `selectedLayout`, `density`, `showAvatar` e `showStatus` funcionam como override local de host.
367
367
  - Opcoes podem mostrar linha secundaria (`subtitle`) para desambiguacao; em `entityLookup`, a linha rica tambem mostra avatar, campos ricos com icones/chips/datas, status visual, badges e motivo de bloqueio.
368
368
  - Com `metadata.optionSource.resourcePath`, busca emite termo no pipeline remoto de option-source; sem endpoint, filtra local.
369
+ - Em uso standalone de shell/topbar autenticado, o componente aceita `FormControl` externo com `initialMetadata` estático e `options` locais. Um valor inicial já selecionado no controle deve materializar o texto da opção local sem bloquear a montagem da rota nem realimentar change detection quando a metadata recebida for semanticamente equivalente.
369
370
  - `metadata.resourcePath` continua aceito como configuracao operacional herdada, mas nao substitui a semantica canonica de entidade publicada em `metadata.optionSource`.
370
371
  - Opcao de reset limpa filtro sem fechar contexto de trabalho.
371
372
  - `OptionDTO.extra.selectable === false` desabilita a opcao e permite exibir `disabledReason` sem remover a entidade da lista ou da reidratacao.
@@ -301,6 +301,7 @@ Resumo de composicao deste componente:
301
301
 
302
302
  ### 4. Mapeamento de Comportamento
303
303
  - Modo percentual ajusta semantica visual e valores default de faixa/passo.
304
+ - `metadata.inlineVisualStyle = "graphic"` materializa leitura percentual enriquecida, mas o componente suprime gauge/rail decorativos quando esta dentro de `praxis-filter` compacto para manter a barra densa e escaneavel.
304
305
  - Campo recalcula largura com base no conteudo/placeholder e limites configurados.
305
306
  - Validadores `min/max` sao aplicados no control conforme metadata.
306
307
 
@@ -300,7 +300,7 @@ Use quando precisar:
300
300
  | `metadata.relativePeriodIconKey/optionIconKey` | `string` | Ativo | Chave do ícone por opção. |
301
301
  | `metadata.relativePeriodSubtitleKey/optionSubtitleKey` | `string` | Ativo | Chave de subtítulo por opção. |
302
302
  | `metadata.relativePeriodTexts` / `inlineTexts` | `object \| string(JSON)` | Ativo | Textos de labels, empty state e aria; templates canônicos devem usar `{{label}}` e `{{percent}}` quando houver interpolação, com compatibilidade legada para `{...}` em metadata. |
303
- | `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit" \| "confirm"` | Ativo | Quando `explicit`/`confirm`, seleções ficam em rascunho até `Aplicar`. |
303
+ | `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit"` | Ativo | Quando `explicit`, seleções ficam em rascunho até `Aplicar`. |
304
304
  | `metadata.inlineOverlay.actions.apply.*` | `object` | Ativo | Label, aria, icon, appearance e colorRole do commit. |
305
305
  | `metadata.inlineOverlay.actions.cancel.*` | `object` | Ativo | Label, aria, icon, appearance e colorRole do descarte. |
306
306
  | `metadata.inlineOverlay.actions.clear.*` | `object` | Ativo | Label, aria, icon, appearance, colorRole e visibilidade da limpeza explícita. |
@@ -319,7 +319,7 @@ Resumo de composição deste componente:
319
319
  - Em single mode, pode fechar automaticamente por `relativePeriodCloseOnSelect`.
320
320
  - Barra de progresso calcula posição da opção selecionada no conjunto.
321
321
  - Busca filtra opções por label/subtítulo antes da seleção.
322
- - Com `inlineOverlay.applyMode: "explicit"` ou `"confirm"`, clique em card altera apenas o rascunho do painel; `Aplicar` comita, enquanto `Cancelar`, `Esc`, detach ou clique externo descartam.
322
+ - Com `inlineOverlay.applyMode: "explicit"`, clique em card altera apenas o rascunho do painel; `Aplicar` comita, enquanto `Cancelar`, `Esc`, detach ou clique externo descartam.
323
323
 
324
324
  ### 5. Exemplo Mínimo (JSON + Uso)
325
325
  ```json
@@ -299,7 +299,7 @@ Use quando precisar:
299
299
  | `metadata.validators.rangeMessage` | `string` | Ativo | Mensagem para erro de ordem do intervalo. |
300
300
  | `metadata.validators.minDistanceMessage` | `string` | Ativo | Mensagem para distancia minima. |
301
301
  | `metadata.validators.maxDistanceMessage` | `string` | Ativo | Mensagem para distancia maxima. |
302
- | `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit" \| "confirm"` | Ativo | Quando `explicit`/`confirm`, slider, inputs e presets ficam em rascunho ate `Aplicar`. |
302
+ | `metadata.inlineOverlay.applyMode` | `"auto" \| "explicit"` | Ativo | Quando `explicit`, slider, inputs e presets ficam em rascunho ate `Aplicar`. |
303
303
  | `metadata.inlineOverlay.actions.apply.*` | `object` | Ativo | Label, aria, icon, appearance e colorRole do commit. |
304
304
  | `metadata.inlineOverlay.actions.cancel.*` | `object` | Ativo | Label, aria, icon, appearance e colorRole do descarte. |
305
305
  | `metadata.inlineOverlay.actions.clear.*` | `object` | Ativo | Label, aria, icon, appearance, colorRole e visibilidade da limpeza explicita. |
@@ -318,7 +318,7 @@ Resumo de composicao deste componente:
318
318
  - `quickPresets` podem ser declarados ou gerados por defaults internos.
319
319
  - Slider e inputs textuais permanecem sincronizados (`timeRangeForm` + `sliderRangeForm`).
320
320
  - `timeInputStepSeconds()` deriva de `stepMinute` para entrada `type=time`.
321
- - Com `inlineOverlay.applyMode: "explicit"` ou `"confirm"`, alteracoes no painel nao emitem valor externo ate `Aplicar`; `Cancelar`, `Esc`, detach ou clique externo restauram o valor confirmado anterior.
321
+ - Com `inlineOverlay.applyMode: "explicit"`, alteracoes no painel nao emitem valor externo ate `Aplicar`; `Cancelar`, `Esc`, detach ou clique externo restauram o valor confirmado anterior.
322
322
 
323
323
  ### 5. Exemplo Minimo (JSON + Uso)
324
324
  ```json
@@ -22,8 +22,8 @@ source_of_truth:
22
22
  - "projects/praxis-dynamic-fields/src/lib/components/material-async-select/material-async-select.component.ts"
23
23
  - "projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts"
24
24
  - "projects/praxis-core/src/lib/models/material-field-metadata.interface.ts"
25
- source_of_truth_last_verified: "2026-03-06"
26
- last_updated: "2026-03-06"
25
+ source_of_truth_last_verified: "2026-07-06"
26
+ last_updated: "2026-07-06"
27
27
  toc: true
28
28
  sidebar: true
29
29
  tags:
@@ -319,6 +319,10 @@ Garantias:
319
319
  - input de busca e carga incremental estao habilitados no painel.
320
320
  - `loadOn` controla a primeira carga (`open`, `init`, `none`).
321
321
  - `useCursor` pode trocar estrategia de pagina quando backend suporta cursor.
322
+ - Com `resourcePath` e `loadOn='open'`, o painel abre mesmo antes da primeira pagina remota para disparar a carga inicial; a opcao sentinela usada para isso e interna, invisivel e nao compoe contrato visual publico.
323
+ - `Carregar mais` so aparece depois de uma primeira pagina remota carregada com sucesso e com proxima pagina disponivel.
324
+ - fontes locais (`selectOptions`/`options`) e `loadOn='none'` antes da primeira carga nao exibem acao de paginacao.
325
+ - em paginacao numerada, o fim usa `totalPages`/`totalElements` quando fornecidos pelo backend; se ausentes, usa `content.length < pageSize` como fallback.
322
326
 
323
327
  Limites:
324
328
 
@@ -351,6 +355,7 @@ Precedencia de comportamento:
351
355
  #### Checklist corporativo
352
356
 
353
357
  - alinhe backend para pesquisa por termo e include de selecionados.
358
+ - retorne `totalPages` e `totalElements` consistentes para evitar chamadas extras de paginacao.
354
359
  - padronize `optionLabelKey`/`optionValueKey` entre dominios.
355
360
  - defina `dependencyLoadOnChange` conforme UX esperada em cascata.
356
361
  - use `maxSelections` quando multi-select exigir limite de negocio.
@@ -393,8 +398,12 @@ Precedencia de comportamento:
393
398
 
394
399
  Notas de runtime:
395
400
 
396
- - em remoto, `loadOptions` usa filtro com include de selecionados na pagina 0.
401
+ - em remoto generico, `loadOptions` pode usar `includeIds` na pagina 0.
402
+ - em `optionSource`, o filtro envia `includeIds` somente quando `optionSource.includeIds=true`; quando ausente ou `false`, valores selecionados sao reidratados por `/option-sources/{sourceKey}/options/by-ids`.
403
+ - em `optionSource`, dependencias declaradas por `dependsOn` e `dependencyFilterMap` sao materializadas como filtros estruturados `equals` no envelope canonico de opcoes.
397
404
  - `onSearch` limpa estado local e reinicia pagina para novo termo.
405
+ - `loadMore` nao inicia a primeira carga remota; a primeira pagina respeita `loadOn`, abertura do painel, reload explicito ou mudanca de dependencia.
406
+ - `loadMore` incrementa pagina somente quando ja existe pagina remota carregada e `endReached=false`.
398
407
 
399
408
  Contrato compartilhado completo:
400
409
 
@@ -417,7 +426,7 @@ Correcao: revise `loadOn`, `resourcePath` e permissao de endpoint.
417
426
  Correcao: alinhe `optionLabelKey` e `optionValueKey` ao payload real.
418
427
 
419
428
  4. Item selecionado some apos nova busca.
420
- Correcao: backend deve suportar include de ids selecionados na pagina inicial.
429
+ Correcao: para `optionSource.includeIds=false`, backend deve suportar reidratacao por `/by-ids`; para remoto generico ou `optionSource.includeIds=true`, pode suportar include de ids selecionados na pagina inicial.
421
430
 
422
431
  5. Cascata nao atualiza automaticamente.
423
432
  Correcao: use `dependencyLoadOnChange='immediate'` ou dispare recarga no host.
@@ -22,8 +22,8 @@ source_of_truth:
22
22
  - "projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.component.ts"
23
23
  - "projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts"
24
24
  - "projects/praxis-core/src/lib/models/material-field-metadata.interface.ts"
25
- source_of_truth_last_verified: "2026-04-27"
26
- last_updated: "2026-04-27"
25
+ source_of_truth_last_verified: "2026-06-25"
26
+ last_updated: "2026-06-25"
27
27
  toc: true
28
28
  sidebar: true
29
29
  tags:
@@ -133,6 +133,7 @@ Este documento e a referencia canonica da API JSON de pdx-material-checkbox-grou
133
133
  | --- | --- | --- | --- | --- |
134
134
  | `metadata.options` | `metadata.checkboxOptions` | not-yet-defined | accepted for backward compatibility | Alias legado para opcoes do grupo. |
135
135
  | ausencia de `metadata.selectionMode` | `metadata.selectionMode` explicito | not-yet-defined | runtime infere `boolean` sem opcoes e `multiple` com opcoes | Fallback legado preservado para migracao. |
136
+ | valores booleanos legados `S`/`N`, `1`/`0`, `true`/`false` no `FormControl` | `boolean` real | not-yet-defined | em `selectionMode: 'boolean'`, o runtime normaliza antes de renderizar e emitir eventos | Compatibilidade para telas migradas que recebem flags legadas do backend. |
136
137
 
137
138
  ### Internal-only paths
138
139
 
@@ -197,6 +198,7 @@ Nao ha paths experimentais confirmados no contrato publico desta revisao.
197
198
  ### Runtime semantics addendum
198
199
 
199
200
  - `selectionMode` explicito governa a semantica interna de selecao; heuristica por presenca de opcoes so vale quando `selectionMode` nao e informado.
201
+ - Em `selectionMode: 'boolean'`, o valor de entrada aceita `boolean` real e flags legadas textuais/numéricas (`S`/`N`, `T`/`F`, `1`/`0`, `true`/`false`, `sim`/`não`) e normaliza para `boolean` antes da interação.
200
202
  - `required`/`requiredChecked` propagam sinalizacao acessivel (`aria-required`) para o checkbox renderizado.
201
203
  - No modo boolean, cliques no shell de conteudo tambem emitem `selectionChange` e `optionSelected` para alinhamento operacional com o runtime base de selecao.
202
204
  - Estados governados (`disabledMode`, `readonlyMode`, `presentationMode`, `metadata.readonly` e `FormControl.disabled`) bloqueiam mutacoes em modo boolean, option e select-all.
@@ -224,7 +226,7 @@ Nao ha paths experimentais confirmados no contrato publico desta revisao.
224
226
 
225
227
  | Surface | Verified | Coverage status | Evidence | Notes |
226
228
  | --- | --- | --- | --- | --- |
227
- | Runtime | `true` | Active | `projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.metadata.ts`, `projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.component.ts` | Core runtime flows and governed states verified via focused component specs on 2026-04-27; editor/tooling coverage remains independent. |
229
+ | Runtime | `true` | Active | `projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.metadata.ts`, `projects/praxis-dynamic-fields/src/lib/components/material-checkbox-group/material-checkbox-group.component.ts` | Core runtime flows, governed states and legacy boolean value normalization verified via focused component specs on 2026-06-25; editor/tooling coverage remains independent. |
228
230
  | Schema/Types | `true` | Active | source_of_truth + Detailed API reference | Reconcile schema/types with canonical paths during follow-up when needed. |
229
231
  | Editor/Tooling | `false` | Partial | `projects/praxis-core/src/lib/metadata/field-selector-control-type.constants.ts`, `projects/praxis-dynamic-fields/src/lib/services/component-registry/component-registry.service.ts` | Selector/control-type tooling linkage verified via default selector map and registry seeding; visual editor end-to-end coverage remains not-yet-verified. |
230
232
 
@@ -21,8 +21,8 @@ source_of_truth:
21
21
  - "projects/praxis-dynamic-fields/src/lib/components/material-file-upload/material-file-upload.metadata.ts"
22
22
  - "projects/praxis-dynamic-fields/src/lib/components/material-file-upload/material-file-upload.component.ts"
23
23
  - "projects/praxis-dynamic-fields/src/lib/base/simple-base-input.component.ts"
24
- source_of_truth_last_verified: "2026-03-06"
25
- last_updated: "2026-03-06"
24
+ source_of_truth_last_verified: "2026-06-24"
25
+ last_updated: "2026-06-24"
26
26
  toc: true
27
27
  sidebar: true
28
28
  tags:
@@ -149,10 +149,14 @@ Nao ha paths experimentais confirmados no contrato publico desta revisao.
149
149
  | `metadata.hint` | string | false | n/a | component-defined | Partial; verify per source_of_truth. |
150
150
  | `metadata.placeholder` | string | false | n/a | component-defined | Partial; verify per source_of_truth. |
151
151
  | `metadata.validators.*` | object | false | n/a | component-defined | Partial; verify per source_of_truth. |
152
- | `metadata.accept` | string | false | n/a | component-defined | Partial; verify per source_of_truth. |
153
- | `metadata.multiple` | boolean | false | n/a | component-defined | Partial; verify per source_of_truth. |
154
- | `metadata.maxFileSize` | number | false | n/a | component-defined | Partial; verify per source_of_truth. |
152
+ | `metadata.accept` | string | false | n/a | comma-separated extensions or MIME patterns | Active; applied to native input and local file validation. |
153
+ | `metadata.multiple` | boolean | false | `false` | boolean | Active; selected value is `File[]` when true and `File | null` otherwise. |
154
+ | `metadata.maxFileSize` | number | false | n/a | positive byte count | Active; rejects selected files above the configured limit. |
155
+ | `metadata.maxFiles` | number | false | n/a | positive integer | Active; rejects selections above the configured number of files. |
155
156
  | `metadata.allowedTypes` | string[] | false | n/a | component-defined | Partial; verify per source_of_truth. |
157
+ | `metadata.imagePreview` | boolean | false | `false` | boolean | Active; renders local image preview for selected image files. |
158
+ | `metadata.preview` | string | false | n/a | `image` | Active; `image` is an alias for local image preview. |
159
+ | `metadata.previewAlt` | string | false | localized fallback | component-defined | Active; accessible alt text for the local preview image. |
156
160
 
157
161
  ### Input bindings (inbound data)
158
162
 
@@ -268,12 +272,13 @@ Em conflito entre alias legado e path canonico, priorizar path canonico e regist
268
272
  ### Preserved technical reference (normalized from previous revision)
269
273
 
270
274
  ### 1. Visao Geral e Quando Usar
271
- `pdx-material-file-upload` e um upload basico (placeholder funcional) com `<input type="file">` simples e integracao CVA.
275
+ `pdx-material-file-upload` e um upload basico de campo com `<input type="file">`, integracao CVA, validacao local de tipo/tamanho e preview local de imagem.
272
276
 
273
277
  Use quando precisar:
274
278
  - prototipar upload rapido no form;
275
- - capturar um unico arquivo selecionado;
276
- - evoluir depois para fluxo corporativo completo (preview/chunk/validacoes avancadas).
279
+ - capturar um arquivo selecionado ou uma lista curta de arquivos;
280
+ - mostrar preview local para fluxos de foto/avatar antes da persistencia;
281
+ - delegar persistencia, presign, progresso, conflito e storage governado para a camada canonica de upload.
277
282
 
278
283
  ### 2. API do Componente (Inputs/Outputs)
279
284
  | Propriedade | Tipo | Padrao | Obrigatorio | Comportamento |
@@ -283,7 +288,7 @@ Use quando precisar:
283
288
  | `disabledMode` | `boolean` | `false` | Nao | Sobrescreve disabled no host. |
284
289
  | `visible` | `boolean` | `true` | Nao | Controla exibicao no host. |
285
290
  | `presentationMode` | `boolean` | `false` | Nao | Modo apresentacao sem edicao. |
286
- | `valueChange` | `File \| null` | - | Output base input | Arquivo selecionado no input. |
291
+ | `valueChange` | `File \| File[] \| null` | - | Output base input | Arquivo selecionado no input; quando `multiple=true`, emite array. |
287
292
 
288
293
  ### 3. Matriz de Cobertura JSON (Completa)
289
294
  #### 3.1 Campos especificos do componente
@@ -294,25 +299,29 @@ Use quando precisar:
294
299
  | `metadata.hint` | `string` | Ativo | Mensagem de apoio quando sem erro. |
295
300
  | `metadata.placeholder` | `string` | Parcial | `setFileUploadMetadata` remove placeholder do estado efetivo. |
296
301
  | `metadata.validators.*` | `object` | Parcial | Validacoes basicas do `SimpleBaseInput` podem atuar no control, sem parser de arquivo dedicado. |
297
- | `metadata.accept` | `string` | Declared-only | Nao aplicado ao atributo `accept` no input atual. |
298
- | `metadata.multiple` | `boolean` | Declared-only | Input atual usa apenas o primeiro arquivo selecionado. |
299
- | `metadata.maxFileSize` | `number` | Declared-only | Nao ha validacao de tamanho especifica no componente. |
302
+ | `metadata.accept` | `string` | Ativo | Aplicado ao atributo `accept` e validado localmente por extensao/MIME antes de atualizar o control. |
303
+ | `metadata.multiple` | `boolean` | Ativo | Permite selecionar varios arquivos e atualiza o valor como `File[]`. |
304
+ | `metadata.maxFileSize` | `number` | Ativo | Rejeita arquivos acima do limite em bytes antes de atualizar o control. |
305
+ | `metadata.maxFiles` | `number` | Ativo | Rejeita selecoes acima da quantidade maxima configurada. |
300
306
  | `metadata.allowedTypes` | `string[]` | Declared-only | Nao ha filtro dedicado por tipo no componente atual. |
307
+ | `metadata.imagePreview` | `boolean` | Ativo | Mostra preview local para o primeiro arquivo de imagem selecionado. |
308
+ | `metadata.preview` | `'image'` | Ativo | Alias declarativo para habilitar preview local de imagem. |
309
+ | `metadata.previewAlt` | `string` | Ativo | Texto alternativo do preview local. |
301
310
 
302
311
  #### 3.2 Campos herdados compartilhados (exaustivo)
303
312
  Contrato compartilhado de input base:
304
313
  - [pdx-base-input-runtime-contract.json-api.md](projects/praxis-dynamic-fields/src/lib/base/pdx-base-input-runtime-contract.json-api.md)
305
314
 
306
315
  Resumo de composicao deste componente:
307
- - `Ativo`: fluxo basico de selecao de um arquivo e bind no control.
316
+ - `Ativo`: fluxo basico de selecao, bind no control, preview local de imagem e validacao local de tipo/tamanho/quantidade.
308
317
  - `Parcial`: placeholder e validacoes genericas do base.
309
- - `Declared-only`: capacidade avancada de upload ainda nao implementada.
318
+ - `Declared-only`: politica avancada por `allowedTypes`.
310
319
 
311
320
  ### 4. Mapeamento de Comportamento
312
- - Selecao: ao `change`, pega `files[0]` e grava no control.
313
- - Valor: tipo `File | null`.
314
- - Renderizacao: label + input file + erro/hint.
315
- - Estado corporativo: componente se declara "placeholder" no proprio codigo.
321
+ - Selecao: ao `change`, valida arquivos e grava `File` ou `File[]` no control.
322
+ - Valor: `File | null` quando `multiple` esta ausente/falso; `File[]` quando `multiple=true`.
323
+ - Renderizacao: label, input file, resumo da selecao, preview local de imagem, erro/hint e acao de limpar.
324
+ - Persistencia corporativa: fora deste componente. Use `@praxisui/files-upload` para presign, progresso, conflito, retry e storage governado.
316
325
 
317
326
  ### 5. Exemplo Minimo (JSON + Uso)
318
327
  ```json
@@ -345,12 +354,30 @@ Uso: captura um arquivo unico para envio posterior.
345
354
  ```
346
355
  Uso: etapa inicial de upload, deixando validacoes profundas para API backend.
347
356
 
357
+ ### 6.1 Exemplo para troca de avatar (JSON + Uso)
358
+ ```json
359
+ {
360
+ "componentId": "pdx-material-file-upload",
361
+ "metadata": {
362
+ "name": "profileImageFile",
363
+ "label": "Foto de perfil",
364
+ "controlType": "upload",
365
+ "accept": "image/*",
366
+ "maxFileSize": 4194304,
367
+ "maxFiles": 1,
368
+ "imagePreview": true,
369
+ "hint": "Escolha uma imagem para revisar antes de salvar a foto do perfil."
370
+ }
371
+ }
372
+ ```
373
+ Uso: combine este campo com `pdx-material-avatar` para preview/display e com a capability canonica de persistencia de arquivo para publicar a URL final consumida pelo avatar.
374
+
348
375
  ### 7. Troubleshooting e Armadilhas Comuns
349
- 1. Esperar upload multiplo.
350
- Correcao: componente atual captura somente o primeiro arquivo.
376
+ 1. Esperar persistencia automatica.
377
+ Correcao: este componente escolhe e valida localmente; persistencia pertence ao host ou a `@praxisui/files-upload`.
351
378
 
352
- 2. Esperar filtro automatico por tipo/tamanho.
353
- Correcao: nao ha `accept`/validacao dedicada implementada nesta versao.
379
+ 2. Esperar crop/zoom.
380
+ Correcao: preview local nao e editor de imagem. Crop deve nascer em contrato proprio de avatar/image authoring.
354
381
 
355
382
  3. Placeholder nao aparece.
356
383
  Correcao: `setFileUploadMetadata` remove placeholder explicitamente.
@@ -358,8 +385,8 @@ Correcao: `setFileUploadMetadata` remove placeholder explicitamente.
358
385
  4. Arquivo nao persiste no payload final.
359
386
  Correcao: verificar serializacao de `File` no host e estrategia de envio multipart.
360
387
 
361
- 5. Necessidade de preview/progresso/chunk.
362
- Correcao: esse renderer e baseline; implementar camada avancada para cenarios enterprise.
388
+ 5. Necessidade de progresso/chunk/presign.
389
+ Correcao: usar `@praxisui/files-upload`, que e a fronteira canonica de upload operacional.
363
390
 
364
391
  ### 8. Cross-links
365
392
  - `projects/praxis-dynamic-fields/src/lib/base/pdx-base-input-runtime-contract.json-api.md`
@@ -388,10 +415,14 @@ Correcao: esse renderer e baseline; implementar camada avancada para cenarios en
388
415
  | `metadata.hint` | string | false | n/a | Partial | See Detailed API reference. |
389
416
  | `metadata.placeholder` | string | false | n/a | Partial | See Detailed API reference. |
390
417
  | `metadata.validators.*` | object | false | n/a | Partial | See Detailed API reference. |
391
- | `metadata.accept` | string | false | n/a | Partial | See Detailed API reference. |
392
- | `metadata.multiple` | boolean | false | n/a | Partial | See Detailed API reference. |
393
- | `metadata.maxFileSize` | number | false | n/a | Partial | See Detailed API reference. |
418
+ | `metadata.accept` | string | false | n/a | Active | Applied to native input and local type validation. |
419
+ | `metadata.multiple` | boolean | false | `false` | Active | Emits `File[]` when true. |
420
+ | `metadata.maxFileSize` | number | false | n/a | Active | Rejects files above the byte limit. |
421
+ | `metadata.maxFiles` | number | false | n/a | Active | Rejects selections above the configured number of files. |
394
422
  | `metadata.allowedTypes` | string[] | false | n/a | Partial | See Detailed API reference. |
423
+ | `metadata.imagePreview` | boolean | false | `false` | Active | Enables local image preview. |
424
+ | `metadata.preview` | string | false | n/a | Active | `image` enables local image preview. |
425
+ | `metadata.previewAlt` | string | false | localized fallback | Active | Accessible alt text for preview image. |
395
426
 
396
427
  ## Events reference (obrigatorio)
397
428
 
@@ -22,8 +22,8 @@ source_of_truth:
22
22
  - "projects/praxis-dynamic-fields/src/lib/components/material-searchable-select/material-searchable-select.component.ts"
23
23
  - "projects/praxis-dynamic-fields/src/lib/base/simple-base-select.component.ts"
24
24
  - "projects/praxis-core/src/lib/models/material-field-metadata.interface.ts"
25
- source_of_truth_last_verified: "2026-04-27"
26
- last_updated: "2026-04-27"
25
+ source_of_truth_last_verified: "2026-07-06"
26
+ last_updated: "2026-07-06"
27
27
  toc: true
28
28
  sidebar: true
29
29
  tags:
@@ -347,6 +347,9 @@ Precedencia de comportamento:
347
347
  2. `options` atua como alias legado quando `selectOptions` nao e enviado.
348
348
  3. `optionSource` ativa consulta remota pelo endpoint canonico `/option-sources/{key}/options/filter`.
349
349
  4. `resourcePath` ativa consulta remota paginada legada com termo de busca.
350
+ 5. Com `resourcePath` e `loadOn='open'`, o painel abre mesmo antes da primeira pagina remota para disparar a carga inicial; a opcao sentinela usada para isso e interna, invisivel e nao compoe contrato visual publico.
351
+ 6. `Carregar mais` so aparece depois de uma primeira pagina remota carregada com sucesso e com proxima pagina disponivel.
352
+ 7. fontes locais (`selectOptions`/`options`) e `loadOn='none'` antes da primeira carga nao exibem acao de paginacao.
350
353
 
351
354
  #### Status model
352
355
 
@@ -357,6 +360,7 @@ Precedencia de comportamento:
357
360
  #### Checklist corporativo
358
361
 
359
362
  - alinhe backend para pesquisa por termo e include de selecionados.
363
+ - retorne `totalPages` e `totalElements` consistentes para evitar chamadas extras de paginacao.
360
364
  - para lookups metadata-driven, publique `optionSource.dependsOn` e `optionSource.dependencyFilterMap` no schema canonico.
361
365
  - padronize `optionLabelKey`/`optionValueKey` entre dominios.
362
366
  - defina `dependencyLoadOnChange` conforme UX esperada em cascata.
@@ -393,7 +397,7 @@ Precedencia de comportamento:
393
397
  | `metadata.resourcePath` | `string` | Active | Ativa carga remota de opcoes. |
394
398
  | `metadata.optionSource` | `OptionSourceMetadata` | Active | Ativa endpoint canonico de option-source e busca pelo parametro `search`. |
395
399
  | `metadata.optionSource.dependsOn` | `string[]` | Active | Fonte canonica backend/editor para cascata; o mapper deriva `dependencyFields`. |
396
- | `metadata.optionSource.dependencyFilterMap` | `Record<string, string>` | Active | Mapeia campo dependente para chave de filtro enviada ao backend. |
400
+ | `metadata.optionSource.dependencyFilterMap` | `Record<string, string>` | Active | Mapeia campo dependente para chave de filtro estruturado enviada ao backend. |
397
401
  | `metadata.filterCriteria` | `Record<string, any>` | Active | Filtros base para consulta remota. |
398
402
  | `metadata.optionLabelKey` | `string` | Active | Chave de label no payload remoto. |
399
403
  | `metadata.optionValueKey` | `string` | Active | Chave de value no payload remoto. |
@@ -406,6 +410,9 @@ Notas de runtime:
406
410
  - em remoto, `loadOptions` usa filtro com include de selecionados na pagina 0.
407
411
  - com `optionSource`, `loadOptions` chama `filterOptionSourceOptions` e envia termo de busca como `search`, nao como campo de filtro textual.
408
412
  - `onSearch` limpa estado local e reinicia pagina para novo termo.
413
+ - `loadNextPage` nao inicia a primeira carga remota; a primeira pagina respeita `loadOn`, abertura do painel, reload explicito ou mudanca de dependencia.
414
+ - `loadNextPage` incrementa pagina somente quando ja existe pagina remota carregada e `endReached=false`.
415
+ - em paginacao numerada, `endReached` usa `totalPages`/`totalElements` quando fornecidos pelo backend; se ausentes, usa `content.length < pageSize` como fallback.
409
416
  - estados governados bloqueiam busca, abertura, selecao, reload, clear e `loadNextPage`.
410
417
 
411
418
  Contrato compartilhado completo:
@@ -336,7 +336,7 @@ Resumo de composicao deste componente:
336
336
  - Ordenacao: nao se aplica.
337
337
  - Selecao: texto multiline livre (respeitando regras de validacao).
338
338
  - Eventos: usa outputs herdados e processa eventos locais de teclado/paste/cut para UX avancada.
339
- - Renderizacao: `mat-form-field` + `<textarea matInput>` com autosize opcional, clear button opcional e hints de suporte.
339
+ - Renderizacao: `mat-form-field` + `<textarea matInput>` com autosize opcional, clear button opcional e ajuda de campo pelo contrato herdado (`helpDisplay='inline'|'popover'|'hidden'|'auto'`).
340
340
 
341
341
  ### 5. Exemplo Minimo (JSON + Uso)
342
342
  ```json