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

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 +84 -9
  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 +1403 -566
  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 +16 -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$: [{
1800
1848
  type: Input
1849
+ }], i18n: [{
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,178 @@ 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
+ #significantDigits$_accessor_storage = proxify((ValueModel));
2244
+ get significantDigits$() { return this.#significantDigits$_accessor_storage; }
2245
+ set significantDigits$(value) { this.#significantDigits$_accessor_storage = value; }
2246
+ #significantDigits_accessor_storage;
2247
+ get significantDigits() { return this.#significantDigits_accessor_storage; }
2248
+ set significantDigits(value) { this.#significantDigits_accessor_storage = value; }
2249
+ incrementCommand;
2250
+ decrementCommand;
2251
+ displayValue$;
2252
+ step$;
2173
2253
  constructor() {
2174
2254
  super();
2255
+ const { chain } = Dsl.disposeWith(this);
2256
+ this.step$ = chain(this.significantDigits$).map(v => 10 ** (-v)).otherwise(1);
2257
+ this.displayValue$ = chain(this.value$).map(v => this.clamp(v), {
2258
+ dependsOn: this.significantDigits$
2259
+ });
2260
+ const normalisedValue$ = chain(this.value$).otherwise(0);
2261
+ this.incrementCommand = Command.create(() => {
2262
+ this.value$.value = this.increment(this.value$.value);
2263
+ }).enableWhile(chain.numericValue(normalisedValue$).isLessThan(this.max$).and(this.enabled$));
2264
+ this.decrementCommand = Command.create(() => {
2265
+ this.value$.value = this.decrement(this.value$.value);
2266
+ }).enableWhile(chain.numericValue(normalisedValue$).isGreaterThan(this.min$).and(this.enabled$));
2267
+ }
2268
+ increment(value) {
2269
+ return this.clamp((value ?? 0) + this.step$.value);
2270
+ }
2271
+ decrement(value) {
2272
+ return this.clamp((value ?? 0) - this.step$.value);
2273
+ }
2274
+ clamp(value) {
2275
+ return Number(value.toFixed(this.significantDigits));
2276
+ }
2277
+ onValueChange(value) {
2278
+ this.value$.value = value;
2175
2279
  }
2176
2280
  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"] }] });
2281
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: NumberInputComponent, selector: "aup-number-input", inputs: { autocomplete: "autocomplete", min$: "min$", min: "min", max$: "max$", max: "max", significantDigits$: "significantDigits$", significantDigits: "significantDigits" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field floatLabel=\"always\">\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [ngModel]=\"displayValue$.value\"\n (ngModelChange)=\"onValueChange($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n [size]=\"4\"\n [step]=\"step$.value\"\n >\n <section matIconSuffix>\n <button [pectinCommand]=\"decrementCommand\">-</button>\n <button [pectinCommand]=\"incrementCommand\">+</button>\n </section>\n <mat-hint *ngIf=\"hint && !dense\">{{ hint }}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{ firstError }}</mat-error>\n</mat-form-field>\n", styles: [":host{--width: 56px;--height: 42px;--margin-right: 1px;--border-radius: 3px;--border-color:#d5d5d5;--button-background: #fafafa;--button-background-hover: #efefef}:host input[type=number]{appearance:textfield}:host input[type=number]::-webkit-inner-spin-button,:host input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}:host:focus-within:has(section:not(:focus-within)){--height: 40px;--margin-right: 2px;--border-radius: 2px}:host section[maticonsuffix]{display:flex;flex-direction:row;align-items:stretch;gap:1px;background-color:var(--border-color);border-left:1px solid var(--border-color);width:var(--width);min-width:var(--width);height:var(--height);min-height:var(--height);margin-right:var(--margin-right);border-top-right-radius:var(--border-radius);border-bottom-right-radius:var(--border-radius);overflow:hidden}:host button{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;font-weight:600;border-style:none;background-color:var(--button-background)}:host button:hover{background-color:var(--button-background-hover)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2$4.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }] });
2178
2282
  }
2283
+ __decorate([
2284
+ Proxify(),
2285
+ __metadata("design:type", ValueModel)
2286
+ ], NumberInputComponent.prototype, "min$", null);
2287
+ __decorate([
2288
+ StoreInValueModel(),
2289
+ __metadata("design:type", Object)
2290
+ ], NumberInputComponent.prototype, "min", null);
2291
+ __decorate([
2292
+ Proxify(),
2293
+ __metadata("design:type", ValueModel)
2294
+ ], NumberInputComponent.prototype, "max$", null);
2295
+ __decorate([
2296
+ StoreInValueModel(),
2297
+ __metadata("design:type", Object)
2298
+ ], NumberInputComponent.prototype, "max", null);
2299
+ __decorate([
2300
+ Proxify(),
2301
+ __metadata("design:type", ValueModel)
2302
+ ], NumberInputComponent.prototype, "significantDigits$", null);
2303
+ __decorate([
2304
+ StoreInValueModel(),
2305
+ __metadata("design:type", Number)
2306
+ ], NumberInputComponent.prototype, "significantDigits", null);
2179
2307
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NumberInputComponent, decorators: [{
2180
2308
  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" }]
2309
+ args: [{ selector: 'aup-number-input', template: "<mat-form-field floatLabel=\"always\">\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [ngModel]=\"displayValue$.value\"\n (ngModelChange)=\"onValueChange($event)\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n [size]=\"4\"\n [step]=\"step$.value\"\n >\n <section matIconSuffix>\n <button [pectinCommand]=\"decrementCommand\">-</button>\n <button [pectinCommand]=\"incrementCommand\">+</button>\n </section>\n <mat-hint *ngIf=\"hint && !dense\">{{ hint }}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{ firstError }}</mat-error>\n</mat-form-field>\n", styles: [":host{--width: 56px;--height: 42px;--margin-right: 1px;--border-radius: 3px;--border-color:#d5d5d5;--button-background: #fafafa;--button-background-hover: #efefef}:host input[type=number]{appearance:textfield}:host input[type=number]::-webkit-inner-spin-button,:host input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}:host:focus-within:has(section:not(:focus-within)){--height: 40px;--margin-right: 2px;--border-radius: 2px}:host section[maticonsuffix]{display:flex;flex-direction:row;align-items:stretch;gap:1px;background-color:var(--border-color);border-left:1px solid var(--border-color);width:var(--width);min-width:var(--width);height:var(--height);min-height:var(--height);margin-right:var(--margin-right);border-top-right-radius:var(--border-radius);border-bottom-right-radius:var(--border-radius);overflow:hidden}:host button{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;font-weight:600;border-style:none;background-color:var(--button-background)}:host button:hover{background-color:var(--button-background-hover)}\n"] }]
2182
2310
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2183
2311
  type: Input
2312
+ }], min$: [{
2313
+ type: Input
2184
2314
  }], min: [{
2185
2315
  type: Input
2316
+ }], max$: [{
2317
+ type: Input
2186
2318
  }], max: [{
2187
2319
  type: Input
2188
- }], iconPrefix: [{
2320
+ }], significantDigits$: [{
2321
+ type: Input
2322
+ }], significantDigits: [{
2189
2323
  type: Input
2190
2324
  }] } });
2191
2325
 
2192
2326
  class PasswordInputComponent extends AbstractValueInputComponent {
2193
2327
  autocomplete;
2328
+ #enableShowPassword$_accessor_storage = proxify((ValueModel));
2329
+ get enableShowPassword$() { return this.#enableShowPassword$_accessor_storage; }
2330
+ set enableShowPassword$(value) { this.#enableShowPassword$_accessor_storage = value; }
2331
+ #enableShowPassword_accessor_storage = false;
2332
+ get enableShowPassword() { return this.#enableShowPassword_accessor_storage; }
2333
+ set enableShowPassword(value) { this.#enableShowPassword_accessor_storage = value; }
2334
+ showPassword$ = new MutableValueModel(false);
2335
+ toggleShowPasswordCommand;
2194
2336
  constructor() {
2195
2337
  super();
2338
+ const { chain, valueOf } = Dsl.disposeWith(this);
2339
+ const face$ = chain(this.showPassword$).map(show => {
2340
+ return {
2341
+ icon: () => show ? "mat:visibility_off" : "mat:visibility"
2342
+ };
2343
+ });
2344
+ this.toggleShowPasswordCommand = Command.create(() => {
2345
+ this.showPassword$.value = !this.showPassword$.value;
2346
+ })
2347
+ .withFace(face$)
2348
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2349
+ }
2350
+ get fieldType() {
2351
+ return this.showPassword$.value ? "text" : "password";
2196
2352
  }
2197
2353
  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"] }] });
2354
+ 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
2355
  }
2356
+ __decorate([
2357
+ Proxify(),
2358
+ __metadata("design:type", Object)
2359
+ ], PasswordInputComponent.prototype, "enableShowPassword$", null);
2360
+ __decorate([
2361
+ StoreInValueModel(),
2362
+ __metadata("design:type", Object)
2363
+ ], PasswordInputComponent.prototype, "enableShowPassword", null);
2200
2364
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PasswordInputComponent, decorators: [{
2201
2365
  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" }]
2366
+ 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" }]
2367
+ }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2368
+ type: Input
2369
+ }], enableShowPassword$: [{
2370
+ type: Input
2371
+ }], enableShowPassword: [{
2372
+ type: Input
2373
+ }] } });
2374
+
2375
+ class SearchInputComponent extends AbstractValueInputComponent {
2376
+ autocomplete;
2377
+ clearCommand;
2378
+ constructor() {
2379
+ super();
2380
+ this.dense = true;
2381
+ const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2382
+ this.clearCommand = Command.create(() => {
2383
+ this.componentValue$.value = "";
2384
+ });
2385
+ this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2386
+ }
2387
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2388
+ 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"] }] });
2389
+ }
2390
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, decorators: [{
2391
+ type: Component,
2392
+ 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
2393
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2204
2394
  type: Input
2205
2395
  }] } });
2206
2396
 
2207
2397
  /**
2208
2398
  * Using templates:
2209
- * <aup-select-input [valueModel]="myModel" [options]="myOptions">
2399
+ * <aup-select-input [value$]="myModel" [options]="myOptions">
2210
2400
  * <ng-template #optionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2211
- * <ng-template #nilOptionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2401
+ * <ng-template #selectedOptionTemplate let-option>{{option.thePropertyYouWant}} note, not used for nils (the placeholder is used)</ng-template>
2402
+ * <ng-template #nilOptionTemplate>Uses the placeholder by default but you can customise it</ng-template>
2212
2403
  * </aup-select_input>
2213
2404
  */
2214
2405
  class SelectInputComponent extends AbstractValueInputComponent {
@@ -2233,7 +2424,7 @@ class SelectInputComponent extends AbstractValueInputComponent {
2233
2424
  super();
2234
2425
  const { chain } = Dsl.disposeWith(this);
2235
2426
  this.cookedOptions$ = chain(this.options$)
2236
- .reduceToList(options => {
2427
+ .mapAll(options => {
2237
2428
  return options.length < 1 && !isNil(this.componentValue$.value) ? [this.componentValue$.value] : options;
2238
2429
  }, {
2239
2430
  dependsOn: this.componentValue$
@@ -2272,21 +2463,21 @@ class SelectInputComponent extends AbstractValueInputComponent {
2272
2463
  id: this.delegatedIdentityOf(value)
2273
2464
  });
2274
2465
  let lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2275
- console.log(lastIdSnapshot);
2466
+ // console.log(lastIdSnapshot)
2276
2467
  before(this.options$).changes(() => {
2277
2468
  lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2278
- console.log(lastIdSnapshot);
2469
+ // console.log(lastIdSnapshot)
2279
2470
  });
2280
2471
  when(this.options$).changes((is, was) => {
2281
2472
  const newIdSnapshot = snapshotValueAndId(lastIdSnapshot.value);
2282
- console.log(lastIdSnapshot, newIdSnapshot);
2473
+ // console.log(lastIdSnapshot, newIdSnapshot)
2283
2474
  if (newIdSnapshot !== lastIdSnapshot.id) {
2284
2475
  this.id$.value = this.delegatedIdentityOf(this.componentValue$.value);
2285
2476
  }
2286
2477
  });
2287
2478
  }
2288
2479
  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"] }] });
2480
+ 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
2481
  }
2291
2482
  __decorate([
2292
2483
  Proxify(),
@@ -2298,7 +2489,7 @@ __decorate([
2298
2489
  ], SelectInputComponent.prototype, "options", null);
2299
2490
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputComponent, decorators: [{
2300
2491
  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"] }]
2492
+ 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
2493
  }], ctorParameters: function () { return []; }, propDecorators: { options$: [{
2303
2494
  type: Input
2304
2495
  }], options: [{
@@ -2329,17 +2520,24 @@ class StringInputComponent extends AbstractValueInputComponent {
2329
2520
  get enableClear() { return this.#enableClear_accessor_storage; }
2330
2521
  set enableClear(value) { this.#enableClear_accessor_storage = value; }
2331
2522
  iconPrefix;
2523
+ #suffixCommand_accessor_storage = proxify(Command);
2524
+ get suffixCommand() { return this.#suffixCommand_accessor_storage; }
2525
+ set suffixCommand(value) { this.#suffixCommand_accessor_storage = value; }
2332
2526
  clearCommand;
2333
2527
  constructor() {
2334
2528
  super();
2335
2529
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2336
2530
  this.clearCommand = Command.create(() => {
2337
2531
  this.componentValue$.value = "";
2338
- });
2339
- this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2532
+ })
2533
+ .withFace({ icon: () => "mat:clear" })
2534
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2535
+ }
2536
+ get hasSuffixCommand() {
2537
+ return Proxify.hasTarget(this.suffixCommand);
2340
2538
  }
2341
2539
  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"] }] });
2540
+ 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
2541
  }
2344
2542
  __decorate([
2345
2543
  Proxify(),
@@ -2349,9 +2547,13 @@ __decorate([
2349
2547
  StoreInValueModel(),
2350
2548
  __metadata("design:type", Object)
2351
2549
  ], StringInputComponent.prototype, "enableClear", null);
2550
+ __decorate([
2551
+ Proxify(),
2552
+ __metadata("design:type", Command)
2553
+ ], StringInputComponent.prototype, "suffixCommand", null);
2352
2554
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputComponent, decorators: [{
2353
2555
  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"] }]
2556
+ 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
2557
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2356
2558
  type: Input
2357
2559
  }], enableClear$: [{
@@ -2360,6 +2562,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2360
2562
  type: Input
2361
2563
  }], iconPrefix: [{
2362
2564
  type: Input
2565
+ }], suffixCommand: [{
2566
+ type: Input
2363
2567
  }] } });
2364
2568
 
2365
2569
  class TextInputComponent extends AbstractValueInputComponent {
@@ -2547,7 +2751,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2547
2751
  * </aup-switch-case>
2548
2752
  */
2549
2753
  class SwitchCaseComponent extends DisposableComponent {
2550
- cdr;
2551
2754
  #switch$_accessor_storage = proxify((ValueModel));
2552
2755
  get switch$() { return this.#switch$_accessor_storage; }
2553
2756
  set switch$(value) { this.#switch$_accessor_storage = value; }
@@ -2556,9 +2759,8 @@ class SwitchCaseComponent extends DisposableComponent {
2556
2759
  set switch(value) { this.#switch_accessor_storage = value; }
2557
2760
  switchCaseOptions;
2558
2761
  selectedIndex = 0;
2559
- constructor(cdr) {
2762
+ constructor() {
2560
2763
  super();
2561
- this.cdr = cdr;
2562
2764
  }
2563
2765
  ngAfterContentInit() {
2564
2766
  const subscription = this.switchCaseOptions.changes.subscribe(change => this.updateSelection());
@@ -2595,8 +2797,8 @@ class SwitchCaseComponent extends DisposableComponent {
2595
2797
  this.selectedIndex = -1;
2596
2798
  }
2597
2799
  }
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"] }] });
2800
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2801
+ 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
2802
  }
2601
2803
  __decorate([
2602
2804
  Proxify(),
@@ -2609,7 +2811,7 @@ __decorate([
2609
2811
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, decorators: [{
2610
2812
  type: Component,
2611
2813
  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$: [{
2814
+ }], ctorParameters: function () { return []; }, propDecorators: { switch$: [{
2613
2815
  type: Input
2614
2816
  }], switch: [{
2615
2817
  type: Input
@@ -2619,6 +2821,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2619
2821
  }] } });
2620
2822
 
2621
2823
  const HEADER_CELL_RENDERER_PORTAL = Symbol('aup-cell-header-renderer-component-ref');
2824
+ const FOOTER_CELL_RENDERER_PORTAL = Symbol('aup-cell-footer-renderer-component-ref');
2622
2825
  const CELL_RENDERER_PORTAL = Symbol('aup-cell-renderer-component-ref');
2623
2826
  const CELL_EDITOR_PORTAL = Symbol('aup-cell-editor-component-ref');
2624
2827
  const PORTAL_RENDERER_COMPONENT = Symbol('aup-cell-renderer-portal-component');
@@ -2716,6 +2919,23 @@ class TemplateCellRendererPortalRef extends CellRendererPortalRef {
2716
2919
  return new TemplatePortal(this.templateRef, this.viewContainer, { ...(data), $implicit: data.row });
2717
2920
  }
2718
2921
  }
2922
+ class CellFooterPortalRef extends CellPortalRef {
2923
+ componentType;
2924
+ initialiseHeader;
2925
+ constructor(componentType, initialiseHeader) {
2926
+ super();
2927
+ this.componentType = componentType;
2928
+ this.initialiseHeader = initialiseHeader;
2929
+ }
2930
+ initialiseHost(host, columnModel) {
2931
+ assert$1.isTruthy(host);
2932
+ host[HEADER_CELL_RENDERER_PORTAL] = new ComponentPortal(this.componentType);
2933
+ }
2934
+ // @Trace()
2935
+ onPortalAttached(host, portalComponent) {
2936
+ this.initialiseHeader(portalComponent, host.column);
2937
+ }
2938
+ }
2719
2939
 
2720
2940
  class ColumnTextSearchFormatter {
2721
2941
  }
@@ -2806,6 +3026,7 @@ class ColumnTextSearchWrapper extends ColumnTextSearchFormatter.Delegate {
2806
3026
  }
2807
3027
  class ColumnModel extends GarbageCollector {
2808
3028
  columnId;
3029
+ order;
2809
3030
  textPropertiesProvider;
2810
3031
  _columnTextProperties;
2811
3032
  _columnHeaderPortalRef;
@@ -2819,9 +3040,10 @@ class ColumnModel extends GarbageCollector {
2819
3040
  dasherisedColumnId;
2820
3041
  textSearchDelegate = new ColumnTextSearchWrapper();
2821
3042
  visible$;
2822
- constructor(columnId, textPropertiesProvider) {
3043
+ constructor(columnId, order, textPropertiesProvider) {
2823
3044
  super();
2824
3045
  this.columnId = columnId;
3046
+ this.order = order;
2825
3047
  this.textPropertiesProvider = textPropertiesProvider;
2826
3048
  const { valueOf } = Dsl.disposeWith(this);
2827
3049
  this.installHeaderRenderer();
@@ -2866,6 +3088,14 @@ class ColumnModel extends GarbageCollector {
2866
3088
  this._columnTextProperties = columnTextProperties;
2867
3089
  return this;
2868
3090
  }
3091
+ positionAfter(column) {
3092
+ this.order.position(this, { after: column });
3093
+ return this;
3094
+ }
3095
+ positionBefore(column) {
3096
+ this.order.position(this, { before: column });
3097
+ return this;
3098
+ }
2869
3099
  getSearchTextFor(row) {
2870
3100
  return this.textSearchDelegate.format(row);
2871
3101
  }
@@ -2967,8 +3197,8 @@ __decorate([
2967
3197
 
2968
3198
  class CustomTemplateColumnModel extends ColumnModel {
2969
3199
  config = new TemplateCellRendererPortalRef();
2970
- constructor(columnId, defaults) {
2971
- super(columnId, defaults);
3200
+ constructor(columnId, order, defaults) {
3201
+ super(columnId, order, defaults);
2972
3202
  this.configureCellRenderer(this.config);
2973
3203
  }
2974
3204
  setTemplate(templateRef, viewContainer, fillCell, padChild) {
@@ -3046,12 +3276,17 @@ class AbstractTableComponent extends DisposableComponent {
3046
3276
  #showHeader_accessor_storage = true;
3047
3277
  get showHeader() { return this.#showHeader_accessor_storage; }
3048
3278
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
3279
+ #enableScrolling$_accessor_storage = proxify((ValueModel));
3049
3280
  /**
3050
3281
  * Set to true to enable scrolling. Once enabled the table will have 0 implicit height. You will either
3051
3282
  * need to set it explicitly e.g. height: 400px; or by using flex or grid layout to make it fill it's
3052
3283
  * containment area.
3053
3284
  */
3054
- enableScrolling = false;
3285
+ get enableScrolling$() { return this.#enableScrolling$_accessor_storage; }
3286
+ set enableScrolling$(value) { this.#enableScrolling$_accessor_storage = value; }
3287
+ #enableScrolling_accessor_storage = false;
3288
+ get enableScrolling() { return this.#enableScrolling_accessor_storage; }
3289
+ set enableScrolling(value) { this.#enableScrolling_accessor_storage = value; }
3055
3290
  columns;
3056
3291
  columnIds;
3057
3292
  columnsById;
@@ -3070,7 +3305,6 @@ class AbstractTableComponent extends DisposableComponent {
3070
3305
  super();
3071
3306
  this.injector = injector;
3072
3307
  const { chain, when } = Dsl.disposeWith(this);
3073
- this._visibleRows$.setDelegate(this._dataSource$);
3074
3308
  when(chain(this._dataSource$).first()).becomesTruthy(it => {
3075
3309
  if (it === this.identityOf(it)) {
3076
3310
  console.warn("Table model identity function is using reference equality. This can cause lots of table re-rendering", {
@@ -3089,7 +3323,7 @@ class AbstractTableComponent extends DisposableComponent {
3089
3323
  if (!model) {
3090
3324
  lang$1.illegalState("aup-table tableModel is nil");
3091
3325
  }
3092
- this.columnsById = chain(model.columns).indexBy('columnId');
3326
+ this.columnsById = chain(model.columns$).indexBy('columnId');
3093
3327
  this._dataSource$.setDelegate(model.dataSource$);
3094
3328
  model.initialise(this.injector, (row) => this.identityOf(row));
3095
3329
  }
@@ -3106,7 +3340,7 @@ class AbstractTableComponent extends DisposableComponent {
3106
3340
  }
3107
3341
  }
3108
3342
  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 });
3343
+ 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
3344
  }
3111
3345
  __decorate([
3112
3346
  Proxify(),
@@ -3116,6 +3350,14 @@ __decorate([
3116
3350
  StoreInValueModel(),
3117
3351
  __metadata("design:type", Object)
3118
3352
  ], AbstractTableComponent.prototype, "showHeader", null);
3353
+ __decorate([
3354
+ Proxify(),
3355
+ __metadata("design:type", ValueModel)
3356
+ ], AbstractTableComponent.prototype, "enableScrolling$", null);
3357
+ __decorate([
3358
+ StoreInValueModel(),
3359
+ __metadata("design:type", Boolean)
3360
+ ], AbstractTableComponent.prototype, "enableScrolling", null);
3119
3361
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractTableComponent, decorators: [{
3120
3362
  type: Component,
3121
3363
  args: [{
@@ -3126,6 +3368,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
3126
3368
  type: Input
3127
3369
  }], showHeader: [{
3128
3370
  type: Input
3371
+ }], enableScrolling$: [{
3372
+ type: Input
3129
3373
  }], enableScrolling: [{
3130
3374
  type: Input
3131
3375
  }], baseCssClass: [{
@@ -3186,6 +3430,8 @@ class EditSession extends GarbageCollector {
3186
3430
  // console.warn()
3187
3431
  // }
3188
3432
  this._liveRowValue$.value = produce(this._liveRowValue$.value, draft => {
3433
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3434
+ // @ts-ignore
3189
3435
  this.form.writeDirtyStateTo(draft);
3190
3436
  });
3191
3437
  });
@@ -3288,11 +3534,11 @@ class DefaultCellRendererComponent {
3288
3534
  return this._value;
3289
3535
  }
3290
3536
  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" }] });
3537
+ 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
3538
  }
3293
3539
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DefaultCellRendererComponent, decorators: [{
3294
3540
  type: Component,
3295
- args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n" }]
3541
+ args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value?.toString()| aupHighlight\"></span>\n" }]
3296
3542
  }], propDecorators: { value: [{
3297
3543
  type: Input
3298
3544
  }] } });
@@ -3308,7 +3554,8 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3308
3554
  super();
3309
3555
  this.selectCommand = Command.create(() => {
3310
3556
  this.selectionModel.toggleAllCommand.execute();
3311
- });
3557
+ }).visibleWhile(this.selectionModel.toggleAllCommand.visible$)
3558
+ .enableWhile(this.selectionModel.toggleAllCommand.enabled$);
3312
3559
  }
3313
3560
  isSelected() {
3314
3561
  return this.ifMultiSelectionModel(m => m.allSelected$.value, false);
@@ -3336,7 +3583,7 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3336
3583
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionHeaderCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3337
3584
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionHeaderCellComponent, selector: "aup-selection-header-cell", providers: [
3338
3585
  { 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"] }] });
3586
+ ], 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
3587
  }
3341
3588
  __decorate([
3342
3589
  Proxify(),
@@ -3369,7 +3616,7 @@ class SelectionCellComponent extends DisposableComponent {
3369
3616
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
3370
3617
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionCellComponent, selector: "aup-selection-cell", inputs: { row: "row" }, providers: [
3371
3618
  { 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"] }] });
3619
+ ], 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
3620
  }
3374
3621
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, decorators: [{
3375
3622
  type: Component,
@@ -3430,25 +3677,14 @@ class Bounds extends Dimension {
3430
3677
  })(Bounds || (Bounds = {}));
3431
3678
 
3432
3679
  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
- }
3680
+ elementRef = this.inject(ElementRef);
3681
+ ngZone = this.inject(NgZone);
3682
+ boundsTracker = new ResizeAwareComponent.ResizeTracker(this.elementRef, this.ngZone);
3441
3683
  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());
3684
+ this.boundsTracker.notifyViewReady();
3449
3685
  }
3450
3686
  get bounds$() {
3451
- return this._bounds$.readonly$;
3687
+ return this.boundsTracker.bounds$;
3452
3688
  }
3453
3689
  get nativeElement() {
3454
3690
  return this.elementRef.nativeElement;
@@ -3458,57 +3694,160 @@ class ResizeAwareComponent extends DisposableComponent {
3458
3694
  return this.bounds.relativePositionOf(point);
3459
3695
  }
3460
3696
  get bounds() {
3461
- return this._bounds$.value;
3697
+ return this.bounds$.value;
3462
3698
  }
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 });
3699
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
3467
3700
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ResizeAwareComponent, usesInheritance: true, ngImport: i0 });
3468
3701
  }
3469
3702
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, decorators: [{
3470
3703
  type: Directive
3471
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; } });
3704
+ }] });
3705
+ (function (ResizeAwareComponent) {
3706
+ class ResizeTracker extends GarbageCollector {
3707
+ elementRef;
3708
+ ngZone;
3709
+ _bounds$ = new MutableValueModel(new Bounds(0, 0, 0, 0));
3710
+ width$;
3711
+ height$;
3712
+ top$;
3713
+ left$;
3714
+ bottom$;
3715
+ right$;
3716
+ constructor(elementRef, ngZone) {
3717
+ super();
3718
+ this.elementRef = elementRef;
3719
+ this.ngZone = ngZone;
3720
+ const { chain } = Dsl.disposeWith(this);
3721
+ this.width$ = chain(this.bounds$).pluck("width");
3722
+ this.height$ = chain(this.bounds$).pluck("height");
3723
+ this.top$ = chain(this.bounds$).pluck("top");
3724
+ this.left$ = chain(this.bounds$).pluck("left");
3725
+ this.bottom$ = chain.numericValue(this.top$).add(this.height$);
3726
+ this.right$ = chain.numericValue(this.left$).add(this.width$);
3727
+ }
3728
+ notifyViewReady() {
3729
+ const element = this.elementRef.nativeElement;
3730
+ const ro = new ResizeObserver((entries, observer) => {
3731
+ this.ngZone.run(() => this._updateBounds());
3732
+ });
3733
+ ro.observe(element);
3734
+ this.onDispose(() => ro.disconnect());
3735
+ setTimeout(() => this._updateBounds());
3736
+ }
3737
+ get bounds$() {
3738
+ return this._bounds$.readonly$;
3739
+ }
3740
+ get nativeElement() {
3741
+ return this.elementRef.nativeElement;
3742
+ }
3743
+ // TODO: Make this handle body scroll
3744
+ relativePositionOf(point) {
3745
+ return this.bounds.relativePositionOf(point);
3746
+ }
3747
+ get bounds() {
3748
+ return this._bounds$.value;
3749
+ }
3750
+ _updateBounds() {
3751
+ this._bounds$.value = Bounds.ofElement(this.nativeElement);
3752
+ }
3753
+ }
3754
+ ResizeAwareComponent.ResizeTracker = ResizeTracker;
3755
+ })(ResizeAwareComponent || (ResizeAwareComponent = {}));
3472
3756
 
3473
- class ColumnListModel extends AbstractComputedListModel {
3474
- _allColumns$ = new MutableListModel();
3475
- columnsById$;
3757
+ var ColumnOrderManager;
3758
+ (function (ColumnOrderManager) {
3759
+ function processPosition(position, callback) {
3760
+ if (position) {
3761
+ const keys = Object.keys(position);
3762
+ if (keys.includes("before")) {
3763
+ return position["before"] ? callback.before(position["before"]) : callback.first();
3764
+ }
3765
+ else {
3766
+ return position["after"] ? callback.after(position["after"]) : callback.last();
3767
+ }
3768
+ }
3769
+ else {
3770
+ return callback.last();
3771
+ }
3772
+ }
3773
+ ColumnOrderManager.processPosition = processPosition;
3774
+ })(ColumnOrderManager || (ColumnOrderManager = {}));
3775
+
3776
+ class ColumnRef {
3777
+ column;
3778
+ position;
3779
+ constructor(column, position) {
3780
+ this.column = column;
3781
+ this.position = position;
3782
+ }
3783
+ }
3784
+ class ColumnManager extends GarbageCollector {
3785
+ _columnRefs$ = new MutableListModel();
3786
+ orderedColumnRefs$;
3787
+ _columnsById$;
3788
+ allColumns$;
3789
+ columnVisibilities$ = new WatchList();
3790
+ visibleColumns$;
3476
3791
  constructor() {
3477
3792
  super();
3478
3793
  const { chain } = Dsl.disposeWith(this);
3479
- this.columnsById$ = chain(this._allColumns$).indexBy('columnId');
3794
+ this.orderedColumnRefs$ = chain(this._columnRefs$).orderBy("position", "asc");
3795
+ this.allColumns$ = this.orderedColumnRefs$.pluck("column");
3796
+ this._columnsById$ = chain(this.allColumns$).indexBy('columnId');
3797
+ this.visibleColumns$ = chain(this.allColumns$).select(it => it.visible$.value, {
3798
+ dependsOn: this.columnVisibilities$
3799
+ });
3480
3800
  }
3481
- get allColumns$() {
3482
- return this._allColumns$.readonly$;
3801
+ position(column, newPosition) {
3802
+ const target = this._columnRefs$.query().findMatching(it => it.column === column);
3803
+ const position = this.computePosition(newPosition);
3804
+ this._columnRefs$.replace(target, { with: new ColumnRef(target.column, position) });
3483
3805
  }
3484
3806
  getColumn(id) {
3485
- return this.columnsById$.get(id);
3807
+ return this._columnsById$.get(id);
3486
3808
  }
3487
3809
  hasColumn(id) {
3488
- return !!this.columnsById$.get(id);
3810
+ return !!this._columnsById$.get(id);
3489
3811
  }
3490
3812
  hasMatchingColumn(row, regex) {
3491
3813
  // only search the visible columns
3492
- return !!this.value.find(c => regex.test(c.getSearchTextFor(row)));
3814
+ return !!this.visibleColumns$.value.find(c => regex.test(c.getSearchTextFor(row)));
3493
3815
  }
3494
- addColumn(column, index) {
3816
+ addColumn(column, position) {
3495
3817
  if (this.hasColumn(column.columnId)) {
3496
3818
  lang.illegalState(`Column with id=${column.columnId} already exists`);
3497
3819
  }
3498
3820
  this.registerDisposable(column);
3499
- this.runInTransaction(() => {
3500
- if (!isNil(index)) {
3501
- this._allColumns$.insert(index, column);
3502
- }
3503
- else {
3504
- this._allColumns$.push(column);
3821
+ this._columnRefs$.push(new ColumnRef(column, this.computePosition(position)));
3822
+ this.columnVisibilities$.add(column.visible$);
3823
+ return column;
3824
+ }
3825
+ computePosition(position) {
3826
+ const q = this.orderedColumnRefs$.query();
3827
+ return ColumnOrderManager.processPosition(position, {
3828
+ before(col) {
3829
+ const index = q.findIndex(ref => ref.column === col);
3830
+ const beforeCol = q.value[index];
3831
+ const afterCol = index - 1 >= 0 ? q.value[index - 1] : undefined;
3832
+ return generateKeyBetween(afterCol?.position, beforeCol.position);
3833
+ },
3834
+ after(col) {
3835
+ const index = q.findIndex(ref => ref.column === col);
3836
+ const afterCol = q.value[index];
3837
+ const beforeCol = index + 1 < q.length ? q.value[index + 1] : undefined;
3838
+ return generateKeyBetween(afterCol.position, beforeCol?.position);
3839
+ },
3840
+ first() {
3841
+ return generateKeyBetween(null, q.first()?.position);
3842
+ },
3843
+ last() {
3844
+ // add it to the end of the list
3845
+ return generateKeyBetween(q.last()?.position, null);
3505
3846
  }
3506
- this.registerDisposable(this.trackSource(column.visible$));
3507
3847
  });
3508
- return column;
3509
3848
  }
3510
3849
  doComputeValue() {
3511
- return this._allColumns$.value.filter(c => c.visible$.value);
3850
+ return this.allColumns$.value.filter(c => c.visible$.value);
3512
3851
  }
3513
3852
  }
3514
3853
 
@@ -3542,8 +3881,8 @@ function EnableCellTextSearch(options) {
3542
3881
 
3543
3882
  class CustomValueColumnModel extends ColumnModel {
3544
3883
  getValue;
3545
- constructor(columnId, defaults, getValue) {
3546
- super(columnId, defaults);
3884
+ constructor(columnId, order, defaults, getValue) {
3885
+ super(columnId, order, defaults);
3547
3886
  this.getValue = getValue;
3548
3887
  this.cellRenderer(DefaultCellRendererComponent);
3549
3888
  }
@@ -3551,17 +3890,17 @@ class CustomValueColumnModel extends ColumnModel {
3551
3890
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => new ColumnTextSearchFormatter.Null()), row => this.getValue(row));
3552
3891
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3553
3892
  if (firstTime) {
3554
- if (isFunction$1(onComponentInitOrOptions)) {
3893
+ if (isFunction(onComponentInitOrOptions)) {
3555
3894
  onComponentInitOrOptions(component);
3556
3895
  }
3557
3896
  else {
3558
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3897
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3559
3898
  onComponentInitOrOptions.onComponentInit(component);
3560
3899
  }
3561
3900
  }
3562
3901
  }
3563
3902
  component.value = this.getValue(rowData.row);
3564
- if (!isFunction$1(onComponentInitOrOptions) && isFunction$1(onComponentInitOrOptions?.onRowUpdate)) {
3903
+ if (!isFunction(onComponentInitOrOptions) && isFunction(onComponentInitOrOptions?.onRowUpdate)) {
3565
3904
  onComponentInitOrOptions.onRowUpdate(component, rowData.row);
3566
3905
  }
3567
3906
  }));
@@ -3573,8 +3912,8 @@ class CustomValueColumnModel extends ColumnModel {
3573
3912
  }
3574
3913
 
3575
3914
  class EditorControlColumnModel extends ColumnModel {
3576
- constructor(columnId, saveCommandFactory, defaults) {
3577
- super(columnId, defaults);
3915
+ constructor(columnId, order, saveCommandFactory, defaults) {
3916
+ super(columnId, order, defaults);
3578
3917
  this.cellRenderer(EditRowControlsComponent);
3579
3918
  }
3580
3919
  cellRenderer(componentType) {
@@ -3599,8 +3938,8 @@ class ListPropertyColumnModel extends ColumnModel {
3599
3938
  intermediate.map(v => v?.toString()).join(", ") :
3600
3939
  intermediate?.toString();
3601
3940
  };
3602
- constructor(id, property, defaults) {
3603
- super(id, defaults);
3941
+ constructor(id, order, property, defaults) {
3942
+ super(id, order, defaults);
3604
3943
  this.property = property;
3605
3944
  this.cellRenderer(DefaultCellRendererComponent);
3606
3945
  }
@@ -3616,7 +3955,7 @@ class ListPropertyColumnModel extends ColumnModel {
3616
3955
  }
3617
3956
  cellEditor(editor, validatorsOrInitialiser, initialiseComponent) {
3618
3957
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3619
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3958
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3620
3959
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3621
3960
  const formListModel = editSession.form.pluckList(this.property);
3622
3961
  if (validators) {
@@ -3645,8 +3984,8 @@ class PropertyColumnModel extends ColumnModel {
3645
3984
  _defaultSearchTextFormatter = (value) => {
3646
3985
  return (this._userFormat ?? Functions.identity)(value)?.toString();
3647
3986
  };
3648
- constructor(id, property, defaults) {
3649
- super(id, defaults);
3987
+ constructor(id, order, property, defaults) {
3988
+ super(id, order, defaults);
3650
3989
  this.property = property;
3651
3990
  this.cellRenderer(DefaultCellRendererComponent);
3652
3991
  }
@@ -3654,11 +3993,11 @@ class PropertyColumnModel extends ColumnModel {
3654
3993
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => ColumnTextSearchFormatter.forFormatter(this._defaultSearchTextFormatter)), row => row[this.property]);
3655
3994
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3656
3995
  if (firstTime) {
3657
- if (isFunction$1(onComponentInitOrOptions)) {
3996
+ if (isFunction(onComponentInitOrOptions)) {
3658
3997
  onComponentInitOrOptions(component);
3659
3998
  }
3660
3999
  else {
3661
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
4000
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3662
4001
  onComponentInitOrOptions.onComponentInit(component);
3663
4002
  }
3664
4003
  }
@@ -3683,7 +4022,7 @@ class PropertyColumnModel extends ColumnModel {
3683
4022
  component[ColumnModel.CELL_RENDERER_COMPONENT_ROW_CACHE] = rowData.row;
3684
4023
  let disableEditCallback = false;
3685
4024
  if (firstTime) {
3686
- if (isFunction$1(options?.onComponentInit)) {
4025
+ if (isFunction(options?.onComponentInit)) {
3687
4026
  options.onComponentInit(component);
3688
4027
  }
3689
4028
  // install our edit callback
@@ -3698,7 +4037,7 @@ class PropertyColumnModel extends ColumnModel {
3698
4037
  disableEditCallback = true;
3699
4038
  component.value = rowData.row[this.property];
3700
4039
  disableEditCallback = false;
3701
- if (!isFunction$1(options) && isFunction$1(options?.onRowUpdate)) {
4040
+ if (!isFunction(options) && isFunction(options?.onRowUpdate)) {
3702
4041
  options.onRowUpdate(component, rowData.row);
3703
4042
  }
3704
4043
  }));
@@ -3706,7 +4045,7 @@ class PropertyColumnModel extends ColumnModel {
3706
4045
  }
3707
4046
  cellEditor(editor, validatorsOrInitialiser, onComponentInit) {
3708
4047
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3709
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
4048
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
3710
4049
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3711
4050
  const formValueModel = editSession.form.pluck(this.property);
3712
4051
  if (validators) {
@@ -3733,8 +4072,8 @@ class SelectionColumnModel extends ColumnModel {
3733
4072
  selectionModel;
3734
4073
  _enableHeaderControls = true;
3735
4074
  _color = "accent";
3736
- constructor(columnId, defaults, selectionModel) {
3737
- super(columnId, defaults);
4075
+ constructor(columnId, order, defaults, selectionModel) {
4076
+ super(columnId, order, defaults);
3738
4077
  this.selectionModel = selectionModel;
3739
4078
  const { chain } = Dsl.disposeWith(this);
3740
4079
  this._selectRowOnClick(false);
@@ -3775,6 +4114,42 @@ class SelectionColumnModel extends ColumnModel {
3775
4114
  }
3776
4115
  }
3777
4116
 
4117
+ let RowClass$1 = class RowClass {
4118
+ className;
4119
+ matches;
4120
+ constructor(className, matches) {
4121
+ this.className = className;
4122
+ this.matches = matches;
4123
+ }
4124
+ };
4125
+ class FooterRowModel {
4126
+ _rowClasses = [];
4127
+ noPadding() {
4128
+ this.addClass("no-padding");
4129
+ }
4130
+ addClass(className, condition) {
4131
+ this._rowClasses.push(new RowClass$1(className, condition ?? (() => true)));
4132
+ }
4133
+ }
4134
+ (function (FooterRowModel) {
4135
+ class Impl extends FooterRowModel {
4136
+ component;
4137
+ onInit;
4138
+ portal;
4139
+ constructor(component, onInit) {
4140
+ super();
4141
+ this.component = component;
4142
+ this.onInit = onInit;
4143
+ this.portal = new ComponentPortal(component);
4144
+ }
4145
+ getActiveRowClasses() {
4146
+ return this._rowClasses.filter(c => c.matches()).map(c => c.className).join(" ");
4147
+ }
4148
+ }
4149
+ FooterRowModel.Impl = Impl;
4150
+ })(FooterRowModel || (FooterRowModel = {}));
4151
+ ProxyRegistry.registerOneTimeBinding(FooterRowModel);
4152
+
3778
4153
  class TableMoreMenuComponent extends DisposableComponent {
3779
4154
  value$ = new MutableValueModel();
3780
4155
  #value_accessor_storage;
@@ -3784,13 +4159,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3784
4159
  popupType$ = new MutableValueModel();
3785
4160
  popupComponentPortal$;
3786
4161
  _visible$ = this.registerDisposable(new DelegatingValueModel());
4162
+ initialiseCallback;
3787
4163
  constructor() {
3788
4164
  super();
3789
4165
  const { chain } = Dsl.disposeWith(this);
3790
4166
  this.popupComponentPortal$ = chain(this.popupType$).map(type => new ComponentPortal(type));
3791
4167
  }
3792
- configurePopupComponentType(popupComponentType) {
4168
+ configurePopupComponentType(popupComponentType, configureCallback) {
3793
4169
  this.popupType$.value = popupComponentType;
4170
+ this.initialiseCallback = configureCallback;
3794
4171
  }
3795
4172
  // Stops tree selection when clicking the menu button
3796
4173
  preventDefault($event) {
@@ -3801,12 +4178,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3801
4178
  const component = $event.instance;
3802
4179
  component.initialise(this.value$, Command.create(() => this.matMenuTrigger.closeMenu()));
3803
4180
  this._visible$.setDelegate(component.visible$);
4181
+ if (this.initialiseCallback) {
4182
+ this.initialiseCallback(component);
4183
+ }
3804
4184
  }
3805
4185
  get visible$() {
3806
4186
  return this._visible$.readonly$;
3807
4187
  }
3808
4188
  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"] }] });
4189
+ 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
4190
  }
3811
4191
  __decorate([
3812
4192
  StoreInValueModel(),
@@ -3835,16 +4215,25 @@ class RowClass {
3835
4215
  this.matches = matches;
3836
4216
  }
3837
4217
  }
4218
+ class RowAttribute {
4219
+ attributeName;
4220
+ getValue;
4221
+ constructor(attributeName, getValue) {
4222
+ this.attributeName = attributeName;
4223
+ this.getValue = getValue;
4224
+ }
4225
+ }
3838
4226
  class AbstractTableModel extends GarbageCollector {
3839
4227
  _dataSource$ = this.registerDisposable(new DelegatingListModel());
3840
4228
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
3841
4229
  _visibleRows$ = this.registerDisposable(new DelegatingListModel());
3842
- _columnList = this.registerDisposable(new ColumnListModel());
4230
+ columnManager = this.registerDisposable(new ColumnManager());
3843
4231
  _editorSessions = new MutableListModel();
3844
4232
  _rowsBeingEdited$;
3845
4233
  saveCommandFactory;
3846
4234
  _editorSessionByRowId;
3847
4235
  rowClassNamePredicates = [];
4236
+ rowAttributeGenerators = [];
3848
4237
  _columnTextPropertiesLookup;
3849
4238
  editing$;
3850
4239
  firstEditableColumn$;
@@ -3861,6 +4250,8 @@ class AbstractTableModel extends GarbageCollector {
3861
4250
  selectedItems$;
3862
4251
  leadSelection$;
3863
4252
  hasSelection$;
4253
+ footerRowModel;
4254
+ _viewDependencies = new Set();
3864
4255
  constructor() {
3865
4256
  super();
3866
4257
  const { chain } = Dsl.disposeWith(this);
@@ -3869,15 +4260,15 @@ class AbstractTableModel extends GarbageCollector {
3869
4260
  });
3870
4261
  this._editorSessionByRowId = chain(this._editorSessions).indexBy("rowId");
3871
4262
  this.editing$ = chain(this._editorSessions).count().isGreaterThan(0);
3872
- this.textSearchPredicate$ = chain(this.visibleColumns).reduce(columns => {
4263
+ this.textSearchPredicate$ = chain(this.visibleColumns$).reduceAll(columns => {
3873
4264
  return (row, regex) => {
3874
4265
  return (!regex || !!columns.find(c => regex.test(c.getSearchTextFor(row))));
3875
4266
  };
3876
4267
  });
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);
4268
+ this.firstEditableColumn$ = chain(this.columns$).select(c => c.hasEditorPortal()).first();
4269
+ this.firstVisibleColumn$ = chain(this.visibleColumns$).first();
4270
+ this.lastVisibleColumn$ = chain(this.visibleColumns$).last();
4271
+ this.rowSelectionDisabledOnAllColumns$ = chain(this.columnManager.visibleColumns$).select(column => column.isRowSelectionEnabled()).count().equals(0);
3881
4272
  this.dataSourceEmpty$ = chain(this.dataSource$).isEmpty();
3882
4273
  this.selectedItems$ = this.selectionModelProxy.selectedItems$;
3883
4274
  this.leadSelection$ = this.selectionModelProxy.leadSelection$;
@@ -3901,9 +4292,23 @@ class AbstractTableModel extends GarbageCollector {
3901
4292
  ],
3902
4293
  parent: injector
3903
4294
  });
3904
- this.columns.value.forEach(c => c.initialise(customInjector));
4295
+ this.columns$.value.forEach(c => c.initialise(customInjector));
3905
4296
  this.identityOf = identityOf;
3906
4297
  }
4298
+ /**
4299
+ * Adds additional models that will trigger a table repaint. This is required if the table
4300
+ * needs to be redrawn outside of changes to the rows of filters. i.e. some eternal state is used
4301
+ * to assign row classes etc.
4302
+ *
4303
+ * Note: This function must be called before the table is bound to the model.
4304
+ * @param hasValues
4305
+ */
4306
+ viewStateDependsOn(...hasValues) {
4307
+ hasValues.forEach(it => this._viewDependencies.add(it));
4308
+ }
4309
+ get viewStateDependencies() {
4310
+ return Array.from(this._viewDependencies.values());
4311
+ }
3907
4312
  get dataSource$() {
3908
4313
  return this._dataSource$.readonly$;
3909
4314
  }
@@ -3954,19 +4359,19 @@ class AbstractTableModel extends GarbageCollector {
3954
4359
  });
3955
4360
  });
3956
4361
  }
3957
- get columns() {
3958
- return this._columnList.allColumns$;
4362
+ get columns$() {
4363
+ return this.columnManager.allColumns$;
3959
4364
  }
3960
- get visibleColumns() {
3961
- return this._columnList.readonly$;
4365
+ get visibleColumns$() {
4366
+ return this.columnManager.visibleColumns$;
3962
4367
  }
3963
4368
  pluck(property, options) {
3964
4369
  const columnId = options?.columnId || property.toString();
3965
- return this.addColumn(new PropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4370
+ return this.addColumn(new PropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3966
4371
  }
3967
4372
  pluckList(property, options) {
3968
4373
  const columnId = options?.columnId || property.toString();
3969
- return this.addColumn(new ListPropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4374
+ return this.addColumn(new ListPropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3970
4375
  }
3971
4376
  // TODO: clean this up and assign the selection model on teh table directly.
3972
4377
  // tableModel.useSelectionModel(model) and have the seleciton column automatically
@@ -3975,43 +4380,54 @@ class AbstractTableModel extends GarbageCollector {
3975
4380
  _addSelectionColumn(selectionModel, visible) {
3976
4381
  assert.isNil(this.selectionColumnModel);
3977
4382
  const columnId = "selection-column";
3978
- this.selectionColumnModel = new SelectionColumnModel(columnId, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
4383
+ this.selectionColumnModel = new SelectionColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
3979
4384
  this.selectionColumnModel.useSelectionModel(selectionModel);
3980
4385
  this.addRowClass("aup-row-selected", row => this.selectionColumnModel.isSelected(row));
3981
- const selectionColumnModel = this.addColumn(this.selectionColumnModel, 0);
3982
- if (!isNil$1(visible)) {
4386
+ const selectionColumnModel = this.addColumn(this.selectionColumnModel, { before: null }); // first column
4387
+ if (!isNil(visible)) {
3983
4388
  selectionColumnModel.visibleWhile(visible instanceof ValueModel ? visible : ValueModel.constant(visible));
3984
4389
  }
3985
4390
  return selectionColumnModel;
3986
4391
  }
3987
4392
  addEditControls(saveCommandFactory, formFactory) {
3988
4393
  this.saveCommandFactory = saveCommandFactory;
3989
- if (isFunction$1(formFactory)) {
4394
+ if (isFunction(formFactory)) {
3990
4395
  this._createForm = formFactory;
3991
4396
  }
3992
4397
  const columnId = "editControls";
3993
- return this.addColumn(new EditorControlColumnModel(columnId, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
4398
+ return this.addColumn(new EditorControlColumnModel(columnId, this.columnManager, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
3994
4399
  }
3995
4400
  addCustomColumn(columnId, dataAccessor) {
3996
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), dataAccessor));
4401
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), dataAccessor));
3997
4402
  }
3998
4403
  addComponentColumn(columnId, component, onComponentInitOrOptions) {
3999
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4404
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4000
4405
  }
4001
- addMoreMenu(componentClass) {
4406
+ addMoreMenu(componentClass, initialiseCallback) {
4002
4407
  return this.addComponentColumn("more-menu", TableMoreMenuComponent, (component) => {
4003
- component.configurePopupComponentType(componentClass);
4408
+ component.configurePopupComponentType(componentClass, initialiseCallback);
4004
4409
  }).columnTextProperties({
4005
4410
  headerText() {
4006
4411
  return "";
4007
4412
  }
4008
4413
  });
4009
4414
  }
4415
+ addFooterRow(component, initialiseCallback) {
4416
+ assert.isNil(this.footerRowModel);
4417
+ this.footerRowModel = new FooterRowModel.Impl(component, initialiseCallback);
4418
+ return this.footerRowModel;
4419
+ }
4010
4420
  addTemplateColumn(columnId) {
4011
- return this.addColumn(new CustomTemplateColumnModel(columnId, () => this.getColumnTextProperties(columnId)));
4421
+ return this.addColumn(new CustomTemplateColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId)));
4012
4422
  }
4013
- addRowClass(className, predicate) {
4423
+ addRowClass(className, predicate, options) {
4014
4424
  this.rowClassNamePredicates.push(new RowClass(className, predicate));
4425
+ if (options) {
4426
+ this.viewStateDependsOn(...DependsOnOptions.extract(options));
4427
+ }
4428
+ }
4429
+ addRowAttribute(attributeName, getValue) {
4430
+ this.rowAttributeGenerators.push(new RowAttribute(attributeName, getValue));
4015
4431
  }
4016
4432
  getRowClasses(row) {
4017
4433
  const classNames = [];
@@ -4022,8 +4438,13 @@ class AbstractTableModel extends GarbageCollector {
4022
4438
  });
4023
4439
  return classNames;
4024
4440
  }
4025
- addColumn(column, index) {
4026
- return this._columnList.addColumn(column, index);
4441
+ getRowAttributes(row) {
4442
+ return this.rowAttributeGenerators.reduce((result, generator) => {
4443
+ return { ...result, [generator.attributeName]: generator.getValue(row) };
4444
+ }, {});
4445
+ }
4446
+ addColumn(column, position) {
4447
+ return this.columnManager.addColumn(column, position);
4027
4448
  }
4028
4449
  columnTextProperties(columnTextProperties) {
4029
4450
  this._columnTextPropertiesLookup = columnTextProperties;
@@ -4140,7 +4561,7 @@ class TableCellComponent extends DisposableComponent {
4140
4561
  };
4141
4562
  }
4142
4563
  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"] }] });
4564
+ 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
4565
  }
4145
4566
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableCellComponent, decorators: [{
4146
4567
  type: Component,
@@ -4179,7 +4600,7 @@ class TableHeaderCellComponent {
4179
4600
  return this[HEADER_CELL_RENDERER_PORTAL];
4180
4601
  }
4181
4602
  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"] }] });
4603
+ 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
4604
  }
4184
4605
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableHeaderCellComponent, decorators: [{
4185
4606
  type: Component,
@@ -4191,61 +4612,132 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
4191
4612
  args: ['class']
4192
4613
  }] } });
4193
4614
 
4615
+ // eslint-disable-next-line @angular-eslint/component-class-suffix
4616
+ class TableFooterRow {
4617
+ row;
4618
+ defaultClassNames = 'aup-footer-row-renderer';
4619
+ get rowClasses() {
4620
+ return this.row.getActiveRowClasses();
4621
+ }
4622
+ initialise($event) {
4623
+ this.row.onInit && this.row.onInit($event.instance);
4624
+ }
4625
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, deps: [], target: i0.ɵɵFactoryTarget.Component });
4626
+ 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"] }] });
4627
+ }
4628
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, decorators: [{
4629
+ type: Component,
4630
+ 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"] }]
4631
+ }], propDecorators: { row: [{
4632
+ type: Input
4633
+ }], defaultClassNames: [{
4634
+ type: HostBinding,
4635
+ args: ['class']
4636
+ }], rowClasses: [{
4637
+ type: HostBinding,
4638
+ args: ['class']
4639
+ }] } });
4640
+
4641
+ const AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER = new InjectionToken("AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER");
4642
+ class TableRowAttributesDirective {
4643
+ elementRef;
4644
+ aupTableRowAttributes;
4645
+ constructor(elementRef) {
4646
+ this.elementRef = elementRef;
4647
+ }
4648
+ ngOnInit() {
4649
+ for (const attr in this.aupTableRowAttributes) {
4650
+ this.elementRef.nativeElement.setAttribute(attr, this.aupTableRowAttributes[attr]);
4651
+ }
4652
+ }
4653
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
4654
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: { aupTableRowAttributes: "aupTableRowAttributes" }, ngImport: i0 });
4655
+ }
4656
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, decorators: [{
4657
+ type: Directive,
4658
+ args: [{
4659
+ selector: "[aupTableRowAttributes]",
4660
+ }]
4661
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { aupTableRowAttributes: [{
4662
+ type: Input
4663
+ }] } });
4194
4664
  class TableBodyComponent extends ResizeAwareComponent {
4665
+ bufferMultiplier;
4195
4666
  #data$_accessor_storage = proxify((ListModel));
4196
4667
  get data$() { return this.#data$_accessor_storage; }
4197
4668
  set data$(value) { this.#data$_accessor_storage = value; }
4198
4669
  #tableModel_accessor_storage = proxify((AbstractTableModel));
4199
4670
  get tableModel() { return this.#tableModel_accessor_storage; }
4200
4671
  set tableModel(value) { this.#tableModel_accessor_storage = value; }
4672
+ #footerRow_accessor_storage = proxify((FooterRowModel.Impl));
4673
+ get footerRow() { return this.#footerRow_accessor_storage; }
4674
+ set footerRow(value) { this.#footerRow_accessor_storage = value; }
4201
4675
  #showHeader$_accessor_storage = proxify((ValueModel));
4202
4676
  get showHeader$() { return this.#showHeader$_accessor_storage; }
4203
4677
  set showHeader$(value) { this.#showHeader$_accessor_storage = value; }
4204
4678
  #showHeader_accessor_storage = true;
4205
4679
  get showHeader() { return this.#showHeader_accessor_storage; }
4206
4680
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
4207
- visibleRowCount = new EventEmitter();
4208
4681
  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;
4682
+ #scrollMode$_accessor_storage = proxify((ValueModel));
4683
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
4684
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
4685
+ #scrollMode_accessor_storage = "none";
4686
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
4687
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4688
+ scrollViewport;
4215
4689
  columns$;
4216
4690
  columnIds$;
4217
4691
  columnsById$;
4218
- _visibleRowCount$;
4219
4692
  // TODO: support user defined header and row heights via css vars.
4220
- headerHeight$ = new MutableValueModel(29);
4221
- rowHeight$ = new MutableValueModel(40);
4693
+ headerHeight$ = new MutableValueModel(48);
4694
+ rowHeight$ = new MutableValueModel(44);
4222
4695
  baseCssClass = "aup-table-component";
4223
- constructor(elementRef, ngZone) {
4224
- super(elementRef, ngZone);
4225
- const { chain, when } = Dsl.disposeWith(this);
4696
+ virtualScrollDataSource = new TableVirtualScrollDataSource();
4697
+ virtualScrollActive$ = new MutableValueModel(false);
4698
+ scrollTimeout;
4699
+ constructor(bufferMultiplier = 1) {
4700
+ super();
4701
+ this.bufferMultiplier = bufferMultiplier;
4702
+ const { chain, when, observe } = Dsl.disposeWith(this);
4226
4703
  const actualHeaderHeight$ = chain(this.showHeader$).map(show => {
4227
4704
  return show ? this.headerHeight$.value : 0;
4228
4705
  }, { 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" });
4706
+ // performance is terrible if the data changes while we're scrolling, so we postpone updates until
4707
+ // scrolling stops.
4708
+ const delayedDatea$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
4709
+ when(delayedDatea$).changes(delatedData => {
4710
+ this.virtualScrollDataSource.data = delatedData;
4711
+ this.scheduleTableHeightCheck();
4712
+ }, { initialValue: "evaluate" });
4240
4713
  this.onInit(() => {
4241
- this.columns$ = chain(this.tableModel.columns);
4714
+ this.columns$ = chain(this.tableModel.visibleColumns$);
4242
4715
  this.columnIds$ = chain(this.columns$).pluck("columnId");
4243
4716
  this.columnsById$ = chain(this.columns$).indexBy('columnId');
4244
4717
  });
4718
+ // const txo = new TransactionObserver({verbose: false}).onEvent(e => console.log(e.name, e.payload));
4719
+ // txo.observe('this.virtualScrollRowRange$', this.virtualScrollRowRange$);
4720
+ // txo.observe('this.virtualScrollSpacerSize$', this.virtualScrollSpacerSize$);
4721
+ // txo.observe('this.virtualRows$', this.virtualRows$);
4722
+ // txo.observe('this.tableBodyHeight$', this.tableBodyHeight$);
4723
+ // txo.observe('this.virtualScrollActive$', this.virtualScrollActive$);
4724
+ }
4725
+ ngAfterViewInit() {
4726
+ super.ngAfterViewInit();
4727
+ if (this.scrollViewport) {
4728
+ const { observe } = Dsl.disposeWith(this);
4729
+ this.scrollViewport.elementScrolled().subscribe(() => this.notifyScrolled());
4730
+ }
4245
4731
  }
4246
4732
  get hideHeader() {
4247
4733
  return !this.showHeader;
4248
4734
  }
4735
+ get headerHeightCssVar() {
4736
+ return `${this.headerHeight$.value}px`;
4737
+ }
4738
+ get rowHeightCssVar() {
4739
+ return `${this.rowHeight$.value}px`;
4740
+ }
4249
4741
  isEditing(row) {
4250
4742
  return !!this.tableModel.getEditSessionFor(row);
4251
4743
  }
@@ -4270,51 +4762,110 @@ class TableBodyComponent extends ResizeAwareComponent {
4270
4762
  }
4271
4763
  return classes;
4272
4764
  }
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"] }] });
4765
+ scheduleTableHeightCheck(waitMillis = 50) {
4766
+ setTimeout(() => {
4767
+ const tbody = this.elementRef.nativeElement.querySelector("tbody");
4768
+ const bodyHeight = tbody.offsetHeight;
4769
+ if (this.data$.length > 0 && bodyHeight < this.rowHeight$.value) {
4770
+ // Hacks to get our virtual scroll to repaint
4771
+ // Logger.get(this).log(`rowCount=${this.data$.length}, bodyHeight=${bodyHeight} -> virtual table not rendering, triggering resize to force repaint`)
4772
+ window.dispatchEvent(new Event('resize'));
4773
+ if (waitMillis < 500) {
4774
+ this.scheduleTableHeightCheck(waitMillis + 50);
4775
+ }
4776
+ }
4777
+ }, waitMillis);
4778
+ }
4779
+ notifyScrolled() {
4780
+ this.virtualScrollActive$.value = true;
4781
+ this.clearScrollTimeout();
4782
+ this.scrollTimeout = setTimeout(() => {
4783
+ return this.virtualScrollActive$.value = false;
4784
+ }, 200);
4785
+ }
4786
+ clearScrollTimeout() {
4787
+ if (this.scrollTimeout) {
4788
+ clearTimeout(this.scrollTimeout);
4789
+ }
4790
+ }
4791
+ initialiseFooter($event) {
4792
+ const portalRef = $event;
4793
+ this.footerRow.onInit(portalRef.instance);
4794
+ }
4795
+ Proxify = Proxify;
4796
+ 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 });
4797
+ 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
4798
  }
4276
4799
  __decorate([
4277
4800
  Proxify(),
4278
- __metadata("design:type", Object)
4801
+ __metadata("design:type", ListModel)
4279
4802
  ], TableBodyComponent.prototype, "data$", null);
4280
4803
  __decorate([
4281
4804
  Proxify(),
4282
- __metadata("design:type", Object)
4805
+ __metadata("design:type", AbstractTableModel)
4283
4806
  ], TableBodyComponent.prototype, "tableModel", null);
4284
4807
  __decorate([
4285
4808
  Proxify(),
4286
- __metadata("design:type", Object)
4809
+ __metadata("design:type", FooterRowModel.Impl)
4810
+ ], TableBodyComponent.prototype, "footerRow", null);
4811
+ __decorate([
4812
+ Proxify(),
4813
+ __metadata("design:type", ValueModel)
4287
4814
  ], TableBodyComponent.prototype, "showHeader$", null);
4288
4815
  __decorate([
4289
4816
  StoreInValueModel(),
4290
4817
  __metadata("design:type", Object)
4291
4818
  ], TableBodyComponent.prototype, "showHeader", null);
4819
+ __decorate([
4820
+ Proxify(),
4821
+ __metadata("design:type", ValueModel)
4822
+ ], TableBodyComponent.prototype, "scrollMode$", null);
4823
+ __decorate([
4824
+ StoreInValueModel(),
4825
+ __metadata("design:type", String)
4826
+ ], TableBodyComponent.prototype, "scrollMode", null);
4292
4827
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, decorators: [{
4293
4828
  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$: [{
4829
+ 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"] }]
4830
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
4831
+ type: Inject,
4832
+ args: [AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER]
4833
+ }, {
4834
+ type: Optional
4835
+ }] }]; }, propDecorators: { data$: [{
4296
4836
  type: Input
4297
4837
  }], tableModel: [{
4298
4838
  type: Input
4839
+ }], footerRow: [{
4840
+ type: Input
4299
4841
  }], showHeader$: [{
4300
4842
  type: Input
4301
4843
  }], showHeader: [{
4302
4844
  type: Input
4303
- }], visibleRowCount: [{
4304
- type: Output
4305
4845
  }], trackBy: [{
4306
4846
  type: Input
4307
- }], enableScrolling: [{
4847
+ }], scrollMode$: [{
4848
+ type: Input
4849
+ }], scrollMode: [{
4308
4850
  type: Input
4309
4851
  }, {
4310
4852
  type: HostBinding,
4311
- args: ["class.enable-scrolling"]
4853
+ args: ["attr.scrollMode"]
4854
+ }], scrollViewport: [{
4855
+ type: ViewChild,
4856
+ args: [CdkVirtualScrollViewport]
4312
4857
  }], baseCssClass: [{
4313
4858
  type: HostBinding,
4314
4859
  args: ["class"]
4315
4860
  }], hideHeader: [{
4316
4861
  type: HostBinding,
4317
4862
  args: ["class.hide-header"]
4863
+ }], headerHeightCssVar: [{
4864
+ type: HostBinding,
4865
+ args: ["style.--aup-table-header-height"]
4866
+ }], rowHeightCssVar: [{
4867
+ type: HostBinding,
4868
+ args: ["style.--aup-table-row-height"]
4318
4869
  }] } });
4319
4870
 
4320
4871
  class TableMoreMenuPopupComponent extends DisposableComponent {
@@ -4435,8 +4986,10 @@ class TableFilterModel extends GarbageCollector {
4435
4986
  this.useSearchText(options.searchText$);
4436
4987
  this.useRowPredicate(options.predicate$);
4437
4988
  const { chain } = Dsl.disposeWith(this);
4438
- const textSearchRegex$ = chain(this._searchText$).map(text => {
4439
- return isEmpty$1(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4989
+ const textSearchRegex$ = chain(this._searchText$)
4990
+ .debounce(250)
4991
+ .map(text => {
4992
+ return isEmpty(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4440
4993
  }, { allowNil: true });
4441
4994
  this._rowPredicate = chain(this._rowPredicate$)
4442
4995
  .map(predicate => {
@@ -4644,31 +5197,30 @@ class TableComponent extends AbstractTableComponent {
4644
5197
  #filterModel_accessor_storage = proxify((TableFilterModel));
4645
5198
  get filterModel() { return this.#filterModel_accessor_storage; }
4646
5199
  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
- // }
5200
+ tableBody;
5201
+ #scrollMode$_accessor_storage = proxify((ValueModel));
5202
+ /**
5203
+ * 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
5204
+ * renders all rows but allows row heights to grow.
5205
+ */
5206
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
5207
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
5208
+ #scrollMode_accessor_storage;
5209
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
5210
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4660
5211
  _footerContentAdded = false;
4661
5212
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
4662
- _pageSize = new MutableValueModel();
4663
- pagedListModel;
5213
+ tableBodyScrollMode$;
4664
5214
  constructor(injector) {
4665
5215
  super(injector);
4666
- const { when } = Dsl.disposeWith(this);
4667
- this.onDispose(() => this.disposeOfPagedListModel());
4668
- when(this.enablePaging$).changes(enabled => this.configurePaging(enabled));
5216
+ const { chain, when } = Dsl.disposeWith(this);
5217
+ this.tableBodyScrollMode$ = chain(this.enableScrolling$).map(enable => {
5218
+ return enable ? (this.scrollMode$.value ?? "virtual") : 'none';
5219
+ }, { dependsOn: this.scrollMode$ });
4669
5220
  }
4670
5221
  ngOnInit() {
4671
5222
  super.ngOnInit();
5223
+ const { when } = Dsl.disposeWith(this);
4672
5224
  if (CanProxy.hasTarget(this.filterModel)) {
4673
5225
  this.registerDisposable(this.filterModel.bindToTable(this._dataSource$, this.getModel().textSearchPredicate$));
4674
5226
  this.highlightText$.setDelegate(this.filterModel.highlightText$);
@@ -4677,50 +5229,27 @@ class TableComponent extends AbstractTableComponent {
4677
5229
  else {
4678
5230
  this._filteredRows$.setDelegate(this._dataSource$);
4679
5231
  }
4680
- this.configurePaging(this.enablePaging$.value);
5232
+ this._visibleRows$.setDelegate(this._filteredRows$);
5233
+ // let users of the model know what the current visible and filtered rows are for selection models and what not
4681
5234
  this.tableModel.bindToTable(this._filteredRows$, this._visibleRows$);
5235
+ when.anyOf(...this.tableModel.viewStateDependencies).changes(() => this.cdr.markForCheck());
5236
+ this.viewStateDependsOn(this._filteredRows$, this.tableModel.visibleColumns$);
4682
5237
  }
4683
5238
  getModel() {
4684
5239
  return this.tableModel;
4685
5240
  }
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
5241
  footerContentChanged($event) {
4709
5242
  // console.log($event);
4710
5243
  this._footerContentAdded = true;
4711
5244
  }
4712
- //@Trace()
4713
- updatePageSize(count) {
4714
- this._pageSize.value = count;
4715
- }
4716
5245
  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: [
5246
+ 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
5247
  { 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"] }] });
5248
+ ], 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
5249
  }
4721
5250
  __decorate([
4722
5251
  Proxify(),
4723
- __metadata("design:type", Object)
5252
+ __metadata("design:type", TableModel)
4724
5253
  ], TableComponent.prototype, "tableModel", null);
4725
5254
  __decorate([
4726
5255
  Proxify(),
@@ -4728,24 +5257,27 @@ __decorate([
4728
5257
  ], TableComponent.prototype, "filterModel", null);
4729
5258
  __decorate([
4730
5259
  Proxify(),
4731
- __metadata("design:type", Object)
4732
- ], TableComponent.prototype, "enablePaging$", null);
5260
+ __metadata("design:type", ValueModel)
5261
+ ], TableComponent.prototype, "scrollMode$", null);
4733
5262
  __decorate([
4734
5263
  StoreInValueModel(),
4735
5264
  __metadata("design:type", Object)
4736
- ], TableComponent.prototype, "enablePaging", null);
5265
+ ], TableComponent.prototype, "scrollMode", null);
4737
5266
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableComponent, decorators: [{
4738
5267
  type: Component,
4739
5268
  args: [{ selector: 'aup-table', providers: [
4740
5269
  { 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"] }]
5270
+ ], 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
5271
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { tableModel: [{
4743
5272
  type: Input
4744
5273
  }], filterModel: [{
4745
5274
  type: Input
4746
- }], enablePaging$: [{
5275
+ }], tableBody: [{
5276
+ type: ViewChild,
5277
+ args: [TableBodyComponent]
5278
+ }], scrollMode$: [{
4747
5279
  type: Input
4748
- }], enablePaging: [{
5280
+ }], scrollMode: [{
4749
5281
  type: Input
4750
5282
  }] } });
4751
5283
 
@@ -4927,7 +5459,7 @@ var DecoratedTreeNode;
4927
5459
  }
4928
5460
  }
4929
5461
  __decorate([
4930
- Memoize(),
5462
+ MemoizeGet(),
4931
5463
  __metadata("design:type", Array),
4932
5464
  __metadata("design:paramtypes", [])
4933
5465
  ], Decorator.prototype, "children", null);
@@ -4980,7 +5512,7 @@ var DecoratedTreeNode;
4980
5512
  __metadata("design:returntype", Array)
4981
5513
  ], Decorator.prototype, "ancestors", null);
4982
5514
  __decorate([
4983
- Memoize(),
5515
+ MemoizeGet(),
4984
5516
  __metadata("design:type", Number),
4985
5517
  __metadata("design:paramtypes", [])
4986
5518
  ], Decorator.prototype, "depth", null);
@@ -4991,8 +5523,8 @@ class TreeLabelColumnModel extends ColumnModel {
4991
5523
  expansionModel;
4992
5524
  labelFactory = () => undefined;
4993
5525
  iconFactory;
4994
- constructor(columnId, textPropertiesProvider, expansionModel) {
4995
- super(columnId, textPropertiesProvider);
5526
+ constructor(columnId, order, textPropertiesProvider, expansionModel) {
5527
+ super(columnId, order, textPropertiesProvider);
4996
5528
  this.expansionModel = expansionModel;
4997
5529
  this.cellRenderer(TreeLabelCellRendererComponent);
4998
5530
  }
@@ -5051,7 +5583,7 @@ class TreeTableModel extends AbstractTableModel {
5051
5583
  get isExpandedPredicate$() {
5052
5584
  return this._isExpandedPredicate$.readonly$;
5053
5585
  }
5054
- bindToTable(expansionModel, filteredRows$, visibleRows$) {
5586
+ bindToTable(expansionModel, filteredRows$, visibleRows$, cdr) {
5055
5587
  this.treeExpansionModel = expansionModel;
5056
5588
  // TODO: Move all the expansion model stuff out of here and have things use the expansion model directly
5057
5589
  this._isExpandedPredicate$.setDelegate(this.treeExpansionModel.isExpandedPredicate$);
@@ -5060,7 +5592,7 @@ class TreeTableModel extends AbstractTableModel {
5060
5592
  }
5061
5593
  treeControlColumn(builder) {
5062
5594
  const columnId = 'tree-label';
5063
- const column = new TreeLabelColumnModel(columnId, () => this.getColumnTextProperties(columnId), this);
5595
+ const column = new TreeLabelColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this);
5064
5596
  builder(column);
5065
5597
  this.addColumn(column);
5066
5598
  }
@@ -5386,11 +5918,15 @@ class TreeTableComponent extends AbstractTableComponent {
5386
5918
  #expansionModel_accessor_storage = proxify((TreeExpansionModel));
5387
5919
  get expansionModel() { return this.#expansionModel_accessor_storage; }
5388
5920
  set expansionModel(value) { this.#expansionModel_accessor_storage = value; }
5921
+ scrollMode$;
5389
5922
  constructor(injector) {
5390
5923
  super(injector);
5924
+ const { chain } = Dsl.disposeWith(this);
5925
+ this.scrollMode$ = chain(this.enableScrolling$).map(enabled => enabled ? "classic" : "none");
5391
5926
  }
5392
5927
  ngOnInit() {
5393
5928
  super.ngOnInit();
5929
+ const { when } = Dsl.disposeWith(this);
5394
5930
  // TODO: clean up all this tightly coupled shit, should the expansion model really be separate from the tree model?
5395
5931
  if (!this.expansionModel) {
5396
5932
  this.expansionModel = new TreeExpansionModel({ disposedWith: this });
@@ -5399,7 +5935,10 @@ class TreeTableComponent extends AbstractTableComponent {
5399
5935
  const visibleRows$ = new FlattenedTreeListModel(this._dataSource$, row => this.treeTableModel.childExtractor(row), this.expansionModel);
5400
5936
  this._visibleRows$.setDelegate(visibleRows$);
5401
5937
  this.expansionModel.bindToTable(this._dataSource$, visibleRows$);
5402
- this.treeTableModel.bindToTable(this.expansionModel, visibleRows$, this._visibleRows$);
5938
+ this.treeTableModel.bindToTable(this.expansionModel, visibleRows$, this._visibleRows$, this.cdr);
5939
+ this.viewStateDependsOn(this.treeTableModel.visibleRows$);
5940
+ this.viewStateDependsOn(this.treeTableModel.visibleRows$);
5941
+ when.anyOf(...this.treeTableModel.viewStateDependencies).changes(() => this.cdr.markForCheck());
5403
5942
  }
5404
5943
  getModel() {
5405
5944
  return this.treeTableModel;
@@ -5407,7 +5946,7 @@ class TreeTableComponent extends AbstractTableComponent {
5407
5946
  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
5947
  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
5948
  { 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"] }] });
5949
+ ], 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
5950
  }
5412
5951
  __decorate([
5413
5952
  Proxify(),
@@ -5421,7 +5960,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5421
5960
  type: Component,
5422
5961
  args: [{ selector: 'aup-tree-table', providers: [
5423
5962
  { 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"] }]
5963
+ ], 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
5964
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { treeTableModel: [{
5426
5965
  type: Input
5427
5966
  }], expansionModel: [{
@@ -5603,6 +6142,7 @@ class ComponentsModule {
5603
6142
  FocusableComponent,
5604
6143
  CardContainerComponent,
5605
6144
  TableComponent,
6145
+ TableRowAttributesDirective,
5606
6146
  EditRowControlsComponent,
5607
6147
  ColumnTemplateDirective,
5608
6148
  DefaultCellRendererComponent,
@@ -5636,7 +6176,9 @@ class ComponentsModule {
5636
6176
  MarkdownComponent,
5637
6177
  TableBodyComponent,
5638
6178
  TableMoreMenuComponent,
5639
- TableMoreMenuPopupComponent], imports: [CommonModule,
6179
+ TableMoreMenuPopupComponent,
6180
+ SearchInputComponent,
6181
+ TableFooterRow], imports: [CommonModule,
5640
6182
  BrowserAnimationsModule,
5641
6183
  FormsModule,
5642
6184
  MatInputModule,
@@ -5655,7 +6197,10 @@ class ComponentsModule {
5655
6197
  MatMenuModule,
5656
6198
  MatDividerModule,
5657
6199
  MatProgressSpinnerModule,
5658
- MatProgressBarModule], exports: [NumberInputComponent,
6200
+ MatProgressBarModule,
6201
+ ScrollingModule,
6202
+ TableVirtualScrollModule], exports: [TableFooterRow,
6203
+ NumberInputComponent,
5659
6204
  StringInputComponent,
5660
6205
  TextInputComponent,
5661
6206
  PasswordInputComponent,
@@ -5693,7 +6238,8 @@ class ComponentsModule {
5693
6238
  LoadingContainerComponent,
5694
6239
  MarkdownComponent,
5695
6240
  TableMoreMenuComponent,
5696
- TableMoreMenuPopupComponent] });
6241
+ TableMoreMenuPopupComponent,
6242
+ SearchInputComponent] });
5697
6243
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, providers: [
5698
6244
  FocusBindingFactory,
5699
6245
  MarkdownService
@@ -5716,7 +6262,9 @@ class ComponentsModule {
5716
6262
  MatMenuModule,
5717
6263
  MatDividerModule,
5718
6264
  MatProgressSpinnerModule,
5719
- MatProgressBarModule] });
6265
+ MatProgressBarModule,
6266
+ ScrollingModule,
6267
+ TableVirtualScrollModule] });
5720
6268
  }
5721
6269
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, decorators: [{
5722
6270
  type: NgModule,
@@ -5741,7 +6289,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5741
6289
  MatMenuModule,
5742
6290
  MatDividerModule,
5743
6291
  MatProgressSpinnerModule,
5744
- MatProgressBarModule
6292
+ MatProgressBarModule,
6293
+ ScrollingModule,
6294
+ TableVirtualScrollModule
5745
6295
  ],
5746
6296
  declarations: [
5747
6297
  AbstractInputComponent,
@@ -5765,6 +6315,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5765
6315
  FocusableComponent,
5766
6316
  CardContainerComponent,
5767
6317
  TableComponent,
6318
+ TableRowAttributesDirective,
5768
6319
  EditRowControlsComponent,
5769
6320
  ColumnTemplateDirective,
5770
6321
  DefaultCellRendererComponent,
@@ -5799,8 +6350,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5799
6350
  TableBodyComponent,
5800
6351
  TableMoreMenuComponent,
5801
6352
  TableMoreMenuPopupComponent,
6353
+ SearchInputComponent,
6354
+ TableFooterRow
5802
6355
  ],
5803
6356
  exports: [
6357
+ TableFooterRow,
5804
6358
  NumberInputComponent,
5805
6359
  StringInputComponent,
5806
6360
  TextInputComponent,
@@ -5840,6 +6394,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5840
6394
  MarkdownComponent,
5841
6395
  TableMoreMenuComponent,
5842
6396
  TableMoreMenuPopupComponent,
6397
+ SearchInputComponent
5843
6398
  ],
5844
6399
  providers: [
5845
6400
  FocusBindingFactory,
@@ -5848,6 +6403,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5848
6403
  }]
5849
6404
  }] });
5850
6405
 
6406
+ class LoadableComponent extends DisposableComponent {
6407
+ #_loaded$ = new MutableValueModel();
6408
+ #asyncLoadables = [];
6409
+ #awaitedLoadables = [];
6410
+ get loaded$() {
6411
+ return this.#_loaded$.readonly$;
6412
+ }
6413
+ ngOnInit() {
6414
+ super.ngOnInit();
6415
+ this.#asyncLoadables.forEach(it => it.ensureLoaded());
6416
+ if (this.#awaitedLoadables.length > 0) {
6417
+ Promise.all(this.#awaitedLoadables.map(it => {
6418
+ return it.ensureLoaded(); //.then(() => console.log(`${it.constructor.name} loaded`));
6419
+ })).then(() => {
6420
+ this.#_loaded$.value = true;
6421
+ });
6422
+ }
6423
+ else {
6424
+ this.#_loaded$.value = true;
6425
+ }
6426
+ }
6427
+ injectLoadable(token, options) {
6428
+ return this.registerLoadable(inject(token, options), options);
6429
+ }
6430
+ registerLoadable(loadable, options) {
6431
+ if (this.loaded$.value) {
6432
+ loadable.ensureLoaded();
6433
+ }
6434
+ else {
6435
+ if (!options || options.wait === true) {
6436
+ this.#awaitedLoadables.push(loadable);
6437
+ }
6438
+ else {
6439
+ this.#asyncLoadables.push(loadable);
6440
+ }
6441
+ }
6442
+ return loadable;
6443
+ }
6444
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
6445
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: LoadableComponent, usesInheritance: true, ngImport: i0 });
6446
+ }
6447
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, decorators: [{
6448
+ type: Directive
6449
+ }] });
6450
+
6451
+ class TextSearchContext {
6452
+ row;
6453
+ searchText;
6454
+ searchRegex;
6455
+ constructor(row, searchText, searchRegex) {
6456
+ this.row = row;
6457
+ this.searchText = searchText;
6458
+ this.searchRegex = searchRegex;
6459
+ }
6460
+ getOrCreate(type, create) {
6461
+ }
6462
+ matchesText(text) {
6463
+ return this.searchRegex.test(text);
6464
+ }
6465
+ }
6466
+
6467
+ class AbstractCellRenderer extends LoadableComponent {
6468
+ constructor() {
6469
+ super();
6470
+ }
6471
+ }
6472
+
5851
6473
  /**
5852
6474
  * @file Automatically generated by barrelsby.
5853
6475
  */
@@ -5874,7 +6496,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5874
6496
  * </aup-activity-actions>
5875
6497
  */
5876
6498
  class ActivityActionsComponent extends DisposableComponent {
5877
- cdr;
5878
6499
  confirmCommandComponent;
5879
6500
  cancelCommandComponent;
5880
6501
  #confirmCommand_accessor_storage = proxify((Command));
@@ -5903,9 +6524,9 @@ class ActivityActionsComponent extends DisposableComponent {
5903
6524
  }
5904
6525
  layout = ActivityActionsComponent.Layout.BLOCK;
5905
6526
  align = ActivityActionsComponent.Align.STRETCH;
5906
- constructor(cdr) {
6527
+ alignContent = ActivityActionsComponent.AlignContent.CENTER;
6528
+ constructor() {
5907
6529
  super();
5908
- this.cdr = cdr;
5909
6530
  }
5910
6531
  hasConfirmFace() {
5911
6532
  return !!this.confirmFace;
@@ -5924,8 +6545,8 @@ class ActivityActionsComponent extends DisposableComponent {
5924
6545
  focusCancel() {
5925
6546
  this.cancelCommandComponent.requestFocus();
5926
6547
  }
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"] }] });
6548
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6549
+ 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
6550
  }
5930
6551
  __decorate([
5931
6552
  Proxify(),
@@ -5937,8 +6558,8 @@ __decorate([
5937
6558
  ], ActivityActionsComponent.prototype, "cancelCommand", null);
5938
6559
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, decorators: [{
5939
6560
  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: [{
6561
+ 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"] }]
6562
+ }], ctorParameters: function () { return []; }, propDecorators: { confirmCommandComponent: [{
5942
6563
  type: ViewChild,
5943
6564
  args: ["confirmCommandComponent"]
5944
6565
  }], cancelCommandComponent: [{
@@ -5966,6 +6587,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5966
6587
  }, {
5967
6588
  type: HostBinding,
5968
6589
  args: ['attr.align']
6590
+ }], alignContent: [{
6591
+ type: Input
6592
+ }, {
6593
+ type: HostBinding,
6594
+ args: ['attr.align-content']
5969
6595
  }] } });
5970
6596
  (function (ActivityActionsComponent) {
5971
6597
  ActivityActionsComponent.Layout = Enum({
@@ -5974,14 +6600,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5974
6600
  });
5975
6601
  ActivityActionsComponent.Align = Enum({
5976
6602
  START: 'start',
5977
- END: 'end',
5978
- STRETCH: 'stretch'
6603
+ STRETCH: 'stretch',
6604
+ END: 'end'
6605
+ });
6606
+ ActivityActionsComponent.AlignContent = Enum({
6607
+ START: 'start',
6608
+ CENTER: 'center',
6609
+ END: 'end'
5979
6610
  });
5980
6611
  })(ActivityActionsComponent || (ActivityActionsComponent = {}));
5981
6612
 
5982
6613
  const ACTIVITY_DATA = new InjectionToken("InteractionActivityData");
5983
6614
  // eslint-disable-next-line @angular-eslint/component-class-suffix
5984
- class Activity extends DisposableComponent {
6615
+ class Activity extends LoadableComponent {
5985
6616
  activityData = inject(ACTIVITY_DATA);
5986
6617
  activityReadyListeners = new EventListenerList();
5987
6618
  _busy$ = this.registerDisposable(new DelegatingValueModel().withDefault(false));
@@ -6036,7 +6667,6 @@ class Activity extends DisposableComponent {
6036
6667
  notifyActivityReady() {
6037
6668
  this.activityReadyListeners.fire(l => l(this));
6038
6669
  this._ready$.value = true;
6039
- console.log("ready");
6040
6670
  }
6041
6671
  onActivityReady(callback) {
6042
6672
  return this.activityReadyListeners.add(callback);
@@ -6156,7 +6786,7 @@ class AbstractDialogComponent extends Activity {
6156
6786
  }
6157
6787
  }
6158
6788
  isDestructive() {
6159
- return isFunction$1(this.config['destructive']) && this.config["destructive"]();
6789
+ return isFunction(this.config['destructive']) && this.config["destructive"]();
6160
6790
  }
6161
6791
  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
6792
  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 +6803,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6173
6803
 
6174
6804
  class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6175
6805
  cancelFace;
6806
+ confirmClass = "aup-confirm-activity";
6176
6807
  constructor(config) {
6177
6808
  super(config);
6178
6809
  this.cancelFace = {
@@ -6183,7 +6814,7 @@ class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6183
6814
  });
6184
6815
  }
6185
6816
  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 });
6817
+ 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
6818
  }
6188
6819
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractConfirmDialogComponent, decorators: [{
6189
6820
  type: Component,
@@ -6193,7 +6824,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6193
6824
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
6194
6825
  type: Inject,
6195
6826
  args: [ALERT_CONFIG]
6196
- }] }]; } });
6827
+ }] }]; }, propDecorators: { confirmClass: [{
6828
+ type: HostBinding,
6829
+ args: ["class"]
6830
+ }] } });
6197
6831
 
6198
6832
  class ActivityBodyComponent extends DisposableComponent {
6199
6833
  fullWidth = false;
@@ -6732,7 +7366,7 @@ const ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');
6732
7366
  // return true;
6733
7367
  // }
6734
7368
  // }
6735
- class PlaceComponent extends DisposableComponent {
7369
+ class PlaceComponent extends LoadableComponent {
6736
7370
  _placeReadyCallbacks = [];
6737
7371
  visitModel = new MutableValueModel();
6738
7372
  _inVisitUpdate = new Guard();
@@ -6789,6 +7423,7 @@ class PlaceComponent extends DisposableComponent {
6789
7423
  */
6790
7424
  installAndInitialiseBinding(initialVisit, parameterDef) {
6791
7425
  const model = this[parameterDef.propertyName];
7426
+ assert.notNil(model);
6792
7427
  DebugContext.tag(model, `${this.placeDefinition.component.name}.${parameterDef.propertyName}`);
6793
7428
  const binding = this.registerDisposable(new Binding(this.visitModel, model, {
6794
7429
  toRight(visit) {
@@ -6873,7 +7508,7 @@ class PlaceComponent extends DisposableComponent {
6873
7508
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: PlaceComponent, usesInheritance: true, ngImport: i0 });
6874
7509
  }
6875
7510
  __decorate([
6876
- Memoize(),
7511
+ MemoizeGet(),
6877
7512
  __metadata("design:type", PlaceDefinition),
6878
7513
  __metadata("design:paramtypes", [])
6879
7514
  ], PlaceComponent.prototype, "placeDefinition", null);
@@ -7063,7 +7698,7 @@ class Visit {
7063
7698
  getRouterCommands() {
7064
7699
  return this.segments.reduce((result, v) => {
7065
7700
  const path = v.placeDefinition.path;
7066
- return isEmpty$1(path) ?
7701
+ return isEmpty(path) ?
7067
7702
  [...result, path] : // Angular doesn't support route params on empty path segments
7068
7703
  [...result, path, ...v.createRouterCommands()];
7069
7704
  }, []);
@@ -7079,7 +7714,7 @@ class Visit {
7079
7714
  }
7080
7715
  }
7081
7716
  __decorate([
7082
- Memoize$1(),
7717
+ Memoize(),
7083
7718
  __metadata("design:type", Function),
7084
7719
  __metadata("design:paramtypes", [PlaceDefinition]),
7085
7720
  __metadata("design:returntype", VisitSegment)
@@ -7460,10 +8095,7 @@ class SynchroniseInteractionContextIdsWithRoute extends NavigationSession {
7460
8095
  return true;
7461
8096
  }
7462
8097
  notifyActive() {
7463
- // TODO: Do I still need this??
7464
- setTimeout(() => {
7465
- this.syncInteractionIdsWithRouter();
7466
- });
8098
+ this.syncInteractionIdsWithRouter();
7467
8099
  }
7468
8100
  // @Trace()
7469
8101
  onRouterEnd(event) {
@@ -8206,7 +8838,7 @@ class ConsolidatedParameterMap {
8206
8838
  }
8207
8839
  }
8208
8840
  __decorate([
8209
- Memoize(),
8841
+ MemoizeGet(),
8210
8842
  __metadata("design:type", Array),
8211
8843
  __metadata("design:paramtypes", [])
8212
8844
  ], ConsolidatedParameterMap.prototype, "keys", null);
@@ -8284,7 +8916,7 @@ class UrlSnapshot {
8284
8916
  return this.getPrimaryUrlSegments().find(s => s.path === placeDef.path);
8285
8917
  }
8286
8918
  isLastPlaceInUrl(placeDef) {
8287
- return last$1(this.getPrimaryUrlSegments()).path === placeDef.path;
8919
+ return last(this.getPrimaryUrlSegments()).path === placeDef.path;
8288
8920
  }
8289
8921
  createVisitSegmentFor(placeDef) {
8290
8922
  return new VisitSegment(placeDef, new ConsolidatedParameterMap(this.getPrimaryUrlSegments()));
@@ -8400,7 +9032,7 @@ class UrlService {
8400
9032
  back() {
8401
9033
  this.angularLocation.back();
8402
9034
  }
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 });
9035
+ 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
9036
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, providedIn: 'root' });
8405
9037
  }
8406
9038
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, decorators: [{
@@ -8408,7 +9040,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8408
9040
  args: [{
8409
9041
  providedIn: 'root'
8410
9042
  }]
8411
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: i1$4.UrlSerializer }]; } });
9043
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: i1$5.UrlSerializer }]; } });
8412
9044
 
8413
9045
  // function asArray<T>(item: T | T[]): T[] {
8414
9046
  // return Array.isArray(item) ? item : [item];
@@ -8428,6 +9060,8 @@ class PlaceRouter extends GarbageCollector {
8428
9060
  routerInteractionAdapter;
8429
9061
  sessionFinishedJobs = [];
8430
9062
  authService = new PlaceAuthService();
9063
+ _ready$ = this.registerDisposable(new DelegatingValueModel().withDefault(true));
9064
+ ready$ = this._ready$.readonly$;
8431
9065
  constructor(angularRouter, angularLocation, interactionService, urlService, placeHistory) {
8432
9066
  super();
8433
9067
  this.angularRouter = angularRouter;
@@ -8449,7 +9083,7 @@ class PlaceRouter extends GarbageCollector {
8449
9083
  });
8450
9084
  const { chain } = Dsl.disposeWith(this);
8451
9085
  this.navigationInProgress$ = chain(this.navigationSession$).isNotNil();
8452
- this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync");
9086
+ this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync").otherwise(false);
8453
9087
  const idleStateName = chain(this.interactionService.active).map(active => active ? "IdleDuringInteraction" : "Idle");
8454
9088
  this.navigationSessionName$ = chain(this.navigationSession$)
8455
9089
  .pluck("name")
@@ -8493,6 +9127,9 @@ class PlaceRouter extends GarbageCollector {
8493
9127
  // the back button was clicked.
8494
9128
  angularLocation.onUrlChange(url => this.onUrlChanged(url));
8495
9129
  }
9130
+ postponeRoutingUntil(condition$) {
9131
+ this._ready$.setDelegate(condition$);
9132
+ }
8496
9133
  getAuthenticationFailureRedirect(activatedRoute, state) {
8497
9134
  return this.authService.getAuthenticationFailureRedirect(activatedRoute, state);
8498
9135
  }
@@ -8508,23 +9145,20 @@ class PlaceRouter extends GarbageCollector {
8508
9145
  isNavigating() {
8509
9146
  return this.navigationInProgress$.value;
8510
9147
  }
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
- });
9148
+ async waitUntilRouterReady() {
9149
+ const { waitUntil } = Dsl.disposeWith(this);
9150
+ await waitUntil(this.ready$).becomesTruthy();
9151
+ return this;
9152
+ }
9153
+ async waitUntilIdle() {
9154
+ const { waitUntil } = Dsl.disposeWith(this);
9155
+ await waitUntil(this.navigationInProgress$).becomesFalsey();
9156
+ return this;
8519
9157
  }
8520
9158
  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
- });
9159
+ const { waitUntil } = Dsl.disposeWith(this);
9160
+ await waitUntil(this.interactionSyncInProgress$).becomesFalsey();
9161
+ return this;
8528
9162
  }
8529
9163
  // @Trace()
8530
9164
  onPopState(event) {
@@ -8710,7 +9344,7 @@ class PlaceRouter extends GarbageCollector {
8710
9344
  return Visit.goto(visitOrPlaceComponent, params);
8711
9345
  }
8712
9346
  }
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 });
9347
+ 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
9348
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, providedIn: "root" });
8715
9349
  }
8716
9350
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, decorators: [{
@@ -8718,7 +9352,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8718
9352
  args: [{
8719
9353
  providedIn: "root"
8720
9354
  }]
8721
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
9355
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
8722
9356
 
8723
9357
  class ActivityTitleComponent extends DisposableComponent {
8724
9358
  _color;
@@ -8740,11 +9374,11 @@ class ActivityTitleComponent extends DisposableComponent {
8740
9374
  return this._color;
8741
9375
  }
8742
9376
  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"] });
9377
+ 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
9378
  }
8745
9379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityTitleComponent, decorators: [{
8746
9380
  type: Component,
8747
- args: [{ selector: 'aup-activity-title', template: "<ng-content></ng-content>\n", styles: [":host{display:block}\n"] }]
9381
+ 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
9382
  }], propDecorators: { hasTransparentBackground: [{
8749
9383
  type: Input
8750
9384
  }, {
@@ -8765,7 +9399,7 @@ class AlertDialogComponent extends AbstractDialogComponent {
8765
9399
  });
8766
9400
  }
8767
9401
  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"] }] });
9402
+ 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
9403
  }
8770
9404
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AlertDialogComponent, decorators: [{
8771
9405
  type: Component,
@@ -8785,7 +9419,7 @@ class ConfirmThenDialogComponent extends AbstractConfirmDialogComponent {
8785
9419
  });
8786
9420
  }
8787
9421
  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"] }] });
9422
+ 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
9423
  }
8790
9424
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenDialogComponent, decorators: [{
8791
9425
  type: Component,
@@ -8809,7 +9443,7 @@ class ConfirmThenExecuteDialogComponent extends AbstractConfirmDialogComponent {
8809
9443
  });
8810
9444
  }
8811
9445
  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"] }] });
9446
+ 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
9447
  }
8814
9448
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenExecuteDialogComponent, decorators: [{
8815
9449
  type: Component,
@@ -8829,7 +9463,7 @@ class ConfirmationDialogComponent extends AbstractConfirmDialogComponent {
8829
9463
  });
8830
9464
  }
8831
9465
  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"] }] });
9466
+ 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
9467
  }
8834
9468
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmationDialogComponent, decorators: [{
8835
9469
  type: Component,
@@ -9009,6 +9643,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9009
9643
  tabs;
9010
9644
  activityOutlets;
9011
9645
  activityRefs = [];
9646
+ animationDuration = "500ms";
9012
9647
  _identifier;
9013
9648
  _deferredCleanUp;
9014
9649
  interactionServiceApi;
@@ -9021,6 +9656,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9021
9656
  busy = this.registerDisposable(new DelegatingValueModel().withDefault(false));
9022
9657
  syncTabsJob = undefined;
9023
9658
  stable$;
9659
+ wasActive = false;
9024
9660
  constructor(placeRouter) {
9025
9661
  super();
9026
9662
  this.placeRouter = placeRouter;
@@ -9057,7 +9693,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9057
9693
  * Returns true if an activity is currently running.
9058
9694
  */
9059
9695
  isActive() {
9060
- return this.getActiveActivityCount() > 0;
9696
+ const isActive = this.getActiveActivityCount() > 0;
9697
+ // if (this.wasActive !== isActive) {
9698
+ // console.log({was: this.wasActive, is: isActive});
9699
+ // }
9700
+ // this.wasActive = isActive
9701
+ return isActive;
9061
9702
  }
9062
9703
  registerDisposable(disposable) {
9063
9704
  return this.garbage.registerDisposable(disposable);
@@ -9140,7 +9781,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9140
9781
  // by activity index)
9141
9782
  setTimeout(() => {
9142
9783
  this.activityRefs = []; // we have to do it after the animation timeout or the activity disappears before the animatin finsihes
9143
- }, this.getTabAnimationDuration());
9784
+ }, this.getTabAnimationDurationInMillis());
9144
9785
  const promise = this.interactionServiceApi.notifyFinished(this);
9145
9786
  this._deferredCleanUp = promise
9146
9787
  .finally(() => {
@@ -9166,7 +9807,6 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9166
9807
  /**
9167
9808
  * Synchronises the selected tab index.
9168
9809
  */
9169
- // @Trace()
9170
9810
  synchroniseSelectedTabIndex() {
9171
9811
  assert.isTruthy(this.isActive());
9172
9812
  const previousIndex = this.tabs.selectedIndex;
@@ -9178,10 +9818,10 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9178
9818
  activityRef.setFocused(false);
9179
9819
  this.busy.setDelegate(activityRef.activityBusy);
9180
9820
  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
- }
9821
+ // if (this.ready$.value) {
9822
+ // // Note: We're not using the animation done event as it's firing almost immeadiately.
9823
+ // setTimeout(() => this.finaliseActivityStates(), animate ? this.getTabAnimationDurationInMillis() : 0);
9824
+ // }
9185
9825
  }
9186
9826
  }
9187
9827
  finaliseActivityStates() {
@@ -9195,7 +9835,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9195
9835
  return this.activityOutlets.toArray()[this.tabs.selectedIndex];
9196
9836
  }
9197
9837
  getTabAnimationDuration() {
9198
- const match = this.tabs.animationDuration.match(/(\d+)(.*)/);
9838
+ // const s = this._started$.value ? this.animationDuration : "0";
9839
+ // return s
9840
+ return this.animationDuration;
9841
+ }
9842
+ getTabAnimationDurationInMillis() {
9843
+ const match = this.animationDuration.match(/(\d+)(.*)/);
9199
9844
  const numericValue = parseFloat(match[1]);
9200
9845
  switch (match[2].trim()) {
9201
9846
  case "ms":
@@ -9221,12 +9866,16 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9221
9866
  }
9222
9867
  }, 75);
9223
9868
  }
9869
+ onAnimationDone() {
9870
+ this._started$.value = true;
9871
+ this.finaliseActivityStates();
9872
+ }
9224
9873
  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"] }] });
9874
+ 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
9875
  }
9227
9876
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityContainerComponent, decorators: [{
9228
9877
  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"] }]
9878
+ 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
9879
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { dynamicHeight: [{
9231
9880
  type: Input
9232
9881
  }], tabs: [{
@@ -9235,6 +9884,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9235
9884
  }], activityOutlets: [{
9236
9885
  type: ViewChildren,
9237
9886
  args: [ActivityOutletComponent]
9887
+ }], animationDuration: [{
9888
+ type: Input
9238
9889
  }] } });
9239
9890
 
9240
9891
  class AbstractActivityTriggerComponent extends DisposableComponent {
@@ -9335,14 +9986,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9335
9986
  args: ['class.active']
9336
9987
  }] } });
9337
9988
 
9338
- const cssDurationRegex = /(\d+)(m?s)/;
9989
+ const INTERACTION_CONTEXT = new InjectionToken('interactionContext');
9990
+
9991
+ const cssDurationRegex$1 = /(\d+)(m?s)/;
9339
9992
  /**
9340
9993
  * @example
9341
9994
  * <aup-in-place-interaction-context #inPlaceInteractionContext>
9342
9995
  * </aup-in-place-interaction-context>
9343
9996
  *
9344
9997
  * in your component
9345
- * @ViewChild('inPlaceInteractionContext', { static: true })
9998
+ * @ViewChild(InPlaceInteractionContextComponent)
9346
9999
  * interactionContext: InteractionContext;
9347
10000
  *
9348
10001
  *
@@ -9361,11 +10014,13 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9361
10014
  * active interactions.
9362
10015
  */
9363
10016
  syncWithRoutes = true;
10017
+ started = new EventEmitter();
10018
+ finished = new EventEmitter();
9364
10019
  get animationDuration() {
9365
10020
  return this.animateFirstActivity ? (this.tabConfig?.animationDuration || "500ms") : "0ms";
9366
10021
  }
9367
10022
  get animationDurationMillis() {
9368
- const result = cssDurationRegex.exec(this.animationDuration);
10023
+ const result = cssDurationRegex$1.exec(this.animationDuration);
9369
10024
  if (!result) {
9370
10025
  lang.illegalState(`unsupported css duration: ${this.animationDuration}`);
9371
10026
  }
@@ -9387,11 +10042,16 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9387
10042
  this.interactionService.registerInplaceInteractionContext(this);
9388
10043
  }
9389
10044
  else {
10045
+ const self = this;
9390
10046
  this.activityContainerComponent.initialise("dont-care", {
9391
10047
  async notifyActive(interactionContext) {
10048
+ self.started.emit();
9392
10049
  return undefined;
9393
10050
  },
9394
10051
  async notifyFinished(interactionContext) {
10052
+ // I've noticed some rendering fails when returning the the transcluded content we'll fire an event
10053
+ // so components can do stuff if they need to.
10054
+ self.started.emit();
9395
10055
  return undefined;
9396
10056
  }
9397
10057
  });
@@ -9438,11 +10098,15 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9438
10098
  }
9439
10099
  }
9440
10100
  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"] }] });
10101
+ 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: [
10102
+ { provide: INTERACTION_CONTEXT, useExisting: InPlaceInteractionContextComponent }
10103
+ ], 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
10104
  }
9443
10105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InPlaceInteractionContextComponent, decorators: [{
9444
10106
  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"] }]
10107
+ args: [{ selector: "aup-in-place-interaction-context", providers: [
10108
+ { provide: INTERACTION_CONTEXT, useExisting: InPlaceInteractionContextComponent }
10109
+ ], 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
10110
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
9447
10111
  type: Inject,
9448
10112
  args: [MAT_TABS_CONFIG]
@@ -9455,6 +10119,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9455
10119
  type: Input
9456
10120
  }], syncWithRoutes: [{
9457
10121
  type: Input
10122
+ }], started: [{
10123
+ type: Output
10124
+ }], finished: [{
10125
+ type: Output
9458
10126
  }], active: [{
9459
10127
  type: HostBinding,
9460
10128
  args: ["class.active"]
@@ -9469,7 +10137,7 @@ class InlineActivityTriggerComponent extends AbstractActivityTriggerComponent {
9469
10137
  super();
9470
10138
  }
9471
10139
  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"] }] });
10140
+ 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
10141
  }
9474
10142
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InlineActivityTriggerComponent, decorators: [{
9475
10143
  type: Component,
@@ -9593,7 +10261,7 @@ class PopupInteractionContextComponent extends DisposableComponent {
9593
10261
  isActive() {
9594
10262
  return this.interactionContext && this.interactionContext.isActive();
9595
10263
  }
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 });
10264
+ 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
10265
  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
10266
  }
9599
10267
  __decorate([
@@ -9607,7 +10275,7 @@ __decorate([
9607
10275
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PopupInteractionContextComponent, decorators: [{
9608
10276
  type: Component,
9609
10277
  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: [{
10278
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$6.Overlay }, { type: i1$6.CdkScrollable, decorators: [{
9611
10279
  type: Optional
9612
10280
  }, {
9613
10281
  type: SkipSelf
@@ -9692,7 +10360,7 @@ class AddCardActivityComponent extends AbstractActivityTriggerComponent {
9692
10360
  return this.interactionStyle === 'inline';
9693
10361
  }
9694
10362
  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"] }] });
10363
+ 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
10364
  }
9697
10365
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AddCardActivityComponent, decorators: [{
9698
10366
  type: Component,
@@ -9768,7 +10436,7 @@ class AddItemInteractionContextComponent extends DisposableComponent {
9768
10436
  return this.interactionContext.startActivity(activityType, data);
9769
10437
  }
9770
10438
  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"] }] });
10439
+ 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
10440
  }
9773
10441
  __decorate([
9774
10442
  Proxify(),
@@ -9907,12 +10575,14 @@ class StringInputActivity extends InputActivity {
9907
10575
  [label]="activityData.label"
9908
10576
  [placeholder]="activityData.placeholder"
9909
10577
  [command.enter]="confirmCommand"
9910
- [command.escape]="cancelCommand"></aup-string-input>
10578
+ [command.escape]="cancelCommand"
10579
+ [dense]="true"
10580
+ ></aup-string-input>
9911
10581
  <aup-activity-actions [layout]="layout" align="end"
9912
10582
  [confirmFace]="confirmFace"
9913
10583
  [cancelFace]="cancelFace"
9914
10584
  ></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"] }] });
10585
+ `, 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
10586
  }
9917
10587
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputActivity, decorators: [{
9918
10588
  type: Component,
@@ -9923,7 +10593,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9923
10593
  [label]="activityData.label"
9924
10594
  [placeholder]="activityData.placeholder"
9925
10595
  [command.enter]="confirmCommand"
9926
- [command.escape]="cancelCommand"></aup-string-input>
10596
+ [command.escape]="cancelCommand"
10597
+ [dense]="true"
10598
+ ></aup-string-input>
9927
10599
  <aup-activity-actions [layout]="layout" align="end"
9928
10600
  [confirmFace]="confirmFace"
9929
10601
  [cancelFace]="cancelFace"
@@ -10106,7 +10778,7 @@ class InlineStringEditorComponent extends DisposableComponent {
10106
10778
  return !this.editingEnabled$.value;
10107
10779
  }
10108
10780
  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"] }] });
10781
+ 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
10782
  }
10111
10783
  __decorate([
10112
10784
  Proxify(),
@@ -10189,6 +10861,7 @@ class SelectInputActivity extends InputActivity {
10189
10861
  [options]="options"
10190
10862
  [optionLabelFormat]="optionLabelFormat"
10191
10863
  [allowNil]="activityData.allowNil"
10864
+ [dense]="true"
10192
10865
  >
10193
10866
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10194
10867
  </aup-select-input>
@@ -10196,7 +10869,7 @@ class SelectInputActivity extends InputActivity {
10196
10869
  [confirmFace]="confirmFace"
10197
10870
  [cancelFace]="cancelFace"
10198
10871
  ></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"] }] });
10872
+ `, 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
10873
  }
10201
10874
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputActivity, decorators: [{
10202
10875
  type: Component,
@@ -10211,6 +10884,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10211
10884
  [options]="options"
10212
10885
  [optionLabelFormat]="optionLabelFormat"
10213
10886
  [allowNil]="activityData.allowNil"
10887
+ [dense]="true"
10214
10888
  >
10215
10889
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10216
10890
  </aup-select-input>
@@ -10222,6 +10896,186 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10222
10896
  }]
10223
10897
  }] });
10224
10898
 
10899
+ const slideDownOnEnterDef = style({
10900
+ opacity: 0,
10901
+ 'height': '0',
10902
+ 'max-height': '0',
10903
+ paddingTop: '0',
10904
+ paddingBottom: '0'
10905
+ });
10906
+ // TODO: params aren't getting customised in the view. Need to figure out the correct approach.
10907
+ const slideDownOnEnterAnimation = trigger('slideDownOnEnter', [
10908
+ transition(':enter', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10909
+ transition(':leave', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10910
+ ]);
10911
+ const slideDownWhenOpenAnimation = trigger('slideDownWhenOpen', [
10912
+ transition('closed => open', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10913
+ transition('open => closed', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10914
+ ]);
10915
+ const slideLeftOnEnterDef = style({
10916
+ opacity: 0,
10917
+ 'width': '0',
10918
+ paddingLeft: '0',
10919
+ paddingRight: '0'
10920
+ });
10921
+ const slideRightOnEnterAnimation = trigger('slideRightOnEnter', [
10922
+ transition(':enter', [slideLeftOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10923
+ transition(':leave', [animate('{{duration}}', slideLeftOnEnterDef)], { params: { duration: '100ms' } })
10924
+ ]);
10925
+ const ZERO_WIDTH = {
10926
+ opacity: 0,
10927
+ width: '0',
10928
+ paddingLeft: '0',
10929
+ paddingRight: '0',
10930
+ };
10931
+ const ZERO_HEIGHT = {
10932
+ opacity: 0,
10933
+ height: '0',
10934
+ paddingTop: '0',
10935
+ paddingBottom: '0',
10936
+ };
10937
+ const slideDownAndRightOnEnterAnimation = trigger('slideDownAndRightOnEnter', [
10938
+ transition(':enter', [
10939
+ style({ overflow: "hidden", whiteSpace: "nowrap", ...ZERO_WIDTH, ...ZERO_HEIGHT }),
10940
+ animate('{{duration}}')
10941
+ ], { params: { duration: '100ms' } }),
10942
+ transition(':leave', [
10943
+ style({ overflow: "hidden", whiteSpace: "nowrap" }),
10944
+ group([
10945
+ animate('{{duration}}', style(ZERO_HEIGHT)),
10946
+ // Hack: 100ms is too quick as it animates from * - 0 as we only see it animate the width is greater than the parent.
10947
+ // Not sure how to animate from * to natural new width of parent. This hack won't work for text that's just a little
10948
+ // bit wider than the parent as it'll fall within the parent bounds very early in the animation cycle.
10949
+ animate('300ms', style(ZERO_WIDTH)),
10950
+ ])
10951
+ ], { params: { duration: '100ms' } })
10952
+ ]);
10953
+
10954
+ const cssDurationRegex = /(\d+)(m?s)/;
10955
+ /**
10956
+ * This interaction context remains hidden (height: 0) until it is active.
10957
+ * @example
10958
+ * <aup-slide-down-interaction-context #inPlaceInteractionContext>
10959
+ * </aup-slide-down-interaction-context>
10960
+ *
10961
+ * in your component
10962
+ * @ViewChild(SlideDownInteractionContextComponent)
10963
+ * interactionContext: InteractionContext;
10964
+ *
10965
+ *
10966
+ */
10967
+ class SlideDownInteractionContextComponent extends DisposableComponent {
10968
+ tabConfig;
10969
+ activityContainerComponent;
10970
+ // NOTE: disabling this as I'm using the initialise callback to release the hacky height clamp.
10971
+ // The whole registration thing is a bit naf so I should really clean that up at some point.
10972
+ // /**
10973
+ // * If true the activity will sync with the router to enable back button support. This is a work around for
10974
+ // * deeply nested activities that can't be linked with the root place interactionContext hook for cancelling
10975
+ // * active interactions.
10976
+ // */
10977
+ // @Input()
10978
+ // syncWithRoutes = true;
10979
+ dynamicHeight = true;
10980
+ get active() {
10981
+ return this.isActive();
10982
+ }
10983
+ // Horrible hack to stop the div and activity container bouncing back for a bit in after closing. No idea why it's doing that.
10984
+ clampShut = true;
10985
+ interactionService = this.inject(InteractionService);
10986
+ constructor(tabConfig) {
10987
+ super();
10988
+ this.tabConfig = tabConfig;
10989
+ }
10990
+ ngAfterViewInit() {
10991
+ // NOTE: this is a temp work around to detach inplace contexts from the router until AUP-88 is implemented.
10992
+ // https://coolon.atlassian.net/browse/AUP-88?atlOrigin=eyJpIjoiOTg5YjEzZGUzZjRmNDg0NmExOWU3ZGJmMzJiNTRmNGYiLCJwIjoiaiJ9
10993
+ const self = this;
10994
+ this.activityContainerComponent.initialise("dont-care", {
10995
+ async notifyActive(interactionContext) {
10996
+ self.clampShut = false;
10997
+ return undefined;
10998
+ },
10999
+ async notifyFinished(interactionContext) {
11000
+ return undefined;
11001
+ }
11002
+ });
11003
+ // if (this.syncWithRoutes) {
11004
+ // this.interactionService.registerInplaceInteractionContext(this);
11005
+ // }
11006
+ }
11007
+ getAnimationState() {
11008
+ return {
11009
+ value: this.isActive() ? "open" : "closed",
11010
+ params: { duration: "200ms" }
11011
+ };
11012
+ }
11013
+ // this is a regsitration callback from the interaction service
11014
+ // @Trace() // webstorm says no usages... but I'm not sure.
11015
+ onInplaceInteractionContextRegistered(id, api) {
11016
+ this.activityContainerComponent.initialise(id, api);
11017
+ }
11018
+ get identifier() {
11019
+ return this.activityContainerComponent.identifier;
11020
+ }
11021
+ alert(alert) {
11022
+ return this.activityContainerComponent.alert(alert);
11023
+ }
11024
+ cancelActiveActivity() {
11025
+ return this.activityContainerComponent.cancelActiveActivity();
11026
+ }
11027
+ confirm(confirm) {
11028
+ return this.activityContainerComponent.confirm(confirm);
11029
+ }
11030
+ confirmOrReject(confirm) {
11031
+ return this.activityContainerComponent.confirmOrReject(confirm);
11032
+ }
11033
+ confirmThen(confirm, activityType, data) {
11034
+ return this.activityContainerComponent.confirmThen(confirm, activityType);
11035
+ }
11036
+ confirmThenExecute(confirm, operation) {
11037
+ return this.activityContainerComponent.confirmThenExecute(confirm, operation);
11038
+ }
11039
+ isActive() {
11040
+ return this.activityContainerComponent.isActive();
11041
+ }
11042
+ startActivity(activityType, data, options) {
11043
+ return this.activityContainerComponent.startActivity(activityType, data, options);
11044
+ }
11045
+ onAnimationDone() {
11046
+ if (!this.isActive()) {
11047
+ this.clampShut = true;
11048
+ }
11049
+ }
11050
+ 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 });
11051
+ 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: [
11052
+ { provide: INTERACTION_CONTEXT, useExisting: SlideDownInteractionContextComponent }
11053
+ ], 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: [
11054
+ slideDownWhenOpenAnimation
11055
+ ] });
11056
+ }
11057
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SlideDownInteractionContextComponent, decorators: [{
11058
+ type: Component,
11059
+ args: [{ selector: "aup-slide-down-interaction-context", providers: [
11060
+ { provide: INTERACTION_CONTEXT, useExisting: SlideDownInteractionContextComponent }
11061
+ ], animations: [
11062
+ slideDownWhenOpenAnimation
11063
+ ], 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"] }]
11064
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
11065
+ type: Inject,
11066
+ args: [MAT_TABS_CONFIG]
11067
+ }, {
11068
+ type: Optional
11069
+ }] }]; }, propDecorators: { activityContainerComponent: [{
11070
+ type: ViewChild,
11071
+ args: ["activityContainer", { static: true }]
11072
+ }], dynamicHeight: [{
11073
+ type: Input
11074
+ }], active: [{
11075
+ type: HostBinding,
11076
+ args: ["class.active"]
11077
+ }] } });
11078
+
10225
11079
  class InteractionContextTriggerForDirective extends GarbageCollector {
10226
11080
  aupInteractionContextTriggerFor;
10227
11081
  activityClass;
@@ -10304,6 +11158,7 @@ class InteractionModule {
10304
11158
  AlertDialogComponent,
10305
11159
  ActivityOutletComponent,
10306
11160
  InPlaceInteractionContextComponent,
11161
+ SlideDownInteractionContextComponent,
10307
11162
  AddItemInteractionContextComponent,
10308
11163
  ActivityActionsComponent,
10309
11164
  PopupInteractionContextComponent,
@@ -10330,8 +11185,6 @@ class InteractionModule {
10330
11185
  RouterModule,
10331
11186
  MatIconModule,
10332
11187
  DirectivesModule,
10333
- FlexModule,
10334
- GridModule,
10335
11188
  ComponentsModule,
10336
11189
  FormsModule,
10337
11190
  MatInputModule,
@@ -10351,7 +11204,8 @@ class InteractionModule {
10351
11204
  InlineActivityTriggerComponent,
10352
11205
  ModalActivityTriggerComponent,
10353
11206
  AddCardActivityComponent,
10354
- InlineStringEditorComponent] });
11207
+ InlineStringEditorComponent,
11208
+ SlideDownInteractionContextComponent] });
10355
11209
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InteractionModule, providers: [
10356
11210
  InteractionService
10357
11211
  // {
@@ -10365,8 +11219,6 @@ class InteractionModule {
10365
11219
  RouterModule,
10366
11220
  MatIconModule,
10367
11221
  DirectivesModule,
10368
- FlexModule,
10369
- GridModule,
10370
11222
  ComponentsModule,
10371
11223
  FormsModule,
10372
11224
  MatInputModule,
@@ -10385,8 +11237,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10385
11237
  RouterModule,
10386
11238
  MatIconModule,
10387
11239
  DirectivesModule,
10388
- FlexModule,
10389
- GridModule,
10390
11240
  ComponentsModule,
10391
11241
  FormsModule,
10392
11242
  MatInputModule,
@@ -10401,6 +11251,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10401
11251
  AlertDialogComponent,
10402
11252
  ActivityOutletComponent,
10403
11253
  InPlaceInteractionContextComponent,
11254
+ SlideDownInteractionContextComponent,
10404
11255
  AddItemInteractionContextComponent,
10405
11256
  ActivityActionsComponent,
10406
11257
  PopupInteractionContextComponent,
@@ -10438,6 +11289,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10438
11289
  ModalActivityTriggerComponent,
10439
11290
  AddCardActivityComponent,
10440
11291
  InlineStringEditorComponent,
11292
+ SlideDownInteractionContextComponent,
10441
11293
  ],
10442
11294
  providers: [
10443
11295
  InteractionService
@@ -10508,7 +11360,6 @@ class PlaceOutletComponent extends DisposableComponent {
10508
11360
  router;
10509
11361
  placeRouter;
10510
11362
  placeConfig;
10511
- cdr;
10512
11363
  #animate$_accessor_storage = proxify((ValueModel));
10513
11364
  get animate$() { return this.#animate$_accessor_storage; }
10514
11365
  set animate$(value) { this.#animate$_accessor_storage = value; }
@@ -10542,12 +11393,11 @@ class PlaceOutletComponent extends DisposableComponent {
10542
11393
  animationEnabled;
10543
11394
  authorised;
10544
11395
  notAuthorisedNoticePortal;
10545
- constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet, cdr) {
11396
+ constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet) {
10546
11397
  super();
10547
11398
  this.router = router;
10548
11399
  this.placeRouter = placeRouter;
10549
11400
  this.placeConfig = placeConfig;
10550
- this.cdr = cdr;
10551
11401
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
10552
11402
  this.parentOutletModel = new MutableValueModel(parentOutlet);
10553
11403
  const defaultPlaceAnimationOrder = chain(this.parentOutletModel)
@@ -10559,7 +11409,7 @@ class PlaceOutletComponent extends DisposableComponent {
10559
11409
  this.placesInAnimationOrder = chain(this.customPlaceAnimationOrder$)
10560
11410
  .otherwise(defaultPlaceAnimationOrder);
10561
11411
  this.activePlaceAnimationPosition = this.placesInAnimationOrder
10562
- .reduce((placesInOrder) => {
11412
+ .reduceAll((placesInOrder) => {
10563
11413
  let placeIndex = 0;
10564
11414
  if (activatePlaceType.value) {
10565
11415
  placeIndex = placesInOrder.indexOf(activatePlaceType.value);
@@ -10713,8 +11563,8 @@ class PlaceOutletComponent extends DisposableComponent {
10713
11563
  this.onAnimationFinishedJob = undefined;
10714
11564
  }
10715
11565
  }
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] });
11566
+ 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 });
11567
+ 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
11568
  }
10719
11569
  __decorate([
10720
11570
  Proxify(),
@@ -10735,7 +11585,7 @@ __decorate([
10735
11585
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceOutletComponent, decorators: [{
10736
11586
  type: Component,
10737
11587
  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: [{
11588
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: PlaceRouter }, { type: undefined, decorators: [{
10739
11589
  type: Optional
10740
11590
  }, {
10741
11591
  type: Inject,
@@ -10749,7 +11599,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10749
11599
  type: SkipSelf
10750
11600
  }, {
10751
11601
  type: Optional
10752
- }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { animate$: [{
11602
+ }] }]; }, propDecorators: { animate$: [{
10753
11603
  type: Input
10754
11604
  }], animate: [{
10755
11605
  type: Input
@@ -10882,7 +11732,7 @@ class ListPlaceNavComponent extends AbstractPlaceNavigationComponent {
10882
11732
  super(router);
10883
11733
  }
10884
11734
  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"] }] });
11735
+ 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
11736
  }
10887
11737
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ListPlaceNavComponent, decorators: [{
10888
11738
  type: Component,
@@ -10957,7 +11807,7 @@ class SidePlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10957
11807
  this.expanded = !this.expanded;
10958
11808
  }
10959
11809
  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"] }] });
11810
+ 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
11811
  }
10962
11812
  __decorate([
10963
11813
  Proxify(),
@@ -10969,7 +11819,7 @@ __decorate([
10969
11819
  ], SidePlaceNavigationComponent.prototype, "expanded", null);
10970
11820
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SidePlaceNavigationComponent, decorators: [{
10971
11821
  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"] }]
11822
+ 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
11823
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { expanded$: [{
10974
11824
  type: Input
10975
11825
  }], expanded: [{
@@ -10987,7 +11837,7 @@ class TabbedPlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10987
11837
  super(router);
10988
11838
  }
10989
11839
  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"] }] });
11840
+ 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
11841
  }
10992
11842
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TabbedPlaceNavigationComponent, decorators: [{
10993
11843
  type: Component,
@@ -11010,7 +11860,6 @@ class PlaceModule {
11010
11860
  MatTooltipModule,
11011
11861
  MatIconModule,
11012
11862
  DirectivesModule,
11013
- FlexModule,
11014
11863
  ComponentsModule,
11015
11864
  PortalModule,
11016
11865
  MatCardModule], exports: [PlaceOutletComponent,
@@ -11027,7 +11876,6 @@ class PlaceModule {
11027
11876
  MatTooltipModule,
11028
11877
  MatIconModule,
11029
11878
  DirectivesModule,
11030
- FlexModule,
11031
11879
  ComponentsModule,
11032
11880
  PortalModule,
11033
11881
  MatCardModule] });
@@ -11045,7 +11893,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11045
11893
  MatTooltipModule,
11046
11894
  MatIconModule,
11047
11895
  DirectivesModule,
11048
- FlexModule,
11049
11896
  ComponentsModule,
11050
11897
  PortalModule,
11051
11898
  MatCardModule
@@ -11135,60 +11982,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11135
11982
  }]
11136
11983
  }] });
11137
11984
 
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
11985
  /**
11189
11986
  * @file Automatically generated by barrelsby.
11190
11987
  */
11191
11988
 
11989
+ class ResizeObserverDirective extends DisposableComponent {
11990
+ aupOnResize = new EventEmitter();
11991
+ elementRef = this.inject(ElementRef);
11992
+ ngZone = this.inject(NgZone);
11993
+ _bounds$ = new MutableValueModel();
11994
+ ngAfterViewInit() {
11995
+ const element = this.elementRef.nativeElement;
11996
+ const ro = new ResizeObserver((entries, observer) => {
11997
+ this.ngZone.run(() => this._updateBounds());
11998
+ });
11999
+ ro.observe(element);
12000
+ this.onDispose(() => ro.disconnect());
12001
+ setTimeout(() => this._updateBounds());
12002
+ }
12003
+ get bounds$() {
12004
+ return this._bounds$.readonly$;
12005
+ }
12006
+ _updateBounds() {
12007
+ this._bounds$.value = Bounds.ofElement(this.elementRef.nativeElement);
12008
+ this.aupOnResize.emit(this._bounds$.value);
12009
+ }
12010
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
12011
+ 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 });
12012
+ }
12013
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, decorators: [{
12014
+ type: Directive,
12015
+ args: [{
12016
+ selector: "[aupOnResize]",
12017
+ standalone: true
12018
+ }]
12019
+ }], propDecorators: { aupOnResize: [{
12020
+ type: Output
12021
+ }] } });
12022
+
11192
12023
  /**
11193
12024
  * @file Automatically generated by barrelsby.
11194
12025
  */
@@ -11279,7 +12110,7 @@ class DialogInteractionContextFactory extends ModalInteractionContextFactory {
11279
12110
  };
11280
12111
  return new DialogInteractionContext(identifier, api, this.dialogService, config);
11281
12112
  }
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 });
12113
+ 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
12114
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, providedIn: 'root' });
11284
12115
  }
11285
12116
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, decorators: [{
@@ -11287,12 +12118,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11287
12118
  args: [{
11288
12119
  providedIn: 'root'
11289
12120
  }]
11290
- }], ctorParameters: function () { return [{ type: i1$6.MatDialog }, { type: i1$6.MatDialogConfig, decorators: [{
12121
+ }], ctorParameters: function () { return [{ type: i1$7.MatDialog }, { type: i1$7.MatDialogConfig, decorators: [{
11291
12122
  type: Optional
11292
12123
  }, {
11293
12124
  type: Inject,
11294
12125
  args: [DIALOG_INTERACTION_SERVICE_DEFAULTS]
11295
- }] }, { type: i1$6.MatDialogConfig, decorators: [{
12126
+ }] }, { type: i1$7.MatDialogConfig, decorators: [{
11296
12127
  type: Optional
11297
12128
  }, {
11298
12129
  type: Inject,
@@ -11412,6 +12243,7 @@ class PlaceGuard {
11412
12243
  }
11413
12244
  // @Trace()
11414
12245
  async canActivate(activatedRoute, state) {
12246
+ await this.placeRouter.waitUntilRouterReady();
11415
12247
  if (PlaceComponent.isPlaceComponentConstructor(activatedRoute.component)) {
11416
12248
  const placeDefinition = PlaceComponent.getDefinition(activatedRoute.component);
11417
12249
  if (placeDefinition.authenticate) {
@@ -11524,13 +12356,13 @@ class PlaceGuard {
11524
12356
  return next();
11525
12357
  }
11526
12358
  }
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 });
12359
+ 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
12360
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, providedIn: 'root' });
11529
12361
  }
11530
12362
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, decorators: [{
11531
12363
  type: Injectable,
11532
12364
  args: [{ providedIn: 'root' }]
11533
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
12365
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
11534
12366
 
11535
12367
  var Formatter;
11536
12368
  (function (Formatter) {
@@ -11564,69 +12396,74 @@ var Formatter;
11564
12396
  Formatter.BOOLEAN = new BooleanType();
11565
12397
  })(Formatter || (Formatter = {}));
11566
12398
 
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
- }
12399
+ // function installMechanics<M extends HasValue<any>>(parameterDef: ParameterDefinition<any>, prototype: object, propertyKey: string | symbol, tagPrefix: string) {
12400
+ //
12401
+ // Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12402
+ //
12403
+ // function getMechanics(instance: M, propertyName: string | symbol) {
12404
+ // const key = `__mechanics_${propertyName.toString()}`;
12405
+ // if (!instance[key]) {
12406
+ // const backingModel = parameterDef.createBackingModel();
12407
+ // instance[key] = {
12408
+ // backingModel: backingModel,
12409
+ // binding: null as Binding<any, any>
12410
+ // };
12411
+ // const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
12412
+ // DebugContext.getOrCreate(instance[key].backingModel).tag(tag);
12413
+ // }
12414
+ // return instance[key];
12415
+ // }
12416
+ //
12417
+ // Object.defineProperty(prototype, propertyKey, {
12418
+ // get: function() {
12419
+ // return getMechanics(this, propertyKey).backingModel;
12420
+ // },
12421
+ // set: function(userModel: M) {
12422
+ // const mechanics = getMechanics(this, propertyKey);
12423
+ // // This handles the scenario where we want to push an existing value model (such as a form model)
12424
+ // // to and from the route.
12425
+ // if (mechanics.binding) {
12426
+ // mechanics.binding.dispose();
12427
+ // }
12428
+ // if (userModel) {
12429
+ // mechanics.binding = new Binding(mechanics.backingModel, userModel, {
12430
+ // toLeft: Functions.identity,
12431
+ // toRight: Functions.identity
12432
+ // });
12433
+ // if (parameterDef.isEmptyValue(userModel.value)) {
12434
+ // // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});
12435
+ // mechanics.binding.writeRight(); // push the visit into the user model;
12436
+ // } else {
12437
+ // if (!parameterDef.isEmptyValue(mechanics.backingModel.value)) {
12438
+ // console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');
12439
+ // }
12440
+ // mechanics.binding.writeLeft(); // push the user model into the visit
12441
+ // }
12442
+ // }
12443
+ // }
12444
+ // });
12445
+ // }
11612
12446
  function RouteId(formatter, options) {
11613
12447
  return (prototype, propertyKey) => {
11614
12448
  const parameterDef = new ParameterDefinition.RouteId(propertyKey.toString(), options, formatter);
11615
- installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12449
+ // installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12450
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
11616
12451
  };
11617
12452
  }
11618
12453
  function VisitParameter(options) {
11619
12454
  const opts = Opts.get(options);
11620
12455
  return (prototype, propertyKey) => {
11621
12456
  const parameterDef = new ParameterDefinition.ValueParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11622
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
12457
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12458
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
11623
12459
  };
11624
12460
  }
11625
12461
  function VisitParameterList(options) {
11626
12462
  const opts = Opts.get(options);
11627
12463
  return (prototype, propertyKey) => {
11628
12464
  const parameterDef = new ParameterDefinition.ArrayParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11629
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
12465
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12466
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
11630
12467
  };
11631
12468
  }
11632
12469
 
@@ -11720,5 +12557,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11720
12557
  * Generated bundle index. Do not edit.
11721
12558
  */
11722
12559
 
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 };
12560
+ 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
12561
  //# sourceMappingURL=coolon-angular-ui-powerups.mjs.map