@coolon/angular-ui-powerups 16.1.0-aplpha.12 → 16.1.0-aplpha.120

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 (178) hide show
  1. package/assets/activities/input-activities.scss +14 -6
  2. package/assets/form.scss +74 -27
  3. package/assets/icons.scss +1 -0
  4. package/assets/table.scss +47 -27
  5. package/assets/tabs.scss +2 -6
  6. package/esm2022/lib/animations/slide-animations.mjs +6 -1
  7. package/esm2022/lib/components/cards/card-container/card-container.component.mjs +4 -4
  8. package/esm2022/lib/components/commands/command/command.component.mjs +24 -10
  9. package/esm2022/lib/components/commands/command-face/command-face.component.mjs +11 -3
  10. package/esm2022/lib/components/commands/command-face.mjs +11 -11
  11. package/esm2022/lib/components/commands/group/popup-menu/abstract-popup-menu.component.mjs +11 -11
  12. package/esm2022/lib/components/commands/group/tool-bar/tool-bar.component.mjs +6 -4
  13. package/esm2022/lib/components/components.module.mjs +27 -8
  14. package/esm2022/lib/components/disposable-component.mjs +33 -40
  15. package/esm2022/lib/components/exports.mjs +9 -2
  16. package/esm2022/lib/components/forms/abstract-input.component.mjs +55 -12
  17. package/esm2022/lib/components/forms/autocomplete-input/autocomplete-input.component.mjs +2 -2
  18. package/esm2022/lib/components/forms/checkbox-input/checkbox-input.component.mjs +8 -6
  19. package/esm2022/lib/components/forms/form-field.mjs +2 -0
  20. package/esm2022/lib/components/forms/multiple-select-input/multiple-select-input.component.mjs +2 -2
  21. package/esm2022/lib/components/forms/number-input/number-input.component.mjs +49 -10
  22. package/esm2022/lib/components/forms/password-input/password-input.component.mjs +40 -3
  23. package/esm2022/lib/components/forms/search-input/search-input.component.mjs +33 -0
  24. package/esm2022/lib/components/forms/select-input/select-input.component.mjs +11 -10
  25. package/esm2022/lib/components/forms/string-input/string-input.component.mjs +21 -9
  26. package/esm2022/lib/components/icon/icon.component.mjs +7 -4
  27. package/esm2022/lib/components/loadable-component.mjs +49 -0
  28. package/esm2022/lib/components/resize-aware.component.mjs +61 -24
  29. package/esm2022/lib/components/switch-case/switch-case.component.mjs +5 -7
  30. package/esm2022/lib/components/tables/abstract-table-model.mjs +69 -27
  31. package/esm2022/lib/components/tables/abstract-table.component.mjs +19 -5
  32. package/esm2022/lib/components/tables/column/column-manager.mjs +81 -0
  33. package/esm2022/lib/components/tables/column/column-model.mjs +13 -3
  34. package/esm2022/lib/components/tables/column/column-order-manager.mjs +19 -0
  35. package/esm2022/lib/components/tables/column/custom-template-column-model.mjs +3 -3
  36. package/esm2022/lib/components/tables/column/custom-value-column-model.mjs +3 -3
  37. package/esm2022/lib/components/tables/column/editor-controls-column-model.mjs +3 -3
  38. package/esm2022/lib/components/tables/column/list-propery-column-model.mjs +3 -3
  39. package/esm2022/lib/components/tables/column/property-column-model.mjs +3 -3
  40. package/esm2022/lib/components/tables/column/selection-column-model.mjs +3 -3
  41. package/esm2022/lib/components/tables/editor/edit-row-controls/edit-row-controls.component.mjs +1 -1
  42. package/esm2022/lib/components/tables/editor/edit-session.mjs +3 -1
  43. package/esm2022/lib/components/tables/filter/table-filter-model.mjs +4 -2
  44. package/esm2022/lib/components/tables/filter/text-search-predicate.mjs +16 -2
  45. package/esm2022/lib/components/tables/footer/footer-row-model.mjs +38 -0
  46. package/esm2022/lib/components/tables/renderer/abstract-cell-renderer.mjs +7 -0
  47. package/esm2022/lib/components/tables/renderer/cell-portal-ref.mjs +19 -1
  48. package/esm2022/lib/components/tables/renderer/default-cell-renderer/default-cell-renderer.component.mjs +3 -3
  49. package/esm2022/lib/components/tables/renderer/select-header-cell/selection-header-cell.component.mjs +3 -2
  50. package/esm2022/lib/components/tables/renderer/table-body/table-body.component.mjs +150 -40
  51. package/esm2022/lib/components/tables/renderer/table-cell/table-cell.component.mjs +1 -1
  52. package/esm2022/lib/components/tables/renderer/table-footer-row/table-footer-row.component.mjs +30 -0
  53. package/esm2022/lib/components/tables/renderer/table-more-menu/table-more-menu.component.mjs +7 -2
  54. package/esm2022/lib/components/tables/table/table-model.mjs +1 -1
  55. package/esm2022/lib/components/tables/table/table.component.mjs +39 -61
  56. package/esm2022/lib/components/tables/tree-table/decorated-tree-node.mjs +5 -4
  57. package/esm2022/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.mjs +1 -1
  58. package/esm2022/lib/components/tables/tree-table/tree-label-column-model.mjs +3 -3
  59. package/esm2022/lib/components/tables/tree-table/tree-table-component.mjs +12 -5
  60. package/esm2022/lib/components/tables/tree-table/tree-table-model.mjs +4 -4
  61. package/esm2022/lib/components/text/markdown/markdown.component.mjs +2 -2
  62. package/esm2022/lib/directives/directives.module.mjs +1 -1
  63. package/esm2022/lib/directives/exports.mjs +2 -1
  64. package/esm2022/lib/directives/highlight.pipe.mjs +2 -2
  65. package/esm2022/lib/directives/resize-observer.directive.mjs +40 -0
  66. package/esm2022/lib/interaction/activity.mjs +3 -4
  67. package/esm2022/lib/interaction/alert.mjs +2 -2
  68. package/esm2022/lib/interaction/components/abstract-confirm-dialog.component.mjs +8 -4
  69. package/esm2022/lib/interaction/components/activity-actions/activity-actions.component.mjs +20 -11
  70. package/esm2022/lib/interaction/components/activity-container/activity-container.component.mjs +28 -11
  71. package/esm2022/lib/interaction/components/activity-title/activity-title.component.mjs +4 -4
  72. package/esm2022/lib/interaction/components/activity-triggers/inline-activity-trigger/inline-activity-trigger.component.mjs +1 -1
  73. package/esm2022/lib/interaction/components/add-card-activity/add-card-activity.component.mjs +1 -1
  74. package/esm2022/lib/interaction/components/add-item-interaction-context/add-item-interaction-context.component.mjs +1 -1
  75. package/esm2022/lib/interaction/components/alert-dialog/alert-dialog.component.mjs +1 -1
  76. package/esm2022/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.mjs +1 -1
  77. package/esm2022/lib/interaction/components/confirm-then-execute-dialog/confirm-then-execute-dialog.component.mjs +1 -1
  78. package/esm2022/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.mjs +1 -1
  79. package/esm2022/lib/interaction/components/editors/edit-context.mjs +1 -1
  80. package/esm2022/lib/interaction/components/editors/inline-string-editor/inline-string-editor.component.mjs +3 -3
  81. package/esm2022/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.mjs +21 -5
  82. package/esm2022/lib/interaction/components/input-activities/input-activity.mjs +2 -2
  83. package/esm2022/lib/interaction/components/input-activities/select-input-activity.mjs +4 -2
  84. package/esm2022/lib/interaction/components/input-activities/string-input-activity.mjs +8 -4
  85. package/esm2022/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.mjs +134 -0
  86. package/esm2022/lib/interaction/directives/interaction-context-trigger-for.directive.mjs +2 -2
  87. package/esm2022/lib/interaction/exports.mjs +2 -1
  88. package/esm2022/lib/interaction/interaction-context.mjs +3 -2
  89. package/esm2022/lib/interaction/interaction.module.mjs +7 -9
  90. package/esm2022/lib/place/components/list-place-nav/list-place-nav.component.mjs +3 -4
  91. package/esm2022/lib/place/components/place-outlet/place-outlet.component.mjs +7 -9
  92. package/esm2022/lib/place/components/side-place-navigation/side-place-navigation.component.mjs +2 -2
  93. package/esm2022/lib/place/guards/consolidated-param-map.mjs +4 -4
  94. package/esm2022/lib/place/guards/place.guard.mjs +2 -1
  95. package/esm2022/lib/place/navigation/place-component-deactivation-handler.mjs +2 -2
  96. package/esm2022/lib/place/navigation/session/interactions/synchronise-interaction-context-ids-with-route.mjs +3 -6
  97. package/esm2022/lib/place/place-component.mjs +7 -7
  98. package/esm2022/lib/place/place-definition.mjs +3 -3
  99. package/esm2022/lib/place/place-history.mjs +2 -2
  100. package/esm2022/lib/place/place-router.mjs +20 -18
  101. package/esm2022/lib/place/place.decorator.mjs +2 -2
  102. package/esm2022/lib/place/place.module.mjs +1 -5
  103. package/esm2022/lib/place/route/formatter.mjs +2 -2
  104. package/esm2022/lib/place/route/parameter-decorators.mjs +54 -50
  105. package/esm2022/lib/place/route/parameter-definition.mjs +2 -2
  106. package/esm2022/lib/place/url-snapshot.mjs +3 -3
  107. package/esm2022/lib/place/visit-segment.mjs +2 -2
  108. package/esm2022/lib/place/visit.mjs +2 -2
  109. package/fesm2022/coolon-angular-ui-powerups.mjs +1368 -567
  110. package/fesm2022/coolon-angular-ui-powerups.mjs.map +1 -1
  111. package/lib/animations/slide-animations.d.ts +1 -0
  112. package/lib/components/cards/card-container/card-container.component.d.ts +1 -1
  113. package/lib/components/commands/command/command.component.d.ts +2 -1
  114. package/lib/components/commands/command-face/command-face.component.d.ts +2 -0
  115. package/lib/components/commands/command-face.d.ts +5 -7
  116. package/lib/components/commands/group/popup-menu/abstract-popup-menu.component.d.ts +2 -2
  117. package/lib/components/commands/group/tool-bar/tool-bar.component.d.ts +1 -1
  118. package/lib/components/components.module.d.ts +56 -53
  119. package/lib/components/disposable-component.d.ts +15 -8
  120. package/lib/components/exports.d.ts +8 -1
  121. package/lib/components/forms/abstract-input.component.d.ts +13 -5
  122. package/lib/components/forms/checkbox-input/checkbox-input.component.d.ts +2 -0
  123. package/lib/components/forms/form-field.d.ts +5 -0
  124. package/lib/components/forms/number-input/number-input.component.d.ts +8 -4
  125. package/lib/components/forms/password-input/password-input.component.d.ts +7 -1
  126. package/lib/components/forms/search-input/search-input.component.d.ts +10 -0
  127. package/lib/components/forms/select-input/select-input.component.d.ts +4 -3
  128. package/lib/components/forms/string-input/string-input.component.d.ts +3 -1
  129. package/lib/components/loadable-component.d.ts +17 -0
  130. package/lib/components/resize-aware.component.d.ts +24 -5
  131. package/lib/components/switch-case/switch-case.component.d.ts +2 -3
  132. package/lib/components/tables/abstract-table-model.d.ts +27 -8
  133. package/lib/components/tables/abstract-table.component.d.ts +4 -3
  134. package/lib/components/tables/column/column-manager.d.ts +19 -0
  135. package/lib/components/tables/column/column-model.d.ts +7 -3
  136. package/lib/components/tables/column/column-order-manager.d.ts +20 -0
  137. package/lib/components/tables/column/custom-template-column-model.d.ts +3 -2
  138. package/lib/components/tables/column/custom-value-column-model.d.ts +3 -2
  139. package/lib/components/tables/column/editor-controls-column-model.d.ts +3 -2
  140. package/lib/components/tables/column/list-propery-column-model.d.ts +3 -2
  141. package/lib/components/tables/column/property-column-model.d.ts +3 -2
  142. package/lib/components/tables/column/selection-column-model.d.ts +3 -2
  143. package/lib/components/tables/editor/edit-row-controls/edit-row-controls.component.d.ts +1 -1
  144. package/lib/components/tables/editor/edit-session.d.ts +1 -1
  145. package/lib/components/tables/filter/text-search-predicate.d.ts +9 -0
  146. package/lib/components/tables/footer/footer-row-model.d.ts +22 -0
  147. package/lib/components/tables/renderer/abstract-cell-renderer.d.ts +6 -0
  148. package/lib/components/tables/renderer/cell-portal-ref.d.ts +14 -6
  149. package/lib/components/tables/renderer/table-body/table-body.component.d.ts +40 -16
  150. package/lib/components/tables/renderer/table-cell/table-cell.component.d.ts +1 -1
  151. package/lib/components/tables/renderer/table-footer-row/table-footer-row.component.d.ts +11 -0
  152. package/lib/components/tables/renderer/table-more-menu/table-more-menu.component.d.ts +2 -1
  153. package/lib/components/tables/table/table-model.d.ts +1 -1
  154. package/lib/components/tables/table/table.component.d.ts +14 -10
  155. package/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.d.ts +1 -1
  156. package/lib/components/tables/tree-table/tree-label-column-model.d.ts +3 -2
  157. package/lib/components/tables/tree-table/tree-table-component.d.ts +3 -0
  158. package/lib/components/tables/tree-table/tree-table-model.d.ts +3 -2
  159. package/lib/directives/exports.d.ts +1 -0
  160. package/lib/directives/resize-observer.directive.d.ts +16 -0
  161. package/lib/interaction/activity.d.ts +2 -2
  162. package/lib/interaction/components/abstract-confirm-dialog.component.d.ts +1 -0
  163. package/lib/interaction/components/activity-actions/activity-actions.component.d.ts +10 -5
  164. package/lib/interaction/components/activity-container/activity-container.component.d.ts +7 -3
  165. package/lib/interaction/components/activity-title/activity-title.component.d.ts +1 -1
  166. package/lib/interaction/components/editors/edit-context.d.ts +1 -1
  167. package/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.d.ts +5 -3
  168. package/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.d.ts +53 -0
  169. package/lib/interaction/exports.d.ts +1 -0
  170. package/lib/interaction/interaction-context.d.ts +2 -0
  171. package/lib/interaction/interaction.module.d.ts +28 -28
  172. package/lib/place/components/place-outlet/place-outlet.component.d.ts +3 -4
  173. package/lib/place/place-component.d.ts +4 -4
  174. package/lib/place/place-router.d.ts +4 -0
  175. package/lib/place/place.module.d.ts +4 -5
  176. package/package.json +6 -4
  177. package/esm2022/lib/components/tables/column/column-list-model.mjs +0 -44
  178. 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 { 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';
61
+ import * as i1$5 from '@angular/router';
62
62
  import { ActivatedRouteSnapshot, UrlSegment, NavigationStart, NavigationEnd, NavigationError, NavigationCancel, RouterModule } from '@angular/router';
63
- import { Memoize as Memoize$1 } from 'typescript-memoize';
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,33 @@ 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.cdr.markForCheck());
284
+ }
285
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DisposableComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
269
286
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: DisposableComponent, usesInheritance: true, ngImport: i0 });
270
287
  }
271
288
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DisposableComponent, decorators: [{
272
289
  type: Directive
273
- }] });
290
+ }], ctorParameters: function () { return []; } });
274
291
 
275
292
  let FocusBinding = class FocusBinding extends GarbageCollector {
276
293
  focusTargetElement;
@@ -466,32 +483,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
466
483
  }]
467
484
  }], ctorParameters: function () { return []; } });
468
485
 
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
486
  class HighlightPipe extends GarbageCollector {
496
487
  sanitizer;
497
488
  highlightContext;
@@ -736,42 +727,42 @@ var CommandFace;
736
727
  }
737
728
  }
738
729
  __decorate([
739
- Memoize(),
730
+ MemoizeGet(),
740
731
  __metadata("design:type", Object),
741
732
  __metadata("design:paramtypes", [])
742
733
  ], Adapter.prototype, "text", null);
743
734
  __decorate([
744
- Memoize(),
735
+ MemoizeGet(),
745
736
  __metadata("design:type", Object),
746
737
  __metadata("design:paramtypes", [])
747
738
  ], Adapter.prototype, "icon", null);
748
739
  __decorate([
749
- Memoize(),
740
+ MemoizeGet(),
750
741
  __metadata("design:type", Object),
751
742
  __metadata("design:paramtypes", [])
752
743
  ], Adapter.prototype, "iconPosition", null);
753
744
  __decorate([
754
- Memoize(),
745
+ MemoizeGet(),
755
746
  __metadata("design:type", Object),
756
747
  __metadata("design:paramtypes", [])
757
748
  ], Adapter.prototype, "tooltip", null);
758
749
  __decorate([
759
- Memoize(),
750
+ MemoizeGet(),
760
751
  __metadata("design:type", Boolean),
761
752
  __metadata("design:paramtypes", [])
762
753
  ], Adapter.prototype, "iconPositionStart", null);
763
754
  __decorate([
764
- Memoize(),
755
+ MemoizeGet(),
765
756
  __metadata("design:type", Boolean),
766
757
  __metadata("design:paramtypes", [])
767
758
  ], Adapter.prototype, "iconPositionEnd", null);
768
759
  __decorate([
769
- Memoize(),
760
+ MemoizeGet(),
770
761
  __metadata("design:type", String),
771
762
  __metadata("design:paramtypes", [])
772
763
  ], Adapter.prototype, "color", null);
773
764
  __decorate([
774
- Memoize(),
765
+ MemoizeGet(),
775
766
  __metadata("design:type", String),
776
767
  __metadata("design:paramtypes", [])
777
768
  ], Adapter.prototype, "style", null);
@@ -842,6 +833,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
842
833
  args: ["class.disable-scroll"]
843
834
  }] } });
844
835
 
836
+ /* eslint-disable @angular-eslint/no-host-metadata-property */
845
837
  class IconComponent {
846
838
  _icon;
847
839
  prefix;
@@ -873,11 +865,13 @@ class IconComponent {
873
865
  return `fa-${this.suffix}`;
874
866
  }
875
867
  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"] }] });
868
+ 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
869
  }
878
870
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: IconComponent, decorators: [{
879
871
  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"] }]
872
+ args: [{ selector: 'aup-icon', changeDetection: ChangeDetectionStrategy.OnPush, host: {
873
+ class: "mat-icon" // this ensures angular form styles that target mat icon also work with us
874
+ }, 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
875
  }], propDecorators: { icon: [{
882
876
  type: Input
883
877
  }, {
@@ -908,6 +902,7 @@ class CommandFaceComponent extends DisposableComponent {
908
902
  // tslint:disable-next-line:no-input-rename
909
903
  get _rawFaces() { return this.#_rawFaces_accessor_storage; }
910
904
  set _rawFaces(value) { this.#_rawFaces_accessor_storage = value; }
905
+ hasTextAndLeadingIcon$;
911
906
  set face(face) {
912
907
  this.faces$.value = [face];
913
908
  }
@@ -927,6 +922,7 @@ class CommandFaceComponent extends DisposableComponent {
927
922
  const activeFace = this.faceAdapters.first();
928
923
  this.activeIcon = activeFace.pluck("icon");
929
924
  this.activeColor = activeFace.pluck("color");
925
+ this.hasTextAndLeadingIcon$ = valueOf.all(this.activeIcon.isNotNil(), activeFace.pluckString('text').isNotBlank(), activeFace.pluck("iconPosition").doesNotEqual(CommandFace.Position.END)).areTruthy();
930
926
  }
931
927
  shouldIncludeIcon(face) {
932
928
  return (!this.ignoreIcon && face.icon) || this.includeMissingIconInLayout;
@@ -940,8 +936,11 @@ class CommandFaceComponent extends DisposableComponent {
940
936
  get color() {
941
937
  return this.activeColor.value;
942
938
  }
939
+ get hasTextAndIcon() {
940
+ return this.hasTextAndLeadingIcon$.value;
941
+ }
943
942
  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 });
943
+ 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
944
  }
946
945
  __decorate([
947
946
  StoreInListModel("faces$"),
@@ -949,7 +948,7 @@ __decorate([
949
948
  ], CommandFaceComponent.prototype, "_rawFaces", null);
950
949
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CommandFaceComponent, decorators: [{
951
950
  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"] }]
951
+ 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
952
  }], ctorParameters: function () { return []; }, propDecorators: { _rawFaces: [{
954
953
  type: Input,
955
954
  args: ['faces']
@@ -967,6 +966,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
967
966
  }], color: [{
968
967
  type: HostBinding,
969
968
  args: ['attr.color']
969
+ }], hasTextAndIcon: [{
970
+ type: HostBinding,
971
+ args: ['class.has-text-and-leading-icon']
970
972
  }] } });
971
973
 
972
974
  /**
@@ -1070,11 +1072,11 @@ class CardContainerComponent extends AbstractCardContainerComponent {
1070
1072
  }
1071
1073
  }
1072
1074
  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"] }] });
1075
+ 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
1076
  }
1075
1077
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CardContainerComponent, decorators: [{
1076
1078
  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"] }]
1079
+ 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
1080
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { columnCount: [{
1079
1081
  type: Input
1080
1082
  }], enableScroll: [{
@@ -1150,14 +1152,24 @@ class CommandComponent extends PopupAwareComponent {
1150
1152
  activeFace$;
1151
1153
  iconOnly$;
1152
1154
  tooltip$;
1155
+ visible$;
1153
1156
  constructor(element, parent) {
1154
1157
  super(element, parent);
1155
1158
  const { chain, switchOn } = Dsl.disposeWith(this);
1156
- this.faces$ = chain(this.command.busy$).mapToList(busy => {
1159
+ this.faces$ = chain(this.command.busy$)
1160
+ .mapToList(busy => {
1157
1161
  return busy ?
1158
- [this.busyFace$.value, this.face$.value] :
1159
- [this.face$.value, this.busyFace$.value];
1160
- }, { allowNil: true, dependsOn: [this.face$, this.busyFace$] })
1162
+ [this.busyFace$.value ?? this.command.busyFace$.value, this.face$.value ?? this.command.defaultFace$.value] :
1163
+ [this.face$.value ?? this.command.defaultFace$.value, this.busyFace$.value ?? this.command.busyFace$.value];
1164
+ }, {
1165
+ allowNil: true,
1166
+ dependsOn: [
1167
+ this.face$,
1168
+ this.busyFace$,
1169
+ this.command.defaultFace$,
1170
+ this.command.busyFace$
1171
+ ]
1172
+ })
1161
1173
  .rejectNil();
1162
1174
  this.activeFace$ = this.faces$.first();
1163
1175
  this.buttonStyle$ = chain(this.activeFace$).map(f => CommandFace.getStyleOf(f));
@@ -1166,18 +1178,19 @@ class CommandComponent extends PopupAwareComponent {
1166
1178
  this.iconOnly$ = this.faces$.select(face => {
1167
1179
  return isEmpty(CommandFace.getTextOf(face)) && !isEmpty(CommandFace.getIconOf(face));
1168
1180
  }).count().equals(this.faces$.count());
1181
+ this.visible$ = chain(this.command.visible$);
1182
+ }
1183
+ get cssDisplayProperty() {
1184
+ return this.visible$.value ? undefined : 'none';
1169
1185
  }
1170
1186
  isActive(face) {
1171
1187
  return this.activeFace$.query().equals(face);
1172
1188
  }
1173
- getFace() {
1174
- return this.face;
1175
- }
1176
1189
  requestFocus() {
1177
1190
  this.button.focus();
1178
1191
  }
1179
1192
  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"] }] });
1193
+ 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
1194
  }
1182
1195
  __decorate([
1183
1196
  Proxify(),
@@ -1225,6 +1238,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1225
1238
  }], button: [{
1226
1239
  type: ViewChild,
1227
1240
  args: [MatButton]
1241
+ }], cssDisplayProperty: [{
1242
+ type: HostBinding,
1243
+ args: ["style.display"]
1228
1244
  }] } });
1229
1245
 
1230
1246
  /**
@@ -1252,12 +1268,12 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1252
1268
  xPosition = 'after';
1253
1269
  yPosition = 'below';
1254
1270
  triggers;
1255
- #enabled_accessor_storage;
1256
- get enabled() { return this.#enabled_accessor_storage; }
1257
- set enabled(value) { this.#enabled_accessor_storage = value; }
1258
1271
  #enabled$_accessor_storage = proxify((ValueModel));
1259
1272
  get enabled$() { return this.#enabled$_accessor_storage; }
1260
1273
  set enabled$(value) { this.#enabled$_accessor_storage = value; }
1274
+ #enabled_accessor_storage = true;
1275
+ get enabled() { return this.#enabled_accessor_storage; }
1276
+ set enabled(value) { this.#enabled_accessor_storage = value; }
1261
1277
  children;
1262
1278
  faces$;
1263
1279
  constructor(element, parent) {
@@ -1299,16 +1315,16 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1299
1315
  return this.faceAdapter.face;
1300
1316
  }
1301
1317
  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 });
1318
+ 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
1319
  }
1304
- __decorate([
1305
- StoreInValueModel(),
1306
- __metadata("design:type", Boolean)
1307
- ], AbstractPopupMenuComponent.prototype, "enabled", null);
1308
1320
  __decorate([
1309
1321
  Proxify(),
1310
1322
  __metadata("design:type", Object)
1311
1323
  ], AbstractPopupMenuComponent.prototype, "enabled$", null);
1324
+ __decorate([
1325
+ StoreInValueModel(),
1326
+ __metadata("design:type", Object)
1327
+ ], AbstractPopupMenuComponent.prototype, "enabled", null);
1312
1328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractPopupMenuComponent, decorators: [{
1313
1329
  type: Component,
1314
1330
  args: [{ selector: 'aup-abstract-popup-menu', template: '' }]
@@ -1322,10 +1338,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1322
1338
  }], triggers: [{
1323
1339
  type: ViewChildren,
1324
1340
  args: [MatMenuTrigger]
1325
- }], enabled: [{
1326
- type: Input
1327
1341
  }], enabled$: [{
1328
1342
  type: Input
1343
+ }], enabled: [{
1344
+ type: Input
1329
1345
  }] } });
1330
1346
 
1331
1347
  class CommandContainer extends GarbageCollector {
@@ -1358,13 +1374,15 @@ class ToolBarComponent extends CommandContainer {
1358
1374
  get orientation() {
1359
1375
  return CommandContainer.Orientation.HORIZONTAL;
1360
1376
  }
1361
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, deps: [{ token: CommandContainer }], target: i0.ɵɵFactoryTarget.Component });
1377
+ 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
1378
  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
1379
  }
1364
1380
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, decorators: [{
1365
1381
  type: Component,
1366
1382
  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 }]; } });
1383
+ }], ctorParameters: function () { return [{ type: CommandContainer, decorators: [{
1384
+ type: Optional
1385
+ }] }]; } });
1368
1386
 
1369
1387
  /**
1370
1388
  *
@@ -1675,7 +1693,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1675
1693
  args: ['blur']
1676
1694
  }] } });
1677
1695
 
1678
- /* tslint:disable:no-input-rename */
1679
1696
  const INPUT_TOKEN_HACK = new InjectionToken("INPUT_TOKEN_HACK");
1680
1697
  class AbstractInputComponent extends DisposableComponent {
1681
1698
  onValueEditedListeners = new EventListenerList();
@@ -1690,11 +1707,16 @@ class AbstractInputComponent extends DisposableComponent {
1690
1707
  * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).
1691
1708
  */
1692
1709
  formValue$;
1693
- label;
1694
- // eslint-disable-next-line @angular-eslint/no-input-rename
1710
+ #i18n$_accessor_storage = proxify((MutableValueModel));
1711
+ get i18n$() { return this.#i18n$_accessor_storage; }
1712
+ set i18n$(value) { this.#i18n$_accessor_storage = value; }
1713
+ #i18n_accessor_storage;
1714
+ get i18n() { return this.#i18n_accessor_storage; }
1715
+ set i18n(value) { this.#i18n_accessor_storage = value; }
1716
+ _label;
1695
1717
  userFloatLabel = 'always'; // TODO: make this an injectable default
1696
- hint;
1697
- placeholder;
1718
+ _hint;
1719
+ _placeholder;
1698
1720
  dense = false;
1699
1721
  _enabled$ = this.registerDisposable(new DelegatingValueModel());
1700
1722
  set enabled$(condition$) {
@@ -1761,6 +1783,9 @@ class AbstractInputComponent extends DisposableComponent {
1761
1783
  isEnabled() {
1762
1784
  return this.enabled$.value;
1763
1785
  }
1786
+ get disabled() {
1787
+ return !this.isEnabled();
1788
+ }
1764
1789
  hasErrors() {
1765
1790
  return !this.errorList$.query().isEmpty();
1766
1791
  }
@@ -1773,6 +1798,15 @@ class AbstractInputComponent extends DisposableComponent {
1773
1798
  get focusContext() {
1774
1799
  return this.formValue$.focusContext;
1775
1800
  }
1801
+ get label() {
1802
+ return this._label ?? this.i18n?.label();
1803
+ }
1804
+ get hint() {
1805
+ return this._hint ?? this.hackyGetI18n("hint");
1806
+ }
1807
+ get placeholder() {
1808
+ return this._placeholder ?? this.hackyGetI18n("placeholder");
1809
+ }
1776
1810
  get floatLabel() {
1777
1811
  // return this.dense ? 'never' : this.userFloatLabel;
1778
1812
  return this.userFloatLabel;
@@ -1787,24 +1821,45 @@ class AbstractInputComponent extends DisposableComponent {
1787
1821
  onValueEdited(callback) {
1788
1822
  return this.onValueEditedListeners.add(callback);
1789
1823
  }
1824
+ hackyGetI18n(key) {
1825
+ // TODO: update I18n to make it possible to get an optional value with return the missing key message.
1826
+ const i18nFn = this.i18n ? this.i18n[key] : undefined;
1827
+ const i18nValue = i18nFn && i18nFn();
1828
+ return i18nValue?.startsWith("missing key") ? undefined : i18nValue;
1829
+ }
1790
1830
  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 });
1831
+ 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
1832
  }
1833
+ __decorate([
1834
+ Proxify(),
1835
+ __metadata("design:type", Object)
1836
+ ], AbstractInputComponent.prototype, "i18n$", null);
1837
+ __decorate([
1838
+ StoreInValueModel(),
1839
+ __metadata("design:type", Object)
1840
+ ], AbstractInputComponent.prototype, "i18n", null);
1793
1841
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractInputComponent, decorators: [{
1794
1842
  type: Component,
1795
1843
  args: [{ template: '' }]
1796
1844
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1797
1845
  type: Inject,
1798
1846
  args: [INPUT_TOKEN_HACK]
1799
- }] }]; }, propDecorators: { label: [{
1847
+ }] }]; }, propDecorators: { i18n$: [{
1848
+ type: Input
1849
+ }], i18n: [{
1800
1850
  type: Input
1851
+ }], _label: [{
1852
+ type: Input,
1853
+ args: ["label"]
1801
1854
  }], userFloatLabel: [{
1802
1855
  type: Input,
1803
1856
  args: ['floatLabel']
1804
- }], hint: [{
1805
- type: Input
1806
- }], placeholder: [{
1807
- type: Input
1857
+ }], _hint: [{
1858
+ type: Input,
1859
+ args: ['hint']
1860
+ }], _placeholder: [{
1861
+ type: Input,
1862
+ args: ['placeholder']
1808
1863
  }], dense: [{
1809
1864
  type: HostBinding,
1810
1865
  args: ['class.dense']
@@ -1847,6 +1902,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1847
1902
  }], notifyFocusOut: [{
1848
1903
  type: HostListener,
1849
1904
  args: ['focusout']
1905
+ }], disabled: [{
1906
+ type: HostBinding,
1907
+ args: ["class.disabled"]
1850
1908
  }] } });
1851
1909
 
1852
1910
  class AbstractListInputComponent extends AbstractInputComponent {
@@ -2084,12 +2142,15 @@ class CheckboxInputComponent extends AbstractValueInputComponent {
2084
2142
  constructor() {
2085
2143
  super();
2086
2144
  }
2145
+ select($event) {
2146
+ this.componentValue$.value = $event.checked;
2147
+ }
2087
2148
  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"] }] });
2149
+ 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
2150
  }
2090
2151
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CheckboxInputComponent, decorators: [{
2091
2152
  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"] }]
2153
+ 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
2154
  }], ctorParameters: function () { return []; }, propDecorators: { color: [{
2094
2155
  type: Input
2095
2156
  }], labelPosition: [{
@@ -2128,7 +2189,7 @@ class MultipleSelectInputComponent extends AbstractListInputComponent {
2128
2189
  const self = this;
2129
2190
  this.registerDisposable(new Binding(this.componentList$, this.ids$, {
2130
2191
  toLeft(selectedItems, currentLeftValue) {
2131
- const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !it);
2192
+ const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !!it);
2132
2193
  // 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
2194
  return newValues.length < 1 && selectedItems.length > 0 ? currentLeftValue : newValues;
2134
2195
  },
@@ -2139,7 +2200,7 @@ class MultipleSelectInputComponent extends AbstractListInputComponent {
2139
2200
  })).writeRight();
2140
2201
  }
2141
2202
  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"] }] });
2203
+ 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
2204
  }
2144
2205
  __decorate([
2145
2206
  Proxify(),
@@ -2167,48 +2228,142 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2167
2228
 
2168
2229
  class NumberInputComponent extends AbstractValueInputComponent {
2169
2230
  autocomplete;
2170
- min = Number.MIN_SAFE_INTEGER;
2171
- max = Number.MAX_SAFE_INTEGER;
2172
- iconPrefix;
2231
+ #min$_accessor_storage = proxify((ValueModel));
2232
+ get min$() { return this.#min$_accessor_storage; }
2233
+ set min$(value) { this.#min$_accessor_storage = value; }
2234
+ #min_accessor_storage = Number.MIN_SAFE_INTEGER;
2235
+ get min() { return this.#min_accessor_storage; }
2236
+ set min(value) { this.#min_accessor_storage = value; }
2237
+ #max$_accessor_storage = proxify((ValueModel));
2238
+ get max$() { return this.#max$_accessor_storage; }
2239
+ set max$(value) { this.#max$_accessor_storage = value; }
2240
+ #max_accessor_storage = Number.MAX_SAFE_INTEGER;
2241
+ get max() { return this.#max_accessor_storage; }
2242
+ set max(value) { this.#max_accessor_storage = value; }
2243
+ incrementCommand;
2244
+ decrementCommand;
2173
2245
  constructor() {
2174
2246
  super();
2247
+ const { chain } = Dsl.disposeWith(this);
2248
+ const normalisedValue$ = chain(this.value$).otherwise(0);
2249
+ this.incrementCommand = Command.create(() => {
2250
+ this.value$.value = normalisedValue$.value + 1;
2251
+ }).enableWhile(chain.numericValue(normalisedValue$).isLessThan(this.max$).and(this.enabled$));
2252
+ this.decrementCommand = Command.create(() => {
2253
+ this.value$.value = normalisedValue$.value - 1;
2254
+ }).enableWhile(chain.numericValue(normalisedValue$).isGreaterThan(this.min$).and(this.enabled$));
2175
2255
  }
2176
2256
  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"] }] });
2257
+ 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" }, 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)]=\"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 [size]=\"4\">\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
2258
  }
2259
+ __decorate([
2260
+ Proxify(),
2261
+ __metadata("design:type", ValueModel)
2262
+ ], NumberInputComponent.prototype, "min$", null);
2263
+ __decorate([
2264
+ StoreInValueModel(),
2265
+ __metadata("design:type", Object)
2266
+ ], NumberInputComponent.prototype, "min", null);
2267
+ __decorate([
2268
+ Proxify(),
2269
+ __metadata("design:type", ValueModel)
2270
+ ], NumberInputComponent.prototype, "max$", null);
2271
+ __decorate([
2272
+ StoreInValueModel(),
2273
+ __metadata("design:type", Object)
2274
+ ], NumberInputComponent.prototype, "max", null);
2179
2275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NumberInputComponent, decorators: [{
2180
2276
  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" }]
2277
+ 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)]=\"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 [size]=\"4\">\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
2278
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2183
2279
  type: Input
2280
+ }], min$: [{
2281
+ type: Input
2184
2282
  }], min: [{
2185
2283
  type: Input
2186
- }], max: [{
2284
+ }], max$: [{
2187
2285
  type: Input
2188
- }], iconPrefix: [{
2286
+ }], max: [{
2189
2287
  type: Input
2190
2288
  }] } });
2191
2289
 
2192
2290
  class PasswordInputComponent extends AbstractValueInputComponent {
2193
2291
  autocomplete;
2292
+ #enableShowPassword$_accessor_storage = proxify((ValueModel));
2293
+ get enableShowPassword$() { return this.#enableShowPassword$_accessor_storage; }
2294
+ set enableShowPassword$(value) { this.#enableShowPassword$_accessor_storage = value; }
2295
+ #enableShowPassword_accessor_storage = false;
2296
+ get enableShowPassword() { return this.#enableShowPassword_accessor_storage; }
2297
+ set enableShowPassword(value) { this.#enableShowPassword_accessor_storage = value; }
2298
+ showPassword$ = new MutableValueModel(false);
2299
+ toggleShowPasswordCommand;
2194
2300
  constructor() {
2195
2301
  super();
2302
+ const { chain, valueOf } = Dsl.disposeWith(this);
2303
+ const face$ = chain(this.showPassword$).map(show => {
2304
+ return {
2305
+ icon: () => show ? "mat:visibility_off" : "mat:visibility"
2306
+ };
2307
+ });
2308
+ this.toggleShowPasswordCommand = Command.create(() => {
2309
+ this.showPassword$.value = !this.showPassword$.value;
2310
+ })
2311
+ .withFace(face$)
2312
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2313
+ }
2314
+ get fieldType() {
2315
+ return this.showPassword$.value ? "text" : "password";
2196
2316
  }
2197
2317
  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"] }] });
2318
+ 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
2319
  }
2320
+ __decorate([
2321
+ Proxify(),
2322
+ __metadata("design:type", Object)
2323
+ ], PasswordInputComponent.prototype, "enableShowPassword$", null);
2324
+ __decorate([
2325
+ StoreInValueModel(),
2326
+ __metadata("design:type", Object)
2327
+ ], PasswordInputComponent.prototype, "enableShowPassword", null);
2200
2328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PasswordInputComponent, decorators: [{
2201
2329
  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" }]
2330
+ 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" }]
2331
+ }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2332
+ type: Input
2333
+ }], enableShowPassword$: [{
2334
+ type: Input
2335
+ }], enableShowPassword: [{
2336
+ type: Input
2337
+ }] } });
2338
+
2339
+ class SearchInputComponent extends AbstractValueInputComponent {
2340
+ autocomplete;
2341
+ clearCommand;
2342
+ constructor() {
2343
+ super();
2344
+ this.dense = true;
2345
+ const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2346
+ this.clearCommand = Command.create(() => {
2347
+ this.componentValue$.value = "";
2348
+ });
2349
+ this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2350
+ }
2351
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2352
+ 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"] }] });
2353
+ }
2354
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, decorators: [{
2355
+ type: Component,
2356
+ 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
2357
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2204
2358
  type: Input
2205
2359
  }] } });
2206
2360
 
2207
2361
  /**
2208
2362
  * Using templates:
2209
- * <aup-select-input [valueModel]="myModel" [options]="myOptions">
2363
+ * <aup-select-input [value$]="myModel" [options]="myOptions">
2210
2364
  * <ng-template #optionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2211
- * <ng-template #nilOptionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2365
+ * <ng-template #selectedOptionTemplate let-option>{{option.thePropertyYouWant}} note, not used for nils (the placeholder is used)</ng-template>
2366
+ * <ng-template #nilOptionTemplate>Uses the placeholder by default but you can customise it</ng-template>
2212
2367
  * </aup-select_input>
2213
2368
  */
2214
2369
  class SelectInputComponent extends AbstractValueInputComponent {
@@ -2233,7 +2388,7 @@ class SelectInputComponent extends AbstractValueInputComponent {
2233
2388
  super();
2234
2389
  const { chain } = Dsl.disposeWith(this);
2235
2390
  this.cookedOptions$ = chain(this.options$)
2236
- .reduceToList(options => {
2391
+ .mapAll(options => {
2237
2392
  return options.length < 1 && !isNil(this.componentValue$.value) ? [this.componentValue$.value] : options;
2238
2393
  }, {
2239
2394
  dependsOn: this.componentValue$
@@ -2272,21 +2427,21 @@ class SelectInputComponent extends AbstractValueInputComponent {
2272
2427
  id: this.delegatedIdentityOf(value)
2273
2428
  });
2274
2429
  let lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2275
- console.log(lastIdSnapshot);
2430
+ // console.log(lastIdSnapshot)
2276
2431
  before(this.options$).changes(() => {
2277
2432
  lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2278
- console.log(lastIdSnapshot);
2433
+ // console.log(lastIdSnapshot)
2279
2434
  });
2280
2435
  when(this.options$).changes((is, was) => {
2281
2436
  const newIdSnapshot = snapshotValueAndId(lastIdSnapshot.value);
2282
- console.log(lastIdSnapshot, newIdSnapshot);
2437
+ // console.log(lastIdSnapshot, newIdSnapshot)
2283
2438
  if (newIdSnapshot !== lastIdSnapshot.id) {
2284
2439
  this.id$.value = this.delegatedIdentityOf(this.componentValue$.value);
2285
2440
  }
2286
2441
  });
2287
2442
  }
2288
2443
  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"] }] });
2444
+ 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
2445
  }
2291
2446
  __decorate([
2292
2447
  Proxify(),
@@ -2298,7 +2453,7 @@ __decorate([
2298
2453
  ], SelectInputComponent.prototype, "options", null);
2299
2454
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputComponent, decorators: [{
2300
2455
  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"] }]
2456
+ 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
2457
  }], ctorParameters: function () { return []; }, propDecorators: { options$: [{
2303
2458
  type: Input
2304
2459
  }], options: [{
@@ -2329,17 +2484,24 @@ class StringInputComponent extends AbstractValueInputComponent {
2329
2484
  get enableClear() { return this.#enableClear_accessor_storage; }
2330
2485
  set enableClear(value) { this.#enableClear_accessor_storage = value; }
2331
2486
  iconPrefix;
2487
+ #suffixCommand_accessor_storage = proxify(Command);
2488
+ get suffixCommand() { return this.#suffixCommand_accessor_storage; }
2489
+ set suffixCommand(value) { this.#suffixCommand_accessor_storage = value; }
2332
2490
  clearCommand;
2333
2491
  constructor() {
2334
2492
  super();
2335
2493
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2336
2494
  this.clearCommand = Command.create(() => {
2337
2495
  this.componentValue$.value = "";
2338
- });
2339
- this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2496
+ })
2497
+ .withFace({ icon: () => "mat:clear" })
2498
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2499
+ }
2500
+ get hasSuffixCommand() {
2501
+ return Proxify.hasTarget(this.suffixCommand);
2340
2502
  }
2341
2503
  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"] }] });
2504
+ 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
2505
  }
2344
2506
  __decorate([
2345
2507
  Proxify(),
@@ -2349,9 +2511,13 @@ __decorate([
2349
2511
  StoreInValueModel(),
2350
2512
  __metadata("design:type", Object)
2351
2513
  ], StringInputComponent.prototype, "enableClear", null);
2514
+ __decorate([
2515
+ Proxify(),
2516
+ __metadata("design:type", Command)
2517
+ ], StringInputComponent.prototype, "suffixCommand", null);
2352
2518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputComponent, decorators: [{
2353
2519
  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"] }]
2520
+ 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
2521
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2356
2522
  type: Input
2357
2523
  }], enableClear$: [{
@@ -2360,6 +2526,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2360
2526
  type: Input
2361
2527
  }], iconPrefix: [{
2362
2528
  type: Input
2529
+ }], suffixCommand: [{
2530
+ type: Input
2363
2531
  }] } });
2364
2532
 
2365
2533
  class TextInputComponent extends AbstractValueInputComponent {
@@ -2547,7 +2715,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2547
2715
  * </aup-switch-case>
2548
2716
  */
2549
2717
  class SwitchCaseComponent extends DisposableComponent {
2550
- cdr;
2551
2718
  #switch$_accessor_storage = proxify((ValueModel));
2552
2719
  get switch$() { return this.#switch$_accessor_storage; }
2553
2720
  set switch$(value) { this.#switch$_accessor_storage = value; }
@@ -2556,9 +2723,8 @@ class SwitchCaseComponent extends DisposableComponent {
2556
2723
  set switch(value) { this.#switch_accessor_storage = value; }
2557
2724
  switchCaseOptions;
2558
2725
  selectedIndex = 0;
2559
- constructor(cdr) {
2726
+ constructor() {
2560
2727
  super();
2561
- this.cdr = cdr;
2562
2728
  }
2563
2729
  ngAfterContentInit() {
2564
2730
  const subscription = this.switchCaseOptions.changes.subscribe(change => this.updateSelection());
@@ -2595,8 +2761,8 @@ class SwitchCaseComponent extends DisposableComponent {
2595
2761
  this.selectedIndex = -1;
2596
2762
  }
2597
2763
  }
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"] }] });
2764
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2765
+ 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
2766
  }
2601
2767
  __decorate([
2602
2768
  Proxify(),
@@ -2609,7 +2775,7 @@ __decorate([
2609
2775
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, decorators: [{
2610
2776
  type: Component,
2611
2777
  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$: [{
2778
+ }], ctorParameters: function () { return []; }, propDecorators: { switch$: [{
2613
2779
  type: Input
2614
2780
  }], switch: [{
2615
2781
  type: Input
@@ -2619,6 +2785,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2619
2785
  }] } });
2620
2786
 
2621
2787
  const HEADER_CELL_RENDERER_PORTAL = Symbol('aup-cell-header-renderer-component-ref');
2788
+ const FOOTER_CELL_RENDERER_PORTAL = Symbol('aup-cell-footer-renderer-component-ref');
2622
2789
  const CELL_RENDERER_PORTAL = Symbol('aup-cell-renderer-component-ref');
2623
2790
  const CELL_EDITOR_PORTAL = Symbol('aup-cell-editor-component-ref');
2624
2791
  const PORTAL_RENDERER_COMPONENT = Symbol('aup-cell-renderer-portal-component');
@@ -2716,6 +2883,23 @@ class TemplateCellRendererPortalRef extends CellRendererPortalRef {
2716
2883
  return new TemplatePortal(this.templateRef, this.viewContainer, { ...(data), $implicit: data.row });
2717
2884
  }
2718
2885
  }
2886
+ class CellFooterPortalRef extends CellPortalRef {
2887
+ componentType;
2888
+ initialiseHeader;
2889
+ constructor(componentType, initialiseHeader) {
2890
+ super();
2891
+ this.componentType = componentType;
2892
+ this.initialiseHeader = initialiseHeader;
2893
+ }
2894
+ initialiseHost(host, columnModel) {
2895
+ assert$1.isTruthy(host);
2896
+ host[HEADER_CELL_RENDERER_PORTAL] = new ComponentPortal(this.componentType);
2897
+ }
2898
+ // @Trace()
2899
+ onPortalAttached(host, portalComponent) {
2900
+ this.initialiseHeader(portalComponent, host.column);
2901
+ }
2902
+ }
2719
2903
 
2720
2904
  class ColumnTextSearchFormatter {
2721
2905
  }
@@ -2806,6 +2990,7 @@ class ColumnTextSearchWrapper extends ColumnTextSearchFormatter.Delegate {
2806
2990
  }
2807
2991
  class ColumnModel extends GarbageCollector {
2808
2992
  columnId;
2993
+ order;
2809
2994
  textPropertiesProvider;
2810
2995
  _columnTextProperties;
2811
2996
  _columnHeaderPortalRef;
@@ -2819,9 +3004,10 @@ class ColumnModel extends GarbageCollector {
2819
3004
  dasherisedColumnId;
2820
3005
  textSearchDelegate = new ColumnTextSearchWrapper();
2821
3006
  visible$;
2822
- constructor(columnId, textPropertiesProvider) {
3007
+ constructor(columnId, order, textPropertiesProvider) {
2823
3008
  super();
2824
3009
  this.columnId = columnId;
3010
+ this.order = order;
2825
3011
  this.textPropertiesProvider = textPropertiesProvider;
2826
3012
  const { valueOf } = Dsl.disposeWith(this);
2827
3013
  this.installHeaderRenderer();
@@ -2866,6 +3052,14 @@ class ColumnModel extends GarbageCollector {
2866
3052
  this._columnTextProperties = columnTextProperties;
2867
3053
  return this;
2868
3054
  }
3055
+ positionAfter(column) {
3056
+ this.order.position(this, { after: column });
3057
+ return this;
3058
+ }
3059
+ positionBefore(column) {
3060
+ this.order.position(this, { before: column });
3061
+ return this;
3062
+ }
2869
3063
  getSearchTextFor(row) {
2870
3064
  return this.textSearchDelegate.format(row);
2871
3065
  }
@@ -2967,8 +3161,8 @@ __decorate([
2967
3161
 
2968
3162
  class CustomTemplateColumnModel extends ColumnModel {
2969
3163
  config = new TemplateCellRendererPortalRef();
2970
- constructor(columnId, defaults) {
2971
- super(columnId, defaults);
3164
+ constructor(columnId, order, defaults) {
3165
+ super(columnId, order, defaults);
2972
3166
  this.configureCellRenderer(this.config);
2973
3167
  }
2974
3168
  setTemplate(templateRef, viewContainer, fillCell, padChild) {
@@ -3046,12 +3240,17 @@ class AbstractTableComponent extends DisposableComponent {
3046
3240
  #showHeader_accessor_storage = true;
3047
3241
  get showHeader() { return this.#showHeader_accessor_storage; }
3048
3242
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
3243
+ #enableScrolling$_accessor_storage = proxify((ValueModel));
3049
3244
  /**
3050
3245
  * Set to true to enable scrolling. Once enabled the table will have 0 implicit height. You will either
3051
3246
  * need to set it explicitly e.g. height: 400px; or by using flex or grid layout to make it fill it's
3052
3247
  * containment area.
3053
3248
  */
3054
- enableScrolling = false;
3249
+ get enableScrolling$() { return this.#enableScrolling$_accessor_storage; }
3250
+ set enableScrolling$(value) { this.#enableScrolling$_accessor_storage = value; }
3251
+ #enableScrolling_accessor_storage = false;
3252
+ get enableScrolling() { return this.#enableScrolling_accessor_storage; }
3253
+ set enableScrolling(value) { this.#enableScrolling_accessor_storage = value; }
3055
3254
  columns;
3056
3255
  columnIds;
3057
3256
  columnsById;
@@ -3070,7 +3269,6 @@ class AbstractTableComponent extends DisposableComponent {
3070
3269
  super();
3071
3270
  this.injector = injector;
3072
3271
  const { chain, when } = Dsl.disposeWith(this);
3073
- this._visibleRows$.setDelegate(this._dataSource$);
3074
3272
  when(chain(this._dataSource$).first()).becomesTruthy(it => {
3075
3273
  if (it === this.identityOf(it)) {
3076
3274
  console.warn("Table model identity function is using reference equality. This can cause lots of table re-rendering", {
@@ -3089,7 +3287,7 @@ class AbstractTableComponent extends DisposableComponent {
3089
3287
  if (!model) {
3090
3288
  lang$1.illegalState("aup-table tableModel is nil");
3091
3289
  }
3092
- this.columnsById = chain(model.columns).indexBy('columnId');
3290
+ this.columnsById = chain(model.columns$).indexBy('columnId');
3093
3291
  this._dataSource$.setDelegate(model.dataSource$);
3094
3292
  model.initialise(this.injector, (row) => this.identityOf(row));
3095
3293
  }
@@ -3106,7 +3304,7 @@ class AbstractTableComponent extends DisposableComponent {
3106
3304
  }
3107
3305
  }
3108
3306
  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 });
3307
+ 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
3308
  }
3111
3309
  __decorate([
3112
3310
  Proxify(),
@@ -3116,6 +3314,14 @@ __decorate([
3116
3314
  StoreInValueModel(),
3117
3315
  __metadata("design:type", Object)
3118
3316
  ], AbstractTableComponent.prototype, "showHeader", null);
3317
+ __decorate([
3318
+ Proxify(),
3319
+ __metadata("design:type", ValueModel)
3320
+ ], AbstractTableComponent.prototype, "enableScrolling$", null);
3321
+ __decorate([
3322
+ StoreInValueModel(),
3323
+ __metadata("design:type", Boolean)
3324
+ ], AbstractTableComponent.prototype, "enableScrolling", null);
3119
3325
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractTableComponent, decorators: [{
3120
3326
  type: Component,
3121
3327
  args: [{
@@ -3126,6 +3332,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
3126
3332
  type: Input
3127
3333
  }], showHeader: [{
3128
3334
  type: Input
3335
+ }], enableScrolling$: [{
3336
+ type: Input
3129
3337
  }], enableScrolling: [{
3130
3338
  type: Input
3131
3339
  }], baseCssClass: [{
@@ -3186,6 +3394,8 @@ class EditSession extends GarbageCollector {
3186
3394
  // console.warn()
3187
3395
  // }
3188
3396
  this._liveRowValue$.value = produce(this._liveRowValue$.value, draft => {
3397
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3398
+ // @ts-ignore
3189
3399
  this.form.writeDirtyStateTo(draft);
3190
3400
  });
3191
3401
  });
@@ -3288,11 +3498,11 @@ class DefaultCellRendererComponent {
3288
3498
  return this._value;
3289
3499
  }
3290
3500
  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" }] });
3501
+ 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
3502
  }
3293
3503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DefaultCellRendererComponent, decorators: [{
3294
3504
  type: Component,
3295
- args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n" }]
3505
+ args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value?.toString()| aupHighlight\"></span>\n" }]
3296
3506
  }], propDecorators: { value: [{
3297
3507
  type: Input
3298
3508
  }] } });
@@ -3308,7 +3518,8 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3308
3518
  super();
3309
3519
  this.selectCommand = Command.create(() => {
3310
3520
  this.selectionModel.toggleAllCommand.execute();
3311
- });
3521
+ }).visibleWhile(this.selectionModel.toggleAllCommand.visible$)
3522
+ .enableWhile(this.selectionModel.toggleAllCommand.enabled$);
3312
3523
  }
3313
3524
  isSelected() {
3314
3525
  return this.ifMultiSelectionModel(m => m.allSelected$.value, false);
@@ -3336,7 +3547,7 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3336
3547
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionHeaderCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3337
3548
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionHeaderCellComponent, selector: "aup-selection-header-cell", providers: [
3338
3549
  { 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"] }] });
3550
+ ], 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
3551
  }
3341
3552
  __decorate([
3342
3553
  Proxify(),
@@ -3369,7 +3580,7 @@ class SelectionCellComponent extends DisposableComponent {
3369
3580
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
3370
3581
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionCellComponent, selector: "aup-selection-cell", inputs: { row: "row" }, providers: [
3371
3582
  { 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"] }] });
3583
+ ], 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
3584
  }
3374
3585
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, decorators: [{
3375
3586
  type: Component,
@@ -3430,25 +3641,14 @@ class Bounds extends Dimension {
3430
3641
  })(Bounds || (Bounds = {}));
3431
3642
 
3432
3643
  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
- }
3644
+ elementRef = this.inject(ElementRef);
3645
+ ngZone = this.inject(NgZone);
3646
+ boundsTracker = new ResizeAwareComponent.ResizeTracker(this.elementRef, this.ngZone);
3441
3647
  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());
3648
+ this.boundsTracker.notifyViewReady();
3449
3649
  }
3450
3650
  get bounds$() {
3451
- return this._bounds$.readonly$;
3651
+ return this.boundsTracker.bounds$;
3452
3652
  }
3453
3653
  get nativeElement() {
3454
3654
  return this.elementRef.nativeElement;
@@ -3458,57 +3658,160 @@ class ResizeAwareComponent extends DisposableComponent {
3458
3658
  return this.bounds.relativePositionOf(point);
3459
3659
  }
3460
3660
  get bounds() {
3461
- return this._bounds$.value;
3661
+ return this.bounds$.value;
3462
3662
  }
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 });
3663
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
3467
3664
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ResizeAwareComponent, usesInheritance: true, ngImport: i0 });
3468
3665
  }
3469
3666
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, decorators: [{
3470
3667
  type: Directive
3471
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; } });
3668
+ }] });
3669
+ (function (ResizeAwareComponent) {
3670
+ class ResizeTracker extends GarbageCollector {
3671
+ elementRef;
3672
+ ngZone;
3673
+ _bounds$ = new MutableValueModel(new Bounds(0, 0, 0, 0));
3674
+ width$;
3675
+ height$;
3676
+ top$;
3677
+ left$;
3678
+ bottom$;
3679
+ right$;
3680
+ constructor(elementRef, ngZone) {
3681
+ super();
3682
+ this.elementRef = elementRef;
3683
+ this.ngZone = ngZone;
3684
+ const { chain } = Dsl.disposeWith(this);
3685
+ this.width$ = chain(this.bounds$).pluck("width");
3686
+ this.height$ = chain(this.bounds$).pluck("height");
3687
+ this.top$ = chain(this.bounds$).pluck("top");
3688
+ this.left$ = chain(this.bounds$).pluck("left");
3689
+ this.bottom$ = chain.numericValue(this.top$).add(this.height$);
3690
+ this.right$ = chain.numericValue(this.left$).add(this.width$);
3691
+ }
3692
+ notifyViewReady() {
3693
+ const element = this.elementRef.nativeElement;
3694
+ const ro = new ResizeObserver((entries, observer) => {
3695
+ this.ngZone.run(() => this._updateBounds());
3696
+ });
3697
+ ro.observe(element);
3698
+ this.onDispose(() => ro.disconnect());
3699
+ setTimeout(() => this._updateBounds());
3700
+ }
3701
+ get bounds$() {
3702
+ return this._bounds$.readonly$;
3703
+ }
3704
+ get nativeElement() {
3705
+ return this.elementRef.nativeElement;
3706
+ }
3707
+ // TODO: Make this handle body scroll
3708
+ relativePositionOf(point) {
3709
+ return this.bounds.relativePositionOf(point);
3710
+ }
3711
+ get bounds() {
3712
+ return this._bounds$.value;
3713
+ }
3714
+ _updateBounds() {
3715
+ this._bounds$.value = Bounds.ofElement(this.nativeElement);
3716
+ }
3717
+ }
3718
+ ResizeAwareComponent.ResizeTracker = ResizeTracker;
3719
+ })(ResizeAwareComponent || (ResizeAwareComponent = {}));
3472
3720
 
3473
- class ColumnListModel extends AbstractComputedListModel {
3474
- _allColumns$ = new MutableListModel();
3475
- columnsById$;
3721
+ var ColumnOrderManager;
3722
+ (function (ColumnOrderManager) {
3723
+ function processPosition(position, callback) {
3724
+ if (position) {
3725
+ const keys = Object.keys(position);
3726
+ if (keys.includes("before")) {
3727
+ return position["before"] ? callback.before(position["before"]) : callback.first();
3728
+ }
3729
+ else {
3730
+ return position["after"] ? callback.after(position["after"]) : callback.last();
3731
+ }
3732
+ }
3733
+ else {
3734
+ return callback.last();
3735
+ }
3736
+ }
3737
+ ColumnOrderManager.processPosition = processPosition;
3738
+ })(ColumnOrderManager || (ColumnOrderManager = {}));
3739
+
3740
+ class ColumnRef {
3741
+ column;
3742
+ position;
3743
+ constructor(column, position) {
3744
+ this.column = column;
3745
+ this.position = position;
3746
+ }
3747
+ }
3748
+ class ColumnManager extends GarbageCollector {
3749
+ _columnRefs$ = new MutableListModel();
3750
+ orderedColumnRefs$;
3751
+ _columnsById$;
3752
+ allColumns$;
3753
+ columnVisibilities$ = new WatchList();
3754
+ visibleColumns$;
3476
3755
  constructor() {
3477
3756
  super();
3478
3757
  const { chain } = Dsl.disposeWith(this);
3479
- this.columnsById$ = chain(this._allColumns$).indexBy('columnId');
3758
+ this.orderedColumnRefs$ = chain(this._columnRefs$).orderBy("position", "asc");
3759
+ this.allColumns$ = this.orderedColumnRefs$.pluck("column");
3760
+ this._columnsById$ = chain(this.allColumns$).indexBy('columnId');
3761
+ this.visibleColumns$ = chain(this.allColumns$).select(it => it.visible$.value, {
3762
+ dependsOn: this.columnVisibilities$
3763
+ });
3480
3764
  }
3481
- get allColumns$() {
3482
- return this._allColumns$.readonly$;
3765
+ position(column, newPosition) {
3766
+ const target = this._columnRefs$.query().findMatching(it => it.column === column);
3767
+ const position = this.computePosition(newPosition);
3768
+ this._columnRefs$.replace(target, { with: new ColumnRef(target.column, position) });
3483
3769
  }
3484
3770
  getColumn(id) {
3485
- return this.columnsById$.get(id);
3771
+ return this._columnsById$.get(id);
3486
3772
  }
3487
3773
  hasColumn(id) {
3488
- return !!this.columnsById$.get(id);
3774
+ return !!this._columnsById$.get(id);
3489
3775
  }
3490
3776
  hasMatchingColumn(row, regex) {
3491
3777
  // only search the visible columns
3492
- return !!this.value.find(c => regex.test(c.getSearchTextFor(row)));
3778
+ return !!this.visibleColumns$.value.find(c => regex.test(c.getSearchTextFor(row)));
3493
3779
  }
3494
- addColumn(column, index) {
3780
+ addColumn(column, position) {
3495
3781
  if (this.hasColumn(column.columnId)) {
3496
3782
  lang.illegalState(`Column with id=${column.columnId} already exists`);
3497
3783
  }
3498
3784
  this.registerDisposable(column);
3499
- this.runInTransaction(() => {
3500
- if (!isNil(index)) {
3501
- this._allColumns$.insert(index, column);
3502
- }
3503
- else {
3504
- this._allColumns$.push(column);
3785
+ this._columnRefs$.push(new ColumnRef(column, this.computePosition(position)));
3786
+ this.columnVisibilities$.add(column.visible$);
3787
+ return column;
3788
+ }
3789
+ computePosition(position) {
3790
+ const q = this.orderedColumnRefs$.query();
3791
+ return ColumnOrderManager.processPosition(position, {
3792
+ before(col) {
3793
+ const index = q.findIndex(ref => ref.column === col);
3794
+ const beforeCol = q.value[index];
3795
+ const afterCol = index - 1 >= 0 ? q.value[index - 1] : undefined;
3796
+ return generateKeyBetween(afterCol?.position, beforeCol.position);
3797
+ },
3798
+ after(col) {
3799
+ const index = q.findIndex(ref => ref.column === col);
3800
+ const afterCol = q.value[index];
3801
+ const beforeCol = index + 1 < q.length ? q.value[index + 1] : undefined;
3802
+ return generateKeyBetween(afterCol.position, beforeCol?.position);
3803
+ },
3804
+ first() {
3805
+ return generateKeyBetween(null, q.first()?.position);
3806
+ },
3807
+ last() {
3808
+ // add it to the end of the list
3809
+ return generateKeyBetween(q.last()?.position, null);
3505
3810
  }
3506
- this.registerDisposable(this.trackSource(column.visible$));
3507
3811
  });
3508
- return column;
3509
3812
  }
3510
3813
  doComputeValue() {
3511
- return this._allColumns$.value.filter(c => c.visible$.value);
3814
+ return this.allColumns$.value.filter(c => c.visible$.value);
3512
3815
  }
3513
3816
  }
3514
3817
 
@@ -3542,8 +3845,8 @@ function EnableCellTextSearch(options) {
3542
3845
 
3543
3846
  class CustomValueColumnModel extends ColumnModel {
3544
3847
  getValue;
3545
- constructor(columnId, defaults, getValue) {
3546
- super(columnId, defaults);
3848
+ constructor(columnId, order, defaults, getValue) {
3849
+ super(columnId, order, defaults);
3547
3850
  this.getValue = getValue;
3548
3851
  this.cellRenderer(DefaultCellRendererComponent);
3549
3852
  }
@@ -3551,17 +3854,17 @@ class CustomValueColumnModel extends ColumnModel {
3551
3854
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => new ColumnTextSearchFormatter.Null()), row => this.getValue(row));
3552
3855
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3553
3856
  if (firstTime) {
3554
- if (isFunction$1(onComponentInitOrOptions)) {
3857
+ if (isFunction(onComponentInitOrOptions)) {
3555
3858
  onComponentInitOrOptions(component);
3556
3859
  }
3557
3860
  else {
3558
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3861
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3559
3862
  onComponentInitOrOptions.onComponentInit(component);
3560
3863
  }
3561
3864
  }
3562
3865
  }
3563
3866
  component.value = this.getValue(rowData.row);
3564
- if (!isFunction$1(onComponentInitOrOptions) && isFunction$1(onComponentInitOrOptions?.onRowUpdate)) {
3867
+ if (!isFunction(onComponentInitOrOptions) && isFunction(onComponentInitOrOptions?.onRowUpdate)) {
3565
3868
  onComponentInitOrOptions.onRowUpdate(component, rowData.row);
3566
3869
  }
3567
3870
  }));
@@ -3573,8 +3876,8 @@ class CustomValueColumnModel extends ColumnModel {
3573
3876
  }
3574
3877
 
3575
3878
  class EditorControlColumnModel extends ColumnModel {
3576
- constructor(columnId, saveCommandFactory, defaults) {
3577
- super(columnId, defaults);
3879
+ constructor(columnId, order, saveCommandFactory, defaults) {
3880
+ super(columnId, order, defaults);
3578
3881
  this.cellRenderer(EditRowControlsComponent);
3579
3882
  }
3580
3883
  cellRenderer(componentType) {
@@ -3599,8 +3902,8 @@ class ListPropertyColumnModel extends ColumnModel {
3599
3902
  intermediate.map(v => v?.toString()).join(", ") :
3600
3903
  intermediate?.toString();
3601
3904
  };
3602
- constructor(id, property, defaults) {
3603
- super(id, defaults);
3905
+ constructor(id, order, property, defaults) {
3906
+ super(id, order, defaults);
3604
3907
  this.property = property;
3605
3908
  this.cellRenderer(DefaultCellRendererComponent);
3606
3909
  }
@@ -3616,7 +3919,7 @@ class ListPropertyColumnModel extends ColumnModel {
3616
3919
  }
3617
3920
  cellEditor(editor, validatorsOrInitialiser, initialiseComponent) {
3618
3921
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3619
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3922
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3620
3923
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3621
3924
  const formListModel = editSession.form.pluckList(this.property);
3622
3925
  if (validators) {
@@ -3645,8 +3948,8 @@ class PropertyColumnModel extends ColumnModel {
3645
3948
  _defaultSearchTextFormatter = (value) => {
3646
3949
  return (this._userFormat ?? Functions.identity)(value)?.toString();
3647
3950
  };
3648
- constructor(id, property, defaults) {
3649
- super(id, defaults);
3951
+ constructor(id, order, property, defaults) {
3952
+ super(id, order, defaults);
3650
3953
  this.property = property;
3651
3954
  this.cellRenderer(DefaultCellRendererComponent);
3652
3955
  }
@@ -3654,11 +3957,11 @@ class PropertyColumnModel extends ColumnModel {
3654
3957
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => ColumnTextSearchFormatter.forFormatter(this._defaultSearchTextFormatter)), row => row[this.property]);
3655
3958
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3656
3959
  if (firstTime) {
3657
- if (isFunction$1(onComponentInitOrOptions)) {
3960
+ if (isFunction(onComponentInitOrOptions)) {
3658
3961
  onComponentInitOrOptions(component);
3659
3962
  }
3660
3963
  else {
3661
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3964
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3662
3965
  onComponentInitOrOptions.onComponentInit(component);
3663
3966
  }
3664
3967
  }
@@ -3683,7 +3986,7 @@ class PropertyColumnModel extends ColumnModel {
3683
3986
  component[ColumnModel.CELL_RENDERER_COMPONENT_ROW_CACHE] = rowData.row;
3684
3987
  let disableEditCallback = false;
3685
3988
  if (firstTime) {
3686
- if (isFunction$1(options?.onComponentInit)) {
3989
+ if (isFunction(options?.onComponentInit)) {
3687
3990
  options.onComponentInit(component);
3688
3991
  }
3689
3992
  // install our edit callback
@@ -3698,7 +4001,7 @@ class PropertyColumnModel extends ColumnModel {
3698
4001
  disableEditCallback = true;
3699
4002
  component.value = rowData.row[this.property];
3700
4003
  disableEditCallback = false;
3701
- if (!isFunction$1(options) && isFunction$1(options?.onRowUpdate)) {
4004
+ if (!isFunction(options) && isFunction(options?.onRowUpdate)) {
3702
4005
  options.onRowUpdate(component, rowData.row);
3703
4006
  }
3704
4007
  }));
@@ -3706,7 +4009,7 @@ class PropertyColumnModel extends ColumnModel {
3706
4009
  }
3707
4010
  cellEditor(editor, validatorsOrInitialiser, onComponentInit) {
3708
4011
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3709
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
4012
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
3710
4013
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3711
4014
  const formValueModel = editSession.form.pluck(this.property);
3712
4015
  if (validators) {
@@ -3733,8 +4036,8 @@ class SelectionColumnModel extends ColumnModel {
3733
4036
  selectionModel;
3734
4037
  _enableHeaderControls = true;
3735
4038
  _color = "accent";
3736
- constructor(columnId, defaults, selectionModel) {
3737
- super(columnId, defaults);
4039
+ constructor(columnId, order, defaults, selectionModel) {
4040
+ super(columnId, order, defaults);
3738
4041
  this.selectionModel = selectionModel;
3739
4042
  const { chain } = Dsl.disposeWith(this);
3740
4043
  this._selectRowOnClick(false);
@@ -3775,6 +4078,42 @@ class SelectionColumnModel extends ColumnModel {
3775
4078
  }
3776
4079
  }
3777
4080
 
4081
+ let RowClass$1 = class RowClass {
4082
+ className;
4083
+ matches;
4084
+ constructor(className, matches) {
4085
+ this.className = className;
4086
+ this.matches = matches;
4087
+ }
4088
+ };
4089
+ class FooterRowModel {
4090
+ _rowClasses = [];
4091
+ noPadding() {
4092
+ this.addClass("no-padding");
4093
+ }
4094
+ addClass(className, condition) {
4095
+ this._rowClasses.push(new RowClass$1(className, condition ?? (() => true)));
4096
+ }
4097
+ }
4098
+ (function (FooterRowModel) {
4099
+ class Impl extends FooterRowModel {
4100
+ component;
4101
+ onInit;
4102
+ portal;
4103
+ constructor(component, onInit) {
4104
+ super();
4105
+ this.component = component;
4106
+ this.onInit = onInit;
4107
+ this.portal = new ComponentPortal(component);
4108
+ }
4109
+ getActiveRowClasses() {
4110
+ return this._rowClasses.filter(c => c.matches()).map(c => c.className).join(" ");
4111
+ }
4112
+ }
4113
+ FooterRowModel.Impl = Impl;
4114
+ })(FooterRowModel || (FooterRowModel = {}));
4115
+ ProxyRegistry.registerOneTimeBinding(FooterRowModel);
4116
+
3778
4117
  class TableMoreMenuComponent extends DisposableComponent {
3779
4118
  value$ = new MutableValueModel();
3780
4119
  #value_accessor_storage;
@@ -3784,13 +4123,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3784
4123
  popupType$ = new MutableValueModel();
3785
4124
  popupComponentPortal$;
3786
4125
  _visible$ = this.registerDisposable(new DelegatingValueModel());
4126
+ initialiseCallback;
3787
4127
  constructor() {
3788
4128
  super();
3789
4129
  const { chain } = Dsl.disposeWith(this);
3790
4130
  this.popupComponentPortal$ = chain(this.popupType$).map(type => new ComponentPortal(type));
3791
4131
  }
3792
- configurePopupComponentType(popupComponentType) {
4132
+ configurePopupComponentType(popupComponentType, configureCallback) {
3793
4133
  this.popupType$.value = popupComponentType;
4134
+ this.initialiseCallback = configureCallback;
3794
4135
  }
3795
4136
  // Stops tree selection when clicking the menu button
3796
4137
  preventDefault($event) {
@@ -3801,12 +4142,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3801
4142
  const component = $event.instance;
3802
4143
  component.initialise(this.value$, Command.create(() => this.matMenuTrigger.closeMenu()));
3803
4144
  this._visible$.setDelegate(component.visible$);
4145
+ if (this.initialiseCallback) {
4146
+ this.initialiseCallback(component);
4147
+ }
3804
4148
  }
3805
4149
  get visible$() {
3806
4150
  return this._visible$.readonly$;
3807
4151
  }
3808
4152
  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"] }] });
4153
+ 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
4154
  }
3811
4155
  __decorate([
3812
4156
  StoreInValueModel(),
@@ -3835,16 +4179,25 @@ class RowClass {
3835
4179
  this.matches = matches;
3836
4180
  }
3837
4181
  }
4182
+ class RowAttribute {
4183
+ attributeName;
4184
+ getValue;
4185
+ constructor(attributeName, getValue) {
4186
+ this.attributeName = attributeName;
4187
+ this.getValue = getValue;
4188
+ }
4189
+ }
3838
4190
  class AbstractTableModel extends GarbageCollector {
3839
4191
  _dataSource$ = this.registerDisposable(new DelegatingListModel());
3840
4192
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
3841
4193
  _visibleRows$ = this.registerDisposable(new DelegatingListModel());
3842
- _columnList = this.registerDisposable(new ColumnListModel());
4194
+ columnManager = this.registerDisposable(new ColumnManager());
3843
4195
  _editorSessions = new MutableListModel();
3844
4196
  _rowsBeingEdited$;
3845
4197
  saveCommandFactory;
3846
4198
  _editorSessionByRowId;
3847
4199
  rowClassNamePredicates = [];
4200
+ rowAttributeGenerators = [];
3848
4201
  _columnTextPropertiesLookup;
3849
4202
  editing$;
3850
4203
  firstEditableColumn$;
@@ -3861,6 +4214,8 @@ class AbstractTableModel extends GarbageCollector {
3861
4214
  selectedItems$;
3862
4215
  leadSelection$;
3863
4216
  hasSelection$;
4217
+ footerRowModel;
4218
+ _viewDependencies = new Set();
3864
4219
  constructor() {
3865
4220
  super();
3866
4221
  const { chain } = Dsl.disposeWith(this);
@@ -3869,15 +4224,15 @@ class AbstractTableModel extends GarbageCollector {
3869
4224
  });
3870
4225
  this._editorSessionByRowId = chain(this._editorSessions).indexBy("rowId");
3871
4226
  this.editing$ = chain(this._editorSessions).count().isGreaterThan(0);
3872
- this.textSearchPredicate$ = chain(this.visibleColumns).reduce(columns => {
4227
+ this.textSearchPredicate$ = chain(this.visibleColumns$).reduceAll(columns => {
3873
4228
  return (row, regex) => {
3874
4229
  return (!regex || !!columns.find(c => regex.test(c.getSearchTextFor(row))));
3875
4230
  };
3876
4231
  });
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);
4232
+ this.firstEditableColumn$ = chain(this.columns$).select(c => c.hasEditorPortal()).first();
4233
+ this.firstVisibleColumn$ = chain(this.visibleColumns$).first();
4234
+ this.lastVisibleColumn$ = chain(this.visibleColumns$).last();
4235
+ this.rowSelectionDisabledOnAllColumns$ = chain(this.columnManager.visibleColumns$).select(column => column.isRowSelectionEnabled()).count().equals(0);
3881
4236
  this.dataSourceEmpty$ = chain(this.dataSource$).isEmpty();
3882
4237
  this.selectedItems$ = this.selectionModelProxy.selectedItems$;
3883
4238
  this.leadSelection$ = this.selectionModelProxy.leadSelection$;
@@ -3901,9 +4256,23 @@ class AbstractTableModel extends GarbageCollector {
3901
4256
  ],
3902
4257
  parent: injector
3903
4258
  });
3904
- this.columns.value.forEach(c => c.initialise(customInjector));
4259
+ this.columns$.value.forEach(c => c.initialise(customInjector));
3905
4260
  this.identityOf = identityOf;
3906
4261
  }
4262
+ /**
4263
+ * Adds additional models that will trigger a table repaint. This is required if the table
4264
+ * needs to be redrawn outside of changes to the rows of filters. i.e. some eternal state is used
4265
+ * to assign row classes etc.
4266
+ *
4267
+ * Note: This function must be called before the table is bound to the model.
4268
+ * @param hasValues
4269
+ */
4270
+ viewStateDependsOn(...hasValues) {
4271
+ hasValues.forEach(it => this._viewDependencies.add(it));
4272
+ }
4273
+ get viewStateDependencies() {
4274
+ return Array.from(this._viewDependencies.values());
4275
+ }
3907
4276
  get dataSource$() {
3908
4277
  return this._dataSource$.readonly$;
3909
4278
  }
@@ -3954,19 +4323,19 @@ class AbstractTableModel extends GarbageCollector {
3954
4323
  });
3955
4324
  });
3956
4325
  }
3957
- get columns() {
3958
- return this._columnList.allColumns$;
4326
+ get columns$() {
4327
+ return this.columnManager.allColumns$;
3959
4328
  }
3960
- get visibleColumns() {
3961
- return this._columnList.readonly$;
4329
+ get visibleColumns$() {
4330
+ return this.columnManager.visibleColumns$;
3962
4331
  }
3963
4332
  pluck(property, options) {
3964
4333
  const columnId = options?.columnId || property.toString();
3965
- return this.addColumn(new PropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4334
+ return this.addColumn(new PropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3966
4335
  }
3967
4336
  pluckList(property, options) {
3968
4337
  const columnId = options?.columnId || property.toString();
3969
- return this.addColumn(new ListPropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4338
+ return this.addColumn(new ListPropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3970
4339
  }
3971
4340
  // TODO: clean this up and assign the selection model on teh table directly.
3972
4341
  // tableModel.useSelectionModel(model) and have the seleciton column automatically
@@ -3975,43 +4344,54 @@ class AbstractTableModel extends GarbageCollector {
3975
4344
  _addSelectionColumn(selectionModel, visible) {
3976
4345
  assert.isNil(this.selectionColumnModel);
3977
4346
  const columnId = "selection-column";
3978
- this.selectionColumnModel = new SelectionColumnModel(columnId, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
4347
+ this.selectionColumnModel = new SelectionColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
3979
4348
  this.selectionColumnModel.useSelectionModel(selectionModel);
3980
4349
  this.addRowClass("aup-row-selected", row => this.selectionColumnModel.isSelected(row));
3981
- const selectionColumnModel = this.addColumn(this.selectionColumnModel, 0);
3982
- if (!isNil$1(visible)) {
4350
+ const selectionColumnModel = this.addColumn(this.selectionColumnModel, { before: null }); // first column
4351
+ if (!isNil(visible)) {
3983
4352
  selectionColumnModel.visibleWhile(visible instanceof ValueModel ? visible : ValueModel.constant(visible));
3984
4353
  }
3985
4354
  return selectionColumnModel;
3986
4355
  }
3987
4356
  addEditControls(saveCommandFactory, formFactory) {
3988
4357
  this.saveCommandFactory = saveCommandFactory;
3989
- if (isFunction$1(formFactory)) {
4358
+ if (isFunction(formFactory)) {
3990
4359
  this._createForm = formFactory;
3991
4360
  }
3992
4361
  const columnId = "editControls";
3993
- return this.addColumn(new EditorControlColumnModel(columnId, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
4362
+ return this.addColumn(new EditorControlColumnModel(columnId, this.columnManager, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
3994
4363
  }
3995
4364
  addCustomColumn(columnId, dataAccessor) {
3996
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), dataAccessor));
4365
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), dataAccessor));
3997
4366
  }
3998
4367
  addComponentColumn(columnId, component, onComponentInitOrOptions) {
3999
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4368
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4000
4369
  }
4001
- addMoreMenu(componentClass) {
4370
+ addMoreMenu(componentClass, initialiseCallback) {
4002
4371
  return this.addComponentColumn("more-menu", TableMoreMenuComponent, (component) => {
4003
- component.configurePopupComponentType(componentClass);
4372
+ component.configurePopupComponentType(componentClass, initialiseCallback);
4004
4373
  }).columnTextProperties({
4005
4374
  headerText() {
4006
4375
  return "";
4007
4376
  }
4008
4377
  });
4009
4378
  }
4379
+ addFooterRow(component, initialiseCallback) {
4380
+ assert.isNil(this.footerRowModel);
4381
+ this.footerRowModel = new FooterRowModel.Impl(component, initialiseCallback);
4382
+ return this.footerRowModel;
4383
+ }
4010
4384
  addTemplateColumn(columnId) {
4011
- return this.addColumn(new CustomTemplateColumnModel(columnId, () => this.getColumnTextProperties(columnId)));
4385
+ return this.addColumn(new CustomTemplateColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId)));
4012
4386
  }
4013
- addRowClass(className, predicate) {
4387
+ addRowClass(className, predicate, options) {
4014
4388
  this.rowClassNamePredicates.push(new RowClass(className, predicate));
4389
+ if (options) {
4390
+ this.viewStateDependsOn(...DependsOnOptions.extract(options));
4391
+ }
4392
+ }
4393
+ addRowAttribute(attributeName, getValue) {
4394
+ this.rowAttributeGenerators.push(new RowAttribute(attributeName, getValue));
4015
4395
  }
4016
4396
  getRowClasses(row) {
4017
4397
  const classNames = [];
@@ -4022,8 +4402,13 @@ class AbstractTableModel extends GarbageCollector {
4022
4402
  });
4023
4403
  return classNames;
4024
4404
  }
4025
- addColumn(column, index) {
4026
- return this._columnList.addColumn(column, index);
4405
+ getRowAttributes(row) {
4406
+ return this.rowAttributeGenerators.reduce((result, generator) => {
4407
+ return { ...result, [generator.attributeName]: generator.getValue(row) };
4408
+ }, {});
4409
+ }
4410
+ addColumn(column, position) {
4411
+ return this.columnManager.addColumn(column, position);
4027
4412
  }
4028
4413
  columnTextProperties(columnTextProperties) {
4029
4414
  this._columnTextPropertiesLookup = columnTextProperties;
@@ -4140,7 +4525,7 @@ class TableCellComponent extends DisposableComponent {
4140
4525
  };
4141
4526
  }
4142
4527
  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"] }] });
4528
+ 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
4529
  }
4145
4530
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableCellComponent, decorators: [{
4146
4531
  type: Component,
@@ -4179,7 +4564,7 @@ class TableHeaderCellComponent {
4179
4564
  return this[HEADER_CELL_RENDERER_PORTAL];
4180
4565
  }
4181
4566
  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"] }] });
4567
+ 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
4568
  }
4184
4569
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableHeaderCellComponent, decorators: [{
4185
4570
  type: Component,
@@ -4191,61 +4576,132 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
4191
4576
  args: ['class']
4192
4577
  }] } });
4193
4578
 
4579
+ // eslint-disable-next-line @angular-eslint/component-class-suffix
4580
+ class TableFooterRow {
4581
+ row;
4582
+ defaultClassNames = 'aup-footer-row-renderer';
4583
+ get rowClasses() {
4584
+ return this.row.getActiveRowClasses();
4585
+ }
4586
+ initialise($event) {
4587
+ this.row.onInit && this.row.onInit($event.instance);
4588
+ }
4589
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, deps: [], target: i0.ɵɵFactoryTarget.Component });
4590
+ 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"] }] });
4591
+ }
4592
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, decorators: [{
4593
+ type: Component,
4594
+ 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"] }]
4595
+ }], propDecorators: { row: [{
4596
+ type: Input
4597
+ }], defaultClassNames: [{
4598
+ type: HostBinding,
4599
+ args: ['class']
4600
+ }], rowClasses: [{
4601
+ type: HostBinding,
4602
+ args: ['class']
4603
+ }] } });
4604
+
4605
+ const AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER = new InjectionToken("AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER");
4606
+ class TableRowAttributesDirective {
4607
+ elementRef;
4608
+ aupTableRowAttributes;
4609
+ constructor(elementRef) {
4610
+ this.elementRef = elementRef;
4611
+ }
4612
+ ngOnInit() {
4613
+ for (const attr in this.aupTableRowAttributes) {
4614
+ this.elementRef.nativeElement.setAttribute(attr, this.aupTableRowAttributes[attr]);
4615
+ }
4616
+ }
4617
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
4618
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: { aupTableRowAttributes: "aupTableRowAttributes" }, ngImport: i0 });
4619
+ }
4620
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, decorators: [{
4621
+ type: Directive,
4622
+ args: [{
4623
+ selector: "[aupTableRowAttributes]",
4624
+ }]
4625
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { aupTableRowAttributes: [{
4626
+ type: Input
4627
+ }] } });
4194
4628
  class TableBodyComponent extends ResizeAwareComponent {
4629
+ bufferMultiplier;
4195
4630
  #data$_accessor_storage = proxify((ListModel));
4196
4631
  get data$() { return this.#data$_accessor_storage; }
4197
4632
  set data$(value) { this.#data$_accessor_storage = value; }
4198
4633
  #tableModel_accessor_storage = proxify((AbstractTableModel));
4199
4634
  get tableModel() { return this.#tableModel_accessor_storage; }
4200
4635
  set tableModel(value) { this.#tableModel_accessor_storage = value; }
4636
+ #footerRow_accessor_storage = proxify((FooterRowModel.Impl));
4637
+ get footerRow() { return this.#footerRow_accessor_storage; }
4638
+ set footerRow(value) { this.#footerRow_accessor_storage = value; }
4201
4639
  #showHeader$_accessor_storage = proxify((ValueModel));
4202
4640
  get showHeader$() { return this.#showHeader$_accessor_storage; }
4203
4641
  set showHeader$(value) { this.#showHeader$_accessor_storage = value; }
4204
4642
  #showHeader_accessor_storage = true;
4205
4643
  get showHeader() { return this.#showHeader_accessor_storage; }
4206
4644
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
4207
- visibleRowCount = new EventEmitter();
4208
4645
  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;
4646
+ #scrollMode$_accessor_storage = proxify((ValueModel));
4647
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
4648
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
4649
+ #scrollMode_accessor_storage = "none";
4650
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
4651
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4652
+ scrollViewport;
4215
4653
  columns$;
4216
4654
  columnIds$;
4217
4655
  columnsById$;
4218
- _visibleRowCount$;
4219
4656
  // TODO: support user defined header and row heights via css vars.
4220
- headerHeight$ = new MutableValueModel(29);
4221
- rowHeight$ = new MutableValueModel(40);
4657
+ headerHeight$ = new MutableValueModel(48);
4658
+ rowHeight$ = new MutableValueModel(44);
4222
4659
  baseCssClass = "aup-table-component";
4223
- constructor(elementRef, ngZone) {
4224
- super(elementRef, ngZone);
4225
- const { chain, when } = Dsl.disposeWith(this);
4660
+ virtualScrollDataSource = new TableVirtualScrollDataSource();
4661
+ virtualScrollActive$ = new MutableValueModel(false);
4662
+ scrollTimeout;
4663
+ constructor(bufferMultiplier = 1) {
4664
+ super();
4665
+ this.bufferMultiplier = bufferMultiplier;
4666
+ const { chain, when, observe } = Dsl.disposeWith(this);
4226
4667
  const actualHeaderHeight$ = chain(this.showHeader$).map(show => {
4227
4668
  return show ? this.headerHeight$.value : 0;
4228
4669
  }, { 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" });
4670
+ // performance is terrible if the data changes while we're scrolling, so we postpone updates until
4671
+ // scrolling stops.
4672
+ const delayedDatea$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
4673
+ when(delayedDatea$).changes(delatedData => {
4674
+ this.virtualScrollDataSource.data = delatedData;
4675
+ this.scheduleTableHeightCheck();
4676
+ }, { initialValue: "evaluate" });
4240
4677
  this.onInit(() => {
4241
- this.columns$ = chain(this.tableModel.columns);
4678
+ this.columns$ = chain(this.tableModel.visibleColumns$);
4242
4679
  this.columnIds$ = chain(this.columns$).pluck("columnId");
4243
4680
  this.columnsById$ = chain(this.columns$).indexBy('columnId');
4244
4681
  });
4682
+ // const txo = new TransactionObserver({verbose: false}).onEvent(e => console.log(e.name, e.payload));
4683
+ // txo.observe('this.virtualScrollRowRange$', this.virtualScrollRowRange$);
4684
+ // txo.observe('this.virtualScrollSpacerSize$', this.virtualScrollSpacerSize$);
4685
+ // txo.observe('this.virtualRows$', this.virtualRows$);
4686
+ // txo.observe('this.tableBodyHeight$', this.tableBodyHeight$);
4687
+ // txo.observe('this.virtualScrollActive$', this.virtualScrollActive$);
4688
+ }
4689
+ ngAfterViewInit() {
4690
+ super.ngAfterViewInit();
4691
+ if (this.scrollViewport) {
4692
+ const { observe } = Dsl.disposeWith(this);
4693
+ this.scrollViewport.elementScrolled().subscribe(() => this.notifyScrolled());
4694
+ }
4245
4695
  }
4246
4696
  get hideHeader() {
4247
4697
  return !this.showHeader;
4248
4698
  }
4699
+ get headerHeightCssVar() {
4700
+ return `${this.headerHeight$.value}px`;
4701
+ }
4702
+ get rowHeightCssVar() {
4703
+ return `${this.rowHeight$.value}px`;
4704
+ }
4249
4705
  isEditing(row) {
4250
4706
  return !!this.tableModel.getEditSessionFor(row);
4251
4707
  }
@@ -4270,51 +4726,110 @@ class TableBodyComponent extends ResizeAwareComponent {
4270
4726
  }
4271
4727
  return classes;
4272
4728
  }
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"] }] });
4729
+ scheduleTableHeightCheck(waitMillis = 50) {
4730
+ setTimeout(() => {
4731
+ const tbody = this.elementRef.nativeElement.querySelector("tbody");
4732
+ const bodyHeight = tbody.offsetHeight;
4733
+ if (this.data$.length > 0 && bodyHeight < this.rowHeight$.value) {
4734
+ // Hacks to get our virtual scroll to repaint
4735
+ // Logger.get(this).log(`rowCount=${this.data$.length}, bodyHeight=${bodyHeight} -> virtual table not rendering, triggering resize to force repaint`)
4736
+ window.dispatchEvent(new Event('resize'));
4737
+ if (waitMillis < 500) {
4738
+ this.scheduleTableHeightCheck(waitMillis + 50);
4739
+ }
4740
+ }
4741
+ }, waitMillis);
4742
+ }
4743
+ notifyScrolled() {
4744
+ this.virtualScrollActive$.value = true;
4745
+ this.clearScrollTimeout();
4746
+ this.scrollTimeout = setTimeout(() => {
4747
+ return this.virtualScrollActive$.value = false;
4748
+ }, 200);
4749
+ }
4750
+ clearScrollTimeout() {
4751
+ if (this.scrollTimeout) {
4752
+ clearTimeout(this.scrollTimeout);
4753
+ }
4754
+ }
4755
+ initialiseFooter($event) {
4756
+ const portalRef = $event;
4757
+ this.footerRow.onInit(portalRef.instance);
4758
+ }
4759
+ Proxify = Proxify;
4760
+ 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 });
4761
+ 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
4762
  }
4276
4763
  __decorate([
4277
4764
  Proxify(),
4278
- __metadata("design:type", Object)
4765
+ __metadata("design:type", ListModel)
4279
4766
  ], TableBodyComponent.prototype, "data$", null);
4280
4767
  __decorate([
4281
4768
  Proxify(),
4282
- __metadata("design:type", Object)
4769
+ __metadata("design:type", AbstractTableModel)
4283
4770
  ], TableBodyComponent.prototype, "tableModel", null);
4284
4771
  __decorate([
4285
4772
  Proxify(),
4286
- __metadata("design:type", Object)
4773
+ __metadata("design:type", FooterRowModel.Impl)
4774
+ ], TableBodyComponent.prototype, "footerRow", null);
4775
+ __decorate([
4776
+ Proxify(),
4777
+ __metadata("design:type", ValueModel)
4287
4778
  ], TableBodyComponent.prototype, "showHeader$", null);
4288
4779
  __decorate([
4289
4780
  StoreInValueModel(),
4290
4781
  __metadata("design:type", Object)
4291
4782
  ], TableBodyComponent.prototype, "showHeader", null);
4783
+ __decorate([
4784
+ Proxify(),
4785
+ __metadata("design:type", ValueModel)
4786
+ ], TableBodyComponent.prototype, "scrollMode$", null);
4787
+ __decorate([
4788
+ StoreInValueModel(),
4789
+ __metadata("design:type", String)
4790
+ ], TableBodyComponent.prototype, "scrollMode", null);
4292
4791
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, decorators: [{
4293
4792
  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$: [{
4793
+ 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"] }]
4794
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
4795
+ type: Inject,
4796
+ args: [AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER]
4797
+ }, {
4798
+ type: Optional
4799
+ }] }]; }, propDecorators: { data$: [{
4296
4800
  type: Input
4297
4801
  }], tableModel: [{
4298
4802
  type: Input
4803
+ }], footerRow: [{
4804
+ type: Input
4299
4805
  }], showHeader$: [{
4300
4806
  type: Input
4301
4807
  }], showHeader: [{
4302
4808
  type: Input
4303
- }], visibleRowCount: [{
4304
- type: Output
4305
4809
  }], trackBy: [{
4306
4810
  type: Input
4307
- }], enableScrolling: [{
4811
+ }], scrollMode$: [{
4812
+ type: Input
4813
+ }], scrollMode: [{
4308
4814
  type: Input
4309
4815
  }, {
4310
4816
  type: HostBinding,
4311
- args: ["class.enable-scrolling"]
4817
+ args: ["attr.scrollMode"]
4818
+ }], scrollViewport: [{
4819
+ type: ViewChild,
4820
+ args: [CdkVirtualScrollViewport]
4312
4821
  }], baseCssClass: [{
4313
4822
  type: HostBinding,
4314
4823
  args: ["class"]
4315
4824
  }], hideHeader: [{
4316
4825
  type: HostBinding,
4317
4826
  args: ["class.hide-header"]
4827
+ }], headerHeightCssVar: [{
4828
+ type: HostBinding,
4829
+ args: ["style.--aup-table-header-height"]
4830
+ }], rowHeightCssVar: [{
4831
+ type: HostBinding,
4832
+ args: ["style.--aup-table-row-height"]
4318
4833
  }] } });
4319
4834
 
4320
4835
  class TableMoreMenuPopupComponent extends DisposableComponent {
@@ -4435,8 +4950,10 @@ class TableFilterModel extends GarbageCollector {
4435
4950
  this.useSearchText(options.searchText$);
4436
4951
  this.useRowPredicate(options.predicate$);
4437
4952
  const { chain } = Dsl.disposeWith(this);
4438
- const textSearchRegex$ = chain(this._searchText$).map(text => {
4439
- return isEmpty$1(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4953
+ const textSearchRegex$ = chain(this._searchText$)
4954
+ .debounce(250)
4955
+ .map(text => {
4956
+ return isEmpty(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4440
4957
  }, { allowNil: true });
4441
4958
  this._rowPredicate = chain(this._rowPredicate$)
4442
4959
  .map(predicate => {
@@ -4644,31 +5161,30 @@ class TableComponent extends AbstractTableComponent {
4644
5161
  #filterModel_accessor_storage = proxify((TableFilterModel));
4645
5162
  get filterModel() { return this.#filterModel_accessor_storage; }
4646
5163
  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
- // }
5164
+ tableBody;
5165
+ #scrollMode$_accessor_storage = proxify((ValueModel));
5166
+ /**
5167
+ * 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
5168
+ * renders all rows but allows row heights to grow.
5169
+ */
5170
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
5171
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
5172
+ #scrollMode_accessor_storage;
5173
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
5174
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4660
5175
  _footerContentAdded = false;
4661
5176
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
4662
- _pageSize = new MutableValueModel();
4663
- pagedListModel;
5177
+ tableBodyScrollMode$;
4664
5178
  constructor(injector) {
4665
5179
  super(injector);
4666
- const { when } = Dsl.disposeWith(this);
4667
- this.onDispose(() => this.disposeOfPagedListModel());
4668
- when(this.enablePaging$).changes(enabled => this.configurePaging(enabled));
5180
+ const { chain, when } = Dsl.disposeWith(this);
5181
+ this.tableBodyScrollMode$ = chain(this.enableScrolling$).map(enable => {
5182
+ return enable ? (this.scrollMode$.value ?? "virtual") : 'none';
5183
+ }, { dependsOn: this.scrollMode$ });
4669
5184
  }
4670
5185
  ngOnInit() {
4671
5186
  super.ngOnInit();
5187
+ const { when } = Dsl.disposeWith(this);
4672
5188
  if (CanProxy.hasTarget(this.filterModel)) {
4673
5189
  this.registerDisposable(this.filterModel.bindToTable(this._dataSource$, this.getModel().textSearchPredicate$));
4674
5190
  this.highlightText$.setDelegate(this.filterModel.highlightText$);
@@ -4677,50 +5193,27 @@ class TableComponent extends AbstractTableComponent {
4677
5193
  else {
4678
5194
  this._filteredRows$.setDelegate(this._dataSource$);
4679
5195
  }
4680
- this.configurePaging(this.enablePaging$.value);
5196
+ this._visibleRows$.setDelegate(this._filteredRows$);
5197
+ // let users of the model know what the current visible and filtered rows are for selection models and what not
4681
5198
  this.tableModel.bindToTable(this._filteredRows$, this._visibleRows$);
5199
+ when.anyOf(...this.tableModel.viewStateDependencies).changes(() => this.cdr.markForCheck());
5200
+ this.viewStateDependsOn(this._filteredRows$, this.tableModel.visibleColumns$);
4682
5201
  }
4683
5202
  getModel() {
4684
5203
  return this.tableModel;
4685
5204
  }
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
5205
  footerContentChanged($event) {
4709
5206
  // console.log($event);
4710
5207
  this._footerContentAdded = true;
4711
5208
  }
4712
- //@Trace()
4713
- updatePageSize(count) {
4714
- this._pageSize.value = count;
4715
- }
4716
5209
  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: [
5210
+ 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
5211
  { 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"] }] });
5212
+ ], 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
5213
  }
4721
5214
  __decorate([
4722
5215
  Proxify(),
4723
- __metadata("design:type", Object)
5216
+ __metadata("design:type", TableModel)
4724
5217
  ], TableComponent.prototype, "tableModel", null);
4725
5218
  __decorate([
4726
5219
  Proxify(),
@@ -4728,24 +5221,27 @@ __decorate([
4728
5221
  ], TableComponent.prototype, "filterModel", null);
4729
5222
  __decorate([
4730
5223
  Proxify(),
4731
- __metadata("design:type", Object)
4732
- ], TableComponent.prototype, "enablePaging$", null);
5224
+ __metadata("design:type", ValueModel)
5225
+ ], TableComponent.prototype, "scrollMode$", null);
4733
5226
  __decorate([
4734
5227
  StoreInValueModel(),
4735
5228
  __metadata("design:type", Object)
4736
- ], TableComponent.prototype, "enablePaging", null);
5229
+ ], TableComponent.prototype, "scrollMode", null);
4737
5230
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableComponent, decorators: [{
4738
5231
  type: Component,
4739
5232
  args: [{ selector: 'aup-table', providers: [
4740
5233
  { 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"] }]
5234
+ ], 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
5235
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { tableModel: [{
4743
5236
  type: Input
4744
5237
  }], filterModel: [{
4745
5238
  type: Input
4746
- }], enablePaging$: [{
5239
+ }], tableBody: [{
5240
+ type: ViewChild,
5241
+ args: [TableBodyComponent]
5242
+ }], scrollMode$: [{
4747
5243
  type: Input
4748
- }], enablePaging: [{
5244
+ }], scrollMode: [{
4749
5245
  type: Input
4750
5246
  }] } });
4751
5247
 
@@ -4927,7 +5423,7 @@ var DecoratedTreeNode;
4927
5423
  }
4928
5424
  }
4929
5425
  __decorate([
4930
- Memoize(),
5426
+ MemoizeGet(),
4931
5427
  __metadata("design:type", Array),
4932
5428
  __metadata("design:paramtypes", [])
4933
5429
  ], Decorator.prototype, "children", null);
@@ -4980,7 +5476,7 @@ var DecoratedTreeNode;
4980
5476
  __metadata("design:returntype", Array)
4981
5477
  ], Decorator.prototype, "ancestors", null);
4982
5478
  __decorate([
4983
- Memoize(),
5479
+ MemoizeGet(),
4984
5480
  __metadata("design:type", Number),
4985
5481
  __metadata("design:paramtypes", [])
4986
5482
  ], Decorator.prototype, "depth", null);
@@ -4991,8 +5487,8 @@ class TreeLabelColumnModel extends ColumnModel {
4991
5487
  expansionModel;
4992
5488
  labelFactory = () => undefined;
4993
5489
  iconFactory;
4994
- constructor(columnId, textPropertiesProvider, expansionModel) {
4995
- super(columnId, textPropertiesProvider);
5490
+ constructor(columnId, order, textPropertiesProvider, expansionModel) {
5491
+ super(columnId, order, textPropertiesProvider);
4996
5492
  this.expansionModel = expansionModel;
4997
5493
  this.cellRenderer(TreeLabelCellRendererComponent);
4998
5494
  }
@@ -5051,7 +5547,7 @@ class TreeTableModel extends AbstractTableModel {
5051
5547
  get isExpandedPredicate$() {
5052
5548
  return this._isExpandedPredicate$.readonly$;
5053
5549
  }
5054
- bindToTable(expansionModel, filteredRows$, visibleRows$) {
5550
+ bindToTable(expansionModel, filteredRows$, visibleRows$, cdr) {
5055
5551
  this.treeExpansionModel = expansionModel;
5056
5552
  // TODO: Move all the expansion model stuff out of here and have things use the expansion model directly
5057
5553
  this._isExpandedPredicate$.setDelegate(this.treeExpansionModel.isExpandedPredicate$);
@@ -5060,7 +5556,7 @@ class TreeTableModel extends AbstractTableModel {
5060
5556
  }
5061
5557
  treeControlColumn(builder) {
5062
5558
  const columnId = 'tree-label';
5063
- const column = new TreeLabelColumnModel(columnId, () => this.getColumnTextProperties(columnId), this);
5559
+ const column = new TreeLabelColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this);
5064
5560
  builder(column);
5065
5561
  this.addColumn(column);
5066
5562
  }
@@ -5386,11 +5882,15 @@ class TreeTableComponent extends AbstractTableComponent {
5386
5882
  #expansionModel_accessor_storage = proxify((TreeExpansionModel));
5387
5883
  get expansionModel() { return this.#expansionModel_accessor_storage; }
5388
5884
  set expansionModel(value) { this.#expansionModel_accessor_storage = value; }
5885
+ scrollMode$;
5389
5886
  constructor(injector) {
5390
5887
  super(injector);
5888
+ const { chain } = Dsl.disposeWith(this);
5889
+ this.scrollMode$ = chain(this.enableScrolling$).map(enabled => enabled ? "classic" : "none");
5391
5890
  }
5392
5891
  ngOnInit() {
5393
5892
  super.ngOnInit();
5893
+ const { when } = Dsl.disposeWith(this);
5394
5894
  // TODO: clean up all this tightly coupled shit, should the expansion model really be separate from the tree model?
5395
5895
  if (!this.expansionModel) {
5396
5896
  this.expansionModel = new TreeExpansionModel({ disposedWith: this });
@@ -5399,7 +5899,10 @@ class TreeTableComponent extends AbstractTableComponent {
5399
5899
  const visibleRows$ = new FlattenedTreeListModel(this._dataSource$, row => this.treeTableModel.childExtractor(row), this.expansionModel);
5400
5900
  this._visibleRows$.setDelegate(visibleRows$);
5401
5901
  this.expansionModel.bindToTable(this._dataSource$, visibleRows$);
5402
- this.treeTableModel.bindToTable(this.expansionModel, visibleRows$, this._visibleRows$);
5902
+ this.treeTableModel.bindToTable(this.expansionModel, visibleRows$, this._visibleRows$, this.cdr);
5903
+ this.viewStateDependsOn(this.treeTableModel.visibleRows$);
5904
+ this.viewStateDependsOn(this.treeTableModel.visibleRows$);
5905
+ when.anyOf(...this.treeTableModel.viewStateDependencies).changes(() => this.cdr.markForCheck());
5403
5906
  }
5404
5907
  getModel() {
5405
5908
  return this.treeTableModel;
@@ -5407,7 +5910,7 @@ class TreeTableComponent extends AbstractTableComponent {
5407
5910
  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
5911
  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
5912
  { 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"] }] });
5913
+ ], 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
5914
  }
5412
5915
  __decorate([
5413
5916
  Proxify(),
@@ -5421,7 +5924,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5421
5924
  type: Component,
5422
5925
  args: [{ selector: 'aup-tree-table', providers: [
5423
5926
  { 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"] }]
5927
+ ], 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
5928
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { treeTableModel: [{
5426
5929
  type: Input
5427
5930
  }], expansionModel: [{
@@ -5603,6 +6106,7 @@ class ComponentsModule {
5603
6106
  FocusableComponent,
5604
6107
  CardContainerComponent,
5605
6108
  TableComponent,
6109
+ TableRowAttributesDirective,
5606
6110
  EditRowControlsComponent,
5607
6111
  ColumnTemplateDirective,
5608
6112
  DefaultCellRendererComponent,
@@ -5636,7 +6140,9 @@ class ComponentsModule {
5636
6140
  MarkdownComponent,
5637
6141
  TableBodyComponent,
5638
6142
  TableMoreMenuComponent,
5639
- TableMoreMenuPopupComponent], imports: [CommonModule,
6143
+ TableMoreMenuPopupComponent,
6144
+ SearchInputComponent,
6145
+ TableFooterRow], imports: [CommonModule,
5640
6146
  BrowserAnimationsModule,
5641
6147
  FormsModule,
5642
6148
  MatInputModule,
@@ -5655,7 +6161,10 @@ class ComponentsModule {
5655
6161
  MatMenuModule,
5656
6162
  MatDividerModule,
5657
6163
  MatProgressSpinnerModule,
5658
- MatProgressBarModule], exports: [NumberInputComponent,
6164
+ MatProgressBarModule,
6165
+ ScrollingModule,
6166
+ TableVirtualScrollModule], exports: [TableFooterRow,
6167
+ NumberInputComponent,
5659
6168
  StringInputComponent,
5660
6169
  TextInputComponent,
5661
6170
  PasswordInputComponent,
@@ -5693,7 +6202,8 @@ class ComponentsModule {
5693
6202
  LoadingContainerComponent,
5694
6203
  MarkdownComponent,
5695
6204
  TableMoreMenuComponent,
5696
- TableMoreMenuPopupComponent] });
6205
+ TableMoreMenuPopupComponent,
6206
+ SearchInputComponent] });
5697
6207
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, providers: [
5698
6208
  FocusBindingFactory,
5699
6209
  MarkdownService
@@ -5716,7 +6226,9 @@ class ComponentsModule {
5716
6226
  MatMenuModule,
5717
6227
  MatDividerModule,
5718
6228
  MatProgressSpinnerModule,
5719
- MatProgressBarModule] });
6229
+ MatProgressBarModule,
6230
+ ScrollingModule,
6231
+ TableVirtualScrollModule] });
5720
6232
  }
5721
6233
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, decorators: [{
5722
6234
  type: NgModule,
@@ -5741,7 +6253,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5741
6253
  MatMenuModule,
5742
6254
  MatDividerModule,
5743
6255
  MatProgressSpinnerModule,
5744
- MatProgressBarModule
6256
+ MatProgressBarModule,
6257
+ ScrollingModule,
6258
+ TableVirtualScrollModule
5745
6259
  ],
5746
6260
  declarations: [
5747
6261
  AbstractInputComponent,
@@ -5765,6 +6279,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5765
6279
  FocusableComponent,
5766
6280
  CardContainerComponent,
5767
6281
  TableComponent,
6282
+ TableRowAttributesDirective,
5768
6283
  EditRowControlsComponent,
5769
6284
  ColumnTemplateDirective,
5770
6285
  DefaultCellRendererComponent,
@@ -5799,8 +6314,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5799
6314
  TableBodyComponent,
5800
6315
  TableMoreMenuComponent,
5801
6316
  TableMoreMenuPopupComponent,
6317
+ SearchInputComponent,
6318
+ TableFooterRow
5802
6319
  ],
5803
6320
  exports: [
6321
+ TableFooterRow,
5804
6322
  NumberInputComponent,
5805
6323
  StringInputComponent,
5806
6324
  TextInputComponent,
@@ -5840,6 +6358,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5840
6358
  MarkdownComponent,
5841
6359
  TableMoreMenuComponent,
5842
6360
  TableMoreMenuPopupComponent,
6361
+ SearchInputComponent
5843
6362
  ],
5844
6363
  providers: [
5845
6364
  FocusBindingFactory,
@@ -5848,6 +6367,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5848
6367
  }]
5849
6368
  }] });
5850
6369
 
6370
+ class LoadableComponent extends DisposableComponent {
6371
+ #_loaded$ = new MutableValueModel();
6372
+ #asyncLoadables = [];
6373
+ #awaitedLoadables = [];
6374
+ get loaded$() {
6375
+ return this.#_loaded$.readonly$;
6376
+ }
6377
+ ngOnInit() {
6378
+ super.ngOnInit();
6379
+ this.#asyncLoadables.forEach(it => it.ensureLoaded());
6380
+ if (this.#awaitedLoadables.length > 0) {
6381
+ Promise.all(this.#awaitedLoadables.map(it => {
6382
+ return it.ensureLoaded(); //.then(() => console.log(`${it.constructor.name} loaded`));
6383
+ })).then(() => {
6384
+ this.#_loaded$.value = true;
6385
+ });
6386
+ }
6387
+ else {
6388
+ this.#_loaded$.value = true;
6389
+ }
6390
+ }
6391
+ injectLoadable(token, options) {
6392
+ return this.registerLoadable(inject(token, options), options);
6393
+ }
6394
+ registerLoadable(loadable, options) {
6395
+ if (this.loaded$.value) {
6396
+ loadable.ensureLoaded();
6397
+ }
6398
+ else {
6399
+ if (!options || options.wait === true) {
6400
+ this.#awaitedLoadables.push(loadable);
6401
+ }
6402
+ else {
6403
+ this.#asyncLoadables.push(loadable);
6404
+ }
6405
+ }
6406
+ return loadable;
6407
+ }
6408
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
6409
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: LoadableComponent, usesInheritance: true, ngImport: i0 });
6410
+ }
6411
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, decorators: [{
6412
+ type: Directive
6413
+ }] });
6414
+
6415
+ class TextSearchContext {
6416
+ row;
6417
+ searchText;
6418
+ searchRegex;
6419
+ constructor(row, searchText, searchRegex) {
6420
+ this.row = row;
6421
+ this.searchText = searchText;
6422
+ this.searchRegex = searchRegex;
6423
+ }
6424
+ getOrCreate(type, create) {
6425
+ }
6426
+ matchesText(text) {
6427
+ return this.searchRegex.test(text);
6428
+ }
6429
+ }
6430
+
6431
+ class AbstractCellRenderer extends LoadableComponent {
6432
+ constructor() {
6433
+ super();
6434
+ }
6435
+ }
6436
+
5851
6437
  /**
5852
6438
  * @file Automatically generated by barrelsby.
5853
6439
  */
@@ -5874,7 +6460,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5874
6460
  * </aup-activity-actions>
5875
6461
  */
5876
6462
  class ActivityActionsComponent extends DisposableComponent {
5877
- cdr;
5878
6463
  confirmCommandComponent;
5879
6464
  cancelCommandComponent;
5880
6465
  #confirmCommand_accessor_storage = proxify((Command));
@@ -5903,9 +6488,9 @@ class ActivityActionsComponent extends DisposableComponent {
5903
6488
  }
5904
6489
  layout = ActivityActionsComponent.Layout.BLOCK;
5905
6490
  align = ActivityActionsComponent.Align.STRETCH;
5906
- constructor(cdr) {
6491
+ alignContent = ActivityActionsComponent.AlignContent.CENTER;
6492
+ constructor() {
5907
6493
  super();
5908
- this.cdr = cdr;
5909
6494
  }
5910
6495
  hasConfirmFace() {
5911
6496
  return !!this.confirmFace;
@@ -5924,8 +6509,8 @@ class ActivityActionsComponent extends DisposableComponent {
5924
6509
  focusCancel() {
5925
6510
  this.cancelCommandComponent.requestFocus();
5926
6511
  }
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"] }] });
6512
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6513
+ 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
6514
  }
5930
6515
  __decorate([
5931
6516
  Proxify(),
@@ -5937,8 +6522,8 @@ __decorate([
5937
6522
  ], ActivityActionsComponent.prototype, "cancelCommand", null);
5938
6523
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, decorators: [{
5939
6524
  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: [{
6525
+ 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"] }]
6526
+ }], ctorParameters: function () { return []; }, propDecorators: { confirmCommandComponent: [{
5942
6527
  type: ViewChild,
5943
6528
  args: ["confirmCommandComponent"]
5944
6529
  }], cancelCommandComponent: [{
@@ -5966,6 +6551,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5966
6551
  }, {
5967
6552
  type: HostBinding,
5968
6553
  args: ['attr.align']
6554
+ }], alignContent: [{
6555
+ type: Input
6556
+ }, {
6557
+ type: HostBinding,
6558
+ args: ['attr.align-content']
5969
6559
  }] } });
5970
6560
  (function (ActivityActionsComponent) {
5971
6561
  ActivityActionsComponent.Layout = Enum({
@@ -5974,14 +6564,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5974
6564
  });
5975
6565
  ActivityActionsComponent.Align = Enum({
5976
6566
  START: 'start',
5977
- END: 'end',
5978
- STRETCH: 'stretch'
6567
+ STRETCH: 'stretch',
6568
+ END: 'end'
6569
+ });
6570
+ ActivityActionsComponent.AlignContent = Enum({
6571
+ START: 'start',
6572
+ CENTER: 'center',
6573
+ END: 'end'
5979
6574
  });
5980
6575
  })(ActivityActionsComponent || (ActivityActionsComponent = {}));
5981
6576
 
5982
6577
  const ACTIVITY_DATA = new InjectionToken("InteractionActivityData");
5983
6578
  // eslint-disable-next-line @angular-eslint/component-class-suffix
5984
- class Activity extends DisposableComponent {
6579
+ class Activity extends LoadableComponent {
5985
6580
  activityData = inject(ACTIVITY_DATA);
5986
6581
  activityReadyListeners = new EventListenerList();
5987
6582
  _busy$ = this.registerDisposable(new DelegatingValueModel().withDefault(false));
@@ -6036,7 +6631,6 @@ class Activity extends DisposableComponent {
6036
6631
  notifyActivityReady() {
6037
6632
  this.activityReadyListeners.fire(l => l(this));
6038
6633
  this._ready$.value = true;
6039
- console.log("ready");
6040
6634
  }
6041
6635
  onActivityReady(callback) {
6042
6636
  return this.activityReadyListeners.add(callback);
@@ -6156,7 +6750,7 @@ class AbstractDialogComponent extends Activity {
6156
6750
  }
6157
6751
  }
6158
6752
  isDestructive() {
6159
- return isFunction$1(this.config['destructive']) && this.config["destructive"]();
6753
+ return isFunction(this.config['destructive']) && this.config["destructive"]();
6160
6754
  }
6161
6755
  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
6756
  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 +6767,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6173
6767
 
6174
6768
  class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6175
6769
  cancelFace;
6770
+ confirmClass = "aup-confirm-activity";
6176
6771
  constructor(config) {
6177
6772
  super(config);
6178
6773
  this.cancelFace = {
@@ -6183,7 +6778,7 @@ class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6183
6778
  });
6184
6779
  }
6185
6780
  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 });
6781
+ 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
6782
  }
6188
6783
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractConfirmDialogComponent, decorators: [{
6189
6784
  type: Component,
@@ -6193,7 +6788,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6193
6788
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
6194
6789
  type: Inject,
6195
6790
  args: [ALERT_CONFIG]
6196
- }] }]; } });
6791
+ }] }]; }, propDecorators: { confirmClass: [{
6792
+ type: HostBinding,
6793
+ args: ["class"]
6794
+ }] } });
6197
6795
 
6198
6796
  class ActivityBodyComponent extends DisposableComponent {
6199
6797
  fullWidth = false;
@@ -6732,7 +7330,7 @@ const ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');
6732
7330
  // return true;
6733
7331
  // }
6734
7332
  // }
6735
- class PlaceComponent extends DisposableComponent {
7333
+ class PlaceComponent extends LoadableComponent {
6736
7334
  _placeReadyCallbacks = [];
6737
7335
  visitModel = new MutableValueModel();
6738
7336
  _inVisitUpdate = new Guard();
@@ -6789,6 +7387,7 @@ class PlaceComponent extends DisposableComponent {
6789
7387
  */
6790
7388
  installAndInitialiseBinding(initialVisit, parameterDef) {
6791
7389
  const model = this[parameterDef.propertyName];
7390
+ assert.notNil(model);
6792
7391
  DebugContext.tag(model, `${this.placeDefinition.component.name}.${parameterDef.propertyName}`);
6793
7392
  const binding = this.registerDisposable(new Binding(this.visitModel, model, {
6794
7393
  toRight(visit) {
@@ -6873,7 +7472,7 @@ class PlaceComponent extends DisposableComponent {
6873
7472
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: PlaceComponent, usesInheritance: true, ngImport: i0 });
6874
7473
  }
6875
7474
  __decorate([
6876
- Memoize(),
7475
+ MemoizeGet(),
6877
7476
  __metadata("design:type", PlaceDefinition),
6878
7477
  __metadata("design:paramtypes", [])
6879
7478
  ], PlaceComponent.prototype, "placeDefinition", null);
@@ -7063,7 +7662,7 @@ class Visit {
7063
7662
  getRouterCommands() {
7064
7663
  return this.segments.reduce((result, v) => {
7065
7664
  const path = v.placeDefinition.path;
7066
- return isEmpty$1(path) ?
7665
+ return isEmpty(path) ?
7067
7666
  [...result, path] : // Angular doesn't support route params on empty path segments
7068
7667
  [...result, path, ...v.createRouterCommands()];
7069
7668
  }, []);
@@ -7079,7 +7678,7 @@ class Visit {
7079
7678
  }
7080
7679
  }
7081
7680
  __decorate([
7082
- Memoize$1(),
7681
+ Memoize(),
7083
7682
  __metadata("design:type", Function),
7084
7683
  __metadata("design:paramtypes", [PlaceDefinition]),
7085
7684
  __metadata("design:returntype", VisitSegment)
@@ -7460,10 +8059,7 @@ class SynchroniseInteractionContextIdsWithRoute extends NavigationSession {
7460
8059
  return true;
7461
8060
  }
7462
8061
  notifyActive() {
7463
- // TODO: Do I still need this??
7464
- setTimeout(() => {
7465
- this.syncInteractionIdsWithRouter();
7466
- });
8062
+ this.syncInteractionIdsWithRouter();
7467
8063
  }
7468
8064
  // @Trace()
7469
8065
  onRouterEnd(event) {
@@ -8206,7 +8802,7 @@ class ConsolidatedParameterMap {
8206
8802
  }
8207
8803
  }
8208
8804
  __decorate([
8209
- Memoize(),
8805
+ MemoizeGet(),
8210
8806
  __metadata("design:type", Array),
8211
8807
  __metadata("design:paramtypes", [])
8212
8808
  ], ConsolidatedParameterMap.prototype, "keys", null);
@@ -8284,7 +8880,7 @@ class UrlSnapshot {
8284
8880
  return this.getPrimaryUrlSegments().find(s => s.path === placeDef.path);
8285
8881
  }
8286
8882
  isLastPlaceInUrl(placeDef) {
8287
- return last$1(this.getPrimaryUrlSegments()).path === placeDef.path;
8883
+ return last(this.getPrimaryUrlSegments()).path === placeDef.path;
8288
8884
  }
8289
8885
  createVisitSegmentFor(placeDef) {
8290
8886
  return new VisitSegment(placeDef, new ConsolidatedParameterMap(this.getPrimaryUrlSegments()));
@@ -8400,7 +8996,7 @@ class UrlService {
8400
8996
  back() {
8401
8997
  this.angularLocation.back();
8402
8998
  }
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 });
8999
+ 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
9000
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, providedIn: 'root' });
8405
9001
  }
8406
9002
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, decorators: [{
@@ -8408,7 +9004,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8408
9004
  args: [{
8409
9005
  providedIn: 'root'
8410
9006
  }]
8411
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: i1$4.UrlSerializer }]; } });
9007
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: i1$5.UrlSerializer }]; } });
8412
9008
 
8413
9009
  // function asArray<T>(item: T | T[]): T[] {
8414
9010
  // return Array.isArray(item) ? item : [item];
@@ -8428,6 +9024,8 @@ class PlaceRouter extends GarbageCollector {
8428
9024
  routerInteractionAdapter;
8429
9025
  sessionFinishedJobs = [];
8430
9026
  authService = new PlaceAuthService();
9027
+ _ready$ = this.registerDisposable(new DelegatingValueModel().withDefault(true));
9028
+ ready$ = this._ready$.readonly$;
8431
9029
  constructor(angularRouter, angularLocation, interactionService, urlService, placeHistory) {
8432
9030
  super();
8433
9031
  this.angularRouter = angularRouter;
@@ -8449,7 +9047,7 @@ class PlaceRouter extends GarbageCollector {
8449
9047
  });
8450
9048
  const { chain } = Dsl.disposeWith(this);
8451
9049
  this.navigationInProgress$ = chain(this.navigationSession$).isNotNil();
8452
- this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync");
9050
+ this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync").otherwise(false);
8453
9051
  const idleStateName = chain(this.interactionService.active).map(active => active ? "IdleDuringInteraction" : "Idle");
8454
9052
  this.navigationSessionName$ = chain(this.navigationSession$)
8455
9053
  .pluck("name")
@@ -8493,6 +9091,9 @@ class PlaceRouter extends GarbageCollector {
8493
9091
  // the back button was clicked.
8494
9092
  angularLocation.onUrlChange(url => this.onUrlChanged(url));
8495
9093
  }
9094
+ postponeRoutingUntil(condition$) {
9095
+ this._ready$.setDelegate(condition$);
9096
+ }
8496
9097
  getAuthenticationFailureRedirect(activatedRoute, state) {
8497
9098
  return this.authService.getAuthenticationFailureRedirect(activatedRoute, state);
8498
9099
  }
@@ -8508,23 +9109,20 @@ class PlaceRouter extends GarbageCollector {
8508
9109
  isNavigating() {
8509
9110
  return this.navigationInProgress$.value;
8510
9111
  }
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
- });
9112
+ async waitUntilRouterReady() {
9113
+ const { waitUntil } = Dsl.disposeWith(this);
9114
+ await waitUntil(this.ready$).becomesTruthy();
9115
+ return this;
9116
+ }
9117
+ async waitUntilIdle() {
9118
+ const { waitUntil } = Dsl.disposeWith(this);
9119
+ await waitUntil(this.navigationInProgress$).becomesFalsey();
9120
+ return this;
8519
9121
  }
8520
9122
  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
- });
9123
+ const { waitUntil } = Dsl.disposeWith(this);
9124
+ await waitUntil(this.interactionSyncInProgress$).becomesFalsey();
9125
+ return this;
8528
9126
  }
8529
9127
  // @Trace()
8530
9128
  onPopState(event) {
@@ -8710,7 +9308,7 @@ class PlaceRouter extends GarbageCollector {
8710
9308
  return Visit.goto(visitOrPlaceComponent, params);
8711
9309
  }
8712
9310
  }
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 });
9311
+ 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
9312
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, providedIn: "root" });
8715
9313
  }
8716
9314
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, decorators: [{
@@ -8718,7 +9316,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8718
9316
  args: [{
8719
9317
  providedIn: "root"
8720
9318
  }]
8721
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
9319
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
8722
9320
 
8723
9321
  class ActivityTitleComponent extends DisposableComponent {
8724
9322
  _color;
@@ -8740,11 +9338,11 @@ class ActivityTitleComponent extends DisposableComponent {
8740
9338
  return this._color;
8741
9339
  }
8742
9340
  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"] });
9341
+ 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
9342
  }
8745
9343
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityTitleComponent, decorators: [{
8746
9344
  type: Component,
8747
- args: [{ selector: 'aup-activity-title', template: "<ng-content></ng-content>\n", styles: [":host{display:block}\n"] }]
9345
+ 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
9346
  }], propDecorators: { hasTransparentBackground: [{
8749
9347
  type: Input
8750
9348
  }, {
@@ -8765,7 +9363,7 @@ class AlertDialogComponent extends AbstractDialogComponent {
8765
9363
  });
8766
9364
  }
8767
9365
  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"] }] });
9366
+ 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
9367
  }
8770
9368
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AlertDialogComponent, decorators: [{
8771
9369
  type: Component,
@@ -8785,7 +9383,7 @@ class ConfirmThenDialogComponent extends AbstractConfirmDialogComponent {
8785
9383
  });
8786
9384
  }
8787
9385
  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"] }] });
9386
+ 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
9387
  }
8790
9388
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenDialogComponent, decorators: [{
8791
9389
  type: Component,
@@ -8809,7 +9407,7 @@ class ConfirmThenExecuteDialogComponent extends AbstractConfirmDialogComponent {
8809
9407
  });
8810
9408
  }
8811
9409
  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"] }] });
9410
+ 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
9411
  }
8814
9412
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenExecuteDialogComponent, decorators: [{
8815
9413
  type: Component,
@@ -8829,7 +9427,7 @@ class ConfirmationDialogComponent extends AbstractConfirmDialogComponent {
8829
9427
  });
8830
9428
  }
8831
9429
  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"] }] });
9430
+ 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
9431
  }
8834
9432
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmationDialogComponent, decorators: [{
8835
9433
  type: Component,
@@ -9009,6 +9607,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9009
9607
  tabs;
9010
9608
  activityOutlets;
9011
9609
  activityRefs = [];
9610
+ animationDuration = "500ms";
9012
9611
  _identifier;
9013
9612
  _deferredCleanUp;
9014
9613
  interactionServiceApi;
@@ -9021,6 +9620,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9021
9620
  busy = this.registerDisposable(new DelegatingValueModel().withDefault(false));
9022
9621
  syncTabsJob = undefined;
9023
9622
  stable$;
9623
+ wasActive = false;
9024
9624
  constructor(placeRouter) {
9025
9625
  super();
9026
9626
  this.placeRouter = placeRouter;
@@ -9057,7 +9657,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9057
9657
  * Returns true if an activity is currently running.
9058
9658
  */
9059
9659
  isActive() {
9060
- return this.getActiveActivityCount() > 0;
9660
+ const isActive = this.getActiveActivityCount() > 0;
9661
+ // if (this.wasActive !== isActive) {
9662
+ // console.log({was: this.wasActive, is: isActive});
9663
+ // }
9664
+ // this.wasActive = isActive
9665
+ return isActive;
9061
9666
  }
9062
9667
  registerDisposable(disposable) {
9063
9668
  return this.garbage.registerDisposable(disposable);
@@ -9140,7 +9745,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9140
9745
  // by activity index)
9141
9746
  setTimeout(() => {
9142
9747
  this.activityRefs = []; // we have to do it after the animation timeout or the activity disappears before the animatin finsihes
9143
- }, this.getTabAnimationDuration());
9748
+ }, this.getTabAnimationDurationInMillis());
9144
9749
  const promise = this.interactionServiceApi.notifyFinished(this);
9145
9750
  this._deferredCleanUp = promise
9146
9751
  .finally(() => {
@@ -9166,7 +9771,6 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9166
9771
  /**
9167
9772
  * Synchronises the selected tab index.
9168
9773
  */
9169
- // @Trace()
9170
9774
  synchroniseSelectedTabIndex() {
9171
9775
  assert.isTruthy(this.isActive());
9172
9776
  const previousIndex = this.tabs.selectedIndex;
@@ -9178,10 +9782,10 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9178
9782
  activityRef.setFocused(false);
9179
9783
  this.busy.setDelegate(activityRef.activityBusy);
9180
9784
  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
- }
9785
+ // if (this.ready$.value) {
9786
+ // // Note: We're not using the animation done event as it's firing almost immeadiately.
9787
+ // setTimeout(() => this.finaliseActivityStates(), animate ? this.getTabAnimationDurationInMillis() : 0);
9788
+ // }
9185
9789
  }
9186
9790
  }
9187
9791
  finaliseActivityStates() {
@@ -9195,7 +9799,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9195
9799
  return this.activityOutlets.toArray()[this.tabs.selectedIndex];
9196
9800
  }
9197
9801
  getTabAnimationDuration() {
9198
- const match = this.tabs.animationDuration.match(/(\d+)(.*)/);
9802
+ // const s = this._started$.value ? this.animationDuration : "0";
9803
+ // return s
9804
+ return this.animationDuration;
9805
+ }
9806
+ getTabAnimationDurationInMillis() {
9807
+ const match = this.animationDuration.match(/(\d+)(.*)/);
9199
9808
  const numericValue = parseFloat(match[1]);
9200
9809
  switch (match[2].trim()) {
9201
9810
  case "ms":
@@ -9221,12 +9830,16 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9221
9830
  }
9222
9831
  }, 75);
9223
9832
  }
9833
+ onAnimationDone() {
9834
+ this._started$.value = true;
9835
+ this.finaliseActivityStates();
9836
+ }
9224
9837
  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"] }] });
9838
+ 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
9839
  }
9227
9840
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityContainerComponent, decorators: [{
9228
9841
  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"] }]
9842
+ 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
9843
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { dynamicHeight: [{
9231
9844
  type: Input
9232
9845
  }], tabs: [{
@@ -9235,6 +9848,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9235
9848
  }], activityOutlets: [{
9236
9849
  type: ViewChildren,
9237
9850
  args: [ActivityOutletComponent]
9851
+ }], animationDuration: [{
9852
+ type: Input
9238
9853
  }] } });
9239
9854
 
9240
9855
  class AbstractActivityTriggerComponent extends DisposableComponent {
@@ -9335,14 +9950,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9335
9950
  args: ['class.active']
9336
9951
  }] } });
9337
9952
 
9338
- const cssDurationRegex = /(\d+)(m?s)/;
9953
+ const INTERACTION_CONTEXT = new InjectionToken('interactionContext');
9954
+
9955
+ const cssDurationRegex$1 = /(\d+)(m?s)/;
9339
9956
  /**
9340
9957
  * @example
9341
9958
  * <aup-in-place-interaction-context #inPlaceInteractionContext>
9342
9959
  * </aup-in-place-interaction-context>
9343
9960
  *
9344
9961
  * in your component
9345
- * @ViewChild('inPlaceInteractionContext', { static: true })
9962
+ * @ViewChild(InPlaceInteractionContextComponent)
9346
9963
  * interactionContext: InteractionContext;
9347
9964
  *
9348
9965
  *
@@ -9361,11 +9978,13 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9361
9978
  * active interactions.
9362
9979
  */
9363
9980
  syncWithRoutes = true;
9981
+ started = new EventEmitter();
9982
+ finished = new EventEmitter();
9364
9983
  get animationDuration() {
9365
9984
  return this.animateFirstActivity ? (this.tabConfig?.animationDuration || "500ms") : "0ms";
9366
9985
  }
9367
9986
  get animationDurationMillis() {
9368
- const result = cssDurationRegex.exec(this.animationDuration);
9987
+ const result = cssDurationRegex$1.exec(this.animationDuration);
9369
9988
  if (!result) {
9370
9989
  lang.illegalState(`unsupported css duration: ${this.animationDuration}`);
9371
9990
  }
@@ -9387,11 +10006,16 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9387
10006
  this.interactionService.registerInplaceInteractionContext(this);
9388
10007
  }
9389
10008
  else {
10009
+ const self = this;
9390
10010
  this.activityContainerComponent.initialise("dont-care", {
9391
10011
  async notifyActive(interactionContext) {
10012
+ self.started.emit();
9392
10013
  return undefined;
9393
10014
  },
9394
10015
  async notifyFinished(interactionContext) {
10016
+ // I've noticed some rendering fails when returning the the transcluded content we'll fire an event
10017
+ // so components can do stuff if they need to.
10018
+ self.started.emit();
9395
10019
  return undefined;
9396
10020
  }
9397
10021
  });
@@ -9438,11 +10062,15 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9438
10062
  }
9439
10063
  }
9440
10064
  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"] }] });
10065
+ 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: [
10066
+ { provide: INTERACTION_CONTEXT, useExisting: InPlaceInteractionContextComponent }
10067
+ ], 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
10068
  }
9443
10069
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InPlaceInteractionContextComponent, decorators: [{
9444
10070
  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"] }]
10071
+ args: [{ selector: "aup-in-place-interaction-context", providers: [
10072
+ { provide: INTERACTION_CONTEXT, useExisting: InPlaceInteractionContextComponent }
10073
+ ], 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
10074
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
9447
10075
  type: Inject,
9448
10076
  args: [MAT_TABS_CONFIG]
@@ -9455,6 +10083,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9455
10083
  type: Input
9456
10084
  }], syncWithRoutes: [{
9457
10085
  type: Input
10086
+ }], started: [{
10087
+ type: Output
10088
+ }], finished: [{
10089
+ type: Output
9458
10090
  }], active: [{
9459
10091
  type: HostBinding,
9460
10092
  args: ["class.active"]
@@ -9469,7 +10101,7 @@ class InlineActivityTriggerComponent extends AbstractActivityTriggerComponent {
9469
10101
  super();
9470
10102
  }
9471
10103
  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"] }] });
10104
+ 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
10105
  }
9474
10106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InlineActivityTriggerComponent, decorators: [{
9475
10107
  type: Component,
@@ -9593,7 +10225,7 @@ class PopupInteractionContextComponent extends DisposableComponent {
9593
10225
  isActive() {
9594
10226
  return this.interactionContext && this.interactionContext.isActive();
9595
10227
  }
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 });
10228
+ 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
10229
  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
10230
  }
9599
10231
  __decorate([
@@ -9607,7 +10239,7 @@ __decorate([
9607
10239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PopupInteractionContextComponent, decorators: [{
9608
10240
  type: Component,
9609
10241
  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: [{
10242
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$6.Overlay }, { type: i1$6.CdkScrollable, decorators: [{
9611
10243
  type: Optional
9612
10244
  }, {
9613
10245
  type: SkipSelf
@@ -9692,7 +10324,7 @@ class AddCardActivityComponent extends AbstractActivityTriggerComponent {
9692
10324
  return this.interactionStyle === 'inline';
9693
10325
  }
9694
10326
  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"] }] });
10327
+ 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
10328
  }
9697
10329
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AddCardActivityComponent, decorators: [{
9698
10330
  type: Component,
@@ -9768,7 +10400,7 @@ class AddItemInteractionContextComponent extends DisposableComponent {
9768
10400
  return this.interactionContext.startActivity(activityType, data);
9769
10401
  }
9770
10402
  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"] }] });
10403
+ 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
10404
  }
9773
10405
  __decorate([
9774
10406
  Proxify(),
@@ -9907,12 +10539,14 @@ class StringInputActivity extends InputActivity {
9907
10539
  [label]="activityData.label"
9908
10540
  [placeholder]="activityData.placeholder"
9909
10541
  [command.enter]="confirmCommand"
9910
- [command.escape]="cancelCommand"></aup-string-input>
10542
+ [command.escape]="cancelCommand"
10543
+ [dense]="true"
10544
+ ></aup-string-input>
9911
10545
  <aup-activity-actions [layout]="layout" align="end"
9912
10546
  [confirmFace]="confirmFace"
9913
10547
  [cancelFace]="cancelFace"
9914
10548
  ></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"] }] });
10549
+ `, 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
10550
  }
9917
10551
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputActivity, decorators: [{
9918
10552
  type: Component,
@@ -9923,7 +10557,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9923
10557
  [label]="activityData.label"
9924
10558
  [placeholder]="activityData.placeholder"
9925
10559
  [command.enter]="confirmCommand"
9926
- [command.escape]="cancelCommand"></aup-string-input>
10560
+ [command.escape]="cancelCommand"
10561
+ [dense]="true"
10562
+ ></aup-string-input>
9927
10563
  <aup-activity-actions [layout]="layout" align="end"
9928
10564
  [confirmFace]="confirmFace"
9929
10565
  [cancelFace]="cancelFace"
@@ -10106,7 +10742,7 @@ class InlineStringEditorComponent extends DisposableComponent {
10106
10742
  return !this.editingEnabled$.value;
10107
10743
  }
10108
10744
  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"] }] });
10745
+ 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
10746
  }
10111
10747
  __decorate([
10112
10748
  Proxify(),
@@ -10189,6 +10825,7 @@ class SelectInputActivity extends InputActivity {
10189
10825
  [options]="options"
10190
10826
  [optionLabelFormat]="optionLabelFormat"
10191
10827
  [allowNil]="activityData.allowNil"
10828
+ [dense]="true"
10192
10829
  >
10193
10830
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10194
10831
  </aup-select-input>
@@ -10196,7 +10833,7 @@ class SelectInputActivity extends InputActivity {
10196
10833
  [confirmFace]="confirmFace"
10197
10834
  [cancelFace]="cancelFace"
10198
10835
  ></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"] }] });
10836
+ `, 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
10837
  }
10201
10838
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputActivity, decorators: [{
10202
10839
  type: Component,
@@ -10211,6 +10848,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10211
10848
  [options]="options"
10212
10849
  [optionLabelFormat]="optionLabelFormat"
10213
10850
  [allowNil]="activityData.allowNil"
10851
+ [dense]="true"
10214
10852
  >
10215
10853
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10216
10854
  </aup-select-input>
@@ -10222,6 +10860,186 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10222
10860
  }]
10223
10861
  }] });
10224
10862
 
10863
+ const slideDownOnEnterDef = style({
10864
+ opacity: 0,
10865
+ 'height': '0',
10866
+ 'max-height': '0',
10867
+ paddingTop: '0',
10868
+ paddingBottom: '0'
10869
+ });
10870
+ // TODO: params aren't getting customised in the view. Need to figure out the correct approach.
10871
+ const slideDownOnEnterAnimation = trigger('slideDownOnEnter', [
10872
+ transition(':enter', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10873
+ transition(':leave', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10874
+ ]);
10875
+ const slideDownWhenOpenAnimation = trigger('slideDownWhenOpen', [
10876
+ transition('closed => open', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10877
+ transition('open => closed', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10878
+ ]);
10879
+ const slideLeftOnEnterDef = style({
10880
+ opacity: 0,
10881
+ 'width': '0',
10882
+ paddingLeft: '0',
10883
+ paddingRight: '0'
10884
+ });
10885
+ const slideRightOnEnterAnimation = trigger('slideRightOnEnter', [
10886
+ transition(':enter', [slideLeftOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10887
+ transition(':leave', [animate('{{duration}}', slideLeftOnEnterDef)], { params: { duration: '100ms' } })
10888
+ ]);
10889
+ const ZERO_WIDTH = {
10890
+ opacity: 0,
10891
+ width: '0',
10892
+ paddingLeft: '0',
10893
+ paddingRight: '0',
10894
+ };
10895
+ const ZERO_HEIGHT = {
10896
+ opacity: 0,
10897
+ height: '0',
10898
+ paddingTop: '0',
10899
+ paddingBottom: '0',
10900
+ };
10901
+ const slideDownAndRightOnEnterAnimation = trigger('slideDownAndRightOnEnter', [
10902
+ transition(':enter', [
10903
+ style({ overflow: "hidden", whiteSpace: "nowrap", ...ZERO_WIDTH, ...ZERO_HEIGHT }),
10904
+ animate('{{duration}}')
10905
+ ], { params: { duration: '100ms' } }),
10906
+ transition(':leave', [
10907
+ style({ overflow: "hidden", whiteSpace: "nowrap" }),
10908
+ group([
10909
+ animate('{{duration}}', style(ZERO_HEIGHT)),
10910
+ // Hack: 100ms is too quick as it animates from * - 0 as we only see it animate the width is greater than the parent.
10911
+ // Not sure how to animate from * to natural new width of parent. This hack won't work for text that's just a little
10912
+ // bit wider than the parent as it'll fall within the parent bounds very early in the animation cycle.
10913
+ animate('300ms', style(ZERO_WIDTH)),
10914
+ ])
10915
+ ], { params: { duration: '100ms' } })
10916
+ ]);
10917
+
10918
+ const cssDurationRegex = /(\d+)(m?s)/;
10919
+ /**
10920
+ * This interaction context remains hidden (height: 0) until it is active.
10921
+ * @example
10922
+ * <aup-slide-down-interaction-context #inPlaceInteractionContext>
10923
+ * </aup-slide-down-interaction-context>
10924
+ *
10925
+ * in your component
10926
+ * @ViewChild(SlideDownInteractionContextComponent)
10927
+ * interactionContext: InteractionContext;
10928
+ *
10929
+ *
10930
+ */
10931
+ class SlideDownInteractionContextComponent extends DisposableComponent {
10932
+ tabConfig;
10933
+ activityContainerComponent;
10934
+ // NOTE: disabling this as I'm using the initialise callback to release the hacky height clamp.
10935
+ // The whole registration thing is a bit naf so I should really clean that up at some point.
10936
+ // /**
10937
+ // * If true the activity will sync with the router to enable back button support. This is a work around for
10938
+ // * deeply nested activities that can't be linked with the root place interactionContext hook for cancelling
10939
+ // * active interactions.
10940
+ // */
10941
+ // @Input()
10942
+ // syncWithRoutes = true;
10943
+ dynamicHeight = true;
10944
+ get active() {
10945
+ return this.isActive();
10946
+ }
10947
+ // Horrible hack to stop the div and activity container bouncing back for a bit in after closing. No idea why it's doing that.
10948
+ clampShut = true;
10949
+ interactionService = this.inject(InteractionService);
10950
+ constructor(tabConfig) {
10951
+ super();
10952
+ this.tabConfig = tabConfig;
10953
+ }
10954
+ ngAfterViewInit() {
10955
+ // NOTE: this is a temp work around to detach inplace contexts from the router until AUP-88 is implemented.
10956
+ // https://coolon.atlassian.net/browse/AUP-88?atlOrigin=eyJpIjoiOTg5YjEzZGUzZjRmNDg0NmExOWU3ZGJmMzJiNTRmNGYiLCJwIjoiaiJ9
10957
+ const self = this;
10958
+ this.activityContainerComponent.initialise("dont-care", {
10959
+ async notifyActive(interactionContext) {
10960
+ self.clampShut = false;
10961
+ return undefined;
10962
+ },
10963
+ async notifyFinished(interactionContext) {
10964
+ return undefined;
10965
+ }
10966
+ });
10967
+ // if (this.syncWithRoutes) {
10968
+ // this.interactionService.registerInplaceInteractionContext(this);
10969
+ // }
10970
+ }
10971
+ getAnimationState() {
10972
+ return {
10973
+ value: this.isActive() ? "open" : "closed",
10974
+ params: { duration: "200ms" }
10975
+ };
10976
+ }
10977
+ // this is a regsitration callback from the interaction service
10978
+ // @Trace() // webstorm says no usages... but I'm not sure.
10979
+ onInplaceInteractionContextRegistered(id, api) {
10980
+ this.activityContainerComponent.initialise(id, api);
10981
+ }
10982
+ get identifier() {
10983
+ return this.activityContainerComponent.identifier;
10984
+ }
10985
+ alert(alert) {
10986
+ return this.activityContainerComponent.alert(alert);
10987
+ }
10988
+ cancelActiveActivity() {
10989
+ return this.activityContainerComponent.cancelActiveActivity();
10990
+ }
10991
+ confirm(confirm) {
10992
+ return this.activityContainerComponent.confirm(confirm);
10993
+ }
10994
+ confirmOrReject(confirm) {
10995
+ return this.activityContainerComponent.confirmOrReject(confirm);
10996
+ }
10997
+ confirmThen(confirm, activityType, data) {
10998
+ return this.activityContainerComponent.confirmThen(confirm, activityType);
10999
+ }
11000
+ confirmThenExecute(confirm, operation) {
11001
+ return this.activityContainerComponent.confirmThenExecute(confirm, operation);
11002
+ }
11003
+ isActive() {
11004
+ return this.activityContainerComponent.isActive();
11005
+ }
11006
+ startActivity(activityType, data, options) {
11007
+ return this.activityContainerComponent.startActivity(activityType, data, options);
11008
+ }
11009
+ onAnimationDone() {
11010
+ if (!this.isActive()) {
11011
+ this.clampShut = true;
11012
+ }
11013
+ }
11014
+ 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 });
11015
+ 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: [
11016
+ { provide: INTERACTION_CONTEXT, useExisting: SlideDownInteractionContextComponent }
11017
+ ], 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: [
11018
+ slideDownWhenOpenAnimation
11019
+ ] });
11020
+ }
11021
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SlideDownInteractionContextComponent, decorators: [{
11022
+ type: Component,
11023
+ args: [{ selector: "aup-slide-down-interaction-context", providers: [
11024
+ { provide: INTERACTION_CONTEXT, useExisting: SlideDownInteractionContextComponent }
11025
+ ], animations: [
11026
+ slideDownWhenOpenAnimation
11027
+ ], 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"] }]
11028
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
11029
+ type: Inject,
11030
+ args: [MAT_TABS_CONFIG]
11031
+ }, {
11032
+ type: Optional
11033
+ }] }]; }, propDecorators: { activityContainerComponent: [{
11034
+ type: ViewChild,
11035
+ args: ["activityContainer", { static: true }]
11036
+ }], dynamicHeight: [{
11037
+ type: Input
11038
+ }], active: [{
11039
+ type: HostBinding,
11040
+ args: ["class.active"]
11041
+ }] } });
11042
+
10225
11043
  class InteractionContextTriggerForDirective extends GarbageCollector {
10226
11044
  aupInteractionContextTriggerFor;
10227
11045
  activityClass;
@@ -10304,6 +11122,7 @@ class InteractionModule {
10304
11122
  AlertDialogComponent,
10305
11123
  ActivityOutletComponent,
10306
11124
  InPlaceInteractionContextComponent,
11125
+ SlideDownInteractionContextComponent,
10307
11126
  AddItemInteractionContextComponent,
10308
11127
  ActivityActionsComponent,
10309
11128
  PopupInteractionContextComponent,
@@ -10330,8 +11149,6 @@ class InteractionModule {
10330
11149
  RouterModule,
10331
11150
  MatIconModule,
10332
11151
  DirectivesModule,
10333
- FlexModule,
10334
- GridModule,
10335
11152
  ComponentsModule,
10336
11153
  FormsModule,
10337
11154
  MatInputModule,
@@ -10351,7 +11168,8 @@ class InteractionModule {
10351
11168
  InlineActivityTriggerComponent,
10352
11169
  ModalActivityTriggerComponent,
10353
11170
  AddCardActivityComponent,
10354
- InlineStringEditorComponent] });
11171
+ InlineStringEditorComponent,
11172
+ SlideDownInteractionContextComponent] });
10355
11173
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InteractionModule, providers: [
10356
11174
  InteractionService
10357
11175
  // {
@@ -10365,8 +11183,6 @@ class InteractionModule {
10365
11183
  RouterModule,
10366
11184
  MatIconModule,
10367
11185
  DirectivesModule,
10368
- FlexModule,
10369
- GridModule,
10370
11186
  ComponentsModule,
10371
11187
  FormsModule,
10372
11188
  MatInputModule,
@@ -10385,8 +11201,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10385
11201
  RouterModule,
10386
11202
  MatIconModule,
10387
11203
  DirectivesModule,
10388
- FlexModule,
10389
- GridModule,
10390
11204
  ComponentsModule,
10391
11205
  FormsModule,
10392
11206
  MatInputModule,
@@ -10401,6 +11215,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10401
11215
  AlertDialogComponent,
10402
11216
  ActivityOutletComponent,
10403
11217
  InPlaceInteractionContextComponent,
11218
+ SlideDownInteractionContextComponent,
10404
11219
  AddItemInteractionContextComponent,
10405
11220
  ActivityActionsComponent,
10406
11221
  PopupInteractionContextComponent,
@@ -10438,6 +11253,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10438
11253
  ModalActivityTriggerComponent,
10439
11254
  AddCardActivityComponent,
10440
11255
  InlineStringEditorComponent,
11256
+ SlideDownInteractionContextComponent,
10441
11257
  ],
10442
11258
  providers: [
10443
11259
  InteractionService
@@ -10508,7 +11324,6 @@ class PlaceOutletComponent extends DisposableComponent {
10508
11324
  router;
10509
11325
  placeRouter;
10510
11326
  placeConfig;
10511
- cdr;
10512
11327
  #animate$_accessor_storage = proxify((ValueModel));
10513
11328
  get animate$() { return this.#animate$_accessor_storage; }
10514
11329
  set animate$(value) { this.#animate$_accessor_storage = value; }
@@ -10542,12 +11357,11 @@ class PlaceOutletComponent extends DisposableComponent {
10542
11357
  animationEnabled;
10543
11358
  authorised;
10544
11359
  notAuthorisedNoticePortal;
10545
- constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet, cdr) {
11360
+ constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet) {
10546
11361
  super();
10547
11362
  this.router = router;
10548
11363
  this.placeRouter = placeRouter;
10549
11364
  this.placeConfig = placeConfig;
10550
- this.cdr = cdr;
10551
11365
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
10552
11366
  this.parentOutletModel = new MutableValueModel(parentOutlet);
10553
11367
  const defaultPlaceAnimationOrder = chain(this.parentOutletModel)
@@ -10559,7 +11373,7 @@ class PlaceOutletComponent extends DisposableComponent {
10559
11373
  this.placesInAnimationOrder = chain(this.customPlaceAnimationOrder$)
10560
11374
  .otherwise(defaultPlaceAnimationOrder);
10561
11375
  this.activePlaceAnimationPosition = this.placesInAnimationOrder
10562
- .reduce((placesInOrder) => {
11376
+ .reduceAll((placesInOrder) => {
10563
11377
  let placeIndex = 0;
10564
11378
  if (activatePlaceType.value) {
10565
11379
  placeIndex = placesInOrder.indexOf(activatePlaceType.value);
@@ -10713,8 +11527,8 @@ class PlaceOutletComponent extends DisposableComponent {
10713
11527
  this.onAnimationFinishedJob = undefined;
10714
11528
  }
10715
11529
  }
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] });
11530
+ 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 });
11531
+ 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
11532
  }
10719
11533
  __decorate([
10720
11534
  Proxify(),
@@ -10735,7 +11549,7 @@ __decorate([
10735
11549
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceOutletComponent, decorators: [{
10736
11550
  type: Component,
10737
11551
  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: [{
11552
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: PlaceRouter }, { type: undefined, decorators: [{
10739
11553
  type: Optional
10740
11554
  }, {
10741
11555
  type: Inject,
@@ -10749,7 +11563,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10749
11563
  type: SkipSelf
10750
11564
  }, {
10751
11565
  type: Optional
10752
- }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { animate$: [{
11566
+ }] }]; }, propDecorators: { animate$: [{
10753
11567
  type: Input
10754
11568
  }], animate: [{
10755
11569
  type: Input
@@ -10882,7 +11696,7 @@ class ListPlaceNavComponent extends AbstractPlaceNavigationComponent {
10882
11696
  super(router);
10883
11697
  }
10884
11698
  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"] }] });
11699
+ 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
11700
  }
10887
11701
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ListPlaceNavComponent, decorators: [{
10888
11702
  type: Component,
@@ -10957,7 +11771,7 @@ class SidePlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10957
11771
  this.expanded = !this.expanded;
10958
11772
  }
10959
11773
  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"] }] });
11774
+ 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
11775
  }
10962
11776
  __decorate([
10963
11777
  Proxify(),
@@ -10969,7 +11783,7 @@ __decorate([
10969
11783
  ], SidePlaceNavigationComponent.prototype, "expanded", null);
10970
11784
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SidePlaceNavigationComponent, decorators: [{
10971
11785
  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"] }]
11786
+ 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
11787
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { expanded$: [{
10974
11788
  type: Input
10975
11789
  }], expanded: [{
@@ -10987,7 +11801,7 @@ class TabbedPlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10987
11801
  super(router);
10988
11802
  }
10989
11803
  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"] }] });
11804
+ 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
11805
  }
10992
11806
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TabbedPlaceNavigationComponent, decorators: [{
10993
11807
  type: Component,
@@ -11010,7 +11824,6 @@ class PlaceModule {
11010
11824
  MatTooltipModule,
11011
11825
  MatIconModule,
11012
11826
  DirectivesModule,
11013
- FlexModule,
11014
11827
  ComponentsModule,
11015
11828
  PortalModule,
11016
11829
  MatCardModule], exports: [PlaceOutletComponent,
@@ -11027,7 +11840,6 @@ class PlaceModule {
11027
11840
  MatTooltipModule,
11028
11841
  MatIconModule,
11029
11842
  DirectivesModule,
11030
- FlexModule,
11031
11843
  ComponentsModule,
11032
11844
  PortalModule,
11033
11845
  MatCardModule] });
@@ -11045,7 +11857,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11045
11857
  MatTooltipModule,
11046
11858
  MatIconModule,
11047
11859
  DirectivesModule,
11048
- FlexModule,
11049
11860
  ComponentsModule,
11050
11861
  PortalModule,
11051
11862
  MatCardModule
@@ -11135,60 +11946,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11135
11946
  }]
11136
11947
  }] });
11137
11948
 
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
11949
  /**
11189
11950
  * @file Automatically generated by barrelsby.
11190
11951
  */
11191
11952
 
11953
+ class ResizeObserverDirective extends DisposableComponent {
11954
+ aupOnResize = new EventEmitter();
11955
+ elementRef = this.inject(ElementRef);
11956
+ ngZone = this.inject(NgZone);
11957
+ _bounds$ = new MutableValueModel();
11958
+ ngAfterViewInit() {
11959
+ const element = this.elementRef.nativeElement;
11960
+ const ro = new ResizeObserver((entries, observer) => {
11961
+ this.ngZone.run(() => this._updateBounds());
11962
+ });
11963
+ ro.observe(element);
11964
+ this.onDispose(() => ro.disconnect());
11965
+ setTimeout(() => this._updateBounds());
11966
+ }
11967
+ get bounds$() {
11968
+ return this._bounds$.readonly$;
11969
+ }
11970
+ _updateBounds() {
11971
+ this._bounds$.value = Bounds.ofElement(this.elementRef.nativeElement);
11972
+ this.aupOnResize.emit(this._bounds$.value);
11973
+ }
11974
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
11975
+ 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 });
11976
+ }
11977
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, decorators: [{
11978
+ type: Directive,
11979
+ args: [{
11980
+ selector: "[aupOnResize]",
11981
+ standalone: true
11982
+ }]
11983
+ }], propDecorators: { aupOnResize: [{
11984
+ type: Output
11985
+ }] } });
11986
+
11192
11987
  /**
11193
11988
  * @file Automatically generated by barrelsby.
11194
11989
  */
@@ -11279,7 +12074,7 @@ class DialogInteractionContextFactory extends ModalInteractionContextFactory {
11279
12074
  };
11280
12075
  return new DialogInteractionContext(identifier, api, this.dialogService, config);
11281
12076
  }
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 });
12077
+ 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
12078
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, providedIn: 'root' });
11284
12079
  }
11285
12080
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, decorators: [{
@@ -11287,12 +12082,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11287
12082
  args: [{
11288
12083
  providedIn: 'root'
11289
12084
  }]
11290
- }], ctorParameters: function () { return [{ type: i1$6.MatDialog }, { type: i1$6.MatDialogConfig, decorators: [{
12085
+ }], ctorParameters: function () { return [{ type: i1$7.MatDialog }, { type: i1$7.MatDialogConfig, decorators: [{
11291
12086
  type: Optional
11292
12087
  }, {
11293
12088
  type: Inject,
11294
12089
  args: [DIALOG_INTERACTION_SERVICE_DEFAULTS]
11295
- }] }, { type: i1$6.MatDialogConfig, decorators: [{
12090
+ }] }, { type: i1$7.MatDialogConfig, decorators: [{
11296
12091
  type: Optional
11297
12092
  }, {
11298
12093
  type: Inject,
@@ -11412,6 +12207,7 @@ class PlaceGuard {
11412
12207
  }
11413
12208
  // @Trace()
11414
12209
  async canActivate(activatedRoute, state) {
12210
+ await this.placeRouter.waitUntilRouterReady();
11415
12211
  if (PlaceComponent.isPlaceComponentConstructor(activatedRoute.component)) {
11416
12212
  const placeDefinition = PlaceComponent.getDefinition(activatedRoute.component);
11417
12213
  if (placeDefinition.authenticate) {
@@ -11524,13 +12320,13 @@ class PlaceGuard {
11524
12320
  return next();
11525
12321
  }
11526
12322
  }
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 });
12323
+ 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
12324
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, providedIn: 'root' });
11529
12325
  }
11530
12326
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, decorators: [{
11531
12327
  type: Injectable,
11532
12328
  args: [{ providedIn: 'root' }]
11533
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
12329
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
11534
12330
 
11535
12331
  var Formatter;
11536
12332
  (function (Formatter) {
@@ -11564,69 +12360,74 @@ var Formatter;
11564
12360
  Formatter.BOOLEAN = new BooleanType();
11565
12361
  })(Formatter || (Formatter = {}));
11566
12362
 
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
- }
12363
+ // function installMechanics<M extends HasValue<any>>(parameterDef: ParameterDefinition<any>, prototype: object, propertyKey: string | symbol, tagPrefix: string) {
12364
+ //
12365
+ // Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12366
+ //
12367
+ // function getMechanics(instance: M, propertyName: string | symbol) {
12368
+ // const key = `__mechanics_${propertyName.toString()}`;
12369
+ // if (!instance[key]) {
12370
+ // const backingModel = parameterDef.createBackingModel();
12371
+ // instance[key] = {
12372
+ // backingModel: backingModel,
12373
+ // binding: null as Binding<any, any>
12374
+ // };
12375
+ // const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
12376
+ // DebugContext.getOrCreate(instance[key].backingModel).tag(tag);
12377
+ // }
12378
+ // return instance[key];
12379
+ // }
12380
+ //
12381
+ // Object.defineProperty(prototype, propertyKey, {
12382
+ // get: function() {
12383
+ // return getMechanics(this, propertyKey).backingModel;
12384
+ // },
12385
+ // set: function(userModel: M) {
12386
+ // const mechanics = getMechanics(this, propertyKey);
12387
+ // // This handles the scenario where we want to push an existing value model (such as a form model)
12388
+ // // to and from the route.
12389
+ // if (mechanics.binding) {
12390
+ // mechanics.binding.dispose();
12391
+ // }
12392
+ // if (userModel) {
12393
+ // mechanics.binding = new Binding(mechanics.backingModel, userModel, {
12394
+ // toLeft: Functions.identity,
12395
+ // toRight: Functions.identity
12396
+ // });
12397
+ // if (parameterDef.isEmptyValue(userModel.value)) {
12398
+ // // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});
12399
+ // mechanics.binding.writeRight(); // push the visit into the user model;
12400
+ // } else {
12401
+ // if (!parameterDef.isEmptyValue(mechanics.backingModel.value)) {
12402
+ // console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');
12403
+ // }
12404
+ // mechanics.binding.writeLeft(); // push the user model into the visit
12405
+ // }
12406
+ // }
12407
+ // }
12408
+ // });
12409
+ // }
11612
12410
  function RouteId(formatter, options) {
11613
12411
  return (prototype, propertyKey) => {
11614
12412
  const parameterDef = new ParameterDefinition.RouteId(propertyKey.toString(), options, formatter);
11615
- installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12413
+ // installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12414
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
11616
12415
  };
11617
12416
  }
11618
12417
  function VisitParameter(options) {
11619
12418
  const opts = Opts.get(options);
11620
12419
  return (prototype, propertyKey) => {
11621
12420
  const parameterDef = new ParameterDefinition.ValueParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11622
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
12421
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12422
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
11623
12423
  };
11624
12424
  }
11625
12425
  function VisitParameterList(options) {
11626
12426
  const opts = Opts.get(options);
11627
12427
  return (prototype, propertyKey) => {
11628
12428
  const parameterDef = new ParameterDefinition.ArrayParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11629
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
12429
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12430
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
11630
12431
  };
11631
12432
  }
11632
12433
 
@@ -11720,5 +12521,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11720
12521
  * Generated bundle index. Do not edit.
11721
12522
  */
11722
12523
 
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 };
12524
+ 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, 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
12525
  //# sourceMappingURL=coolon-angular-ui-powerups.mjs.map