@praxisui/dynamic-fields 8.0.0-beta.92 → 8.0.0-beta.94
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.
|
@@ -23,7 +23,7 @@ icon: "rule"
|
|
|
23
23
|
toc: true
|
|
24
24
|
sidebar: true
|
|
25
25
|
search_boost: 1.08
|
|
26
|
-
reading_time:
|
|
26
|
+
reading_time: 16
|
|
27
27
|
estimated_setup_time: 20
|
|
28
28
|
version: "1.0"
|
|
29
29
|
related_docs:
|
|
@@ -37,7 +37,7 @@ keywords:
|
|
|
37
37
|
- "select vs autocomplete"
|
|
38
38
|
- "custom host field"
|
|
39
39
|
- "inline filter"
|
|
40
|
-
last_updated: "2026-
|
|
40
|
+
last_updated: "2026-06-01"
|
|
41
41
|
---
|
|
42
42
|
|
|
43
43
|
# Dynamic Fields Field Selection Guide
|
|
@@ -115,6 +115,36 @@ Se o schema usa `input` para algo que depois exige validacao pesada, busca seman
|
|
|
115
115
|
| entidade de negocio remota com status, permissao, reidratacao ou dependencias | `entityLookup` | preserva identidade de entidade e usa contrato `RESOURCE_ENTITY` em vez de tratar entidade como opcao simples |
|
|
116
116
|
| busca incremental com semantica de sugestao | `autoComplete` | boa UX para descoberta |
|
|
117
117
|
|
|
118
|
+
### Promocao oficial de exemplos `entityLookup`
|
|
119
|
+
|
|
120
|
+
Um recurso so deve ser promovido como exemplo oficial de `entityLookup` quando
|
|
121
|
+
provar a cadeia completa de plataforma, nao apenas um dropdown remoto no host.
|
|
122
|
+
|
|
123
|
+
Checklist minimo para promocao:
|
|
124
|
+
|
|
125
|
+
- o backend publica o recurso com identidade canonica e `@ApiResource(resourceKey=...)`;
|
|
126
|
+
- `/schemas/filtered` entrega `x-ui.controlType = entityLookup` com `optionSource.type = RESOURCE_ENTITY`;
|
|
127
|
+
- `optionSource.resourcePath`, `valuePropertyPath`, `labelPropertyPath`, `searchPropertyPaths` e `display` explicam a entidade sem regra hardcoded no frontend;
|
|
128
|
+
- o recurso oferece busca paginada e reidratacao por ids (`filter` e `byIds`) para valores salvos;
|
|
129
|
+
- `selectionPolicy` documenta status, elegibilidade e preservacao de valor historico quando aplicavel;
|
|
130
|
+
- dependencias entre entidades usam `dependsOn` e `dependencyFilterMap`, sem inferencia por nome de campo no Angular;
|
|
131
|
+
- surfaces de detalhe sao publicadas pelo recurso quando `navigateToDetail` estiver habilitado;
|
|
132
|
+
- existe demo jogavel cobrindo campo de formulario e, quando o uso for filtro, `inlineEntityLookup`;
|
|
133
|
+
- existe teste focal ou e2e cobrindo busca, selecao, reidratacao e estado bloqueado/historico;
|
|
134
|
+
- a landing publica o exemplo como derivado da documentacao canonica, sem redefinir o contrato.
|
|
135
|
+
|
|
136
|
+
Exemplos oficiais atuais:
|
|
137
|
+
|
|
138
|
+
| Exemplo | Papel na plataforma | Status |
|
|
139
|
+
| --- | --- | --- |
|
|
140
|
+
| `human-resources.funcionarios` | referencia base de entidade humana reutilizavel em formularios, filtros e detalhes por surface | oficial para demonstrar `entityLookup` simples e `inlineEntityLookup` |
|
|
141
|
+
| `procurement.*` | demo enterprise com fornecedor, empresa, contrato, produto e pedido de compra dependentes | oficial como prova corporativa de dependencias e reidratacao |
|
|
142
|
+
|
|
143
|
+
Novos candidatos, como centros de custo, contratos, projetos ou ativos, devem
|
|
144
|
+
entrar por esse mesmo funil. Se o recurso ainda nao publica `byIds`,
|
|
145
|
+
`selectionPolicy` ou surface de detalhe, ele pode ser documentado como candidato,
|
|
146
|
+
mas nao como exemplo canonico completo.
|
|
147
|
+
|
|
118
148
|
## 3. Simples vs range
|
|
119
149
|
|
|
120
150
|
| Need | Prefer | Avoid |
|
|
@@ -12661,6 +12661,26 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
12661
12661
|
hiddenSelectedLookupTokenCount() {
|
|
12662
12662
|
return Math.max(0, this.selectedLookupViews().length - this.maxVisibleSelectedTokens());
|
|
12663
12663
|
}
|
|
12664
|
+
trackByOption(index, option) {
|
|
12665
|
+
return this.lookupOptionTrackIdentity(option, index);
|
|
12666
|
+
}
|
|
12667
|
+
trackLookupRichField(index, field) {
|
|
12668
|
+
return [field.key, field.label, field.presentation, field.value]
|
|
12669
|
+
.filter((value) => String(value ?? '').trim().length > 0)
|
|
12670
|
+
.join('|') || String(index);
|
|
12671
|
+
}
|
|
12672
|
+
trackLookupBadge(index, badge) {
|
|
12673
|
+
return `${badge || 'badge'}:${index}`;
|
|
12674
|
+
}
|
|
12675
|
+
trackSelectedLookupToken(index, token) {
|
|
12676
|
+
return token.identity || token.text || String(index);
|
|
12677
|
+
}
|
|
12678
|
+
trackLookupSortOption(index, option) {
|
|
12679
|
+
return option.key || option.label || String(index);
|
|
12680
|
+
}
|
|
12681
|
+
trackLookupFilterChip(index, chip) {
|
|
12682
|
+
return chip.field || `${chip.label}:${chip.valueText}:${index}`;
|
|
12683
|
+
}
|
|
12664
12684
|
isSelected(option) {
|
|
12665
12685
|
const value = this.control().value;
|
|
12666
12686
|
if (Array.isArray(value)) {
|
|
@@ -14055,6 +14075,25 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
14055
14075
|
const current = Array.isArray(value) ? value : [];
|
|
14056
14076
|
return current.filter((item) => this.lookupViewFromValue(item).identity !== identity);
|
|
14057
14077
|
}
|
|
14078
|
+
lookupOptionTrackIdentity(option, index) {
|
|
14079
|
+
const value = option?.value;
|
|
14080
|
+
const record = this.asRecord(value);
|
|
14081
|
+
if (record) {
|
|
14082
|
+
const identity = this.resolveLookupIdentity(record)
|
|
14083
|
+
?? record['identity']
|
|
14084
|
+
?? record['value']
|
|
14085
|
+
?? record['key']
|
|
14086
|
+
?? record['code'];
|
|
14087
|
+
if (identity !== undefined && identity !== null && String(identity).trim().length > 0) {
|
|
14088
|
+
return String(identity);
|
|
14089
|
+
}
|
|
14090
|
+
}
|
|
14091
|
+
if (this.isPrimitiveLookupValue(value)) {
|
|
14092
|
+
return String(value);
|
|
14093
|
+
}
|
|
14094
|
+
const label = String(option?.label ?? '').trim();
|
|
14095
|
+
return label ? `${label}:${index}` : String(index);
|
|
14096
|
+
}
|
|
14058
14097
|
recalculateInlineSizeBounds() {
|
|
14059
14098
|
const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : 1280;
|
|
14060
14099
|
const isMobile = viewportWidth <= 768;
|
|
@@ -14170,7 +14209,7 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
14170
14209
|
(click)="$event.stopPropagation()"
|
|
14171
14210
|
>
|
|
14172
14211
|
<option value="">{{ sortDefaultOptionText() }}</option>
|
|
14173
|
-
@for (option of lookupSortOptions(); track option) {
|
|
14212
|
+
@for (option of lookupSortOptions(); track trackLookupSortOption($index, option)) {
|
|
14174
14213
|
<option
|
|
14175
14214
|
[value]="option.key"
|
|
14176
14215
|
>
|
|
@@ -14182,7 +14221,7 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
14182
14221
|
}
|
|
14183
14222
|
@if (hasActiveLookupFilters()) {
|
|
14184
14223
|
<div class="pdx-panel-filter-chips">
|
|
14185
|
-
@for (chip of activeLookupFilterChips(); track chip) {
|
|
14224
|
+
@for (chip of activeLookupFilterChips(); track trackLookupFilterChip($index, chip)) {
|
|
14186
14225
|
<button
|
|
14187
14226
|
type="button"
|
|
14188
14227
|
class="pdx-panel-filter-chip"
|
|
@@ -14257,7 +14296,7 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
14257
14296
|
</span>
|
|
14258
14297
|
@if (selected.richFields.length) {
|
|
14259
14298
|
<span class="pdx-lookup-rich-fields">
|
|
14260
|
-
@for (field of selected.richFields; track field) {
|
|
14299
|
+
@for (field of selected.richFields; track trackLookupRichField($index, field)) {
|
|
14261
14300
|
<span
|
|
14262
14301
|
class="pdx-lookup-rich-field"
|
|
14263
14302
|
[class.is-chip]="field.presentation === 'chip' || field.presentation === 'date' || field.presentation === 'currency' || field.presentation === 'metric'"
|
|
@@ -14291,7 +14330,7 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
14291
14330
|
@if (showBadges() && visibleBadges(selected).length) {
|
|
14292
14331
|
<span class="pdx-lookup-badges">
|
|
14293
14332
|
@if (showBadges()) {
|
|
14294
|
-
@for (badge of visibleBadges(selected); track badge) {
|
|
14333
|
+
@for (badge of visibleBadges(selected); track trackLookupBadge($index, badge)) {
|
|
14295
14334
|
<span class="pdx-lookup-badge is-neutral">
|
|
14296
14335
|
{{ badge }}
|
|
14297
14336
|
</span>
|
|
@@ -14366,7 +14405,7 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
14366
14405
|
</span>
|
|
14367
14406
|
@if (selected.richFields.length) {
|
|
14368
14407
|
<span class="pdx-lookup-rich-fields is-compact">
|
|
14369
|
-
@for (field of selected.richFields; track field) {
|
|
14408
|
+
@for (field of selected.richFields; track trackLookupRichField($index, field)) {
|
|
14370
14409
|
<span
|
|
14371
14410
|
class="pdx-lookup-rich-field"
|
|
14372
14411
|
[class.is-chip]="field.presentation === 'chip' || field.presentation === 'date' || field.presentation === 'currency' || field.presentation === 'metric'"
|
|
@@ -14459,7 +14498,7 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
14459
14498
|
}
|
|
14460
14499
|
@if (multiple() && hasSelection()) {
|
|
14461
14500
|
<span class="pdx-chip-token-list">
|
|
14462
|
-
@for (token of visibleSelectedLookupTokens(); track token) {
|
|
14501
|
+
@for (token of visibleSelectedLookupTokens(); track trackSelectedLookupToken($index, token)) {
|
|
14463
14502
|
<span
|
|
14464
14503
|
class="pdx-chip-token"
|
|
14465
14504
|
[attr.title]="token.title"
|
|
@@ -14566,7 +14605,7 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
14566
14605
|
</span>
|
|
14567
14606
|
@if (item.richFields.length) {
|
|
14568
14607
|
<span class="pdx-lookup-rich-fields">
|
|
14569
|
-
@for (field of item.richFields; track field) {
|
|
14608
|
+
@for (field of item.richFields; track trackLookupRichField($index, field)) {
|
|
14570
14609
|
<span
|
|
14571
14610
|
class="pdx-lookup-rich-field"
|
|
14572
14611
|
[class.is-chip]="field.presentation === 'chip' || field.presentation === 'date' || field.presentation === 'currency' || field.presentation === 'metric'"
|
|
@@ -14599,7 +14638,7 @@ class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
14599
14638
|
@if (showBadges() && visibleBadges(item).length) {
|
|
14600
14639
|
<span class="pdx-lookup-badges">
|
|
14601
14640
|
@if (showBadges()) {
|
|
14602
|
-
@for (badge of visibleBadges(item); track badge) {
|
|
14641
|
+
@for (badge of visibleBadges(item); track trackLookupBadge($index, badge)) {
|
|
14603
14642
|
<span
|
|
14604
14643
|
class="pdx-lookup-badge is-neutral"
|
|
14605
14644
|
>
|
|
@@ -14766,7 +14805,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
14766
14805
|
(click)="$event.stopPropagation()"
|
|
14767
14806
|
>
|
|
14768
14807
|
<option value="">{{ sortDefaultOptionText() }}</option>
|
|
14769
|
-
@for (option of lookupSortOptions(); track option) {
|
|
14808
|
+
@for (option of lookupSortOptions(); track trackLookupSortOption($index, option)) {
|
|
14770
14809
|
<option
|
|
14771
14810
|
[value]="option.key"
|
|
14772
14811
|
>
|
|
@@ -14778,7 +14817,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
14778
14817
|
}
|
|
14779
14818
|
@if (hasActiveLookupFilters()) {
|
|
14780
14819
|
<div class="pdx-panel-filter-chips">
|
|
14781
|
-
@for (chip of activeLookupFilterChips(); track chip) {
|
|
14820
|
+
@for (chip of activeLookupFilterChips(); track trackLookupFilterChip($index, chip)) {
|
|
14782
14821
|
<button
|
|
14783
14822
|
type="button"
|
|
14784
14823
|
class="pdx-panel-filter-chip"
|
|
@@ -14853,7 +14892,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
14853
14892
|
</span>
|
|
14854
14893
|
@if (selected.richFields.length) {
|
|
14855
14894
|
<span class="pdx-lookup-rich-fields">
|
|
14856
|
-
@for (field of selected.richFields; track field) {
|
|
14895
|
+
@for (field of selected.richFields; track trackLookupRichField($index, field)) {
|
|
14857
14896
|
<span
|
|
14858
14897
|
class="pdx-lookup-rich-field"
|
|
14859
14898
|
[class.is-chip]="field.presentation === 'chip' || field.presentation === 'date' || field.presentation === 'currency' || field.presentation === 'metric'"
|
|
@@ -14887,7 +14926,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
14887
14926
|
@if (showBadges() && visibleBadges(selected).length) {
|
|
14888
14927
|
<span class="pdx-lookup-badges">
|
|
14889
14928
|
@if (showBadges()) {
|
|
14890
|
-
@for (badge of visibleBadges(selected); track badge) {
|
|
14929
|
+
@for (badge of visibleBadges(selected); track trackLookupBadge($index, badge)) {
|
|
14891
14930
|
<span class="pdx-lookup-badge is-neutral">
|
|
14892
14931
|
{{ badge }}
|
|
14893
14932
|
</span>
|
|
@@ -14962,7 +15001,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
14962
15001
|
</span>
|
|
14963
15002
|
@if (selected.richFields.length) {
|
|
14964
15003
|
<span class="pdx-lookup-rich-fields is-compact">
|
|
14965
|
-
@for (field of selected.richFields; track field) {
|
|
15004
|
+
@for (field of selected.richFields; track trackLookupRichField($index, field)) {
|
|
14966
15005
|
<span
|
|
14967
15006
|
class="pdx-lookup-rich-field"
|
|
14968
15007
|
[class.is-chip]="field.presentation === 'chip' || field.presentation === 'date' || field.presentation === 'currency' || field.presentation === 'metric'"
|
|
@@ -15055,7 +15094,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
15055
15094
|
}
|
|
15056
15095
|
@if (multiple() && hasSelection()) {
|
|
15057
15096
|
<span class="pdx-chip-token-list">
|
|
15058
|
-
@for (token of visibleSelectedLookupTokens(); track token) {
|
|
15097
|
+
@for (token of visibleSelectedLookupTokens(); track trackSelectedLookupToken($index, token)) {
|
|
15059
15098
|
<span
|
|
15060
15099
|
class="pdx-chip-token"
|
|
15061
15100
|
[attr.title]="token.title"
|
|
@@ -15162,7 +15201,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
15162
15201
|
</span>
|
|
15163
15202
|
@if (item.richFields.length) {
|
|
15164
15203
|
<span class="pdx-lookup-rich-fields">
|
|
15165
|
-
@for (field of item.richFields; track field) {
|
|
15204
|
+
@for (field of item.richFields; track trackLookupRichField($index, field)) {
|
|
15166
15205
|
<span
|
|
15167
15206
|
class="pdx-lookup-rich-field"
|
|
15168
15207
|
[class.is-chip]="field.presentation === 'chip' || field.presentation === 'date' || field.presentation === 'currency' || field.presentation === 'metric'"
|
|
@@ -15195,7 +15234,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
15195
15234
|
@if (showBadges() && visibleBadges(item).length) {
|
|
15196
15235
|
<span class="pdx-lookup-badges">
|
|
15197
15236
|
@if (showBadges()) {
|
|
15198
|
-
@for (badge of visibleBadges(item); track badge) {
|
|
15237
|
+
@for (badge of visibleBadges(item); track trackLookupBadge($index, badge)) {
|
|
15199
15238
|
<span
|
|
15200
15239
|
class="pdx-lookup-badge is-neutral"
|
|
15201
15240
|
>
|
|
@@ -15355,6 +15394,21 @@ class EntityLookupDialogComponent {
|
|
|
15355
15394
|
sortOptions() {
|
|
15356
15395
|
return this.lookup().lookupSortOptions();
|
|
15357
15396
|
}
|
|
15397
|
+
trackLookupSortOption(index, option) {
|
|
15398
|
+
return this.lookup().trackLookupSortOption(index, option);
|
|
15399
|
+
}
|
|
15400
|
+
trackDialogFilterDefinition(index, definition) {
|
|
15401
|
+
return definition.field || `${definition.label ?? 'filter'}:${index}`;
|
|
15402
|
+
}
|
|
15403
|
+
trackDialogEnumOption(index, option) {
|
|
15404
|
+
return option.value || option.label || String(index);
|
|
15405
|
+
}
|
|
15406
|
+
trackDialogColumn(index, column) {
|
|
15407
|
+
return column.field || `${column.kind ?? 'column'}:${index}`;
|
|
15408
|
+
}
|
|
15409
|
+
trackResultOption(index, option) {
|
|
15410
|
+
return this.optionIdentity(option) || String(index);
|
|
15411
|
+
}
|
|
15358
15412
|
sortValue() {
|
|
15359
15413
|
return this.lookup().lookupSortSelectValue();
|
|
15360
15414
|
}
|
|
@@ -15985,7 +16039,7 @@ class EntityLookupDialogComponent {
|
|
|
15985
16039
|
<span>{{ sortLabel() }}</span>
|
|
15986
16040
|
<select [value]="sortValue()" (change)="onSortChange($event)">
|
|
15987
16041
|
<option value="">{{ sortDefaultLabel() }}</option>
|
|
15988
|
-
@for (option of sortOptions(); track option) {
|
|
16042
|
+
@for (option of sortOptions(); track trackLookupSortOption($index, option)) {
|
|
15989
16043
|
<option [value]="option.key">
|
|
15990
16044
|
{{ option.label || option.key }}
|
|
15991
16045
|
</option>
|
|
@@ -16016,7 +16070,7 @@ class EntityLookupDialogComponent {
|
|
|
16016
16070
|
data-testid="entity-lookup-dialog-filter-panel"
|
|
16017
16071
|
>
|
|
16018
16072
|
<div class="pdx-lookup-dialog-filter-grid">
|
|
16019
|
-
@for (definition of dialogFilterDefinitions(); track definition) {
|
|
16073
|
+
@for (definition of dialogFilterDefinitions(); track trackDialogFilterDefinition($index, definition)) {
|
|
16020
16074
|
<label
|
|
16021
16075
|
class="pdx-lookup-dialog-filter-field"
|
|
16022
16076
|
>
|
|
@@ -16028,7 +16082,7 @@ class EntityLookupDialogComponent {
|
|
|
16028
16082
|
[formControl]="filterControl(definition.field)"
|
|
16029
16083
|
[attr.aria-label]="dialogFilterLabel(definition)"
|
|
16030
16084
|
>
|
|
16031
|
-
@for (option of dialogEnumOptions(definition); track option) {
|
|
16085
|
+
@for (option of dialogEnumOptions(definition); track trackDialogEnumOption($index, option)) {
|
|
16032
16086
|
<option
|
|
16033
16087
|
[value]="option.value"
|
|
16034
16088
|
>
|
|
@@ -16058,7 +16112,7 @@ class EntityLookupDialogComponent {
|
|
|
16058
16112
|
[attr.aria-label]="dialogFilterLabel(definition)"
|
|
16059
16113
|
>
|
|
16060
16114
|
<option value="">{{ dialogFilterSelectEmptyText(definition) }}</option>
|
|
16061
|
-
@for (option of dialogEnumOptions(definition); track option) {
|
|
16115
|
+
@for (option of dialogEnumOptions(definition); track trackDialogEnumOption($index, option)) {
|
|
16062
16116
|
<option
|
|
16063
16117
|
[value]="option.value"
|
|
16064
16118
|
>
|
|
@@ -16116,7 +16170,7 @@ class EntityLookupDialogComponent {
|
|
|
16116
16170
|
@if (showResultTable()) {
|
|
16117
16171
|
<div class="pdx-lookup-dialog-table">
|
|
16118
16172
|
<div class="pdx-lookup-dialog-table-head">
|
|
16119
|
-
@for (column of dialogColumns(); track column) {
|
|
16173
|
+
@for (column of dialogColumns(); track trackDialogColumn($index, column)) {
|
|
16120
16174
|
<span
|
|
16121
16175
|
class="pdx-lookup-dialog-table-cell is-head"
|
|
16122
16176
|
[style.flex]="columnFlex(column)"
|
|
@@ -16125,7 +16179,7 @@ class EntityLookupDialogComponent {
|
|
|
16125
16179
|
</span>
|
|
16126
16180
|
}
|
|
16127
16181
|
</div>
|
|
16128
|
-
@for (option of resultOptions(); track option; let index = $index) {
|
|
16182
|
+
@for (option of resultOptions(); track trackResultOption($index, option); let index = $index) {
|
|
16129
16183
|
<button
|
|
16130
16184
|
type="button"
|
|
16131
16185
|
class="pdx-lookup-dialog-table-row"
|
|
@@ -16149,7 +16203,7 @@ class EntityLookupDialogComponent {
|
|
|
16149
16203
|
(dblclick)="apply()"
|
|
16150
16204
|
(keydown)="onResultRowKeydown($event, index, option)"
|
|
16151
16205
|
>
|
|
16152
|
-
@for (column of dialogColumns(); track column) {
|
|
16206
|
+
@for (column of dialogColumns(); track trackDialogColumn($index, column)) {
|
|
16153
16207
|
<span
|
|
16154
16208
|
class="pdx-lookup-dialog-table-cell"
|
|
16155
16209
|
[style.flex]="columnFlex(column)"
|
|
@@ -16161,7 +16215,7 @@ class EntityLookupDialogComponent {
|
|
|
16161
16215
|
}
|
|
16162
16216
|
</div>
|
|
16163
16217
|
} @else {
|
|
16164
|
-
@for (option of resultOptions(); track option; let index = $index) {
|
|
16218
|
+
@for (option of resultOptions(); track trackResultOption($index, option); let index = $index) {
|
|
16165
16219
|
<button
|
|
16166
16220
|
type="button"
|
|
16167
16221
|
class="pdx-lookup-dialog-row"
|
|
@@ -16387,7 +16441,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
16387
16441
|
<span>{{ sortLabel() }}</span>
|
|
16388
16442
|
<select [value]="sortValue()" (change)="onSortChange($event)">
|
|
16389
16443
|
<option value="">{{ sortDefaultLabel() }}</option>
|
|
16390
|
-
@for (option of sortOptions(); track option) {
|
|
16444
|
+
@for (option of sortOptions(); track trackLookupSortOption($index, option)) {
|
|
16391
16445
|
<option [value]="option.key">
|
|
16392
16446
|
{{ option.label || option.key }}
|
|
16393
16447
|
</option>
|
|
@@ -16418,7 +16472,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
16418
16472
|
data-testid="entity-lookup-dialog-filter-panel"
|
|
16419
16473
|
>
|
|
16420
16474
|
<div class="pdx-lookup-dialog-filter-grid">
|
|
16421
|
-
@for (definition of dialogFilterDefinitions(); track definition) {
|
|
16475
|
+
@for (definition of dialogFilterDefinitions(); track trackDialogFilterDefinition($index, definition)) {
|
|
16422
16476
|
<label
|
|
16423
16477
|
class="pdx-lookup-dialog-filter-field"
|
|
16424
16478
|
>
|
|
@@ -16430,7 +16484,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
16430
16484
|
[formControl]="filterControl(definition.field)"
|
|
16431
16485
|
[attr.aria-label]="dialogFilterLabel(definition)"
|
|
16432
16486
|
>
|
|
16433
|
-
@for (option of dialogEnumOptions(definition); track option) {
|
|
16487
|
+
@for (option of dialogEnumOptions(definition); track trackDialogEnumOption($index, option)) {
|
|
16434
16488
|
<option
|
|
16435
16489
|
[value]="option.value"
|
|
16436
16490
|
>
|
|
@@ -16460,7 +16514,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
16460
16514
|
[attr.aria-label]="dialogFilterLabel(definition)"
|
|
16461
16515
|
>
|
|
16462
16516
|
<option value="">{{ dialogFilterSelectEmptyText(definition) }}</option>
|
|
16463
|
-
@for (option of dialogEnumOptions(definition); track option) {
|
|
16517
|
+
@for (option of dialogEnumOptions(definition); track trackDialogEnumOption($index, option)) {
|
|
16464
16518
|
<option
|
|
16465
16519
|
[value]="option.value"
|
|
16466
16520
|
>
|
|
@@ -16518,7 +16572,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
16518
16572
|
@if (showResultTable()) {
|
|
16519
16573
|
<div class="pdx-lookup-dialog-table">
|
|
16520
16574
|
<div class="pdx-lookup-dialog-table-head">
|
|
16521
|
-
@for (column of dialogColumns(); track column) {
|
|
16575
|
+
@for (column of dialogColumns(); track trackDialogColumn($index, column)) {
|
|
16522
16576
|
<span
|
|
16523
16577
|
class="pdx-lookup-dialog-table-cell is-head"
|
|
16524
16578
|
[style.flex]="columnFlex(column)"
|
|
@@ -16527,7 +16581,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
16527
16581
|
</span>
|
|
16528
16582
|
}
|
|
16529
16583
|
</div>
|
|
16530
|
-
@for (option of resultOptions(); track option; let index = $index) {
|
|
16584
|
+
@for (option of resultOptions(); track trackResultOption($index, option); let index = $index) {
|
|
16531
16585
|
<button
|
|
16532
16586
|
type="button"
|
|
16533
16587
|
class="pdx-lookup-dialog-table-row"
|
|
@@ -16551,7 +16605,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
16551
16605
|
(dblclick)="apply()"
|
|
16552
16606
|
(keydown)="onResultRowKeydown($event, index, option)"
|
|
16553
16607
|
>
|
|
16554
|
-
@for (column of dialogColumns(); track column) {
|
|
16608
|
+
@for (column of dialogColumns(); track trackDialogColumn($index, column)) {
|
|
16555
16609
|
<span
|
|
16556
16610
|
class="pdx-lookup-dialog-table-cell"
|
|
16557
16611
|
[style.flex]="columnFlex(column)"
|
|
@@ -16563,7 +16617,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
|
|
|
16563
16617
|
}
|
|
16564
16618
|
</div>
|
|
16565
16619
|
} @else {
|
|
16566
|
-
@for (option of resultOptions(); track option; let index = $index) {
|
|
16620
|
+
@for (option of resultOptions(); track trackResultOption($index, option); let index = $index) {
|
|
16567
16621
|
<button
|
|
16568
16622
|
type="button"
|
|
16569
16623
|
class="pdx-lookup-dialog-row"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/dynamic-fields",
|
|
3
|
-
"version": "8.0.0-beta.
|
|
3
|
+
"version": "8.0.0-beta.94",
|
|
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": "^8.0.0-beta.
|
|
15
|
-
"@praxisui/cron-builder": "^8.0.0-beta.
|
|
14
|
+
"@praxisui/core": "^8.0.0-beta.94",
|
|
15
|
+
"@praxisui/cron-builder": "^8.0.0-beta.94"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"libphonenumber-js": "^1.12.41",
|
|
@@ -2781,6 +2781,15 @@ declare class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
2781
2781
|
selectedLookupViews(): EntityLookupViewModel[];
|
|
2782
2782
|
visibleSelectedLookupTokens(): SelectedLookupTokenViewModel[];
|
|
2783
2783
|
hiddenSelectedLookupTokenCount(): number;
|
|
2784
|
+
trackByOption(index: number, option: LookupOption): string;
|
|
2785
|
+
trackLookupRichField(index: number, field: EntityLookupRichFieldViewModel): string;
|
|
2786
|
+
trackLookupBadge(index: number, badge: string): string;
|
|
2787
|
+
trackSelectedLookupToken(index: number, token: SelectedLookupTokenViewModel): string;
|
|
2788
|
+
trackLookupSortOption(index: number, option: {
|
|
2789
|
+
key?: string;
|
|
2790
|
+
label?: string;
|
|
2791
|
+
}): string;
|
|
2792
|
+
trackLookupFilterChip(index: number, chip: LookupFilterChipViewModel): string;
|
|
2784
2793
|
isSelected(option: LookupOption): boolean;
|
|
2785
2794
|
showSelectedTokenRemove(): boolean;
|
|
2786
2795
|
selectedTokenRemoveAriaLabel(text: string): string;
|
|
@@ -2950,6 +2959,7 @@ declare class InlineEntityLookupComponent extends MaterialAsyncSelectComponent {
|
|
|
2950
2959
|
private humanizeFieldName;
|
|
2951
2960
|
private maxVisibleSelectedTokens;
|
|
2952
2961
|
private removeSelectionByIdentity;
|
|
2962
|
+
private lookupOptionTrackIdentity;
|
|
2953
2963
|
private recalculateInlineSizeBounds;
|
|
2954
2964
|
private resolveWidthBounds;
|
|
2955
2965
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<InlineEntityLookupComponent, never>;
|
|
@@ -2980,6 +2990,17 @@ declare class EntityLookupDialogComponent implements AfterViewInit {
|
|
|
2980
2990
|
dialogPreviewAriaLabel(): string;
|
|
2981
2991
|
showSortControl(): boolean;
|
|
2982
2992
|
sortOptions(): _praxisui_core.LookupSortOptionMetadata[];
|
|
2993
|
+
trackLookupSortOption(index: number, option: {
|
|
2994
|
+
key?: string;
|
|
2995
|
+
label?: string;
|
|
2996
|
+
}): string;
|
|
2997
|
+
trackDialogFilterDefinition(index: number, definition: LookupFilterDefinitionMetadata): string;
|
|
2998
|
+
trackDialogEnumOption(index: number, option: {
|
|
2999
|
+
value?: string;
|
|
3000
|
+
label?: string;
|
|
3001
|
+
}): string;
|
|
3002
|
+
trackDialogColumn(index: number, column: LookupResultColumnMetadata): string;
|
|
3003
|
+
trackResultOption(index: number, option: LookupOption): string;
|
|
2983
3004
|
sortValue(): string;
|
|
2984
3005
|
onSortChange(event: Event): void;
|
|
2985
3006
|
sortLabel(): string;
|