@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/ai/component-registry.json +2 -2
- package/docs/dynamic-fields-field-selection-guide.md +19 -0
- package/fesm2022/praxisui-dynamic-fields.mjs +787 -234
- package/package.json +3 -3
- package/src/lib/components/material-async-select/pdx-material-async-select.json-api.md +10 -4
- package/src/lib/components/material-searchable-select/pdx-material-searchable-select.json-api.md +7 -2
- package/src/lib/components/material-select/pdx-material-select.json-api.md +10 -4
- package/types/praxisui-dynamic-fields.d.ts +42 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/dynamic-fields",
|
|
3
|
-
"version": "9.0.
|
|
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.
|
|
15
|
-
"@praxisui/cron-builder": "^9.0.
|
|
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-
|
|
26
|
-
last_updated: "2026-08-
|
|
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 |
|
|
116
|
-
| `disabledMode` | boolean | false | n/a |
|
|
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
|
|
package/src/lib/components/material-searchable-select/pdx-material-searchable-select.json-api.md
CHANGED
|
@@ -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-
|
|
26
|
-
last_updated: "2026-
|
|
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-
|
|
26
|
-
last_updated: "2026-08-
|
|
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 |
|
|
117
|
-
| `disabledMode` | boolean | false | n/a |
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|