@praxisui/dynamic-fields 9.0.5-rc.9 → 9.0.6

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-rc.9",
3
+ "version": "9.0.6",
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-rc.9",
15
- "@praxisui/cron-builder": "^9.0.5-rc.9"
14
+ "@praxisui/core": "^9.0.6",
15
+ "@praxisui/cron-builder": "^9.0.6"
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;
@@ -618,6 +619,11 @@ declare abstract class SimpleBaseInputComponent implements ControlValueAccessor,
618
619
  readonly internalControl: FormControl<any>;
619
620
  /** FormControl signal para interface BaseDynamicFieldComponent */
620
621
  readonly formControl: _angular_core.WritableSignal<FormControl<any> | null>;
622
+ /**
623
+ * Whether the current disabled state was explicitly applied by metadata.
624
+ * Omitted metadata must not release an external runtime owner of the control.
625
+ */
626
+ private metadataDisabledApplied;
621
627
  /**
622
628
  * Define um FormControl externo a ser utilizado como fonte de verdade.
623
629
  */
@@ -1146,6 +1152,12 @@ declare abstract class SimpleBaseSelectComponent<T = any> extends SimpleBaseInpu
1146
1152
  protected defaultPanelClass(): string | string[] | undefined;
1147
1153
  selectPanelClass(): string[];
1148
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;
1149
1161
  protected normalizeMultipleControlValue(): void;
1150
1162
  setExternalControl(control: AbstractControl): void;
1151
1163
  /** Whether to show the clear button (if enabled in metadata) */
@@ -1192,6 +1204,7 @@ declare abstract class SimpleBaseSelectComponent<T = any> extends SimpleBaseInpu
1192
1204
  selectPanelActionsAriaLabel(): string;
1193
1205
  noOptionsAvailableLabel(): string;
1194
1206
  loadingOptionsAriaLabel(): string;
1207
+ selectionTriggerAriaLabel(displayValue: string): string;
1195
1208
  /**
1196
1209
  * Ícone para estado "selecionado" em opções do painel.
1197
1210
  */
@@ -2574,6 +2587,7 @@ declare class MaterialSelectComponent extends SimpleBaseSelectComponent {
2574
2587
  private readonly collectionSearch;
2575
2588
  private readonly overlayTrigger;
2576
2589
  private readonly overlayOptions;
2590
+ private pendingOverlayFocusIndex;
2577
2591
  protected defaultPanelClass(): string;
2578
2592
  setSelectMetadata(metadata: SimpleSelectMetadata<unknown>): void;
2579
2593
  ngOnInit(): void;
@@ -2590,7 +2604,8 @@ declare class MaterialSelectComponent extends SimpleBaseSelectComponent {
2590
2604
  onOptionKeydown(event: KeyboardEvent): void;
2591
2605
  hasSelectionValue(): boolean;
2592
2606
  materialDisplayText(): string;
2593
- labelId(): string;
2607
+ materialFullDisplayText(): string;
2608
+ materialTriggerTooltip(): string | null;
2594
2609
  panelId(): string;
2595
2610
  overlayId(): string;
2596
2611
  overlayPanelWidth(): string;
@@ -2697,6 +2712,7 @@ declare class MaterialSearchableSelectComponent extends SimpleBaseSelectComponen
2697
2712
  protected readonly collectionSearch: _angular_core.Signal<PdxCollectionSearchComponent | undefined>;
2698
2713
  protected readonly overlayTrigger: _angular_core.Signal<ElementRef<HTMLButtonElement> | undefined>;
2699
2714
  protected readonly overlayOptions: _angular_core.Signal<readonly ElementRef<HTMLButtonElement>[]>;
2715
+ private pendingOverlayFocusIndex;
2700
2716
  private readonly store;
2701
2717
  readonly endReached: _angular_core.WritableSignal<boolean>;
2702
2718
  private initialLoadStrategy;
@@ -2725,7 +2741,7 @@ declare class MaterialSearchableSelectComponent extends SimpleBaseSelectComponen
2725
2741
  onOptionKeydown(event: KeyboardEvent): void;
2726
2742
  hasSelectionValue(): boolean;
2727
2743
  materialDisplayText(): string;
2728
- labelId(): string;
2744
+ materialFullDisplayText(): string;
2729
2745
  panelId(): string;
2730
2746
  overlayId(): string;
2731
2747
  overlayPanelWidth(): string;
@@ -2741,7 +2757,6 @@ declare class MaterialSearchableSelectComponent extends SimpleBaseSelectComponen
2741
2757
  private isLastPage;
2742
2758
  onLoadMoreInteraction(event: Event): void;
2743
2759
  onSearch(term: string): void;
2744
- protected registerMatSelect(select: MatSelect): void;
2745
2760
  private refocusSearchInput;
2746
2761
  protected focusOverlayOption(index: number): void;
2747
2762
  private resolveMaterialOptionLabel;
@@ -2852,11 +2867,13 @@ declare class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
2852
2867
  private readonly materialCollectionSearch;
2853
2868
  private readonly materialOverlayTrigger;
2854
2869
  private readonly materialOverlayOptions;
2870
+ private pendingMaterialOverlayFocusIndex;
2855
2871
  readonly termControl: FormControl<unknown>;
2856
2872
  materialSearchTerm(): string;
2857
2873
  readonly activeLookupFilters: _angular_core.WritableSignal<LookupFilterRequest[]>;
2858
2874
  readonly selectedLookupSortKey: _angular_core.WritableSignal<string | null>;
2859
2875
  readonly selectedLookupSearchStrategyKey: _angular_core.WritableSignal<string | null>;
2876
+ readonly lookupSearchFeedback: _angular_core.WritableSignal<string | null>;
2860
2877
  protected readonly remoteTotalElements: _angular_core.WritableSignal<number | null>;
2861
2878
  private readonly queryTerm;
2862
2879
  private readonly store;
@@ -2886,7 +2903,7 @@ declare class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
2886
2903
  onMaterialOptionKeydown(event: KeyboardEvent): void;
2887
2904
  hasMaterialSelection(): boolean;
2888
2905
  materialDisplayText(): string;
2889
- materialLabelId(): string;
2906
+ materialFullDisplayText(): string;
2890
2907
  materialPanelId(): string;
2891
2908
  materialOverlayId(): string;
2892
2909
  materialOverlayPanelWidth(): string;
@@ -2937,13 +2954,13 @@ declare class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
2937
2954
  private attachAutocompleteScrollListener;
2938
2955
  private detachAutocompleteScrollListener;
2939
2956
  private runQuery;
2957
+ private resolveGovernedLookupSearch;
2940
2958
  loadMore(): void;
2941
2959
  showLoadMore(): boolean;
2942
2960
  shouldRenderOpenSentinel(): boolean;
2943
2961
  private isLastPage;
2944
2962
  onLoadMoreInteraction(event: Event): void;
2945
2963
  retry(): void;
2946
- protected registerMatSelect(select: MatSelect): void;
2947
2964
  private refocusSearchInput;
2948
2965
  private focusMaterialOption;
2949
2966
  private resolveMaterialOptionLabel;
@@ -3113,7 +3130,8 @@ type EntityLookupMetadata = MaterialEntityLookupMetadata & {
3113
3130
  materialDesign?: LookupMaterialDesignConfig;
3114
3131
  density?: string;
3115
3132
  };
3116
- declare class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
3133
+ declare class InlineEntityLookupComponent extends MaterialAsyncSelectComponent implements AfterViewInit, DoCheck {
3134
+ private readonly hostRef;
3117
3135
  private readonly detailServiceInjector;
3118
3136
  private readonly dialog;
3119
3137
  inlineMinWidthPx: number;
@@ -3130,10 +3148,13 @@ declare class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
3130
3148
  private singleSelectionCloseDestroyHookRegistered;
3131
3149
  private placeholderTextCacheSignature;
3132
3150
  private placeholderTextCache;
3151
+ ngDoCheck(): void;
3152
+ ngAfterViewInit(): void;
3133
3153
  set initialMetadata(metadata: MaterialEntityLookupMetadata | null | undefined);
3134
3154
  private currentMetadata;
3135
3155
  setSelectMetadata(metadata: EntityLookupMetadata): void;
3136
3156
  protected setMetadata(metadata: MaterialSelectMetadata): void;
3157
+ private syncFullFieldLabelNotch;
3137
3158
  onComponentInit(): void;
3138
3159
  onLookupHostClick(event: MouseEvent): void;
3139
3160
  onViewportResize(): void;
@@ -4489,6 +4510,7 @@ declare class InlineDateRangeComponent extends MaterialDateRangeComponent {
4489
4510
  inlineTextTruncated: boolean;
4490
4511
  private fieldLabelText;
4491
4512
  private resizeRafId;
4513
+ private overlayPositionRafId;
4492
4514
  overlayOpen: boolean;
4493
4515
  private overlayCommittedInSession;
4494
4516
  private overlayBaseline;
@@ -4555,6 +4577,7 @@ declare class InlineDateRangeComponent extends MaterialDateRangeComponent {
4555
4577
  onInputClick(picker: MatDateRangePicker<Date>, event: Event): void;
4556
4578
  onFieldContainerClick(picker: MatDateRangePicker<Date>, event: MouseEvent): void;
4557
4579
  openPicker(picker: MatDateRangePicker<Date>, event: Event): void;
4580
+ private resolvePickerXPosition;
4558
4581
  onOverlayOpened(): void;
4559
4582
  onOverlayClosed(): void;
4560
4583
  onOverlayApplyAction(): void;
@@ -4595,6 +4618,19 @@ declare class InlineDateRangeComponent extends MaterialDateRangeComponent {
4595
4618
  private parsePx;
4596
4619
  private scheduleOverlayActionsContainerSync;
4597
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;
4598
4634
  private findOverlayActionsContainer;
4599
4635
  private syncQuickPresetComposition;
4600
4636
  private ensureQuickPresetRail;