@praxisui/dynamic-fields 9.0.5-rc.10 → 9.0.5-rc.12

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.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-08-12T23:49:15.227Z",
3
+ "generatedAt": "2026-08-13T13:48:00.302Z",
4
4
  "packageName": "@praxisui/dynamic-fields",
5
- "packageVersion": "9.0.5-rc.10",
5
+ "packageVersion": "9.0.5-rc.12",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 76,
@@ -136,6 +136,25 @@ combobox unico. Nao insira input, botao, toolbar ou footer interativo dentro de
136
136
  `mat-select`; para resultados remotos, a carga incremental do combobox ocorre
137
137
  automaticamente ao aproximar-se do fim da lista.
138
138
 
139
+ ### Busca governada por estratégia
140
+
141
+ Quando `optionSource.filtering.searchStrategies` estiver presente, o runtime
142
+ materializa a intenção declarada pelo backend em vez de inferi-la pelo texto:
143
+
144
+ - uma única estratégia é selecionada automaticamente;
145
+ - duas ou mais estratégias exigem escolha explícita e acessível antes do HTTP;
146
+ - `minSearchChars` é aplicado à estratégia selecionada;
147
+ - `inputFormat: digits` aceita somente dígitos ASCII;
148
+ - `normalized-document` aceita dígitos, espaços, pontos e hífens, remove os
149
+ separadores visuais e aplica o mínimo ao valor normalizado;
150
+ - a requisição envia a chave em `searchStrategy`, sem expor bindings, SQL,
151
+ documentos brutos ou detalhes privados do provider.
152
+
153
+ Sem estratégias publicadas, permanece o comportamento compatível de busca do
154
+ option source. Respostas `422` ainda recebem mensagem segura e localizada, mas
155
+ ambiguidade, formato inválido e mínimo insuficiente são bloqueados antes da
156
+ rede.
157
+
139
158
  ### Promocao oficial de exemplos `entityLookup`
140
159
 
141
160
  Um recurso so deve ser promovido como exemplo oficial de `entityLookup` quando
@@ -456,6 +456,10 @@ const PRAXIS_DYNAMIC_FIELDS_EN_US = {
456
456
  'praxis.dynamicFields.entityLookup.searchStrategy.businessCode': 'Employee code',
457
457
  'praxis.dynamicFields.entityLookup.searchStrategy.descriptiveText': 'Name or description',
458
458
  'praxis.dynamicFields.entityLookup.searchStrategy.normalizedDocument': 'Document',
459
+ 'praxis.dynamicFields.select.searchStrategyRequired': 'Select how you want to search.',
460
+ 'praxis.dynamicFields.select.searchStrategyDigitsOnly': 'Use numbers only for this search.',
461
+ 'praxis.dynamicFields.select.searchStrategyDocumentFormat': 'Use only numbers, spaces, periods, or hyphens.',
462
+ 'praxis.dynamicFields.select.searchStrategyMinimum': 'Enter at least {{minimum}} characters.',
459
463
  'praxis.dynamicFields.entityLookup.dialog.context.filtered': 'Use quick search and active filters to reach the right entity.',
460
464
  'praxis.dynamicFields.entityLookup.dialog.currentSelection': 'Current selection: {value}',
461
465
  'praxis.dynamicFields.entityLookup.dialog.filters.show': 'Show filters',
@@ -890,6 +894,10 @@ const PRAXIS_DYNAMIC_FIELDS_PT_BR = {
890
894
  'praxis.dynamicFields.entityLookup.searchStrategy.businessCode': 'Código funcional',
891
895
  'praxis.dynamicFields.entityLookup.searchStrategy.descriptiveText': 'Nome ou descrição',
892
896
  'praxis.dynamicFields.entityLookup.searchStrategy.normalizedDocument': 'Documento',
897
+ 'praxis.dynamicFields.select.searchStrategyRequired': 'Selecione como deseja buscar.',
898
+ 'praxis.dynamicFields.select.searchStrategyDigitsOnly': 'Use apenas números nesta busca.',
899
+ 'praxis.dynamicFields.select.searchStrategyDocumentFormat': 'Use apenas números, espaços, pontos ou hífens.',
900
+ 'praxis.dynamicFields.select.searchStrategyMinimum': 'Digite pelo menos {{minimum}} caracteres.',
893
901
  'praxis.dynamicFields.entityLookup.dialog.context.filtered': 'Use a busca rápida e os filtros ativos para chegar à entidade correta.',
894
902
  'praxis.dynamicFields.entityLookup.dialog.currentSelection': 'Seleção atual: {value}',
895
903
  'praxis.dynamicFields.entityLookup.dialog.filters.show': 'Mostrar filtros',
@@ -13095,6 +13103,7 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
13095
13103
  activeLookupFilters = signal([], ...(ngDevMode ? [{ debugName: "activeLookupFilters" }] : /* istanbul ignore next */ []));
13096
13104
  selectedLookupSortKey = signal(null, ...(ngDevMode ? [{ debugName: "selectedLookupSortKey" }] : /* istanbul ignore next */ []));
13097
13105
  selectedLookupSearchStrategyKey = signal(null, ...(ngDevMode ? [{ debugName: "selectedLookupSearchStrategyKey" }] : /* istanbul ignore next */ []));
13106
+ lookupSearchFeedback = signal(null, ...(ngDevMode ? [{ debugName: "lookupSearchFeedback" }] : /* istanbul ignore next */ []));
13098
13107
  remoteTotalElements = signal(null, ...(ngDevMode ? [{ debugName: "remoteTotalElements" }] : /* istanbul ignore next */ []));
13099
13108
  queryTerm = signal('', ...(ngDevMode ? [{ debugName: "queryTerm" }] : /* istanbul ignore next */ []));
13100
13109
  store = new OptionStore();
@@ -13471,6 +13480,7 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
13471
13480
  return this.currentLookupFiltering()?.searchStrategies ?? [];
13472
13481
  }
13473
13482
  initializeLookupFilteringState() {
13483
+ this.lookupSearchFeedback.set(null);
13474
13484
  const filtering = this.currentLookupFiltering();
13475
13485
  if (!filtering) {
13476
13486
  this.selectedLookupSortKey.set(null);
@@ -13692,7 +13702,17 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
13692
13702
  ? ++this.queryGeneration
13693
13703
  : this.queryGeneration;
13694
13704
  this.synchronizeDependencyCriteriaFromControls();
13695
- const term = this.queryTerm();
13705
+ const termResolution = this.resolveGovernedLookupSearch(this.queryTerm());
13706
+ if (!termResolution.allowed) {
13707
+ if (reset)
13708
+ ++this.queryGeneration;
13709
+ this.loading.set(false);
13710
+ this.error.set(null);
13711
+ this.remoteTotalElements.set(null);
13712
+ this.endReached.set(false);
13713
+ return of(void 0);
13714
+ }
13715
+ const term = termResolution.term;
13696
13716
  const hasSearchTerm = !!term.trim();
13697
13717
  const optionSource = this.optionSource();
13698
13718
  const filter = { ...this.filterCriteria() };
@@ -13780,6 +13800,46 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
13780
13800
  return EMPTY;
13781
13801
  }));
13782
13802
  }
13803
+ resolveGovernedLookupSearch(rawTerm) {
13804
+ const term = rawTerm.trim();
13805
+ if (!term) {
13806
+ this.lookupSearchFeedback.set(null);
13807
+ return { allowed: true, term: rawTerm };
13808
+ }
13809
+ const strategies = this.lookupSearchStrategies();
13810
+ if (!strategies.length) {
13811
+ this.lookupSearchFeedback.set(null);
13812
+ return { allowed: true, term: rawTerm };
13813
+ }
13814
+ const selectedKey = this.selectedLookupSearchStrategyKey();
13815
+ if (strategies.length > 1 && !selectedKey) {
13816
+ this.lookupSearchFeedback.set(this.tDynamicFields('select.searchStrategyRequired', 'Selecione como deseja buscar.'));
13817
+ return { allowed: false };
13818
+ }
13819
+ const strategy = strategies.find(({ key }) => key === selectedKey);
13820
+ if (!strategy) {
13821
+ this.lookupSearchFeedback.set(this.tDynamicFields('select.searchStrategyRequired', 'Selecione como deseja buscar.'));
13822
+ return { allowed: false };
13823
+ }
13824
+ let normalized = term;
13825
+ if (strategy.kind === 'normalized-document') {
13826
+ if (!/^[0-9.\-\s]+$/.test(term)) {
13827
+ this.lookupSearchFeedback.set(this.tDynamicFields('select.searchStrategyDocumentFormat', 'Use apenas números, espaços, pontos ou hífens.'));
13828
+ return { allowed: false };
13829
+ }
13830
+ normalized = term.replace(/[^0-9]/g, '');
13831
+ }
13832
+ else if (strategy.inputFormat === 'digits' && !/^[0-9]+$/.test(term)) {
13833
+ this.lookupSearchFeedback.set(this.tDynamicFields('select.searchStrategyDigitsOnly', 'Use apenas números nesta busca.'));
13834
+ return { allowed: false };
13835
+ }
13836
+ if (normalized.length < strategy.minSearchChars) {
13837
+ this.lookupSearchFeedback.set(this.tDynamicFields('select.searchStrategyMinimum', `Digite pelo menos ${strategy.minSearchChars} caracteres.`, { minimum: strategy.minSearchChars }));
13838
+ return { allowed: false };
13839
+ }
13840
+ this.lookupSearchFeedback.set(null);
13841
+ return { allowed: true, term: normalized };
13842
+ }
13783
13843
  loadMore() {
13784
13844
  if (!this.showLoadMore())
13785
13845
  return;
@@ -14105,6 +14165,9 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
14105
14165
  @if (hasValidationError()) {
14106
14166
  <mat-error>{{ errorMessage() }}</mat-error>
14107
14167
  }
14168
+ @if (lookupSearchFeedback()) {
14169
+ <mat-hint><span role="status">{{ lookupSearchFeedback() }}</span></mat-hint>
14170
+ }
14108
14171
  @if (hasInlineFieldHelp()) {
14109
14172
  <mat-hint>{{ fieldHelpInlineText() }}</mat-hint>
14110
14173
  }
@@ -14156,6 +14219,9 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
14156
14219
  (keydown)="onMaterialSearchKeydown($event)"
14157
14220
  />
14158
14221
  }
14222
+ @if (lookupSearchFeedback()) {
14223
+ <p class="pdx-material-collection-field__hint" role="status">{{ lookupSearchFeedback() }}</p>
14224
+ }
14159
14225
 
14160
14226
  <div pdxCollectionOverlayOptions class="pdx-material-async-select-options"
14161
14227
  [id]="materialPanelId()" role="listbox"
@@ -14346,6 +14412,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
14346
14412
  @if (hasValidationError()) {
14347
14413
  <mat-error>{{ errorMessage() }}</mat-error>
14348
14414
  }
14415
+ @if (lookupSearchFeedback()) {
14416
+ <mat-hint><span role="status">{{ lookupSearchFeedback() }}</span></mat-hint>
14417
+ }
14349
14418
  @if (hasInlineFieldHelp()) {
14350
14419
  <mat-hint>{{ fieldHelpInlineText() }}</mat-hint>
14351
14420
  }
@@ -14397,6 +14466,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
14397
14466
  (keydown)="onMaterialSearchKeydown($event)"
14398
14467
  />
14399
14468
  }
14469
+ @if (lookupSearchFeedback()) {
14470
+ <p class="pdx-material-collection-field__hint" role="status">{{ lookupSearchFeedback() }}</p>
14471
+ }
14400
14472
 
14401
14473
  <div pdxCollectionOverlayOptions class="pdx-material-async-select-options"
14402
14474
  [id]="materialPanelId()" role="listbox"
@@ -18302,6 +18374,9 @@ class EntityLookupDialogComponent {
18302
18374
  [attr.aria-label]="dialogSearchAriaLabel()"
18303
18375
  data-testid="entity-lookup-dialog-search-input"
18304
18376
  />
18377
+ @if (lookup().lookupSearchFeedback()) {
18378
+ <mat-hint><span role="status">{{ lookup().lookupSearchFeedback() }}</span></mat-hint>
18379
+ }
18305
18380
  </mat-form-field>
18306
18381
 
18307
18382
  @if (showSortControl()) {
@@ -18810,7 +18885,7 @@ class EntityLookupDialogComponent {
18810
18885
  {{ applyText() }}
18811
18886
  </button>
18812
18887
  </mat-dialog-actions>
18813
- `, isInline: true, styles: [".pdx-lookup-dialog-titlebar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-right:12px}.pdx-lookup-dialog-titlebar h2{min-width:0;margin:0;overflow-wrap:anywhere}.pdx-lookup-dialog-state.is-error{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:12px;min-height:112px;padding:18px;border:1px solid color-mix(in srgb,var(--md-sys-color-error) 32%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-error) 7%,var(--md-sys-color-surface));color:var(--md-sys-color-on-surface)}.pdx-lookup-dialog-state.is-error>mat-icon{color:var(--md-sys-color-error)}.pdx-lookup-dialog-state-copy{display:grid;gap:4px;min-width:0}.pdx-lookup-dialog-state-copy>span{color:var(--md-sys-color-on-surface-variant);line-height:1.4}.pdx-lookup-dialog-toolbar{display:grid;grid-template-columns:repeat(2,minmax(220px,1fr));gap:12px;align-items:start}.pdx-lookup-dialog-intro{display:grid;gap:4px;margin:0 0 12px}.pdx-lookup-dialog-intro strong{color:var(--md-sys-color-on-surface);font-size:.96rem;line-height:1.3}.pdx-lookup-dialog-intro span{color:var(--md-sys-color-on-surface-variant);font-size:.82rem;line-height:1.35}.pdx-lookup-dialog-search{grid-column:1 / -1;width:100%}.pdx-lookup-dialog-sort{display:grid;grid-template-columns:minmax(96px,auto) minmax(0,1fr);align-items:center;gap:10px;min-height:56px;color:var(--md-sys-color-on-surface-variant);font-size:.85rem}.pdx-lookup-dialog-sort select{width:100%;min-width:0;min-height:40px;border:1px solid var(--md-sys-color-outline-variant);border-radius:6px;background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);padding:0 10px}.pdx-lookup-dialog-filter-panel{display:flex;flex-direction:column;gap:12px;padding:12px;margin:8px 0 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-lowest)}.pdx-lookup-dialog-filter-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}.pdx-lookup-dialog-filter-field{display:flex;flex-direction:column;gap:6px;color:var(--md-sys-color-on-surface);font-size:.9rem}.pdx-lookup-dialog-filter-field input,.pdx-lookup-dialog-filter-field select{min-height:40px;border:1px solid var(--md-sys-color-outline-variant);border-radius:6px;background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);padding:0 10px}.pdx-lookup-dialog-filter-field select.is-multiple{min-height:96px;padding:8px 10px}.pdx-lookup-dialog-filter-range{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px}.pdx-lookup-dialog-filter-field small{color:var(--md-sys-color-on-surface-variant)}.pdx-lookup-dialog-filter-actions{display:flex;justify-content:flex-end;gap:8px}.pdx-lookup-dialog-summary{margin:8px 0 12px;display:flex;flex-wrap:wrap;gap:8px;color:var(--md-sys-color-on-surface-variant);font-size:.85rem}.pdx-lookup-dialog-summary-warning{color:var(--md-sys-color-error)}.pdx-lookup-dialog-content-grid{display:block}.pdx-lookup-dialog-content-grid.has-preview{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:16px;align-items:start}.pdx-lookup-dialog-results{display:flex;flex-direction:column;gap:10px;max-height:52vh;overflow:auto;padding-right:4px}.pdx-lookup-dialog-results.is-card-layout{gap:12px}.pdx-lookup-dialog-results.is-compact-layout{gap:6px}.pdx-lookup-dialog-table{display:flex;flex-direction:column;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;overflow:hidden}.pdx-lookup-dialog-table-head,.pdx-lookup-dialog-table-row{display:flex;align-items:stretch}.pdx-lookup-dialog-table-head{background:var(--md-sys-color-surface-container-low);border-bottom:1px solid var(--md-sys-color-outline-variant)}.pdx-lookup-dialog-table-row{width:100%;text-align:left;border:0;border-bottom:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);cursor:pointer}.pdx-lookup-dialog-table-row:last-child{border-bottom:0}.pdx-lookup-dialog-table-row.is-selected{background:color-mix(in srgb,var(--md-sys-color-primary) 8%,var(--md-sys-color-surface))}.pdx-lookup-dialog-table-row.is-disabled{opacity:.65;cursor:not-allowed}.pdx-lookup-dialog-table-row.is-blocked,.pdx-lookup-dialog-row.is-blocked{background:color-mix(in srgb,var(--md-sys-color-error) 4%,var(--md-sys-color-surface))}.pdx-lookup-dialog-table-row.is-legacy,.pdx-lookup-dialog-row.is-legacy{background:color-mix(in srgb,var(--md-sys-color-tertiary) 8%,var(--md-sys-color-surface))}.pdx-lookup-dialog-table-cell{min-width:0;padding:10px 12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pdx-lookup-dialog-table-cell.is-head{font-size:.78rem;font-weight:600;color:var(--md-sys-color-on-surface-variant)}.pdx-lookup-dialog-row{display:block;width:100%;text-align:left;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);padding:12px 14px;cursor:pointer}.pdx-lookup-dialog-row.is-selected{border-color:var(--md-sys-color-primary);box-shadow:inset 0 0 0 1px var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 8%,var(--md-sys-color-surface))}.pdx-lookup-dialog-row.is-disabled{opacity:.65;cursor:not-allowed}.pdx-lookup-dialog-row-main,.pdx-lookup-dialog-row-heading,.pdx-lookup-dialog-row-meta{display:flex;flex-wrap:wrap;gap:8px}.pdx-lookup-dialog-row-main{flex-direction:column;gap:8px}.pdx-lookup-dialog-row-heading strong{font-size:.98rem;line-height:1.3}.pdx-lookup-dialog-row-heading small{border-radius:6px;padding:2px 6px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.74rem;line-height:1.2}.pdx-lookup-dialog-results.is-card-layout .pdx-lookup-dialog-row-main{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:12px}.pdx-lookup-dialog-results.is-compact-layout .pdx-lookup-dialog-row{padding:8px 10px}.pdx-lookup-dialog-results.is-compact-layout .pdx-lookup-dialog-row-heading,.pdx-lookup-dialog-results.is-compact-layout .pdx-lookup-dialog-row-meta{gap:6px}.pdx-lookup-dialog-results.is-compact-layout .pdx-lookup-dialog-row-description{font-size:.85rem}.pdx-lookup-dialog-row-description{color:var(--md-sys-color-on-surface-variant);line-height:1.35}.pdx-lookup-dialog-row-meta{align-items:center}.pdx-lookup-dialog-row-note,.pdx-lookup-option-note{display:inline-flex;align-items:center;min-height:24px;padding:4px 8px;border-radius:8px;font-size:.76rem;line-height:1.3}.pdx-lookup-dialog-row-note.is-warning,.pdx-lookup-option-note.is-warning{background:#fffbeb;color:#92400e}.pdx-lookup-dialog-row-note.is-danger,.pdx-lookup-option-note.is-danger{background:#fef2f2;color:#991b1b}.pdx-lookup-dialog-state,.pdx-lookup-dialog-footer-row{display:flex;align-items:center;gap:10px;justify-content:center;padding:16px 0 4px}.pdx-lookup-dialog-runtime-host{display:none}.pdx-lookup-dialog-preview{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-lowest);padding:14px;display:flex;flex-direction:column;gap:10px;position:sticky;top:0}.pdx-lookup-dialog-preview-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.pdx-lookup-dialog-preview-heading{display:flex;flex-direction:column;gap:4px}.pdx-lookup-dialog-preview-heading small,.pdx-lookup-dialog-preview-description,.pdx-lookup-dialog-preview-grid dt{color:var(--md-sys-color-on-surface-variant)}.pdx-lookup-dialog-preview-badges{display:flex;flex-wrap:wrap;gap:8px}.pdx-lookup-dialog-preview-note{display:grid;gap:2px;padding:8px 10px;border-radius:8px;border:1px solid transparent;font-size:.78rem;line-height:1.35}.pdx-lookup-dialog-preview-note strong{font-size:.72rem;line-height:1.2;text-transform:uppercase;letter-spacing:.02em}.pdx-lookup-dialog-preview-note.is-warning{background:#fffbeb;border-color:#fde68a;color:#92400e}.pdx-lookup-dialog-preview-note.is-danger{background:#fef2f2;border-color:#fecaca;color:#991b1b}.pdx-lookup-dialog-preview-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0}.pdx-lookup-dialog-preview-grid div{min-width:0}.pdx-lookup-dialog-preview-grid dt{font-size:.78rem;margin-bottom:2px}.pdx-lookup-dialog-preview-grid dd{margin:0;overflow-wrap:anywhere}.pdx-lookup-dialog-preview-actions{display:flex;flex-wrap:wrap;gap:8px}@media(max-width:960px){.pdx-lookup-dialog-toolbar{grid-template-columns:minmax(0,1fr)}.pdx-lookup-dialog-search,.pdx-lookup-dialog-sort{width:100%}.pdx-lookup-dialog-sort{min-height:0;grid-template-columns:minmax(0,1fr)}.pdx-lookup-dialog-sort select{width:100%;min-width:0}.pdx-lookup-dialog-content-grid.has-preview{grid-template-columns:minmax(0,1fr)}.pdx-lookup-dialog-preview{position:static}}@media(max-width:640px){.pdx-lookup-dialog-state.is-error{grid-template-columns:auto minmax(0,1fr)}.pdx-lookup-dialog-state.is-error>button{grid-column:1 / -1;width:100%}.pdx-lookup-dialog-intro{margin-bottom:10px}.pdx-lookup-dialog-results{max-height:none;padding-right:0}.pdx-lookup-dialog-row{padding:10px 12px}.pdx-lookup-dialog-results.is-card-layout .pdx-lookup-dialog-row-main{grid-template-columns:minmax(0,1fr)}.pdx-lookup-dialog-preview{padding:12px}.pdx-lookup-dialog-preview-grid{grid-template-columns:minmax(0,1fr)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1$4.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$4.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$4.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: InlineEntityLookupComponent, selector: "pdx-inline-entity-lookup", inputs: ["initialMetadata"] }, { kind: "component", type: SelectPanelActionsComponent, selector: "pdx-select-panel-actions", inputs: ["ariaLabel", "showClear", "clearLabel", "clearIcon", "clearIconColor", "showLoadMore", "loadMoreLabel", "loadingLabel", "loading", "showEndReached", "endReachedLabel", "disabled"], outputs: ["clear", "loadMore"] }] });
18888
+ `, isInline: true, styles: [".pdx-lookup-dialog-titlebar{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-right:12px}.pdx-lookup-dialog-titlebar h2{min-width:0;margin:0;overflow-wrap:anywhere}.pdx-lookup-dialog-state.is-error{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:12px;min-height:112px;padding:18px;border:1px solid color-mix(in srgb,var(--md-sys-color-error) 32%,transparent);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-error) 7%,var(--md-sys-color-surface));color:var(--md-sys-color-on-surface)}.pdx-lookup-dialog-state.is-error>mat-icon{color:var(--md-sys-color-error)}.pdx-lookup-dialog-state-copy{display:grid;gap:4px;min-width:0}.pdx-lookup-dialog-state-copy>span{color:var(--md-sys-color-on-surface-variant);line-height:1.4}.pdx-lookup-dialog-toolbar{display:grid;grid-template-columns:repeat(2,minmax(220px,1fr));gap:12px;align-items:start}.pdx-lookup-dialog-intro{display:grid;gap:4px;margin:0 0 12px}.pdx-lookup-dialog-intro strong{color:var(--md-sys-color-on-surface);font-size:.96rem;line-height:1.3}.pdx-lookup-dialog-intro span{color:var(--md-sys-color-on-surface-variant);font-size:.82rem;line-height:1.35}.pdx-lookup-dialog-search{grid-column:1 / -1;width:100%}.pdx-lookup-dialog-sort{display:grid;grid-template-columns:minmax(96px,auto) minmax(0,1fr);align-items:center;gap:10px;min-height:56px;color:var(--md-sys-color-on-surface-variant);font-size:.85rem}.pdx-lookup-dialog-sort select{width:100%;min-width:0;min-height:40px;border:1px solid var(--md-sys-color-outline-variant);border-radius:6px;background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);padding:0 10px}.pdx-lookup-dialog-filter-panel{display:flex;flex-direction:column;gap:12px;padding:12px;margin:8px 0 12px;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-lowest)}.pdx-lookup-dialog-filter-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px}.pdx-lookup-dialog-filter-field{display:flex;flex-direction:column;gap:6px;color:var(--md-sys-color-on-surface);font-size:.9rem}.pdx-lookup-dialog-filter-field input,.pdx-lookup-dialog-filter-field select{min-height:40px;border:1px solid var(--md-sys-color-outline-variant);border-radius:6px;background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);padding:0 10px}.pdx-lookup-dialog-filter-field select.is-multiple{min-height:96px;padding:8px 10px}.pdx-lookup-dialog-filter-range{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:8px}.pdx-lookup-dialog-filter-field small{color:var(--md-sys-color-on-surface-variant)}.pdx-lookup-dialog-filter-actions{display:flex;justify-content:flex-end;gap:8px}.pdx-lookup-dialog-summary{margin:8px 0 12px;display:flex;flex-wrap:wrap;gap:8px;color:var(--md-sys-color-on-surface-variant);font-size:.85rem}.pdx-lookup-dialog-summary-warning{color:var(--md-sys-color-error)}.pdx-lookup-dialog-content-grid{display:block}.pdx-lookup-dialog-content-grid.has-preview{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:16px;align-items:start}.pdx-lookup-dialog-results{display:flex;flex-direction:column;gap:10px;max-height:52vh;overflow:auto;padding-right:4px}.pdx-lookup-dialog-results.is-card-layout{gap:12px}.pdx-lookup-dialog-results.is-compact-layout{gap:6px}.pdx-lookup-dialog-table{display:flex;flex-direction:column;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;overflow:hidden}.pdx-lookup-dialog-table-head,.pdx-lookup-dialog-table-row{display:flex;align-items:stretch}.pdx-lookup-dialog-table-head{background:var(--md-sys-color-surface-container-low);border-bottom:1px solid var(--md-sys-color-outline-variant)}.pdx-lookup-dialog-table-row{width:100%;text-align:left;border:0;border-bottom:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);cursor:pointer}.pdx-lookup-dialog-table-row:last-child{border-bottom:0}.pdx-lookup-dialog-table-row.is-selected{background:color-mix(in srgb,var(--md-sys-color-primary) 8%,var(--md-sys-color-surface))}.pdx-lookup-dialog-table-row.is-disabled{opacity:.65;cursor:not-allowed}.pdx-lookup-dialog-table-row.is-blocked,.pdx-lookup-dialog-row.is-blocked{background:color-mix(in srgb,var(--md-sys-color-error) 4%,var(--md-sys-color-surface))}.pdx-lookup-dialog-table-row.is-legacy,.pdx-lookup-dialog-row.is-legacy{background:color-mix(in srgb,var(--md-sys-color-tertiary) 8%,var(--md-sys-color-surface))}.pdx-lookup-dialog-table-cell{min-width:0;padding:10px 12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pdx-lookup-dialog-table-cell.is-head{font-size:.78rem;font-weight:600;color:var(--md-sys-color-on-surface-variant)}.pdx-lookup-dialog-row{display:block;width:100%;text-align:left;border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface);color:var(--md-sys-color-on-surface);padding:12px 14px;cursor:pointer}.pdx-lookup-dialog-row.is-selected{border-color:var(--md-sys-color-primary);box-shadow:inset 0 0 0 1px var(--md-sys-color-primary);background:color-mix(in srgb,var(--md-sys-color-primary) 8%,var(--md-sys-color-surface))}.pdx-lookup-dialog-row.is-disabled{opacity:.65;cursor:not-allowed}.pdx-lookup-dialog-row-main,.pdx-lookup-dialog-row-heading,.pdx-lookup-dialog-row-meta{display:flex;flex-wrap:wrap;gap:8px}.pdx-lookup-dialog-row-main{flex-direction:column;gap:8px}.pdx-lookup-dialog-row-heading strong{font-size:.98rem;line-height:1.3}.pdx-lookup-dialog-row-heading small{border-radius:6px;padding:2px 6px;background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface-variant);font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.74rem;line-height:1.2}.pdx-lookup-dialog-results.is-card-layout .pdx-lookup-dialog-row-main{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:start;gap:12px}.pdx-lookup-dialog-results.is-compact-layout .pdx-lookup-dialog-row{padding:8px 10px}.pdx-lookup-dialog-results.is-compact-layout .pdx-lookup-dialog-row-heading,.pdx-lookup-dialog-results.is-compact-layout .pdx-lookup-dialog-row-meta{gap:6px}.pdx-lookup-dialog-results.is-compact-layout .pdx-lookup-dialog-row-description{font-size:.85rem}.pdx-lookup-dialog-row-description{color:var(--md-sys-color-on-surface-variant);line-height:1.35}.pdx-lookup-dialog-row-meta{align-items:center}.pdx-lookup-dialog-row-note,.pdx-lookup-option-note{display:inline-flex;align-items:center;min-height:24px;padding:4px 8px;border-radius:8px;font-size:.76rem;line-height:1.3}.pdx-lookup-dialog-row-note.is-warning,.pdx-lookup-option-note.is-warning{background:#fffbeb;color:#92400e}.pdx-lookup-dialog-row-note.is-danger,.pdx-lookup-option-note.is-danger{background:#fef2f2;color:#991b1b}.pdx-lookup-dialog-state,.pdx-lookup-dialog-footer-row{display:flex;align-items:center;gap:10px;justify-content:center;padding:16px 0 4px}.pdx-lookup-dialog-runtime-host{display:none}.pdx-lookup-dialog-preview{border:1px solid var(--md-sys-color-outline-variant);border-radius:8px;background:var(--md-sys-color-surface-container-lowest);padding:14px;display:flex;flex-direction:column;gap:10px;position:sticky;top:0}.pdx-lookup-dialog-preview-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.pdx-lookup-dialog-preview-heading{display:flex;flex-direction:column;gap:4px}.pdx-lookup-dialog-preview-heading small,.pdx-lookup-dialog-preview-description,.pdx-lookup-dialog-preview-grid dt{color:var(--md-sys-color-on-surface-variant)}.pdx-lookup-dialog-preview-badges{display:flex;flex-wrap:wrap;gap:8px}.pdx-lookup-dialog-preview-note{display:grid;gap:2px;padding:8px 10px;border-radius:8px;border:1px solid transparent;font-size:.78rem;line-height:1.35}.pdx-lookup-dialog-preview-note strong{font-size:.72rem;line-height:1.2;text-transform:uppercase;letter-spacing:.02em}.pdx-lookup-dialog-preview-note.is-warning{background:#fffbeb;border-color:#fde68a;color:#92400e}.pdx-lookup-dialog-preview-note.is-danger{background:#fef2f2;border-color:#fecaca;color:#991b1b}.pdx-lookup-dialog-preview-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0}.pdx-lookup-dialog-preview-grid div{min-width:0}.pdx-lookup-dialog-preview-grid dt{font-size:.78rem;margin-bottom:2px}.pdx-lookup-dialog-preview-grid dd{margin:0;overflow-wrap:anywhere}.pdx-lookup-dialog-preview-actions{display:flex;flex-wrap:wrap;gap:8px}@media(max-width:960px){.pdx-lookup-dialog-toolbar{grid-template-columns:minmax(0,1fr)}.pdx-lookup-dialog-search,.pdx-lookup-dialog-sort{width:100%}.pdx-lookup-dialog-sort{min-height:0;grid-template-columns:minmax(0,1fr)}.pdx-lookup-dialog-sort select{width:100%;min-width:0}.pdx-lookup-dialog-content-grid.has-preview{grid-template-columns:minmax(0,1fr)}.pdx-lookup-dialog-preview{position:static}}@media(max-width:640px){.pdx-lookup-dialog-state.is-error{grid-template-columns:auto minmax(0,1fr)}.pdx-lookup-dialog-state.is-error>button{grid-column:1 / -1;width:100%}.pdx-lookup-dialog-intro{margin-bottom:10px}.pdx-lookup-dialog-results{max-height:none;padding-right:0}.pdx-lookup-dialog-row{padding:10px 12px}.pdx-lookup-dialog-results.is-card-layout .pdx-lookup-dialog-row-main{grid-template-columns:minmax(0,1fr)}.pdx-lookup-dialog-preview{padding:12px}.pdx-lookup-dialog-preview-grid{grid-template-columns:minmax(0,1fr)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1$4.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$4.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$4.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i1$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2$1.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i2$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: InlineEntityLookupComponent, selector: "pdx-inline-entity-lookup", inputs: ["initialMetadata"] }, { kind: "component", type: SelectPanelActionsComponent, selector: "pdx-select-panel-actions", inputs: ["ariaLabel", "showClear", "clearLabel", "clearIcon", "clearIconColor", "showLoadMore", "loadMoreLabel", "loadingLabel", "loading", "showEndReached", "endReachedLabel", "disabled"], outputs: ["clear", "loadMore"] }] });
18814
18889
  }
18815
18890
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: EntityLookupDialogComponent, decorators: [{
18816
18891
  type: Component,
@@ -18860,6 +18935,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
18860
18935
  [attr.aria-label]="dialogSearchAriaLabel()"
18861
18936
  data-testid="entity-lookup-dialog-search-input"
18862
18937
  />
18938
+ @if (lookup().lookupSearchFeedback()) {
18939
+ <mat-hint><span role="status">{{ lookup().lookupSearchFeedback() }}</span></mat-hint>
18940
+ }
18863
18941
  </mat-form-field>
18864
18942
 
18865
18943
  @if (showSortControl()) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisui/dynamic-fields",
3
- "version": "9.0.5-rc.10",
3
+ "version": "9.0.5-rc.12",
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.10",
15
- "@praxisui/cron-builder": "^9.0.5-rc.10"
14
+ "@praxisui/core": "^9.0.5-rc.12",
15
+ "@praxisui/cron-builder": "^9.0.5-rc.12"
16
16
  },
17
17
  "dependencies": {
18
18
  "libphonenumber-js": "^1.12.41",
@@ -2857,6 +2857,7 @@ declare class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
2857
2857
  readonly activeLookupFilters: _angular_core.WritableSignal<LookupFilterRequest[]>;
2858
2858
  readonly selectedLookupSortKey: _angular_core.WritableSignal<string | null>;
2859
2859
  readonly selectedLookupSearchStrategyKey: _angular_core.WritableSignal<string | null>;
2860
+ readonly lookupSearchFeedback: _angular_core.WritableSignal<string | null>;
2860
2861
  protected readonly remoteTotalElements: _angular_core.WritableSignal<number | null>;
2861
2862
  private readonly queryTerm;
2862
2863
  private readonly store;
@@ -2937,6 +2938,7 @@ declare class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
2937
2938
  private attachAutocompleteScrollListener;
2938
2939
  private detachAutocompleteScrollListener;
2939
2940
  private runQuery;
2941
+ private resolveGovernedLookupSearch;
2940
2942
  loadMore(): void;
2941
2943
  showLoadMore(): boolean;
2942
2944
  shouldRenderOpenSentinel(): boolean;