@acorex/components 22.1.8 → 22.2.0

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 (27) hide show
  1. package/fesm2022/acorex-components-combo-box.mjs +68 -5
  2. package/fesm2022/acorex-components-combo-box.mjs.map +1 -1
  3. package/fesm2022/{acorex-components-conversation-acorex-components-conversation-Cl_dlCTX.mjs → acorex-components-conversation-acorex-components-conversation-CVgneI8Q.mjs} +8 -8
  4. package/fesm2022/acorex-components-conversation-acorex-components-conversation-CVgneI8Q.mjs.map +1 -0
  5. package/fesm2022/{acorex-components-conversation-picker-rename-file-dialog.component-_F-fv3Ti.mjs → acorex-components-conversation-picker-rename-file-dialog.component-Vc1R5AFc.mjs} +2 -2
  6. package/fesm2022/{acorex-components-conversation-picker-rename-file-dialog.component-_F-fv3Ti.mjs.map → acorex-components-conversation-picker-rename-file-dialog.component-Vc1R5AFc.mjs.map} +1 -1
  7. package/fesm2022/acorex-components-conversation.mjs +1 -1
  8. package/fesm2022/acorex-components-highlight.mjs +80 -0
  9. package/fesm2022/acorex-components-highlight.mjs.map +1 -0
  10. package/fesm2022/acorex-components-kanban.mjs +1 -1
  11. package/fesm2022/acorex-components-kanban.mjs.map +1 -1
  12. package/fesm2022/acorex-components-lookup.mjs +151 -16
  13. package/fesm2022/acorex-components-lookup.mjs.map +1 -1
  14. package/fesm2022/acorex-components-tabs.mjs +116 -38
  15. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  16. package/fesm2022/acorex-components-tree-view.mjs +2 -2
  17. package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
  18. package/fesm2022/acorex-components-wysiwyg.mjs +76 -6
  19. package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
  20. package/highlight/README.md +13 -0
  21. package/package.json +7 -3
  22. package/types/acorex-components-combo-box.d.ts +2 -0
  23. package/types/acorex-components-highlight.d.ts +31 -0
  24. package/types/acorex-components-lookup.d.ts +7 -1
  25. package/types/acorex-components-tabs.d.ts +10 -0
  26. package/types/acorex-components-wysiwyg.d.ts +13 -0
  27. package/fesm2022/acorex-components-conversation-acorex-components-conversation-Cl_dlCTX.mjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { AXDataSource, AXListDataSource, NXValueComponent, AXComponent, AXClearableComponent, AXClosableComponent, AXValuableComponent } from '@acorex/cdk/common';
1
+ import { AXDataSource, retryFrames, scrollNearestIntoView, AXListDataSource, NXValueComponent, AXComponent, AXClearableComponent, AXClosableComponent, AXValuableComponent } from '@acorex/cdk/common';
2
2
  import { AXButtonComponent } from '@acorex/components/button';
3
3
  import { AXChipsComponent } from '@acorex/components/chips';
4
4
  import * as i1$1 from '@acorex/components/decorators';
@@ -9,11 +9,11 @@ import { AXPlatform } from '@acorex/core/platform';
9
9
  import { AXTranslatorPipe, AXTranslationService, toTranslatedSignal } from '@acorex/core/translation';
10
10
  import { NgTemplateOutlet, AsyncPipe, DOCUMENT } from '@angular/common';
11
11
  import * as i0 from '@angular/core';
12
- import { input, output, signal, computed, viewChild, viewChildren, inject, NgZone, effect, untracked, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, DestroyRef, model, booleanAttribute, linkedSignal, afterRenderEffect, NgModule } from '@angular/core';
12
+ import { input, output, signal, computed, viewChild, viewChildren, inject, NgZone, effect, untracked, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component, ElementRef, afterRenderEffect, DestroyRef, model, booleanAttribute, linkedSignal, NgModule } from '@angular/core';
13
13
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
14
14
  import * as i2 from '@acorex/cdk/list-navigation';
15
15
  import { AXListNavigationDirective, AXListNavigationItemDirective, AXListNavigationModule } from '@acorex/cdk/list-navigation';
16
- import { AXHighlightTextComponent } from '@acorex/cdk/highlight';
16
+ import { AXHighlightTextComponent } from '@acorex/components/highlight';
17
17
  import * as i1 from '@angular/cdk/scrolling';
18
18
  import { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';
19
19
  import { AXTreeViewComponent } from '@acorex/components/tree-view';
@@ -215,6 +215,58 @@ function findTreeNode(nodes, valueField, key) {
215
215
  return null;
216
216
  }
217
217
 
218
+ /**
219
+ * Scrolls a CDK virtual viewport so the row at `index` is visible using nearest-edge behavior.
220
+ * Uses offset math because the row may not be rendered in the DOM yet.
221
+ */
222
+ function scrollNearestByOffset(viewport, index, itemHeight, totalCount) {
223
+ const viewportSize = viewport.getViewportSize();
224
+ const maxOffset = Math.max(0, totalCount * itemHeight - viewportSize);
225
+ const itemTop = index * itemHeight;
226
+ const itemBottom = itemTop + itemHeight;
227
+ const currentOffset = viewport.measureScrollOffset();
228
+ if (itemTop < currentOffset) {
229
+ viewport.scrollToOffset(itemTop);
230
+ }
231
+ else if (itemBottom > currentOffset + viewportSize) {
232
+ viewport.scrollToOffset(Math.min(maxOffset, itemBottom - viewportSize));
233
+ }
234
+ }
235
+ /**
236
+ * Scrolls a data-table body so the selected row is visible, accounting for a sticky header.
237
+ */
238
+ function scrollTableToSelectedRow(host, attempts = 5) {
239
+ retryFrames(() => {
240
+ const wrapper = host.querySelector('.ax-data-table-wrapper');
241
+ const row = wrapper?.querySelector('tr.ax-state-selected');
242
+ if (!wrapper || !row) {
243
+ return false;
244
+ }
245
+ const thead = wrapper.querySelector('thead');
246
+ const topInset = thead?.offsetHeight ?? 0;
247
+ scrollNearestIntoView(wrapper, row, topInset);
248
+ return true;
249
+ }, attempts);
250
+ }
251
+ /**
252
+ * Scrolls a lookup tree container so the node with `selectedId` is visible.
253
+ * Nodes inside collapsed branches are not in the DOM and are skipped.
254
+ */
255
+ function scrollTreeToSelectedNode(host, selectedId, attempts = 5) {
256
+ if (!selectedId) {
257
+ return;
258
+ }
259
+ retryFrames(() => {
260
+ const container = host.querySelector('.ax-lookup-tree');
261
+ const node = container?.querySelector(`[data-tree-node-id="${CSS.escape(selectedId)}"]`);
262
+ if (!container || !node) {
263
+ return false;
264
+ }
265
+ scrollNearestIntoView(container, node);
266
+ return true;
267
+ }, attempts);
268
+ }
269
+
218
270
  /**
219
271
  * Shared `AXDataSource` + CDK virtual scroll plumbing for the list-based lookup views
220
272
  * (`ax-lookup-drop-down-list`, `ax-lookup-multi-select`).
@@ -370,10 +422,61 @@ class AXLookupListViewBase {
370
422
  changedSub.unsubscribe();
371
423
  });
372
424
  });
425
+ // Scroll the selected row into view once the virtual viewport and data are ready.
426
+ effect(() => {
427
+ const viewport = this.viewportRef();
428
+ const loading = this.isLoading();
429
+ const count = this.totalCount();
430
+ const values = this.selectedValues();
431
+ const field = this.valueField();
432
+ const height = this.itemHeight();
433
+ const source = this.dataSource();
434
+ if (!viewport || loading || count === 0 || values.length === 0) {
435
+ return;
436
+ }
437
+ untracked(() => {
438
+ requestAnimationFrame(() => {
439
+ viewport.checkViewportSize();
440
+ const index = this.#resolveSelectedIndex(source, values, field);
441
+ if (index >= 0) {
442
+ scrollNearestByOffset(viewport, index, height, count);
443
+ }
444
+ });
445
+ });
446
+ });
447
+ }
448
+ #resolveSelectedIndex(source, values, valueField) {
449
+ const selectedValue = values[0];
450
+ if (selectedValue == null) {
451
+ return -1;
452
+ }
453
+ const items = source.cachedItems;
454
+ for (let index = 0; index < items.length; index++) {
455
+ const item = items[index];
456
+ if (item != null && item[valueField] == selectedValue) {
457
+ return index;
458
+ }
459
+ }
460
+ return -1;
373
461
  }
374
- /** Moves keyboard focus to the first rendered list option. */
462
+ /** Moves keyboard focus to the selected list option, or the first option when none is selected. */
375
463
  focusFirst() {
376
- this.listNavigation()?.focusOnIndex(0);
464
+ const nav = this.listNavigation();
465
+ if (!nav) {
466
+ return;
467
+ }
468
+ const viewport = this.viewportRef();
469
+ const selectedHost = viewport?.elementRef.nativeElement.querySelector('.ax-lookup-option-host.ax-state-selected');
470
+ if (selectedHost) {
471
+ const items = this.navItems();
472
+ const index = items.findIndex((item) => item.itemElem.nativeElement === selectedHost);
473
+ if (index >= 0) {
474
+ nav.activeIndex.set(index);
475
+ nav.navigateTo(items[index]);
476
+ return;
477
+ }
478
+ }
479
+ nav.focusOnIndex(0);
377
480
  }
378
481
  getValue(item) {
379
482
  return item?.[this.valueField()];
@@ -617,7 +720,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
617
720
  * @category Components
618
721
  */
619
722
  class AXLookupDropDownTreeComponent {
723
+ #host;
620
724
  constructor() {
725
+ this.#host = inject((ElementRef));
621
726
  /**
622
727
  * The tree datasource: an array of nodes or a lazy children callback.
623
728
  */
@@ -681,6 +786,13 @@ class AXLookupDropDownTreeComponent {
681
786
  ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
682
787
  this.treeInstances = computed(() => [{ id: this.filterKey(), source: this.dataSource() }], /* @ts-ignore */
683
788
  ...(ngDevMode ? [{ debugName: "treeInstances" }] : /* istanbul ignore next */ []));
789
+ afterRenderEffect(() => {
790
+ const selectedId = this.selectedIds()[0];
791
+ if (!selectedId || this.isEmpty()) {
792
+ return;
793
+ }
794
+ scrollTreeToSelectedNode(this.#host.nativeElement, selectedId);
795
+ });
684
796
  }
685
797
  /** Whether the filtered tree currently has no nodes. */
686
798
  hasNoMatches() {
@@ -727,8 +839,8 @@ class AXLookupDropDownTreeComponent {
727
839
  </div>
728
840
  }
729
841
 
730
- <ng-template #defaultNodeTemplate let-ctx>
731
- <span class="ax-lookup-tree-node-label">{{ ctx.node[textField()] | translate | async }}</span>
842
+ <ng-template #defaultNodeTemplate let-node>
843
+ <span class="ax-lookup-tree-node-label">{{ node?.[textField()] | translate | async }}</span>
732
844
  </ng-template>
733
845
  `, isInline: true, dependencies: [{ kind: "component", type: AXTreeViewComponent, selector: "ax-tree-view", inputs: ["datasource", "selectMode", "selectionBehavior", "dragArea", "dragBehavior", "showIcons", "showChildrenBadge", "expandedIcon", "collapsedIcon", "indentSize", "look", "alternate", "nodeTemplate", "idField", "titleField", "highlightText", "tooltipField", "iconField", "expandedField", "selectedField", "indeterminateField", "disabledField", "hiddenField", "childrenField", "childrenCountField", "dataField", "inheritDisabled", "expandOnDoubleClick", "doubleClickDuration", "tooltipDelay", "controlledSelection", "selectedIds"], outputs: ["datasourceChange", "selectedIdsChange", "onBeforeDrop", "onNodeToggle", "onNodeSelect", "onNodeDoubleClick", "onNodeClick", "onSelectionChange", "onOrderChange", "onMoveChange", "onItemsChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
734
846
  }
@@ -769,12 +881,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
769
881
  </div>
770
882
  }
771
883
 
772
- <ng-template #defaultNodeTemplate let-ctx>
773
- <span class="ax-lookup-tree-node-label">{{ ctx.node[textField()] | translate | async }}</span>
884
+ <ng-template #defaultNodeTemplate let-node>
885
+ <span class="ax-lookup-tree-node-label">{{ node?.[textField()] | translate | async }}</span>
774
886
  </ng-template>
775
887
  `,
776
888
  }]
777
- }], 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 }] }], emptyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTemplate", required: false }] }], alternate: [{ type: i0.Input, args: [{ isSignal: true, alias: "alternate", required: false }] }], filterKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterKey", required: false }] }], highlightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightText", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
889
+ }], ctorParameters: () => [], 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 }] }], emptyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTemplate", required: false }] }], alternate: [{ type: i0.Input, args: [{ isSignal: true, alias: "alternate", required: false }] }], filterKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterKey", required: false }] }], highlightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightText", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
778
890
 
779
891
  /**
780
892
  * Internal mini component for the `multi-column-tree` lookup mode:
@@ -784,7 +896,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
784
896
  * @category Components
785
897
  */
786
898
  class AXLookupMultiColumnTreeComponent {
899
+ #host;
787
900
  constructor() {
901
+ this.#host = inject((ElementRef));
788
902
  /**
789
903
  * The datasource providing hierarchical rows (roots on load, children via `parentField`).
790
904
  */
@@ -891,6 +1005,12 @@ class AXLookupMultiColumnTreeComponent {
891
1005
  }
892
1006
  return classes.join(' ');
893
1007
  };
1008
+ afterRenderEffect(() => {
1009
+ if (this.selectedValues().length === 0) {
1010
+ return;
1011
+ }
1012
+ scrollTableToSelectedRow(this.#host.nativeElement);
1013
+ });
894
1014
  }
895
1015
  /** Stable unique key for `@for` — avoids NG0955 when `field` is missing or duplicated. */
896
1016
  trackColumnKey(index, column) {
@@ -1057,7 +1177,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1057
1177
  </ng-template>
1058
1178
  `,
1059
1179
  }]
1060
- }], 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 }] }], highlightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightText", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
1180
+ }], ctorParameters: () => [], 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 }] }], highlightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightText", required: false }] }], itemClick: [{ type: i0.Output, args: ["itemClick"] }] } });
1061
1181
 
1062
1182
  /**
1063
1183
  * Internal mini component for the `multi-column` lookup mode:
@@ -1197,6 +1317,12 @@ class AXLookupMultiColumnComponent {
1197
1317
  }
1198
1318
  return classes.join(' ');
1199
1319
  };
1320
+ afterRenderEffect(() => {
1321
+ if (this.selectedValues().length === 0 || this.#totalCount() === 0) {
1322
+ return;
1323
+ }
1324
+ scrollTableToSelectedRow(this.#host.nativeElement);
1325
+ });
1200
1326
  effect((onCleanup) => {
1201
1327
  const source = this.dataSource();
1202
1328
  this.tableDataSource.config.key = source.config.key || this.valueField();
@@ -1419,7 +1545,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1419
1545
  * @category Components
1420
1546
  */
1421
1547
  class AXLookupMultiSelectTreeComponent {
1548
+ #host;
1422
1549
  constructor() {
1550
+ this.#host = inject((ElementRef));
1423
1551
  /**
1424
1552
  * The tree datasource: an array of nodes or a lazy children callback.
1425
1553
  */
@@ -1488,6 +1616,13 @@ class AXLookupMultiSelectTreeComponent {
1488
1616
  ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
1489
1617
  this.treeInstances = computed(() => [{ id: this.filterKey(), source: this.dataSource() }], /* @ts-ignore */
1490
1618
  ...(ngDevMode ? [{ debugName: "treeInstances" }] : /* istanbul ignore next */ []));
1619
+ afterRenderEffect(() => {
1620
+ const selectedId = this.selectedIds()[0];
1621
+ if (!selectedId || this.isEmpty()) {
1622
+ return;
1623
+ }
1624
+ scrollTreeToSelectedNode(this.#host.nativeElement, selectedId);
1625
+ });
1491
1626
  }
1492
1627
  /** Whether the filtered tree currently has no nodes. */
1493
1628
  hasNoMatches() {
@@ -1530,8 +1665,8 @@ class AXLookupMultiSelectTreeComponent {
1530
1665
  </div>
1531
1666
  }
1532
1667
 
1533
- <ng-template #defaultNodeTemplate let-ctx>
1534
- <span class="ax-lookup-tree-node-label">{{ ctx.node[textField()] | translate | async }}</span>
1668
+ <ng-template #defaultNodeTemplate let-node>
1669
+ <span class="ax-lookup-tree-node-label">{{ node?.[textField()] | translate | async }}</span>
1535
1670
  </ng-template>
1536
1671
  `, isInline: true, dependencies: [{ kind: "component", type: AXTreeViewComponent, selector: "ax-tree-view", inputs: ["datasource", "selectMode", "selectionBehavior", "dragArea", "dragBehavior", "showIcons", "showChildrenBadge", "expandedIcon", "collapsedIcon", "indentSize", "look", "alternate", "nodeTemplate", "idField", "titleField", "highlightText", "tooltipField", "iconField", "expandedField", "selectedField", "indeterminateField", "disabledField", "hiddenField", "childrenField", "childrenCountField", "dataField", "inheritDisabled", "expandOnDoubleClick", "doubleClickDuration", "tooltipDelay", "controlledSelection", "selectedIds"], outputs: ["datasourceChange", "selectedIdsChange", "onBeforeDrop", "onNodeToggle", "onNodeSelect", "onNodeDoubleClick", "onNodeClick", "onSelectionChange", "onOrderChange", "onMoveChange", "onItemsChange"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: AXTranslatorPipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1537
1672
  }
@@ -1572,12 +1707,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
1572
1707
  </div>
1573
1708
  }
1574
1709
 
1575
- <ng-template #defaultNodeTemplate let-ctx>
1576
- <span class="ax-lookup-tree-node-label">{{ ctx.node[textField()] | translate | async }}</span>
1710
+ <ng-template #defaultNodeTemplate let-node>
1711
+ <span class="ax-lookup-tree-node-label">{{ node?.[textField()] | translate | async }}</span>
1577
1712
  </ng-template>
1578
1713
  `,
1579
1714
  }]
1580
- }], 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 }] }], selectionBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionBehavior", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], emptyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTemplate", required: false }] }], alternate: [{ type: i0.Input, args: [{ isSignal: true, alias: "alternate", required: false }] }], filterKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterKey", required: false }] }], highlightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightText", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
1715
+ }], ctorParameters: () => [], 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 }] }], selectionBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionBehavior", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], emptyTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyTemplate", required: false }] }], alternate: [{ type: i0.Input, args: [{ isSignal: true, alias: "alternate", required: false }] }], filterKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterKey", required: false }] }], highlightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightText", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }] } });
1581
1716
 
1582
1717
  /**
1583
1718
  * Internal mini component for the `multi-select` lookup mode: