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

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 +20 -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 +64 -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 +40 -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 +14 -7
  59. package/esm2022/lib/components/tables/tree-table/tree-table-model.mjs +4 -4
  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 +1311 -538
  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 +12 -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 +26 -7
  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 +3 -2
  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,26 @@ 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 or when it is contained within another component that
242
+ * does (e.g. aup-table, aup-tree-table)
243
+ * @param models
244
+ * @protected
245
+ */
246
+ viewStateDependsOn(...models) {
247
+ const { when } = Dsl.disposeWith(this);
248
+ when.anyOf(...models).changes(() => this.cdr.markForCheck());
267
249
  }
268
250
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DisposableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
269
251
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: DisposableComponent, usesInheritance: true, ngImport: i0 });
@@ -736,42 +718,42 @@ var CommandFace;
736
718
  }
737
719
  }
738
720
  __decorate([
739
- Memoize(),
721
+ MemoizeGet(),
740
722
  __metadata("design:type", Object),
741
723
  __metadata("design:paramtypes", [])
742
724
  ], Adapter.prototype, "text", null);
743
725
  __decorate([
744
- Memoize(),
726
+ MemoizeGet(),
745
727
  __metadata("design:type", Object),
746
728
  __metadata("design:paramtypes", [])
747
729
  ], Adapter.prototype, "icon", null);
748
730
  __decorate([
749
- Memoize(),
731
+ MemoizeGet(),
750
732
  __metadata("design:type", Object),
751
733
  __metadata("design:paramtypes", [])
752
734
  ], Adapter.prototype, "iconPosition", null);
753
735
  __decorate([
754
- Memoize(),
736
+ MemoizeGet(),
755
737
  __metadata("design:type", Object),
756
738
  __metadata("design:paramtypes", [])
757
739
  ], Adapter.prototype, "tooltip", null);
758
740
  __decorate([
759
- Memoize(),
741
+ MemoizeGet(),
760
742
  __metadata("design:type", Boolean),
761
743
  __metadata("design:paramtypes", [])
762
744
  ], Adapter.prototype, "iconPositionStart", null);
763
745
  __decorate([
764
- Memoize(),
746
+ MemoizeGet(),
765
747
  __metadata("design:type", Boolean),
766
748
  __metadata("design:paramtypes", [])
767
749
  ], Adapter.prototype, "iconPositionEnd", null);
768
750
  __decorate([
769
- Memoize(),
751
+ MemoizeGet(),
770
752
  __metadata("design:type", String),
771
753
  __metadata("design:paramtypes", [])
772
754
  ], Adapter.prototype, "color", null);
773
755
  __decorate([
774
- Memoize(),
756
+ MemoizeGet(),
775
757
  __metadata("design:type", String),
776
758
  __metadata("design:paramtypes", [])
777
759
  ], Adapter.prototype, "style", null);
@@ -842,6 +824,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
842
824
  args: ["class.disable-scroll"]
843
825
  }] } });
844
826
 
827
+ /* eslint-disable @angular-eslint/no-host-metadata-property */
845
828
  class IconComponent {
846
829
  _icon;
847
830
  prefix;
@@ -873,11 +856,13 @@ class IconComponent {
873
856
  return `fa-${this.suffix}`;
874
857
  }
875
858
  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"] }] });
859
+ 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
860
  }
878
861
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: IconComponent, decorators: [{
879
862
  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"] }]
863
+ args: [{ selector: 'aup-icon', changeDetection: ChangeDetectionStrategy.OnPush, host: {
864
+ class: "mat-icon" // this ensures angular form styles that target mat icon also work with us
865
+ }, 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
866
  }], propDecorators: { icon: [{
882
867
  type: Input
883
868
  }, {
@@ -908,6 +893,7 @@ class CommandFaceComponent extends DisposableComponent {
908
893
  // tslint:disable-next-line:no-input-rename
909
894
  get _rawFaces() { return this.#_rawFaces_accessor_storage; }
910
895
  set _rawFaces(value) { this.#_rawFaces_accessor_storage = value; }
896
+ hasTextAndLeadingIcon$;
911
897
  set face(face) {
912
898
  this.faces$.value = [face];
913
899
  }
@@ -927,6 +913,7 @@ class CommandFaceComponent extends DisposableComponent {
927
913
  const activeFace = this.faceAdapters.first();
928
914
  this.activeIcon = activeFace.pluck("icon");
929
915
  this.activeColor = activeFace.pluck("color");
916
+ this.hasTextAndLeadingIcon$ = valueOf.all(this.activeIcon.isNotNil(), activeFace.pluckString('text').isNotBlank(), activeFace.pluck("iconPosition").doesNotEqual(CommandFace.Position.END)).areTruthy();
930
917
  }
931
918
  shouldIncludeIcon(face) {
932
919
  return (!this.ignoreIcon && face.icon) || this.includeMissingIconInLayout;
@@ -940,8 +927,11 @@ class CommandFaceComponent extends DisposableComponent {
940
927
  get color() {
941
928
  return this.activeColor.value;
942
929
  }
930
+ get hasTextAndIcon() {
931
+ return this.hasTextAndLeadingIcon$.value;
932
+ }
943
933
  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 });
934
+ 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
935
  }
946
936
  __decorate([
947
937
  StoreInListModel("faces$"),
@@ -949,7 +939,7 @@ __decorate([
949
939
  ], CommandFaceComponent.prototype, "_rawFaces", null);
950
940
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CommandFaceComponent, decorators: [{
951
941
  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"] }]
942
+ 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
943
  }], ctorParameters: function () { return []; }, propDecorators: { _rawFaces: [{
954
944
  type: Input,
955
945
  args: ['faces']
@@ -967,6 +957,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
967
957
  }], color: [{
968
958
  type: HostBinding,
969
959
  args: ['attr.color']
960
+ }], hasTextAndIcon: [{
961
+ type: HostBinding,
962
+ args: ['class.has-text-and-leading-icon']
970
963
  }] } });
971
964
 
972
965
  /**
@@ -1070,11 +1063,11 @@ class CardContainerComponent extends AbstractCardContainerComponent {
1070
1063
  }
1071
1064
  }
1072
1065
  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"] }] });
1066
+ 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
1067
  }
1075
1068
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CardContainerComponent, decorators: [{
1076
1069
  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"] }]
1070
+ 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
1071
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { columnCount: [{
1079
1072
  type: Input
1080
1073
  }], enableScroll: [{
@@ -1150,14 +1143,24 @@ class CommandComponent extends PopupAwareComponent {
1150
1143
  activeFace$;
1151
1144
  iconOnly$;
1152
1145
  tooltip$;
1146
+ visible$;
1153
1147
  constructor(element, parent) {
1154
1148
  super(element, parent);
1155
1149
  const { chain, switchOn } = Dsl.disposeWith(this);
1156
- this.faces$ = chain(this.command.busy$).mapToList(busy => {
1150
+ this.faces$ = chain(this.command.busy$)
1151
+ .mapToList(busy => {
1157
1152
  return busy ?
1158
- [this.busyFace$.value, this.face$.value] :
1159
- [this.face$.value, this.busyFace$.value];
1160
- }, { allowNil: true, dependsOn: [this.face$, this.busyFace$] })
1153
+ [this.busyFace$.value ?? this.command.busyFace$.value, this.face$.value ?? this.command.defaultFace$.value] :
1154
+ [this.face$.value ?? this.command.defaultFace$.value, this.busyFace$.value ?? this.command.busyFace$.value];
1155
+ }, {
1156
+ allowNil: true,
1157
+ dependsOn: [
1158
+ this.face$,
1159
+ this.busyFace$,
1160
+ this.command.defaultFace$,
1161
+ this.command.busyFace$
1162
+ ]
1163
+ })
1161
1164
  .rejectNil();
1162
1165
  this.activeFace$ = this.faces$.first();
1163
1166
  this.buttonStyle$ = chain(this.activeFace$).map(f => CommandFace.getStyleOf(f));
@@ -1166,18 +1169,19 @@ class CommandComponent extends PopupAwareComponent {
1166
1169
  this.iconOnly$ = this.faces$.select(face => {
1167
1170
  return isEmpty(CommandFace.getTextOf(face)) && !isEmpty(CommandFace.getIconOf(face));
1168
1171
  }).count().equals(this.faces$.count());
1172
+ this.visible$ = chain(this.command.visible$);
1173
+ }
1174
+ get cssDisplayProperty() {
1175
+ return this.visible$.value ? undefined : 'none';
1169
1176
  }
1170
1177
  isActive(face) {
1171
1178
  return this.activeFace$.query().equals(face);
1172
1179
  }
1173
- getFace() {
1174
- return this.face;
1175
- }
1176
1180
  requestFocus() {
1177
1181
  this.button.focus();
1178
1182
  }
1179
1183
  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"] }] });
1184
+ 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
1185
  }
1182
1186
  __decorate([
1183
1187
  Proxify(),
@@ -1225,6 +1229,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1225
1229
  }], button: [{
1226
1230
  type: ViewChild,
1227
1231
  args: [MatButton]
1232
+ }], cssDisplayProperty: [{
1233
+ type: HostBinding,
1234
+ args: ["style.display"]
1228
1235
  }] } });
1229
1236
 
1230
1237
  /**
@@ -1252,12 +1259,12 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1252
1259
  xPosition = 'after';
1253
1260
  yPosition = 'below';
1254
1261
  triggers;
1255
- #enabled_accessor_storage;
1256
- get enabled() { return this.#enabled_accessor_storage; }
1257
- set enabled(value) { this.#enabled_accessor_storage = value; }
1258
1262
  #enabled$_accessor_storage = proxify((ValueModel));
1259
1263
  get enabled$() { return this.#enabled$_accessor_storage; }
1260
1264
  set enabled$(value) { this.#enabled$_accessor_storage = value; }
1265
+ #enabled_accessor_storage = true;
1266
+ get enabled() { return this.#enabled_accessor_storage; }
1267
+ set enabled(value) { this.#enabled_accessor_storage = value; }
1261
1268
  children;
1262
1269
  faces$;
1263
1270
  constructor(element, parent) {
@@ -1299,16 +1306,16 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1299
1306
  return this.faceAdapter.face;
1300
1307
  }
1301
1308
  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 });
1309
+ 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
1310
  }
1304
- __decorate([
1305
- StoreInValueModel(),
1306
- __metadata("design:type", Boolean)
1307
- ], AbstractPopupMenuComponent.prototype, "enabled", null);
1308
1311
  __decorate([
1309
1312
  Proxify(),
1310
1313
  __metadata("design:type", Object)
1311
1314
  ], AbstractPopupMenuComponent.prototype, "enabled$", null);
1315
+ __decorate([
1316
+ StoreInValueModel(),
1317
+ __metadata("design:type", Object)
1318
+ ], AbstractPopupMenuComponent.prototype, "enabled", null);
1312
1319
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractPopupMenuComponent, decorators: [{
1313
1320
  type: Component,
1314
1321
  args: [{ selector: 'aup-abstract-popup-menu', template: '' }]
@@ -1322,10 +1329,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1322
1329
  }], triggers: [{
1323
1330
  type: ViewChildren,
1324
1331
  args: [MatMenuTrigger]
1325
- }], enabled: [{
1326
- type: Input
1327
1332
  }], enabled$: [{
1328
1333
  type: Input
1334
+ }], enabled: [{
1335
+ type: Input
1329
1336
  }] } });
1330
1337
 
1331
1338
  class CommandContainer extends GarbageCollector {
@@ -1358,13 +1365,15 @@ class ToolBarComponent extends CommandContainer {
1358
1365
  get orientation() {
1359
1366
  return CommandContainer.Orientation.HORIZONTAL;
1360
1367
  }
1361
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, deps: [{ token: CommandContainer }], target: i0.ɵɵFactoryTarget.Component });
1368
+ 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
1369
  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
1370
  }
1364
1371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, decorators: [{
1365
1372
  type: Component,
1366
1373
  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 }]; } });
1374
+ }], ctorParameters: function () { return [{ type: CommandContainer, decorators: [{
1375
+ type: Optional
1376
+ }] }]; } });
1368
1377
 
1369
1378
  /**
1370
1379
  *
@@ -1675,7 +1684,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1675
1684
  args: ['blur']
1676
1685
  }] } });
1677
1686
 
1678
- /* tslint:disable:no-input-rename */
1679
1687
  const INPUT_TOKEN_HACK = new InjectionToken("INPUT_TOKEN_HACK");
1680
1688
  class AbstractInputComponent extends DisposableComponent {
1681
1689
  onValueEditedListeners = new EventListenerList();
@@ -1690,11 +1698,16 @@ class AbstractInputComponent extends DisposableComponent {
1690
1698
  * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).
1691
1699
  */
1692
1700
  formValue$;
1693
- label;
1694
- // eslint-disable-next-line @angular-eslint/no-input-rename
1701
+ #i18n$_accessor_storage = proxify((MutableValueModel));
1702
+ get i18n$() { return this.#i18n$_accessor_storage; }
1703
+ set i18n$(value) { this.#i18n$_accessor_storage = value; }
1704
+ #i18n_accessor_storage;
1705
+ get i18n() { return this.#i18n_accessor_storage; }
1706
+ set i18n(value) { this.#i18n_accessor_storage = value; }
1707
+ _label;
1695
1708
  userFloatLabel = 'always'; // TODO: make this an injectable default
1696
- hint;
1697
- placeholder;
1709
+ _hint;
1710
+ _placeholder;
1698
1711
  dense = false;
1699
1712
  _enabled$ = this.registerDisposable(new DelegatingValueModel());
1700
1713
  set enabled$(condition$) {
@@ -1761,6 +1774,9 @@ class AbstractInputComponent extends DisposableComponent {
1761
1774
  isEnabled() {
1762
1775
  return this.enabled$.value;
1763
1776
  }
1777
+ get disabled() {
1778
+ return !this.isEnabled();
1779
+ }
1764
1780
  hasErrors() {
1765
1781
  return !this.errorList$.query().isEmpty();
1766
1782
  }
@@ -1773,6 +1789,15 @@ class AbstractInputComponent extends DisposableComponent {
1773
1789
  get focusContext() {
1774
1790
  return this.formValue$.focusContext;
1775
1791
  }
1792
+ get label() {
1793
+ return this._label ?? this.i18n?.label();
1794
+ }
1795
+ get hint() {
1796
+ return this._hint ?? this.hackyGetI18n("hint");
1797
+ }
1798
+ get placeholder() {
1799
+ return this._placeholder ?? this.hackyGetI18n("placeholder");
1800
+ }
1776
1801
  get floatLabel() {
1777
1802
  // return this.dense ? 'never' : this.userFloatLabel;
1778
1803
  return this.userFloatLabel;
@@ -1787,24 +1812,45 @@ class AbstractInputComponent extends DisposableComponent {
1787
1812
  onValueEdited(callback) {
1788
1813
  return this.onValueEditedListeners.add(callback);
1789
1814
  }
1815
+ hackyGetI18n(key) {
1816
+ // TODO: update I18n to make it possible to get an optional value with return the missing key message.
1817
+ const i18nFn = this.i18n ? this.i18n[key] : undefined;
1818
+ const i18nValue = i18nFn && i18nFn();
1819
+ return i18nValue?.startsWith("missing key") ? undefined : i18nValue;
1820
+ }
1790
1821
  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 });
1822
+ 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
1823
  }
1824
+ __decorate([
1825
+ Proxify(),
1826
+ __metadata("design:type", Object)
1827
+ ], AbstractInputComponent.prototype, "i18n$", null);
1828
+ __decorate([
1829
+ StoreInValueModel(),
1830
+ __metadata("design:type", Object)
1831
+ ], AbstractInputComponent.prototype, "i18n", null);
1793
1832
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractInputComponent, decorators: [{
1794
1833
  type: Component,
1795
1834
  args: [{ template: '' }]
1796
1835
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1797
1836
  type: Inject,
1798
1837
  args: [INPUT_TOKEN_HACK]
1799
- }] }]; }, propDecorators: { label: [{
1838
+ }] }]; }, propDecorators: { i18n$: [{
1839
+ type: Input
1840
+ }], i18n: [{
1800
1841
  type: Input
1842
+ }], _label: [{
1843
+ type: Input,
1844
+ args: ["label"]
1801
1845
  }], userFloatLabel: [{
1802
1846
  type: Input,
1803
1847
  args: ['floatLabel']
1804
- }], hint: [{
1805
- type: Input
1806
- }], placeholder: [{
1807
- type: Input
1848
+ }], _hint: [{
1849
+ type: Input,
1850
+ args: ['hint']
1851
+ }], _placeholder: [{
1852
+ type: Input,
1853
+ args: ['placeholder']
1808
1854
  }], dense: [{
1809
1855
  type: HostBinding,
1810
1856
  args: ['class.dense']
@@ -1847,6 +1893,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1847
1893
  }], notifyFocusOut: [{
1848
1894
  type: HostListener,
1849
1895
  args: ['focusout']
1896
+ }], disabled: [{
1897
+ type: HostBinding,
1898
+ args: ["class.disabled"]
1850
1899
  }] } });
1851
1900
 
1852
1901
  class AbstractListInputComponent extends AbstractInputComponent {
@@ -2084,12 +2133,15 @@ class CheckboxInputComponent extends AbstractValueInputComponent {
2084
2133
  constructor() {
2085
2134
  super();
2086
2135
  }
2136
+ select($event) {
2137
+ this.componentValue$.value = $event.checked;
2138
+ }
2087
2139
  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"] }] });
2140
+ 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
2141
  }
2090
2142
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CheckboxInputComponent, decorators: [{
2091
2143
  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"] }]
2144
+ 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
2145
  }], ctorParameters: function () { return []; }, propDecorators: { color: [{
2094
2146
  type: Input
2095
2147
  }], labelPosition: [{
@@ -2128,7 +2180,7 @@ class MultipleSelectInputComponent extends AbstractListInputComponent {
2128
2180
  const self = this;
2129
2181
  this.registerDisposable(new Binding(this.componentList$, this.ids$, {
2130
2182
  toLeft(selectedItems, currentLeftValue) {
2131
- const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !it);
2183
+ const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !!it);
2132
2184
  // 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
2185
  return newValues.length < 1 && selectedItems.length > 0 ? currentLeftValue : newValues;
2134
2186
  },
@@ -2139,7 +2191,7 @@ class MultipleSelectInputComponent extends AbstractListInputComponent {
2139
2191
  })).writeRight();
2140
2192
  }
2141
2193
  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"] }] });
2194
+ 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
2195
  }
2144
2196
  __decorate([
2145
2197
  Proxify(),
@@ -2167,48 +2219,142 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2167
2219
 
2168
2220
  class NumberInputComponent extends AbstractValueInputComponent {
2169
2221
  autocomplete;
2170
- min = Number.MIN_SAFE_INTEGER;
2171
- max = Number.MAX_SAFE_INTEGER;
2172
- iconPrefix;
2222
+ #min$_accessor_storage = proxify((ValueModel));
2223
+ get min$() { return this.#min$_accessor_storage; }
2224
+ set min$(value) { this.#min$_accessor_storage = value; }
2225
+ #min_accessor_storage = Number.MIN_SAFE_INTEGER;
2226
+ get min() { return this.#min_accessor_storage; }
2227
+ set min(value) { this.#min_accessor_storage = value; }
2228
+ #max$_accessor_storage = proxify((ValueModel));
2229
+ get max$() { return this.#max$_accessor_storage; }
2230
+ set max$(value) { this.#max$_accessor_storage = value; }
2231
+ #max_accessor_storage = Number.MAX_SAFE_INTEGER;
2232
+ get max() { return this.#max_accessor_storage; }
2233
+ set max(value) { this.#max_accessor_storage = value; }
2234
+ incrementCommand;
2235
+ decrementCommand;
2173
2236
  constructor() {
2174
2237
  super();
2238
+ const { chain } = Dsl.disposeWith(this);
2239
+ const normalisedValue$ = chain(this.value$).otherwise(0);
2240
+ this.incrementCommand = Command.create(() => {
2241
+ this.value$.value = normalisedValue$.value + 1;
2242
+ }).enableWhile(chain.numericValue(normalisedValue$).isLessThan(this.max$).and(this.enabled$));
2243
+ this.decrementCommand = Command.create(() => {
2244
+ this.value$.value = normalisedValue$.value - 1;
2245
+ }).enableWhile(chain.numericValue(normalisedValue$).isGreaterThan(this.min$).and(this.enabled$));
2175
2246
  }
2176
2247
  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"] }] });
2248
+ 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
2249
  }
2250
+ __decorate([
2251
+ Proxify(),
2252
+ __metadata("design:type", ValueModel)
2253
+ ], NumberInputComponent.prototype, "min$", null);
2254
+ __decorate([
2255
+ StoreInValueModel(),
2256
+ __metadata("design:type", Object)
2257
+ ], NumberInputComponent.prototype, "min", null);
2258
+ __decorate([
2259
+ Proxify(),
2260
+ __metadata("design:type", ValueModel)
2261
+ ], NumberInputComponent.prototype, "max$", null);
2262
+ __decorate([
2263
+ StoreInValueModel(),
2264
+ __metadata("design:type", Object)
2265
+ ], NumberInputComponent.prototype, "max", null);
2179
2266
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NumberInputComponent, decorators: [{
2180
2267
  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" }]
2268
+ 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
2269
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2183
2270
  type: Input
2271
+ }], min$: [{
2272
+ type: Input
2184
2273
  }], min: [{
2185
2274
  type: Input
2186
- }], max: [{
2275
+ }], max$: [{
2187
2276
  type: Input
2188
- }], iconPrefix: [{
2277
+ }], max: [{
2189
2278
  type: Input
2190
2279
  }] } });
2191
2280
 
2192
2281
  class PasswordInputComponent extends AbstractValueInputComponent {
2193
2282
  autocomplete;
2283
+ #enableShowPassword$_accessor_storage = proxify((ValueModel));
2284
+ get enableShowPassword$() { return this.#enableShowPassword$_accessor_storage; }
2285
+ set enableShowPassword$(value) { this.#enableShowPassword$_accessor_storage = value; }
2286
+ #enableShowPassword_accessor_storage = false;
2287
+ get enableShowPassword() { return this.#enableShowPassword_accessor_storage; }
2288
+ set enableShowPassword(value) { this.#enableShowPassword_accessor_storage = value; }
2289
+ showPassword$ = new MutableValueModel(false);
2290
+ toggleShowPasswordCommand;
2194
2291
  constructor() {
2195
2292
  super();
2293
+ const { chain, valueOf } = Dsl.disposeWith(this);
2294
+ const face$ = chain(this.showPassword$).map(show => {
2295
+ return {
2296
+ icon: () => show ? "mat:visibility_off" : "mat:visibility"
2297
+ };
2298
+ });
2299
+ this.toggleShowPasswordCommand = Command.create(() => {
2300
+ this.showPassword$.value = !this.showPassword$.value;
2301
+ })
2302
+ .withFace(face$)
2303
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2304
+ }
2305
+ get fieldType() {
2306
+ return this.showPassword$.value ? "text" : "password";
2196
2307
  }
2197
2308
  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"] }] });
2309
+ 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
2310
  }
2311
+ __decorate([
2312
+ Proxify(),
2313
+ __metadata("design:type", Object)
2314
+ ], PasswordInputComponent.prototype, "enableShowPassword$", null);
2315
+ __decorate([
2316
+ StoreInValueModel(),
2317
+ __metadata("design:type", Object)
2318
+ ], PasswordInputComponent.prototype, "enableShowPassword", null);
2200
2319
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PasswordInputComponent, decorators: [{
2201
2320
  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" }]
2321
+ 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" }]
2322
+ }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2323
+ type: Input
2324
+ }], enableShowPassword$: [{
2325
+ type: Input
2326
+ }], enableShowPassword: [{
2327
+ type: Input
2328
+ }] } });
2329
+
2330
+ class SearchInputComponent extends AbstractValueInputComponent {
2331
+ autocomplete;
2332
+ clearCommand;
2333
+ constructor() {
2334
+ super();
2335
+ this.dense = true;
2336
+ const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2337
+ this.clearCommand = Command.create(() => {
2338
+ this.componentValue$.value = "";
2339
+ });
2340
+ this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2341
+ }
2342
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2343
+ 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"] }] });
2344
+ }
2345
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, decorators: [{
2346
+ type: Component,
2347
+ 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
2348
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2204
2349
  type: Input
2205
2350
  }] } });
2206
2351
 
2207
2352
  /**
2208
2353
  * Using templates:
2209
- * <aup-select-input [valueModel]="myModel" [options]="myOptions">
2354
+ * <aup-select-input [value$]="myModel" [options]="myOptions">
2210
2355
  * <ng-template #optionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2211
- * <ng-template #nilOptionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2356
+ * <ng-template #selectedOptionTemplate let-option>{{option.thePropertyYouWant}} note, not used for nils (the placeholder is used)</ng-template>
2357
+ * <ng-template #nilOptionTemplate>Uses the placeholder by default but you can customise it</ng-template>
2212
2358
  * </aup-select_input>
2213
2359
  */
2214
2360
  class SelectInputComponent extends AbstractValueInputComponent {
@@ -2233,7 +2379,7 @@ class SelectInputComponent extends AbstractValueInputComponent {
2233
2379
  super();
2234
2380
  const { chain } = Dsl.disposeWith(this);
2235
2381
  this.cookedOptions$ = chain(this.options$)
2236
- .reduceToList(options => {
2382
+ .mapAll(options => {
2237
2383
  return options.length < 1 && !isNil(this.componentValue$.value) ? [this.componentValue$.value] : options;
2238
2384
  }, {
2239
2385
  dependsOn: this.componentValue$
@@ -2272,21 +2418,21 @@ class SelectInputComponent extends AbstractValueInputComponent {
2272
2418
  id: this.delegatedIdentityOf(value)
2273
2419
  });
2274
2420
  let lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2275
- console.log(lastIdSnapshot);
2421
+ // console.log(lastIdSnapshot)
2276
2422
  before(this.options$).changes(() => {
2277
2423
  lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2278
- console.log(lastIdSnapshot);
2424
+ // console.log(lastIdSnapshot)
2279
2425
  });
2280
2426
  when(this.options$).changes((is, was) => {
2281
2427
  const newIdSnapshot = snapshotValueAndId(lastIdSnapshot.value);
2282
- console.log(lastIdSnapshot, newIdSnapshot);
2428
+ // console.log(lastIdSnapshot, newIdSnapshot)
2283
2429
  if (newIdSnapshot !== lastIdSnapshot.id) {
2284
2430
  this.id$.value = this.delegatedIdentityOf(this.componentValue$.value);
2285
2431
  }
2286
2432
  });
2287
2433
  }
2288
2434
  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"] }] });
2435
+ 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
2436
  }
2291
2437
  __decorate([
2292
2438
  Proxify(),
@@ -2298,7 +2444,7 @@ __decorate([
2298
2444
  ], SelectInputComponent.prototype, "options", null);
2299
2445
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputComponent, decorators: [{
2300
2446
  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"] }]
2447
+ 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
2448
  }], ctorParameters: function () { return []; }, propDecorators: { options$: [{
2303
2449
  type: Input
2304
2450
  }], options: [{
@@ -2329,17 +2475,24 @@ class StringInputComponent extends AbstractValueInputComponent {
2329
2475
  get enableClear() { return this.#enableClear_accessor_storage; }
2330
2476
  set enableClear(value) { this.#enableClear_accessor_storage = value; }
2331
2477
  iconPrefix;
2478
+ #suffixCommand_accessor_storage = proxify(Command);
2479
+ get suffixCommand() { return this.#suffixCommand_accessor_storage; }
2480
+ set suffixCommand(value) { this.#suffixCommand_accessor_storage = value; }
2332
2481
  clearCommand;
2333
2482
  constructor() {
2334
2483
  super();
2335
2484
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2336
2485
  this.clearCommand = Command.create(() => {
2337
2486
  this.componentValue$.value = "";
2338
- });
2339
- this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2487
+ })
2488
+ .withFace({ icon: () => "mat:clear" })
2489
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2490
+ }
2491
+ get hasSuffixCommand() {
2492
+ return Proxify.hasTarget(this.suffixCommand);
2340
2493
  }
2341
2494
  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"] }] });
2495
+ 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
2496
  }
2344
2497
  __decorate([
2345
2498
  Proxify(),
@@ -2349,9 +2502,13 @@ __decorate([
2349
2502
  StoreInValueModel(),
2350
2503
  __metadata("design:type", Object)
2351
2504
  ], StringInputComponent.prototype, "enableClear", null);
2505
+ __decorate([
2506
+ Proxify(),
2507
+ __metadata("design:type", Command)
2508
+ ], StringInputComponent.prototype, "suffixCommand", null);
2352
2509
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputComponent, decorators: [{
2353
2510
  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"] }]
2511
+ 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
2512
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2356
2513
  type: Input
2357
2514
  }], enableClear$: [{
@@ -2360,6 +2517,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2360
2517
  type: Input
2361
2518
  }], iconPrefix: [{
2362
2519
  type: Input
2520
+ }], suffixCommand: [{
2521
+ type: Input
2363
2522
  }] } });
2364
2523
 
2365
2524
  class TextInputComponent extends AbstractValueInputComponent {
@@ -2547,7 +2706,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2547
2706
  * </aup-switch-case>
2548
2707
  */
2549
2708
  class SwitchCaseComponent extends DisposableComponent {
2550
- cdr;
2551
2709
  #switch$_accessor_storage = proxify((ValueModel));
2552
2710
  get switch$() { return this.#switch$_accessor_storage; }
2553
2711
  set switch$(value) { this.#switch$_accessor_storage = value; }
@@ -2556,9 +2714,8 @@ class SwitchCaseComponent extends DisposableComponent {
2556
2714
  set switch(value) { this.#switch_accessor_storage = value; }
2557
2715
  switchCaseOptions;
2558
2716
  selectedIndex = 0;
2559
- constructor(cdr) {
2717
+ constructor() {
2560
2718
  super();
2561
- this.cdr = cdr;
2562
2719
  }
2563
2720
  ngAfterContentInit() {
2564
2721
  const subscription = this.switchCaseOptions.changes.subscribe(change => this.updateSelection());
@@ -2595,8 +2752,8 @@ class SwitchCaseComponent extends DisposableComponent {
2595
2752
  this.selectedIndex = -1;
2596
2753
  }
2597
2754
  }
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"] }] });
2755
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2756
+ 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
2757
  }
2601
2758
  __decorate([
2602
2759
  Proxify(),
@@ -2609,7 +2766,7 @@ __decorate([
2609
2766
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, decorators: [{
2610
2767
  type: Component,
2611
2768
  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$: [{
2769
+ }], ctorParameters: function () { return []; }, propDecorators: { switch$: [{
2613
2770
  type: Input
2614
2771
  }], switch: [{
2615
2772
  type: Input
@@ -2619,6 +2776,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2619
2776
  }] } });
2620
2777
 
2621
2778
  const HEADER_CELL_RENDERER_PORTAL = Symbol('aup-cell-header-renderer-component-ref');
2779
+ const FOOTER_CELL_RENDERER_PORTAL = Symbol('aup-cell-footer-renderer-component-ref');
2622
2780
  const CELL_RENDERER_PORTAL = Symbol('aup-cell-renderer-component-ref');
2623
2781
  const CELL_EDITOR_PORTAL = Symbol('aup-cell-editor-component-ref');
2624
2782
  const PORTAL_RENDERER_COMPONENT = Symbol('aup-cell-renderer-portal-component');
@@ -2716,6 +2874,23 @@ class TemplateCellRendererPortalRef extends CellRendererPortalRef {
2716
2874
  return new TemplatePortal(this.templateRef, this.viewContainer, { ...(data), $implicit: data.row });
2717
2875
  }
2718
2876
  }
2877
+ class CellFooterPortalRef extends CellPortalRef {
2878
+ componentType;
2879
+ initialiseHeader;
2880
+ constructor(componentType, initialiseHeader) {
2881
+ super();
2882
+ this.componentType = componentType;
2883
+ this.initialiseHeader = initialiseHeader;
2884
+ }
2885
+ initialiseHost(host, columnModel) {
2886
+ assert$1.isTruthy(host);
2887
+ host[HEADER_CELL_RENDERER_PORTAL] = new ComponentPortal(this.componentType);
2888
+ }
2889
+ // @Trace()
2890
+ onPortalAttached(host, portalComponent) {
2891
+ this.initialiseHeader(portalComponent, host.column);
2892
+ }
2893
+ }
2719
2894
 
2720
2895
  class ColumnTextSearchFormatter {
2721
2896
  }
@@ -2806,6 +2981,7 @@ class ColumnTextSearchWrapper extends ColumnTextSearchFormatter.Delegate {
2806
2981
  }
2807
2982
  class ColumnModel extends GarbageCollector {
2808
2983
  columnId;
2984
+ order;
2809
2985
  textPropertiesProvider;
2810
2986
  _columnTextProperties;
2811
2987
  _columnHeaderPortalRef;
@@ -2819,9 +2995,10 @@ class ColumnModel extends GarbageCollector {
2819
2995
  dasherisedColumnId;
2820
2996
  textSearchDelegate = new ColumnTextSearchWrapper();
2821
2997
  visible$;
2822
- constructor(columnId, textPropertiesProvider) {
2998
+ constructor(columnId, order, textPropertiesProvider) {
2823
2999
  super();
2824
3000
  this.columnId = columnId;
3001
+ this.order = order;
2825
3002
  this.textPropertiesProvider = textPropertiesProvider;
2826
3003
  const { valueOf } = Dsl.disposeWith(this);
2827
3004
  this.installHeaderRenderer();
@@ -2866,6 +3043,14 @@ class ColumnModel extends GarbageCollector {
2866
3043
  this._columnTextProperties = columnTextProperties;
2867
3044
  return this;
2868
3045
  }
3046
+ positionAfter(column) {
3047
+ this.order.position(this, { after: column });
3048
+ return this;
3049
+ }
3050
+ positionBefore(column) {
3051
+ this.order.position(this, { before: column });
3052
+ return this;
3053
+ }
2869
3054
  getSearchTextFor(row) {
2870
3055
  return this.textSearchDelegate.format(row);
2871
3056
  }
@@ -2967,8 +3152,8 @@ __decorate([
2967
3152
 
2968
3153
  class CustomTemplateColumnModel extends ColumnModel {
2969
3154
  config = new TemplateCellRendererPortalRef();
2970
- constructor(columnId, defaults) {
2971
- super(columnId, defaults);
3155
+ constructor(columnId, order, defaults) {
3156
+ super(columnId, order, defaults);
2972
3157
  this.configureCellRenderer(this.config);
2973
3158
  }
2974
3159
  setTemplate(templateRef, viewContainer, fillCell, padChild) {
@@ -3046,12 +3231,17 @@ class AbstractTableComponent extends DisposableComponent {
3046
3231
  #showHeader_accessor_storage = true;
3047
3232
  get showHeader() { return this.#showHeader_accessor_storage; }
3048
3233
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
3234
+ #enableScrolling$_accessor_storage = proxify((ValueModel));
3049
3235
  /**
3050
3236
  * Set to true to enable scrolling. Once enabled the table will have 0 implicit height. You will either
3051
3237
  * need to set it explicitly e.g. height: 400px; or by using flex or grid layout to make it fill it's
3052
3238
  * containment area.
3053
3239
  */
3054
- enableScrolling = false;
3240
+ get enableScrolling$() { return this.#enableScrolling$_accessor_storage; }
3241
+ set enableScrolling$(value) { this.#enableScrolling$_accessor_storage = value; }
3242
+ #enableScrolling_accessor_storage = false;
3243
+ get enableScrolling() { return this.#enableScrolling_accessor_storage; }
3244
+ set enableScrolling(value) { this.#enableScrolling_accessor_storage = value; }
3055
3245
  columns;
3056
3246
  columnIds;
3057
3247
  columnsById;
@@ -3070,7 +3260,6 @@ class AbstractTableComponent extends DisposableComponent {
3070
3260
  super();
3071
3261
  this.injector = injector;
3072
3262
  const { chain, when } = Dsl.disposeWith(this);
3073
- this._visibleRows$.setDelegate(this._dataSource$);
3074
3263
  when(chain(this._dataSource$).first()).becomesTruthy(it => {
3075
3264
  if (it === this.identityOf(it)) {
3076
3265
  console.warn("Table model identity function is using reference equality. This can cause lots of table re-rendering", {
@@ -3089,7 +3278,7 @@ class AbstractTableComponent extends DisposableComponent {
3089
3278
  if (!model) {
3090
3279
  lang$1.illegalState("aup-table tableModel is nil");
3091
3280
  }
3092
- this.columnsById = chain(model.columns).indexBy('columnId');
3281
+ this.columnsById = chain(model.columns$).indexBy('columnId');
3093
3282
  this._dataSource$.setDelegate(model.dataSource$);
3094
3283
  model.initialise(this.injector, (row) => this.identityOf(row));
3095
3284
  }
@@ -3106,7 +3295,7 @@ class AbstractTableComponent extends DisposableComponent {
3106
3295
  }
3107
3296
  }
3108
3297
  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 });
3298
+ 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
3299
  }
3111
3300
  __decorate([
3112
3301
  Proxify(),
@@ -3116,6 +3305,14 @@ __decorate([
3116
3305
  StoreInValueModel(),
3117
3306
  __metadata("design:type", Object)
3118
3307
  ], AbstractTableComponent.prototype, "showHeader", null);
3308
+ __decorate([
3309
+ Proxify(),
3310
+ __metadata("design:type", ValueModel)
3311
+ ], AbstractTableComponent.prototype, "enableScrolling$", null);
3312
+ __decorate([
3313
+ StoreInValueModel(),
3314
+ __metadata("design:type", Boolean)
3315
+ ], AbstractTableComponent.prototype, "enableScrolling", null);
3119
3316
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractTableComponent, decorators: [{
3120
3317
  type: Component,
3121
3318
  args: [{
@@ -3126,6 +3323,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
3126
3323
  type: Input
3127
3324
  }], showHeader: [{
3128
3325
  type: Input
3326
+ }], enableScrolling$: [{
3327
+ type: Input
3129
3328
  }], enableScrolling: [{
3130
3329
  type: Input
3131
3330
  }], baseCssClass: [{
@@ -3186,6 +3385,8 @@ class EditSession extends GarbageCollector {
3186
3385
  // console.warn()
3187
3386
  // }
3188
3387
  this._liveRowValue$.value = produce(this._liveRowValue$.value, draft => {
3388
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3389
+ // @ts-ignore
3189
3390
  this.form.writeDirtyStateTo(draft);
3190
3391
  });
3191
3392
  });
@@ -3288,11 +3489,11 @@ class DefaultCellRendererComponent {
3288
3489
  return this._value;
3289
3490
  }
3290
3491
  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" }] });
3492
+ 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
3493
  }
3293
3494
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DefaultCellRendererComponent, decorators: [{
3294
3495
  type: Component,
3295
- args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n" }]
3496
+ args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value?.toString()| aupHighlight\"></span>\n" }]
3296
3497
  }], propDecorators: { value: [{
3297
3498
  type: Input
3298
3499
  }] } });
@@ -3308,7 +3509,8 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3308
3509
  super();
3309
3510
  this.selectCommand = Command.create(() => {
3310
3511
  this.selectionModel.toggleAllCommand.execute();
3311
- });
3512
+ }).visibleWhile(this.selectionModel.toggleAllCommand.visible$)
3513
+ .enableWhile(this.selectionModel.toggleAllCommand.enabled$);
3312
3514
  }
3313
3515
  isSelected() {
3314
3516
  return this.ifMultiSelectionModel(m => m.allSelected$.value, false);
@@ -3336,7 +3538,7 @@ class SelectionHeaderCellComponent extends DisposableComponent {
3336
3538
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionHeaderCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3337
3539
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionHeaderCellComponent, selector: "aup-selection-header-cell", providers: [
3338
3540
  { 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"] }] });
3541
+ ], 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
3542
  }
3341
3543
  __decorate([
3342
3544
  Proxify(),
@@ -3369,7 +3571,7 @@ class SelectionCellComponent extends DisposableComponent {
3369
3571
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
3370
3572
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: SelectionCellComponent, selector: "aup-selection-cell", inputs: { row: "row" }, providers: [
3371
3573
  { 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"] }] });
3574
+ ], 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
3575
  }
3374
3576
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectionCellComponent, decorators: [{
3375
3577
  type: Component,
@@ -3430,25 +3632,14 @@ class Bounds extends Dimension {
3430
3632
  })(Bounds || (Bounds = {}));
3431
3633
 
3432
3634
  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
- }
3635
+ elementRef = this.inject(ElementRef);
3636
+ ngZone = this.inject(NgZone);
3637
+ boundsTracker = new ResizeAwareComponent.ResizeTracker(this.elementRef, this.ngZone);
3441
3638
  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());
3639
+ this.boundsTracker.notifyViewReady();
3449
3640
  }
3450
3641
  get bounds$() {
3451
- return this._bounds$.readonly$;
3642
+ return this.boundsTracker.bounds$;
3452
3643
  }
3453
3644
  get nativeElement() {
3454
3645
  return this.elementRef.nativeElement;
@@ -3458,57 +3649,160 @@ class ResizeAwareComponent extends DisposableComponent {
3458
3649
  return this.bounds.relativePositionOf(point);
3459
3650
  }
3460
3651
  get bounds() {
3461
- return this._bounds$.value;
3462
- }
3463
- _updateBounds() {
3464
- this._bounds$.value = Bounds.ofElement(this.nativeElement);
3652
+ return this.bounds$.value;
3465
3653
  }
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 });
3654
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
3467
3655
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ResizeAwareComponent, usesInheritance: true, ngImport: i0 });
3468
3656
  }
3469
3657
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, decorators: [{
3470
3658
  type: Directive
3471
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; } });
3659
+ }] });
3660
+ (function (ResizeAwareComponent) {
3661
+ class ResizeTracker extends GarbageCollector {
3662
+ elementRef;
3663
+ ngZone;
3664
+ _bounds$ = new MutableValueModel(new Bounds(0, 0, 0, 0));
3665
+ width$;
3666
+ height$;
3667
+ top$;
3668
+ left$;
3669
+ bottom$;
3670
+ right$;
3671
+ constructor(elementRef, ngZone) {
3672
+ super();
3673
+ this.elementRef = elementRef;
3674
+ this.ngZone = ngZone;
3675
+ const { chain } = Dsl.disposeWith(this);
3676
+ this.width$ = chain(this.bounds$).pluck("width");
3677
+ this.height$ = chain(this.bounds$).pluck("height");
3678
+ this.top$ = chain(this.bounds$).pluck("top");
3679
+ this.left$ = chain(this.bounds$).pluck("left");
3680
+ this.bottom$ = chain.numericValue(this.top$).add(this.height$);
3681
+ this.right$ = chain.numericValue(this.left$).add(this.width$);
3682
+ }
3683
+ notifyViewReady() {
3684
+ const element = this.elementRef.nativeElement;
3685
+ const ro = new ResizeObserver((entries, observer) => {
3686
+ this.ngZone.run(() => this._updateBounds());
3687
+ });
3688
+ ro.observe(element);
3689
+ this.onDispose(() => ro.disconnect());
3690
+ setTimeout(() => this._updateBounds());
3691
+ }
3692
+ get bounds$() {
3693
+ return this._bounds$.readonly$;
3694
+ }
3695
+ get nativeElement() {
3696
+ return this.elementRef.nativeElement;
3697
+ }
3698
+ // TODO: Make this handle body scroll
3699
+ relativePositionOf(point) {
3700
+ return this.bounds.relativePositionOf(point);
3701
+ }
3702
+ get bounds() {
3703
+ return this._bounds$.value;
3704
+ }
3705
+ _updateBounds() {
3706
+ this._bounds$.value = Bounds.ofElement(this.nativeElement);
3707
+ }
3708
+ }
3709
+ ResizeAwareComponent.ResizeTracker = ResizeTracker;
3710
+ })(ResizeAwareComponent || (ResizeAwareComponent = {}));
3472
3711
 
3473
- class ColumnListModel extends AbstractComputedListModel {
3474
- _allColumns$ = new MutableListModel();
3475
- columnsById$;
3712
+ var ColumnOrderManager;
3713
+ (function (ColumnOrderManager) {
3714
+ function processPosition(position, callback) {
3715
+ if (position) {
3716
+ const keys = Object.keys(position);
3717
+ if (keys.includes("before")) {
3718
+ return position["before"] ? callback.before(position["before"]) : callback.first();
3719
+ }
3720
+ else {
3721
+ return position["after"] ? callback.after(position["after"]) : callback.last();
3722
+ }
3723
+ }
3724
+ else {
3725
+ return callback.last();
3726
+ }
3727
+ }
3728
+ ColumnOrderManager.processPosition = processPosition;
3729
+ })(ColumnOrderManager || (ColumnOrderManager = {}));
3730
+
3731
+ class ColumnRef {
3732
+ column;
3733
+ position;
3734
+ constructor(column, position) {
3735
+ this.column = column;
3736
+ this.position = position;
3737
+ }
3738
+ }
3739
+ class ColumnManager extends GarbageCollector {
3740
+ _columnRefs$ = new MutableListModel();
3741
+ orderedColumnRefs$;
3742
+ _columnsById$;
3743
+ allColumns$;
3744
+ columnVisibilities$ = new WatchList();
3745
+ visibleColumns$;
3476
3746
  constructor() {
3477
3747
  super();
3478
3748
  const { chain } = Dsl.disposeWith(this);
3479
- this.columnsById$ = chain(this._allColumns$).indexBy('columnId');
3749
+ this.orderedColumnRefs$ = chain(this._columnRefs$).orderBy("position", "asc");
3750
+ this.allColumns$ = this.orderedColumnRefs$.pluck("column");
3751
+ this._columnsById$ = chain(this.allColumns$).indexBy('columnId');
3752
+ this.visibleColumns$ = chain(this.allColumns$).select(it => it.visible$.value, {
3753
+ dependsOn: this.columnVisibilities$
3754
+ });
3480
3755
  }
3481
- get allColumns$() {
3482
- return this._allColumns$.readonly$;
3756
+ position(column, newPosition) {
3757
+ const target = this._columnRefs$.query().findMatching(it => it.column === column);
3758
+ const position = this.computePosition(newPosition);
3759
+ this._columnRefs$.replace(target, { with: new ColumnRef(target.column, position) });
3483
3760
  }
3484
3761
  getColumn(id) {
3485
- return this.columnsById$.get(id);
3762
+ return this._columnsById$.get(id);
3486
3763
  }
3487
3764
  hasColumn(id) {
3488
- return !!this.columnsById$.get(id);
3765
+ return !!this._columnsById$.get(id);
3489
3766
  }
3490
3767
  hasMatchingColumn(row, regex) {
3491
3768
  // only search the visible columns
3492
- return !!this.value.find(c => regex.test(c.getSearchTextFor(row)));
3769
+ return !!this.visibleColumns$.value.find(c => regex.test(c.getSearchTextFor(row)));
3493
3770
  }
3494
- addColumn(column, index) {
3771
+ addColumn(column, position) {
3495
3772
  if (this.hasColumn(column.columnId)) {
3496
3773
  lang.illegalState(`Column with id=${column.columnId} already exists`);
3497
3774
  }
3498
3775
  this.registerDisposable(column);
3499
- this.runInTransaction(() => {
3500
- if (!isNil(index)) {
3501
- this._allColumns$.insert(index, column);
3502
- }
3503
- else {
3504
- this._allColumns$.push(column);
3776
+ this._columnRefs$.push(new ColumnRef(column, this.computePosition(position)));
3777
+ this.columnVisibilities$.add(column.visible$);
3778
+ return column;
3779
+ }
3780
+ computePosition(position) {
3781
+ const q = this.orderedColumnRefs$.query();
3782
+ return ColumnOrderManager.processPosition(position, {
3783
+ before(col) {
3784
+ const index = q.findIndex(ref => ref.column === col);
3785
+ const beforeCol = q.value[index];
3786
+ const afterCol = index - 1 >= 0 ? q.value[index - 1] : undefined;
3787
+ return generateKeyBetween(afterCol?.position, beforeCol.position);
3788
+ },
3789
+ after(col) {
3790
+ const index = q.findIndex(ref => ref.column === col);
3791
+ const afterCol = q.value[index];
3792
+ const beforeCol = index + 1 < q.length ? q.value[index + 1] : undefined;
3793
+ return generateKeyBetween(afterCol.position, beforeCol?.position);
3794
+ },
3795
+ first() {
3796
+ return generateKeyBetween(null, q.first()?.position);
3797
+ },
3798
+ last() {
3799
+ // add it to the end of the list
3800
+ return generateKeyBetween(q.last()?.position, null);
3505
3801
  }
3506
- this.registerDisposable(this.trackSource(column.visible$));
3507
3802
  });
3508
- return column;
3509
3803
  }
3510
3804
  doComputeValue() {
3511
- return this._allColumns$.value.filter(c => c.visible$.value);
3805
+ return this.allColumns$.value.filter(c => c.visible$.value);
3512
3806
  }
3513
3807
  }
3514
3808
 
@@ -3542,8 +3836,8 @@ function EnableCellTextSearch(options) {
3542
3836
 
3543
3837
  class CustomValueColumnModel extends ColumnModel {
3544
3838
  getValue;
3545
- constructor(columnId, defaults, getValue) {
3546
- super(columnId, defaults);
3839
+ constructor(columnId, order, defaults, getValue) {
3840
+ super(columnId, order, defaults);
3547
3841
  this.getValue = getValue;
3548
3842
  this.cellRenderer(DefaultCellRendererComponent);
3549
3843
  }
@@ -3551,17 +3845,17 @@ class CustomValueColumnModel extends ColumnModel {
3551
3845
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => new ColumnTextSearchFormatter.Null()), row => this.getValue(row));
3552
3846
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3553
3847
  if (firstTime) {
3554
- if (isFunction$1(onComponentInitOrOptions)) {
3848
+ if (isFunction(onComponentInitOrOptions)) {
3555
3849
  onComponentInitOrOptions(component);
3556
3850
  }
3557
3851
  else {
3558
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3852
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3559
3853
  onComponentInitOrOptions.onComponentInit(component);
3560
3854
  }
3561
3855
  }
3562
3856
  }
3563
3857
  component.value = this.getValue(rowData.row);
3564
- if (!isFunction$1(onComponentInitOrOptions) && isFunction$1(onComponentInitOrOptions?.onRowUpdate)) {
3858
+ if (!isFunction(onComponentInitOrOptions) && isFunction(onComponentInitOrOptions?.onRowUpdate)) {
3565
3859
  onComponentInitOrOptions.onRowUpdate(component, rowData.row);
3566
3860
  }
3567
3861
  }));
@@ -3573,8 +3867,8 @@ class CustomValueColumnModel extends ColumnModel {
3573
3867
  }
3574
3868
 
3575
3869
  class EditorControlColumnModel extends ColumnModel {
3576
- constructor(columnId, saveCommandFactory, defaults) {
3577
- super(columnId, defaults);
3870
+ constructor(columnId, order, saveCommandFactory, defaults) {
3871
+ super(columnId, order, defaults);
3578
3872
  this.cellRenderer(EditRowControlsComponent);
3579
3873
  }
3580
3874
  cellRenderer(componentType) {
@@ -3599,8 +3893,8 @@ class ListPropertyColumnModel extends ColumnModel {
3599
3893
  intermediate.map(v => v?.toString()).join(", ") :
3600
3894
  intermediate?.toString();
3601
3895
  };
3602
- constructor(id, property, defaults) {
3603
- super(id, defaults);
3896
+ constructor(id, order, property, defaults) {
3897
+ super(id, order, defaults);
3604
3898
  this.property = property;
3605
3899
  this.cellRenderer(DefaultCellRendererComponent);
3606
3900
  }
@@ -3616,7 +3910,7 @@ class ListPropertyColumnModel extends ColumnModel {
3616
3910
  }
3617
3911
  cellEditor(editor, validatorsOrInitialiser, initialiseComponent) {
3618
3912
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3619
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3913
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3620
3914
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3621
3915
  const formListModel = editSession.form.pluckList(this.property);
3622
3916
  if (validators) {
@@ -3645,8 +3939,8 @@ class PropertyColumnModel extends ColumnModel {
3645
3939
  _defaultSearchTextFormatter = (value) => {
3646
3940
  return (this._userFormat ?? Functions.identity)(value)?.toString();
3647
3941
  };
3648
- constructor(id, property, defaults) {
3649
- super(id, defaults);
3942
+ constructor(id, order, property, defaults) {
3943
+ super(id, order, defaults);
3650
3944
  this.property = property;
3651
3945
  this.cellRenderer(DefaultCellRendererComponent);
3652
3946
  }
@@ -3654,11 +3948,11 @@ class PropertyColumnModel extends ColumnModel {
3654
3948
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => ColumnTextSearchFormatter.forFormatter(this._defaultSearchTextFormatter)), row => row[this.property]);
3655
3949
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3656
3950
  if (firstTime) {
3657
- if (isFunction$1(onComponentInitOrOptions)) {
3951
+ if (isFunction(onComponentInitOrOptions)) {
3658
3952
  onComponentInitOrOptions(component);
3659
3953
  }
3660
3954
  else {
3661
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3955
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3662
3956
  onComponentInitOrOptions.onComponentInit(component);
3663
3957
  }
3664
3958
  }
@@ -3683,7 +3977,7 @@ class PropertyColumnModel extends ColumnModel {
3683
3977
  component[ColumnModel.CELL_RENDERER_COMPONENT_ROW_CACHE] = rowData.row;
3684
3978
  let disableEditCallback = false;
3685
3979
  if (firstTime) {
3686
- if (isFunction$1(options?.onComponentInit)) {
3980
+ if (isFunction(options?.onComponentInit)) {
3687
3981
  options.onComponentInit(component);
3688
3982
  }
3689
3983
  // install our edit callback
@@ -3698,7 +3992,7 @@ class PropertyColumnModel extends ColumnModel {
3698
3992
  disableEditCallback = true;
3699
3993
  component.value = rowData.row[this.property];
3700
3994
  disableEditCallback = false;
3701
- if (!isFunction$1(options) && isFunction$1(options?.onRowUpdate)) {
3995
+ if (!isFunction(options) && isFunction(options?.onRowUpdate)) {
3702
3996
  options.onRowUpdate(component, rowData.row);
3703
3997
  }
3704
3998
  }));
@@ -3706,7 +4000,7 @@ class PropertyColumnModel extends ColumnModel {
3706
4000
  }
3707
4001
  cellEditor(editor, validatorsOrInitialiser, onComponentInit) {
3708
4002
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3709
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
4003
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
3710
4004
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3711
4005
  const formValueModel = editSession.form.pluck(this.property);
3712
4006
  if (validators) {
@@ -3733,8 +4027,8 @@ class SelectionColumnModel extends ColumnModel {
3733
4027
  selectionModel;
3734
4028
  _enableHeaderControls = true;
3735
4029
  _color = "accent";
3736
- constructor(columnId, defaults, selectionModel) {
3737
- super(columnId, defaults);
4030
+ constructor(columnId, order, defaults, selectionModel) {
4031
+ super(columnId, order, defaults);
3738
4032
  this.selectionModel = selectionModel;
3739
4033
  const { chain } = Dsl.disposeWith(this);
3740
4034
  this._selectRowOnClick(false);
@@ -3775,6 +4069,42 @@ class SelectionColumnModel extends ColumnModel {
3775
4069
  }
3776
4070
  }
3777
4071
 
4072
+ let RowClass$1 = class RowClass {
4073
+ className;
4074
+ matches;
4075
+ constructor(className, matches) {
4076
+ this.className = className;
4077
+ this.matches = matches;
4078
+ }
4079
+ };
4080
+ class FooterRowModel {
4081
+ _rowClasses = [];
4082
+ noPadding() {
4083
+ this.addClass("no-padding");
4084
+ }
4085
+ addClass(className, condition) {
4086
+ this._rowClasses.push(new RowClass$1(className, condition ?? (() => true)));
4087
+ }
4088
+ }
4089
+ (function (FooterRowModel) {
4090
+ class Impl extends FooterRowModel {
4091
+ component;
4092
+ onInit;
4093
+ portal;
4094
+ constructor(component, onInit) {
4095
+ super();
4096
+ this.component = component;
4097
+ this.onInit = onInit;
4098
+ this.portal = new ComponentPortal(component);
4099
+ }
4100
+ getActiveRowClasses() {
4101
+ return this._rowClasses.filter(c => c.matches()).map(c => c.className).join(" ");
4102
+ }
4103
+ }
4104
+ FooterRowModel.Impl = Impl;
4105
+ })(FooterRowModel || (FooterRowModel = {}));
4106
+ ProxyRegistry.registerOneTimeBinding(FooterRowModel);
4107
+
3778
4108
  class TableMoreMenuComponent extends DisposableComponent {
3779
4109
  value$ = new MutableValueModel();
3780
4110
  #value_accessor_storage;
@@ -3784,13 +4114,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3784
4114
  popupType$ = new MutableValueModel();
3785
4115
  popupComponentPortal$;
3786
4116
  _visible$ = this.registerDisposable(new DelegatingValueModel());
4117
+ initialiseCallback;
3787
4118
  constructor() {
3788
4119
  super();
3789
4120
  const { chain } = Dsl.disposeWith(this);
3790
4121
  this.popupComponentPortal$ = chain(this.popupType$).map(type => new ComponentPortal(type));
3791
4122
  }
3792
- configurePopupComponentType(popupComponentType) {
4123
+ configurePopupComponentType(popupComponentType, configureCallback) {
3793
4124
  this.popupType$.value = popupComponentType;
4125
+ this.initialiseCallback = configureCallback;
3794
4126
  }
3795
4127
  // Stops tree selection when clicking the menu button
3796
4128
  preventDefault($event) {
@@ -3801,12 +4133,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3801
4133
  const component = $event.instance;
3802
4134
  component.initialise(this.value$, Command.create(() => this.matMenuTrigger.closeMenu()));
3803
4135
  this._visible$.setDelegate(component.visible$);
4136
+ if (this.initialiseCallback) {
4137
+ this.initialiseCallback(component);
4138
+ }
3804
4139
  }
3805
4140
  get visible$() {
3806
4141
  return this._visible$.readonly$;
3807
4142
  }
3808
4143
  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"] }] });
4144
+ 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
4145
  }
3811
4146
  __decorate([
3812
4147
  StoreInValueModel(),
@@ -3835,16 +4170,25 @@ class RowClass {
3835
4170
  this.matches = matches;
3836
4171
  }
3837
4172
  }
4173
+ class RowAttribute {
4174
+ attributeName;
4175
+ getValue;
4176
+ constructor(attributeName, getValue) {
4177
+ this.attributeName = attributeName;
4178
+ this.getValue = getValue;
4179
+ }
4180
+ }
3838
4181
  class AbstractTableModel extends GarbageCollector {
3839
4182
  _dataSource$ = this.registerDisposable(new DelegatingListModel());
3840
4183
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
3841
4184
  _visibleRows$ = this.registerDisposable(new DelegatingListModel());
3842
- _columnList = this.registerDisposable(new ColumnListModel());
4185
+ columnManager = this.registerDisposable(new ColumnManager());
3843
4186
  _editorSessions = new MutableListModel();
3844
4187
  _rowsBeingEdited$;
3845
4188
  saveCommandFactory;
3846
4189
  _editorSessionByRowId;
3847
4190
  rowClassNamePredicates = [];
4191
+ rowAttributeGenerators = [];
3848
4192
  _columnTextPropertiesLookup;
3849
4193
  editing$;
3850
4194
  firstEditableColumn$;
@@ -3861,6 +4205,8 @@ class AbstractTableModel extends GarbageCollector {
3861
4205
  selectedItems$;
3862
4206
  leadSelection$;
3863
4207
  hasSelection$;
4208
+ footerRowModel;
4209
+ _viewDependencies = [];
3864
4210
  constructor() {
3865
4211
  super();
3866
4212
  const { chain } = Dsl.disposeWith(this);
@@ -3869,15 +4215,15 @@ class AbstractTableModel extends GarbageCollector {
3869
4215
  });
3870
4216
  this._editorSessionByRowId = chain(this._editorSessions).indexBy("rowId");
3871
4217
  this.editing$ = chain(this._editorSessions).count().isGreaterThan(0);
3872
- this.textSearchPredicate$ = chain(this.visibleColumns).reduce(columns => {
4218
+ this.textSearchPredicate$ = chain(this.visibleColumns$).reduceAll(columns => {
3873
4219
  return (row, regex) => {
3874
4220
  return (!regex || !!columns.find(c => regex.test(c.getSearchTextFor(row))));
3875
4221
  };
3876
4222
  });
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);
4223
+ this.firstEditableColumn$ = chain(this.columns$).select(c => c.hasEditorPortal()).first();
4224
+ this.firstVisibleColumn$ = chain(this.visibleColumns$).first();
4225
+ this.lastVisibleColumn$ = chain(this.visibleColumns$).last();
4226
+ this.rowSelectionDisabledOnAllColumns$ = chain(this.columnManager.visibleColumns$).select(column => column.isRowSelectionEnabled()).count().equals(0);
3881
4227
  this.dataSourceEmpty$ = chain(this.dataSource$).isEmpty();
3882
4228
  this.selectedItems$ = this.selectionModelProxy.selectedItems$;
3883
4229
  this.leadSelection$ = this.selectionModelProxy.leadSelection$;
@@ -3901,9 +4247,23 @@ class AbstractTableModel extends GarbageCollector {
3901
4247
  ],
3902
4248
  parent: injector
3903
4249
  });
3904
- this.columns.value.forEach(c => c.initialise(customInjector));
4250
+ this.columns$.value.forEach(c => c.initialise(customInjector));
3905
4251
  this.identityOf = identityOf;
3906
4252
  }
4253
+ /**
4254
+ * Adds additional models that will trigger a table repaint. This is required if the table
4255
+ * needs to be redrawn outside of changes to the rows of filters. i.e. some eternal state is used
4256
+ * to assign row classes etc.
4257
+ *
4258
+ * Note: This function must be called before the table is bound to the model.
4259
+ * @param hasValues
4260
+ */
4261
+ viewStateDependsOn(...hasValues) {
4262
+ this._viewDependencies.push(...hasValues);
4263
+ }
4264
+ get viewStateDependencies() {
4265
+ return this._viewDependencies;
4266
+ }
3907
4267
  get dataSource$() {
3908
4268
  return this._dataSource$.readonly$;
3909
4269
  }
@@ -3954,19 +4314,19 @@ class AbstractTableModel extends GarbageCollector {
3954
4314
  });
3955
4315
  });
3956
4316
  }
3957
- get columns() {
3958
- return this._columnList.allColumns$;
4317
+ get columns$() {
4318
+ return this.columnManager.allColumns$;
3959
4319
  }
3960
- get visibleColumns() {
3961
- return this._columnList.readonly$;
4320
+ get visibleColumns$() {
4321
+ return this.columnManager.visibleColumns$;
3962
4322
  }
3963
4323
  pluck(property, options) {
3964
4324
  const columnId = options?.columnId || property.toString();
3965
- return this.addColumn(new PropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4325
+ return this.addColumn(new PropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3966
4326
  }
3967
4327
  pluckList(property, options) {
3968
4328
  const columnId = options?.columnId || property.toString();
3969
- return this.addColumn(new ListPropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4329
+ return this.addColumn(new ListPropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3970
4330
  }
3971
4331
  // TODO: clean this up and assign the selection model on teh table directly.
3972
4332
  // tableModel.useSelectionModel(model) and have the seleciton column automatically
@@ -3975,44 +4335,52 @@ class AbstractTableModel extends GarbageCollector {
3975
4335
  _addSelectionColumn(selectionModel, visible) {
3976
4336
  assert.isNil(this.selectionColumnModel);
3977
4337
  const columnId = "selection-column";
3978
- this.selectionColumnModel = new SelectionColumnModel(columnId, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
4338
+ this.selectionColumnModel = new SelectionColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
3979
4339
  this.selectionColumnModel.useSelectionModel(selectionModel);
3980
4340
  this.addRowClass("aup-row-selected", row => this.selectionColumnModel.isSelected(row));
3981
- const selectionColumnModel = this.addColumn(this.selectionColumnModel, 0);
3982
- if (!isNil$1(visible)) {
4341
+ const selectionColumnModel = this.addColumn(this.selectionColumnModel, { before: null }); // first column
4342
+ if (!isNil(visible)) {
3983
4343
  selectionColumnModel.visibleWhile(visible instanceof ValueModel ? visible : ValueModel.constant(visible));
3984
4344
  }
3985
4345
  return selectionColumnModel;
3986
4346
  }
3987
4347
  addEditControls(saveCommandFactory, formFactory) {
3988
4348
  this.saveCommandFactory = saveCommandFactory;
3989
- if (isFunction$1(formFactory)) {
4349
+ if (isFunction(formFactory)) {
3990
4350
  this._createForm = formFactory;
3991
4351
  }
3992
4352
  const columnId = "editControls";
3993
- return this.addColumn(new EditorControlColumnModel(columnId, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
4353
+ return this.addColumn(new EditorControlColumnModel(columnId, this.columnManager, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
3994
4354
  }
3995
4355
  addCustomColumn(columnId, dataAccessor) {
3996
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), dataAccessor));
4356
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), dataAccessor));
3997
4357
  }
3998
4358
  addComponentColumn(columnId, component, onComponentInitOrOptions) {
3999
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4359
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4000
4360
  }
4001
- addMoreMenu(componentClass) {
4361
+ addMoreMenu(componentClass, initialiseCallback) {
4002
4362
  return this.addComponentColumn("more-menu", TableMoreMenuComponent, (component) => {
4003
- component.configurePopupComponentType(componentClass);
4363
+ component.configurePopupComponentType(componentClass, initialiseCallback);
4004
4364
  }).columnTextProperties({
4005
4365
  headerText() {
4006
4366
  return "";
4007
4367
  }
4008
4368
  });
4009
4369
  }
4370
+ addFooterRow(component, initialiseCallback) {
4371
+ assert.isNil(this.footerRowModel);
4372
+ this.footerRowModel = new FooterRowModel.Impl(component, initialiseCallback);
4373
+ return this.footerRowModel;
4374
+ }
4010
4375
  addTemplateColumn(columnId) {
4011
- return this.addColumn(new CustomTemplateColumnModel(columnId, () => this.getColumnTextProperties(columnId)));
4376
+ return this.addColumn(new CustomTemplateColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId)));
4012
4377
  }
4013
4378
  addRowClass(className, predicate) {
4014
4379
  this.rowClassNamePredicates.push(new RowClass(className, predicate));
4015
4380
  }
4381
+ addRowAttribute(attributeName, getValue) {
4382
+ this.rowAttributeGenerators.push(new RowAttribute(attributeName, getValue));
4383
+ }
4016
4384
  getRowClasses(row) {
4017
4385
  const classNames = [];
4018
4386
  this.rowClassNamePredicates.forEach(i => {
@@ -4022,8 +4390,13 @@ class AbstractTableModel extends GarbageCollector {
4022
4390
  });
4023
4391
  return classNames;
4024
4392
  }
4025
- addColumn(column, index) {
4026
- return this._columnList.addColumn(column, index);
4393
+ getRowAttributes(row) {
4394
+ return this.rowAttributeGenerators.reduce((result, generator) => {
4395
+ return { ...result, [generator.attributeName]: generator.getValue(row) };
4396
+ }, {});
4397
+ }
4398
+ addColumn(column, position) {
4399
+ return this.columnManager.addColumn(column, position);
4027
4400
  }
4028
4401
  columnTextProperties(columnTextProperties) {
4029
4402
  this._columnTextPropertiesLookup = columnTextProperties;
@@ -4140,7 +4513,7 @@ class TableCellComponent extends DisposableComponent {
4140
4513
  };
4141
4514
  }
4142
4515
  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"] }] });
4516
+ 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
4517
  }
4145
4518
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableCellComponent, decorators: [{
4146
4519
  type: Component,
@@ -4179,7 +4552,7 @@ class TableHeaderCellComponent {
4179
4552
  return this[HEADER_CELL_RENDERER_PORTAL];
4180
4553
  }
4181
4554
  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"] }] });
4555
+ 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
4556
  }
4184
4557
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableHeaderCellComponent, decorators: [{
4185
4558
  type: Component,
@@ -4191,61 +4564,132 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
4191
4564
  args: ['class']
4192
4565
  }] } });
4193
4566
 
4567
+ // eslint-disable-next-line @angular-eslint/component-class-suffix
4568
+ class TableFooterRow {
4569
+ row;
4570
+ defaultClassNames = 'aup-footer-row-renderer';
4571
+ get rowClasses() {
4572
+ return this.row.getActiveRowClasses();
4573
+ }
4574
+ initialise($event) {
4575
+ this.row.onInit && this.row.onInit($event.instance);
4576
+ }
4577
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, deps: [], target: i0.ɵɵFactoryTarget.Component });
4578
+ 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"] }] });
4579
+ }
4580
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableFooterRow, decorators: [{
4581
+ type: Component,
4582
+ 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"] }]
4583
+ }], propDecorators: { row: [{
4584
+ type: Input
4585
+ }], defaultClassNames: [{
4586
+ type: HostBinding,
4587
+ args: ['class']
4588
+ }], rowClasses: [{
4589
+ type: HostBinding,
4590
+ args: ['class']
4591
+ }] } });
4592
+
4593
+ const AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER = new InjectionToken("AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER");
4594
+ class TableRowAttributesDirective {
4595
+ elementRef;
4596
+ aupTableRowAttributes;
4597
+ constructor(elementRef) {
4598
+ this.elementRef = elementRef;
4599
+ }
4600
+ ngOnInit() {
4601
+ for (const attr in this.aupTableRowAttributes) {
4602
+ this.elementRef.nativeElement.setAttribute(attr, this.aupTableRowAttributes[attr]);
4603
+ }
4604
+ }
4605
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
4606
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: { aupTableRowAttributes: "aupTableRowAttributes" }, ngImport: i0 });
4607
+ }
4608
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, decorators: [{
4609
+ type: Directive,
4610
+ args: [{
4611
+ selector: "[aupTableRowAttributes]",
4612
+ }]
4613
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { aupTableRowAttributes: [{
4614
+ type: Input
4615
+ }] } });
4194
4616
  class TableBodyComponent extends ResizeAwareComponent {
4617
+ bufferMultiplier;
4195
4618
  #data$_accessor_storage = proxify((ListModel));
4196
4619
  get data$() { return this.#data$_accessor_storage; }
4197
4620
  set data$(value) { this.#data$_accessor_storage = value; }
4198
4621
  #tableModel_accessor_storage = proxify((AbstractTableModel));
4199
4622
  get tableModel() { return this.#tableModel_accessor_storage; }
4200
4623
  set tableModel(value) { this.#tableModel_accessor_storage = value; }
4624
+ #footerRow_accessor_storage = proxify((FooterRowModel.Impl));
4625
+ get footerRow() { return this.#footerRow_accessor_storage; }
4626
+ set footerRow(value) { this.#footerRow_accessor_storage = value; }
4201
4627
  #showHeader$_accessor_storage = proxify((ValueModel));
4202
4628
  get showHeader$() { return this.#showHeader$_accessor_storage; }
4203
4629
  set showHeader$(value) { this.#showHeader$_accessor_storage = value; }
4204
4630
  #showHeader_accessor_storage = true;
4205
4631
  get showHeader() { return this.#showHeader_accessor_storage; }
4206
4632
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
4207
- visibleRowCount = new EventEmitter();
4208
4633
  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;
4634
+ #scrollMode$_accessor_storage = proxify((ValueModel));
4635
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
4636
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
4637
+ #scrollMode_accessor_storage = "none";
4638
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
4639
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4640
+ scrollViewport;
4215
4641
  columns$;
4216
4642
  columnIds$;
4217
4643
  columnsById$;
4218
- _visibleRowCount$;
4219
4644
  // TODO: support user defined header and row heights via css vars.
4220
- headerHeight$ = new MutableValueModel(29);
4221
- rowHeight$ = new MutableValueModel(40);
4645
+ headerHeight$ = new MutableValueModel(48);
4646
+ rowHeight$ = new MutableValueModel(44);
4222
4647
  baseCssClass = "aup-table-component";
4223
- constructor(elementRef, ngZone) {
4224
- super(elementRef, ngZone);
4225
- const { chain, when } = Dsl.disposeWith(this);
4648
+ virtualScrollDataSource = new TableVirtualScrollDataSource();
4649
+ virtualScrollActive$ = new MutableValueModel(false);
4650
+ scrollTimeout;
4651
+ constructor(bufferMultiplier = 1) {
4652
+ super();
4653
+ this.bufferMultiplier = bufferMultiplier;
4654
+ const { chain, when, observe } = Dsl.disposeWith(this);
4226
4655
  const actualHeaderHeight$ = chain(this.showHeader$).map(show => {
4227
4656
  return show ? this.headerHeight$.value : 0;
4228
4657
  }, { 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" });
4658
+ // performance is terrible if the data changes while we're scrolling, so we postpone updates until
4659
+ // scrolling stops.
4660
+ const delayedDatea$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
4661
+ when(delayedDatea$).changes(delatedData => {
4662
+ this.virtualScrollDataSource.data = delatedData;
4663
+ this.scheduleTableHeightCheck();
4664
+ }, { initialValue: "evaluate" });
4240
4665
  this.onInit(() => {
4241
- this.columns$ = chain(this.tableModel.columns);
4666
+ this.columns$ = chain(this.tableModel.visibleColumns$);
4242
4667
  this.columnIds$ = chain(this.columns$).pluck("columnId");
4243
4668
  this.columnsById$ = chain(this.columns$).indexBy('columnId');
4244
4669
  });
4670
+ // const txo = new TransactionObserver({verbose: false}).onEvent(e => console.log(e.name, e.payload));
4671
+ // txo.observe('this.virtualScrollRowRange$', this.virtualScrollRowRange$);
4672
+ // txo.observe('this.virtualScrollSpacerSize$', this.virtualScrollSpacerSize$);
4673
+ // txo.observe('this.virtualRows$', this.virtualRows$);
4674
+ // txo.observe('this.tableBodyHeight$', this.tableBodyHeight$);
4675
+ // txo.observe('this.virtualScrollActive$', this.virtualScrollActive$);
4676
+ }
4677
+ ngAfterViewInit() {
4678
+ super.ngAfterViewInit();
4679
+ if (this.scrollViewport) {
4680
+ const { observe } = Dsl.disposeWith(this);
4681
+ this.scrollViewport.elementScrolled().subscribe(() => this.notifyScrolled());
4682
+ }
4245
4683
  }
4246
4684
  get hideHeader() {
4247
4685
  return !this.showHeader;
4248
4686
  }
4687
+ get headerHeightCssVar() {
4688
+ return `${this.headerHeight$.value}px`;
4689
+ }
4690
+ get rowHeightCssVar() {
4691
+ return `${this.rowHeight$.value}px`;
4692
+ }
4249
4693
  isEditing(row) {
4250
4694
  return !!this.tableModel.getEditSessionFor(row);
4251
4695
  }
@@ -4270,51 +4714,110 @@ class TableBodyComponent extends ResizeAwareComponent {
4270
4714
  }
4271
4715
  return classes;
4272
4716
  }
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"] }] });
4717
+ scheduleTableHeightCheck(waitMillis = 50) {
4718
+ setTimeout(() => {
4719
+ const tbody = this.elementRef.nativeElement.querySelector("tbody");
4720
+ const bodyHeight = tbody.offsetHeight;
4721
+ if (this.data$.length > 0 && bodyHeight < this.rowHeight$.value) {
4722
+ // Hacks to get our virtual scroll to repaint
4723
+ // Logger.get(this).log(`rowCount=${this.data$.length}, bodyHeight=${bodyHeight} -> virtual table not rendering, triggering resize to force repaint`)
4724
+ window.dispatchEvent(new Event('resize'));
4725
+ if (waitMillis < 500) {
4726
+ this.scheduleTableHeightCheck(waitMillis + 50);
4727
+ }
4728
+ }
4729
+ }, waitMillis);
4730
+ }
4731
+ notifyScrolled() {
4732
+ this.virtualScrollActive$.value = true;
4733
+ this.clearScrollTimeout();
4734
+ this.scrollTimeout = setTimeout(() => {
4735
+ return this.virtualScrollActive$.value = false;
4736
+ }, 200);
4737
+ }
4738
+ clearScrollTimeout() {
4739
+ if (this.scrollTimeout) {
4740
+ clearTimeout(this.scrollTimeout);
4741
+ }
4742
+ }
4743
+ initialiseFooter($event) {
4744
+ const portalRef = $event;
4745
+ this.footerRow.onInit(portalRef.instance);
4746
+ }
4747
+ Proxify = Proxify;
4748
+ 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 });
4749
+ 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
4750
  }
4276
4751
  __decorate([
4277
4752
  Proxify(),
4278
- __metadata("design:type", Object)
4753
+ __metadata("design:type", ListModel)
4279
4754
  ], TableBodyComponent.prototype, "data$", null);
4280
4755
  __decorate([
4281
4756
  Proxify(),
4282
- __metadata("design:type", Object)
4757
+ __metadata("design:type", AbstractTableModel)
4283
4758
  ], TableBodyComponent.prototype, "tableModel", null);
4284
4759
  __decorate([
4285
4760
  Proxify(),
4286
- __metadata("design:type", Object)
4761
+ __metadata("design:type", FooterRowModel.Impl)
4762
+ ], TableBodyComponent.prototype, "footerRow", null);
4763
+ __decorate([
4764
+ Proxify(),
4765
+ __metadata("design:type", ValueModel)
4287
4766
  ], TableBodyComponent.prototype, "showHeader$", null);
4288
4767
  __decorate([
4289
4768
  StoreInValueModel(),
4290
4769
  __metadata("design:type", Object)
4291
4770
  ], TableBodyComponent.prototype, "showHeader", null);
4771
+ __decorate([
4772
+ Proxify(),
4773
+ __metadata("design:type", ValueModel)
4774
+ ], TableBodyComponent.prototype, "scrollMode$", null);
4775
+ __decorate([
4776
+ StoreInValueModel(),
4777
+ __metadata("design:type", String)
4778
+ ], TableBodyComponent.prototype, "scrollMode", null);
4292
4779
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, decorators: [{
4293
4780
  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$: [{
4781
+ 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"] }]
4782
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
4783
+ type: Inject,
4784
+ args: [AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER]
4785
+ }, {
4786
+ type: Optional
4787
+ }] }]; }, propDecorators: { data$: [{
4296
4788
  type: Input
4297
4789
  }], tableModel: [{
4298
4790
  type: Input
4791
+ }], footerRow: [{
4792
+ type: Input
4299
4793
  }], showHeader$: [{
4300
4794
  type: Input
4301
4795
  }], showHeader: [{
4302
4796
  type: Input
4303
- }], visibleRowCount: [{
4304
- type: Output
4305
4797
  }], trackBy: [{
4306
4798
  type: Input
4307
- }], enableScrolling: [{
4799
+ }], scrollMode$: [{
4800
+ type: Input
4801
+ }], scrollMode: [{
4308
4802
  type: Input
4309
4803
  }, {
4310
4804
  type: HostBinding,
4311
- args: ["class.enable-scrolling"]
4805
+ args: ["attr.scrollMode"]
4806
+ }], scrollViewport: [{
4807
+ type: ViewChild,
4808
+ args: [CdkVirtualScrollViewport]
4312
4809
  }], baseCssClass: [{
4313
4810
  type: HostBinding,
4314
4811
  args: ["class"]
4315
4812
  }], hideHeader: [{
4316
4813
  type: HostBinding,
4317
4814
  args: ["class.hide-header"]
4815
+ }], headerHeightCssVar: [{
4816
+ type: HostBinding,
4817
+ args: ["style.--aup-table-header-height"]
4818
+ }], rowHeightCssVar: [{
4819
+ type: HostBinding,
4820
+ args: ["style.--aup-table-row-height"]
4318
4821
  }] } });
4319
4822
 
4320
4823
  class TableMoreMenuPopupComponent extends DisposableComponent {
@@ -4435,8 +4938,10 @@ class TableFilterModel extends GarbageCollector {
4435
4938
  this.useSearchText(options.searchText$);
4436
4939
  this.useRowPredicate(options.predicate$);
4437
4940
  const { chain } = Dsl.disposeWith(this);
4438
- const textSearchRegex$ = chain(this._searchText$).map(text => {
4439
- return isEmpty$1(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4941
+ const textSearchRegex$ = chain(this._searchText$)
4942
+ .debounce(250)
4943
+ .map(text => {
4944
+ return isEmpty(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4440
4945
  }, { allowNil: true });
4441
4946
  this._rowPredicate = chain(this._rowPredicate$)
4442
4947
  .map(predicate => {
@@ -4644,31 +5149,30 @@ class TableComponent extends AbstractTableComponent {
4644
5149
  #filterModel_accessor_storage = proxify((TableFilterModel));
4645
5150
  get filterModel() { return this.#filterModel_accessor_storage; }
4646
5151
  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
- // }
5152
+ tableBody;
5153
+ #scrollMode$_accessor_storage = proxify((ValueModel));
5154
+ /**
5155
+ * 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
5156
+ * renders all rows but allows row heights to grow.
5157
+ */
5158
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
5159
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
5160
+ #scrollMode_accessor_storage;
5161
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
5162
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4660
5163
  _footerContentAdded = false;
4661
5164
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
4662
- _pageSize = new MutableValueModel();
4663
- pagedListModel;
5165
+ tableBodyScrollMode$;
4664
5166
  constructor(injector) {
4665
5167
  super(injector);
4666
- const { when } = Dsl.disposeWith(this);
4667
- this.onDispose(() => this.disposeOfPagedListModel());
4668
- when(this.enablePaging$).changes(enabled => this.configurePaging(enabled));
5168
+ const { chain, when } = Dsl.disposeWith(this);
5169
+ this.tableBodyScrollMode$ = chain(this.enableScrolling$).map(enable => {
5170
+ return enable ? (this.scrollMode$.value ?? "virtual") : 'none';
5171
+ }, { dependsOn: this.scrollMode$ });
4669
5172
  }
4670
5173
  ngOnInit() {
4671
5174
  super.ngOnInit();
5175
+ const { when } = Dsl.disposeWith(this);
4672
5176
  if (CanProxy.hasTarget(this.filterModel)) {
4673
5177
  this.registerDisposable(this.filterModel.bindToTable(this._dataSource$, this.getModel().textSearchPredicate$));
4674
5178
  this.highlightText$.setDelegate(this.filterModel.highlightText$);
@@ -4677,50 +5181,27 @@ class TableComponent extends AbstractTableComponent {
4677
5181
  else {
4678
5182
  this._filteredRows$.setDelegate(this._dataSource$);
4679
5183
  }
4680
- this.configurePaging(this.enablePaging$.value);
5184
+ this._visibleRows$.setDelegate(this._filteredRows$);
5185
+ // let users of the model know what the current visible and filtered rows are for selection models and what not
4681
5186
  this.tableModel.bindToTable(this._filteredRows$, this._visibleRows$);
5187
+ when.anyOf(...this.tableModel.viewStateDependencies).changes(() => this.cdr.markForCheck());
5188
+ this.viewStateDependsOn(this._filteredRows$, this.tableModel.visibleColumns$);
4682
5189
  }
4683
5190
  getModel() {
4684
5191
  return this.tableModel;
4685
5192
  }
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
5193
  footerContentChanged($event) {
4709
5194
  // console.log($event);
4710
5195
  this._footerContentAdded = true;
4711
5196
  }
4712
- //@Trace()
4713
- updatePageSize(count) {
4714
- this._pageSize.value = count;
4715
- }
4716
5197
  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: [
5198
+ 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
5199
  { 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"] }] });
5200
+ ], 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
5201
  }
4721
5202
  __decorate([
4722
5203
  Proxify(),
4723
- __metadata("design:type", Object)
5204
+ __metadata("design:type", TableModel)
4724
5205
  ], TableComponent.prototype, "tableModel", null);
4725
5206
  __decorate([
4726
5207
  Proxify(),
@@ -4728,24 +5209,27 @@ __decorate([
4728
5209
  ], TableComponent.prototype, "filterModel", null);
4729
5210
  __decorate([
4730
5211
  Proxify(),
4731
- __metadata("design:type", Object)
4732
- ], TableComponent.prototype, "enablePaging$", null);
5212
+ __metadata("design:type", ValueModel)
5213
+ ], TableComponent.prototype, "scrollMode$", null);
4733
5214
  __decorate([
4734
5215
  StoreInValueModel(),
4735
5216
  __metadata("design:type", Object)
4736
- ], TableComponent.prototype, "enablePaging", null);
5217
+ ], TableComponent.prototype, "scrollMode", null);
4737
5218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableComponent, decorators: [{
4738
5219
  type: Component,
4739
- args: [{ selector: 'aup-table', providers: [
5220
+ args: [{ selector: 'aup-table', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
4740
5221
  { 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"] }]
5222
+ ], 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
5223
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { tableModel: [{
4743
5224
  type: Input
4744
5225
  }], filterModel: [{
4745
5226
  type: Input
4746
- }], enablePaging$: [{
5227
+ }], tableBody: [{
5228
+ type: ViewChild,
5229
+ args: [TableBodyComponent]
5230
+ }], scrollMode$: [{
4747
5231
  type: Input
4748
- }], enablePaging: [{
5232
+ }], scrollMode: [{
4749
5233
  type: Input
4750
5234
  }] } });
4751
5235
 
@@ -4927,7 +5411,7 @@ var DecoratedTreeNode;
4927
5411
  }
4928
5412
  }
4929
5413
  __decorate([
4930
- Memoize(),
5414
+ MemoizeGet(),
4931
5415
  __metadata("design:type", Array),
4932
5416
  __metadata("design:paramtypes", [])
4933
5417
  ], Decorator.prototype, "children", null);
@@ -4980,7 +5464,7 @@ var DecoratedTreeNode;
4980
5464
  __metadata("design:returntype", Array)
4981
5465
  ], Decorator.prototype, "ancestors", null);
4982
5466
  __decorate([
4983
- Memoize(),
5467
+ MemoizeGet(),
4984
5468
  __metadata("design:type", Number),
4985
5469
  __metadata("design:paramtypes", [])
4986
5470
  ], Decorator.prototype, "depth", null);
@@ -4991,8 +5475,8 @@ class TreeLabelColumnModel extends ColumnModel {
4991
5475
  expansionModel;
4992
5476
  labelFactory = () => undefined;
4993
5477
  iconFactory;
4994
- constructor(columnId, textPropertiesProvider, expansionModel) {
4995
- super(columnId, textPropertiesProvider);
5478
+ constructor(columnId, order, textPropertiesProvider, expansionModel) {
5479
+ super(columnId, order, textPropertiesProvider);
4996
5480
  this.expansionModel = expansionModel;
4997
5481
  this.cellRenderer(TreeLabelCellRendererComponent);
4998
5482
  }
@@ -5051,7 +5535,7 @@ class TreeTableModel extends AbstractTableModel {
5051
5535
  get isExpandedPredicate$() {
5052
5536
  return this._isExpandedPredicate$.readonly$;
5053
5537
  }
5054
- bindToTable(expansionModel, filteredRows$, visibleRows$) {
5538
+ bindToTable(expansionModel, filteredRows$, visibleRows$, cdr) {
5055
5539
  this.treeExpansionModel = expansionModel;
5056
5540
  // TODO: Move all the expansion model stuff out of here and have things use the expansion model directly
5057
5541
  this._isExpandedPredicate$.setDelegate(this.treeExpansionModel.isExpandedPredicate$);
@@ -5060,7 +5544,7 @@ class TreeTableModel extends AbstractTableModel {
5060
5544
  }
5061
5545
  treeControlColumn(builder) {
5062
5546
  const columnId = 'tree-label';
5063
- const column = new TreeLabelColumnModel(columnId, () => this.getColumnTextProperties(columnId), this);
5547
+ const column = new TreeLabelColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this);
5064
5548
  builder(column);
5065
5549
  this.addColumn(column);
5066
5550
  }
@@ -5386,11 +5870,15 @@ class TreeTableComponent extends AbstractTableComponent {
5386
5870
  #expansionModel_accessor_storage = proxify((TreeExpansionModel));
5387
5871
  get expansionModel() { return this.#expansionModel_accessor_storage; }
5388
5872
  set expansionModel(value) { this.#expansionModel_accessor_storage = value; }
5873
+ scrollMode$;
5389
5874
  constructor(injector) {
5390
5875
  super(injector);
5876
+ const { chain } = Dsl.disposeWith(this);
5877
+ this.scrollMode$ = chain(this.enableScrolling$).map(enabled => enabled ? "classic" : "none");
5391
5878
  }
5392
5879
  ngOnInit() {
5393
5880
  super.ngOnInit();
5881
+ const { when } = Dsl.disposeWith(this);
5394
5882
  // TODO: clean up all this tightly coupled shit, should the expansion model really be separate from the tree model?
5395
5883
  if (!this.expansionModel) {
5396
5884
  this.expansionModel = new TreeExpansionModel({ disposedWith: this });
@@ -5399,7 +5887,10 @@ class TreeTableComponent extends AbstractTableComponent {
5399
5887
  const visibleRows$ = new FlattenedTreeListModel(this._dataSource$, row => this.treeTableModel.childExtractor(row), this.expansionModel);
5400
5888
  this._visibleRows$.setDelegate(visibleRows$);
5401
5889
  this.expansionModel.bindToTable(this._dataSource$, visibleRows$);
5402
- this.treeTableModel.bindToTable(this.expansionModel, visibleRows$, this._visibleRows$);
5890
+ this.treeTableModel.bindToTable(this.expansionModel, visibleRows$, this._visibleRows$, this.cdr);
5891
+ this.viewStateDependsOn(this.treeTableModel.visibleRows$);
5892
+ this.viewStateDependsOn(this.treeTableModel.visibleRows$);
5893
+ when.anyOf(...this.treeTableModel.viewStateDependencies).changes(() => this.cdr.markForCheck());
5403
5894
  }
5404
5895
  getModel() {
5405
5896
  return this.treeTableModel;
@@ -5407,7 +5898,7 @@ class TreeTableComponent extends AbstractTableComponent {
5407
5898
  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
5899
  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
5900
  { 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"] }] });
5901
+ ], 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
5902
  }
5412
5903
  __decorate([
5413
5904
  Proxify(),
@@ -5419,9 +5910,9 @@ __decorate([
5419
5910
  ], TreeTableComponent.prototype, "expansionModel", null);
5420
5911
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TreeTableComponent, decorators: [{
5421
5912
  type: Component,
5422
- args: [{ selector: 'aup-tree-table', providers: [
5913
+ args: [{ selector: 'aup-tree-table', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
5423
5914
  { 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"] }]
5915
+ ], 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
5916
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { treeTableModel: [{
5426
5917
  type: Input
5427
5918
  }], expansionModel: [{
@@ -5603,6 +6094,7 @@ class ComponentsModule {
5603
6094
  FocusableComponent,
5604
6095
  CardContainerComponent,
5605
6096
  TableComponent,
6097
+ TableRowAttributesDirective,
5606
6098
  EditRowControlsComponent,
5607
6099
  ColumnTemplateDirective,
5608
6100
  DefaultCellRendererComponent,
@@ -5636,7 +6128,9 @@ class ComponentsModule {
5636
6128
  MarkdownComponent,
5637
6129
  TableBodyComponent,
5638
6130
  TableMoreMenuComponent,
5639
- TableMoreMenuPopupComponent], imports: [CommonModule,
6131
+ TableMoreMenuPopupComponent,
6132
+ SearchInputComponent,
6133
+ TableFooterRow], imports: [CommonModule,
5640
6134
  BrowserAnimationsModule,
5641
6135
  FormsModule,
5642
6136
  MatInputModule,
@@ -5655,7 +6149,10 @@ class ComponentsModule {
5655
6149
  MatMenuModule,
5656
6150
  MatDividerModule,
5657
6151
  MatProgressSpinnerModule,
5658
- MatProgressBarModule], exports: [NumberInputComponent,
6152
+ MatProgressBarModule,
6153
+ ScrollingModule,
6154
+ TableVirtualScrollModule], exports: [TableFooterRow,
6155
+ NumberInputComponent,
5659
6156
  StringInputComponent,
5660
6157
  TextInputComponent,
5661
6158
  PasswordInputComponent,
@@ -5693,7 +6190,8 @@ class ComponentsModule {
5693
6190
  LoadingContainerComponent,
5694
6191
  MarkdownComponent,
5695
6192
  TableMoreMenuComponent,
5696
- TableMoreMenuPopupComponent] });
6193
+ TableMoreMenuPopupComponent,
6194
+ SearchInputComponent] });
5697
6195
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, providers: [
5698
6196
  FocusBindingFactory,
5699
6197
  MarkdownService
@@ -5716,7 +6214,9 @@ class ComponentsModule {
5716
6214
  MatMenuModule,
5717
6215
  MatDividerModule,
5718
6216
  MatProgressSpinnerModule,
5719
- MatProgressBarModule] });
6217
+ MatProgressBarModule,
6218
+ ScrollingModule,
6219
+ TableVirtualScrollModule] });
5720
6220
  }
5721
6221
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, decorators: [{
5722
6222
  type: NgModule,
@@ -5741,7 +6241,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5741
6241
  MatMenuModule,
5742
6242
  MatDividerModule,
5743
6243
  MatProgressSpinnerModule,
5744
- MatProgressBarModule
6244
+ MatProgressBarModule,
6245
+ ScrollingModule,
6246
+ TableVirtualScrollModule
5745
6247
  ],
5746
6248
  declarations: [
5747
6249
  AbstractInputComponent,
@@ -5765,6 +6267,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5765
6267
  FocusableComponent,
5766
6268
  CardContainerComponent,
5767
6269
  TableComponent,
6270
+ TableRowAttributesDirective,
5768
6271
  EditRowControlsComponent,
5769
6272
  ColumnTemplateDirective,
5770
6273
  DefaultCellRendererComponent,
@@ -5799,8 +6302,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5799
6302
  TableBodyComponent,
5800
6303
  TableMoreMenuComponent,
5801
6304
  TableMoreMenuPopupComponent,
6305
+ SearchInputComponent,
6306
+ TableFooterRow
5802
6307
  ],
5803
6308
  exports: [
6309
+ TableFooterRow,
5804
6310
  NumberInputComponent,
5805
6311
  StringInputComponent,
5806
6312
  TextInputComponent,
@@ -5840,6 +6346,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5840
6346
  MarkdownComponent,
5841
6347
  TableMoreMenuComponent,
5842
6348
  TableMoreMenuPopupComponent,
6349
+ SearchInputComponent
5843
6350
  ],
5844
6351
  providers: [
5845
6352
  FocusBindingFactory,
@@ -5848,6 +6355,67 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5848
6355
  }]
5849
6356
  }] });
5850
6357
 
6358
+ class LoadableComponent extends DisposableComponent {
6359
+ #_loaded$ = new MutableValueModel();
6360
+ #asyncLoadables = [];
6361
+ #awaitedLoadables = [];
6362
+ get loaded$() {
6363
+ return this.#_loaded$.readonly$;
6364
+ }
6365
+ ngOnInit() {
6366
+ super.ngOnInit();
6367
+ this.#asyncLoadables.forEach(it => it.ensureLoaded());
6368
+ if (this.#awaitedLoadables.length > 0) {
6369
+ Promise.all(this.#awaitedLoadables.map(it => {
6370
+ return it.ensureLoaded(); //.then(() => console.log(`${it.constructor.name} loaded`));
6371
+ })).then(() => {
6372
+ this.#_loaded$.value = true;
6373
+ });
6374
+ }
6375
+ else {
6376
+ this.#_loaded$.value = true;
6377
+ }
6378
+ }
6379
+ injectLoadable(token, options) {
6380
+ return this.registerLoadable(inject(token), options);
6381
+ }
6382
+ registerLoadable(loadable, options) {
6383
+ if (this.loaded$.value) {
6384
+ loadable.ensureLoaded();
6385
+ }
6386
+ else {
6387
+ if (!options || options.wait === true) {
6388
+ this.#awaitedLoadables.push(loadable);
6389
+ }
6390
+ else {
6391
+ this.#asyncLoadables.push(loadable);
6392
+ }
6393
+ }
6394
+ return loadable;
6395
+ }
6396
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
6397
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: LoadableComponent, usesInheritance: true, ngImport: i0 });
6398
+ }
6399
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, decorators: [{
6400
+ type: Directive
6401
+ }] });
6402
+
6403
+ class TextSearchContext {
6404
+ row;
6405
+ searchText;
6406
+ searchRegex;
6407
+ constructor(row, searchText, searchRegex) {
6408
+ this.row = row;
6409
+ this.searchText = searchText;
6410
+ this.searchRegex = searchRegex;
6411
+ }
6412
+ getOrCreate(type, create) {
6413
+ }
6414
+ matchesText(text) {
6415
+ return this.searchRegex.test(text);
6416
+ }
6417
+ }
6418
+
5851
6419
  /**
5852
6420
  * @file Automatically generated by barrelsby.
5853
6421
  */
@@ -5874,7 +6442,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5874
6442
  * </aup-activity-actions>
5875
6443
  */
5876
6444
  class ActivityActionsComponent extends DisposableComponent {
5877
- cdr;
5878
6445
  confirmCommandComponent;
5879
6446
  cancelCommandComponent;
5880
6447
  #confirmCommand_accessor_storage = proxify((Command));
@@ -5903,9 +6470,9 @@ class ActivityActionsComponent extends DisposableComponent {
5903
6470
  }
5904
6471
  layout = ActivityActionsComponent.Layout.BLOCK;
5905
6472
  align = ActivityActionsComponent.Align.STRETCH;
5906
- constructor(cdr) {
6473
+ alignContent = ActivityActionsComponent.AlignContent.CENTER;
6474
+ constructor() {
5907
6475
  super();
5908
- this.cdr = cdr;
5909
6476
  }
5910
6477
  hasConfirmFace() {
5911
6478
  return !!this.confirmFace;
@@ -5924,8 +6491,8 @@ class ActivityActionsComponent extends DisposableComponent {
5924
6491
  focusCancel() {
5925
6492
  this.cancelCommandComponent.requestFocus();
5926
6493
  }
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"] }] });
6494
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6495
+ 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
6496
  }
5930
6497
  __decorate([
5931
6498
  Proxify(),
@@ -5937,8 +6504,8 @@ __decorate([
5937
6504
  ], ActivityActionsComponent.prototype, "cancelCommand", null);
5938
6505
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, decorators: [{
5939
6506
  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: [{
6507
+ 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"] }]
6508
+ }], ctorParameters: function () { return []; }, propDecorators: { confirmCommandComponent: [{
5942
6509
  type: ViewChild,
5943
6510
  args: ["confirmCommandComponent"]
5944
6511
  }], cancelCommandComponent: [{
@@ -5966,6 +6533,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5966
6533
  }, {
5967
6534
  type: HostBinding,
5968
6535
  args: ['attr.align']
6536
+ }], alignContent: [{
6537
+ type: Input
6538
+ }, {
6539
+ type: HostBinding,
6540
+ args: ['attr.align-content']
5969
6541
  }] } });
5970
6542
  (function (ActivityActionsComponent) {
5971
6543
  ActivityActionsComponent.Layout = Enum({
@@ -5974,14 +6546,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5974
6546
  });
5975
6547
  ActivityActionsComponent.Align = Enum({
5976
6548
  START: 'start',
5977
- END: 'end',
5978
- STRETCH: 'stretch'
6549
+ STRETCH: 'stretch',
6550
+ END: 'end'
6551
+ });
6552
+ ActivityActionsComponent.AlignContent = Enum({
6553
+ START: 'start',
6554
+ CENTER: 'center',
6555
+ END: 'end'
5979
6556
  });
5980
6557
  })(ActivityActionsComponent || (ActivityActionsComponent = {}));
5981
6558
 
5982
6559
  const ACTIVITY_DATA = new InjectionToken("InteractionActivityData");
5983
6560
  // eslint-disable-next-line @angular-eslint/component-class-suffix
5984
- class Activity extends DisposableComponent {
6561
+ class Activity extends LoadableComponent {
5985
6562
  activityData = inject(ACTIVITY_DATA);
5986
6563
  activityReadyListeners = new EventListenerList();
5987
6564
  _busy$ = this.registerDisposable(new DelegatingValueModel().withDefault(false));
@@ -6036,7 +6613,6 @@ class Activity extends DisposableComponent {
6036
6613
  notifyActivityReady() {
6037
6614
  this.activityReadyListeners.fire(l => l(this));
6038
6615
  this._ready$.value = true;
6039
- console.log("ready");
6040
6616
  }
6041
6617
  onActivityReady(callback) {
6042
6618
  return this.activityReadyListeners.add(callback);
@@ -6156,7 +6732,7 @@ class AbstractDialogComponent extends Activity {
6156
6732
  }
6157
6733
  }
6158
6734
  isDestructive() {
6159
- return isFunction$1(this.config['destructive']) && this.config["destructive"]();
6735
+ return isFunction(this.config['destructive']) && this.config["destructive"]();
6160
6736
  }
6161
6737
  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
6738
  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 +6749,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6173
6749
 
6174
6750
  class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6175
6751
  cancelFace;
6752
+ confirmClass = "aup-confirm-activity";
6176
6753
  constructor(config) {
6177
6754
  super(config);
6178
6755
  this.cancelFace = {
@@ -6183,7 +6760,7 @@ class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6183
6760
  });
6184
6761
  }
6185
6762
  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 });
6763
+ 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
6764
  }
6188
6765
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractConfirmDialogComponent, decorators: [{
6189
6766
  type: Component,
@@ -6193,7 +6770,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6193
6770
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
6194
6771
  type: Inject,
6195
6772
  args: [ALERT_CONFIG]
6196
- }] }]; } });
6773
+ }] }]; }, propDecorators: { confirmClass: [{
6774
+ type: HostBinding,
6775
+ args: ["class"]
6776
+ }] } });
6197
6777
 
6198
6778
  class ActivityBodyComponent extends DisposableComponent {
6199
6779
  fullWidth = false;
@@ -6732,7 +7312,7 @@ const ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');
6732
7312
  // return true;
6733
7313
  // }
6734
7314
  // }
6735
- class PlaceComponent extends DisposableComponent {
7315
+ class PlaceComponent extends LoadableComponent {
6736
7316
  _placeReadyCallbacks = [];
6737
7317
  visitModel = new MutableValueModel();
6738
7318
  _inVisitUpdate = new Guard();
@@ -6789,6 +7369,7 @@ class PlaceComponent extends DisposableComponent {
6789
7369
  */
6790
7370
  installAndInitialiseBinding(initialVisit, parameterDef) {
6791
7371
  const model = this[parameterDef.propertyName];
7372
+ assert.notNil(model);
6792
7373
  DebugContext.tag(model, `${this.placeDefinition.component.name}.${parameterDef.propertyName}`);
6793
7374
  const binding = this.registerDisposable(new Binding(this.visitModel, model, {
6794
7375
  toRight(visit) {
@@ -6873,7 +7454,7 @@ class PlaceComponent extends DisposableComponent {
6873
7454
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: PlaceComponent, usesInheritance: true, ngImport: i0 });
6874
7455
  }
6875
7456
  __decorate([
6876
- Memoize(),
7457
+ MemoizeGet(),
6877
7458
  __metadata("design:type", PlaceDefinition),
6878
7459
  __metadata("design:paramtypes", [])
6879
7460
  ], PlaceComponent.prototype, "placeDefinition", null);
@@ -7063,7 +7644,7 @@ class Visit {
7063
7644
  getRouterCommands() {
7064
7645
  return this.segments.reduce((result, v) => {
7065
7646
  const path = v.placeDefinition.path;
7066
- return isEmpty$1(path) ?
7647
+ return isEmpty(path) ?
7067
7648
  [...result, path] : // Angular doesn't support route params on empty path segments
7068
7649
  [...result, path, ...v.createRouterCommands()];
7069
7650
  }, []);
@@ -7079,7 +7660,7 @@ class Visit {
7079
7660
  }
7080
7661
  }
7081
7662
  __decorate([
7082
- Memoize$1(),
7663
+ Memoize(),
7083
7664
  __metadata("design:type", Function),
7084
7665
  __metadata("design:paramtypes", [PlaceDefinition]),
7085
7666
  __metadata("design:returntype", VisitSegment)
@@ -7460,10 +8041,7 @@ class SynchroniseInteractionContextIdsWithRoute extends NavigationSession {
7460
8041
  return true;
7461
8042
  }
7462
8043
  notifyActive() {
7463
- // TODO: Do I still need this??
7464
- setTimeout(() => {
7465
- this.syncInteractionIdsWithRouter();
7466
- });
8044
+ this.syncInteractionIdsWithRouter();
7467
8045
  }
7468
8046
  // @Trace()
7469
8047
  onRouterEnd(event) {
@@ -8206,7 +8784,7 @@ class ConsolidatedParameterMap {
8206
8784
  }
8207
8785
  }
8208
8786
  __decorate([
8209
- Memoize(),
8787
+ MemoizeGet(),
8210
8788
  __metadata("design:type", Array),
8211
8789
  __metadata("design:paramtypes", [])
8212
8790
  ], ConsolidatedParameterMap.prototype, "keys", null);
@@ -8284,7 +8862,7 @@ class UrlSnapshot {
8284
8862
  return this.getPrimaryUrlSegments().find(s => s.path === placeDef.path);
8285
8863
  }
8286
8864
  isLastPlaceInUrl(placeDef) {
8287
- return last$1(this.getPrimaryUrlSegments()).path === placeDef.path;
8865
+ return last(this.getPrimaryUrlSegments()).path === placeDef.path;
8288
8866
  }
8289
8867
  createVisitSegmentFor(placeDef) {
8290
8868
  return new VisitSegment(placeDef, new ConsolidatedParameterMap(this.getPrimaryUrlSegments()));
@@ -8400,7 +8978,7 @@ class UrlService {
8400
8978
  back() {
8401
8979
  this.angularLocation.back();
8402
8980
  }
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 });
8981
+ 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
8982
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, providedIn: 'root' });
8405
8983
  }
8406
8984
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: UrlService, decorators: [{
@@ -8408,7 +8986,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8408
8986
  args: [{
8409
8987
  providedIn: 'root'
8410
8988
  }]
8411
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: i1$4.UrlSerializer }]; } });
8989
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: i1$5.UrlSerializer }]; } });
8412
8990
 
8413
8991
  // function asArray<T>(item: T | T[]): T[] {
8414
8992
  // return Array.isArray(item) ? item : [item];
@@ -8428,6 +9006,8 @@ class PlaceRouter extends GarbageCollector {
8428
9006
  routerInteractionAdapter;
8429
9007
  sessionFinishedJobs = [];
8430
9008
  authService = new PlaceAuthService();
9009
+ _ready$ = this.registerDisposable(new DelegatingValueModel().withDefault(true));
9010
+ ready$ = this._ready$.readonly$;
8431
9011
  constructor(angularRouter, angularLocation, interactionService, urlService, placeHistory) {
8432
9012
  super();
8433
9013
  this.angularRouter = angularRouter;
@@ -8449,7 +9029,7 @@ class PlaceRouter extends GarbageCollector {
8449
9029
  });
8450
9030
  const { chain } = Dsl.disposeWith(this);
8451
9031
  this.navigationInProgress$ = chain(this.navigationSession$).isNotNil();
8452
- this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync");
9032
+ this.interactionSyncInProgress$ = chain(this.navigationSession$).pluck("isInteractionSync").otherwise(false);
8453
9033
  const idleStateName = chain(this.interactionService.active).map(active => active ? "IdleDuringInteraction" : "Idle");
8454
9034
  this.navigationSessionName$ = chain(this.navigationSession$)
8455
9035
  .pluck("name")
@@ -8493,6 +9073,9 @@ class PlaceRouter extends GarbageCollector {
8493
9073
  // the back button was clicked.
8494
9074
  angularLocation.onUrlChange(url => this.onUrlChanged(url));
8495
9075
  }
9076
+ postponeRoutingUntil(condition$) {
9077
+ this._ready$.setDelegate(condition$);
9078
+ }
8496
9079
  getAuthenticationFailureRedirect(activatedRoute, state) {
8497
9080
  return this.authService.getAuthenticationFailureRedirect(activatedRoute, state);
8498
9081
  }
@@ -8508,23 +9091,20 @@ class PlaceRouter extends GarbageCollector {
8508
9091
  isNavigating() {
8509
9092
  return this.navigationInProgress$.value;
8510
9093
  }
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
- });
9094
+ async waitUntilRouterReady() {
9095
+ const { waitUntil } = Dsl.disposeWith(this);
9096
+ await waitUntil(this.ready$).becomesTruthy();
9097
+ return this;
9098
+ }
9099
+ async waitUntilIdle() {
9100
+ const { waitUntil } = Dsl.disposeWith(this);
9101
+ await waitUntil(this.navigationInProgress$).becomesFalsey();
9102
+ return this;
8519
9103
  }
8520
9104
  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
- });
9105
+ const { waitUntil } = Dsl.disposeWith(this);
9106
+ await waitUntil(this.interactionSyncInProgress$).becomesFalsey();
9107
+ return this;
8528
9108
  }
8529
9109
  // @Trace()
8530
9110
  onPopState(event) {
@@ -8710,7 +9290,7 @@ class PlaceRouter extends GarbageCollector {
8710
9290
  return Visit.goto(visitOrPlaceComponent, params);
8711
9291
  }
8712
9292
  }
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 });
9293
+ 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
9294
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, providedIn: "root" });
8715
9295
  }
8716
9296
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceRouter, decorators: [{
@@ -8718,7 +9298,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
8718
9298
  args: [{
8719
9299
  providedIn: "root"
8720
9300
  }]
8721
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
9301
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: i1$1.Location }, { type: InteractionService }, { type: UrlService }, { type: PlaceHistory }]; } });
8722
9302
 
8723
9303
  class ActivityTitleComponent extends DisposableComponent {
8724
9304
  _color;
@@ -8740,11 +9320,11 @@ class ActivityTitleComponent extends DisposableComponent {
8740
9320
  return this._color;
8741
9321
  }
8742
9322
  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"] });
9323
+ 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
9324
  }
8745
9325
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityTitleComponent, decorators: [{
8746
9326
  type: Component,
8747
- args: [{ selector: 'aup-activity-title', template: "<ng-content></ng-content>\n", styles: [":host{display:block}\n"] }]
9327
+ 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
9328
  }], propDecorators: { hasTransparentBackground: [{
8749
9329
  type: Input
8750
9330
  }, {
@@ -8765,7 +9345,7 @@ class AlertDialogComponent extends AbstractDialogComponent {
8765
9345
  });
8766
9346
  }
8767
9347
  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"] }] });
9348
+ 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
9349
  }
8770
9350
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AlertDialogComponent, decorators: [{
8771
9351
  type: Component,
@@ -8785,7 +9365,7 @@ class ConfirmThenDialogComponent extends AbstractConfirmDialogComponent {
8785
9365
  });
8786
9366
  }
8787
9367
  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"] }] });
9368
+ 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
9369
  }
8790
9370
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenDialogComponent, decorators: [{
8791
9371
  type: Component,
@@ -8809,7 +9389,7 @@ class ConfirmThenExecuteDialogComponent extends AbstractConfirmDialogComponent {
8809
9389
  });
8810
9390
  }
8811
9391
  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"] }] });
9392
+ 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
9393
  }
8814
9394
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmThenExecuteDialogComponent, decorators: [{
8815
9395
  type: Component,
@@ -8829,7 +9409,7 @@ class ConfirmationDialogComponent extends AbstractConfirmDialogComponent {
8829
9409
  });
8830
9410
  }
8831
9411
  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"] }] });
9412
+ 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
9413
  }
8834
9414
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ConfirmationDialogComponent, decorators: [{
8835
9415
  type: Component,
@@ -9009,6 +9589,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9009
9589
  tabs;
9010
9590
  activityOutlets;
9011
9591
  activityRefs = [];
9592
+ animationDuration = "500ms";
9012
9593
  _identifier;
9013
9594
  _deferredCleanUp;
9014
9595
  interactionServiceApi;
@@ -9021,6 +9602,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9021
9602
  busy = this.registerDisposable(new DelegatingValueModel().withDefault(false));
9022
9603
  syncTabsJob = undefined;
9023
9604
  stable$;
9605
+ wasActive = false;
9024
9606
  constructor(placeRouter) {
9025
9607
  super();
9026
9608
  this.placeRouter = placeRouter;
@@ -9057,7 +9639,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9057
9639
  * Returns true if an activity is currently running.
9058
9640
  */
9059
9641
  isActive() {
9060
- return this.getActiveActivityCount() > 0;
9642
+ const isActive = this.getActiveActivityCount() > 0;
9643
+ // if (this.wasActive !== isActive) {
9644
+ // console.log({was: this.wasActive, is: isActive});
9645
+ // }
9646
+ // this.wasActive = isActive
9647
+ return isActive;
9061
9648
  }
9062
9649
  registerDisposable(disposable) {
9063
9650
  return this.garbage.registerDisposable(disposable);
@@ -9140,7 +9727,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9140
9727
  // by activity index)
9141
9728
  setTimeout(() => {
9142
9729
  this.activityRefs = []; // we have to do it after the animation timeout or the activity disappears before the animatin finsihes
9143
- }, this.getTabAnimationDuration());
9730
+ }, this.getTabAnimationDurationInMillis());
9144
9731
  const promise = this.interactionServiceApi.notifyFinished(this);
9145
9732
  this._deferredCleanUp = promise
9146
9733
  .finally(() => {
@@ -9166,7 +9753,6 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9166
9753
  /**
9167
9754
  * Synchronises the selected tab index.
9168
9755
  */
9169
- // @Trace()
9170
9756
  synchroniseSelectedTabIndex() {
9171
9757
  assert.isTruthy(this.isActive());
9172
9758
  const previousIndex = this.tabs.selectedIndex;
@@ -9178,10 +9764,10 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9178
9764
  activityRef.setFocused(false);
9179
9765
  this.busy.setDelegate(activityRef.activityBusy);
9180
9766
  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
- }
9767
+ // if (this.ready$.value) {
9768
+ // // Note: We're not using the animation done event as it's firing almost immeadiately.
9769
+ // setTimeout(() => this.finaliseActivityStates(), animate ? this.getTabAnimationDurationInMillis() : 0);
9770
+ // }
9185
9771
  }
9186
9772
  }
9187
9773
  finaliseActivityStates() {
@@ -9195,7 +9781,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9195
9781
  return this.activityOutlets.toArray()[this.tabs.selectedIndex];
9196
9782
  }
9197
9783
  getTabAnimationDuration() {
9198
- const match = this.tabs.animationDuration.match(/(\d+)(.*)/);
9784
+ // const s = this._started$.value ? this.animationDuration : "0";
9785
+ // return s
9786
+ return this.animationDuration;
9787
+ }
9788
+ getTabAnimationDurationInMillis() {
9789
+ const match = this.animationDuration.match(/(\d+)(.*)/);
9199
9790
  const numericValue = parseFloat(match[1]);
9200
9791
  switch (match[2].trim()) {
9201
9792
  case "ms":
@@ -9221,12 +9812,16 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9221
9812
  }
9222
9813
  }, 75);
9223
9814
  }
9815
+ onAnimationDone() {
9816
+ this._started$.value = true;
9817
+ this.finaliseActivityStates();
9818
+ }
9224
9819
  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"] }] });
9820
+ 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
9821
  }
9227
9822
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityContainerComponent, decorators: [{
9228
9823
  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"] }]
9824
+ 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
9825
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { dynamicHeight: [{
9231
9826
  type: Input
9232
9827
  }], tabs: [{
@@ -9235,6 +9830,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9235
9830
  }], activityOutlets: [{
9236
9831
  type: ViewChildren,
9237
9832
  args: [ActivityOutletComponent]
9833
+ }], animationDuration: [{
9834
+ type: Input
9238
9835
  }] } });
9239
9836
 
9240
9837
  class AbstractActivityTriggerComponent extends DisposableComponent {
@@ -9335,14 +9932,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9335
9932
  args: ['class.active']
9336
9933
  }] } });
9337
9934
 
9338
- const cssDurationRegex = /(\d+)(m?s)/;
9935
+ const cssDurationRegex$1 = /(\d+)(m?s)/;
9339
9936
  /**
9340
9937
  * @example
9341
9938
  * <aup-in-place-interaction-context #inPlaceInteractionContext>
9342
9939
  * </aup-in-place-interaction-context>
9343
9940
  *
9344
9941
  * in your component
9345
- * @ViewChild('inPlaceInteractionContext', { static: true })
9942
+ * @ViewChild(InPlaceInteractionContextComponent)
9346
9943
  * interactionContext: InteractionContext;
9347
9944
  *
9348
9945
  *
@@ -9361,11 +9958,13 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9361
9958
  * active interactions.
9362
9959
  */
9363
9960
  syncWithRoutes = true;
9961
+ started = new EventEmitter();
9962
+ finished = new EventEmitter();
9364
9963
  get animationDuration() {
9365
9964
  return this.animateFirstActivity ? (this.tabConfig?.animationDuration || "500ms") : "0ms";
9366
9965
  }
9367
9966
  get animationDurationMillis() {
9368
- const result = cssDurationRegex.exec(this.animationDuration);
9967
+ const result = cssDurationRegex$1.exec(this.animationDuration);
9369
9968
  if (!result) {
9370
9969
  lang.illegalState(`unsupported css duration: ${this.animationDuration}`);
9371
9970
  }
@@ -9387,11 +9986,16 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9387
9986
  this.interactionService.registerInplaceInteractionContext(this);
9388
9987
  }
9389
9988
  else {
9989
+ const self = this;
9390
9990
  this.activityContainerComponent.initialise("dont-care", {
9391
9991
  async notifyActive(interactionContext) {
9992
+ self.started.emit();
9392
9993
  return undefined;
9393
9994
  },
9394
9995
  async notifyFinished(interactionContext) {
9996
+ // I've noticed some rendering fails when returning the the transcluded content we'll fire an event
9997
+ // so components can do stuff if they need to.
9998
+ self.started.emit();
9395
9999
  return undefined;
9396
10000
  }
9397
10001
  });
@@ -9438,7 +10042,7 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9438
10042
  }
9439
10043
  }
9440
10044
  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"] }] });
10045
+ 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
10046
  }
9443
10047
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InPlaceInteractionContextComponent, decorators: [{
9444
10048
  type: Component,
@@ -9455,6 +10059,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9455
10059
  type: Input
9456
10060
  }], syncWithRoutes: [{
9457
10061
  type: Input
10062
+ }], started: [{
10063
+ type: Output
10064
+ }], finished: [{
10065
+ type: Output
9458
10066
  }], active: [{
9459
10067
  type: HostBinding,
9460
10068
  args: ["class.active"]
@@ -9469,7 +10077,7 @@ class InlineActivityTriggerComponent extends AbstractActivityTriggerComponent {
9469
10077
  super();
9470
10078
  }
9471
10079
  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"] }] });
10080
+ 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
10081
  }
9474
10082
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InlineActivityTriggerComponent, decorators: [{
9475
10083
  type: Component,
@@ -9593,7 +10201,7 @@ class PopupInteractionContextComponent extends DisposableComponent {
9593
10201
  isActive() {
9594
10202
  return this.interactionContext && this.interactionContext.isActive();
9595
10203
  }
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 });
10204
+ 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
10205
  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
10206
  }
9599
10207
  __decorate([
@@ -9607,7 +10215,7 @@ __decorate([
9607
10215
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PopupInteractionContextComponent, decorators: [{
9608
10216
  type: Component,
9609
10217
  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: [{
10218
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$6.Overlay }, { type: i1$6.CdkScrollable, decorators: [{
9611
10219
  type: Optional
9612
10220
  }, {
9613
10221
  type: SkipSelf
@@ -9692,7 +10300,7 @@ class AddCardActivityComponent extends AbstractActivityTriggerComponent {
9692
10300
  return this.interactionStyle === 'inline';
9693
10301
  }
9694
10302
  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"] }] });
10303
+ 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
10304
  }
9697
10305
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AddCardActivityComponent, decorators: [{
9698
10306
  type: Component,
@@ -9768,7 +10376,7 @@ class AddItemInteractionContextComponent extends DisposableComponent {
9768
10376
  return this.interactionContext.startActivity(activityType, data);
9769
10377
  }
9770
10378
  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"] }] });
10379
+ 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
10380
  }
9773
10381
  __decorate([
9774
10382
  Proxify(),
@@ -9907,12 +10515,14 @@ class StringInputActivity extends InputActivity {
9907
10515
  [label]="activityData.label"
9908
10516
  [placeholder]="activityData.placeholder"
9909
10517
  [command.enter]="confirmCommand"
9910
- [command.escape]="cancelCommand"></aup-string-input>
10518
+ [command.escape]="cancelCommand"
10519
+ [dense]="true"
10520
+ ></aup-string-input>
9911
10521
  <aup-activity-actions [layout]="layout" align="end"
9912
10522
  [confirmFace]="confirmFace"
9913
10523
  [cancelFace]="cancelFace"
9914
10524
  ></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"] }] });
10525
+ `, 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
10526
  }
9917
10527
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputActivity, decorators: [{
9918
10528
  type: Component,
@@ -9923,7 +10533,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9923
10533
  [label]="activityData.label"
9924
10534
  [placeholder]="activityData.placeholder"
9925
10535
  [command.enter]="confirmCommand"
9926
- [command.escape]="cancelCommand"></aup-string-input>
10536
+ [command.escape]="cancelCommand"
10537
+ [dense]="true"
10538
+ ></aup-string-input>
9927
10539
  <aup-activity-actions [layout]="layout" align="end"
9928
10540
  [confirmFace]="confirmFace"
9929
10541
  [cancelFace]="cancelFace"
@@ -10106,7 +10718,7 @@ class InlineStringEditorComponent extends DisposableComponent {
10106
10718
  return !this.editingEnabled$.value;
10107
10719
  }
10108
10720
  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"] }] });
10721
+ 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
10722
  }
10111
10723
  __decorate([
10112
10724
  Proxify(),
@@ -10189,6 +10801,7 @@ class SelectInputActivity extends InputActivity {
10189
10801
  [options]="options"
10190
10802
  [optionLabelFormat]="optionLabelFormat"
10191
10803
  [allowNil]="activityData.allowNil"
10804
+ [dense]="true"
10192
10805
  >
10193
10806
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10194
10807
  </aup-select-input>
@@ -10196,7 +10809,7 @@ class SelectInputActivity extends InputActivity {
10196
10809
  [confirmFace]="confirmFace"
10197
10810
  [cancelFace]="cancelFace"
10198
10811
  ></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"] }] });
10812
+ `, 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
10813
  }
10201
10814
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputActivity, decorators: [{
10202
10815
  type: Component,
@@ -10211,6 +10824,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10211
10824
  [options]="options"
10212
10825
  [optionLabelFormat]="optionLabelFormat"
10213
10826
  [allowNil]="activityData.allowNil"
10827
+ [dense]="true"
10214
10828
  >
10215
10829
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10216
10830
  </aup-select-input>
@@ -10222,6 +10836,182 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10222
10836
  }]
10223
10837
  }] });
10224
10838
 
10839
+ const slideDownOnEnterDef = style({
10840
+ opacity: 0,
10841
+ 'height': '0',
10842
+ 'max-height': '0',
10843
+ paddingTop: '0',
10844
+ paddingBottom: '0'
10845
+ });
10846
+ // TODO: params aren't getting customised in the view. Need to figure out the correct approach.
10847
+ const slideDownOnEnterAnimation = trigger('slideDownOnEnter', [
10848
+ transition(':enter', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10849
+ transition(':leave', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10850
+ ]);
10851
+ const slideDownWhenOpenAnimation = trigger('slideDownWhenOpen', [
10852
+ transition('closed => open', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10853
+ transition('open => closed', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10854
+ ]);
10855
+ const slideLeftOnEnterDef = style({
10856
+ opacity: 0,
10857
+ 'width': '0',
10858
+ paddingLeft: '0',
10859
+ paddingRight: '0'
10860
+ });
10861
+ const slideRightOnEnterAnimation = trigger('slideRightOnEnter', [
10862
+ transition(':enter', [slideLeftOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10863
+ transition(':leave', [animate('{{duration}}', slideLeftOnEnterDef)], { params: { duration: '100ms' } })
10864
+ ]);
10865
+ const ZERO_WIDTH = {
10866
+ opacity: 0,
10867
+ width: '0',
10868
+ paddingLeft: '0',
10869
+ paddingRight: '0',
10870
+ };
10871
+ const ZERO_HEIGHT = {
10872
+ opacity: 0,
10873
+ height: '0',
10874
+ paddingTop: '0',
10875
+ paddingBottom: '0',
10876
+ };
10877
+ const slideDownAndRightOnEnterAnimation = trigger('slideDownAndRightOnEnter', [
10878
+ transition(':enter', [
10879
+ style({ overflow: "hidden", whiteSpace: "nowrap", ...ZERO_WIDTH, ...ZERO_HEIGHT }),
10880
+ animate('{{duration}}')
10881
+ ], { params: { duration: '100ms' } }),
10882
+ transition(':leave', [
10883
+ style({ overflow: "hidden", whiteSpace: "nowrap" }),
10884
+ group([
10885
+ animate('{{duration}}', style(ZERO_HEIGHT)),
10886
+ // Hack: 100ms is too quick as it animates from * - 0 as we only see it animate the width is greater than the parent.
10887
+ // Not sure how to animate from * to natural new width of parent. This hack won't work for text that's just a little
10888
+ // bit wider than the parent as it'll fall within the parent bounds very early in the animation cycle.
10889
+ animate('300ms', style(ZERO_WIDTH)),
10890
+ ])
10891
+ ], { params: { duration: '100ms' } })
10892
+ ]);
10893
+
10894
+ const cssDurationRegex = /(\d+)(m?s)/;
10895
+ /**
10896
+ * This interaction context remains hidden (height: 0) until it is active.
10897
+ * @example
10898
+ * <aup-slide-down-interaction-context #inPlaceInteractionContext>
10899
+ * </aup-slide-down-interaction-context>
10900
+ *
10901
+ * in your component
10902
+ * @ViewChild(SlideDownInteractionContextComponent)
10903
+ * interactionContext: InteractionContext;
10904
+ *
10905
+ *
10906
+ */
10907
+ class SlideDownInteractionContextComponent extends DisposableComponent {
10908
+ tabConfig;
10909
+ activityContainerComponent;
10910
+ // NOTE: disabling this as I'm using the initialise callback to release the hacky height clamp.
10911
+ // The whole registration thing is a bit naf so I should really clean that up at some point.
10912
+ // /**
10913
+ // * If true the activity will sync with the router to enable back button support. This is a work around for
10914
+ // * deeply nested activities that can't be linked with the root place interactionContext hook for cancelling
10915
+ // * active interactions.
10916
+ // */
10917
+ // @Input()
10918
+ // syncWithRoutes = true;
10919
+ dynamicHeight = true;
10920
+ get active() {
10921
+ return this.isActive();
10922
+ }
10923
+ // Horrible hack to stop the div and activity container bouncing back for a bit in after closing. No idea why it's doing that.
10924
+ clampShut = true;
10925
+ interactionService = this.inject(InteractionService);
10926
+ constructor(tabConfig) {
10927
+ super();
10928
+ this.tabConfig = tabConfig;
10929
+ }
10930
+ ngAfterViewInit() {
10931
+ // NOTE: this is a temp work around to detach inplace contexts from the router until AUP-88 is implemented.
10932
+ // https://coolon.atlassian.net/browse/AUP-88?atlOrigin=eyJpIjoiOTg5YjEzZGUzZjRmNDg0NmExOWU3ZGJmMzJiNTRmNGYiLCJwIjoiaiJ9
10933
+ const self = this;
10934
+ this.activityContainerComponent.initialise("dont-care", {
10935
+ async notifyActive(interactionContext) {
10936
+ self.clampShut = false;
10937
+ return undefined;
10938
+ },
10939
+ async notifyFinished(interactionContext) {
10940
+ return undefined;
10941
+ }
10942
+ });
10943
+ // if (this.syncWithRoutes) {
10944
+ // this.interactionService.registerInplaceInteractionContext(this);
10945
+ // }
10946
+ }
10947
+ getAnimationState() {
10948
+ return {
10949
+ value: this.isActive() ? "open" : "closed",
10950
+ params: { duration: "200ms" }
10951
+ };
10952
+ }
10953
+ // this is a regsitration callback from the interaction service
10954
+ // @Trace() // webstorm says no usages... but I'm not sure.
10955
+ onInplaceInteractionContextRegistered(id, api) {
10956
+ this.activityContainerComponent.initialise(id, api);
10957
+ }
10958
+ get identifier() {
10959
+ return this.activityContainerComponent.identifier;
10960
+ }
10961
+ alert(alert) {
10962
+ return this.activityContainerComponent.alert(alert);
10963
+ }
10964
+ cancelActiveActivity() {
10965
+ return this.activityContainerComponent.cancelActiveActivity();
10966
+ }
10967
+ confirm(confirm) {
10968
+ return this.activityContainerComponent.confirm(confirm);
10969
+ }
10970
+ confirmOrReject(confirm) {
10971
+ return this.activityContainerComponent.confirmOrReject(confirm);
10972
+ }
10973
+ confirmThen(confirm, activityType, data) {
10974
+ return this.activityContainerComponent.confirmThen(confirm, activityType);
10975
+ }
10976
+ confirmThenExecute(confirm, operation) {
10977
+ return this.activityContainerComponent.confirmThenExecute(confirm, operation);
10978
+ }
10979
+ isActive() {
10980
+ return this.activityContainerComponent.isActive();
10981
+ }
10982
+ startActivity(activityType, data, options) {
10983
+ return this.activityContainerComponent.startActivity(activityType, data, options);
10984
+ }
10985
+ onAnimationDone() {
10986
+ if (!this.isActive()) {
10987
+ this.clampShut = true;
10988
+ }
10989
+ }
10990
+ 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 });
10991
+ 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: [
10992
+ slideDownWhenOpenAnimation
10993
+ ] });
10994
+ }
10995
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SlideDownInteractionContextComponent, decorators: [{
10996
+ type: Component,
10997
+ args: [{ selector: "aup-slide-down-interaction-context", animations: [
10998
+ slideDownWhenOpenAnimation
10999
+ ], 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"] }]
11000
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
11001
+ type: Inject,
11002
+ args: [MAT_TABS_CONFIG]
11003
+ }, {
11004
+ type: Optional
11005
+ }] }]; }, propDecorators: { activityContainerComponent: [{
11006
+ type: ViewChild,
11007
+ args: ["activityContainer", { static: true }]
11008
+ }], dynamicHeight: [{
11009
+ type: Input
11010
+ }], active: [{
11011
+ type: HostBinding,
11012
+ args: ["class.active"]
11013
+ }] } });
11014
+
10225
11015
  class InteractionContextTriggerForDirective extends GarbageCollector {
10226
11016
  aupInteractionContextTriggerFor;
10227
11017
  activityClass;
@@ -10304,6 +11094,7 @@ class InteractionModule {
10304
11094
  AlertDialogComponent,
10305
11095
  ActivityOutletComponent,
10306
11096
  InPlaceInteractionContextComponent,
11097
+ SlideDownInteractionContextComponent,
10307
11098
  AddItemInteractionContextComponent,
10308
11099
  ActivityActionsComponent,
10309
11100
  PopupInteractionContextComponent,
@@ -10330,8 +11121,6 @@ class InteractionModule {
10330
11121
  RouterModule,
10331
11122
  MatIconModule,
10332
11123
  DirectivesModule,
10333
- FlexModule,
10334
- GridModule,
10335
11124
  ComponentsModule,
10336
11125
  FormsModule,
10337
11126
  MatInputModule,
@@ -10351,7 +11140,8 @@ class InteractionModule {
10351
11140
  InlineActivityTriggerComponent,
10352
11141
  ModalActivityTriggerComponent,
10353
11142
  AddCardActivityComponent,
10354
- InlineStringEditorComponent] });
11143
+ InlineStringEditorComponent,
11144
+ SlideDownInteractionContextComponent] });
10355
11145
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InteractionModule, providers: [
10356
11146
  InteractionService
10357
11147
  // {
@@ -10365,8 +11155,6 @@ class InteractionModule {
10365
11155
  RouterModule,
10366
11156
  MatIconModule,
10367
11157
  DirectivesModule,
10368
- FlexModule,
10369
- GridModule,
10370
11158
  ComponentsModule,
10371
11159
  FormsModule,
10372
11160
  MatInputModule,
@@ -10385,8 +11173,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10385
11173
  RouterModule,
10386
11174
  MatIconModule,
10387
11175
  DirectivesModule,
10388
- FlexModule,
10389
- GridModule,
10390
11176
  ComponentsModule,
10391
11177
  FormsModule,
10392
11178
  MatInputModule,
@@ -10401,6 +11187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10401
11187
  AlertDialogComponent,
10402
11188
  ActivityOutletComponent,
10403
11189
  InPlaceInteractionContextComponent,
11190
+ SlideDownInteractionContextComponent,
10404
11191
  AddItemInteractionContextComponent,
10405
11192
  ActivityActionsComponent,
10406
11193
  PopupInteractionContextComponent,
@@ -10438,6 +11225,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10438
11225
  ModalActivityTriggerComponent,
10439
11226
  AddCardActivityComponent,
10440
11227
  InlineStringEditorComponent,
11228
+ SlideDownInteractionContextComponent,
10441
11229
  ],
10442
11230
  providers: [
10443
11231
  InteractionService
@@ -10508,7 +11296,6 @@ class PlaceOutletComponent extends DisposableComponent {
10508
11296
  router;
10509
11297
  placeRouter;
10510
11298
  placeConfig;
10511
- cdr;
10512
11299
  #animate$_accessor_storage = proxify((ValueModel));
10513
11300
  get animate$() { return this.#animate$_accessor_storage; }
10514
11301
  set animate$(value) { this.#animate$_accessor_storage = value; }
@@ -10542,12 +11329,11 @@ class PlaceOutletComponent extends DisposableComponent {
10542
11329
  animationEnabled;
10543
11330
  authorised;
10544
11331
  notAuthorisedNoticePortal;
10545
- constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet, cdr) {
11332
+ constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet) {
10546
11333
  super();
10547
11334
  this.router = router;
10548
11335
  this.placeRouter = placeRouter;
10549
11336
  this.placeConfig = placeConfig;
10550
- this.cdr = cdr;
10551
11337
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
10552
11338
  this.parentOutletModel = new MutableValueModel(parentOutlet);
10553
11339
  const defaultPlaceAnimationOrder = chain(this.parentOutletModel)
@@ -10559,7 +11345,7 @@ class PlaceOutletComponent extends DisposableComponent {
10559
11345
  this.placesInAnimationOrder = chain(this.customPlaceAnimationOrder$)
10560
11346
  .otherwise(defaultPlaceAnimationOrder);
10561
11347
  this.activePlaceAnimationPosition = this.placesInAnimationOrder
10562
- .reduce((placesInOrder) => {
11348
+ .reduceAll((placesInOrder) => {
10563
11349
  let placeIndex = 0;
10564
11350
  if (activatePlaceType.value) {
10565
11351
  placeIndex = placesInOrder.indexOf(activatePlaceType.value);
@@ -10713,8 +11499,8 @@ class PlaceOutletComponent extends DisposableComponent {
10713
11499
  this.onAnimationFinishedJob = undefined;
10714
11500
  }
10715
11501
  }
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] });
11502
+ 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 });
11503
+ 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
11504
  }
10719
11505
  __decorate([
10720
11506
  Proxify(),
@@ -10735,7 +11521,7 @@ __decorate([
10735
11521
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceOutletComponent, decorators: [{
10736
11522
  type: Component,
10737
11523
  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: [{
11524
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: PlaceRouter }, { type: undefined, decorators: [{
10739
11525
  type: Optional
10740
11526
  }, {
10741
11527
  type: Inject,
@@ -10749,7 +11535,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10749
11535
  type: SkipSelf
10750
11536
  }, {
10751
11537
  type: Optional
10752
- }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { animate$: [{
11538
+ }] }]; }, propDecorators: { animate$: [{
10753
11539
  type: Input
10754
11540
  }], animate: [{
10755
11541
  type: Input
@@ -10882,7 +11668,7 @@ class ListPlaceNavComponent extends AbstractPlaceNavigationComponent {
10882
11668
  super(router);
10883
11669
  }
10884
11670
  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"] }] });
11671
+ 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
11672
  }
10887
11673
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ListPlaceNavComponent, decorators: [{
10888
11674
  type: Component,
@@ -10957,7 +11743,7 @@ class SidePlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10957
11743
  this.expanded = !this.expanded;
10958
11744
  }
10959
11745
  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"] }] });
11746
+ 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
11747
  }
10962
11748
  __decorate([
10963
11749
  Proxify(),
@@ -10969,7 +11755,7 @@ __decorate([
10969
11755
  ], SidePlaceNavigationComponent.prototype, "expanded", null);
10970
11756
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SidePlaceNavigationComponent, decorators: [{
10971
11757
  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"] }]
11758
+ 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
11759
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { expanded$: [{
10974
11760
  type: Input
10975
11761
  }], expanded: [{
@@ -10987,7 +11773,7 @@ class TabbedPlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10987
11773
  super(router);
10988
11774
  }
10989
11775
  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"] }] });
11776
+ 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
11777
  }
10992
11778
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TabbedPlaceNavigationComponent, decorators: [{
10993
11779
  type: Component,
@@ -11010,7 +11796,6 @@ class PlaceModule {
11010
11796
  MatTooltipModule,
11011
11797
  MatIconModule,
11012
11798
  DirectivesModule,
11013
- FlexModule,
11014
11799
  ComponentsModule,
11015
11800
  PortalModule,
11016
11801
  MatCardModule], exports: [PlaceOutletComponent,
@@ -11027,7 +11812,6 @@ class PlaceModule {
11027
11812
  MatTooltipModule,
11028
11813
  MatIconModule,
11029
11814
  DirectivesModule,
11030
- FlexModule,
11031
11815
  ComponentsModule,
11032
11816
  PortalModule,
11033
11817
  MatCardModule] });
@@ -11045,7 +11829,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11045
11829
  MatTooltipModule,
11046
11830
  MatIconModule,
11047
11831
  DirectivesModule,
11048
- FlexModule,
11049
11832
  ComponentsModule,
11050
11833
  PortalModule,
11051
11834
  MatCardModule
@@ -11135,60 +11918,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11135
11918
  }]
11136
11919
  }] });
11137
11920
 
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
11921
  /**
11189
11922
  * @file Automatically generated by barrelsby.
11190
11923
  */
11191
11924
 
11925
+ class ResizeObserverDirective extends DisposableComponent {
11926
+ aupOnResize = new EventEmitter();
11927
+ elementRef = this.inject(ElementRef);
11928
+ ngZone = this.inject(NgZone);
11929
+ _bounds$ = new MutableValueModel();
11930
+ ngAfterViewInit() {
11931
+ const element = this.elementRef.nativeElement;
11932
+ const ro = new ResizeObserver((entries, observer) => {
11933
+ this.ngZone.run(() => this._updateBounds());
11934
+ });
11935
+ ro.observe(element);
11936
+ this.onDispose(() => ro.disconnect());
11937
+ setTimeout(() => this._updateBounds());
11938
+ }
11939
+ get bounds$() {
11940
+ return this._bounds$.readonly$;
11941
+ }
11942
+ _updateBounds() {
11943
+ this._bounds$.value = Bounds.ofElement(this.elementRef.nativeElement);
11944
+ this.aupOnResize.emit(this._bounds$.value);
11945
+ }
11946
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
11947
+ 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 });
11948
+ }
11949
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, decorators: [{
11950
+ type: Directive,
11951
+ args: [{
11952
+ selector: "[aupOnResize]",
11953
+ standalone: true
11954
+ }]
11955
+ }], propDecorators: { aupOnResize: [{
11956
+ type: Output
11957
+ }] } });
11958
+
11192
11959
  /**
11193
11960
  * @file Automatically generated by barrelsby.
11194
11961
  */
@@ -11279,7 +12046,7 @@ class DialogInteractionContextFactory extends ModalInteractionContextFactory {
11279
12046
  };
11280
12047
  return new DialogInteractionContext(identifier, api, this.dialogService, config);
11281
12048
  }
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 });
12049
+ 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
12050
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, providedIn: 'root' });
11284
12051
  }
11285
12052
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DialogInteractionContextFactory, decorators: [{
@@ -11287,12 +12054,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11287
12054
  args: [{
11288
12055
  providedIn: 'root'
11289
12056
  }]
11290
- }], ctorParameters: function () { return [{ type: i1$6.MatDialog }, { type: i1$6.MatDialogConfig, decorators: [{
12057
+ }], ctorParameters: function () { return [{ type: i1$7.MatDialog }, { type: i1$7.MatDialogConfig, decorators: [{
11291
12058
  type: Optional
11292
12059
  }, {
11293
12060
  type: Inject,
11294
12061
  args: [DIALOG_INTERACTION_SERVICE_DEFAULTS]
11295
- }] }, { type: i1$6.MatDialogConfig, decorators: [{
12062
+ }] }, { type: i1$7.MatDialogConfig, decorators: [{
11296
12063
  type: Optional
11297
12064
  }, {
11298
12065
  type: Inject,
@@ -11412,6 +12179,7 @@ class PlaceGuard {
11412
12179
  }
11413
12180
  // @Trace()
11414
12181
  async canActivate(activatedRoute, state) {
12182
+ await this.placeRouter.waitUntilRouterReady();
11415
12183
  if (PlaceComponent.isPlaceComponentConstructor(activatedRoute.component)) {
11416
12184
  const placeDefinition = PlaceComponent.getDefinition(activatedRoute.component);
11417
12185
  if (placeDefinition.authenticate) {
@@ -11524,13 +12292,13 @@ class PlaceGuard {
11524
12292
  return next();
11525
12293
  }
11526
12294
  }
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 });
12295
+ 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
12296
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, providedIn: 'root' });
11529
12297
  }
11530
12298
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PlaceGuard, decorators: [{
11531
12299
  type: Injectable,
11532
12300
  args: [{ providedIn: 'root' }]
11533
- }], ctorParameters: function () { return [{ type: i1$4.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
12301
+ }], ctorParameters: function () { return [{ type: i1$5.Router }, { type: UrlService }, { type: PlaceRouter }, { type: PlaceHistory }, { type: InteractionService }, { type: i0.Injector }]; } });
11534
12302
 
11535
12303
  var Formatter;
11536
12304
  (function (Formatter) {
@@ -11564,69 +12332,74 @@ var Formatter;
11564
12332
  Formatter.BOOLEAN = new BooleanType();
11565
12333
  })(Formatter || (Formatter = {}));
11566
12334
 
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
- }
12335
+ // function installMechanics<M extends HasValue<any>>(parameterDef: ParameterDefinition<any>, prototype: object, propertyKey: string | symbol, tagPrefix: string) {
12336
+ //
12337
+ // Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12338
+ //
12339
+ // function getMechanics(instance: M, propertyName: string | symbol) {
12340
+ // const key = `__mechanics_${propertyName.toString()}`;
12341
+ // if (!instance[key]) {
12342
+ // const backingModel = parameterDef.createBackingModel();
12343
+ // instance[key] = {
12344
+ // backingModel: backingModel,
12345
+ // binding: null as Binding<any, any>
12346
+ // };
12347
+ // const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
12348
+ // DebugContext.getOrCreate(instance[key].backingModel).tag(tag);
12349
+ // }
12350
+ // return instance[key];
12351
+ // }
12352
+ //
12353
+ // Object.defineProperty(prototype, propertyKey, {
12354
+ // get: function() {
12355
+ // return getMechanics(this, propertyKey).backingModel;
12356
+ // },
12357
+ // set: function(userModel: M) {
12358
+ // const mechanics = getMechanics(this, propertyKey);
12359
+ // // This handles the scenario where we want to push an existing value model (such as a form model)
12360
+ // // to and from the route.
12361
+ // if (mechanics.binding) {
12362
+ // mechanics.binding.dispose();
12363
+ // }
12364
+ // if (userModel) {
12365
+ // mechanics.binding = new Binding(mechanics.backingModel, userModel, {
12366
+ // toLeft: Functions.identity,
12367
+ // toRight: Functions.identity
12368
+ // });
12369
+ // if (parameterDef.isEmptyValue(userModel.value)) {
12370
+ // // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});
12371
+ // mechanics.binding.writeRight(); // push the visit into the user model;
12372
+ // } else {
12373
+ // if (!parameterDef.isEmptyValue(mechanics.backingModel.value)) {
12374
+ // console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');
12375
+ // }
12376
+ // mechanics.binding.writeLeft(); // push the user model into the visit
12377
+ // }
12378
+ // }
12379
+ // }
12380
+ // });
12381
+ // }
11612
12382
  function RouteId(formatter, options) {
11613
12383
  return (prototype, propertyKey) => {
11614
12384
  const parameterDef = new ParameterDefinition.RouteId(propertyKey.toString(), options, formatter);
11615
- installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12385
+ // installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12386
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
11616
12387
  };
11617
12388
  }
11618
12389
  function VisitParameter(options) {
11619
12390
  const opts = Opts.get(options);
11620
12391
  return (prototype, propertyKey) => {
11621
12392
  const parameterDef = new ParameterDefinition.ValueParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11622
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
12393
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12394
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
11623
12395
  };
11624
12396
  }
11625
12397
  function VisitParameterList(options) {
11626
12398
  const opts = Opts.get(options);
11627
12399
  return (prototype, propertyKey) => {
11628
12400
  const parameterDef = new ParameterDefinition.ArrayParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11629
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
12401
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12402
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
11630
12403
  };
11631
12404
  }
11632
12405
 
@@ -11720,5 +12493,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11720
12493
  * Generated bundle index. Do not edit.
11721
12494
  */
11722
12495
 
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 };
12496
+ 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
12497
  //# sourceMappingURL=coolon-angular-ui-powerups.mjs.map