@acorex/components 22.1.0-next.2 → 22.1.0-next.21

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.
Files changed (60) hide show
  1. package/fesm2022/acorex-components-accordion.mjs +2 -2
  2. package/fesm2022/acorex-components-accordion.mjs.map +1 -1
  3. package/fesm2022/acorex-components-button.mjs +2 -2
  4. package/fesm2022/acorex-components-button.mjs.map +1 -1
  5. package/fesm2022/acorex-components-check-box.mjs +2 -2
  6. package/fesm2022/acorex-components-check-box.mjs.map +1 -1
  7. package/fesm2022/acorex-components-combo-box.mjs +114 -20
  8. package/fesm2022/acorex-components-combo-box.mjs.map +1 -1
  9. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-BuNEjswI.mjs → acorex-components-conversation-open-composer-picker-for-files-DnSW908R.mjs} +6 -19
  10. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-DnSW908R.mjs.map +1 -0
  11. package/fesm2022/acorex-components-conversation.mjs +7299 -9510
  12. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  13. package/fesm2022/acorex-components-data-table.mjs +33 -18
  14. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  15. package/fesm2022/acorex-components-dropdown.mjs +2 -2
  16. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  17. package/fesm2022/acorex-components-form.mjs +21 -5
  18. package/fesm2022/acorex-components-form.mjs.map +1 -1
  19. package/fesm2022/acorex-components-label.mjs +2 -2
  20. package/fesm2022/acorex-components-label.mjs.map +1 -1
  21. package/fesm2022/acorex-components-list.mjs +2 -2
  22. package/fesm2022/acorex-components-list.mjs.map +1 -1
  23. package/fesm2022/acorex-components-loading-dialog.mjs +59 -42
  24. package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
  25. package/fesm2022/acorex-components-lookup.mjs +765 -98
  26. package/fesm2022/acorex-components-lookup.mjs.map +1 -1
  27. package/fesm2022/acorex-components-notification.mjs +4 -6
  28. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  29. package/fesm2022/acorex-components-password-box.mjs +2 -2
  30. package/fesm2022/acorex-components-password-box.mjs.map +1 -1
  31. package/fesm2022/acorex-components-popover.mjs +22 -0
  32. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  33. package/fesm2022/acorex-components-radio.mjs +2 -2
  34. package/fesm2022/acorex-components-radio.mjs.map +1 -1
  35. package/fesm2022/acorex-components-range-slider.mjs +2 -2
  36. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  37. package/fesm2022/acorex-components-select-box.mjs +38 -11
  38. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  39. package/fesm2022/acorex-components-selection-list.mjs +2 -2
  40. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  41. package/fesm2022/acorex-components-switch.mjs +2 -2
  42. package/fesm2022/acorex-components-switch.mjs.map +1 -1
  43. package/fesm2022/acorex-components-tabs.mjs +2 -2
  44. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  45. package/fesm2022/acorex-components-tag-box.mjs +2 -2
  46. package/fesm2022/acorex-components-tag-box.mjs.map +1 -1
  47. package/lookup/README.md +29 -7
  48. package/package.json +4 -7
  49. package/types/acorex-components-combo-box.d.ts +38 -8
  50. package/types/acorex-components-conversation.d.ts +543 -1019
  51. package/types/acorex-components-data-table.d.ts +3 -2
  52. package/types/acorex-components-loading-dialog.d.ts +12 -4
  53. package/types/acorex-components-lookup.d.ts +181 -21
  54. package/types/acorex-components-popover.d.ts +6 -0
  55. package/types/acorex-components-select-box.d.ts +11 -0
  56. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-BuNEjswI.mjs.map +0 -1
  57. package/fesm2022/acorex-components-selection-list-2.mjs +0 -168
  58. package/fesm2022/acorex-components-selection-list-2.mjs.map +0 -1
  59. package/selection-list-2/README.md +0 -3
  60. package/types/acorex-components-selection-list-2.d.ts +0 -52
@@ -1,15 +1,16 @@
1
- import { AXListDataSource, AXDataSource, NXComponent, convertArrayToDataSource, AXComponent, AXClearableComponent, AXClosableComponent } from '@acorex/cdk/common';
1
+ import { AXDataSource, AXListDataSource, NXValueComponent, convertArrayToDataSource, AXComponent, AXClearableComponent, AXClosableComponent, AXValuableComponent } from '@acorex/cdk/common';
2
2
  import { AXChipsComponent } from '@acorex/components/chips';
3
3
  import * as i1$1 from '@acorex/components/decorators';
4
4
  import { AXDecoratorModule } from '@acorex/components/decorators';
5
5
  import { AXPopoverComponent } from '@acorex/components/popover';
6
+ import { AXSearchBoxComponent } from '@acorex/components/search-box';
6
7
  import { AXPlatform } from '@acorex/core/platform';
7
8
  import { AXTranslatorPipe } from '@acorex/core/translation';
8
9
  import { NgTemplateOutlet, AsyncPipe } from '@angular/common';
9
10
  import * as i0 from '@angular/core';
10
- import { input, output, signal, computed, viewChild, viewChildren, inject, NgZone, effect, untracked, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, DestroyRef, model, linkedSignal, NgModule } from '@angular/core';
11
+ import { input, output, signal, computed, viewChild, viewChildren, inject, NgZone, effect, untracked, afterRenderEffect, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, DestroyRef, model, linkedSignal, NgModule } from '@angular/core';
11
12
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
12
- import * as i3 from '@acorex/cdk/list-navigation';
13
+ import * as i2 from '@acorex/cdk/list-navigation';
13
14
  import { AXListNavigationDirective, AXListNavigationItemDirective, AXListNavigationModule } from '@acorex/cdk/list-navigation';
14
15
  import * as i1 from '@angular/cdk/scrolling';
15
16
  import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';
@@ -17,6 +18,108 @@ import { AXTreeViewComponent } from '@acorex/components/tree-view';
17
18
  import { AXDataTableComponent, AXDataTableTextColumnComponent } from '@acorex/components/data-table';
18
19
  import { fromEvent, auditTime } from 'rxjs';
19
20
 
21
+ /**
22
+ * Converts a drop-down-tree datasource (nested array or lazy callback) into an
23
+ * `AXDataSource` that a multi-column data table can load and expand.
24
+ */
25
+ function createLookupTreeTableDataSource(source, options) {
26
+ const isCallback = typeof source === 'function';
27
+ return new AXDataSource({
28
+ pageSize: 8,
29
+ key: options.valueField,
30
+ load: (query) => loadTreeTableRows(source, options, query, isCallback),
31
+ byKey: (key) => findTreeTableItem(source, options.valueField, key),
32
+ });
33
+ }
34
+ async function loadTreeTableRows(source, options, query, isCallback) {
35
+ const parentFilter = query.filter?.field === options.parentField ? query.filter : undefined;
36
+ const textFilter = query.filter && query.filter.field !== options.parentField ? query.filter : undefined;
37
+ if (parentFilter) {
38
+ const children = await loadChildren(source, options, parentFilter.value, isCallback);
39
+ return { items: children, total: children.length };
40
+ }
41
+ const roots = mapTreeNodes(await loadRoots(source, isCallback), options);
42
+ const items = textFilter ? filterTreeNodes(roots, options.textField, String(textFilter.value ?? '')) : roots;
43
+ return { items, total: items.length };
44
+ }
45
+ async function loadRoots(source, isCallback) {
46
+ if (!isCallback) {
47
+ return source ?? [];
48
+ }
49
+ return (await source()) ?? [];
50
+ }
51
+ async function loadChildren(source, options, parentId, isCallback) {
52
+ if (isCallback) {
53
+ const nodes = (await source(String(parentId))) ?? [];
54
+ return mapTreeNodes(nodes, options);
55
+ }
56
+ const parent = findTreeNode(source, options.valueField, parentId);
57
+ const children = Array.isArray(parent?.['children']) ? parent['children'] : [];
58
+ return mapTreeNodes(children, options);
59
+ }
60
+ function mapTreeNodes(nodes, options) {
61
+ return nodes.map((node) => mapTreeNode(node, options));
62
+ }
63
+ function mapTreeNode(node, options) {
64
+ const rawChildren = node['children'];
65
+ const children = Array.isArray(rawChildren) ? mapTreeNodes(rawChildren, options) : undefined;
66
+ const childrenCount = node['childrenCount'];
67
+ const hasChildren = (children?.length ?? 0) > 0 ||
68
+ (typeof childrenCount === 'number' && childrenCount > 0) ||
69
+ node['hasChild'] === true ||
70
+ node['hasChildren'] === true;
71
+ return {
72
+ ...node,
73
+ [options.hasChildrenField]: hasChildren,
74
+ ...(children && children.length > 0 ? { children } : {}),
75
+ };
76
+ }
77
+ function filterTreeNodes(nodes, textField, query) {
78
+ const needle = query.trim().toLowerCase();
79
+ if (!needle) {
80
+ return nodes;
81
+ }
82
+ const result = [];
83
+ for (const node of nodes) {
84
+ const rawChildren = node['children'];
85
+ const children = Array.isArray(rawChildren) ? filterTreeNodes(rawChildren, textField, needle) : undefined;
86
+ const selfMatch = String(node[textField] ?? '')
87
+ .toLowerCase()
88
+ .includes(needle);
89
+ if (selfMatch) {
90
+ result.push(node);
91
+ }
92
+ else if (children && children.length > 0) {
93
+ result.push({
94
+ ...node,
95
+ children,
96
+ });
97
+ }
98
+ }
99
+ return result;
100
+ }
101
+ function findTreeTableItem(source, valueField, key) {
102
+ if (typeof source === 'function' || !Array.isArray(source)) {
103
+ return undefined;
104
+ }
105
+ return findTreeNode(source, valueField, key) ?? undefined;
106
+ }
107
+ function findTreeNode(nodes, valueField, key) {
108
+ for (const node of nodes) {
109
+ if (String(node[valueField]) === String(key)) {
110
+ return node;
111
+ }
112
+ const children = node['children'];
113
+ if (Array.isArray(children)) {
114
+ const found = findTreeNode(children, valueField, key);
115
+ if (found) {
116
+ return found;
117
+ }
118
+ }
119
+ }
120
+ return null;
121
+ }
122
+
20
123
  /**
21
124
  * Shared `AXDataSource` + CDK virtual scroll plumbing for the list-based lookup views
22
125
  * (`ax-lookup-drop-down-list`, `ax-lookup-multi-select`).
@@ -95,8 +198,15 @@ class AXLookupListViewBase {
95
198
  ...(ngDevMode ? [{ debugName: "totalCount" }] : /* istanbul ignore next */ []));
96
199
  this.isLoading = signal(true, /* @ts-ignore */
97
200
  ...(ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []));
201
+ this.loadingPlaceholderIndexes = [0, 1, 2];
98
202
  this.isEmpty = computed(() => this.totalCount() === 0 && !this.isLoading(), /* @ts-ignore */
99
203
  ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
204
+ /**
205
+ * Overlay popovers often measure as 0px on first open, so CDK virtual scroll
206
+ * renders no rows. Paint these placeholders outside the viewport until data arrives.
207
+ */
208
+ this.showLoadingPlaceholder = computed(() => this.isLoading() && this.totalCount() === 0, /* @ts-ignore */
209
+ ...(ngDevMode ? [{ debugName: "showLoadingPlaceholder" }] : /* istanbul ignore next */ []));
100
210
  /** Viewport height so the popup grows with the items up to `maxVisibleItems`. */
101
211
  this.viewportHeight = computed(() => {
102
212
  const count = this.totalCount() || (this.isLoading() ? 3 : 1);
@@ -130,18 +240,49 @@ class AXLookupListViewBase {
130
240
  effect((onCleanup) => {
131
241
  const source = this.dataSource();
132
242
  const list = new AXListDataSource({ source });
243
+ const hasRows = source.cachedItems.some((item) => item != null);
133
244
  untracked(() => {
134
245
  this.totalCount.set(source.totalCount);
135
- this.isLoading.set(source.totalCount > 0 ? source.isLoading : true);
246
+ this.isLoading.set(hasRows ? source.isLoading : true);
136
247
  this.listDataSource.set(list);
137
248
  });
138
249
  const loadingSub = source.onLoadingChanged.subscribe((value) => this.isLoading.set(value));
139
- const changedSub = source.onChanged.subscribe((e) => this.totalCount.set(e.totalCount));
250
+ const changedSub = source.onChanged.subscribe((e) => {
251
+ const loaded = e.cachedItems.filter((item) => item != null).length;
252
+ this.totalCount.set(Math.max(e.totalCount || 0, loaded, e.items?.length ?? 0));
253
+ this.isLoading.set(false);
254
+ this.#checkViewportSize();
255
+ });
256
+ // Overlay first-open often emits viewChange { start: 0, end: 0 }, which never
257
+ // pages. Kick page 0 when the source is cold; reuse real rows on remount.
258
+ queueMicrotask(() => {
259
+ if (source.cachedItems.some((item) => item != null)) {
260
+ const loaded = source.cachedItems.filter((item) => item != null).length;
261
+ this.totalCount.set(Math.max(source.totalCount || 0, loaded));
262
+ this.isLoading.set(false);
263
+ this.#checkViewportSize();
264
+ return;
265
+ }
266
+ source.setPage(0);
267
+ });
140
268
  onCleanup(() => {
141
269
  loadingSub.unsubscribe();
142
270
  changedSub.unsubscribe();
143
271
  });
144
272
  });
273
+ afterRenderEffect(() => {
274
+ this.viewportRef();
275
+ this.totalCount();
276
+ this.isLoading();
277
+ this.#checkViewportSize();
278
+ });
279
+ }
280
+ #checkViewportSize() {
281
+ const viewport = this.viewportRef();
282
+ if (!viewport) {
283
+ return;
284
+ }
285
+ this.#ngZone.run(() => viewport.checkViewportSize());
145
286
  }
146
287
  /** Moves keyboard focus to the first rendered list option. */
147
288
  focusFirst() {
@@ -166,6 +307,15 @@ class AXLookupListViewBase {
166
307
  }
167
308
  this.itemClick.emit({ item, value: this.getValue(item) });
168
309
  }
310
+ /**
311
+ * Commit on mousedown (not click) so a searchable trigger blur cannot destroy the
312
+ * list before the pick is applied.
313
+ */
314
+ handleItemMouseDown(event, item) {
315
+ event.preventDefault();
316
+ event.stopPropagation();
317
+ this.handleItemClick(item);
318
+ }
169
319
  handleItemKeypress(e, item) {
170
320
  if (e.nativeEvent.key === 'Enter' || e.nativeEvent.code === 'Space') {
171
321
  e.nativeEvent.stopPropagation();
@@ -232,7 +382,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
232
382
  class AXLookupDropDownListComponent extends AXLookupListViewBase {
233
383
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupDropDownListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
234
384
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXLookupDropDownListComponent, isStandalone: true, selector: "ax-lookup-drop-down-list", providers: [{ provide: AXLookupListViewBase, useExisting: AXLookupDropDownListComponent }], usesInheritance: true, ngImport: i0, template: `
235
- @if (isEmpty()) {
385
+ @if (showLoadingPlaceholder()) {
386
+ <div class="ax-lookup-viewport" role="listbox">
387
+ @for (index of loadingPlaceholderIndexes; track index) {
388
+ <div class="ax-lookup-option-host ax-lookup-option" [style.height.px]="itemHeight()">
389
+ <ng-container [ngTemplateOutlet]="loadingRow" />
390
+ </div>
391
+ }
392
+ </div>
393
+ } @else if (isEmpty()) {
236
394
  @if (emptyTemplate()) {
237
395
  <ng-container [ngTemplateOutlet]="emptyTemplate()!" />
238
396
  } @else {
@@ -253,18 +411,17 @@ class AXLookupDropDownListComponent extends AXLookupListViewBase {
253
411
  <div
254
412
  *cdkVirtualFor="let item of listDataSource(); let i = index; trackBy: trackByIndex"
255
413
  role="option"
256
- class="ax-lookup-option-host"
414
+ class="ax-lookup-option-host ax-lookup-option"
257
415
  axListNavigationItem
258
416
  #navItem="axListNavigationItem"
259
417
  [style.height.px]="itemHeight()"
260
- [class.ax-lookup-option]="!itemTemplate()"
261
418
  [class.ax-state-alternate]="alternate() && i % 2 === 1"
262
419
  [class.ax-state-selected]="item != null && isSelected(item)"
263
420
  [class.ax-state-disabled]="item != null && isDisabled(item)"
264
421
  [class.ax-state-active]="navItem.isActive()"
265
422
  [attr.aria-selected]="item != null ? isSelected(item) : null"
266
423
  (mouseenter)="activateNavItem(nav, navItem)"
267
- (click)="handleItemClick(item)"
424
+ (mousedown)="handleItemMouseDown($event, item)"
268
425
  (onKeypress)="handleItemKeypress($event, item)"
269
426
  >
270
427
  @if (item != null) {
@@ -272,9 +429,10 @@ class AXLookupDropDownListComponent extends AXLookupListViewBase {
272
429
  <ng-container [ngTemplateOutlet]="itemTemplate()!" [ngTemplateOutletContext]="{ $implicit: item }" />
273
430
  } @else {
274
431
  <span class="ax-lookup-option-text">{{ getText(item) }}</span>
275
- @if (isSelected(item)) {
276
- <ax-icon class="ax-lookup-option-check ax-icon ax-icon-check" aria-hidden="true"></ax-icon>
277
- }
432
+ }
433
+ <!-- Keep check outside itemTemplate so custom rows (platform widgets) still show selection. -->
434
+ @if (isSelected(item)) {
435
+ <span class="ax-lookup-option-check ax-icon ax-icon-check text-primary" aria-hidden="true"></span>
278
436
  }
279
437
  } @else {
280
438
  <ng-container [ngTemplateOutlet]="loadingRow" />
@@ -290,7 +448,7 @@ class AXLookupDropDownListComponent extends AXLookupListViewBase {
290
448
  <span class="ax-lookup-option-loading">{{ '@acorex:common.status.loading' | translate | async }}</span>
291
449
  }
292
450
  </ng-template>
293
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i3.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i3.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
451
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i2.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i2.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
294
452
  }
295
453
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupDropDownListComponent, decorators: [{
296
454
  type: Component,
@@ -298,17 +456,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
298
456
  selector: 'ax-lookup-drop-down-list',
299
457
  changeDetection: ChangeDetectionStrategy.OnPush,
300
458
  encapsulation: ViewEncapsulation.None,
301
- imports: [
302
- ScrollingModule,
303
- NgTemplateOutlet,
304
- AXTranslatorPipe,
305
- AsyncPipe,
306
- AXDecoratorModule,
307
- AXListNavigationModule,
308
- ],
459
+ imports: [ScrollingModule, NgTemplateOutlet, AXTranslatorPipe, AsyncPipe, AXListNavigationModule],
309
460
  providers: [{ provide: AXLookupListViewBase, useExisting: AXLookupDropDownListComponent }],
310
461
  template: `
311
- @if (isEmpty()) {
462
+ @if (showLoadingPlaceholder()) {
463
+ <div class="ax-lookup-viewport" role="listbox">
464
+ @for (index of loadingPlaceholderIndexes; track index) {
465
+ <div class="ax-lookup-option-host ax-lookup-option" [style.height.px]="itemHeight()">
466
+ <ng-container [ngTemplateOutlet]="loadingRow" />
467
+ </div>
468
+ }
469
+ </div>
470
+ } @else if (isEmpty()) {
312
471
  @if (emptyTemplate()) {
313
472
  <ng-container [ngTemplateOutlet]="emptyTemplate()!" />
314
473
  } @else {
@@ -329,18 +488,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
329
488
  <div
330
489
  *cdkVirtualFor="let item of listDataSource(); let i = index; trackBy: trackByIndex"
331
490
  role="option"
332
- class="ax-lookup-option-host"
491
+ class="ax-lookup-option-host ax-lookup-option"
333
492
  axListNavigationItem
334
493
  #navItem="axListNavigationItem"
335
494
  [style.height.px]="itemHeight()"
336
- [class.ax-lookup-option]="!itemTemplate()"
337
495
  [class.ax-state-alternate]="alternate() && i % 2 === 1"
338
496
  [class.ax-state-selected]="item != null && isSelected(item)"
339
497
  [class.ax-state-disabled]="item != null && isDisabled(item)"
340
498
  [class.ax-state-active]="navItem.isActive()"
341
499
  [attr.aria-selected]="item != null ? isSelected(item) : null"
342
500
  (mouseenter)="activateNavItem(nav, navItem)"
343
- (click)="handleItemClick(item)"
501
+ (mousedown)="handleItemMouseDown($event, item)"
344
502
  (onKeypress)="handleItemKeypress($event, item)"
345
503
  >
346
504
  @if (item != null) {
@@ -348,9 +506,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
348
506
  <ng-container [ngTemplateOutlet]="itemTemplate()!" [ngTemplateOutletContext]="{ $implicit: item }" />
349
507
  } @else {
350
508
  <span class="ax-lookup-option-text">{{ getText(item) }}</span>
351
- @if (isSelected(item)) {
352
- <ax-icon class="ax-lookup-option-check ax-icon ax-icon-check" aria-hidden="true"></ax-icon>
353
- }
509
+ }
510
+ <!-- Keep check outside itemTemplate so custom rows (platform widgets) still show selection. -->
511
+ @if (isSelected(item)) {
512
+ <span class="ax-lookup-option-check ax-icon ax-icon-check text-primary" aria-hidden="true"></span>
354
513
  }
355
514
  } @else {
356
515
  <ng-container [ngTemplateOutlet]="loadingRow" />
@@ -469,6 +628,280 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
469
628
  }]
470
629
  }], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], textField: [{ type: i0.Input, args: [{ isSignal: true, alias: "textField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], selectedValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedValues", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
471
630
 
631
+ /**
632
+ * Internal mini component for the `multi-column-tree` lookup mode:
633
+ * a multi-column `ax-data-table` with a drop-down tree inside it.
634
+ * Rows expand/collapse via the data-table hierarchy (`parentField` / nested `children`).
635
+ *
636
+ * @category Components
637
+ */
638
+ class AXLookupMultiColumnTreeComponent {
639
+ constructor() {
640
+ /**
641
+ * The datasource providing hierarchical rows (roots on load, children via `parentField`).
642
+ */
643
+ this.dataSource = input.required(/* @ts-ignore */
644
+ ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
645
+ /**
646
+ * The item property used as the selection value (also the data-table row key).
647
+ */
648
+ this.valueField = input('id', /* @ts-ignore */
649
+ ...(ngDevMode ? [{ debugName: "valueField" }] : /* istanbul ignore next */ []));
650
+ /**
651
+ * The item property used as the display text. The matching column shows the expand control
652
+ * unless another column sets `expandHandler`.
653
+ */
654
+ this.textField = input('text', /* @ts-ignore */
655
+ ...(ngDevMode ? [{ debugName: "textField" }] : /* istanbul ignore next */ []));
656
+ /**
657
+ * The item property marking an item as disabled.
658
+ */
659
+ this.disabledField = input('disabled', /* @ts-ignore */
660
+ ...(ngDevMode ? [{ debugName: "disabledField" }] : /* istanbul ignore next */ []));
661
+ /**
662
+ * Field used by the data table to fetch children (`AXDataSource` filter on expand).
663
+ */
664
+ this.parentField = input('parentId', /* @ts-ignore */
665
+ ...(ngDevMode ? [{ debugName: "parentField" }] : /* istanbul ignore next */ []));
666
+ /**
667
+ * Field used by the data table to decide whether a row can expand.
668
+ */
669
+ this.hasChildrenField = input('hasChild', /* @ts-ignore */
670
+ ...(ngDevMode ? [{ debugName: "hasChildrenField" }] : /* istanbul ignore next */ []));
671
+ /**
672
+ * Currently selected values (always an array, even for single selection).
673
+ */
674
+ this.selectedValues = input([], /* @ts-ignore */
675
+ ...(ngDevMode ? [{ debugName: "selectedValues" }] : /* istanbul ignore next */ []));
676
+ /**
677
+ * The fixed row height in pixels passed to the data table.
678
+ */
679
+ this.itemHeight = input(40, /* @ts-ignore */
680
+ ...(ngDevMode ? [{ debugName: "itemHeight" }] : /* istanbul ignore next */ []));
681
+ /**
682
+ * The maximum number of body rows visible before the table scrolls.
683
+ */
684
+ this.maxVisibleItems = input(8, /* @ts-ignore */
685
+ ...(ngDevMode ? [{ debugName: "maxVisibleItems" }] : /* istanbul ignore next */ []));
686
+ /**
687
+ * Column definitions rendered as `ax-text-column` instances.
688
+ */
689
+ this.columns = input([], /* @ts-ignore */
690
+ ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
691
+ /**
692
+ * Optional custom row content. Context: `$implicit` is the row item.
693
+ * When set, replaces the default multi-column cell layout.
694
+ */
695
+ this.itemTemplate = input(undefined, /* @ts-ignore */
696
+ ...(ngDevMode ? [{ debugName: "itemTemplate" }] : /* istanbul ignore next */ []));
697
+ /**
698
+ * Custom template rendered when the datasource has no items.
699
+ */
700
+ this.emptyTemplate = input(undefined, /* @ts-ignore */
701
+ ...(ngDevMode ? [{ debugName: "emptyTemplate" }] : /* istanbul ignore next */ []));
702
+ /**
703
+ * Custom template rendered while the table is loading.
704
+ */
705
+ this.loadingTemplate = input(undefined, /* @ts-ignore */
706
+ ...(ngDevMode ? [{ debugName: "loadingTemplate" }] : /* istanbul ignore next */ []));
707
+ /**
708
+ * When `true`, table rows use alternating background colors for easier scanning.
709
+ */
710
+ this.alternate = input(false, /* @ts-ignore */
711
+ ...(ngDevMode ? [{ debugName: "alternate" }] : /* istanbul ignore next */ []));
712
+ /**
713
+ * Emitted when the user picks a row (not when expanding/collapsing).
714
+ */
715
+ this.itemClick = output();
716
+ /**
717
+ * Header (~40px) + up to `maxVisibleItems` body rows. Expanded children scroll inside.
718
+ */
719
+ this.tableHeight = computed(() => 40 + this.maxVisibleItems() * this.itemHeight(), /* @ts-ignore */
720
+ ...(ngDevMode ? [{ debugName: "tableHeight" }] : /* istanbul ignore next */ []));
721
+ this.loadingConfig = computed(() => ({
722
+ enabled: true,
723
+ animation: true,
724
+ loadingTemplate: this.loadingTemplate(),
725
+ }), /* @ts-ignore */
726
+ ...(ngDevMode ? [{ debugName: "loadingConfig" }] : /* istanbul ignore next */ []));
727
+ this.resolveRowCssClass = (row) => {
728
+ const item = row;
729
+ if (!item) {
730
+ return '';
731
+ }
732
+ const classes = [];
733
+ if (this.isSelected(item)) {
734
+ classes.push('ax-state-selected');
735
+ }
736
+ if (this.isDisabled(item)) {
737
+ classes.push('ax-state-disabled');
738
+ }
739
+ return classes.join(' ');
740
+ };
741
+ }
742
+ /** Stable unique key for `@for` — avoids NG0955 when `field` is missing or duplicated. */
743
+ trackColumnKey(index, column) {
744
+ return `${column?.field ?? ''}::${index}`;
745
+ }
746
+ resolveColumnWidth(column) {
747
+ const width = column.width?.trim();
748
+ if (!width || width.includes('fr')) {
749
+ return 'auto';
750
+ }
751
+ return width;
752
+ }
753
+ isExpandColumn(index, column) {
754
+ if (column.expandHandler === true) {
755
+ return true;
756
+ }
757
+ if (this.columns().some((item) => item.expandHandler === true)) {
758
+ return false;
759
+ }
760
+ const textIndex = this.columns().findIndex((item) => item.field === this.textField());
761
+ return (textIndex === -1 ? 0 : textIndex) === index;
762
+ }
763
+ handleRowClick(event) {
764
+ this.handleItemClick(event.data);
765
+ }
766
+ handleItemClick(item) {
767
+ if (!item || this.isDisabled(item)) {
768
+ return;
769
+ }
770
+ this.itemClick.emit({ item, value: this.getValue(item) });
771
+ }
772
+ handleItemMouseDown(event, item) {
773
+ event.preventDefault();
774
+ event.stopPropagation();
775
+ this.handleItemClick(item);
776
+ }
777
+ isSelected(item) {
778
+ const value = this.getValue(item);
779
+ return this.selectedValues().some((v) => v == value);
780
+ }
781
+ isDisabled(item) {
782
+ return Boolean(item?.[this.disabledField()]);
783
+ }
784
+ getValue(item) {
785
+ return item?.[this.valueField()];
786
+ }
787
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupMultiColumnTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
788
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXLookupMultiColumnTreeComponent, isStandalone: true, selector: "ax-lookup-multi-column-tree", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: true, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, textField: { classPropertyName: "textField", publicName: "textField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, parentField: { classPropertyName: "parentField", publicName: "parentField", isSignal: true, isRequired: false, transformFunction: null }, hasChildrenField: { classPropertyName: "hasChildrenField", publicName: "hasChildrenField", isSignal: true, isRequired: false, transformFunction: null }, selectedValues: { classPropertyName: "selectedValues", publicName: "selectedValues", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, maxVisibleItems: { classPropertyName: "maxVisibleItems", publicName: "maxVisibleItems", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, emptyTemplate: { classPropertyName: "emptyTemplate", publicName: "emptyTemplate", isSignal: true, isRequired: false, transformFunction: null }, loadingTemplate: { classPropertyName: "loadingTemplate", publicName: "loadingTemplate", isSignal: true, isRequired: false, transformFunction: null }, alternate: { classPropertyName: "alternate", publicName: "alternate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemClick: "itemClick" }, host: { properties: { "style.height.px": "tableHeight()" }, classAttribute: "ax-lookup-multi-column ax-lookup-multi-column-tree" }, ngImport: i0, template: `
789
+ <ax-data-table
790
+ class="ax-lookup-multi-column-table"
791
+ look="minimal"
792
+ [dataSource]="dataSource()"
793
+ [parentField]="parentField()"
794
+ [hasChildrenField]="hasChildrenField()"
795
+ [itemHeight]="itemHeight()"
796
+ [alternative]="alternate()"
797
+ [emptyTemplate]="emptyTemplate()"
798
+ [loading]="loadingConfig()"
799
+ [paging]="false"
800
+ [showHeader]="true"
801
+ [fixedHeader]="true"
802
+ [showFooter]="false"
803
+ [allowReordering]="false"
804
+ [rowTemplate]="itemTemplate() ? customRowTemplate : undefined"
805
+ [rowCssClass]="resolveRowCssClass"
806
+ (onRowClick)="handleRowClick($event)"
807
+ >
808
+ @for (column of columns(); track trackColumnKey($index, column)) {
809
+ <ax-text-column
810
+ [dataField]="column.field"
811
+ [caption]="column.title"
812
+ [width]="resolveColumnWidth(column)"
813
+ [expandHandler]="isExpandColumn($index, column)"
814
+ [allowSorting]="false"
815
+ [allowResizing]="false"
816
+ />
817
+ }
818
+ </ax-data-table>
819
+
820
+ <ng-template #customRowTemplate let-ctx>
821
+ <tr
822
+ [class.ax-state-selected]="ctx.data != null && isSelected(ctx.data)"
823
+ [class.ax-state-disabled]="ctx.data != null && isDisabled(ctx.data)"
824
+ [style.height.px]="itemHeight()"
825
+ [style.max-height.px]="itemHeight()"
826
+ (mousedown)="handleItemMouseDown($event, ctx.data)"
827
+ >
828
+ <td [attr.colspan]="columns().length || 1">
829
+ @if (ctx.data != null && itemTemplate()) {
830
+ <ng-container
831
+ [ngTemplateOutlet]="itemTemplate()!"
832
+ [ngTemplateOutletContext]="{ $implicit: ctx.data }"
833
+ />
834
+ }
835
+ </td>
836
+ </tr>
837
+ </ng-template>
838
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXDataTableComponent, selector: "ax-data-table", inputs: ["dataSource", "selectedRows", "parentField", "hasChildrenField", "rowDetailsTemplate", "rowCssClass", "cellCssClass", "highlightText", "look", "rowTemplate", "emptyTemplate", "noDataTemplate", "alternative", "showHeader", "fixedHeader", "showFooter", "fixedFooter", "itemHeight", "allowReordering", "paging", "fetchDataMode", "loading", "focusedRow"], outputs: ["selectedRowsChange", "focusedRowChange", "onRowClick", "onRowDbClick", "onColumnsOrderChanged", "onColumnSizeChanged", "onPageChanged"] }, { kind: "component", type: AXDataTableTextColumnComponent, selector: "ax-text-column", inputs: ["width", "caption", "allowSorting", "allowResizing", "fixed", "hasTitle", "customExpandIcon", "customCollapseIcon", "dataField", "expandHandler", "wrapText", "cellTemplate", "footerTemplate", "headerTemplate", "format", "formatOptions"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
839
+ }
840
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupMultiColumnTreeComponent, decorators: [{
841
+ type: Component,
842
+ args: [{
843
+ selector: 'ax-lookup-multi-column-tree',
844
+ changeDetection: ChangeDetectionStrategy.OnPush,
845
+ encapsulation: ViewEncapsulation.None,
846
+ imports: [NgTemplateOutlet, AXDataTableComponent, AXDataTableTextColumnComponent],
847
+ host: {
848
+ class: 'ax-lookup-multi-column ax-lookup-multi-column-tree',
849
+ '[style.height.px]': 'tableHeight()',
850
+ },
851
+ template: `
852
+ <ax-data-table
853
+ class="ax-lookup-multi-column-table"
854
+ look="minimal"
855
+ [dataSource]="dataSource()"
856
+ [parentField]="parentField()"
857
+ [hasChildrenField]="hasChildrenField()"
858
+ [itemHeight]="itemHeight()"
859
+ [alternative]="alternate()"
860
+ [emptyTemplate]="emptyTemplate()"
861
+ [loading]="loadingConfig()"
862
+ [paging]="false"
863
+ [showHeader]="true"
864
+ [fixedHeader]="true"
865
+ [showFooter]="false"
866
+ [allowReordering]="false"
867
+ [rowTemplate]="itemTemplate() ? customRowTemplate : undefined"
868
+ [rowCssClass]="resolveRowCssClass"
869
+ (onRowClick)="handleRowClick($event)"
870
+ >
871
+ @for (column of columns(); track trackColumnKey($index, column)) {
872
+ <ax-text-column
873
+ [dataField]="column.field"
874
+ [caption]="column.title"
875
+ [width]="resolveColumnWidth(column)"
876
+ [expandHandler]="isExpandColumn($index, column)"
877
+ [allowSorting]="false"
878
+ [allowResizing]="false"
879
+ />
880
+ }
881
+ </ax-data-table>
882
+
883
+ <ng-template #customRowTemplate let-ctx>
884
+ <tr
885
+ [class.ax-state-selected]="ctx.data != null && isSelected(ctx.data)"
886
+ [class.ax-state-disabled]="ctx.data != null && isDisabled(ctx.data)"
887
+ [style.height.px]="itemHeight()"
888
+ [style.max-height.px]="itemHeight()"
889
+ (mousedown)="handleItemMouseDown($event, ctx.data)"
890
+ >
891
+ <td [attr.colspan]="columns().length || 1">
892
+ @if (ctx.data != null && itemTemplate()) {
893
+ <ng-container
894
+ [ngTemplateOutlet]="itemTemplate()!"
895
+ [ngTemplateOutletContext]="{ $implicit: ctx.data }"
896
+ />
897
+ }
898
+ </td>
899
+ </tr>
900
+ </ng-template>
901
+ `,
902
+ }]
903
+ }], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: true }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], textField: [{ type: i0.Input, args: [{ isSignal: true, alias: "textField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], parentField: [{ type: i0.Input, args: [{ isSignal: true, alias: "parentField", required: false }] }], hasChildrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasChildrenField", required: false }] }], selectedValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedValues", required: false }] }], itemHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemHeight", required: false }] }], maxVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisibleItems", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], emptyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTemplate", required: false }] }], loadingTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingTemplate", required: false }] }], alternate: [{ type: i0.Input, args: [{ isSignal: true, alias: "alternate", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
904
+
472
905
  /**
473
906
  * Internal mini component for the `multi-column` lookup mode:
474
907
  * renders selectable rows in an `ax-data-table` grid and loads further
@@ -606,19 +1039,18 @@ class AXLookupMultiColumnComponent {
606
1039
  const source = this.dataSource();
607
1040
  this.tableDataSource.config.key = source.config.key || this.valueField();
608
1041
  untracked(() => {
609
- this.#loadedItems = [];
610
- this.#totalCount.set(0);
611
- this.#syncTablePageSize();
612
- this.tableDataSource.refresh({ reset: true });
1042
+ this.#applyLoadedItems(source.cachedItems, source.totalCount);
613
1043
  });
614
1044
  const changedSub = source.onChanged.subscribe((event) => {
615
- this.#loadedItems = event.cachedItems.filter((item) => item != null);
616
- this.#totalCount.set(event.totalCount);
617
- this.#syncTablePageSize();
618
- this.tableDataSource.refresh({ reset: true });
1045
+ this.#applyLoadedItems(event.cachedItems, event.totalCount);
1046
+ });
1047
+ // Fetch page 0 only when the source has never loaded. Reopen remounts this
1048
+ // view; setPage(0) is a no-op on a warm source and must not force a new API call.
1049
+ queueMicrotask(() => {
1050
+ if (!source.cachedItems.some((item) => item != null)) {
1051
+ source.setPage(0);
1052
+ }
619
1053
  });
620
- // Kick the first page; later pages come from scroll.
621
- queueMicrotask(() => source.setPage(0));
622
1054
  onCleanup(() => changedSub.unsubscribe());
623
1055
  });
624
1056
  effect((onCleanup) => {
@@ -653,6 +1085,12 @@ class AXLookupMultiColumnComponent {
653
1085
  }
654
1086
  return width;
655
1087
  }
1088
+ #applyLoadedItems(cachedItems, totalCount) {
1089
+ this.#loadedItems = cachedItems.filter((item) => item != null);
1090
+ this.#totalCount.set(totalCount);
1091
+ this.#syncTablePageSize();
1092
+ this.tableDataSource.refresh({ reset: true });
1093
+ }
656
1094
  #syncTablePageSize() {
657
1095
  this.tableDataSource.config.pageSize = Math.max(this.#loadedItems.length, 1);
658
1096
  }
@@ -665,6 +1103,11 @@ class AXLookupMultiColumnComponent {
665
1103
  }
666
1104
  this.itemClick.emit({ item, value: this.getValue(item) });
667
1105
  }
1106
+ handleItemMouseDown(event, item) {
1107
+ event.preventDefault();
1108
+ event.stopPropagation();
1109
+ this.handleItemClick(item);
1110
+ }
668
1111
  isSelected(item) {
669
1112
  const value = this.getValue(item);
670
1113
  return this.selectedValues().some((v) => v == value);
@@ -727,7 +1170,7 @@ class AXLookupMultiColumnComponent {
727
1170
  [class.ax-state-disabled]="ctx.data != null && isDisabled(ctx.data)"
728
1171
  [style.height.px]="itemHeight()"
729
1172
  [style.max-height.px]="itemHeight()"
730
- (click)="handleItemClick(ctx.data)"
1173
+ (mousedown)="handleItemMouseDown($event, ctx.data)"
731
1174
  >
732
1175
  <td [attr.colspan]="columns().length || 1">
733
1176
  @if (ctx.data != null && itemTemplate()) {
@@ -787,7 +1230,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
787
1230
  [class.ax-state-disabled]="ctx.data != null && isDisabled(ctx.data)"
788
1231
  [style.height.px]="itemHeight()"
789
1232
  [style.max-height.px]="itemHeight()"
790
- (click)="handleItemClick(ctx.data)"
1233
+ (mousedown)="handleItemMouseDown($event, ctx.data)"
791
1234
  >
792
1235
  <td [attr.colspan]="columns().length || 1">
793
1236
  @if (ctx.data != null && itemTemplate()) {
@@ -912,7 +1355,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
912
1355
  class AXLookupMultiSelectComponent extends AXLookupListViewBase {
913
1356
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupMultiSelectComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
914
1357
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXLookupMultiSelectComponent, isStandalone: true, selector: "ax-lookup-multi-select", providers: [{ provide: AXLookupListViewBase, useExisting: AXLookupMultiSelectComponent }], usesInheritance: true, ngImport: i0, template: `
915
- @if (isEmpty()) {
1358
+ @if (showLoadingPlaceholder()) {
1359
+ <div class="ax-lookup-viewport" role="listbox" aria-multiselectable="true">
1360
+ @for (index of loadingPlaceholderIndexes; track index) {
1361
+ <div class="ax-lookup-option-host ax-lookup-option" [style.height.px]="itemHeight()">
1362
+ <ng-container [ngTemplateOutlet]="loadingRow" />
1363
+ </div>
1364
+ }
1365
+ </div>
1366
+ } @else if (isEmpty()) {
916
1367
  @if (emptyTemplate()) {
917
1368
  <ng-container [ngTemplateOutlet]="emptyTemplate()!" />
918
1369
  } @else {
@@ -934,11 +1385,10 @@ class AXLookupMultiSelectComponent extends AXLookupListViewBase {
934
1385
  <div
935
1386
  *cdkVirtualFor="let item of listDataSource(); let i = index; trackBy: trackByIndex"
936
1387
  role="option"
937
- class="ax-lookup-option-host"
1388
+ class="ax-lookup-option-host ax-lookup-option"
938
1389
  axListNavigationItem
939
1390
  #navItem="axListNavigationItem"
940
1391
  [style.height.px]="itemHeight()"
941
- [class.ax-lookup-option]="!itemTemplate()"
942
1392
  [class.ax-lookup-option-host--check]="!!itemTemplate()"
943
1393
  [class.ax-state-alternate]="alternate() && i % 2 === 1"
944
1394
  [class.ax-state-selected]="item != null && isSelected(item)"
@@ -946,7 +1396,7 @@ class AXLookupMultiSelectComponent extends AXLookupListViewBase {
946
1396
  [class.ax-state-active]="navItem.isActive()"
947
1397
  [attr.aria-selected]="item != null ? isSelected(item) : null"
948
1398
  (mouseenter)="activateNavItem(nav, navItem)"
949
- (click)="handleItemClick(item)"
1399
+ (mousedown)="handleItemMouseDown($event, item)"
950
1400
  (onKeypress)="handleItemKeypress($event, item)"
951
1401
  >
952
1402
  @if (item != null) {
@@ -976,7 +1426,7 @@ class AXLookupMultiSelectComponent extends AXLookupListViewBase {
976
1426
  <span class="ax-lookup-option-loading">{{ '@acorex:common.status.loading' | translate | async }}</span>
977
1427
  }
978
1428
  </ng-template>
979
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i3.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i3.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1429
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXListNavigationModule }, { kind: "directive", type: i2.AXListNavigationDirective, selector: "[axListNavigation]", inputs: ["orientation"], outputs: ["onNavigationChanged", "onKeypress"], exportAs: ["axListNavigation"] }, { kind: "directive", type: i2.AXListNavigationItemDirective, selector: "[axListNavigationItem]", outputs: ["onKeypress"], exportAs: ["axListNavigationItem"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
980
1430
  }
981
1431
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupMultiSelectComponent, decorators: [{
982
1432
  type: Component,
@@ -987,7 +1437,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
987
1437
  imports: [ScrollingModule, NgTemplateOutlet, AXTranslatorPipe, AsyncPipe, AXListNavigationModule],
988
1438
  providers: [{ provide: AXLookupListViewBase, useExisting: AXLookupMultiSelectComponent }],
989
1439
  template: `
990
- @if (isEmpty()) {
1440
+ @if (showLoadingPlaceholder()) {
1441
+ <div class="ax-lookup-viewport" role="listbox" aria-multiselectable="true">
1442
+ @for (index of loadingPlaceholderIndexes; track index) {
1443
+ <div class="ax-lookup-option-host ax-lookup-option" [style.height.px]="itemHeight()">
1444
+ <ng-container [ngTemplateOutlet]="loadingRow" />
1445
+ </div>
1446
+ }
1447
+ </div>
1448
+ } @else if (isEmpty()) {
991
1449
  @if (emptyTemplate()) {
992
1450
  <ng-container [ngTemplateOutlet]="emptyTemplate()!" />
993
1451
  } @else {
@@ -1009,11 +1467,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1009
1467
  <div
1010
1468
  *cdkVirtualFor="let item of listDataSource(); let i = index; trackBy: trackByIndex"
1011
1469
  role="option"
1012
- class="ax-lookup-option-host"
1470
+ class="ax-lookup-option-host ax-lookup-option"
1013
1471
  axListNavigationItem
1014
1472
  #navItem="axListNavigationItem"
1015
1473
  [style.height.px]="itemHeight()"
1016
- [class.ax-lookup-option]="!itemTemplate()"
1017
1474
  [class.ax-lookup-option-host--check]="!!itemTemplate()"
1018
1475
  [class.ax-state-alternate]="alternate() && i % 2 === 1"
1019
1476
  [class.ax-state-selected]="item != null && isSelected(item)"
@@ -1021,7 +1478,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1021
1478
  [class.ax-state-active]="navItem.isActive()"
1022
1479
  [attr.aria-selected]="item != null ? isSelected(item) : null"
1023
1480
  (mouseenter)="activateNavItem(nav, navItem)"
1024
- (click)="handleItemClick(item)"
1481
+ (mousedown)="handleItemMouseDown($event, item)"
1025
1482
  (onKeypress)="handleItemKeypress($event, item)"
1026
1483
  >
1027
1484
  @if (item != null) {
@@ -1056,14 +1513,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1056
1513
  }] });
1057
1514
 
1058
1515
  /**
1059
- * An advanced drop-down (lookup) editor with five modes, `AXDataSource` support, and virtual scrolling.
1516
+ * An advanced drop-down (lookup) editor with six modes, `AXDataSource` support, and virtual scrolling.
1060
1517
  *
1061
1518
  * Modes (each rendered by its own internal mini component):
1062
1519
  * - `drop-down-list` — a predefined list of options for picking single values.
1063
1520
  * - `multi-select` — a predefined list of options for multiple item selection (chips in the trigger).
1064
1521
  * - `drop-down-tree` — a predefined list rendered in a tree-like structure for single item selection.
1065
1522
  * - `multi-select-tree` — a tree-like structure for multiple item selection.
1066
- * - `multi-column` — an `ax-data-table` grid; when searchable, the trigger input filters as you type.
1523
+ * - `multi-column` — an `ax-data-table` grid; when searchable, the trigger input filters as you type
1524
+ * (on small screens the search field is inside the actionsheet).
1525
+ * - `multi-column-tree` — a multi-column `ax-data-table` with a drop-down tree inside it
1526
+ * (expandable hierarchical rows). Uses `treeDataSource` + `columns`, or a hierarchical `dataSource`.
1067
1527
  *
1068
1528
  * With `adaptivityEnabled` (default `true`), the list opens as a bottom actionsheet on small
1069
1529
  * screens instead of an anchored dropdown — the same alternate presentation as `ax-select-box`.
@@ -1073,9 +1533,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1073
1533
  *
1074
1534
  * @category Components
1075
1535
  */
1076
- class AXLookupComponent extends NXComponent {
1536
+ class AXLookupComponent extends NXValueComponent {
1077
1537
  #platform;
1078
1538
  #destroyRef;
1539
+ /** Reused so closing/reopening the popup does not create a new AXDataSource (which would miss cache). */
1540
+ #multiColumnTreeTableSource;
1541
+ #multiColumnTreeTableKey;
1542
+ #multiColumnTreeInput;
1543
+ /**
1544
+ * Tree callback results keyed by parent id. Survives popup remount so
1545
+ * drop-down-tree / multi-select-tree do not refetch on every open.
1546
+ */
1547
+ #treeChildrenCache;
1079
1548
  #itemsCache;
1080
1549
  #isUserInteraction;
1081
1550
  #lastValue;
@@ -1084,23 +1553,30 @@ class AXLookupComponent extends NXComponent {
1084
1553
  #selectionInitialized;
1085
1554
  #filterApplied;
1086
1555
  #searchDebounce;
1556
+ #sheetSearchFocused;
1087
1557
  constructor() {
1088
1558
  super();
1089
1559
  this.#platform = inject(AXPlatform);
1090
1560
  this.#destroyRef = inject(DestroyRef);
1561
+ /**
1562
+ * The name of the form field, used by validation rules and `ax-form.validate(names)`.
1563
+ */
1564
+ this.name = input('', /* @ts-ignore */
1565
+ ...(ngDevMode ? [{ debugName: "name" }] : /* istanbul ignore next */ []));
1091
1566
  /**
1092
1567
  * The lookup rendering mode. Selects which mini component renders in the popup.
1093
1568
  */
1094
1569
  this.mode = input('drop-down-list', /* @ts-ignore */
1095
1570
  ...(ngDevMode ? [{ debugName: "mode" }] : /* istanbul ignore next */ []));
1096
1571
  /**
1097
- * The items source for list-based modes (`drop-down-list`, `multi-select`, `multi-column`).
1572
+ * The items source for list-based modes (`drop-down-list`, `multi-select`, `multi-column`)
1573
+ * and for `multi-column-tree` when `treeDataSource` is not set.
1098
1574
  * Accepts an `AXDataSource` (remote paging, `byKey`, server-side filter) or a plain array.
1099
1575
  */
1100
1576
  this.dataSource = input(undefined, /* @ts-ignore */
1101
1577
  ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
1102
1578
  /**
1103
- * The nodes source for tree modes (`drop-down-tree`, `multi-select-tree`):
1579
+ * The nodes source for tree modes (`drop-down-tree`, `multi-select-tree`, `multi-column-tree`):
1104
1580
  * an array of nodes or a lazy children callback.
1105
1581
  */
1106
1582
  this.treeDataSource = input(undefined, /* @ts-ignore */
@@ -1122,20 +1598,37 @@ class AXLookupComponent extends NXComponent {
1122
1598
  this.disabledField = input('disabled', /* @ts-ignore */
1123
1599
  ...(ngDevMode ? [{ debugName: "disabledField" }] : /* istanbul ignore next */ []));
1124
1600
  /**
1125
- * Column definitions for the `multi-column` mode (rendered as `ax-text-column` in `ax-data-table`).
1601
+ * Column definitions for the `multi-column` and `multi-column-tree` modes
1602
+ * (rendered as `ax-text-column` in `ax-data-table`).
1126
1603
  */
1127
1604
  this.columns = input([], /* @ts-ignore */
1128
1605
  ...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
1606
+ /**
1607
+ * Field used by `multi-column-tree` to fetch children when a row is expanded
1608
+ * (`AXDataSource` filter). Defaults to `parentId`. Nested `children` arrays are also supported.
1609
+ */
1610
+ this.treeParentField = input('parentId', /* @ts-ignore */
1611
+ ...(ngDevMode ? [{ debugName: "treeParentField" }] : /* istanbul ignore next */ []));
1612
+ /**
1613
+ * Field used by `multi-column-tree` to decide whether a row shows an expand control.
1614
+ * Defaults to `hasChild`. Nodes with `children` / `childrenCount` are mapped automatically
1615
+ * when using `treeDataSource`.
1616
+ */
1617
+ this.hasChildrenField = input('hasChild', /* @ts-ignore */
1618
+ ...(ngDevMode ? [{ debugName: "hasChildrenField" }] : /* istanbul ignore next */ []));
1129
1619
  /**
1130
1620
  * Whether the trigger accepts typing and filters the datasource (`true`),
1131
1621
  * or is select-only with no writable input (`false`).
1132
- * Applies to `drop-down-list`, `multi-select`, and `multi-column`. Tree modes ignore this.
1622
+ * Applies to `drop-down-list`, `multi-select`, `multi-column`, and `multi-column-tree`.
1623
+ * Tree-only modes (`drop-down-tree`, `multi-select-tree`) ignore this.
1624
+ * On small screens with `adaptivityEnabled`, search is typed in the actionsheet instead of the trigger.
1133
1625
  */
1134
1626
  this.searchable = input(true, /* @ts-ignore */
1135
1627
  ...(ngDevMode ? [{ debugName: "searchable" }] : /* istanbul ignore next */ []));
1136
1628
  /**
1137
1629
  * When `true` (default), the popup list uses the alternate actionsheet presentation on small
1138
- * screens (`SM`). When `false`, the list always opens as an anchored dropdown.
1630
+ * screens (`SM`). Searchable list modes then show a search field inside the sheet. When `false`,
1631
+ * the list always opens as an anchored dropdown.
1139
1632
  */
1140
1633
  this.adaptivityEnabled = input(true, /* @ts-ignore */
1141
1634
  ...(ngDevMode ? [{ debugName: "adaptivityEnabled" }] : /* istanbul ignore next */ []));
@@ -1146,13 +1639,14 @@ class AXLookupComponent extends NXComponent {
1146
1639
  ...(ngDevMode ? [{ debugName: "caption" }] : /* istanbul ignore next */ []));
1147
1640
  /**
1148
1641
  * When `true`, list rows use alternating background colors for easier scanning
1149
- * (`drop-down-list`, `multi-select`, and `multi-column` modes).
1642
+ * (`drop-down-list`, `multi-select`, `multi-column`, and `multi-column-tree` modes).
1150
1643
  */
1151
1644
  this.alternate = input(false, /* @ts-ignore */
1152
1645
  ...(ngDevMode ? [{ debugName: "alternate" }] : /* istanbul ignore next */ []));
1153
1646
  /**
1154
1647
  * Placeholder for the trigger search input when items are already selected
1155
- * (mainly useful in `multi-select`). Falls back to `placeholder` when the selection is empty.
1648
+ * (mainly useful in `multi-select`), and for the in-sheet search field on small screens.
1649
+ * Falls back to `placeholder` when the selection is empty on desktop.
1156
1650
  */
1157
1651
  this.searchPlaceholder = input('Search...', /* @ts-ignore */
1158
1652
  ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : /* istanbul ignore next */ []));
@@ -1218,6 +1712,13 @@ class AXLookupComponent extends NXComponent {
1218
1712
  */
1219
1713
  this.value = model(null, /* @ts-ignore */
1220
1714
  ...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
1715
+ /**
1716
+ * Full items that resolve the current `value` key(s) without calling datasource `byKey`.
1717
+ * Use when the parent already has the selected entity (e.g. edit forms). Seeds the internal
1718
+ * item cache; missing keys still fall through to `find` / `byKey`.
1719
+ */
1720
+ this.valueItems = input([], /* @ts-ignore */
1721
+ ...(ngDevMode ? [{ debugName: "valueItems" }] : /* istanbul ignore next */ []));
1221
1722
  /**
1222
1723
  * Emitted when the selected value changes.
1223
1724
  */
@@ -1260,19 +1761,51 @@ class AXLookupComponent extends NXComponent {
1260
1761
  this.isMultiple = computed(() => this.mode() === 'multi-select' || this.mode() === 'multi-select-tree', /* @ts-ignore */
1261
1762
  ...(ngDevMode ? [{ debugName: "isMultiple" }] : /* istanbul ignore next */ []));
1262
1763
  /** Whether the current mode renders a tree. */
1263
- this.isTreeMode = computed(() => this.mode() === 'drop-down-tree' || this.mode() === 'multi-select-tree', /* @ts-ignore */
1764
+ this.isTreeMode = computed(() => {
1765
+ const mode = this.mode();
1766
+ return (mode === 'drop-down-tree' ||
1767
+ mode === 'multi-select-tree' ||
1768
+ (mode === 'multi-column-tree' && this.treeDataSource() != null));
1769
+ }, /* @ts-ignore */
1264
1770
  ...(ngDevMode ? [{ debugName: "isTreeMode" }] : /* istanbul ignore next */ []));
1265
- /** Whether the trigger input is writable and filters as you type. */
1266
- this.isEditableTrigger = computed(() => {
1267
- if (!this.searchable() || this.readonly()) {
1268
- return false;
1269
- }
1771
+ /** Whether the current mode can filter a list/table as you type. */
1772
+ this.isListSearchMode = computed(() => {
1270
1773
  const mode = this.mode();
1271
- return mode === 'drop-down-list' || mode === 'multi-select' || mode === 'multi-column';
1774
+ return (mode === 'drop-down-list' || mode === 'multi-select' || mode === 'multi-column' || mode === 'multi-column-tree');
1272
1775
  }, /* @ts-ignore */
1776
+ ...(ngDevMode ? [{ debugName: "isListSearchMode" }] : /* istanbul ignore next */ []));
1777
+ /** Whether the trigger input is writable and filters as you type (desktop only). */
1778
+ this.isEditableTrigger = computed(() => this.searchable() && !this.readonly() && !this.isActionsheetStyle() && this.isListSearchMode(), /* @ts-ignore */
1273
1779
  ...(ngDevMode ? [{ debugName: "isEditableTrigger" }] : /* istanbul ignore next */ []));
1780
+ /** Whether search is typed in the actionsheet instead of the trigger. */
1781
+ this.isSheetSearchEnabled = computed(() => this.searchable() && !this.readonly() && this.isActionsheetStyle() && this.isListSearchMode(), /* @ts-ignore */
1782
+ ...(ngDevMode ? [{ debugName: "isSheetSearchEnabled" }] : /* istanbul ignore next */ []));
1783
+ /** Query typed in the actionsheet search field (independent of the trigger display text). */
1784
+ this.sheetSearchText = signal('', /* @ts-ignore */
1785
+ ...(ngDevMode ? [{ debugName: "sheetSearchText" }] : /* istanbul ignore next */ []));
1274
1786
  /** The datasource for list-based modes; plain arrays are converted. */
1275
1787
  this.resolvedDataSource = computed(() => {
1788
+ const tree = this.treeDataSource();
1789
+ if (this.mode() === 'multi-column-tree' && tree) {
1790
+ const key = `${this.valueField()}|${this.textField()}|${this.treeParentField()}|${this.hasChildrenField()}`;
1791
+ if (this.#multiColumnTreeTableSource &&
1792
+ this.#multiColumnTreeInput === tree &&
1793
+ this.#multiColumnTreeTableKey === key) {
1794
+ return this.#multiColumnTreeTableSource;
1795
+ }
1796
+ const cachedTree = Array.isArray(tree)
1797
+ ? tree
1798
+ : (nodeId) => this.#loadCachedTreeNodes(tree, nodeId);
1799
+ this.#multiColumnTreeInput = tree;
1800
+ this.#multiColumnTreeTableKey = key;
1801
+ this.#multiColumnTreeTableSource = createLookupTreeTableDataSource(cachedTree, {
1802
+ valueField: this.valueField(),
1803
+ textField: this.textField(),
1804
+ parentField: this.treeParentField(),
1805
+ hasChildrenField: this.hasChildrenField(),
1806
+ });
1807
+ return this.#multiColumnTreeTableSource;
1808
+ }
1276
1809
  const source = this.dataSource();
1277
1810
  if (!source) {
1278
1811
  return convertArrayToDataSource([], { key: this.valueField(), pageSize: 20 });
@@ -1282,6 +1815,22 @@ class AXLookupComponent extends NXComponent {
1282
1815
  : source;
1283
1816
  }, /* @ts-ignore */
1284
1817
  ...(ngDevMode ? [{ debugName: "resolvedDataSource" }] : /* istanbul ignore next */ []));
1818
+ /**
1819
+ * Tree callback results keyed by parent id. Survives popup remount so
1820
+ * drop-down-tree / multi-select-tree do not refetch on every open.
1821
+ */
1822
+ this.#treeChildrenCache = new WeakMap();
1823
+ this.resolvedTreeDataSource = computed(() => {
1824
+ const source = this.treeDataSource();
1825
+ if (!source) {
1826
+ return [];
1827
+ }
1828
+ if (Array.isArray(source)) {
1829
+ return source;
1830
+ }
1831
+ return (nodeId) => this.#loadCachedTreeNodes(source, nodeId);
1832
+ }, /* @ts-ignore */
1833
+ ...(ngDevMode ? [{ debugName: "resolvedTreeDataSource" }] : /* istanbul ignore next */ []));
1285
1834
  /** The current selection normalized to an array. */
1286
1835
  this.selectedValues = computed(() => {
1287
1836
  const value = this.value();
@@ -1304,7 +1853,7 @@ class AXLookupComponent extends NXComponent {
1304
1853
  * Text typed in the editable trigger input.
1305
1854
  * Multi-select starts empty; single modes sync from the selected display text.
1306
1855
  */
1307
- this.searchText = linkedSignal(() => (this.mode() === 'multi-select' || this.mode() === 'multi-select-tree' ? '' : this.displayText()), /* @ts-ignore */
1856
+ this.searchText = linkedSignal(() => (this.isMultiple() ? '' : this.displayText()), /* @ts-ignore */
1308
1857
  ...(ngDevMode ? [{ debugName: "searchText" }] : /* istanbul ignore next */ []));
1309
1858
  /**
1310
1859
  * Whether the trigger should render `selectedTemplate` instead of the plain input text.
@@ -1321,12 +1870,25 @@ class AXLookupComponent extends NXComponent {
1321
1870
  return !this.expanded() && this.searchText() === this.displayText();
1322
1871
  }, /* @ts-ignore */
1323
1872
  ...(ngDevMode ? [{ debugName: "showSelectedTemplate" }] : /* istanbul ignore next */ []));
1873
+ /** Placeholder for the editable trigger search input. */
1874
+ this.triggerSearchPlaceholder = computed(() => {
1875
+ if (this.isActionsheetStyle()) {
1876
+ return this.mode() === 'multi-select' && this.selectedItems().length > 0 ? '' : this.placeholder();
1877
+ }
1878
+ if (this.mode() === 'multi-select' && this.selectedItems().length > 0) {
1879
+ return this.searchPlaceholder();
1880
+ }
1881
+ return this.placeholder();
1882
+ }, /* @ts-ignore */
1883
+ ...(ngDevMode ? [{ debugName: "triggerSearchPlaceholder" }] : /* istanbul ignore next */ []));
1324
1884
  this.popoverRef = viewChild(AXPopoverComponent, /* @ts-ignore */
1325
1885
  ...(ngDevMode ? [{ debugName: "popoverRef" }] : /* istanbul ignore next */ []));
1326
1886
  this.triggerSearchInput = viewChild('triggerSearchInput', /* @ts-ignore */
1327
1887
  ...(ngDevMode ? [{ debugName: "triggerSearchInput" }] : /* istanbul ignore next */ []));
1328
1888
  this.listView = viewChild(AXLookupListViewBase, /* @ts-ignore */
1329
1889
  ...(ngDevMode ? [{ debugName: "listView" }] : /* istanbul ignore next */ []));
1890
+ this.sheetSearchRef = viewChild('sheetSearch', /* @ts-ignore */
1891
+ ...(ngDevMode ? [{ debugName: "sheetSearchRef" }] : /* istanbul ignore next */ []));
1330
1892
  this.#itemsCache = new Map();
1331
1893
  this.#isUserInteraction = false;
1332
1894
  this.#lastValue = undefined;
@@ -1334,14 +1896,7 @@ class AXLookupComponent extends NXComponent {
1334
1896
  this.#resolveRevision = 0;
1335
1897
  this.#selectionInitialized = false;
1336
1898
  this.#filterApplied = false;
1337
- /** Placeholder for the editable trigger search input. */
1338
- this.triggerSearchPlaceholder = computed(() => {
1339
- if (this.mode() === 'multi-select' && this.selectedItems().length > 0) {
1340
- return this.searchPlaceholder();
1341
- }
1342
- return this.placeholder();
1343
- }, /* @ts-ignore */
1344
- ...(ngDevMode ? [{ debugName: "triggerSearchPlaceholder" }] : /* istanbul ignore next */ []));
1899
+ this.#sheetSearchFocused = false;
1345
1900
  effect(() => this.#emitValueChanged(this.value()));
1346
1901
  effect(() => this.#emitOpenedOrClosed(this.expanded()));
1347
1902
  effect(() => {
@@ -1357,13 +1912,18 @@ class AXLookupComponent extends NXComponent {
1357
1912
  });
1358
1913
  // Seed the actionsheet flag once.
1359
1914
  this.#syncActionsheetStyle();
1360
- // Resolve selected items whenever the value (or the sources) change.
1915
+ // Seed the item cache from valueItems, then resolve selection.
1361
1916
  effect(() => {
1917
+ const seeded = this.valueItems();
1362
1918
  const values = this.selectedValues();
1919
+ this.valueField();
1363
1920
  this.mode();
1364
1921
  this.dataSource();
1365
1922
  this.treeDataSource();
1366
- untracked(() => void this.#resolveSelectedItems(values));
1923
+ untracked(() => {
1924
+ this.#seedItemsCache(seeded);
1925
+ void this.#resolveSelectedItems(values);
1926
+ });
1367
1927
  });
1368
1928
  // Keep the popover in sync with the expanded state.
1369
1929
  effect(() => {
@@ -1381,6 +1941,13 @@ class AXLookupComponent extends NXComponent {
1381
1941
  }
1382
1942
  });
1383
1943
  });
1944
+ afterRenderEffect(() => {
1945
+ if (!this.expanded()) {
1946
+ this.#sheetSearchFocused = false;
1947
+ return;
1948
+ }
1949
+ this.#tryFocusSheetSearch();
1950
+ });
1384
1951
  }
1385
1952
  #syncActionsheetStyle() {
1386
1953
  this.isActionsheetStyle.set(this.adaptivityEnabled() && this.#platform.is('SM'));
@@ -1410,7 +1977,7 @@ class AXLookupComponent extends NXComponent {
1410
1977
  if (!this.expanded()) {
1411
1978
  return;
1412
1979
  }
1413
- queueMicrotask(() => this.focusListFirst());
1980
+ queueMicrotask(() => this.#focusPopupSearchOrList());
1414
1981
  }
1415
1982
  /**
1416
1983
  * Focuses the lookup trigger input.
@@ -1435,14 +2002,14 @@ class AXLookupComponent extends NXComponent {
1435
2002
  if (e.key === 'ArrowDown') {
1436
2003
  e.preventDefault();
1437
2004
  this.expanded.set(true);
1438
- queueMicrotask(() => this.focusListFirst());
2005
+ queueMicrotask(() => this.#focusPopupSearchOrList());
1439
2006
  return;
1440
2007
  }
1441
2008
  if (!this.isEditableTrigger() && (e.key === 'Enter' || e.key === ' ')) {
1442
2009
  e.preventDefault();
1443
2010
  this.expanded.update((open) => !open);
1444
2011
  if (this.expanded()) {
1445
- queueMicrotask(() => this.focusListFirst());
2012
+ queueMicrotask(() => this.#focusPopupSearchOrList());
1446
2013
  }
1447
2014
  }
1448
2015
  }
@@ -1453,9 +2020,13 @@ class AXLookupComponent extends NXComponent {
1453
2020
  }
1454
2021
  }
1455
2022
  /**
1456
- * Returns focus to the trigger input when list navigation requests it.
2023
+ * Returns focus to the search field when list navigation requests it.
1457
2024
  */
1458
2025
  onListNavigateOut(_reason) {
2026
+ if (this.isSheetSearchEnabled()) {
2027
+ this.sheetSearchRef()?.focus();
2028
+ return;
2029
+ }
1459
2030
  this.triggerSearchInput()?.nativeElement.focus();
1460
2031
  }
1461
2032
  focusListFirst() {
@@ -1478,6 +2049,7 @@ class AXLookupComponent extends NXComponent {
1478
2049
  onPopoverClosed() {
1479
2050
  this.expanded.set(false);
1480
2051
  this.searchText.set(this.isMultiple() ? '' : this.displayText());
2052
+ this.sheetSearchText.set('');
1481
2053
  if (this.#filterApplied) {
1482
2054
  this.#filterApplied = false;
1483
2055
  const source = this.resolvedDataSource();
@@ -1517,17 +2089,23 @@ class AXLookupComponent extends NXComponent {
1517
2089
  this.expanded.set(true);
1518
2090
  this.#applyFilterDebounced(text);
1519
2091
  }
2092
+ /** Filters the datasource from the actionsheet search field (reads the input so delayed ngModel cannot block typing). */
2093
+ onSheetSearchInput() {
2094
+ const query = this.#sheetSearchInputValue();
2095
+ this.sheetSearchText.set(query);
2096
+ this.#applyFilterDebounced(query);
2097
+ }
1520
2098
  /**
1521
- * Commits a single pick (drop-down-list, drop-down-tree, multi-column) and closes the popup.
2099
+ * Commits a single pick (drop-down-list, drop-down-tree, multi-column, multi-column-tree) and closes the popup.
1522
2100
  */
1523
2101
  handleSinglePick(e) {
1524
2102
  this.#emitItemClick(e.item);
1525
2103
  this.#emitItemSelected(e.item);
1526
2104
  this.#itemsCache.set(e.value, e.item);
1527
- if (!this.#valuesEqual(e.value, this.value())) {
1528
- this.#isUserInteraction = true;
1529
- this.value.set(e.value);
1530
- }
2105
+ this.selectedItems.set([e.item]);
2106
+ this.searchText.set(this.getItemText(e.item));
2107
+ this.#isUserInteraction = true;
2108
+ this.value.set(e.value);
1531
2109
  this.close();
1532
2110
  }
1533
2111
  /**
@@ -1545,7 +2123,10 @@ class AXLookupComponent extends NXComponent {
1545
2123
  const next = exists ? current.filter((v) => !(v == e.value)) : [...current, e.value];
1546
2124
  this.#isUserInteraction = true;
1547
2125
  this.value.set(next);
1548
- if (this.isEditableTrigger() && this.searchText()) {
2126
+ if (this.isSheetSearchEnabled() && this.sheetSearchText()) {
2127
+ this.#clearSheetSearch();
2128
+ }
2129
+ else if (this.isEditableTrigger() && this.searchText()) {
1549
2130
  this.searchText.set('');
1550
2131
  this.#applyFilterDebounced('');
1551
2132
  }
@@ -1609,6 +2190,16 @@ class AXLookupComponent extends NXComponent {
1609
2190
  this.#isUserInteraction = true;
1610
2191
  this.value.set(this.selectedValues().filter((v) => !(v == value)));
1611
2192
  }
2193
+ /**
2194
+ * Seeds the item cache with known items so matching `value` keys resolve without `byKey`.
2195
+ * Useful after an async parent-entity load when `valueItems` is not bound.
2196
+ *
2197
+ * @param items - Full items that include `valueField` (and ideally `textField`) properties.
2198
+ */
2199
+ seedItems(items) {
2200
+ this.#seedItemsCache(items);
2201
+ void this.#resolveSelectedItems(this.selectedValues());
2202
+ }
1612
2203
  /**
1613
2204
  * Clears the whole selection.
1614
2205
  * Sets `null` in single modes and `[]` in multi modes. Used by projected `ax-clear-button`.
@@ -1631,11 +2222,58 @@ class AXLookupComponent extends NXComponent {
1631
2222
  }
1632
2223
  this.#isUserInteraction = isUserInteraction;
1633
2224
  this.value.set(next);
1634
- if (this.isEditableTrigger() && this.searchText()) {
2225
+ if (this.isSheetSearchEnabled() && this.sheetSearchText()) {
2226
+ this.#clearSheetSearch();
2227
+ }
2228
+ else if (this.isEditableTrigger() && this.searchText()) {
1635
2229
  this.searchText.set('');
1636
2230
  this.#applyFilterDebounced('');
1637
2231
  }
1638
2232
  }
2233
+ #clearSheetSearch() {
2234
+ this.sheetSearchText.set('');
2235
+ this.sheetSearchRef()?.commitValue('', false);
2236
+ this.#applyFilterDebounced('');
2237
+ }
2238
+ #sheetSearchInputValue() {
2239
+ return this.sheetSearchRef()?.getHostElement()?.querySelector('input')?.value ?? '';
2240
+ }
2241
+ #tryFocusSheetSearch() {
2242
+ if (!this.isSheetSearchEnabled() || this.#sheetSearchFocused) {
2243
+ return;
2244
+ }
2245
+ const search = this.sheetSearchRef();
2246
+ if (!search) {
2247
+ return;
2248
+ }
2249
+ this.#sheetSearchFocused = true;
2250
+ search.focus();
2251
+ }
2252
+ #focusPopupSearchOrList() {
2253
+ if (this.isSheetSearchEnabled()) {
2254
+ this.#tryFocusSheetSearch();
2255
+ return;
2256
+ }
2257
+ this.focusListFirst();
2258
+ }
2259
+ #loadCachedTreeNodes(source, nodeId) {
2260
+ let byParent = this.#treeChildrenCache.get(source);
2261
+ if (!byParent) {
2262
+ byParent = new Map();
2263
+ this.#treeChildrenCache.set(source, byParent);
2264
+ }
2265
+ const key = nodeId ?? '';
2266
+ const cached = byParent.get(key);
2267
+ if (cached) {
2268
+ return cached;
2269
+ }
2270
+ const request = Promise.resolve(source(nodeId)).then((nodes) => nodes ?? [], (error) => {
2271
+ byParent.delete(key);
2272
+ throw error;
2273
+ });
2274
+ byParent.set(key, request);
2275
+ return request;
2276
+ }
1639
2277
  #applyFilterDebounced(text) {
1640
2278
  if (this.#searchDebounce) {
1641
2279
  clearTimeout(this.#searchDebounce);
@@ -1646,10 +2284,16 @@ class AXLookupComponent extends NXComponent {
1646
2284
  if (query) {
1647
2285
  source.filter({ field: this.textField(), value: query, operator: { type: 'contains' } });
1648
2286
  this.#filterApplied = true;
2287
+ source.refresh();
2288
+ return;
1649
2289
  }
1650
- else {
1651
- source.clearFilter();
2290
+ source.clearFilter();
2291
+ // Opening a searchable trigger can emit an empty input event. Do not reset
2292
+ // an in-flight first page unless the user actually typed a search.
2293
+ if (!this.#filterApplied) {
2294
+ return;
1652
2295
  }
2296
+ this.#filterApplied = false;
1653
2297
  source.refresh();
1654
2298
  }, 300);
1655
2299
  }
@@ -1672,6 +2316,20 @@ class AXLookupComponent extends NXComponent {
1672
2316
  }
1673
2317
  this.#selectionInitialized = true;
1674
2318
  }
2319
+ #seedItemsCache(items) {
2320
+ if (!items?.length) {
2321
+ return;
2322
+ }
2323
+ const field = this.valueField();
2324
+ for (const item of items) {
2325
+ const key = item?.[field];
2326
+ if (key == null) {
2327
+ continue;
2328
+ }
2329
+ this.#itemsCache.set(key, item);
2330
+ this.#itemsCache.set(String(key), item);
2331
+ }
2332
+ }
1675
2333
  #resolveItem(value) {
1676
2334
  const cached = this.#itemsCache.get(value) ?? this.#itemsCache.get(String(value));
1677
2335
  if (cached) {
@@ -1764,11 +2422,12 @@ class AXLookupComponent extends NXComponent {
1764
2422
  expanded ? this.onOpened.emit(event) : this.onClosed.emit(event);
1765
2423
  }
1766
2424
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1767
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXLookupComponent, isStandalone: true, selector: "ax-lookup", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, treeDataSource: { classPropertyName: "treeDataSource", publicName: "treeDataSource", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, textField: { classPropertyName: "textField", publicName: "textField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, adaptivityEnabled: { classPropertyName: "adaptivityEnabled", publicName: "adaptivityEnabled", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, alternate: { classPropertyName: "alternate", publicName: "alternate", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, maxVisibleItems: { classPropertyName: "maxVisibleItems", publicName: "maxVisibleItems", isSignal: true, isRequired: false, transformFunction: null }, treeSelectionBehavior: { classPropertyName: "treeSelectionBehavior", publicName: "treeSelectionBehavior", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, selectedTemplate: { classPropertyName: "selectedTemplate", publicName: "selectedTemplate", isSignal: true, isRequired: false, transformFunction: null }, emptyTemplate: { classPropertyName: "emptyTemplate", publicName: "emptyTemplate", isSignal: true, isRequired: false, transformFunction: null }, loadingTemplate: { classPropertyName: "loadingTemplate", publicName: "loadingTemplate", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { look: "lookChange", value: "valueChange", onValueChanged: "onValueChanged", onSelectionChanged: "onSelectionChanged", onFocus: "onFocus", onBlur: "onBlur", onItemClick: "onItemClick", onItemSelected: "onItemSelected", onOpened: "onOpened", onClosed: "onClosed" }, providers: [
2425
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXLookupComponent, isStandalone: true, selector: "ax-lookup", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, treeDataSource: { classPropertyName: "treeDataSource", publicName: "treeDataSource", isSignal: true, isRequired: false, transformFunction: null }, valueField: { classPropertyName: "valueField", publicName: "valueField", isSignal: true, isRequired: false, transformFunction: null }, textField: { classPropertyName: "textField", publicName: "textField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, treeParentField: { classPropertyName: "treeParentField", publicName: "treeParentField", isSignal: true, isRequired: false, transformFunction: null }, hasChildrenField: { classPropertyName: "hasChildrenField", publicName: "hasChildrenField", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, adaptivityEnabled: { classPropertyName: "adaptivityEnabled", publicName: "adaptivityEnabled", isSignal: true, isRequired: false, transformFunction: null }, caption: { classPropertyName: "caption", publicName: "caption", isSignal: true, isRequired: false, transformFunction: null }, alternate: { classPropertyName: "alternate", publicName: "alternate", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, maxVisibleItems: { classPropertyName: "maxVisibleItems", publicName: "maxVisibleItems", isSignal: true, isRequired: false, transformFunction: null }, treeSelectionBehavior: { classPropertyName: "treeSelectionBehavior", publicName: "treeSelectionBehavior", isSignal: true, isRequired: false, transformFunction: null }, itemTemplate: { classPropertyName: "itemTemplate", publicName: "itemTemplate", isSignal: true, isRequired: false, transformFunction: null }, selectedTemplate: { classPropertyName: "selectedTemplate", publicName: "selectedTemplate", isSignal: true, isRequired: false, transformFunction: null }, emptyTemplate: { classPropertyName: "emptyTemplate", publicName: "emptyTemplate", isSignal: true, isRequired: false, transformFunction: null }, loadingTemplate: { classPropertyName: "loadingTemplate", publicName: "loadingTemplate", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, valueItems: { classPropertyName: "valueItems", publicName: "valueItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { look: "lookChange", value: "valueChange", onValueChanged: "onValueChanged", onSelectionChanged: "onSelectionChanged", onFocus: "onFocus", onBlur: "onBlur", onItemClick: "onItemClick", onItemSelected: "onItemSelected", onOpened: "onOpened", onClosed: "onClosed" }, providers: [
1768
2426
  { provide: AXComponent, useExisting: AXLookupComponent },
1769
2427
  { provide: AXClearableComponent, useExisting: AXLookupComponent },
1770
2428
  { provide: AXClosableComponent, useExisting: AXLookupComponent },
1771
- ], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: AXPopoverComponent, descendants: true, isSignal: true }, { propertyName: "triggerSearchInput", first: true, predicate: ["triggerSearchInput"], descendants: true, isSignal: true }, { propertyName: "listView", first: true, predicate: AXLookupListViewBase, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\n #origin\n class=\"ax-editor-container ax-{{ look() }} ax-default\"\n [class.ax-lookup-trigger]=\"!isEditableTrigger()\"\n [class.ax-lookup-trigger-multiple]=\"isMultiple()\"\n [class.ax-state-disabled]=\"disabled()\"\n [class.ax-state-readonly]=\"readonly()\"\n (click)=\"onTriggerClick()\"\n>\n <ng-content select=\"ax-prefix\"></ng-content>\n\n @if (isMultiple()) {\n <div class=\"ax-lookup-chips\">\n @for (item of selectedItems(); track trackSelectedKey(item)) {\n <ax-chips class=\"ax-sm\" color=\"primary\" look=\"twotone\" [text]=\"selectedTemplate() ? '' : getItemText(item)\">\n @if (selectedTemplate()) {\n <ax-prefix>\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n </ax-prefix>\n }\n @if (!disabled() && !readonly()) {\n <ax-suffix>\n <button type=\"button\" tabindex=\"-1\" (click)=\"removeChip($event, item)\">\n <span class=\"ax-icon ax-icon-close\"></span>\n </button>\n </ax-suffix>\n }\n </ax-chips>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input ax-lookup-trigger-search\"\n [class.ax-lookup-select-input]=\"!isEditableTrigger()\"\n [placeholder]=\"triggerSearchPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !isEditableTrigger()\"\n [attr.inputmode]=\"isEditableTrigger() ? null : 'none'\"\n [value]=\"searchText()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (beforeinput)=\"onBeforeInput($event)\"\n (focus)=\"emitOnFocus($event)\"\n (blur)=\"emitOnBlur($event)\"\n />\n </div>\n } @else {\n <div class=\"ax-lookup-value\">\n @if (showSelectedTemplate()) {\n <div class=\"ax-lookup-selected-content\" aria-hidden=\"true\">\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: selectedItems()[0] }\"\n />\n </div>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input\"\n [class.ax-lookup-select-input]=\"!isEditableTrigger()\"\n [class.ax-lookup-input-overlay]=\"showSelectedTemplate()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !isEditableTrigger()\"\n [attr.inputmode]=\"isEditableTrigger() ? null : 'none'\"\n [value]=\"searchText()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (beforeinput)=\"onBeforeInput($event)\"\n (focus)=\"emitOnFocus($event)\"\n (blur)=\"emitOnBlur($event)\"\n />\n </div>\n }\n\n @if (selectedValues().length > 0 && !disabled() && !readonly()) {\n <ng-content select=\"ax-clear-button\"></ng-content>\n }\n\n <button\n type=\"button\"\n class=\"ax-general-button-icon\"\n tabindex=\"-1\"\n [disabled]=\"disabled() || readonly()\"\n >\n <span\n class=\"ax-icon\"\n [class.ax-icon-chevron-down]=\"!expanded()\"\n [class.ax-icon-chevron-up]=\"expanded()\"\n ></span>\n </button>\n <ng-content select=\"ax-suffix\"></ng-content>\n</div>\n\n<ax-popover\n [target]=\"origin\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'bottom-start'\"\n [width]=\"isActionsheetStyle() ? '100%' : origin.offsetWidth + 'px'\"\n [adaptivityEnabled]=\"isActionsheetStyle()\"\n [disabled]=\"disabled() || readonly()\"\n (onClosed)=\"onPopoverClosed()\"\n>\n <div class=\"ax-lookup-popup\" [class.ax-is-actionsheet]=\"isActionsheetStyle()\" [class.ax-is-alternate]=\"alternate()\" (keydown.escape)=\"close()\">\n @if (isActionsheetStyle()) {\n <ax-header class=\"ax-solid\">\n <ax-title>{{ caption() || placeholder() || ('@acorex:selectbox.popover.title' | translate | async) }}</ax-title>\n <ax-close-button [icon]=\"isMultiple() ? 'ax-icon ax-icon-check' : 'ax-icon ax-icon-close'\"></ax-close-button>\n </ax-header>\n }\n <ng-content select=\"ax-header\"></ng-content>\n @if (expanded()) {\n @switch (mode()) {\n @case ('drop-down-list') {\n <ax-lookup-drop-down-list\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n (navigateOut)=\"onListNavigateOut($event)\"\n />\n }\n @case ('multi-select') {\n <ax-lookup-multi-select\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleMultiToggle($event)\"\n (navigateOut)=\"onListNavigateOut($event)\"\n />\n }\n @case ('drop-down-tree') {\n <ax-lookup-drop-down-tree\n [dataSource]=\"treeDataSource()!\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [nodeTemplate]=\"$any(itemTemplate())\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n @case ('multi-select-tree') {\n <ax-lookup-multi-select-tree\n [dataSource]=\"treeDataSource()!\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [selectionBehavior]=\"treeSelectionBehavior()\"\n [nodeTemplate]=\"$any(itemTemplate())\"\n (selectionChange)=\"handleTreeSelectionChange($event)\"\n />\n }\n @case ('multi-column') {\n <ax-lookup-multi-column\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [columns]=\"columns()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n }\n }\n <ng-content select=\"ax-footer\"></ng-content>\n </div>\n</ax-popover>\n", styles: ["@layer properties;@layer components{ax-lookup{display:block;width:100%}ax-lookup .ax-editor-container{justify-content:flex-start;gap:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-editor-container.ax-state-disabled{cursor:not-allowed;opacity:50%}ax-lookup .ax-editor-container.ax-state-disabled .ax-input,ax-lookup .ax-editor-container.ax-state-disabled .ax-editor{cursor:not-allowed}ax-lookup .ax-editor-container.ax-state-readonly{opacity:75%}ax-lookup .ax-lookup-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}ax-lookup .ax-lookup-trigger-multiple{height:auto;min-height:calc(var(--spacing, .25rem) * 9);padding-block:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-value{position:relative;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;overflow:hidden}ax-lookup .ax-lookup-select-input{cursor:pointer;caret-color:transparent;-webkit-user-select:none;user-select:none}ax-lookup .ax-lookup-selected-content{pointer-events:none;position:relative;z-index:0;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;overflow:hidden}ax-lookup .ax-lookup-input-overlay{position:absolute;inset:calc(var(--spacing, .25rem) * 0);z-index:10;margin:calc(var(--spacing, .25rem) * 0)!important;height:100%;width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0)!important;color:transparent;caret-color:transparent}ax-lookup .ax-lookup-chips{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-trigger-search{margin:calc(var(--spacing, .25rem) * 0)!important;height:calc(var(--spacing, .25rem) * 7.5);width:auto!important;min-width:calc(var(--spacing, .25rem) * 16);flex:1;flex-basis:calc(var(--spacing, .25rem) * 16)}ax-lookup .ax-lookup-placeholder{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-lookup .ax-lookup-placeholder{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 50%,transparent)}}ax-lookup ax-chips ax-prefix,ax-lookup ax-chips ax-suffix{padding:calc(var(--spacing, .25rem) * 0)!important}ax-lookup ax-chips ax-suffix button{display:flex;cursor:pointer;align-items:center;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0)}.ax-lookup-popup{box-sizing:border-box;display:flex;width:100%;flex-direction:column;overflow:hidden;border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ax-lookup-popup:where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-darkest-surface))}.ax-lookup-popup.ax-is-actionsheet{border-bottom-right-radius:0;border-bottom-left-radius:0;--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-lightest-surface))}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid .ax-icon-check{color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid ax-title{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: calc(var(--spacing, .25rem) * 6);line-height:calc(var(--spacing, .25rem) * 6);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}.ax-lookup-popup>ax-header:not(.ax-solid),.ax-lookup-popup>ax-footer{flex-shrink:0;border-color:rgba(var(--ax-sys-color-border-lightest-surface))}.ax-lookup-popup>ax-header:not(.ax-solid){border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.ax-lookup-popup>ax-footer{border-top-style:var(--tw-border-style);border-top-width:1px}.ax-lookup-viewport{width:100%}.ax-lookup-empty{display:flex;min-height:calc(var(--spacing, .25rem) * 12);width:100%;align-items:center;justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 3);text-align:center;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-empty{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 60%,transparent)}}.ax-lookup-option-host{box-sizing:border-box;cursor:pointer;border-style:var(--tw-border-style);border-width:1px;border-color:transparent;--tw-outline-style: none;outline-style:none}.ax-lookup-option-host.ax-state-alternate{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-alternate{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 5%,transparent)}}.ax-lookup-option-host:hover,.ax-lookup-option-host.ax-state-active{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host:hover,.ax-lookup-option-host.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 10%,transparent)}}.ax-lookup-option-host.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-alternate.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 15%,transparent)}}.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}:is(.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-primary-darkest-surface))}@supports (color: color-mix(in lab,red,red)){:is(.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-darkest-surface)) 25%,transparent)}}.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-lightest-surface)) 80%,transparent)}}:is(.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-primary-darkest-surface))}@supports (color: color-mix(in lab,red,red)){:is(.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-darkest-surface)) 40%,transparent)}}.ax-lookup-option-host.ax-state-disabled{cursor:not-allowed;opacity:50%}.ax-lookup-option-host.ax-lookup-option-host--check{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 3)}.ax-lookup-option-host .ax-lookup-checkbox{pointer-events:none;width:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 4);flex-shrink:0;accent-color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-option-host .ax-lookup-option-loading{width:100%;padding-inline:calc(var(--spacing, .25rem) * 3);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host .ax-lookup-option-loading{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 50%,transparent)}}.ax-lookup-option{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 3);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}.ax-lookup-option.ax-state-selected{color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-option .ax-lookup-option-text{min-width:calc(var(--spacing, .25rem) * 0);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-lookup-option .ax-lookup-option-check{flex-shrink:0;color:rgba(var(--ax-sys-color-primary-surface))}ax-lookup-multi-column,.ax-lookup-multi-column{display:block;min-height:calc(var(--spacing, .25rem) * 0);width:100%}:is(ax-lookup-multi-column,.ax-lookup-multi-column) .ax-lookup-multi-column-table,:is(ax-lookup-multi-column,.ax-lookup-multi-column) ax-data-table{height:100%;min-height:calc(var(--spacing, .25rem) * 0);border-style:var(--tw-border-style)!important;border-width:0px!important}:is(ax-lookup-multi-column,.ax-lookup-multi-column) tr.ax-state-selected{background-color:rgba(var(--ax-sys-color-primary-surface))}@supports (color: color-mix(in lab,red,red)){:is(ax-lookup-multi-column,.ax-lookup-multi-column) tr.ax-state-selected{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-surface)) 10%,transparent)}}:is(ax-lookup-multi-column,.ax-lookup-multi-column) tr.ax-state-disabled{pointer-events:none;opacity:50%}.ax-lookup-tree{max-height:calc(var(--spacing, .25rem) * 80);overflow:auto;padding:calc(var(--spacing, .25rem) * 2)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-leading: initial;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXChipsComponent, selector: "ax-chips", inputs: ["tabIndex", "color", "look", "text"], outputs: ["textChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorCloseButtonComponent, selector: "ax-close-button", inputs: ["closeAll", "icon"] }, { kind: "component", type: i1$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXLookupDropDownListComponent, selector: "ax-lookup-drop-down-list" }, { kind: "component", type: AXLookupMultiSelectComponent, selector: "ax-lookup-multi-select" }, { kind: "component", type: AXLookupDropDownTreeComponent, selector: "ax-lookup-drop-down-tree", inputs: ["dataSource", "valueField", "textField", "disabledField", "selectedValues", "nodeTemplate"], outputs: ["itemClick"] }, { kind: "component", type: AXLookupMultiSelectTreeComponent, selector: "ax-lookup-multi-select-tree", inputs: ["dataSource", "valueField", "textField", "disabledField", "selectedValues", "selectionBehavior", "nodeTemplate"], outputs: ["selectionChange"] }, { kind: "component", type: AXLookupMultiColumnComponent, selector: "ax-lookup-multi-column", inputs: ["dataSource", "valueField", "textField", "disabledField", "selectedValues", "itemHeight", "maxVisibleItems", "columns", "itemTemplate", "emptyTemplate", "loadingTemplate", "alternate"], outputs: ["itemClick"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2429
+ { provide: AXValuableComponent, useExisting: AXLookupComponent },
2430
+ ], viewQueries: [{ propertyName: "popoverRef", first: true, predicate: AXPopoverComponent, descendants: true, isSignal: true }, { propertyName: "triggerSearchInput", first: true, predicate: ["triggerSearchInput"], descendants: true, isSignal: true }, { propertyName: "listView", first: true, predicate: AXLookupListViewBase, descendants: true, isSignal: true }, { propertyName: "sheetSearchRef", first: true, predicate: ["sheetSearch"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\n #origin\n class=\"ax-editor-container ax-{{ look() }} ax-default\"\n [class.ax-lookup-trigger]=\"!isEditableTrigger()\"\n [class.ax-lookup-trigger-multiple]=\"isMultiple()\"\n [class.ax-state-disabled]=\"disabled()\"\n [class.ax-state-readonly]=\"readonly()\"\n (click)=\"onTriggerClick()\"\n>\n <ng-content select=\"ax-prefix\"></ng-content>\n\n @if (isMultiple()) {\n <div class=\"ax-lookup-chips\">\n @for (item of selectedItems(); track trackSelectedKey(item)) {\n <ax-chips class=\"ax-sm\" color=\"primary\" look=\"twotone\" [text]=\"selectedTemplate() ? '' : getItemText(item)\">\n @if (selectedTemplate()) {\n <ax-prefix>\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n </ax-prefix>\n }\n @if (!disabled() && !readonly()) {\n <ax-suffix>\n <button type=\"button\" tabindex=\"-1\" (click)=\"removeChip($event, item)\">\n <span class=\"ax-icon ax-icon-close\"></span>\n </button>\n </ax-suffix>\n }\n </ax-chips>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input ax-lookup-trigger-search\"\n [class.ax-lookup-select-input]=\"!isEditableTrigger()\"\n [placeholder]=\"triggerSearchPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !isEditableTrigger()\"\n [attr.inputmode]=\"isEditableTrigger() ? null : 'none'\"\n [value]=\"searchText()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (beforeinput)=\"onBeforeInput($event)\"\n (focus)=\"emitOnFocus($event)\"\n (blur)=\"emitOnBlur($event)\"\n />\n </div>\n } @else {\n <div class=\"ax-lookup-value\">\n @if (showSelectedTemplate()) {\n <div class=\"ax-lookup-selected-content\" aria-hidden=\"true\">\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: selectedItems()[0] }\"\n />\n </div>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input\"\n [class.ax-lookup-select-input]=\"!isEditableTrigger()\"\n [class.ax-lookup-input-overlay]=\"showSelectedTemplate()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !isEditableTrigger()\"\n [attr.inputmode]=\"isEditableTrigger() ? null : 'none'\"\n [value]=\"searchText()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (beforeinput)=\"onBeforeInput($event)\"\n (focus)=\"emitOnFocus($event)\"\n (blur)=\"emitOnBlur($event)\"\n />\n </div>\n }\n\n @if (selectedValues().length > 0 && !disabled() && !readonly()) {\n <ng-content select=\"ax-clear-button\"></ng-content>\n }\n\n <button\n type=\"button\"\n class=\"ax-general-button-icon\"\n tabindex=\"-1\"\n [disabled]=\"disabled() || readonly()\"\n >\n <span\n class=\"ax-icon\"\n [class.ax-icon-chevron-down]=\"!expanded()\"\n [class.ax-icon-chevron-up]=\"expanded()\"\n ></span>\n </button>\n <ng-content select=\"ax-suffix\"></ng-content>\n</div>\n\n<ax-popover\n [target]=\"origin\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'bottom-start'\"\n [width]=\"isActionsheetStyle() ? '100%' : origin.offsetWidth + 'px'\"\n [adaptivityEnabled]=\"isActionsheetStyle()\"\n [disabled]=\"disabled() || readonly()\"\n (onClosed)=\"onPopoverClosed()\"\n>\n <div class=\"ax-lookup-popup\" [class.ax-is-actionsheet]=\"isActionsheetStyle()\" [class.ax-is-alternate]=\"alternate()\" (keydown.escape)=\"close()\">\n @if (isActionsheetStyle()) {\n <ax-header class=\"ax-solid\">\n <ax-title>{{ caption() || placeholder() || ('@acorex:selectbox.popover.title' | translate | async) }}</ax-title>\n <ax-close-button [icon]=\"isMultiple() ? 'ax-icon ax-icon-check' : 'ax-icon ax-icon-close'\"></ax-close-button>\n </ax-header>\n }\n @if (isSheetSearchEnabled()) {\n <div class=\"ax-lookup-sheet-search\">\n <ax-search-box\n #sheetSearch\n class=\"ax-sm\"\n look=\"fill\"\n [autoSearch]=\"false\"\n [delayTime]=\"0\"\n [placeholder]=\"searchPlaceholder()\"\n (onValueChanged)=\"onSheetSearchInput()\"\n (onKeyUp)=\"onSheetSearchInput()\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </div>\n }\n <ng-content select=\"ax-header\"></ng-content>\n @if (expanded()) {\n @switch (mode()) {\n @case ('drop-down-list') {\n <ax-lookup-drop-down-list\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n (navigateOut)=\"onListNavigateOut($event)\"\n />\n }\n @case ('multi-select') {\n <ax-lookup-multi-select\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleMultiToggle($event)\"\n (navigateOut)=\"onListNavigateOut($event)\"\n />\n }\n @case ('drop-down-tree') {\n <ax-lookup-drop-down-tree\n [dataSource]=\"resolvedTreeDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [nodeTemplate]=\"$any(itemTemplate())\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n @case ('multi-select-tree') {\n <ax-lookup-multi-select-tree\n [dataSource]=\"resolvedTreeDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [selectionBehavior]=\"treeSelectionBehavior()\"\n [nodeTemplate]=\"$any(itemTemplate())\"\n (selectionChange)=\"handleTreeSelectionChange($event)\"\n />\n }\n @case ('multi-column') {\n <ax-lookup-multi-column\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [columns]=\"columns()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n @case ('multi-column-tree') {\n <ax-lookup-multi-column-tree\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [parentField]=\"treeParentField()\"\n [hasChildrenField]=\"hasChildrenField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [columns]=\"columns()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n }\n }\n <ng-content select=\"ax-footer\"></ng-content>\n </div>\n</ax-popover>\n<ng-content select=\"ax-validation-rule\"></ng-content>\n", styles: ["@layer properties;@layer components{ax-lookup{display:block;width:100%}ax-lookup .ax-editor-container{justify-content:flex-start;gap:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}ax-lookup .ax-lookup-trigger-multiple{height:auto;min-height:calc(var(--spacing, .25rem) * 9);padding-block:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-value{position:relative;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;overflow:hidden}ax-lookup .ax-lookup-select-input{cursor:pointer;caret-color:transparent;-webkit-user-select:none;user-select:none}ax-lookup .ax-lookup-selected-content{pointer-events:none;position:relative;z-index:0;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;overflow:hidden}ax-lookup .ax-lookup-input-overlay{position:absolute;inset:calc(var(--spacing, .25rem) * 0);z-index:10;margin:calc(var(--spacing, .25rem) * 0)!important;height:100%;width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0)!important;color:transparent;caret-color:transparent}ax-lookup .ax-lookup-chips{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-trigger-search{margin:calc(var(--spacing, .25rem) * 0)!important;height:calc(var(--spacing, .25rem) * 7.5);width:auto!important;min-width:calc(var(--spacing, .25rem) * 16);flex:1;flex-basis:calc(var(--spacing, .25rem) * 16)}ax-lookup .ax-lookup-placeholder{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-lookup .ax-lookup-placeholder{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 50%,transparent)}}ax-lookup ax-chips ax-prefix,ax-lookup ax-chips ax-suffix{padding:calc(var(--spacing, .25rem) * 0)!important}ax-lookup ax-chips ax-suffix button{display:flex;cursor:pointer;align-items:center;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0)}.ax-lookup-popup{box-sizing:border-box;display:flex;width:100%;flex-direction:column;overflow:hidden;border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ax-lookup-popup:where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-darkest-surface))}.ax-lookup-popup.ax-is-actionsheet{border-bottom-right-radius:0;border-bottom-left-radius:0;--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-lightest-surface))}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid .ax-icon-check{color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid ax-title{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: calc(var(--spacing, .25rem) * 6);line-height:calc(var(--spacing, .25rem) * 6);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}.ax-lookup-popup .ax-lookup-sheet-search{flex-shrink:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-lightest-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}.ax-lookup-popup>ax-header:not(.ax-solid),.ax-lookup-popup>ax-footer{flex-shrink:0;border-color:rgba(var(--ax-sys-color-border-lightest-surface))}.ax-lookup-popup>ax-header:not(.ax-solid){border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.ax-lookup-popup>ax-footer{border-top-style:var(--tw-border-style);border-top-width:1px}.ax-lookup-viewport{width:100%}.ax-lookup-empty{display:flex;min-height:calc(var(--spacing, .25rem) * 12);width:100%;align-items:center;justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 3);text-align:center;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-empty{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 60%,transparent)}}.ax-lookup-option-host{box-sizing:border-box;display:flex;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-style:var(--tw-border-style);border-width:1px;border-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 3);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface));--tw-outline-style: none;outline-style:none}.ax-lookup-option-host.ax-state-alternate{background-color:rgba(var(--ax-sys-color-light-surface))}.ax-lookup-option-host.ax-state-alternate:where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-surface))}.ax-lookup-option-host:hover,.ax-lookup-option-host.ax-state-active{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host:hover,.ax-lookup-option-host.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 10%,transparent)}}.ax-lookup-option-host.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-alternate.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 15%,transparent)}}.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}:is(.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-primary-darkest-surface))}@supports (color: color-mix(in lab,red,red)){:is(.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-darkest-surface)) 25%,transparent)}}.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-lightest-surface)) 80%,transparent)}}:is(.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-primary-darkest-surface))}@supports (color: color-mix(in lab,red,red)){:is(.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-darkest-surface)) 40%,transparent)}}.ax-lookup-option-host .ax-lookup-checkbox{pointer-events:none;width:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 4);flex-shrink:0;accent-color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-option-host .ax-lookup-option-loading{width:100%;padding-inline:calc(var(--spacing, .25rem) * 3);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host .ax-lookup-option-loading{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 50%,transparent)}}.ax-lookup-option{justify-content:space-between}.ax-lookup-option-host.ax-state-selected,.ax-lookup-option.ax-state-selected{color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-lookup-option-host.ax-state-selected .ax-lookup-option-text,.ax-lookup-option-host.ax-state-selected .ax-lookup-option-check,.ax-lookup-option-host.ax-state-selected ax-icon{color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-lookup-option-text{min-width:calc(var(--spacing, .25rem) * 0);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-lookup-option-check{margin-inline-start:auto;flex-shrink:0;color:rgba(var(--ax-sys-color-primary-surface))!important}ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree{display:block;min-height:calc(var(--spacing, .25rem) * 0);width:100%}:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) .ax-lookup-multi-column-table,:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) ax-data-table{height:100%;min-height:calc(var(--spacing, .25rem) * 0);border-style:var(--tw-border-style)!important;border-width:0px!important}:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) tr.ax-state-selected{background-color:rgba(var(--ax-sys-color-primary-surface))}@supports (color: color-mix(in lab,red,red)){:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) tr.ax-state-selected{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-surface)) 10%,transparent)}}:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) tr.ax-state-disabled{pointer-events:none;opacity:50%}.ax-lookup-tree{max-height:calc(var(--spacing, .25rem) * 80);overflow:auto;padding:calc(var(--spacing, .25rem) * 2)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-leading: initial;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AXChipsComponent, selector: "ax-chips", inputs: ["tabIndex", "color", "look", "text"], outputs: ["textChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i1$1.AXDecoratorClearButtonComponent, selector: "ax-clear-button", inputs: ["icon"] }, { kind: "component", type: i1$1.AXDecoratorCloseButtonComponent, selector: "ax-close-button", inputs: ["closeAll", "icon"] }, { kind: "component", type: i1$1.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "component", type: AXPopoverComponent, selector: "ax-popover", inputs: ["width", "disablePanelClass", "visualContextScope", "disabled", "offsetX", "offsetY", "target", "placement", "content", "openOn", "closeOn", "hasBackdrop", "openAfter", "closeAfter", "closeOnScroll", "backdropClass", "panelClass", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "component", type: AXSearchBoxComponent, selector: "ax-search-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "value", "state", "name", "id", "look", "class", "delayTime", "type", "autoSearch"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onKeyDown", "onKeyUp", "onKeyPress"] }, { kind: "component", type: AXLookupDropDownListComponent, selector: "ax-lookup-drop-down-list" }, { kind: "component", type: AXLookupMultiSelectComponent, selector: "ax-lookup-multi-select" }, { kind: "component", type: AXLookupDropDownTreeComponent, selector: "ax-lookup-drop-down-tree", inputs: ["dataSource", "valueField", "textField", "disabledField", "selectedValues", "nodeTemplate"], outputs: ["itemClick"] }, { kind: "component", type: AXLookupMultiSelectTreeComponent, selector: "ax-lookup-multi-select-tree", inputs: ["dataSource", "valueField", "textField", "disabledField", "selectedValues", "selectionBehavior", "nodeTemplate"], outputs: ["selectionChange"] }, { kind: "component", type: AXLookupMultiColumnComponent, selector: "ax-lookup-multi-column", inputs: ["dataSource", "valueField", "textField", "disabledField", "selectedValues", "itemHeight", "maxVisibleItems", "columns", "itemTemplate", "emptyTemplate", "loadingTemplate", "alternate"], outputs: ["itemClick"] }, { kind: "component", type: AXLookupMultiColumnTreeComponent, selector: "ax-lookup-multi-column-tree", inputs: ["dataSource", "valueField", "textField", "disabledField", "parentField", "hasChildrenField", "selectedValues", "itemHeight", "maxVisibleItems", "columns", "itemTemplate", "emptyTemplate", "loadingTemplate", "alternate"], outputs: ["itemClick"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1772
2431
  }
1773
2432
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupComponent, decorators: [{
1774
2433
  type: Component,
@@ -1779,17 +2438,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1779
2438
  AXChipsComponent,
1780
2439
  AXDecoratorModule,
1781
2440
  AXPopoverComponent,
2441
+ AXSearchBoxComponent,
1782
2442
  AXLookupDropDownListComponent,
1783
2443
  AXLookupMultiSelectComponent,
1784
2444
  AXLookupDropDownTreeComponent,
1785
2445
  AXLookupMultiSelectTreeComponent,
1786
2446
  AXLookupMultiColumnComponent,
2447
+ AXLookupMultiColumnTreeComponent,
1787
2448
  ], providers: [
1788
2449
  { provide: AXComponent, useExisting: AXLookupComponent },
1789
2450
  { provide: AXClearableComponent, useExisting: AXLookupComponent },
1790
2451
  { provide: AXClosableComponent, useExisting: AXLookupComponent },
1791
- ], template: "<div\n #origin\n class=\"ax-editor-container ax-{{ look() }} ax-default\"\n [class.ax-lookup-trigger]=\"!isEditableTrigger()\"\n [class.ax-lookup-trigger-multiple]=\"isMultiple()\"\n [class.ax-state-disabled]=\"disabled()\"\n [class.ax-state-readonly]=\"readonly()\"\n (click)=\"onTriggerClick()\"\n>\n <ng-content select=\"ax-prefix\"></ng-content>\n\n @if (isMultiple()) {\n <div class=\"ax-lookup-chips\">\n @for (item of selectedItems(); track trackSelectedKey(item)) {\n <ax-chips class=\"ax-sm\" color=\"primary\" look=\"twotone\" [text]=\"selectedTemplate() ? '' : getItemText(item)\">\n @if (selectedTemplate()) {\n <ax-prefix>\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n </ax-prefix>\n }\n @if (!disabled() && !readonly()) {\n <ax-suffix>\n <button type=\"button\" tabindex=\"-1\" (click)=\"removeChip($event, item)\">\n <span class=\"ax-icon ax-icon-close\"></span>\n </button>\n </ax-suffix>\n }\n </ax-chips>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input ax-lookup-trigger-search\"\n [class.ax-lookup-select-input]=\"!isEditableTrigger()\"\n [placeholder]=\"triggerSearchPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !isEditableTrigger()\"\n [attr.inputmode]=\"isEditableTrigger() ? null : 'none'\"\n [value]=\"searchText()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (beforeinput)=\"onBeforeInput($event)\"\n (focus)=\"emitOnFocus($event)\"\n (blur)=\"emitOnBlur($event)\"\n />\n </div>\n } @else {\n <div class=\"ax-lookup-value\">\n @if (showSelectedTemplate()) {\n <div class=\"ax-lookup-selected-content\" aria-hidden=\"true\">\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: selectedItems()[0] }\"\n />\n </div>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input\"\n [class.ax-lookup-select-input]=\"!isEditableTrigger()\"\n [class.ax-lookup-input-overlay]=\"showSelectedTemplate()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !isEditableTrigger()\"\n [attr.inputmode]=\"isEditableTrigger() ? null : 'none'\"\n [value]=\"searchText()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (beforeinput)=\"onBeforeInput($event)\"\n (focus)=\"emitOnFocus($event)\"\n (blur)=\"emitOnBlur($event)\"\n />\n </div>\n }\n\n @if (selectedValues().length > 0 && !disabled() && !readonly()) {\n <ng-content select=\"ax-clear-button\"></ng-content>\n }\n\n <button\n type=\"button\"\n class=\"ax-general-button-icon\"\n tabindex=\"-1\"\n [disabled]=\"disabled() || readonly()\"\n >\n <span\n class=\"ax-icon\"\n [class.ax-icon-chevron-down]=\"!expanded()\"\n [class.ax-icon-chevron-up]=\"expanded()\"\n ></span>\n </button>\n <ng-content select=\"ax-suffix\"></ng-content>\n</div>\n\n<ax-popover\n [target]=\"origin\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'bottom-start'\"\n [width]=\"isActionsheetStyle() ? '100%' : origin.offsetWidth + 'px'\"\n [adaptivityEnabled]=\"isActionsheetStyle()\"\n [disabled]=\"disabled() || readonly()\"\n (onClosed)=\"onPopoverClosed()\"\n>\n <div class=\"ax-lookup-popup\" [class.ax-is-actionsheet]=\"isActionsheetStyle()\" [class.ax-is-alternate]=\"alternate()\" (keydown.escape)=\"close()\">\n @if (isActionsheetStyle()) {\n <ax-header class=\"ax-solid\">\n <ax-title>{{ caption() || placeholder() || ('@acorex:selectbox.popover.title' | translate | async) }}</ax-title>\n <ax-close-button [icon]=\"isMultiple() ? 'ax-icon ax-icon-check' : 'ax-icon ax-icon-close'\"></ax-close-button>\n </ax-header>\n }\n <ng-content select=\"ax-header\"></ng-content>\n @if (expanded()) {\n @switch (mode()) {\n @case ('drop-down-list') {\n <ax-lookup-drop-down-list\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n (navigateOut)=\"onListNavigateOut($event)\"\n />\n }\n @case ('multi-select') {\n <ax-lookup-multi-select\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleMultiToggle($event)\"\n (navigateOut)=\"onListNavigateOut($event)\"\n />\n }\n @case ('drop-down-tree') {\n <ax-lookup-drop-down-tree\n [dataSource]=\"treeDataSource()!\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [nodeTemplate]=\"$any(itemTemplate())\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n @case ('multi-select-tree') {\n <ax-lookup-multi-select-tree\n [dataSource]=\"treeDataSource()!\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [selectionBehavior]=\"treeSelectionBehavior()\"\n [nodeTemplate]=\"$any(itemTemplate())\"\n (selectionChange)=\"handleTreeSelectionChange($event)\"\n />\n }\n @case ('multi-column') {\n <ax-lookup-multi-column\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [columns]=\"columns()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n }\n }\n <ng-content select=\"ax-footer\"></ng-content>\n </div>\n</ax-popover>\n", styles: ["@layer properties;@layer components{ax-lookup{display:block;width:100%}ax-lookup .ax-editor-container{justify-content:flex-start;gap:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-editor-container.ax-state-disabled{cursor:not-allowed;opacity:50%}ax-lookup .ax-editor-container.ax-state-disabled .ax-input,ax-lookup .ax-editor-container.ax-state-disabled .ax-editor{cursor:not-allowed}ax-lookup .ax-editor-container.ax-state-readonly{opacity:75%}ax-lookup .ax-lookup-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}ax-lookup .ax-lookup-trigger-multiple{height:auto;min-height:calc(var(--spacing, .25rem) * 9);padding-block:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-value{position:relative;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;overflow:hidden}ax-lookup .ax-lookup-select-input{cursor:pointer;caret-color:transparent;-webkit-user-select:none;user-select:none}ax-lookup .ax-lookup-selected-content{pointer-events:none;position:relative;z-index:0;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;overflow:hidden}ax-lookup .ax-lookup-input-overlay{position:absolute;inset:calc(var(--spacing, .25rem) * 0);z-index:10;margin:calc(var(--spacing, .25rem) * 0)!important;height:100%;width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0)!important;color:transparent;caret-color:transparent}ax-lookup .ax-lookup-chips{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-trigger-search{margin:calc(var(--spacing, .25rem) * 0)!important;height:calc(var(--spacing, .25rem) * 7.5);width:auto!important;min-width:calc(var(--spacing, .25rem) * 16);flex:1;flex-basis:calc(var(--spacing, .25rem) * 16)}ax-lookup .ax-lookup-placeholder{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-lookup .ax-lookup-placeholder{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 50%,transparent)}}ax-lookup ax-chips ax-prefix,ax-lookup ax-chips ax-suffix{padding:calc(var(--spacing, .25rem) * 0)!important}ax-lookup ax-chips ax-suffix button{display:flex;cursor:pointer;align-items:center;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0)}.ax-lookup-popup{box-sizing:border-box;display:flex;width:100%;flex-direction:column;overflow:hidden;border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ax-lookup-popup:where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-darkest-surface))}.ax-lookup-popup.ax-is-actionsheet{border-bottom-right-radius:0;border-bottom-left-radius:0;--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-lightest-surface))}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid .ax-icon-check{color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid ax-title{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: calc(var(--spacing, .25rem) * 6);line-height:calc(var(--spacing, .25rem) * 6);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}.ax-lookup-popup>ax-header:not(.ax-solid),.ax-lookup-popup>ax-footer{flex-shrink:0;border-color:rgba(var(--ax-sys-color-border-lightest-surface))}.ax-lookup-popup>ax-header:not(.ax-solid){border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.ax-lookup-popup>ax-footer{border-top-style:var(--tw-border-style);border-top-width:1px}.ax-lookup-viewport{width:100%}.ax-lookup-empty{display:flex;min-height:calc(var(--spacing, .25rem) * 12);width:100%;align-items:center;justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 3);text-align:center;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-empty{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 60%,transparent)}}.ax-lookup-option-host{box-sizing:border-box;cursor:pointer;border-style:var(--tw-border-style);border-width:1px;border-color:transparent;--tw-outline-style: none;outline-style:none}.ax-lookup-option-host.ax-state-alternate{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-alternate{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 5%,transparent)}}.ax-lookup-option-host:hover,.ax-lookup-option-host.ax-state-active{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host:hover,.ax-lookup-option-host.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 10%,transparent)}}.ax-lookup-option-host.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-alternate.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 15%,transparent)}}.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}:is(.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-primary-darkest-surface))}@supports (color: color-mix(in lab,red,red)){:is(.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-darkest-surface)) 25%,transparent)}}.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-lightest-surface)) 80%,transparent)}}:is(.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-primary-darkest-surface))}@supports (color: color-mix(in lab,red,red)){:is(.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-darkest-surface)) 40%,transparent)}}.ax-lookup-option-host.ax-state-disabled{cursor:not-allowed;opacity:50%}.ax-lookup-option-host.ax-lookup-option-host--check{display:flex;align-items:center;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 3)}.ax-lookup-option-host .ax-lookup-checkbox{pointer-events:none;width:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 4);flex-shrink:0;accent-color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-option-host .ax-lookup-option-loading{width:100%;padding-inline:calc(var(--spacing, .25rem) * 3);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host .ax-lookup-option-loading{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 50%,transparent)}}.ax-lookup-option{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--spacing, .25rem) * 2);padding-inline:calc(var(--spacing, .25rem) * 3);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}.ax-lookup-option.ax-state-selected{color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-option .ax-lookup-option-text{min-width:calc(var(--spacing, .25rem) * 0);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-lookup-option .ax-lookup-option-check{flex-shrink:0;color:rgba(var(--ax-sys-color-primary-surface))}ax-lookup-multi-column,.ax-lookup-multi-column{display:block;min-height:calc(var(--spacing, .25rem) * 0);width:100%}:is(ax-lookup-multi-column,.ax-lookup-multi-column) .ax-lookup-multi-column-table,:is(ax-lookup-multi-column,.ax-lookup-multi-column) ax-data-table{height:100%;min-height:calc(var(--spacing, .25rem) * 0);border-style:var(--tw-border-style)!important;border-width:0px!important}:is(ax-lookup-multi-column,.ax-lookup-multi-column) tr.ax-state-selected{background-color:rgba(var(--ax-sys-color-primary-surface))}@supports (color: color-mix(in lab,red,red)){:is(ax-lookup-multi-column,.ax-lookup-multi-column) tr.ax-state-selected{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-surface)) 10%,transparent)}}:is(ax-lookup-multi-column,.ax-lookup-multi-column) tr.ax-state-disabled{pointer-events:none;opacity:50%}.ax-lookup-tree{max-height:calc(var(--spacing, .25rem) * 80);overflow:auto;padding:calc(var(--spacing, .25rem) * 2)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-leading: initial;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
1792
- }], ctorParameters: () => [], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }], treeDataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "treeDataSource", required: false }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], textField: [{ type: i0.Input, args: [{ isSignal: true, alias: "textField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], adaptivityEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "adaptivityEnabled", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], alternate: [{ type: i0.Input, args: [{ isSignal: true, alias: "alternate", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], look: [{ type: i0.Input, args: [{ isSignal: true, alias: "look", required: false }] }, { type: i0.Output, args: ["lookChange"] }], itemHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemHeight", required: false }] }], maxVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisibleItems", required: false }] }], treeSelectionBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "treeSelectionBehavior", required: false }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], selectedTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedTemplate", required: false }] }], emptyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTemplate", required: false }] }], loadingTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingTemplate", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], onValueChanged: [{ type: i0.Output, args: ["onValueChanged"] }], onSelectionChanged: [{ type: i0.Output, args: ["onSelectionChanged"] }], onFocus: [{ type: i0.Output, args: ["onFocus"] }], onBlur: [{ type: i0.Output, args: ["onBlur"] }], onItemClick: [{ type: i0.Output, args: ["onItemClick"] }], onItemSelected: [{ type: i0.Output, args: ["onItemSelected"] }], onOpened: [{ type: i0.Output, args: ["onOpened"] }], onClosed: [{ type: i0.Output, args: ["onClosed"] }], popoverRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPopoverComponent), { isSignal: true }] }], triggerSearchInput: [{ type: i0.ViewChild, args: ['triggerSearchInput', { isSignal: true }] }], listView: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXLookupListViewBase), { isSignal: true }] }] } });
2452
+ { provide: AXValuableComponent, useExisting: AXLookupComponent },
2453
+ ], template: "<div\n #origin\n class=\"ax-editor-container ax-{{ look() }} ax-default\"\n [class.ax-lookup-trigger]=\"!isEditableTrigger()\"\n [class.ax-lookup-trigger-multiple]=\"isMultiple()\"\n [class.ax-state-disabled]=\"disabled()\"\n [class.ax-state-readonly]=\"readonly()\"\n (click)=\"onTriggerClick()\"\n>\n <ng-content select=\"ax-prefix\"></ng-content>\n\n @if (isMultiple()) {\n <div class=\"ax-lookup-chips\">\n @for (item of selectedItems(); track trackSelectedKey(item)) {\n <ax-chips class=\"ax-sm\" color=\"primary\" look=\"twotone\" [text]=\"selectedTemplate() ? '' : getItemText(item)\">\n @if (selectedTemplate()) {\n <ax-prefix>\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: item }\"\n />\n </ax-prefix>\n }\n @if (!disabled() && !readonly()) {\n <ax-suffix>\n <button type=\"button\" tabindex=\"-1\" (click)=\"removeChip($event, item)\">\n <span class=\"ax-icon ax-icon-close\"></span>\n </button>\n </ax-suffix>\n }\n </ax-chips>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input ax-lookup-trigger-search\"\n [class.ax-lookup-select-input]=\"!isEditableTrigger()\"\n [placeholder]=\"triggerSearchPlaceholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !isEditableTrigger()\"\n [attr.inputmode]=\"isEditableTrigger() ? null : 'none'\"\n [value]=\"searchText()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (beforeinput)=\"onBeforeInput($event)\"\n (focus)=\"emitOnFocus($event)\"\n (blur)=\"emitOnBlur($event)\"\n />\n </div>\n } @else {\n <div class=\"ax-lookup-value\">\n @if (showSelectedTemplate()) {\n <div class=\"ax-lookup-selected-content\" aria-hidden=\"true\">\n <ng-container\n [ngTemplateOutlet]=\"selectedTemplate()!\"\n [ngTemplateOutletContext]=\"{ $implicit: selectedItems()[0] }\"\n />\n </div>\n }\n <input\n #triggerSearchInput\n type=\"text\"\n class=\"ax-input\"\n [class.ax-lookup-select-input]=\"!isEditableTrigger()\"\n [class.ax-lookup-input-overlay]=\"showSelectedTemplate()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"disabled()\"\n [readonly]=\"readonly() || !isEditableTrigger()\"\n [attr.inputmode]=\"isEditableTrigger() ? null : 'none'\"\n [value]=\"searchText()\"\n (input)=\"onTriggerSearchInput($any($event.target).value)\"\n (keydown)=\"onTriggerKeydown($event)\"\n (beforeinput)=\"onBeforeInput($event)\"\n (focus)=\"emitOnFocus($event)\"\n (blur)=\"emitOnBlur($event)\"\n />\n </div>\n }\n\n @if (selectedValues().length > 0 && !disabled() && !readonly()) {\n <ng-content select=\"ax-clear-button\"></ng-content>\n }\n\n <button\n type=\"button\"\n class=\"ax-general-button-icon\"\n tabindex=\"-1\"\n [disabled]=\"disabled() || readonly()\"\n >\n <span\n class=\"ax-icon\"\n [class.ax-icon-chevron-down]=\"!expanded()\"\n [class.ax-icon-chevron-up]=\"expanded()\"\n ></span>\n </button>\n <ng-content select=\"ax-suffix\"></ng-content>\n</div>\n\n<ax-popover\n [target]=\"origin\"\n [openOn]=\"'manual'\"\n [closeOn]=\"'clickOut'\"\n [placement]=\"'bottom-start'\"\n [width]=\"isActionsheetStyle() ? '100%' : origin.offsetWidth + 'px'\"\n [adaptivityEnabled]=\"isActionsheetStyle()\"\n [disabled]=\"disabled() || readonly()\"\n (onClosed)=\"onPopoverClosed()\"\n>\n <div class=\"ax-lookup-popup\" [class.ax-is-actionsheet]=\"isActionsheetStyle()\" [class.ax-is-alternate]=\"alternate()\" (keydown.escape)=\"close()\">\n @if (isActionsheetStyle()) {\n <ax-header class=\"ax-solid\">\n <ax-title>{{ caption() || placeholder() || ('@acorex:selectbox.popover.title' | translate | async) }}</ax-title>\n <ax-close-button [icon]=\"isMultiple() ? 'ax-icon ax-icon-check' : 'ax-icon ax-icon-close'\"></ax-close-button>\n </ax-header>\n }\n @if (isSheetSearchEnabled()) {\n <div class=\"ax-lookup-sheet-search\">\n <ax-search-box\n #sheetSearch\n class=\"ax-sm\"\n look=\"fill\"\n [autoSearch]=\"false\"\n [delayTime]=\"0\"\n [placeholder]=\"searchPlaceholder()\"\n (onValueChanged)=\"onSheetSearchInput()\"\n (onKeyUp)=\"onSheetSearchInput()\"\n >\n <ax-clear-button></ax-clear-button>\n </ax-search-box>\n </div>\n }\n <ng-content select=\"ax-header\"></ng-content>\n @if (expanded()) {\n @switch (mode()) {\n @case ('drop-down-list') {\n <ax-lookup-drop-down-list\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n (navigateOut)=\"onListNavigateOut($event)\"\n />\n }\n @case ('multi-select') {\n <ax-lookup-multi-select\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleMultiToggle($event)\"\n (navigateOut)=\"onListNavigateOut($event)\"\n />\n }\n @case ('drop-down-tree') {\n <ax-lookup-drop-down-tree\n [dataSource]=\"resolvedTreeDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [nodeTemplate]=\"$any(itemTemplate())\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n @case ('multi-select-tree') {\n <ax-lookup-multi-select-tree\n [dataSource]=\"resolvedTreeDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [selectionBehavior]=\"treeSelectionBehavior()\"\n [nodeTemplate]=\"$any(itemTemplate())\"\n (selectionChange)=\"handleTreeSelectionChange($event)\"\n />\n }\n @case ('multi-column') {\n <ax-lookup-multi-column\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [columns]=\"columns()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n @case ('multi-column-tree') {\n <ax-lookup-multi-column-tree\n [dataSource]=\"resolvedDataSource()\"\n [valueField]=\"valueField()\"\n [textField]=\"textField()\"\n [disabledField]=\"disabledField()\"\n [parentField]=\"treeParentField()\"\n [hasChildrenField]=\"hasChildrenField()\"\n [selectedValues]=\"selectedValues()\"\n [itemHeight]=\"itemHeight()\"\n [maxVisibleItems]=\"maxVisibleItems()\"\n [columns]=\"columns()\"\n [itemTemplate]=\"itemTemplate()\"\n [emptyTemplate]=\"emptyTemplate()\"\n [loadingTemplate]=\"loadingTemplate()\"\n [alternate]=\"alternate()\"\n (itemClick)=\"handleSinglePick($event)\"\n />\n }\n }\n }\n <ng-content select=\"ax-footer\"></ng-content>\n </div>\n</ax-popover>\n<ng-content select=\"ax-validation-rule\"></ng-content>\n", styles: ["@layer properties;@layer components{ax-lookup{display:block;width:100%}ax-lookup .ax-editor-container{justify-content:flex-start;gap:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-trigger{cursor:pointer;-webkit-user-select:none;user-select:none}ax-lookup .ax-lookup-trigger-multiple{height:auto;min-height:calc(var(--spacing, .25rem) * 9);padding-block:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-value{position:relative;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;overflow:hidden}ax-lookup .ax-lookup-select-input{cursor:pointer;caret-color:transparent;-webkit-user-select:none;user-select:none}ax-lookup .ax-lookup-selected-content{pointer-events:none;position:relative;z-index:0;display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;align-items:center;overflow:hidden}ax-lookup .ax-lookup-input-overlay{position:absolute;inset:calc(var(--spacing, .25rem) * 0);z-index:10;margin:calc(var(--spacing, .25rem) * 0)!important;height:100%;width:100%;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0)!important;color:transparent;caret-color:transparent}ax-lookup .ax-lookup-chips{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-wrap:wrap;align-items:center;gap:calc(var(--spacing, .25rem) * 1)}ax-lookup .ax-lookup-trigger-search{margin:calc(var(--spacing, .25rem) * 0)!important;height:calc(var(--spacing, .25rem) * 7.5);width:auto!important;min-width:calc(var(--spacing, .25rem) * 16);flex:1;flex-basis:calc(var(--spacing, .25rem) * 16)}ax-lookup .ax-lookup-placeholder{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){ax-lookup .ax-lookup-placeholder{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 50%,transparent)}}ax-lookup ax-chips ax-prefix,ax-lookup ax-chips ax-suffix{padding:calc(var(--spacing, .25rem) * 0)!important}ax-lookup ax-chips ax-suffix button{display:flex;cursor:pointer;align-items:center;border-style:var(--tw-border-style);border-width:0px;background-color:transparent;padding:calc(var(--spacing, .25rem) * 0)}.ax-lookup-popup{box-sizing:border-box;display:flex;width:100%;flex-direction:column;overflow:hidden;border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-surface));background-color:rgba(var(--ax-sys-color-lightest-surface));--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / .1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / .1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ax-lookup-popup:where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-darkest-surface))}.ax-lookup-popup.ax-is-actionsheet{border-bottom-right-radius:0;border-bottom-left-radius:0;--tw-shadow: 0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-lightest-surface))}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid .ax-icon-check{color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-popup.ax-is-actionsheet>ax-header.ax-solid ax-title{font-size:var(--text-base, 1rem);line-height:var(--tw-leading, var(--text-base--line-height, 1.5 ));--tw-leading: calc(var(--spacing, .25rem) * 6);line-height:calc(var(--spacing, .25rem) * 6);--tw-font-weight: var(--font-weight-medium, 500);font-weight:var(--font-weight-medium, 500)}.ax-lookup-popup .ax-lookup-sheet-search{flex-shrink:0;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--ax-sys-color-border-lightest-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2)}.ax-lookup-popup>ax-header:not(.ax-solid),.ax-lookup-popup>ax-footer{flex-shrink:0;border-color:rgba(var(--ax-sys-color-border-lightest-surface))}.ax-lookup-popup>ax-header:not(.ax-solid){border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.ax-lookup-popup>ax-footer{border-top-style:var(--tw-border-style);border-top-width:1px}.ax-lookup-viewport{width:100%}.ax-lookup-empty{display:flex;min-height:calc(var(--spacing, .25rem) * 12);width:100%;align-items:center;justify-content:center;padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 3);text-align:center;font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-empty{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 60%,transparent)}}.ax-lookup-option-host{box-sizing:border-box;display:flex;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 2);border-style:var(--tw-border-style);border-width:1px;border-color:transparent;padding-inline:calc(var(--spacing, .25rem) * 3);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface));--tw-outline-style: none;outline-style:none}.ax-lookup-option-host.ax-state-alternate{background-color:rgba(var(--ax-sys-color-light-surface))}.ax-lookup-option-host.ax-state-alternate:where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-surface))}.ax-lookup-option-host:hover,.ax-lookup-option-host.ax-state-active{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host:hover,.ax-lookup-option-host.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 10%,transparent)}}.ax-lookup-option-host.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-alternate.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 15%,transparent)}}.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}:is(.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-primary-darkest-surface))}@supports (color: color-mix(in lab,red,red)){:is(.ax-lookup-option-host.ax-state-selected,.ax-lookup-option-host.ax-state-selected:hover,.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate,.ax-lookup-option-host.ax-state-selected.ax-state-alternate:hover,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-darkest-surface)) 25%,transparent)}}.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:rgba(var(--ax-sys-color-primary-lightest-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-lightest-surface)) 80%,transparent)}}:is(.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:rgba(var(--ax-sys-color-primary-darkest-surface))}@supports (color: color-mix(in lab,red,red)){:is(.ax-lookup-option-host.ax-state-selected.ax-state-active,.ax-lookup-option-host.ax-state-selected.ax-state-alternate.ax-state-active):where(.ax-dark,.ax-dark *):not(:where(.ax-light,.ax-light *)){background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-darkest-surface)) 40%,transparent)}}.ax-lookup-option-host .ax-lookup-checkbox{pointer-events:none;width:calc(var(--spacing, .25rem) * 4);height:calc(var(--spacing, .25rem) * 4);flex-shrink:0;accent-color:rgba(var(--ax-sys-color-primary-surface))}.ax-lookup-option-host .ax-lookup-option-loading{width:100%;padding-inline:calc(var(--spacing, .25rem) * 3);font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));color:rgba(var(--ax-sys-color-on-surface))}@supports (color: color-mix(in lab,red,red)){.ax-lookup-option-host .ax-lookup-option-loading{color:color-mix(in oklab,rgba(var(--ax-sys-color-on-surface)) 50%,transparent)}}.ax-lookup-option{justify-content:space-between}.ax-lookup-option-host.ax-state-selected,.ax-lookup-option.ax-state-selected{color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-lookup-option-host.ax-state-selected .ax-lookup-option-text,.ax-lookup-option-host.ax-state-selected .ax-lookup-option-check,.ax-lookup-option-host.ax-state-selected ax-icon{color:rgba(var(--ax-sys-color-primary-surface))!important}.ax-lookup-option-text{min-width:calc(var(--spacing, .25rem) * 0);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ax-lookup-option-check{margin-inline-start:auto;flex-shrink:0;color:rgba(var(--ax-sys-color-primary-surface))!important}ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree{display:block;min-height:calc(var(--spacing, .25rem) * 0);width:100%}:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) .ax-lookup-multi-column-table,:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) ax-data-table{height:100%;min-height:calc(var(--spacing, .25rem) * 0);border-style:var(--tw-border-style)!important;border-width:0px!important}:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) tr.ax-state-selected{background-color:rgba(var(--ax-sys-color-primary-surface))}@supports (color: color-mix(in lab,red,red)){:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) tr.ax-state-selected{background-color:color-mix(in oklab,rgba(var(--ax-sys-color-primary-surface)) 10%,transparent)}}:is(ax-lookup-multi-column,ax-lookup-multi-column-tree,.ax-lookup-multi-column,.ax-lookup-multi-column-tree) tr.ax-state-disabled{pointer-events:none;opacity:50%}.ax-lookup-tree{max-height:calc(var(--spacing, .25rem) * 80);overflow:auto;padding:calc(var(--spacing, .25rem) * 2)}}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false;}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false;}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false;}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false;}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0px;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000;--tw-leading: initial;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
2454
+ }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }], treeDataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "treeDataSource", required: false }] }], valueField: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueField", required: false }] }], textField: [{ type: i0.Input, args: [{ isSignal: true, alias: "textField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], treeParentField: [{ type: i0.Input, args: [{ isSignal: true, alias: "treeParentField", required: false }] }], hasChildrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasChildrenField", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], adaptivityEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "adaptivityEnabled", required: false }] }], caption: [{ type: i0.Input, args: [{ isSignal: true, alias: "caption", required: false }] }], alternate: [{ type: i0.Input, args: [{ isSignal: true, alias: "alternate", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], look: [{ type: i0.Input, args: [{ isSignal: true, alias: "look", required: false }] }, { type: i0.Output, args: ["lookChange"] }], itemHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemHeight", required: false }] }], maxVisibleItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxVisibleItems", required: false }] }], treeSelectionBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "treeSelectionBehavior", required: false }] }], itemTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemTemplate", required: false }] }], selectedTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedTemplate", required: false }] }], emptyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTemplate", required: false }] }], loadingTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadingTemplate", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], valueItems: [{ type: i0.Input, args: [{ isSignal: true, alias: "valueItems", required: false }] }], onValueChanged: [{ type: i0.Output, args: ["onValueChanged"] }], onSelectionChanged: [{ type: i0.Output, args: ["onSelectionChanged"] }], onFocus: [{ type: i0.Output, args: ["onFocus"] }], onBlur: [{ type: i0.Output, args: ["onBlur"] }], onItemClick: [{ type: i0.Output, args: ["onItemClick"] }], onItemSelected: [{ type: i0.Output, args: ["onItemSelected"] }], onOpened: [{ type: i0.Output, args: ["onOpened"] }], onClosed: [{ type: i0.Output, args: ["onClosed"] }], popoverRef: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXPopoverComponent), { isSignal: true }] }], triggerSearchInput: [{ type: i0.ViewChild, args: ['triggerSearchInput', { isSignal: true }] }], listView: [{ type: i0.ViewChild, args: [i0.forwardRef(() => AXLookupListViewBase), { isSignal: true }] }], sheetSearchRef: [{ type: i0.ViewChild, args: ['sheetSearch', { isSignal: true }] }] } });
1793
2455
 
1794
2456
  class AXLookupModule {
1795
2457
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
@@ -1798,18 +2460,21 @@ class AXLookupModule {
1798
2460
  AXLookupMultiSelectComponent,
1799
2461
  AXLookupDropDownTreeComponent,
1800
2462
  AXLookupMultiSelectTreeComponent,
1801
- AXLookupMultiColumnComponent], exports: [AXLookupComponent,
2463
+ AXLookupMultiColumnComponent,
2464
+ AXLookupMultiColumnTreeComponent], exports: [AXLookupComponent,
1802
2465
  AXLookupDropDownListComponent,
1803
2466
  AXLookupMultiSelectComponent,
1804
2467
  AXLookupDropDownTreeComponent,
1805
2468
  AXLookupMultiSelectTreeComponent,
1806
- AXLookupMultiColumnComponent] }); }
2469
+ AXLookupMultiColumnComponent,
2470
+ AXLookupMultiColumnTreeComponent] }); }
1807
2471
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupModule, imports: [AXLookupComponent,
1808
2472
  AXLookupDropDownListComponent,
1809
2473
  AXLookupMultiSelectComponent,
1810
2474
  AXLookupDropDownTreeComponent,
1811
2475
  AXLookupMultiSelectTreeComponent,
1812
- AXLookupMultiColumnComponent] }); }
2476
+ AXLookupMultiColumnComponent,
2477
+ AXLookupMultiColumnTreeComponent] }); }
1813
2478
  }
1814
2479
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXLookupModule, decorators: [{
1815
2480
  type: NgModule,
@@ -1821,6 +2486,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1821
2486
  AXLookupDropDownTreeComponent,
1822
2487
  AXLookupMultiSelectTreeComponent,
1823
2488
  AXLookupMultiColumnComponent,
2489
+ AXLookupMultiColumnTreeComponent,
1824
2490
  ],
1825
2491
  exports: [
1826
2492
  AXLookupComponent,
@@ -1829,6 +2495,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1829
2495
  AXLookupDropDownTreeComponent,
1830
2496
  AXLookupMultiSelectTreeComponent,
1831
2497
  AXLookupMultiColumnComponent,
2498
+ AXLookupMultiColumnTreeComponent,
1832
2499
  ],
1833
2500
  }]
1834
2501
  }] });
@@ -1837,5 +2504,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1837
2504
  * Generated bundle index. Do not edit.
1838
2505
  */
1839
2506
 
1840
- export { AXLookupComponent, AXLookupDropDownListComponent, AXLookupDropDownTreeComponent, AXLookupModule, AXLookupMultiColumnComponent, AXLookupMultiSelectComponent, AXLookupMultiSelectTreeComponent };
2507
+ export { AXLookupComponent, AXLookupDropDownListComponent, AXLookupDropDownTreeComponent, AXLookupModule, AXLookupMultiColumnComponent, AXLookupMultiColumnTreeComponent, AXLookupMultiSelectComponent, AXLookupMultiSelectTreeComponent };
1841
2508
  //# sourceMappingURL=acorex-components-lookup.mjs.map