@praxisui/dynamic-fields 9.0.5 → 9.0.7

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-fields",
3
- "version": "9.0.5",
3
+ "version": "9.0.7",
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.5",
15
- "@praxisui/cron-builder": "^9.0.5"
14
+ "@praxisui/core": "^9.0.7",
15
+ "@praxisui/cron-builder": "^9.0.7"
16
16
  },
17
17
  "dependencies": {
18
18
  "libphonenumber-js": "^1.12.41",
@@ -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-08-11"
26
- last_updated: "2026-08-11"
25
+ source_of_truth_last_verified: "2026-08-19"
26
+ last_updated: "2026-08-19"
27
27
  toc: true
28
28
  sidebar: true
29
29
  tags:
@@ -112,8 +112,8 @@ Este documento e a referencia canonica da API JSON de pdx-material-async-select.
112
112
  | Path | Type | Required | Default | Status | Notes |
113
113
  | --- | --- | --- | --- | --- | --- |
114
114
  | `metadata` | object | true | n/a | Partial | See Detailed API reference for runtime semantics. |
115
- | `readonlyMode` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
116
- | `disabledMode` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
115
+ | `readonlyMode` | boolean | false | n/a | Active | Mantém o trigger focalizável com `aria-readonly`, bloqueia mutações e oculta clear/chevron. |
116
+ | `disabledMode` | boolean | false | n/a | Active | Aplica disabled nativo, `aria-disabled` e bloqueia interação. |
117
117
  | `visible` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
118
118
  | `presentationMode` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
119
119
 
@@ -339,6 +339,12 @@ Limites:
339
339
  - debounce de busca interno permanece fixo em `300ms`.
340
340
  - selecao multipla usa o overlay conectado com `listbox` multisselecao; ela nao
341
341
  projeta busca ou acoes dentro de `mat-select` e nao reutiliza o combobox simples.
342
+ - tanto o combobox pesquisável quanto o ramo de coleção usam o frame canônico `mat-form-field` para label, outline, hint, erro, prefixo e sufixos.
343
+ - o estado vazio não repete o label como valor; seleções múltiplas compactadas preservam todos os labels em tooltip e no nome acessível.
344
+ - no ramo de coleção, valor e chevron/spinner ocupam colunas explícitas; ações trailing usam slots Material e não criam reserva fixa vazia.
345
+ - tanto o combobox pesquisável quanto o ramo de coleção mantêm clear, seta/spinner e help em trilho trailing com separação entre adornos e inset final até o outline.
346
+ - a troca entre spinner e chevron não altera a altura do frame Material nem o alinhamento da linha do formulário.
347
+ - `readonly` não é materializado como disabled nativo: o trigger permanece focalizável, expõe `aria-readonly`, não oferece chevron/clear, não abre por teclado e possui bloqueio final contra mutação no runtime base.
342
348
  - ordenacao nao possui contrato dedicado nesta camada.
343
349
  - `loadOn` e `useCursor` dependem da capacidade do backend e da configuracao global.
344
350
 
@@ -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-07-06"
26
- last_updated: "2026-07-06"
25
+ source_of_truth_last_verified: "2026-08-19"
26
+ last_updated: "2026-08-19"
27
27
  toc: true
28
28
  sidebar: true
29
29
  tags:
@@ -326,6 +326,11 @@ Garantias:
326
326
  - input de busca esta presente na UI do componente.
327
327
  - carga remota e cascata seguem contrato base de select.
328
328
  - `multiple` e respeitado para alternar single/multiple.
329
+ - label, outline, hint, erro, prefixo e sufixos usam o frame `mat-form-field` compartilhado com os demais campos Material.
330
+ - o estado vazio não repete o label como valor; seleções múltiplas compactadas preservam todos os labels em tooltip e no nome acessível.
331
+ - ações trailing ocupam slots Material reais; o trigger não reserva espaço quando clear/help estão ausentes.
332
+ - clear/help presentes compartilham um único trilho trailing, com separação entre ações e inset final até o outline.
333
+ - `readonly` permanece focalizável e expõe `aria-readonly`, sem ser convertido em disabled nativo, sem abrir o overlay e com bloqueio final de mutação no runtime base.
329
334
 
330
335
  Limites:
331
336
 
@@ -22,8 +22,8 @@ source_of_truth:
22
22
  - "projects/praxis-dynamic-fields/src/lib/components/material-select/material-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-08-11"
26
- last_updated: "2026-08-11"
25
+ source_of_truth_last_verified: "2026-08-19"
26
+ last_updated: "2026-08-19"
27
27
  toc: true
28
28
  sidebar: true
29
29
  tags:
@@ -113,8 +113,8 @@ Este documento e a referencia canonica da API JSON de pdx-material-select.
113
113
  | Path | Type | Required | Default | Status | Notes |
114
114
  | --- | --- | --- | --- | --- | --- |
115
115
  | `metadata` | object | true | n/a | Partial | See Detailed API reference for runtime semantics. |
116
- | `readonlyMode` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
117
- | `disabledMode` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
116
+ | `readonlyMode` | boolean | false | n/a | Active | Mantém o trigger focalizável com `aria-readonly`, bloqueia mutações e oculta clear/chevron. |
117
+ | `disabledMode` | boolean | false | n/a | Active | Aplica disabled nativo, `aria-disabled` e bloqueia interação. |
118
118
  | `visible` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
119
119
  | `presentationMode` | boolean | false | n/a | Partial | See Detailed API reference for runtime semantics. |
120
120
 
@@ -333,6 +333,12 @@ Garantias:
333
333
  - `metadata.selectOptions` e `metadata.resourcePath` sao consumidos no runtime.
334
334
  - valor e ciclo de mudanca integram com CVA/Reactive Forms.
335
335
  - opcao vazia e suporte a filtro remoto seguem o contrato base de select.
336
+ - label, outline, hint, erro, prefixo e sufixos usam o mesmo frame `mat-form-field` dos demais campos Material.
337
+ - o trigger usa colunas explícitas para valor e estado; não existe reserva fixa de espaço quando clear/help estão ausentes.
338
+ - quando clear/help estão presentes, formam um único trilho trailing com separação entre ações e inset final até o outline.
339
+ - o estado vazio não repete o label como valor; placeholder só aparece quando foi declarado.
340
+ - valores truncados preservam o conteúdo integral em tooltip e no nome acessível do combobox.
341
+ - `readonly` permanece semanticamente distinto de `disabled`: continua focalizável, expõe `aria-readonly`, não abre por ponteiro/teclado e possui bloqueio final contra mutação no runtime base.
336
342
 
337
343
  Limites:
338
344
 
@@ -265,6 +265,7 @@ interface PraxisDynamicFieldsI18nOverrides {
265
265
  endOfList?: PraxisDynamicFieldText;
266
266
  noOptionsAvailable?: PraxisDynamicFieldText;
267
267
  loadingOptionsAriaLabel?: PraxisDynamicFieldText;
268
+ triggerAriaLabel?: PraxisDynamicFieldText;
268
269
  };
269
270
  tree?: {
270
271
  expandNodeAriaLabel?: PraxisDynamicFieldText;
@@ -1151,6 +1152,12 @@ declare abstract class SimpleBaseSelectComponent<T = any> extends SimpleBaseInpu
1151
1152
  protected defaultPanelClass(): string | string[] | undefined;
1152
1153
  selectPanelClass(): string[];
1153
1154
  protected isInteractionDisabled(): boolean;
1155
+ /**
1156
+ * Native disabled state is intentionally distinct from readonly/presentation.
1157
+ * Readonly collection controls remain focusable and expose `aria-readonly`, while
1158
+ * this state alone removes the trigger from keyboard interaction.
1159
+ */
1160
+ protected isDisabledEffective(): boolean;
1154
1161
  protected normalizeMultipleControlValue(): void;
1155
1162
  setExternalControl(control: AbstractControl): void;
1156
1163
  /** Whether to show the clear button (if enabled in metadata) */
@@ -1197,6 +1204,7 @@ declare abstract class SimpleBaseSelectComponent<T = any> extends SimpleBaseInpu
1197
1204
  selectPanelActionsAriaLabel(): string;
1198
1205
  noOptionsAvailableLabel(): string;
1199
1206
  loadingOptionsAriaLabel(): string;
1207
+ selectionTriggerAriaLabel(displayValue: string): string;
1200
1208
  /**
1201
1209
  * Ícone para estado "selecionado" em opções do painel.
1202
1210
  */
@@ -2579,6 +2587,7 @@ declare class MaterialSelectComponent extends SimpleBaseSelectComponent {
2579
2587
  private readonly collectionSearch;
2580
2588
  private readonly overlayTrigger;
2581
2589
  private readonly overlayOptions;
2590
+ private pendingOverlayFocusIndex;
2582
2591
  protected defaultPanelClass(): string;
2583
2592
  setSelectMetadata(metadata: SimpleSelectMetadata<unknown>): void;
2584
2593
  ngOnInit(): void;
@@ -2595,7 +2604,8 @@ declare class MaterialSelectComponent extends SimpleBaseSelectComponent {
2595
2604
  onOptionKeydown(event: KeyboardEvent): void;
2596
2605
  hasSelectionValue(): boolean;
2597
2606
  materialDisplayText(): string;
2598
- labelId(): string;
2607
+ materialFullDisplayText(): string;
2608
+ materialTriggerTooltip(): string | null;
2599
2609
  panelId(): string;
2600
2610
  overlayId(): string;
2601
2611
  overlayPanelWidth(): string;
@@ -2702,6 +2712,7 @@ declare class MaterialSearchableSelectComponent extends SimpleBaseSelectComponen
2702
2712
  protected readonly collectionSearch: _angular_core.Signal<PdxCollectionSearchComponent | undefined>;
2703
2713
  protected readonly overlayTrigger: _angular_core.Signal<ElementRef<HTMLButtonElement> | undefined>;
2704
2714
  protected readonly overlayOptions: _angular_core.Signal<readonly ElementRef<HTMLButtonElement>[]>;
2715
+ private pendingOverlayFocusIndex;
2705
2716
  private readonly store;
2706
2717
  readonly endReached: _angular_core.WritableSignal<boolean>;
2707
2718
  private initialLoadStrategy;
@@ -2730,7 +2741,7 @@ declare class MaterialSearchableSelectComponent extends SimpleBaseSelectComponen
2730
2741
  onOptionKeydown(event: KeyboardEvent): void;
2731
2742
  hasSelectionValue(): boolean;
2732
2743
  materialDisplayText(): string;
2733
- labelId(): string;
2744
+ materialFullDisplayText(): string;
2734
2745
  panelId(): string;
2735
2746
  overlayId(): string;
2736
2747
  overlayPanelWidth(): string;
@@ -2746,7 +2757,6 @@ declare class MaterialSearchableSelectComponent extends SimpleBaseSelectComponen
2746
2757
  private isLastPage;
2747
2758
  onLoadMoreInteraction(event: Event): void;
2748
2759
  onSearch(term: string): void;
2749
- protected registerMatSelect(select: MatSelect): void;
2750
2760
  private refocusSearchInput;
2751
2761
  protected focusOverlayOption(index: number): void;
2752
2762
  private resolveMaterialOptionLabel;
@@ -2857,6 +2867,7 @@ declare class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
2857
2867
  private readonly materialCollectionSearch;
2858
2868
  private readonly materialOverlayTrigger;
2859
2869
  private readonly materialOverlayOptions;
2870
+ private pendingMaterialOverlayFocusIndex;
2860
2871
  readonly termControl: FormControl<unknown>;
2861
2872
  materialSearchTerm(): string;
2862
2873
  readonly activeLookupFilters: _angular_core.WritableSignal<LookupFilterRequest[]>;
@@ -2892,7 +2903,7 @@ declare class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
2892
2903
  onMaterialOptionKeydown(event: KeyboardEvent): void;
2893
2904
  hasMaterialSelection(): boolean;
2894
2905
  materialDisplayText(): string;
2895
- materialLabelId(): string;
2906
+ materialFullDisplayText(): string;
2896
2907
  materialPanelId(): string;
2897
2908
  materialOverlayId(): string;
2898
2909
  materialOverlayPanelWidth(): string;
@@ -2950,7 +2961,6 @@ declare class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
2950
2961
  private isLastPage;
2951
2962
  onLoadMoreInteraction(event: Event): void;
2952
2963
  retry(): void;
2953
- protected registerMatSelect(select: MatSelect): void;
2954
2964
  private refocusSearchInput;
2955
2965
  private focusMaterialOption;
2956
2966
  private resolveMaterialOptionLabel;
@@ -4500,6 +4510,7 @@ declare class InlineDateRangeComponent extends MaterialDateRangeComponent {
4500
4510
  inlineTextTruncated: boolean;
4501
4511
  private fieldLabelText;
4502
4512
  private resizeRafId;
4513
+ private overlayPositionRafId;
4503
4514
  overlayOpen: boolean;
4504
4515
  private overlayCommittedInSession;
4505
4516
  private overlayBaseline;
@@ -4566,6 +4577,7 @@ declare class InlineDateRangeComponent extends MaterialDateRangeComponent {
4566
4577
  onInputClick(picker: MatDateRangePicker<Date>, event: Event): void;
4567
4578
  onFieldContainerClick(picker: MatDateRangePicker<Date>, event: MouseEvent): void;
4568
4579
  openPicker(picker: MatDateRangePicker<Date>, event: Event): void;
4580
+ private resolvePickerXPosition;
4569
4581
  onOverlayOpened(): void;
4570
4582
  onOverlayClosed(): void;
4571
4583
  onOverlayApplyAction(): void;
@@ -4606,6 +4618,19 @@ declare class InlineDateRangeComponent extends MaterialDateRangeComponent {
4606
4618
  private parsePx;
4607
4619
  private scheduleOverlayActionsContainerSync;
4608
4620
  private syncOverlayActionsContainerClass;
4621
+ /**
4622
+ * Material positions the popup before projected actions are composed. Side shortcuts expand the
4623
+ * content from the calendar width to the enterprise two-column width, so the connected overlay
4624
+ * must be measured again after that DOM change. Delegating to the existing OverlayRef preserves
4625
+ * Material's viewport margin, fallback positions, directionality, and scroll strategy.
4626
+ */
4627
+ private updatePickerOverlayPosition;
4628
+ /**
4629
+ * Material locks the first connected position so normal scrolling cannot make the popup jump.
4630
+ * Praxis adds the shortcut rail after that first measurement, therefore we briefly unlock only
4631
+ * while the CDK evaluates the final overlay dimensions and restore Material's default policy.
4632
+ */
4633
+ private remeasurePickerOverlay;
4609
4634
  private findOverlayActionsContainer;
4610
4635
  private syncQuickPresetComposition;
4611
4636
  private ensureQuickPresetRail;
@@ -4777,6 +4802,8 @@ interface TimeRangeValue {
4777
4802
  end: string | null;
4778
4803
  }
4779
4804
  declare class PdxMaterialTimeRangeComponent extends SimpleBaseInputComponent implements OnInit {
4805
+ supportingTextId(): string;
4806
+ supportingTextDescribedBy(): string | null;
4780
4807
  readonlyMode: boolean;
4781
4808
  disabledMode: boolean;
4782
4809
  visible: boolean;