@coolon/angular-ui-powerups 16.1.0-aplpha.11 → 16.1.0-aplpha.110

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 (174) 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 +33 -23
  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 +19 -37
  15. package/esm2022/lib/components/exports.mjs +8 -2
  16. package/esm2022/lib/components/forms/abstract-input.component.mjs +55 -12
  17. package/esm2022/lib/components/forms/autocomplete-input/autocomplete-input.component.mjs +2 -2
  18. package/esm2022/lib/components/forms/checkbox-input/checkbox-input.component.mjs +8 -6
  19. package/esm2022/lib/components/forms/form-field.mjs +2 -0
  20. package/esm2022/lib/components/forms/multiple-select-input/multiple-select-input.component.mjs +2 -2
  21. package/esm2022/lib/components/forms/number-input/number-input.component.mjs +49 -10
  22. package/esm2022/lib/components/forms/password-input/password-input.component.mjs +40 -3
  23. package/esm2022/lib/components/forms/search-input/search-input.component.mjs +33 -0
  24. package/esm2022/lib/components/forms/select-input/select-input.component.mjs +11 -10
  25. package/esm2022/lib/components/forms/string-input/string-input.component.mjs +21 -9
  26. package/esm2022/lib/components/icon/icon.component.mjs +7 -4
  27. package/esm2022/lib/components/loadable-component.mjs +49 -0
  28. package/esm2022/lib/components/resize-aware.component.mjs +61 -24
  29. package/esm2022/lib/components/switch-case/switch-case.component.mjs +5 -7
  30. package/esm2022/lib/components/tables/abstract-table-model.mjs +49 -25
  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 +4 -2
  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/cell-portal-ref.mjs +19 -1
  47. package/esm2022/lib/components/tables/renderer/default-cell-renderer/default-cell-renderer.component.mjs +3 -3
  48. package/esm2022/lib/components/tables/renderer/select-header-cell/selection-header-cell.component.mjs +3 -2
  49. package/esm2022/lib/components/tables/renderer/table-body/table-body.component.mjs +150 -40
  50. package/esm2022/lib/components/tables/renderer/table-cell/table-cell.component.mjs +1 -1
  51. package/esm2022/lib/components/tables/renderer/table-footer-row/table-footer-row.component.mjs +30 -0
  52. package/esm2022/lib/components/tables/renderer/table-more-menu/table-more-menu.component.mjs +7 -2
  53. package/esm2022/lib/components/tables/table/table-model.mjs +1 -1
  54. package/esm2022/lib/components/tables/table/table.component.mjs +39 -62
  55. package/esm2022/lib/components/tables/tree-table/decorated-tree-node.mjs +5 -4
  56. package/esm2022/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.mjs +1 -1
  57. package/esm2022/lib/components/tables/tree-table/tree-label-column-model.mjs +3 -3
  58. package/esm2022/lib/components/tables/tree-table/tree-table-component.mjs +12 -6
  59. package/esm2022/lib/components/tables/tree-table/tree-table-model.mjs +3 -3
  60. package/esm2022/lib/components/text/markdown/markdown.component.mjs +2 -2
  61. package/esm2022/lib/directives/directives.module.mjs +1 -1
  62. package/esm2022/lib/directives/exports.mjs +2 -1
  63. package/esm2022/lib/directives/highlight.pipe.mjs +2 -2
  64. package/esm2022/lib/directives/resize-observer.directive.mjs +40 -0
  65. package/esm2022/lib/interaction/activity.mjs +3 -4
  66. package/esm2022/lib/interaction/alert.mjs +2 -2
  67. package/esm2022/lib/interaction/components/abstract-confirm-dialog.component.mjs +8 -4
  68. package/esm2022/lib/interaction/components/activity-actions/activity-actions.component.mjs +20 -11
  69. package/esm2022/lib/interaction/components/activity-container/activity-container.component.mjs +28 -11
  70. package/esm2022/lib/interaction/components/activity-title/activity-title.component.mjs +4 -4
  71. package/esm2022/lib/interaction/components/activity-triggers/inline-activity-trigger/inline-activity-trigger.component.mjs +1 -1
  72. package/esm2022/lib/interaction/components/add-card-activity/add-card-activity.component.mjs +1 -1
  73. package/esm2022/lib/interaction/components/add-item-interaction-context/add-item-interaction-context.component.mjs +1 -1
  74. package/esm2022/lib/interaction/components/alert-dialog/alert-dialog.component.mjs +1 -1
  75. package/esm2022/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.mjs +1 -1
  76. package/esm2022/lib/interaction/components/confirm-then-execute-dialog/confirm-then-execute-dialog.component.mjs +1 -1
  77. package/esm2022/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.mjs +1 -1
  78. package/esm2022/lib/interaction/components/editors/edit-context.mjs +1 -1
  79. package/esm2022/lib/interaction/components/editors/inline-string-editor/inline-string-editor.component.mjs +3 -3
  80. package/esm2022/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.mjs +15 -4
  81. package/esm2022/lib/interaction/components/input-activities/input-activity.mjs +2 -2
  82. package/esm2022/lib/interaction/components/input-activities/select-input-activity.mjs +4 -2
  83. package/esm2022/lib/interaction/components/input-activities/string-input-activity.mjs +8 -4
  84. package/esm2022/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.mjs +129 -0
  85. package/esm2022/lib/interaction/directives/interaction-context-trigger-for.directive.mjs +2 -2
  86. package/esm2022/lib/interaction/exports.mjs +2 -1
  87. package/esm2022/lib/interaction/interaction.module.mjs +7 -9
  88. package/esm2022/lib/place/components/list-place-nav/list-place-nav.component.mjs +3 -4
  89. package/esm2022/lib/place/components/place-outlet/place-outlet.component.mjs +7 -9
  90. package/esm2022/lib/place/components/side-place-navigation/side-place-navigation.component.mjs +2 -2
  91. package/esm2022/lib/place/guards/consolidated-param-map.mjs +4 -4
  92. package/esm2022/lib/place/guards/place.guard.mjs +2 -1
  93. package/esm2022/lib/place/navigation/place-component-deactivation-handler.mjs +2 -2
  94. package/esm2022/lib/place/navigation/session/interactions/synchronise-interaction-context-ids-with-route.mjs +3 -6
  95. package/esm2022/lib/place/place-component.mjs +7 -7
  96. package/esm2022/lib/place/place-definition.mjs +3 -3
  97. package/esm2022/lib/place/place-history.mjs +2 -2
  98. package/esm2022/lib/place/place-router.mjs +20 -18
  99. package/esm2022/lib/place/place.decorator.mjs +2 -2
  100. package/esm2022/lib/place/place.module.mjs +1 -5
  101. package/esm2022/lib/place/route/formatter.mjs +2 -2
  102. package/esm2022/lib/place/route/parameter-decorators.mjs +54 -50
  103. package/esm2022/lib/place/route/parameter-definition.mjs +2 -2
  104. package/esm2022/lib/place/url-snapshot.mjs +3 -3
  105. package/esm2022/lib/place/visit-segment.mjs +2 -2
  106. package/esm2022/lib/place/visit.mjs +2 -2
  107. package/fesm2022/coolon-angular-ui-powerups.mjs +1291 -536
  108. package/fesm2022/coolon-angular-ui-powerups.mjs.map +1 -1
  109. package/lib/animations/slide-animations.d.ts +1 -0
  110. package/lib/components/cards/card-container/card-container.component.d.ts +1 -1
  111. package/lib/components/commands/command/command.component.d.ts +2 -1
  112. package/lib/components/commands/command-face/command-face.component.d.ts +2 -0
  113. package/lib/components/commands/command-face.d.ts +5 -7
  114. package/lib/components/commands/group/popup-menu/abstract-popup-menu.component.d.ts +2 -2
  115. package/lib/components/commands/group/tool-bar/tool-bar.component.d.ts +1 -1
  116. package/lib/components/components.module.d.ts +56 -53
  117. package/lib/components/disposable-component.d.ts +11 -8
  118. package/lib/components/exports.d.ts +7 -1
  119. package/lib/components/forms/abstract-input.component.d.ts +13 -5
  120. package/lib/components/forms/checkbox-input/checkbox-input.component.d.ts +2 -0
  121. package/lib/components/forms/form-field.d.ts +5 -0
  122. package/lib/components/forms/number-input/number-input.component.d.ts +8 -4
  123. package/lib/components/forms/password-input/password-input.component.d.ts +7 -1
  124. package/lib/components/forms/search-input/search-input.component.d.ts +10 -0
  125. package/lib/components/forms/select-input/select-input.component.d.ts +4 -3
  126. package/lib/components/forms/string-input/string-input.component.d.ts +3 -1
  127. package/lib/components/loadable-component.d.ts +17 -0
  128. package/lib/components/resize-aware.component.d.ts +24 -5
  129. package/lib/components/switch-case/switch-case.component.d.ts +2 -3
  130. package/lib/components/tables/abstract-table-model.d.ts +14 -6
  131. package/lib/components/tables/abstract-table.component.d.ts +4 -3
  132. package/lib/components/tables/column/column-manager.d.ts +19 -0
  133. package/lib/components/tables/column/column-model.d.ts +7 -3
  134. package/lib/components/tables/column/column-order-manager.d.ts +20 -0
  135. package/lib/components/tables/column/custom-template-column-model.d.ts +3 -2
  136. package/lib/components/tables/column/custom-value-column-model.d.ts +3 -2
  137. package/lib/components/tables/column/editor-controls-column-model.d.ts +3 -2
  138. package/lib/components/tables/column/list-propery-column-model.d.ts +3 -2
  139. package/lib/components/tables/column/property-column-model.d.ts +3 -2
  140. package/lib/components/tables/column/selection-column-model.d.ts +3 -2
  141. package/lib/components/tables/editor/edit-row-controls/edit-row-controls.component.d.ts +1 -1
  142. package/lib/components/tables/editor/edit-session.d.ts +1 -1
  143. package/lib/components/tables/filter/text-search-predicate.d.ts +9 -0
  144. package/lib/components/tables/footer/footer-row-model.d.ts +22 -0
  145. package/lib/components/tables/renderer/cell-portal-ref.d.ts +14 -6
  146. package/lib/components/tables/renderer/table-body/table-body.component.d.ts +40 -16
  147. package/lib/components/tables/renderer/table-cell/table-cell.component.d.ts +1 -1
  148. package/lib/components/tables/renderer/table-footer-row/table-footer-row.component.d.ts +11 -0
  149. package/lib/components/tables/renderer/table-more-menu/table-more-menu.component.d.ts +2 -1
  150. package/lib/components/tables/table/table-model.d.ts +1 -1
  151. package/lib/components/tables/table/table.component.d.ts +14 -10
  152. package/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.d.ts +1 -1
  153. package/lib/components/tables/tree-table/tree-label-column-model.d.ts +3 -2
  154. package/lib/components/tables/tree-table/tree-table-component.d.ts +3 -0
  155. package/lib/components/tables/tree-table/tree-table-model.d.ts +1 -1
  156. package/lib/directives/exports.d.ts +1 -0
  157. package/lib/directives/resize-observer.directive.d.ts +16 -0
  158. package/lib/interaction/activity.d.ts +2 -2
  159. package/lib/interaction/components/abstract-confirm-dialog.component.d.ts +1 -0
  160. package/lib/interaction/components/activity-actions/activity-actions.component.d.ts +10 -5
  161. package/lib/interaction/components/activity-container/activity-container.component.d.ts +7 -3
  162. package/lib/interaction/components/activity-title/activity-title.component.d.ts +1 -1
  163. package/lib/interaction/components/editors/edit-context.d.ts +1 -1
  164. package/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.d.ts +5 -3
  165. package/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.d.ts +53 -0
  166. package/lib/interaction/exports.d.ts +1 -0
  167. package/lib/interaction/interaction.module.d.ts +28 -28
  168. package/lib/place/components/place-outlet/place-outlet.component.d.ts +3 -4
  169. package/lib/place/place-component.d.ts +4 -4
  170. package/lib/place/place-router.d.ts +4 -0
  171. package/lib/place/place.module.d.ts +4 -5
  172. package/package.json +6 -4
  173. package/esm2022/lib/components/tables/column/column-list-model.mjs +0 -44
  174. 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';
44
+ import { GarbageCollector, DelegatingValueModel, assert, UnaryCommand, lang, Dsl, Logger, proxify, ValueModel, Proxify, 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, DelegatingCommand, ComputedListModel, Deferred, ReducingValueModel, AndValueModel } from '@coolon/pectin';
43
45
  import { __decorate, __param, __metadata } 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';
52
- import produce from 'immer';
53
+ import { Memoize } from 'fast-typescript-memoize';
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;
@@ -213,11 +212,12 @@ var Track;
213
212
 
214
213
  class DisposableComponent extends GarbageCollector {
215
214
  trackById = Track.byId();
216
- #_loaded$ = new MutableValueModel();
217
- #asyncLoadables = [];
218
- #awaitedLoadables = [];
215
+ // #_loaded$ = new MutableValueModel<boolean>();
216
+ // #asyncLoadables: Loadable[] = [];
217
+ // #awaitedLoadables: Loadable[] = [];
219
218
  #initCallbacks = [];
220
219
  #initialised = false;
220
+ cdr = this.inject(ChangeDetectorRef);
221
221
  onInit(callback) {
222
222
  if (this.#initialised) {
223
223
  callback();
@@ -226,44 +226,25 @@ class DisposableComponent extends GarbageCollector {
226
226
  this.#initCallbacks.push(callback);
227
227
  }
228
228
  }
229
- get loaded$() {
230
- return this.#_loaded$.readonly$;
231
- }
232
229
  ngOnInit() {
233
230
  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
231
  this.#initialised = true;
246
232
  }
233
+ ngOnDestroy() {
234
+ this.dispose();
235
+ }
247
236
  inject(token) {
248
237
  return inject(token);
249
238
  }
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
- ngOnDestroy() {
266
- this.dispose();
239
+ /**
240
+ * Monitors the specified models for any change and triggers and angular change detect cycle. This is intended for use
241
+ * when the component uses the ON_PUSH change detection strategy.
242
+ * @param models
243
+ * @protected
244
+ */
245
+ trackChangesAndMarkForCheck(...models) {
246
+ const { when } = Dsl.disposeWith(this);
247
+ when.anyOf(...models).changes(() => this.cdr.markForCheck());
267
248
  }
268
249
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DisposableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
269
250
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: DisposableComponent, usesInheritance: true, ngImport: i0 });
@@ -736,42 +717,42 @@ var CommandFace;
736
717
  }
737
718
  }
738
719
  __decorate([
739
- Memoize(),
720
+ MemoizeGet(),
740
721
  __metadata("design:type", Object),
741
722
  __metadata("design:paramtypes", [])
742
723
  ], Adapter.prototype, "text", null);
743
724
  __decorate([
744
- Memoize(),
725
+ MemoizeGet(),
745
726
  __metadata("design:type", Object),
746
727
  __metadata("design:paramtypes", [])
747
728
  ], Adapter.prototype, "icon", null);
748
729
  __decorate([
749
- Memoize(),
730
+ MemoizeGet(),
750
731
  __metadata("design:type", Object),
751
732
  __metadata("design:paramtypes", [])
752
733
  ], Adapter.prototype, "iconPosition", null);
753
734
  __decorate([
754
- Memoize(),
735
+ MemoizeGet(),
755
736
  __metadata("design:type", Object),
756
737
  __metadata("design:paramtypes", [])
757
738
  ], Adapter.prototype, "tooltip", null);
758
739
  __decorate([
759
- Memoize(),
740
+ MemoizeGet(),
760
741
  __metadata("design:type", Boolean),
761
742
  __metadata("design:paramtypes", [])
762
743
  ], Adapter.prototype, "iconPositionStart", null);
763
744
  __decorate([
764
- Memoize(),
745
+ MemoizeGet(),
765
746
  __metadata("design:type", Boolean),
766
747
  __metadata("design:paramtypes", [])
767
748
  ], Adapter.prototype, "iconPositionEnd", null);
768
749
  __decorate([
769
- Memoize(),
750
+ MemoizeGet(),
770
751
  __metadata("design:type", String),
771
752
  __metadata("design:paramtypes", [])
772
753
  ], Adapter.prototype, "color", null);
773
754
  __decorate([
774
- Memoize(),
755
+ MemoizeGet(),
775
756
  __metadata("design:type", String),
776
757
  __metadata("design:paramtypes", [])
777
758
  ], Adapter.prototype, "style", null);
@@ -842,6 +823,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
842
823
  args: ["class.disable-scroll"]
843
824
  }] } });
844
825
 
826
+ /* eslint-disable @angular-eslint/no-host-metadata-property */
845
827
  class IconComponent {
846
828
  _icon;
847
829
  prefix;
@@ -873,11 +855,13 @@ class IconComponent {
873
855
  return `fa-${this.suffix}`;
874
856
  }
875
857
  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"] }] });
858
+ 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
859
  }
878
860
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: IconComponent, decorators: [{
879
861
  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"] }]
862
+ args: [{ selector: 'aup-icon', changeDetection: ChangeDetectionStrategy.OnPush, host: {
863
+ class: "mat-icon" // this ensures angular form styles that target mat icon also work with us
864
+ }, 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
865
  }], propDecorators: { icon: [{
882
866
  type: Input
883
867
  }, {
@@ -908,6 +892,7 @@ class CommandFaceComponent extends DisposableComponent {
908
892
  // tslint:disable-next-line:no-input-rename
909
893
  get _rawFaces() { return this.#_rawFaces_accessor_storage; }
910
894
  set _rawFaces(value) { this.#_rawFaces_accessor_storage = value; }
895
+ hasTextAndLeadingIcon$;
911
896
  set face(face) {
912
897
  this.faces$.value = [face];
913
898
  }
@@ -927,6 +912,7 @@ class CommandFaceComponent extends DisposableComponent {
927
912
  const activeFace = this.faceAdapters.first();
928
913
  this.activeIcon = activeFace.pluck("icon");
929
914
  this.activeColor = activeFace.pluck("color");
915
+ this.hasTextAndLeadingIcon$ = valueOf.all(this.activeIcon.isNotNil(), activeFace.pluckString('text').isNotBlank(), activeFace.pluck("iconPosition").doesNotEqual(CommandFace.Position.END)).areTruthy();
930
916
  }
931
917
  shouldIncludeIcon(face) {
932
918
  return (!this.ignoreIcon && face.icon) || this.includeMissingIconInLayout;
@@ -940,8 +926,11 @@ class CommandFaceComponent extends DisposableComponent {
940
926
  get color() {
941
927
  return this.activeColor.value;
942
928
  }
929
+ get hasTextAndIcon() {
930
+ return this.hasTextAndLeadingIcon$.value;
931
+ }
943
932
  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 });
933
+ 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
934
  }
946
935
  __decorate([
947
936
  StoreInListModel("faces$"),
@@ -949,7 +938,7 @@ __decorate([
949
938
  ], CommandFaceComponent.prototype, "_rawFaces", null);
950
939
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CommandFaceComponent, decorators: [{
951
940
  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"] }]
941
+ 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
942
  }], ctorParameters: function () { return []; }, propDecorators: { _rawFaces: [{
954
943
  type: Input,
955
944
  args: ['faces']
@@ -967,6 +956,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
967
956
  }], color: [{
968
957
  type: HostBinding,
969
958
  args: ['attr.color']
959
+ }], hasTextAndIcon: [{
960
+ type: HostBinding,
961
+ args: ['class.has-text-and-leading-icon']
970
962
  }] } });
971
963
 
972
964
  /**
@@ -1070,11 +1062,11 @@ class CardContainerComponent extends AbstractCardContainerComponent {
1070
1062
  }
1071
1063
  }
1072
1064
  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"] }] });
1065
+ 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
1066
  }
1075
1067
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CardContainerComponent, decorators: [{
1076
1068
  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"] }]
1069
+ 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
1070
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { columnCount: [{
1079
1071
  type: Input
1080
1072
  }], enableScroll: [{
@@ -1150,14 +1142,24 @@ class CommandComponent extends PopupAwareComponent {
1150
1142
  activeFace$;
1151
1143
  iconOnly$;
1152
1144
  tooltip$;
1145
+ visible$;
1153
1146
  constructor(element, parent) {
1154
1147
  super(element, parent);
1155
1148
  const { chain, switchOn } = Dsl.disposeWith(this);
1156
- this.faces$ = chain(this.command.busy$).mapToList(busy => {
1149
+ this.faces$ = chain(this.command.busy$)
1150
+ .mapToList(busy => {
1157
1151
  return busy ?
1158
- [this.busyFace$.value, this.face$.value] :
1159
- [this.face$.value, this.busyFace$.value];
1160
- }, { allowNil: true, dependsOn: [this.face$, this.busyFace$] })
1152
+ [this.busyFace$.value ?? this.command.busyFace$.value, this.face$.value ?? this.command.defaultFace$.value] :
1153
+ [this.face$.value ?? this.command.defaultFace$.value, this.busyFace$.value ?? this.command.busyFace$.value];
1154
+ }, {
1155
+ allowNil: true,
1156
+ dependsOn: [
1157
+ this.face$,
1158
+ this.busyFace$,
1159
+ this.command.defaultFace$,
1160
+ this.command.busyFace$
1161
+ ]
1162
+ })
1161
1163
  .rejectNil();
1162
1164
  this.activeFace$ = this.faces$.first();
1163
1165
  this.buttonStyle$ = chain(this.activeFace$).map(f => CommandFace.getStyleOf(f));
@@ -1166,18 +1168,19 @@ class CommandComponent extends PopupAwareComponent {
1166
1168
  this.iconOnly$ = this.faces$.select(face => {
1167
1169
  return isEmpty(CommandFace.getTextOf(face)) && !isEmpty(CommandFace.getIconOf(face));
1168
1170
  }).count().equals(this.faces$.count());
1171
+ this.visible$ = chain(this.command.visible$);
1172
+ }
1173
+ get cssDisplayProperty() {
1174
+ return this.visible$.value ? undefined : 'none';
1169
1175
  }
1170
1176
  isActive(face) {
1171
1177
  return this.activeFace$.query().equals(face);
1172
1178
  }
1173
- getFace() {
1174
- return this.face;
1175
- }
1176
1179
  requestFocus() {
1177
1180
  this.button.focus();
1178
1181
  }
1179
1182
  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"] }] });
1183
+ 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
1184
  }
1182
1185
  __decorate([
1183
1186
  Proxify(),
@@ -1225,6 +1228,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1225
1228
  }], button: [{
1226
1229
  type: ViewChild,
1227
1230
  args: [MatButton]
1231
+ }], cssDisplayProperty: [{
1232
+ type: HostBinding,
1233
+ args: ["style.display"]
1228
1234
  }] } });
1229
1235
 
1230
1236
  /**
@@ -1252,12 +1258,12 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1252
1258
  xPosition = 'after';
1253
1259
  yPosition = 'below';
1254
1260
  triggers;
1255
- #enabled_accessor_storage;
1256
- get enabled() { return this.#enabled_accessor_storage; }
1257
- set enabled(value) { this.#enabled_accessor_storage = value; }
1258
1261
  #enabled$_accessor_storage = proxify((ValueModel));
1259
1262
  get enabled$() { return this.#enabled$_accessor_storage; }
1260
1263
  set enabled$(value) { this.#enabled$_accessor_storage = value; }
1264
+ #enabled_accessor_storage = true;
1265
+ get enabled() { return this.#enabled_accessor_storage; }
1266
+ set enabled(value) { this.#enabled_accessor_storage = value; }
1261
1267
  children;
1262
1268
  faces$;
1263
1269
  constructor(element, parent) {
@@ -1299,16 +1305,16 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1299
1305
  return this.faceAdapter.face;
1300
1306
  }
1301
1307
  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 });
1308
+ 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
1309
  }
1304
- __decorate([
1305
- StoreInValueModel(),
1306
- __metadata("design:type", Boolean)
1307
- ], AbstractPopupMenuComponent.prototype, "enabled", null);
1308
1310
  __decorate([
1309
1311
  Proxify(),
1310
1312
  __metadata("design:type", Object)
1311
1313
  ], AbstractPopupMenuComponent.prototype, "enabled$", null);
1314
+ __decorate([
1315
+ StoreInValueModel(),
1316
+ __metadata("design:type", Object)
1317
+ ], AbstractPopupMenuComponent.prototype, "enabled", null);
1312
1318
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractPopupMenuComponent, decorators: [{
1313
1319
  type: Component,
1314
1320
  args: [{ selector: 'aup-abstract-popup-menu', template: '' }]
@@ -1322,10 +1328,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1322
1328
  }], triggers: [{
1323
1329
  type: ViewChildren,
1324
1330
  args: [MatMenuTrigger]
1325
- }], enabled: [{
1326
- type: Input
1327
1331
  }], enabled$: [{
1328
1332
  type: Input
1333
+ }], enabled: [{
1334
+ type: Input
1329
1335
  }] } });
1330
1336
 
1331
1337
  class CommandContainer extends GarbageCollector {
@@ -1358,13 +1364,15 @@ class ToolBarComponent extends CommandContainer {
1358
1364
  get orientation() {
1359
1365
  return CommandContainer.Orientation.HORIZONTAL;
1360
1366
  }
1361
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, deps: [{ token: CommandContainer }], target: i0.ɵɵFactoryTarget.Component });
1367
+ 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
1368
  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
1369
  }
1364
1370
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, decorators: [{
1365
1371
  type: Component,
1366
1372
  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 }]; } });
1373
+ }], ctorParameters: function () { return [{ type: CommandContainer, decorators: [{
1374
+ type: Optional
1375
+ }] }]; } });
1368
1376
 
1369
1377
  /**
1370
1378
  *
@@ -1675,7 +1683,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1675
1683
  args: ['blur']
1676
1684
  }] } });
1677
1685
 
1678
- /* tslint:disable:no-input-rename */
1679
1686
  const INPUT_TOKEN_HACK = new InjectionToken("INPUT_TOKEN_HACK");
1680
1687
  class AbstractInputComponent extends DisposableComponent {
1681
1688
  onValueEditedListeners = new EventListenerList();
@@ -1690,11 +1697,16 @@ class AbstractInputComponent extends DisposableComponent {
1690
1697
  * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).
1691
1698
  */
1692
1699
  formValue$;
1693
- label;
1694
- // eslint-disable-next-line @angular-eslint/no-input-rename
1700
+ #i18n$_accessor_storage = proxify((MutableValueModel));
1701
+ get i18n$() { return this.#i18n$_accessor_storage; }
1702
+ set i18n$(value) { this.#i18n$_accessor_storage = value; }
1703
+ #i18n_accessor_storage;
1704
+ get i18n() { return this.#i18n_accessor_storage; }
1705
+ set i18n(value) { this.#i18n_accessor_storage = value; }
1706
+ _label;
1695
1707
  userFloatLabel = 'always'; // TODO: make this an injectable default
1696
- hint;
1697
- placeholder;
1708
+ _hint;
1709
+ _placeholder;
1698
1710
  dense = false;
1699
1711
  _enabled$ = this.registerDisposable(new DelegatingValueModel());
1700
1712
  set enabled$(condition$) {
@@ -1761,6 +1773,9 @@ class AbstractInputComponent extends DisposableComponent {
1761
1773
  isEnabled() {
1762
1774
  return this.enabled$.value;
1763
1775
  }
1776
+ get disabled() {
1777
+ return !this.isEnabled();
1778
+ }
1764
1779
  hasErrors() {
1765
1780
  return !this.errorList$.query().isEmpty();
1766
1781
  }
@@ -1773,6 +1788,15 @@ class AbstractInputComponent extends DisposableComponent {
1773
1788
  get focusContext() {
1774
1789
  return this.formValue$.focusContext;
1775
1790
  }
1791
+ get label() {
1792
+ return this._label ?? this.i18n?.label();
1793
+ }
1794
+ get hint() {
1795
+ return this._hint ?? this.hackyGetI18n("hint");
1796
+ }
1797
+ get placeholder() {
1798
+ return this._placeholder ?? this.hackyGetI18n("placeholder");
1799
+ }
1776
1800
  get floatLabel() {
1777
1801
  // return this.dense ? 'never' : this.userFloatLabel;
1778
1802
  return this.userFloatLabel;
@@ -1787,24 +1811,45 @@ class AbstractInputComponent extends DisposableComponent {
1787
1811
  onValueEdited(callback) {
1788
1812
  return this.onValueEditedListeners.add(callback);
1789
1813
  }
1814
+ hackyGetI18n(key) {
1815
+ // TODO: update I18n to make it possible to get an optional value with return the missing key message.
1816
+ const i18nFn = this.i18n ? this.i18n[key] : undefined;
1817
+ const i18nValue = i18nFn && i18nFn();
1818
+ return i18nValue?.startsWith("missing key") ? undefined : i18nValue;
1819
+ }
1790
1820
  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 });
1821
+ 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
1822
  }
1823
+ __decorate([
1824
+ Proxify(),
1825
+ __metadata("design:type", Object)
1826
+ ], AbstractInputComponent.prototype, "i18n$", null);
1827
+ __decorate([
1828
+ StoreInValueModel(),
1829
+ __metadata("design:type", Object)
1830
+ ], AbstractInputComponent.prototype, "i18n", null);
1793
1831
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractInputComponent, decorators: [{
1794
1832
  type: Component,
1795
1833
  args: [{ template: '' }]
1796
1834
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1797
1835
  type: Inject,
1798
1836
  args: [INPUT_TOKEN_HACK]
1799
- }] }]; }, propDecorators: { label: [{
1837
+ }] }]; }, propDecorators: { i18n$: [{
1838
+ type: Input
1839
+ }], i18n: [{
1800
1840
  type: Input
1841
+ }], _label: [{
1842
+ type: Input,
1843
+ args: ["label"]
1801
1844
  }], userFloatLabel: [{
1802
1845
  type: Input,
1803
1846
  args: ['floatLabel']
1804
- }], hint: [{
1805
- type: Input
1806
- }], placeholder: [{
1807
- type: Input
1847
+ }], _hint: [{
1848
+ type: Input,
1849
+ args: ['hint']
1850
+ }], _placeholder: [{
1851
+ type: Input,
1852
+ args: ['placeholder']
1808
1853
  }], dense: [{
1809
1854
  type: HostBinding,
1810
1855
  args: ['class.dense']
@@ -1847,6 +1892,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1847
1892
  }], notifyFocusOut: [{
1848
1893
  type: HostListener,
1849
1894
  args: ['focusout']
1895
+ }], disabled: [{
1896
+ type: HostBinding,
1897
+ args: ["class.disabled"]
1850
1898
  }] } });
1851
1899
 
1852
1900
  class AbstractListInputComponent extends AbstractInputComponent {
@@ -2084,12 +2132,15 @@ class CheckboxInputComponent extends AbstractValueInputComponent {
2084
2132
  constructor() {
2085
2133
  super();
2086
2134
  }
2135
+ select($event) {
2136
+ this.componentValue$.value = $event.checked;
2137
+ }
2087
2138
  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"] }] });
2139
+ 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
2140
  }
2090
2141
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CheckboxInputComponent, decorators: [{
2091
2142
  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"] }]
2143
+ 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
2144
  }], ctorParameters: function () { return []; }, propDecorators: { color: [{
2094
2145
  type: Input
2095
2146
  }], labelPosition: [{
@@ -2128,7 +2179,7 @@ class MultipleSelectInputComponent extends AbstractListInputComponent {
2128
2179
  const self = this;
2129
2180
  this.registerDisposable(new Binding(this.componentList$, this.ids$, {
2130
2181
  toLeft(selectedItems, currentLeftValue) {
2131
- const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !it);
2182
+ const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !!it);
2132
2183
  // 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
2184
  return newValues.length < 1 && selectedItems.length > 0 ? currentLeftValue : newValues;
2134
2185
  },
@@ -2139,7 +2190,7 @@ class MultipleSelectInputComponent extends AbstractListInputComponent {
2139
2190
  })).writeRight();
2140
2191
  }
2141
2192
  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"] }] });
2193
+ 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
2194
  }
2144
2195
  __decorate([
2145
2196
  Proxify(),
@@ -2167,48 +2218,142 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2167
2218
 
2168
2219
  class NumberInputComponent extends AbstractValueInputComponent {
2169
2220
  autocomplete;
2170
- min = Number.MIN_SAFE_INTEGER;
2171
- max = Number.MAX_SAFE_INTEGER;
2172
- iconPrefix;
2221
+ #min$_accessor_storage = proxify((ValueModel));
2222
+ get min$() { return this.#min$_accessor_storage; }
2223
+ set min$(value) { this.#min$_accessor_storage = value; }
2224
+ #min_accessor_storage = Number.MIN_SAFE_INTEGER;
2225
+ get min() { return this.#min_accessor_storage; }
2226
+ set min(value) { this.#min_accessor_storage = value; }
2227
+ #max$_accessor_storage = proxify((ValueModel));
2228
+ get max$() { return this.#max$_accessor_storage; }
2229
+ set max$(value) { this.#max$_accessor_storage = value; }
2230
+ #max_accessor_storage = Number.MAX_SAFE_INTEGER;
2231
+ get max() { return this.#max_accessor_storage; }
2232
+ set max(value) { this.#max_accessor_storage = value; }
2233
+ incrementCommand;
2234
+ decrementCommand;
2173
2235
  constructor() {
2174
2236
  super();
2237
+ const { chain } = Dsl.disposeWith(this);
2238
+ const normalisedValue$ = chain(this.value$).otherwise(0);
2239
+ this.incrementCommand = Command.create(() => {
2240
+ this.value$.value = normalisedValue$.value + 1;
2241
+ }).enableWhile(chain.numericValue(normalisedValue$).isLessThan(this.max$).and(this.enabled$));
2242
+ this.decrementCommand = Command.create(() => {
2243
+ this.value$.value = normalisedValue$.value - 1;
2244
+ }).enableWhile(chain.numericValue(normalisedValue$).isGreaterThan(this.min$).and(this.enabled$));
2175
2245
  }
2176
2246
  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"] }] });
2247
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: NumberInputComponent, selector: "aup-number-input", inputs: { autocomplete: "autocomplete", min$: "min$", min: "min", max$: "max$", max: "max" }, usesInheritance: true, ngImport: i0, template: "<mat-form-field floatLabel=\"always\">\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n [size]=\"4\">\n <section matIconSuffix>\n <button [pectinCommand]=\"decrementCommand\">-</button>\n <button [pectinCommand]=\"incrementCommand\">+</button>\n </section>\n <mat-hint *ngIf=\"hint && !dense\">{{ hint }}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{ firstError }}</mat-error>\n</mat-form-field>\n", styles: [":host{--width: 56px;--height: 42px;--margin-right: 1px;--border-radius: 3px;--border-color:#d5d5d5;--button-background: #fafafa;--button-background-hover: #efefef}:host input[type=number]{appearance:textfield}:host input[type=number]::-webkit-inner-spin-button,:host input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}:host:focus-within:has(section:not(:focus-within)){--height: 40px;--margin-right: 2px;--border-radius: 2px}:host section[maticonsuffix]{display:flex;flex-direction:row;align-items:stretch;gap:1px;background-color:var(--border-color);border-left:1px solid var(--border-color);width:var(--width);min-width:var(--width);height:var(--height);min-height:var(--height);margin-right:var(--margin-right);border-top-right-radius:var(--border-radius);border-bottom-right-radius:var(--border-radius);overflow:hidden}:host button{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;font-weight:600;border-style:none;background-color:var(--button-background)}:host button:hover{background-color:var(--button-background-hover)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2$4.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i4$2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i4$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "directive", type: FocusBindingDirective, selector: "[pectinFocusBinding]", inputs: ["pectinFocusBinding", "focusBindingTarget"] }] });
2178
2248
  }
2249
+ __decorate([
2250
+ Proxify(),
2251
+ __metadata("design:type", ValueModel)
2252
+ ], NumberInputComponent.prototype, "min$", null);
2253
+ __decorate([
2254
+ StoreInValueModel(),
2255
+ __metadata("design:type", Object)
2256
+ ], NumberInputComponent.prototype, "min", null);
2257
+ __decorate([
2258
+ Proxify(),
2259
+ __metadata("design:type", ValueModel)
2260
+ ], NumberInputComponent.prototype, "max$", null);
2261
+ __decorate([
2262
+ StoreInValueModel(),
2263
+ __metadata("design:type", Object)
2264
+ ], NumberInputComponent.prototype, "max", null);
2179
2265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NumberInputComponent, decorators: [{
2180
2266
  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" }]
2267
+ args: [{ selector: 'aup-number-input', template: "<mat-form-field floatLabel=\"always\">\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [attr.autocomplete]=\"autocomplete\"\n [(ngModel)]=\"componentValue$.value\"\n [disabled]=\"!enabled$.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n [size]=\"4\">\n <section matIconSuffix>\n <button [pectinCommand]=\"decrementCommand\">-</button>\n <button [pectinCommand]=\"incrementCommand\">+</button>\n </section>\n <mat-hint *ngIf=\"hint && !dense\">{{ hint }}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{ firstError }}</mat-error>\n</mat-form-field>\n", styles: [":host{--width: 56px;--height: 42px;--margin-right: 1px;--border-radius: 3px;--border-color:#d5d5d5;--button-background: #fafafa;--button-background-hover: #efefef}:host input[type=number]{appearance:textfield}:host input[type=number]::-webkit-inner-spin-button,:host input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none}:host:focus-within:has(section:not(:focus-within)){--height: 40px;--margin-right: 2px;--border-radius: 2px}:host section[maticonsuffix]{display:flex;flex-direction:row;align-items:stretch;gap:1px;background-color:var(--border-color);border-left:1px solid var(--border-color);width:var(--width);min-width:var(--width);height:var(--height);min-height:var(--height);margin-right:var(--margin-right);border-top-right-radius:var(--border-radius);border-bottom-right-radius:var(--border-radius);overflow:hidden}:host button{flex:1;display:flex;flex-direction:row;align-items:center;justify-content:center;font-weight:600;border-style:none;background-color:var(--button-background)}:host button:hover{background-color:var(--button-background-hover)}\n"] }]
2182
2268
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2183
2269
  type: Input
2270
+ }], min$: [{
2271
+ type: Input
2184
2272
  }], min: [{
2185
2273
  type: Input
2186
- }], max: [{
2274
+ }], max$: [{
2187
2275
  type: Input
2188
- }], iconPrefix: [{
2276
+ }], max: [{
2189
2277
  type: Input
2190
2278
  }] } });
2191
2279
 
2192
2280
  class PasswordInputComponent extends AbstractValueInputComponent {
2193
2281
  autocomplete;
2282
+ #enableShowPassword$_accessor_storage = proxify((ValueModel));
2283
+ get enableShowPassword$() { return this.#enableShowPassword$_accessor_storage; }
2284
+ set enableShowPassword$(value) { this.#enableShowPassword$_accessor_storage = value; }
2285
+ #enableShowPassword_accessor_storage = false;
2286
+ get enableShowPassword() { return this.#enableShowPassword_accessor_storage; }
2287
+ set enableShowPassword(value) { this.#enableShowPassword_accessor_storage = value; }
2288
+ showPassword$ = new MutableValueModel(false);
2289
+ toggleShowPasswordCommand;
2194
2290
  constructor() {
2195
2291
  super();
2292
+ const { chain, valueOf } = Dsl.disposeWith(this);
2293
+ const face$ = chain(this.showPassword$).map(show => {
2294
+ return {
2295
+ icon: () => show ? "mat:visibility_off" : "mat:visibility"
2296
+ };
2297
+ });
2298
+ this.toggleShowPasswordCommand = Command.create(() => {
2299
+ this.showPassword$.value = !this.showPassword$.value;
2300
+ })
2301
+ .withFace(face$)
2302
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2303
+ }
2304
+ get fieldType() {
2305
+ return this.showPassword$.value ? "text" : "password";
2196
2306
  }
2197
2307
  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"] }] });
2308
+ 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
2309
  }
2310
+ __decorate([
2311
+ Proxify(),
2312
+ __metadata("design:type", Object)
2313
+ ], PasswordInputComponent.prototype, "enableShowPassword$", null);
2314
+ __decorate([
2315
+ StoreInValueModel(),
2316
+ __metadata("design:type", Object)
2317
+ ], PasswordInputComponent.prototype, "enableShowPassword", null);
2200
2318
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PasswordInputComponent, decorators: [{
2201
2319
  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" }]
2320
+ 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" }]
2321
+ }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2322
+ type: Input
2323
+ }], enableShowPassword$: [{
2324
+ type: Input
2325
+ }], enableShowPassword: [{
2326
+ type: Input
2327
+ }] } });
2328
+
2329
+ class SearchInputComponent extends AbstractValueInputComponent {
2330
+ autocomplete;
2331
+ clearCommand;
2332
+ constructor() {
2333
+ super();
2334
+ this.dense = true;
2335
+ const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2336
+ this.clearCommand = Command.create(() => {
2337
+ this.componentValue$.value = "";
2338
+ });
2339
+ this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2340
+ }
2341
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2342
+ 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"] }] });
2343
+ }
2344
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, decorators: [{
2345
+ type: Component,
2346
+ 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
2347
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2204
2348
  type: Input
2205
2349
  }] } });
2206
2350
 
2207
2351
  /**
2208
2352
  * Using templates:
2209
- * <aup-select-input [valueModel]="myModel" [options]="myOptions">
2353
+ * <aup-select-input [value$]="myModel" [options]="myOptions">
2210
2354
  * <ng-template #optionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2211
- * <ng-template #nilOptionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2355
+ * <ng-template #selectedOptionTemplate let-option>{{option.thePropertyYouWant}} note, not used for nils (the placeholder is used)</ng-template>
2356
+ * <ng-template #nilOptionTemplate>Uses the placeholder by default but you can customise it</ng-template>
2212
2357
  * </aup-select_input>
2213
2358
  */
2214
2359
  class SelectInputComponent extends AbstractValueInputComponent {
@@ -2233,7 +2378,7 @@ class SelectInputComponent extends AbstractValueInputComponent {
2233
2378
  super();
2234
2379
  const { chain } = Dsl.disposeWith(this);
2235
2380
  this.cookedOptions$ = chain(this.options$)
2236
- .reduceToList(options => {
2381
+ .mapAll(options => {
2237
2382
  return options.length < 1 && !isNil(this.componentValue$.value) ? [this.componentValue$.value] : options;
2238
2383
  }, {
2239
2384
  dependsOn: this.componentValue$
@@ -2272,21 +2417,21 @@ class SelectInputComponent extends AbstractValueInputComponent {
2272
2417
  id: this.delegatedIdentityOf(value)
2273
2418
  });
2274
2419
  let lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2275
- console.log(lastIdSnapshot);
2420
+ // console.log(lastIdSnapshot)
2276
2421
  before(this.options$).changes(() => {
2277
2422
  lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2278
- console.log(lastIdSnapshot);
2423
+ // console.log(lastIdSnapshot)
2279
2424
  });
2280
2425
  when(this.options$).changes((is, was) => {
2281
2426
  const newIdSnapshot = snapshotValueAndId(lastIdSnapshot.value);
2282
- console.log(lastIdSnapshot, newIdSnapshot);
2427
+ // console.log(lastIdSnapshot, newIdSnapshot)
2283
2428
  if (newIdSnapshot !== lastIdSnapshot.id) {
2284
2429
  this.id$.value = this.delegatedIdentityOf(this.componentValue$.value);
2285
2430
  }
2286
2431
  });
2287
2432
  }
2288
2433
  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"] }] });
2434
+ 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
2435
  }
2291
2436
  __decorate([
2292
2437
  Proxify(),
@@ -2298,7 +2443,7 @@ __decorate([
2298
2443
  ], SelectInputComponent.prototype, "options", null);
2299
2444
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputComponent, decorators: [{
2300
2445
  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"] }]
2446
+ 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
2447
  }], ctorParameters: function () { return []; }, propDecorators: { options$: [{
2303
2448
  type: Input
2304
2449
  }], options: [{
@@ -2329,17 +2474,24 @@ class StringInputComponent extends AbstractValueInputComponent {
2329
2474
  get enableClear() { return this.#enableClear_accessor_storage; }
2330
2475
  set enableClear(value) { this.#enableClear_accessor_storage = value; }
2331
2476
  iconPrefix;
2477
+ #suffixCommand_accessor_storage = proxify(Command);
2478
+ get suffixCommand() { return this.#suffixCommand_accessor_storage; }
2479
+ set suffixCommand(value) { this.#suffixCommand_accessor_storage = value; }
2332
2480
  clearCommand;
2333
2481
  constructor() {
2334
2482
  super();
2335
2483
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2336
2484
  this.clearCommand = Command.create(() => {
2337
2485
  this.componentValue$.value = "";
2338
- });
2339
- this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2486
+ })
2487
+ .withFace({ icon: () => "mat:clear" })
2488
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2489
+ }
2490
+ get hasSuffixCommand() {
2491
+ return Proxify.hasTarget(this.suffixCommand);
2340
2492
  }
2341
2493
  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"] }] });
2494
+ 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
2495
  }
2344
2496
  __decorate([
2345
2497
  Proxify(),
@@ -2349,9 +2501,13 @@ __decorate([
2349
2501
  StoreInValueModel(),
2350
2502
  __metadata("design:type", Object)
2351
2503
  ], StringInputComponent.prototype, "enableClear", null);
2504
+ __decorate([
2505
+ Proxify(),
2506
+ __metadata("design:type", Command)
2507
+ ], StringInputComponent.prototype, "suffixCommand", null);
2352
2508
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputComponent, decorators: [{
2353
2509
  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"] }]
2510
+ 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
2511
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2356
2512
  type: Input
2357
2513
  }], enableClear$: [{
@@ -2360,6 +2516,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2360
2516
  type: Input
2361
2517
  }], iconPrefix: [{
2362
2518
  type: Input
2519
+ }], suffixCommand: [{
2520
+ type: Input
2363
2521
  }] } });
2364
2522
 
2365
2523
  class TextInputComponent extends AbstractValueInputComponent {
@@ -2547,7 +2705,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2547
2705
  * </aup-switch-case>
2548
2706
  */
2549
2707
  class SwitchCaseComponent extends DisposableComponent {
2550
- cdr;
2551
2708
  #switch$_accessor_storage = proxify((ValueModel));
2552
2709
  get switch$() { return this.#switch$_accessor_storage; }
2553
2710
  set switch$(value) { this.#switch$_accessor_storage = value; }
@@ -2556,9 +2713,8 @@ class SwitchCaseComponent extends DisposableComponent {
2556
2713
  set switch(value) { this.#switch_accessor_storage = value; }
2557
2714
  switchCaseOptions;
2558
2715
  selectedIndex = 0;
2559
- constructor(cdr) {
2716
+ constructor() {
2560
2717
  super();
2561
- this.cdr = cdr;
2562
2718
  }
2563
2719
  ngAfterContentInit() {
2564
2720
  const subscription = this.switchCaseOptions.changes.subscribe(change => this.updateSelection());
@@ -2595,8 +2751,8 @@ class SwitchCaseComponent extends DisposableComponent {
2595
2751
  this.selectedIndex = -1;
2596
2752
  }
2597
2753
  }
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"] }] });
2754
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2755
+ 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
2756
  }
2601
2757
  __decorate([
2602
2758
  Proxify(),
@@ -2609,7 +2765,7 @@ __decorate([
2609
2765
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, decorators: [{
2610
2766
  type: Component,
2611
2767
  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$: [{
2768
+ }], ctorParameters: function () { return []; }, propDecorators: { switch$: [{
2613
2769
  type: Input
2614
2770
  }], switch: [{
2615
2771
  type: Input
@@ -2619,6 +2775,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2619
2775
  }] } });
2620
2776
 
2621
2777
  const HEADER_CELL_RENDERER_PORTAL = Symbol('aup-cell-header-renderer-component-ref');
2778
+ const FOOTER_CELL_RENDERER_PORTAL = Symbol('aup-cell-footer-renderer-component-ref');
2622
2779
  const CELL_RENDERER_PORTAL = Symbol('aup-cell-renderer-component-ref');
2623
2780
  const CELL_EDITOR_PORTAL = Symbol('aup-cell-editor-component-ref');
2624
2781
  const PORTAL_RENDERER_COMPONENT = Symbol('aup-cell-renderer-portal-component');
@@ -2716,6 +2873,23 @@ class TemplateCellRendererPortalRef extends CellRendererPortalRef {
2716
2873
  return new TemplatePortal(this.templateRef, this.viewContainer, { ...(data), $implicit: data.row });
2717
2874
  }
2718
2875
  }
2876
+ class CellFooterPortalRef extends CellPortalRef {
2877
+ componentType;
2878
+ initialiseHeader;
2879
+ constructor(componentType, initialiseHeader) {
2880
+ super();
2881
+ this.componentType = componentType;
2882
+ this.initialiseHeader = initialiseHeader;
2883
+ }
2884
+ initialiseHost(host, columnModel) {
2885
+ assert$1.isTruthy(host);
2886
+ host[HEADER_CELL_RENDERER_PORTAL] = new ComponentPortal(this.componentType);
2887
+ }
2888
+ // @Trace()
2889
+ onPortalAttached(host, portalComponent) {
2890
+ this.initialiseHeader(portalComponent, host.column);
2891
+ }
2892
+ }
2719
2893
 
2720
2894
  class ColumnTextSearchFormatter {
2721
2895
  }
@@ -2806,6 +2980,7 @@ class ColumnTextSearchWrapper extends ColumnTextSearchFormatter.Delegate {
2806
2980
  }
2807
2981
  class ColumnModel extends GarbageCollector {
2808
2982
  columnId;
2983
+ order;
2809
2984
  textPropertiesProvider;
2810
2985
  _columnTextProperties;
2811
2986
  _columnHeaderPortalRef;
@@ -2819,9 +2994,10 @@ class ColumnModel extends GarbageCollector {
2819
2994
  dasherisedColumnId;
2820
2995
  textSearchDelegate = new ColumnTextSearchWrapper();
2821
2996
  visible$;
2822
- constructor(columnId, textPropertiesProvider) {
2997
+ constructor(columnId, order, textPropertiesProvider) {
2823
2998
  super();
2824
2999
  this.columnId = columnId;
3000
+ this.order = order;
2825
3001
  this.textPropertiesProvider = textPropertiesProvider;
2826
3002
  const { valueOf } = Dsl.disposeWith(this);
2827
3003
  this.installHeaderRenderer();
@@ -2866,6 +3042,14 @@ class ColumnModel extends GarbageCollector {
2866
3042
  this._columnTextProperties = columnTextProperties;
2867
3043
  return this;
2868
3044
  }
3045
+ positionAfter(column) {
3046
+ this.order.position(this, { after: column });
3047
+ return this;
3048
+ }
3049
+ positionBefore(column) {
3050
+ this.order.position(this, { before: column });
3051
+ return this;
3052
+ }
2869
3053
  getSearchTextFor(row) {
2870
3054
  return this.textSearchDelegate.format(row);
2871
3055
  }
@@ -2967,8 +3151,8 @@ __decorate([
2967
3151
 
2968
3152
  class CustomTemplateColumnModel extends ColumnModel {
2969
3153
  config = new TemplateCellRendererPortalRef();
2970
- constructor(columnId, defaults) {
2971
- super(columnId, defaults);
3154
+ constructor(columnId, order, defaults) {
3155
+ super(columnId, order, defaults);
2972
3156
  this.configureCellRenderer(this.config);
2973
3157
  }
2974
3158
  setTemplate(templateRef, viewContainer, fillCell, padChild) {
@@ -3046,12 +3230,17 @@ class AbstractTableComponent extends DisposableComponent {
3046
3230
  #showHeader_accessor_storage = true;
3047
3231
  get showHeader() { return this.#showHeader_accessor_storage; }
3048
3232
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
3233
+ #enableScrolling$_accessor_storage = proxify((ValueModel));
3049
3234
  /**
3050
3235
  * Set to true to enable scrolling. Once enabled the table will have 0 implicit height. You will either
3051
3236
  * need to set it explicitly e.g. height: 400px; or by using flex or grid layout to make it fill it's
3052
3237
  * containment area.
3053
3238
  */
3054
- enableScrolling = false;
3239
+ get enableScrolling$() { return this.#enableScrolling$_accessor_storage; }
3240
+ set enableScrolling$(value) { this.#enableScrolling$_accessor_storage = value; }
3241
+ #enableScrolling_accessor_storage = false;
3242
+ get enableScrolling() { return this.#enableScrolling_accessor_storage; }
3243
+ set enableScrolling(value) { this.#enableScrolling_accessor_storage = value; }
3055
3244
  columns;
3056
3245
  columnIds;
3057
3246
  columnsById;
@@ -3070,7 +3259,6 @@ class AbstractTableComponent extends DisposableComponent {
3070
3259
  super();
3071
3260
  this.injector = injector;
3072
3261
  const { chain, when } = Dsl.disposeWith(this);
3073
- this._visibleRows$.setDelegate(this._dataSource$);
3074
3262
  when(chain(this._dataSource$).first()).becomesTruthy(it => {
3075
3263
  if (it === this.identityOf(it)) {
3076
3264
  console.warn("Table model identity function is using reference equality. This can cause lots of table re-rendering", {
@@ -3089,7 +3277,7 @@ class AbstractTableComponent extends DisposableComponent {
3089
3277
  if (!model) {
3090
3278
  lang$1.illegalState("aup-table tableModel is nil");
3091
3279
  }
3092
- this.columnsById = chain(model.columns).indexBy('columnId');
3280
+ this.columnsById = chain(model.columns$).indexBy('columnId');
3093
3281
  this._dataSource$.setDelegate(model.dataSource$);
3094
3282
  model.initialise(this.injector, (row) => this.identityOf(row));
3095
3283
  }
@@ -3106,7 +3294,7 @@ class AbstractTableComponent extends DisposableComponent {
3106
3294
  }
3107
3295
  }
3108
3296
  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 });
3297
+ 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
3298
  }
3111
3299
  __decorate([
3112
3300
  Proxify(),
@@ -3116,6 +3304,14 @@ __decorate([
3116
3304
  StoreInValueModel(),
3117
3305
  __metadata("design:type", Object)
3118
3306
  ], AbstractTableComponent.prototype, "showHeader", null);
3307
+ __decorate([
3308
+ Proxify(),
3309
+ __metadata("design:type", ValueModel)
3310
+ ], AbstractTableComponent.prototype, "enableScrolling$", null);
3311
+ __decorate([
3312
+ StoreInValueModel(),
3313
+ __metadata("design:type", Boolean)
3314
+ ], AbstractTableComponent.prototype, "enableScrolling", null);
3119
3315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractTableComponent, decorators: [{
3120
3316
  type: Component,
3121
3317
  args: [{
@@ -3126,6 +3322,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
3126
3322
  type: Input
3127
3323
  }], showHeader: [{
3128
3324
  type: Input
3325
+ }], enableScrolling$: [{
3326
+ type: Input
3129
3327
  }], enableScrolling: [{
3130
3328
  type: Input
3131
3329
  }], baseCssClass: [{
@@ -3186,6 +3384,8 @@ class EditSession extends GarbageCollector {
3186
3384
  // console.warn()
3187
3385
  // }
3188
3386
  this._liveRowValue$.value = produce(this._liveRowValue$.value, draft => {
3387
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3388
+ // @ts-ignore
3189
3389
  this.form.writeDirtyStateTo(draft);
3190
3390
  });
3191
3391
  });
@@ -3288,11 +3488,11 @@ class DefaultCellRendererComponent {
3288
3488
  return this._value;
3289
3489
  }
3290
3490
  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" }] });
3491
+ 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
3492
  }
3293
3493
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DefaultCellRendererComponent, decorators: [{
3294
3494
  type: Component,
3295
- args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n" }]
3495
+ args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value?.toString()| aupHighlight\"></span>\n" }]
3296
3496
  }], propDecorators: { value: [{
3297
3497
  type: Input
3298
3498
  }] } });
@@ -3308,7 +3508,8 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3308
3508
  super();
3309
3509
  this.selectCommand = Command.create(() => {
3310
3510
  this.selectionModel.toggleAllCommand.execute();
3311
- });
3511
+ }).visibleWhile(this.selectionModel.toggleAllCommand.visible$)
3512
+ .enableWhile(this.selectionModel.toggleAllCommand.enabled$);
3312
3513
  }
3313
3514
  isSelected() {
3314
3515
  return this.ifMultiSelectionModel(m => m.allSelected$.value, false);
@@ -3336,7 +3537,7 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3336
3537
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionHeaderCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3337
3538
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionHeaderCellComponent, selector: "aup-selection-header-cell", providers: [
3338
3539
  { 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"] }] });
3540
+ ], 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
3541
  }
3341
3542
  __decorate([
3342
3543
  Proxify(),
@@ -3369,7 +3570,7 @@ class SelectionCellComponent extends DisposableComponent {
3369
3570
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
3370
3571
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionCellComponent, selector: "aup-selection-cell", inputs: { row: "row" }, providers: [
3371
3572
  { 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"] }] });
3573
+ ], 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
3574
  }
3374
3575
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, decorators: [{
3375
3576
  type: Component,
@@ -3430,25 +3631,14 @@ class Bounds extends Dimension {
3430
3631
  })(Bounds || (Bounds = {}));
3431
3632
 
3432
3633
  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
- }
3634
+ elementRef = this.inject(ElementRef);
3635
+ ngZone = this.inject(NgZone);
3636
+ boundsTracker = new ResizeAwareComponent.ResizeTracker(this.elementRef, this.ngZone);
3441
3637
  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());
3638
+ this.boundsTracker.notifyViewReady();
3449
3639
  }
3450
3640
  get bounds$() {
3451
- return this._bounds$.readonly$;
3641
+ return this.boundsTracker.bounds$;
3452
3642
  }
3453
3643
  get nativeElement() {
3454
3644
  return this.elementRef.nativeElement;
@@ -3458,57 +3648,160 @@ class ResizeAwareComponent extends DisposableComponent {
3458
3648
  return this.bounds.relativePositionOf(point);
3459
3649
  }
3460
3650
  get bounds() {
3461
- return this._bounds$.value;
3462
- }
3463
- _updateBounds() {
3464
- this._bounds$.value = Bounds.ofElement(this.nativeElement);
3651
+ return this.bounds$.value;
3465
3652
  }
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 });
3653
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
3467
3654
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ResizeAwareComponent, usesInheritance: true, ngImport: i0 });
3468
3655
  }
3469
3656
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, decorators: [{
3470
3657
  type: Directive
3471
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; } });
3658
+ }] });
3659
+ (function (ResizeAwareComponent) {
3660
+ class ResizeTracker extends GarbageCollector {
3661
+ elementRef;
3662
+ ngZone;
3663
+ _bounds$ = new MutableValueModel(new Bounds(0, 0, 0, 0));
3664
+ width$;
3665
+ height$;
3666
+ top$;
3667
+ left$;
3668
+ bottom$;
3669
+ right$;
3670
+ constructor(elementRef, ngZone) {
3671
+ super();
3672
+ this.elementRef = elementRef;
3673
+ this.ngZone = ngZone;
3674
+ const { chain } = Dsl.disposeWith(this);
3675
+ this.width$ = chain(this.bounds$).pluck("width");
3676
+ this.height$ = chain(this.bounds$).pluck("height");
3677
+ this.top$ = chain(this.bounds$).pluck("top");
3678
+ this.left$ = chain(this.bounds$).pluck("left");
3679
+ this.bottom$ = chain.numericValue(this.top$).add(this.height$);
3680
+ this.right$ = chain.numericValue(this.left$).add(this.width$);
3681
+ }
3682
+ notifyViewReady() {
3683
+ const element = this.elementRef.nativeElement;
3684
+ const ro = new ResizeObserver((entries, observer) => {
3685
+ this.ngZone.run(() => this._updateBounds());
3686
+ });
3687
+ ro.observe(element);
3688
+ this.onDispose(() => ro.disconnect());
3689
+ setTimeout(() => this._updateBounds());
3690
+ }
3691
+ get bounds$() {
3692
+ return this._bounds$.readonly$;
3693
+ }
3694
+ get nativeElement() {
3695
+ return this.elementRef.nativeElement;
3696
+ }
3697
+ // TODO: Make this handle body scroll
3698
+ relativePositionOf(point) {
3699
+ return this.bounds.relativePositionOf(point);
3700
+ }
3701
+ get bounds() {
3702
+ return this._bounds$.value;
3703
+ }
3704
+ _updateBounds() {
3705
+ this._bounds$.value = Bounds.ofElement(this.nativeElement);
3706
+ }
3707
+ }
3708
+ ResizeAwareComponent.ResizeTracker = ResizeTracker;
3709
+ })(ResizeAwareComponent || (ResizeAwareComponent = {}));
3472
3710
 
3473
- class ColumnListModel extends AbstractComputedListModel {
3474
- _allColumns$ = new MutableListModel();
3475
- columnsById$;
3711
+ var ColumnOrderManager;
3712
+ (function (ColumnOrderManager) {
3713
+ function processPosition(position, callback) {
3714
+ if (position) {
3715
+ const keys = Object.keys(position);
3716
+ if (keys.includes("before")) {
3717
+ return position["before"] ? callback.before(position["before"]) : callback.first();
3718
+ }
3719
+ else {
3720
+ return position["after"] ? callback.after(position["after"]) : callback.last();
3721
+ }
3722
+ }
3723
+ else {
3724
+ return callback.last();
3725
+ }
3726
+ }
3727
+ ColumnOrderManager.processPosition = processPosition;
3728
+ })(ColumnOrderManager || (ColumnOrderManager = {}));
3729
+
3730
+ class ColumnRef {
3731
+ column;
3732
+ position;
3733
+ constructor(column, position) {
3734
+ this.column = column;
3735
+ this.position = position;
3736
+ }
3737
+ }
3738
+ class ColumnManager extends GarbageCollector {
3739
+ _columnRefs$ = new MutableListModel();
3740
+ orderedColumnRefs$;
3741
+ _columnsById$;
3742
+ allColumns$;
3743
+ columnVisibilities$ = new WatchList();
3744
+ visibleColumns$;
3476
3745
  constructor() {
3477
3746
  super();
3478
3747
  const { chain } = Dsl.disposeWith(this);
3479
- this.columnsById$ = chain(this._allColumns$).indexBy('columnId');
3748
+ this.orderedColumnRefs$ = chain(this._columnRefs$).orderBy("position", "asc");
3749
+ this.allColumns$ = this.orderedColumnRefs$.pluck("column");
3750
+ this._columnsById$ = chain(this.allColumns$).indexBy('columnId');
3751
+ this.visibleColumns$ = chain(this.allColumns$).select(it => it.visible$.value, {
3752
+ dependsOn: this.columnVisibilities$
3753
+ });
3480
3754
  }
3481
- get allColumns$() {
3482
- return this._allColumns$.readonly$;
3755
+ position(column, newPosition) {
3756
+ const target = this._columnRefs$.query().findMatching(it => it.column === column);
3757
+ const position = this.computePosition(newPosition);
3758
+ this._columnRefs$.replace(target, { with: new ColumnRef(target.column, position) });
3483
3759
  }
3484
3760
  getColumn(id) {
3485
- return this.columnsById$.get(id);
3761
+ return this._columnsById$.get(id);
3486
3762
  }
3487
3763
  hasColumn(id) {
3488
- return !!this.columnsById$.get(id);
3764
+ return !!this._columnsById$.get(id);
3489
3765
  }
3490
3766
  hasMatchingColumn(row, regex) {
3491
3767
  // only search the visible columns
3492
- return !!this.value.find(c => regex.test(c.getSearchTextFor(row)));
3768
+ return !!this.visibleColumns$.value.find(c => regex.test(c.getSearchTextFor(row)));
3493
3769
  }
3494
- addColumn(column, index) {
3770
+ addColumn(column, position) {
3495
3771
  if (this.hasColumn(column.columnId)) {
3496
3772
  lang.illegalState(`Column with id=${column.columnId} already exists`);
3497
3773
  }
3498
3774
  this.registerDisposable(column);
3499
- this.runInTransaction(() => {
3500
- if (!isNil(index)) {
3501
- this._allColumns$.insert(index, column);
3502
- }
3503
- else {
3504
- this._allColumns$.push(column);
3775
+ this._columnRefs$.push(new ColumnRef(column, this.computePosition(position)));
3776
+ this.columnVisibilities$.add(column.visible$);
3777
+ return column;
3778
+ }
3779
+ computePosition(position) {
3780
+ const q = this.orderedColumnRefs$.query();
3781
+ return ColumnOrderManager.processPosition(position, {
3782
+ before(col) {
3783
+ const index = q.findIndex(ref => ref.column === col);
3784
+ const beforeCol = q.value[index];
3785
+ const afterCol = index - 1 >= 0 ? q.value[index - 1] : undefined;
3786
+ return generateKeyBetween(afterCol?.position, beforeCol.position);
3787
+ },
3788
+ after(col) {
3789
+ const index = q.findIndex(ref => ref.column === col);
3790
+ const afterCol = q.value[index];
3791
+ const beforeCol = index + 1 < q.length ? q.value[index + 1] : undefined;
3792
+ return generateKeyBetween(afterCol.position, beforeCol?.position);
3793
+ },
3794
+ first() {
3795
+ return generateKeyBetween(null, q.first()?.position);
3796
+ },
3797
+ last() {
3798
+ // add it to the end of the list
3799
+ return generateKeyBetween(q.last()?.position, null);
3505
3800
  }
3506
- this.registerDisposable(this.trackSource(column.visible$));
3507
3801
  });
3508
- return column;
3509
3802
  }
3510
3803
  doComputeValue() {
3511
- return this._allColumns$.value.filter(c => c.visible$.value);
3804
+ return this.allColumns$.value.filter(c => c.visible$.value);
3512
3805
  }
3513
3806
  }
3514
3807
 
@@ -3542,8 +3835,8 @@ function EnableCellTextSearch(options) {
3542
3835
 
3543
3836
  class CustomValueColumnModel extends ColumnModel {
3544
3837
  getValue;
3545
- constructor(columnId, defaults, getValue) {
3546
- super(columnId, defaults);
3838
+ constructor(columnId, order, defaults, getValue) {
3839
+ super(columnId, order, defaults);
3547
3840
  this.getValue = getValue;
3548
3841
  this.cellRenderer(DefaultCellRendererComponent);
3549
3842
  }
@@ -3551,17 +3844,17 @@ class CustomValueColumnModel extends ColumnModel {
3551
3844
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => new ColumnTextSearchFormatter.Null()), row => this.getValue(row));
3552
3845
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3553
3846
  if (firstTime) {
3554
- if (isFunction$1(onComponentInitOrOptions)) {
3847
+ if (isFunction(onComponentInitOrOptions)) {
3555
3848
  onComponentInitOrOptions(component);
3556
3849
  }
3557
3850
  else {
3558
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3851
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3559
3852
  onComponentInitOrOptions.onComponentInit(component);
3560
3853
  }
3561
3854
  }
3562
3855
  }
3563
3856
  component.value = this.getValue(rowData.row);
3564
- if (!isFunction$1(onComponentInitOrOptions) && isFunction$1(onComponentInitOrOptions?.onRowUpdate)) {
3857
+ if (!isFunction(onComponentInitOrOptions) && isFunction(onComponentInitOrOptions?.onRowUpdate)) {
3565
3858
  onComponentInitOrOptions.onRowUpdate(component, rowData.row);
3566
3859
  }
3567
3860
  }));
@@ -3573,8 +3866,8 @@ class CustomValueColumnModel extends ColumnModel {
3573
3866
  }
3574
3867
 
3575
3868
  class EditorControlColumnModel extends ColumnModel {
3576
- constructor(columnId, saveCommandFactory, defaults) {
3577
- super(columnId, defaults);
3869
+ constructor(columnId, order, saveCommandFactory, defaults) {
3870
+ super(columnId, order, defaults);
3578
3871
  this.cellRenderer(EditRowControlsComponent);
3579
3872
  }
3580
3873
  cellRenderer(componentType) {
@@ -3599,8 +3892,8 @@ class ListPropertyColumnModel extends ColumnModel {
3599
3892
  intermediate.map(v => v?.toString()).join(", ") :
3600
3893
  intermediate?.toString();
3601
3894
  };
3602
- constructor(id, property, defaults) {
3603
- super(id, defaults);
3895
+ constructor(id, order, property, defaults) {
3896
+ super(id, order, defaults);
3604
3897
  this.property = property;
3605
3898
  this.cellRenderer(DefaultCellRendererComponent);
3606
3899
  }
@@ -3616,7 +3909,7 @@ class ListPropertyColumnModel extends ColumnModel {
3616
3909
  }
3617
3910
  cellEditor(editor, validatorsOrInitialiser, initialiseComponent) {
3618
3911
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3619
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3912
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3620
3913
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3621
3914
  const formListModel = editSession.form.pluckList(this.property);
3622
3915
  if (validators) {
@@ -3645,8 +3938,8 @@ class PropertyColumnModel extends ColumnModel {
3645
3938
  _defaultSearchTextFormatter = (value) => {
3646
3939
  return (this._userFormat ?? Functions.identity)(value)?.toString();
3647
3940
  };
3648
- constructor(id, property, defaults) {
3649
- super(id, defaults);
3941
+ constructor(id, order, property, defaults) {
3942
+ super(id, order, defaults);
3650
3943
  this.property = property;
3651
3944
  this.cellRenderer(DefaultCellRendererComponent);
3652
3945
  }
@@ -3654,11 +3947,11 @@ class PropertyColumnModel extends ColumnModel {
3654
3947
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => ColumnTextSearchFormatter.forFormatter(this._defaultSearchTextFormatter)), row => row[this.property]);
3655
3948
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3656
3949
  if (firstTime) {
3657
- if (isFunction$1(onComponentInitOrOptions)) {
3950
+ if (isFunction(onComponentInitOrOptions)) {
3658
3951
  onComponentInitOrOptions(component);
3659
3952
  }
3660
3953
  else {
3661
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3954
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3662
3955
  onComponentInitOrOptions.onComponentInit(component);
3663
3956
  }
3664
3957
  }
@@ -3683,7 +3976,7 @@ class PropertyColumnModel extends ColumnModel {
3683
3976
  component[ColumnModel.CELL_RENDERER_COMPONENT_ROW_CACHE] = rowData.row;
3684
3977
  let disableEditCallback = false;
3685
3978
  if (firstTime) {
3686
- if (isFunction$1(options?.onComponentInit)) {
3979
+ if (isFunction(options?.onComponentInit)) {
3687
3980
  options.onComponentInit(component);
3688
3981
  }
3689
3982
  // install our edit callback
@@ -3698,7 +3991,7 @@ class PropertyColumnModel extends ColumnModel {
3698
3991
  disableEditCallback = true;
3699
3992
  component.value = rowData.row[this.property];
3700
3993
  disableEditCallback = false;
3701
- if (!isFunction$1(options) && isFunction$1(options?.onRowUpdate)) {
3994
+ if (!isFunction(options) && isFunction(options?.onRowUpdate)) {
3702
3995
  options.onRowUpdate(component, rowData.row);
3703
3996
  }
3704
3997
  }));
@@ -3706,7 +3999,7 @@ class PropertyColumnModel extends ColumnModel {
3706
3999
  }
3707
4000
  cellEditor(editor, validatorsOrInitialiser, onComponentInit) {
3708
4001
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3709
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
4002
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
3710
4003
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3711
4004
  const formValueModel = editSession.form.pluck(this.property);
3712
4005
  if (validators) {
@@ -3733,8 +4026,8 @@ class SelectionColumnModel extends ColumnModel {
3733
4026
  selectionModel;
3734
4027
  _enableHeaderControls = true;
3735
4028
  _color = "accent";
3736
- constructor(columnId, defaults, selectionModel) {
3737
- super(columnId, defaults);
4029
+ constructor(columnId, order, defaults, selectionModel) {
4030
+ super(columnId, order, defaults);
3738
4031
  this.selectionModel = selectionModel;
3739
4032
  const { chain } = Dsl.disposeWith(this);
3740
4033
  this._selectRowOnClick(false);
@@ -3775,6 +4068,42 @@ class SelectionColumnModel extends ColumnModel {
3775
4068
  }
3776
4069
  }
3777
4070
 
4071
+ let RowClass$1 = class RowClass {
4072
+ className;
4073
+ matches;
4074
+ constructor(className, matches) {
4075
+ this.className = className;
4076
+ this.matches = matches;
4077
+ }
4078
+ };
4079
+ class FooterRowModel {
4080
+ _rowClasses = [];
4081
+ noPadding() {
4082
+ this.addClass("no-padding");
4083
+ }
4084
+ addClass(className, condition) {
4085
+ this._rowClasses.push(new RowClass$1(className, condition ?? (() => true)));
4086
+ }
4087
+ }
4088
+ (function (FooterRowModel) {
4089
+ class Impl extends FooterRowModel {
4090
+ component;
4091
+ onInit;
4092
+ portal;
4093
+ constructor(component, onInit) {
4094
+ super();
4095
+ this.component = component;
4096
+ this.onInit = onInit;
4097
+ this.portal = new ComponentPortal(component);
4098
+ }
4099
+ getActiveRowClasses() {
4100
+ return this._rowClasses.filter(c => c.matches()).map(c => c.className).join(" ");
4101
+ }
4102
+ }
4103
+ FooterRowModel.Impl = Impl;
4104
+ })(FooterRowModel || (FooterRowModel = {}));
4105
+ ProxyRegistry.registerOneTimeBinding(FooterRowModel);
4106
+
3778
4107
  class TableMoreMenuComponent extends DisposableComponent {
3779
4108
  value$ = new MutableValueModel();
3780
4109
  #value_accessor_storage;
@@ -3784,13 +4113,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3784
4113
  popupType$ = new MutableValueModel();
3785
4114
  popupComponentPortal$;
3786
4115
  _visible$ = this.registerDisposable(new DelegatingValueModel());
4116
+ initialiseCallback;
3787
4117
  constructor() {
3788
4118
  super();
3789
4119
  const { chain } = Dsl.disposeWith(this);
3790
4120
  this.popupComponentPortal$ = chain(this.popupType$).map(type => new ComponentPortal(type));
3791
4121
  }
3792
- configurePopupComponentType(popupComponentType) {
4122
+ configurePopupComponentType(popupComponentType, configureCallback) {
3793
4123
  this.popupType$.value = popupComponentType;
4124
+ this.initialiseCallback = configureCallback;
3794
4125
  }
3795
4126
  // Stops tree selection when clicking the menu button
3796
4127
  preventDefault($event) {
@@ -3801,12 +4132,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3801
4132
  const component = $event.instance;
3802
4133
  component.initialise(this.value$, Command.create(() => this.matMenuTrigger.closeMenu()));
3803
4134
  this._visible$.setDelegate(component.visible$);
4135
+ if (this.initialiseCallback) {
4136
+ this.initialiseCallback(component);
4137
+ }
3804
4138
  }
3805
4139
  get visible$() {
3806
4140
  return this._visible$.readonly$;
3807
4141
  }
3808
4142
  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"] }] });
4143
+ 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
4144
  }
3811
4145
  __decorate([
3812
4146
  StoreInValueModel(),
@@ -3835,16 +4169,25 @@ class RowClass {
3835
4169
  this.matches = matches;
3836
4170
  }
3837
4171
  }
4172
+ class RowAttribute {
4173
+ attributeName;
4174
+ getValue;
4175
+ constructor(attributeName, getValue) {
4176
+ this.attributeName = attributeName;
4177
+ this.getValue = getValue;
4178
+ }
4179
+ }
3838
4180
  class AbstractTableModel extends GarbageCollector {
3839
4181
  _dataSource$ = this.registerDisposable(new DelegatingListModel());
3840
4182
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
3841
4183
  _visibleRows$ = this.registerDisposable(new DelegatingListModel());
3842
- _columnList = this.registerDisposable(new ColumnListModel());
4184
+ columnManager = this.registerDisposable(new ColumnManager());
3843
4185
  _editorSessions = new MutableListModel();
3844
4186
  _rowsBeingEdited$;
3845
4187
  saveCommandFactory;
3846
4188
  _editorSessionByRowId;
3847
4189
  rowClassNamePredicates = [];
4190
+ rowAttributeGenerators = [];
3848
4191
  _columnTextPropertiesLookup;
3849
4192
  editing$;
3850
4193
  firstEditableColumn$;
@@ -3861,6 +4204,7 @@ class AbstractTableModel extends GarbageCollector {
3861
4204
  selectedItems$;
3862
4205
  leadSelection$;
3863
4206
  hasSelection$;
4207
+ footerRowModel;
3864
4208
  constructor() {
3865
4209
  super();
3866
4210
  const { chain } = Dsl.disposeWith(this);
@@ -3869,15 +4213,15 @@ class AbstractTableModel extends GarbageCollector {
3869
4213
  });
3870
4214
  this._editorSessionByRowId = chain(this._editorSessions).indexBy("rowId");
3871
4215
  this.editing$ = chain(this._editorSessions).count().isGreaterThan(0);
3872
- this.textSearchPredicate$ = chain(this.visibleColumns).reduce(columns => {
4216
+ this.textSearchPredicate$ = chain(this.visibleColumns$).reduceAll(columns => {
3873
4217
  return (row, regex) => {
3874
4218
  return (!regex || !!columns.find(c => regex.test(c.getSearchTextFor(row))));
3875
4219
  };
3876
4220
  });
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);
4221
+ this.firstEditableColumn$ = chain(this.columns$).select(c => c.hasEditorPortal()).first();
4222
+ this.firstVisibleColumn$ = chain(this.visibleColumns$).first();
4223
+ this.lastVisibleColumn$ = chain(this.visibleColumns$).last();
4224
+ this.rowSelectionDisabledOnAllColumns$ = chain(this.columnManager.visibleColumns$).select(column => column.isRowSelectionEnabled()).count().equals(0);
3881
4225
  this.dataSourceEmpty$ = chain(this.dataSource$).isEmpty();
3882
4226
  this.selectedItems$ = this.selectionModelProxy.selectedItems$;
3883
4227
  this.leadSelection$ = this.selectionModelProxy.leadSelection$;
@@ -3901,7 +4245,7 @@ class AbstractTableModel extends GarbageCollector {
3901
4245
  ],
3902
4246
  parent: injector
3903
4247
  });
3904
- this.columns.value.forEach(c => c.initialise(customInjector));
4248
+ this.columns$.value.forEach(c => c.initialise(customInjector));
3905
4249
  this.identityOf = identityOf;
3906
4250
  }
3907
4251
  get dataSource$() {
@@ -3954,19 +4298,19 @@ class AbstractTableModel extends GarbageCollector {
3954
4298
  });
3955
4299
  });
3956
4300
  }
3957
- get columns() {
3958
- return this._columnList.allColumns$;
4301
+ get columns$() {
4302
+ return this.columnManager.allColumns$;
3959
4303
  }
3960
- get visibleColumns() {
3961
- return this._columnList.readonly$;
4304
+ get visibleColumns$() {
4305
+ return this.columnManager.visibleColumns$;
3962
4306
  }
3963
4307
  pluck(property, options) {
3964
4308
  const columnId = options?.columnId || property.toString();
3965
- return this.addColumn(new PropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4309
+ return this.addColumn(new PropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3966
4310
  }
3967
4311
  pluckList(property, options) {
3968
4312
  const columnId = options?.columnId || property.toString();
3969
- return this.addColumn(new ListPropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4313
+ return this.addColumn(new ListPropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3970
4314
  }
3971
4315
  // TODO: clean this up and assign the selection model on teh table directly.
3972
4316
  // tableModel.useSelectionModel(model) and have the seleciton column automatically
@@ -3975,44 +4319,52 @@ class AbstractTableModel extends GarbageCollector {
3975
4319
  _addSelectionColumn(selectionModel, visible) {
3976
4320
  assert.isNil(this.selectionColumnModel);
3977
4321
  const columnId = "selection-column";
3978
- this.selectionColumnModel = new SelectionColumnModel(columnId, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
4322
+ this.selectionColumnModel = new SelectionColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
3979
4323
  this.selectionColumnModel.useSelectionModel(selectionModel);
3980
4324
  this.addRowClass("aup-row-selected", row => this.selectionColumnModel.isSelected(row));
3981
- const selectionColumnModel = this.addColumn(this.selectionColumnModel, 0);
3982
- if (!isNil$1(visible)) {
4325
+ const selectionColumnModel = this.addColumn(this.selectionColumnModel, { before: null }); // first column
4326
+ if (!isNil(visible)) {
3983
4327
  selectionColumnModel.visibleWhile(visible instanceof ValueModel ? visible : ValueModel.constant(visible));
3984
4328
  }
3985
4329
  return selectionColumnModel;
3986
4330
  }
3987
4331
  addEditControls(saveCommandFactory, formFactory) {
3988
4332
  this.saveCommandFactory = saveCommandFactory;
3989
- if (isFunction$1(formFactory)) {
4333
+ if (isFunction(formFactory)) {
3990
4334
  this._createForm = formFactory;
3991
4335
  }
3992
4336
  const columnId = "editControls";
3993
- return this.addColumn(new EditorControlColumnModel(columnId, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
4337
+ return this.addColumn(new EditorControlColumnModel(columnId, this.columnManager, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
3994
4338
  }
3995
4339
  addCustomColumn(columnId, dataAccessor) {
3996
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), dataAccessor));
4340
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), dataAccessor));
3997
4341
  }
3998
4342
  addComponentColumn(columnId, component, onComponentInitOrOptions) {
3999
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4343
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4000
4344
  }
4001
- addMoreMenu(componentClass) {
4345
+ addMoreMenu(componentClass, initialiseCallback) {
4002
4346
  return this.addComponentColumn("more-menu", TableMoreMenuComponent, (component) => {
4003
- component.configurePopupComponentType(componentClass);
4347
+ component.configurePopupComponentType(componentClass, initialiseCallback);
4004
4348
  }).columnTextProperties({
4005
4349
  headerText() {
4006
4350
  return "";
4007
4351
  }
4008
4352
  });
4009
4353
  }
4354
+ addFooterRow(component, initialiseCallback) {
4355
+ assert.isNil(this.footerRowModel);
4356
+ this.footerRowModel = new FooterRowModel.Impl(component, initialiseCallback);
4357
+ return this.footerRowModel;
4358
+ }
4010
4359
  addTemplateColumn(columnId) {
4011
- return this.addColumn(new CustomTemplateColumnModel(columnId, () => this.getColumnTextProperties(columnId)));
4360
+ return this.addColumn(new CustomTemplateColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId)));
4012
4361
  }
4013
4362
  addRowClass(className, predicate) {
4014
4363
  this.rowClassNamePredicates.push(new RowClass(className, predicate));
4015
4364
  }
4365
+ addRowAttribute(attributeName, getValue) {
4366
+ this.rowAttributeGenerators.push(new RowAttribute(attributeName, getValue));
4367
+ }
4016
4368
  getRowClasses(row) {
4017
4369
  const classNames = [];
4018
4370
  this.rowClassNamePredicates.forEach(i => {
@@ -4022,8 +4374,13 @@ class AbstractTableModel extends GarbageCollector {
4022
4374
  });
4023
4375
  return classNames;
4024
4376
  }
4025
- addColumn(column, index) {
4026
- return this._columnList.addColumn(column, index);
4377
+ getRowAttributes(row) {
4378
+ return this.rowAttributeGenerators.reduce((result, generator) => {
4379
+ return { ...result, [generator.attributeName]: generator.getValue(row) };
4380
+ }, {});
4381
+ }
4382
+ addColumn(column, position) {
4383
+ return this.columnManager.addColumn(column, position);
4027
4384
  }
4028
4385
  columnTextProperties(columnTextProperties) {
4029
4386
  this._columnTextPropertiesLookup = columnTextProperties;
@@ -4140,7 +4497,7 @@ class TableCellComponent extends DisposableComponent {
4140
4497
  };
4141
4498
  }
4142
4499
  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"] }] });
4500
+ 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
4501
  }
4145
4502
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableCellComponent, decorators: [{
4146
4503
  type: Component,
@@ -4179,7 +4536,7 @@ class TableHeaderCellComponent {
4179
4536
  return this[HEADER_CELL_RENDERER_PORTAL];
4180
4537
  }
4181
4538
  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"] }] });
4539
+ 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
4540
  }
4184
4541
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableHeaderCellComponent, decorators: [{
4185
4542
  type: Component,
@@ -4191,61 +4548,132 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
4191
4548
  args: ['class']
4192
4549
  }] } });
4193
4550
 
4551
+ // eslint-disable-next-line @angular-eslint/component-class-suffix
4552
+ class TableFooterRow {
4553
+ row;
4554
+ defaultClassNames = 'aup-footer-row-renderer';
4555
+ get rowClasses() {
4556
+ return this.row.getActiveRowClasses();
4557
+ }
4558
+ initialise($event) {
4559
+ this.row.onInit && this.row.onInit($event.instance);
4560
+ }
4561
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, deps: [], target: i0.ɵɵFactoryTarget.Component });
4562
+ 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"] }] });
4563
+ }
4564
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, decorators: [{
4565
+ type: Component,
4566
+ 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"] }]
4567
+ }], propDecorators: { row: [{
4568
+ type: Input
4569
+ }], defaultClassNames: [{
4570
+ type: HostBinding,
4571
+ args: ['class']
4572
+ }], rowClasses: [{
4573
+ type: HostBinding,
4574
+ args: ['class']
4575
+ }] } });
4576
+
4577
+ const AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER = new InjectionToken("AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER");
4578
+ class TableRowAttributesDirective {
4579
+ elementRef;
4580
+ aupTableRowAttributes;
4581
+ constructor(elementRef) {
4582
+ this.elementRef = elementRef;
4583
+ }
4584
+ ngOnInit() {
4585
+ for (const attr in this.aupTableRowAttributes) {
4586
+ this.elementRef.nativeElement.setAttribute(attr, this.aupTableRowAttributes[attr]);
4587
+ }
4588
+ }
4589
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
4590
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: { aupTableRowAttributes: "aupTableRowAttributes" }, ngImport: i0 });
4591
+ }
4592
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, decorators: [{
4593
+ type: Directive,
4594
+ args: [{
4595
+ selector: "[aupTableRowAttributes]",
4596
+ }]
4597
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { aupTableRowAttributes: [{
4598
+ type: Input
4599
+ }] } });
4194
4600
  class TableBodyComponent extends ResizeAwareComponent {
4601
+ bufferMultiplier;
4195
4602
  #data$_accessor_storage = proxify((ListModel));
4196
4603
  get data$() { return this.#data$_accessor_storage; }
4197
4604
  set data$(value) { this.#data$_accessor_storage = value; }
4198
4605
  #tableModel_accessor_storage = proxify((AbstractTableModel));
4199
4606
  get tableModel() { return this.#tableModel_accessor_storage; }
4200
4607
  set tableModel(value) { this.#tableModel_accessor_storage = value; }
4608
+ #footerRow_accessor_storage = proxify((FooterRowModel.Impl));
4609
+ get footerRow() { return this.#footerRow_accessor_storage; }
4610
+ set footerRow(value) { this.#footerRow_accessor_storage = value; }
4201
4611
  #showHeader$_accessor_storage = proxify((ValueModel));
4202
4612
  get showHeader$() { return this.#showHeader$_accessor_storage; }
4203
4613
  set showHeader$(value) { this.#showHeader$_accessor_storage = value; }
4204
4614
  #showHeader_accessor_storage = true;
4205
4615
  get showHeader() { return this.#showHeader_accessor_storage; }
4206
4616
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
4207
- visibleRowCount = new EventEmitter();
4208
4617
  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;
4618
+ #scrollMode$_accessor_storage = proxify((ValueModel));
4619
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
4620
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
4621
+ #scrollMode_accessor_storage = "none";
4622
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
4623
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4624
+ scrollViewport;
4215
4625
  columns$;
4216
4626
  columnIds$;
4217
4627
  columnsById$;
4218
- _visibleRowCount$;
4219
4628
  // TODO: support user defined header and row heights via css vars.
4220
- headerHeight$ = new MutableValueModel(29);
4221
- rowHeight$ = new MutableValueModel(40);
4629
+ headerHeight$ = new MutableValueModel(48);
4630
+ rowHeight$ = new MutableValueModel(44);
4222
4631
  baseCssClass = "aup-table-component";
4223
- constructor(elementRef, ngZone) {
4224
- super(elementRef, ngZone);
4225
- const { chain, when } = Dsl.disposeWith(this);
4632
+ virtualScrollDataSource = new TableVirtualScrollDataSource();
4633
+ virtualScrollActive$ = new MutableValueModel(false);
4634
+ scrollTimeout;
4635
+ constructor(bufferMultiplier = 1) {
4636
+ super();
4637
+ this.bufferMultiplier = bufferMultiplier;
4638
+ const { chain, when, observe } = Dsl.disposeWith(this);
4226
4639
  const actualHeaderHeight$ = chain(this.showHeader$).map(show => {
4227
4640
  return show ? this.headerHeight$.value : 0;
4228
4641
  }, { 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" });
4642
+ // performance is terrible if the data changes while we're scrolling, so we postpone updates until
4643
+ // scrolling stops.
4644
+ const delayedDatea$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
4645
+ when(delayedDatea$).changes(delatedData => {
4646
+ this.virtualScrollDataSource.data = delatedData;
4647
+ this.scheduleTableHeightCheck();
4648
+ }, { initialValue: "evaluate" });
4240
4649
  this.onInit(() => {
4241
- this.columns$ = chain(this.tableModel.columns);
4650
+ this.columns$ = chain(this.tableModel.visibleColumns$);
4242
4651
  this.columnIds$ = chain(this.columns$).pluck("columnId");
4243
4652
  this.columnsById$ = chain(this.columns$).indexBy('columnId');
4244
4653
  });
4654
+ // const txo = new TransactionObserver({verbose: false}).onEvent(e => console.log(e.name, e.payload));
4655
+ // txo.observe('this.virtualScrollRowRange$', this.virtualScrollRowRange$);
4656
+ // txo.observe('this.virtualScrollSpacerSize$', this.virtualScrollSpacerSize$);
4657
+ // txo.observe('this.virtualRows$', this.virtualRows$);
4658
+ // txo.observe('this.tableBodyHeight$', this.tableBodyHeight$);
4659
+ // txo.observe('this.virtualScrollActive$', this.virtualScrollActive$);
4660
+ }
4661
+ ngAfterViewInit() {
4662
+ super.ngAfterViewInit();
4663
+ if (this.scrollViewport) {
4664
+ const { observe } = Dsl.disposeWith(this);
4665
+ this.scrollViewport.elementScrolled().subscribe(() => this.notifyScrolled());
4666
+ }
4245
4667
  }
4246
4668
  get hideHeader() {
4247
4669
  return !this.showHeader;
4248
4670
  }
4671
+ get headerHeightCssVar() {
4672
+ return `${this.headerHeight$.value}px`;
4673
+ }
4674
+ get rowHeightCssVar() {
4675
+ return `${this.rowHeight$.value}px`;
4676
+ }
4249
4677
  isEditing(row) {
4250
4678
  return !!this.tableModel.getEditSessionFor(row);
4251
4679
  }
@@ -4270,51 +4698,110 @@ class TableBodyComponent extends ResizeAwareComponent {
4270
4698
  }
4271
4699
  return classes;
4272
4700
  }
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"] }] });
4701
+ scheduleTableHeightCheck(waitMillis = 50) {
4702
+ setTimeout(() => {
4703
+ const tbody = this.elementRef.nativeElement.querySelector("tbody");
4704
+ const bodyHeight = tbody.offsetHeight;
4705
+ if (this.data$.length > 0 && bodyHeight < this.rowHeight$.value) {
4706
+ // Hacks to get our virtual scroll to repaint
4707
+ // Logger.get(this).log(`rowCount=${this.data$.length}, bodyHeight=${bodyHeight} -> virtual table not rendering, triggering resize to force repaint`)
4708
+ window.dispatchEvent(new Event('resize'));
4709
+ if (waitMillis < 500) {
4710
+ this.scheduleTableHeightCheck(waitMillis + 50);
4711
+ }
4712
+ }
4713
+ }, waitMillis);
4714
+ }
4715
+ notifyScrolled() {
4716
+ this.virtualScrollActive$.value = true;
4717
+ this.clearScrollTimeout();
4718
+ this.scrollTimeout = setTimeout(() => {
4719
+ return this.virtualScrollActive$.value = false;
4720
+ }, 200);
4721
+ }
4722
+ clearScrollTimeout() {
4723
+ if (this.scrollTimeout) {
4724
+ clearTimeout(this.scrollTimeout);
4725
+ }
4726
+ }
4727
+ initialiseFooter($event) {
4728
+ const portalRef = $event;
4729
+ this.footerRow.onInit(portalRef.instance);
4730
+ }
4731
+ Proxify = Proxify;
4732
+ 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 });
4733
+ 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
4734
  }
4276
4735
  __decorate([
4277
4736
  Proxify(),
4278
- __metadata("design:type", Object)
4737
+ __metadata("design:type", ListModel)
4279
4738
  ], TableBodyComponent.prototype, "data$", null);
4280
4739
  __decorate([
4281
4740
  Proxify(),
4282
- __metadata("design:type", Object)
4741
+ __metadata("design:type", AbstractTableModel)
4283
4742
  ], TableBodyComponent.prototype, "tableModel", null);
4284
4743
  __decorate([
4285
4744
  Proxify(),
4286
- __metadata("design:type", Object)
4745
+ __metadata("design:type", FooterRowModel.Impl)
4746
+ ], TableBodyComponent.prototype, "footerRow", null);
4747
+ __decorate([
4748
+ Proxify(),
4749
+ __metadata("design:type", ValueModel)
4287
4750
  ], TableBodyComponent.prototype, "showHeader$", null);
4288
4751
  __decorate([
4289
4752
  StoreInValueModel(),
4290
4753
  __metadata("design:type", Object)
4291
4754
  ], TableBodyComponent.prototype, "showHeader", null);
4755
+ __decorate([
4756
+ Proxify(),
4757
+ __metadata("design:type", ValueModel)
4758
+ ], TableBodyComponent.prototype, "scrollMode$", null);
4759
+ __decorate([
4760
+ StoreInValueModel(),
4761
+ __metadata("design:type", String)
4762
+ ], TableBodyComponent.prototype, "scrollMode", null);
4292
4763
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, decorators: [{
4293
4764
  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$: [{
4765
+ 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"] }]
4766
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
4767
+ type: Inject,
4768
+ args: [AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER]
4769
+ }, {
4770
+ type: Optional
4771
+ }] }]; }, propDecorators: { data$: [{
4296
4772
  type: Input
4297
4773
  }], tableModel: [{
4298
4774
  type: Input
4775
+ }], footerRow: [{
4776
+ type: Input
4299
4777
  }], showHeader$: [{
4300
4778
  type: Input
4301
4779
  }], showHeader: [{
4302
4780
  type: Input
4303
- }], visibleRowCount: [{
4304
- type: Output
4305
4781
  }], trackBy: [{
4306
4782
  type: Input
4307
- }], enableScrolling: [{
4783
+ }], scrollMode$: [{
4784
+ type: Input
4785
+ }], scrollMode: [{
4308
4786
  type: Input
4309
4787
  }, {
4310
4788
  type: HostBinding,
4311
- args: ["class.enable-scrolling"]
4789
+ args: ["attr.scrollMode"]
4790
+ }], scrollViewport: [{
4791
+ type: ViewChild,
4792
+ args: [CdkVirtualScrollViewport]
4312
4793
  }], baseCssClass: [{
4313
4794
  type: HostBinding,
4314
4795
  args: ["class"]
4315
4796
  }], hideHeader: [{
4316
4797
  type: HostBinding,
4317
4798
  args: ["class.hide-header"]
4799
+ }], headerHeightCssVar: [{
4800
+ type: HostBinding,
4801
+ args: ["style.--aup-table-header-height"]
4802
+ }], rowHeightCssVar: [{
4803
+ type: HostBinding,
4804
+ args: ["style.--aup-table-row-height"]
4318
4805
  }] } });
4319
4806
 
4320
4807
  class TableMoreMenuPopupComponent extends DisposableComponent {
@@ -4435,8 +4922,10 @@ class TableFilterModel extends GarbageCollector {
4435
4922
  this.useSearchText(options.searchText$);
4436
4923
  this.useRowPredicate(options.predicate$);
4437
4924
  const { chain } = Dsl.disposeWith(this);
4438
- const textSearchRegex$ = chain(this._searchText$).map(text => {
4439
- return isEmpty$1(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4925
+ const textSearchRegex$ = chain(this._searchText$)
4926
+ .debounce(250)
4927
+ .map(text => {
4928
+ return isEmpty(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4440
4929
  }, { allowNil: true });
4441
4930
  this._rowPredicate = chain(this._rowPredicate$)
4442
4931
  .map(predicate => {
@@ -4644,31 +5133,30 @@ class TableComponent extends AbstractTableComponent {
4644
5133
  #filterModel_accessor_storage = proxify((TableFilterModel));
4645
5134
  get filterModel() { return this.#filterModel_accessor_storage; }
4646
5135
  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
- // }
5136
+ tableBody;
5137
+ #scrollMode$_accessor_storage = proxify((ValueModel));
5138
+ /**
5139
+ * 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
5140
+ * renders all rows but allows row heights to grow.
5141
+ */
5142
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
5143
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
5144
+ #scrollMode_accessor_storage;
5145
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
5146
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4660
5147
  _footerContentAdded = false;
4661
5148
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
4662
- _pageSize = new MutableValueModel();
4663
- pagedListModel;
5149
+ tableBodyScrollMode$;
4664
5150
  constructor(injector) {
4665
5151
  super(injector);
4666
- const { when } = Dsl.disposeWith(this);
4667
- this.onDispose(() => this.disposeOfPagedListModel());
4668
- when(this.enablePaging$).changes(enabled => this.configurePaging(enabled));
5152
+ const { chain, when } = Dsl.disposeWith(this);
5153
+ this.tableBodyScrollMode$ = chain(this.enableScrolling$).map(enable => {
5154
+ return enable ? (this.scrollMode$.value ?? "virtual") : 'none';
5155
+ }, { dependsOn: this.scrollMode$ });
4669
5156
  }
4670
5157
  ngOnInit() {
4671
5158
  super.ngOnInit();
5159
+ const { when } = Dsl.disposeWith(this);
4672
5160
  if (CanProxy.hasTarget(this.filterModel)) {
4673
5161
  this.registerDisposable(this.filterModel.bindToTable(this._dataSource$, this.getModel().textSearchPredicate$));
4674
5162
  this.highlightText$.setDelegate(this.filterModel.highlightText$);
@@ -4677,50 +5165,26 @@ class TableComponent extends AbstractTableComponent {
4677
5165
  else {
4678
5166
  this._filteredRows$.setDelegate(this._dataSource$);
4679
5167
  }
4680
- this.configurePaging(this.enablePaging$.value);
5168
+ this._visibleRows$.setDelegate(this._filteredRows$);
5169
+ // let users of the model know what the current visible and filtered rows are for selection models and what not
4681
5170
  this.tableModel.bindToTable(this._filteredRows$, this._visibleRows$);
5171
+ this.trackChangesAndMarkForCheck(this._filteredRows$, this.tableModel.visibleColumns$);
4682
5172
  }
4683
5173
  getModel() {
4684
5174
  return this.tableModel;
4685
5175
  }
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
5176
  footerContentChanged($event) {
4709
5177
  // console.log($event);
4710
5178
  this._footerContentAdded = true;
4711
5179
  }
4712
- //@Trace()
4713
- updatePageSize(count) {
4714
- this._pageSize.value = count;
4715
- }
4716
5180
  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: [
5181
+ 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
5182
  { 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"] }] });
5183
+ ], 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4720
5184
  }
4721
5185
  __decorate([
4722
5186
  Proxify(),
4723
- __metadata("design:type", Object)
5187
+ __metadata("design:type", TableModel)
4724
5188
  ], TableComponent.prototype, "tableModel", null);
4725
5189
  __decorate([
4726
5190
  Proxify(),
@@ -4728,24 +5192,27 @@ __decorate([
4728
5192
  ], TableComponent.prototype, "filterModel", null);
4729
5193
  __decorate([
4730
5194
  Proxify(),
4731
- __metadata("design:type", Object)
4732
- ], TableComponent.prototype, "enablePaging$", null);
5195
+ __metadata("design:type", ValueModel)
5196
+ ], TableComponent.prototype, "scrollMode$", null);
4733
5197
  __decorate([
4734
5198
  StoreInValueModel(),
4735
5199
  __metadata("design:type", Object)
4736
- ], TableComponent.prototype, "enablePaging", null);
5200
+ ], TableComponent.prototype, "scrollMode", null);
4737
5201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableComponent, decorators: [{
4738
5202
  type: Component,
4739
- args: [{ selector: 'aup-table', providers: [
5203
+ args: [{ selector: 'aup-table', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
4740
5204
  { 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"] }]
5205
+ ], 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
5206
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { tableModel: [{
4743
5207
  type: Input
4744
5208
  }], filterModel: [{
4745
5209
  type: Input
4746
- }], enablePaging$: [{
5210
+ }], tableBody: [{
5211
+ type: ViewChild,
5212
+ args: [TableBodyComponent]
5213
+ }], scrollMode$: [{
4747
5214
  type: Input
4748
- }], enablePaging: [{
5215
+ }], scrollMode: [{
4749
5216
  type: Input
4750
5217
  }] } });
4751
5218
 
@@ -4927,7 +5394,7 @@ var DecoratedTreeNode;
4927
5394
  }
4928
5395
  }
4929
5396
  __decorate([
4930
- Memoize(),
5397
+ MemoizeGet(),
4931
5398
  __metadata("design:type", Array),
4932
5399
  __metadata("design:paramtypes", [])
4933
5400
  ], Decorator.prototype, "children", null);
@@ -4980,7 +5447,7 @@ var DecoratedTreeNode;
4980
5447
  __metadata("design:returntype", Array)
4981
5448
  ], Decorator.prototype, "ancestors", null);
4982
5449
  __decorate([
4983
- Memoize(),
5450
+ MemoizeGet(),
4984
5451
  __metadata("design:type", Number),
4985
5452
  __metadata("design:paramtypes", [])
4986
5453
  ], Decorator.prototype, "depth", null);
@@ -4991,8 +5458,8 @@ class TreeLabelColumnModel extends ColumnModel {
4991
5458
  expansionModel;
4992
5459
  labelFactory = () => undefined;
4993
5460
  iconFactory;
4994
- constructor(columnId, textPropertiesProvider, expansionModel) {
4995
- super(columnId, textPropertiesProvider);
5461
+ constructor(columnId, order, textPropertiesProvider, expansionModel) {
5462
+ super(columnId, order, textPropertiesProvider);
4996
5463
  this.expansionModel = expansionModel;
4997
5464
  this.cellRenderer(TreeLabelCellRendererComponent);
4998
5465
  }
@@ -5060,7 +5527,7 @@ class TreeTableModel extends AbstractTableModel {
5060
5527
  }
5061
5528
  treeControlColumn(builder) {
5062
5529
  const columnId = 'tree-label';
5063
- const column = new TreeLabelColumnModel(columnId, () => this.getColumnTextProperties(columnId), this);
5530
+ const column = new TreeLabelColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this);
5064
5531
  builder(column);
5065
5532
  this.addColumn(column);
5066
5533
  }
@@ -5386,11 +5853,15 @@ class TreeTableComponent extends AbstractTableComponent {
5386
5853
  #expansionModel_accessor_storage = proxify((TreeExpansionModel));
5387
5854
  get expansionModel() { return this.#expansionModel_accessor_storage; }
5388
5855
  set expansionModel(value) { this.#expansionModel_accessor_storage = value; }
5856
+ scrollMode$;
5389
5857
  constructor(injector) {
5390
5858
  super(injector);
5859
+ const { chain } = Dsl.disposeWith(this);
5860
+ this.scrollMode$ = chain(this.enableScrolling$).map(enabled => enabled ? "classic" : "none");
5391
5861
  }
5392
5862
  ngOnInit() {
5393
5863
  super.ngOnInit();
5864
+ const { when } = Dsl.disposeWith(this);
5394
5865
  // TODO: clean up all this tightly coupled shit, should the expansion model really be separate from the tree model?
5395
5866
  if (!this.expansionModel) {
5396
5867
  this.expansionModel = new TreeExpansionModel({ disposedWith: this });
@@ -5400,6 +5871,8 @@ class TreeTableComponent extends AbstractTableComponent {
5400
5871
  this._visibleRows$.setDelegate(visibleRows$);
5401
5872
  this.expansionModel.bindToTable(this._dataSource$, visibleRows$);
5402
5873
  this.treeTableModel.bindToTable(this.expansionModel, visibleRows$, this._visibleRows$);
5874
+ this.trackChangesAndMarkForCheck(this.treeTableModel.visibleRows$);
5875
+ this.trackChangesAndMarkForCheck(this.treeTableModel.visibleRows$);
5403
5876
  }
5404
5877
  getModel() {
5405
5878
  return this.treeTableModel;
@@ -5407,7 +5880,7 @@ class TreeTableComponent extends AbstractTableComponent {
5407
5880
  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
5881
  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
5882
  { 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"] }] });
5883
+ ], 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5411
5884
  }
5412
5885
  __decorate([
5413
5886
  Proxify(),
@@ -5419,9 +5892,9 @@ __decorate([
5419
5892
  ], TreeTableComponent.prototype, "expansionModel", null);
5420
5893
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TreeTableComponent, decorators: [{
5421
5894
  type: Component,
5422
- args: [{ selector: 'aup-tree-table', providers: [
5895
+ args: [{ selector: 'aup-tree-table', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
5423
5896
  { 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"] }]
5897
+ ], 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
5898
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { treeTableModel: [{
5426
5899
  type: Input
5427
5900
  }], expansionModel: [{
@@ -5603,6 +6076,7 @@ class ComponentsModule {
5603
6076
  FocusableComponent,
5604
6077
  CardContainerComponent,
5605
6078
  TableComponent,
6079
+ TableRowAttributesDirective,
5606
6080
  EditRowControlsComponent,
5607
6081
  ColumnTemplateDirective,
5608
6082
  DefaultCellRendererComponent,
@@ -5636,7 +6110,9 @@ class ComponentsModule {
5636
6110
  MarkdownComponent,
5637
6111
  TableBodyComponent,
5638
6112
  TableMoreMenuComponent,
5639
- TableMoreMenuPopupComponent], imports: [CommonModule,
6113
+ TableMoreMenuPopupComponent,
6114
+ SearchInputComponent,
6115
+ TableFooterRow], imports: [CommonModule,
5640
6116
  BrowserAnimationsModule,
5641
6117
  FormsModule,
5642
6118
  MatInputModule,
@@ -5655,7 +6131,10 @@ class ComponentsModule {
5655
6131
  MatMenuModule,
5656
6132
  MatDividerModule,
5657
6133
  MatProgressSpinnerModule,
5658
- MatProgressBarModule], exports: [NumberInputComponent,
6134
+ MatProgressBarModule,
6135
+ ScrollingModule,
6136
+ TableVirtualScrollModule], exports: [TableFooterRow,
6137
+ NumberInputComponent,
5659
6138
  StringInputComponent,
5660
6139
  TextInputComponent,
5661
6140
  PasswordInputComponent,
@@ -5693,7 +6172,8 @@ class ComponentsModule {
5693
6172
  LoadingContainerComponent,
5694
6173
  MarkdownComponent,
5695
6174
  TableMoreMenuComponent,
5696
- TableMoreMenuPopupComponent] });
6175
+ TableMoreMenuPopupComponent,
6176
+ SearchInputComponent] });
5697
6177
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, providers: [
5698
6178
  FocusBindingFactory,
5699
6179
  MarkdownService
@@ -5716,7 +6196,9 @@ class ComponentsModule {
5716
6196
  MatMenuModule,
5717
6197
  MatDividerModule,
5718
6198
  MatProgressSpinnerModule,
5719
- MatProgressBarModule] });
6199
+ MatProgressBarModule,
6200
+ ScrollingModule,
6201
+ TableVirtualScrollModule] });
5720
6202
  }
5721
6203
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, decorators: [{
5722
6204
  type: NgModule,
@@ -5741,7 +6223,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5741
6223
  MatMenuModule,
5742
6224
  MatDividerModule,
5743
6225
  MatProgressSpinnerModule,
5744
- MatProgressBarModule
6226
+ MatProgressBarModule,
6227
+ ScrollingModule,
6228
+ TableVirtualScrollModule
5745
6229
  ],
5746
6230
  declarations: [
5747
6231
  AbstractInputComponent,
@@ -5765,6 +6249,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5765
6249
  FocusableComponent,
5766
6250
  CardContainerComponent,
5767
6251
  TableComponent,
6252
+ TableRowAttributesDirective,
5768
6253
  EditRowControlsComponent,
5769
6254
  ColumnTemplateDirective,
5770
6255
  DefaultCellRendererComponent,
@@ -5799,8 +6284,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5799
6284
  TableBodyComponent,
5800
6285
  TableMoreMenuComponent,
5801
6286
  TableMoreMenuPopupComponent,
6287
+ SearchInputComponent,
6288
+ TableFooterRow
5802
6289
  ],
5803
6290
  exports: [
6291
+ TableFooterRow,
5804
6292
  NumberInputComponent,
5805
6293
  StringInputComponent,
5806
6294
  TextInputComponent,
@@ -5840,6 +6328,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5840
6328
  MarkdownComponent,
5841
6329
  TableMoreMenuComponent,
5842
6330
  TableMoreMenuPopupComponent,
6331
+ SearchInputComponent
5843
6332
  ],
5844
6333
  providers: [
5845
6334
  FocusBindingFactory,
@@ -5848,6 +6337,67 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5848
6337
  }]
5849
6338
  }] });
5850
6339
 
6340
+ class LoadableComponent extends DisposableComponent {
6341
+ #_loaded$ = new MutableValueModel();
6342
+ #asyncLoadables = [];
6343
+ #awaitedLoadables = [];
6344
+ get loaded$() {
6345
+ return this.#_loaded$.readonly$;
6346
+ }
6347
+ ngOnInit() {
6348
+ super.ngOnInit();
6349
+ this.#asyncLoadables.forEach(it => it.ensureLoaded());
6350
+ if (this.#awaitedLoadables.length > 0) {
6351
+ Promise.all(this.#awaitedLoadables.map(it => {
6352
+ return it.ensureLoaded(); //.then(() => console.log(`${it.constructor.name} loaded`));
6353
+ })).then(() => {
6354
+ this.#_loaded$.value = true;
6355
+ });
6356
+ }
6357
+ else {
6358
+ this.#_loaded$.value = true;
6359
+ }
6360
+ }
6361
+ injectLoadable(token, options) {
6362
+ return this.registerLoadable(inject(token), options);
6363
+ }
6364
+ registerLoadable(loadable, options) {
6365
+ if (this.loaded$.value) {
6366
+ loadable.ensureLoaded();
6367
+ }
6368
+ else {
6369
+ if (!options || options.wait === true) {
6370
+ this.#awaitedLoadables.push(loadable);
6371
+ }
6372
+ else {
6373
+ this.#asyncLoadables.push(loadable);
6374
+ }
6375
+ }
6376
+ return loadable;
6377
+ }
6378
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
6379
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: LoadableComponent, usesInheritance: true, ngImport: i0 });
6380
+ }
6381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, decorators: [{
6382
+ type: Directive
6383
+ }] });
6384
+
6385
+ class TextSearchContext {
6386
+ row;
6387
+ searchText;
6388
+ searchRegex;
6389
+ constructor(row, searchText, searchRegex) {
6390
+ this.row = row;
6391
+ this.searchText = searchText;
6392
+ this.searchRegex = searchRegex;
6393
+ }
6394
+ getOrCreate(type, create) {
6395
+ }
6396
+ matchesText(text) {
6397
+ return this.searchRegex.test(text);
6398
+ }
6399
+ }
6400
+
5851
6401
  /**
5852
6402
  * @file Automatically generated by barrelsby.
5853
6403
  */
@@ -5874,7 +6424,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5874
6424
  * </aup-activity-actions>
5875
6425
  */
5876
6426
  class ActivityActionsComponent extends DisposableComponent {
5877
- cdr;
5878
6427
  confirmCommandComponent;
5879
6428
  cancelCommandComponent;
5880
6429
  #confirmCommand_accessor_storage = proxify((Command));
@@ -5903,9 +6452,9 @@ class ActivityActionsComponent extends DisposableComponent {
5903
6452
  }
5904
6453
  layout = ActivityActionsComponent.Layout.BLOCK;
5905
6454
  align = ActivityActionsComponent.Align.STRETCH;
5906
- constructor(cdr) {
6455
+ alignContent = ActivityActionsComponent.AlignContent.CENTER;
6456
+ constructor() {
5907
6457
  super();
5908
- this.cdr = cdr;
5909
6458
  }
5910
6459
  hasConfirmFace() {
5911
6460
  return !!this.confirmFace;
@@ -5924,8 +6473,8 @@ class ActivityActionsComponent extends DisposableComponent {
5924
6473
  focusCancel() {
5925
6474
  this.cancelCommandComponent.requestFocus();
5926
6475
  }
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"] }] });
6476
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6477
+ 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
6478
  }
5930
6479
  __decorate([
5931
6480
  Proxify(),
@@ -5937,8 +6486,8 @@ __decorate([
5937
6486
  ], ActivityActionsComponent.prototype, "cancelCommand", null);
5938
6487
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, decorators: [{
5939
6488
  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: [{
6489
+ 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"] }]
6490
+ }], ctorParameters: function () { return []; }, propDecorators: { confirmCommandComponent: [{
5942
6491
  type: ViewChild,
5943
6492
  args: ["confirmCommandComponent"]
5944
6493
  }], cancelCommandComponent: [{
@@ -5966,6 +6515,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5966
6515
  }, {
5967
6516
  type: HostBinding,
5968
6517
  args: ['attr.align']
6518
+ }], alignContent: [{
6519
+ type: Input
6520
+ }, {
6521
+ type: HostBinding,
6522
+ args: ['attr.align-content']
5969
6523
  }] } });
5970
6524
  (function (ActivityActionsComponent) {
5971
6525
  ActivityActionsComponent.Layout = Enum({
@@ -5974,14 +6528,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5974
6528
  });
5975
6529
  ActivityActionsComponent.Align = Enum({
5976
6530
  START: 'start',
5977
- END: 'end',
5978
- STRETCH: 'stretch'
6531
+ STRETCH: 'stretch',
6532
+ END: 'end'
6533
+ });
6534
+ ActivityActionsComponent.AlignContent = Enum({
6535
+ START: 'start',
6536
+ CENTER: 'center',
6537
+ END: 'end'
5979
6538
  });
5980
6539
  })(ActivityActionsComponent || (ActivityActionsComponent = {}));
5981
6540
 
5982
6541
  const ACTIVITY_DATA = new InjectionToken("InteractionActivityData");
5983
6542
  // eslint-disable-next-line @angular-eslint/component-class-suffix
5984
- class Activity extends DisposableComponent {
6543
+ class Activity extends LoadableComponent {
5985
6544
  activityData = inject(ACTIVITY_DATA);
5986
6545
  activityReadyListeners = new EventListenerList();
5987
6546
  _busy$ = this.registerDisposable(new DelegatingValueModel().withDefault(false));
@@ -6036,7 +6595,6 @@ class Activity extends DisposableComponent {
6036
6595
  notifyActivityReady() {
6037
6596
  this.activityReadyListeners.fire(l => l(this));
6038
6597
  this._ready$.value = true;
6039
- console.log("ready");
6040
6598
  }
6041
6599
  onActivityReady(callback) {
6042
6600
  return this.activityReadyListeners.add(callback);
@@ -6156,7 +6714,7 @@ class AbstractDialogComponent extends Activity {
6156
6714
  }
6157
6715
  }
6158
6716
  isDestructive() {
6159
- return isFunction$1(this.config['destructive']) && this.config["destructive"]();
6717
+ return isFunction(this.config['destructive']) && this.config["destructive"]();
6160
6718
  }
6161
6719
  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
6720
  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 +6731,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6173
6731
 
6174
6732
  class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6175
6733
  cancelFace;
6734
+ confirmClass = "aup-confirm-activity";
6176
6735
  constructor(config) {
6177
6736
  super(config);
6178
6737
  this.cancelFace = {
@@ -6183,7 +6742,7 @@ class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6183
6742
  });
6184
6743
  }
6185
6744
  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 });
6745
+ 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
6746
  }
6188
6747
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractConfirmDialogComponent, decorators: [{
6189
6748
  type: Component,
@@ -6193,7 +6752,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6193
6752
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
6194
6753
  type: Inject,
6195
6754
  args: [ALERT_CONFIG]
6196
- }] }]; } });
6755
+ }] }]; }, propDecorators: { confirmClass: [{
6756
+ type: HostBinding,
6757
+ args: ["class"]
6758
+ }] } });
6197
6759
 
6198
6760
  class ActivityBodyComponent extends DisposableComponent {
6199
6761
  fullWidth = false;
@@ -6732,7 +7294,7 @@ const ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');
6732
7294
  // return true;
6733
7295
  // }
6734
7296
  // }
6735
- class PlaceComponent extends DisposableComponent {
7297
+ class PlaceComponent extends LoadableComponent {
6736
7298
  _placeReadyCallbacks = [];
6737
7299
  visitModel = new MutableValueModel();
6738
7300
  _inVisitUpdate = new Guard();
@@ -6789,6 +7351,7 @@ class PlaceComponent extends DisposableComponent {
6789
7351
  */
6790
7352
  installAndInitialiseBinding(initialVisit, parameterDef) {
6791
7353
  const model = this[parameterDef.propertyName];
7354
+ assert.notNil(model);
6792
7355
  DebugContext.tag(model, `${this.placeDefinition.component.name}.${parameterDef.propertyName}`);
6793
7356
  const binding = this.registerDisposable(new Binding(this.visitModel, model, {
6794
7357
  toRight(visit) {
@@ -6873,7 +7436,7 @@ class PlaceComponent extends DisposableComponent {
6873
7436
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: PlaceComponent, usesInheritance: true, ngImport: i0 });
6874
7437
  }
6875
7438
  __decorate([
6876
- Memoize(),
7439
+ MemoizeGet(),
6877
7440
  __metadata("design:type", PlaceDefinition),
6878
7441
  __metadata("design:paramtypes", [])
6879
7442
  ], PlaceComponent.prototype, "placeDefinition", null);
@@ -7063,7 +7626,7 @@ class Visit {
7063
7626
  getRouterCommands() {
7064
7627
  return this.segments.reduce((result, v) => {
7065
7628
  const path = v.placeDefinition.path;
7066
- return isEmpty$1(path) ?
7629
+ return isEmpty(path) ?
7067
7630
  [...result, path] : // Angular doesn't support route params on empty path segments
7068
7631
  [...result, path, ...v.createRouterCommands()];
7069
7632
  }, []);
@@ -7079,7 +7642,7 @@ class Visit {
7079
7642
  }
7080
7643
  }
7081
7644
  __decorate([
7082
- Memoize$1(),
7645
+ Memoize(),
7083
7646
  __metadata("design:type", Function),
7084
7647
  __metadata("design:paramtypes", [PlaceDefinition]),
7085
7648
  __metadata("design:returntype", VisitSegment)
@@ -7460,10 +8023,7 @@ class SynchroniseInteractionContextIdsWithRoute extends NavigationSession {
7460
8023
  return true;
7461
8024
  }
7462
8025
  notifyActive() {
7463
- // TODO: Do I still need this??
7464
- setTimeout(() => {
7465
- this.syncInteractionIdsWithRouter();
7466
- });
8026
+ this.syncInteractionIdsWithRouter();
7467
8027
  }
7468
8028
  // @Trace()
7469
8029
  onRouterEnd(event) {
@@ -8206,7 +8766,7 @@ class ConsolidatedParameterMap {
8206
8766
  }
8207
8767
  }
8208
8768
  __decorate([
8209
- Memoize(),
8769
+ MemoizeGet(),
8210
8770
  __metadata("design:type", Array),
8211
8771
  __metadata("design:paramtypes", [])
8212
8772
  ], ConsolidatedParameterMap.prototype, "keys", null);
@@ -8284,7 +8844,7 @@ class UrlSnapshot {
8284
8844
  return this.getPrimaryUrlSegments().find(s => s.path === placeDef.path);
8285
8845
  }
8286
8846
  isLastPlaceInUrl(placeDef) {
8287
- return last$1(this.getPrimaryUrlSegments()).path === placeDef.path;
8847
+ return last(this.getPrimaryUrlSegments()).path === placeDef.path;
8288
8848
  }
8289
8849
  createVisitSegmentFor(placeDef) {
8290
8850
  return new VisitSegment(placeDef, new ConsolidatedParameterMap(this.getPrimaryUrlSegments()));
@@ -8400,7 +8960,7 @@ class UrlService {
8400
8960
  back() {
8401
8961
  this.angularLocation.back();
8402
8962
  }
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 });
8963
+ 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
8964
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, providedIn: 'root' });
8405
8965
  }
8406
8966
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, decorators: [{
@@ -8408,7 +8968,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8408
8968
  args: [{
8409
8969
  providedIn: 'root'
8410
8970
  }]
8411
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: i1$4.UrlSerializer }]; } });
8971
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: i1$5.UrlSerializer }]; } });
8412
8972
 
8413
8973
  // function asArray<T>(item: T | T[]): T[] {
8414
8974
  // return Array.isArray(item) ? item : [item];
@@ -8428,6 +8988,8 @@ class PlaceRouter extends GarbageCollector {
8428
8988
  routerInteractionAdapter;
8429
8989
  sessionFinishedJobs = [];
8430
8990
  authService = new PlaceAuthService();
8991
+ _ready$ = this.registerDisposable(new DelegatingValueModel().withDefault(true));
8992
+ ready$ = this._ready$.readonly$;
8431
8993
  constructor(angularRouter, angularLocation, interactionService, urlService, placeHistory) {
8432
8994
  super();
8433
8995
  this.angularRouter = angularRouter;
@@ -8449,7 +9011,7 @@ class PlaceRouter extends GarbageCollector {
8449
9011
  });
8450
9012
  const { chain } = Dsl.disposeWith(this);
8451
9013
  this.navigationInProgress$ = chain(this.navigationSession$).isNotNil();
8452
- this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync");
9014
+ this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync").otherwise(false);
8453
9015
  const idleStateName = chain(this.interactionService.active).map(active => active ? "IdleDuringInteraction" : "Idle");
8454
9016
  this.navigationSessionName$ = chain(this.navigationSession$)
8455
9017
  .pluck("name")
@@ -8493,6 +9055,9 @@ class PlaceRouter extends GarbageCollector {
8493
9055
  // the back button was clicked.
8494
9056
  angularLocation.onUrlChange(url => this.onUrlChanged(url));
8495
9057
  }
9058
+ postponeRoutingUntil(condition$) {
9059
+ this._ready$.setDelegate(condition$);
9060
+ }
8496
9061
  getAuthenticationFailureRedirect(activatedRoute, state) {
8497
9062
  return this.authService.getAuthenticationFailureRedirect(activatedRoute, state);
8498
9063
  }
@@ -8508,23 +9073,20 @@ class PlaceRouter extends GarbageCollector {
8508
9073
  isNavigating() {
8509
9074
  return this.navigationInProgress$.value;
8510
9075
  }
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
- });
9076
+ async waitUntilRouterReady() {
9077
+ const { waitUntil } = Dsl.disposeWith(this);
9078
+ await waitUntil(this.ready$).becomesTruthy();
9079
+ return this;
9080
+ }
9081
+ async waitUntilIdle() {
9082
+ const { waitUntil } = Dsl.disposeWith(this);
9083
+ await waitUntil(this.navigationInProgress$).becomesFalsey();
9084
+ return this;
8519
9085
  }
8520
9086
  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
- });
9087
+ const { waitUntil } = Dsl.disposeWith(this);
9088
+ await waitUntil(this.interactionSyncInProgress$).becomesFalsey();
9089
+ return this;
8528
9090
  }
8529
9091
  // @Trace()
8530
9092
  onPopState(event) {
@@ -8710,7 +9272,7 @@ class PlaceRouter extends GarbageCollector {
8710
9272
  return Visit.goto(visitOrPlaceComponent, params);
8711
9273
  }
8712
9274
  }
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 });
9275
+ 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
9276
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, providedIn: "root" });
8715
9277
  }
8716
9278
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, decorators: [{
@@ -8718,7 +9280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8718
9280
  args: [{
8719
9281
  providedIn: "root"
8720
9282
  }]
8721
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
9283
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
8722
9284
 
8723
9285
  class ActivityTitleComponent extends DisposableComponent {
8724
9286
  _color;
@@ -8740,11 +9302,11 @@ class ActivityTitleComponent extends DisposableComponent {
8740
9302
  return this._color;
8741
9303
  }
8742
9304
  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"] });
9305
+ 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
9306
  }
8745
9307
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityTitleComponent, decorators: [{
8746
9308
  type: Component,
8747
- args: [{ selector: 'aup-activity-title', template: "<ng-content></ng-content>\n", styles: [":host{display:block}\n"] }]
9309
+ 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
9310
  }], propDecorators: { hasTransparentBackground: [{
8749
9311
  type: Input
8750
9312
  }, {
@@ -8765,7 +9327,7 @@ class AlertDialogComponent extends AbstractDialogComponent {
8765
9327
  });
8766
9328
  }
8767
9329
  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"] }] });
9330
+ 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
9331
  }
8770
9332
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AlertDialogComponent, decorators: [{
8771
9333
  type: Component,
@@ -8785,7 +9347,7 @@ class ConfirmThenDialogComponent extends AbstractConfirmDialogComponent {
8785
9347
  });
8786
9348
  }
8787
9349
  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"] }] });
9350
+ 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
9351
  }
8790
9352
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenDialogComponent, decorators: [{
8791
9353
  type: Component,
@@ -8809,7 +9371,7 @@ class ConfirmThenExecuteDialogComponent extends AbstractConfirmDialogComponent {
8809
9371
  });
8810
9372
  }
8811
9373
  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"] }] });
9374
+ 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
9375
  }
8814
9376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenExecuteDialogComponent, decorators: [{
8815
9377
  type: Component,
@@ -8829,7 +9391,7 @@ class ConfirmationDialogComponent extends AbstractConfirmDialogComponent {
8829
9391
  });
8830
9392
  }
8831
9393
  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"] }] });
9394
+ 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
9395
  }
8834
9396
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmationDialogComponent, decorators: [{
8835
9397
  type: Component,
@@ -9009,6 +9571,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9009
9571
  tabs;
9010
9572
  activityOutlets;
9011
9573
  activityRefs = [];
9574
+ animationDuration = "500ms";
9012
9575
  _identifier;
9013
9576
  _deferredCleanUp;
9014
9577
  interactionServiceApi;
@@ -9021,6 +9584,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9021
9584
  busy = this.registerDisposable(new DelegatingValueModel().withDefault(false));
9022
9585
  syncTabsJob = undefined;
9023
9586
  stable$;
9587
+ wasActive = false;
9024
9588
  constructor(placeRouter) {
9025
9589
  super();
9026
9590
  this.placeRouter = placeRouter;
@@ -9057,7 +9621,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9057
9621
  * Returns true if an activity is currently running.
9058
9622
  */
9059
9623
  isActive() {
9060
- return this.getActiveActivityCount() > 0;
9624
+ const isActive = this.getActiveActivityCount() > 0;
9625
+ // if (this.wasActive !== isActive) {
9626
+ // console.log({was: this.wasActive, is: isActive});
9627
+ // }
9628
+ // this.wasActive = isActive
9629
+ return isActive;
9061
9630
  }
9062
9631
  registerDisposable(disposable) {
9063
9632
  return this.garbage.registerDisposable(disposable);
@@ -9140,7 +9709,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9140
9709
  // by activity index)
9141
9710
  setTimeout(() => {
9142
9711
  this.activityRefs = []; // we have to do it after the animation timeout or the activity disappears before the animatin finsihes
9143
- }, this.getTabAnimationDuration());
9712
+ }, this.getTabAnimationDurationInMillis());
9144
9713
  const promise = this.interactionServiceApi.notifyFinished(this);
9145
9714
  this._deferredCleanUp = promise
9146
9715
  .finally(() => {
@@ -9166,7 +9735,6 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9166
9735
  /**
9167
9736
  * Synchronises the selected tab index.
9168
9737
  */
9169
- // @Trace()
9170
9738
  synchroniseSelectedTabIndex() {
9171
9739
  assert.isTruthy(this.isActive());
9172
9740
  const previousIndex = this.tabs.selectedIndex;
@@ -9178,10 +9746,10 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9178
9746
  activityRef.setFocused(false);
9179
9747
  this.busy.setDelegate(activityRef.activityBusy);
9180
9748
  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
- }
9749
+ // if (this.ready$.value) {
9750
+ // // Note: We're not using the animation done event as it's firing almost immeadiately.
9751
+ // setTimeout(() => this.finaliseActivityStates(), animate ? this.getTabAnimationDurationInMillis() : 0);
9752
+ // }
9185
9753
  }
9186
9754
  }
9187
9755
  finaliseActivityStates() {
@@ -9195,7 +9763,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9195
9763
  return this.activityOutlets.toArray()[this.tabs.selectedIndex];
9196
9764
  }
9197
9765
  getTabAnimationDuration() {
9198
- const match = this.tabs.animationDuration.match(/(\d+)(.*)/);
9766
+ // const s = this._started$.value ? this.animationDuration : "0";
9767
+ // return s
9768
+ return this.animationDuration;
9769
+ }
9770
+ getTabAnimationDurationInMillis() {
9771
+ const match = this.animationDuration.match(/(\d+)(.*)/);
9199
9772
  const numericValue = parseFloat(match[1]);
9200
9773
  switch (match[2].trim()) {
9201
9774
  case "ms":
@@ -9221,12 +9794,16 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9221
9794
  }
9222
9795
  }, 75);
9223
9796
  }
9797
+ onAnimationDone() {
9798
+ this._started$.value = true;
9799
+ this.finaliseActivityStates();
9800
+ }
9224
9801
  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"] }] });
9802
+ 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
9803
  }
9227
9804
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityContainerComponent, decorators: [{
9228
9805
  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"] }]
9806
+ 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
9807
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { dynamicHeight: [{
9231
9808
  type: Input
9232
9809
  }], tabs: [{
@@ -9235,6 +9812,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9235
9812
  }], activityOutlets: [{
9236
9813
  type: ViewChildren,
9237
9814
  args: [ActivityOutletComponent]
9815
+ }], animationDuration: [{
9816
+ type: Input
9238
9817
  }] } });
9239
9818
 
9240
9819
  class AbstractActivityTriggerComponent extends DisposableComponent {
@@ -9335,14 +9914,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9335
9914
  args: ['class.active']
9336
9915
  }] } });
9337
9916
 
9338
- const cssDurationRegex = /(\d+)(m?s)/;
9917
+ const cssDurationRegex$1 = /(\d+)(m?s)/;
9339
9918
  /**
9340
9919
  * @example
9341
9920
  * <aup-in-place-interaction-context #inPlaceInteractionContext>
9342
9921
  * </aup-in-place-interaction-context>
9343
9922
  *
9344
9923
  * in your component
9345
- * @ViewChild('inPlaceInteractionContext', { static: true })
9924
+ * @ViewChild(InPlaceInteractionContextComponent)
9346
9925
  * interactionContext: InteractionContext;
9347
9926
  *
9348
9927
  *
@@ -9361,11 +9940,13 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9361
9940
  * active interactions.
9362
9941
  */
9363
9942
  syncWithRoutes = true;
9943
+ started = new EventEmitter();
9944
+ finished = new EventEmitter();
9364
9945
  get animationDuration() {
9365
9946
  return this.animateFirstActivity ? (this.tabConfig?.animationDuration || "500ms") : "0ms";
9366
9947
  }
9367
9948
  get animationDurationMillis() {
9368
- const result = cssDurationRegex.exec(this.animationDuration);
9949
+ const result = cssDurationRegex$1.exec(this.animationDuration);
9369
9950
  if (!result) {
9370
9951
  lang.illegalState(`unsupported css duration: ${this.animationDuration}`);
9371
9952
  }
@@ -9387,11 +9968,16 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9387
9968
  this.interactionService.registerInplaceInteractionContext(this);
9388
9969
  }
9389
9970
  else {
9971
+ const self = this;
9390
9972
  this.activityContainerComponent.initialise("dont-care", {
9391
9973
  async notifyActive(interactionContext) {
9974
+ self.started.emit();
9392
9975
  return undefined;
9393
9976
  },
9394
9977
  async notifyFinished(interactionContext) {
9978
+ // I've noticed some rendering fails when returning the the transcluded content we'll fire an event
9979
+ // so components can do stuff if they need to.
9980
+ self.started.emit();
9395
9981
  return undefined;
9396
9982
  }
9397
9983
  });
@@ -9438,7 +10024,7 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9438
10024
  }
9439
10025
  }
9440
10026
  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"] }] });
10027
+ 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" } }, 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
10028
  }
9443
10029
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InPlaceInteractionContextComponent, decorators: [{
9444
10030
  type: Component,
@@ -9455,6 +10041,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9455
10041
  type: Input
9456
10042
  }], syncWithRoutes: [{
9457
10043
  type: Input
10044
+ }], started: [{
10045
+ type: Output
10046
+ }], finished: [{
10047
+ type: Output
9458
10048
  }], active: [{
9459
10049
  type: HostBinding,
9460
10050
  args: ["class.active"]
@@ -9469,7 +10059,7 @@ class InlineActivityTriggerComponent extends AbstractActivityTriggerComponent {
9469
10059
  super();
9470
10060
  }
9471
10061
  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"] }] });
10062
+ 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
10063
  }
9474
10064
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InlineActivityTriggerComponent, decorators: [{
9475
10065
  type: Component,
@@ -9593,7 +10183,7 @@ class PopupInteractionContextComponent extends DisposableComponent {
9593
10183
  isActive() {
9594
10184
  return this.interactionContext && this.interactionContext.isActive();
9595
10185
  }
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 });
10186
+ 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
10187
  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
10188
  }
9599
10189
  __decorate([
@@ -9607,7 +10197,7 @@ __decorate([
9607
10197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PopupInteractionContextComponent, decorators: [{
9608
10198
  type: Component,
9609
10199
  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: [{
10200
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$6.Overlay }, { type: i1$6.CdkScrollable, decorators: [{
9611
10201
  type: Optional
9612
10202
  }, {
9613
10203
  type: SkipSelf
@@ -9692,7 +10282,7 @@ class AddCardActivityComponent extends AbstractActivityTriggerComponent {
9692
10282
  return this.interactionStyle === 'inline';
9693
10283
  }
9694
10284
  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"] }] });
10285
+ 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
10286
  }
9697
10287
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AddCardActivityComponent, decorators: [{
9698
10288
  type: Component,
@@ -9768,7 +10358,7 @@ class AddItemInteractionContextComponent extends DisposableComponent {
9768
10358
  return this.interactionContext.startActivity(activityType, data);
9769
10359
  }
9770
10360
  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"] }] });
10361
+ 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
10362
  }
9773
10363
  __decorate([
9774
10364
  Proxify(),
@@ -9907,12 +10497,14 @@ class StringInputActivity extends InputActivity {
9907
10497
  [label]="activityData.label"
9908
10498
  [placeholder]="activityData.placeholder"
9909
10499
  [command.enter]="confirmCommand"
9910
- [command.escape]="cancelCommand"></aup-string-input>
10500
+ [command.escape]="cancelCommand"
10501
+ [dense]="true"
10502
+ ></aup-string-input>
9911
10503
  <aup-activity-actions [layout]="layout" align="end"
9912
10504
  [confirmFace]="confirmFace"
9913
10505
  [cancelFace]="cancelFace"
9914
10506
  ></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"] }] });
10507
+ `, 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
10508
  }
9917
10509
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputActivity, decorators: [{
9918
10510
  type: Component,
@@ -9923,7 +10515,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9923
10515
  [label]="activityData.label"
9924
10516
  [placeholder]="activityData.placeholder"
9925
10517
  [command.enter]="confirmCommand"
9926
- [command.escape]="cancelCommand"></aup-string-input>
10518
+ [command.escape]="cancelCommand"
10519
+ [dense]="true"
10520
+ ></aup-string-input>
9927
10521
  <aup-activity-actions [layout]="layout" align="end"
9928
10522
  [confirmFace]="confirmFace"
9929
10523
  [cancelFace]="cancelFace"
@@ -10106,7 +10700,7 @@ class InlineStringEditorComponent extends DisposableComponent {
10106
10700
  return !this.editingEnabled$.value;
10107
10701
  }
10108
10702
  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"] }] });
10703
+ 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
10704
  }
10111
10705
  __decorate([
10112
10706
  Proxify(),
@@ -10189,6 +10783,7 @@ class SelectInputActivity extends InputActivity {
10189
10783
  [options]="options"
10190
10784
  [optionLabelFormat]="optionLabelFormat"
10191
10785
  [allowNil]="activityData.allowNil"
10786
+ [dense]="true"
10192
10787
  >
10193
10788
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10194
10789
  </aup-select-input>
@@ -10196,7 +10791,7 @@ class SelectInputActivity extends InputActivity {
10196
10791
  [confirmFace]="confirmFace"
10197
10792
  [cancelFace]="cancelFace"
10198
10793
  ></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"] }] });
10794
+ `, 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
10795
  }
10201
10796
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputActivity, decorators: [{
10202
10797
  type: Component,
@@ -10211,6 +10806,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10211
10806
  [options]="options"
10212
10807
  [optionLabelFormat]="optionLabelFormat"
10213
10808
  [allowNil]="activityData.allowNil"
10809
+ [dense]="true"
10214
10810
  >
10215
10811
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10216
10812
  </aup-select-input>
@@ -10222,6 +10818,182 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10222
10818
  }]
10223
10819
  }] });
10224
10820
 
10821
+ const slideDownOnEnterDef = style({
10822
+ opacity: 0,
10823
+ 'height': '0',
10824
+ 'max-height': '0',
10825
+ paddingTop: '0',
10826
+ paddingBottom: '0'
10827
+ });
10828
+ // TODO: params aren't getting customised in the view. Need to figure out the correct approach.
10829
+ const slideDownOnEnterAnimation = trigger('slideDownOnEnter', [
10830
+ transition(':enter', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10831
+ transition(':leave', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10832
+ ]);
10833
+ const slideDownWhenOpenAnimation = trigger('slideDownWhenOpen', [
10834
+ transition('closed => open', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10835
+ transition('open => closed', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10836
+ ]);
10837
+ const slideLeftOnEnterDef = style({
10838
+ opacity: 0,
10839
+ 'width': '0',
10840
+ paddingLeft: '0',
10841
+ paddingRight: '0'
10842
+ });
10843
+ const slideRightOnEnterAnimation = trigger('slideRightOnEnter', [
10844
+ transition(':enter', [slideLeftOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10845
+ transition(':leave', [animate('{{duration}}', slideLeftOnEnterDef)], { params: { duration: '100ms' } })
10846
+ ]);
10847
+ const ZERO_WIDTH = {
10848
+ opacity: 0,
10849
+ width: '0',
10850
+ paddingLeft: '0',
10851
+ paddingRight: '0',
10852
+ };
10853
+ const ZERO_HEIGHT = {
10854
+ opacity: 0,
10855
+ height: '0',
10856
+ paddingTop: '0',
10857
+ paddingBottom: '0',
10858
+ };
10859
+ const slideDownAndRightOnEnterAnimation = trigger('slideDownAndRightOnEnter', [
10860
+ transition(':enter', [
10861
+ style({ overflow: "hidden", whiteSpace: "nowrap", ...ZERO_WIDTH, ...ZERO_HEIGHT }),
10862
+ animate('{{duration}}')
10863
+ ], { params: { duration: '100ms' } }),
10864
+ transition(':leave', [
10865
+ style({ overflow: "hidden", whiteSpace: "nowrap" }),
10866
+ group([
10867
+ animate('{{duration}}', style(ZERO_HEIGHT)),
10868
+ // Hack: 100ms is too quick as it animates from * - 0 as we only see it animate the width is greater than the parent.
10869
+ // Not sure how to animate from * to natural new width of parent. This hack won't work for text that's just a little
10870
+ // bit wider than the parent as it'll fall within the parent bounds very early in the animation cycle.
10871
+ animate('300ms', style(ZERO_WIDTH)),
10872
+ ])
10873
+ ], { params: { duration: '100ms' } })
10874
+ ]);
10875
+
10876
+ const cssDurationRegex = /(\d+)(m?s)/;
10877
+ /**
10878
+ * This interaction context remains hidden (height: 0) until it is active.
10879
+ * @example
10880
+ * <aup-slide-down-interaction-context #inPlaceInteractionContext>
10881
+ * </aup-slide-down-interaction-context>
10882
+ *
10883
+ * in your component
10884
+ * @ViewChild(SlideDownInteractionContextComponent)
10885
+ * interactionContext: InteractionContext;
10886
+ *
10887
+ *
10888
+ */
10889
+ class SlideDownInteractionContextComponent extends DisposableComponent {
10890
+ tabConfig;
10891
+ activityContainerComponent;
10892
+ // NOTE: disabling this as I'm using the initialise callback to release the hacky height clamp.
10893
+ // The whole registration thing is a bit naf so I should really clean that up at some point.
10894
+ // /**
10895
+ // * If true the activity will sync with the router to enable back button support. This is a work around for
10896
+ // * deeply nested activities that can't be linked with the root place interactionContext hook for cancelling
10897
+ // * active interactions.
10898
+ // */
10899
+ // @Input()
10900
+ // syncWithRoutes = true;
10901
+ dynamicHeight = true;
10902
+ get active() {
10903
+ return this.isActive();
10904
+ }
10905
+ // Horrible hack to stop the div and activity container bouncing back for a bit in after closing. No idea why it's doing that.
10906
+ clampShut = true;
10907
+ interactionService = this.inject(InteractionService);
10908
+ constructor(tabConfig) {
10909
+ super();
10910
+ this.tabConfig = tabConfig;
10911
+ }
10912
+ ngAfterViewInit() {
10913
+ // NOTE: this is a temp work around to detach inplace contexts from the router until AUP-88 is implemented.
10914
+ // https://coolon.atlassian.net/browse/AUP-88?atlOrigin=eyJpIjoiOTg5YjEzZGUzZjRmNDg0NmExOWU3ZGJmMzJiNTRmNGYiLCJwIjoiaiJ9
10915
+ const self = this;
10916
+ this.activityContainerComponent.initialise("dont-care", {
10917
+ async notifyActive(interactionContext) {
10918
+ self.clampShut = false;
10919
+ return undefined;
10920
+ },
10921
+ async notifyFinished(interactionContext) {
10922
+ return undefined;
10923
+ }
10924
+ });
10925
+ // if (this.syncWithRoutes) {
10926
+ // this.interactionService.registerInplaceInteractionContext(this);
10927
+ // }
10928
+ }
10929
+ getAnimationState() {
10930
+ return {
10931
+ value: this.isActive() ? "open" : "closed",
10932
+ params: { duration: "200ms" }
10933
+ };
10934
+ }
10935
+ // this is a regsitration callback from the interaction service
10936
+ // @Trace() // webstorm says no usages... but I'm not sure.
10937
+ onInplaceInteractionContextRegistered(id, api) {
10938
+ this.activityContainerComponent.initialise(id, api);
10939
+ }
10940
+ get identifier() {
10941
+ return this.activityContainerComponent.identifier;
10942
+ }
10943
+ alert(alert) {
10944
+ return this.activityContainerComponent.alert(alert);
10945
+ }
10946
+ cancelActiveActivity() {
10947
+ return this.activityContainerComponent.cancelActiveActivity();
10948
+ }
10949
+ confirm(confirm) {
10950
+ return this.activityContainerComponent.confirm(confirm);
10951
+ }
10952
+ confirmOrReject(confirm) {
10953
+ return this.activityContainerComponent.confirmOrReject(confirm);
10954
+ }
10955
+ confirmThen(confirm, activityType, data) {
10956
+ return this.activityContainerComponent.confirmThen(confirm, activityType);
10957
+ }
10958
+ confirmThenExecute(confirm, operation) {
10959
+ return this.activityContainerComponent.confirmThenExecute(confirm, operation);
10960
+ }
10961
+ isActive() {
10962
+ return this.activityContainerComponent.isActive();
10963
+ }
10964
+ startActivity(activityType, data, options) {
10965
+ return this.activityContainerComponent.startActivity(activityType, data, options);
10966
+ }
10967
+ onAnimationDone() {
10968
+ if (!this.isActive()) {
10969
+ this.clampShut = true;
10970
+ }
10971
+ }
10972
+ 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 });
10973
+ 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" } }, 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: [
10974
+ slideDownWhenOpenAnimation
10975
+ ] });
10976
+ }
10977
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SlideDownInteractionContextComponent, decorators: [{
10978
+ type: Component,
10979
+ args: [{ selector: "aup-slide-down-interaction-context", animations: [
10980
+ slideDownWhenOpenAnimation
10981
+ ], 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"] }]
10982
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
10983
+ type: Inject,
10984
+ args: [MAT_TABS_CONFIG]
10985
+ }, {
10986
+ type: Optional
10987
+ }] }]; }, propDecorators: { activityContainerComponent: [{
10988
+ type: ViewChild,
10989
+ args: ["activityContainer", { static: true }]
10990
+ }], dynamicHeight: [{
10991
+ type: Input
10992
+ }], active: [{
10993
+ type: HostBinding,
10994
+ args: ["class.active"]
10995
+ }] } });
10996
+
10225
10997
  class InteractionContextTriggerForDirective extends GarbageCollector {
10226
10998
  aupInteractionContextTriggerFor;
10227
10999
  activityClass;
@@ -10304,6 +11076,7 @@ class InteractionModule {
10304
11076
  AlertDialogComponent,
10305
11077
  ActivityOutletComponent,
10306
11078
  InPlaceInteractionContextComponent,
11079
+ SlideDownInteractionContextComponent,
10307
11080
  AddItemInteractionContextComponent,
10308
11081
  ActivityActionsComponent,
10309
11082
  PopupInteractionContextComponent,
@@ -10330,8 +11103,6 @@ class InteractionModule {
10330
11103
  RouterModule,
10331
11104
  MatIconModule,
10332
11105
  DirectivesModule,
10333
- FlexModule,
10334
- GridModule,
10335
11106
  ComponentsModule,
10336
11107
  FormsModule,
10337
11108
  MatInputModule,
@@ -10351,7 +11122,8 @@ class InteractionModule {
10351
11122
  InlineActivityTriggerComponent,
10352
11123
  ModalActivityTriggerComponent,
10353
11124
  AddCardActivityComponent,
10354
- InlineStringEditorComponent] });
11125
+ InlineStringEditorComponent,
11126
+ SlideDownInteractionContextComponent] });
10355
11127
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InteractionModule, providers: [
10356
11128
  InteractionService
10357
11129
  // {
@@ -10365,8 +11137,6 @@ class InteractionModule {
10365
11137
  RouterModule,
10366
11138
  MatIconModule,
10367
11139
  DirectivesModule,
10368
- FlexModule,
10369
- GridModule,
10370
11140
  ComponentsModule,
10371
11141
  FormsModule,
10372
11142
  MatInputModule,
@@ -10385,8 +11155,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10385
11155
  RouterModule,
10386
11156
  MatIconModule,
10387
11157
  DirectivesModule,
10388
- FlexModule,
10389
- GridModule,
10390
11158
  ComponentsModule,
10391
11159
  FormsModule,
10392
11160
  MatInputModule,
@@ -10401,6 +11169,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10401
11169
  AlertDialogComponent,
10402
11170
  ActivityOutletComponent,
10403
11171
  InPlaceInteractionContextComponent,
11172
+ SlideDownInteractionContextComponent,
10404
11173
  AddItemInteractionContextComponent,
10405
11174
  ActivityActionsComponent,
10406
11175
  PopupInteractionContextComponent,
@@ -10438,6 +11207,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10438
11207
  ModalActivityTriggerComponent,
10439
11208
  AddCardActivityComponent,
10440
11209
  InlineStringEditorComponent,
11210
+ SlideDownInteractionContextComponent,
10441
11211
  ],
10442
11212
  providers: [
10443
11213
  InteractionService
@@ -10508,7 +11278,6 @@ class PlaceOutletComponent extends DisposableComponent {
10508
11278
  router;
10509
11279
  placeRouter;
10510
11280
  placeConfig;
10511
- cdr;
10512
11281
  #animate$_accessor_storage = proxify((ValueModel));
10513
11282
  get animate$() { return this.#animate$_accessor_storage; }
10514
11283
  set animate$(value) { this.#animate$_accessor_storage = value; }
@@ -10542,12 +11311,11 @@ class PlaceOutletComponent extends DisposableComponent {
10542
11311
  animationEnabled;
10543
11312
  authorised;
10544
11313
  notAuthorisedNoticePortal;
10545
- constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet, cdr) {
11314
+ constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet) {
10546
11315
  super();
10547
11316
  this.router = router;
10548
11317
  this.placeRouter = placeRouter;
10549
11318
  this.placeConfig = placeConfig;
10550
- this.cdr = cdr;
10551
11319
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
10552
11320
  this.parentOutletModel = new MutableValueModel(parentOutlet);
10553
11321
  const defaultPlaceAnimationOrder = chain(this.parentOutletModel)
@@ -10559,7 +11327,7 @@ class PlaceOutletComponent extends DisposableComponent {
10559
11327
  this.placesInAnimationOrder = chain(this.customPlaceAnimationOrder$)
10560
11328
  .otherwise(defaultPlaceAnimationOrder);
10561
11329
  this.activePlaceAnimationPosition = this.placesInAnimationOrder
10562
- .reduce((placesInOrder) => {
11330
+ .reduceAll((placesInOrder) => {
10563
11331
  let placeIndex = 0;
10564
11332
  if (activatePlaceType.value) {
10565
11333
  placeIndex = placesInOrder.indexOf(activatePlaceType.value);
@@ -10713,8 +11481,8 @@ class PlaceOutletComponent extends DisposableComponent {
10713
11481
  this.onAnimationFinishedJob = undefined;
10714
11482
  }
10715
11483
  }
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] });
11484
+ 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 });
11485
+ 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
11486
  }
10719
11487
  __decorate([
10720
11488
  Proxify(),
@@ -10735,7 +11503,7 @@ __decorate([
10735
11503
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceOutletComponent, decorators: [{
10736
11504
  type: Component,
10737
11505
  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: [{
11506
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: PlaceRouter }, { type: undefined, decorators: [{
10739
11507
  type: Optional
10740
11508
  }, {
10741
11509
  type: Inject,
@@ -10749,7 +11517,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10749
11517
  type: SkipSelf
10750
11518
  }, {
10751
11519
  type: Optional
10752
- }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { animate$: [{
11520
+ }] }]; }, propDecorators: { animate$: [{
10753
11521
  type: Input
10754
11522
  }], animate: [{
10755
11523
  type: Input
@@ -10882,7 +11650,7 @@ class ListPlaceNavComponent extends AbstractPlaceNavigationComponent {
10882
11650
  super(router);
10883
11651
  }
10884
11652
  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"] }] });
11653
+ 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
11654
  }
10887
11655
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ListPlaceNavComponent, decorators: [{
10888
11656
  type: Component,
@@ -10957,7 +11725,7 @@ class SidePlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10957
11725
  this.expanded = !this.expanded;
10958
11726
  }
10959
11727
  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"] }] });
11728
+ 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
11729
  }
10962
11730
  __decorate([
10963
11731
  Proxify(),
@@ -10969,7 +11737,7 @@ __decorate([
10969
11737
  ], SidePlaceNavigationComponent.prototype, "expanded", null);
10970
11738
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SidePlaceNavigationComponent, decorators: [{
10971
11739
  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"] }]
11740
+ 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
11741
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { expanded$: [{
10974
11742
  type: Input
10975
11743
  }], expanded: [{
@@ -10987,7 +11755,7 @@ class TabbedPlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10987
11755
  super(router);
10988
11756
  }
10989
11757
  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"] }] });
11758
+ 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
11759
  }
10992
11760
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TabbedPlaceNavigationComponent, decorators: [{
10993
11761
  type: Component,
@@ -11010,7 +11778,6 @@ class PlaceModule {
11010
11778
  MatTooltipModule,
11011
11779
  MatIconModule,
11012
11780
  DirectivesModule,
11013
- FlexModule,
11014
11781
  ComponentsModule,
11015
11782
  PortalModule,
11016
11783
  MatCardModule], exports: [PlaceOutletComponent,
@@ -11027,7 +11794,6 @@ class PlaceModule {
11027
11794
  MatTooltipModule,
11028
11795
  MatIconModule,
11029
11796
  DirectivesModule,
11030
- FlexModule,
11031
11797
  ComponentsModule,
11032
11798
  PortalModule,
11033
11799
  MatCardModule] });
@@ -11045,7 +11811,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11045
11811
  MatTooltipModule,
11046
11812
  MatIconModule,
11047
11813
  DirectivesModule,
11048
- FlexModule,
11049
11814
  ComponentsModule,
11050
11815
  PortalModule,
11051
11816
  MatCardModule
@@ -11135,60 +11900,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11135
11900
  }]
11136
11901
  }] });
11137
11902
 
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
11903
  /**
11189
11904
  * @file Automatically generated by barrelsby.
11190
11905
  */
11191
11906
 
11907
+ class ResizeObserverDirective extends DisposableComponent {
11908
+ aupOnResize = new EventEmitter();
11909
+ elementRef = this.inject(ElementRef);
11910
+ ngZone = this.inject(NgZone);
11911
+ _bounds$ = new MutableValueModel();
11912
+ ngAfterViewInit() {
11913
+ const element = this.elementRef.nativeElement;
11914
+ const ro = new ResizeObserver((entries, observer) => {
11915
+ this.ngZone.run(() => this._updateBounds());
11916
+ });
11917
+ ro.observe(element);
11918
+ this.onDispose(() => ro.disconnect());
11919
+ setTimeout(() => this._updateBounds());
11920
+ }
11921
+ get bounds$() {
11922
+ return this._bounds$.readonly$;
11923
+ }
11924
+ _updateBounds() {
11925
+ this._bounds$.value = Bounds.ofElement(this.elementRef.nativeElement);
11926
+ this.aupOnResize.emit(this._bounds$.value);
11927
+ }
11928
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
11929
+ 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 });
11930
+ }
11931
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, decorators: [{
11932
+ type: Directive,
11933
+ args: [{
11934
+ selector: "[aupOnResize]",
11935
+ standalone: true
11936
+ }]
11937
+ }], propDecorators: { aupOnResize: [{
11938
+ type: Output
11939
+ }] } });
11940
+
11192
11941
  /**
11193
11942
  * @file Automatically generated by barrelsby.
11194
11943
  */
@@ -11279,7 +12028,7 @@ class DialogInteractionContextFactory extends ModalInteractionContextFactory {
11279
12028
  };
11280
12029
  return new DialogInteractionContext(identifier, api, this.dialogService, config);
11281
12030
  }
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 });
12031
+ 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
12032
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, providedIn: 'root' });
11284
12033
  }
11285
12034
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, decorators: [{
@@ -11287,12 +12036,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11287
12036
  args: [{
11288
12037
  providedIn: 'root'
11289
12038
  }]
11290
- }], ctorParameters: function () { return [{ type: i1$6.MatDialog }, { type: i1$6.MatDialogConfig, decorators: [{
12039
+ }], ctorParameters: function () { return [{ type: i1$7.MatDialog }, { type: i1$7.MatDialogConfig, decorators: [{
11291
12040
  type: Optional
11292
12041
  }, {
11293
12042
  type: Inject,
11294
12043
  args: [DIALOG_INTERACTION_SERVICE_DEFAULTS]
11295
- }] }, { type: i1$6.MatDialogConfig, decorators: [{
12044
+ }] }, { type: i1$7.MatDialogConfig, decorators: [{
11296
12045
  type: Optional
11297
12046
  }, {
11298
12047
  type: Inject,
@@ -11412,6 +12161,7 @@ class PlaceGuard {
11412
12161
  }
11413
12162
  // @Trace()
11414
12163
  async canActivate(activatedRoute, state) {
12164
+ await this.placeRouter.waitUntilRouterReady();
11415
12165
  if (PlaceComponent.isPlaceComponentConstructor(activatedRoute.component)) {
11416
12166
  const placeDefinition = PlaceComponent.getDefinition(activatedRoute.component);
11417
12167
  if (placeDefinition.authenticate) {
@@ -11524,13 +12274,13 @@ class PlaceGuard {
11524
12274
  return next();
11525
12275
  }
11526
12276
  }
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 });
12277
+ 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
12278
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, providedIn: 'root' });
11529
12279
  }
11530
12280
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, decorators: [{
11531
12281
  type: Injectable,
11532
12282
  args: [{ providedIn: 'root' }]
11533
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
12283
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
11534
12284
 
11535
12285
  var Formatter;
11536
12286
  (function (Formatter) {
@@ -11564,69 +12314,74 @@ var Formatter;
11564
12314
  Formatter.BOOLEAN = new BooleanType();
11565
12315
  })(Formatter || (Formatter = {}));
11566
12316
 
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
- }
12317
+ // function installMechanics<M extends HasValue<any>>(parameterDef: ParameterDefinition<any>, prototype: object, propertyKey: string | symbol, tagPrefix: string) {
12318
+ //
12319
+ // Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12320
+ //
12321
+ // function getMechanics(instance: M, propertyName: string | symbol) {
12322
+ // const key = `__mechanics_${propertyName.toString()}`;
12323
+ // if (!instance[key]) {
12324
+ // const backingModel = parameterDef.createBackingModel();
12325
+ // instance[key] = {
12326
+ // backingModel: backingModel,
12327
+ // binding: null as Binding<any, any>
12328
+ // };
12329
+ // const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
12330
+ // DebugContext.getOrCreate(instance[key].backingModel).tag(tag);
12331
+ // }
12332
+ // return instance[key];
12333
+ // }
12334
+ //
12335
+ // Object.defineProperty(prototype, propertyKey, {
12336
+ // get: function() {
12337
+ // return getMechanics(this, propertyKey).backingModel;
12338
+ // },
12339
+ // set: function(userModel: M) {
12340
+ // const mechanics = getMechanics(this, propertyKey);
12341
+ // // This handles the scenario where we want to push an existing value model (such as a form model)
12342
+ // // to and from the route.
12343
+ // if (mechanics.binding) {
12344
+ // mechanics.binding.dispose();
12345
+ // }
12346
+ // if (userModel) {
12347
+ // mechanics.binding = new Binding(mechanics.backingModel, userModel, {
12348
+ // toLeft: Functions.identity,
12349
+ // toRight: Functions.identity
12350
+ // });
12351
+ // if (parameterDef.isEmptyValue(userModel.value)) {
12352
+ // // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});
12353
+ // mechanics.binding.writeRight(); // push the visit into the user model;
12354
+ // } else {
12355
+ // if (!parameterDef.isEmptyValue(mechanics.backingModel.value)) {
12356
+ // console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');
12357
+ // }
12358
+ // mechanics.binding.writeLeft(); // push the user model into the visit
12359
+ // }
12360
+ // }
12361
+ // }
12362
+ // });
12363
+ // }
11612
12364
  function RouteId(formatter, options) {
11613
12365
  return (prototype, propertyKey) => {
11614
12366
  const parameterDef = new ParameterDefinition.RouteId(propertyKey.toString(), options, formatter);
11615
- installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12367
+ // installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12368
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
11616
12369
  };
11617
12370
  }
11618
12371
  function VisitParameter(options) {
11619
12372
  const opts = Opts.get(options);
11620
12373
  return (prototype, propertyKey) => {
11621
12374
  const parameterDef = new ParameterDefinition.ValueParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11622
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
12375
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12376
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
11623
12377
  };
11624
12378
  }
11625
12379
  function VisitParameterList(options) {
11626
12380
  const opts = Opts.get(options);
11627
12381
  return (prototype, propertyKey) => {
11628
12382
  const parameterDef = new ParameterDefinition.ArrayParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11629
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
12383
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12384
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
11630
12385
  };
11631
12386
  }
11632
12387
 
@@ -11720,5 +12475,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11720
12475
  * Generated bundle index. Do not edit.
11721
12476
  */
11722
12477
 
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 };
12478
+ export { ACTIVITY_DATA, ALERT_CONFIG, AUP_PLACE_CONFIG, AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER, 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, 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, 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
12479
  //# sourceMappingURL=coolon-angular-ui-powerups.mjs.map