@coolon/angular-ui-powerups 16.1.0-aplpha.13 → 16.1.0-aplpha.130

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 (188) hide show
  1. package/assets/activities/input-activities.scss +14 -6
  2. package/assets/draw.scss +20 -0
  3. package/assets/form.scss +74 -27
  4. package/assets/icons.scss +1 -0
  5. package/assets/layout.scss +3 -0
  6. package/assets/styles.scss +2 -0
  7. package/assets/table.scss +47 -27
  8. package/assets/tabs.scss +15 -5
  9. package/esm2022/lib/animations/slide-animations.mjs +15 -10
  10. package/esm2022/lib/components/cards/card-container/card-container.component.mjs +4 -4
  11. package/esm2022/lib/components/commands/command/command.component.mjs +24 -10
  12. package/esm2022/lib/components/commands/command-face/command-face.component.mjs +11 -3
  13. package/esm2022/lib/components/commands/command-face.mjs +11 -11
  14. package/esm2022/lib/components/commands/group/popup-menu/abstract-popup-menu.component.mjs +11 -11
  15. package/esm2022/lib/components/commands/group/tool-bar/tool-bar.component.mjs +6 -4
  16. package/esm2022/lib/components/components.module.mjs +27 -8
  17. package/esm2022/lib/components/disposable-component.mjs +36 -40
  18. package/esm2022/lib/components/exports.mjs +9 -2
  19. package/esm2022/lib/components/forms/abstract-input.component.mjs +55 -12
  20. package/esm2022/lib/components/forms/autocomplete-input/autocomplete-input.component.mjs +2 -2
  21. package/esm2022/lib/components/forms/checkbox-input/checkbox-input.component.mjs +8 -6
  22. package/esm2022/lib/components/forms/form-field.mjs +2 -0
  23. package/esm2022/lib/components/forms/multiple-select-input/multiple-select-input.component.mjs +2 -2
  24. package/esm2022/lib/components/forms/number-input/number-input.component.mjs +84 -9
  25. package/esm2022/lib/components/forms/password-input/password-input.component.mjs +40 -3
  26. package/esm2022/lib/components/forms/search-input/search-input.component.mjs +33 -0
  27. package/esm2022/lib/components/forms/select-input/select-input.component.mjs +11 -10
  28. package/esm2022/lib/components/forms/string-input/string-input.component.mjs +26 -10
  29. package/esm2022/lib/components/forms/text-input/text-input.component.mjs +6 -2
  30. package/esm2022/lib/components/icon/icon.component.mjs +7 -4
  31. package/esm2022/lib/components/loadable-component.mjs +49 -0
  32. package/esm2022/lib/components/resize-aware.component.mjs +61 -24
  33. package/esm2022/lib/components/switch-case/switch-case.component.mjs +5 -7
  34. package/esm2022/lib/components/tables/abstract-table-model.mjs +77 -47
  35. package/esm2022/lib/components/tables/abstract-table.component.mjs +19 -5
  36. package/esm2022/lib/components/tables/column/column-manager.mjs +81 -0
  37. package/esm2022/lib/components/tables/column/column-model.mjs +16 -6
  38. package/esm2022/lib/components/tables/column/column-order-manager.mjs +19 -0
  39. package/esm2022/lib/components/tables/column/custom-template-column-model.mjs +3 -3
  40. package/esm2022/lib/components/tables/column/custom-value-column-model.mjs +3 -3
  41. package/esm2022/lib/components/tables/column/editor-controls-column-model.mjs +3 -3
  42. package/esm2022/lib/components/tables/column/list-propery-column-model.mjs +3 -3
  43. package/esm2022/lib/components/tables/column/property-column-model.mjs +3 -3
  44. package/esm2022/lib/components/tables/column/selection-column-model.mjs +35 -13
  45. package/esm2022/lib/components/tables/editor/edit-row-controls/edit-row-controls.component.mjs +1 -1
  46. package/esm2022/lib/components/tables/editor/edit-session.mjs +3 -1
  47. package/esm2022/lib/components/tables/filter/table-filter-model.mjs +4 -2
  48. package/esm2022/lib/components/tables/filter/text-search-predicate.mjs +16 -2
  49. package/esm2022/lib/components/tables/footer/footer-row-model.mjs +38 -0
  50. package/esm2022/lib/components/tables/renderer/abstract-cell-renderer.mjs +7 -0
  51. package/esm2022/lib/components/tables/renderer/cell-portal-ref.mjs +23 -5
  52. package/esm2022/lib/components/tables/renderer/default-cell-renderer/default-cell-renderer.component.mjs +3 -3
  53. package/esm2022/lib/components/tables/renderer/select-header-cell/selection-header-cell.component.mjs +3 -2
  54. package/esm2022/lib/components/tables/renderer/table-body/table-body.component.mjs +150 -40
  55. package/esm2022/lib/components/tables/renderer/table-cell/table-cell.component.mjs +6 -6
  56. package/esm2022/lib/components/tables/renderer/table-footer-row/table-footer-row.component.mjs +30 -0
  57. package/esm2022/lib/components/tables/renderer/table-more-menu/table-more-menu.component.mjs +7 -2
  58. package/esm2022/lib/components/tables/table/table-model.mjs +12 -3
  59. package/esm2022/lib/components/tables/table/table.component.mjs +39 -61
  60. package/esm2022/lib/components/tables/tree-table/decorated-tree-node.mjs +5 -4
  61. package/esm2022/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.mjs +1 -1
  62. package/esm2022/lib/components/tables/tree-table/tree-label-column-model.mjs +3 -3
  63. package/esm2022/lib/components/tables/tree-table/tree-table-component.mjs +12 -5
  64. package/esm2022/lib/components/tables/tree-table/tree-table-model.mjs +4 -7
  65. package/esm2022/lib/components/text/markdown/markdown.component.mjs +2 -2
  66. package/esm2022/lib/directives/directives.module.mjs +1 -1
  67. package/esm2022/lib/directives/exports.mjs +2 -1
  68. package/esm2022/lib/directives/highlight.pipe.mjs +9 -7
  69. package/esm2022/lib/directives/resize-observer.directive.mjs +40 -0
  70. package/esm2022/lib/interaction/activity.mjs +14 -6
  71. package/esm2022/lib/interaction/alert.mjs +2 -2
  72. package/esm2022/lib/interaction/components/abstract-confirm-dialog.component.mjs +8 -4
  73. package/esm2022/lib/interaction/components/activity-actions/activity-actions.component.mjs +20 -11
  74. package/esm2022/lib/interaction/components/activity-container/activity-container.component.mjs +28 -11
  75. package/esm2022/lib/interaction/components/activity-title/activity-title.component.mjs +4 -4
  76. package/esm2022/lib/interaction/components/activity-triggers/inline-activity-trigger/inline-activity-trigger.component.mjs +1 -1
  77. package/esm2022/lib/interaction/components/add-card-activity/add-card-activity.component.mjs +1 -1
  78. package/esm2022/lib/interaction/components/add-item-interaction-context/add-item-interaction-context.component.mjs +1 -1
  79. package/esm2022/lib/interaction/components/alert-dialog/alert-dialog.component.mjs +1 -1
  80. package/esm2022/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.mjs +1 -1
  81. package/esm2022/lib/interaction/components/confirm-then-execute-dialog/confirm-then-execute-dialog.component.mjs +1 -1
  82. package/esm2022/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.mjs +1 -1
  83. package/esm2022/lib/interaction/components/editors/edit-context.mjs +1 -1
  84. package/esm2022/lib/interaction/components/editors/inline-string-editor/inline-string-editor.component.mjs +3 -3
  85. package/esm2022/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.mjs +21 -5
  86. package/esm2022/lib/interaction/components/input-activities/input-activity.mjs +2 -2
  87. package/esm2022/lib/interaction/components/input-activities/select-input-activity.mjs +4 -2
  88. package/esm2022/lib/interaction/components/input-activities/string-input-activity.mjs +8 -4
  89. package/esm2022/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.mjs +134 -0
  90. package/esm2022/lib/interaction/directives/interaction-context-trigger-for.directive.mjs +2 -2
  91. package/esm2022/lib/interaction/exports.mjs +3 -1
  92. package/esm2022/lib/interaction/interaction-context-provider.mjs +3 -0
  93. package/esm2022/lib/interaction/interaction-context.mjs +3 -2
  94. package/esm2022/lib/interaction/interaction.module.mjs +7 -9
  95. package/esm2022/lib/place/components/list-place-nav/list-place-nav.component.mjs +3 -4
  96. package/esm2022/lib/place/components/place-outlet/place-outlet.component.mjs +7 -9
  97. package/esm2022/lib/place/components/side-place-navigation/side-place-navigation.component.mjs +2 -2
  98. package/esm2022/lib/place/guards/consolidated-param-map.mjs +4 -4
  99. package/esm2022/lib/place/guards/place.guard.mjs +6 -5
  100. package/esm2022/lib/place/navigation/place-component-deactivation-handler.mjs +2 -2
  101. package/esm2022/lib/place/navigation/session/interactions/synchronise-interaction-context-ids-with-route.mjs +3 -6
  102. package/esm2022/lib/place/place-auth-service.mjs +5 -5
  103. package/esm2022/lib/place/place-component.mjs +29 -19
  104. package/esm2022/lib/place/place-definition.mjs +15 -4
  105. package/esm2022/lib/place/place-history.mjs +2 -2
  106. package/esm2022/lib/place/place-router.mjs +22 -20
  107. package/esm2022/lib/place/place.decorator.mjs +2 -2
  108. package/esm2022/lib/place/place.module.mjs +1 -5
  109. package/esm2022/lib/place/route/formatter.mjs +2 -2
  110. package/esm2022/lib/place/route/parameter-decorators.mjs +54 -50
  111. package/esm2022/lib/place/route/parameter-definition.mjs +2 -2
  112. package/esm2022/lib/place/url-snapshot.mjs +3 -3
  113. package/esm2022/lib/place/visit-segment.mjs +2 -2
  114. package/esm2022/lib/place/visit.mjs +2 -2
  115. package/fesm2022/coolon-angular-ui-powerups.mjs +1532 -637
  116. package/fesm2022/coolon-angular-ui-powerups.mjs.map +1 -1
  117. package/lib/animations/slide-animations.d.ts +1 -0
  118. package/lib/components/cards/card-container/card-container.component.d.ts +1 -1
  119. package/lib/components/commands/command/command.component.d.ts +2 -1
  120. package/lib/components/commands/command-face/command-face.component.d.ts +2 -0
  121. package/lib/components/commands/command-face.d.ts +5 -7
  122. package/lib/components/commands/group/popup-menu/abstract-popup-menu.component.d.ts +2 -2
  123. package/lib/components/commands/group/tool-bar/tool-bar.component.d.ts +1 -1
  124. package/lib/components/components.module.d.ts +56 -53
  125. package/lib/components/disposable-component.d.ts +16 -8
  126. package/lib/components/exports.d.ts +8 -1
  127. package/lib/components/forms/abstract-input.component.d.ts +13 -5
  128. package/lib/components/forms/checkbox-input/checkbox-input.component.d.ts +2 -0
  129. package/lib/components/forms/form-field.d.ts +5 -0
  130. package/lib/components/forms/number-input/number-input.component.d.ts +16 -4
  131. package/lib/components/forms/password-input/password-input.component.d.ts +7 -1
  132. package/lib/components/forms/search-input/search-input.component.d.ts +10 -0
  133. package/lib/components/forms/select-input/select-input.component.d.ts +4 -3
  134. package/lib/components/forms/string-input/string-input.component.d.ts +6 -1
  135. package/lib/components/forms/text-input/text-input.component.d.ts +3 -0
  136. package/lib/components/loadable-component.d.ts +17 -0
  137. package/lib/components/resize-aware.component.d.ts +24 -5
  138. package/lib/components/switch-case/switch-case.component.d.ts +2 -3
  139. package/lib/components/tables/abstract-table-model.d.ts +29 -11
  140. package/lib/components/tables/abstract-table.component.d.ts +4 -3
  141. package/lib/components/tables/column/column-manager.d.ts +19 -0
  142. package/lib/components/tables/column/column-model.d.ts +7 -3
  143. package/lib/components/tables/column/column-order-manager.d.ts +20 -0
  144. package/lib/components/tables/column/custom-template-column-model.d.ts +3 -2
  145. package/lib/components/tables/column/custom-value-column-model.d.ts +3 -2
  146. package/lib/components/tables/column/editor-controls-column-model.d.ts +3 -2
  147. package/lib/components/tables/column/list-propery-column-model.d.ts +3 -2
  148. package/lib/components/tables/column/property-column-model.d.ts +3 -2
  149. package/lib/components/tables/column/selection-column-model.d.ts +10 -4
  150. package/lib/components/tables/editor/edit-row-controls/edit-row-controls.component.d.ts +1 -1
  151. package/lib/components/tables/editor/edit-session.d.ts +1 -1
  152. package/lib/components/tables/filter/text-search-predicate.d.ts +9 -0
  153. package/lib/components/tables/footer/footer-row-model.d.ts +22 -0
  154. package/lib/components/tables/renderer/abstract-cell-renderer.d.ts +6 -0
  155. package/lib/components/tables/renderer/cell-portal-ref.d.ts +20 -12
  156. package/lib/components/tables/renderer/table-body/table-body.component.d.ts +40 -16
  157. package/lib/components/tables/renderer/table-cell/table-cell.component.d.ts +2 -3
  158. package/lib/components/tables/renderer/table-footer-row/table-footer-row.component.d.ts +11 -0
  159. package/lib/components/tables/renderer/table-more-menu/table-more-menu.component.d.ts +2 -1
  160. package/lib/components/tables/table/table-model.d.ts +4 -4
  161. package/lib/components/tables/table/table.component.d.ts +14 -10
  162. package/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.d.ts +1 -1
  163. package/lib/components/tables/tree-table/tree-label-column-model.d.ts +3 -2
  164. package/lib/components/tables/tree-table/tree-table-component.d.ts +3 -0
  165. package/lib/components/tables/tree-table/tree-table-model.d.ts +4 -5
  166. package/lib/directives/exports.d.ts +1 -0
  167. package/lib/directives/resize-observer.directive.d.ts +16 -0
  168. package/lib/interaction/activity.d.ts +4 -2
  169. package/lib/interaction/components/abstract-confirm-dialog.component.d.ts +1 -0
  170. package/lib/interaction/components/activity-actions/activity-actions.component.d.ts +10 -5
  171. package/lib/interaction/components/activity-container/activity-container.component.d.ts +7 -3
  172. package/lib/interaction/components/activity-title/activity-title.component.d.ts +1 -1
  173. package/lib/interaction/components/editors/edit-context.d.ts +1 -1
  174. package/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.d.ts +5 -3
  175. package/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.d.ts +53 -0
  176. package/lib/interaction/exports.d.ts +2 -0
  177. package/lib/interaction/interaction-context-provider.d.ts +6 -0
  178. package/lib/interaction/interaction-context.d.ts +2 -0
  179. package/lib/interaction/interaction.module.d.ts +28 -28
  180. package/lib/place/components/place-outlet/place-outlet.component.d.ts +3 -4
  181. package/lib/place/place-auth-service.d.ts +4 -4
  182. package/lib/place/place-component.d.ts +7 -5
  183. package/lib/place/place-definition.d.ts +2 -0
  184. package/lib/place/place-router.d.ts +6 -2
  185. package/lib/place/place.module.d.ts +4 -5
  186. package/package.json +6 -4
  187. package/esm2022/lib/components/tables/column/column-list-model.mjs +0 -44
  188. package/lib/components/tables/column/column-list-model.d.ts +0 -13
@@ -2,27 +2,27 @@ import { ObserversModule } from '@angular/cdk/observers';
2
2
  import * as i1$1 from '@angular/common';
3
3
  import { DOCUMENT, CommonModule } from '@angular/common';
4
4
  import * as i0 from '@angular/core';
5
- import { ElementRef, Directive, Inject, Host, Optional, Input, HostListener, inject, NgZone, Injectable, Pipe, NgModule, Component, ContentChild, HostBinding, ViewEncapsulation, InjectionToken, ViewChild, ViewChildren, EventEmitter, Output, SkipSelf, Self, ContentChildren, ComponentRef, Injector, PLATFORM_ID } from '@angular/core';
5
+ import { ElementRef, Directive, Inject, Host, Optional, Input, HostListener, ChangeDetectorRef, inject, NgZone, Injectable, Pipe, NgModule, Component, ContentChild, HostBinding, ChangeDetectionStrategy, ViewEncapsulation, InjectionToken, ViewChild, ViewChildren, EventEmitter, Output, SkipSelf, Self, ContentChildren, ComponentRef, Injector, PLATFORM_ID } from '@angular/core';
6
6
  import * as i2$4 from '@angular/forms';
7
7
  import { FormsModule } from '@angular/forms';
8
8
  import * as i4$2 from '@angular/material/form-field';
9
9
  import { MatFormFieldModule } from '@angular/material/form-field';
10
10
  import * as i3 from '@angular/material/input';
11
11
  import { MatInputModule, MatInput } from '@angular/material/input';
12
- import * as i4$4 from '@angular/material/select';
12
+ import * as i4$3 from '@angular/material/select';
13
13
  import { MatSelectModule } from '@angular/material/select';
14
- import * as i3$1 from '@angular/material/tabs';
14
+ import * as i3$2 from '@angular/material/tabs';
15
15
  import { MatTabsModule, MAT_TABS_CONFIG } from '@angular/material/tabs';
16
16
  import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
17
- import * as i3$2 from '@angular/cdk/portal';
17
+ import * as i1$4 from '@angular/cdk/portal';
18
18
  import { ComponentPortal, TemplatePortal, PortalModule } from '@angular/cdk/portal';
19
19
  import * as i1$2 from '@angular/cdk/scrolling';
20
- import { CdkScrollableModule } from '@angular/cdk/scrolling';
20
+ import { CdkVirtualScrollViewport, CdkScrollableModule, ScrollingModule } from '@angular/cdk/scrolling';
21
21
  import * as i7 from '@angular/material/autocomplete';
22
22
  import { MatAutocompleteModule } from '@angular/material/autocomplete';
23
23
  import * as i2 from '@angular/material/button';
24
24
  import { MatButton, MatButtonModule } from '@angular/material/button';
25
- import * as i4$3 from '@angular/material/checkbox';
25
+ import * as i3$1 from '@angular/material/checkbox';
26
26
  import { MAT_CHECKBOX_DEFAULT_OPTIONS, MatCheckboxModule } from '@angular/material/checkbox';
27
27
  import * as i2$3 from '@angular/material/divider';
28
28
  import { MatDividerModule } from '@angular/material/divider';
@@ -38,35 +38,34 @@ import * as i2$6 from '@angular/material/table';
38
38
  import { MatTableModule } from '@angular/material/table';
39
39
  import * as i4$1 from '@angular/material/tooltip';
40
40
  import { MatTooltipModule } from '@angular/material/tooltip';
41
+ import * as i4$4 from 'ng-table-virtual-scroll';
42
+ import { TableVirtualScrollDataSource, TableVirtualScrollModule } from 'ng-table-virtual-scroll';
41
43
  import * as i1$3 from '@coolon/pectin';
42
- import { GarbageCollector, DelegatingValueModel, assert, UnaryCommand, lang, Dsl, MutableValueModel, Logger, proxify, ValueModel, Proxify, StoreInValueModel, Command, MutableListModel, StoreInListModel, Disposable, DelegatingListModel, DelegateToValueModel, FocusManager, EventListenerList, Guard, DelegatingFormListModel, Binding, DebugContext, DelegateToListModel, DelegatingFormValueModel, ListModel, Functions, PageController, SelectionModel, CanProxy, MultipleSelectionModel, AbstractComputedListModel, DirtyTrackingForm, ProxyRegistry, DelegatingCommand, PagedListModel, ComputedListModel, Deferred, ReducingValueModel, AndValueModel } from '@coolon/pectin';
43
- import { __decorate, __param, __metadata } from 'tslib';
44
+ import { GarbageCollector, DelegatingValueModel, assert, UnaryCommand, lang, Dsl, proxify, ValueModel, Proxify, Logger, StoreInValueModel, Command, MutableListModel, StoreInListModel, Disposable, DelegatingListModel, MutableValueModel, DelegateToValueModel, FocusManager, EventListenerList, Guard, DelegatingFormListModel, Binding, DebugContext, DelegateToListModel, DelegatingFormValueModel, ListModel, Functions, PageController, SelectionModel, CanProxy, MultipleSelectionModel, WatchList, ProxyRegistry, DirtyTrackingForm, DependsOnOptions, DelegatingCommand, ComputedListModel, Deferred, ReducingValueModel, AndValueModel } from '@coolon/pectin';
45
+ import { __decorate, __metadata, __param } from 'tslib';
44
46
  import * as i1 from '@angular/platform-browser';
45
47
  import escapeStringRegexp from 'escape-string-regexp';
46
- import { isEmpty, isString, isFunction, isNil, isInteger, isObject, isEqual, join, first, uniq, last as last$1, isNumber, isNaN as isNaN$1 } from 'lodash';
48
+ import { escape, isEmpty, isString, isFunction, isNil, isInteger, isObject, isEqual, join, last, first, uniq, findLast, isNumber, isNaN as isNaN$1 } from 'lodash-es';
47
49
  import { marked } from 'marked';
48
- import { Memoize } from '@typescript-plus/fast-memoize-decorator';
50
+ import { MemoizeGet, lang as lang$1, assert as assert$1, Stringy, Klass, Opts } from '@coolon/typescript-utilities';
49
51
  import { Enum } from 'typescript-string-enums';
50
- import { lang as lang$1, assert as assert$1, Stringy, Klass, Opts } from '@coolon/typescript-utilities';
51
52
  import * as i5 from '@angular/material/core';
53
+ import { Memoize } from 'fast-typescript-memoize';
52
54
  import { produce } from 'immer';
53
55
  import ResizeObserver from 'resize-observer-polyfill';
54
- import { isFunction as isFunction$1, isNil as isNil$1, isEmpty as isEmpty$1, last, findLast } from 'lodash-es';
56
+ import { generateKeyBetween } from 'fractional-indexing';
55
57
  import * as i5$1 from '@angular/cdk/a11y';
56
58
  import { A11yModule } from '@angular/cdk/a11y';
57
- import * as i7$1 from '@angular/flex-layout';
58
- import { FlexModule, GridModule } from '@angular/flex-layout';
59
- import * as i1$6 from '@angular/material/dialog';
59
+ import * as i1$7 from '@angular/material/dialog';
60
60
  import { MatDialogModule, MAT_DIALOG_DEFAULT_OPTIONS } from '@angular/material/dialog';
61
- import * as i1$4 from '@angular/router';
62
- import { ActivatedRouteSnapshot, UrlSegment, NavigationStart, NavigationEnd, NavigationError, NavigationCancel, RouterModule } from '@angular/router';
63
- import { Memoize as Memoize$1 } from 'typescript-memoize';
61
+ import * as i1$5 from '@angular/router';
62
+ import { ActivatedRoute, ActivatedRouteSnapshot, UrlSegment, NavigationStart, NavigationEnd, NavigationError, NavigationCancel, RouterModule } from '@angular/router';
64
63
  import 'reflect-metadata';
65
- import * as i1$5 from '@angular/cdk/overlay';
64
+ import * as i1$6 from '@angular/cdk/overlay';
65
+ import { style, trigger, transition, animate, group, query } from '@angular/animations';
66
66
  import { MatCardModule } from '@angular/material/card';
67
67
  import * as i3$3 from '@angular/material/list';
68
68
  import { MatListModule } from '@angular/material/list';
69
- import { style, query, group, animate, trigger, transition } from '@angular/animations';
70
69
 
71
70
  class CommandDirective extends GarbageCollector {
72
71
  elementRef;
@@ -187,6 +186,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
187
186
  args: ['click', ['$event']]
188
187
  }] } });
189
188
 
189
+ class HighlightTextModelDirective extends GarbageCollector {
190
+ #aupHighlightTextModel_accessor_storage = proxify((ValueModel));
191
+ get aupHighlightTextModel() { return this.#aupHighlightTextModel_accessor_storage; }
192
+ set aupHighlightTextModel(value) { this.#aupHighlightTextModel_accessor_storage = value; }
193
+ constructor() {
194
+ super();
195
+ }
196
+ ngOnDestroy() {
197
+ this.dispose();
198
+ }
199
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: HighlightTextModelDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
200
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: HighlightTextModelDirective, selector: "[aupHighlightTextModel]", inputs: { aupHighlightTextModel: "aupHighlightTextModel" }, usesInheritance: true, ngImport: i0 });
201
+ }
202
+ __decorate([
203
+ Proxify(),
204
+ __metadata("design:type", Object)
205
+ ], HighlightTextModelDirective.prototype, "aupHighlightTextModel", null);
206
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: HighlightTextModelDirective, decorators: [{
207
+ type: Directive,
208
+ args: [{
209
+ selector: '[aupHighlightTextModel]'
210
+ }]
211
+ }], ctorParameters: function () { return []; }, propDecorators: { aupHighlightTextModel: [{
212
+ type: Input
213
+ }] } });
214
+
190
215
  var Track;
191
216
  (function (Track) {
192
217
  Track.byIndex = (index, item) => index;
@@ -213,11 +238,21 @@ var Track;
213
238
 
214
239
  class DisposableComponent extends GarbageCollector {
215
240
  trackById = Track.byId();
216
- #_loaded$ = new MutableValueModel();
217
- #asyncLoadables = [];
218
- #awaitedLoadables = [];
241
+ // #_loaded$ = new MutableValueModel<boolean>();
242
+ // #asyncLoadables: Loadable[] = [];
243
+ // #awaitedLoadables: Loadable[] = [];
219
244
  #initCallbacks = [];
220
245
  #initialised = false;
246
+ cdr = this.inject(ChangeDetectorRef);
247
+ highlightContext = this.inject(HighlightTextModelDirective, {
248
+ optional: true
249
+ });
250
+ constructor() {
251
+ super();
252
+ if (this.highlightContext) { // the component might be rendered outside a table
253
+ this.viewStateDependsOn(this.highlightContext.aupHighlightTextModel);
254
+ }
255
+ }
221
256
  onInit(callback) {
222
257
  if (this.#initialised) {
223
258
  callback();
@@ -226,51 +261,36 @@ class DisposableComponent extends GarbageCollector {
226
261
  this.#initCallbacks.push(callback);
227
262
  }
228
263
  }
229
- get loaded$() {
230
- return this.#_loaded$.readonly$;
231
- }
232
264
  ngOnInit() {
233
265
  this.#initCallbacks.forEach(it => it());
234
- this.#asyncLoadables.forEach(it => it.ensureLoaded());
235
- if (this.#awaitedLoadables.length > 0) {
236
- Promise.all(this.#awaitedLoadables.map(it => {
237
- return it.ensureLoaded(); //.then(() => console.log(`${it.constructor.name} loaded`));
238
- })).then(() => {
239
- this.#_loaded$.value = true;
240
- });
241
- }
242
- else {
243
- this.#_loaded$.value = true;
244
- }
245
266
  this.#initialised = true;
246
267
  }
247
- inject(token) {
248
- return inject(token);
249
- }
250
- injectLoadable(token, options) {
251
- const loadable = inject(token);
252
- if (this.loaded$.value) {
253
- loadable.ensureLoaded();
254
- }
255
- else {
256
- if (!options || options.wait === true) {
257
- this.#awaitedLoadables.push(loadable);
258
- }
259
- else {
260
- this.#asyncLoadables.push(loadable);
261
- }
262
- }
263
- return loadable;
264
- }
265
268
  ngOnDestroy() {
266
269
  this.dispose();
267
270
  }
268
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DisposableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
271
+ inject(token, options) {
272
+ return inject(token, options);
273
+ }
274
+ /**
275
+ * Monitors the specified models for any change and triggers and angular change detect cycle. This is intended for use
276
+ * when the component uses the ON_PUSH change detection strategy or when it is contained within another component that
277
+ * does (e.g. aup-table, aup-tree-table)
278
+ * @param models
279
+ * @protected
280
+ */
281
+ viewStateDependsOn(...models) {
282
+ const { when } = Dsl.disposeWith(this);
283
+ when.anyOf(...models).changes(() => this.markForCheck());
284
+ }
285
+ markForCheck() {
286
+ this.cdr.markForCheck();
287
+ }
288
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DisposableComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
269
289
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: DisposableComponent, usesInheritance: true, ngImport: i0 });
270
290
  }
271
291
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DisposableComponent, decorators: [{
272
292
  type: Directive
273
- }] });
293
+ }], ctorParameters: function () { return []; } });
274
294
 
275
295
  let FocusBinding = class FocusBinding extends GarbageCollector {
276
296
  focusTargetElement;
@@ -466,32 +486,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
466
486
  }]
467
487
  }], ctorParameters: function () { return []; } });
468
488
 
469
- class HighlightTextModelDirective extends GarbageCollector {
470
- #aupHighlightTextModel_accessor_storage = proxify((ValueModel));
471
- get aupHighlightTextModel() { return this.#aupHighlightTextModel_accessor_storage; }
472
- set aupHighlightTextModel(value) { this.#aupHighlightTextModel_accessor_storage = value; }
473
- constructor() {
474
- super();
475
- }
476
- ngOnDestroy() {
477
- this.dispose();
478
- }
479
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: HighlightTextModelDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
480
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: HighlightTextModelDirective, selector: "[aupHighlightTextModel]", inputs: { aupHighlightTextModel: "aupHighlightTextModel" }, usesInheritance: true, ngImport: i0 });
481
- }
482
- __decorate([
483
- Proxify(),
484
- __metadata("design:type", Object)
485
- ], HighlightTextModelDirective.prototype, "aupHighlightTextModel", null);
486
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: HighlightTextModelDirective, decorators: [{
487
- type: Directive,
488
- args: [{
489
- selector: '[aupHighlightTextModel]'
490
- }]
491
- }], ctorParameters: function () { return []; }, propDecorators: { aupHighlightTextModel: [{
492
- type: Input
493
- }] } });
494
-
495
489
  class HighlightPipe extends GarbageCollector {
496
490
  sanitizer;
497
491
  highlightContext;
@@ -504,19 +498,20 @@ class HighlightPipe extends GarbageCollector {
504
498
  this.dispose();
505
499
  }
506
500
  transform(value, searchModel) {
501
+ const sanitisedValue = escape(value);
507
502
  const model = searchModel ?? this.highlightContext?.aupHighlightTextModel;
508
- const searchText = model?.value;
503
+ const searchText = escape(model?.value);
509
504
  if (isEmpty(searchText) || !isString(value)) {
510
- return value;
505
+ return sanitisedValue;
511
506
  }
512
507
  // Match in a case insensitive manner
513
508
  const re = new RegExp(escapeStringRegexp(searchText), 'gi');
514
- const match = value.match(re);
509
+ const match = sanitisedValue.match(re);
515
510
  // If there's no match, just return the original value.
516
511
  if (!match) {
517
- return value;
512
+ return sanitisedValue;
518
513
  }
519
- const result = value.replace(re, '<mark>' + match[0] + '</mark>');
514
+ const result = sanitisedValue.replace(re, '<mark>' + match[0] + '</mark>');
520
515
  return this.sanitizer.bypassSecurityTrustHtml(result);
521
516
  }
522
517
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: HighlightPipe, deps: [{ token: i1.DomSanitizer }, { token: HighlightTextModelDirective, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
@@ -736,42 +731,42 @@ var CommandFace;
736
731
  }
737
732
  }
738
733
  __decorate([
739
- Memoize(),
734
+ MemoizeGet(),
740
735
  __metadata("design:type", Object),
741
736
  __metadata("design:paramtypes", [])
742
737
  ], Adapter.prototype, "text", null);
743
738
  __decorate([
744
- Memoize(),
739
+ MemoizeGet(),
745
740
  __metadata("design:type", Object),
746
741
  __metadata("design:paramtypes", [])
747
742
  ], Adapter.prototype, "icon", null);
748
743
  __decorate([
749
- Memoize(),
744
+ MemoizeGet(),
750
745
  __metadata("design:type", Object),
751
746
  __metadata("design:paramtypes", [])
752
747
  ], Adapter.prototype, "iconPosition", null);
753
748
  __decorate([
754
- Memoize(),
749
+ MemoizeGet(),
755
750
  __metadata("design:type", Object),
756
751
  __metadata("design:paramtypes", [])
757
752
  ], Adapter.prototype, "tooltip", null);
758
753
  __decorate([
759
- Memoize(),
754
+ MemoizeGet(),
760
755
  __metadata("design:type", Boolean),
761
756
  __metadata("design:paramtypes", [])
762
757
  ], Adapter.prototype, "iconPositionStart", null);
763
758
  __decorate([
764
- Memoize(),
759
+ MemoizeGet(),
765
760
  __metadata("design:type", Boolean),
766
761
  __metadata("design:paramtypes", [])
767
762
  ], Adapter.prototype, "iconPositionEnd", null);
768
763
  __decorate([
769
- Memoize(),
764
+ MemoizeGet(),
770
765
  __metadata("design:type", String),
771
766
  __metadata("design:paramtypes", [])
772
767
  ], Adapter.prototype, "color", null);
773
768
  __decorate([
774
- Memoize(),
769
+ MemoizeGet(),
775
770
  __metadata("design:type", String),
776
771
  __metadata("design:paramtypes", [])
777
772
  ], Adapter.prototype, "style", null);
@@ -842,6 +837,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
842
837
  args: ["class.disable-scroll"]
843
838
  }] } });
844
839
 
840
+ /* eslint-disable @angular-eslint/no-host-metadata-property */
845
841
  class IconComponent {
846
842
  _icon;
847
843
  prefix;
@@ -873,11 +869,13 @@ class IconComponent {
873
869
  return `fa-${this.suffix}`;
874
870
  }
875
871
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
876
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: IconComponent, selector: "aup-icon", inputs: { icon: "icon" }, host: { properties: { "attr.icon": "this.icon" } }, ngImport: i0, template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"iconPrefix.SVG\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"iconPrefix.MATERIAL\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"iconPrefix.FONT_AWESOME\" class=\"faIconWrapper\">\n <i class=\"fa-solid\" [class]=\"faIcon\"></i>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n", styles: [":host{display:inline-flex;--resolved-size: var(--aup-icon-size, 24px);width:var(--resolved-size) fa-icon;width-vertical-align:middle}:host .faIconWrapper{display:flex;flex-direction:row;align-items:center;justify-content:center;width:var(--resolved-size);height:var(--resolved-size)}:host .svgIcon{width:var(--resolved-size);height:var(--resolved-size)}:host :host(.mat-chip-remove){--aup-icon-size: 18px}:host mat-icon{font-size:var(--resolved-size);width:var(--resolved-size);height:var(--resolved-size);margin-right:0!important}\n"], dependencies: [{ kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
872
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: IconComponent, selector: "aup-icon", inputs: { icon: "icon" }, host: { properties: { "attr.icon": "this.icon" }, classAttribute: "mat-icon" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"iconPrefix.SVG\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"iconPrefix.MATERIAL\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"iconPrefix.FONT_AWESOME\" class=\"faIconWrapper\">\n <i class=\"fa-solid\" [class]=\"faIcon\"></i>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n", styles: [":host{display:inline-flex;--resolved-size: var(--aup-icon-size, 24px);width:var(--resolved-size)!important;min-width:var(--resolved-size)!important;height:var(--resolved-size)!important;min-height:var(--resolved-size)!important}:host fa-icon{vertical-align:middle}:host .faIconWrapper{display:flex;flex-direction:row;align-items:center;justify-content:center;width:var(--resolved-size)!important;height:var(--resolved-size)!important}:host .svgIcon{width:var(--resolved-size)!important;height:var(--resolved-size)!important}:host :host(.mat-chip-remove){--aup-icon-size: 18px}:host mat-icon{font-size:var(--resolved-size)!important;width:var(--resolved-size)!important;height:var(--resolved-size)!important;margin-right:0!important}\n"], dependencies: [{ kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
877
873
  }
878
874
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: IconComponent, decorators: [{
879
875
  type: Component,
880
- args: [{ selector: 'aup-icon', template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"iconPrefix.SVG\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"iconPrefix.MATERIAL\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"iconPrefix.FONT_AWESOME\" class=\"faIconWrapper\">\n <i class=\"fa-solid\" [class]=\"faIcon\"></i>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n", styles: [":host{display:inline-flex;--resolved-size: var(--aup-icon-size, 24px);width:var(--resolved-size) fa-icon;width-vertical-align:middle}:host .faIconWrapper{display:flex;flex-direction:row;align-items:center;justify-content:center;width:var(--resolved-size);height:var(--resolved-size)}:host .svgIcon{width:var(--resolved-size);height:var(--resolved-size)}:host :host(.mat-chip-remove){--aup-icon-size: 18px}:host mat-icon{font-size:var(--resolved-size);width:var(--resolved-size);height:var(--resolved-size);margin-right:0!important}\n"] }]
876
+ args: [{ selector: 'aup-icon', changeDetection: ChangeDetectionStrategy.OnPush, host: {
877
+ class: "mat-icon" // this ensures angular form styles that target mat icon also work with us
878
+ }, template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"iconPrefix.SVG\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"iconPrefix.MATERIAL\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"iconPrefix.FONT_AWESOME\" class=\"faIconWrapper\">\n <i class=\"fa-solid\" [class]=\"faIcon\"></i>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n", styles: [":host{display:inline-flex;--resolved-size: var(--aup-icon-size, 24px);width:var(--resolved-size)!important;min-width:var(--resolved-size)!important;height:var(--resolved-size)!important;min-height:var(--resolved-size)!important}:host fa-icon{vertical-align:middle}:host .faIconWrapper{display:flex;flex-direction:row;align-items:center;justify-content:center;width:var(--resolved-size)!important;height:var(--resolved-size)!important}:host .svgIcon{width:var(--resolved-size)!important;height:var(--resolved-size)!important}:host :host(.mat-chip-remove){--aup-icon-size: 18px}:host mat-icon{font-size:var(--resolved-size)!important;width:var(--resolved-size)!important;height:var(--resolved-size)!important;margin-right:0!important}\n"] }]
881
879
  }], propDecorators: { icon: [{
882
880
  type: Input
883
881
  }, {
@@ -908,6 +906,7 @@ class CommandFaceComponent extends DisposableComponent {
908
906
  // tslint:disable-next-line:no-input-rename
909
907
  get _rawFaces() { return this.#_rawFaces_accessor_storage; }
910
908
  set _rawFaces(value) { this.#_rawFaces_accessor_storage = value; }
909
+ hasTextAndLeadingIcon$;
911
910
  set face(face) {
912
911
  this.faces$.value = [face];
913
912
  }
@@ -927,6 +926,7 @@ class CommandFaceComponent extends DisposableComponent {
927
926
  const activeFace = this.faceAdapters.first();
928
927
  this.activeIcon = activeFace.pluck("icon");
929
928
  this.activeColor = activeFace.pluck("color");
929
+ this.hasTextAndLeadingIcon$ = valueOf.all(this.activeIcon.isNotNil(), activeFace.pluckString('text').isNotBlank(), activeFace.pluck("iconPosition").doesNotEqual(CommandFace.Position.END)).areTruthy();
930
930
  }
931
931
  shouldIncludeIcon(face) {
932
932
  return (!this.ignoreIcon && face.icon) || this.includeMissingIconInLayout;
@@ -940,8 +940,11 @@ class CommandFaceComponent extends DisposableComponent {
940
940
  get color() {
941
941
  return this.activeColor.value;
942
942
  }
943
+ get hasTextAndIcon() {
944
+ return this.hasTextAndLeadingIcon$.value;
945
+ }
943
946
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CommandFaceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
944
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CommandFaceComponent, selector: "aup-command-face", inputs: { _rawFaces: ["faces", "_rawFaces"], face: "face", ignoreIcon: "ignoreIcon", ignoreText: "ignoreText", includeMissingIconInLayout: "includeMissingIconInLayout" }, host: { properties: { "class.hide-icon": "this.requiresMissingIconInLayout", "attr.color": "this.color" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"face-container\" *ngFor=\"let face of faceAdapters.value\">\n <aup-icon *ngIf=\"hasIconStart(face)\" [icon]=\"face.icon\"></aup-icon>\n <span *ngIf=\"face.text\">{{face.text}}</span>\n <aup-icon *ngIf=\"hasIconEnd(face)\" [icon]=\"face.icon\"></aup-icon>\n</div>\n", styles: ["aup-command-face{--icon-gap: var(--aup-command-face-icon-gap);display:inline-grid}aup-command-face>.face-container{grid-column:1;grid-row:1;display:inline-flex;flex-direction:row;align-items:center}aup-command-face>.face-container:not(:first-child){visibility:hidden}aup-command-face>.face-container *+*{margin-left:var(--icon-gap)}aup-command-face.hide-icon aup-icon{visibility:hidden}aup-command-face.centered{justify-items:center}aup-command-face.start{justify-items:self-start}aup-command-face.end{justify-items:self-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }], encapsulation: i0.ViewEncapsulation.None });
947
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CommandFaceComponent, selector: "aup-command-face", inputs: { _rawFaces: ["faces", "_rawFaces"], face: "face", ignoreIcon: "ignoreIcon", ignoreText: "ignoreText", includeMissingIconInLayout: "includeMissingIconInLayout" }, host: { properties: { "class.hide-icon": "this.requiresMissingIconInLayout", "attr.color": "this.color", "class.has-text-and-leading-icon": "this.hasTextAndIcon" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"face-container\" *ngFor=\"let face of faceAdapters.value\">\n <aup-icon *ngIf=\"hasIconStart(face)\" [icon]=\"face.icon\"></aup-icon>\n <span *ngIf=\"face.text\">{{face.text}}</span>\n <aup-icon *ngIf=\"hasIconEnd(face)\" [icon]=\"face.icon\"></aup-icon>\n</div>\n", styles: ["aup-command-face{--icon-gap: var(--aup-command-face-icon-gap);display:inline-grid}aup-command-face>.face-container{grid-column:1;grid-row:1;display:inline-flex;flex-direction:row;align-items:center}aup-command-face>.face-container>span{white-space:nowrap}aup-command-face>.face-container:not(:first-child){visibility:hidden}aup-command-face>.face-container *+*{margin-left:var(--icon-gap)}aup-command-face.hide-icon aup-icon{visibility:hidden}aup-command-face.centered{justify-items:center}aup-command-face.start{justify-items:self-start}aup-command-face.end{justify-items:self-end}aup-command-face.has-text-and-leading-icon{margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }], encapsulation: i0.ViewEncapsulation.None });
945
948
  }
946
949
  __decorate([
947
950
  StoreInListModel("faces$"),
@@ -949,7 +952,7 @@ __decorate([
949
952
  ], CommandFaceComponent.prototype, "_rawFaces", null);
950
953
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CommandFaceComponent, decorators: [{
951
954
  type: Component,
952
- args: [{ selector: 'aup-command-face', encapsulation: ViewEncapsulation.None, template: "<div class=\"face-container\" *ngFor=\"let face of faceAdapters.value\">\n <aup-icon *ngIf=\"hasIconStart(face)\" [icon]=\"face.icon\"></aup-icon>\n <span *ngIf=\"face.text\">{{face.text}}</span>\n <aup-icon *ngIf=\"hasIconEnd(face)\" [icon]=\"face.icon\"></aup-icon>\n</div>\n", styles: ["aup-command-face{--icon-gap: var(--aup-command-face-icon-gap);display:inline-grid}aup-command-face>.face-container{grid-column:1;grid-row:1;display:inline-flex;flex-direction:row;align-items:center}aup-command-face>.face-container:not(:first-child){visibility:hidden}aup-command-face>.face-container *+*{margin-left:var(--icon-gap)}aup-command-face.hide-icon aup-icon{visibility:hidden}aup-command-face.centered{justify-items:center}aup-command-face.start{justify-items:self-start}aup-command-face.end{justify-items:self-end}\n"] }]
955
+ args: [{ selector: 'aup-command-face', encapsulation: ViewEncapsulation.None, template: "<div class=\"face-container\" *ngFor=\"let face of faceAdapters.value\">\n <aup-icon *ngIf=\"hasIconStart(face)\" [icon]=\"face.icon\"></aup-icon>\n <span *ngIf=\"face.text\">{{face.text}}</span>\n <aup-icon *ngIf=\"hasIconEnd(face)\" [icon]=\"face.icon\"></aup-icon>\n</div>\n", styles: ["aup-command-face{--icon-gap: var(--aup-command-face-icon-gap);display:inline-grid}aup-command-face>.face-container{grid-column:1;grid-row:1;display:inline-flex;flex-direction:row;align-items:center}aup-command-face>.face-container>span{white-space:nowrap}aup-command-face>.face-container:not(:first-child){visibility:hidden}aup-command-face>.face-container *+*{margin-left:var(--icon-gap)}aup-command-face.hide-icon aup-icon{visibility:hidden}aup-command-face.centered{justify-items:center}aup-command-face.start{justify-items:self-start}aup-command-face.end{justify-items:self-end}aup-command-face.has-text-and-leading-icon{margin-top:4px}\n"] }]
953
956
  }], ctorParameters: function () { return []; }, propDecorators: { _rawFaces: [{
954
957
  type: Input,
955
958
  args: ['faces']
@@ -967,6 +970,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
967
970
  }], color: [{
968
971
  type: HostBinding,
969
972
  args: ['attr.color']
973
+ }], hasTextAndIcon: [{
974
+ type: HostBinding,
975
+ args: ['class.has-text-and-leading-icon']
970
976
  }] } });
971
977
 
972
978
  /**
@@ -1070,11 +1076,11 @@ class CardContainerComponent extends AbstractCardContainerComponent {
1070
1076
  }
1071
1077
  }
1072
1078
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CardContainerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1073
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CardContainerComponent, selector: "aup-card-container", inputs: { columnCount: "columnCount", enableScroll: "enableScroll" }, host: { properties: { "class.auto-columns": "this.isAutoColumns", "class.single-column": "this.isSingleColumn" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"header-container\">\n <ng-content select=\"[card-container-header]\"></ng-content>\n</div>\n\n<ng-template #content>\n <div class=\"card-container\">\n <ng-content></ng-content>\n\n <div class=\"add-card-container\" *ngIf=\"addCardCommand.enabled$.value\" [pectinCommand]=\"addCardCommand\">\n <aup-command-face *ngIf=\"addCardFace\" [faces]=\"[addCardFace]\"></aup-command-face>\n <aup-icon *ngIf=\"!addCardFace\" icon=\"mat:add\"></aup-icon>\n </div>\n\n <div class=\"add-card-template\" *ngIf=\"addCardTemplate\">\n <ng-container [ngTemplateOutlet]=\"addCardTemplate\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<div class=\"no-scroll-container\" *ngIf=\"!enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</div>\n\n<aup-scroll-container *ngIf=\"enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</aup-scroll-container>\n\n<div class=\"footer-container\">\n <ng-content select=\"[card-container-footer]\"></ng-content>\n</div>\n\n", styles: [":host{--resolved-card-gap: var(--card-gap, 16px);--resolved-card-width: var(--card-width, 300px);--resolved-card-max-width: var(--card-max-width, auto);--resolved-card-height: var(--card-height, auto);--resolved-card-min-height: var(--card-min-height, auto);--resolved-card-background: var(--card-background, var(--aup-card-container-default-background-color));flex:1;display:flex;flex-direction:column;align-items:stretch;background:var(--resolved-card-background)}:host.auto-columns>*>.card-container{grid-template-columns:repeat(auto-fit,minmax(var(--resolved-card-width),var(--resolved-card-max-width)));min-width:calc(var(--resolved-card-width) + 2 * var(--resolved-card-gap));width:calc((var(--resolved-card-width) + var(--resolved-card-gap)) * 2 + var(--grid-gap))}:host:not(.auto-columns)>*>.card-container{grid-template-columns:repeat(var(--aup-card-container-column-count),1fr)}.card-container{display:grid;box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));max-width:100%;grid-auto-rows:minmax(var(--resolved-card-min-height),var(--resolved-card-height));grid-gap:var(--resolved-card-gap)}aup-scroll-container,.no-scroll-container{flex:1}.add-card-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.add-card-container:hover{border-color:transparent;background-color:#fff;color:#0000008a}.add-card-template-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: ScrollContainerComponent, selector: "aup-scroll-container", inputs: ["disableScroll$", "disableScroll"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
1079
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CardContainerComponent, selector: "aup-card-container", inputs: { columnCount: "columnCount", enableScroll: "enableScroll" }, host: { properties: { "class.auto-columns": "this.isAutoColumns", "class.single-column": "this.isSingleColumn" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"header-container\">\n <ng-content select=\"[card-container-header], [slot=header]\"></ng-content>\n</div>\n\n<ng-template #content>\n <div class=\"card-container\">\n <ng-content></ng-content>\n\n <div class=\"add-card-container\" *ngIf=\"addCardCommand.enabled$.value\" [pectinCommand]=\"addCardCommand\">\n <aup-command-face *ngIf=\"addCardFace\" [faces]=\"[addCardFace]\"></aup-command-face>\n <aup-icon *ngIf=\"!addCardFace\" icon=\"mat:add\"></aup-icon>\n </div>\n\n <div class=\"add-card-template\" *ngIf=\"addCardTemplate\">\n <ng-container [ngTemplateOutlet]=\"addCardTemplate\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<div class=\"no-scroll-container\" *ngIf=\"!enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</div>\n\n<aup-scroll-container *ngIf=\"enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</aup-scroll-container>\n\n<div class=\"footer-container\">\n <ng-content select=\"[card-container-footer], [slot=footer]\"></ng-content>\n</div>\n\n", styles: [":host{--resolved-card-gap: var(--card-gap, 16px);--resolved-card-width: var(--card-width, 300px);--resolved-card-min-width: var(--card-min-width, var(--card-width, var(--card-max-width)));--resolved-card-max-width: var(--card-max-width, var(--card-width, var(--card-min-width)));--resolved-card-height: var(--card-height, auto);--resolved-card-min-height: var(--card-min-height, auto);--resolved-card-background: var(--card-background, var(--aup-card-container-default-background-color));flex:1;display:flex;flex-direction:column;align-items:stretch;background:var(--resolved-card-background)}:host.auto-columns>*>.card-container{grid-template-columns:repeat(auto-fill,minmax(var(--resolved-card-min-width),var(--resolved-card-max-width)))}:host:not(.auto-columns)>*>.card-container{grid-template-columns:repeat(var(--aup-card-container-column-count),1fr)}.card-container{display:grid;box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));max-width:100%;grid-auto-rows:minmax(var(--resolved-card-min-height),var(--resolved-card-height));grid-gap:var(--resolved-card-gap)}aup-scroll-container,.no-scroll-container{flex:1}.add-card-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.add-card-container:hover{border-color:transparent;background-color:#fff;color:#0000008a}.add-card-template-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: ScrollContainerComponent, selector: "aup-scroll-container", inputs: ["disableScroll$", "disableScroll"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
1074
1080
  }
1075
1081
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CardContainerComponent, decorators: [{
1076
1082
  type: Component,
1077
- args: [{ selector: 'aup-card-container', template: "<div class=\"header-container\">\n <ng-content select=\"[card-container-header]\"></ng-content>\n</div>\n\n<ng-template #content>\n <div class=\"card-container\">\n <ng-content></ng-content>\n\n <div class=\"add-card-container\" *ngIf=\"addCardCommand.enabled$.value\" [pectinCommand]=\"addCardCommand\">\n <aup-command-face *ngIf=\"addCardFace\" [faces]=\"[addCardFace]\"></aup-command-face>\n <aup-icon *ngIf=\"!addCardFace\" icon=\"mat:add\"></aup-icon>\n </div>\n\n <div class=\"add-card-template\" *ngIf=\"addCardTemplate\">\n <ng-container [ngTemplateOutlet]=\"addCardTemplate\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<div class=\"no-scroll-container\" *ngIf=\"!enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</div>\n\n<aup-scroll-container *ngIf=\"enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</aup-scroll-container>\n\n<div class=\"footer-container\">\n <ng-content select=\"[card-container-footer]\"></ng-content>\n</div>\n\n", styles: [":host{--resolved-card-gap: var(--card-gap, 16px);--resolved-card-width: var(--card-width, 300px);--resolved-card-max-width: var(--card-max-width, auto);--resolved-card-height: var(--card-height, auto);--resolved-card-min-height: var(--card-min-height, auto);--resolved-card-background: var(--card-background, var(--aup-card-container-default-background-color));flex:1;display:flex;flex-direction:column;align-items:stretch;background:var(--resolved-card-background)}:host.auto-columns>*>.card-container{grid-template-columns:repeat(auto-fit,minmax(var(--resolved-card-width),var(--resolved-card-max-width)));min-width:calc(var(--resolved-card-width) + 2 * var(--resolved-card-gap));width:calc((var(--resolved-card-width) + var(--resolved-card-gap)) * 2 + var(--grid-gap))}:host:not(.auto-columns)>*>.card-container{grid-template-columns:repeat(var(--aup-card-container-column-count),1fr)}.card-container{display:grid;box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));max-width:100%;grid-auto-rows:minmax(var(--resolved-card-min-height),var(--resolved-card-height));grid-gap:var(--resolved-card-gap)}aup-scroll-container,.no-scroll-container{flex:1}.add-card-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.add-card-container:hover{border-color:transparent;background-color:#fff;color:#0000008a}.add-card-template-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}\n"] }]
1083
+ args: [{ selector: 'aup-card-container', template: "<div class=\"header-container\">\n <ng-content select=\"[card-container-header], [slot=header]\"></ng-content>\n</div>\n\n<ng-template #content>\n <div class=\"card-container\">\n <ng-content></ng-content>\n\n <div class=\"add-card-container\" *ngIf=\"addCardCommand.enabled$.value\" [pectinCommand]=\"addCardCommand\">\n <aup-command-face *ngIf=\"addCardFace\" [faces]=\"[addCardFace]\"></aup-command-face>\n <aup-icon *ngIf=\"!addCardFace\" icon=\"mat:add\"></aup-icon>\n </div>\n\n <div class=\"add-card-template\" *ngIf=\"addCardTemplate\">\n <ng-container [ngTemplateOutlet]=\"addCardTemplate\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<div class=\"no-scroll-container\" *ngIf=\"!enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</div>\n\n<aup-scroll-container *ngIf=\"enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</aup-scroll-container>\n\n<div class=\"footer-container\">\n <ng-content select=\"[card-container-footer], [slot=footer]\"></ng-content>\n</div>\n\n", styles: [":host{--resolved-card-gap: var(--card-gap, 16px);--resolved-card-width: var(--card-width, 300px);--resolved-card-min-width: var(--card-min-width, var(--card-width, var(--card-max-width)));--resolved-card-max-width: var(--card-max-width, var(--card-width, var(--card-min-width)));--resolved-card-height: var(--card-height, auto);--resolved-card-min-height: var(--card-min-height, auto);--resolved-card-background: var(--card-background, var(--aup-card-container-default-background-color));flex:1;display:flex;flex-direction:column;align-items:stretch;background:var(--resolved-card-background)}:host.auto-columns>*>.card-container{grid-template-columns:repeat(auto-fill,minmax(var(--resolved-card-min-width),var(--resolved-card-max-width)))}:host:not(.auto-columns)>*>.card-container{grid-template-columns:repeat(var(--aup-card-container-column-count),1fr)}.card-container{display:grid;box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));max-width:100%;grid-auto-rows:minmax(var(--resolved-card-min-height),var(--resolved-card-height));grid-gap:var(--resolved-card-gap)}aup-scroll-container,.no-scroll-container{flex:1}.add-card-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.add-card-container:hover{border-color:transparent;background-color:#fff;color:#0000008a}.add-card-template-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}\n"] }]
1078
1084
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { columnCount: [{
1079
1085
  type: Input
1080
1086
  }], enableScroll: [{
@@ -1150,14 +1156,24 @@ class CommandComponent extends PopupAwareComponent {
1150
1156
  activeFace$;
1151
1157
  iconOnly$;
1152
1158
  tooltip$;
1159
+ visible$;
1153
1160
  constructor(element, parent) {
1154
1161
  super(element, parent);
1155
1162
  const { chain, switchOn } = Dsl.disposeWith(this);
1156
- this.faces$ = chain(this.command.busy$).mapToList(busy => {
1163
+ this.faces$ = chain(this.command.busy$)
1164
+ .mapToList(busy => {
1157
1165
  return busy ?
1158
- [this.busyFace$.value, this.face$.value] :
1159
- [this.face$.value, this.busyFace$.value];
1160
- }, { allowNil: true, dependsOn: [this.face$, this.busyFace$] })
1166
+ [this.busyFace$.value ?? this.command.busyFace$.value, this.face$.value ?? this.command.defaultFace$.value] :
1167
+ [this.face$.value ?? this.command.defaultFace$.value, this.busyFace$.value ?? this.command.busyFace$.value];
1168
+ }, {
1169
+ allowNil: true,
1170
+ dependsOn: [
1171
+ this.face$,
1172
+ this.busyFace$,
1173
+ this.command.defaultFace$,
1174
+ this.command.busyFace$
1175
+ ]
1176
+ })
1161
1177
  .rejectNil();
1162
1178
  this.activeFace$ = this.faces$.first();
1163
1179
  this.buttonStyle$ = chain(this.activeFace$).map(f => CommandFace.getStyleOf(f));
@@ -1166,18 +1182,19 @@ class CommandComponent extends PopupAwareComponent {
1166
1182
  this.iconOnly$ = this.faces$.select(face => {
1167
1183
  return isEmpty(CommandFace.getTextOf(face)) && !isEmpty(CommandFace.getIconOf(face));
1168
1184
  }).count().equals(this.faces$.count());
1185
+ this.visible$ = chain(this.command.visible$);
1186
+ }
1187
+ get cssDisplayProperty() {
1188
+ return this.visible$.value ? undefined : 'none';
1169
1189
  }
1170
1190
  isActive(face) {
1171
1191
  return this.activeFace$.query().equals(face);
1172
1192
  }
1173
- getFace() {
1174
- return this.face;
1175
- }
1176
1193
  requestFocus() {
1177
1194
  this.button.focus();
1178
1195
  }
1179
1196
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CommandComponent, deps: [{ token: i0.ElementRef }, { token: POPUP_CONTAINER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1180
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CommandComponent, selector: "aup-command", inputs: { command: "command", face$: "face$", face: "face", busyFace$: "busyFace$", busyFace: "busyFace", alignFace: "alignFace" }, host: { properties: { "class": "this.alignFace" } }, viewQueries: [{ propertyName: "button", first: true, predicate: MatButton, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"iconOnly$.value\">\n <button mat-icon-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n</ng-container>\n<ng-container *ngIf=\"!iconOnly$.value\">\n <ng-container [ngSwitch]=\"buttonStyle$.value\">\n <ng-container *ngSwitchCase=\"CommandFace.Style.STROKED\">\n <button mat-stroked-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n <ng-container *ngSwitchCase=\"CommandFace.Style.RAISED\">\n <button mat-raised-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <button mat-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n </ng-container>\n</ng-container>\n", styles: [":host{display:inline-flex;flex-direction:row;justify-content:stretch}:host.centered button{text-align:center}:host.start button{text-align:start}:host.end button{text-align:end}button{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
1197
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CommandComponent, selector: "aup-command", inputs: { command: "command", face$: "face$", face: "face", busyFace$: "busyFace$", busyFace: "busyFace", alignFace: "alignFace" }, host: { properties: { "class": "this.alignFace", "style.display": "this.cssDisplayProperty" } }, viewQueries: [{ propertyName: "button", first: true, predicate: MatButton, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"iconOnly$.value\">\n <button mat-icon-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n</ng-container>\n<ng-container *ngIf=\"!iconOnly$.value\">\n <ng-container [ngSwitch]=\"buttonStyle$.value\">\n <ng-container *ngSwitchCase=\"CommandFace.Style.STROKED\">\n <button mat-stroked-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n <ng-container *ngSwitchCase=\"CommandFace.Style.RAISED\">\n <button mat-raised-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <button mat-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n </ng-container>\n</ng-container>\n", styles: [":host{display:inline-flex;flex-direction:row;justify-content:stretch}:host.centered button{text-align:center}:host.start button{text-align:start}:host.end button{text-align:end}button{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
1181
1198
  }
1182
1199
  __decorate([
1183
1200
  Proxify(),
@@ -1225,6 +1242,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1225
1242
  }], button: [{
1226
1243
  type: ViewChild,
1227
1244
  args: [MatButton]
1245
+ }], cssDisplayProperty: [{
1246
+ type: HostBinding,
1247
+ args: ["style.display"]
1228
1248
  }] } });
1229
1249
 
1230
1250
  /**
@@ -1252,12 +1272,12 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1252
1272
  xPosition = 'after';
1253
1273
  yPosition = 'below';
1254
1274
  triggers;
1255
- #enabled_accessor_storage;
1256
- get enabled() { return this.#enabled_accessor_storage; }
1257
- set enabled(value) { this.#enabled_accessor_storage = value; }
1258
1275
  #enabled$_accessor_storage = proxify((ValueModel));
1259
1276
  get enabled$() { return this.#enabled$_accessor_storage; }
1260
1277
  set enabled$(value) { this.#enabled$_accessor_storage = value; }
1278
+ #enabled_accessor_storage = true;
1279
+ get enabled() { return this.#enabled_accessor_storage; }
1280
+ set enabled(value) { this.#enabled_accessor_storage = value; }
1261
1281
  children;
1262
1282
  faces$;
1263
1283
  constructor(element, parent) {
@@ -1299,16 +1319,16 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1299
1319
  return this.faceAdapter.face;
1300
1320
  }
1301
1321
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractPopupMenuComponent, deps: [{ token: i0.ElementRef }, { token: POPUP_CONTAINER }], target: i0.ɵɵFactoryTarget.Component });
1302
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractPopupMenuComponent, selector: "aup-abstract-popup-menu", inputs: { xPosition: "xPosition", yPosition: "yPosition", enabled: "enabled", enabled$: "enabled$" }, viewQueries: [{ propertyName: "triggers", predicate: MatMenuTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
1322
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractPopupMenuComponent, selector: "aup-abstract-popup-menu", inputs: { xPosition: "xPosition", yPosition: "yPosition", enabled$: "enabled$", enabled: "enabled" }, viewQueries: [{ propertyName: "triggers", predicate: MatMenuTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
1303
1323
  }
1304
- __decorate([
1305
- StoreInValueModel(),
1306
- __metadata("design:type", Boolean)
1307
- ], AbstractPopupMenuComponent.prototype, "enabled", null);
1308
1324
  __decorate([
1309
1325
  Proxify(),
1310
1326
  __metadata("design:type", Object)
1311
1327
  ], AbstractPopupMenuComponent.prototype, "enabled$", null);
1328
+ __decorate([
1329
+ StoreInValueModel(),
1330
+ __metadata("design:type", Object)
1331
+ ], AbstractPopupMenuComponent.prototype, "enabled", null);
1312
1332
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractPopupMenuComponent, decorators: [{
1313
1333
  type: Component,
1314
1334
  args: [{ selector: 'aup-abstract-popup-menu', template: '' }]
@@ -1322,10 +1342,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1322
1342
  }], triggers: [{
1323
1343
  type: ViewChildren,
1324
1344
  args: [MatMenuTrigger]
1325
- }], enabled: [{
1326
- type: Input
1327
1345
  }], enabled$: [{
1328
1346
  type: Input
1347
+ }], enabled: [{
1348
+ type: Input
1329
1349
  }] } });
1330
1350
 
1331
1351
  class CommandContainer extends GarbageCollector {
@@ -1358,13 +1378,15 @@ class ToolBarComponent extends CommandContainer {
1358
1378
  get orientation() {
1359
1379
  return CommandContainer.Orientation.HORIZONTAL;
1360
1380
  }
1361
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, deps: [{ token: CommandContainer }], target: i0.ɵɵFactoryTarget.Component });
1381
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, deps: [{ token: CommandContainer, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1362
1382
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ToolBarComponent, selector: "aup-tool-bar", usesInheritance: true, ngImport: i0, template: '<div class="toolbar-content"><ng-content></ng-content></div>', isInline: true, styles: [":host{display:inline-block}.toolbar-content{display:inline-flex;flex-direction:row;align-items:center}.toolbar-content>aup-separator{align-self:stretch;margin:4px 0 4px 8px}.toolbar-content>aup-flex{flex:1}.toolbar-content>*+*{margin-left:8px}\n"], encapsulation: i0.ViewEncapsulation.None });
1363
1383
  }
1364
1384
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, decorators: [{
1365
1385
  type: Component,
1366
1386
  args: [{ selector: 'aup-tool-bar', template: '<div class="toolbar-content"><ng-content></ng-content></div>', encapsulation: ViewEncapsulation.None, styles: [":host{display:inline-block}.toolbar-content{display:inline-flex;flex-direction:row;align-items:center}.toolbar-content>aup-separator{align-self:stretch;margin:4px 0 4px 8px}.toolbar-content>aup-flex{flex:1}.toolbar-content>*+*{margin-left:8px}\n"] }]
1367
- }], ctorParameters: function () { return [{ type: CommandContainer }]; } });
1387
+ }], ctorParameters: function () { return [{ type: CommandContainer, decorators: [{
1388
+ type: Optional
1389
+ }] }]; } });
1368
1390
 
1369
1391
  /**
1370
1392
  *
@@ -1675,7 +1697,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1675
1697
  args: ['blur']
1676
1698
  }] } });
1677
1699
 
1678
- /* tslint:disable:no-input-rename */
1679
1700
  const INPUT_TOKEN_HACK = new InjectionToken("INPUT_TOKEN_HACK");
1680
1701
  class AbstractInputComponent extends DisposableComponent {
1681
1702
  onValueEditedListeners = new EventListenerList();
@@ -1690,11 +1711,16 @@ class AbstractInputComponent extends DisposableComponent {
1690
1711
  * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).
1691
1712
  */
1692
1713
  formValue$;
1693
- label;
1694
- // eslint-disable-next-line @angular-eslint/no-input-rename
1714
+ #i18n$_accessor_storage = proxify((MutableValueModel));
1715
+ get i18n$() { return this.#i18n$_accessor_storage; }
1716
+ set i18n$(value) { this.#i18n$_accessor_storage = value; }
1717
+ #i18n_accessor_storage;
1718
+ get i18n() { return this.#i18n_accessor_storage; }
1719
+ set i18n(value) { this.#i18n_accessor_storage = value; }
1720
+ _label;
1695
1721
  userFloatLabel = 'always'; // TODO: make this an injectable default
1696
- hint;
1697
- placeholder;
1722
+ _hint;
1723
+ _placeholder;
1698
1724
  dense = false;
1699
1725
  _enabled$ = this.registerDisposable(new DelegatingValueModel());
1700
1726
  set enabled$(condition$) {
@@ -1761,6 +1787,9 @@ class AbstractInputComponent extends DisposableComponent {
1761
1787
  isEnabled() {
1762
1788
  return this.enabled$.value;
1763
1789
  }
1790
+ get disabled() {
1791
+ return !this.isEnabled();
1792
+ }
1764
1793
  hasErrors() {
1765
1794
  return !this.errorList$.query().isEmpty();
1766
1795
  }
@@ -1773,6 +1802,15 @@ class AbstractInputComponent extends DisposableComponent {
1773
1802
  get focusContext() {
1774
1803
  return this.formValue$.focusContext;
1775
1804
  }
1805
+ get label() {
1806
+ return this._label ?? this.i18n?.label();
1807
+ }
1808
+ get hint() {
1809
+ return this._hint ?? this.hackyGetI18n("hint");
1810
+ }
1811
+ get placeholder() {
1812
+ return this._placeholder ?? this.hackyGetI18n("placeholder");
1813
+ }
1776
1814
  get floatLabel() {
1777
1815
  // return this.dense ? 'never' : this.userFloatLabel;
1778
1816
  return this.userFloatLabel;
@@ -1787,24 +1825,45 @@ class AbstractInputComponent extends DisposableComponent {
1787
1825
  onValueEdited(callback) {
1788
1826
  return this.onValueEditedListeners.add(callback);
1789
1827
  }
1828
+ hackyGetI18n(key) {
1829
+ // TODO: update I18n to make it possible to get an optional value with return the missing key message.
1830
+ const i18nFn = this.i18n ? this.i18n[key] : undefined;
1831
+ const i18nValue = i18nFn && i18nFn();
1832
+ return i18nValue?.startsWith("missing key") ? undefined : i18nValue;
1833
+ }
1790
1834
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractInputComponent, deps: [{ token: INPUT_TOKEN_HACK }], target: i0.ɵɵFactoryTarget.Component });
1791
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractInputComponent, selector: "ng-component", inputs: { label: "label", userFloatLabel: ["floatLabel", "userFloatLabel"], hint: "hint", placeholder: "placeholder", dense: "dense", enabled$: "enabled$", focusCommand: ["command.focus", "focusCommand"], blurCommand: ["command.blur", "blurCommand"], enterCommand: ["command.enter", "enterCommand"], escapeCommand: ["command.escape", "escapeCommand"], clickCommand: ["command.click", "clickCommand"] }, outputs: { focus: "focus", blur: "blur", enterKey: "enterKey", escapeKey: "escapeKey" }, host: { listeners: { "click": "notifyClick()", "focusin": "notifyFocusIn()", "focusout": "notifyFocusOut()" }, properties: { "class.dense": "this.dense", "class": "this.baseClassName" } }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
1835
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractInputComponent, selector: "ng-component", inputs: { i18n$: "i18n$", i18n: "i18n", _label: ["label", "_label"], userFloatLabel: ["floatLabel", "userFloatLabel"], _hint: ["hint", "_hint"], _placeholder: ["placeholder", "_placeholder"], dense: "dense", enabled$: "enabled$", focusCommand: ["command.focus", "focusCommand"], blurCommand: ["command.blur", "blurCommand"], enterCommand: ["command.enter", "enterCommand"], escapeCommand: ["command.escape", "escapeCommand"], clickCommand: ["command.click", "clickCommand"] }, outputs: { focus: "focus", blur: "blur", enterKey: "enterKey", escapeKey: "escapeKey" }, host: { listeners: { "click": "notifyClick()", "focusin": "notifyFocusIn()", "focusout": "notifyFocusOut()" }, properties: { "class.dense": "this.dense", "class": "this.baseClassName", "class.disabled": "this.disabled" } }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
1792
1836
  }
1837
+ __decorate([
1838
+ Proxify(),
1839
+ __metadata("design:type", Object)
1840
+ ], AbstractInputComponent.prototype, "i18n$", null);
1841
+ __decorate([
1842
+ StoreInValueModel(),
1843
+ __metadata("design:type", Object)
1844
+ ], AbstractInputComponent.prototype, "i18n", null);
1793
1845
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractInputComponent, decorators: [{
1794
1846
  type: Component,
1795
1847
  args: [{ template: '' }]
1796
1848
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1797
1849
  type: Inject,
1798
1850
  args: [INPUT_TOKEN_HACK]
1799
- }] }]; }, propDecorators: { label: [{
1851
+ }] }]; }, propDecorators: { i18n$: [{
1800
1852
  type: Input
1853
+ }], i18n: [{
1854
+ type: Input
1855
+ }], _label: [{
1856
+ type: Input,
1857
+ args: ["label"]
1801
1858
  }], userFloatLabel: [{
1802
1859
  type: Input,
1803
1860
  args: ['floatLabel']
1804
- }], hint: [{
1805
- type: Input
1806
- }], placeholder: [{
1807
- type: Input
1861
+ }], _hint: [{
1862
+ type: Input,
1863
+ args: ['hint']
1864
+ }], _placeholder: [{
1865
+ type: Input,
1866
+ args: ['placeholder']
1808
1867
  }], dense: [{
1809
1868
  type: HostBinding,
1810
1869
  args: ['class.dense']
@@ -1847,6 +1906,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1847
1906
  }], notifyFocusOut: [{
1848
1907
  type: HostListener,
1849
1908
  args: ['focusout']
1909
+ }], disabled: [{
1910
+ type: HostBinding,
1911
+ args: ["class.disabled"]
1850
1912
  }] } });
1851
1913
 
1852
1914
  class AbstractListInputComponent extends AbstractInputComponent {
@@ -2084,12 +2146,15 @@ class CheckboxInputComponent extends AbstractValueInputComponent {
2084
2146
  constructor() {
2085
2147
  super();
2086
2148
  }
2149
+ select($event) {
2150
+ this.componentValue$.value = $event.checked;
2151
+ }
2087
2152
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CheckboxInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2088
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CheckboxInputComponent, selector: "aup-checkbox-input", inputs: { color: "color", labelPosition: "labelPosition" }, usesInheritance: true, ngImport: i0, template: "<!-- TODO: add focus binding -->\n<mat-checkbox\n [(ngModel)]=\"componentValue$.value\"\n [color]=\"color\"\n [labelPosition]=\"labelPosition\"\n [disabled]=\"!isEnabled()\"\n>{{label}}</mat-checkbox>\n<mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n<mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n", styles: [":host{display:inline-flex;flex-direction:column;padding:24px 0 16px}:host.dense{padding:6px 0 2px}mat-hint,mat-error{margin-top:4px;margin-left:24px;font-size:12px;font-weight:400;line-height:13.5px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i4$3.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }] });
2153
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CheckboxInputComponent, selector: "aup-checkbox-input", inputs: { color: "color", labelPosition: "labelPosition" }, usesInheritance: true, ngImport: i0, template: "<!-- TODO: add focus binding -->\n<!-- NOTE: using [(ngModel)] affects how material renders the component and makes it harder to test so we're using [checked] and (change) -->\n<mat-checkbox\n [checked]=\"componentValue$.value\"\n (change)=\"select($event)\"\n [color]=\"color\"\n [labelPosition]=\"labelPosition\"\n [disabled]=\"!isEnabled()\"\n>{{ label }}\n</mat-checkbox>\n<ng-container *ngIf=\"!dense\">\n <mat-hint *ngIf=\"showHint\">{{ hint }}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{ firstError }}</mat-error>\n</ng-container>\n", styles: [":host{display:inline-flex;flex-direction:column;padding:10px 0 0}:host.dense{padding:4px 0 2px}mat-hint,mat-error{margin-top:4px;margin-left:24px;font-size:12px;font-weight:400;line-height:13.5px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i3$1.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }] });
2089
2154
  }
2090
2155
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CheckboxInputComponent, decorators: [{
2091
2156
  type: Component,
2092
- args: [{ selector: 'aup-checkbox-input', template: "<!-- TODO: add focus binding -->\n<mat-checkbox\n [(ngModel)]=\"componentValue$.value\"\n [color]=\"color\"\n [labelPosition]=\"labelPosition\"\n [disabled]=\"!isEnabled()\"\n>{{label}}</mat-checkbox>\n<mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n<mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n", styles: [":host{display:inline-flex;flex-direction:column;padding:24px 0 16px}:host.dense{padding:6px 0 2px}mat-hint,mat-error{margin-top:4px;margin-left:24px;font-size:12px;font-weight:400;line-height:13.5px}\n"] }]
2157
+ args: [{ selector: 'aup-checkbox-input', template: "<!-- TODO: add focus binding -->\n<!-- NOTE: using [(ngModel)] affects how material renders the component and makes it harder to test so we're using [checked] and (change) -->\n<mat-checkbox\n [checked]=\"componentValue$.value\"\n (change)=\"select($event)\"\n [color]=\"color\"\n [labelPosition]=\"labelPosition\"\n [disabled]=\"!isEnabled()\"\n>{{ label }}\n</mat-checkbox>\n<ng-container *ngIf=\"!dense\">\n <mat-hint *ngIf=\"showHint\">{{ hint }}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{ firstError }}</mat-error>\n</ng-container>\n", styles: [":host{display:inline-flex;flex-direction:column;padding:10px 0 0}:host.dense{padding:4px 0 2px}mat-hint,mat-error{margin-top:4px;margin-left:24px;font-size:12px;font-weight:400;line-height:13.5px}\n"] }]
2093
2158
  }], ctorParameters: function () { return []; }, propDecorators: { color: [{
2094
2159
  type: Input
2095
2160
  }], labelPosition: [{
@@ -2128,7 +2193,7 @@ class MultipleSelectInputComponent extends AbstractListInputComponent {
2128
2193
  const self = this;
2129
2194
  this.registerDisposable(new Binding(this.componentList$, this.ids$, {
2130
2195
  toLeft(selectedItems, currentLeftValue) {
2131
- const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !it);
2196
+ const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !!it);
2132
2197
  // if our lookup didn't find anything then we return the previous values so we don't clobber selections when the options go empty
2133
2198
  return newValues.length < 1 && selectedItems.length > 0 ? currentLeftValue : newValues;
2134
2199
  },
@@ -2139,7 +2204,7 @@ class MultipleSelectInputComponent extends AbstractListInputComponent {
2139
2204
  })).writeRight();
2140
2205
  }
2141
2206
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: MultipleSelectInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2142
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: MultipleSelectInputComponent, selector: "aup-multiple-select-input", inputs: { options$: "options$", options: "options", optionLabel: "optionLabel", optionLabelFormat: "optionLabelFormat" }, queries: [{ propertyName: "optionTemplateRef", first: true, predicate: ["optionTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n multiple\n [ngModel]=\"componentList$.value\"\n (ngModelChange)=\"selectAll($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-option *ngFor=\"let option of options$.value; let i = index\" [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n </mat-select>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n<div class=\"width-strut\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <div>{{placeholder}}</div>\n <div class=\"item\" *ngFor=\"let item of options\">{{optionLabelFormat(item)}}</div>\n</div>\n", styles: [":host{display:inline-block}mat-form-field{width:100%}.width-strut{display:block;height:0;max-height:0;width:auto;visibility:hidden;overflow:hidden;padding-right:35px}.width-strut mat-label{font-size:75%}.width-strut>.item{font-size:16px;padding-left:30px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i4$4.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }] });
2207
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: MultipleSelectInputComponent, selector: "aup-multiple-select-input", inputs: { options$: "options$", options: "options", optionLabel: "optionLabel", optionLabelFormat: "optionLabelFormat" }, queries: [{ propertyName: "optionTemplateRef", first: true, predicate: ["optionTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n multiple\n [ngModel]=\"componentList$.value\"\n (ngModelChange)=\"selectAll($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-option *ngFor=\"let option of options$.value; let i = index\" [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n </mat-select>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n<div class=\"width-strut\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <div>{{placeholder}}</div>\n <div class=\"item\" *ngFor=\"let item of options\">{{optionLabelFormat(item)}}</div>\n</div>\n", styles: [":host{display:inline-block}mat-form-field{width:100%}.width-strut{display:block;height:0;max-height:0;width:auto;visibility:hidden;overflow:hidden;padding-right:35px}.width-strut mat-label{font-size:75%}.width-strut>.item{font-size:16px;padding-left:30px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i4$3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }] });
2143
2208
  }
2144
2209
  __decorate([
2145
2210
  Proxify(),
@@ -2167,48 +2232,178 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2167
2232
 
2168
2233
  class NumberInputComponent extends AbstractValueInputComponent {
2169
2234
  autocomplete;
2170
- min = Number.MIN_SAFE_INTEGER;
2171
- max = Number.MAX_SAFE_INTEGER;
2172
- iconPrefix;
2235
+ #min$_accessor_storage = proxify((ValueModel));
2236
+ get min$() { return this.#min$_accessor_storage; }
2237
+ set min$(value) { this.#min$_accessor_storage = value; }
2238
+ #min_accessor_storage = Number.MIN_SAFE_INTEGER;
2239
+ get min() { return this.#min_accessor_storage; }
2240
+ set min(value) { this.#min_accessor_storage = value; }
2241
+ #max$_accessor_storage = proxify((ValueModel));
2242
+ get max$() { return this.#max$_accessor_storage; }
2243
+ set max$(value) { this.#max$_accessor_storage = value; }
2244
+ #max_accessor_storage = Number.MAX_SAFE_INTEGER;
2245
+ get max() { return this.#max_accessor_storage; }
2246
+ set max(value) { this.#max_accessor_storage = value; }
2247
+ #significantDigits$_accessor_storage = proxify((ValueModel));
2248
+ get significantDigits$() { return this.#significantDigits$_accessor_storage; }
2249
+ set significantDigits$(value) { this.#significantDigits$_accessor_storage = value; }
2250
+ #significantDigits_accessor_storage;
2251
+ get significantDigits() { return this.#significantDigits_accessor_storage; }
2252
+ set significantDigits(value) { this.#significantDigits_accessor_storage = value; }
2253
+ incrementCommand;
2254
+ decrementCommand;
2255
+ displayValue$;
2256
+ step$;
2173
2257
  constructor() {
2174
2258
  super();
2259
+ const { chain } = Dsl.disposeWith(this);
2260
+ this.step$ = chain(this.significantDigits$).map(v => 10 ** (-v)).otherwise(1);
2261
+ this.displayValue$ = chain(this.value$).map(v => this.clampSignificantDigits(v), {
2262
+ dependsOn: this.significantDigits$
2263
+ });
2264
+ const normalisedValue$ = chain(this.value$).otherwise(0);
2265
+ this.incrementCommand = Command.create(() => {
2266
+ this.value$.value = this.increment(this.value$.value);
2267
+ }).enableWhile(chain.numericValue(normalisedValue$).isLessThan(this.max$).and(this.enabled$));
2268
+ this.decrementCommand = Command.create(() => {
2269
+ this.value$.value = this.decrement(this.value$.value);
2270
+ }).enableWhile(chain.numericValue(normalisedValue$).isGreaterThan(this.min$).and(this.enabled$));
2271
+ }
2272
+ increment(value) {
2273
+ return this.clampSignificantDigits((value ?? 0) + this.step$.value);
2274
+ }
2275
+ decrement(value) {
2276
+ return this.clampSignificantDigits((value ?? 0) - this.step$.value);
2277
+ }
2278
+ clampSignificantDigits(value) {
2279
+ return Number(value.toFixed(this.significantDigits));
2280
+ }
2281
+ onValueChange(value) {
2282
+ this.value$.value = value;
2175
2283
  }
2176
2284
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NumberInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2177
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: NumberInputComponent, selector: "aup-number-input", inputs: { autocomplete: "autocomplete", min: "min", max: "max", iconPrefix: "iconPrefix" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n >\n <mat-hint *ngIf=\"hint && !dense\" >{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <aup-icon *ngIf=\"iconPrefix\" matPrefix [icon]=\"iconPrefix\"></aup-icon>\n</mat-form-field>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2$4.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4$2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }] });
2285
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: NumberInputComponent, selector: "aup-number-input", inputs: { autocomplete: "autocomplete", min$: "min$", min: "min", max$: "max$", max: "max", significantDigits$: "significantDigits$", significantDigits: "significantDigits" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field floatLabel=\"always\">\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [ngModel]=\"displayValue$.value\"\n (ngModelChange)=\"onValueChange($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n [size]=\"4\"\n [step]=\"step$.value\"\n >\n <section matIconSuffix>\n <button [pectinCommand]=\"decrementCommand\">-</button>\n <button [pectinCommand]=\"incrementCommand\">+</button>\n </section>\n <mat-hint *ngIf=\"hint && !dense\">{{ hint }}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{ firstError }}</mat-error>\n</mat-form-field>\n", styles: [":host{--width: 56px;--height: 42px;--margin-right: 1px;--border-radius: 3px;--border-color:#d5d5d5;--button-background: #fafafa;--button-background-hover: #efefef}:host input[type=number]{appearance:textfield}:host input[type=number]::-webkit-inner-spin-button,:host input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}:host:focus-within:has(section:not(:focus-within)){--height: 40px;--margin-right: 2px;--border-radius: 2px}:host section[maticonsuffix]{display:flex;flex-direction:row;align-items:stretch;gap:1px;background-color:var(--border-color);border-left:1px solid var(--border-color);width:var(--width);min-width:var(--width);height:var(--height);min-height:var(--height);margin-right:var(--margin-right);border-top-right-radius:var(--border-radius);border-bottom-right-radius:var(--border-radius);overflow:hidden}:host button{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;font-weight:600;border-style:none;background-color:var(--button-background)}:host button:hover{background-color:var(--button-background-hover)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2$4.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }] });
2178
2286
  }
2287
+ __decorate([
2288
+ Proxify(),
2289
+ __metadata("design:type", ValueModel)
2290
+ ], NumberInputComponent.prototype, "min$", null);
2291
+ __decorate([
2292
+ StoreInValueModel(),
2293
+ __metadata("design:type", Object)
2294
+ ], NumberInputComponent.prototype, "min", null);
2295
+ __decorate([
2296
+ Proxify(),
2297
+ __metadata("design:type", ValueModel)
2298
+ ], NumberInputComponent.prototype, "max$", null);
2299
+ __decorate([
2300
+ StoreInValueModel(),
2301
+ __metadata("design:type", Object)
2302
+ ], NumberInputComponent.prototype, "max", null);
2303
+ __decorate([
2304
+ Proxify(),
2305
+ __metadata("design:type", ValueModel)
2306
+ ], NumberInputComponent.prototype, "significantDigits$", null);
2307
+ __decorate([
2308
+ StoreInValueModel(),
2309
+ __metadata("design:type", Number)
2310
+ ], NumberInputComponent.prototype, "significantDigits", null);
2179
2311
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NumberInputComponent, decorators: [{
2180
2312
  type: Component,
2181
- args: [{ selector: 'aup-number-input', template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n >\n <mat-hint *ngIf=\"hint && !dense\" >{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <aup-icon *ngIf=\"iconPrefix\" matPrefix [icon]=\"iconPrefix\"></aup-icon>\n</mat-form-field>\n" }]
2313
+ args: [{ selector: 'aup-number-input', template: "<mat-form-field floatLabel=\"always\">\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [ngModel]=\"displayValue$.value\"\n (ngModelChange)=\"onValueChange($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n [size]=\"4\"\n [step]=\"step$.value\"\n >\n <section matIconSuffix>\n <button [pectinCommand]=\"decrementCommand\">-</button>\n <button [pectinCommand]=\"incrementCommand\">+</button>\n </section>\n <mat-hint *ngIf=\"hint && !dense\">{{ hint }}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{ firstError }}</mat-error>\n</mat-form-field>\n", styles: [":host{--width: 56px;--height: 42px;--margin-right: 1px;--border-radius: 3px;--border-color:#d5d5d5;--button-background: #fafafa;--button-background-hover: #efefef}:host input[type=number]{appearance:textfield}:host input[type=number]::-webkit-inner-spin-button,:host input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}:host:focus-within:has(section:not(:focus-within)){--height: 40px;--margin-right: 2px;--border-radius: 2px}:host section[maticonsuffix]{display:flex;flex-direction:row;align-items:stretch;gap:1px;background-color:var(--border-color);border-left:1px solid var(--border-color);width:var(--width);min-width:var(--width);height:var(--height);min-height:var(--height);margin-right:var(--margin-right);border-top-right-radius:var(--border-radius);border-bottom-right-radius:var(--border-radius);overflow:hidden}:host button{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;font-weight:600;border-style:none;background-color:var(--button-background)}:host button:hover{background-color:var(--button-background-hover)}\n"] }]
2182
2314
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2183
2315
  type: Input
2316
+ }], min$: [{
2317
+ type: Input
2184
2318
  }], min: [{
2185
2319
  type: Input
2320
+ }], max$: [{
2321
+ type: Input
2186
2322
  }], max: [{
2187
2323
  type: Input
2188
- }], iconPrefix: [{
2324
+ }], significantDigits$: [{
2325
+ type: Input
2326
+ }], significantDigits: [{
2189
2327
  type: Input
2190
2328
  }] } });
2191
2329
 
2192
2330
  class PasswordInputComponent extends AbstractValueInputComponent {
2193
2331
  autocomplete;
2332
+ #enableShowPassword$_accessor_storage = proxify((ValueModel));
2333
+ get enableShowPassword$() { return this.#enableShowPassword$_accessor_storage; }
2334
+ set enableShowPassword$(value) { this.#enableShowPassword$_accessor_storage = value; }
2335
+ #enableShowPassword_accessor_storage = false;
2336
+ get enableShowPassword() { return this.#enableShowPassword_accessor_storage; }
2337
+ set enableShowPassword(value) { this.#enableShowPassword_accessor_storage = value; }
2338
+ showPassword$ = new MutableValueModel(false);
2339
+ toggleShowPasswordCommand;
2194
2340
  constructor() {
2195
2341
  super();
2342
+ const { chain, valueOf } = Dsl.disposeWith(this);
2343
+ const face$ = chain(this.showPassword$).map(show => {
2344
+ return {
2345
+ icon: () => show ? "mat:visibility_off" : "mat:visibility"
2346
+ };
2347
+ });
2348
+ this.toggleShowPasswordCommand = Command.create(() => {
2349
+ this.showPassword$.value = !this.showPassword$.value;
2350
+ })
2351
+ .withFace(face$)
2352
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2353
+ }
2354
+ get fieldType() {
2355
+ return this.showPassword$.value ? "text" : "password";
2196
2356
  }
2197
2357
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PasswordInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2198
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: PasswordInputComponent, selector: "aup-password-input", inputs: { autocomplete: "autocomplete" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input type=\"password\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }] });
2358
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: PasswordInputComponent, selector: "aup-password-input", inputs: { autocomplete: "autocomplete", enableShowPassword$: "enableShowPassword$", enableShowPassword: "enableShowPassword" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input [type]=\"fieldType\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <span matSuffix *ngIf=\"enableShowPassword$.value\">\n <aup-command [command]=\"toggleShowPasswordCommand\" data-cy=\"showPassword\"></aup-command>\n </span>\n</mat-form-field>\n\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }, { kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }] });
2199
2359
  }
2360
+ __decorate([
2361
+ Proxify(),
2362
+ __metadata("design:type", Object)
2363
+ ], PasswordInputComponent.prototype, "enableShowPassword$", null);
2364
+ __decorate([
2365
+ StoreInValueModel(),
2366
+ __metadata("design:type", Object)
2367
+ ], PasswordInputComponent.prototype, "enableShowPassword", null);
2200
2368
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PasswordInputComponent, decorators: [{
2201
2369
  type: Component,
2202
- args: [{ selector: 'aup-password-input', template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input type=\"password\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n\n" }]
2370
+ args: [{ selector: 'aup-password-input', template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input [type]=\"fieldType\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <span matSuffix *ngIf=\"enableShowPassword$.value\">\n <aup-command [command]=\"toggleShowPasswordCommand\" data-cy=\"showPassword\"></aup-command>\n </span>\n</mat-form-field>\n\n" }]
2371
+ }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2372
+ type: Input
2373
+ }], enableShowPassword$: [{
2374
+ type: Input
2375
+ }], enableShowPassword: [{
2376
+ type: Input
2377
+ }] } });
2378
+
2379
+ class SearchInputComponent extends AbstractValueInputComponent {
2380
+ autocomplete;
2381
+ clearCommand;
2382
+ constructor() {
2383
+ super();
2384
+ this.dense = true;
2385
+ const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2386
+ this.clearCommand = Command.create(() => {
2387
+ this.componentValue$.value = "";
2388
+ });
2389
+ this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2390
+ }
2391
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2392
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SearchInputComponent, selector: "aup-search-input", inputs: { autocomplete: "autocomplete" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n\n <input matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <aup-icon matPrefix icon=\"mat:search\"></aup-icon>\n <button mat-icon-button matSuffix [pectinCommand]=\"clearCommand\">\n <aup-icon icon=\"mat:close\"></aup-icon>\n </button>\n</mat-form-field>\n\n", styles: ["button[disabled]{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }] });
2393
+ }
2394
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, decorators: [{
2395
+ type: Component,
2396
+ args: [{ selector: 'aup-search-input', template: "<mat-form-field [floatLabel]=\"floatLabel\">\n\n <input matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <aup-icon matPrefix icon=\"mat:search\"></aup-icon>\n <button mat-icon-button matSuffix [pectinCommand]=\"clearCommand\">\n <aup-icon icon=\"mat:close\"></aup-icon>\n </button>\n</mat-form-field>\n\n", styles: ["button[disabled]{visibility:hidden}\n"] }]
2203
2397
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2204
2398
  type: Input
2205
2399
  }] } });
2206
2400
 
2207
2401
  /**
2208
2402
  * Using templates:
2209
- * <aup-select-input [valueModel]="myModel" [options]="myOptions">
2403
+ * <aup-select-input [value$]="myModel" [options]="myOptions">
2210
2404
  * <ng-template #optionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2211
- * <ng-template #nilOptionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2405
+ * <ng-template #selectedOptionTemplate let-option>{{option.thePropertyYouWant}} note, not used for nils (the placeholder is used)</ng-template>
2406
+ * <ng-template #nilOptionTemplate>Uses the placeholder by default but you can customise it</ng-template>
2212
2407
  * </aup-select_input>
2213
2408
  */
2214
2409
  class SelectInputComponent extends AbstractValueInputComponent {
@@ -2233,7 +2428,7 @@ class SelectInputComponent extends AbstractValueInputComponent {
2233
2428
  super();
2234
2429
  const { chain } = Dsl.disposeWith(this);
2235
2430
  this.cookedOptions$ = chain(this.options$)
2236
- .reduceToList(options => {
2431
+ .mapAll(options => {
2237
2432
  return options.length < 1 && !isNil(this.componentValue$.value) ? [this.componentValue$.value] : options;
2238
2433
  }, {
2239
2434
  dependsOn: this.componentValue$
@@ -2272,21 +2467,21 @@ class SelectInputComponent extends AbstractValueInputComponent {
2272
2467
  id: this.delegatedIdentityOf(value)
2273
2468
  });
2274
2469
  let lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2275
- console.log(lastIdSnapshot);
2470
+ // console.log(lastIdSnapshot)
2276
2471
  before(this.options$).changes(() => {
2277
2472
  lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2278
- console.log(lastIdSnapshot);
2473
+ // console.log(lastIdSnapshot)
2279
2474
  });
2280
2475
  when(this.options$).changes((is, was) => {
2281
2476
  const newIdSnapshot = snapshotValueAndId(lastIdSnapshot.value);
2282
- console.log(lastIdSnapshot, newIdSnapshot);
2477
+ // console.log(lastIdSnapshot, newIdSnapshot)
2283
2478
  if (newIdSnapshot !== lastIdSnapshot.id) {
2284
2479
  this.id$.value = this.delegatedIdentityOf(this.componentValue$.value);
2285
2480
  }
2286
2481
  });
2287
2482
  }
2288
2483
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2289
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectInputComponent, selector: "aup-select-input", inputs: { options$: "options$", options: "options", optionLabel: "optionLabel", allowNil: "allowNil", optionLabelFormat: "optionLabelFormat" }, queries: [{ propertyName: "selectedOptionTemplateRef", first: true, predicate: ["selectedOptionTemplate"], descendants: true }, { propertyName: "optionTemplateRef", first: true, predicate: ["optionTemplate"], descendants: true }, { propertyName: "nilOptionTemplateRef", first: true, predicate: ["nilOptionTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n [ngModel]=\"componentValue$.value\"\n (ngModelChange)=\"select($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n\n <!--\n TODO: dave has a scenario where the selected item isn't rendering that I can't reproduce so we explicity render it..\n It typically happens because the ngModel value isn't the one contained in the list - this means our source model\n identifyOf function has changed and our id$/lookup$/componentValue$ are out of sync.\n We get around this for now by explicity rendering the component value.\n Please Note: I haven't been able to reproduce this\n -->\n <mat-select-trigger *ngIf=\"!selectedOptionTemplateRef\">\n {{optionLabelFormat(componentValue$.value)}}\n </mat-select-trigger>\n\n <mat-select-trigger *ngIf=\"selectedOptionTemplateRef\">\n <ng-container [ngTemplateOutlet]=\"selectedOptionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: componentValue$.value}\"></ng-container>\n </mat-select-trigger>\n\n <mat-option *ngIf=\"allowNil\">\n <ng-container *ngIf=\"!nilOptionTemplateRef\">{{placeholder}}</ng-container>\n <ng-container *ngIf=\"nilOptionTemplateRef\" [ngTemplateOutlet]=\"nilOptionTemplateRef\"></ng-container>\n </mat-option>\n <mat-option *ngFor=\"let option of cookedOptions$.value; trackBy: trackByIdentity;let i = index\"\n [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n </mat-select>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n<div class=\"width-strut\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <div class=\"item\" *ngFor=\"let item of cookedOptions$.value\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(item)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: 0 }\"\n >\n </ng-container>\n </div>\n</div>\n", styles: [":host{display:inline-block}mat-form-field{width:100%}.width-strut{display:block;height:0;max-height:0;width:auto;visibility:hidden;overflow:hidden;padding-right:35px}.width-strut mat-label{font-size:75%}.width-strut>.item{font-size:16px;padding-left:0}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i4$4.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i4$4.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }] });
2484
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectInputComponent, selector: "aup-select-input", inputs: { options$: "options$", options: "options", optionLabel: "optionLabel", allowNil: "allowNil", optionLabelFormat: "optionLabelFormat" }, queries: [{ propertyName: "selectedOptionTemplateRef", first: true, predicate: ["selectedOptionTemplate"], descendants: true }, { propertyName: "optionTemplateRef", first: true, predicate: ["optionTemplate"], descendants: true }, { propertyName: "nilOptionTemplateRef", first: true, predicate: ["nilOptionTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n [ngModel]=\"componentValue$.value\"\n (ngModelChange)=\"select($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n\n <!--\n TODO: dave has a scenario where the selected item isn't rendering that I can't reproduce so we explicity render it..\n It typically happens because the ngModel value isn't the one contained in the list - this means our source model\n identifyOf function has changed and our id$/lookup$/componentValue$ are out of sync.\n We get around this for now by explicity rendering the component value.\n Please Note: I haven't been able to reproduce this\n -->\n <mat-select-trigger *ngIf=\"!selectedOptionTemplateRef\">\n {{optionLabelFormat(componentValue$.value)}}\n </mat-select-trigger>\n\n <mat-select-trigger *ngIf=\"selectedOptionTemplateRef\">\n <ng-container [ngTemplateOutlet]=\"selectedOptionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: componentValue$.value}\"></ng-container>\n </mat-select-trigger>\n\n <mat-option *ngIf=\"allowNil\">\n <ng-container *ngIf=\"!nilOptionTemplateRef\">{{placeholder}}</ng-container>\n <ng-container *ngIf=\"nilOptionTemplateRef\" [ngTemplateOutlet]=\"nilOptionTemplateRef\"></ng-container>\n </mat-option>\n <mat-option *ngFor=\"let option of cookedOptions$.value; trackBy: trackByIdentity;let i = index\"\n [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n <ng-content select=\"[select-option-footer]\"></ng-content>\n </mat-select>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n<div class=\"width-strut\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <div class=\"item\" *ngFor=\"let item of cookedOptions$.value\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(item)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: 0 }\"\n >\n </ng-container>\n </div>\n</div>\n", styles: [":host{display:inline-block}mat-form-field{width:100%}.width-strut{display:block;height:0;max-height:0;width:auto;visibility:hidden;overflow:hidden;padding-right:35px}.width-strut mat-label{font-size:75%}.width-strut>.item{font-size:16px;padding-left:0}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i4$3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "directive", type: i4$3.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }] });
2290
2485
  }
2291
2486
  __decorate([
2292
2487
  Proxify(),
@@ -2298,7 +2493,7 @@ __decorate([
2298
2493
  ], SelectInputComponent.prototype, "options", null);
2299
2494
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputComponent, decorators: [{
2300
2495
  type: Component,
2301
- args: [{ selector: 'aup-select-input', template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n [ngModel]=\"componentValue$.value\"\n (ngModelChange)=\"select($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n\n <!--\n TODO: dave has a scenario where the selected item isn't rendering that I can't reproduce so we explicity render it..\n It typically happens because the ngModel value isn't the one contained in the list - this means our source model\n identifyOf function has changed and our id$/lookup$/componentValue$ are out of sync.\n We get around this for now by explicity rendering the component value.\n Please Note: I haven't been able to reproduce this\n -->\n <mat-select-trigger *ngIf=\"!selectedOptionTemplateRef\">\n {{optionLabelFormat(componentValue$.value)}}\n </mat-select-trigger>\n\n <mat-select-trigger *ngIf=\"selectedOptionTemplateRef\">\n <ng-container [ngTemplateOutlet]=\"selectedOptionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: componentValue$.value}\"></ng-container>\n </mat-select-trigger>\n\n <mat-option *ngIf=\"allowNil\">\n <ng-container *ngIf=\"!nilOptionTemplateRef\">{{placeholder}}</ng-container>\n <ng-container *ngIf=\"nilOptionTemplateRef\" [ngTemplateOutlet]=\"nilOptionTemplateRef\"></ng-container>\n </mat-option>\n <mat-option *ngFor=\"let option of cookedOptions$.value; trackBy: trackByIdentity;let i = index\"\n [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n </mat-select>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n<div class=\"width-strut\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <div class=\"item\" *ngFor=\"let item of cookedOptions$.value\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(item)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: 0 }\"\n >\n </ng-container>\n </div>\n</div>\n", styles: [":host{display:inline-block}mat-form-field{width:100%}.width-strut{display:block;height:0;max-height:0;width:auto;visibility:hidden;overflow:hidden;padding-right:35px}.width-strut mat-label{font-size:75%}.width-strut>.item{font-size:16px;padding-left:0}\n"] }]
2496
+ args: [{ selector: 'aup-select-input', template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n [ngModel]=\"componentValue$.value\"\n (ngModelChange)=\"select($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n\n <!--\n TODO: dave has a scenario where the selected item isn't rendering that I can't reproduce so we explicity render it..\n It typically happens because the ngModel value isn't the one contained in the list - this means our source model\n identifyOf function has changed and our id$/lookup$/componentValue$ are out of sync.\n We get around this for now by explicity rendering the component value.\n Please Note: I haven't been able to reproduce this\n -->\n <mat-select-trigger *ngIf=\"!selectedOptionTemplateRef\">\n {{optionLabelFormat(componentValue$.value)}}\n </mat-select-trigger>\n\n <mat-select-trigger *ngIf=\"selectedOptionTemplateRef\">\n <ng-container [ngTemplateOutlet]=\"selectedOptionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: componentValue$.value}\"></ng-container>\n </mat-select-trigger>\n\n <mat-option *ngIf=\"allowNil\">\n <ng-container *ngIf=\"!nilOptionTemplateRef\">{{placeholder}}</ng-container>\n <ng-container *ngIf=\"nilOptionTemplateRef\" [ngTemplateOutlet]=\"nilOptionTemplateRef\"></ng-container>\n </mat-option>\n <mat-option *ngFor=\"let option of cookedOptions$.value; trackBy: trackByIdentity;let i = index\"\n [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n <ng-content select=\"[select-option-footer]\"></ng-content>\n </mat-select>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n<div class=\"width-strut\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <div class=\"item\" *ngFor=\"let item of cookedOptions$.value\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(item)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: item, index: 0 }\"\n >\n </ng-container>\n </div>\n</div>\n", styles: [":host{display:inline-block}mat-form-field{width:100%}.width-strut{display:block;height:0;max-height:0;width:auto;visibility:hidden;overflow:hidden;padding-right:35px}.width-strut mat-label{font-size:75%}.width-strut>.item{font-size:16px;padding-left:0}\n"] }]
2302
2497
  }], ctorParameters: function () { return []; }, propDecorators: { options$: [{
2303
2498
  type: Input
2304
2499
  }], options: [{
@@ -2329,17 +2524,28 @@ class StringInputComponent extends AbstractValueInputComponent {
2329
2524
  get enableClear() { return this.#enableClear_accessor_storage; }
2330
2525
  set enableClear(value) { this.#enableClear_accessor_storage = value; }
2331
2526
  iconPrefix;
2527
+ #suffixCommand_accessor_storage = proxify(Command);
2528
+ get suffixCommand() { return this.#suffixCommand_accessor_storage; }
2529
+ set suffixCommand(value) { this.#suffixCommand_accessor_storage = value; }
2332
2530
  clearCommand;
2531
+ elementRef = this.inject(ElementRef);
2333
2532
  constructor() {
2334
2533
  super();
2335
2534
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2336
2535
  this.clearCommand = Command.create(() => {
2337
2536
  this.componentValue$.value = "";
2338
- });
2339
- this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2537
+ })
2538
+ .withFace({ icon: () => "mat:clear" })
2539
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2540
+ }
2541
+ get hasSuffixCommand() {
2542
+ return Proxify.hasTarget(this.suffixCommand);
2543
+ }
2544
+ select() {
2545
+ this.elementRef.nativeElement.querySelector('input').select();
2340
2546
  }
2341
2547
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2342
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: StringInputComponent, selector: "aup-string-input", inputs: { autocomplete: "autocomplete", enableClear$: "enableClear$", enableClear: "enableClear", iconPrefix: "iconPrefix" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <aup-icon *ngIf=\"iconPrefix\" matPrefix [icon]=\"iconPrefix\"></aup-icon>\n <button mat-icon-button matSuffix *ngIf=\"enableClear\" [pectinCommand]=\"clearCommand\">\n <aup-icon icon=\"mat:close\"></aup-icon>\n </button>\n</mat-form-field>\n\n", styles: ["button[disabled]{visibility:hidden}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4$2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }] });
2548
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: StringInputComponent, selector: "aup-string-input", inputs: { autocomplete: "autocomplete", enableClear$: "enableClear$", enableClear: "enableClear", iconPrefix: "iconPrefix", suffixCommand: "suffixCommand" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <aup-icon *ngIf=\"iconPrefix\" matPrefix [icon]=\"iconPrefix\"></aup-icon>\n <span matSuffix>\n <aup-command *ngIf=\"enableClear\" [command]=\"clearCommand\" data-cy=\"clearCommand\"></aup-command>\n <aup-command *ngIf=\"hasSuffixCommand\" [command]=\"suffixCommand\" data-cy=\"suffixCommand\"></aup-command>\n </span>\n</mat-form-field>\n\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4$2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }, { kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }] });
2343
2549
  }
2344
2550
  __decorate([
2345
2551
  Proxify(),
@@ -2349,9 +2555,13 @@ __decorate([
2349
2555
  StoreInValueModel(),
2350
2556
  __metadata("design:type", Object)
2351
2557
  ], StringInputComponent.prototype, "enableClear", null);
2558
+ __decorate([
2559
+ Proxify(),
2560
+ __metadata("design:type", Command)
2561
+ ], StringInputComponent.prototype, "suffixCommand", null);
2352
2562
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputComponent, decorators: [{
2353
2563
  type: Component,
2354
- args: [{ selector: 'aup-string-input', template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <aup-icon *ngIf=\"iconPrefix\" matPrefix [icon]=\"iconPrefix\"></aup-icon>\n <button mat-icon-button matSuffix *ngIf=\"enableClear\" [pectinCommand]=\"clearCommand\">\n <aup-icon icon=\"mat:close\"></aup-icon>\n </button>\n</mat-form-field>\n\n", styles: ["button[disabled]{visibility:hidden}\n"] }]
2564
+ args: [{ selector: 'aup-string-input', template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <aup-icon *ngIf=\"iconPrefix\" matPrefix [icon]=\"iconPrefix\"></aup-icon>\n <span matSuffix>\n <aup-command *ngIf=\"enableClear\" [command]=\"clearCommand\" data-cy=\"clearCommand\"></aup-command>\n <aup-command *ngIf=\"hasSuffixCommand\" [command]=\"suffixCommand\" data-cy=\"suffixCommand\"></aup-command>\n </span>\n</mat-form-field>\n\n" }]
2355
2565
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2356
2566
  type: Input
2357
2567
  }], enableClear$: [{
@@ -2360,6 +2570,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2360
2570
  type: Input
2361
2571
  }], iconPrefix: [{
2362
2572
  type: Input
2573
+ }], suffixCommand: [{
2574
+ type: Input
2363
2575
  }] } });
2364
2576
 
2365
2577
  class TextInputComponent extends AbstractValueInputComponent {
@@ -2367,10 +2579,14 @@ class TextInputComponent extends AbstractValueInputComponent {
2367
2579
  // valueModel: Form.ValueModelBase<string> | MutableValueModel<string>;
2368
2580
  rows = 2;
2369
2581
  cols;
2582
+ elementRef = this.inject(ElementRef);
2370
2583
  constructor() {
2371
2584
  super();
2372
2585
  // const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2373
2586
  }
2587
+ select() {
2588
+ this.elementRef.nativeElement.querySelector('input').select();
2589
+ }
2374
2590
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TextInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2375
2591
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TextInputComponent, selector: "aup-text-input", inputs: { rows: "rows", cols: "cols" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <textarea matInput\n placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [rows]=\"rows\"\n [cols]=\"cols\"\n >\n </textarea>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n\n", styles: ["button[disabled]{visibility:hidden}textarea{overflow:auto}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }] });
2376
2592
  }
@@ -2547,7 +2763,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2547
2763
  * </aup-switch-case>
2548
2764
  */
2549
2765
  class SwitchCaseComponent extends DisposableComponent {
2550
- cdr;
2551
2766
  #switch$_accessor_storage = proxify((ValueModel));
2552
2767
  get switch$() { return this.#switch$_accessor_storage; }
2553
2768
  set switch$(value) { this.#switch$_accessor_storage = value; }
@@ -2556,9 +2771,8 @@ class SwitchCaseComponent extends DisposableComponent {
2556
2771
  set switch(value) { this.#switch_accessor_storage = value; }
2557
2772
  switchCaseOptions;
2558
2773
  selectedIndex = 0;
2559
- constructor(cdr) {
2774
+ constructor() {
2560
2775
  super();
2561
- this.cdr = cdr;
2562
2776
  }
2563
2777
  ngAfterContentInit() {
2564
2778
  const subscription = this.switchCaseOptions.changes.subscribe(change => this.updateSelection());
@@ -2595,8 +2809,8 @@ class SwitchCaseComponent extends DisposableComponent {
2595
2809
  this.selectedIndex = -1;
2596
2810
  }
2597
2811
  }
2598
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
2599
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SwitchCaseComponent, selector: "aup-switch-case", inputs: { switch$: "switch$", switch: "switch" }, queries: [{ propertyName: "switchCaseOptions", predicate: SwitchCaseOption }], usesInheritance: true, ngImport: i0, template: "<mat-tab-group class=\"content-wrapper\" no-tab-header full-height-tabs [selectedIndex]=\"selectedIndex\">\n <mat-tab *ngFor=\"let option of switchCaseOptions\">\n <ng-template [ngTemplateOutlet]=\"option.templateRef\"></ng-template>\n </mat-tab>\n</mat-tab-group>\n\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}mat-tab-group{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3$1.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i3$1.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }] });
2812
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2813
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SwitchCaseComponent, selector: "aup-switch-case", inputs: { switch$: "switch$", switch: "switch" }, queries: [{ propertyName: "switchCaseOptions", predicate: SwitchCaseOption }], usesInheritance: true, ngImport: i0, template: "<mat-tab-group class=\"content-wrapper\" no-tab-header full-height-tabs [selectedIndex]=\"selectedIndex\">\n <mat-tab *ngFor=\"let option of switchCaseOptions\">\n <ng-template [ngTemplateOutlet]=\"option.templateRef\"></ng-template>\n </mat-tab>\n</mat-tab-group>\n\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}mat-tab-group{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3$2.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i3$2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }] });
2600
2814
  }
2601
2815
  __decorate([
2602
2816
  Proxify(),
@@ -2609,7 +2823,7 @@ __decorate([
2609
2823
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, decorators: [{
2610
2824
  type: Component,
2611
2825
  args: [{ selector: 'aup-switch-case', template: "<mat-tab-group class=\"content-wrapper\" no-tab-header full-height-tabs [selectedIndex]=\"selectedIndex\">\n <mat-tab *ngFor=\"let option of switchCaseOptions\">\n <ng-template [ngTemplateOutlet]=\"option.templateRef\"></ng-template>\n </mat-tab>\n</mat-tab-group>\n\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}mat-tab-group{flex:1}\n"] }]
2612
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { switch$: [{
2826
+ }], ctorParameters: function () { return []; }, propDecorators: { switch$: [{
2613
2827
  type: Input
2614
2828
  }], switch: [{
2615
2829
  type: Input
@@ -2619,6 +2833,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2619
2833
  }] } });
2620
2834
 
2621
2835
  const HEADER_CELL_RENDERER_PORTAL = Symbol('aup-cell-header-renderer-component-ref');
2836
+ const FOOTER_CELL_RENDERER_PORTAL = Symbol('aup-cell-footer-renderer-component-ref');
2622
2837
  const CELL_RENDERER_PORTAL = Symbol('aup-cell-renderer-component-ref');
2623
2838
  const CELL_EDITOR_PORTAL = Symbol('aup-cell-editor-component-ref');
2624
2839
  const PORTAL_RENDERER_COMPONENT = Symbol('aup-cell-renderer-portal-component');
@@ -2633,7 +2848,7 @@ class CellHeaderPortalRef extends CellPortalRef {
2633
2848
  this.componentType = componentType;
2634
2849
  this.initialiseHeader = initialiseHeader;
2635
2850
  }
2636
- initialiseHost(host, columnModel) {
2851
+ initialiseHost(host) {
2637
2852
  assert$1.isTruthy(host);
2638
2853
  host[HEADER_CELL_RENDERER_PORTAL] = new ComponentPortal(this.componentType);
2639
2854
  }
@@ -2652,7 +2867,7 @@ class ComponentCellRendererPortalRef extends CellRendererPortalRef {
2652
2867
  this.componentType = componentType;
2653
2868
  this.updateComponent = updateComponent;
2654
2869
  }
2655
- initialiseHost(host, columnModel) {
2870
+ initialiseHost(host) {
2656
2871
  host[CELL_RENDERER_PORTAL] = new ComponentPortal(this.componentType);
2657
2872
  }
2658
2873
  // @Trace()
@@ -2675,7 +2890,7 @@ class CellEditorPortalRef extends CellPortalRef {
2675
2890
  this.componentType = componentType;
2676
2891
  this.initialiseEditorSession = initialiseEditorSession;
2677
2892
  }
2678
- initialiseHost(host, columnModel) {
2893
+ initialiseHost(host) {
2679
2894
  assert$1.isTruthy(host);
2680
2895
  host[CELL_EDITOR_PORTAL] = new ComponentPortal(this.componentType);
2681
2896
  }
@@ -2699,7 +2914,7 @@ class TemplateCellRendererPortalRef extends CellRendererPortalRef {
2699
2914
  this.fillCell = fillCell;
2700
2915
  this.padChild = padChild;
2701
2916
  }
2702
- initialiseHost(host, columnModel) {
2917
+ initialiseHost(host) {
2703
2918
  assert$1.isTruthy(host);
2704
2919
  }
2705
2920
  // @Trace()
@@ -2716,6 +2931,23 @@ class TemplateCellRendererPortalRef extends CellRendererPortalRef {
2716
2931
  return new TemplatePortal(this.templateRef, this.viewContainer, { ...(data), $implicit: data.row });
2717
2932
  }
2718
2933
  }
2934
+ class CellFooterPortalRef extends CellPortalRef {
2935
+ componentType;
2936
+ initialiseHeader;
2937
+ constructor(componentType, initialiseHeader) {
2938
+ super();
2939
+ this.componentType = componentType;
2940
+ this.initialiseHeader = initialiseHeader;
2941
+ }
2942
+ initialiseHost(host) {
2943
+ assert$1.isTruthy(host);
2944
+ host[HEADER_CELL_RENDERER_PORTAL] = new ComponentPortal(this.componentType);
2945
+ }
2946
+ // @Trace()
2947
+ onPortalAttached(host, portalComponent) {
2948
+ this.initialiseHeader(portalComponent, host.column);
2949
+ }
2950
+ }
2719
2951
 
2720
2952
  class ColumnTextSearchFormatter {
2721
2953
  }
@@ -2806,6 +3038,7 @@ class ColumnTextSearchWrapper extends ColumnTextSearchFormatter.Delegate {
2806
3038
  }
2807
3039
  class ColumnModel extends GarbageCollector {
2808
3040
  columnId;
3041
+ order;
2809
3042
  textPropertiesProvider;
2810
3043
  _columnTextProperties;
2811
3044
  _columnHeaderPortalRef;
@@ -2819,9 +3052,10 @@ class ColumnModel extends GarbageCollector {
2819
3052
  dasherisedColumnId;
2820
3053
  textSearchDelegate = new ColumnTextSearchWrapper();
2821
3054
  visible$;
2822
- constructor(columnId, textPropertiesProvider) {
3055
+ constructor(columnId, order, textPropertiesProvider) {
2823
3056
  super();
2824
3057
  this.columnId = columnId;
3058
+ this.order = order;
2825
3059
  this.textPropertiesProvider = textPropertiesProvider;
2826
3060
  const { valueOf } = Dsl.disposeWith(this);
2827
3061
  this.installHeaderRenderer();
@@ -2866,6 +3100,14 @@ class ColumnModel extends GarbageCollector {
2866
3100
  this._columnTextProperties = columnTextProperties;
2867
3101
  return this;
2868
3102
  }
3103
+ positionAfter(column) {
3104
+ this.order.position(this, { after: column });
3105
+ return this;
3106
+ }
3107
+ positionBefore(column) {
3108
+ this.order.position(this, { before: column });
3109
+ return this;
3110
+ }
2869
3111
  getSearchTextFor(row) {
2870
3112
  return this.textSearchDelegate.format(row);
2871
3113
  }
@@ -2898,12 +3140,12 @@ class ColumnModel extends GarbageCollector {
2898
3140
  return !!this._cellEditorPortalRef;
2899
3141
  }
2900
3142
  attachHeaderCell(host) {
2901
- this._columnHeaderPortalRef.initialiseHost(host, this);
3143
+ this._columnHeaderPortalRef.initialiseHost(host);
2902
3144
  }
2903
3145
  attachCell(host) {
2904
- this._cellRendererPortalRef.initialiseHost(host, this);
3146
+ this._cellRendererPortalRef.initialiseHost(host);
2905
3147
  if (this.hasEditorPortal()) {
2906
- this._cellEditorPortalRef.initialiseHost(host, this);
3148
+ this._cellEditorPortalRef.initialiseHost(host);
2907
3149
  }
2908
3150
  }
2909
3151
  onHeaderAttached(host, ref) {
@@ -2967,8 +3209,8 @@ __decorate([
2967
3209
 
2968
3210
  class CustomTemplateColumnModel extends ColumnModel {
2969
3211
  config = new TemplateCellRendererPortalRef();
2970
- constructor(columnId, defaults) {
2971
- super(columnId, defaults);
3212
+ constructor(columnId, order, defaults) {
3213
+ super(columnId, order, defaults);
2972
3214
  this.configureCellRenderer(this.config);
2973
3215
  }
2974
3216
  setTemplate(templateRef, viewContainer, fillCell, padChild) {
@@ -3046,12 +3288,17 @@ class AbstractTableComponent extends DisposableComponent {
3046
3288
  #showHeader_accessor_storage = true;
3047
3289
  get showHeader() { return this.#showHeader_accessor_storage; }
3048
3290
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
3291
+ #enableScrolling$_accessor_storage = proxify((ValueModel));
3049
3292
  /**
3050
3293
  * Set to true to enable scrolling. Once enabled the table will have 0 implicit height. You will either
3051
3294
  * need to set it explicitly e.g. height: 400px; or by using flex or grid layout to make it fill it's
3052
3295
  * containment area.
3053
3296
  */
3054
- enableScrolling = false;
3297
+ get enableScrolling$() { return this.#enableScrolling$_accessor_storage; }
3298
+ set enableScrolling$(value) { this.#enableScrolling$_accessor_storage = value; }
3299
+ #enableScrolling_accessor_storage = false;
3300
+ get enableScrolling() { return this.#enableScrolling_accessor_storage; }
3301
+ set enableScrolling(value) { this.#enableScrolling_accessor_storage = value; }
3055
3302
  columns;
3056
3303
  columnIds;
3057
3304
  columnsById;
@@ -3070,7 +3317,6 @@ class AbstractTableComponent extends DisposableComponent {
3070
3317
  super();
3071
3318
  this.injector = injector;
3072
3319
  const { chain, when } = Dsl.disposeWith(this);
3073
- this._visibleRows$.setDelegate(this._dataSource$);
3074
3320
  when(chain(this._dataSource$).first()).becomesTruthy(it => {
3075
3321
  if (it === this.identityOf(it)) {
3076
3322
  console.warn("Table model identity function is using reference equality. This can cause lots of table re-rendering", {
@@ -3089,7 +3335,7 @@ class AbstractTableComponent extends DisposableComponent {
3089
3335
  if (!model) {
3090
3336
  lang$1.illegalState("aup-table tableModel is nil");
3091
3337
  }
3092
- this.columnsById = chain(model.columns).indexBy('columnId');
3338
+ this.columnsById = chain(model.columns$).indexBy('columnId');
3093
3339
  this._dataSource$.setDelegate(model.dataSource$);
3094
3340
  model.initialise(this.injector, (row) => this.identityOf(row));
3095
3341
  }
@@ -3106,7 +3352,7 @@ class AbstractTableComponent extends DisposableComponent {
3106
3352
  }
3107
3353
  }
3108
3354
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractTableComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
3109
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractTableComponent, selector: "aup-abstract-table", inputs: { showHeader$: "showHeader$", showHeader: "showHeader", enableScrolling: "enableScrolling" }, host: { properties: { "class": "this.baseCssClass" } }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
3355
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractTableComponent, selector: "aup-abstract-table", inputs: { showHeader$: "showHeader$", showHeader: "showHeader", enableScrolling$: "enableScrolling$", enableScrolling: "enableScrolling" }, host: { properties: { "class": "this.baseCssClass" } }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
3110
3356
  }
3111
3357
  __decorate([
3112
3358
  Proxify(),
@@ -3116,6 +3362,14 @@ __decorate([
3116
3362
  StoreInValueModel(),
3117
3363
  __metadata("design:type", Object)
3118
3364
  ], AbstractTableComponent.prototype, "showHeader", null);
3365
+ __decorate([
3366
+ Proxify(),
3367
+ __metadata("design:type", ValueModel)
3368
+ ], AbstractTableComponent.prototype, "enableScrolling$", null);
3369
+ __decorate([
3370
+ StoreInValueModel(),
3371
+ __metadata("design:type", Boolean)
3372
+ ], AbstractTableComponent.prototype, "enableScrolling", null);
3119
3373
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractTableComponent, decorators: [{
3120
3374
  type: Component,
3121
3375
  args: [{
@@ -3126,6 +3380,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
3126
3380
  type: Input
3127
3381
  }], showHeader: [{
3128
3382
  type: Input
3383
+ }], enableScrolling$: [{
3384
+ type: Input
3129
3385
  }], enableScrolling: [{
3130
3386
  type: Input
3131
3387
  }], baseCssClass: [{
@@ -3186,6 +3442,8 @@ class EditSession extends GarbageCollector {
3186
3442
  // console.warn()
3187
3443
  // }
3188
3444
  this._liveRowValue$.value = produce(this._liveRowValue$.value, draft => {
3445
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3446
+ // @ts-ignore
3189
3447
  this.form.writeDirtyStateTo(draft);
3190
3448
  });
3191
3449
  });
@@ -3288,11 +3546,11 @@ class DefaultCellRendererComponent {
3288
3546
  return this._value;
3289
3547
  }
3290
3548
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DefaultCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3291
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: DefaultCellRendererComponent, selector: "aup-default-cell-renderer", inputs: { value: "value" }, ngImport: i0, template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n", styles: [""], dependencies: [{ kind: "pipe", type: HighlightPipe, name: "aupHighlight" }] });
3549
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: DefaultCellRendererComponent, selector: "aup-default-cell-renderer", inputs: { value: "value" }, ngImport: i0, template: "<span [innerHTML]=\"value?.toString() | aupHighlight\"></span>\n", styles: [""], dependencies: [{ kind: "pipe", type: HighlightPipe, name: "aupHighlight" }] });
3292
3550
  }
3293
3551
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DefaultCellRendererComponent, decorators: [{
3294
3552
  type: Component,
3295
- args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n" }]
3553
+ args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value?.toString() | aupHighlight\"></span>\n" }]
3296
3554
  }], propDecorators: { value: [{
3297
3555
  type: Input
3298
3556
  }] } });
@@ -3308,7 +3566,8 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3308
3566
  super();
3309
3567
  this.selectCommand = Command.create(() => {
3310
3568
  this.selectionModel.toggleAllCommand.execute();
3311
- });
3569
+ }).visibleWhile(this.selectionModel.toggleAllCommand.visible$)
3570
+ .enableWhile(this.selectionModel.toggleAllCommand.enabled$);
3312
3571
  }
3313
3572
  isSelected() {
3314
3573
  return this.ifMultiSelectionModel(m => m.allSelected$.value, false);
@@ -3336,7 +3595,7 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3336
3595
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionHeaderCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3337
3596
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionHeaderCellComponent, selector: "aup-selection-header-cell", providers: [
3338
3597
  { provide: MAT_CHECKBOX_DEFAULT_OPTIONS, useValue: { clickAction: 'noop' } }
3339
- ], usesInheritance: true, ngImport: i0, template: "<mat-checkbox *ngIf=\"isVisible()\"\n (click)=\"handleClick($event)\"\n [checked]=\"isSelected()\"\n [indeterminate]=\"this.isIntermediate()\"\n [color]=\"color\"\n></mat-checkbox>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4$3.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }] });
3598
+ ], usesInheritance: true, ngImport: i0, template: "<mat-checkbox *ngIf=\"isVisible()\"\n (click)=\"handleClick($event)\"\n [checked]=\"isSelected()\"\n [indeterminate]=\"this.isIntermediate()\"\n [color]=\"color\"\n></mat-checkbox>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$1.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }] });
3340
3599
  }
3341
3600
  __decorate([
3342
3601
  Proxify(),
@@ -3369,7 +3628,7 @@ class SelectionCellComponent extends DisposableComponent {
3369
3628
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
3370
3629
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionCellComponent, selector: "aup-selection-cell", inputs: { row: "row" }, providers: [
3371
3630
  { provide: MAT_CHECKBOX_DEFAULT_OPTIONS, useValue: { clickAction: 'noop' } }
3372
- ], usesInheritance: true, ngImport: i0, template: "<mat-checkbox (click)=\"select($event)\" [checked]=\"isSelected()\" [color]=\"color\"></mat-checkbox>\n", styles: [""], dependencies: [{ kind: "component", type: i4$3.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }] });
3631
+ ], usesInheritance: true, ngImport: i0, template: "<mat-checkbox (click)=\"select($event)\" [checked]=\"isSelected()\" [color]=\"color\"></mat-checkbox>\n", styles: [""], dependencies: [{ kind: "component", type: i3$1.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }] });
3373
3632
  }
3374
3633
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, decorators: [{
3375
3634
  type: Component,
@@ -3430,25 +3689,14 @@ class Bounds extends Dimension {
3430
3689
  })(Bounds || (Bounds = {}));
3431
3690
 
3432
3691
  class ResizeAwareComponent extends DisposableComponent {
3433
- elementRef;
3434
- ngZone;
3435
- _bounds$ = new MutableValueModel(new Bounds(0, 0, 0, 0));
3436
- constructor(elementRef, ngZone) {
3437
- super();
3438
- this.elementRef = elementRef;
3439
- this.ngZone = ngZone;
3440
- }
3692
+ elementRef = this.inject(ElementRef);
3693
+ ngZone = this.inject(NgZone);
3694
+ boundsTracker = new ResizeAwareComponent.ResizeTracker(this.elementRef, this.ngZone);
3441
3695
  ngAfterViewInit() {
3442
- const element = this.elementRef.nativeElement;
3443
- const ro = new ResizeObserver((entries, observer) => {
3444
- this.ngZone.run(() => this._updateBounds());
3445
- });
3446
- ro.observe(element);
3447
- this.onDispose(() => ro.disconnect());
3448
- setTimeout(() => this._updateBounds());
3696
+ this.boundsTracker.notifyViewReady();
3449
3697
  }
3450
3698
  get bounds$() {
3451
- return this._bounds$.readonly$;
3699
+ return this.boundsTracker.bounds$;
3452
3700
  }
3453
3701
  get nativeElement() {
3454
3702
  return this.elementRef.nativeElement;
@@ -3458,57 +3706,160 @@ class ResizeAwareComponent extends DisposableComponent {
3458
3706
  return this.bounds.relativePositionOf(point);
3459
3707
  }
3460
3708
  get bounds() {
3461
- return this._bounds$.value;
3709
+ return this.bounds$.value;
3462
3710
  }
3463
- _updateBounds() {
3464
- this._bounds$.value = Bounds.ofElement(this.nativeElement);
3465
- }
3466
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
3711
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
3467
3712
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ResizeAwareComponent, usesInheritance: true, ngImport: i0 });
3468
3713
  }
3469
3714
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, decorators: [{
3470
3715
  type: Directive
3471
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; } });
3716
+ }] });
3717
+ (function (ResizeAwareComponent) {
3718
+ class ResizeTracker extends GarbageCollector {
3719
+ elementRef;
3720
+ ngZone;
3721
+ _bounds$ = new MutableValueModel(new Bounds(0, 0, 0, 0));
3722
+ width$;
3723
+ height$;
3724
+ top$;
3725
+ left$;
3726
+ bottom$;
3727
+ right$;
3728
+ constructor(elementRef, ngZone) {
3729
+ super();
3730
+ this.elementRef = elementRef;
3731
+ this.ngZone = ngZone;
3732
+ const { chain } = Dsl.disposeWith(this);
3733
+ this.width$ = chain(this.bounds$).pluck("width");
3734
+ this.height$ = chain(this.bounds$).pluck("height");
3735
+ this.top$ = chain(this.bounds$).pluck("top");
3736
+ this.left$ = chain(this.bounds$).pluck("left");
3737
+ this.bottom$ = chain.numericValue(this.top$).add(this.height$);
3738
+ this.right$ = chain.numericValue(this.left$).add(this.width$);
3739
+ }
3740
+ notifyViewReady() {
3741
+ const element = this.elementRef.nativeElement;
3742
+ const ro = new ResizeObserver((entries, observer) => {
3743
+ this.ngZone.run(() => this._updateBounds());
3744
+ });
3745
+ ro.observe(element);
3746
+ this.onDispose(() => ro.disconnect());
3747
+ setTimeout(() => this._updateBounds());
3748
+ }
3749
+ get bounds$() {
3750
+ return this._bounds$.readonly$;
3751
+ }
3752
+ get nativeElement() {
3753
+ return this.elementRef.nativeElement;
3754
+ }
3755
+ // TODO: Make this handle body scroll
3756
+ relativePositionOf(point) {
3757
+ return this.bounds.relativePositionOf(point);
3758
+ }
3759
+ get bounds() {
3760
+ return this._bounds$.value;
3761
+ }
3762
+ _updateBounds() {
3763
+ this._bounds$.value = Bounds.ofElement(this.nativeElement);
3764
+ }
3765
+ }
3766
+ ResizeAwareComponent.ResizeTracker = ResizeTracker;
3767
+ })(ResizeAwareComponent || (ResizeAwareComponent = {}));
3472
3768
 
3473
- class ColumnListModel extends AbstractComputedListModel {
3474
- _allColumns$ = new MutableListModel();
3475
- columnsById$;
3769
+ var ColumnOrderManager;
3770
+ (function (ColumnOrderManager) {
3771
+ function processPosition(position, callback) {
3772
+ if (position) {
3773
+ const keys = Object.keys(position);
3774
+ if (keys.includes("before")) {
3775
+ return position["before"] ? callback.before(position["before"]) : callback.first();
3776
+ }
3777
+ else {
3778
+ return position["after"] ? callback.after(position["after"]) : callback.last();
3779
+ }
3780
+ }
3781
+ else {
3782
+ return callback.last();
3783
+ }
3784
+ }
3785
+ ColumnOrderManager.processPosition = processPosition;
3786
+ })(ColumnOrderManager || (ColumnOrderManager = {}));
3787
+
3788
+ class ColumnRef {
3789
+ column;
3790
+ position;
3791
+ constructor(column, position) {
3792
+ this.column = column;
3793
+ this.position = position;
3794
+ }
3795
+ }
3796
+ class ColumnManager extends GarbageCollector {
3797
+ _columnRefs$ = new MutableListModel();
3798
+ orderedColumnRefs$;
3799
+ _columnsById$;
3800
+ allColumns$;
3801
+ columnVisibilities$ = new WatchList();
3802
+ visibleColumns$;
3476
3803
  constructor() {
3477
3804
  super();
3478
3805
  const { chain } = Dsl.disposeWith(this);
3479
- this.columnsById$ = chain(this._allColumns$).indexBy('columnId');
3806
+ this.orderedColumnRefs$ = chain(this._columnRefs$).orderBy("position", "asc");
3807
+ this.allColumns$ = this.orderedColumnRefs$.pluck("column");
3808
+ this._columnsById$ = chain(this.allColumns$).indexBy('columnId');
3809
+ this.visibleColumns$ = chain(this.allColumns$).select(it => it.visible$.value, {
3810
+ dependsOn: this.columnVisibilities$
3811
+ });
3480
3812
  }
3481
- get allColumns$() {
3482
- return this._allColumns$.readonly$;
3813
+ position(column, newPosition) {
3814
+ const target = this._columnRefs$.query().findMatching(it => it.column === column);
3815
+ const position = this.computePosition(newPosition);
3816
+ this._columnRefs$.replace(target, { with: new ColumnRef(target.column, position) });
3483
3817
  }
3484
3818
  getColumn(id) {
3485
- return this.columnsById$.get(id);
3819
+ return this._columnsById$.get(id);
3486
3820
  }
3487
3821
  hasColumn(id) {
3488
- return !!this.columnsById$.get(id);
3822
+ return !!this._columnsById$.get(id);
3489
3823
  }
3490
3824
  hasMatchingColumn(row, regex) {
3491
3825
  // only search the visible columns
3492
- return !!this.value.find(c => regex.test(c.getSearchTextFor(row)));
3826
+ return !!this.visibleColumns$.value.find(c => regex.test(c.getSearchTextFor(row)));
3493
3827
  }
3494
- addColumn(column, index) {
3828
+ addColumn(column, position) {
3495
3829
  if (this.hasColumn(column.columnId)) {
3496
3830
  lang.illegalState(`Column with id=${column.columnId} already exists`);
3497
3831
  }
3498
3832
  this.registerDisposable(column);
3499
- this.runInTransaction(() => {
3500
- if (!isNil(index)) {
3501
- this._allColumns$.insert(index, column);
3502
- }
3503
- else {
3504
- this._allColumns$.push(column);
3833
+ this._columnRefs$.push(new ColumnRef(column, this.computePosition(position)));
3834
+ this.columnVisibilities$.add(column.visible$);
3835
+ return column;
3836
+ }
3837
+ computePosition(position) {
3838
+ const q = this.orderedColumnRefs$.query();
3839
+ return ColumnOrderManager.processPosition(position, {
3840
+ before(col) {
3841
+ const index = q.findIndex(ref => ref.column === col);
3842
+ const beforeCol = q.value[index];
3843
+ const afterCol = index - 1 >= 0 ? q.value[index - 1] : undefined;
3844
+ return generateKeyBetween(afterCol?.position, beforeCol.position);
3845
+ },
3846
+ after(col) {
3847
+ const index = q.findIndex(ref => ref.column === col);
3848
+ const afterCol = q.value[index];
3849
+ const beforeCol = index + 1 < q.length ? q.value[index + 1] : undefined;
3850
+ return generateKeyBetween(afterCol.position, beforeCol?.position);
3851
+ },
3852
+ first() {
3853
+ return generateKeyBetween(null, q.first()?.position);
3854
+ },
3855
+ last() {
3856
+ // add it to the end of the list
3857
+ return generateKeyBetween(q.last()?.position, null);
3505
3858
  }
3506
- this.registerDisposable(this.trackSource(column.visible$));
3507
3859
  });
3508
- return column;
3509
3860
  }
3510
3861
  doComputeValue() {
3511
- return this._allColumns$.value.filter(c => c.visible$.value);
3862
+ return this.allColumns$.value.filter(c => c.visible$.value);
3512
3863
  }
3513
3864
  }
3514
3865
 
@@ -3542,8 +3893,8 @@ function EnableCellTextSearch(options) {
3542
3893
 
3543
3894
  class CustomValueColumnModel extends ColumnModel {
3544
3895
  getValue;
3545
- constructor(columnId, defaults, getValue) {
3546
- super(columnId, defaults);
3896
+ constructor(columnId, order, defaults, getValue) {
3897
+ super(columnId, order, defaults);
3547
3898
  this.getValue = getValue;
3548
3899
  this.cellRenderer(DefaultCellRendererComponent);
3549
3900
  }
@@ -3551,17 +3902,17 @@ class CustomValueColumnModel extends ColumnModel {
3551
3902
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => new ColumnTextSearchFormatter.Null()), row => this.getValue(row));
3552
3903
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3553
3904
  if (firstTime) {
3554
- if (isFunction$1(onComponentInitOrOptions)) {
3905
+ if (isFunction(onComponentInitOrOptions)) {
3555
3906
  onComponentInitOrOptions(component);
3556
3907
  }
3557
3908
  else {
3558
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3909
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3559
3910
  onComponentInitOrOptions.onComponentInit(component);
3560
3911
  }
3561
3912
  }
3562
3913
  }
3563
3914
  component.value = this.getValue(rowData.row);
3564
- if (!isFunction$1(onComponentInitOrOptions) && isFunction$1(onComponentInitOrOptions?.onRowUpdate)) {
3915
+ if (!isFunction(onComponentInitOrOptions) && isFunction(onComponentInitOrOptions?.onRowUpdate)) {
3565
3916
  onComponentInitOrOptions.onRowUpdate(component, rowData.row);
3566
3917
  }
3567
3918
  }));
@@ -3573,8 +3924,8 @@ class CustomValueColumnModel extends ColumnModel {
3573
3924
  }
3574
3925
 
3575
3926
  class EditorControlColumnModel extends ColumnModel {
3576
- constructor(columnId, saveCommandFactory, defaults) {
3577
- super(columnId, defaults);
3927
+ constructor(columnId, order, saveCommandFactory, defaults) {
3928
+ super(columnId, order, defaults);
3578
3929
  this.cellRenderer(EditRowControlsComponent);
3579
3930
  }
3580
3931
  cellRenderer(componentType) {
@@ -3599,8 +3950,8 @@ class ListPropertyColumnModel extends ColumnModel {
3599
3950
  intermediate.map(v => v?.toString()).join(", ") :
3600
3951
  intermediate?.toString();
3601
3952
  };
3602
- constructor(id, property, defaults) {
3603
- super(id, defaults);
3953
+ constructor(id, order, property, defaults) {
3954
+ super(id, order, defaults);
3604
3955
  this.property = property;
3605
3956
  this.cellRenderer(DefaultCellRendererComponent);
3606
3957
  }
@@ -3616,7 +3967,7 @@ class ListPropertyColumnModel extends ColumnModel {
3616
3967
  }
3617
3968
  cellEditor(editor, validatorsOrInitialiser, initialiseComponent) {
3618
3969
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3619
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3970
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3620
3971
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3621
3972
  const formListModel = editSession.form.pluckList(this.property);
3622
3973
  if (validators) {
@@ -3645,8 +3996,8 @@ class PropertyColumnModel extends ColumnModel {
3645
3996
  _defaultSearchTextFormatter = (value) => {
3646
3997
  return (this._userFormat ?? Functions.identity)(value)?.toString();
3647
3998
  };
3648
- constructor(id, property, defaults) {
3649
- super(id, defaults);
3999
+ constructor(id, order, property, defaults) {
4000
+ super(id, order, defaults);
3650
4001
  this.property = property;
3651
4002
  this.cellRenderer(DefaultCellRendererComponent);
3652
4003
  }
@@ -3654,11 +4005,11 @@ class PropertyColumnModel extends ColumnModel {
3654
4005
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => ColumnTextSearchFormatter.forFormatter(this._defaultSearchTextFormatter)), row => row[this.property]);
3655
4006
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3656
4007
  if (firstTime) {
3657
- if (isFunction$1(onComponentInitOrOptions)) {
4008
+ if (isFunction(onComponentInitOrOptions)) {
3658
4009
  onComponentInitOrOptions(component);
3659
4010
  }
3660
4011
  else {
3661
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
4012
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3662
4013
  onComponentInitOrOptions.onComponentInit(component);
3663
4014
  }
3664
4015
  }
@@ -3683,7 +4034,7 @@ class PropertyColumnModel extends ColumnModel {
3683
4034
  component[ColumnModel.CELL_RENDERER_COMPONENT_ROW_CACHE] = rowData.row;
3684
4035
  let disableEditCallback = false;
3685
4036
  if (firstTime) {
3686
- if (isFunction$1(options?.onComponentInit)) {
4037
+ if (isFunction(options?.onComponentInit)) {
3687
4038
  options.onComponentInit(component);
3688
4039
  }
3689
4040
  // install our edit callback
@@ -3698,7 +4049,7 @@ class PropertyColumnModel extends ColumnModel {
3698
4049
  disableEditCallback = true;
3699
4050
  component.value = rowData.row[this.property];
3700
4051
  disableEditCallback = false;
3701
- if (!isFunction$1(options) && isFunction$1(options?.onRowUpdate)) {
4052
+ if (!isFunction(options) && isFunction(options?.onRowUpdate)) {
3702
4053
  options.onRowUpdate(component, rowData.row);
3703
4054
  }
3704
4055
  }));
@@ -3706,7 +4057,7 @@ class PropertyColumnModel extends ColumnModel {
3706
4057
  }
3707
4058
  cellEditor(editor, validatorsOrInitialiser, onComponentInit) {
3708
4059
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3709
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
4060
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
3710
4061
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3711
4062
  const formValueModel = editSession.form.pluck(this.property);
3712
4063
  if (validators) {
@@ -3730,29 +4081,37 @@ class PropertyColumnModel extends ColumnModel {
3730
4081
  }
3731
4082
 
3732
4083
  class SelectionColumnModel extends ColumnModel {
3733
- selectionModel;
3734
4084
  _enableHeaderControls = true;
3735
4085
  _color = "accent";
3736
- constructor(columnId, defaults, selectionModel) {
3737
- super(columnId, defaults);
3738
- this.selectionModel = selectionModel;
4086
+ _selectionModelProxy = proxify((SelectionModel));
4087
+ _isUsingTemporarySelection$ = new MutableValueModel(false);
4088
+ _userSelectionModel;
4089
+ constructor(columnId, order, defaults) {
4090
+ super(columnId, order, defaults);
3739
4091
  const { chain } = Dsl.disposeWith(this);
3740
4092
  this._selectRowOnClick(false);
3741
4093
  this.cellHeaderRenderer(SelectionHeaderCellComponent, (component) => {
3742
- component.selectionModel = this.selectionModel;
4094
+ component.selectionModel = this._selectionModelProxy;
3743
4095
  component.enableHeaderControls = this._enableHeaderControls;
3744
4096
  component.color = this._color;
3745
4097
  });
3746
4098
  this.configureCellRenderer(new ComponentCellRendererPortalRef(SelectionCellComponent, (component, rowData) => {
3747
4099
  component.row = rowData.row;
3748
- component.selectionModel = this.selectionModel;
4100
+ component.selectionModel = this._selectionModelProxy;
3749
4101
  component.color = this._color;
3750
4102
  }));
3751
- this.setMasterVisibility(this.selectionModel.enabled$);
3752
- this.setDefaultVisibility(chain(this.selectionModel.mode$).equals(SelectionModel.Mode.MULTIPLE));
4103
+ this.setMasterVisibility(this._selectionModelProxy.enabled$);
4104
+ this.setDefaultVisibility(chain(this._selectionModelProxy.mode$).equals(SelectionModel.Mode.MULTIPLE));
4105
+ }
4106
+ get selectionModel() {
4107
+ return this._selectionModelProxy;
4108
+ }
4109
+ get isUsingTemporarySelectionModel$() {
4110
+ return this._isUsingTemporarySelection$.readonly$;
3753
4111
  }
3754
4112
  useSelectionModel(selectionModel) {
3755
- this.selectionModel.setProxyTarget(selectionModel);
4113
+ this._userSelectionModel = selectionModel;
4114
+ this._selectionModelProxy.setProxyTarget(selectionModel);
3756
4115
  }
3757
4116
  getDefaultHeaderText() {
3758
4117
  return '';
@@ -3768,13 +4127,63 @@ class SelectionColumnModel extends ColumnModel {
3768
4127
  this._color = color;
3769
4128
  }
3770
4129
  selectRow(row) {
3771
- this.selectionModel.selectCommand.execute(row);
4130
+ this._selectionModelProxy.selectCommand.execute(row);
3772
4131
  }
3773
4132
  isSelected(row) {
3774
- return this.selectionModel.isSelected(row);
4133
+ return this._selectionModelProxy.isSelected(row);
4134
+ }
4135
+ async withTemporarySelectionModel(createSelectionModel, process) {
4136
+ const garbage = new GarbageCollector();
4137
+ this._isUsingTemporarySelection$.value = true;
4138
+ const selectionModel = createSelectionModel(garbage);
4139
+ this._selectionModelProxy.setProxyTarget(selectionModel);
4140
+ try {
4141
+ await process(selectionModel);
4142
+ }
4143
+ finally {
4144
+ this._selectionModelProxy.setProxyTarget(this._userSelectionModel);
4145
+ garbage.dispose();
4146
+ this._isUsingTemporarySelection$.value = false;
4147
+ }
3775
4148
  }
3776
4149
  }
3777
4150
 
4151
+ let RowClass$1 = class RowClass {
4152
+ className;
4153
+ matches;
4154
+ constructor(className, matches) {
4155
+ this.className = className;
4156
+ this.matches = matches;
4157
+ }
4158
+ };
4159
+ class FooterRowModel {
4160
+ _rowClasses = [];
4161
+ noPadding() {
4162
+ this.addClass("no-padding");
4163
+ }
4164
+ addClass(className, condition) {
4165
+ this._rowClasses.push(new RowClass$1(className, condition ?? (() => true)));
4166
+ }
4167
+ }
4168
+ (function (FooterRowModel) {
4169
+ class Impl extends FooterRowModel {
4170
+ component;
4171
+ onInit;
4172
+ portal;
4173
+ constructor(component, onInit) {
4174
+ super();
4175
+ this.component = component;
4176
+ this.onInit = onInit;
4177
+ this.portal = new ComponentPortal(component);
4178
+ }
4179
+ getActiveRowClasses() {
4180
+ return this._rowClasses.filter(c => c.matches()).map(c => c.className).join(" ");
4181
+ }
4182
+ }
4183
+ FooterRowModel.Impl = Impl;
4184
+ })(FooterRowModel || (FooterRowModel = {}));
4185
+ ProxyRegistry.registerOneTimeBinding(FooterRowModel);
4186
+
3778
4187
  class TableMoreMenuComponent extends DisposableComponent {
3779
4188
  value$ = new MutableValueModel();
3780
4189
  #value_accessor_storage;
@@ -3784,13 +4193,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3784
4193
  popupType$ = new MutableValueModel();
3785
4194
  popupComponentPortal$;
3786
4195
  _visible$ = this.registerDisposable(new DelegatingValueModel());
4196
+ initialiseCallback;
3787
4197
  constructor() {
3788
4198
  super();
3789
4199
  const { chain } = Dsl.disposeWith(this);
3790
4200
  this.popupComponentPortal$ = chain(this.popupType$).map(type => new ComponentPortal(type));
3791
4201
  }
3792
- configurePopupComponentType(popupComponentType) {
4202
+ configurePopupComponentType(popupComponentType, configureCallback) {
3793
4203
  this.popupType$.value = popupComponentType;
4204
+ this.initialiseCallback = configureCallback;
3794
4205
  }
3795
4206
  // Stops tree selection when clicking the menu button
3796
4207
  preventDefault($event) {
@@ -3801,12 +4212,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3801
4212
  const component = $event.instance;
3802
4213
  component.initialise(this.value$, Command.create(() => this.matMenuTrigger.closeMenu()));
3803
4214
  this._visible$.setDelegate(component.visible$);
4215
+ if (this.initialiseCallback) {
4216
+ this.initialiseCallback(component);
4217
+ }
3804
4218
  }
3805
4219
  get visible$() {
3806
4220
  return this._visible$.readonly$;
3807
4221
  }
3808
4222
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableMoreMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3809
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableMoreMenuComponent, selector: "aup-table-more-menu", host: { listeners: { "click": "preventDefault($event)" } }, viewQueries: [{ propertyName: "matMenuTrigger", first: true, predicate: MatMenuTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-menu #menu=\"matMenu\" xPosition=\"before\">\n <ng-template matMenuContent [cdkPortalOutlet]=\"popupComponentPortal$.value\"\n (attached)=\"initialise($event)\"></ng-template>\n</mat-menu>\n\n<button mat-icon-button [matMenuTriggerFor]=\"menu\" data-cy=\"more-menu-trigger\" *ngIf=\"visible$.value\">\n <aup-icon icon=\"mat:more_vert\"></aup-icon>\n</button>\n", styles: [":host{display:inline;text-align:end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i3$2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i4.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }] });
4223
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableMoreMenuComponent, selector: "aup-table-more-menu", host: { listeners: { "click": "preventDefault($event)" } }, viewQueries: [{ propertyName: "matMenuTrigger", first: true, predicate: MatMenuTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-menu #menu=\"matMenu\" xPosition=\"before\">\n <ng-template matMenuContent [cdkPortalOutlet]=\"popupComponentPortal$.value\"\n (attached)=\"initialise($event)\"></ng-template>\n</mat-menu>\n\n<button mat-icon-button [matMenuTriggerFor]=\"menu\" data-cy=\"more-menu-trigger\" *ngIf=\"visible$.value\">\n <aup-icon icon=\"mat:more_vert\"></aup-icon>\n</button>\n", styles: [":host{display:inline;text-align:end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1$4.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i4.MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }] });
3810
4224
  }
3811
4225
  __decorate([
3812
4226
  StoreInValueModel(),
@@ -3835,16 +4249,25 @@ class RowClass {
3835
4249
  this.matches = matches;
3836
4250
  }
3837
4251
  }
4252
+ class RowAttribute {
4253
+ attributeName;
4254
+ getValue;
4255
+ constructor(attributeName, getValue) {
4256
+ this.attributeName = attributeName;
4257
+ this.getValue = getValue;
4258
+ }
4259
+ }
3838
4260
  class AbstractTableModel extends GarbageCollector {
3839
4261
  _dataSource$ = this.registerDisposable(new DelegatingListModel());
3840
4262
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
3841
4263
  _visibleRows$ = this.registerDisposable(new DelegatingListModel());
3842
- _columnList = this.registerDisposable(new ColumnListModel());
4264
+ columnManager = this.registerDisposable(new ColumnManager());
3843
4265
  _editorSessions = new MutableListModel();
3844
4266
  _rowsBeingEdited$;
3845
4267
  saveCommandFactory;
3846
4268
  _editorSessionByRowId;
3847
4269
  rowClassNamePredicates = [];
4270
+ rowAttributeGenerators = [];
3848
4271
  _columnTextPropertiesLookup;
3849
4272
  editing$;
3850
4273
  firstEditableColumn$;
@@ -3857,10 +4280,11 @@ class AbstractTableModel extends GarbageCollector {
3857
4280
  textSearchPredicate$;
3858
4281
  identityOf;
3859
4282
  dataSourceEmpty$;
3860
- selectionModelProxy = proxify((SelectionModel));
3861
4283
  selectedItems$;
3862
4284
  leadSelection$;
3863
4285
  hasSelection$;
4286
+ footerRowModel;
4287
+ _viewDependencies = new Set();
3864
4288
  constructor() {
3865
4289
  super();
3866
4290
  const { chain } = Dsl.disposeWith(this);
@@ -3869,18 +4293,21 @@ class AbstractTableModel extends GarbageCollector {
3869
4293
  });
3870
4294
  this._editorSessionByRowId = chain(this._editorSessions).indexBy("rowId");
3871
4295
  this.editing$ = chain(this._editorSessions).count().isGreaterThan(0);
3872
- this.textSearchPredicate$ = chain(this.visibleColumns).reduce(columns => {
4296
+ this.textSearchPredicate$ = chain(this.visibleColumns$).reduceAll(columns => {
3873
4297
  return (row, regex) => {
3874
4298
  return (!regex || !!columns.find(c => regex.test(c.getSearchTextFor(row))));
3875
4299
  };
3876
4300
  });
3877
- this.firstEditableColumn$ = chain(this.columns).select(c => c.hasEditorPortal()).first();
3878
- this.firstVisibleColumn$ = chain(this._columnList).first();
3879
- this.lastVisibleColumn$ = chain(this._columnList).last();
3880
- this.rowSelectionDisabledOnAllColumns$ = chain(this._columnList).select(column => column.isRowSelectionEnabled()).count().equals(0);
4301
+ this.selectionColumnModel = new SelectionColumnModel("selection-column", this.columnManager, () => this.getColumnTextProperties("selection-column"));
4302
+ this.addColumn(this.selectionColumnModel, { before: null }); // first column
4303
+ this.addRowClass("aup-row-selected", row => this.selectionColumnModel.isSelected(row));
4304
+ this.firstEditableColumn$ = chain(this.columns$).select(c => c.hasEditorPortal()).first();
4305
+ this.firstVisibleColumn$ = chain(this.visibleColumns$).first();
4306
+ this.lastVisibleColumn$ = chain(this.visibleColumns$).last();
4307
+ this.rowSelectionDisabledOnAllColumns$ = chain(this.columnManager.visibleColumns$).select(column => column.isRowSelectionEnabled()).count().equals(0);
3881
4308
  this.dataSourceEmpty$ = chain(this.dataSource$).isEmpty();
3882
- this.selectedItems$ = this.selectionModelProxy.selectedItems$;
3883
- this.leadSelection$ = this.selectionModelProxy.leadSelection$;
4309
+ this.selectedItems$ = this.selectionColumnModel.selectionModel.selectedItems$;
4310
+ this.leadSelection$ = this.selectionColumnModel.selectionModel.leadSelection$;
3884
4311
  this.hasSelection$ = chain(this.selectedItems$).isNotEmpty();
3885
4312
  }
3886
4313
  setDataSource(dataSource$) {
@@ -3901,9 +4328,23 @@ class AbstractTableModel extends GarbageCollector {
3901
4328
  ],
3902
4329
  parent: injector
3903
4330
  });
3904
- this.columns.value.forEach(c => c.initialise(customInjector));
4331
+ this.columns$.value.forEach(c => c.initialise(customInjector));
3905
4332
  this.identityOf = identityOf;
3906
4333
  }
4334
+ /**
4335
+ * Adds additional models that will trigger a table repaint. This is required if the table
4336
+ * needs to be redrawn outside of changes to the rows of filters. i.e. some eternal state is used
4337
+ * to assign row classes etc.
4338
+ *
4339
+ * Note: This function must be called before the table is bound to the model.
4340
+ * @param hasValues
4341
+ */
4342
+ viewStateDependsOn(...hasValues) {
4343
+ hasValues.forEach(it => this._viewDependencies.add(it));
4344
+ }
4345
+ get viewStateDependencies() {
4346
+ return Array.from(this._viewDependencies.values());
4347
+ }
3907
4348
  get dataSource$() {
3908
4349
  return this._dataSource$.readonly$;
3909
4350
  }
@@ -3954,64 +4395,62 @@ class AbstractTableModel extends GarbageCollector {
3954
4395
  });
3955
4396
  });
3956
4397
  }
3957
- get columns() {
3958
- return this._columnList.allColumns$;
4398
+ get columns$() {
4399
+ return this.columnManager.allColumns$;
3959
4400
  }
3960
- get visibleColumns() {
3961
- return this._columnList.readonly$;
4401
+ get visibleColumns$() {
4402
+ return this.columnManager.visibleColumns$;
3962
4403
  }
3963
4404
  pluck(property, options) {
3964
4405
  const columnId = options?.columnId || property.toString();
3965
- return this.addColumn(new PropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4406
+ return this.addColumn(new PropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3966
4407
  }
3967
4408
  pluckList(property, options) {
3968
4409
  const columnId = options?.columnId || property.toString();
3969
- return this.addColumn(new ListPropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
3970
- }
3971
- // TODO: clean this up and assign the selection model on teh table directly.
3972
- // tableModel.useSelectionModel(model) and have the seleciton column automatically
3973
- // added. Need to look at how we're using the visibility controls as well.
3974
- // Should also lazy create the selection column model if someone accesses it.
3975
- _addSelectionColumn(selectionModel, visible) {
3976
- assert.isNil(this.selectionColumnModel);
3977
- const columnId = "selection-column";
3978
- this.selectionColumnModel = new SelectionColumnModel(columnId, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
4410
+ return this.addColumn(new ListPropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
4411
+ }
4412
+ useSelectionModel(selectionModel) {
3979
4413
  this.selectionColumnModel.useSelectionModel(selectionModel);
3980
- this.addRowClass("aup-row-selected", row => this.selectionColumnModel.isSelected(row));
3981
- const selectionColumnModel = this.addColumn(this.selectionColumnModel, 0);
3982
- if (!isNil$1(visible)) {
3983
- selectionColumnModel.visibleWhile(visible instanceof ValueModel ? visible : ValueModel.constant(visible));
3984
- }
3985
- return selectionColumnModel;
3986
4414
  }
3987
4415
  addEditControls(saveCommandFactory, formFactory) {
3988
4416
  this.saveCommandFactory = saveCommandFactory;
3989
- if (isFunction$1(formFactory)) {
4417
+ if (isFunction(formFactory)) {
3990
4418
  this._createForm = formFactory;
3991
4419
  }
3992
4420
  const columnId = "editControls";
3993
- return this.addColumn(new EditorControlColumnModel(columnId, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
4421
+ return this.addColumn(new EditorControlColumnModel(columnId, this.columnManager, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
3994
4422
  }
3995
4423
  addCustomColumn(columnId, dataAccessor) {
3996
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), dataAccessor));
4424
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), dataAccessor));
3997
4425
  }
3998
4426
  addComponentColumn(columnId, component, onComponentInitOrOptions) {
3999
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4427
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4000
4428
  }
4001
- addMoreMenu(componentClass) {
4429
+ addMoreMenu(componentClass, initialiseCallback) {
4002
4430
  return this.addComponentColumn("more-menu", TableMoreMenuComponent, (component) => {
4003
- component.configurePopupComponentType(componentClass);
4431
+ component.configurePopupComponentType(componentClass, initialiseCallback);
4004
4432
  }).columnTextProperties({
4005
4433
  headerText() {
4006
4434
  return "";
4007
4435
  }
4008
4436
  });
4009
4437
  }
4438
+ addFooterRow(component, initialiseCallback) {
4439
+ assert.isNil(this.footerRowModel);
4440
+ this.footerRowModel = new FooterRowModel.Impl(component, initialiseCallback);
4441
+ return this.footerRowModel;
4442
+ }
4010
4443
  addTemplateColumn(columnId) {
4011
- return this.addColumn(new CustomTemplateColumnModel(columnId, () => this.getColumnTextProperties(columnId)));
4444
+ return this.addColumn(new CustomTemplateColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId)));
4012
4445
  }
4013
- addRowClass(className, predicate) {
4446
+ addRowClass(className, predicate, options) {
4014
4447
  this.rowClassNamePredicates.push(new RowClass(className, predicate));
4448
+ if (options) {
4449
+ this.viewStateDependsOn(...DependsOnOptions.extract(options));
4450
+ }
4451
+ }
4452
+ addRowAttribute(attributeName, getValue) {
4453
+ this.rowAttributeGenerators.push(new RowAttribute(attributeName, getValue));
4015
4454
  }
4016
4455
  getRowClasses(row) {
4017
4456
  const classNames = [];
@@ -4022,8 +4461,13 @@ class AbstractTableModel extends GarbageCollector {
4022
4461
  });
4023
4462
  return classNames;
4024
4463
  }
4025
- addColumn(column, index) {
4026
- return this._columnList.addColumn(column, index);
4464
+ getRowAttributes(row) {
4465
+ return this.rowAttributeGenerators.reduce((result, generator) => {
4466
+ return { ...result, [generator.attributeName]: generator.getValue(row) };
4467
+ }, {});
4468
+ }
4469
+ addColumn(column, position) {
4470
+ return this.columnManager.addColumn(column, position);
4027
4471
  }
4028
4472
  columnTextProperties(columnTextProperties) {
4029
4473
  this._columnTextPropertiesLookup = columnTextProperties;
@@ -4038,11 +4482,10 @@ class AbstractTableModel extends GarbageCollector {
4038
4482
  return this.hasUserSelectionModelThatIsEnabled() && !this.rowSelectionDisabledOnAllColumns$.value;
4039
4483
  }
4040
4484
  hasUserSelectionModelThatIsEnabled() {
4041
- const userSelectionModel = this.selectionColumnModel?.selectionModel.getProxyTarget();
4042
- return !!userSelectionModel && userSelectionModel.enabled$.value;
4485
+ return this.selectionColumnModel.selectionModel.enabled$.value;
4043
4486
  }
4044
4487
  getSelectionModel() {
4045
- return this.selectionColumnModel?.selectionModel;
4488
+ return this.selectionColumnModel.selectionModel;
4046
4489
  }
4047
4490
  isHoverEnabled() {
4048
4491
  return this.isRowSelectionEnabled() || this.rowClickListeners.listenerCount > 0;
@@ -4084,15 +4527,15 @@ class TableCellComponent extends DisposableComponent {
4084
4527
  defaultClassNames = 'aup-cell-renderer';
4085
4528
  fillCell = false;
4086
4529
  padChild = false;
4087
- firstEditableColumn;
4088
4530
  constructor() {
4089
4531
  super();
4090
4532
  this.editRowCommand = Command.create(() => {
4091
4533
  this.tableModel.startEditSession(this.row);
4092
4534
  });
4093
4535
  this.onInit(() => {
4094
- const { chain } = Dsl.disposeWith(this);
4095
- this.firstEditableColumn = chain(this.tableModel.firstEditableColumn$).equals(this.column); // this would break if the column changed.
4536
+ // This binding was triggering a memory leak... not sure why.
4537
+ // const { chain} = Dsl.disposeWith(this);
4538
+ // this.firstEditableColumn = chain(this.tableModel.firstEditableColumn$).equals(this.column); // this would break if the column changed.
4096
4539
  this.column.attachCell(this);
4097
4540
  });
4098
4541
  }
@@ -4104,7 +4547,7 @@ class TableCellComponent extends DisposableComponent {
4104
4547
  }
4105
4548
  initialiseEditor(ref) {
4106
4549
  this.column.onEditorAttached(this, ref);
4107
- if (this.firstEditableColumn.value) {
4550
+ if (this.tableModel.firstEditableColumn$.value === this.column) {
4108
4551
  // @see https://github.com/angular/components/issues/12070
4109
4552
  setTimeout(() => this.tryAndFocusEditor(ref));
4110
4553
  }
@@ -4140,7 +4583,7 @@ class TableCellComponent extends DisposableComponent {
4140
4583
  };
4141
4584
  }
4142
4585
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4143
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableCellComponent, selector: "aup-table-cell", inputs: { row: "row", column: "column", editSession: "editSession", tableModel: "tableModel" }, host: { properties: { "class": "this.defaultClassNames", "class.fillCell": "this.fillCell", "class.padChild": "this.padChild" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!hasActiveEditor()\" [cdkPortalOutlet]=\"getRendererPortal()\" (attached)=\"initialiseRenderer($event)\"></ng-container>\n<ng-container *ngIf=\"hasActiveEditor()\" [cdkPortalOutlet]=\"getEditorPortal()\" (attached)=\"initialiseEditor($event)\"></ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3$2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
4586
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableCellComponent, selector: "aup-table-cell", inputs: { row: "row", column: "column", editSession: "editSession", tableModel: "tableModel" }, host: { properties: { "class": "this.defaultClassNames", "class.fillCell": "this.fillCell", "class.padChild": "this.padChild" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!hasActiveEditor()\" [cdkPortalOutlet]=\"getRendererPortal()\" (attached)=\"initialiseRenderer($event)\"></ng-container>\n<ng-container *ngIf=\"hasActiveEditor()\" [cdkPortalOutlet]=\"getEditorPortal()\" (attached)=\"initialiseEditor($event)\"></ng-container>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
4144
4587
  }
4145
4588
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableCellComponent, decorators: [{
4146
4589
  type: Component,
@@ -4179,7 +4622,7 @@ class TableHeaderCellComponent {
4179
4622
  return this[HEADER_CELL_RENDERER_PORTAL];
4180
4623
  }
4181
4624
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableHeaderCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4182
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: { column: "column" }, host: { properties: { "class": "this.defaultClassNames" } }, ngImport: i0, template: "<ng-container [cdkPortalOutlet]=\"getPortal()\" (attached)=\"initialiseHeader($event)\"></ng-container>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%}\n"], dependencies: [{ kind: "directive", type: i3$2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
4625
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: { column: "column" }, host: { properties: { "class": "this.defaultClassNames" } }, ngImport: i0, template: "<ng-container [cdkPortalOutlet]=\"getPortal()\" (attached)=\"initialiseHeader($event)\"></ng-container>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%}\n"], dependencies: [{ kind: "directive", type: i1$4.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
4183
4626
  }
4184
4627
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableHeaderCellComponent, decorators: [{
4185
4628
  type: Component,
@@ -4191,61 +4634,132 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
4191
4634
  args: ['class']
4192
4635
  }] } });
4193
4636
 
4637
+ // eslint-disable-next-line @angular-eslint/component-class-suffix
4638
+ class TableFooterRow {
4639
+ row;
4640
+ defaultClassNames = 'aup-footer-row-renderer';
4641
+ get rowClasses() {
4642
+ return this.row.getActiveRowClasses();
4643
+ }
4644
+ initialise($event) {
4645
+ this.row.onInit && this.row.onInit($event.instance);
4646
+ }
4647
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, deps: [], target: i0.ɵɵFactoryTarget.Component });
4648
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableFooterRow, selector: "aup-table-footer-row", inputs: { row: "row" }, host: { properties: { "class": "this.rowClasses" } }, ngImport: i0, template: "<ng-container [cdkPortalOutlet]=\"row.portal\" (attached)=\"initialise($event)\"></ng-container>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%}\n"], dependencies: [{ kind: "directive", type: i1$4.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
4649
+ }
4650
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, decorators: [{
4651
+ type: Component,
4652
+ args: [{ selector: 'aup-table-footer-row', template: "<ng-container [cdkPortalOutlet]=\"row.portal\" (attached)=\"initialise($event)\"></ng-container>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%}\n"] }]
4653
+ }], propDecorators: { row: [{
4654
+ type: Input
4655
+ }], defaultClassNames: [{
4656
+ type: HostBinding,
4657
+ args: ['class']
4658
+ }], rowClasses: [{
4659
+ type: HostBinding,
4660
+ args: ['class']
4661
+ }] } });
4662
+
4663
+ const AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER = new InjectionToken("AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER");
4664
+ class TableRowAttributesDirective {
4665
+ elementRef;
4666
+ aupTableRowAttributes;
4667
+ constructor(elementRef) {
4668
+ this.elementRef = elementRef;
4669
+ }
4670
+ ngOnInit() {
4671
+ for (const attr in this.aupTableRowAttributes) {
4672
+ this.elementRef.nativeElement.setAttribute(attr, this.aupTableRowAttributes[attr]);
4673
+ }
4674
+ }
4675
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
4676
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: { aupTableRowAttributes: "aupTableRowAttributes" }, ngImport: i0 });
4677
+ }
4678
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, decorators: [{
4679
+ type: Directive,
4680
+ args: [{
4681
+ selector: "[aupTableRowAttributes]",
4682
+ }]
4683
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { aupTableRowAttributes: [{
4684
+ type: Input
4685
+ }] } });
4194
4686
  class TableBodyComponent extends ResizeAwareComponent {
4687
+ bufferMultiplier;
4195
4688
  #data$_accessor_storage = proxify((ListModel));
4196
4689
  get data$() { return this.#data$_accessor_storage; }
4197
4690
  set data$(value) { this.#data$_accessor_storage = value; }
4198
4691
  #tableModel_accessor_storage = proxify((AbstractTableModel));
4199
4692
  get tableModel() { return this.#tableModel_accessor_storage; }
4200
4693
  set tableModel(value) { this.#tableModel_accessor_storage = value; }
4694
+ #footerRow_accessor_storage = proxify((FooterRowModel.Impl));
4695
+ get footerRow() { return this.#footerRow_accessor_storage; }
4696
+ set footerRow(value) { this.#footerRow_accessor_storage = value; }
4201
4697
  #showHeader$_accessor_storage = proxify((ValueModel));
4202
4698
  get showHeader$() { return this.#showHeader$_accessor_storage; }
4203
4699
  set showHeader$(value) { this.#showHeader$_accessor_storage = value; }
4204
4700
  #showHeader_accessor_storage = true;
4205
4701
  get showHeader() { return this.#showHeader_accessor_storage; }
4206
4702
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
4207
- visibleRowCount = new EventEmitter();
4208
4703
  trackBy;
4209
- /**
4210
- * Set to true to enable scrolling. Once enabled the table will have 0 implicit height. You will either
4211
- * need to set it explicitly e.g. height: 400px; or by using flex or grid layout to make it fill it's
4212
- * containment area.
4213
- */
4214
- enableScrolling = false;
4704
+ #scrollMode$_accessor_storage = proxify((ValueModel));
4705
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
4706
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
4707
+ #scrollMode_accessor_storage = "none";
4708
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
4709
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4710
+ scrollViewport;
4215
4711
  columns$;
4216
4712
  columnIds$;
4217
4713
  columnsById$;
4218
- _visibleRowCount$;
4219
4714
  // TODO: support user defined header and row heights via css vars.
4220
- headerHeight$ = new MutableValueModel(29);
4221
- rowHeight$ = new MutableValueModel(40);
4715
+ headerHeight$ = new MutableValueModel(48);
4716
+ rowHeight$ = new MutableValueModel(44);
4222
4717
  baseCssClass = "aup-table-component";
4223
- constructor(elementRef, ngZone) {
4224
- super(elementRef, ngZone);
4225
- const { chain, when } = Dsl.disposeWith(this);
4718
+ virtualScrollDataSource = new TableVirtualScrollDataSource();
4719
+ virtualScrollActive$ = new MutableValueModel(false);
4720
+ scrollTimeout;
4721
+ constructor(bufferMultiplier = 1) {
4722
+ super();
4723
+ this.bufferMultiplier = bufferMultiplier;
4724
+ const { chain, when, observe } = Dsl.disposeWith(this);
4226
4725
  const actualHeaderHeight$ = chain(this.showHeader$).map(show => {
4227
4726
  return show ? this.headerHeight$.value : 0;
4228
4727
  }, { dependsOn: this.headerHeight$ });
4229
- this._visibleRowCount$ = chain(this.bounds$).map(bounds => {
4230
- // TODO: this doesn't take into account any css styling adjustments etc. Will investigate if it's an issue.
4231
- const rawRowCount = (bounds.height - actualHeaderHeight$.value) / this.rowHeight$.value;
4232
- return rawRowCount < 1 ? 0 : Math.floor(rawRowCount);
4233
- }, {
4234
- dependsOn: [actualHeaderHeight$, this.rowHeight$],
4235
- postponeWhile: chain(this.bounds$).pluckNumeric("height").isLessThan(1)
4236
- });
4237
- when(this._visibleRowCount$).changes(visibleRows => {
4238
- this.visibleRowCount.emit(visibleRows);
4239
- }, { initialValue: "triggerChangeUnlessNil" });
4728
+ // performance is terrible if the data changes while we're scrolling, so we postpone updates until
4729
+ // scrolling stops.
4730
+ const delayedDatea$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
4731
+ when(delayedDatea$).changes(delatedData => {
4732
+ this.virtualScrollDataSource.data = delatedData;
4733
+ this.scheduleTableHeightCheck();
4734
+ }, { initialValue: "evaluate" });
4240
4735
  this.onInit(() => {
4241
- this.columns$ = chain(this.tableModel.columns);
4736
+ this.columns$ = chain(this.tableModel.visibleColumns$);
4242
4737
  this.columnIds$ = chain(this.columns$).pluck("columnId");
4243
4738
  this.columnsById$ = chain(this.columns$).indexBy('columnId');
4244
4739
  });
4740
+ // const txo = new TransactionObserver({verbose: false}).onEvent(e => console.log(e.name, e.payload));
4741
+ // txo.observe('this.virtualScrollRowRange$', this.virtualScrollRowRange$);
4742
+ // txo.observe('this.virtualScrollSpacerSize$', this.virtualScrollSpacerSize$);
4743
+ // txo.observe('this.virtualRows$', this.virtualRows$);
4744
+ // txo.observe('this.tableBodyHeight$', this.tableBodyHeight$);
4745
+ // txo.observe('this.virtualScrollActive$', this.virtualScrollActive$);
4746
+ }
4747
+ ngAfterViewInit() {
4748
+ super.ngAfterViewInit();
4749
+ if (this.scrollViewport) {
4750
+ const { observe } = Dsl.disposeWith(this);
4751
+ this.scrollViewport.elementScrolled().subscribe(() => this.notifyScrolled());
4752
+ }
4245
4753
  }
4246
4754
  get hideHeader() {
4247
4755
  return !this.showHeader;
4248
4756
  }
4757
+ get headerHeightCssVar() {
4758
+ return `${this.headerHeight$.value}px`;
4759
+ }
4760
+ get rowHeightCssVar() {
4761
+ return `${this.rowHeight$.value}px`;
4762
+ }
4249
4763
  isEditing(row) {
4250
4764
  return !!this.tableModel.getEditSessionFor(row);
4251
4765
  }
@@ -4270,51 +4784,110 @@ class TableBodyComponent extends ResizeAwareComponent {
4270
4784
  }
4271
4785
  return classes;
4272
4786
  }
4273
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
4274
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableBodyComponent, selector: "aup-table-body", inputs: { data$: "data$", tableModel: "tableModel", showHeader$: "showHeader$", showHeader: "showHeader", trackBy: "trackBy", enableScrolling: "enableScrolling" }, outputs: { visibleRowCount: "visibleRowCount" }, host: { properties: { "class.enable-scrolling": "this.enableScrolling", "class": "this.baseCssClass", "class.hide-header": "this.hideHeader" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"tableModel\"\n [editSession]=\"tableModel.getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host.enable-scrolling{min-height:0}:host.enable-scrolling .scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i2$6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2$6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2$6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2$6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i2$6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2$6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2$6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2$6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2$6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2$6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: TableCellComponent, selector: "aup-table-cell", inputs: ["row", "column", "editSession", "tableModel"] }, { kind: "component", type: TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: ["column"] }] });
4787
+ scheduleTableHeightCheck(waitMillis = 50) {
4788
+ setTimeout(() => {
4789
+ const tbody = this.elementRef.nativeElement.querySelector("tbody");
4790
+ const bodyHeight = tbody.offsetHeight;
4791
+ if (this.data$.length > 0 && bodyHeight < this.rowHeight$.value) {
4792
+ // Hacks to get our virtual scroll to repaint
4793
+ // Logger.get(this).log(`rowCount=${this.data$.length}, bodyHeight=${bodyHeight} -> virtual table not rendering, triggering resize to force repaint`)
4794
+ window.dispatchEvent(new Event('resize'));
4795
+ if (waitMillis < 500) {
4796
+ this.scheduleTableHeightCheck(waitMillis + 50);
4797
+ }
4798
+ }
4799
+ }, waitMillis);
4800
+ }
4801
+ notifyScrolled() {
4802
+ this.virtualScrollActive$.value = true;
4803
+ this.clearScrollTimeout();
4804
+ this.scrollTimeout = setTimeout(() => {
4805
+ return this.virtualScrollActive$.value = false;
4806
+ }, 200);
4807
+ }
4808
+ clearScrollTimeout() {
4809
+ if (this.scrollTimeout) {
4810
+ clearTimeout(this.scrollTimeout);
4811
+ }
4812
+ }
4813
+ initialiseFooter($event) {
4814
+ const portalRef = $event;
4815
+ this.footerRow.onInit(portalRef.instance);
4816
+ }
4817
+ Proxify = Proxify;
4818
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, deps: [{ token: AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
4819
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableBodyComponent, selector: "aup-table-body", inputs: { data$: "data$", tableModel: "tableModel", footerRow: "footerRow", showHeader$: "showHeader$", showHeader: "showHeader", trackBy: "trackBy", scrollMode$: "scrollMode$", scrollMode: "scrollMode" }, host: { properties: { "attr.scrollMode": "this.scrollMode", "class": "this.baseCssClass", "class.hide-header": "this.hideHeader", "style.--aup-table-header-height": "this.headerHeightCssVar", "style.--aup-table-row-height": "this.rowHeightCssVar" } }, viewQueries: [{ propertyName: "scrollViewport", first: true, predicate: CdkVirtualScrollViewport, descendants: true }], usesInheritance: true, ngImport: i0, template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"$any(column)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n <ng-container matColumnDef=\"sticky-footer\" *ngIf=\"Proxify.hasTarget(footerRow)\">\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"columns$.length\" [ngClass]=\"'footer-cell'\">\n <aup-table-footer-row [row]=\"$any(footerRow)\"></aup-table-footer-row>\n </td>\n <tr mat-footer-row *matFooterRowDef=\"['sticky-footer']; sticky: true\"></tr>\n </ng-container>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n<!-- Layout doesn't work yet - probably needs fixed footer row height -->\n<!-- <ng-container matColumnDef=\"sticky-footer\" *ngIf=\"tableModel.footerRowPortalRef\">-->\n<!-- <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"columns$.length\">-->\n<!-- <ng-container [cdkPortalOutlet]=\"tableModel.footerRowPortalRef.portal\" (attached)=\"initialiseFooter($event)\"></ng-container>-->\n<!-- </td>-->\n<!-- <tr mat-footer-row *matFooterRowDef=\"['sticky-footer']; sticky: true\"></tr>-->\n<!-- </ng-container>-->\n\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2$6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2$6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2$6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2$6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i2$6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2$6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2$6.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i2$6.MatFooterRowDef, selector: "[matFooterRowDef]", inputs: ["matFooterRowDef", "matFooterRowDefSticky"] }, { kind: "directive", type: i2$6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2$6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i2$6.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i2$6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2$6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i2$6.MatFooterRow, selector: "mat-footer-row, tr[mat-footer-row]", exportAs: ["matFooterRow"] }, { kind: "component", type: i1$2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i4$4.TableItemSizeDirective, selector: "cdk-virtual-scroll-viewport[tvsItemSize]", inputs: ["tvsItemSize", "headerEnabled", "headerHeight", "footerEnabled", "footerHeight", "bufferMultiplier"] }, { kind: "directive", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: ["aupTableRowAttributes"] }, { kind: "component", type: TableCellComponent, selector: "aup-table-cell", inputs: ["row", "column", "editSession", "tableModel"] }, { kind: "component", type: TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: ["column"] }, { kind: "component", type: TableFooterRow, selector: "aup-table-footer-row", inputs: ["row"] }] });
4275
4820
  }
4276
4821
  __decorate([
4277
4822
  Proxify(),
4278
- __metadata("design:type", Object)
4823
+ __metadata("design:type", ListModel)
4279
4824
  ], TableBodyComponent.prototype, "data$", null);
4280
4825
  __decorate([
4281
4826
  Proxify(),
4282
- __metadata("design:type", Object)
4827
+ __metadata("design:type", AbstractTableModel)
4283
4828
  ], TableBodyComponent.prototype, "tableModel", null);
4284
4829
  __decorate([
4285
4830
  Proxify(),
4286
- __metadata("design:type", Object)
4831
+ __metadata("design:type", FooterRowModel.Impl)
4832
+ ], TableBodyComponent.prototype, "footerRow", null);
4833
+ __decorate([
4834
+ Proxify(),
4835
+ __metadata("design:type", ValueModel)
4287
4836
  ], TableBodyComponent.prototype, "showHeader$", null);
4288
4837
  __decorate([
4289
4838
  StoreInValueModel(),
4290
4839
  __metadata("design:type", Object)
4291
4840
  ], TableBodyComponent.prototype, "showHeader", null);
4841
+ __decorate([
4842
+ Proxify(),
4843
+ __metadata("design:type", ValueModel)
4844
+ ], TableBodyComponent.prototype, "scrollMode$", null);
4845
+ __decorate([
4846
+ StoreInValueModel(),
4847
+ __metadata("design:type", String)
4848
+ ], TableBodyComponent.prototype, "scrollMode", null);
4292
4849
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, decorators: [{
4293
4850
  type: Component,
4294
- args: [{ selector: "aup-table-body", template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"tableModel\"\n [editSession]=\"tableModel.getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host.enable-scrolling{min-height:0}:host.enable-scrolling .scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"] }]
4295
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { data$: [{
4851
+ args: [{ selector: "aup-table-body", template: "\n<div class=\"classic-scroll-container\" *ngIf=\"scrollMode$.value !== 'virtual'\">\n <table mat-table [dataSource]=\"data$.value\" [trackBy]=\"trackBy\" [multiTemplateDataRows]>\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"$any(column)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n <ng-container matColumnDef=\"sticky-footer\" *ngIf=\"Proxify.hasTarget(footerRow)\">\n <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"columns$.length\" [ngClass]=\"'footer-cell'\">\n <aup-table-footer-row [row]=\"$any(footerRow)\"></aup-table-footer-row>\n </td>\n <tr mat-footer-row *matFooterRowDef=\"['sticky-footer']; sticky: true\"></tr>\n </ng-container>\n\n </table>\n</div>\n\n<cdk-virtual-scroll-viewport *ngIf=\"scrollMode$.value === 'virtual'\"\n [tvsItemSize]=\"rowHeight$.value\"\n [headerHeight]=\"headerHeight$.value\"\n [bufferMultiplier]=\"bufferMultiplier\"\n>\n <table mat-table [dataSource]=\"virtualScrollDataSource\" [trackBy]=\"trackBy\">\n\n <ng-container *ngFor=\"let column of columns$.value; index as index; first as first; last as last\"\n matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef [class.flex]=\"column.isFlex()\" [class.hide]=\"!column.isVisible()\">\n <aup-table-header-cell [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"tableModel.isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"$any(column)\"\n [row]=\"row\"\n [tableModel]=\"$any(tableModel)\"\n [editSession]=\"$any(tableModel.getEditSessionFor(row))\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds$.value; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds$.value; let i = index\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n [class.enable-hover]=\"tableModel.isHoverEnabled()\"\n [aupTableRowAttributes]=\"tableModel.getRowAttributes(row)\"\n [attr.aup-row-id]=\"trackBy(i, row)\"\n ></tr>\n\n<!-- Layout doesn't work yet - probably needs fixed footer row height -->\n<!-- <ng-container matColumnDef=\"sticky-footer\" *ngIf=\"tableModel.footerRowPortalRef\">-->\n<!-- <td mat-footer-cell *matFooterCellDef [attr.colspan]=\"columns$.length\">-->\n<!-- <ng-container [cdkPortalOutlet]=\"tableModel.footerRowPortalRef.portal\" (attached)=\"initialiseFooter($event)\"></ng-container>-->\n<!-- </td>-->\n<!-- <tr mat-footer-row *matFooterRowDef=\"['sticky-footer']; sticky: true\"></tr>-->\n<!-- </ng-container>-->\n\n\n </table>\n</cdk-virtual-scroll-viewport>\n\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{width:100%}:host[scrollMode=virtual] cdk-virtual-scroll-viewport{flex:1}:host[scrollMode=virtual] table th{height:var(--aup-table-header-height);max-height:var(--aup-table-header-height);min-height:var(--aup-table-header-height)}:host[scrollMode=virtual] table td{height:var(--aup-table-row-height);max-height:var(--aup-table-row-height);min-height:var(--aup-table-row-height)}:host[scrollMode=classic]{min-height:0}:host[scrollMode=classic] .classic-scroll-container{flex:1;flex-basis:0;overflow-y:auto;display:flex;flex-direction:column;align-items:stretch}\n"] }]
4852
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
4853
+ type: Inject,
4854
+ args: [AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER]
4855
+ }, {
4856
+ type: Optional
4857
+ }] }]; }, propDecorators: { data$: [{
4296
4858
  type: Input
4297
4859
  }], tableModel: [{
4298
4860
  type: Input
4861
+ }], footerRow: [{
4862
+ type: Input
4299
4863
  }], showHeader$: [{
4300
4864
  type: Input
4301
4865
  }], showHeader: [{
4302
4866
  type: Input
4303
- }], visibleRowCount: [{
4304
- type: Output
4305
4867
  }], trackBy: [{
4306
4868
  type: Input
4307
- }], enableScrolling: [{
4869
+ }], scrollMode$: [{
4870
+ type: Input
4871
+ }], scrollMode: [{
4308
4872
  type: Input
4309
4873
  }, {
4310
4874
  type: HostBinding,
4311
- args: ["class.enable-scrolling"]
4875
+ args: ["attr.scrollMode"]
4876
+ }], scrollViewport: [{
4877
+ type: ViewChild,
4878
+ args: [CdkVirtualScrollViewport]
4312
4879
  }], baseCssClass: [{
4313
4880
  type: HostBinding,
4314
4881
  args: ["class"]
4315
4882
  }], hideHeader: [{
4316
4883
  type: HostBinding,
4317
4884
  args: ["class.hide-header"]
4885
+ }], headerHeightCssVar: [{
4886
+ type: HostBinding,
4887
+ args: ["style.--aup-table-header-height"]
4888
+ }], rowHeightCssVar: [{
4889
+ type: HostBinding,
4890
+ args: ["style.--aup-table-row-height"]
4318
4891
  }] } });
4319
4892
 
4320
4893
  class TableMoreMenuPopupComponent extends DisposableComponent {
@@ -4435,8 +5008,10 @@ class TableFilterModel extends GarbageCollector {
4435
5008
  this.useSearchText(options.searchText$);
4436
5009
  this.useRowPredicate(options.predicate$);
4437
5010
  const { chain } = Dsl.disposeWith(this);
4438
- const textSearchRegex$ = chain(this._searchText$).map(text => {
4439
- return isEmpty$1(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
5011
+ const textSearchRegex$ = chain(this._searchText$)
5012
+ .debounce(250)
5013
+ .map(text => {
5014
+ return isEmpty(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4440
5015
  }, { allowNil: true });
4441
5016
  this._rowPredicate = chain(this._rowPredicate$)
4442
5017
  .map(predicate => {
@@ -4572,8 +5147,16 @@ class TableModel extends AbstractTableModel {
4572
5147
  this._filteredRows$.setDelegate(filteredRows$);
4573
5148
  this._visibleRows$.setDelegate(visibleRows$);
4574
5149
  }
4575
- addSelectionColumn(selectionModel, showSelectionColumn) {
4576
- return this._addSelectionColumn(selectionModel, showSelectionColumn);
5150
+ get isUsingTemporarySelectionModel$() {
5151
+ return this.selectionColumnModel.isUsingTemporarySelectionModel$;
5152
+ }
5153
+ async withTemporaryMultipleSelectionModel(process) {
5154
+ return this.selectionColumnModel.withTemporarySelectionModel(garbage => {
5155
+ return new MultipleSelectionModel(this.filteredRows$, {
5156
+ identifiedWith: this.dataSource$.identityOf,
5157
+ disposedWith: garbage
5158
+ });
5159
+ }, process);
4577
5160
  }
4578
5161
  }
4579
5162
 
@@ -4644,31 +5227,30 @@ class TableComponent extends AbstractTableComponent {
4644
5227
  #filterModel_accessor_storage = proxify((TableFilterModel));
4645
5228
  get filterModel() { return this.#filterModel_accessor_storage; }
4646
5229
  set filterModel(value) { this.#filterModel_accessor_storage = value; }
4647
- #enablePaging$_accessor_storage = proxify((ValueModel));
4648
- get enablePaging$() { return this.#enablePaging$_accessor_storage; }
4649
- set enablePaging$(value) { this.#enablePaging$_accessor_storage = value; }
4650
- #enablePaging_accessor_storage = false;
4651
- get enablePaging() { return this.#enablePaging_accessor_storage; }
4652
- set enablePaging(value) { this.#enablePaging_accessor_storage = value; }
4653
- // enablePaging() {
4654
- // if (isNil(this.pageController)) {
4655
- // const pagedListModel = this.registerDisposable(PagedListModel.create(this._visibleRows$.getDelegate(), this._pageSize));
4656
- // this._visibleRows$.setDelegate(pagedListModel);
4657
- // this._pageController = pagedListModel.pageController;
4658
- // }
4659
- // }
5230
+ tableBody;
5231
+ #scrollMode$_accessor_storage = proxify((ValueModel));
5232
+ /**
5233
+ * Set to true to scroll mode to classic or virtual (default). Virtual scrolll performs better for large data sets but clamps the row height. Classic scroll
5234
+ * renders all rows but allows row heights to grow.
5235
+ */
5236
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
5237
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
5238
+ #scrollMode_accessor_storage;
5239
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
5240
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4660
5241
  _footerContentAdded = false;
4661
5242
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
4662
- _pageSize = new MutableValueModel();
4663
- pagedListModel;
5243
+ tableBodyScrollMode$;
4664
5244
  constructor(injector) {
4665
5245
  super(injector);
4666
- const { when } = Dsl.disposeWith(this);
4667
- this.onDispose(() => this.disposeOfPagedListModel());
4668
- when(this.enablePaging$).changes(enabled => this.configurePaging(enabled));
5246
+ const { chain, when } = Dsl.disposeWith(this);
5247
+ this.tableBodyScrollMode$ = chain(this.enableScrolling$).map(enable => {
5248
+ return enable ? (this.scrollMode$.value ?? "virtual") : 'none';
5249
+ }, { dependsOn: this.scrollMode$ });
4669
5250
  }
4670
5251
  ngOnInit() {
4671
5252
  super.ngOnInit();
5253
+ const { when } = Dsl.disposeWith(this);
4672
5254
  if (CanProxy.hasTarget(this.filterModel)) {
4673
5255
  this.registerDisposable(this.filterModel.bindToTable(this._dataSource$, this.getModel().textSearchPredicate$));
4674
5256
  this.highlightText$.setDelegate(this.filterModel.highlightText$);
@@ -4677,50 +5259,27 @@ class TableComponent extends AbstractTableComponent {
4677
5259
  else {
4678
5260
  this._filteredRows$.setDelegate(this._dataSource$);
4679
5261
  }
4680
- this.configurePaging(this.enablePaging$.value);
5262
+ this._visibleRows$.setDelegate(this._filteredRows$);
5263
+ // let users of the model know what the current visible and filtered rows are for selection models and what not
4681
5264
  this.tableModel.bindToTable(this._filteredRows$, this._visibleRows$);
5265
+ when.anyOf(...this.tableModel.viewStateDependencies).changes(() => this.cdr.markForCheck());
5266
+ this.viewStateDependsOn(this._filteredRows$, this.tableModel.visibleColumns$);
4682
5267
  }
4683
5268
  getModel() {
4684
5269
  return this.tableModel;
4685
5270
  }
4686
- get pageController() {
4687
- // TODO: need to support external page controllers if the paging occurs to our primary data source.
4688
- return this.pagedListModel.pageController;
4689
- }
4690
- configurePaging(enable) {
4691
- if (enable) {
4692
- if (!this.pagedListModel) {
4693
- this.pagedListModel = PagedListModel.create(this._filteredRows$, this._pageSize);
4694
- }
4695
- this._visibleRows$.setDelegate(this.pagedListModel);
4696
- }
4697
- else {
4698
- this.disposeOfPagedListModel();
4699
- this._visibleRows$.setDelegate(this._filteredRows$);
4700
- }
4701
- }
4702
- disposeOfPagedListModel() {
4703
- if (this.pagedListModel) {
4704
- this.pagedListModel.dispose();
4705
- this.pagedListModel = null;
4706
- }
4707
- }
4708
5271
  footerContentChanged($event) {
4709
5272
  // console.log($event);
4710
5273
  this._footerContentAdded = true;
4711
5274
  }
4712
- //@Trace()
4713
- updatePageSize(count) {
4714
- this._pageSize.value = count;
4715
- }
4716
5275
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
4717
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableComponent, selector: "aup-table", inputs: { tableModel: "tableModel", filterModel: "filterModel", enablePaging$: "enablePaging$", enablePaging: "enablePaging" }, providers: [
5276
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableComponent, selector: "aup-table", inputs: { tableModel: "tableModel", filterModel: "filterModel", scrollMode$: "scrollMode$", scrollMode: "scrollMode" }, providers: [
4718
5277
  { provide: AbstractTableComponent, useExisting: TableComponent }
4719
- ], usesInheritance: true, ngImport: i0, template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"tableModel\"\n [showHeader$]=\"showHeader$\"\n [enableScrolling]=\"enableScrolling\"\n [trackBy]=\"trackBy\"\n (visibleRowCount)=\"updatePageSize($event)\"\n [aupHighlightTextModel]=\"highlightText$\"\n></aup-table-body>\n<section class=\"table-footer\">\n <div class=\"footer-content\"><ng-content select=\"[footer]\"></ng-content></div>\n <aup-paginator *ngIf=\"enablePaging$.value\" [pageController]=\"pageController\"></aup-paginator>\n</section>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}aup-table-body{flex:1}.table-footer{display:flex;flex-direction:row;align-items:center}.table-footer .footer-content{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: HighlightTextModelDirective, selector: "[aupHighlightTextModel]", inputs: ["aupHighlightTextModel"] }, { kind: "component", type: PaginatorComponent, selector: "aup-paginator", inputs: ["pageController"] }, { kind: "component", type: TableBodyComponent, selector: "aup-table-body", inputs: ["data$", "tableModel", "showHeader$", "showHeader", "trackBy", "enableScrolling"], outputs: ["visibleRowCount"] }] });
5278
+ ], viewQueries: [{ propertyName: "tableBody", first: true, predicate: TableBodyComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"$any(tableModel)\"\n [footerRow]=\"tableModel.footerRowModel\"\n [showHeader$]=\"$any(showHeader$)\"\n [scrollMode$]=\"tableBodyScrollMode$\"\n [trackBy]=\"trackBy\"\n [aupHighlightTextModel]=\"highlightText$\"\n></aup-table-body>\n<section class=\"table-footer\">\n <div class=\"footer-content\"><ng-content select=\"[footer], [slot=footer]\"></ng-content></div>\n</section>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}aup-table-body{flex:1}.table-footer{display:flex;flex-direction:row;align-items:center}.table-footer .footer-content{flex:1}\n"], dependencies: [{ kind: "directive", type: HighlightTextModelDirective, selector: "[aupHighlightTextModel]", inputs: ["aupHighlightTextModel"] }, { kind: "component", type: TableBodyComponent, selector: "aup-table-body", inputs: ["data$", "tableModel", "footerRow", "showHeader$", "showHeader", "trackBy", "scrollMode$", "scrollMode"] }] });
4720
5279
  }
4721
5280
  __decorate([
4722
5281
  Proxify(),
4723
- __metadata("design:type", Object)
5282
+ __metadata("design:type", TableModel)
4724
5283
  ], TableComponent.prototype, "tableModel", null);
4725
5284
  __decorate([
4726
5285
  Proxify(),
@@ -4728,24 +5287,27 @@ __decorate([
4728
5287
  ], TableComponent.prototype, "filterModel", null);
4729
5288
  __decorate([
4730
5289
  Proxify(),
4731
- __metadata("design:type", Object)
4732
- ], TableComponent.prototype, "enablePaging$", null);
5290
+ __metadata("design:type", ValueModel)
5291
+ ], TableComponent.prototype, "scrollMode$", null);
4733
5292
  __decorate([
4734
5293
  StoreInValueModel(),
4735
5294
  __metadata("design:type", Object)
4736
- ], TableComponent.prototype, "enablePaging", null);
5295
+ ], TableComponent.prototype, "scrollMode", null);
4737
5296
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableComponent, decorators: [{
4738
5297
  type: Component,
4739
5298
  args: [{ selector: 'aup-table', providers: [
4740
5299
  { provide: AbstractTableComponent, useExisting: TableComponent }
4741
- ], template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"tableModel\"\n [showHeader$]=\"showHeader$\"\n [enableScrolling]=\"enableScrolling\"\n [trackBy]=\"trackBy\"\n (visibleRowCount)=\"updatePageSize($event)\"\n [aupHighlightTextModel]=\"highlightText$\"\n></aup-table-body>\n<section class=\"table-footer\">\n <div class=\"footer-content\"><ng-content select=\"[footer]\"></ng-content></div>\n <aup-paginator *ngIf=\"enablePaging$.value\" [pageController]=\"pageController\"></aup-paginator>\n</section>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}aup-table-body{flex:1}.table-footer{display:flex;flex-direction:row;align-items:center}.table-footer .footer-content{flex:1}\n"] }]
5300
+ ], template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"$any(tableModel)\"\n [footerRow]=\"tableModel.footerRowModel\"\n [showHeader$]=\"$any(showHeader$)\"\n [scrollMode$]=\"tableBodyScrollMode$\"\n [trackBy]=\"trackBy\"\n [aupHighlightTextModel]=\"highlightText$\"\n></aup-table-body>\n<section class=\"table-footer\">\n <div class=\"footer-content\"><ng-content select=\"[footer], [slot=footer]\"></ng-content></div>\n</section>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}aup-table-body{flex:1}.table-footer{display:flex;flex-direction:row;align-items:center}.table-footer .footer-content{flex:1}\n"] }]
4742
5301
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { tableModel: [{
4743
5302
  type: Input
4744
5303
  }], filterModel: [{
4745
5304
  type: Input
4746
- }], enablePaging$: [{
5305
+ }], tableBody: [{
5306
+ type: ViewChild,
5307
+ args: [TableBodyComponent]
5308
+ }], scrollMode$: [{
4747
5309
  type: Input
4748
- }], enablePaging: [{
5310
+ }], scrollMode: [{
4749
5311
  type: Input
4750
5312
  }] } });
4751
5313
 
@@ -4927,7 +5489,7 @@ var DecoratedTreeNode;
4927
5489
  }
4928
5490
  }
4929
5491
  __decorate([
4930
- Memoize(),
5492
+ MemoizeGet(),
4931
5493
  __metadata("design:type", Array),
4932
5494
  __metadata("design:paramtypes", [])
4933
5495
  ], Decorator.prototype, "children", null);
@@ -4980,7 +5542,7 @@ var DecoratedTreeNode;
4980
5542
  __metadata("design:returntype", Array)
4981
5543
  ], Decorator.prototype, "ancestors", null);
4982
5544
  __decorate([
4983
- Memoize(),
5545
+ MemoizeGet(),
4984
5546
  __metadata("design:type", Number),
4985
5547
  __metadata("design:paramtypes", [])
4986
5548
  ], Decorator.prototype, "depth", null);
@@ -4991,8 +5553,8 @@ class TreeLabelColumnModel extends ColumnModel {
4991
5553
  expansionModel;
4992
5554
  labelFactory = () => undefined;
4993
5555
  iconFactory;
4994
- constructor(columnId, textPropertiesProvider, expansionModel) {
4995
- super(columnId, textPropertiesProvider);
5556
+ constructor(columnId, order, textPropertiesProvider, expansionModel) {
5557
+ super(columnId, order, textPropertiesProvider);
4996
5558
  this.expansionModel = expansionModel;
4997
5559
  this.cellRenderer(TreeLabelCellRendererComponent);
4998
5560
  }
@@ -5051,7 +5613,7 @@ class TreeTableModel extends AbstractTableModel {
5051
5613
  get isExpandedPredicate$() {
5052
5614
  return this._isExpandedPredicate$.readonly$;
5053
5615
  }
5054
- bindToTable(expansionModel, filteredRows$, visibleRows$) {
5616
+ bindToTable(expansionModel, filteredRows$, visibleRows$, cdr) {
5055
5617
  this.treeExpansionModel = expansionModel;
5056
5618
  // TODO: Move all the expansion model stuff out of here and have things use the expansion model directly
5057
5619
  this._isExpandedPredicate$.setDelegate(this.treeExpansionModel.isExpandedPredicate$);
@@ -5060,7 +5622,7 @@ class TreeTableModel extends AbstractTableModel {
5060
5622
  }
5061
5623
  treeControlColumn(builder) {
5062
5624
  const columnId = 'tree-label';
5063
- const column = new TreeLabelColumnModel(columnId, () => this.getColumnTextProperties(columnId), this);
5625
+ const column = new TreeLabelColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this);
5064
5626
  builder(column);
5065
5627
  this.addColumn(column);
5066
5628
  }
@@ -5079,9 +5641,6 @@ class TreeTableModel extends AbstractTableModel {
5079
5641
  isExpanded(row) {
5080
5642
  return this.treeExpansionModel.isExpanded(row);
5081
5643
  }
5082
- addSelectionColumn(selectionModel, showSelectionColumn) {
5083
- return this._addSelectionColumn(selectionModel, showSelectionColumn);
5084
- }
5085
5644
  }
5086
5645
  // export class FlattenStrategy<T extends VisitableTree<any>> extends SelfAndDescendantsVisitor<T> {
5087
5646
  //
@@ -5386,11 +5945,15 @@ class TreeTableComponent extends AbstractTableComponent {
5386
5945
  #expansionModel_accessor_storage = proxify((TreeExpansionModel));
5387
5946
  get expansionModel() { return this.#expansionModel_accessor_storage; }
5388
5947
  set expansionModel(value) { this.#expansionModel_accessor_storage = value; }
5948
+ scrollMode$;
5389
5949
  constructor(injector) {
5390
5950
  super(injector);
5951
+ const { chain } = Dsl.disposeWith(this);
5952
+ this.scrollMode$ = chain(this.enableScrolling$).map(enabled => enabled ? "classic" : "none");
5391
5953
  }
5392
5954
  ngOnInit() {
5393
5955
  super.ngOnInit();
5956
+ const { when } = Dsl.disposeWith(this);
5394
5957
  // TODO: clean up all this tightly coupled shit, should the expansion model really be separate from the tree model?
5395
5958
  if (!this.expansionModel) {
5396
5959
  this.expansionModel = new TreeExpansionModel({ disposedWith: this });
@@ -5399,7 +5962,10 @@ class TreeTableComponent extends AbstractTableComponent {
5399
5962
  const visibleRows$ = new FlattenedTreeListModel(this._dataSource$, row => this.treeTableModel.childExtractor(row), this.expansionModel);
5400
5963
  this._visibleRows$.setDelegate(visibleRows$);
5401
5964
  this.expansionModel.bindToTable(this._dataSource$, visibleRows$);
5402
- this.treeTableModel.bindToTable(this.expansionModel, visibleRows$, this._visibleRows$);
5965
+ this.treeTableModel.bindToTable(this.expansionModel, visibleRows$, this._visibleRows$, this.cdr);
5966
+ this.viewStateDependsOn(this.treeTableModel.visibleRows$);
5967
+ this.viewStateDependsOn(this.treeTableModel.visibleRows$);
5968
+ when.anyOf(...this.treeTableModel.viewStateDependencies).changes(() => this.cdr.markForCheck());
5403
5969
  }
5404
5970
  getModel() {
5405
5971
  return this.treeTableModel;
@@ -5407,7 +5973,7 @@ class TreeTableComponent extends AbstractTableComponent {
5407
5973
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TreeTableComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
5408
5974
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TreeTableComponent, selector: "aup-tree-table", inputs: { treeTableModel: "treeTableModel", expansionModel: "expansionModel" }, providers: [
5409
5975
  { provide: AbstractTableComponent, useExisting: TreeTableComponent }
5410
- ], usesInheritance: true, ngImport: i0, template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"treeTableModel\"\n [showHeader$]=\"showHeader$\"\n [enableScrolling]=\"enableScrolling\"\n [aupHighlightTextModel]=\"highlightText$\"\n [trackBy]=\"trackBy\"\n></aup-table-body>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host::ng-deep td.mat-mdc-cell{border-top-width:0!important;border-bottom-width:0!important}:host::ng-deep td.mat-column-tree-label{width:1px}:host::ng-deep aup-table-cell-renderer[column-id=tree-label]{padding-left:8px!important}:host::ng-deep aup-tree-label-cell-renderer{flex:1}aup-table-body{flex:1}\n"], dependencies: [{ kind: "directive", type: HighlightTextModelDirective, selector: "[aupHighlightTextModel]", inputs: ["aupHighlightTextModel"] }, { kind: "component", type: TableBodyComponent, selector: "aup-table-body", inputs: ["data$", "tableModel", "showHeader$", "showHeader", "trackBy", "enableScrolling"], outputs: ["visibleRowCount"] }] });
5976
+ ], usesInheritance: true, ngImport: i0, template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"treeTableModel\"\n [showHeader$]=\"showHeader$\"\n [scrollMode$]=\"scrollMode$\"\n [aupHighlightTextModel]=\"highlightText$\"\n [trackBy]=\"trackBy\"\n></aup-table-body>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host::ng-deep td.mat-mdc-cell{border-top-width:0!important;border-bottom-width:0!important}:host::ng-deep td.mat-column-tree-label{width:1px}:host::ng-deep aup-table-cell-renderer[column-id=tree-label]{padding-left:8px!important}:host::ng-deep aup-tree-label-cell-renderer{flex:1}aup-table-body{flex:1}\n"], dependencies: [{ kind: "directive", type: HighlightTextModelDirective, selector: "[aupHighlightTextModel]", inputs: ["aupHighlightTextModel"] }, { kind: "component", type: TableBodyComponent, selector: "aup-table-body", inputs: ["data$", "tableModel", "footerRow", "showHeader$", "showHeader", "trackBy", "scrollMode$", "scrollMode"] }] });
5411
5977
  }
5412
5978
  __decorate([
5413
5979
  Proxify(),
@@ -5421,7 +5987,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5421
5987
  type: Component,
5422
5988
  args: [{ selector: 'aup-tree-table', providers: [
5423
5989
  { provide: AbstractTableComponent, useExisting: TreeTableComponent }
5424
- ], template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"treeTableModel\"\n [showHeader$]=\"showHeader$\"\n [enableScrolling]=\"enableScrolling\"\n [aupHighlightTextModel]=\"highlightText$\"\n [trackBy]=\"trackBy\"\n></aup-table-body>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host::ng-deep td.mat-mdc-cell{border-top-width:0!important;border-bottom-width:0!important}:host::ng-deep td.mat-column-tree-label{width:1px}:host::ng-deep aup-table-cell-renderer[column-id=tree-label]{padding-left:8px!important}:host::ng-deep aup-tree-label-cell-renderer{flex:1}aup-table-body{flex:1}\n"] }]
5990
+ ], template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"treeTableModel\"\n [showHeader$]=\"showHeader$\"\n [scrollMode$]=\"scrollMode$\"\n [aupHighlightTextModel]=\"highlightText$\"\n [trackBy]=\"trackBy\"\n></aup-table-body>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host::ng-deep td.mat-mdc-cell{border-top-width:0!important;border-bottom-width:0!important}:host::ng-deep td.mat-column-tree-label{width:1px}:host::ng-deep aup-table-cell-renderer[column-id=tree-label]{padding-left:8px!important}:host::ng-deep aup-tree-label-cell-renderer{flex:1}aup-table-body{flex:1}\n"] }]
5425
5991
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { treeTableModel: [{
5426
5992
  type: Input
5427
5993
  }], expansionModel: [{
@@ -5603,6 +6169,7 @@ class ComponentsModule {
5603
6169
  FocusableComponent,
5604
6170
  CardContainerComponent,
5605
6171
  TableComponent,
6172
+ TableRowAttributesDirective,
5606
6173
  EditRowControlsComponent,
5607
6174
  ColumnTemplateDirective,
5608
6175
  DefaultCellRendererComponent,
@@ -5636,7 +6203,9 @@ class ComponentsModule {
5636
6203
  MarkdownComponent,
5637
6204
  TableBodyComponent,
5638
6205
  TableMoreMenuComponent,
5639
- TableMoreMenuPopupComponent], imports: [CommonModule,
6206
+ TableMoreMenuPopupComponent,
6207
+ SearchInputComponent,
6208
+ TableFooterRow], imports: [CommonModule,
5640
6209
  BrowserAnimationsModule,
5641
6210
  FormsModule,
5642
6211
  MatInputModule,
@@ -5655,7 +6224,10 @@ class ComponentsModule {
5655
6224
  MatMenuModule,
5656
6225
  MatDividerModule,
5657
6226
  MatProgressSpinnerModule,
5658
- MatProgressBarModule], exports: [NumberInputComponent,
6227
+ MatProgressBarModule,
6228
+ ScrollingModule,
6229
+ TableVirtualScrollModule], exports: [TableFooterRow,
6230
+ NumberInputComponent,
5659
6231
  StringInputComponent,
5660
6232
  TextInputComponent,
5661
6233
  PasswordInputComponent,
@@ -5693,7 +6265,8 @@ class ComponentsModule {
5693
6265
  LoadingContainerComponent,
5694
6266
  MarkdownComponent,
5695
6267
  TableMoreMenuComponent,
5696
- TableMoreMenuPopupComponent] });
6268
+ TableMoreMenuPopupComponent,
6269
+ SearchInputComponent] });
5697
6270
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, providers: [
5698
6271
  FocusBindingFactory,
5699
6272
  MarkdownService
@@ -5716,7 +6289,9 @@ class ComponentsModule {
5716
6289
  MatMenuModule,
5717
6290
  MatDividerModule,
5718
6291
  MatProgressSpinnerModule,
5719
- MatProgressBarModule] });
6292
+ MatProgressBarModule,
6293
+ ScrollingModule,
6294
+ TableVirtualScrollModule] });
5720
6295
  }
5721
6296
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, decorators: [{
5722
6297
  type: NgModule,
@@ -5741,7 +6316,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5741
6316
  MatMenuModule,
5742
6317
  MatDividerModule,
5743
6318
  MatProgressSpinnerModule,
5744
- MatProgressBarModule
6319
+ MatProgressBarModule,
6320
+ ScrollingModule,
6321
+ TableVirtualScrollModule
5745
6322
  ],
5746
6323
  declarations: [
5747
6324
  AbstractInputComponent,
@@ -5765,6 +6342,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5765
6342
  FocusableComponent,
5766
6343
  CardContainerComponent,
5767
6344
  TableComponent,
6345
+ TableRowAttributesDirective,
5768
6346
  EditRowControlsComponent,
5769
6347
  ColumnTemplateDirective,
5770
6348
  DefaultCellRendererComponent,
@@ -5799,8 +6377,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5799
6377
  TableBodyComponent,
5800
6378
  TableMoreMenuComponent,
5801
6379
  TableMoreMenuPopupComponent,
6380
+ SearchInputComponent,
6381
+ TableFooterRow
5802
6382
  ],
5803
6383
  exports: [
6384
+ TableFooterRow,
5804
6385
  NumberInputComponent,
5805
6386
  StringInputComponent,
5806
6387
  TextInputComponent,
@@ -5840,6 +6421,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5840
6421
  MarkdownComponent,
5841
6422
  TableMoreMenuComponent,
5842
6423
  TableMoreMenuPopupComponent,
6424
+ SearchInputComponent
5843
6425
  ],
5844
6426
  providers: [
5845
6427
  FocusBindingFactory,
@@ -5848,6 +6430,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5848
6430
  }]
5849
6431
  }] });
5850
6432
 
6433
+ class LoadableComponent extends DisposableComponent {
6434
+ #_loaded$ = new MutableValueModel();
6435
+ #asyncLoadables = [];
6436
+ #awaitedLoadables = [];
6437
+ get loaded$() {
6438
+ return this.#_loaded$.readonly$;
6439
+ }
6440
+ ngOnInit() {
6441
+ super.ngOnInit();
6442
+ this.#asyncLoadables.forEach(it => it.ensureLoaded());
6443
+ if (this.#awaitedLoadables.length > 0) {
6444
+ Promise.all(this.#awaitedLoadables.map(it => {
6445
+ return it.ensureLoaded(); //.then(() => console.log(`${it.constructor.name} loaded`));
6446
+ })).then(() => {
6447
+ this.#_loaded$.value = true;
6448
+ });
6449
+ }
6450
+ else {
6451
+ this.#_loaded$.value = true;
6452
+ }
6453
+ }
6454
+ injectLoadable(token, options) {
6455
+ return this.registerLoadable(inject(token, options), options);
6456
+ }
6457
+ registerLoadable(loadable, options) {
6458
+ if (this.loaded$.value) {
6459
+ loadable.ensureLoaded();
6460
+ }
6461
+ else {
6462
+ if (!options || options.wait === true) {
6463
+ this.#awaitedLoadables.push(loadable);
6464
+ }
6465
+ else {
6466
+ this.#asyncLoadables.push(loadable);
6467
+ }
6468
+ }
6469
+ return loadable;
6470
+ }
6471
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
6472
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: LoadableComponent, usesInheritance: true, ngImport: i0 });
6473
+ }
6474
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, decorators: [{
6475
+ type: Directive
6476
+ }] });
6477
+
6478
+ class TextSearchContext {
6479
+ row;
6480
+ searchText;
6481
+ searchRegex;
6482
+ constructor(row, searchText, searchRegex) {
6483
+ this.row = row;
6484
+ this.searchText = searchText;
6485
+ this.searchRegex = searchRegex;
6486
+ }
6487
+ getOrCreate(type, create) {
6488
+ }
6489
+ matchesText(text) {
6490
+ return this.searchRegex.test(text);
6491
+ }
6492
+ }
6493
+
6494
+ class AbstractCellRenderer extends LoadableComponent {
6495
+ constructor() {
6496
+ super();
6497
+ }
6498
+ }
6499
+
5851
6500
  /**
5852
6501
  * @file Automatically generated by barrelsby.
5853
6502
  */
@@ -5874,7 +6523,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5874
6523
  * </aup-activity-actions>
5875
6524
  */
5876
6525
  class ActivityActionsComponent extends DisposableComponent {
5877
- cdr;
5878
6526
  confirmCommandComponent;
5879
6527
  cancelCommandComponent;
5880
6528
  #confirmCommand_accessor_storage = proxify((Command));
@@ -5903,9 +6551,9 @@ class ActivityActionsComponent extends DisposableComponent {
5903
6551
  }
5904
6552
  layout = ActivityActionsComponent.Layout.BLOCK;
5905
6553
  align = ActivityActionsComponent.Align.STRETCH;
5906
- constructor(cdr) {
6554
+ alignContent = ActivityActionsComponent.AlignContent.CENTER;
6555
+ constructor() {
5907
6556
  super();
5908
- this.cdr = cdr;
5909
6557
  }
5910
6558
  hasConfirmFace() {
5911
6559
  return !!this.confirmFace;
@@ -5924,8 +6572,8 @@ class ActivityActionsComponent extends DisposableComponent {
5924
6572
  focusCancel() {
5925
6573
  this.cancelCommandComponent.requestFocus();
5926
6574
  }
5927
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
5928
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: { confirmCommand: "confirmCommand", cancelCommand: "cancelCommand", faces: "faces", confirmFace: "confirmFace", cancelFace: "cancelFace", style: "style", layout: "layout", align: "align" }, host: { properties: { "attr.layout": "this.layout", "attr.align": "this.align" } }, viewQueries: [{ propertyName: "confirmCommandComponent", first: true, predicate: ["confirmCommandComponent"], descendants: true }, { propertyName: "cancelCommandComponent", first: true, predicate: ["cancelCommandComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"content\">\n <ng-content></ng-content>\n</div>\n<ng-container *ngIf=\"hasConfirmFace()\">\n <aup-command #confirmCommandComponent class=\"confirm\" [command]=\"confirmCommand\" [face]=\"confirmFace\" data-cy=\"confirm-command\"></aup-command>\n</ng-container>\n<ng-container *ngIf=\"hasCancelFace()\">\n <aup-command #cancelCommandComponent class=\"cancel\" [command]=\"cancelCommand\" [face]=\"cancelFace\" data-cy=\"cancel-command\"></aup-command>\n</ng-container>\n", styles: [":host{display:grid;grid-template-rows:auto;align-items:center;justify-content:end;--resolved-activity-actions-gap: var(--activity-actions-gap, 8px)}:host[layout=block][align=start]{grid-template-areas:\"cancel confirm content\";grid-template-columns:auto auto 1fr}:host[layout=block][align=start] .confirm{margin-left:var(--resolved-activity-actions-gap)}:host[layout=block][align=end]{grid-template-areas:\"content cancel confirm\";grid-template-columns:1fr auto auto}:host[layout=block][align=end] .confirm{margin-left:var(--resolved-activity-actions-gap)}:host[layout=block][align=stretch]{grid-template-areas:\"cancel content confirm\";grid-template-columns:auto 1fr auto}:host[layout=inline]{grid-template-areas:\"confirm cancel content\";grid-template-columns:auto auto 1fr}:host[layout=inline] .cancel{margin-left:var(--resolved-activity-actions-gap)}.cancel{grid-area:cancel}.confirm{grid-area:confirm}.content{grid-area:content;text-align:left}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }] });
6575
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6576
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: { confirmCommand: "confirmCommand", cancelCommand: "cancelCommand", faces: "faces", confirmFace: "confirmFace", cancelFace: "cancelFace", style: "style", layout: "layout", align: "align", alignContent: "alignContent" }, host: { properties: { "attr.layout": "this.layout", "attr.align": "this.align", "attr.align-content": "this.alignContent" } }, viewQueries: [{ propertyName: "confirmCommandComponent", first: true, predicate: ["confirmCommandComponent"], descendants: true }, { propertyName: "cancelCommandComponent", first: true, predicate: ["cancelCommandComponent"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"content\">\n <ng-content></ng-content>\n</div>\n<ng-container *ngIf=\"hasCancelFace()\">\n <aup-command #cancelCommandComponent class=\"cancel\" [command]=\"cancelCommand\" [face]=\"cancelFace\" data-cy=\"cancel-command\"></aup-command>\n</ng-container>\n<ng-container *ngIf=\"hasConfirmFace()\">\n <aup-command #confirmCommandComponent class=\"confirm\" [command]=\"confirmCommand\" [face]=\"confirmFace\" data-cy=\"confirm-command\"></aup-command>\n</ng-container>\n", styles: [":host{display:grid;grid-template-rows:auto;align-items:center;justify-content:end;--resolved-activity-actions-gap: var(--activity-actions-gap, 8px);grid-gap:var(--resolved-activity-actions-gap)}:host[layout=block][align=start]{grid-template-areas:\"cancel confirm content\";grid-template-columns:auto auto 1fr}:host[layout=block][align=start] .confirm{margin-left:var(--resolved-activity-actions-gap)}:host[layout=block][align=end]{grid-template-areas:\"content cancel confirm\";grid-template-columns:1fr auto auto}:host[layout=block][align=end] .confirm{margin-left:var(--resolved-activity-actions-gap)}:host[layout=block][align=stretch]{grid-template-areas:\"cancel content confirm\";grid-template-columns:auto 1fr auto}:host[layout=inline]{grid-template-areas:\"confirm cancel content\";grid-template-columns:auto auto 1fr}:host[layout=inline] .cancel{margin-left:var(--resolved-activity-actions-gap)}:host .cancel{grid-area:cancel}:host .confirm{grid-area:confirm}:host .content{display:flex;flex-direction:row;align-items:center}:host[align-content=start] .content{justify-items:start}:host[align-content=end]{justify-items:end}:host[align-content=center]{justify-items:center}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }] });
5929
6577
  }
5930
6578
  __decorate([
5931
6579
  Proxify(),
@@ -5937,8 +6585,8 @@ __decorate([
5937
6585
  ], ActivityActionsComponent.prototype, "cancelCommand", null);
5938
6586
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, decorators: [{
5939
6587
  type: Component,
5940
- args: [{ selector: 'aup-activity-actions', template: "<div class=\"content\">\n <ng-content></ng-content>\n</div>\n<ng-container *ngIf=\"hasConfirmFace()\">\n <aup-command #confirmCommandComponent class=\"confirm\" [command]=\"confirmCommand\" [face]=\"confirmFace\" data-cy=\"confirm-command\"></aup-command>\n</ng-container>\n<ng-container *ngIf=\"hasCancelFace()\">\n <aup-command #cancelCommandComponent class=\"cancel\" [command]=\"cancelCommand\" [face]=\"cancelFace\" data-cy=\"cancel-command\"></aup-command>\n</ng-container>\n", styles: [":host{display:grid;grid-template-rows:auto;align-items:center;justify-content:end;--resolved-activity-actions-gap: var(--activity-actions-gap, 8px)}:host[layout=block][align=start]{grid-template-areas:\"cancel confirm content\";grid-template-columns:auto auto 1fr}:host[layout=block][align=start] .confirm{margin-left:var(--resolved-activity-actions-gap)}:host[layout=block][align=end]{grid-template-areas:\"content cancel confirm\";grid-template-columns:1fr auto auto}:host[layout=block][align=end] .confirm{margin-left:var(--resolved-activity-actions-gap)}:host[layout=block][align=stretch]{grid-template-areas:\"cancel content confirm\";grid-template-columns:auto 1fr auto}:host[layout=inline]{grid-template-areas:\"confirm cancel content\";grid-template-columns:auto auto 1fr}:host[layout=inline] .cancel{margin-left:var(--resolved-activity-actions-gap)}.cancel{grid-area:cancel}.confirm{grid-area:confirm}.content{grid-area:content;text-align:left}\n"] }]
5941
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { confirmCommandComponent: [{
6588
+ args: [{ selector: 'aup-activity-actions', template: "<div class=\"content\">\n <ng-content></ng-content>\n</div>\n<ng-container *ngIf=\"hasCancelFace()\">\n <aup-command #cancelCommandComponent class=\"cancel\" [command]=\"cancelCommand\" [face]=\"cancelFace\" data-cy=\"cancel-command\"></aup-command>\n</ng-container>\n<ng-container *ngIf=\"hasConfirmFace()\">\n <aup-command #confirmCommandComponent class=\"confirm\" [command]=\"confirmCommand\" [face]=\"confirmFace\" data-cy=\"confirm-command\"></aup-command>\n</ng-container>\n", styles: [":host{display:grid;grid-template-rows:auto;align-items:center;justify-content:end;--resolved-activity-actions-gap: var(--activity-actions-gap, 8px);grid-gap:var(--resolved-activity-actions-gap)}:host[layout=block][align=start]{grid-template-areas:\"cancel confirm content\";grid-template-columns:auto auto 1fr}:host[layout=block][align=start] .confirm{margin-left:var(--resolved-activity-actions-gap)}:host[layout=block][align=end]{grid-template-areas:\"content cancel confirm\";grid-template-columns:1fr auto auto}:host[layout=block][align=end] .confirm{margin-left:var(--resolved-activity-actions-gap)}:host[layout=block][align=stretch]{grid-template-areas:\"cancel content confirm\";grid-template-columns:auto 1fr auto}:host[layout=inline]{grid-template-areas:\"confirm cancel content\";grid-template-columns:auto auto 1fr}:host[layout=inline] .cancel{margin-left:var(--resolved-activity-actions-gap)}:host .cancel{grid-area:cancel}:host .confirm{grid-area:confirm}:host .content{display:flex;flex-direction:row;align-items:center}:host[align-content=start] .content{justify-items:start}:host[align-content=end]{justify-items:end}:host[align-content=center]{justify-items:center}\n"] }]
6589
+ }], ctorParameters: function () { return []; }, propDecorators: { confirmCommandComponent: [{
5942
6590
  type: ViewChild,
5943
6591
  args: ["confirmCommandComponent"]
5944
6592
  }], cancelCommandComponent: [{
@@ -5966,6 +6614,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5966
6614
  }, {
5967
6615
  type: HostBinding,
5968
6616
  args: ['attr.align']
6617
+ }], alignContent: [{
6618
+ type: Input
6619
+ }, {
6620
+ type: HostBinding,
6621
+ args: ['attr.align-content']
5969
6622
  }] } });
5970
6623
  (function (ActivityActionsComponent) {
5971
6624
  ActivityActionsComponent.Layout = Enum({
@@ -5974,14 +6627,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5974
6627
  });
5975
6628
  ActivityActionsComponent.Align = Enum({
5976
6629
  START: 'start',
5977
- END: 'end',
5978
- STRETCH: 'stretch'
6630
+ STRETCH: 'stretch',
6631
+ END: 'end'
6632
+ });
6633
+ ActivityActionsComponent.AlignContent = Enum({
6634
+ START: 'start',
6635
+ CENTER: 'center',
6636
+ END: 'end'
5979
6637
  });
5980
6638
  })(ActivityActionsComponent || (ActivityActionsComponent = {}));
5981
6639
 
6640
+ const INTERACTION_CONTEXT_PROVIDER = new InjectionToken("INTERACTION_CONTEXT_PROVIDER");
6641
+
5982
6642
  const ACTIVITY_DATA = new InjectionToken("InteractionActivityData");
5983
6643
  // eslint-disable-next-line @angular-eslint/component-class-suffix
5984
- class Activity extends DisposableComponent {
6644
+ class Activity extends LoadableComponent {
5985
6645
  activityData = inject(ACTIVITY_DATA);
5986
6646
  activityReadyListeners = new EventListenerList();
5987
6647
  _busy$ = this.registerDisposable(new DelegatingValueModel().withDefault(false));
@@ -6036,7 +6696,6 @@ class Activity extends DisposableComponent {
6036
6696
  notifyActivityReady() {
6037
6697
  this.activityReadyListeners.fire(l => l(this));
6038
6698
  this._ready$.value = true;
6039
- console.log("ready");
6040
6699
  }
6041
6700
  onActivityReady(callback) {
6042
6701
  return this.activityReadyListeners.add(callback);
@@ -6069,8 +6728,13 @@ class Activity extends DisposableComponent {
6069
6728
  isInitialised() {
6070
6729
  return !!this._activityContext;
6071
6730
  }
6731
+ getInteractionContext() {
6732
+ return this.interactionContext;
6733
+ }
6072
6734
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: Activity, deps: [], target: i0.ɵɵFactoryTarget.Component });
6073
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: Activity, selector: "ng-component", host: { properties: { "class": "this.class", "attr.focused": "this.isFocused" } }, viewQueries: [{ propertyName: "activityActions", first: true, predicate: ActivityActionsComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "", isInline: true });
6735
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: Activity, selector: "ng-component", host: { properties: { "class": "this.class", "attr.focused": "this.isFocused" } }, providers: [{
6736
+ provide: INTERACTION_CONTEXT_PROVIDER, useExisting: Activity
6737
+ }], viewQueries: [{ propertyName: "activityActions", first: true, predicate: ActivityActionsComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "", isInline: true });
6074
6738
  }
6075
6739
  __decorate([
6076
6740
  Proxify(),
@@ -6083,7 +6747,10 @@ __decorate([
6083
6747
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: Activity, decorators: [{
6084
6748
  type: Component,
6085
6749
  args: [{
6086
- template: ""
6750
+ template: "",
6751
+ providers: [{
6752
+ provide: INTERACTION_CONTEXT_PROVIDER, useExisting: Activity
6753
+ }],
6087
6754
  }]
6088
6755
  }], ctorParameters: function () { return []; }, propDecorators: { activityActions: [{
6089
6756
  type: ViewChild,
@@ -6156,7 +6823,7 @@ class AbstractDialogComponent extends Activity {
6156
6823
  }
6157
6824
  }
6158
6825
  isDestructive() {
6159
- return isFunction$1(this.config['destructive']) && this.config["destructive"]();
6826
+ return isFunction(this.config['destructive']) && this.config["destructive"]();
6160
6827
  }
6161
6828
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractDialogComponent, deps: [{ token: ALERT_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
6162
6829
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractDialogComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
@@ -6173,6 +6840,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6173
6840
 
6174
6841
  class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6175
6842
  cancelFace;
6843
+ confirmClass = "aup-confirm-activity";
6176
6844
  constructor(config) {
6177
6845
  super(config);
6178
6846
  this.cancelFace = {
@@ -6183,7 +6851,7 @@ class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6183
6851
  });
6184
6852
  }
6185
6853
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractConfirmDialogComponent, deps: [{ token: ALERT_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
6186
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractConfirmDialogComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
6854
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractConfirmDialogComponent, selector: "ng-component", host: { properties: { "class": "this.confirmClass" } }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
6187
6855
  }
6188
6856
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractConfirmDialogComponent, decorators: [{
6189
6857
  type: Component,
@@ -6193,7 +6861,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6193
6861
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
6194
6862
  type: Inject,
6195
6863
  args: [ALERT_CONFIG]
6196
- }] }]; } });
6864
+ }] }]; }, propDecorators: { confirmClass: [{
6865
+ type: HostBinding,
6866
+ args: ["class"]
6867
+ }] } });
6197
6868
 
6198
6869
  class ActivityBodyComponent extends DisposableComponent {
6199
6870
  fullWidth = false;
@@ -6523,6 +7194,7 @@ class PlaceDefinition {
6523
7194
  children;
6524
7195
  redirectToFirstChild;
6525
7196
  _parent;
7197
+ name;
6526
7198
  constructor(component, path, authenticate, role, data, routeParameters, children, redirectToFirstChild) {
6527
7199
  this.component = component;
6528
7200
  this.path = path;
@@ -6532,6 +7204,8 @@ class PlaceDefinition {
6532
7204
  this.routeParameters = routeParameters;
6533
7205
  this.children = children;
6534
7206
  this.redirectToFirstChild = redirectToFirstChild;
7207
+ const s = component.name.replace(/Component$/, '');
7208
+ this.name = s.charAt(0).toLowerCase() + s.slice(1);
6535
7209
  this.children.forEach(it => it.setParent(this));
6536
7210
  }
6537
7211
  ancestors() {
@@ -6540,6 +7214,9 @@ class PlaceDefinition {
6540
7214
  ancestorsAndSelf() {
6541
7215
  return this.ancestors().concat(this);
6542
7216
  }
7217
+ get placeId() {
7218
+ return this.ancestorsAndSelf().map(d => Stringy.from(d.name).dasherize().toString()).join('.');
7219
+ }
6543
7220
  setParent(parent) {
6544
7221
  assert.isNil(this._parent);
6545
7222
  this._parent = parent;
@@ -6701,6 +7378,11 @@ __decorate([
6701
7378
  __metadata("design:paramtypes", []),
6702
7379
  __metadata("design:returntype", Array)
6703
7380
  ], PlaceDefinition.prototype, "ancestorsAndSelf", null);
7381
+ __decorate([
7382
+ Memoize(),
7383
+ __metadata("design:type", String),
7384
+ __metadata("design:paramtypes", [])
7385
+ ], PlaceDefinition.prototype, "placeId", null);
6704
7386
  __decorate([
6705
7387
  Memoize(),
6706
7388
  __metadata("design:type", Function),
@@ -6732,31 +7414,38 @@ const ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');
6732
7414
  // return true;
6733
7415
  // }
6734
7416
  // }
6735
- class PlaceComponent extends DisposableComponent {
7417
+ class PlaceComponent extends LoadableComponent {
6736
7418
  _placeReadyCallbacks = [];
6737
- visitModel = new MutableValueModel();
7419
+ visit$ = new MutableValueModel();
6738
7420
  _inVisitUpdate = new Guard();
6739
7421
  _active = new MutableValueModel(false);
6740
7422
  interactionContext;
6741
7423
  childPlaces$;
7424
+ // private readonly _parameterChangeInterceptors: ParameterChangeInterceptor<any>[] = [];
7425
+ placeId;
6742
7426
  placeRouter = inject(PlaceRouter);
7427
+ activatedRoute = inject(ActivatedRoute);
6743
7428
  constructor() {
6744
7429
  super();
6745
7430
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
6746
7431
  when(this._active).becomesTruthy(() => this._notifyPlaceReady());
6747
7432
  this.childPlaces$ = ListModel.constant(this.placeDefinition.children.map(d => d.component));
7433
+ this.placeId = this.placeDefinition.placeId;
7434
+ if (isEmpty(this.placeId)) {
7435
+ lang.illegalState("placeId property is missing from the route data parameters");
7436
+ }
6748
7437
  }
6749
7438
  initialiseVisit(visit, notifyVisitChanged) {
6750
- assert.isNil(this.visitModel.value);
7439
+ assert.isNil(this.visit$.value);
6751
7440
  const { when } = Dsl.disposeWith(this);
6752
- this.visitModel.value = visit;
6753
- DebugContext.getOrCreate(this.visitModel).tag(`${this.placeDefinition.component.name}.visitModel`);
7441
+ this.visit$.value = visit;
7442
+ DebugContext.getOrCreate(this.visit$).tag(`${this.placeDefinition.component.name}.visit$`);
6754
7443
  // we track if the any of the bindings updated the route. If so we remember it and update the
6755
7444
  // route in one go at the end.
6756
7445
  this.placeDefinition
6757
7446
  .getVisitParameterDefs()
6758
7447
  .forEach(parameterDef => this.installAndInitialiseBinding(visit, parameterDef));
6759
- when(this.visitModel).changes((current, previous) => {
7448
+ when(this.visit$).changes((current, previous) => {
6760
7449
  notifyVisitChanged(current, previous);
6761
7450
  }, { unless: this._inVisitUpdate });
6762
7451
  // TODO: this needs to do a replace url option so that the new url isn't put in the history.... for
@@ -6775,11 +7464,11 @@ class PlaceComponent extends DisposableComponent {
6775
7464
  assert.isTruthy(this.isInitialised());
6776
7465
  assert.notNil(visit);
6777
7466
  this._inVisitUpdate.whileTrue(() => {
6778
- this.visitModel.value = visit;
7467
+ this.visit$.value = visit;
6779
7468
  });
6780
7469
  }
6781
7470
  isInitialised() {
6782
- return !!this.visitModel.value;
7471
+ return !!this.visit$.value;
6783
7472
  }
6784
7473
  // @Trace()
6785
7474
  /**
@@ -6789,8 +7478,9 @@ class PlaceComponent extends DisposableComponent {
6789
7478
  */
6790
7479
  installAndInitialiseBinding(initialVisit, parameterDef) {
6791
7480
  const model = this[parameterDef.propertyName];
7481
+ assert.notNil(model);
6792
7482
  DebugContext.tag(model, `${this.placeDefinition.component.name}.${parameterDef.propertyName}`);
6793
- const binding = this.registerDisposable(new Binding(this.visitModel, model, {
7483
+ const binding = this.registerDisposable(new Binding(this.visit$, model, {
6794
7484
  toRight(visit) {
6795
7485
  const value = visit.getParameterValue(parameterDef);
6796
7486
  // console.log('push to component', { name: parameterDef.name, value, visit });
@@ -6870,16 +7560,19 @@ class PlaceComponent extends DisposableComponent {
6870
7560
  this._placeReadyCallbacks.push(callback);
6871
7561
  }
6872
7562
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
6873
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: PlaceComponent, usesInheritance: true, ngImport: i0 });
7563
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: PlaceComponent, host: { properties: { "attr.place-id": "this.placeId" } }, usesInheritance: true, ngImport: i0 });
6874
7564
  }
6875
7565
  __decorate([
6876
- Memoize(),
7566
+ MemoizeGet(),
6877
7567
  __metadata("design:type", PlaceDefinition),
6878
7568
  __metadata("design:paramtypes", [])
6879
7569
  ], PlaceComponent.prototype, "placeDefinition", null);
6880
7570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceComponent, decorators: [{
6881
7571
  type: Directive
6882
- }], ctorParameters: function () { return []; }, propDecorators: { placeDefinition: [] } });
7572
+ }], ctorParameters: function () { return []; }, propDecorators: { placeId: [{
7573
+ type: HostBinding,
7574
+ args: ["attr.place-id"]
7575
+ }], placeDefinition: [] } });
6883
7576
  (function (PlaceComponent) {
6884
7577
  function isPlaceComponentConstructor(target) {
6885
7578
  return lang.constructorChain(target).includes(PlaceComponent);
@@ -7063,7 +7756,7 @@ class Visit {
7063
7756
  getRouterCommands() {
7064
7757
  return this.segments.reduce((result, v) => {
7065
7758
  const path = v.placeDefinition.path;
7066
- return isEmpty$1(path) ?
7759
+ return isEmpty(path) ?
7067
7760
  [...result, path] : // Angular doesn't support route params on empty path segments
7068
7761
  [...result, path, ...v.createRouterCommands()];
7069
7762
  }, []);
@@ -7079,7 +7772,7 @@ class Visit {
7079
7772
  }
7080
7773
  }
7081
7774
  __decorate([
7082
- Memoize$1(),
7775
+ Memoize(),
7083
7776
  __metadata("design:type", Function),
7084
7777
  __metadata("design:paramtypes", [PlaceDefinition]),
7085
7778
  __metadata("design:returntype", VisitSegment)
@@ -7460,10 +8153,7 @@ class SynchroniseInteractionContextIdsWithRoute extends NavigationSession {
7460
8153
  return true;
7461
8154
  }
7462
8155
  notifyActive() {
7463
- // TODO: Do I still need this??
7464
- setTimeout(() => {
7465
- this.syncInteractionIdsWithRouter();
7466
- });
8156
+ this.syncInteractionIdsWithRouter();
7467
8157
  }
7468
8158
  // @Trace()
7469
8159
  onRouterEnd(event) {
@@ -8002,12 +8692,12 @@ class PlaceAuthService extends GarbageCollector {
8002
8692
  await toPromise(this, this._authZReady$);
8003
8693
  await this.enabledPlaceChecker.waitUntilReady(placeDef);
8004
8694
  }
8005
- getAuthenticationFailureRedirect(activatedRoute, state) {
8006
- const redirect = this.authNOptions.redirectTo(activatedRoute, state);
8695
+ async getAuthenticationFailureRedirect(activatedRoute, state) {
8696
+ const redirect = await this.authNOptions.redirectTo(activatedRoute, state);
8007
8697
  return redirect instanceof Visit ? redirect : Visit.goto(redirect);
8008
8698
  }
8009
- getAuthorisationFailureRedirectOptions(component) {
8010
- return this.authZOptions.redirectTo(component).map(it => it instanceof Visit ? it : Visit.goto(it));
8699
+ async getAuthorisationFailureRedirectOptions(component) {
8700
+ return (await this.authZOptions.redirectTo(component)).map(it => it instanceof Visit ? it : Visit.goto(it));
8011
8701
  }
8012
8702
  isAuthenticated() {
8013
8703
  return this.accessGuard$.value.isAuthenticated();
@@ -8206,7 +8896,7 @@ class ConsolidatedParameterMap {
8206
8896
  }
8207
8897
  }
8208
8898
  __decorate([
8209
- Memoize(),
8899
+ MemoizeGet(),
8210
8900
  __metadata("design:type", Array),
8211
8901
  __metadata("design:paramtypes", [])
8212
8902
  ], ConsolidatedParameterMap.prototype, "keys", null);
@@ -8284,7 +8974,7 @@ class UrlSnapshot {
8284
8974
  return this.getPrimaryUrlSegments().find(s => s.path === placeDef.path);
8285
8975
  }
8286
8976
  isLastPlaceInUrl(placeDef) {
8287
- return last$1(this.getPrimaryUrlSegments()).path === placeDef.path;
8977
+ return last(this.getPrimaryUrlSegments()).path === placeDef.path;
8288
8978
  }
8289
8979
  createVisitSegmentFor(placeDef) {
8290
8980
  return new VisitSegment(placeDef, new ConsolidatedParameterMap(this.getPrimaryUrlSegments()));
@@ -8400,7 +9090,7 @@ class UrlService {
8400
9090
  back() {
8401
9091
  this.angularLocation.back();
8402
9092
  }
8403
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, deps: [{ token: i1$4.Router }, { token: i1$1.Location }, { token: i1$4.UrlSerializer }], target: i0.ɵɵFactoryTarget.Injectable });
9093
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, deps: [{ token: i1$5.Router }, { token: i1$1.Location }, { token: i1$5.UrlSerializer }], target: i0.ɵɵFactoryTarget.Injectable });
8404
9094
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, providedIn: 'root' });
8405
9095
  }
8406
9096
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, decorators: [{
@@ -8408,7 +9098,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8408
9098
  args: [{
8409
9099
  providedIn: 'root'
8410
9100
  }]
8411
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: i1$4.UrlSerializer }]; } });
9101
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: i1$5.UrlSerializer }]; } });
8412
9102
 
8413
9103
  // function asArray<T>(item: T | T[]): T[] {
8414
9104
  // return Array.isArray(item) ? item : [item];
@@ -8428,6 +9118,8 @@ class PlaceRouter extends GarbageCollector {
8428
9118
  routerInteractionAdapter;
8429
9119
  sessionFinishedJobs = [];
8430
9120
  authService = new PlaceAuthService();
9121
+ _ready$ = this.registerDisposable(new DelegatingValueModel().withDefault(true));
9122
+ ready$ = this._ready$.readonly$;
8431
9123
  constructor(angularRouter, angularLocation, interactionService, urlService, placeHistory) {
8432
9124
  super();
8433
9125
  this.angularRouter = angularRouter;
@@ -8449,7 +9141,7 @@ class PlaceRouter extends GarbageCollector {
8449
9141
  });
8450
9142
  const { chain } = Dsl.disposeWith(this);
8451
9143
  this.navigationInProgress$ = chain(this.navigationSession$).isNotNil();
8452
- this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync");
9144
+ this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync").otherwise(false);
8453
9145
  const idleStateName = chain(this.interactionService.active).map(active => active ? "IdleDuringInteraction" : "Idle");
8454
9146
  this.navigationSessionName$ = chain(this.navigationSession$)
8455
9147
  .pluck("name")
@@ -8493,10 +9185,13 @@ class PlaceRouter extends GarbageCollector {
8493
9185
  // the back button was clicked.
8494
9186
  angularLocation.onUrlChange(url => this.onUrlChanged(url));
8495
9187
  }
8496
- getAuthenticationFailureRedirect(activatedRoute, state) {
9188
+ postponeRoutingUntil(condition$) {
9189
+ this._ready$.setDelegate(condition$);
9190
+ }
9191
+ async getAuthenticationFailureRedirect(activatedRoute, state) {
8497
9192
  return this.authService.getAuthenticationFailureRedirect(activatedRoute, state);
8498
9193
  }
8499
- getAuthorisationFailureRedirectOptions(component) {
9194
+ async getAuthorisationFailureRedirectOptions(component) {
8500
9195
  return this.authService.getAuthorisationFailureRedirectOptions(component);
8501
9196
  }
8502
9197
  get navigationSession() {
@@ -8508,23 +9203,20 @@ class PlaceRouter extends GarbageCollector {
8508
9203
  isNavigating() {
8509
9204
  return this.navigationInProgress$.value;
8510
9205
  }
8511
- waitUntilIdle() {
8512
- const { when } = Dsl.disposeWith(this);
8513
- return new Promise(resolve => {
8514
- when(this.navigationInProgress$).becomesFalsey(() => resolve(this), {
8515
- initialValue: "evaluate",
8516
- once: true
8517
- });
8518
- });
9206
+ async waitUntilRouterReady() {
9207
+ const { waitUntil } = Dsl.disposeWith(this);
9208
+ await waitUntil(this.ready$).becomesTruthy();
9209
+ return this;
9210
+ }
9211
+ async waitUntilIdle() {
9212
+ const { waitUntil } = Dsl.disposeWith(this);
9213
+ await waitUntil(this.navigationInProgress$).becomesFalsey();
9214
+ return this;
8519
9215
  }
8520
9216
  async waitActivitiesSynchronised() {
8521
- const { when } = Dsl.disposeWith(this);
8522
- return new Promise(resolve => {
8523
- when(this.interactionSyncInProgress$).becomesFalsey(() => resolve(this), {
8524
- initialValue: "evaluate",
8525
- once: true
8526
- });
8527
- });
9217
+ const { waitUntil } = Dsl.disposeWith(this);
9218
+ await waitUntil(this.interactionSyncInProgress$).becomesFalsey();
9219
+ return this;
8528
9220
  }
8529
9221
  // @Trace()
8530
9222
  onPopState(event) {
@@ -8710,7 +9402,7 @@ class PlaceRouter extends GarbageCollector {
8710
9402
  return Visit.goto(visitOrPlaceComponent, params);
8711
9403
  }
8712
9404
  }
8713
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, deps: [{ token: i1$4.Router }, { token: i1$1.Location }, { token: InteractionService }, { token: UrlService }, { token: PlaceHistory }], target: i0.ɵɵFactoryTarget.Injectable });
9405
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, deps: [{ token: i1$5.Router }, { token: i1$1.Location }, { token: InteractionService }, { token: UrlService }, { token: PlaceHistory }], target: i0.ɵɵFactoryTarget.Injectable });
8714
9406
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, providedIn: "root" });
8715
9407
  }
8716
9408
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, decorators: [{
@@ -8718,7 +9410,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8718
9410
  args: [{
8719
9411
  providedIn: "root"
8720
9412
  }]
8721
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
9413
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
8722
9414
 
8723
9415
  class ActivityTitleComponent extends DisposableComponent {
8724
9416
  _color;
@@ -8740,11 +9432,11 @@ class ActivityTitleComponent extends DisposableComponent {
8740
9432
  return this._color;
8741
9433
  }
8742
9434
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityTitleComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
8743
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: { hasTransparentBackground: "hasTransparentBackground", color: "color" }, host: { properties: { "class.transparent-background": "this.hasTransparentBackground", "attr.color": "this.color" } }, usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{display:block}\n"] });
9435
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: { hasTransparentBackground: "hasTransparentBackground", color: "color" }, host: { properties: { "class.transparent-background": "this.hasTransparentBackground", "attr.color": "this.color" } }, usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\n<span style=\"flex:1\"></span>\n<ng-content select=\"[slot='title-end']\"></ng-content>\n", styles: [":host{display:flex;flex-direction:row;align-items:center}\n"] });
8744
9436
  }
8745
9437
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityTitleComponent, decorators: [{
8746
9438
  type: Component,
8747
- args: [{ selector: 'aup-activity-title', template: "<ng-content></ng-content>\n", styles: [":host{display:block}\n"] }]
9439
+ args: [{ selector: 'aup-activity-title', template: "<ng-content></ng-content>\n<span style=\"flex:1\"></span>\n<ng-content select=\"[slot='title-end']\"></ng-content>\n", styles: [":host{display:flex;flex-direction:row;align-items:center}\n"] }]
8748
9440
  }], propDecorators: { hasTransparentBackground: [{
8749
9441
  type: Input
8750
9442
  }, {
@@ -8765,7 +9457,7 @@ class AlertDialogComponent extends AbstractDialogComponent {
8765
9457
  });
8766
9458
  }
8767
9459
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AlertDialogComponent, deps: [{ token: ACTIVITY_DATA }], target: i0.ɵɵFactoryTarget.Component });
8768
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AlertDialogComponent, selector: "aup-alert-dialog", usesInheritance: true, ngImport: i0, template: "<aup-activity-title *ngIf=\"title\" [color]=\"color\"><aup-markdown [content]=\"title\" [inline]=\"true\"></aup-markdown></aup-activity-title>\n<aup-activity-body>\n <aup-markdown *ngFor=\"let line of content\" [content]=\"line\"></aup-markdown>\n</aup-activity-body>\n<aup-activity-actions [confirmFace]=\"confirmFace\"></aup-activity-actions>\n", styles: [":host{display:block}.mat-mdc-dialog-content{margin:0;padding:0}.mat-mdc-dialog-actions{margin-bottom:0!important;padding:0;align-items:flex-end;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MarkdownComponent, selector: "aup-markdown, [aupMarkdown]", inputs: ["content$", "content", "inline"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align"] }, { kind: "component", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: ["hasTransparentBackground", "color"] }, { kind: "component", type: ActivityBodyComponent, selector: "aup-activity-body", inputs: ["fullWidth"] }] });
9460
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AlertDialogComponent, selector: "aup-alert-dialog", usesInheritance: true, ngImport: i0, template: "<aup-activity-title *ngIf=\"title\" [color]=\"color\"><aup-markdown [content]=\"title\" [inline]=\"true\"></aup-markdown></aup-activity-title>\n<aup-activity-body>\n <aup-markdown *ngFor=\"let line of content\" [content]=\"line\"></aup-markdown>\n</aup-activity-body>\n<aup-activity-actions [confirmFace]=\"confirmFace\"></aup-activity-actions>\n", styles: [":host{display:block}.mat-mdc-dialog-content{margin:0;padding:0}.mat-mdc-dialog-actions{margin-bottom:0!important;padding:0;align-items:flex-end;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MarkdownComponent, selector: "aup-markdown, [aupMarkdown]", inputs: ["content$", "content", "inline"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align", "alignContent"] }, { kind: "component", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: ["hasTransparentBackground", "color"] }, { kind: "component", type: ActivityBodyComponent, selector: "aup-activity-body", inputs: ["fullWidth"] }] });
8769
9461
  }
8770
9462
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AlertDialogComponent, decorators: [{
8771
9463
  type: Component,
@@ -8785,7 +9477,7 @@ class ConfirmThenDialogComponent extends AbstractConfirmDialogComponent {
8785
9477
  });
8786
9478
  }
8787
9479
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenDialogComponent, deps: [{ token: ACTIVITY_DATA }], target: i0.ɵɵFactoryTarget.Component });
8788
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ConfirmThenDialogComponent, selector: "aup-confirmation-then-dialog", usesInheritance: true, ngImport: i0, template: "<aup-activity-title *ngIf=\"title\" [color]=\"color\"><aup-markdown [content]=\"title\" [inline]=\"true\"></aup-markdown></aup-activity-title>\n<aup-activity-body>\n <aup-markdown *ngFor=\"let line of content\" [content]=\"line\"></aup-markdown>\n</aup-activity-body>\n<aup-activity-actions [confirmFace]=\"confirmFace\" [cancelFace]=\"cancelFace\"></aup-activity-actions>\n", styles: [":host{display:block}.mat-mdc-dialog-content{margin:0;padding:0}.mat-mdc-dialog-actions{margin-bottom:0!important;padding:0;align-items:flex-end;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MarkdownComponent, selector: "aup-markdown, [aupMarkdown]", inputs: ["content$", "content", "inline"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align"] }, { kind: "component", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: ["hasTransparentBackground", "color"] }, { kind: "component", type: ActivityBodyComponent, selector: "aup-activity-body", inputs: ["fullWidth"] }] });
9480
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ConfirmThenDialogComponent, selector: "aup-confirmation-then-dialog", usesInheritance: true, ngImport: i0, template: "<aup-activity-title *ngIf=\"title\" [color]=\"color\"><aup-markdown [content]=\"title\" [inline]=\"true\"></aup-markdown></aup-activity-title>\n<aup-activity-body>\n <aup-markdown *ngFor=\"let line of content\" [content]=\"line\"></aup-markdown>\n</aup-activity-body>\n<aup-activity-actions [confirmFace]=\"confirmFace\" [cancelFace]=\"cancelFace\"></aup-activity-actions>\n", styles: [":host{display:block}.mat-mdc-dialog-content{margin:0;padding:0}.mat-mdc-dialog-actions{margin-bottom:0!important;padding:0;align-items:flex-end;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MarkdownComponent, selector: "aup-markdown, [aupMarkdown]", inputs: ["content$", "content", "inline"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align", "alignContent"] }, { kind: "component", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: ["hasTransparentBackground", "color"] }, { kind: "component", type: ActivityBodyComponent, selector: "aup-activity-body", inputs: ["fullWidth"] }] });
8789
9481
  }
8790
9482
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenDialogComponent, decorators: [{
8791
9483
  type: Component,
@@ -8809,7 +9501,7 @@ class ConfirmThenExecuteDialogComponent extends AbstractConfirmDialogComponent {
8809
9501
  });
8810
9502
  }
8811
9503
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenExecuteDialogComponent, deps: [{ token: ACTIVITY_DATA }], target: i0.ɵɵFactoryTarget.Component });
8812
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ConfirmThenExecuteDialogComponent, selector: "aup-confirmation-execute-dialog", usesInheritance: true, ngImport: i0, template: "<aup-activity-title *ngIf=\"title\" [color]=\"color\"><aup-markdown [content]=\"title\" [inline]=\"true\"></aup-markdown></aup-activity-title>\n<aup-activity-body>\n <aup-markdown *ngFor=\"let line of content\" [content]=\"line\"></aup-markdown>\n</aup-activity-body>\n<aup-activity-actions [confirmFace]=\"confirmFace\" [cancelFace]=\"cancelFace\"></aup-activity-actions>\n", styles: [":host{display:block}.mat-mdc-dialog-content{margin:0;padding:0}.mat-mdc-dialog-actions{margin-bottom:0!important;padding:0;align-items:flex-end;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MarkdownComponent, selector: "aup-markdown, [aupMarkdown]", inputs: ["content$", "content", "inline"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align"] }, { kind: "component", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: ["hasTransparentBackground", "color"] }, { kind: "component", type: ActivityBodyComponent, selector: "aup-activity-body", inputs: ["fullWidth"] }] });
9504
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ConfirmThenExecuteDialogComponent, selector: "aup-confirmation-execute-dialog", usesInheritance: true, ngImport: i0, template: "<aup-activity-title *ngIf=\"title\" [color]=\"color\"><aup-markdown [content]=\"title\" [inline]=\"true\"></aup-markdown></aup-activity-title>\n<aup-activity-body>\n <aup-markdown *ngFor=\"let line of content\" [content]=\"line\"></aup-markdown>\n</aup-activity-body>\n<aup-activity-actions [confirmFace]=\"confirmFace\" [cancelFace]=\"cancelFace\"></aup-activity-actions>\n", styles: [":host{display:block}.mat-mdc-dialog-content{margin:0;padding:0}.mat-mdc-dialog-actions{margin-bottom:0!important;padding:0;align-items:flex-end;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MarkdownComponent, selector: "aup-markdown, [aupMarkdown]", inputs: ["content$", "content", "inline"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align", "alignContent"] }, { kind: "component", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: ["hasTransparentBackground", "color"] }, { kind: "component", type: ActivityBodyComponent, selector: "aup-activity-body", inputs: ["fullWidth"] }] });
8813
9505
  }
8814
9506
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenExecuteDialogComponent, decorators: [{
8815
9507
  type: Component,
@@ -8829,7 +9521,7 @@ class ConfirmationDialogComponent extends AbstractConfirmDialogComponent {
8829
9521
  });
8830
9522
  }
8831
9523
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmationDialogComponent, deps: [{ token: ACTIVITY_DATA }], target: i0.ɵɵFactoryTarget.Component });
8832
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ConfirmationDialogComponent, selector: "aup-confirmation-dialog", usesInheritance: true, ngImport: i0, template: "<aup-activity-title *ngIf=\"title\" [color]=\"color\"><aup-markdown [content]=\"title\" [inline]=\"true\"></aup-markdown></aup-activity-title>\n<aup-activity-body>\n <aup-markdown *ngFor=\"let line of content\" [content]=\"line\"></aup-markdown>\n</aup-activity-body>\n<aup-activity-actions [confirmFace]=\"confirmFace\" [cancelFace]=\"cancelFace\"></aup-activity-actions>\n\n", styles: [":host{display:block}.mat-mdc-dialog-content{margin:0;padding:0}.mat-mdc-dialog-actions{margin-bottom:0!important;padding:0;align-items:flex-end;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MarkdownComponent, selector: "aup-markdown, [aupMarkdown]", inputs: ["content$", "content", "inline"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align"] }, { kind: "component", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: ["hasTransparentBackground", "color"] }, { kind: "component", type: ActivityBodyComponent, selector: "aup-activity-body", inputs: ["fullWidth"] }] });
9524
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ConfirmationDialogComponent, selector: "aup-confirmation-dialog", usesInheritance: true, ngImport: i0, template: "<aup-activity-title *ngIf=\"title\" [color]=\"color\"><aup-markdown [content]=\"title\" [inline]=\"true\"></aup-markdown></aup-activity-title>\n<aup-activity-body>\n <aup-markdown *ngFor=\"let line of content\" [content]=\"line\"></aup-markdown>\n</aup-activity-body>\n<aup-activity-actions [confirmFace]=\"confirmFace\" [cancelFace]=\"cancelFace\"></aup-activity-actions>\n\n", styles: [":host{display:block}.mat-mdc-dialog-content{margin:0;padding:0}.mat-mdc-dialog-actions{margin-bottom:0!important;padding:0;align-items:flex-end;justify-content:flex-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MarkdownComponent, selector: "aup-markdown, [aupMarkdown]", inputs: ["content$", "content", "inline"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align", "alignContent"] }, { kind: "component", type: ActivityTitleComponent, selector: "aup-activity-title", inputs: ["hasTransparentBackground", "color"] }, { kind: "component", type: ActivityBodyComponent, selector: "aup-activity-body", inputs: ["fullWidth"] }] });
8833
9525
  }
8834
9526
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmationDialogComponent, decorators: [{
8835
9527
  type: Component,
@@ -9009,6 +9701,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9009
9701
  tabs;
9010
9702
  activityOutlets;
9011
9703
  activityRefs = [];
9704
+ animationDuration = "500ms";
9012
9705
  _identifier;
9013
9706
  _deferredCleanUp;
9014
9707
  interactionServiceApi;
@@ -9021,6 +9714,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9021
9714
  busy = this.registerDisposable(new DelegatingValueModel().withDefault(false));
9022
9715
  syncTabsJob = undefined;
9023
9716
  stable$;
9717
+ wasActive = false;
9024
9718
  constructor(placeRouter) {
9025
9719
  super();
9026
9720
  this.placeRouter = placeRouter;
@@ -9057,7 +9751,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9057
9751
  * Returns true if an activity is currently running.
9058
9752
  */
9059
9753
  isActive() {
9060
- return this.getActiveActivityCount() > 0;
9754
+ const isActive = this.getActiveActivityCount() > 0;
9755
+ // if (this.wasActive !== isActive) {
9756
+ // console.log({was: this.wasActive, is: isActive});
9757
+ // }
9758
+ // this.wasActive = isActive
9759
+ return isActive;
9061
9760
  }
9062
9761
  registerDisposable(disposable) {
9063
9762
  return this.garbage.registerDisposable(disposable);
@@ -9140,7 +9839,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9140
9839
  // by activity index)
9141
9840
  setTimeout(() => {
9142
9841
  this.activityRefs = []; // we have to do it after the animation timeout or the activity disappears before the animatin finsihes
9143
- }, this.getTabAnimationDuration());
9842
+ }, this.getTabAnimationDurationInMillis());
9144
9843
  const promise = this.interactionServiceApi.notifyFinished(this);
9145
9844
  this._deferredCleanUp = promise
9146
9845
  .finally(() => {
@@ -9166,7 +9865,6 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9166
9865
  /**
9167
9866
  * Synchronises the selected tab index.
9168
9867
  */
9169
- // @Trace()
9170
9868
  synchroniseSelectedTabIndex() {
9171
9869
  assert.isTruthy(this.isActive());
9172
9870
  const previousIndex = this.tabs.selectedIndex;
@@ -9178,10 +9876,10 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9178
9876
  activityRef.setFocused(false);
9179
9877
  this.busy.setDelegate(activityRef.activityBusy);
9180
9878
  this.tabs.selectedIndex = newIndex;
9181
- if (this.ready$.value) {
9182
- // Note: We're not using the animation done event as it's firing almost immeadiately.
9183
- setTimeout(() => this.finaliseActivityStates(), animate ? this.getTabAnimationDuration() : 0);
9184
- }
9879
+ // if (this.ready$.value) {
9880
+ // // Note: We're not using the animation done event as it's firing almost immeadiately.
9881
+ // setTimeout(() => this.finaliseActivityStates(), animate ? this.getTabAnimationDurationInMillis() : 0);
9882
+ // }
9185
9883
  }
9186
9884
  }
9187
9885
  finaliseActivityStates() {
@@ -9195,7 +9893,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9195
9893
  return this.activityOutlets.toArray()[this.tabs.selectedIndex];
9196
9894
  }
9197
9895
  getTabAnimationDuration() {
9198
- const match = this.tabs.animationDuration.match(/(\d+)(.*)/);
9896
+ // const s = this._started$.value ? this.animationDuration : "0";
9897
+ // return s
9898
+ return this.animationDuration;
9899
+ }
9900
+ getTabAnimationDurationInMillis() {
9901
+ const match = this.animationDuration.match(/(\d+)(.*)/);
9199
9902
  const numericValue = parseFloat(match[1]);
9200
9903
  switch (match[2].trim()) {
9201
9904
  case "ms":
@@ -9221,12 +9924,16 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9221
9924
  }
9222
9925
  }, 75);
9223
9926
  }
9927
+ onAnimationDone() {
9928
+ this._started$.value = true;
9929
+ this.finaliseActivityStates();
9930
+ }
9224
9931
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityContainerComponent, deps: [{ token: PlaceRouter }], target: i0.ɵɵFactoryTarget.Component });
9225
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ActivityContainerComponent, selector: "aup-activity-container", inputs: { dynamicHeight: "dynamicHeight" }, viewQueries: [{ propertyName: "tabs", first: true, predicate: ["tabs"], descendants: true, static: true }, { propertyName: "activityOutlets", predicate: ActivityOutletComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-tab-group #tabs no-tab-header\n [dynamicHeight]=\"dynamicHeight\"\n [class.full-height-tabs]=\"!dynamicHeight\">\n <mat-tab *ngFor=\"let activityRef of activityRefs; let i = index; trackBy: activityIndex\">\n <aup-busy-overlay [busy$]=\"busy\" cdkTrapFocus cdkTrapFocusAutoCapture>\n <!--\n We have issues where angular is triggering a leave animation when an\n new activity is started, but is not running the enter animation\n when it is scrolled back into view. So we track the tab changes and\n disable all animations inside the tab while we're animating.\n -->\n <div class=\"activity-outlet-wrapper\" [@.disabled]=\"!activityRef.focused\">\n <aup-activity-outlet [nestedInteractionContext]=\"this\" [activityRef]=\"activityRef\"></aup-activity-outlet>\n </div>\n </aup-busy-overlay>\n </mat-tab>\n</mat-tab-group>\n", styles: [":host{display:flex;flex-direction:column}mat-tab-group{flex:1}aup-busy-overlay{flex:1}.activity-outlet-wrapper{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3$1.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i3$1.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: BusyOverlayComponent, selector: "aup-busy-overlay", inputs: ["busy$", "busy"] }, { kind: "directive", type: i5$1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: ActivityOutletComponent, selector: "aup-activity-outlet", inputs: ["nestedInteractionContext", "activityRef"] }] });
9932
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ActivityContainerComponent, selector: "aup-activity-container", inputs: { dynamicHeight: "dynamicHeight", animationDuration: "animationDuration" }, viewQueries: [{ propertyName: "tabs", first: true, predicate: ["tabs"], descendants: true, static: true }, { propertyName: "activityOutlets", predicate: ActivityOutletComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-tab-group #tabs no-tab-header\n [dynamicHeight]=\"dynamicHeight\"\n [class.full-height-tabs]=\"!dynamicHeight\"\n [animationDuration]=\"getTabAnimationDuration()\"\n (animationDone)=\"onAnimationDone()\"\n>\n <mat-tab *ngFor=\"let activityRef of activityRefs; let i = index; trackBy: activityIndex\">\n <aup-busy-overlay [busy$]=\"busy\" cdkTrapFocus cdkTrapFocusAutoCapture>\n <!--\n We have issues where angular is triggering a leave animation when an\n new activity is started, but is not running the enter animation\n when it is scrolled back into view. So we track the tab changes and\n disable all animations inside the tab while we're animating.\n -->\n <div class=\"activity-outlet-wrapper\" [@.disabled]=\"!activityRef.focused\">\n <aup-activity-outlet [nestedInteractionContext]=\"this\" [activityRef]=\"activityRef\"></aup-activity-outlet>\n </div>\n </aup-busy-overlay>\n </mat-tab>\n</mat-tab-group>\n", styles: [":host{display:flex;flex-direction:column}mat-tab-group{flex:1}aup-busy-overlay{flex:1}.activity-outlet-wrapper{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3$2.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i3$2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: BusyOverlayComponent, selector: "aup-busy-overlay", inputs: ["busy$", "busy"] }, { kind: "directive", type: i5$1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: ActivityOutletComponent, selector: "aup-activity-outlet", inputs: ["nestedInteractionContext", "activityRef"] }] });
9226
9933
  }
9227
9934
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityContainerComponent, decorators: [{
9228
9935
  type: Component,
9229
- args: [{ selector: "aup-activity-container", template: "<mat-tab-group #tabs no-tab-header\n [dynamicHeight]=\"dynamicHeight\"\n [class.full-height-tabs]=\"!dynamicHeight\">\n <mat-tab *ngFor=\"let activityRef of activityRefs; let i = index; trackBy: activityIndex\">\n <aup-busy-overlay [busy$]=\"busy\" cdkTrapFocus cdkTrapFocusAutoCapture>\n <!--\n We have issues where angular is triggering a leave animation when an\n new activity is started, but is not running the enter animation\n when it is scrolled back into view. So we track the tab changes and\n disable all animations inside the tab while we're animating.\n -->\n <div class=\"activity-outlet-wrapper\" [@.disabled]=\"!activityRef.focused\">\n <aup-activity-outlet [nestedInteractionContext]=\"this\" [activityRef]=\"activityRef\"></aup-activity-outlet>\n </div>\n </aup-busy-overlay>\n </mat-tab>\n</mat-tab-group>\n", styles: [":host{display:flex;flex-direction:column}mat-tab-group{flex:1}aup-busy-overlay{flex:1}.activity-outlet-wrapper{flex:1}\n"] }]
9936
+ args: [{ selector: "aup-activity-container", template: "<mat-tab-group #tabs no-tab-header\n [dynamicHeight]=\"dynamicHeight\"\n [class.full-height-tabs]=\"!dynamicHeight\"\n [animationDuration]=\"getTabAnimationDuration()\"\n (animationDone)=\"onAnimationDone()\"\n>\n <mat-tab *ngFor=\"let activityRef of activityRefs; let i = index; trackBy: activityIndex\">\n <aup-busy-overlay [busy$]=\"busy\" cdkTrapFocus cdkTrapFocusAutoCapture>\n <!--\n We have issues where angular is triggering a leave animation when an\n new activity is started, but is not running the enter animation\n when it is scrolled back into view. So we track the tab changes and\n disable all animations inside the tab while we're animating.\n -->\n <div class=\"activity-outlet-wrapper\" [@.disabled]=\"!activityRef.focused\">\n <aup-activity-outlet [nestedInteractionContext]=\"this\" [activityRef]=\"activityRef\"></aup-activity-outlet>\n </div>\n </aup-busy-overlay>\n </mat-tab>\n</mat-tab-group>\n", styles: [":host{display:flex;flex-direction:column}mat-tab-group{flex:1}aup-busy-overlay{flex:1}.activity-outlet-wrapper{flex:1}\n"] }]
9230
9937
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { dynamicHeight: [{
9231
9938
  type: Input
9232
9939
  }], tabs: [{
@@ -9235,6 +9942,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9235
9942
  }], activityOutlets: [{
9236
9943
  type: ViewChildren,
9237
9944
  args: [ActivityOutletComponent]
9945
+ }], animationDuration: [{
9946
+ type: Input
9238
9947
  }] } });
9239
9948
 
9240
9949
  class AbstractActivityTriggerComponent extends DisposableComponent {
@@ -9335,14 +10044,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9335
10044
  args: ['class.active']
9336
10045
  }] } });
9337
10046
 
9338
- const cssDurationRegex = /(\d+)(m?s)/;
10047
+ const INTERACTION_CONTEXT = new InjectionToken('interactionContext');
10048
+
10049
+ const cssDurationRegex$1 = /(\d+)(m?s)/;
9339
10050
  /**
9340
10051
  * @example
9341
10052
  * <aup-in-place-interaction-context #inPlaceInteractionContext>
9342
10053
  * </aup-in-place-interaction-context>
9343
10054
  *
9344
10055
  * in your component
9345
- * @ViewChild('inPlaceInteractionContext', { static: true })
10056
+ * @ViewChild(InPlaceInteractionContextComponent)
9346
10057
  * interactionContext: InteractionContext;
9347
10058
  *
9348
10059
  *
@@ -9361,11 +10072,13 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9361
10072
  * active interactions.
9362
10073
  */
9363
10074
  syncWithRoutes = true;
10075
+ started = new EventEmitter();
10076
+ finished = new EventEmitter();
9364
10077
  get animationDuration() {
9365
10078
  return this.animateFirstActivity ? (this.tabConfig?.animationDuration || "500ms") : "0ms";
9366
10079
  }
9367
10080
  get animationDurationMillis() {
9368
- const result = cssDurationRegex.exec(this.animationDuration);
10081
+ const result = cssDurationRegex$1.exec(this.animationDuration);
9369
10082
  if (!result) {
9370
10083
  lang.illegalState(`unsupported css duration: ${this.animationDuration}`);
9371
10084
  }
@@ -9387,11 +10100,16 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9387
10100
  this.interactionService.registerInplaceInteractionContext(this);
9388
10101
  }
9389
10102
  else {
10103
+ const self = this;
9390
10104
  this.activityContainerComponent.initialise("dont-care", {
9391
10105
  async notifyActive(interactionContext) {
10106
+ self.started.emit();
9392
10107
  return undefined;
9393
10108
  },
9394
10109
  async notifyFinished(interactionContext) {
10110
+ // I've noticed some rendering fails when returning the the transcluded content we'll fire an event
10111
+ // so components can do stuff if they need to.
10112
+ self.started.emit();
9395
10113
  return undefined;
9396
10114
  }
9397
10115
  });
@@ -9438,11 +10156,15 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9438
10156
  }
9439
10157
  }
9440
10158
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InPlaceInteractionContextComponent, deps: [{ token: MAT_TABS_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
9441
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: { animateFirstActivity: "animateFirstActivity", syncWithRoutes: "syncWithRoutes" }, host: { properties: { "class.active": "this.active" } }, viewQueries: [{ propertyName: "activityContainerComponent", first: true, predicate: ["activityContainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-tab-group no-tab-header [selectedIndex]=\"isActive() ? 1 : 0\" full-height-tabs\n (selectedTabChange)=\"onTabChanged($event)\"\n [dynamicHeight]=\"false\"\n [animationDuration]=\"animationDuration\">\n <mat-tab>\n <ng-content></ng-content>\n </mat-tab>\n <mat-tab>\n <aup-activity-container #activityContainer [dynamicHeight]=\"false\"></aup-activity-container>\n </mat-tab>\n</mat-tab-group>\n\n", styles: [":host{display:flex;flex-direction:column}mat-tab-group{flex:1}aup-activity-container{flex:1}\n"], dependencies: [{ kind: "component", type: i3$1.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i3$1.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: ActivityContainerComponent, selector: "aup-activity-container", inputs: ["dynamicHeight"] }] });
10159
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: { animateFirstActivity: "animateFirstActivity", syncWithRoutes: "syncWithRoutes" }, outputs: { started: "started", finished: "finished" }, host: { properties: { "class.active": "this.active" } }, providers: [
10160
+ { provide: INTERACTION_CONTEXT, useExisting: InPlaceInteractionContextComponent }
10161
+ ], viewQueries: [{ propertyName: "activityContainerComponent", first: true, predicate: ["activityContainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<mat-tab-group no-tab-header [selectedIndex]=\"isActive() ? 1 : 0\" full-height-tabs\n (selectedTabChange)=\"onTabChanged($event)\"\n [dynamicHeight]=\"false\"\n [animationDuration]=\"animationDuration\">\n <mat-tab>\n <ng-content></ng-content>\n </mat-tab>\n <mat-tab>\n <aup-activity-container #activityContainer [dynamicHeight]=\"false\"></aup-activity-container>\n </mat-tab>\n</mat-tab-group>\n\n", styles: [":host{display:flex;flex-direction:column}mat-tab-group{flex:1}aup-activity-container{flex:1}\n"], dependencies: [{ kind: "component", type: i3$2.MatTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "component", type: i3$2.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple", "fitInkBarToContent", "mat-stretch-tabs"], exportAs: ["matTabGroup"] }, { kind: "component", type: ActivityContainerComponent, selector: "aup-activity-container", inputs: ["dynamicHeight", "animationDuration"] }] });
9442
10162
  }
9443
10163
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InPlaceInteractionContextComponent, decorators: [{
9444
10164
  type: Component,
9445
- args: [{ selector: "aup-in-place-interaction-context", template: "<mat-tab-group no-tab-header [selectedIndex]=\"isActive() ? 1 : 0\" full-height-tabs\n (selectedTabChange)=\"onTabChanged($event)\"\n [dynamicHeight]=\"false\"\n [animationDuration]=\"animationDuration\">\n <mat-tab>\n <ng-content></ng-content>\n </mat-tab>\n <mat-tab>\n <aup-activity-container #activityContainer [dynamicHeight]=\"false\"></aup-activity-container>\n </mat-tab>\n</mat-tab-group>\n\n", styles: [":host{display:flex;flex-direction:column}mat-tab-group{flex:1}aup-activity-container{flex:1}\n"] }]
10165
+ args: [{ selector: "aup-in-place-interaction-context", providers: [
10166
+ { provide: INTERACTION_CONTEXT, useExisting: InPlaceInteractionContextComponent }
10167
+ ], template: "<mat-tab-group no-tab-header [selectedIndex]=\"isActive() ? 1 : 0\" full-height-tabs\n (selectedTabChange)=\"onTabChanged($event)\"\n [dynamicHeight]=\"false\"\n [animationDuration]=\"animationDuration\">\n <mat-tab>\n <ng-content></ng-content>\n </mat-tab>\n <mat-tab>\n <aup-activity-container #activityContainer [dynamicHeight]=\"false\"></aup-activity-container>\n </mat-tab>\n</mat-tab-group>\n\n", styles: [":host{display:flex;flex-direction:column}mat-tab-group{flex:1}aup-activity-container{flex:1}\n"] }]
9446
10168
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
9447
10169
  type: Inject,
9448
10170
  args: [MAT_TABS_CONFIG]
@@ -9455,6 +10177,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9455
10177
  type: Input
9456
10178
  }], syncWithRoutes: [{
9457
10179
  type: Input
10180
+ }], started: [{
10181
+ type: Output
10182
+ }], finished: [{
10183
+ type: Output
9458
10184
  }], active: [{
9459
10185
  type: HostBinding,
9460
10186
  args: ["class.active"]
@@ -9469,7 +10195,7 @@ class InlineActivityTriggerComponent extends AbstractActivityTriggerComponent {
9469
10195
  super();
9470
10196
  }
9471
10197
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InlineActivityTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9472
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: InlineActivityTriggerComponent, selector: "aup-inline-activity-trigger", viewQueries: [{ propertyName: "_interactionContext", first: true, predicate: InPlaceInteractionContextComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<aup-in-place-interaction-context #interactionContext [animateFirstActivity]=\"false\">\n <aup-command [command]=\"startActivityCommand\" [face$]=\"face$\" [alignFace]=\"alignFace\"></aup-command>\n</aup-in-place-interaction-context>\n", styles: [":host{display:inline-block}\n"], dependencies: [{ kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }, { kind: "component", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: ["animateFirstActivity", "syncWithRoutes"] }] });
10198
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: InlineActivityTriggerComponent, selector: "aup-inline-activity-trigger", viewQueries: [{ propertyName: "_interactionContext", first: true, predicate: InPlaceInteractionContextComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<aup-in-place-interaction-context #interactionContext [animateFirstActivity]=\"false\">\n <aup-command [command]=\"startActivityCommand\" [face$]=\"face$\" [alignFace]=\"alignFace\"></aup-command>\n</aup-in-place-interaction-context>\n", styles: [":host{display:inline-block}\n"], dependencies: [{ kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }, { kind: "component", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: ["animateFirstActivity", "syncWithRoutes"], outputs: ["started", "finished"] }] });
9473
10199
  }
9474
10200
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InlineActivityTriggerComponent, decorators: [{
9475
10201
  type: Component,
@@ -9593,7 +10319,7 @@ class PopupInteractionContextComponent extends DisposableComponent {
9593
10319
  isActive() {
9594
10320
  return this.interactionContext && this.interactionContext.isActive();
9595
10321
  }
9596
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PopupInteractionContextComponent, deps: [{ token: i0.ElementRef }, { token: i1$5.Overlay }, { token: i1$5.CdkScrollable, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
10322
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PopupInteractionContextComponent, deps: [{ token: i0.ElementRef }, { token: i1$6.Overlay }, { token: i1$6.CdkScrollable, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
9597
10323
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: PopupInteractionContextComponent, selector: "aup-popup-interaction-context", inputs: { anchorX: "anchorX", anchorY: "anchorY", cancelOnEscape$: "cancelOnEscape$", cancelOnEscape: "cancelOnEscape" }, host: { properties: { "class.interaction-active": "this.active" } }, usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\n", styles: [":host{display:inline-block}:host.interaction-active{background:rgba(0,0,0,.05)}:host::ng-deep .popup-interaction-context-backdrop{background-color:#0000}\n"] });
9598
10324
  }
9599
10325
  __decorate([
@@ -9607,7 +10333,7 @@ __decorate([
9607
10333
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PopupInteractionContextComponent, decorators: [{
9608
10334
  type: Component,
9609
10335
  args: [{ selector: 'aup-popup-interaction-context', template: "<ng-content></ng-content>\n", styles: [":host{display:inline-block}:host.interaction-active{background:rgba(0,0,0,.05)}:host::ng-deep .popup-interaction-context-backdrop{background-color:#0000}\n"] }]
9610
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$5.Overlay }, { type: i1$5.CdkScrollable, decorators: [{
10336
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$6.Overlay }, { type: i1$6.CdkScrollable, decorators: [{
9611
10337
  type: Optional
9612
10338
  }, {
9613
10339
  type: SkipSelf
@@ -9692,7 +10418,7 @@ class AddCardActivityComponent extends AbstractActivityTriggerComponent {
9692
10418
  return this.interactionStyle === 'inline';
9693
10419
  }
9694
10420
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AddCardActivityComponent, deps: [{ token: InteractionService }], target: i0.ɵɵFactoryTarget.Component });
9695
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AddCardActivityComponent, selector: "aup-add-card-activity", inputs: { interactionStyle: "interactionStyle", renderAs: "renderAs" }, host: { properties: { "class": "this.activityTypeClass", "class.not-card": "this.notCard" } }, viewQueries: [{ propertyName: "inlineInteractionContext", first: true, predicate: InPlaceInteractionContextComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<aup-in-place-interaction-context [animateFirstActivity]=\"false\" [pectinCommand]=\"startActivityCommand\">\n <aup-command *ngIf=\"isRenderAsButton()\" [command]=\"startActivityCommand\" [face$]=\"face$\" [alignFace]=\"alignFace\"></aup-command>\n <section *ngIf=\"isRenderAsCard()\" class=\"face-wrapper\">\n <aup-command-face class=\"mat-button\" [faces]=\"faceList.value\"></aup-command-face>\n </section>\n</aup-in-place-interaction-context>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;background-color:#fff}:host[interactionStyle=inline][renderas=card]:not(.active){transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}:host[interactionStyle=inline][renderas=card]:not(.active):hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}:host[interactionStyle=inline][renderas=card]:not(.active):hover{border-color:transparent;background-color:#fff;color:#0000008a}:host[interactionStyle=modal][renderas=card]{transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}:host[interactionStyle=modal][renderas=card]:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}:host[interactionStyle=modal][renderas=card]:hover{border-color:transparent;background-color:#fff;color:#0000008a}:host-context(aup-card-container)[renderas=button]{align-self:start}section.face-wrapper{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}aup-in-place-interaction-context{flex:1}aup-in-place-interaction-context.active{border:3px solid #6273c7;border-radius:4px;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }, { kind: "component", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: ["animateFirstActivity", "syncWithRoutes"] }] });
10421
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AddCardActivityComponent, selector: "aup-add-card-activity", inputs: { interactionStyle: "interactionStyle", renderAs: "renderAs" }, host: { properties: { "class": "this.activityTypeClass", "class.not-card": "this.notCard" } }, viewQueries: [{ propertyName: "inlineInteractionContext", first: true, predicate: InPlaceInteractionContextComponent, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<aup-in-place-interaction-context [animateFirstActivity]=\"false\" [pectinCommand]=\"startActivityCommand\">\n <aup-command *ngIf=\"isRenderAsButton()\" [command]=\"startActivityCommand\" [face$]=\"face$\" [alignFace]=\"alignFace\"></aup-command>\n <section *ngIf=\"isRenderAsCard()\" class=\"face-wrapper\">\n <aup-command-face class=\"mat-button\" [faces]=\"faceList.value\"></aup-command-face>\n </section>\n</aup-in-place-interaction-context>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;background-color:#fff}:host[interactionStyle=inline][renderas=card]:not(.active){transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}:host[interactionStyle=inline][renderas=card]:not(.active):hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}:host[interactionStyle=inline][renderas=card]:not(.active):hover{border-color:transparent;background-color:#fff;color:#0000008a}:host[interactionStyle=modal][renderas=card]{transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}:host[interactionStyle=modal][renderas=card]:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}:host[interactionStyle=modal][renderas=card]:hover{border-color:transparent;background-color:#fff;color:#0000008a}:host-context(aup-card-container)[renderas=button]{align-self:start}section.face-wrapper{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}aup-in-place-interaction-context{flex:1}aup-in-place-interaction-context.active{border:3px solid #6273c7;border-radius:4px;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }, { kind: "component", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: ["animateFirstActivity", "syncWithRoutes"], outputs: ["started", "finished"] }] });
9696
10422
  }
9697
10423
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AddCardActivityComponent, decorators: [{
9698
10424
  type: Component,
@@ -9768,7 +10494,7 @@ class AddItemInteractionContextComponent extends DisposableComponent {
9768
10494
  return this.interactionContext.startActivity(activityType, data);
9769
10495
  }
9770
10496
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AddItemInteractionContextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9771
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AddItemInteractionContextComponent, selector: "aup-add-item-interaction-context", inputs: { label: "label", icon: "icon", activityClass: "activityClass", activityData: "activityData", addCommand: "addCommand" }, host: { properties: { "class.interaction-active": "this.active", "tabindex": "this.tabindex" } }, viewQueries: [{ propertyName: "interactionContext", first: true, predicate: InPlaceInteractionContextComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<aup-in-place-interaction-context [animateFirstActivity]=\"false\">\n <a part=\"link\" class=\"link\" [pectinCommand]=\"clickCommand\"><aup-icon [icon]=\"icon\"></aup-icon> {{label}}</a>\n</aup-in-place-interaction-context>\n", styles: [":host{--def-link-color: var(--link-color, currentColor);--def-link-color-hover: var(--link-color-hover, currentColor);--def-link-background: var(--link-background, transparent);--def-link-background-hover: var(--link-background-hover, rgba(0, 0, 0, .05));--def-link-border-radius: var(--link-border-radius, 4px);--def-link-padding: var(--link-padding, calc(var(--aup-default-padding) / 2));display:flex;flex-direction:column;border-radius:var(--def-link-border-radius);box-sizing:border-box;outline:none}:host:hover a.link{color:var(--def-link-color-hover);background-color:var(--def-link-background-hover)}aup-in-place-interaction-context{border-radius:var(--def-link-border-radius)}a.link{display:flex;flex-direction:row;align-items:center;border-radius:var(--def-link-border-radius);color:var(--def-link-color);background:var(--def-link-background);padding:var(--def-link-padding);cursor:pointer;text-decoration:none}a.link mat-icon{margin-right:8px}\n"], dependencies: [{ kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }, { kind: "component", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: ["animateFirstActivity", "syncWithRoutes"] }] });
10497
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AddItemInteractionContextComponent, selector: "aup-add-item-interaction-context", inputs: { label: "label", icon: "icon", activityClass: "activityClass", activityData: "activityData", addCommand: "addCommand" }, host: { properties: { "class.interaction-active": "this.active", "tabindex": "this.tabindex" } }, viewQueries: [{ propertyName: "interactionContext", first: true, predicate: InPlaceInteractionContextComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<aup-in-place-interaction-context [animateFirstActivity]=\"false\">\n <a part=\"link\" class=\"link\" [pectinCommand]=\"clickCommand\"><aup-icon [icon]=\"icon\"></aup-icon> {{label}}</a>\n</aup-in-place-interaction-context>\n", styles: [":host{--def-link-color: var(--link-color, currentColor);--def-link-color-hover: var(--link-color-hover, currentColor);--def-link-background: var(--link-background, transparent);--def-link-background-hover: var(--link-background-hover, rgba(0, 0, 0, .05));--def-link-border-radius: var(--link-border-radius, 4px);--def-link-padding: var(--link-padding, calc(var(--aup-default-padding) / 2));display:flex;flex-direction:column;border-radius:var(--def-link-border-radius);box-sizing:border-box;outline:none}:host:hover a.link{color:var(--def-link-color-hover);background-color:var(--def-link-background-hover)}aup-in-place-interaction-context{border-radius:var(--def-link-border-radius)}a.link{display:flex;flex-direction:row;align-items:center;border-radius:var(--def-link-border-radius);color:var(--def-link-color);background:var(--def-link-background);padding:var(--def-link-padding);cursor:pointer;text-decoration:none}a.link mat-icon{margin-right:8px}\n"], dependencies: [{ kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }, { kind: "component", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: ["animateFirstActivity", "syncWithRoutes"], outputs: ["started", "finished"] }] });
9772
10498
  }
9773
10499
  __decorate([
9774
10500
  Proxify(),
@@ -9907,12 +10633,14 @@ class StringInputActivity extends InputActivity {
9907
10633
  [label]="activityData.label"
9908
10634
  [placeholder]="activityData.placeholder"
9909
10635
  [command.enter]="confirmCommand"
9910
- [command.escape]="cancelCommand"></aup-string-input>
10636
+ [command.escape]="cancelCommand"
10637
+ [dense]="true"
10638
+ ></aup-string-input>
9911
10639
  <aup-activity-actions [layout]="layout" align="end"
9912
10640
  [confirmFace]="confirmFace"
9913
10641
  [cancelFace]="cancelFace"
9914
10642
  ></aup-activity-actions>
9915
- `, isInline: true, dependencies: [{ kind: "component", type: StringInputComponent, selector: "aup-string-input", inputs: ["autocomplete", "enableClear$", "enableClear", "iconPrefix"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align"] }] });
10643
+ `, isInline: true, dependencies: [{ kind: "component", type: StringInputComponent, selector: "aup-string-input", inputs: ["autocomplete", "enableClear$", "enableClear", "iconPrefix", "suffixCommand"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align", "alignContent"] }] });
9916
10644
  }
9917
10645
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputActivity, decorators: [{
9918
10646
  type: Component,
@@ -9923,7 +10651,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9923
10651
  [label]="activityData.label"
9924
10652
  [placeholder]="activityData.placeholder"
9925
10653
  [command.enter]="confirmCommand"
9926
- [command.escape]="cancelCommand"></aup-string-input>
10654
+ [command.escape]="cancelCommand"
10655
+ [dense]="true"
10656
+ ></aup-string-input>
9927
10657
  <aup-activity-actions [layout]="layout" align="end"
9928
10658
  [confirmFace]="confirmFace"
9929
10659
  [cancelFace]="cancelFace"
@@ -10106,7 +10836,7 @@ class InlineStringEditorComponent extends DisposableComponent {
10106
10836
  return !this.editingEnabled$.value;
10107
10837
  }
10108
10838
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InlineStringEditorComponent, deps: [{ token: InteractionService }], target: i0.ɵɵFactoryTarget.Component });
10109
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: InlineStringEditorComponent, selector: "aup-inline-string-editor", inputs: { editorModel: "editorModel", facesModel: "facesModel", faces: "faces", label: "label", placeHolder: "placeHolder", placeHolder$: "placeHolder$" }, host: { properties: { "class.disabled": "this.isDisabled" } }, viewQueries: [{ propertyName: "interactionContext", first: true, predicate: InPlaceInteractionContextComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container\" *ngIf=\"!editorModel.isEditing()\">\n <mat-form-field floatLabel=\"always\" (click)=\"startEdit()\"\n [class.editable]=\"editingEnabled$.value\" [class.empty]=\"isEmpty()\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input matInput\n placeholder=\"{{placeHolder}}\"\n [ngModel]=\"editorModel.valueModel.value\"\n [disabled]=\"true\"\n >\n <!-- <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>-->\n <!-- <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>-->\n <!-- <aup-icon *ngIf=\"iconPrefix\" matPrefix [icon]=\"iconPrefix\"></aup-icon>-->\n </mat-form-field>\n <aup-command *ngIf=\"editCommand.enabled$.value\" [command]=\"editCommand\" [face$]=\"editFaceModel\"></aup-command>\n</div>\n<aup-in-place-interaction-context [animateFirstActivity]=\"false\"></aup-in-place-interaction-context>\n", dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "component", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: ["animateFirstActivity", "syncWithRoutes"] }] });
10839
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: InlineStringEditorComponent, selector: "aup-inline-string-editor", inputs: { editorModel: "editorModel", facesModel: "facesModel", faces: "faces", label: "label", placeHolder: "placeHolder", placeHolder$: "placeHolder$" }, host: { properties: { "class.disabled": "this.isDisabled" } }, viewQueries: [{ propertyName: "interactionContext", first: true, predicate: InPlaceInteractionContextComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"container\" *ngIf=\"!editorModel.isEditing()\">\n <mat-form-field floatLabel=\"always\" (click)=\"startEdit()\"\n [class.editable]=\"editingEnabled$.value\" [class.empty]=\"isEmpty()\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input matInput\n placeholder=\"{{placeHolder}}\"\n [ngModel]=\"editorModel.valueModel.value\"\n [disabled]=\"true\"\n >\n <!-- <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>-->\n <!-- <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>-->\n <!-- <aup-icon *ngIf=\"iconPrefix\" matPrefix [icon]=\"iconPrefix\"></aup-icon>-->\n </mat-form-field>\n <aup-command *ngIf=\"editCommand.enabled$.value\" [command]=\"editCommand\" [face$]=\"editFaceModel\"></aup-command>\n</div>\n<aup-in-place-interaction-context [animateFirstActivity]=\"false\"></aup-in-place-interaction-context>\n", dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: CommandComponent, selector: "aup-command", inputs: ["command", "face$", "face", "busyFace$", "busyFace", "alignFace"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "component", type: InPlaceInteractionContextComponent, selector: "aup-in-place-interaction-context", inputs: ["animateFirstActivity", "syncWithRoutes"], outputs: ["started", "finished"] }] });
10110
10840
  }
10111
10841
  __decorate([
10112
10842
  Proxify(),
@@ -10189,6 +10919,7 @@ class SelectInputActivity extends InputActivity {
10189
10919
  [options]="options"
10190
10920
  [optionLabelFormat]="optionLabelFormat"
10191
10921
  [allowNil]="activityData.allowNil"
10922
+ [dense]="true"
10192
10923
  >
10193
10924
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10194
10925
  </aup-select-input>
@@ -10196,7 +10927,7 @@ class SelectInputActivity extends InputActivity {
10196
10927
  [confirmFace]="confirmFace"
10197
10928
  [cancelFace]="cancelFace"
10198
10929
  ></aup-activity-actions>
10199
- `, isInline: true, dependencies: [{ kind: "component", type: SelectInputComponent, selector: "aup-select-input", inputs: ["options$", "options", "optionLabel", "allowNil", "optionLabelFormat"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align"] }] });
10930
+ `, isInline: true, dependencies: [{ kind: "component", type: SelectInputComponent, selector: "aup-select-input", inputs: ["options$", "options", "optionLabel", "allowNil", "optionLabelFormat"] }, { kind: "component", type: ActivityActionsComponent, selector: "aup-activity-actions", inputs: ["confirmCommand", "cancelCommand", "faces", "confirmFace", "cancelFace", "style", "layout", "align", "alignContent"] }] });
10200
10931
  }
10201
10932
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputActivity, decorators: [{
10202
10933
  type: Component,
@@ -10211,6 +10942,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10211
10942
  [options]="options"
10212
10943
  [optionLabelFormat]="optionLabelFormat"
10213
10944
  [allowNil]="activityData.allowNil"
10945
+ [dense]="true"
10214
10946
  >
10215
10947
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10216
10948
  </aup-select-input>
@@ -10222,6 +10954,186 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10222
10954
  }]
10223
10955
  }] });
10224
10956
 
10957
+ const slideDownOnEnterDef = style({
10958
+ opacity: 0,
10959
+ 'height': '0',
10960
+ 'max-height': '0',
10961
+ paddingTop: '0',
10962
+ paddingBottom: '0'
10963
+ });
10964
+ const slideLeftOnEnterDef = style({
10965
+ opacity: 0,
10966
+ 'width': '0',
10967
+ paddingLeft: '0',
10968
+ paddingRight: '0'
10969
+ });
10970
+ const ZERO_WIDTH = {
10971
+ opacity: 0,
10972
+ width: '0',
10973
+ paddingLeft: '0',
10974
+ paddingRight: '0',
10975
+ };
10976
+ const ZERO_HEIGHT = {
10977
+ opacity: 0,
10978
+ height: '0',
10979
+ paddingTop: '0',
10980
+ paddingBottom: '0',
10981
+ };
10982
+ // TODO: params aren't getting customised in the view. Need to figure out the correct approach.
10983
+ const slideDownOnEnterAnimation = trigger('slideDownOnEnter', [
10984
+ transition(':enter', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10985
+ transition(':leave', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10986
+ ]);
10987
+ const slideDownWhenOpenAnimation = trigger('slideDownWhenOpen', [
10988
+ transition('closed => open', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10989
+ transition('open => closed', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10990
+ ]);
10991
+ const slideRightOnEnterAnimation = trigger('slideRightOnEnter', [
10992
+ transition(':enter', [slideLeftOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10993
+ transition(':leave', [animate('{{duration}}', slideLeftOnEnterDef)], { params: { duration: '100ms' } })
10994
+ ]);
10995
+ const slideDownAndRightOnEnterAnimation = trigger('slideDownAndRightOnEnter', [
10996
+ transition(':enter', [
10997
+ style({ overflow: "hidden", whiteSpace: "nowrap", ...ZERO_WIDTH, ...ZERO_HEIGHT }),
10998
+ animate('{{duration}}')
10999
+ ], { params: { duration: '100ms' } }),
11000
+ transition(':leave', [
11001
+ style({ overflow: "hidden", whiteSpace: "nowrap" }),
11002
+ group([
11003
+ animate('{{duration}}', style(ZERO_HEIGHT)),
11004
+ // Hack: 100ms is too quick as it animates from * - 0 as we only see it animate the width is greater than the parent.
11005
+ // Not sure how to animate from * to natural new width of parent. This hack won't work for text that's just a little
11006
+ // bit wider than the parent as it'll fall within the parent bounds very early in the animation cycle.
11007
+ animate('300ms', style(ZERO_WIDTH)),
11008
+ ])
11009
+ ], { params: { duration: '100ms' } })
11010
+ ]);
11011
+
11012
+ const cssDurationRegex = /(\d+)(m?s)/;
11013
+ /**
11014
+ * This interaction context remains hidden (height: 0) until it is active.
11015
+ * @example
11016
+ * <aup-slide-down-interaction-context #inPlaceInteractionContext>
11017
+ * </aup-slide-down-interaction-context>
11018
+ *
11019
+ * in your component
11020
+ * @ViewChild(SlideDownInteractionContextComponent)
11021
+ * interactionContext: InteractionContext;
11022
+ *
11023
+ *
11024
+ */
11025
+ class SlideDownInteractionContextComponent extends DisposableComponent {
11026
+ tabConfig;
11027
+ activityContainerComponent;
11028
+ // NOTE: disabling this as I'm using the initialise callback to release the hacky height clamp.
11029
+ // The whole registration thing is a bit naf so I should really clean that up at some point.
11030
+ // /**
11031
+ // * If true the activity will sync with the router to enable back button support. This is a work around for
11032
+ // * deeply nested activities that can't be linked with the root place interactionContext hook for cancelling
11033
+ // * active interactions.
11034
+ // */
11035
+ // @Input()
11036
+ // syncWithRoutes = true;
11037
+ dynamicHeight = true;
11038
+ get active() {
11039
+ return this.isActive();
11040
+ }
11041
+ // Horrible hack to stop the div and activity container bouncing back for a bit in after closing. No idea why it's doing that.
11042
+ clampShut = true;
11043
+ interactionService = this.inject(InteractionService);
11044
+ constructor(tabConfig) {
11045
+ super();
11046
+ this.tabConfig = tabConfig;
11047
+ }
11048
+ ngAfterViewInit() {
11049
+ // NOTE: this is a temp work around to detach inplace contexts from the router until AUP-88 is implemented.
11050
+ // https://coolon.atlassian.net/browse/AUP-88?atlOrigin=eyJpIjoiOTg5YjEzZGUzZjRmNDg0NmExOWU3ZGJmMzJiNTRmNGYiLCJwIjoiaiJ9
11051
+ const self = this;
11052
+ this.activityContainerComponent.initialise("dont-care", {
11053
+ async notifyActive(interactionContext) {
11054
+ self.clampShut = false;
11055
+ return undefined;
11056
+ },
11057
+ async notifyFinished(interactionContext) {
11058
+ return undefined;
11059
+ }
11060
+ });
11061
+ // if (this.syncWithRoutes) {
11062
+ // this.interactionService.registerInplaceInteractionContext(this);
11063
+ // }
11064
+ }
11065
+ getAnimationState() {
11066
+ return {
11067
+ value: this.isActive() ? "open" : "closed",
11068
+ params: { duration: "200ms" }
11069
+ };
11070
+ }
11071
+ // this is a regsitration callback from the interaction service
11072
+ // @Trace() // webstorm says no usages... but I'm not sure.
11073
+ onInplaceInteractionContextRegistered(id, api) {
11074
+ this.activityContainerComponent.initialise(id, api);
11075
+ }
11076
+ get identifier() {
11077
+ return this.activityContainerComponent.identifier;
11078
+ }
11079
+ alert(alert) {
11080
+ return this.activityContainerComponent.alert(alert);
11081
+ }
11082
+ cancelActiveActivity() {
11083
+ return this.activityContainerComponent.cancelActiveActivity();
11084
+ }
11085
+ confirm(confirm) {
11086
+ return this.activityContainerComponent.confirm(confirm);
11087
+ }
11088
+ confirmOrReject(confirm) {
11089
+ return this.activityContainerComponent.confirmOrReject(confirm);
11090
+ }
11091
+ confirmThen(confirm, activityType, data) {
11092
+ return this.activityContainerComponent.confirmThen(confirm, activityType);
11093
+ }
11094
+ confirmThenExecute(confirm, operation) {
11095
+ return this.activityContainerComponent.confirmThenExecute(confirm, operation);
11096
+ }
11097
+ isActive() {
11098
+ return this.activityContainerComponent.isActive();
11099
+ }
11100
+ startActivity(activityType, data, options) {
11101
+ return this.activityContainerComponent.startActivity(activityType, data, options);
11102
+ }
11103
+ onAnimationDone() {
11104
+ if (!this.isActive()) {
11105
+ this.clampShut = true;
11106
+ }
11107
+ }
11108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SlideDownInteractionContextComponent, deps: [{ token: MAT_TABS_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
11109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SlideDownInteractionContextComponent, selector: "aup-slide-down-interaction-context", inputs: { dynamicHeight: "dynamicHeight" }, host: { properties: { "class.active": "this.active" } }, providers: [
11110
+ { provide: INTERACTION_CONTEXT, useExisting: SlideDownInteractionContextComponent }
11111
+ ], viewQueries: [{ propertyName: "activityContainerComponent", first: true, predicate: ["activityContainer"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [@slideDownWhenOpen]=\"getAnimationState()\" (@slideDownWhenOpen.done)=\"onAnimationDone()\" [style.max-height.px]=\"clampShut ? 0 : undefined\">\n <aup-activity-container #activityContainer [dynamicHeight]=\"dynamicHeight\"></aup-activity-container>\n</div>\n\n", styles: [":host{display:flex;flex-direction:column}:host>div{overflow:hidden}\n"], dependencies: [{ kind: "component", type: ActivityContainerComponent, selector: "aup-activity-container", inputs: ["dynamicHeight", "animationDuration"] }], animations: [
11112
+ slideDownWhenOpenAnimation
11113
+ ] });
11114
+ }
11115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SlideDownInteractionContextComponent, decorators: [{
11116
+ type: Component,
11117
+ args: [{ selector: "aup-slide-down-interaction-context", providers: [
11118
+ { provide: INTERACTION_CONTEXT, useExisting: SlideDownInteractionContextComponent }
11119
+ ], animations: [
11120
+ slideDownWhenOpenAnimation
11121
+ ], template: "<div [@slideDownWhenOpen]=\"getAnimationState()\" (@slideDownWhenOpen.done)=\"onAnimationDone()\" [style.max-height.px]=\"clampShut ? 0 : undefined\">\n <aup-activity-container #activityContainer [dynamicHeight]=\"dynamicHeight\"></aup-activity-container>\n</div>\n\n", styles: [":host{display:flex;flex-direction:column}:host>div{overflow:hidden}\n"] }]
11122
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
11123
+ type: Inject,
11124
+ args: [MAT_TABS_CONFIG]
11125
+ }, {
11126
+ type: Optional
11127
+ }] }]; }, propDecorators: { activityContainerComponent: [{
11128
+ type: ViewChild,
11129
+ args: ["activityContainer", { static: true }]
11130
+ }], dynamicHeight: [{
11131
+ type: Input
11132
+ }], active: [{
11133
+ type: HostBinding,
11134
+ args: ["class.active"]
11135
+ }] } });
11136
+
10225
11137
  class InteractionContextTriggerForDirective extends GarbageCollector {
10226
11138
  aupInteractionContextTriggerFor;
10227
11139
  activityClass;
@@ -10304,6 +11216,7 @@ class InteractionModule {
10304
11216
  AlertDialogComponent,
10305
11217
  ActivityOutletComponent,
10306
11218
  InPlaceInteractionContextComponent,
11219
+ SlideDownInteractionContextComponent,
10307
11220
  AddItemInteractionContextComponent,
10308
11221
  ActivityActionsComponent,
10309
11222
  PopupInteractionContextComponent,
@@ -10330,8 +11243,6 @@ class InteractionModule {
10330
11243
  RouterModule,
10331
11244
  MatIconModule,
10332
11245
  DirectivesModule,
10333
- FlexModule,
10334
- GridModule,
10335
11246
  ComponentsModule,
10336
11247
  FormsModule,
10337
11248
  MatInputModule,
@@ -10351,7 +11262,8 @@ class InteractionModule {
10351
11262
  InlineActivityTriggerComponent,
10352
11263
  ModalActivityTriggerComponent,
10353
11264
  AddCardActivityComponent,
10354
- InlineStringEditorComponent] });
11265
+ InlineStringEditorComponent,
11266
+ SlideDownInteractionContextComponent] });
10355
11267
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InteractionModule, providers: [
10356
11268
  InteractionService
10357
11269
  // {
@@ -10365,8 +11277,6 @@ class InteractionModule {
10365
11277
  RouterModule,
10366
11278
  MatIconModule,
10367
11279
  DirectivesModule,
10368
- FlexModule,
10369
- GridModule,
10370
11280
  ComponentsModule,
10371
11281
  FormsModule,
10372
11282
  MatInputModule,
@@ -10385,8 +11295,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10385
11295
  RouterModule,
10386
11296
  MatIconModule,
10387
11297
  DirectivesModule,
10388
- FlexModule,
10389
- GridModule,
10390
11298
  ComponentsModule,
10391
11299
  FormsModule,
10392
11300
  MatInputModule,
@@ -10401,6 +11309,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10401
11309
  AlertDialogComponent,
10402
11310
  ActivityOutletComponent,
10403
11311
  InPlaceInteractionContextComponent,
11312
+ SlideDownInteractionContextComponent,
10404
11313
  AddItemInteractionContextComponent,
10405
11314
  ActivityActionsComponent,
10406
11315
  PopupInteractionContextComponent,
@@ -10438,6 +11347,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10438
11347
  ModalActivityTriggerComponent,
10439
11348
  AddCardActivityComponent,
10440
11349
  InlineStringEditorComponent,
11350
+ SlideDownInteractionContextComponent,
10441
11351
  ],
10442
11352
  providers: [
10443
11353
  InteractionService
@@ -10508,7 +11418,6 @@ class PlaceOutletComponent extends DisposableComponent {
10508
11418
  router;
10509
11419
  placeRouter;
10510
11420
  placeConfig;
10511
- cdr;
10512
11421
  #animate$_accessor_storage = proxify((ValueModel));
10513
11422
  get animate$() { return this.#animate$_accessor_storage; }
10514
11423
  set animate$(value) { this.#animate$_accessor_storage = value; }
@@ -10542,12 +11451,11 @@ class PlaceOutletComponent extends DisposableComponent {
10542
11451
  animationEnabled;
10543
11452
  authorised;
10544
11453
  notAuthorisedNoticePortal;
10545
- constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet, cdr) {
11454
+ constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet) {
10546
11455
  super();
10547
11456
  this.router = router;
10548
11457
  this.placeRouter = placeRouter;
10549
11458
  this.placeConfig = placeConfig;
10550
- this.cdr = cdr;
10551
11459
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
10552
11460
  this.parentOutletModel = new MutableValueModel(parentOutlet);
10553
11461
  const defaultPlaceAnimationOrder = chain(this.parentOutletModel)
@@ -10559,7 +11467,7 @@ class PlaceOutletComponent extends DisposableComponent {
10559
11467
  this.placesInAnimationOrder = chain(this.customPlaceAnimationOrder$)
10560
11468
  .otherwise(defaultPlaceAnimationOrder);
10561
11469
  this.activePlaceAnimationPosition = this.placesInAnimationOrder
10562
- .reduce((placesInOrder) => {
11470
+ .reduceAll((placesInOrder) => {
10563
11471
  let placeIndex = 0;
10564
11472
  if (activatePlaceType.value) {
10565
11473
  placeIndex = placesInOrder.indexOf(activatePlaceType.value);
@@ -10713,8 +11621,8 @@ class PlaceOutletComponent extends DisposableComponent {
10713
11621
  this.onAnimationFinishedJob = undefined;
10714
11622
  }
10715
11623
  }
10716
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceOutletComponent, deps: [{ token: i1$4.Router }, { token: PlaceRouter }, { token: AUP_PLACE_CONFIG, optional: true }, { token: AUP_UNAUTHORISED_PLACE_NOTICE_COMPONENT, optional: true }, { token: PlaceOutletComponent, optional: true, skipSelf: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
10717
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: PlaceOutletComponent, selector: "aup-place-outlet", inputs: { animate$: "animate$", animate: "animate", customPlaceAnimationOrder$: ["placeAnimationOrderModel", "customPlaceAnimationOrder$"], customPlaceAnimationOrder: ["placeAnimationOrder", "customPlaceAnimationOrder"] }, outputs: { placeChanged: "placeChanged" }, host: { properties: { "class.authorised": "this.isAuthorised" } }, viewQueries: [{ propertyName: "routerOut", first: true, predicate: ["routeOutlet"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"animationEnabled.value\">\n <div class=\"router-outlet-container\"\n cdkScrollable\n [@routeAnimations]=\"{value: getAnimationOrder(), params:{duration: animationDuration}}\"\n (@routeAnimations.start)=\"animationStarted()\"\n (@routeAnimations.done)=\"animationDone()\"\n >\n <router-outlet #routerOutlet=\"outlet\"\n (activate)=\"onOutletActivated(routerOutlet, $event)\"\n (deactivate)=\"onOutletDeactivated()\">\n </router-outlet>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"!animationEnabled.value\">\n <div class=\"router-outlet-container\"\n cdkScrollable>\n <router-outlet #routerOutlet=\"outlet\"\n (activate)=\"onOutletActivated(routerOutlet, $event)\"\n (deactivate)=\"onOutletDeactivated()\">\n </router-outlet>\n </div>\n</ng-container>\n\n<div class=\"not-authorised-component-container\" *ngIf=\"!authorised.value\">\n <ng-template [cdkPortalOutlet]=\"notAuthorisedNoticePortal\"></ng-template>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-height:0}:host:not(.authorised) .router-outlet-container{display:none}.router-outlet-container{flex:1;display:block;position:relative;min-height:0;overflow-x:hidden;overflow-y:auto}router-outlet{display:none}.not-authorised-component-container{flex:1;display:grid;grid-template-columns:1fr;grid-template-rows:1fr}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$4.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i1$2.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "directive", type: i3$2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], animations: [LEFT_RIGHT_PLACE_ANIMATION] });
11624
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceOutletComponent, deps: [{ token: i1$5.Router }, { token: PlaceRouter }, { token: AUP_PLACE_CONFIG, optional: true }, { token: AUP_UNAUTHORISED_PLACE_NOTICE_COMPONENT, optional: true }, { token: PlaceOutletComponent, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Component });
11625
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: PlaceOutletComponent, selector: "aup-place-outlet", inputs: { animate$: "animate$", animate: "animate", customPlaceAnimationOrder$: ["placeAnimationOrderModel", "customPlaceAnimationOrder$"], customPlaceAnimationOrder: ["placeAnimationOrder", "customPlaceAnimationOrder"] }, outputs: { placeChanged: "placeChanged" }, host: { properties: { "class.authorised": "this.isAuthorised" } }, viewQueries: [{ propertyName: "routerOut", first: true, predicate: ["routeOutlet"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"animationEnabled.value\">\n <div class=\"router-outlet-container\"\n cdkScrollable\n [@routeAnimations]=\"{value: getAnimationOrder(), params:{duration: animationDuration}}\"\n (@routeAnimations.start)=\"animationStarted()\"\n (@routeAnimations.done)=\"animationDone()\"\n >\n <router-outlet #routerOutlet=\"outlet\"\n (activate)=\"onOutletActivated(routerOutlet, $event)\"\n (deactivate)=\"onOutletDeactivated()\">\n </router-outlet>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"!animationEnabled.value\">\n <div class=\"router-outlet-container\"\n cdkScrollable>\n <router-outlet #routerOutlet=\"outlet\"\n (activate)=\"onOutletActivated(routerOutlet, $event)\"\n (deactivate)=\"onOutletDeactivated()\">\n </router-outlet>\n </div>\n</ng-container>\n\n<div class=\"not-authorised-component-container\" *ngIf=\"!authorised.value\">\n <ng-template [cdkPortalOutlet]=\"notAuthorisedNoticePortal\"></ng-template>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-height:0}:host:not(.authorised) .router-outlet-container{display:none}.router-outlet-container{flex:1;display:block;position:relative;min-height:0;overflow-x:hidden;overflow-y:auto}router-outlet{display:none}.not-authorised-component-container{flex:1;display:grid;grid-template-columns:1fr;grid-template-rows:1fr}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$5.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i1$2.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "directive", type: i1$4.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], animations: [LEFT_RIGHT_PLACE_ANIMATION] });
10718
11626
  }
10719
11627
  __decorate([
10720
11628
  Proxify(),
@@ -10735,7 +11643,7 @@ __decorate([
10735
11643
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceOutletComponent, decorators: [{
10736
11644
  type: Component,
10737
11645
  args: [{ selector: 'aup-place-outlet', animations: [LEFT_RIGHT_PLACE_ANIMATION], template: "<ng-container *ngIf=\"animationEnabled.value\">\n <div class=\"router-outlet-container\"\n cdkScrollable\n [@routeAnimations]=\"{value: getAnimationOrder(), params:{duration: animationDuration}}\"\n (@routeAnimations.start)=\"animationStarted()\"\n (@routeAnimations.done)=\"animationDone()\"\n >\n <router-outlet #routerOutlet=\"outlet\"\n (activate)=\"onOutletActivated(routerOutlet, $event)\"\n (deactivate)=\"onOutletDeactivated()\">\n </router-outlet>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"!animationEnabled.value\">\n <div class=\"router-outlet-container\"\n cdkScrollable>\n <router-outlet #routerOutlet=\"outlet\"\n (activate)=\"onOutletActivated(routerOutlet, $event)\"\n (deactivate)=\"onOutletDeactivated()\">\n </router-outlet>\n </div>\n</ng-container>\n\n<div class=\"not-authorised-component-container\" *ngIf=\"!authorised.value\">\n <ng-template [cdkPortalOutlet]=\"notAuthorisedNoticePortal\"></ng-template>\n</div>\n", styles: [":host{display:flex;flex-direction:column;min-height:0}:host:not(.authorised) .router-outlet-container{display:none}.router-outlet-container{flex:1;display:block;position:relative;min-height:0;overflow-x:hidden;overflow-y:auto}router-outlet{display:none}.not-authorised-component-container{flex:1;display:grid;grid-template-columns:1fr;grid-template-rows:1fr}\n"] }]
10738
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: PlaceRouter }, { type: undefined, decorators: [{
11646
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: PlaceRouter }, { type: undefined, decorators: [{
10739
11647
  type: Optional
10740
11648
  }, {
10741
11649
  type: Inject,
@@ -10749,7 +11657,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10749
11657
  type: SkipSelf
10750
11658
  }, {
10751
11659
  type: Optional
10752
- }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { animate$: [{
11660
+ }] }]; }, propDecorators: { animate$: [{
10753
11661
  type: Input
10754
11662
  }], animate: [{
10755
11663
  type: Input
@@ -10882,7 +11790,7 @@ class ListPlaceNavComponent extends AbstractPlaceNavigationComponent {
10882
11790
  super(router);
10883
11791
  }
10884
11792
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ListPlaceNavComponent, deps: [{ token: PlaceRouter }], target: i0.ɵɵFactoryTarget.Component });
10885
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ListPlaceNavComponent, selector: "aup-list-place-nav", usesInheritance: true, ngImport: i0, template: "<mat-nav-list fxFlex>\n <a mat-list-item *ngFor=\"let item of menuItems.value; trackBy: trackByPlaceDef\"\n aup-gc #gc=\"aup-gc\"\n [pectinCommand]=\"commandFactory.create(item.place, {disposedWith: gc})\"\n [class.active]=\"item.active\"\n [matTooltip]=\"getNavigationFace(item.place).tooltip()\">\n <aup-command-face [faces]=\"[getNavigationFace(item.place)]\"></aup-command-face>\n </a>\n</mat-nav-list>\n", styles: [":host{display:flex;flex-direction:column;--selected-border-color: #838383;--selected-color: inherit;--selected-background: #f1f1f1}mat-nav-list{padding-top:0}a{border-right:2px solid transparent}a.active{border-right:2px solid var(--selected-border-color);background:var(--selected-background);color:var(--selected-color)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3$3.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i3$3.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: GarbageCollectorDirective, selector: "[aup-gc]", exportAs: ["aup-gc"] }, { kind: "directive", type: i7$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
11793
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ListPlaceNavComponent, selector: "aup-list-place-nav", usesInheritance: true, ngImport: i0, template: "<mat-nav-list fxFlex>\n <a mat-list-item *ngFor=\"let item of menuItems.value; trackBy: trackByPlaceDef\"\n aup-gc #gc=\"aup-gc\"\n [pectinCommand]=\"commandFactory.create(item.place, {disposedWith: gc})\"\n [class.active]=\"item.active\"\n [matTooltip]=\"getNavigationFace(item.place).tooltip()\">\n <aup-command-face [faces]=\"[getNavigationFace(item.place)]\"></aup-command-face>\n </a>\n</mat-nav-list>\n", styles: [":host{display:flex;flex-direction:column;--selected-border-color: #838383;--selected-color: inherit;--selected-background: #f1f1f1}mat-nav-list{padding-top:0}a{border-right:2px solid transparent}a.active{border-right:2px solid var(--selected-border-color);background:var(--selected-background);color:var(--selected-color)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3$3.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i3$3.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: GarbageCollectorDirective, selector: "[aup-gc]", exportAs: ["aup-gc"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
10886
11794
  }
10887
11795
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ListPlaceNavComponent, decorators: [{
10888
11796
  type: Component,
@@ -10957,7 +11865,7 @@ class SidePlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10957
11865
  this.expanded = !this.expanded;
10958
11866
  }
10959
11867
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SidePlaceNavigationComponent, deps: [{ token: PlaceRouter }], target: i0.ɵɵFactoryTarget.Component });
10960
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SidePlaceNavigationComponent, selector: "aup-side-place-navigation", inputs: { expanded$: "expanded$", expanded: "expanded" }, host: { properties: { "class.expanded": "this.expanded" } }, queries: [{ propertyName: "navEndTemplate", first: true, predicate: ["navEndTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-nav-list>\n <a mat-list-item (click)=\"toggleMenu()\">\n <aup-icon matListItemIcon [icon]=\"homeIcon$.value\"></aup-icon>\n <span matListItemTitle class=\"expanded-only\">Menu</span>\n </a>\n <a *ngFor=\"let item of menuItems.value; trackBy: trackByPlaceDef\"\n mat-list-item\n [pectinCommand]=\"commandFactory.create(item.place, {disposedWith: gc})\"\n [activated]=\"item.active\"\n aup-gc #gc=\"aup-gc\"\n [matTooltip]=\"getNavigationFace(item.place).tooltip()\"\n >\n <aup-icon matListItemIcon *ngIf=\"getNavigationFace(item.place).icon()\" [icon]=\"getNavigationFace(item.place).icon()\"></aup-icon>\n <span matListItemTitle class=\"expanded-only\">{{getNavigationFace(item.place).text()}}</span>\n </a>\n <span [style.flex]=\"1\"></span>\n <ng-container *ngIf=\"navEndTemplate\" [ngTemplateOutlet]=\"navEndTemplate\"></ng-container>\n</mat-nav-list>\n", styles: [":host{display:flex;flex-direction:column;--resolved-nav-item-width: var(--nav-width, 56px);--resolved-expanded-width: var(--nav-expanded-width, 235px);--resolved-color: var(--nav-color, rgba(255, 255, 255, .9));--resolved-background-color: var(--nav-background-color, #555);color:var(--resolved-color);background-color:var(--resolved-background-color);width:var(--resolved-nav-item-width);transition:width 125ms linear}:host.expanded{width:var(--resolved-expanded-width);max-width:var(--resolved-expanded-width)}:host aup-icon{margin-right:12px}:host>mat-nav-list{flex:1;display:flex;flex-direction:column;padding:0}:host .mat-mdc-list-item,:host .mat-mdc-list-item-icon,:host .mat-mdc-list-item-icon.activated,:host .mdc-list-item__primary-text{color:var(--resolved-color)}:host .mdc-list-item--activated .mdc-list-item__primary-text,:host .mdc-list-item--activated .mat-mdc-list-item-icon{color:var(--resolved-color)}:host .mdc-list-item--activated{background-color:#444}:host *.flip-horizontal{transform:scaleX(-1)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3$3.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i3$3.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i3$3.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i3$3.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: GarbageCollectorDirective, selector: "[aup-gc]", exportAs: ["aup-gc"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }] });
11868
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SidePlaceNavigationComponent, selector: "aup-side-place-navigation", inputs: { expanded$: "expanded$", expanded: "expanded" }, host: { properties: { "class.expanded": "this.expanded" } }, queries: [{ propertyName: "navEndTemplate", first: true, predicate: ["navEndTemplate"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<mat-nav-list>\n <a mat-list-item (click)=\"toggleMenu()\">\n <aup-icon matListItemIcon [icon]=\"homeIcon$.value\"></aup-icon>\n <span matListItemTitle class=\"expanded-only\">Menu</span>\n </a>\n <a *ngFor=\"let item of menuItems.value; trackBy: trackByPlaceDef\"\n mat-list-item\n [pectinCommand]=\"commandFactory.create(item.place, {disposedWith: gc})\"\n [activated]=\"item.active\"\n aup-gc #gc=\"aup-gc\"\n [matTooltip]=\"getNavigationFace(item.place).tooltip()\"\n >\n <aup-icon matListItemIcon *ngIf=\"getNavigationFace(item.place).icon()\" [icon]=\"getNavigationFace(item.place).icon()\"></aup-icon>\n <span matListItemTitle class=\"expanded-only\">{{getNavigationFace(item.place).text()}}</span>\n </a>\n <span [style.flex]=\"1\"></span>\n <ng-container *ngIf=\"navEndTemplate\" [ngTemplateOutlet]=\"navEndTemplate\"></ng-container>\n</mat-nav-list>\n", styles: [":host{display:flex;flex-direction:column;--resolved-nav-item-width: var(--nav-width, 56px);--resolved-expanded-width: var(--nav-expanded-width, 235px);--resolved-color: var(--nav-color, rgba(255, 255, 255, .9));--resolved-background-color: var(--nav-background-color, #555);color:var(--resolved-color);background-color:var(--resolved-background-color);width:var(--resolved-nav-item-width);transition:width 125ms linear}:host.expanded{width:var(--resolved-expanded-width);max-width:var(--resolved-expanded-width)}:host aup-icon{margin-right:12px}:host>mat-nav-list{flex:1;display:flex;flex-direction:column;padding:0}:host .mat-mdc-list-item,:host .mat-mdc-list-item-icon,:host .mat-mdc-list-item-icon.activated,:host .mdc-list-item--with-leading-icon:hover .mdc-list-item__start,:host .mdc-list-item__primary-text{color:var(--resolved-color)}:host .mdc-list-item--activated .mdc-list-item__primary-text,:host .mdc-list-item--activated .mat-mdc-list-item-icon{color:var(--resolved-color)}:host .mdc-list-item:hover{background-color:#444}:host .mdc-list-item:hover .mdc-list-item__primary-text{color:var(--resolved-color)}:host .mdc-list-item--activated{background-color:#444}:host *.flip-horizontal{transform:scaleX(-1)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3$3.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i3$3.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "directive", type: i3$3.MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "directive", type: i3$3.MatListItemTitle, selector: "[matListItemTitle]" }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: GarbageCollectorDirective, selector: "[aup-gc]", exportAs: ["aup-gc"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }] });
10961
11869
  }
10962
11870
  __decorate([
10963
11871
  Proxify(),
@@ -10969,7 +11877,7 @@ __decorate([
10969
11877
  ], SidePlaceNavigationComponent.prototype, "expanded", null);
10970
11878
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SidePlaceNavigationComponent, decorators: [{
10971
11879
  type: Component,
10972
- args: [{ selector: 'aup-side-place-navigation', template: "<mat-nav-list>\n <a mat-list-item (click)=\"toggleMenu()\">\n <aup-icon matListItemIcon [icon]=\"homeIcon$.value\"></aup-icon>\n <span matListItemTitle class=\"expanded-only\">Menu</span>\n </a>\n <a *ngFor=\"let item of menuItems.value; trackBy: trackByPlaceDef\"\n mat-list-item\n [pectinCommand]=\"commandFactory.create(item.place, {disposedWith: gc})\"\n [activated]=\"item.active\"\n aup-gc #gc=\"aup-gc\"\n [matTooltip]=\"getNavigationFace(item.place).tooltip()\"\n >\n <aup-icon matListItemIcon *ngIf=\"getNavigationFace(item.place).icon()\" [icon]=\"getNavigationFace(item.place).icon()\"></aup-icon>\n <span matListItemTitle class=\"expanded-only\">{{getNavigationFace(item.place).text()}}</span>\n </a>\n <span [style.flex]=\"1\"></span>\n <ng-container *ngIf=\"navEndTemplate\" [ngTemplateOutlet]=\"navEndTemplate\"></ng-container>\n</mat-nav-list>\n", styles: [":host{display:flex;flex-direction:column;--resolved-nav-item-width: var(--nav-width, 56px);--resolved-expanded-width: var(--nav-expanded-width, 235px);--resolved-color: var(--nav-color, rgba(255, 255, 255, .9));--resolved-background-color: var(--nav-background-color, #555);color:var(--resolved-color);background-color:var(--resolved-background-color);width:var(--resolved-nav-item-width);transition:width 125ms linear}:host.expanded{width:var(--resolved-expanded-width);max-width:var(--resolved-expanded-width)}:host aup-icon{margin-right:12px}:host>mat-nav-list{flex:1;display:flex;flex-direction:column;padding:0}:host .mat-mdc-list-item,:host .mat-mdc-list-item-icon,:host .mat-mdc-list-item-icon.activated,:host .mdc-list-item__primary-text{color:var(--resolved-color)}:host .mdc-list-item--activated .mdc-list-item__primary-text,:host .mdc-list-item--activated .mat-mdc-list-item-icon{color:var(--resolved-color)}:host .mdc-list-item--activated{background-color:#444}:host *.flip-horizontal{transform:scaleX(-1)}\n"] }]
11880
+ args: [{ selector: 'aup-side-place-navigation', template: "<mat-nav-list>\n <a mat-list-item (click)=\"toggleMenu()\">\n <aup-icon matListItemIcon [icon]=\"homeIcon$.value\"></aup-icon>\n <span matListItemTitle class=\"expanded-only\">Menu</span>\n </a>\n <a *ngFor=\"let item of menuItems.value; trackBy: trackByPlaceDef\"\n mat-list-item\n [pectinCommand]=\"commandFactory.create(item.place, {disposedWith: gc})\"\n [activated]=\"item.active\"\n aup-gc #gc=\"aup-gc\"\n [matTooltip]=\"getNavigationFace(item.place).tooltip()\"\n >\n <aup-icon matListItemIcon *ngIf=\"getNavigationFace(item.place).icon()\" [icon]=\"getNavigationFace(item.place).icon()\"></aup-icon>\n <span matListItemTitle class=\"expanded-only\">{{getNavigationFace(item.place).text()}}</span>\n </a>\n <span [style.flex]=\"1\"></span>\n <ng-container *ngIf=\"navEndTemplate\" [ngTemplateOutlet]=\"navEndTemplate\"></ng-container>\n</mat-nav-list>\n", styles: [":host{display:flex;flex-direction:column;--resolved-nav-item-width: var(--nav-width, 56px);--resolved-expanded-width: var(--nav-expanded-width, 235px);--resolved-color: var(--nav-color, rgba(255, 255, 255, .9));--resolved-background-color: var(--nav-background-color, #555);color:var(--resolved-color);background-color:var(--resolved-background-color);width:var(--resolved-nav-item-width);transition:width 125ms linear}:host.expanded{width:var(--resolved-expanded-width);max-width:var(--resolved-expanded-width)}:host aup-icon{margin-right:12px}:host>mat-nav-list{flex:1;display:flex;flex-direction:column;padding:0}:host .mat-mdc-list-item,:host .mat-mdc-list-item-icon,:host .mat-mdc-list-item-icon.activated,:host .mdc-list-item--with-leading-icon:hover .mdc-list-item__start,:host .mdc-list-item__primary-text{color:var(--resolved-color)}:host .mdc-list-item--activated .mdc-list-item__primary-text,:host .mdc-list-item--activated .mat-mdc-list-item-icon{color:var(--resolved-color)}:host .mdc-list-item:hover{background-color:#444}:host .mdc-list-item:hover .mdc-list-item__primary-text{color:var(--resolved-color)}:host .mdc-list-item--activated{background-color:#444}:host *.flip-horizontal{transform:scaleX(-1)}\n"] }]
10973
11881
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { expanded$: [{
10974
11882
  type: Input
10975
11883
  }], expanded: [{
@@ -10987,7 +11895,7 @@ class TabbedPlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10987
11895
  super(router);
10988
11896
  }
10989
11897
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TabbedPlaceNavigationComponent, deps: [{ token: PlaceRouter }], target: i0.ɵɵFactoryTarget.Component });
10990
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TabbedPlaceNavigationComponent, selector: "aup-tabbed-place-navigation", usesInheritance: true, ngImport: i0, template: "<nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n <ng-content select=\"[nav-start]\"></ng-content>\n <a mat-tab-link *ngFor=\"let item of menuItems.value; trackBy: trackByPlaceDef\"\n aup-gc #gc=\"aup-gc\"\n [pectinCommand]=\"commandFactory.create(item.place, {disposedWith: gc})\"\n [active]=\"item.active\"\n [matTooltip]=\"getNavigationFace(item.place).tooltip()\">\n <aup-command-face [faces]=\"[getNavigationFace(item.place)]\"></aup-command-face>\n </a>\n <ng-content select=\"[nav-end]\"></ng-content>\n</nav>\n<mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n", styles: [":host{display:block}div.place-holder{border:1px solid green}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3$1.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "animationDuration"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i3$1.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i3$1.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["disabled", "disableRipple", "tabIndex", "active", "id"], exportAs: ["matTabLink"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: GarbageCollectorDirective, selector: "[aup-gc]", exportAs: ["aup-gc"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
11898
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TabbedPlaceNavigationComponent, selector: "aup-tabbed-place-navigation", usesInheritance: true, ngImport: i0, template: "<nav mat-tab-nav-bar [tabPanel]=\"tabPanel\">\n <ng-content select=\"[nav-start]\"></ng-content>\n <a mat-tab-link *ngFor=\"let item of menuItems.value; trackBy: trackByPlaceDef\"\n aup-gc #gc=\"aup-gc\"\n [pectinCommand]=\"commandFactory.create(item.place, {disposedWith: gc})\"\n [active]=\"item.active\"\n [matTooltip]=\"getNavigationFace(item.place).tooltip()\">\n <aup-command-face [faces]=\"[getNavigationFace(item.place)]\"></aup-command-face>\n </a>\n <ng-content select=\"[nav-end]\"></ng-content>\n</nav>\n<mat-tab-nav-panel #tabPanel></mat-tab-nav-panel>\n", styles: [":host{display:block}div.place-holder{border:1px solid green}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3$2.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "animationDuration"], exportAs: ["matTabNavBar", "matTabNav"] }, { kind: "component", type: i3$2.MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: ["id"], exportAs: ["matTabNavPanel"] }, { kind: "component", type: i3$2.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["disabled", "disableRipple", "tabIndex", "active", "id"], exportAs: ["matTabLink"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: GarbageCollectorDirective, selector: "[aup-gc]", exportAs: ["aup-gc"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
10991
11899
  }
10992
11900
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TabbedPlaceNavigationComponent, decorators: [{
10993
11901
  type: Component,
@@ -11010,7 +11918,6 @@ class PlaceModule {
11010
11918
  MatTooltipModule,
11011
11919
  MatIconModule,
11012
11920
  DirectivesModule,
11013
- FlexModule,
11014
11921
  ComponentsModule,
11015
11922
  PortalModule,
11016
11923
  MatCardModule], exports: [PlaceOutletComponent,
@@ -11027,7 +11934,6 @@ class PlaceModule {
11027
11934
  MatTooltipModule,
11028
11935
  MatIconModule,
11029
11936
  DirectivesModule,
11030
- FlexModule,
11031
11937
  ComponentsModule,
11032
11938
  PortalModule,
11033
11939
  MatCardModule] });
@@ -11045,7 +11951,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11045
11951
  MatTooltipModule,
11046
11952
  MatIconModule,
11047
11953
  DirectivesModule,
11048
- FlexModule,
11049
11954
  ComponentsModule,
11050
11955
  PortalModule,
11051
11956
  MatCardModule
@@ -11135,60 +12040,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11135
12040
  }]
11136
12041
  }] });
11137
12042
 
11138
- const slideDownOnEnterDef = style({
11139
- opacity: 0,
11140
- 'height': '0',
11141
- paddingTop: '0',
11142
- paddingBottom: '0'
11143
- });
11144
- // TODO: params aren't getting customised in the view. Need to figure out the correct approach.
11145
- const slideDownOnEnterAnimation = trigger('slideDownOnEnter', [
11146
- transition(':enter', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
11147
- transition(':leave', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
11148
- ]);
11149
- const slideLeftOnEnterDef = style({
11150
- opacity: 0,
11151
- 'width': '0',
11152
- paddingLeft: '0',
11153
- paddingRight: '0'
11154
- });
11155
- const slideRightOnEnterAnimation = trigger('slideRightOnEnter', [
11156
- transition(':enter', [slideLeftOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
11157
- transition(':leave', [animate('{{duration}}', slideLeftOnEnterDef)], { params: { duration: '100ms' } })
11158
- ]);
11159
- const ZERO_WIDTH = {
11160
- opacity: 0,
11161
- width: '0',
11162
- paddingLeft: '0',
11163
- paddingRight: '0',
11164
- };
11165
- const ZERO_HEIGHT = {
11166
- opacity: 0,
11167
- height: '0',
11168
- paddingTop: '0',
11169
- paddingBottom: '0',
11170
- };
11171
- const slideDownAndRightOnEnterAnimation = trigger('slideDownAndRightOnEnter', [
11172
- transition(':enter', [
11173
- style({ overflow: "hidden", whiteSpace: "nowrap", ...ZERO_WIDTH, ...ZERO_HEIGHT }),
11174
- animate('{{duration}}')
11175
- ], { params: { duration: '100ms' } }),
11176
- transition(':leave', [
11177
- style({ overflow: "hidden", whiteSpace: "nowrap" }),
11178
- group([
11179
- animate('{{duration}}', style(ZERO_HEIGHT)),
11180
- // Hack: 100ms is too quick as it animates from * - 0 as we only see it animate the width is greater than the parent.
11181
- // Not sure how to animate from * to natural new width of parent. This hack won't work for text that's just a little
11182
- // bit wider than the parent as it'll fall within the parent bounds very early in the animation cycle.
11183
- animate('300ms', style(ZERO_WIDTH)),
11184
- ])
11185
- ], { params: { duration: '100ms' } })
11186
- ]);
11187
-
11188
12043
  /**
11189
12044
  * @file Automatically generated by barrelsby.
11190
12045
  */
11191
12046
 
12047
+ class ResizeObserverDirective extends DisposableComponent {
12048
+ aupOnResize = new EventEmitter();
12049
+ elementRef = this.inject(ElementRef);
12050
+ ngZone = this.inject(NgZone);
12051
+ _bounds$ = new MutableValueModel();
12052
+ ngAfterViewInit() {
12053
+ const element = this.elementRef.nativeElement;
12054
+ const ro = new ResizeObserver((entries, observer) => {
12055
+ this.ngZone.run(() => this._updateBounds());
12056
+ });
12057
+ ro.observe(element);
12058
+ this.onDispose(() => ro.disconnect());
12059
+ setTimeout(() => this._updateBounds());
12060
+ }
12061
+ get bounds$() {
12062
+ return this._bounds$.readonly$;
12063
+ }
12064
+ _updateBounds() {
12065
+ this._bounds$.value = Bounds.ofElement(this.elementRef.nativeElement);
12066
+ this.aupOnResize.emit(this._bounds$.value);
12067
+ }
12068
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
12069
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ResizeObserverDirective, isStandalone: true, selector: "[aupOnResize]", outputs: { aupOnResize: "aupOnResize" }, usesInheritance: true, ngImport: i0 });
12070
+ }
12071
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, decorators: [{
12072
+ type: Directive,
12073
+ args: [{
12074
+ selector: "[aupOnResize]",
12075
+ standalone: true
12076
+ }]
12077
+ }], propDecorators: { aupOnResize: [{
12078
+ type: Output
12079
+ }] } });
12080
+
11192
12081
  /**
11193
12082
  * @file Automatically generated by barrelsby.
11194
12083
  */
@@ -11279,7 +12168,7 @@ class DialogInteractionContextFactory extends ModalInteractionContextFactory {
11279
12168
  };
11280
12169
  return new DialogInteractionContext(identifier, api, this.dialogService, config);
11281
12170
  }
11282
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, deps: [{ token: i1$6.MatDialog }, { token: DIALOG_INTERACTION_SERVICE_DEFAULTS, optional: true }, { token: MAT_DIALOG_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
12171
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, deps: [{ token: i1$7.MatDialog }, { token: DIALOG_INTERACTION_SERVICE_DEFAULTS, optional: true }, { token: MAT_DIALOG_DEFAULT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
11283
12172
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, providedIn: 'root' });
11284
12173
  }
11285
12174
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, decorators: [{
@@ -11287,12 +12176,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11287
12176
  args: [{
11288
12177
  providedIn: 'root'
11289
12178
  }]
11290
- }], ctorParameters: function () { return [{ type: i1$6.MatDialog }, { type: i1$6.MatDialogConfig, decorators: [{
12179
+ }], ctorParameters: function () { return [{ type: i1$7.MatDialog }, { type: i1$7.MatDialogConfig, decorators: [{
11291
12180
  type: Optional
11292
12181
  }, {
11293
12182
  type: Inject,
11294
12183
  args: [DIALOG_INTERACTION_SERVICE_DEFAULTS]
11295
- }] }, { type: i1$6.MatDialogConfig, decorators: [{
12184
+ }] }, { type: i1$7.MatDialogConfig, decorators: [{
11296
12185
  type: Optional
11297
12186
  }, {
11298
12187
  type: Inject,
@@ -11412,13 +12301,14 @@ class PlaceGuard {
11412
12301
  }
11413
12302
  // @Trace()
11414
12303
  async canActivate(activatedRoute, state) {
12304
+ await this.placeRouter.waitUntilRouterReady();
11415
12305
  if (PlaceComponent.isPlaceComponentConstructor(activatedRoute.component)) {
11416
12306
  const placeDefinition = PlaceComponent.getDefinition(activatedRoute.component);
11417
12307
  if (placeDefinition.authenticate) {
11418
12308
  await this.placeRouter.authService.waitUntilAuthenticationReady();
11419
12309
  const authenticated = this.authService.isAuthenticated();
11420
12310
  if (!authenticated) {
11421
- const redirect = this.authService.getAuthenticationFailureRedirect(activatedRoute, state);
12311
+ const redirect = await this.authService.getAuthenticationFailureRedirect(activatedRoute, state);
11422
12312
  // const nextPlaceDef = this.getPlaceDefinition(redirect);
11423
12313
  if (redirect.requiresAuthentication()) {
11424
12314
  lang.illegalState(`onAuthenticationFailure hook returned place ${redirect.toDebugString()} that requires authentication.`);
@@ -11427,7 +12317,7 @@ class PlaceGuard {
11427
12317
  }
11428
12318
  await this.authService.waitUntilAuthorisationReadyFor(placeDefinition);
11429
12319
  if (!this.authService.isAuthorised(placeDefinition)) {
11430
- const nextRedirect = this.findBestAuthenticatedAlternative(placeDefinition, activatedRoute);
12320
+ const nextRedirect = await this.findBestAuthenticatedAlternative(placeDefinition, activatedRoute);
11431
12321
  return this.createUrlTree(nextRedirect);
11432
12322
  }
11433
12323
  }
@@ -11471,7 +12361,7 @@ class PlaceGuard {
11471
12361
  return lang.illegalState(`expected component to be an instance of PlaceComponent, got ${activatedRoute.component}`);
11472
12362
  }
11473
12363
  }
11474
- findBestAuthenticatedAlternative(placeDefinition, activatedRoute) {
12364
+ async findBestAuthenticatedAlternative(placeDefinition, activatedRoute) {
11475
12365
  let currentPlace = placeDefinition;
11476
12366
  while (!currentPlace.isRoot()) {
11477
12367
  currentPlace = currentPlace.parent;
@@ -11481,7 +12371,7 @@ class PlaceGuard {
11481
12371
  }
11482
12372
  }
11483
12373
  // Couldn't find an authorised ancestor so we check if there are router level defined alternatives
11484
- const alternativeRoutes = this.placeRouter.getAuthorisationFailureRedirectOptions(activatedRoute.component);
12374
+ const alternativeRoutes = await this.placeRouter.getAuthorisationFailureRedirectOptions(activatedRoute.component);
11485
12375
  if (alternativeRoutes.length < 1) {
11486
12376
  return lang.illegalState(`onAuthorisationFailure hook didn't return any alternate places`);
11487
12377
  }
@@ -11524,13 +12414,13 @@ class PlaceGuard {
11524
12414
  return next();
11525
12415
  }
11526
12416
  }
11527
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, deps: [{ token: i1$4.Router }, { token: UrlService }, { token: PlaceRouter }, { token: PlaceHistory }, { token: InteractionService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
12417
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, deps: [{ token: i1$5.Router }, { token: UrlService }, { token: PlaceRouter }, { token: PlaceHistory }, { token: InteractionService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
11528
12418
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, providedIn: 'root' });
11529
12419
  }
11530
12420
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, decorators: [{
11531
12421
  type: Injectable,
11532
12422
  args: [{ providedIn: 'root' }]
11533
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
12423
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
11534
12424
 
11535
12425
  var Formatter;
11536
12426
  (function (Formatter) {
@@ -11564,69 +12454,74 @@ var Formatter;
11564
12454
  Formatter.BOOLEAN = new BooleanType();
11565
12455
  })(Formatter || (Formatter = {}));
11566
12456
 
11567
- function installMechanics(parameterDef, prototype, propertyKey, tagPrefix) {
11568
- Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
11569
- function getMechanics(instance, propertyName) {
11570
- const key = `__mechanics_${propertyName.toString()}`;
11571
- if (!instance[key]) {
11572
- const backingModel = parameterDef.createBackingModel();
11573
- instance[key] = {
11574
- backingModel: backingModel,
11575
- binding: null
11576
- };
11577
- const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
11578
- DebugContext.getOrCreate(instance[key].backingModel).tag(tag);
11579
- }
11580
- return instance[key];
11581
- }
11582
- Object.defineProperty(prototype, propertyKey, {
11583
- get: function () {
11584
- return getMechanics(this, propertyKey).backingModel;
11585
- },
11586
- set: function (userModel) {
11587
- const mechanics = getMechanics(this, propertyKey);
11588
- // This handles the scenario where we want to push an existing value model (such as a form model)
11589
- // to and from the route.
11590
- if (mechanics.binding) {
11591
- mechanics.binding.dispose();
11592
- }
11593
- if (userModel) {
11594
- mechanics.binding = new Binding(mechanics.backingModel, userModel, {
11595
- toLeft: Functions.identity,
11596
- toRight: Functions.identity
11597
- });
11598
- if (parameterDef.isEmptyValue(userModel.value)) {
11599
- // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});
11600
- mechanics.binding.writeRight(); // push the visit into the user model;
11601
- }
11602
- else {
11603
- if (!parameterDef.isEmptyValue(mechanics.backingModel.value)) {
11604
- console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');
11605
- }
11606
- mechanics.binding.writeLeft(); // push the user model into the visit
11607
- }
11608
- }
11609
- }
11610
- });
11611
- }
12457
+ // function installMechanics<M extends HasValue<any>>(parameterDef: ParameterDefinition<any>, prototype: object, propertyKey: string | symbol, tagPrefix: string) {
12458
+ //
12459
+ // Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12460
+ //
12461
+ // function getMechanics(instance: M, propertyName: string | symbol) {
12462
+ // const key = `__mechanics_${propertyName.toString()}`;
12463
+ // if (!instance[key]) {
12464
+ // const backingModel = parameterDef.createBackingModel();
12465
+ // instance[key] = {
12466
+ // backingModel: backingModel,
12467
+ // binding: null as Binding<any, any>
12468
+ // };
12469
+ // const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
12470
+ // DebugContext.getOrCreate(instance[key].backingModel).tag(tag);
12471
+ // }
12472
+ // return instance[key];
12473
+ // }
12474
+ //
12475
+ // Object.defineProperty(prototype, propertyKey, {
12476
+ // get: function() {
12477
+ // return getMechanics(this, propertyKey).backingModel;
12478
+ // },
12479
+ // set: function(userModel: M) {
12480
+ // const mechanics = getMechanics(this, propertyKey);
12481
+ // // This handles the scenario where we want to push an existing value model (such as a form model)
12482
+ // // to and from the route.
12483
+ // if (mechanics.binding) {
12484
+ // mechanics.binding.dispose();
12485
+ // }
12486
+ // if (userModel) {
12487
+ // mechanics.binding = new Binding(mechanics.backingModel, userModel, {
12488
+ // toLeft: Functions.identity,
12489
+ // toRight: Functions.identity
12490
+ // });
12491
+ // if (parameterDef.isEmptyValue(userModel.value)) {
12492
+ // // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});
12493
+ // mechanics.binding.writeRight(); // push the visit into the user model;
12494
+ // } else {
12495
+ // if (!parameterDef.isEmptyValue(mechanics.backingModel.value)) {
12496
+ // console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');
12497
+ // }
12498
+ // mechanics.binding.writeLeft(); // push the user model into the visit
12499
+ // }
12500
+ // }
12501
+ // }
12502
+ // });
12503
+ // }
11612
12504
  function RouteId(formatter, options) {
11613
12505
  return (prototype, propertyKey) => {
11614
12506
  const parameterDef = new ParameterDefinition.RouteId(propertyKey.toString(), options, formatter);
11615
- installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12507
+ // installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12508
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
11616
12509
  };
11617
12510
  }
11618
12511
  function VisitParameter(options) {
11619
12512
  const opts = Opts.get(options);
11620
12513
  return (prototype, propertyKey) => {
11621
12514
  const parameterDef = new ParameterDefinition.ValueParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11622
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
12515
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12516
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
11623
12517
  };
11624
12518
  }
11625
12519
  function VisitParameterList(options) {
11626
12520
  const opts = Opts.get(options);
11627
12521
  return (prototype, propertyKey) => {
11628
12522
  const parameterDef = new ParameterDefinition.ArrayParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11629
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
12523
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12524
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
11630
12525
  };
11631
12526
  }
11632
12527
 
@@ -11720,5 +12615,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11720
12615
  * Generated bundle index. Do not edit.
11721
12616
  */
11722
12617
 
11723
- export { ACTIVITY_DATA, ALERT_CONFIG, AUP_PLACE_CONFIG, AUP_UNAUTHORISED_PLACE_NOTICE_COMPONENT, AbstractActivityTriggerComponent, AbstractCardContainerComponent, AbstractConfirmDialogComponent, AbstractDialogComponent, AbstractInputComponent, AbstractInteractionContext, AbstractListInputComponent, AbstractPlaceNavigationComponent, AbstractPopStateNavigation, AbstractPopupMenuComponent, AbstractTableComponent, AbstractTableModel, AbstractValueInputComponent, Activity, ActivityActionsComponent, ActivityBodyComponent, ActivityContainerComponent, ActivityOutletComponent, ActivityRef, ActivityTitleComponent, AddCardActivityComponent, AddItemInteractionContextComponent, Alert, AlertDialogComponent, AngularUiPowerupsModule, AutocompleteInputComponent, Bounds, BusyOverlayComponent, CELL_EDITOR_PORTAL, CELL_RENDERER_PORTAL, CardContainerComponent, CellEditorPortalRef, CellHeaderPortalRef, CellPortalRef, CellRendererPortalRef, CheckboxInputComponent, ColumnListModel, ColumnModel, ColumnTemplateDirective, ColumnTextSearchFormatter, CommandComponent, CommandContainer, CommandDirective, CommandFace, CommandFaceComponent, ComponentCellRendererPortalRef, ComponentsModule, ConfirmThenDialogComponent, ConfirmThenExecuteDialogComponent, ConfirmationDialogComponent, ConsolidatedParameterMap, CustomTemplateColumnModel, CustomValueColumnModel, DEFINITION_META_DATA_KEY, DIALOG_INTERACTION_SERVICE_DEFAULTS, DecoratedTreeNode, DefaultCellRendererComponent, DefaultHeaderCellRendererComponent, DialogInteractionContext, DialogInteractionContextFactory, Dimension, DirectivesModule, DisposableComponent, EditRowControlsComponent, EditSession, EditorControlColumnModel, EmptyStateComponent, EnableCellTextSearch, EventCleanUpSession, FlattenedTreeListModel, FlexComponent, FocusBinding, FocusBindingDirective, FocusBindingFactory, FocusContainerComponent, FocusableComponent, Formatter, GarbageCollectorDirective, HEADER_CELL_RENDERER_PORTAL, HighlightPipe, HighlightTextModelDirective, HorizontalAlignment, IconComponent, InPlaceInteractionContextComponent, InlineActivityTriggerComponent, InlineEditorModel, InlineStringEditorComponent, InputActivity, InteractionContextTriggerForDirective, InteractionModule, InteractionService, InteractionServiceRoutingAdapter, Keys, LEFT_RIGHT_PLACE_ANIMATION, LabelledValueComponent, ListPlaceNavComponent, ListPropertyColumnModel, LoadingContainerComponent, MarkdownComponent, MarkdownService, ModalActivityTriggerComponent, ModalInteractionContextFactory, MoreMenuComponent, MultipleSelectInputComponent, Navigating, NavigatingDuringInteraction, NavigationContext, NavigationSession, NoopAuthGuard, NoopComponent, NotAuthorisedNoticeComponent, NumberInputComponent, POPUP_CONTAINER, PORTAL_EDITOR_COMPONENT, PORTAL_RENDERER_COMPONENT, PaginatorComponent, ParameterDefinition, PasswordInputComponent, Place, PlaceAccessGuard, PlaceAuthService, PlaceComponent, PlaceComponentDeactivationHandler, PlaceDefinition, PlaceGuard, PlaceHistory, PlaceModule, PlaceOutletComponent, PlaceRouter, Point, PopStateDuringInteractionNavigation, PopStateNavigation, PopupActivityTriggerComponent, PopupAwareComponent, PopupInteractionContextComponent, PopupMenuComponent, PopupMenuRendererComponent, PropertyColumnModel, ROUTE_PARAMETER_LIST_KEY, RemoveLastInteractionFromUrlNavigationSession, ResizeAwareComponent, RouteId, ScrollContainerComponent, SectionHeaderComponent, SelectInputActivity, SelectInputComponent, SelectionCellComponent, SelectionColumnModel, SelectionHeaderCellComponent, SeparatorComponent, SidePlaceNavigationComponent, StringInputActivity, StringInputComponent, SwitchCaseComponent, SwitchCaseDefaultDirective, SwitchCaseOption, SwitchCaseWhenDirective, SynchroniseInteractionContextIdsWithRoute, TabbedPlaceNavigationComponent, TableBodyComponent, TableCellComponent, TableComponent, TableFilterModel, TableHeaderCellComponent, TableModel, TableMoreMenuComponent, TableMoreMenuPopupComponent, TableRowMenuComponent, TemplateCellRendererPortalRef, TextInputComponent, ToolBarComponent, Track, TreeExpansionModel, TreeInheritanceIconComponent, TreeLabelCellRendererComponent, TreeLabelColumnModel, TreeTableComponent, TreeTableModel, UrlService, UrlSnapshot, VerticalFocusContainerComponent, VisibilityService, Visit, VisitParameter, VisitParameterList, VisitSegment, VisitSegmentSanitiser, WaitUntilLeavingInteractionTransitionCancelled, WaitUntilLinkTriggeredNavigationInteractionCancellationTypeDetermined, WaitUntilPopStateDuringCanDeactivateInteractionFinishes, leftRightPlaceAnimation, markdownPillExtension, slideDownAndRightOnEnterAnimation, slideDownOnEnterAnimation, slideRightOnEnterAnimation, treeNodeDecorator };
12618
+ export { ACTIVITY_DATA, ALERT_CONFIG, AUP_PLACE_CONFIG, AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER, AUP_UNAUTHORISED_PLACE_NOTICE_COMPONENT, AbstractActivityTriggerComponent, AbstractCardContainerComponent, AbstractCellRenderer, AbstractConfirmDialogComponent, AbstractDialogComponent, AbstractInputComponent, AbstractInteractionContext, AbstractListInputComponent, AbstractPlaceNavigationComponent, AbstractPopStateNavigation, AbstractPopupMenuComponent, AbstractTableComponent, AbstractTableModel, AbstractValueInputComponent, Activity, ActivityActionsComponent, ActivityBodyComponent, ActivityContainerComponent, ActivityOutletComponent, ActivityRef, ActivityTitleComponent, AddCardActivityComponent, AddItemInteractionContextComponent, Alert, AlertDialogComponent, AngularUiPowerupsModule, AutocompleteInputComponent, Bounds, BusyOverlayComponent, CELL_EDITOR_PORTAL, CELL_RENDERER_PORTAL, CardContainerComponent, CellEditorPortalRef, CellFooterPortalRef, CellHeaderPortalRef, CellPortalRef, CellRendererPortalRef, CheckboxInputComponent, ColumnManager, ColumnModel, ColumnOrderManager, ColumnTemplateDirective, ColumnTextSearchFormatter, CommandComponent, CommandContainer, CommandDirective, CommandFace, CommandFaceComponent, ComponentCellRendererPortalRef, ComponentsModule, ConfirmThenDialogComponent, ConfirmThenExecuteDialogComponent, ConfirmationDialogComponent, ConsolidatedParameterMap, CustomTemplateColumnModel, CustomValueColumnModel, DEFINITION_META_DATA_KEY, DIALOG_INTERACTION_SERVICE_DEFAULTS, DecoratedTreeNode, DefaultCellRendererComponent, DefaultHeaderCellRendererComponent, DialogInteractionContext, DialogInteractionContextFactory, Dimension, DirectivesModule, DisposableComponent, EditRowControlsComponent, EditSession, EditorControlColumnModel, EmptyStateComponent, EnableCellTextSearch, EventCleanUpSession, FOOTER_CELL_RENDERER_PORTAL, FlattenedTreeListModel, FlexComponent, FocusBinding, FocusBindingDirective, FocusBindingFactory, FocusContainerComponent, FocusableComponent, FooterRowModel, Formatter, GarbageCollectorDirective, HEADER_CELL_RENDERER_PORTAL, HighlightPipe, HighlightTextModelDirective, HorizontalAlignment, INTERACTION_CONTEXT, INTERACTION_CONTEXT_PROVIDER, IconComponent, InPlaceInteractionContextComponent, InlineActivityTriggerComponent, InlineEditorModel, InlineStringEditorComponent, InputActivity, InteractionContextTriggerForDirective, InteractionModule, InteractionService, InteractionServiceRoutingAdapter, Keys, LEFT_RIGHT_PLACE_ANIMATION, LabelledValueComponent, ListPlaceNavComponent, ListPropertyColumnModel, LoadableComponent, LoadingContainerComponent, MarkdownComponent, MarkdownService, ModalActivityTriggerComponent, ModalInteractionContextFactory, MoreMenuComponent, MultipleSelectInputComponent, Navigating, NavigatingDuringInteraction, NavigationContext, NavigationSession, NoopAuthGuard, NoopComponent, NotAuthorisedNoticeComponent, NumberInputComponent, POPUP_CONTAINER, PORTAL_EDITOR_COMPONENT, PORTAL_RENDERER_COMPONENT, PaginatorComponent, ParameterDefinition, PasswordInputComponent, Place, PlaceAccessGuard, PlaceAuthService, PlaceComponent, PlaceComponentDeactivationHandler, PlaceDefinition, PlaceGuard, PlaceHistory, PlaceModule, PlaceOutletComponent, PlaceRouter, Point, PopStateDuringInteractionNavigation, PopStateNavigation, PopupActivityTriggerComponent, PopupAwareComponent, PopupInteractionContextComponent, PopupMenuComponent, PopupMenuRendererComponent, PropertyColumnModel, ROUTE_PARAMETER_LIST_KEY, RemoveLastInteractionFromUrlNavigationSession, ResizeAwareComponent, ResizeObserverDirective, RouteId, ScrollContainerComponent, SearchInputComponent, SectionHeaderComponent, SelectInputActivity, SelectInputComponent, SelectionCellComponent, SelectionColumnModel, SelectionHeaderCellComponent, SeparatorComponent, SidePlaceNavigationComponent, SlideDownInteractionContextComponent, StringInputActivity, StringInputComponent, SwitchCaseComponent, SwitchCaseDefaultDirective, SwitchCaseOption, SwitchCaseWhenDirective, SynchroniseInteractionContextIdsWithRoute, TabbedPlaceNavigationComponent, TableBodyComponent, TableCellComponent, TableComponent, TableFilterModel, TableFooterRow, TableHeaderCellComponent, TableModel, TableMoreMenuComponent, TableMoreMenuPopupComponent, TableRowAttributesDirective, TableRowMenuComponent, TemplateCellRendererPortalRef, TextInputComponent, TextSearchContext, ToolBarComponent, Track, TreeExpansionModel, TreeInheritanceIconComponent, TreeLabelCellRendererComponent, TreeLabelColumnModel, TreeTableComponent, TreeTableModel, UrlService, UrlSnapshot, VerticalFocusContainerComponent, VisibilityService, Visit, VisitParameter, VisitParameterList, VisitSegment, VisitSegmentSanitiser, WaitUntilLeavingInteractionTransitionCancelled, WaitUntilLinkTriggeredNavigationInteractionCancellationTypeDetermined, WaitUntilPopStateDuringCanDeactivateInteractionFinishes, leftRightPlaceAnimation, markdownPillExtension, slideDownAndRightOnEnterAnimation, slideDownOnEnterAnimation, slideDownWhenOpenAnimation, slideRightOnEnterAnimation, treeNodeDecorator };
11724
12619
  //# sourceMappingURL=coolon-angular-ui-powerups.mjs.map