@acorex/components 21.0.2-next.5 → 21.0.2-next.50

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 (224) hide show
  1. package/conversation2/README.md +5 -8
  2. package/fesm2022/acorex-components-accordion.mjs +29 -29
  3. package/fesm2022/acorex-components-accordion.mjs.map +1 -1
  4. package/fesm2022/acorex-components-action-sheet.mjs +30 -30
  5. package/fesm2022/acorex-components-action-sheet.mjs.map +1 -1
  6. package/fesm2022/acorex-components-alert.mjs +16 -16
  7. package/fesm2022/acorex-components-alert.mjs.map +1 -1
  8. package/fesm2022/acorex-components-aspect-ratio.mjs +5 -5
  9. package/fesm2022/acorex-components-aspect-ratio.mjs.map +1 -1
  10. package/fesm2022/acorex-components-audio-wave.mjs +11 -11
  11. package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
  12. package/fesm2022/acorex-components-autocomplete.mjs +14 -14
  13. package/fesm2022/acorex-components-autocomplete.mjs.map +1 -1
  14. package/fesm2022/acorex-components-avatar.mjs +17 -16
  15. package/fesm2022/acorex-components-avatar.mjs.map +1 -1
  16. package/fesm2022/acorex-components-badge.mjs +9 -9
  17. package/fesm2022/acorex-components-badge.mjs.map +1 -1
  18. package/fesm2022/acorex-components-bottom-navigation.mjs +14 -14
  19. package/fesm2022/acorex-components-bottom-navigation.mjs.map +1 -1
  20. package/fesm2022/acorex-components-breadcrumbs.mjs +13 -13
  21. package/fesm2022/acorex-components-breadcrumbs.mjs.map +1 -1
  22. package/fesm2022/acorex-components-button-group.mjs +40 -20
  23. package/fesm2022/acorex-components-button-group.mjs.map +1 -1
  24. package/fesm2022/acorex-components-button.mjs +35 -36
  25. package/fesm2022/acorex-components-button.mjs.map +1 -1
  26. package/fesm2022/acorex-components-calendar.mjs +256 -54
  27. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  28. package/fesm2022/acorex-components-check-box.mjs +10 -10
  29. package/fesm2022/acorex-components-check-box.mjs.map +1 -1
  30. package/fesm2022/acorex-components-chips.mjs +9 -9
  31. package/fesm2022/acorex-components-chips.mjs.map +1 -1
  32. package/fesm2022/acorex-components-circular-progress.mjs +13 -13
  33. package/fesm2022/acorex-components-circular-progress.mjs.map +1 -1
  34. package/fesm2022/acorex-components-code-editor.mjs +27 -27
  35. package/fesm2022/acorex-components-code-editor.mjs.map +1 -1
  36. package/fesm2022/acorex-components-color-box.mjs +14 -14
  37. package/fesm2022/acorex-components-color-box.mjs.map +1 -1
  38. package/fesm2022/acorex-components-color-palette.mjs +84 -43
  39. package/fesm2022/acorex-components-color-palette.mjs.map +1 -1
  40. package/fesm2022/acorex-components-command.mjs +19 -19
  41. package/fesm2022/acorex-components-command.mjs.map +1 -1
  42. package/fesm2022/acorex-components-comment.mjs +35 -35
  43. package/fesm2022/acorex-components-comment.mjs.map +1 -1
  44. package/fesm2022/acorex-components-conversation.mjs +105 -105
  45. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  46. package/fesm2022/acorex-components-conversation2.mjs +11165 -8111
  47. package/fesm2022/acorex-components-conversation2.mjs.map +1 -1
  48. package/fesm2022/acorex-components-cron-job.mjs +51 -51
  49. package/fesm2022/acorex-components-cron-job.mjs.map +1 -1
  50. package/fesm2022/acorex-components-data-list.mjs +31 -31
  51. package/fesm2022/acorex-components-data-list.mjs.map +1 -1
  52. package/fesm2022/acorex-components-data-pager.mjs +93 -104
  53. package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
  54. package/fesm2022/acorex-components-data-table.mjs +69 -57
  55. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  56. package/fesm2022/acorex-components-datetime-box.mjs +174 -39
  57. package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
  58. package/fesm2022/acorex-components-datetime-input.mjs +30 -38
  59. package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
  60. package/fesm2022/acorex-components-datetime-picker.mjs +62 -55
  61. package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
  62. package/fesm2022/acorex-components-decorators.mjs +39 -39
  63. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  64. package/fesm2022/acorex-components-dialog.mjs +19 -26
  65. package/fesm2022/acorex-components-dialog.mjs.map +1 -1
  66. package/fesm2022/acorex-components-drawer.mjs +23 -23
  67. package/fesm2022/acorex-components-drawer.mjs.map +1 -1
  68. package/fesm2022/acorex-components-dropdown-button.mjs +9 -9
  69. package/fesm2022/acorex-components-dropdown.mjs +19 -19
  70. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  71. package/fesm2022/acorex-components-editor.mjs +12 -12
  72. package/fesm2022/acorex-components-editor.mjs.map +1 -1
  73. package/fesm2022/acorex-components-fab.mjs +15 -15
  74. package/fesm2022/acorex-components-fab.mjs.map +1 -1
  75. package/fesm2022/acorex-components-flow-chart.mjs +74 -58
  76. package/fesm2022/acorex-components-flow-chart.mjs.map +1 -1
  77. package/fesm2022/acorex-components-form.mjs +30 -30
  78. package/fesm2022/acorex-components-form.mjs.map +1 -1
  79. package/fesm2022/acorex-components-grid-layout-builder.mjs +15 -15
  80. package/fesm2022/acorex-components-grid-layout-builder.mjs.map +1 -1
  81. package/fesm2022/acorex-components-image-editor.mjs +87 -87
  82. package/fesm2022/acorex-components-image-editor.mjs.map +1 -1
  83. package/fesm2022/acorex-components-image.mjs +11 -11
  84. package/fesm2022/acorex-components-image.mjs.map +1 -1
  85. package/fesm2022/acorex-components-json-viewer.mjs +12 -12
  86. package/fesm2022/acorex-components-json-viewer.mjs.map +1 -1
  87. package/fesm2022/acorex-components-kanban.mjs +23 -23
  88. package/fesm2022/acorex-components-kanban.mjs.map +1 -1
  89. package/fesm2022/acorex-components-kbd.mjs +15 -15
  90. package/fesm2022/acorex-components-kbd.mjs.map +1 -1
  91. package/fesm2022/acorex-components-label.mjs +9 -9
  92. package/fesm2022/acorex-components-list.mjs +15 -15
  93. package/fesm2022/acorex-components-list.mjs.map +1 -1
  94. package/fesm2022/acorex-components-loading-dialog.mjs +19 -19
  95. package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
  96. package/fesm2022/acorex-components-loading.mjs +21 -21
  97. package/fesm2022/acorex-components-loading.mjs.map +1 -1
  98. package/fesm2022/acorex-components-map.mjs +46 -46
  99. package/fesm2022/acorex-components-map.mjs.map +1 -1
  100. package/fesm2022/acorex-components-media-viewer.mjs +82 -82
  101. package/fesm2022/acorex-components-media-viewer.mjs.map +1 -1
  102. package/fesm2022/acorex-components-menu.mjs +353 -197
  103. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  104. package/fesm2022/{acorex-components-modal-acorex-components-modal-CcXuJ4IW.mjs → acorex-components-modal-acorex-components-modal-JpPBSiVh.mjs} +28 -28
  105. package/fesm2022/{acorex-components-modal-acorex-components-modal-CcXuJ4IW.mjs.map → acorex-components-modal-acorex-components-modal-JpPBSiVh.mjs.map} +1 -1
  106. package/fesm2022/{acorex-components-modal-modal-content.component-DTZu2zbU.mjs → acorex-components-modal-modal-content.component-DKweXQfl.mjs} +39 -39
  107. package/fesm2022/acorex-components-modal-modal-content.component-DKweXQfl.mjs.map +1 -0
  108. package/fesm2022/acorex-components-modal.mjs +1 -1
  109. package/fesm2022/acorex-components-navbar.mjs +8 -8
  110. package/fesm2022/acorex-components-notification.mjs +28 -28
  111. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  112. package/fesm2022/acorex-components-number-box.mjs +61 -23
  113. package/fesm2022/acorex-components-number-box.mjs.map +1 -1
  114. package/fesm2022/acorex-components-otp.mjs +45 -21
  115. package/fesm2022/acorex-components-otp.mjs.map +1 -1
  116. package/fesm2022/acorex-components-page.mjs +10 -10
  117. package/fesm2022/acorex-components-paint.mjs +53 -53
  118. package/fesm2022/acorex-components-paint.mjs.map +1 -1
  119. package/fesm2022/acorex-components-password-box.mjs +28 -28
  120. package/fesm2022/acorex-components-password-box.mjs.map +1 -1
  121. package/fesm2022/acorex-components-pdf-reader.mjs +9 -9
  122. package/fesm2022/acorex-components-pdf-reader.mjs.map +1 -1
  123. package/fesm2022/acorex-components-phone-box.mjs +19 -19
  124. package/fesm2022/acorex-components-phone-box.mjs.map +1 -1
  125. package/fesm2022/acorex-components-picker.mjs +31 -31
  126. package/fesm2022/acorex-components-picker.mjs.map +1 -1
  127. package/fesm2022/acorex-components-popover.mjs +11 -11
  128. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  129. package/fesm2022/acorex-components-popup.mjs +48 -24
  130. package/fesm2022/acorex-components-popup.mjs.map +1 -1
  131. package/fesm2022/acorex-components-progress-bar.mjs +8 -8
  132. package/fesm2022/acorex-components-qrcode.mjs +37 -20
  133. package/fesm2022/acorex-components-qrcode.mjs.map +1 -1
  134. package/fesm2022/acorex-components-query-builder.mjs +15 -14
  135. package/fesm2022/acorex-components-query-builder.mjs.map +1 -1
  136. package/fesm2022/acorex-components-radio.mjs +9 -9
  137. package/fesm2022/acorex-components-rail-navigation.mjs +28 -28
  138. package/fesm2022/acorex-components-rail-navigation.mjs.map +1 -1
  139. package/fesm2022/acorex-components-range-slider.mjs +34 -34
  140. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  141. package/fesm2022/acorex-components-rate-picker.mjs +17 -17
  142. package/fesm2022/acorex-components-rate-picker.mjs.map +1 -1
  143. package/fesm2022/acorex-components-rest-api-generator.mjs +33 -33
  144. package/fesm2022/acorex-components-rest-api-generator.mjs.map +1 -1
  145. package/fesm2022/acorex-components-result.mjs +8 -8
  146. package/fesm2022/acorex-components-routing-progress.mjs +8 -8
  147. package/fesm2022/acorex-components-routing-progress.mjs.map +1 -1
  148. package/fesm2022/acorex-components-rrule.mjs +36 -36
  149. package/fesm2022/acorex-components-rrule.mjs.map +1 -1
  150. package/fesm2022/acorex-components-scheduler-picker.mjs +118 -118
  151. package/fesm2022/acorex-components-scheduler-picker.mjs.map +1 -1
  152. package/fesm2022/acorex-components-scheduler.mjs +398 -326
  153. package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
  154. package/fesm2022/acorex-components-search-box.mjs +9 -9
  155. package/fesm2022/acorex-components-search-box.mjs.map +1 -1
  156. package/fesm2022/acorex-components-select-box.mjs +22 -22
  157. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  158. package/fesm2022/acorex-components-selection-list-2.mjs +12 -12
  159. package/fesm2022/acorex-components-selection-list-2.mjs.map +1 -1
  160. package/fesm2022/acorex-components-selection-list.mjs +11 -11
  161. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  162. package/fesm2022/acorex-components-side-menu.mjs +455 -97
  163. package/fesm2022/acorex-components-side-menu.mjs.map +1 -1
  164. package/fesm2022/acorex-components-skeleton.mjs +8 -8
  165. package/fesm2022/acorex-components-skeleton.mjs.map +1 -1
  166. package/fesm2022/acorex-components-slider.mjs +7 -7
  167. package/fesm2022/acorex-components-sliding-item.mjs +25 -25
  168. package/fesm2022/acorex-components-sliding-item.mjs.map +1 -1
  169. package/fesm2022/acorex-components-step-wizard.mjs +40 -39
  170. package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
  171. package/fesm2022/acorex-components-switch.mjs +12 -12
  172. package/fesm2022/acorex-components-switch.mjs.map +1 -1
  173. package/fesm2022/acorex-components-tabs.mjs +20 -20
  174. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  175. package/fesm2022/acorex-components-tag-box.mjs +19 -19
  176. package/fesm2022/acorex-components-tag-box.mjs.map +1 -1
  177. package/fesm2022/acorex-components-tag.mjs +8 -8
  178. package/fesm2022/acorex-components-tag.mjs.map +1 -1
  179. package/fesm2022/acorex-components-text-area.mjs +9 -9
  180. package/fesm2022/acorex-components-text-area.mjs.map +1 -1
  181. package/fesm2022/acorex-components-text-box.mjs +12 -12
  182. package/fesm2022/acorex-components-text-box.mjs.map +1 -1
  183. package/fesm2022/acorex-components-time-duration.mjs +28 -30
  184. package/fesm2022/acorex-components-time-duration.mjs.map +1 -1
  185. package/fesm2022/acorex-components-time-line.mjs +19 -19
  186. package/fesm2022/acorex-components-time-line.mjs.map +1 -1
  187. package/fesm2022/acorex-components-toast.mjs +26 -26
  188. package/fesm2022/acorex-components-toast.mjs.map +1 -1
  189. package/fesm2022/acorex-components-toolbar.mjs +13 -13
  190. package/fesm2022/acorex-components-toolbar.mjs.map +1 -1
  191. package/fesm2022/acorex-components-tooltip.mjs +27 -18
  192. package/fesm2022/acorex-components-tooltip.mjs.map +1 -1
  193. package/fesm2022/acorex-components-tree-view.mjs +326 -67
  194. package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
  195. package/fesm2022/acorex-components-uploader.mjs +17 -17
  196. package/fesm2022/acorex-components-uploader.mjs.map +1 -1
  197. package/fesm2022/acorex-components-video-player.mjs +8 -8
  198. package/fesm2022/acorex-components-video-player.mjs.map +1 -1
  199. package/fesm2022/acorex-components-wysiwyg.mjs +60 -53
  200. package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
  201. package/package.json +5 -4
  202. package/types/acorex-components-button-group.d.ts +9 -3
  203. package/types/acorex-components-button.d.ts +2 -8
  204. package/types/acorex-components-calendar.d.ts +138 -27
  205. package/types/acorex-components-color-palette.d.ts +2 -0
  206. package/types/acorex-components-conversation2.d.ts +1296 -1256
  207. package/types/acorex-components-data-pager.d.ts +6 -25
  208. package/types/acorex-components-data-table.d.ts +12 -2
  209. package/types/acorex-components-datetime-box.d.ts +79 -8
  210. package/types/acorex-components-datetime-input.d.ts +2 -2
  211. package/types/acorex-components-datetime-picker.d.ts +15 -5
  212. package/types/acorex-components-flow-chart.d.ts +4 -0
  213. package/types/acorex-components-menu.d.ts +101 -36
  214. package/types/acorex-components-number-box.d.ts +9 -0
  215. package/types/acorex-components-otp.d.ts +18 -1
  216. package/types/acorex-components-popup.d.ts +11 -1
  217. package/types/acorex-components-qrcode.d.ts +1 -0
  218. package/types/acorex-components-query-builder.d.ts +1 -1
  219. package/types/acorex-components-scheduler.d.ts +23 -2
  220. package/types/acorex-components-side-menu.d.ts +96 -34
  221. package/types/acorex-components-step-wizard.d.ts +2 -1
  222. package/types/acorex-components-tree-view.d.ts +43 -2
  223. package/types/acorex-components-wysiwyg.d.ts +6 -1
  224. package/fesm2022/acorex-components-modal-modal-content.component-DTZu2zbU.mjs.map +0 -1
@@ -673,10 +673,10 @@ class AXTreeViewService {
673
673
  errors,
674
674
  };
675
675
  }
676
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTreeViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
677
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTreeViewService }); }
676
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXTreeViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
677
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXTreeViewService }); }
678
678
  }
679
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTreeViewService, decorators: [{
679
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXTreeViewService, decorators: [{
680
680
  type: Injectable
681
681
  }] });
682
682
 
@@ -688,61 +688,68 @@ class AXTreeViewComponent {
688
688
  this.destroyRef = inject(DestroyRef);
689
689
  // ==================== Inputs ====================
690
690
  /** Tree data source - can be static array or lazy loading function */
691
- this.datasource = model.required(...(ngDevMode ? [{ debugName: "datasource" }] : []));
691
+ this.datasource = model.required(...(ngDevMode ? [{ debugName: "datasource" }] : /* istanbul ignore next */ []));
692
692
  /** Selection mode: 'single' (click to select) or 'multiple' (checkbox selection). Default: `'single'`. In multiple mode, checkboxes are automatically shown. */
693
- this.selectMode = input('single', ...(ngDevMode ? [{ debugName: "selectMode" }] : []));
693
+ this.selectMode = input('single', ...(ngDevMode ? [{ debugName: "selectMode" }] : /* istanbul ignore next */ []));
694
694
  /** Selection behavior: 'all' (select anything, no special behavior), 'intermediate' (parent indeterminate state when children selected), 'leaf' (only leaf nodes selectable), 'nested' (selecting parent selects all children). Default: `'intermediate'` */
695
- this.selectionBehavior = input('intermediate', ...(ngDevMode ? [{ debugName: "selectionBehavior" }] : []));
695
+ this.selectionBehavior = input('intermediate', ...(ngDevMode ? [{ debugName: "selectionBehavior" }] : /* istanbul ignore next */ []));
696
696
  /** Drag area: 'handler' (drag handle), 'item' (entire item). Default: `'handler'` */
697
- this.dragArea = input('handler', ...(ngDevMode ? [{ debugName: "dragArea" }] : []));
697
+ this.dragArea = input('handler', ...(ngDevMode ? [{ debugName: "dragArea" }] : /* istanbul ignore next */ []));
698
698
  /** Drag behavior: 'none' (disabled), 'order-only' (reorder only), 'move' (move between parents), 'both' (allow both). Default: `'none'` */
699
- this.dragBehavior = input('none', ...(ngDevMode ? [{ debugName: "dragBehavior" }] : []));
699
+ this.dragBehavior = input('none', ...(ngDevMode ? [{ debugName: "dragBehavior" }] : /* istanbul ignore next */ []));
700
700
  /** Whether to show icons. Default: `true` */
701
- this.showIcons = input(true, ...(ngDevMode ? [{ debugName: "showIcons" }] : []));
701
+ this.showIcons = input(true, ...(ngDevMode ? [{ debugName: "showIcons" }] : /* istanbul ignore next */ []));
702
702
  /** Whether to show children count badge. Default: `true` */
703
- this.showChildrenBadge = input(true, ...(ngDevMode ? [{ debugName: "showChildrenBadge" }] : []));
703
+ this.showChildrenBadge = input(true, ...(ngDevMode ? [{ debugName: "showChildrenBadge" }] : /* istanbul ignore next */ []));
704
704
  /** Custom icon for expanded nodes. Default: `'fa-solid fa-chevron-down'` */
705
- this.expandedIcon = input('fa-solid fa-chevron-down', ...(ngDevMode ? [{ debugName: "expandedIcon" }] : []));
705
+ this.expandedIcon = input('fa-solid fa-chevron-down', ...(ngDevMode ? [{ debugName: "expandedIcon" }] : /* istanbul ignore next */ []));
706
706
  /** Custom icon for collapsed nodes. Default: `'fa-solid fa-chevron-right'` */
707
- this.collapsedIcon = input('fa-solid fa-chevron-right', ...(ngDevMode ? [{ debugName: "collapsedIcon" }] : []));
707
+ this.collapsedIcon = input('fa-solid fa-chevron-right', ...(ngDevMode ? [{ debugName: "collapsedIcon" }] : /* istanbul ignore next */ []));
708
708
  /** Indent size in pixels for each level. Default: `16` */
709
- this.indentSize = input(16, ...(ngDevMode ? [{ debugName: "indentSize" }] : []));
709
+ this.indentSize = input(16, ...(ngDevMode ? [{ debugName: "indentSize" }] : /* istanbul ignore next */ []));
710
710
  /** Visual style variant. Default: `'default'` */
711
- this.look = input('default', ...(ngDevMode ? [{ debugName: "look" }] : []));
711
+ this.look = input('default', ...(ngDevMode ? [{ debugName: "look" }] : /* istanbul ignore next */ []));
712
712
  /** Custom template for tree items. Default: `undefined` */
713
- this.nodeTemplate = input(...(ngDevMode ? [undefined, { debugName: "nodeTemplate" }] : []));
713
+ this.nodeTemplate = input(...(ngDevMode ? [undefined, { debugName: "nodeTemplate" }] : /* istanbul ignore next */ []));
714
714
  /** Field name for node ID. Default: `'id'` */
715
- this.idField = input('id', ...(ngDevMode ? [{ debugName: "idField" }] : []));
715
+ this.idField = input('id', ...(ngDevMode ? [{ debugName: "idField" }] : /* istanbul ignore next */ []));
716
716
  /** Field name for node title. Default: `'title'` */
717
- this.titleField = input('title', ...(ngDevMode ? [{ debugName: "titleField" }] : []));
717
+ this.titleField = input('title', ...(ngDevMode ? [{ debugName: "titleField" }] : /* istanbul ignore next */ []));
718
718
  /** Field name for node tooltip. Default: `'tooltip'` */
719
- this.tooltipField = input('tooltip', ...(ngDevMode ? [{ debugName: "tooltipField" }] : []));
719
+ this.tooltipField = input('tooltip', ...(ngDevMode ? [{ debugName: "tooltipField" }] : /* istanbul ignore next */ []));
720
720
  /** Field name for node icon. Default: `'icon'` */
721
- this.iconField = input('icon', ...(ngDevMode ? [{ debugName: "iconField" }] : []));
721
+ this.iconField = input('icon', ...(ngDevMode ? [{ debugName: "iconField" }] : /* istanbul ignore next */ []));
722
722
  /** Field name for expanded state. Default: `'expanded'` */
723
- this.expandedField = input('expanded', ...(ngDevMode ? [{ debugName: "expandedField" }] : []));
723
+ this.expandedField = input('expanded', ...(ngDevMode ? [{ debugName: "expandedField" }] : /* istanbul ignore next */ []));
724
724
  /** Field name for selected state. Default: `'selected'` */
725
- this.selectedField = input('selected', ...(ngDevMode ? [{ debugName: "selectedField" }] : []));
725
+ this.selectedField = input('selected', ...(ngDevMode ? [{ debugName: "selectedField" }] : /* istanbul ignore next */ []));
726
726
  /** Field name for indeterminate state. Default: `'indeterminate'` */
727
- this.indeterminateField = input('indeterminate', ...(ngDevMode ? [{ debugName: "indeterminateField" }] : []));
727
+ this.indeterminateField = input('indeterminate', ...(ngDevMode ? [{ debugName: "indeterminateField" }] : /* istanbul ignore next */ []));
728
728
  /** Field name for disabled state. Default: `'disabled'` */
729
- this.disabledField = input('disabled', ...(ngDevMode ? [{ debugName: "disabledField" }] : []));
729
+ this.disabledField = input('disabled', ...(ngDevMode ? [{ debugName: "disabledField" }] : /* istanbul ignore next */ []));
730
730
  /** Field name for hidden state. Default: `'hidden'` */
731
- this.hiddenField = input('hidden', ...(ngDevMode ? [{ debugName: "hiddenField" }] : []));
731
+ this.hiddenField = input('hidden', ...(ngDevMode ? [{ debugName: "hiddenField" }] : /* istanbul ignore next */ []));
732
732
  /** Field name for children array. Default: `'children'` */
733
- this.childrenField = input('children', ...(ngDevMode ? [{ debugName: "childrenField" }] : []));
733
+ this.childrenField = input('children', ...(ngDevMode ? [{ debugName: "childrenField" }] : /* istanbul ignore next */ []));
734
734
  /** Field name for children count. Default: `'childrenCount'` */
735
- this.childrenCountField = input('childrenCount', ...(ngDevMode ? [{ debugName: "childrenCountField" }] : []));
735
+ this.childrenCountField = input('childrenCount', ...(ngDevMode ? [{ debugName: "childrenCountField" }] : /* istanbul ignore next */ []));
736
736
  /** Field name for custom data. Default: `'data'` */
737
- this.dataField = input('data', ...(ngDevMode ? [{ debugName: "dataField" }] : []));
737
+ this.dataField = input('data', ...(ngDevMode ? [{ debugName: "dataField" }] : /* istanbul ignore next */ []));
738
738
  /** Whether disabled state is inherited from parent nodes. Default: `true`. */
739
- this.inheritDisabled = input(true, ...(ngDevMode ? [{ debugName: "inheritDisabled" }] : []));
739
+ this.inheritDisabled = input(true, ...(ngDevMode ? [{ debugName: "inheritDisabled" }] : /* istanbul ignore next */ []));
740
740
  /** Whether double-click on node content toggles expand/collapse. Default: `true`. */
741
- this.expandOnDoubleClick = input(true, ...(ngDevMode ? [{ debugName: "expandOnDoubleClick" }] : []));
741
+ this.expandOnDoubleClick = input(true, ...(ngDevMode ? [{ debugName: "expandOnDoubleClick" }] : /* istanbul ignore next */ []));
742
742
  /** Duration in milliseconds for detecting double-clicks. Default: `50`. */
743
- this.doubleClickDuration = input(200, ...(ngDevMode ? [{ debugName: "doubleClickDuration" }] : []));
743
+ this.doubleClickDuration = input(200, ...(ngDevMode ? [{ debugName: "doubleClickDuration" }] : /* istanbul ignore next */ []));
744
744
  /** Duration in milliseconds for detecting double-clicks. Default: `50`. */
745
- this.tooltipDelay = input(500, ...(ngDevMode ? [{ debugName: "tooltipDelay" }] : []));
745
+ this.tooltipDelay = input(500, ...(ngDevMode ? [{ debugName: "tooltipDelay" }] : /* istanbul ignore next */ []));
746
+ /**
747
+ * When true, {@link selectedIds} is the source of truth: the tree applies it on load/reload
748
+ * and emits updates on user interaction. Default: `false` (existing imperative API unchanged).
749
+ */
750
+ this.controlledSelection = input(false, ...(ngDevMode ? [{ debugName: "controlledSelection" }] : /* istanbul ignore next */ []));
751
+ /** Selected node ids (two-way). Used when {@link controlledSelection} is true. */
752
+ this.selectedIds = model([], ...(ngDevMode ? [{ debugName: "selectedIds" }] : /* istanbul ignore next */ []));
746
753
  // ==================== Outputs ====================
747
754
  /** Emitted before a drop operation - set canceled to true to prevent drop */
748
755
  this.onBeforeDrop = output();
@@ -765,21 +772,21 @@ class AXTreeViewComponent {
765
772
  this.onItemsChange = output();
766
773
  // ==================== Internal State ====================
767
774
  /** Internal signal for tree nodes */
768
- this.nodes = signal([], ...(ngDevMode ? [{ debugName: "nodes" }] : []));
775
+ this.nodes = signal([], ...(ngDevMode ? [{ debugName: "nodes" }] : /* istanbul ignore next */ []));
769
776
  /** Internal signal for tracking loading state of individual nodes */
770
- this.loadingNodes = signal(new Set(), ...(ngDevMode ? [{ debugName: "loadingNodes" }] : []));
777
+ this.loadingNodes = signal(new Set(), ...(ngDevMode ? [{ debugName: "loadingNodes" }] : /* istanbul ignore next */ []));
771
778
  /** Signal for tracking root/tree-level loading state (used by reloadData) */
772
- this._isLoading = signal(false, ...(ngDevMode ? [{ debugName: "_isLoading" }] : []));
779
+ this._isLoading = signal(false, ...(ngDevMode ? [{ debugName: "_isLoading" }] : /* istanbul ignore next */ []));
773
780
  /** Public readonly signal for tree loading state - can be used in templates */
774
781
  this.isLoading = this._isLoading.asReadonly();
775
782
  /** Currently focused node ID for keyboard navigation */
776
- this.focusedNodeId = signal(null, ...(ngDevMode ? [{ debugName: "focusedNodeId" }] : []));
783
+ this.focusedNodeId = signal(null, ...(ngDevMode ? [{ debugName: "focusedNodeId" }] : /* istanbul ignore next */ []));
777
784
  /** RTL detection signal */
778
- this.isRtl = signal(this.platformService.isRtl(), ...(ngDevMode ? [{ debugName: "isRtl" }] : []));
785
+ this.isRtl = signal(this.platformService.isRtl(), ...(ngDevMode ? [{ debugName: "isRtl" }] : /* istanbul ignore next */ []));
779
786
  /** active node id */
780
- this.activeNodeId = signal(null, ...(ngDevMode ? [{ debugName: "activeNodeId" }] : []));
787
+ this.activeNodeId = signal(null, ...(ngDevMode ? [{ debugName: "activeNodeId" }] : /* istanbul ignore next */ []));
781
788
  /** Computed chevron icons that flip for RTL */
782
- this.directionExpandedIcon = computed(() => this.expandedIcon(), ...(ngDevMode ? [{ debugName: "directionExpandedIcon" }] : []));
789
+ this.directionExpandedIcon = computed(() => this.expandedIcon(), ...(ngDevMode ? [{ debugName: "directionExpandedIcon" }] : /* istanbul ignore next */ []));
783
790
  this.directionCollapsedIcon = computed(() => {
784
791
  const isRtlDirection = this.isRtl();
785
792
  const defaultIcon = this.collapsedIcon();
@@ -790,29 +797,33 @@ class AXTreeViewComponent {
790
797
  return 'fa-solid fa-chevron-right';
791
798
  }
792
799
  return defaultIcon;
793
- }, ...(ngDevMode ? [{ debugName: "directionCollapsedIcon" }] : []));
800
+ }, ...(ngDevMode ? [{ debugName: "directionCollapsedIcon" }] : /* istanbul ignore next */ []));
794
801
  /** Flag to prevent infinite loops when syncing datasource */
795
802
  this.isUpdatingFromDatasource = false;
803
+ /** Bumped when controlled selection changes so stale async sync is ignored. */
804
+ this.selectionSyncRevision = 0;
805
+ /** Prevents selectedIds effect from re-applying when the model was updated from the tree. */
806
+ this.isUpdatingSelectedIdsModel = false;
796
807
  /** Computed to check if datasource is a function */
797
- this.isLazyDataSource = computed(() => typeof this.datasource() === 'function', ...(ngDevMode ? [{ debugName: "isLazyDataSource" }] : []));
808
+ this.isLazyDataSource = computed(() => typeof this.datasource() === 'function', ...(ngDevMode ? [{ debugName: "isLazyDataSource" }] : /* istanbul ignore next */ []));
798
809
  /** Computed: Returns true when selection is restricted to leaf nodes only */
799
- this.isLeafOnlyMode = computed(() => this.selectionBehavior() === 'leaf', ...(ngDevMode ? [{ debugName: "isLeafOnlyMode" }] : []));
810
+ this.isLeafOnlyMode = computed(() => this.selectionBehavior() === 'leaf', ...(ngDevMode ? [{ debugName: "isLeafOnlyMode" }] : /* istanbul ignore next */ []));
800
811
  /** Computed: Returns true when selecting a parent automatically selects all its children */
801
812
  this.cascadesToChildren = computed(() => {
802
813
  const behavior = this.selectionBehavior();
803
814
  return behavior === 'nested' || behavior === 'intermediate-nested';
804
- }, ...(ngDevMode ? [{ debugName: "cascadesToChildren" }] : []));
815
+ }, ...(ngDevMode ? [{ debugName: "cascadesToChildren" }] : /* istanbul ignore next */ []));
805
816
  /** Computed: Returns true when parent nodes show indeterminate state based on children selection */
806
817
  this.hasIntermediateState = computed(() => {
807
818
  const behavior = this.selectionBehavior();
808
819
  return behavior === 'intermediate' || behavior === 'intermediate-nested';
809
- }, ...(ngDevMode ? [{ debugName: "hasIntermediateState" }] : []));
820
+ }, ...(ngDevMode ? [{ debugName: "hasIntermediateState" }] : /* istanbul ignore next */ []));
810
821
  /** Computed: Returns true when drag handle should be shown */
811
822
  this.shouldShowDragHandle = computed(() => {
812
823
  return this.dragArea() === 'handler' && this.dragBehavior() !== 'none';
813
- }, ...(ngDevMode ? [{ debugName: "shouldShowDragHandle" }] : []));
824
+ }, ...(ngDevMode ? [{ debugName: "shouldShowDragHandle" }] : /* istanbul ignore next */ []));
814
825
  /** Signal to track if double-click output has subscribers */
815
- this.hasDoubleClickSubscribers = signal(false, ...(ngDevMode ? [{ debugName: "hasDoubleClickSubscribers" }] : []));
826
+ this.hasDoubleClickSubscribers = signal(false, ...(ngDevMode ? [{ debugName: "hasDoubleClickSubscribers" }] : /* istanbul ignore next */ []));
816
827
  /**
817
828
  * Returns true if double-click output has no subscribers (should disable directive)
818
829
  * Uses a computed signal that checks if EventEmitter has observers
@@ -826,7 +837,7 @@ class AXTreeViewComponent {
826
837
  }
827
838
  // Otherwise, disable if no subscribers
828
839
  return !this.hasDoubleClickSubscribers();
829
- }, ...(ngDevMode ? [{ debugName: "isDoubleClickDisabled" }] : []));
840
+ }, ...(ngDevMode ? [{ debugName: "isDoubleClickDisabled" }] : /* istanbul ignore next */ []));
830
841
  // ==================== Effects ====================
831
842
  /** Effect to handle datasource changes */
832
843
  this.#datasourceEffect = effect(async () => {
@@ -836,6 +847,9 @@ class AXTreeViewComponent {
836
847
  const ds = this.datasource();
837
848
  if (Array.isArray(ds)) {
838
849
  this.nodes.set([...ds]);
850
+ if (this.controlledSelection()) {
851
+ this.scheduleApplySelectedIdsToTree(0);
852
+ }
839
853
  }
840
854
  else if (typeof ds === 'function') {
841
855
  try {
@@ -845,7 +859,20 @@ class AXTreeViewComponent {
845
859
  this.handleError('Failed to load root items', error);
846
860
  }
847
861
  }
848
- }, ...(ngDevMode ? [{ debugName: "#datasourceEffect" }] : []));
862
+ }, ...(ngDevMode ? [{ debugName: "#datasourceEffect" }] : /* istanbul ignore next */ []));
863
+ /** Applies external selectedIds changes to the tree when controlledSelection is enabled. */
864
+ this.#selectedIdsEffect = effect(() => {
865
+ if (!this.controlledSelection()) {
866
+ return;
867
+ }
868
+ const ids = this.selectedIds();
869
+ if (this.isUpdatingSelectedIdsModel) {
870
+ return;
871
+ }
872
+ void ids;
873
+ this.bumpSelectionSyncRevision();
874
+ this.scheduleApplySelectedIdsToTree(0);
875
+ }, ...(ngDevMode ? [{ debugName: "#selectedIdsEffect" }] : /* istanbul ignore next */ []));
849
876
  /** Initialize direction change listener */
850
877
  this.#initDirectionListener = afterNextRender(() => {
851
878
  this.platformService.directionChange
@@ -1023,6 +1050,8 @@ class AXTreeViewComponent {
1023
1050
  // ==================== Effects ====================
1024
1051
  /** Effect to handle datasource changes */
1025
1052
  #datasourceEffect;
1053
+ /** Applies external selectedIds changes to the tree when controlledSelection is enabled. */
1054
+ #selectedIdsEffect;
1026
1055
  /** Initialize direction change listener */
1027
1056
  #initDirectionListener;
1028
1057
  // ==================== Public API ====================
@@ -1060,6 +1089,37 @@ class AXTreeViewComponent {
1060
1089
  this.treeService.collectSelected(this.nodes(), selected, this.selectedField(), this.childrenField());
1061
1090
  return selected;
1062
1091
  }
1092
+ /**
1093
+ * Returns selected node ids (from {@link selectedIds} when controlled, otherwise from tree state).
1094
+ */
1095
+ getSelectedIds() {
1096
+ if (this.controlledSelection()) {
1097
+ return this.normalizeSelectedIdsForMode(this.selectedIds());
1098
+ }
1099
+ return this.normalizeSelectedIdsForMode(this.getSelectedNodes()
1100
+ .map((node) => this.getNodeId(node))
1101
+ .filter(Boolean));
1102
+ }
1103
+ /**
1104
+ * Expands ancestor paths (when provided) and applies selection.
1105
+ * Intended for lazy trees with {@link controlledSelection}.
1106
+ */
1107
+ async selectAndReveal(nodeIds, options) {
1108
+ this.bumpSelectionSyncRevision();
1109
+ const revision = this.selectionSyncRevision;
1110
+ const normalized = this.normalizeSelectedIdsForMode(nodeIds);
1111
+ const paths = options?.ancestorPaths ??
1112
+ normalized.map((id) => {
1113
+ const path = this.getNodePath(id);
1114
+ return path.slice(0, -1);
1115
+ });
1116
+ await this.expandAncestorPaths(paths, revision);
1117
+ if (!this.isSelectionSyncCurrent(revision)) {
1118
+ return;
1119
+ }
1120
+ this.setSelectedIdsModel(normalized);
1121
+ await this.applySelectedIdsToTreeWithRetry(revision);
1122
+ }
1063
1123
  /**
1064
1124
  * Delete selected nodes from the tree
1065
1125
  */
@@ -1069,7 +1129,12 @@ class AXTreeViewComponent {
1069
1129
  this.treeService.updateAllParentStates(this.nodes(), this.hasIntermediateState(), this.childrenField(), this.selectedField(), this.indeterminateField());
1070
1130
  }
1071
1131
  this.refreshNodes();
1072
- this.emitSelectionChange();
1132
+ if (this.controlledSelection()) {
1133
+ this.syncSelectedIdsModelFromTree('programmatic');
1134
+ }
1135
+ else {
1136
+ this.emitSelectionChange('programmatic');
1137
+ }
1073
1138
  }
1074
1139
  /**
1075
1140
  * Select all nodes in the tree (respects disabled state)
@@ -1111,7 +1176,12 @@ class AXTreeViewComponent {
1111
1176
  selectAllNonDisabled(this.nodes());
1112
1177
  }
1113
1178
  this.refreshNodes();
1114
- this.emitSelectionChange();
1179
+ if (this.controlledSelection()) {
1180
+ this.syncSelectedIdsModelFromTree('programmatic');
1181
+ }
1182
+ else {
1183
+ this.emitSelectionChange('programmatic');
1184
+ }
1115
1185
  }
1116
1186
  /**
1117
1187
  * Deselect all nodes in the tree
@@ -1119,7 +1189,12 @@ class AXTreeViewComponent {
1119
1189
  deselectAll() {
1120
1190
  this.treeService.setAllSelection(this.nodes(), false, this.selectedField(), this.indeterminateField(), this.childrenField());
1121
1191
  this.refreshNodes();
1122
- this.emitSelectionChange();
1192
+ if (this.controlledSelection()) {
1193
+ this.syncSelectedIdsModelFromTree('programmatic');
1194
+ }
1195
+ else {
1196
+ this.emitSelectionChange('programmatic');
1197
+ }
1123
1198
  }
1124
1199
  /**
1125
1200
  * Find a node by ID in the tree
@@ -1163,11 +1238,17 @@ class AXTreeViewComponent {
1163
1238
  }
1164
1239
  finally {
1165
1240
  this._isLoading.set(false);
1241
+ if (this.controlledSelection()) {
1242
+ this.scheduleApplySelectedIdsToTree(50);
1243
+ }
1166
1244
  }
1167
1245
  }
1168
1246
  else if (Array.isArray(ds)) {
1169
1247
  // For array datasource, just refresh from the current data
1170
1248
  this.nodes.set([...ds]);
1249
+ if (this.controlledSelection()) {
1250
+ this.scheduleApplySelectedIdsToTree(0);
1251
+ }
1171
1252
  }
1172
1253
  }
1173
1254
  /**
@@ -1323,7 +1404,12 @@ class AXTreeViewComponent {
1323
1404
  node,
1324
1405
  isUserInteraction: false,
1325
1406
  });
1326
- this.emitSelectionChange();
1407
+ if (this.controlledSelection()) {
1408
+ this.syncSelectedIdsModelFromTree('programmatic');
1409
+ }
1410
+ else {
1411
+ this.emitSelectionChange('programmatic');
1412
+ }
1327
1413
  return true;
1328
1414
  }
1329
1415
  /**
@@ -1351,7 +1437,12 @@ class AXTreeViewComponent {
1351
1437
  node,
1352
1438
  isUserInteraction: false,
1353
1439
  });
1354
- this.emitSelectionChange();
1440
+ if (this.controlledSelection()) {
1441
+ this.syncSelectedIdsModelFromTree('programmatic');
1442
+ }
1443
+ else {
1444
+ this.emitSelectionChange('programmatic');
1445
+ }
1355
1446
  return true;
1356
1447
  }
1357
1448
  /**
@@ -1679,13 +1770,172 @@ class AXTreeViewComponent {
1679
1770
  /**
1680
1771
  * Emit selection change event with all selected nodes
1681
1772
  */
1682
- emitSelectionChange() {
1773
+ emitSelectionChange(source = 'programmatic') {
1683
1774
  const selectedNodes = this.getSelectedNodes();
1775
+ const selectedIds = this.normalizeSelectedIdsForMode(selectedNodes.map((node) => this.getNodeId(node)).filter(Boolean));
1684
1776
  this.onSelectionChange.emit({
1685
1777
  component: this,
1686
1778
  selectedNodes,
1779
+ selectedIds,
1780
+ source,
1687
1781
  });
1688
1782
  }
1783
+ //#region ---- Controlled selection ----
1784
+ bumpSelectionSyncRevision() {
1785
+ this.selectionSyncRevision++;
1786
+ if (this.pendingApplySelectedIdsTimeout !== undefined) {
1787
+ clearTimeout(this.pendingApplySelectedIdsTimeout);
1788
+ this.pendingApplySelectedIdsTimeout = undefined;
1789
+ }
1790
+ }
1791
+ isSelectionSyncCurrent(revision) {
1792
+ return revision === this.selectionSyncRevision;
1793
+ }
1794
+ normalizeSelectedIdsForMode(ids) {
1795
+ const filtered = ids.filter((id) => Boolean(id));
1796
+ if (this.selectMode() === 'single') {
1797
+ return filtered.length > 0 ? [filtered[filtered.length - 1]] : [];
1798
+ }
1799
+ return [...filtered];
1800
+ }
1801
+ areSelectedIdsEqual(a, b) {
1802
+ if (a.length !== b.length) {
1803
+ return false;
1804
+ }
1805
+ return a.every((id, index) => id === b[index]);
1806
+ }
1807
+ setSelectedIdsModel(ids) {
1808
+ const normalized = this.normalizeSelectedIdsForMode(ids);
1809
+ if (this.areSelectedIdsEqual(normalized, this.selectedIds())) {
1810
+ return;
1811
+ }
1812
+ this.isUpdatingSelectedIdsModel = true;
1813
+ try {
1814
+ this.selectedIds.set(normalized);
1815
+ }
1816
+ finally {
1817
+ this.isUpdatingSelectedIdsModel = false;
1818
+ }
1819
+ }
1820
+ syncSelectedIdsModelFromTree(source) {
1821
+ if (this.controlledSelection()) {
1822
+ const normalized = this.normalizeSelectedIdsForMode(this.getSelectedNodes()
1823
+ .map((node) => this.getNodeId(node))
1824
+ .filter(Boolean));
1825
+ this.setSelectedIdsModel(normalized);
1826
+ }
1827
+ this.emitSelectionChange(source);
1828
+ }
1829
+ scheduleApplySelectedIdsToTree(delayMs = 0) {
1830
+ if (!this.controlledSelection()) {
1831
+ return;
1832
+ }
1833
+ if (this.pendingApplySelectedIdsTimeout !== undefined) {
1834
+ clearTimeout(this.pendingApplySelectedIdsTimeout);
1835
+ }
1836
+ const revision = this.selectionSyncRevision;
1837
+ this.pendingApplySelectedIdsTimeout = setTimeout(() => {
1838
+ this.pendingApplySelectedIdsTimeout = undefined;
1839
+ if (!this.isSelectionSyncCurrent(revision)) {
1840
+ return;
1841
+ }
1842
+ this.applySelectedIdsToTree(revision);
1843
+ const ids = this.normalizeSelectedIdsForMode(this.selectedIds());
1844
+ const allSynced = ids.length === 0 ||
1845
+ ids.every((id) => {
1846
+ const node = this.findNode(id);
1847
+ return node !== null && this.getNodeSelected(node);
1848
+ });
1849
+ if (!allSynced && ids.length > 0) {
1850
+ this.scheduleApplySelectedIdsToTree(50);
1851
+ }
1852
+ }, delayMs);
1853
+ }
1854
+ applySelectedIdsToTree(revision) {
1855
+ if (!this.isSelectionSyncCurrent(revision) || !this.controlledSelection()) {
1856
+ return;
1857
+ }
1858
+ const ids = this.normalizeSelectedIdsForMode(this.selectedIds());
1859
+ const mode = this.selectMode();
1860
+ if (ids.length === 0 || mode === 'none') {
1861
+ this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());
1862
+ this.refreshNodes();
1863
+ return;
1864
+ }
1865
+ if (mode === 'single') {
1866
+ const id = ids[0];
1867
+ const node = this.findNode(id);
1868
+ if (!node) {
1869
+ return;
1870
+ }
1871
+ if (this.getNodeSelected(node)) {
1872
+ return;
1873
+ }
1874
+ this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());
1875
+ this.setNodeSelected(node, true);
1876
+ this.setNodeIndeterminate(node, false);
1877
+ this.refreshNodes();
1878
+ return;
1879
+ }
1880
+ this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());
1881
+ for (const id of ids) {
1882
+ const node = this.findNode(id);
1883
+ if (!node || !this.canSelectNode(node) || this.isNodeEffectivelyDisabled(node)) {
1884
+ continue;
1885
+ }
1886
+ this.setNodeSelected(node, true);
1887
+ this.setNodeIndeterminate(node, false);
1888
+ const children = this.getNodeChildren(node);
1889
+ if (this.cascadesToChildren() && children && !this.isLeafOnlyMode()) {
1890
+ this.treeService.selectAllChildren(children, true, this.selectedField(), this.indeterminateField(), this.childrenField());
1891
+ }
1892
+ }
1893
+ if (this.hasIntermediateState() && !this.isLeafOnlyMode()) {
1894
+ this.treeService.updateAllParentStates(this.nodes(), this.hasIntermediateState(), this.childrenField(), this.selectedField(), this.indeterminateField());
1895
+ }
1896
+ this.refreshNodes();
1897
+ }
1898
+ async applySelectedIdsToTreeWithRetry(revision) {
1899
+ for (let attempt = 0; attempt < 8; attempt++) {
1900
+ if (!this.isSelectionSyncCurrent(revision)) {
1901
+ return;
1902
+ }
1903
+ this.applySelectedIdsToTree(revision);
1904
+ const ids = this.normalizeSelectedIdsForMode(this.selectedIds());
1905
+ const allSynced = ids.length === 0 ||
1906
+ ids.every((id) => {
1907
+ const node = this.findNode(id);
1908
+ return node !== null && this.getNodeSelected(node);
1909
+ });
1910
+ if (allSynced) {
1911
+ return;
1912
+ }
1913
+ await new Promise((resolve) => setTimeout(resolve, 50));
1914
+ }
1915
+ }
1916
+ async expandAncestorPaths(paths, revision) {
1917
+ const ancestorDepths = new Map();
1918
+ for (const path of paths) {
1919
+ path.forEach((ancestorId, depth) => {
1920
+ const existing = ancestorDepths.get(ancestorId);
1921
+ if (existing === undefined || depth < existing) {
1922
+ ancestorDepths.set(ancestorId, depth);
1923
+ }
1924
+ });
1925
+ }
1926
+ const sortedAncestors = Array.from(ancestorDepths.entries())
1927
+ .sort((a, b) => a[1] - b[1])
1928
+ .map(([id]) => id);
1929
+ for (const ancestorId of sortedAncestors) {
1930
+ if (!this.isSelectionSyncCurrent(revision)) {
1931
+ return;
1932
+ }
1933
+ if (!this.isNodeExpanded(ancestorId)) {
1934
+ await this.expandNode(ancestorId);
1935
+ }
1936
+ }
1937
+ }
1938
+ //#endregion
1689
1939
  // ==================== Event Handlers ====================
1690
1940
  /**
1691
1941
  * Handle node double click
@@ -1768,7 +2018,7 @@ class AXTreeViewComponent {
1768
2018
  node,
1769
2019
  isUserInteraction: event.isUserInteraction,
1770
2020
  });
1771
- this.emitSelectionChange();
2021
+ this.syncSelectedIdsModelFromTree(event.isUserInteraction ? 'user' : 'programmatic');
1772
2022
  }
1773
2023
  /**
1774
2024
  * Handle drop events for tree nodes
@@ -1886,6 +2136,9 @@ class AXTreeViewComponent {
1886
2136
  const result = loadFn();
1887
2137
  const rootNodes = result instanceof Promise ? await result : result;
1888
2138
  this.nodes.set(rootNodes);
2139
+ if (this.controlledSelection()) {
2140
+ this.scheduleApplySelectedIdsToTree(0);
2141
+ }
1889
2142
  }
1890
2143
  catch (error) {
1891
2144
  this.handleError('Failed to load root items', error);
@@ -1934,6 +2187,9 @@ class AXTreeViewComponent {
1934
2187
  return newSet;
1935
2188
  });
1936
2189
  this.refreshNodes();
2190
+ if (this.controlledSelection()) {
2191
+ this.scheduleApplySelectedIdsToTree(0);
2192
+ }
1937
2193
  }
1938
2194
  }
1939
2195
  /**
@@ -1973,6 +2229,9 @@ class AXTreeViewComponent {
1973
2229
  * Handle single selection mode
1974
2230
  */
1975
2231
  handleSingleSelection(node, event) {
2232
+ if (this.controlledSelection()) {
2233
+ this.bumpSelectionSyncRevision();
2234
+ }
1976
2235
  this.treeService.deselectAllNodes(this.nodes(), this.selectedField(), this.indeterminateField(), this.childrenField());
1977
2236
  this.setNodeSelected(node, true);
1978
2237
  this.setNodeIndeterminate(node, false);
@@ -1983,7 +2242,7 @@ class AXTreeViewComponent {
1983
2242
  nativeEvent: event,
1984
2243
  isUserInteraction: true,
1985
2244
  });
1986
- this.emitSelectionChange();
2245
+ this.syncSelectedIdsModelFromTree('user');
1987
2246
  }
1988
2247
  /**
1989
2248
  * Handle multiple selection mode (used internally, but in multiple mode selection is primarily handled by checkboxes)
@@ -2006,7 +2265,7 @@ class AXTreeViewComponent {
2006
2265
  nativeEvent: event,
2007
2266
  isUserInteraction: true,
2008
2267
  });
2009
- this.emitSelectionChange();
2268
+ this.syncSelectedIdsModelFromTree('user');
2010
2269
  }
2011
2270
  /**
2012
2271
  * Get array reference by drop list ID
@@ -2272,7 +2531,7 @@ class AXTreeViewComponent {
2272
2531
  nativeEvent: event,
2273
2532
  isUserInteraction: true,
2274
2533
  });
2275
- this.emitSelectionChange();
2534
+ this.syncSelectedIdsModelFromTree('user');
2276
2535
  }
2277
2536
  /**
2278
2537
  * Handle Enter key selection
@@ -2305,7 +2564,7 @@ class AXTreeViewComponent {
2305
2564
  nativeEvent: event,
2306
2565
  isUserInteraction: true,
2307
2566
  });
2308
- this.emitSelectionChange();
2567
+ this.syncSelectedIdsModelFromTree('user');
2309
2568
  }
2310
2569
  /**
2311
2570
  * Handle Ctrl/Cmd + Enter key selection
@@ -2330,7 +2589,7 @@ class AXTreeViewComponent {
2330
2589
  nativeEvent: event,
2331
2590
  isUserInteraction: true,
2332
2591
  });
2333
- this.emitSelectionChange();
2592
+ this.syncSelectedIdsModelFromTree('user');
2334
2593
  }
2335
2594
  /**
2336
2595
  * Type guard to check if value is an Event
@@ -2349,10 +2608,10 @@ class AXTreeViewComponent {
2349
2608
  console.error(`${message}:`, error);
2350
2609
  }
2351
2610
  }
2352
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTreeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2353
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: AXTreeViewComponent, isStandalone: true, selector: "ax-tree-view", inputs: { datasource: { classPropertyName: "datasource", publicName: "datasource", isSignal: true, isRequired: true, transformFunction: null }, selectMode: { classPropertyName: "selectMode", publicName: "selectMode", isSignal: true, isRequired: false, transformFunction: null }, selectionBehavior: { classPropertyName: "selectionBehavior", publicName: "selectionBehavior", isSignal: true, isRequired: false, transformFunction: null }, dragArea: { classPropertyName: "dragArea", publicName: "dragArea", isSignal: true, isRequired: false, transformFunction: null }, dragBehavior: { classPropertyName: "dragBehavior", publicName: "dragBehavior", isSignal: true, isRequired: false, transformFunction: null }, showIcons: { classPropertyName: "showIcons", publicName: "showIcons", isSignal: true, isRequired: false, transformFunction: null }, showChildrenBadge: { classPropertyName: "showChildrenBadge", publicName: "showChildrenBadge", isSignal: true, isRequired: false, transformFunction: null }, expandedIcon: { classPropertyName: "expandedIcon", publicName: "expandedIcon", isSignal: true, isRequired: false, transformFunction: null }, collapsedIcon: { classPropertyName: "collapsedIcon", publicName: "collapsedIcon", isSignal: true, isRequired: false, transformFunction: null }, indentSize: { classPropertyName: "indentSize", publicName: "indentSize", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, idField: { classPropertyName: "idField", publicName: "idField", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, tooltipField: { classPropertyName: "tooltipField", publicName: "tooltipField", isSignal: true, isRequired: false, transformFunction: null }, iconField: { classPropertyName: "iconField", publicName: "iconField", isSignal: true, isRequired: false, transformFunction: null }, expandedField: { classPropertyName: "expandedField", publicName: "expandedField", isSignal: true, isRequired: false, transformFunction: null }, selectedField: { classPropertyName: "selectedField", publicName: "selectedField", isSignal: true, isRequired: false, transformFunction: null }, indeterminateField: { classPropertyName: "indeterminateField", publicName: "indeterminateField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, hiddenField: { classPropertyName: "hiddenField", publicName: "hiddenField", isSignal: true, isRequired: false, transformFunction: null }, childrenField: { classPropertyName: "childrenField", publicName: "childrenField", isSignal: true, isRequired: false, transformFunction: null }, childrenCountField: { classPropertyName: "childrenCountField", publicName: "childrenCountField", isSignal: true, isRequired: false, transformFunction: null }, dataField: { classPropertyName: "dataField", publicName: "dataField", isSignal: true, isRequired: false, transformFunction: null }, inheritDisabled: { classPropertyName: "inheritDisabled", publicName: "inheritDisabled", isSignal: true, isRequired: false, transformFunction: null }, expandOnDoubleClick: { classPropertyName: "expandOnDoubleClick", publicName: "expandOnDoubleClick", isSignal: true, isRequired: false, transformFunction: null }, doubleClickDuration: { classPropertyName: "doubleClickDuration", publicName: "doubleClickDuration", isSignal: true, isRequired: false, transformFunction: null }, tooltipDelay: { classPropertyName: "tooltipDelay", publicName: "tooltipDelay", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { datasource: "datasourceChange", onBeforeDrop: "onBeforeDrop", onNodeToggle: "onNodeToggle", onNodeSelect: "onNodeSelect", onNodeDoubleClick: "onNodeDoubleClick", onNodeClick: "onNodeClick", onSelectionChange: "onSelectionChange", onOrderChange: "onOrderChange", onMoveChange: "onMoveChange", onItemsChange: "onItemsChange" }, host: { attributes: { "role": "tree", "tabindex": "0" }, listeners: { "keydown": "handleKeyDown($event)", "focus": "onTreeFocus($event)", "blur": "onTreeBlur($event)" }, properties: { "class.ax-tree-view-default": "look() === 'default'", "class.ax-tree-view-card": "look() === 'card'", "class.ax-tree-view-with-line": "look() === 'with-line'", "class.ax-tree-view-rtl": "isRtl", "style.--ax-tree-view-indent-size": "indentSize() + 'px'", "style.--ax-tree-view-line-offset": "(indentSize() / 2) + 'px'", "attr.aria-label": "\"Tree navigation\"" }, classAttribute: "ax-tree-view" }, providers: [AXTreeViewService], ngImport: i0, template: "<!-- Root loading skeleton -->\n@if (isLoading()) {\n <div class=\"ax-tree-view-drop-list\">\n @for (item of [1, 2, 3, 4, 5, 6, 7]; track item) {\n <div class=\"ax-tree-view-node\">\n <div class=\"ax-tree-view-node-content\">\n <ax-skeleton class=\"ax-tree-view-skeleton-toggle\"></ax-skeleton>\n <ax-skeleton class=\"ax-tree-view-skeleton-label\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n}\n\n<!-- Root drop list -->\n<div\n axFocusTrap\n [axDropList]=\"dragBehavior() !== 'none'\"\n [sortingDisabled]=\"false\"\n [id]=\"getListId()\"\n [attr.data-node-id]=\"null\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event)\"\n class=\"ax-tree-view-drop-list\"\n [class.ax-tree-view-card]=\"look() === 'card'\"\n [class.ax-tree-view-with-lines]=\"look() === 'with-line'\"\n [class.ax-tree-view-loading]=\"isLoading()\"\n role=\"group\"\n>\n @for (node of nodes(); track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(0)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [duration]=\"doubleClickDuration()\"\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (onClick)=\"onNodeClickHandle(node, $event)\"\n (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n \u22EE\u22EE\n </span>\n }\n <ax-button\n look=\"link\"\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n @if (nodeTemplate()) {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n (click)=\"$event.stopPropagation()\"\n (pointerdown)=\"$event.stopPropagation()\"\n ></ax-check-box>\n }\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, 0)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipOpenAfter]=\"tooltipDelay()\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n</div>\n\n<!-- Recursive children template -->\n<ng-template #childrenList let-children=\"children\" let-parent=\"parent\" let-level=\"level\">\n <div\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"getListId(parent)\"\n [attr.data-node-id]=\"getNodeId(parent)\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event, parent)\"\n class=\"ax-tree-view-drop-list\"\n role=\"group\"\n >\n @for (node of children; track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(level)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [duration]=\"doubleClickDuration()\"\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (onClick)=\"onNodeClickHandle(node, $event)\"\n (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n \u22EE\u22EE\n </span>\n }\n <ax-button\n look=\"link\"\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n\n @if (nodeTemplate()) {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n (click)=\"$event.stopPropagation()\"\n (pointerdown)=\"$event.stopPropagation()\"\n ></ax-check-box>\n }\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, level)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipOpenAfter]=\"tooltipDelay()\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: level + 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n </div>\n</ng-template>\n", styles: [".ax-tree-view{--ax-comp-tree-view-indent-size:12px;--ax-comp-tree-view-node-hover-bg:rgba(var(--ax-sys-color-surface), .5);--ax-comp-tree-view-node-selected-bg:rgba(var(--ax-sys-color-primary-surface), .2);--ax-comp-tree-view-node-active-bg:rgba(var(--ax-sys-color-surface));--ax-comp-tree-view-node-border-radius:6px;--ax-comp-tree-view-node-margin:.25rem;--ax-comp-tree-view-line-color:rgba(var(--ax-sys-color-on-lightest-surface), .15);--ax-comp-tree-view-drag-preview-opacity:.9;--ax-comp-tree-view-drag-placeholder-bg:rgba(var(--ax-sys-color-on-lightest-surface), .02);--ax-comp-tree-view-drop-active-bg:rgba(var(--ax-sys-color-primary-500), .08);--ax-comp-tree-view-drop-active-outline:rgba(var(--ax-sys-color-primary-500), .3);--ax-comp-tree-view-content-padding:0;--ax-comp-tree-view-content-gap:.5rem;--ax-comp-tree-view-drop-list-min-height:2rem;--ax-comp-tree-view-drag-handle-padding:.25rem;--ax-comp-tree-view-badge-padding:.25rem;--ax-comp-tree-view-expand-toggle-padding:.25rem;--ax-comp-tree-view-outline-offset:2px;--ax-comp-tree-view-outline-offset-negative:-2px;width:100%;display:block}.ax-tree-view-drop-list{min-height:var(--ax-comp-tree-view-drop-list-min-height)}.ax-tree-view-node{margin:var(--ax-comp-tree-view-node-margin) 0;border-radius:var(--ax-comp-tree-view-node-border-radius);cursor:move;position:relative}.ax-tree-view-node:hover:not(.ax-dragging){background:var(--ax-comp-tree-view-node-hover-bg)}.ax-tree-view-node.ax-tree-view-node-selected{background:var(--ax-comp-tree-view-node-selected-bg)}.ax-tree-view-node.ax-dragging{opacity:var(--ax-comp-tree-view-drag-placeholder-opacity);cursor:grabbing!important}.ax-tree-view-node.ax-drag-placeholder{background:var(--ax-comp-tree-view-drag-placeholder-bg)}.ax-drag-preview{opacity:var(--ax-comp-tree-view-drag-preview-opacity)!important;box-shadow:0 4px 12px rgba(var(--ax-sys-color-on-lightest-surface),.2)!important;cursor:grabbing!important;border:2px dashed!important}.ax-tree-view-node-content.ax-drop-list-sorting-active{background:var(--ax-comp-tree-view-drop-active-bg);border-radius:var(--ax-comp-tree-view-node-border-radius);outline:2px dashed var(--ax-comp-tree-view-drop-active-outline);outline-offset:var(--ax-comp-tree-view-outline-offset-negative)}.ax-tree-view-node-content{align-items:center;gap:var(--ax-comp-tree-view-content-gap);padding:var(--ax-comp-tree-view-content-padding);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:var(--ax-comp-tree-view-node-border-radius);outline:none;display:flex}.ax-tree-view-node-content:focus{outline:none}.ax-tree-view-node-content:focus-visible{outline:2px solid rgba(var(--ax-sys-color-primary-500),.8);outline-offset:var(--ax-comp-tree-view-outline-offset);border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-drag-handle{cursor:grab;opacity:.6;padding:var(--ax-comp-tree-view-drag-handle-padding);padding-inline-start:calc(var(--ax-comp-tree-view-drag-handle-padding) * 2)}.ax-tree-view-drag-handle:hover{opacity:1}.ax-tree-view-drag-handle:active{cursor:grabbing}.ax-tree-view-expand-toggle{padding:var(--ax-comp-tree-view-expand-toggle-padding)}.ax-tree-view-expand-toggle:not(.ax-tree-view-has-children){opacity:0;pointer-events:none}.ax-tree-view-toggle-icon{font-size:.75rem}.ax-tree-view-node-icon{flex-shrink:0;font-size:1.125rem}.ax-tree-view-node-label{text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:.875rem;line-height:1rem;overflow:hidden}.ax-tree-view-node-badge{padding:var(--ax-comp-tree-view-badge-padding);padding-inline-end:calc(var(--ax-comp-tree-view-badge-padding) * 1.5)}.ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size,var(--ax-comp-tree-view-indent-size))}.ax-tree-view-node-disabled{opacity:.5;cursor:not-allowed}.ax-tree-view-node-disabled .ax-tree-view-node-content{pointer-events:none}.ax-tree-view-node-disabled .ax-tree-view-expand-toggle{pointer-events:auto;cursor:pointer}.ax-tree-view-node-loading{opacity:.7}.ax-tree-view-card .ax-tree-view-node{border:1px solid rgba(var(--ax-sys-color-border-lightest-surface),1)}.ax-tree-view-card .ax-tree-view-node.ax-tree-view-node-selected{border:1px solid rgba(var(--ax-sys-color-border-surface),1)}.ax-tree-view-with-lines .ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size,var(--ax-comp-tree-view-indent-size));position:relative}.ax-tree-view-with-lines .ax-tree-view-children:before{content:\"\";background:var(--ax-tree-view-line-color,var(--ax-comp-tree-view-line-color));inset-inline-start:var(--ax-tree-view-line-offset,calc(var(--ax-comp-tree-view-indent-size) / 2));width:1px;height:calc(100% - .875rem);position:absolute;top:0}.ax-tree-view-with-lines .ax-tree-view-node{position:relative}.ax-tree-view-with-lines .ax-tree-view-node:before{content:\"\";width:var(--ax-tree-view-line-offset,calc(var(--ax-comp-tree-view-indent-size) / 2));background:var(--ax-tree-view-line-color,var(--ax-comp-tree-view-line-color));inset-inline-start:calc(-1 * var(--ax-tree-view-line-offset,calc(var(--ax-comp-tree-view-indent-size) / 2)));height:1px;position:absolute;top:60%}.ax-tree-view-with-lines>.ax-tree-view-drop-list>.ax-tree-view-node:before,.ax-tree-view-with-lines>.ax-tree-view-node:before{display:none}.ax-tree-view-skeleton-toggle{border-radius:.25rem;min-width:1.5rem;height:1.5rem}.ax-tree-view-skeleton-label{border-radius:.25rem;flex:1;height:1rem}.ax-tree-view-drop-list.ax-tree-view-loading{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: AXDragDirective, selector: "[axDrag]", inputs: ["axDrag", "dragData", "dragDisabled", "dragTransition", "dragElementClone", "dropZoneGroup", "dragStartDelay", "dragResetOnDblClick", "dragLockAxis", "dragClonedTemplate", "dragCursor", "dragBoundary", "dragTransitionDuration"], outputs: ["dragPositionChanged"] }, { kind: "directive", type: AXDragHandleDirective, selector: "[axDragHandle]" }, { kind: "directive", type: AXDropListDirective, selector: "[axDropList]", inputs: ["axDropList", "sortingDisabled", "dropListGroup", "dropListOrientation"], outputs: ["dropListDropped"], exportAs: ["axDropList"] }, { kind: "directive", type: AXDoubleClickDirective, selector: "[axDoubleClick]", inputs: ["duration", "disabled"], outputs: ["onClick", "onDblClick"] }, { kind: "directive", type: AXFocusTrapDirective, selector: "[axFocusTrap]" }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXCheckBoxComponent, selector: "ax-check-box", inputs: ["disabled", "tabIndex", "readonly", "color", "value", "name", "id", "isLoading", "indeterminate"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "directive", type: AXTooltipDirective, selector: "[axTooltip]", inputs: ["axTooltipDisabled", "axTooltip", "axTooltipContext", "axTooltipPlacement", "axTooltipOffsetX", "axTooltipOffsetY", "axTooltipOpenAfter", "axTooltipCloseAfter"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2611
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXTreeViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2612
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: AXTreeViewComponent, isStandalone: true, selector: "ax-tree-view", inputs: { datasource: { classPropertyName: "datasource", publicName: "datasource", isSignal: true, isRequired: true, transformFunction: null }, selectMode: { classPropertyName: "selectMode", publicName: "selectMode", isSignal: true, isRequired: false, transformFunction: null }, selectionBehavior: { classPropertyName: "selectionBehavior", publicName: "selectionBehavior", isSignal: true, isRequired: false, transformFunction: null }, dragArea: { classPropertyName: "dragArea", publicName: "dragArea", isSignal: true, isRequired: false, transformFunction: null }, dragBehavior: { classPropertyName: "dragBehavior", publicName: "dragBehavior", isSignal: true, isRequired: false, transformFunction: null }, showIcons: { classPropertyName: "showIcons", publicName: "showIcons", isSignal: true, isRequired: false, transformFunction: null }, showChildrenBadge: { classPropertyName: "showChildrenBadge", publicName: "showChildrenBadge", isSignal: true, isRequired: false, transformFunction: null }, expandedIcon: { classPropertyName: "expandedIcon", publicName: "expandedIcon", isSignal: true, isRequired: false, transformFunction: null }, collapsedIcon: { classPropertyName: "collapsedIcon", publicName: "collapsedIcon", isSignal: true, isRequired: false, transformFunction: null }, indentSize: { classPropertyName: "indentSize", publicName: "indentSize", isSignal: true, isRequired: false, transformFunction: null }, look: { classPropertyName: "look", publicName: "look", isSignal: true, isRequired: false, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, idField: { classPropertyName: "idField", publicName: "idField", isSignal: true, isRequired: false, transformFunction: null }, titleField: { classPropertyName: "titleField", publicName: "titleField", isSignal: true, isRequired: false, transformFunction: null }, tooltipField: { classPropertyName: "tooltipField", publicName: "tooltipField", isSignal: true, isRequired: false, transformFunction: null }, iconField: { classPropertyName: "iconField", publicName: "iconField", isSignal: true, isRequired: false, transformFunction: null }, expandedField: { classPropertyName: "expandedField", publicName: "expandedField", isSignal: true, isRequired: false, transformFunction: null }, selectedField: { classPropertyName: "selectedField", publicName: "selectedField", isSignal: true, isRequired: false, transformFunction: null }, indeterminateField: { classPropertyName: "indeterminateField", publicName: "indeterminateField", isSignal: true, isRequired: false, transformFunction: null }, disabledField: { classPropertyName: "disabledField", publicName: "disabledField", isSignal: true, isRequired: false, transformFunction: null }, hiddenField: { classPropertyName: "hiddenField", publicName: "hiddenField", isSignal: true, isRequired: false, transformFunction: null }, childrenField: { classPropertyName: "childrenField", publicName: "childrenField", isSignal: true, isRequired: false, transformFunction: null }, childrenCountField: { classPropertyName: "childrenCountField", publicName: "childrenCountField", isSignal: true, isRequired: false, transformFunction: null }, dataField: { classPropertyName: "dataField", publicName: "dataField", isSignal: true, isRequired: false, transformFunction: null }, inheritDisabled: { classPropertyName: "inheritDisabled", publicName: "inheritDisabled", isSignal: true, isRequired: false, transformFunction: null }, expandOnDoubleClick: { classPropertyName: "expandOnDoubleClick", publicName: "expandOnDoubleClick", isSignal: true, isRequired: false, transformFunction: null }, doubleClickDuration: { classPropertyName: "doubleClickDuration", publicName: "doubleClickDuration", isSignal: true, isRequired: false, transformFunction: null }, tooltipDelay: { classPropertyName: "tooltipDelay", publicName: "tooltipDelay", isSignal: true, isRequired: false, transformFunction: null }, controlledSelection: { classPropertyName: "controlledSelection", publicName: "controlledSelection", isSignal: true, isRequired: false, transformFunction: null }, selectedIds: { classPropertyName: "selectedIds", publicName: "selectedIds", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { datasource: "datasourceChange", selectedIds: "selectedIdsChange", onBeforeDrop: "onBeforeDrop", onNodeToggle: "onNodeToggle", onNodeSelect: "onNodeSelect", onNodeDoubleClick: "onNodeDoubleClick", onNodeClick: "onNodeClick", onSelectionChange: "onSelectionChange", onOrderChange: "onOrderChange", onMoveChange: "onMoveChange", onItemsChange: "onItemsChange" }, host: { attributes: { "role": "tree", "tabindex": "0" }, listeners: { "keydown": "handleKeyDown($event)", "focus": "onTreeFocus($event)", "blur": "onTreeBlur($event)" }, properties: { "class.ax-tree-view-default": "look() === 'default'", "class.ax-tree-view-card": "look() === 'card'", "class.ax-tree-view-with-line": "look() === 'with-line'", "class.ax-tree-view-rtl": "isRtl", "style.--ax-tree-view-indent-size": "indentSize() + 'px'", "style.--ax-tree-view-line-offset": "(indentSize() / 2) + 'px'", "attr.aria-label": "\"Tree navigation\"" }, classAttribute: "ax-tree-view" }, providers: [AXTreeViewService], ngImport: i0, template: "<!-- Root loading skeleton -->\n@if (isLoading()) {\n <div class=\"ax-tree-view-drop-list\">\n @for (item of [1, 2, 3, 4, 5, 6, 7]; track item) {\n <div class=\"ax-tree-view-node\">\n <div class=\"ax-tree-view-node-content\">\n <ax-skeleton class=\"ax-tree-view-skeleton-toggle\"></ax-skeleton>\n <ax-skeleton class=\"ax-tree-view-skeleton-label\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n}\n\n<!-- Root drop list -->\n<div\n axFocusTrap\n [axDropList]=\"dragBehavior() !== 'none'\"\n [sortingDisabled]=\"false\"\n [id]=\"getListId()\"\n [attr.data-node-id]=\"null\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event)\"\n class=\"ax-tree-view-drop-list\"\n [class.ax-tree-view-card]=\"look() === 'card'\"\n [class.ax-tree-view-with-lines]=\"look() === 'with-line'\"\n [class.ax-tree-view-loading]=\"isLoading()\"\n role=\"group\"\n>\n @for (node of nodes(); track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(0)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [duration]=\"doubleClickDuration()\"\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (onClick)=\"onNodeClickHandle(node, $event)\"\n (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n \u22EE\u22EE\n </span>\n }\n <ax-button\n look=\"link\"\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n @if (nodeTemplate()) {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n (click)=\"$event.stopPropagation()\"\n (pointerdown)=\"$event.stopPropagation()\"\n ></ax-check-box>\n }\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, 0)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipOpenAfter]=\"tooltipDelay()\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n</div>\n\n<!-- Recursive children template -->\n<ng-template #childrenList let-children=\"children\" let-parent=\"parent\" let-level=\"level\">\n <div\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"getListId(parent)\"\n [attr.data-node-id]=\"getNodeId(parent)\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event, parent)\"\n class=\"ax-tree-view-drop-list\"\n role=\"group\"\n >\n @for (node of children; track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(level)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [duration]=\"doubleClickDuration()\"\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (onClick)=\"onNodeClickHandle(node, $event)\"\n (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n \u22EE\u22EE\n </span>\n }\n <ax-button\n look=\"link\"\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n\n @if (nodeTemplate()) {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n (click)=\"$event.stopPropagation()\"\n (pointerdown)=\"$event.stopPropagation()\"\n ></ax-check-box>\n }\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, level)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipOpenAfter]=\"tooltipDelay()\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: level + 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n </div>\n</ng-template>\n", styles: [".ax-tree-view{--ax-comp-tree-view-indent-size:12px;--ax-comp-tree-view-node-hover-bg:rgba(var(--ax-sys-color-surface), .5);--ax-comp-tree-view-node-selected-bg:rgba(var(--ax-sys-color-primary-surface), .2);--ax-comp-tree-view-node-active-bg:rgba(var(--ax-sys-color-surface));--ax-comp-tree-view-node-border-radius:6px;--ax-comp-tree-view-node-margin:.25rem;--ax-comp-tree-view-line-color:rgba(var(--ax-sys-color-on-lightest-surface), .15);--ax-comp-tree-view-drag-preview-opacity:.9;--ax-comp-tree-view-drag-placeholder-bg:rgba(var(--ax-sys-color-on-lightest-surface), .02);--ax-comp-tree-view-drop-active-bg:rgba(var(--ax-sys-color-primary-500), .08);--ax-comp-tree-view-drop-active-outline:rgba(var(--ax-sys-color-primary-500), .3);--ax-comp-tree-view-content-padding:0;--ax-comp-tree-view-content-gap:.5rem;--ax-comp-tree-view-drop-list-min-height:2rem;--ax-comp-tree-view-drag-handle-padding:.25rem;--ax-comp-tree-view-badge-padding:.25rem;--ax-comp-tree-view-expand-toggle-padding:.25rem;--ax-comp-tree-view-outline-offset:2px;--ax-comp-tree-view-outline-offset-negative:-2px;width:100%;display:block}.ax-tree-view-drop-list{min-height:var(--ax-comp-tree-view-drop-list-min-height)}.ax-tree-view-node{margin:var(--ax-comp-tree-view-node-margin) 0;border-radius:var(--ax-comp-tree-view-node-border-radius);cursor:move;position:relative}.ax-tree-view-node:hover:not(.ax-dragging){background:var(--ax-comp-tree-view-node-hover-bg)}.ax-tree-view-node.ax-tree-view-node-selected{background:var(--ax-comp-tree-view-node-selected-bg)}.ax-tree-view-node.ax-dragging{opacity:var(--ax-comp-tree-view-drag-placeholder-opacity);cursor:grabbing!important}.ax-tree-view-node.ax-drag-placeholder{background:var(--ax-comp-tree-view-drag-placeholder-bg)}.ax-drag-preview{opacity:var(--ax-comp-tree-view-drag-preview-opacity)!important;box-shadow:0 4px 12px rgba(var(--ax-sys-color-on-lightest-surface),.2)!important;cursor:grabbing!important;border:2px dashed!important}.ax-tree-view-node-content.ax-drop-list-sorting-active{background:var(--ax-comp-tree-view-drop-active-bg);border-radius:var(--ax-comp-tree-view-node-border-radius);outline:2px dashed var(--ax-comp-tree-view-drop-active-outline);outline-offset:var(--ax-comp-tree-view-outline-offset-negative)}.ax-tree-view-node-content{align-items:center;gap:var(--ax-comp-tree-view-content-gap);padding:var(--ax-comp-tree-view-content-padding);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:var(--ax-comp-tree-view-node-border-radius);outline:none;display:flex}.ax-tree-view-node-content:focus{outline:none}.ax-tree-view-node-content:focus-visible{outline:2px solid rgba(var(--ax-sys-color-primary-500),.8);outline-offset:var(--ax-comp-tree-view-outline-offset);border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-drag-handle{cursor:grab;opacity:.6;padding:var(--ax-comp-tree-view-drag-handle-padding);padding-inline-start:calc(var(--ax-comp-tree-view-drag-handle-padding) * 2)}.ax-tree-view-drag-handle:hover{opacity:1}.ax-tree-view-drag-handle:active{cursor:grabbing}.ax-tree-view-expand-toggle{padding:var(--ax-comp-tree-view-expand-toggle-padding)}.ax-tree-view-expand-toggle:not(.ax-tree-view-has-children){opacity:0;pointer-events:none}.ax-tree-view-toggle-icon{font-size:.75rem}.ax-tree-view-node-icon{flex-shrink:0;font-size:1.125rem}.ax-tree-view-node-label{text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:.875rem;line-height:1rem;overflow:hidden}.ax-tree-view-node-badge{padding:var(--ax-comp-tree-view-badge-padding);padding-inline-end:calc(var(--ax-comp-tree-view-badge-padding) * 1.5)}.ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size,var(--ax-comp-tree-view-indent-size))}.ax-tree-view-node-disabled{opacity:.5;cursor:not-allowed}.ax-tree-view-node-disabled .ax-tree-view-node-content{pointer-events:none}.ax-tree-view-node-disabled .ax-tree-view-expand-toggle{pointer-events:auto;cursor:pointer}.ax-tree-view-node-loading{opacity:.7}.ax-tree-view-card .ax-tree-view-node{border:1px solid rgba(var(--ax-sys-color-border-lightest-surface),1)}.ax-tree-view-card .ax-tree-view-node.ax-tree-view-node-selected{border:1px solid rgba(var(--ax-sys-color-border-surface),1)}.ax-tree-view-with-lines .ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size,var(--ax-comp-tree-view-indent-size));position:relative}.ax-tree-view-with-lines .ax-tree-view-children:before{content:\"\";background:var(--ax-tree-view-line-color,var(--ax-comp-tree-view-line-color));inset-inline-start:var(--ax-tree-view-line-offset,calc(var(--ax-comp-tree-view-indent-size) / 2));width:1px;height:calc(100% - .875rem);position:absolute;top:0}.ax-tree-view-with-lines .ax-tree-view-node{position:relative}.ax-tree-view-with-lines .ax-tree-view-node:before{content:\"\";width:var(--ax-tree-view-line-offset,calc(var(--ax-comp-tree-view-indent-size) / 2));background:var(--ax-tree-view-line-color,var(--ax-comp-tree-view-line-color));inset-inline-start:calc(-1 * var(--ax-tree-view-line-offset,calc(var(--ax-comp-tree-view-indent-size) / 2)));height:1px;position:absolute;top:60%}.ax-tree-view-with-lines>.ax-tree-view-drop-list>.ax-tree-view-node:before,.ax-tree-view-with-lines>.ax-tree-view-node:before{display:none}.ax-tree-view-skeleton-toggle{border-radius:.25rem;min-width:1.5rem;height:1.5rem}.ax-tree-view-skeleton-label{border-radius:.25rem;flex:1;height:1rem}.ax-tree-view-drop-list.ax-tree-view-loading{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: AXDragDirective, selector: "[axDrag]", inputs: ["axDrag", "dragData", "dragDisabled", "dragTransition", "dragElementClone", "dropZoneGroup", "dragStartDelay", "dragResetOnDblClick", "dragLockAxis", "dragClonedTemplate", "dragCursor", "dragBoundary", "dragTransitionDuration"], outputs: ["dragPositionChanged"] }, { kind: "directive", type: AXDragHandleDirective, selector: "[axDragHandle]" }, { kind: "directive", type: AXDropListDirective, selector: "[axDropList]", inputs: ["axDropList", "sortingDisabled", "dropListGroup", "dropListOrientation"], outputs: ["dropListDropped"], exportAs: ["axDropList"] }, { kind: "directive", type: AXDoubleClickDirective, selector: "[axDoubleClick]", inputs: ["duration", "disabled"], outputs: ["onClick", "onDblClick"] }, { kind: "directive", type: AXFocusTrapDirective, selector: "[axFocusTrap]", inputs: ["axFocusTrapArrowNavigation"] }, { kind: "component", type: AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: AXCheckBoxComponent, selector: "ax-check-box", inputs: ["disabled", "tabIndex", "readonly", "color", "value", "name", "id", "isLoading", "indeterminate"], outputs: ["onBlur", "onFocus", "valueChange", "onValueChanged"] }, { kind: "component", type: AXBadgeComponent, selector: "ax-badge", inputs: ["color", "look", "text"] }, { kind: "component", type: AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }, { kind: "directive", type: AXTooltipDirective, selector: "[axTooltip]", inputs: ["axTooltipDisabled", "axTooltip", "axTooltipContext", "axTooltipPlacement", "axTooltipOffsetX", "axTooltipOffsetY", "axTooltipOpenAfter", "axTooltipCloseAfter"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
2354
2613
  }
2355
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTreeViewComponent, decorators: [{
2614
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXTreeViewComponent, decorators: [{
2356
2615
  type: Component,
2357
2616
  args: [{ selector: 'ax-tree-view', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [AXTreeViewService], imports: [
2358
2617
  CommonModule,
@@ -2384,16 +2643,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2384
2643
  '(focus)': 'onTreeFocus($event)',
2385
2644
  '(blur)': 'onTreeBlur($event)',
2386
2645
  }, template: "<!-- Root loading skeleton -->\n@if (isLoading()) {\n <div class=\"ax-tree-view-drop-list\">\n @for (item of [1, 2, 3, 4, 5, 6, 7]; track item) {\n <div class=\"ax-tree-view-node\">\n <div class=\"ax-tree-view-node-content\">\n <ax-skeleton class=\"ax-tree-view-skeleton-toggle\"></ax-skeleton>\n <ax-skeleton class=\"ax-tree-view-skeleton-label\"></ax-skeleton>\n </div>\n </div>\n }\n </div>\n}\n\n<!-- Root drop list -->\n<div\n axFocusTrap\n [axDropList]=\"dragBehavior() !== 'none'\"\n [sortingDisabled]=\"false\"\n [id]=\"getListId()\"\n [attr.data-node-id]=\"null\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event)\"\n class=\"ax-tree-view-drop-list\"\n [class.ax-tree-view-card]=\"look() === 'card'\"\n [class.ax-tree-view-with-lines]=\"look() === 'with-line'\"\n [class.ax-tree-view-loading]=\"isLoading()\"\n role=\"group\"\n>\n @for (node of nodes(); track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(0)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [duration]=\"doubleClickDuration()\"\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (onClick)=\"onNodeClickHandle(node, $event)\"\n (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n \u22EE\u22EE\n </span>\n }\n <ax-button\n look=\"link\"\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n @if (nodeTemplate()) {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n (click)=\"$event.stopPropagation()\"\n (pointerdown)=\"$event.stopPropagation()\"\n ></ax-check-box>\n }\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, 0)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipOpenAfter]=\"tooltipDelay()\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n</div>\n\n<!-- Recursive children template -->\n<ng-template #childrenList let-children=\"children\" let-parent=\"parent\" let-level=\"level\">\n <div\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"getListId(parent)\"\n [attr.data-node-id]=\"getNodeId(parent)\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDrop($event, parent)\"\n class=\"ax-tree-view-drop-list\"\n role=\"group\"\n >\n @for (node of children; track getNodeId(node)) {\n @if (getNodeHidden(node) !== true) {\n <div\n [axDrag]=\"dragBehavior() !== 'none'\"\n [dragDisabled]=\"isNodeEffectivelyDisabled(node)\"\n [dragData]=\"node\"\n class=\"ax-tree-view-node\"\n [class.ax-tree-view-node-active]=\"activeNodeId() === getNodeId(node)\"\n [class.ax-tree-view-node-selected]=\"getNodeSelected(node)\"\n [class.ax-tree-view-node-disabled]=\"isNodeEffectivelyDisabled(node)\"\n [class.ax-tree-view-node-loading]=\"getNodeLoading(node)\"\n [class.ax-tree-view-node-focused]=\"isNodeFocused(getNodeId(node))\"\n role=\"treeitem\"\n [attr.aria-level]=\"getNodeAriaLevel(level)\"\n [attr.aria-expanded]=\"getNodeAriaExpanded(node)\"\n [attr.aria-selected]=\"getNodeAriaSelected(node)\"\n [attr.aria-disabled]=\"\n isNodeEffectivelyDisabled(node) || (isLeafOnlyMode() && !isLeafNode(node)) ? 'true' : null\n \"\n >\n <div\n class=\"ax-tree-view-node-content\"\n [axDropList]=\"dragBehavior() !== 'none'\"\n [id]=\"'ax-tree-view-node-drop-' + getNodeId(node)\"\n [attr.data-node-id]=\"getNodeId(node)\"\n [attr.data-tree-node-id]=\"getNodeId(node)\"\n [attr.data-drop-type]=\"'onto-node'\"\n dropListGroup=\"ax-tree-view-nodes\"\n (dropListDropped)=\"onDropOntoNode($event, node)\"\n axDoubleClick\n [duration]=\"doubleClickDuration()\"\n [disabled]=\"isDoubleClickDisabledForNode(node)\"\n (onClick)=\"onNodeClickHandle(node, $event)\"\n (onDblClick)=\"onNodeDoubleClickHandle(node, $event)\"\n (focus)=\"onNodeFocus(getNodeId(node))\"\n (blur)=\"focusedNodeId.set(null)\"\n [tabindex]=\"isNodeFocused(getNodeId(node)) ? 0 : -1\"\n >\n @if (shouldShowDragHandle()) {\n <span\n class=\"ax-tree-view-drag-handle\"\n axDragHandle\n title=\"Drag to reorder\"\n (click)=\"$event.stopPropagation()\"\n >\n \u22EE\u22EE\n </span>\n }\n <ax-button\n look=\"link\"\n class=\"ax-tree-view-expand-toggle ax-sm\"\n (onClick)=\"toggleNode(node, $any($event))\"\n (click)=\"$event.stopPropagation()\"\n [class.ax-tree-view-has-children]=\"shouldShowExpandToggle(node)\"\n [class.ax-tree-view-expanded]=\"getNodeExpanded(node)\"\n [disabled]=\"getNodeLoading(node)\"\n [style.visibility]=\"shouldShowExpandToggle(node) ? 'visible' : 'hidden'\"\n >\n @if (getNodeLoading(node)) {\n <ax-icon>\n <i class=\"fa-solid fa-spinner fa-spin ax-tree-view-loading-spinner\"></i>\n </ax-icon>\n } @else {\n <ax-icon>\n <i\n [class]=\"getNodeExpanded(node) ? directionExpandedIcon() : directionCollapsedIcon()\"\n class=\"ax-tree-view-toggle-icon\"\n ></i>\n </ax-icon>\n }\n </ax-button>\n\n @if (nodeTemplate()) {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n (click)=\"$event.stopPropagation()\"\n (pointerdown)=\"$event.stopPropagation()\"\n ></ax-check-box>\n }\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate()!\"\n [ngTemplateOutletContext]=\"getTemplateContext(node, level)\"\n ></ng-container>\n } @else {\n @if (shouldShowCheckboxForNode(node)) {\n <ax-check-box\n class=\"ax-tree-view-checkbox\"\n [ngModel]=\"getNodeIndeterminate(node) ? null : getNodeSelected(node) || false\"\n [indeterminate]=\"getNodeIndeterminate(node) || false\"\n (onValueChanged)=\"toggleSelection(node, $event)\"\n ></ax-check-box>\n }\n @if (showIcons() && getNodeIcon(node)) {\n <i [class]=\"getNodeIcon(node)\" class=\"ax-tree-view-node-icon\"></i>\n }\n <span\n class=\"ax-tree-view-node-label\"\n [axTooltip]=\"getNodeTooltip(node) || ''\"\n [axTooltipOpenAfter]=\"tooltipDelay()\"\n [axTooltipDisabled]=\"!getNodeTooltip(node)\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ getNodeTitle(node) }}\n </span>\n @if (showChildrenBadge() && (getNodeChildrenCount(node) || getNodeChildren(node)?.length)) {\n <span class=\"ax-tree-view-node-badge\">\n <ax-badge\n class=\"ax-tree-view-children-badge\"\n [text]=\"(getNodeChildrenCount(node) ?? getNodeChildren(node)?.length ?? 0).toString()\"\n ></ax-badge>\n </span>\n }\n }\n </div>\n </div>\n @if (getNodeExpanded(node) && getNodeChildren(node)?.length) {\n <div class=\"ax-tree-view-children\" role=\"group\">\n <ng-container\n [ngTemplateOutlet]=\"childrenList\"\n [ngTemplateOutletContext]=\"{ children: getNodeChildren(node), parent: node, level: level + 1 }\"\n ></ng-container>\n </div>\n }\n }\n }\n </div>\n</ng-template>\n", styles: [".ax-tree-view{--ax-comp-tree-view-indent-size:12px;--ax-comp-tree-view-node-hover-bg:rgba(var(--ax-sys-color-surface), .5);--ax-comp-tree-view-node-selected-bg:rgba(var(--ax-sys-color-primary-surface), .2);--ax-comp-tree-view-node-active-bg:rgba(var(--ax-sys-color-surface));--ax-comp-tree-view-node-border-radius:6px;--ax-comp-tree-view-node-margin:.25rem;--ax-comp-tree-view-line-color:rgba(var(--ax-sys-color-on-lightest-surface), .15);--ax-comp-tree-view-drag-preview-opacity:.9;--ax-comp-tree-view-drag-placeholder-bg:rgba(var(--ax-sys-color-on-lightest-surface), .02);--ax-comp-tree-view-drop-active-bg:rgba(var(--ax-sys-color-primary-500), .08);--ax-comp-tree-view-drop-active-outline:rgba(var(--ax-sys-color-primary-500), .3);--ax-comp-tree-view-content-padding:0;--ax-comp-tree-view-content-gap:.5rem;--ax-comp-tree-view-drop-list-min-height:2rem;--ax-comp-tree-view-drag-handle-padding:.25rem;--ax-comp-tree-view-badge-padding:.25rem;--ax-comp-tree-view-expand-toggle-padding:.25rem;--ax-comp-tree-view-outline-offset:2px;--ax-comp-tree-view-outline-offset-negative:-2px;width:100%;display:block}.ax-tree-view-drop-list{min-height:var(--ax-comp-tree-view-drop-list-min-height)}.ax-tree-view-node{margin:var(--ax-comp-tree-view-node-margin) 0;border-radius:var(--ax-comp-tree-view-node-border-radius);cursor:move;position:relative}.ax-tree-view-node:hover:not(.ax-dragging){background:var(--ax-comp-tree-view-node-hover-bg)}.ax-tree-view-node.ax-tree-view-node-selected{background:var(--ax-comp-tree-view-node-selected-bg)}.ax-tree-view-node.ax-dragging{opacity:var(--ax-comp-tree-view-drag-placeholder-opacity);cursor:grabbing!important}.ax-tree-view-node.ax-drag-placeholder{background:var(--ax-comp-tree-view-drag-placeholder-bg)}.ax-drag-preview{opacity:var(--ax-comp-tree-view-drag-preview-opacity)!important;box-shadow:0 4px 12px rgba(var(--ax-sys-color-on-lightest-surface),.2)!important;cursor:grabbing!important;border:2px dashed!important}.ax-tree-view-node-content.ax-drop-list-sorting-active{background:var(--ax-comp-tree-view-drop-active-bg);border-radius:var(--ax-comp-tree-view-node-border-radius);outline:2px dashed var(--ax-comp-tree-view-drop-active-outline);outline-offset:var(--ax-comp-tree-view-outline-offset-negative)}.ax-tree-view-node-content{align-items:center;gap:var(--ax-comp-tree-view-content-gap);padding:var(--ax-comp-tree-view-content-padding);cursor:pointer;-webkit-user-select:none;user-select:none;border-radius:var(--ax-comp-tree-view-node-border-radius);outline:none;display:flex}.ax-tree-view-node-content:focus{outline:none}.ax-tree-view-node-content:focus-visible{outline:2px solid rgba(var(--ax-sys-color-primary-500),.8);outline-offset:var(--ax-comp-tree-view-outline-offset);border-radius:var(--ax-comp-tree-view-node-border-radius)}.ax-tree-view-drag-handle{cursor:grab;opacity:.6;padding:var(--ax-comp-tree-view-drag-handle-padding);padding-inline-start:calc(var(--ax-comp-tree-view-drag-handle-padding) * 2)}.ax-tree-view-drag-handle:hover{opacity:1}.ax-tree-view-drag-handle:active{cursor:grabbing}.ax-tree-view-expand-toggle{padding:var(--ax-comp-tree-view-expand-toggle-padding)}.ax-tree-view-expand-toggle:not(.ax-tree-view-has-children){opacity:0;pointer-events:none}.ax-tree-view-toggle-icon{font-size:.75rem}.ax-tree-view-node-icon{flex-shrink:0;font-size:1.125rem}.ax-tree-view-node-label{text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:.875rem;line-height:1rem;overflow:hidden}.ax-tree-view-node-badge{padding:var(--ax-comp-tree-view-badge-padding);padding-inline-end:calc(var(--ax-comp-tree-view-badge-padding) * 1.5)}.ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size,var(--ax-comp-tree-view-indent-size))}.ax-tree-view-node-disabled{opacity:.5;cursor:not-allowed}.ax-tree-view-node-disabled .ax-tree-view-node-content{pointer-events:none}.ax-tree-view-node-disabled .ax-tree-view-expand-toggle{pointer-events:auto;cursor:pointer}.ax-tree-view-node-loading{opacity:.7}.ax-tree-view-card .ax-tree-view-node{border:1px solid rgba(var(--ax-sys-color-border-lightest-surface),1)}.ax-tree-view-card .ax-tree-view-node.ax-tree-view-node-selected{border:1px solid rgba(var(--ax-sys-color-border-surface),1)}.ax-tree-view-with-lines .ax-tree-view-children{padding-inline-start:var(--ax-tree-view-indent-size,var(--ax-comp-tree-view-indent-size));position:relative}.ax-tree-view-with-lines .ax-tree-view-children:before{content:\"\";background:var(--ax-tree-view-line-color,var(--ax-comp-tree-view-line-color));inset-inline-start:var(--ax-tree-view-line-offset,calc(var(--ax-comp-tree-view-indent-size) / 2));width:1px;height:calc(100% - .875rem);position:absolute;top:0}.ax-tree-view-with-lines .ax-tree-view-node{position:relative}.ax-tree-view-with-lines .ax-tree-view-node:before{content:\"\";width:var(--ax-tree-view-line-offset,calc(var(--ax-comp-tree-view-indent-size) / 2));background:var(--ax-tree-view-line-color,var(--ax-comp-tree-view-line-color));inset-inline-start:calc(-1 * var(--ax-tree-view-line-offset,calc(var(--ax-comp-tree-view-indent-size) / 2)));height:1px;position:absolute;top:60%}.ax-tree-view-with-lines>.ax-tree-view-drop-list>.ax-tree-view-node:before,.ax-tree-view-with-lines>.ax-tree-view-node:before{display:none}.ax-tree-view-skeleton-toggle{border-radius:.25rem;min-width:1.5rem;height:1.5rem}.ax-tree-view-skeleton-label{border-radius:.25rem;flex:1;height:1rem}.ax-tree-view-drop-list.ax-tree-view-loading{display:none}\n"] }]
2387
- }], propDecorators: { datasource: [{ type: i0.Input, args: [{ isSignal: true, alias: "datasource", required: true }] }, { type: i0.Output, args: ["datasourceChange"] }], selectMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectMode", required: false }] }], selectionBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionBehavior", required: false }] }], dragArea: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragArea", required: false }] }], dragBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragBehavior", required: false }] }], showIcons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcons", required: false }] }], showChildrenBadge: [{ type: i0.Input, args: [{ isSignal: true, alias: "showChildrenBadge", required: false }] }], expandedIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedIcon", required: false }] }], collapsedIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedIcon", required: false }] }], indentSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "indentSize", required: false }] }], look: [{ type: i0.Input, args: [{ isSignal: true, alias: "look", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], idField: [{ type: i0.Input, args: [{ isSignal: true, alias: "idField", required: false }] }], titleField: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleField", required: false }] }], tooltipField: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipField", required: false }] }], iconField: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconField", required: false }] }], expandedField: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedField", required: false }] }], selectedField: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedField", required: false }] }], indeterminateField: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminateField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], hiddenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenField", required: false }] }], childrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "childrenField", required: false }] }], childrenCountField: [{ type: i0.Input, args: [{ isSignal: true, alias: "childrenCountField", required: false }] }], dataField: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataField", required: false }] }], inheritDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "inheritDisabled", required: false }] }], expandOnDoubleClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandOnDoubleClick", required: false }] }], doubleClickDuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "doubleClickDuration", required: false }] }], tooltipDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipDelay", required: false }] }], onBeforeDrop: [{ type: i0.Output, args: ["onBeforeDrop"] }], onNodeToggle: [{ type: i0.Output, args: ["onNodeToggle"] }], onNodeSelect: [{ type: i0.Output, args: ["onNodeSelect"] }], onNodeDoubleClick: [{
2646
+ }], propDecorators: { datasource: [{ type: i0.Input, args: [{ isSignal: true, alias: "datasource", required: true }] }, { type: i0.Output, args: ["datasourceChange"] }], selectMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectMode", required: false }] }], selectionBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectionBehavior", required: false }] }], dragArea: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragArea", required: false }] }], dragBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "dragBehavior", required: false }] }], showIcons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcons", required: false }] }], showChildrenBadge: [{ type: i0.Input, args: [{ isSignal: true, alias: "showChildrenBadge", required: false }] }], expandedIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedIcon", required: false }] }], collapsedIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsedIcon", required: false }] }], indentSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "indentSize", required: false }] }], look: [{ type: i0.Input, args: [{ isSignal: true, alias: "look", required: false }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], idField: [{ type: i0.Input, args: [{ isSignal: true, alias: "idField", required: false }] }], titleField: [{ type: i0.Input, args: [{ isSignal: true, alias: "titleField", required: false }] }], tooltipField: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipField", required: false }] }], iconField: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconField", required: false }] }], expandedField: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandedField", required: false }] }], selectedField: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedField", required: false }] }], indeterminateField: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminateField", required: false }] }], disabledField: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabledField", required: false }] }], hiddenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "hiddenField", required: false }] }], childrenField: [{ type: i0.Input, args: [{ isSignal: true, alias: "childrenField", required: false }] }], childrenCountField: [{ type: i0.Input, args: [{ isSignal: true, alias: "childrenCountField", required: false }] }], dataField: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataField", required: false }] }], inheritDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "inheritDisabled", required: false }] }], expandOnDoubleClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "expandOnDoubleClick", required: false }] }], doubleClickDuration: [{ type: i0.Input, args: [{ isSignal: true, alias: "doubleClickDuration", required: false }] }], tooltipDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltipDelay", required: false }] }], controlledSelection: [{ type: i0.Input, args: [{ isSignal: true, alias: "controlledSelection", required: false }] }], selectedIds: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedIds", required: false }] }, { type: i0.Output, args: ["selectedIdsChange"] }], onBeforeDrop: [{ type: i0.Output, args: ["onBeforeDrop"] }], onNodeToggle: [{ type: i0.Output, args: ["onNodeToggle"] }], onNodeSelect: [{ type: i0.Output, args: ["onNodeSelect"] }], onNodeDoubleClick: [{
2388
2647
  type: Output
2389
2648
  }], onNodeClick: [{ type: i0.Output, args: ["onNodeClick"] }], onSelectionChange: [{ type: i0.Output, args: ["onSelectionChange"] }], onOrderChange: [{ type: i0.Output, args: ["onOrderChange"] }], onMoveChange: [{ type: i0.Output, args: ["onMoveChange"] }], onItemsChange: [{ type: i0.Output, args: ["onItemsChange"] }] } });
2390
2649
 
2391
2650
  class AXTreeViewModule {
2392
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTreeViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2393
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: AXTreeViewModule, imports: [AXTreeViewComponent] }); }
2394
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTreeViewModule, imports: [AXTreeViewComponent] }); }
2651
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXTreeViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2652
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXTreeViewModule, imports: [AXTreeViewComponent] }); }
2653
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXTreeViewModule, imports: [AXTreeViewComponent] }); }
2395
2654
  }
2396
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: AXTreeViewModule, decorators: [{
2655
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXTreeViewModule, decorators: [{
2397
2656
  type: NgModule,
2398
2657
  args: [{
2399
2658
  imports: [AXTreeViewComponent],