@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: 14
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-03-26"
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.92",
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.92",
15
- "@praxisui/cron-builder": "^8.0.0-beta.92"
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;