@coolon/angular-ui-powerups 16.1.0-aplpha.9 → 16.1.0-aplpha.91

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 (145) hide show
  1. package/assets/activities/input-activities.scss +10 -2
  2. package/assets/form.scss +74 -27
  3. package/assets/table.scss +13 -24
  4. package/assets/tabs.scss +2 -6
  5. package/esm2022/lib/animations/slide-animations.mjs +6 -1
  6. package/esm2022/lib/components/cards/card-container/card-container.component.mjs +4 -4
  7. package/esm2022/lib/components/commands/command/command.component.mjs +24 -10
  8. package/esm2022/lib/components/commands/command-face/command-face.component.mjs +11 -3
  9. package/esm2022/lib/components/commands/command-face.mjs +11 -11
  10. package/esm2022/lib/components/commands/group/popup-menu/abstract-popup-menu.component.mjs +11 -11
  11. package/esm2022/lib/components/commands/group/tool-bar/tool-bar.component.mjs +6 -4
  12. package/esm2022/lib/components/components.module.mjs +22 -8
  13. package/esm2022/lib/components/disposable-component.mjs +19 -37
  14. package/esm2022/lib/components/exports.mjs +6 -2
  15. package/esm2022/lib/components/forms/abstract-input.component.mjs +55 -12
  16. package/esm2022/lib/components/forms/autocomplete-input/autocomplete-input.component.mjs +2 -2
  17. package/esm2022/lib/components/forms/checkbox-input/checkbox-input.component.mjs +3 -3
  18. package/esm2022/lib/components/forms/form-field.mjs +2 -0
  19. package/esm2022/lib/components/forms/multiple-select-input/multiple-select-input.component.mjs +2 -2
  20. package/esm2022/lib/components/forms/number-input/number-input.component.mjs +49 -10
  21. package/esm2022/lib/components/forms/password-input/password-input.component.mjs +40 -3
  22. package/esm2022/lib/components/forms/search-input/search-input.component.mjs +33 -0
  23. package/esm2022/lib/components/forms/select-input/select-input.component.mjs +11 -10
  24. package/esm2022/lib/components/forms/string-input/string-input.component.mjs +21 -9
  25. package/esm2022/lib/components/icon/icon.component.mjs +7 -4
  26. package/esm2022/lib/components/loadable-component.mjs +49 -0
  27. package/esm2022/lib/components/resize-aware.component.mjs +61 -24
  28. package/esm2022/lib/components/switch-case/switch-case.component.mjs +5 -7
  29. package/esm2022/lib/components/tables/abstract-table-model.mjs +42 -25
  30. package/esm2022/lib/components/tables/abstract-table.component.mjs +19 -5
  31. package/esm2022/lib/components/tables/column/column-manager.mjs +81 -0
  32. package/esm2022/lib/components/tables/column/column-model.mjs +13 -3
  33. package/esm2022/lib/components/tables/column/column-order-manager.mjs +19 -0
  34. package/esm2022/lib/components/tables/column/custom-template-column-model.mjs +3 -3
  35. package/esm2022/lib/components/tables/column/custom-value-column-model.mjs +3 -3
  36. package/esm2022/lib/components/tables/column/editor-controls-column-model.mjs +3 -3
  37. package/esm2022/lib/components/tables/column/list-propery-column-model.mjs +3 -3
  38. package/esm2022/lib/components/tables/column/property-column-model.mjs +3 -3
  39. package/esm2022/lib/components/tables/column/selection-column-model.mjs +3 -3
  40. package/esm2022/lib/components/tables/editor/edit-session.mjs +4 -2
  41. package/esm2022/lib/components/tables/filter/table-filter-model.mjs +4 -2
  42. package/esm2022/lib/components/tables/filter/text-search-predicate.mjs +16 -2
  43. package/esm2022/lib/components/tables/renderer/default-cell-renderer/default-cell-renderer.component.mjs +3 -3
  44. package/esm2022/lib/components/tables/renderer/table-body/table-body.component.mjs +132 -41
  45. package/esm2022/lib/components/tables/renderer/table-more-menu/table-more-menu.component.mjs +7 -2
  46. package/esm2022/lib/components/tables/table/table.component.mjs +19 -68
  47. package/esm2022/lib/components/tables/tree-table/decorated-tree-node.mjs +5 -4
  48. package/esm2022/lib/components/tables/tree-table/tree-label-column-model.mjs +3 -3
  49. package/esm2022/lib/components/tables/tree-table/tree-table-component.mjs +7 -4
  50. package/esm2022/lib/components/tables/tree-table/tree-table-model.mjs +3 -3
  51. package/esm2022/lib/components/text/markdown/markdown.component.mjs +2 -2
  52. package/esm2022/lib/directives/directives.module.mjs +1 -1
  53. package/esm2022/lib/directives/exports.mjs +2 -1
  54. package/esm2022/lib/directives/highlight.pipe.mjs +2 -2
  55. package/esm2022/lib/directives/resize-observer.directive.mjs +40 -0
  56. package/esm2022/lib/interaction/activity.mjs +3 -4
  57. package/esm2022/lib/interaction/alert.mjs +2 -2
  58. package/esm2022/lib/interaction/components/abstract-confirm-dialog.component.mjs +8 -4
  59. package/esm2022/lib/interaction/components/activity-actions/activity-actions.component.mjs +7 -9
  60. package/esm2022/lib/interaction/components/activity-container/activity-container.component.mjs +28 -11
  61. package/esm2022/lib/interaction/components/activity-title/activity-title.component.mjs +4 -4
  62. package/esm2022/lib/interaction/components/editors/edit-context.mjs +1 -1
  63. package/esm2022/lib/interaction/components/editors/inline-string-editor/inline-string-editor.component.mjs +2 -2
  64. package/esm2022/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.mjs +3 -3
  65. package/esm2022/lib/interaction/components/input-activities/input-activity.mjs +2 -2
  66. package/esm2022/lib/interaction/components/input-activities/select-input-activity.mjs +3 -1
  67. package/esm2022/lib/interaction/components/input-activities/string-input-activity.mjs +8 -4
  68. package/esm2022/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.mjs +129 -0
  69. package/esm2022/lib/interaction/directives/interaction-context-trigger-for.directive.mjs +2 -2
  70. package/esm2022/lib/interaction/exports.mjs +2 -1
  71. package/esm2022/lib/interaction/interaction.module.mjs +7 -9
  72. package/esm2022/lib/place/components/list-place-nav/list-place-nav.component.mjs +3 -4
  73. package/esm2022/lib/place/components/place-outlet/place-outlet.component.mjs +7 -9
  74. package/esm2022/lib/place/components/side-place-navigation/side-place-navigation.component.mjs +2 -2
  75. package/esm2022/lib/place/guards/consolidated-param-map.mjs +4 -4
  76. package/esm2022/lib/place/navigation/place-component-deactivation-handler.mjs +2 -2
  77. package/esm2022/lib/place/navigation/session/interactions/synchronise-interaction-context-ids-with-route.mjs +3 -6
  78. package/esm2022/lib/place/place-component.mjs +7 -7
  79. package/esm2022/lib/place/place-definition.mjs +3 -3
  80. package/esm2022/lib/place/place-history.mjs +2 -2
  81. package/esm2022/lib/place/place.decorator.mjs +2 -2
  82. package/esm2022/lib/place/place.module.mjs +1 -5
  83. package/esm2022/lib/place/route/formatter.mjs +2 -2
  84. package/esm2022/lib/place/route/parameter-decorators.mjs +54 -50
  85. package/esm2022/lib/place/route/parameter-definition.mjs +2 -2
  86. package/esm2022/lib/place/url-snapshot.mjs +3 -3
  87. package/esm2022/lib/place/visit-segment.mjs +2 -2
  88. package/esm2022/lib/place/visit.mjs +2 -2
  89. package/fesm2022/coolon-angular-ui-powerups.mjs +1075 -485
  90. package/fesm2022/coolon-angular-ui-powerups.mjs.map +1 -1
  91. package/lib/animations/slide-animations.d.ts +1 -0
  92. package/lib/components/cards/card-container/card-container.component.d.ts +1 -1
  93. package/lib/components/commands/command/command.component.d.ts +2 -1
  94. package/lib/components/commands/command-face/command-face.component.d.ts +2 -0
  95. package/lib/components/commands/command-face.d.ts +5 -7
  96. package/lib/components/commands/group/popup-menu/abstract-popup-menu.component.d.ts +2 -2
  97. package/lib/components/commands/group/tool-bar/tool-bar.component.d.ts +1 -1
  98. package/lib/components/components.module.d.ts +55 -53
  99. package/lib/components/disposable-component.d.ts +11 -8
  100. package/lib/components/exports.d.ts +5 -1
  101. package/lib/components/forms/abstract-input.component.d.ts +13 -5
  102. package/lib/components/forms/form-field.d.ts +5 -0
  103. package/lib/components/forms/number-input/number-input.component.d.ts +8 -4
  104. package/lib/components/forms/password-input/password-input.component.d.ts +7 -1
  105. package/lib/components/forms/search-input/search-input.component.d.ts +10 -0
  106. package/lib/components/forms/select-input/select-input.component.d.ts +4 -3
  107. package/lib/components/forms/string-input/string-input.component.d.ts +3 -1
  108. package/lib/components/loadable-component.d.ts +17 -0
  109. package/lib/components/resize-aware.component.d.ts +24 -5
  110. package/lib/components/switch-case/switch-case.component.d.ts +2 -3
  111. package/lib/components/tables/abstract-table-model.d.ts +10 -5
  112. package/lib/components/tables/abstract-table.component.d.ts +3 -2
  113. package/lib/components/tables/column/column-manager.d.ts +19 -0
  114. package/lib/components/tables/column/column-model.d.ts +5 -1
  115. package/lib/components/tables/column/column-order-manager.d.ts +20 -0
  116. package/lib/components/tables/column/custom-template-column-model.d.ts +2 -1
  117. package/lib/components/tables/column/custom-value-column-model.d.ts +2 -1
  118. package/lib/components/tables/column/editor-controls-column-model.d.ts +2 -1
  119. package/lib/components/tables/column/list-propery-column-model.d.ts +2 -1
  120. package/lib/components/tables/column/property-column-model.d.ts +2 -1
  121. package/lib/components/tables/column/selection-column-model.d.ts +2 -1
  122. package/lib/components/tables/filter/text-search-predicate.d.ts +9 -0
  123. package/lib/components/tables/renderer/table-body/table-body.component.d.ts +35 -16
  124. package/lib/components/tables/renderer/table-more-menu/table-more-menu.component.d.ts +2 -1
  125. package/lib/components/tables/table/table.component.d.ts +5 -10
  126. package/lib/components/tables/tree-table/tree-label-column-model.d.ts +2 -1
  127. package/lib/components/tables/tree-table/tree-table-component.d.ts +3 -0
  128. package/lib/directives/exports.d.ts +1 -0
  129. package/lib/directives/resize-observer.directive.d.ts +16 -0
  130. package/lib/interaction/activity.d.ts +2 -2
  131. package/lib/interaction/components/abstract-confirm-dialog.component.d.ts +1 -0
  132. package/lib/interaction/components/activity-actions/activity-actions.component.d.ts +1 -3
  133. package/lib/interaction/components/activity-container/activity-container.component.d.ts +7 -3
  134. package/lib/interaction/components/activity-title/activity-title.component.d.ts +1 -1
  135. package/lib/interaction/components/editors/edit-context.d.ts +1 -1
  136. package/lib/interaction/components/inplace-interaction-context/in-place-interaction-context.component.d.ts +1 -1
  137. package/lib/interaction/components/slide-down-interaction-context/slide-down-interaction-context.component.d.ts +53 -0
  138. package/lib/interaction/exports.d.ts +1 -0
  139. package/lib/interaction/interaction.module.d.ts +28 -28
  140. package/lib/place/components/place-outlet/place-outlet.component.d.ts +3 -4
  141. package/lib/place/place-component.d.ts +4 -4
  142. package/lib/place/place.module.d.ts +4 -5
  143. package/package.json +7 -5
  144. package/esm2022/lib/components/tables/column/column-list-model.mjs +0 -44
  145. package/lib/components/tables/column/column-list-model.d.ts +0 -13
@@ -2,7 +2,7 @@ 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';
@@ -17,7 +17,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
17
17
  import * as i3$2 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';
@@ -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$5 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, TransactionObserver, 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, DirtyTrackingForm, ProxyRegistry, 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
59
  import * as i1$6 from '@angular/material/dialog';
60
60
  import { MatDialogModule, MAT_DIALOG_DEFAULT_OPTIONS } from '@angular/material/dialog';
61
61
  import * as i1$4 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
64
  import * as i1$5 from '@angular/cdk/overlay';
65
+ import { style, trigger, transition, animate, group, query } from '@angular/animations';
66
66
  import { MatCardModule } from '@angular/material/card';
67
67
  import * as i3$3 from '@angular/material/list';
68
68
  import { MatListModule } from '@angular/material/list';
69
- import { style, query, group, animate, trigger, transition } from '@angular/animations';
70
69
 
71
70
  class CommandDirective extends GarbageCollector {
72
71
  elementRef;
@@ -213,11 +212,12 @@ var Track;
213
212
 
214
213
  class DisposableComponent extends GarbageCollector {
215
214
  trackById = Track.byId();
216
- #_loaded$ = new MutableValueModel();
217
- #asyncLoadables = [];
218
- #awaitedLoadables = [];
215
+ // #_loaded$ = new MutableValueModel<boolean>();
216
+ // #asyncLoadables: Loadable[] = [];
217
+ // #awaitedLoadables: Loadable[] = [];
219
218
  #initCallbacks = [];
220
219
  #initialised = false;
220
+ cdr = this.inject(ChangeDetectorRef);
221
221
  onInit(callback) {
222
222
  if (this.#initialised) {
223
223
  callback();
@@ -226,44 +226,25 @@ class DisposableComponent extends GarbageCollector {
226
226
  this.#initCallbacks.push(callback);
227
227
  }
228
228
  }
229
- get loaded$() {
230
- return this.#_loaded$.readonly$;
231
- }
232
229
  ngOnInit() {
233
230
  this.#initCallbacks.forEach(it => it());
234
- this.#asyncLoadables.forEach(it => it.ensureLoaded());
235
- if (this.#awaitedLoadables.length > 0) {
236
- Promise.all(this.#awaitedLoadables.map(it => {
237
- return it.ensureLoaded(); //.then(() => console.log(`${it.constructor.name} loaded`));
238
- })).then(() => {
239
- this.#_loaded$.value = true;
240
- });
241
- }
242
- else {
243
- this.#_loaded$.value = true;
244
- }
245
231
  this.#initialised = true;
246
232
  }
233
+ ngOnDestroy() {
234
+ this.dispose();
235
+ }
247
236
  inject(token) {
248
237
  return inject(token);
249
238
  }
250
- injectLoadable(token, options) {
251
- const loadable = inject(token);
252
- if (this.loaded$.value) {
253
- loadable.ensureLoaded();
254
- }
255
- else {
256
- if (!options || options.wait === true) {
257
- this.#awaitedLoadables.push(loadable);
258
- }
259
- else {
260
- this.#asyncLoadables.push(loadable);
261
- }
262
- }
263
- return loadable;
264
- }
265
- ngOnDestroy() {
266
- this.dispose();
239
+ /**
240
+ * Monitors the specified models for any change and triggers and angular change detect cycle. This is intended for use
241
+ * when the component uses the ON_PUSH change detection strategy.
242
+ * @param models
243
+ * @protected
244
+ */
245
+ trackChangesAndMarkForCheck(...models) {
246
+ const { when } = Dsl.disposeWith(this);
247
+ when.anyOf(...models).changes(() => this.cdr.markForCheck());
267
248
  }
268
249
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DisposableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
269
250
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: DisposableComponent, usesInheritance: true, ngImport: i0 });
@@ -736,42 +717,42 @@ var CommandFace;
736
717
  }
737
718
  }
738
719
  __decorate([
739
- Memoize(),
720
+ MemoizeGet(),
740
721
  __metadata("design:type", Object),
741
722
  __metadata("design:paramtypes", [])
742
723
  ], Adapter.prototype, "text", null);
743
724
  __decorate([
744
- Memoize(),
725
+ MemoizeGet(),
745
726
  __metadata("design:type", Object),
746
727
  __metadata("design:paramtypes", [])
747
728
  ], Adapter.prototype, "icon", null);
748
729
  __decorate([
749
- Memoize(),
730
+ MemoizeGet(),
750
731
  __metadata("design:type", Object),
751
732
  __metadata("design:paramtypes", [])
752
733
  ], Adapter.prototype, "iconPosition", null);
753
734
  __decorate([
754
- Memoize(),
735
+ MemoizeGet(),
755
736
  __metadata("design:type", Object),
756
737
  __metadata("design:paramtypes", [])
757
738
  ], Adapter.prototype, "tooltip", null);
758
739
  __decorate([
759
- Memoize(),
740
+ MemoizeGet(),
760
741
  __metadata("design:type", Boolean),
761
742
  __metadata("design:paramtypes", [])
762
743
  ], Adapter.prototype, "iconPositionStart", null);
763
744
  __decorate([
764
- Memoize(),
745
+ MemoizeGet(),
765
746
  __metadata("design:type", Boolean),
766
747
  __metadata("design:paramtypes", [])
767
748
  ], Adapter.prototype, "iconPositionEnd", null);
768
749
  __decorate([
769
- Memoize(),
750
+ MemoizeGet(),
770
751
  __metadata("design:type", String),
771
752
  __metadata("design:paramtypes", [])
772
753
  ], Adapter.prototype, "color", null);
773
754
  __decorate([
774
- Memoize(),
755
+ MemoizeGet(),
775
756
  __metadata("design:type", String),
776
757
  __metadata("design:paramtypes", [])
777
758
  ], Adapter.prototype, "style", null);
@@ -842,6 +823,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
842
823
  args: ["class.disable-scroll"]
843
824
  }] } });
844
825
 
826
+ /* eslint-disable @angular-eslint/no-host-metadata-property */
845
827
  class IconComponent {
846
828
  _icon;
847
829
  prefix;
@@ -873,11 +855,13 @@ class IconComponent {
873
855
  return `fa-${this.suffix}`;
874
856
  }
875
857
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
876
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: IconComponent, selector: "aup-icon", inputs: { icon: "icon" }, host: { properties: { "attr.icon": "this.icon" } }, ngImport: i0, template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"iconPrefix.SVG\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"iconPrefix.MATERIAL\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"iconPrefix.FONT_AWESOME\" class=\"faIconWrapper\">\n <i class=\"fa-solid\" [class]=\"faIcon\"></i>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n", styles: [":host{display:inline-flex;--resolved-size: var(--aup-icon-size, 24px);width:var(--resolved-size) fa-icon;width-vertical-align:middle}:host .faIconWrapper{display:flex;flex-direction:row;align-items:center;justify-content:center;width:var(--resolved-size);height:var(--resolved-size)}:host .svgIcon{width:var(--resolved-size);height:var(--resolved-size)}:host :host(.mat-chip-remove){--aup-icon-size: 18px}:host mat-icon{font-size:var(--resolved-size);width:var(--resolved-size);height:var(--resolved-size);margin-right:0!important}\n"], dependencies: [{ kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
858
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: IconComponent, selector: "aup-icon", inputs: { icon: "icon" }, host: { properties: { "attr.icon": "this.icon" }, classAttribute: "mat-icon" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"iconPrefix.SVG\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"iconPrefix.MATERIAL\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"iconPrefix.FONT_AWESOME\" class=\"faIconWrapper\">\n <i class=\"fa-solid\" [class]=\"faIcon\"></i>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n", styles: [":host{display:inline-flex;--resolved-size: var(--aup-icon-size, 24px);width:var(--resolved-size)!important;min-width:var(--resolved-size)!important;height:var(--resolved-size)!important;min-height:var(--resolved-size)!important}:host fa-icon{vertical-align:middle}:host .faIconWrapper{display:flex;flex-direction:row;align-items:center;justify-content:center;width:var(--resolved-size)!important;height:var(--resolved-size)!important}:host .svgIcon{width:var(--resolved-size)!important;height:var(--resolved-size)!important}:host :host(.mat-chip-remove){--aup-icon-size: 18px}:host mat-icon{font-size:var(--resolved-size)!important;width:var(--resolved-size)!important;height:var(--resolved-size)!important;margin-right:0!important}\n"], dependencies: [{ kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i2$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
877
859
  }
878
860
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: IconComponent, decorators: [{
879
861
  type: Component,
880
- args: [{ selector: 'aup-icon', template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"iconPrefix.SVG\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"iconPrefix.MATERIAL\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"iconPrefix.FONT_AWESOME\" class=\"faIconWrapper\">\n <i class=\"fa-solid\" [class]=\"faIcon\"></i>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n", styles: [":host{display:inline-flex;--resolved-size: var(--aup-icon-size, 24px);width:var(--resolved-size) fa-icon;width-vertical-align:middle}:host .faIconWrapper{display:flex;flex-direction:row;align-items:center;justify-content:center;width:var(--resolved-size);height:var(--resolved-size)}:host .svgIcon{width:var(--resolved-size);height:var(--resolved-size)}:host :host(.mat-chip-remove){--aup-icon-size: 18px}:host mat-icon{font-size:var(--resolved-size);width:var(--resolved-size);height:var(--resolved-size);margin-right:0!important}\n"] }]
862
+ args: [{ selector: 'aup-icon', changeDetection: ChangeDetectionStrategy.OnPush, host: {
863
+ class: "mat-icon" // this ensures angular form styles that target mat icon also work with us
864
+ }, template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"iconPrefix.SVG\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"iconPrefix.MATERIAL\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"iconPrefix.FONT_AWESOME\" class=\"faIconWrapper\">\n <i class=\"fa-solid\" [class]=\"faIcon\"></i>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n", styles: [":host{display:inline-flex;--resolved-size: var(--aup-icon-size, 24px);width:var(--resolved-size)!important;min-width:var(--resolved-size)!important;height:var(--resolved-size)!important;min-height:var(--resolved-size)!important}:host fa-icon{vertical-align:middle}:host .faIconWrapper{display:flex;flex-direction:row;align-items:center;justify-content:center;width:var(--resolved-size)!important;height:var(--resolved-size)!important}:host .svgIcon{width:var(--resolved-size)!important;height:var(--resolved-size)!important}:host :host(.mat-chip-remove){--aup-icon-size: 18px}:host mat-icon{font-size:var(--resolved-size)!important;width:var(--resolved-size)!important;height:var(--resolved-size)!important;margin-right:0!important}\n"] }]
881
865
  }], propDecorators: { icon: [{
882
866
  type: Input
883
867
  }, {
@@ -908,6 +892,7 @@ class CommandFaceComponent extends DisposableComponent {
908
892
  // tslint:disable-next-line:no-input-rename
909
893
  get _rawFaces() { return this.#_rawFaces_accessor_storage; }
910
894
  set _rawFaces(value) { this.#_rawFaces_accessor_storage = value; }
895
+ hasTextAndLeadingIcon$;
911
896
  set face(face) {
912
897
  this.faces$.value = [face];
913
898
  }
@@ -927,6 +912,7 @@ class CommandFaceComponent extends DisposableComponent {
927
912
  const activeFace = this.faceAdapters.first();
928
913
  this.activeIcon = activeFace.pluck("icon");
929
914
  this.activeColor = activeFace.pluck("color");
915
+ this.hasTextAndLeadingIcon$ = valueOf.all(this.activeIcon.isNotNil(), activeFace.pluckString('text').isNotBlank(), activeFace.pluck("iconPosition").doesNotEqual(CommandFace.Position.END)).areTruthy();
930
916
  }
931
917
  shouldIncludeIcon(face) {
932
918
  return (!this.ignoreIcon && face.icon) || this.includeMissingIconInLayout;
@@ -940,8 +926,11 @@ class CommandFaceComponent extends DisposableComponent {
940
926
  get color() {
941
927
  return this.activeColor.value;
942
928
  }
929
+ get hasTextAndIcon() {
930
+ return this.hasTextAndLeadingIcon$.value;
931
+ }
943
932
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CommandFaceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
944
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CommandFaceComponent, selector: "aup-command-face", inputs: { _rawFaces: ["faces", "_rawFaces"], face: "face", ignoreIcon: "ignoreIcon", ignoreText: "ignoreText", includeMissingIconInLayout: "includeMissingIconInLayout" }, host: { properties: { "class.hide-icon": "this.requiresMissingIconInLayout", "attr.color": "this.color" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"face-container\" *ngFor=\"let face of faceAdapters.value\">\n <aup-icon *ngIf=\"hasIconStart(face)\" [icon]=\"face.icon\"></aup-icon>\n <span *ngIf=\"face.text\">{{face.text}}</span>\n <aup-icon *ngIf=\"hasIconEnd(face)\" [icon]=\"face.icon\"></aup-icon>\n</div>\n", styles: ["aup-command-face{--icon-gap: var(--aup-command-face-icon-gap);display:inline-grid}aup-command-face>.face-container{grid-column:1;grid-row:1;display:inline-flex;flex-direction:row;align-items:center}aup-command-face>.face-container:not(:first-child){visibility:hidden}aup-command-face>.face-container *+*{margin-left:var(--icon-gap)}aup-command-face.hide-icon aup-icon{visibility:hidden}aup-command-face.centered{justify-items:center}aup-command-face.start{justify-items:self-start}aup-command-face.end{justify-items:self-end}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }], encapsulation: i0.ViewEncapsulation.None });
933
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CommandFaceComponent, selector: "aup-command-face", inputs: { _rawFaces: ["faces", "_rawFaces"], face: "face", ignoreIcon: "ignoreIcon", ignoreText: "ignoreText", includeMissingIconInLayout: "includeMissingIconInLayout" }, host: { properties: { "class.hide-icon": "this.requiresMissingIconInLayout", "attr.color": "this.color", "class.has-text-and-leading-icon": "this.hasTextAndIcon" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"face-container\" *ngFor=\"let face of faceAdapters.value\">\n <aup-icon *ngIf=\"hasIconStart(face)\" [icon]=\"face.icon\"></aup-icon>\n <span *ngIf=\"face.text\">{{face.text}}</span>\n <aup-icon *ngIf=\"hasIconEnd(face)\" [icon]=\"face.icon\"></aup-icon>\n</div>\n", styles: ["aup-command-face{--icon-gap: var(--aup-command-face-icon-gap);display:inline-grid}aup-command-face>.face-container{grid-column:1;grid-row:1;display:inline-flex;flex-direction:row;align-items:center}aup-command-face>.face-container>span{white-space:nowrap}aup-command-face>.face-container:not(:first-child){visibility:hidden}aup-command-face>.face-container *+*{margin-left:var(--icon-gap)}aup-command-face.hide-icon aup-icon{visibility:hidden}aup-command-face.centered{justify-items:center}aup-command-face.start{justify-items:self-start}aup-command-face.end{justify-items:self-end}aup-command-face.has-text-and-leading-icon{margin-top:4px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }], encapsulation: i0.ViewEncapsulation.None });
945
934
  }
946
935
  __decorate([
947
936
  StoreInListModel("faces$"),
@@ -949,7 +938,7 @@ __decorate([
949
938
  ], CommandFaceComponent.prototype, "_rawFaces", null);
950
939
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CommandFaceComponent, decorators: [{
951
940
  type: Component,
952
- args: [{ selector: 'aup-command-face', encapsulation: ViewEncapsulation.None, template: "<div class=\"face-container\" *ngFor=\"let face of faceAdapters.value\">\n <aup-icon *ngIf=\"hasIconStart(face)\" [icon]=\"face.icon\"></aup-icon>\n <span *ngIf=\"face.text\">{{face.text}}</span>\n <aup-icon *ngIf=\"hasIconEnd(face)\" [icon]=\"face.icon\"></aup-icon>\n</div>\n", styles: ["aup-command-face{--icon-gap: var(--aup-command-face-icon-gap);display:inline-grid}aup-command-face>.face-container{grid-column:1;grid-row:1;display:inline-flex;flex-direction:row;align-items:center}aup-command-face>.face-container:not(:first-child){visibility:hidden}aup-command-face>.face-container *+*{margin-left:var(--icon-gap)}aup-command-face.hide-icon aup-icon{visibility:hidden}aup-command-face.centered{justify-items:center}aup-command-face.start{justify-items:self-start}aup-command-face.end{justify-items:self-end}\n"] }]
941
+ args: [{ selector: 'aup-command-face', encapsulation: ViewEncapsulation.None, template: "<div class=\"face-container\" *ngFor=\"let face of faceAdapters.value\">\n <aup-icon *ngIf=\"hasIconStart(face)\" [icon]=\"face.icon\"></aup-icon>\n <span *ngIf=\"face.text\">{{face.text}}</span>\n <aup-icon *ngIf=\"hasIconEnd(face)\" [icon]=\"face.icon\"></aup-icon>\n</div>\n", styles: ["aup-command-face{--icon-gap: var(--aup-command-face-icon-gap);display:inline-grid}aup-command-face>.face-container{grid-column:1;grid-row:1;display:inline-flex;flex-direction:row;align-items:center}aup-command-face>.face-container>span{white-space:nowrap}aup-command-face>.face-container:not(:first-child){visibility:hidden}aup-command-face>.face-container *+*{margin-left:var(--icon-gap)}aup-command-face.hide-icon aup-icon{visibility:hidden}aup-command-face.centered{justify-items:center}aup-command-face.start{justify-items:self-start}aup-command-face.end{justify-items:self-end}aup-command-face.has-text-and-leading-icon{margin-top:4px}\n"] }]
953
942
  }], ctorParameters: function () { return []; }, propDecorators: { _rawFaces: [{
954
943
  type: Input,
955
944
  args: ['faces']
@@ -967,6 +956,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
967
956
  }], color: [{
968
957
  type: HostBinding,
969
958
  args: ['attr.color']
959
+ }], hasTextAndIcon: [{
960
+ type: HostBinding,
961
+ args: ['class.has-text-and-leading-icon']
970
962
  }] } });
971
963
 
972
964
  /**
@@ -1070,11 +1062,11 @@ class CardContainerComponent extends AbstractCardContainerComponent {
1070
1062
  }
1071
1063
  }
1072
1064
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CardContainerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1073
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CardContainerComponent, selector: "aup-card-container", inputs: { columnCount: "columnCount", enableScroll: "enableScroll" }, host: { properties: { "class.auto-columns": "this.isAutoColumns", "class.single-column": "this.isSingleColumn" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"header-container\">\n <ng-content select=\"[card-container-header]\"></ng-content>\n</div>\n\n<ng-template #content>\n <div class=\"card-container\">\n <ng-content></ng-content>\n\n <div class=\"add-card-container\" *ngIf=\"addCardCommand.enabled$.value\" [pectinCommand]=\"addCardCommand\">\n <aup-command-face *ngIf=\"addCardFace\" [faces]=\"[addCardFace]\"></aup-command-face>\n <aup-icon *ngIf=\"!addCardFace\" icon=\"mat:add\"></aup-icon>\n </div>\n\n <div class=\"add-card-template\" *ngIf=\"addCardTemplate\">\n <ng-container [ngTemplateOutlet]=\"addCardTemplate\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<div class=\"no-scroll-container\" *ngIf=\"!enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</div>\n\n<aup-scroll-container *ngIf=\"enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</aup-scroll-container>\n\n<div class=\"footer-container\">\n <ng-content select=\"[card-container-footer]\"></ng-content>\n</div>\n\n", styles: [":host{--resolved-card-gap: var(--card-gap, 16px);--resolved-card-width: var(--card-width, 300px);--resolved-card-max-width: var(--card-max-width, auto);--resolved-card-height: var(--card-height, auto);--resolved-card-min-height: var(--card-min-height, auto);--resolved-card-background: var(--card-background, var(--aup-card-container-default-background-color));flex:1;display:flex;flex-direction:column;align-items:stretch;background:var(--resolved-card-background)}:host.auto-columns>*>.card-container{grid-template-columns:repeat(auto-fit,minmax(var(--resolved-card-width),var(--resolved-card-max-width)));min-width:calc(var(--resolved-card-width) + 2 * var(--resolved-card-gap));width:calc((var(--resolved-card-width) + var(--resolved-card-gap)) * 2 + var(--grid-gap))}:host:not(.auto-columns)>*>.card-container{grid-template-columns:repeat(var(--aup-card-container-column-count),1fr)}.card-container{display:grid;box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));max-width:100%;grid-auto-rows:minmax(var(--resolved-card-min-height),var(--resolved-card-height));grid-gap:var(--resolved-card-gap)}aup-scroll-container,.no-scroll-container{flex:1}.add-card-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.add-card-container:hover{border-color:transparent;background-color:#fff;color:#0000008a}.add-card-template-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: ScrollContainerComponent, selector: "aup-scroll-container", inputs: ["disableScroll$", "disableScroll"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
1065
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CardContainerComponent, selector: "aup-card-container", inputs: { columnCount: "columnCount", enableScroll: "enableScroll" }, host: { properties: { "class.auto-columns": "this.isAutoColumns", "class.single-column": "this.isSingleColumn" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"header-container\">\n <ng-content select=\"[card-container-header], [slot=header]\"></ng-content>\n</div>\n\n<ng-template #content>\n <div class=\"card-container\">\n <ng-content></ng-content>\n\n <div class=\"add-card-container\" *ngIf=\"addCardCommand.enabled$.value\" [pectinCommand]=\"addCardCommand\">\n <aup-command-face *ngIf=\"addCardFace\" [faces]=\"[addCardFace]\"></aup-command-face>\n <aup-icon *ngIf=\"!addCardFace\" icon=\"mat:add\"></aup-icon>\n </div>\n\n <div class=\"add-card-template\" *ngIf=\"addCardTemplate\">\n <ng-container [ngTemplateOutlet]=\"addCardTemplate\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<div class=\"no-scroll-container\" *ngIf=\"!enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</div>\n\n<aup-scroll-container *ngIf=\"enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</aup-scroll-container>\n\n<div class=\"footer-container\">\n <ng-content select=\"[card-container-footer], [slot=footer]\"></ng-content>\n</div>\n\n", styles: [":host{--resolved-card-gap: var(--card-gap, 16px);--resolved-card-width: var(--card-width, 300px);--resolved-card-min-width: var(--card-min-width, var(--card-width, var(--card-max-width)));--resolved-card-max-width: var(--card-max-width, var(--card-width, var(--card-min-width)));--resolved-card-height: var(--card-height, auto);--resolved-card-min-height: var(--card-min-height, auto);--resolved-card-background: var(--card-background, var(--aup-card-container-default-background-color));flex:1;display:flex;flex-direction:column;align-items:stretch;background:var(--resolved-card-background)}:host.auto-columns>*>.card-container{grid-template-columns:repeat(auto-fill,minmax(var(--resolved-card-min-width),var(--resolved-card-max-width)))}:host:not(.auto-columns)>*>.card-container{grid-template-columns:repeat(var(--aup-card-container-column-count),1fr)}.card-container{display:grid;box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));max-width:100%;grid-auto-rows:minmax(var(--resolved-card-min-height),var(--resolved-card-height));grid-gap:var(--resolved-card-gap)}aup-scroll-container,.no-scroll-container{flex:1}.add-card-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.add-card-container:hover{border-color:transparent;background-color:#fff;color:#0000008a}.add-card-template-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: ScrollContainerComponent, selector: "aup-scroll-container", inputs: ["disableScroll$", "disableScroll"] }, { kind: "component", type: IconComponent, selector: "aup-icon", inputs: ["icon"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
1074
1066
  }
1075
1067
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CardContainerComponent, decorators: [{
1076
1068
  type: Component,
1077
- args: [{ selector: 'aup-card-container', template: "<div class=\"header-container\">\n <ng-content select=\"[card-container-header]\"></ng-content>\n</div>\n\n<ng-template #content>\n <div class=\"card-container\">\n <ng-content></ng-content>\n\n <div class=\"add-card-container\" *ngIf=\"addCardCommand.enabled$.value\" [pectinCommand]=\"addCardCommand\">\n <aup-command-face *ngIf=\"addCardFace\" [faces]=\"[addCardFace]\"></aup-command-face>\n <aup-icon *ngIf=\"!addCardFace\" icon=\"mat:add\"></aup-icon>\n </div>\n\n <div class=\"add-card-template\" *ngIf=\"addCardTemplate\">\n <ng-container [ngTemplateOutlet]=\"addCardTemplate\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<div class=\"no-scroll-container\" *ngIf=\"!enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</div>\n\n<aup-scroll-container *ngIf=\"enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</aup-scroll-container>\n\n<div class=\"footer-container\">\n <ng-content select=\"[card-container-footer]\"></ng-content>\n</div>\n\n", styles: [":host{--resolved-card-gap: var(--card-gap, 16px);--resolved-card-width: var(--card-width, 300px);--resolved-card-max-width: var(--card-max-width, auto);--resolved-card-height: var(--card-height, auto);--resolved-card-min-height: var(--card-min-height, auto);--resolved-card-background: var(--card-background, var(--aup-card-container-default-background-color));flex:1;display:flex;flex-direction:column;align-items:stretch;background:var(--resolved-card-background)}:host.auto-columns>*>.card-container{grid-template-columns:repeat(auto-fit,minmax(var(--resolved-card-width),var(--resolved-card-max-width)));min-width:calc(var(--resolved-card-width) + 2 * var(--resolved-card-gap));width:calc((var(--resolved-card-width) + var(--resolved-card-gap)) * 2 + var(--grid-gap))}:host:not(.auto-columns)>*>.card-container{grid-template-columns:repeat(var(--aup-card-container-column-count),1fr)}.card-container{display:grid;box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));max-width:100%;grid-auto-rows:minmax(var(--resolved-card-min-height),var(--resolved-card-height));grid-gap:var(--resolved-card-gap)}aup-scroll-container,.no-scroll-container{flex:1}.add-card-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.add-card-container:hover{border-color:transparent;background-color:#fff;color:#0000008a}.add-card-template-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}\n"] }]
1069
+ args: [{ selector: 'aup-card-container', template: "<div class=\"header-container\">\n <ng-content select=\"[card-container-header], [slot=header]\"></ng-content>\n</div>\n\n<ng-template #content>\n <div class=\"card-container\">\n <ng-content></ng-content>\n\n <div class=\"add-card-container\" *ngIf=\"addCardCommand.enabled$.value\" [pectinCommand]=\"addCardCommand\">\n <aup-command-face *ngIf=\"addCardFace\" [faces]=\"[addCardFace]\"></aup-command-face>\n <aup-icon *ngIf=\"!addCardFace\" icon=\"mat:add\"></aup-icon>\n </div>\n\n <div class=\"add-card-template\" *ngIf=\"addCardTemplate\">\n <ng-container [ngTemplateOutlet]=\"addCardTemplate\"></ng-container>\n </div>\n </div>\n</ng-template>\n\n<div class=\"no-scroll-container\" *ngIf=\"!enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</div>\n\n<aup-scroll-container *ngIf=\"enableScroll\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</aup-scroll-container>\n\n<div class=\"footer-container\">\n <ng-content select=\"[card-container-footer], [slot=footer]\"></ng-content>\n</div>\n\n", styles: [":host{--resolved-card-gap: var(--card-gap, 16px);--resolved-card-width: var(--card-width, 300px);--resolved-card-min-width: var(--card-min-width, var(--card-width, var(--card-max-width)));--resolved-card-max-width: var(--card-max-width, var(--card-width, var(--card-min-width)));--resolved-card-height: var(--card-height, auto);--resolved-card-min-height: var(--card-min-height, auto);--resolved-card-background: var(--card-background, var(--aup-card-container-default-background-color));flex:1;display:flex;flex-direction:column;align-items:stretch;background:var(--resolved-card-background)}:host.auto-columns>*>.card-container{grid-template-columns:repeat(auto-fill,minmax(var(--resolved-card-min-width),var(--resolved-card-max-width)))}:host:not(.auto-columns)>*>.card-container{grid-template-columns:repeat(var(--aup-card-container-column-count),1fr)}.card-container{display:grid;box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));max-width:100%;grid-auto-rows:minmax(var(--resolved-card-min-height),var(--resolved-card-height));grid-gap:var(--resolved-card-gap)}aup-scroll-container,.no-scroll-container{flex:1}.add-card-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;transition:box-shadow .28s cubic-bezier(.4,0,.2,1);box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:#0000008a;background-color:#fffc}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.add-card-container:hover{border-color:transparent;background-color:#fff;color:#0000008a}.add-card-template-container{height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}\n"] }]
1078
1070
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { columnCount: [{
1079
1071
  type: Input
1080
1072
  }], enableScroll: [{
@@ -1150,14 +1142,24 @@ class CommandComponent extends PopupAwareComponent {
1150
1142
  activeFace$;
1151
1143
  iconOnly$;
1152
1144
  tooltip$;
1145
+ visible$;
1153
1146
  constructor(element, parent) {
1154
1147
  super(element, parent);
1155
1148
  const { chain, switchOn } = Dsl.disposeWith(this);
1156
- this.faces$ = chain(this.command.busy$).mapToList(busy => {
1149
+ this.faces$ = chain(this.command.busy$)
1150
+ .mapToList(busy => {
1157
1151
  return busy ?
1158
- [this.busyFace$.value, this.face$.value] :
1159
- [this.face$.value, this.busyFace$.value];
1160
- }, { allowNil: true, dependsOn: [this.face$, this.busyFace$] })
1152
+ [this.busyFace$.value ?? this.command.busyFace$.value, this.face$.value ?? this.command.defaultFace$.value] :
1153
+ [this.face$.value ?? this.command.defaultFace$.value, this.busyFace$.value ?? this.command.busyFace$.value];
1154
+ }, {
1155
+ allowNil: true,
1156
+ dependsOn: [
1157
+ this.face$,
1158
+ this.busyFace$,
1159
+ this.command.defaultFace$,
1160
+ this.command.busyFace$
1161
+ ]
1162
+ })
1161
1163
  .rejectNil();
1162
1164
  this.activeFace$ = this.faces$.first();
1163
1165
  this.buttonStyle$ = chain(this.activeFace$).map(f => CommandFace.getStyleOf(f));
@@ -1166,18 +1168,19 @@ class CommandComponent extends PopupAwareComponent {
1166
1168
  this.iconOnly$ = this.faces$.select(face => {
1167
1169
  return isEmpty(CommandFace.getTextOf(face)) && !isEmpty(CommandFace.getIconOf(face));
1168
1170
  }).count().equals(this.faces$.count());
1171
+ this.visible$ = chain(this.command.visible$);
1172
+ }
1173
+ get cssDisplayProperty() {
1174
+ return this.visible$.value ? undefined : 'none';
1169
1175
  }
1170
1176
  isActive(face) {
1171
1177
  return this.activeFace$.query().equals(face);
1172
1178
  }
1173
- getFace() {
1174
- return this.face;
1175
- }
1176
1179
  requestFocus() {
1177
1180
  this.button.focus();
1178
1181
  }
1179
1182
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CommandComponent, deps: [{ token: i0.ElementRef }, { token: POPUP_CONTAINER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1180
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CommandComponent, selector: "aup-command", inputs: { command: "command", face$: "face$", face: "face", busyFace$: "busyFace$", busyFace: "busyFace", alignFace: "alignFace" }, host: { properties: { "class": "this.alignFace" } }, viewQueries: [{ propertyName: "button", first: true, predicate: MatButton, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"iconOnly$.value\">\n <button mat-icon-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n</ng-container>\n<ng-container *ngIf=\"!iconOnly$.value\">\n <ng-container [ngSwitch]=\"buttonStyle$.value\">\n <ng-container *ngSwitchCase=\"CommandFace.Style.STROKED\">\n <button mat-stroked-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n <ng-container *ngSwitchCase=\"CommandFace.Style.RAISED\">\n <button mat-raised-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <button mat-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n </ng-container>\n</ng-container>\n", styles: [":host{display:inline-flex;flex-direction:row;justify-content:stretch}:host.centered button{text-align:center}:host.start button{text-align:start}:host.end button{text-align:end}button{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
1183
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: CommandComponent, selector: "aup-command", inputs: { command: "command", face$: "face$", face: "face", busyFace$: "busyFace$", busyFace: "busyFace", alignFace: "alignFace" }, host: { properties: { "class": "this.alignFace", "style.display": "this.cssDisplayProperty" } }, viewQueries: [{ propertyName: "button", first: true, predicate: MatButton, descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"iconOnly$.value\">\n <button mat-icon-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n</ng-container>\n<ng-container *ngIf=\"!iconOnly$.value\">\n <ng-container [ngSwitch]=\"buttonStyle$.value\">\n <ng-container *ngSwitchCase=\"CommandFace.Style.STROKED\">\n <button mat-stroked-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n <ng-container *ngSwitchCase=\"CommandFace.Style.RAISED\">\n <button mat-raised-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n <ng-container *ngSwitchDefault>\n <button mat-button [pectinCommand]=\"command\" [color]=\"color$.value\" [class.busy]=\"command.busy$.value\"\n [matTooltip]=\"tooltip$.value\">\n <aup-command-face [class]=\"alignFace\" [faces]=\"faces$.value\"></aup-command-face>\n </button>\n </ng-container>\n </ng-container>\n</ng-container>\n", styles: [":host{display:inline-flex;flex-direction:row;justify-content:stretch}:host.centered button{text-align:center}:host.start button{text-align:start}:host.end button{text-align:end}button{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }] });
1181
1184
  }
1182
1185
  __decorate([
1183
1186
  Proxify(),
@@ -1225,6 +1228,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1225
1228
  }], button: [{
1226
1229
  type: ViewChild,
1227
1230
  args: [MatButton]
1231
+ }], cssDisplayProperty: [{
1232
+ type: HostBinding,
1233
+ args: ["style.display"]
1228
1234
  }] } });
1229
1235
 
1230
1236
  /**
@@ -1252,12 +1258,12 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1252
1258
  xPosition = 'after';
1253
1259
  yPosition = 'below';
1254
1260
  triggers;
1255
- #enabled_accessor_storage;
1256
- get enabled() { return this.#enabled_accessor_storage; }
1257
- set enabled(value) { this.#enabled_accessor_storage = value; }
1258
1261
  #enabled$_accessor_storage = proxify((ValueModel));
1259
1262
  get enabled$() { return this.#enabled$_accessor_storage; }
1260
1263
  set enabled$(value) { this.#enabled$_accessor_storage = value; }
1264
+ #enabled_accessor_storage = true;
1265
+ get enabled() { return this.#enabled_accessor_storage; }
1266
+ set enabled(value) { this.#enabled_accessor_storage = value; }
1261
1267
  children;
1262
1268
  faces$;
1263
1269
  constructor(element, parent) {
@@ -1299,16 +1305,16 @@ class AbstractPopupMenuComponent extends PopupAwareComponent {
1299
1305
  return this.faceAdapter.face;
1300
1306
  }
1301
1307
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractPopupMenuComponent, deps: [{ token: i0.ElementRef }, { token: POPUP_CONTAINER }], target: i0.ɵɵFactoryTarget.Component });
1302
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractPopupMenuComponent, selector: "aup-abstract-popup-menu", inputs: { xPosition: "xPosition", yPosition: "yPosition", enabled: "enabled", enabled$: "enabled$" }, viewQueries: [{ propertyName: "triggers", predicate: MatMenuTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
1308
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractPopupMenuComponent, selector: "aup-abstract-popup-menu", inputs: { xPosition: "xPosition", yPosition: "yPosition", enabled$: "enabled$", enabled: "enabled" }, viewQueries: [{ propertyName: "triggers", predicate: MatMenuTrigger, descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
1303
1309
  }
1304
- __decorate([
1305
- StoreInValueModel(),
1306
- __metadata("design:type", Boolean)
1307
- ], AbstractPopupMenuComponent.prototype, "enabled", null);
1308
1310
  __decorate([
1309
1311
  Proxify(),
1310
1312
  __metadata("design:type", Object)
1311
1313
  ], AbstractPopupMenuComponent.prototype, "enabled$", null);
1314
+ __decorate([
1315
+ StoreInValueModel(),
1316
+ __metadata("design:type", Object)
1317
+ ], AbstractPopupMenuComponent.prototype, "enabled", null);
1312
1318
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractPopupMenuComponent, decorators: [{
1313
1319
  type: Component,
1314
1320
  args: [{ selector: 'aup-abstract-popup-menu', template: '' }]
@@ -1322,10 +1328,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1322
1328
  }], triggers: [{
1323
1329
  type: ViewChildren,
1324
1330
  args: [MatMenuTrigger]
1325
- }], enabled: [{
1326
- type: Input
1327
1331
  }], enabled$: [{
1328
1332
  type: Input
1333
+ }], enabled: [{
1334
+ type: Input
1329
1335
  }] } });
1330
1336
 
1331
1337
  class CommandContainer extends GarbageCollector {
@@ -1358,13 +1364,15 @@ class ToolBarComponent extends CommandContainer {
1358
1364
  get orientation() {
1359
1365
  return CommandContainer.Orientation.HORIZONTAL;
1360
1366
  }
1361
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, deps: [{ token: CommandContainer }], target: i0.ɵɵFactoryTarget.Component });
1367
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, deps: [{ token: CommandContainer, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1362
1368
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: ToolBarComponent, selector: "aup-tool-bar", usesInheritance: true, ngImport: i0, template: '<div class="toolbar-content"><ng-content></ng-content></div>', isInline: true, styles: [":host{display:inline-block}.toolbar-content{display:inline-flex;flex-direction:row;align-items:center}.toolbar-content>aup-separator{align-self:stretch;margin:4px 0 4px 8px}.toolbar-content>aup-flex{flex:1}.toolbar-content>*+*{margin-left:8px}\n"], encapsulation: i0.ViewEncapsulation.None });
1363
1369
  }
1364
1370
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ToolBarComponent, decorators: [{
1365
1371
  type: Component,
1366
1372
  args: [{ selector: 'aup-tool-bar', template: '<div class="toolbar-content"><ng-content></ng-content></div>', encapsulation: ViewEncapsulation.None, styles: [":host{display:inline-block}.toolbar-content{display:inline-flex;flex-direction:row;align-items:center}.toolbar-content>aup-separator{align-self:stretch;margin:4px 0 4px 8px}.toolbar-content>aup-flex{flex:1}.toolbar-content>*+*{margin-left:8px}\n"] }]
1367
- }], ctorParameters: function () { return [{ type: CommandContainer }]; } });
1373
+ }], ctorParameters: function () { return [{ type: CommandContainer, decorators: [{
1374
+ type: Optional
1375
+ }] }]; } });
1368
1376
 
1369
1377
  /**
1370
1378
  *
@@ -1675,7 +1683,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1675
1683
  args: ['blur']
1676
1684
  }] } });
1677
1685
 
1678
- /* tslint:disable:no-input-rename */
1679
1686
  const INPUT_TOKEN_HACK = new InjectionToken("INPUT_TOKEN_HACK");
1680
1687
  class AbstractInputComponent extends DisposableComponent {
1681
1688
  onValueEditedListeners = new EventListenerList();
@@ -1690,11 +1697,16 @@ class AbstractInputComponent extends DisposableComponent {
1690
1697
  * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).
1691
1698
  */
1692
1699
  formValue$;
1693
- label;
1694
- // eslint-disable-next-line @angular-eslint/no-input-rename
1700
+ #i18n$_accessor_storage = proxify((MutableValueModel));
1701
+ get i18n$() { return this.#i18n$_accessor_storage; }
1702
+ set i18n$(value) { this.#i18n$_accessor_storage = value; }
1703
+ #i18n_accessor_storage;
1704
+ get i18n() { return this.#i18n_accessor_storage; }
1705
+ set i18n(value) { this.#i18n_accessor_storage = value; }
1706
+ _label;
1695
1707
  userFloatLabel = 'always'; // TODO: make this an injectable default
1696
- hint;
1697
- placeholder;
1708
+ _hint;
1709
+ _placeholder;
1698
1710
  dense = false;
1699
1711
  _enabled$ = this.registerDisposable(new DelegatingValueModel());
1700
1712
  set enabled$(condition$) {
@@ -1761,6 +1773,9 @@ class AbstractInputComponent extends DisposableComponent {
1761
1773
  isEnabled() {
1762
1774
  return this.enabled$.value;
1763
1775
  }
1776
+ get disabled() {
1777
+ return !this.isEnabled();
1778
+ }
1764
1779
  hasErrors() {
1765
1780
  return !this.errorList$.query().isEmpty();
1766
1781
  }
@@ -1773,6 +1788,15 @@ class AbstractInputComponent extends DisposableComponent {
1773
1788
  get focusContext() {
1774
1789
  return this.formValue$.focusContext;
1775
1790
  }
1791
+ get label() {
1792
+ return this._label ?? this.i18n?.label();
1793
+ }
1794
+ get hint() {
1795
+ return this._hint ?? this.hackyGetI18n("hint");
1796
+ }
1797
+ get placeholder() {
1798
+ return this._placeholder ?? this.hackyGetI18n("placeholder");
1799
+ }
1776
1800
  get floatLabel() {
1777
1801
  // return this.dense ? 'never' : this.userFloatLabel;
1778
1802
  return this.userFloatLabel;
@@ -1787,24 +1811,45 @@ class AbstractInputComponent extends DisposableComponent {
1787
1811
  onValueEdited(callback) {
1788
1812
  return this.onValueEditedListeners.add(callback);
1789
1813
  }
1814
+ hackyGetI18n(key) {
1815
+ // TODO: update I18n to make it possible to get an optional value with return the missing key message.
1816
+ const i18nFn = this.i18n ? this.i18n[key] : undefined;
1817
+ const i18nValue = i18nFn && i18nFn();
1818
+ return i18nValue?.startsWith("missing key") ? undefined : i18nValue;
1819
+ }
1790
1820
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractInputComponent, deps: [{ token: INPUT_TOKEN_HACK }], target: i0.ɵɵFactoryTarget.Component });
1791
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractInputComponent, selector: "ng-component", inputs: { label: "label", userFloatLabel: ["floatLabel", "userFloatLabel"], hint: "hint", placeholder: "placeholder", dense: "dense", enabled$: "enabled$", focusCommand: ["command.focus", "focusCommand"], blurCommand: ["command.blur", "blurCommand"], enterCommand: ["command.enter", "enterCommand"], escapeCommand: ["command.escape", "escapeCommand"], clickCommand: ["command.click", "clickCommand"] }, outputs: { focus: "focus", blur: "blur", enterKey: "enterKey", escapeKey: "escapeKey" }, host: { listeners: { "click": "notifyClick()", "focusin": "notifyFocusIn()", "focusout": "notifyFocusOut()" }, properties: { "class.dense": "this.dense", "class": "this.baseClassName" } }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
1821
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractInputComponent, selector: "ng-component", inputs: { i18n$: "i18n$", i18n: "i18n", _label: ["label", "_label"], userFloatLabel: ["floatLabel", "userFloatLabel"], _hint: ["hint", "_hint"], _placeholder: ["placeholder", "_placeholder"], dense: "dense", enabled$: "enabled$", focusCommand: ["command.focus", "focusCommand"], blurCommand: ["command.blur", "blurCommand"], enterCommand: ["command.enter", "enterCommand"], escapeCommand: ["command.escape", "escapeCommand"], clickCommand: ["command.click", "clickCommand"] }, outputs: { focus: "focus", blur: "blur", enterKey: "enterKey", escapeKey: "escapeKey" }, host: { listeners: { "click": "notifyClick()", "focusin": "notifyFocusIn()", "focusout": "notifyFocusOut()" }, properties: { "class.dense": "this.dense", "class": "this.baseClassName", "class.disabled": "this.disabled" } }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
1792
1822
  }
1823
+ __decorate([
1824
+ Proxify(),
1825
+ __metadata("design:type", Object)
1826
+ ], AbstractInputComponent.prototype, "i18n$", null);
1827
+ __decorate([
1828
+ StoreInValueModel(),
1829
+ __metadata("design:type", Object)
1830
+ ], AbstractInputComponent.prototype, "i18n", null);
1793
1831
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractInputComponent, decorators: [{
1794
1832
  type: Component,
1795
1833
  args: [{ template: '' }]
1796
1834
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1797
1835
  type: Inject,
1798
1836
  args: [INPUT_TOKEN_HACK]
1799
- }] }]; }, propDecorators: { label: [{
1837
+ }] }]; }, propDecorators: { i18n$: [{
1800
1838
  type: Input
1839
+ }], i18n: [{
1840
+ type: Input
1841
+ }], _label: [{
1842
+ type: Input,
1843
+ args: ["label"]
1801
1844
  }], userFloatLabel: [{
1802
1845
  type: Input,
1803
1846
  args: ['floatLabel']
1804
- }], hint: [{
1805
- type: Input
1806
- }], placeholder: [{
1807
- type: Input
1847
+ }], _hint: [{
1848
+ type: Input,
1849
+ args: ['hint']
1850
+ }], _placeholder: [{
1851
+ type: Input,
1852
+ args: ['placeholder']
1808
1853
  }], dense: [{
1809
1854
  type: HostBinding,
1810
1855
  args: ['class.dense']
@@ -1847,6 +1892,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
1847
1892
  }], notifyFocusOut: [{
1848
1893
  type: HostListener,
1849
1894
  args: ['focusout']
1895
+ }], disabled: [{
1896
+ type: HostBinding,
1897
+ args: ["class.disabled"]
1850
1898
  }] } });
1851
1899
 
1852
1900
  class AbstractListInputComponent extends AbstractInputComponent {
@@ -2085,11 +2133,11 @@ class CheckboxInputComponent extends AbstractValueInputComponent {
2085
2133
  super();
2086
2134
  }
2087
2135
  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"] }] });
2136
+ 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 }}\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: 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"] }] });
2089
2137
  }
2090
2138
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: CheckboxInputComponent, decorators: [{
2091
2139
  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"] }]
2140
+ 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 }}\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
2141
  }], ctorParameters: function () { return []; }, propDecorators: { color: [{
2094
2142
  type: Input
2095
2143
  }], labelPosition: [{
@@ -2128,7 +2176,7 @@ class MultipleSelectInputComponent extends AbstractListInputComponent {
2128
2176
  const self = this;
2129
2177
  this.registerDisposable(new Binding(this.componentList$, this.ids$, {
2130
2178
  toLeft(selectedItems, currentLeftValue) {
2131
- const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !it);
2179
+ const newValues = selectedItems.map(it => lookup.get(it)).filter(it => !!it);
2132
2180
  // 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
2181
  return newValues.length < 1 && selectedItems.length > 0 ? currentLeftValue : newValues;
2134
2182
  },
@@ -2167,48 +2215,142 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2167
2215
 
2168
2216
  class NumberInputComponent extends AbstractValueInputComponent {
2169
2217
  autocomplete;
2170
- min = Number.MIN_SAFE_INTEGER;
2171
- max = Number.MAX_SAFE_INTEGER;
2172
- iconPrefix;
2218
+ #min$_accessor_storage = proxify((ValueModel));
2219
+ get min$() { return this.#min$_accessor_storage; }
2220
+ set min$(value) { this.#min$_accessor_storage = value; }
2221
+ #min_accessor_storage = Number.MIN_SAFE_INTEGER;
2222
+ get min() { return this.#min_accessor_storage; }
2223
+ set min(value) { this.#min_accessor_storage = value; }
2224
+ #max$_accessor_storage = proxify((ValueModel));
2225
+ get max$() { return this.#max$_accessor_storage; }
2226
+ set max$(value) { this.#max$_accessor_storage = value; }
2227
+ #max_accessor_storage = Number.MAX_SAFE_INTEGER;
2228
+ get max() { return this.#max_accessor_storage; }
2229
+ set max(value) { this.#max_accessor_storage = value; }
2230
+ incrementCommand;
2231
+ decrementCommand;
2173
2232
  constructor() {
2174
2233
  super();
2234
+ const { chain } = Dsl.disposeWith(this);
2235
+ const normalisedValue$ = chain(this.value$).otherwise(0);
2236
+ this.incrementCommand = Command.create(() => {
2237
+ this.value$.value = normalisedValue$.value + 1;
2238
+ }).enableWhile(chain.numericValue(normalisedValue$).isLessThan(this.max$).and(this.enabled$));
2239
+ this.decrementCommand = Command.create(() => {
2240
+ this.value$.value = normalisedValue$.value - 1;
2241
+ }).enableWhile(chain.numericValue(normalisedValue$).isGreaterThan(this.min$).and(this.enabled$));
2175
2242
  }
2176
2243
  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"] }] });
2244
+ 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
2245
  }
2246
+ __decorate([
2247
+ Proxify(),
2248
+ __metadata("design:type", ValueModel)
2249
+ ], NumberInputComponent.prototype, "min$", null);
2250
+ __decorate([
2251
+ StoreInValueModel(),
2252
+ __metadata("design:type", Object)
2253
+ ], NumberInputComponent.prototype, "min", null);
2254
+ __decorate([
2255
+ Proxify(),
2256
+ __metadata("design:type", ValueModel)
2257
+ ], NumberInputComponent.prototype, "max$", null);
2258
+ __decorate([
2259
+ StoreInValueModel(),
2260
+ __metadata("design:type", Object)
2261
+ ], NumberInputComponent.prototype, "max", null);
2179
2262
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: NumberInputComponent, decorators: [{
2180
2263
  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" }]
2264
+ 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
2265
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2183
2266
  type: Input
2267
+ }], min$: [{
2268
+ type: Input
2184
2269
  }], min: [{
2185
2270
  type: Input
2186
- }], max: [{
2271
+ }], max$: [{
2187
2272
  type: Input
2188
- }], iconPrefix: [{
2273
+ }], max: [{
2189
2274
  type: Input
2190
2275
  }] } });
2191
2276
 
2192
2277
  class PasswordInputComponent extends AbstractValueInputComponent {
2193
2278
  autocomplete;
2279
+ #enableShowPassword$_accessor_storage = proxify((ValueModel));
2280
+ get enableShowPassword$() { return this.#enableShowPassword$_accessor_storage; }
2281
+ set enableShowPassword$(value) { this.#enableShowPassword$_accessor_storage = value; }
2282
+ #enableShowPassword_accessor_storage = false;
2283
+ get enableShowPassword() { return this.#enableShowPassword_accessor_storage; }
2284
+ set enableShowPassword(value) { this.#enableShowPassword_accessor_storage = value; }
2285
+ showPassword$ = new MutableValueModel(false);
2286
+ toggleShowPasswordCommand;
2194
2287
  constructor() {
2195
2288
  super();
2289
+ const { chain, valueOf } = Dsl.disposeWith(this);
2290
+ const face$ = chain(this.showPassword$).map(show => {
2291
+ return {
2292
+ icon: () => show ? "mat:visibility_off" : "mat:visibility"
2293
+ };
2294
+ });
2295
+ this.toggleShowPasswordCommand = Command.create(() => {
2296
+ this.showPassword$.value = !this.showPassword$.value;
2297
+ })
2298
+ .withFace(face$)
2299
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2300
+ }
2301
+ get fieldType() {
2302
+ return this.showPassword$.value ? "text" : "password";
2196
2303
  }
2197
2304
  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"] }] });
2305
+ 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
2306
  }
2307
+ __decorate([
2308
+ Proxify(),
2309
+ __metadata("design:type", Object)
2310
+ ], PasswordInputComponent.prototype, "enableShowPassword$", null);
2311
+ __decorate([
2312
+ StoreInValueModel(),
2313
+ __metadata("design:type", Object)
2314
+ ], PasswordInputComponent.prototype, "enableShowPassword", null);
2200
2315
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: PasswordInputComponent, decorators: [{
2201
2316
  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" }]
2317
+ 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" }]
2318
+ }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2319
+ type: Input
2320
+ }], enableShowPassword$: [{
2321
+ type: Input
2322
+ }], enableShowPassword: [{
2323
+ type: Input
2324
+ }] } });
2325
+
2326
+ class SearchInputComponent extends AbstractValueInputComponent {
2327
+ autocomplete;
2328
+ clearCommand;
2329
+ constructor() {
2330
+ super();
2331
+ this.dense = true;
2332
+ const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2333
+ this.clearCommand = Command.create(() => {
2334
+ this.componentValue$.value = "";
2335
+ });
2336
+ this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2337
+ }
2338
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2339
+ 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"] }] });
2340
+ }
2341
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SearchInputComponent, decorators: [{
2342
+ type: Component,
2343
+ 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
2344
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2204
2345
  type: Input
2205
2346
  }] } });
2206
2347
 
2207
2348
  /**
2208
2349
  * Using templates:
2209
- * <aup-select-input [valueModel]="myModel" [options]="myOptions">
2350
+ * <aup-select-input [value$]="myModel" [options]="myOptions">
2210
2351
  * <ng-template #optionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2211
- * <ng-template #nilOptionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
2352
+ * <ng-template #selectedOptionTemplate let-option>{{option.thePropertyYouWant}} note, not used for nils (the placeholder is used)</ng-template>
2353
+ * <ng-template #nilOptionTemplate>Uses the placeholder by default but you can customise it</ng-template>
2212
2354
  * </aup-select_input>
2213
2355
  */
2214
2356
  class SelectInputComponent extends AbstractValueInputComponent {
@@ -2233,7 +2375,7 @@ class SelectInputComponent extends AbstractValueInputComponent {
2233
2375
  super();
2234
2376
  const { chain } = Dsl.disposeWith(this);
2235
2377
  this.cookedOptions$ = chain(this.options$)
2236
- .reduceToList(options => {
2378
+ .mapAll(options => {
2237
2379
  return options.length < 1 && !isNil(this.componentValue$.value) ? [this.componentValue$.value] : options;
2238
2380
  }, {
2239
2381
  dependsOn: this.componentValue$
@@ -2272,21 +2414,21 @@ class SelectInputComponent extends AbstractValueInputComponent {
2272
2414
  id: this.delegatedIdentityOf(value)
2273
2415
  });
2274
2416
  let lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2275
- console.log(lastIdSnapshot);
2417
+ // console.log(lastIdSnapshot)
2276
2418
  before(this.options$).changes(() => {
2277
2419
  lastIdSnapshot = snapshotValueAndId(this.componentValue$.value);
2278
- console.log(lastIdSnapshot);
2420
+ // console.log(lastIdSnapshot)
2279
2421
  });
2280
2422
  when(this.options$).changes((is, was) => {
2281
2423
  const newIdSnapshot = snapshotValueAndId(lastIdSnapshot.value);
2282
- console.log(lastIdSnapshot, newIdSnapshot);
2424
+ // console.log(lastIdSnapshot, newIdSnapshot)
2283
2425
  if (newIdSnapshot !== lastIdSnapshot.id) {
2284
2426
  this.id$.value = this.delegatedIdentityOf(this.componentValue$.value);
2285
2427
  }
2286
2428
  });
2287
2429
  }
2288
2430
  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"] }] });
2431
+ 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$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"] }] });
2290
2432
  }
2291
2433
  __decorate([
2292
2434
  Proxify(),
@@ -2298,7 +2440,7 @@ __decorate([
2298
2440
  ], SelectInputComponent.prototype, "options", null);
2299
2441
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SelectInputComponent, decorators: [{
2300
2442
  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"] }]
2443
+ 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
2444
  }], ctorParameters: function () { return []; }, propDecorators: { options$: [{
2303
2445
  type: Input
2304
2446
  }], options: [{
@@ -2329,17 +2471,24 @@ class StringInputComponent extends AbstractValueInputComponent {
2329
2471
  get enableClear() { return this.#enableClear_accessor_storage; }
2330
2472
  set enableClear(value) { this.#enableClear_accessor_storage = value; }
2331
2473
  iconPrefix;
2474
+ #suffixCommand_accessor_storage = proxify(Command);
2475
+ get suffixCommand() { return this.#suffixCommand_accessor_storage; }
2476
+ set suffixCommand(value) { this.#suffixCommand_accessor_storage = value; }
2332
2477
  clearCommand;
2333
2478
  constructor() {
2334
2479
  super();
2335
2480
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2336
2481
  this.clearCommand = Command.create(() => {
2337
2482
  this.componentValue$.value = "";
2338
- });
2339
- this.clearCommand.disableWhile(chain.stringValue(this.componentValue$).isBlank());
2483
+ })
2484
+ .withFace({ icon: () => "mat:clear" })
2485
+ .enableWhile(chain.stringValue(this.componentValue$).isNotBlank());
2486
+ }
2487
+ get hasSuffixCommand() {
2488
+ return Proxify.hasTarget(this.suffixCommand);
2340
2489
  }
2341
2490
  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"] }] });
2491
+ 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
2492
  }
2344
2493
  __decorate([
2345
2494
  Proxify(),
@@ -2349,9 +2498,13 @@ __decorate([
2349
2498
  StoreInValueModel(),
2350
2499
  __metadata("design:type", Object)
2351
2500
  ], StringInputComponent.prototype, "enableClear", null);
2501
+ __decorate([
2502
+ Proxify(),
2503
+ __metadata("design:type", Command)
2504
+ ], StringInputComponent.prototype, "suffixCommand", null);
2352
2505
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputComponent, decorators: [{
2353
2506
  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"] }]
2507
+ 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
2508
  }], ctorParameters: function () { return []; }, propDecorators: { autocomplete: [{
2356
2509
  type: Input
2357
2510
  }], enableClear$: [{
@@ -2360,6 +2513,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2360
2513
  type: Input
2361
2514
  }], iconPrefix: [{
2362
2515
  type: Input
2516
+ }], suffixCommand: [{
2517
+ type: Input
2363
2518
  }] } });
2364
2519
 
2365
2520
  class TextInputComponent extends AbstractValueInputComponent {
@@ -2547,7 +2702,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
2547
2702
  * </aup-switch-case>
2548
2703
  */
2549
2704
  class SwitchCaseComponent extends DisposableComponent {
2550
- cdr;
2551
2705
  #switch$_accessor_storage = proxify((ValueModel));
2552
2706
  get switch$() { return this.#switch$_accessor_storage; }
2553
2707
  set switch$(value) { this.#switch$_accessor_storage = value; }
@@ -2556,9 +2710,8 @@ class SwitchCaseComponent extends DisposableComponent {
2556
2710
  set switch(value) { this.#switch_accessor_storage = value; }
2557
2711
  switchCaseOptions;
2558
2712
  selectedIndex = 0;
2559
- constructor(cdr) {
2713
+ constructor() {
2560
2714
  super();
2561
- this.cdr = cdr;
2562
2715
  }
2563
2716
  ngAfterContentInit() {
2564
2717
  const subscription = this.switchCaseOptions.changes.subscribe(change => this.updateSelection());
@@ -2595,7 +2748,7 @@ class SwitchCaseComponent extends DisposableComponent {
2595
2748
  this.selectedIndex = -1;
2596
2749
  }
2597
2750
  }
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 });
2751
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2599
2752
  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"] }] });
2600
2753
  }
2601
2754
  __decorate([
@@ -2609,7 +2762,7 @@ __decorate([
2609
2762
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SwitchCaseComponent, decorators: [{
2610
2763
  type: Component,
2611
2764
  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$: [{
2765
+ }], ctorParameters: function () { return []; }, propDecorators: { switch$: [{
2613
2766
  type: Input
2614
2767
  }], switch: [{
2615
2768
  type: Input
@@ -2806,6 +2959,7 @@ class ColumnTextSearchWrapper extends ColumnTextSearchFormatter.Delegate {
2806
2959
  }
2807
2960
  class ColumnModel extends GarbageCollector {
2808
2961
  columnId;
2962
+ order;
2809
2963
  textPropertiesProvider;
2810
2964
  _columnTextProperties;
2811
2965
  _columnHeaderPortalRef;
@@ -2819,9 +2973,10 @@ class ColumnModel extends GarbageCollector {
2819
2973
  dasherisedColumnId;
2820
2974
  textSearchDelegate = new ColumnTextSearchWrapper();
2821
2975
  visible$;
2822
- constructor(columnId, textPropertiesProvider) {
2976
+ constructor(columnId, order, textPropertiesProvider) {
2823
2977
  super();
2824
2978
  this.columnId = columnId;
2979
+ this.order = order;
2825
2980
  this.textPropertiesProvider = textPropertiesProvider;
2826
2981
  const { valueOf } = Dsl.disposeWith(this);
2827
2982
  this.installHeaderRenderer();
@@ -2866,6 +3021,14 @@ class ColumnModel extends GarbageCollector {
2866
3021
  this._columnTextProperties = columnTextProperties;
2867
3022
  return this;
2868
3023
  }
3024
+ positionAfter(column) {
3025
+ this.order.position(this, { after: column });
3026
+ return this;
3027
+ }
3028
+ positionBefore(column) {
3029
+ this.order.position(this, { before: column });
3030
+ return this;
3031
+ }
2869
3032
  getSearchTextFor(row) {
2870
3033
  return this.textSearchDelegate.format(row);
2871
3034
  }
@@ -2967,8 +3130,8 @@ __decorate([
2967
3130
 
2968
3131
  class CustomTemplateColumnModel extends ColumnModel {
2969
3132
  config = new TemplateCellRendererPortalRef();
2970
- constructor(columnId, defaults) {
2971
- super(columnId, defaults);
3133
+ constructor(columnId, order, defaults) {
3134
+ super(columnId, order, defaults);
2972
3135
  this.configureCellRenderer(this.config);
2973
3136
  }
2974
3137
  setTemplate(templateRef, viewContainer, fillCell, padChild) {
@@ -3046,12 +3209,17 @@ class AbstractTableComponent extends DisposableComponent {
3046
3209
  #showHeader_accessor_storage = true;
3047
3210
  get showHeader() { return this.#showHeader_accessor_storage; }
3048
3211
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
3212
+ #enableScrolling$_accessor_storage = proxify((ValueModel));
3049
3213
  /**
3050
3214
  * Set to true to enable scrolling. Once enabled the table will have 0 implicit height. You will either
3051
3215
  * need to set it explicitly e.g. height: 400px; or by using flex or grid layout to make it fill it's
3052
3216
  * containment area.
3053
3217
  */
3054
- enableScrolling = false;
3218
+ get enableScrolling$() { return this.#enableScrolling$_accessor_storage; }
3219
+ set enableScrolling$(value) { this.#enableScrolling$_accessor_storage = value; }
3220
+ #enableScrolling_accessor_storage = false;
3221
+ get enableScrolling() { return this.#enableScrolling_accessor_storage; }
3222
+ set enableScrolling(value) { this.#enableScrolling_accessor_storage = value; }
3055
3223
  columns;
3056
3224
  columnIds;
3057
3225
  columnsById;
@@ -3070,7 +3238,6 @@ class AbstractTableComponent extends DisposableComponent {
3070
3238
  super();
3071
3239
  this.injector = injector;
3072
3240
  const { chain, when } = Dsl.disposeWith(this);
3073
- this._visibleRows$.setDelegate(this._dataSource$);
3074
3241
  when(chain(this._dataSource$).first()).becomesTruthy(it => {
3075
3242
  if (it === this.identityOf(it)) {
3076
3243
  console.warn("Table model identity function is using reference equality. This can cause lots of table re-rendering", {
@@ -3089,7 +3256,7 @@ class AbstractTableComponent extends DisposableComponent {
3089
3256
  if (!model) {
3090
3257
  lang$1.illegalState("aup-table tableModel is nil");
3091
3258
  }
3092
- this.columnsById = chain(model.columns).indexBy('columnId');
3259
+ this.columnsById = chain(model.columns$).indexBy('columnId');
3093
3260
  this._dataSource$.setDelegate(model.dataSource$);
3094
3261
  model.initialise(this.injector, (row) => this.identityOf(row));
3095
3262
  }
@@ -3106,7 +3273,7 @@ class AbstractTableComponent extends DisposableComponent {
3106
3273
  }
3107
3274
  }
3108
3275
  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 });
3276
+ 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
3277
  }
3111
3278
  __decorate([
3112
3279
  Proxify(),
@@ -3116,6 +3283,14 @@ __decorate([
3116
3283
  StoreInValueModel(),
3117
3284
  __metadata("design:type", Object)
3118
3285
  ], AbstractTableComponent.prototype, "showHeader", null);
3286
+ __decorate([
3287
+ Proxify(),
3288
+ __metadata("design:type", ValueModel)
3289
+ ], AbstractTableComponent.prototype, "enableScrolling$", null);
3290
+ __decorate([
3291
+ StoreInValueModel(),
3292
+ __metadata("design:type", Boolean)
3293
+ ], AbstractTableComponent.prototype, "enableScrolling", null);
3119
3294
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractTableComponent, decorators: [{
3120
3295
  type: Component,
3121
3296
  args: [{
@@ -3126,6 +3301,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
3126
3301
  type: Input
3127
3302
  }], showHeader: [{
3128
3303
  type: Input
3304
+ }], enableScrolling$: [{
3305
+ type: Input
3129
3306
  }], enableScrolling: [{
3130
3307
  type: Input
3131
3308
  }], baseCssClass: [{
@@ -3186,6 +3363,8 @@ class EditSession extends GarbageCollector {
3186
3363
  // console.warn()
3187
3364
  // }
3188
3365
  this._liveRowValue$.value = produce(this._liveRowValue$.value, draft => {
3366
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
3367
+ // @ts-ignore
3189
3368
  this.form.writeDirtyStateTo(draft);
3190
3369
  });
3191
3370
  });
@@ -3288,11 +3467,11 @@ class DefaultCellRendererComponent {
3288
3467
  return this._value;
3289
3468
  }
3290
3469
  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" }] });
3470
+ 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
3471
  }
3293
3472
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: DefaultCellRendererComponent, decorators: [{
3294
3473
  type: Component,
3295
- args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n" }]
3474
+ args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value?.toString()| aupHighlight\"></span>\n" }]
3296
3475
  }], propDecorators: { value: [{
3297
3476
  type: Input
3298
3477
  }] } });
@@ -3430,25 +3609,14 @@ class Bounds extends Dimension {
3430
3609
  })(Bounds || (Bounds = {}));
3431
3610
 
3432
3611
  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
- }
3612
+ elementRef = this.inject(ElementRef);
3613
+ ngZone = this.inject(NgZone);
3614
+ boundsTracker = new ResizeAwareComponent.ResizeTracker(this.elementRef, this.ngZone);
3441
3615
  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());
3616
+ this.boundsTracker.notifyViewReady();
3449
3617
  }
3450
3618
  get bounds$() {
3451
- return this._bounds$.readonly$;
3619
+ return this.boundsTracker.bounds$;
3452
3620
  }
3453
3621
  get nativeElement() {
3454
3622
  return this.elementRef.nativeElement;
@@ -3458,57 +3626,160 @@ class ResizeAwareComponent extends DisposableComponent {
3458
3626
  return this.bounds.relativePositionOf(point);
3459
3627
  }
3460
3628
  get bounds() {
3461
- return this._bounds$.value;
3462
- }
3463
- _updateBounds() {
3464
- this._bounds$.value = Bounds.ofElement(this.nativeElement);
3629
+ return this.bounds$.value;
3465
3630
  }
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 });
3631
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
3467
3632
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: ResizeAwareComponent, usesInheritance: true, ngImport: i0 });
3468
3633
  }
3469
3634
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeAwareComponent, decorators: [{
3470
3635
  type: Directive
3471
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; } });
3636
+ }] });
3637
+ (function (ResizeAwareComponent) {
3638
+ class ResizeTracker extends GarbageCollector {
3639
+ elementRef;
3640
+ ngZone;
3641
+ _bounds$ = new MutableValueModel(new Bounds(0, 0, 0, 0));
3642
+ width$;
3643
+ height$;
3644
+ top$;
3645
+ left$;
3646
+ bottom$;
3647
+ right$;
3648
+ constructor(elementRef, ngZone) {
3649
+ super();
3650
+ this.elementRef = elementRef;
3651
+ this.ngZone = ngZone;
3652
+ const { chain } = Dsl.disposeWith(this);
3653
+ this.width$ = chain(this.bounds$).pluck("width");
3654
+ this.height$ = chain(this.bounds$).pluck("height");
3655
+ this.top$ = chain(this.bounds$).pluck("top");
3656
+ this.left$ = chain(this.bounds$).pluck("left");
3657
+ this.bottom$ = chain.numericValue(this.top$).add(this.height$);
3658
+ this.right$ = chain.numericValue(this.left$).add(this.width$);
3659
+ }
3660
+ notifyViewReady() {
3661
+ const element = this.elementRef.nativeElement;
3662
+ const ro = new ResizeObserver((entries, observer) => {
3663
+ this.ngZone.run(() => this._updateBounds());
3664
+ });
3665
+ ro.observe(element);
3666
+ this.onDispose(() => ro.disconnect());
3667
+ setTimeout(() => this._updateBounds());
3668
+ }
3669
+ get bounds$() {
3670
+ return this._bounds$.readonly$;
3671
+ }
3672
+ get nativeElement() {
3673
+ return this.elementRef.nativeElement;
3674
+ }
3675
+ // TODO: Make this handle body scroll
3676
+ relativePositionOf(point) {
3677
+ return this.bounds.relativePositionOf(point);
3678
+ }
3679
+ get bounds() {
3680
+ return this._bounds$.value;
3681
+ }
3682
+ _updateBounds() {
3683
+ this._bounds$.value = Bounds.ofElement(this.nativeElement);
3684
+ }
3685
+ }
3686
+ ResizeAwareComponent.ResizeTracker = ResizeTracker;
3687
+ })(ResizeAwareComponent || (ResizeAwareComponent = {}));
3472
3688
 
3473
- class ColumnListModel extends AbstractComputedListModel {
3474
- _allColumns$ = new MutableListModel();
3475
- columnsById$;
3689
+ var ColumnOrderManager;
3690
+ (function (ColumnOrderManager) {
3691
+ function processPosition(position, callback) {
3692
+ if (position) {
3693
+ const keys = Object.keys(position);
3694
+ if (keys.includes("before")) {
3695
+ return position["before"] ? callback.before(position["before"]) : callback.first();
3696
+ }
3697
+ else {
3698
+ return position["after"] ? callback.after(position["after"]) : callback.last();
3699
+ }
3700
+ }
3701
+ else {
3702
+ return callback.last();
3703
+ }
3704
+ }
3705
+ ColumnOrderManager.processPosition = processPosition;
3706
+ })(ColumnOrderManager || (ColumnOrderManager = {}));
3707
+
3708
+ class ColumnRef {
3709
+ column;
3710
+ position;
3711
+ constructor(column, position) {
3712
+ this.column = column;
3713
+ this.position = position;
3714
+ }
3715
+ }
3716
+ class ColumnManager extends GarbageCollector {
3717
+ _columnRefs$ = new MutableListModel();
3718
+ orderedColumnRefs$;
3719
+ _columnsById$;
3720
+ allColumns$;
3721
+ columnVisibilities$ = new WatchList();
3722
+ visibleColumns$;
3476
3723
  constructor() {
3477
3724
  super();
3478
3725
  const { chain } = Dsl.disposeWith(this);
3479
- this.columnsById$ = chain(this._allColumns$).indexBy('columnId');
3726
+ this.orderedColumnRefs$ = chain(this._columnRefs$).orderBy("position", "asc");
3727
+ this.allColumns$ = this.orderedColumnRefs$.pluck("column");
3728
+ this._columnsById$ = chain(this.allColumns$).indexBy('columnId');
3729
+ this.visibleColumns$ = chain(this.allColumns$).select(it => it.visible$.value, {
3730
+ dependsOn: this.columnVisibilities$
3731
+ });
3480
3732
  }
3481
- get allColumns$() {
3482
- return this._allColumns$.readonly$;
3733
+ position(column, newPosition) {
3734
+ const target = this._columnRefs$.query().findMatching(it => it.column === column);
3735
+ const position = this.computePosition(newPosition);
3736
+ this._columnRefs$.replace(target, { with: new ColumnRef(target.column, position) });
3483
3737
  }
3484
3738
  getColumn(id) {
3485
- return this.columnsById$.get(id);
3739
+ return this._columnsById$.get(id);
3486
3740
  }
3487
3741
  hasColumn(id) {
3488
- return !!this.columnsById$.get(id);
3742
+ return !!this._columnsById$.get(id);
3489
3743
  }
3490
3744
  hasMatchingColumn(row, regex) {
3491
3745
  // only search the visible columns
3492
- return !!this.value.find(c => regex.test(c.getSearchTextFor(row)));
3746
+ return !!this.visibleColumns$.value.find(c => regex.test(c.getSearchTextFor(row)));
3493
3747
  }
3494
- addColumn(column, index) {
3748
+ addColumn(column, position) {
3495
3749
  if (this.hasColumn(column.columnId)) {
3496
3750
  lang.illegalState(`Column with id=${column.columnId} already exists`);
3497
3751
  }
3498
3752
  this.registerDisposable(column);
3499
- this.runInTransaction(() => {
3500
- if (!isNil(index)) {
3501
- this._allColumns$.insert(index, column);
3502
- }
3503
- else {
3504
- this._allColumns$.push(column);
3753
+ this._columnRefs$.push(new ColumnRef(column, this.computePosition(position)));
3754
+ this.columnVisibilities$.add(column.visible$);
3755
+ return column;
3756
+ }
3757
+ computePosition(position) {
3758
+ const q = this.orderedColumnRefs$.query();
3759
+ return ColumnOrderManager.processPosition(position, {
3760
+ before(col) {
3761
+ const index = q.findIndex(ref => ref.column === col);
3762
+ const beforeCol = q.value[index];
3763
+ const afterCol = index - 1 >= 0 ? q.value[index - 1] : undefined;
3764
+ return generateKeyBetween(afterCol?.position, beforeCol.position);
3765
+ },
3766
+ after(col) {
3767
+ const index = q.findIndex(ref => ref.column === col);
3768
+ const afterCol = q.value[index];
3769
+ const beforeCol = index + 1 < q.length ? q.value[index + 1] : undefined;
3770
+ return generateKeyBetween(afterCol.position, beforeCol?.position);
3771
+ },
3772
+ first() {
3773
+ return generateKeyBetween(null, q.first()?.position);
3774
+ },
3775
+ last() {
3776
+ // add it to the end of the list
3777
+ return generateKeyBetween(q.last()?.position, null);
3505
3778
  }
3506
- this.registerDisposable(this.trackSource(column.visible$));
3507
3779
  });
3508
- return column;
3509
3780
  }
3510
3781
  doComputeValue() {
3511
- return this._allColumns$.value.filter(c => c.visible$.value);
3782
+ return this.allColumns$.value.filter(c => c.visible$.value);
3512
3783
  }
3513
3784
  }
3514
3785
 
@@ -3542,8 +3813,8 @@ function EnableCellTextSearch(options) {
3542
3813
 
3543
3814
  class CustomValueColumnModel extends ColumnModel {
3544
3815
  getValue;
3545
- constructor(columnId, defaults, getValue) {
3546
- super(columnId, defaults);
3816
+ constructor(columnId, order, defaults, getValue) {
3817
+ super(columnId, order, defaults);
3547
3818
  this.getValue = getValue;
3548
3819
  this.cellRenderer(DefaultCellRendererComponent);
3549
3820
  }
@@ -3551,17 +3822,17 @@ class CustomValueColumnModel extends ColumnModel {
3551
3822
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => new ColumnTextSearchFormatter.Null()), row => this.getValue(row));
3552
3823
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3553
3824
  if (firstTime) {
3554
- if (isFunction$1(onComponentInitOrOptions)) {
3825
+ if (isFunction(onComponentInitOrOptions)) {
3555
3826
  onComponentInitOrOptions(component);
3556
3827
  }
3557
3828
  else {
3558
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3829
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3559
3830
  onComponentInitOrOptions.onComponentInit(component);
3560
3831
  }
3561
3832
  }
3562
3833
  }
3563
3834
  component.value = this.getValue(rowData.row);
3564
- if (!isFunction$1(onComponentInitOrOptions) && isFunction$1(onComponentInitOrOptions?.onRowUpdate)) {
3835
+ if (!isFunction(onComponentInitOrOptions) && isFunction(onComponentInitOrOptions?.onRowUpdate)) {
3565
3836
  onComponentInitOrOptions.onRowUpdate(component, rowData.row);
3566
3837
  }
3567
3838
  }));
@@ -3573,8 +3844,8 @@ class CustomValueColumnModel extends ColumnModel {
3573
3844
  }
3574
3845
 
3575
3846
  class EditorControlColumnModel extends ColumnModel {
3576
- constructor(columnId, saveCommandFactory, defaults) {
3577
- super(columnId, defaults);
3847
+ constructor(columnId, order, saveCommandFactory, defaults) {
3848
+ super(columnId, order, defaults);
3578
3849
  this.cellRenderer(EditRowControlsComponent);
3579
3850
  }
3580
3851
  cellRenderer(componentType) {
@@ -3599,8 +3870,8 @@ class ListPropertyColumnModel extends ColumnModel {
3599
3870
  intermediate.map(v => v?.toString()).join(", ") :
3600
3871
  intermediate?.toString();
3601
3872
  };
3602
- constructor(id, property, defaults) {
3603
- super(id, defaults);
3873
+ constructor(id, order, property, defaults) {
3874
+ super(id, order, defaults);
3604
3875
  this.property = property;
3605
3876
  this.cellRenderer(DefaultCellRendererComponent);
3606
3877
  }
@@ -3616,7 +3887,7 @@ class ListPropertyColumnModel extends ColumnModel {
3616
3887
  }
3617
3888
  cellEditor(editor, validatorsOrInitialiser, initialiseComponent) {
3618
3889
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3619
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3890
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3620
3891
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3621
3892
  const formListModel = editSession.form.pluckList(this.property);
3622
3893
  if (validators) {
@@ -3645,8 +3916,8 @@ class PropertyColumnModel extends ColumnModel {
3645
3916
  _defaultSearchTextFormatter = (value) => {
3646
3917
  return (this._userFormat ?? Functions.identity)(value)?.toString();
3647
3918
  };
3648
- constructor(id, property, defaults) {
3649
- super(id, defaults);
3919
+ constructor(id, order, property, defaults) {
3920
+ super(id, order, defaults);
3650
3921
  this.property = property;
3651
3922
  this.cellRenderer(DefaultCellRendererComponent);
3652
3923
  }
@@ -3654,11 +3925,11 @@ class PropertyColumnModel extends ColumnModel {
3654
3925
  this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => ColumnTextSearchFormatter.forFormatter(this._defaultSearchTextFormatter)), row => row[this.property]);
3655
3926
  this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3656
3927
  if (firstTime) {
3657
- if (isFunction$1(onComponentInitOrOptions)) {
3928
+ if (isFunction(onComponentInitOrOptions)) {
3658
3929
  onComponentInitOrOptions(component);
3659
3930
  }
3660
3931
  else {
3661
- if (isFunction$1(onComponentInitOrOptions?.onComponentInit)) {
3932
+ if (isFunction(onComponentInitOrOptions?.onComponentInit)) {
3662
3933
  onComponentInitOrOptions.onComponentInit(component);
3663
3934
  }
3664
3935
  }
@@ -3683,7 +3954,7 @@ class PropertyColumnModel extends ColumnModel {
3683
3954
  component[ColumnModel.CELL_RENDERER_COMPONENT_ROW_CACHE] = rowData.row;
3684
3955
  let disableEditCallback = false;
3685
3956
  if (firstTime) {
3686
- if (isFunction$1(options?.onComponentInit)) {
3957
+ if (isFunction(options?.onComponentInit)) {
3687
3958
  options.onComponentInit(component);
3688
3959
  }
3689
3960
  // install our edit callback
@@ -3698,7 +3969,7 @@ class PropertyColumnModel extends ColumnModel {
3698
3969
  disableEditCallback = true;
3699
3970
  component.value = rowData.row[this.property];
3700
3971
  disableEditCallback = false;
3701
- if (!isFunction$1(options) && isFunction$1(options?.onRowUpdate)) {
3972
+ if (!isFunction(options) && isFunction(options?.onRowUpdate)) {
3702
3973
  options.onRowUpdate(component, rowData.row);
3703
3974
  }
3704
3975
  }));
@@ -3706,7 +3977,7 @@ class PropertyColumnModel extends ColumnModel {
3706
3977
  }
3707
3978
  cellEditor(editor, validatorsOrInitialiser, onComponentInit) {
3708
3979
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3709
- const initialiser = isFunction$1(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
3980
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
3710
3981
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3711
3982
  const formValueModel = editSession.form.pluck(this.property);
3712
3983
  if (validators) {
@@ -3733,8 +4004,8 @@ class SelectionColumnModel extends ColumnModel {
3733
4004
  selectionModel;
3734
4005
  _enableHeaderControls = true;
3735
4006
  _color = "accent";
3736
- constructor(columnId, defaults, selectionModel) {
3737
- super(columnId, defaults);
4007
+ constructor(columnId, order, defaults, selectionModel) {
4008
+ super(columnId, order, defaults);
3738
4009
  this.selectionModel = selectionModel;
3739
4010
  const { chain } = Dsl.disposeWith(this);
3740
4011
  this._selectRowOnClick(false);
@@ -3784,13 +4055,15 @@ class TableMoreMenuComponent extends DisposableComponent {
3784
4055
  popupType$ = new MutableValueModel();
3785
4056
  popupComponentPortal$;
3786
4057
  _visible$ = this.registerDisposable(new DelegatingValueModel());
4058
+ initialiseCallback;
3787
4059
  constructor() {
3788
4060
  super();
3789
4061
  const { chain } = Dsl.disposeWith(this);
3790
4062
  this.popupComponentPortal$ = chain(this.popupType$).map(type => new ComponentPortal(type));
3791
4063
  }
3792
- configurePopupComponentType(popupComponentType) {
4064
+ configurePopupComponentType(popupComponentType, configureCallback) {
3793
4065
  this.popupType$.value = popupComponentType;
4066
+ this.initialiseCallback = configureCallback;
3794
4067
  }
3795
4068
  // Stops tree selection when clicking the menu button
3796
4069
  preventDefault($event) {
@@ -3801,6 +4074,9 @@ class TableMoreMenuComponent extends DisposableComponent {
3801
4074
  const component = $event.instance;
3802
4075
  component.initialise(this.value$, Command.create(() => this.matMenuTrigger.closeMenu()));
3803
4076
  this._visible$.setDelegate(component.visible$);
4077
+ if (this.initialiseCallback) {
4078
+ this.initialiseCallback(component);
4079
+ }
3804
4080
  }
3805
4081
  get visible$() {
3806
4082
  return this._visible$.readonly$;
@@ -3835,16 +4111,25 @@ class RowClass {
3835
4111
  this.matches = matches;
3836
4112
  }
3837
4113
  }
4114
+ class RowAttribute {
4115
+ attributeName;
4116
+ getValue;
4117
+ constructor(attributeName, getValue) {
4118
+ this.attributeName = attributeName;
4119
+ this.getValue = getValue;
4120
+ }
4121
+ }
3838
4122
  class AbstractTableModel extends GarbageCollector {
3839
4123
  _dataSource$ = this.registerDisposable(new DelegatingListModel());
3840
4124
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
3841
4125
  _visibleRows$ = this.registerDisposable(new DelegatingListModel());
3842
- _columnList = this.registerDisposable(new ColumnListModel());
4126
+ columnManager = this.registerDisposable(new ColumnManager());
3843
4127
  _editorSessions = new MutableListModel();
3844
4128
  _rowsBeingEdited$;
3845
4129
  saveCommandFactory;
3846
4130
  _editorSessionByRowId;
3847
4131
  rowClassNamePredicates = [];
4132
+ rowAttributeGenerators = [];
3848
4133
  _columnTextPropertiesLookup;
3849
4134
  editing$;
3850
4135
  firstEditableColumn$;
@@ -3869,15 +4154,15 @@ class AbstractTableModel extends GarbageCollector {
3869
4154
  });
3870
4155
  this._editorSessionByRowId = chain(this._editorSessions).indexBy("rowId");
3871
4156
  this.editing$ = chain(this._editorSessions).count().isGreaterThan(0);
3872
- this.textSearchPredicate$ = chain(this.visibleColumns).reduce(columns => {
4157
+ this.textSearchPredicate$ = chain(this.visibleColumns$).reduceAll(columns => {
3873
4158
  return (row, regex) => {
3874
4159
  return (!regex || !!columns.find(c => regex.test(c.getSearchTextFor(row))));
3875
4160
  };
3876
4161
  });
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);
4162
+ this.firstEditableColumn$ = chain(this.columns$).select(c => c.hasEditorPortal()).first();
4163
+ this.firstVisibleColumn$ = chain(this.visibleColumns$).first();
4164
+ this.lastVisibleColumn$ = chain(this.visibleColumns$).last();
4165
+ this.rowSelectionDisabledOnAllColumns$ = chain(this.columnManager.visibleColumns$).select(column => column.isRowSelectionEnabled()).count().equals(0);
3881
4166
  this.dataSourceEmpty$ = chain(this.dataSource$).isEmpty();
3882
4167
  this.selectedItems$ = this.selectionModelProxy.selectedItems$;
3883
4168
  this.leadSelection$ = this.selectionModelProxy.leadSelection$;
@@ -3901,7 +4186,7 @@ class AbstractTableModel extends GarbageCollector {
3901
4186
  ],
3902
4187
  parent: injector
3903
4188
  });
3904
- this.columns.value.forEach(c => c.initialise(customInjector));
4189
+ this.columns$.value.forEach(c => c.initialise(customInjector));
3905
4190
  this.identityOf = identityOf;
3906
4191
  }
3907
4192
  get dataSource$() {
@@ -3954,19 +4239,19 @@ class AbstractTableModel extends GarbageCollector {
3954
4239
  });
3955
4240
  });
3956
4241
  }
3957
- get columns() {
3958
- return this._columnList.allColumns$;
4242
+ get columns$() {
4243
+ return this.columnManager.allColumns$;
3959
4244
  }
3960
- get visibleColumns() {
3961
- return this._columnList.readonly$;
4245
+ get visibleColumns$() {
4246
+ return this.columnManager.visibleColumns$;
3962
4247
  }
3963
4248
  pluck(property, options) {
3964
4249
  const columnId = options?.columnId || property.toString();
3965
- return this.addColumn(new PropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4250
+ return this.addColumn(new PropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3966
4251
  }
3967
4252
  pluckList(property, options) {
3968
4253
  const columnId = options?.columnId || property.toString();
3969
- return this.addColumn(new ListPropertyColumnModel(columnId, property, () => this.getColumnTextProperties(columnId)));
4254
+ return this.addColumn(new ListPropertyColumnModel(columnId, this.columnManager, property, () => this.getColumnTextProperties(columnId)));
3970
4255
  }
3971
4256
  // TODO: clean this up and assign the selection model on teh table directly.
3972
4257
  // tableModel.useSelectionModel(model) and have the seleciton column automatically
@@ -3975,32 +4260,32 @@ class AbstractTableModel extends GarbageCollector {
3975
4260
  _addSelectionColumn(selectionModel, visible) {
3976
4261
  assert.isNil(this.selectionColumnModel);
3977
4262
  const columnId = "selection-column";
3978
- this.selectionColumnModel = new SelectionColumnModel(columnId, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
4263
+ this.selectionColumnModel = new SelectionColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this.selectionModelProxy);
3979
4264
  this.selectionColumnModel.useSelectionModel(selectionModel);
3980
4265
  this.addRowClass("aup-row-selected", row => this.selectionColumnModel.isSelected(row));
3981
- const selectionColumnModel = this.addColumn(this.selectionColumnModel, 0);
3982
- if (!isNil$1(visible)) {
4266
+ const selectionColumnModel = this.addColumn(this.selectionColumnModel, { before: null }); // first column
4267
+ if (!isNil(visible)) {
3983
4268
  selectionColumnModel.visibleWhile(visible instanceof ValueModel ? visible : ValueModel.constant(visible));
3984
4269
  }
3985
4270
  return selectionColumnModel;
3986
4271
  }
3987
4272
  addEditControls(saveCommandFactory, formFactory) {
3988
4273
  this.saveCommandFactory = saveCommandFactory;
3989
- if (isFunction$1(formFactory)) {
4274
+ if (isFunction(formFactory)) {
3990
4275
  this._createForm = formFactory;
3991
4276
  }
3992
4277
  const columnId = "editControls";
3993
- return this.addColumn(new EditorControlColumnModel(columnId, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
4278
+ return this.addColumn(new EditorControlColumnModel(columnId, this.columnManager, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
3994
4279
  }
3995
4280
  addCustomColumn(columnId, dataAccessor) {
3996
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), dataAccessor));
4281
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), dataAccessor));
3997
4282
  }
3998
4283
  addComponentColumn(columnId, component, onComponentInitOrOptions) {
3999
- return this.addColumn(new CustomValueColumnModel(columnId, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4284
+ return this.addColumn(new CustomValueColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), row => row)).cellRenderer(component, onComponentInitOrOptions);
4000
4285
  }
4001
- addMoreMenu(componentClass) {
4286
+ addMoreMenu(componentClass, initialiseCallback) {
4002
4287
  return this.addComponentColumn("more-menu", TableMoreMenuComponent, (component) => {
4003
- component.configurePopupComponentType(componentClass);
4288
+ component.configurePopupComponentType(componentClass, initialiseCallback);
4004
4289
  }).columnTextProperties({
4005
4290
  headerText() {
4006
4291
  return "";
@@ -4008,11 +4293,14 @@ class AbstractTableModel extends GarbageCollector {
4008
4293
  });
4009
4294
  }
4010
4295
  addTemplateColumn(columnId) {
4011
- return this.addColumn(new CustomTemplateColumnModel(columnId, () => this.getColumnTextProperties(columnId)));
4296
+ return this.addColumn(new CustomTemplateColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId)));
4012
4297
  }
4013
4298
  addRowClass(className, predicate) {
4014
4299
  this.rowClassNamePredicates.push(new RowClass(className, predicate));
4015
4300
  }
4301
+ addRowAttribute(attributeName, getValue) {
4302
+ this.rowAttributeGenerators.push(new RowAttribute(attributeName, getValue));
4303
+ }
4016
4304
  getRowClasses(row) {
4017
4305
  const classNames = [];
4018
4306
  this.rowClassNamePredicates.forEach(i => {
@@ -4022,8 +4310,13 @@ class AbstractTableModel extends GarbageCollector {
4022
4310
  });
4023
4311
  return classNames;
4024
4312
  }
4025
- addColumn(column, index) {
4026
- return this._columnList.addColumn(column, index);
4313
+ getRowAttributes(row) {
4314
+ return this.rowAttributeGenerators.reduce((result, generator) => {
4315
+ return { ...result, [generator.attributeName]: generator.getValue(row) };
4316
+ }, {});
4317
+ }
4318
+ addColumn(column, position) {
4319
+ return this.columnManager.addColumn(column, position);
4027
4320
  }
4028
4321
  columnTextProperties(columnTextProperties) {
4029
4322
  this._columnTextPropertiesLookup = columnTextProperties;
@@ -4191,7 +4484,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
4191
4484
  args: ['class']
4192
4485
  }] } });
4193
4486
 
4487
+ const AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER = new InjectionToken("AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER");
4488
+ class TableRowAttributesDirective {
4489
+ elementRef;
4490
+ aupTableRowAttributes;
4491
+ constructor(elementRef) {
4492
+ this.elementRef = elementRef;
4493
+ }
4494
+ ngOnInit() {
4495
+ for (const attr in this.aupTableRowAttributes) {
4496
+ this.elementRef.nativeElement.setAttribute(attr, this.aupTableRowAttributes[attr]);
4497
+ }
4498
+ }
4499
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
4500
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: TableRowAttributesDirective, selector: "[aupTableRowAttributes]", inputs: { aupTableRowAttributes: "aupTableRowAttributes" }, ngImport: i0 });
4501
+ }
4502
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableRowAttributesDirective, decorators: [{
4503
+ type: Directive,
4504
+ args: [{
4505
+ selector: "[aupTableRowAttributes]",
4506
+ }]
4507
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { aupTableRowAttributes: [{
4508
+ type: Input
4509
+ }] } });
4194
4510
  class TableBodyComponent extends ResizeAwareComponent {
4511
+ bufferMultiplier;
4195
4512
  #data$_accessor_storage = proxify((ListModel));
4196
4513
  get data$() { return this.#data$_accessor_storage; }
4197
4514
  set data$(value) { this.#data$_accessor_storage = value; }
@@ -4204,51 +4521,66 @@ class TableBodyComponent extends ResizeAwareComponent {
4204
4521
  #showHeader_accessor_storage = true;
4205
4522
  get showHeader() { return this.#showHeader_accessor_storage; }
4206
4523
  set showHeader(value) { this.#showHeader_accessor_storage = value; }
4207
- visibleRowCount = new EventEmitter();
4208
4524
  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;
4525
+ #scrollMode$_accessor_storage = proxify((ValueModel));
4526
+ get scrollMode$() { return this.#scrollMode$_accessor_storage; }
4527
+ set scrollMode$(value) { this.#scrollMode$_accessor_storage = value; }
4528
+ #scrollMode_accessor_storage = "none";
4529
+ get scrollMode() { return this.#scrollMode_accessor_storage; }
4530
+ set scrollMode(value) { this.#scrollMode_accessor_storage = value; }
4531
+ scrollViewport;
4215
4532
  columns$;
4216
4533
  columnIds$;
4217
4534
  columnsById$;
4218
- _visibleRowCount$;
4219
4535
  // TODO: support user defined header and row heights via css vars.
4220
- headerHeight$ = new MutableValueModel(29);
4221
- rowHeight$ = new MutableValueModel(40);
4536
+ headerHeight$ = new MutableValueModel(48);
4537
+ rowHeight$ = new MutableValueModel(44);
4222
4538
  baseCssClass = "aup-table-component";
4223
- constructor(elementRef, ngZone) {
4224
- super(elementRef, ngZone);
4225
- const { chain, when } = Dsl.disposeWith(this);
4539
+ virtualScrollDataSource = new TableVirtualScrollDataSource();
4540
+ virtualScrollActive$ = new MutableValueModel(false);
4541
+ scrollTimeout;
4542
+ constructor(bufferMultiplier = 1) {
4543
+ super();
4544
+ this.bufferMultiplier = bufferMultiplier;
4545
+ const { chain, when, observe } = Dsl.disposeWith(this);
4226
4546
  const actualHeaderHeight$ = chain(this.showHeader$).map(show => {
4227
4547
  return show ? this.headerHeight$.value : 0;
4228
4548
  }, { 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" });
4549
+ // performance is terrible if the data changes while we're scrolling, so we postpone updates until
4550
+ // scrolling stops.
4551
+ const delayedDatea$ = chain(this.data$).postponeWhile(this.virtualScrollActive$);
4552
+ when(delayedDatea$).changes(delatedData => {
4553
+ this.virtualScrollDataSource.data = delatedData;
4554
+ this.scheduleTableHeightCheck();
4555
+ }, { initialValue: "evaluate" });
4240
4556
  this.onInit(() => {
4241
- this.columns$ = chain(this.tableModel.columns);
4557
+ this.columns$ = chain(this.tableModel.visibleColumns$);
4242
4558
  this.columnIds$ = chain(this.columns$).pluck("columnId");
4243
4559
  this.columnsById$ = chain(this.columns$).indexBy('columnId');
4244
4560
  });
4245
- const txo = new TransactionObserver().onEvent(e => console.log(e.name, e.payload));
4246
- txo.observe('this.boundsModel', this.bounds$);
4247
- txo.observe('this._visibleRowCount$', this._visibleRowCount$);
4561
+ // const txo = new TransactionObserver({verbose: false}).onEvent(e => console.log(e.name, e.payload));
4562
+ // txo.observe('this.virtualScrollRowRange$', this.virtualScrollRowRange$);
4563
+ // txo.observe('this.virtualScrollSpacerSize$', this.virtualScrollSpacerSize$);
4564
+ // txo.observe('this.virtualRows$', this.virtualRows$);
4565
+ // txo.observe('this.tableBodyHeight$', this.tableBodyHeight$);
4566
+ // txo.observe('this.virtualScrollActive$', this.virtualScrollActive$);
4567
+ }
4568
+ ngAfterViewInit() {
4569
+ super.ngAfterViewInit();
4570
+ if (this.scrollViewport) {
4571
+ const { observe } = Dsl.disposeWith(this);
4572
+ this.scrollViewport.elementScrolled().subscribe(() => this.notifyScrolled());
4573
+ }
4248
4574
  }
4249
4575
  get hideHeader() {
4250
4576
  return !this.showHeader;
4251
4577
  }
4578
+ get headerHeightCssVar() {
4579
+ return `${this.headerHeight$.value}px`;
4580
+ }
4581
+ get rowHeightCssVar() {
4582
+ return `${this.rowHeight$.value}px`;
4583
+ }
4252
4584
  isEditing(row) {
4253
4585
  return !!this.tableModel.getEditSessionFor(row);
4254
4586
  }
@@ -4273,8 +4605,34 @@ class TableBodyComponent extends ResizeAwareComponent {
4273
4605
  }
4274
4606
  return classes;
4275
4607
  }
4276
- 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 });
4277
- 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"] }] });
4608
+ scheduleTableHeightCheck(waitMillis = 50) {
4609
+ setTimeout(() => {
4610
+ const tbody = this.elementRef.nativeElement.querySelector("tbody");
4611
+ const bodyHeight = tbody.offsetHeight;
4612
+ if (this.data$.length > 0 && bodyHeight < this.rowHeight$.value) {
4613
+ // Hacks to get our virtual scroll to repaint
4614
+ // Logger.get(this).log(`rowCount=${this.data$.length}, bodyHeight=${bodyHeight} -> virtual table not rendering, triggering resize to force repaint`)
4615
+ window.dispatchEvent(new Event('resize'));
4616
+ if (waitMillis < 500) {
4617
+ this.scheduleTableHeightCheck(waitMillis + 50);
4618
+ }
4619
+ }
4620
+ }, waitMillis);
4621
+ }
4622
+ notifyScrolled() {
4623
+ this.virtualScrollActive$.value = true;
4624
+ this.clearScrollTimeout();
4625
+ this.scrollTimeout = setTimeout(() => {
4626
+ return this.virtualScrollActive$.value = false;
4627
+ }, 200);
4628
+ }
4629
+ clearScrollTimeout() {
4630
+ if (this.scrollTimeout) {
4631
+ clearTimeout(this.scrollTimeout);
4632
+ }
4633
+ }
4634
+ 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 });
4635
+ 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", 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]=\"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 </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 </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.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: i1$2.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: i4$5.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"] }] });
4278
4636
  }
4279
4637
  __decorate([
4280
4638
  Proxify(),
@@ -4292,10 +4650,23 @@ __decorate([
4292
4650
  StoreInValueModel(),
4293
4651
  __metadata("design:type", Object)
4294
4652
  ], TableBodyComponent.prototype, "showHeader", null);
4653
+ __decorate([
4654
+ Proxify(),
4655
+ __metadata("design:type", ValueModel)
4656
+ ], TableBodyComponent.prototype, "scrollMode$", null);
4657
+ __decorate([
4658
+ StoreInValueModel(),
4659
+ __metadata("design:type", String)
4660
+ ], TableBodyComponent.prototype, "scrollMode", null);
4295
4661
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableBodyComponent, decorators: [{
4296
4662
  type: Component,
4297
- 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"] }]
4298
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { data$: [{
4663
+ 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]=\"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 </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 </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"] }]
4664
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
4665
+ type: Inject,
4666
+ args: [AUP_TABLE_VIRTUAL_SCROLL_BUFFER_MULTIPLIER]
4667
+ }, {
4668
+ type: Optional
4669
+ }] }]; }, propDecorators: { data$: [{
4299
4670
  type: Input
4300
4671
  }], tableModel: [{
4301
4672
  type: Input
@@ -4303,21 +4674,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
4303
4674
  type: Input
4304
4675
  }], showHeader: [{
4305
4676
  type: Input
4306
- }], visibleRowCount: [{
4307
- type: Output
4308
4677
  }], trackBy: [{
4309
4678
  type: Input
4310
- }], enableScrolling: [{
4679
+ }], scrollMode$: [{
4680
+ type: Input
4681
+ }], scrollMode: [{
4311
4682
  type: Input
4312
4683
  }, {
4313
4684
  type: HostBinding,
4314
- args: ["class.enable-scrolling"]
4685
+ args: ["attr.scrollMode"]
4686
+ }], scrollViewport: [{
4687
+ type: ViewChild,
4688
+ args: [CdkVirtualScrollViewport]
4315
4689
  }], baseCssClass: [{
4316
4690
  type: HostBinding,
4317
4691
  args: ["class"]
4318
4692
  }], hideHeader: [{
4319
4693
  type: HostBinding,
4320
4694
  args: ["class.hide-header"]
4695
+ }], headerHeightCssVar: [{
4696
+ type: HostBinding,
4697
+ args: ["style.--aup-table-header-height"]
4698
+ }], rowHeightCssVar: [{
4699
+ type: HostBinding,
4700
+ args: ["style.--aup-table-row-height"]
4321
4701
  }] } });
4322
4702
 
4323
4703
  class TableMoreMenuPopupComponent extends DisposableComponent {
@@ -4438,8 +4818,10 @@ class TableFilterModel extends GarbageCollector {
4438
4818
  this.useSearchText(options.searchText$);
4439
4819
  this.useRowPredicate(options.predicate$);
4440
4820
  const { chain } = Dsl.disposeWith(this);
4441
- const textSearchRegex$ = chain(this._searchText$).map(text => {
4442
- return isEmpty$1(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4821
+ const textSearchRegex$ = chain(this._searchText$)
4822
+ .debounce(250)
4823
+ .map(text => {
4824
+ return isEmpty(text) ? undefined : new RegExp(escapeStringRegexp(text), "i");
4443
4825
  }, { allowNil: true });
4444
4826
  this._rowPredicate = chain(this._rowPredicate$)
4445
4827
  .map(predicate => {
@@ -4647,28 +5029,14 @@ class TableComponent extends AbstractTableComponent {
4647
5029
  #filterModel_accessor_storage = proxify((TableFilterModel));
4648
5030
  get filterModel() { return this.#filterModel_accessor_storage; }
4649
5031
  set filterModel(value) { this.#filterModel_accessor_storage = value; }
4650
- #enablePaging$_accessor_storage = proxify((ValueModel));
4651
- get enablePaging$() { return this.#enablePaging$_accessor_storage; }
4652
- set enablePaging$(value) { this.#enablePaging$_accessor_storage = value; }
4653
- #enablePaging_accessor_storage = false;
4654
- get enablePaging() { return this.#enablePaging_accessor_storage; }
4655
- set enablePaging(value) { this.#enablePaging_accessor_storage = value; }
4656
- // enablePaging() {
4657
- // if (isNil(this.pageController)) {
4658
- // const pagedListModel = this.registerDisposable(PagedListModel.create(this._visibleRows$.getDelegate(), this._pageSize));
4659
- // this._visibleRows$.setDelegate(pagedListModel);
4660
- // this._pageController = pagedListModel.pageController;
4661
- // }
4662
- // }
5032
+ tableBody;
4663
5033
  _footerContentAdded = false;
4664
5034
  _filteredRows$ = this.registerDisposable(new DelegatingListModel());
4665
- _pageSize = new MutableValueModel();
4666
- pagedListModel;
5035
+ scrollMode$;
4667
5036
  constructor(injector) {
4668
5037
  super(injector);
4669
- const { when } = Dsl.disposeWith(this);
4670
- this.onDispose(() => this.disposeOfPagedListModel());
4671
- when(this.enablePaging$).changes(enabled => this.configurePaging(enabled));
5038
+ const { chain, when } = Dsl.disposeWith(this);
5039
+ this.scrollMode$ = chain(this.enableScrolling$).map(enabled => enabled ? "virtual" : "none");
4672
5040
  }
4673
5041
  ngOnInit() {
4674
5042
  super.ngOnInit();
@@ -4680,76 +5048,42 @@ class TableComponent extends AbstractTableComponent {
4680
5048
  else {
4681
5049
  this._filteredRows$.setDelegate(this._dataSource$);
4682
5050
  }
4683
- this.configurePaging(this.enablePaging$.value);
5051
+ this._visibleRows$.setDelegate(this._filteredRows$);
5052
+ // let users of the model know what the current visible and filtered rows are for selection models and what not
4684
5053
  this.tableModel.bindToTable(this._filteredRows$, this._visibleRows$);
4685
5054
  }
4686
5055
  getModel() {
4687
5056
  return this.tableModel;
4688
5057
  }
4689
- get pageController() {
4690
- // TODO: need to support external page controllers if the paging occurs to our primary data source.
4691
- return this.pagedListModel.pageController;
4692
- }
4693
- configurePaging(enable) {
4694
- if (enable) {
4695
- if (!this.pagedListModel) {
4696
- this.pagedListModel = PagedListModel.create(this._filteredRows$, this._pageSize);
4697
- }
4698
- this._visibleRows$.setDelegate(this.pagedListModel);
4699
- }
4700
- else {
4701
- this.disposeOfPagedListModel();
4702
- this._visibleRows$.setDelegate(this._filteredRows$);
4703
- }
4704
- }
4705
- disposeOfPagedListModel() {
4706
- if (this.pagedListModel) {
4707
- this.pagedListModel.dispose();
4708
- this.pagedListModel = null;
4709
- }
4710
- }
4711
5058
  footerContentChanged($event) {
4712
5059
  // console.log($event);
4713
5060
  this._footerContentAdded = true;
4714
5061
  }
4715
- //@Trace()
4716
- updatePageSize(count) {
4717
- this._pageSize.value = count;
4718
- }
4719
5062
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
4720
- 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: [
5063
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TableComponent, selector: "aup-table", inputs: { tableModel: "tableModel", filterModel: "filterModel" }, providers: [
4721
5064
  { provide: AbstractTableComponent, useExisting: TableComponent }
4722
- ], 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"] }] });
5065
+ ], viewQueries: [{ propertyName: "tableBody", first: true, predicate: TableBodyComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"tableModel\"\n [showHeader$]=\"showHeader$\"\n [scrollMode$]=\"scrollMode$\"\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", "showHeader$", "showHeader", "trackBy", "scrollMode$", "scrollMode"] }] });
4723
5066
  }
4724
5067
  __decorate([
4725
5068
  Proxify(),
4726
- __metadata("design:type", Object)
5069
+ __metadata("design:type", TableModel)
4727
5070
  ], TableComponent.prototype, "tableModel", null);
4728
5071
  __decorate([
4729
5072
  Proxify(),
4730
5073
  __metadata("design:type", Object)
4731
5074
  ], TableComponent.prototype, "filterModel", null);
4732
- __decorate([
4733
- Proxify(),
4734
- __metadata("design:type", Object)
4735
- ], TableComponent.prototype, "enablePaging$", null);
4736
- __decorate([
4737
- StoreInValueModel(),
4738
- __metadata("design:type", Object)
4739
- ], TableComponent.prototype, "enablePaging", null);
4740
5075
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TableComponent, decorators: [{
4741
5076
  type: Component,
4742
5077
  args: [{ selector: 'aup-table', providers: [
4743
5078
  { provide: AbstractTableComponent, useExisting: TableComponent }
4744
- ], 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"] }]
5079
+ ], template: "<aup-table-body [data$]=\"visibleRows$\"\n [tableModel]=\"tableModel\"\n [showHeader$]=\"showHeader$\"\n [scrollMode$]=\"scrollMode$\"\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"] }]
4745
5080
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { tableModel: [{
4746
5081
  type: Input
4747
5082
  }], filterModel: [{
4748
5083
  type: Input
4749
- }], enablePaging$: [{
4750
- type: Input
4751
- }], enablePaging: [{
4752
- type: Input
5084
+ }], tableBody: [{
5085
+ type: ViewChild,
5086
+ args: [TableBodyComponent]
4753
5087
  }] } });
4754
5088
 
4755
5089
  const SVG_HEIGHT = 60;
@@ -4930,7 +5264,7 @@ var DecoratedTreeNode;
4930
5264
  }
4931
5265
  }
4932
5266
  __decorate([
4933
- Memoize(),
5267
+ MemoizeGet(),
4934
5268
  __metadata("design:type", Array),
4935
5269
  __metadata("design:paramtypes", [])
4936
5270
  ], Decorator.prototype, "children", null);
@@ -4983,7 +5317,7 @@ var DecoratedTreeNode;
4983
5317
  __metadata("design:returntype", Array)
4984
5318
  ], Decorator.prototype, "ancestors", null);
4985
5319
  __decorate([
4986
- Memoize(),
5320
+ MemoizeGet(),
4987
5321
  __metadata("design:type", Number),
4988
5322
  __metadata("design:paramtypes", [])
4989
5323
  ], Decorator.prototype, "depth", null);
@@ -4994,8 +5328,8 @@ class TreeLabelColumnModel extends ColumnModel {
4994
5328
  expansionModel;
4995
5329
  labelFactory = () => undefined;
4996
5330
  iconFactory;
4997
- constructor(columnId, textPropertiesProvider, expansionModel) {
4998
- super(columnId, textPropertiesProvider);
5331
+ constructor(columnId, order, textPropertiesProvider, expansionModel) {
5332
+ super(columnId, order, textPropertiesProvider);
4999
5333
  this.expansionModel = expansionModel;
5000
5334
  this.cellRenderer(TreeLabelCellRendererComponent);
5001
5335
  }
@@ -5063,7 +5397,7 @@ class TreeTableModel extends AbstractTableModel {
5063
5397
  }
5064
5398
  treeControlColumn(builder) {
5065
5399
  const columnId = 'tree-label';
5066
- const column = new TreeLabelColumnModel(columnId, () => this.getColumnTextProperties(columnId), this);
5400
+ const column = new TreeLabelColumnModel(columnId, this.columnManager, () => this.getColumnTextProperties(columnId), this);
5067
5401
  builder(column);
5068
5402
  this.addColumn(column);
5069
5403
  }
@@ -5389,8 +5723,11 @@ class TreeTableComponent extends AbstractTableComponent {
5389
5723
  #expansionModel_accessor_storage = proxify((TreeExpansionModel));
5390
5724
  get expansionModel() { return this.#expansionModel_accessor_storage; }
5391
5725
  set expansionModel(value) { this.#expansionModel_accessor_storage = value; }
5726
+ scrollMode$;
5392
5727
  constructor(injector) {
5393
5728
  super(injector);
5729
+ const { chain } = Dsl.disposeWith(this);
5730
+ this.scrollMode$ = chain(this.enableScrolling$).map(enabled => enabled ? "virtual" : "none");
5394
5731
  }
5395
5732
  ngOnInit() {
5396
5733
  super.ngOnInit();
@@ -5410,7 +5747,7 @@ class TreeTableComponent extends AbstractTableComponent {
5410
5747
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: TreeTableComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
5411
5748
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: TreeTableComponent, selector: "aup-tree-table", inputs: { treeTableModel: "treeTableModel", expansionModel: "expansionModel" }, providers: [
5412
5749
  { provide: AbstractTableComponent, useExisting: TreeTableComponent }
5413
- ], 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"] }] });
5750
+ ], 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", "showHeader$", "showHeader", "trackBy", "scrollMode$", "scrollMode"] }] });
5414
5751
  }
5415
5752
  __decorate([
5416
5753
  Proxify(),
@@ -5424,7 +5761,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5424
5761
  type: Component,
5425
5762
  args: [{ selector: 'aup-tree-table', providers: [
5426
5763
  { provide: AbstractTableComponent, useExisting: TreeTableComponent }
5427
- ], 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"] }]
5764
+ ], 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"] }]
5428
5765
  }], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { treeTableModel: [{
5429
5766
  type: Input
5430
5767
  }], expansionModel: [{
@@ -5606,6 +5943,7 @@ class ComponentsModule {
5606
5943
  FocusableComponent,
5607
5944
  CardContainerComponent,
5608
5945
  TableComponent,
5946
+ TableRowAttributesDirective,
5609
5947
  EditRowControlsComponent,
5610
5948
  ColumnTemplateDirective,
5611
5949
  DefaultCellRendererComponent,
@@ -5639,7 +5977,8 @@ class ComponentsModule {
5639
5977
  MarkdownComponent,
5640
5978
  TableBodyComponent,
5641
5979
  TableMoreMenuComponent,
5642
- TableMoreMenuPopupComponent], imports: [CommonModule,
5980
+ TableMoreMenuPopupComponent,
5981
+ SearchInputComponent], imports: [CommonModule,
5643
5982
  BrowserAnimationsModule,
5644
5983
  FormsModule,
5645
5984
  MatInputModule,
@@ -5658,7 +5997,9 @@ class ComponentsModule {
5658
5997
  MatMenuModule,
5659
5998
  MatDividerModule,
5660
5999
  MatProgressSpinnerModule,
5661
- MatProgressBarModule], exports: [NumberInputComponent,
6000
+ MatProgressBarModule,
6001
+ ScrollingModule,
6002
+ TableVirtualScrollModule], exports: [NumberInputComponent,
5662
6003
  StringInputComponent,
5663
6004
  TextInputComponent,
5664
6005
  PasswordInputComponent,
@@ -5696,7 +6037,8 @@ class ComponentsModule {
5696
6037
  LoadingContainerComponent,
5697
6038
  MarkdownComponent,
5698
6039
  TableMoreMenuComponent,
5699
- TableMoreMenuPopupComponent] });
6040
+ TableMoreMenuPopupComponent,
6041
+ SearchInputComponent] });
5700
6042
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, providers: [
5701
6043
  FocusBindingFactory,
5702
6044
  MarkdownService
@@ -5719,7 +6061,9 @@ class ComponentsModule {
5719
6061
  MatMenuModule,
5720
6062
  MatDividerModule,
5721
6063
  MatProgressSpinnerModule,
5722
- MatProgressBarModule] });
6064
+ MatProgressBarModule,
6065
+ ScrollingModule,
6066
+ TableVirtualScrollModule] });
5723
6067
  }
5724
6068
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ComponentsModule, decorators: [{
5725
6069
  type: NgModule,
@@ -5744,7 +6088,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5744
6088
  MatMenuModule,
5745
6089
  MatDividerModule,
5746
6090
  MatProgressSpinnerModule,
5747
- MatProgressBarModule
6091
+ MatProgressBarModule,
6092
+ ScrollingModule,
6093
+ TableVirtualScrollModule
5748
6094
  ],
5749
6095
  declarations: [
5750
6096
  AbstractInputComponent,
@@ -5768,6 +6114,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5768
6114
  FocusableComponent,
5769
6115
  CardContainerComponent,
5770
6116
  TableComponent,
6117
+ TableRowAttributesDirective,
5771
6118
  EditRowControlsComponent,
5772
6119
  ColumnTemplateDirective,
5773
6120
  DefaultCellRendererComponent,
@@ -5802,6 +6149,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5802
6149
  TableBodyComponent,
5803
6150
  TableMoreMenuComponent,
5804
6151
  TableMoreMenuPopupComponent,
6152
+ SearchInputComponent
5805
6153
  ],
5806
6154
  exports: [
5807
6155
  NumberInputComponent,
@@ -5843,6 +6191,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5843
6191
  MarkdownComponent,
5844
6192
  TableMoreMenuComponent,
5845
6193
  TableMoreMenuPopupComponent,
6194
+ SearchInputComponent
5846
6195
  ],
5847
6196
  providers: [
5848
6197
  FocusBindingFactory,
@@ -5851,6 +6200,67 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5851
6200
  }]
5852
6201
  }] });
5853
6202
 
6203
+ class LoadableComponent extends DisposableComponent {
6204
+ #_loaded$ = new MutableValueModel();
6205
+ #asyncLoadables = [];
6206
+ #awaitedLoadables = [];
6207
+ get loaded$() {
6208
+ return this.#_loaded$.readonly$;
6209
+ }
6210
+ ngOnInit() {
6211
+ super.ngOnInit();
6212
+ this.#asyncLoadables.forEach(it => it.ensureLoaded());
6213
+ if (this.#awaitedLoadables.length > 0) {
6214
+ Promise.all(this.#awaitedLoadables.map(it => {
6215
+ return it.ensureLoaded(); //.then(() => console.log(`${it.constructor.name} loaded`));
6216
+ })).then(() => {
6217
+ this.#_loaded$.value = true;
6218
+ });
6219
+ }
6220
+ else {
6221
+ this.#_loaded$.value = true;
6222
+ }
6223
+ }
6224
+ injectLoadable(token, options) {
6225
+ return this.registerLoadable(inject(token), options);
6226
+ }
6227
+ registerLoadable(loadable, options) {
6228
+ if (this.loaded$.value) {
6229
+ loadable.ensureLoaded();
6230
+ }
6231
+ else {
6232
+ if (!options || options.wait === true) {
6233
+ this.#awaitedLoadables.push(loadable);
6234
+ }
6235
+ else {
6236
+ this.#asyncLoadables.push(loadable);
6237
+ }
6238
+ }
6239
+ return loadable;
6240
+ }
6241
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
6242
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: LoadableComponent, usesInheritance: true, ngImport: i0 });
6243
+ }
6244
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: LoadableComponent, decorators: [{
6245
+ type: Directive
6246
+ }] });
6247
+
6248
+ class TextSearchContext {
6249
+ row;
6250
+ searchText;
6251
+ searchRegex;
6252
+ constructor(row, searchText, searchRegex) {
6253
+ this.row = row;
6254
+ this.searchText = searchText;
6255
+ this.searchRegex = searchRegex;
6256
+ }
6257
+ getOrCreate(type, create) {
6258
+ }
6259
+ matchesText(text) {
6260
+ return this.searchRegex.test(text);
6261
+ }
6262
+ }
6263
+
5854
6264
  /**
5855
6265
  * @file Automatically generated by barrelsby.
5856
6266
  */
@@ -5877,7 +6287,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5877
6287
  * </aup-activity-actions>
5878
6288
  */
5879
6289
  class ActivityActionsComponent extends DisposableComponent {
5880
- cdr;
5881
6290
  confirmCommandComponent;
5882
6291
  cancelCommandComponent;
5883
6292
  #confirmCommand_accessor_storage = proxify((Command));
@@ -5906,9 +6315,8 @@ class ActivityActionsComponent extends DisposableComponent {
5906
6315
  }
5907
6316
  layout = ActivityActionsComponent.Layout.BLOCK;
5908
6317
  align = ActivityActionsComponent.Align.STRETCH;
5909
- constructor(cdr) {
6318
+ constructor() {
5910
6319
  super();
5911
- this.cdr = cdr;
5912
6320
  }
5913
6321
  hasConfirmFace() {
5914
6322
  return !!this.confirmFace;
@@ -5927,8 +6335,8 @@ class ActivityActionsComponent extends DisposableComponent {
5927
6335
  focusCancel() {
5928
6336
  this.cancelCommandComponent.requestFocus();
5929
6337
  }
5930
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
5931
- 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"] }] });
6338
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6339
+ 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=\"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)}: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"] }] });
5932
6340
  }
5933
6341
  __decorate([
5934
6342
  Proxify(),
@@ -5940,8 +6348,8 @@ __decorate([
5940
6348
  ], ActivityActionsComponent.prototype, "cancelCommand", null);
5941
6349
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityActionsComponent, decorators: [{
5942
6350
  type: Component,
5943
- 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"] }]
5944
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { confirmCommandComponent: [{
6351
+ 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)}: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"] }]
6352
+ }], ctorParameters: function () { return []; }, propDecorators: { confirmCommandComponent: [{
5945
6353
  type: ViewChild,
5946
6354
  args: ["confirmCommandComponent"]
5947
6355
  }], cancelCommandComponent: [{
@@ -5984,7 +6392,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
5984
6392
 
5985
6393
  const ACTIVITY_DATA = new InjectionToken("InteractionActivityData");
5986
6394
  // eslint-disable-next-line @angular-eslint/component-class-suffix
5987
- class Activity extends DisposableComponent {
6395
+ class Activity extends LoadableComponent {
5988
6396
  activityData = inject(ACTIVITY_DATA);
5989
6397
  activityReadyListeners = new EventListenerList();
5990
6398
  _busy$ = this.registerDisposable(new DelegatingValueModel().withDefault(false));
@@ -6039,7 +6447,6 @@ class Activity extends DisposableComponent {
6039
6447
  notifyActivityReady() {
6040
6448
  this.activityReadyListeners.fire(l => l(this));
6041
6449
  this._ready$.value = true;
6042
- console.log("ready");
6043
6450
  }
6044
6451
  onActivityReady(callback) {
6045
6452
  return this.activityReadyListeners.add(callback);
@@ -6159,7 +6566,7 @@ class AbstractDialogComponent extends Activity {
6159
6566
  }
6160
6567
  }
6161
6568
  isDestructive() {
6162
- return isFunction$1(this.config['destructive']) && this.config["destructive"]();
6569
+ return isFunction(this.config['destructive']) && this.config["destructive"]();
6163
6570
  }
6164
6571
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractDialogComponent, deps: [{ token: ALERT_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
6165
6572
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractDialogComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
@@ -6176,6 +6583,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6176
6583
 
6177
6584
  class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6178
6585
  cancelFace;
6586
+ confirmClass = "aup-confirm-activity";
6179
6587
  constructor(config) {
6180
6588
  super(config);
6181
6589
  this.cancelFace = {
@@ -6186,7 +6594,7 @@ class AbstractConfirmDialogComponent extends AbstractDialogComponent {
6186
6594
  });
6187
6595
  }
6188
6596
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractConfirmDialogComponent, deps: [{ token: ALERT_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
6189
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.9", type: AbstractConfirmDialogComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
6597
+ 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 });
6190
6598
  }
6191
6599
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: AbstractConfirmDialogComponent, decorators: [{
6192
6600
  type: Component,
@@ -6196,7 +6604,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
6196
6604
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
6197
6605
  type: Inject,
6198
6606
  args: [ALERT_CONFIG]
6199
- }] }]; } });
6607
+ }] }]; }, propDecorators: { confirmClass: [{
6608
+ type: HostBinding,
6609
+ args: ["class"]
6610
+ }] } });
6200
6611
 
6201
6612
  class ActivityBodyComponent extends DisposableComponent {
6202
6613
  fullWidth = false;
@@ -6735,7 +7146,7 @@ const ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');
6735
7146
  // return true;
6736
7147
  // }
6737
7148
  // }
6738
- class PlaceComponent extends DisposableComponent {
7149
+ class PlaceComponent extends LoadableComponent {
6739
7150
  _placeReadyCallbacks = [];
6740
7151
  visitModel = new MutableValueModel();
6741
7152
  _inVisitUpdate = new Guard();
@@ -6792,6 +7203,7 @@ class PlaceComponent extends DisposableComponent {
6792
7203
  */
6793
7204
  installAndInitialiseBinding(initialVisit, parameterDef) {
6794
7205
  const model = this[parameterDef.propertyName];
7206
+ assert.notNil(model);
6795
7207
  DebugContext.tag(model, `${this.placeDefinition.component.name}.${parameterDef.propertyName}`);
6796
7208
  const binding = this.registerDisposable(new Binding(this.visitModel, model, {
6797
7209
  toRight(visit) {
@@ -6876,7 +7288,7 @@ class PlaceComponent extends DisposableComponent {
6876
7288
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.9", type: PlaceComponent, usesInheritance: true, ngImport: i0 });
6877
7289
  }
6878
7290
  __decorate([
6879
- Memoize(),
7291
+ MemoizeGet(),
6880
7292
  __metadata("design:type", PlaceDefinition),
6881
7293
  __metadata("design:paramtypes", [])
6882
7294
  ], PlaceComponent.prototype, "placeDefinition", null);
@@ -7066,7 +7478,7 @@ class Visit {
7066
7478
  getRouterCommands() {
7067
7479
  return this.segments.reduce((result, v) => {
7068
7480
  const path = v.placeDefinition.path;
7069
- return isEmpty$1(path) ?
7481
+ return isEmpty(path) ?
7070
7482
  [...result, path] : // Angular doesn't support route params on empty path segments
7071
7483
  [...result, path, ...v.createRouterCommands()];
7072
7484
  }, []);
@@ -7082,7 +7494,7 @@ class Visit {
7082
7494
  }
7083
7495
  }
7084
7496
  __decorate([
7085
- Memoize$1(),
7497
+ Memoize(),
7086
7498
  __metadata("design:type", Function),
7087
7499
  __metadata("design:paramtypes", [PlaceDefinition]),
7088
7500
  __metadata("design:returntype", VisitSegment)
@@ -7463,10 +7875,7 @@ class SynchroniseInteractionContextIdsWithRoute extends NavigationSession {
7463
7875
  return true;
7464
7876
  }
7465
7877
  notifyActive() {
7466
- // TODO: Do I still need this??
7467
- setTimeout(() => {
7468
- this.syncInteractionIdsWithRouter();
7469
- });
7878
+ this.syncInteractionIdsWithRouter();
7470
7879
  }
7471
7880
  // @Trace()
7472
7881
  onRouterEnd(event) {
@@ -8209,7 +8618,7 @@ class ConsolidatedParameterMap {
8209
8618
  }
8210
8619
  }
8211
8620
  __decorate([
8212
- Memoize(),
8621
+ MemoizeGet(),
8213
8622
  __metadata("design:type", Array),
8214
8623
  __metadata("design:paramtypes", [])
8215
8624
  ], ConsolidatedParameterMap.prototype, "keys", null);
@@ -8287,7 +8696,7 @@ class UrlSnapshot {
8287
8696
  return this.getPrimaryUrlSegments().find(s => s.path === placeDef.path);
8288
8697
  }
8289
8698
  isLastPlaceInUrl(placeDef) {
8290
- return last$1(this.getPrimaryUrlSegments()).path === placeDef.path;
8699
+ return last(this.getPrimaryUrlSegments()).path === placeDef.path;
8291
8700
  }
8292
8701
  createVisitSegmentFor(placeDef) {
8293
8702
  return new VisitSegment(placeDef, new ConsolidatedParameterMap(this.getPrimaryUrlSegments()));
@@ -8743,11 +9152,11 @@ class ActivityTitleComponent extends DisposableComponent {
8743
9152
  return this._color;
8744
9153
  }
8745
9154
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityTitleComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
8746
- 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"] });
9155
+ 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"] });
8747
9156
  }
8748
9157
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityTitleComponent, decorators: [{
8749
9158
  type: Component,
8750
- args: [{ selector: 'aup-activity-title', template: "<ng-content></ng-content>\n", styles: [":host{display:block}\n"] }]
9159
+ 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"] }]
8751
9160
  }], propDecorators: { hasTransparentBackground: [{
8752
9161
  type: Input
8753
9162
  }, {
@@ -9012,6 +9421,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9012
9421
  tabs;
9013
9422
  activityOutlets;
9014
9423
  activityRefs = [];
9424
+ animationDuration = "500ms";
9015
9425
  _identifier;
9016
9426
  _deferredCleanUp;
9017
9427
  interactionServiceApi;
@@ -9024,6 +9434,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9024
9434
  busy = this.registerDisposable(new DelegatingValueModel().withDefault(false));
9025
9435
  syncTabsJob = undefined;
9026
9436
  stable$;
9437
+ wasActive = false;
9027
9438
  constructor(placeRouter) {
9028
9439
  super();
9029
9440
  this.placeRouter = placeRouter;
@@ -9060,7 +9471,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9060
9471
  * Returns true if an activity is currently running.
9061
9472
  */
9062
9473
  isActive() {
9063
- return this.getActiveActivityCount() > 0;
9474
+ const isActive = this.getActiveActivityCount() > 0;
9475
+ // if (this.wasActive !== isActive) {
9476
+ // console.log({was: this.wasActive, is: isActive});
9477
+ // }
9478
+ // this.wasActive = isActive
9479
+ return isActive;
9064
9480
  }
9065
9481
  registerDisposable(disposable) {
9066
9482
  return this.garbage.registerDisposable(disposable);
@@ -9143,7 +9559,7 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9143
9559
  // by activity index)
9144
9560
  setTimeout(() => {
9145
9561
  this.activityRefs = []; // we have to do it after the animation timeout or the activity disappears before the animatin finsihes
9146
- }, this.getTabAnimationDuration());
9562
+ }, this.getTabAnimationDurationInMillis());
9147
9563
  const promise = this.interactionServiceApi.notifyFinished(this);
9148
9564
  this._deferredCleanUp = promise
9149
9565
  .finally(() => {
@@ -9169,7 +9585,6 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9169
9585
  /**
9170
9586
  * Synchronises the selected tab index.
9171
9587
  */
9172
- // @Trace()
9173
9588
  synchroniseSelectedTabIndex() {
9174
9589
  assert.isTruthy(this.isActive());
9175
9590
  const previousIndex = this.tabs.selectedIndex;
@@ -9181,10 +9596,10 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9181
9596
  activityRef.setFocused(false);
9182
9597
  this.busy.setDelegate(activityRef.activityBusy);
9183
9598
  this.tabs.selectedIndex = newIndex;
9184
- if (this.ready$.value) {
9185
- // Note: We're not using the animation done event as it's firing almost immeadiately.
9186
- setTimeout(() => this.finaliseActivityStates(), animate ? this.getTabAnimationDuration() : 0);
9187
- }
9599
+ // if (this.ready$.value) {
9600
+ // // Note: We're not using the animation done event as it's firing almost immeadiately.
9601
+ // setTimeout(() => this.finaliseActivityStates(), animate ? this.getTabAnimationDurationInMillis() : 0);
9602
+ // }
9188
9603
  }
9189
9604
  }
9190
9605
  finaliseActivityStates() {
@@ -9198,7 +9613,12 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9198
9613
  return this.activityOutlets.toArray()[this.tabs.selectedIndex];
9199
9614
  }
9200
9615
  getTabAnimationDuration() {
9201
- const match = this.tabs.animationDuration.match(/(\d+)(.*)/);
9616
+ // const s = this._started$.value ? this.animationDuration : "0";
9617
+ // return s
9618
+ return this.animationDuration;
9619
+ }
9620
+ getTabAnimationDurationInMillis() {
9621
+ const match = this.animationDuration.match(/(\d+)(.*)/);
9202
9622
  const numericValue = parseFloat(match[1]);
9203
9623
  switch (match[2].trim()) {
9204
9624
  case "ms":
@@ -9224,12 +9644,16 @@ class ActivityContainerComponent extends AbstractInteractionContext {
9224
9644
  }
9225
9645
  }, 75);
9226
9646
  }
9647
+ onAnimationDone() {
9648
+ this._started$.value = true;
9649
+ this.finaliseActivityStates();
9650
+ }
9227
9651
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityContainerComponent, deps: [{ token: PlaceRouter }], target: i0.ɵɵFactoryTarget.Component });
9228
- 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"] }] });
9652
+ 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$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"] }] });
9229
9653
  }
9230
9654
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ActivityContainerComponent, decorators: [{
9231
9655
  type: Component,
9232
- 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"] }]
9656
+ 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"] }]
9233
9657
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { dynamicHeight: [{
9234
9658
  type: Input
9235
9659
  }], tabs: [{
@@ -9238,6 +9662,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9238
9662
  }], activityOutlets: [{
9239
9663
  type: ViewChildren,
9240
9664
  args: [ActivityOutletComponent]
9665
+ }], animationDuration: [{
9666
+ type: Input
9241
9667
  }] } });
9242
9668
 
9243
9669
  class AbstractActivityTriggerComponent extends DisposableComponent {
@@ -9338,14 +9764,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9338
9764
  args: ['class.active']
9339
9765
  }] } });
9340
9766
 
9341
- const cssDurationRegex = /(\d+)(m?s)/;
9767
+ const cssDurationRegex$1 = /(\d+)(m?s)/;
9342
9768
  /**
9343
9769
  * @example
9344
9770
  * <aup-in-place-interaction-context #inPlaceInteractionContext>
9345
9771
  * </aup-in-place-interaction-context>
9346
9772
  *
9347
9773
  * in your component
9348
- * @ViewChild('inPlaceInteractionContext', { static: true })
9774
+ * @ViewChild(InPlaceInteractionContextComponent)
9349
9775
  * interactionContext: InteractionContext;
9350
9776
  *
9351
9777
  *
@@ -9368,7 +9794,7 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9368
9794
  return this.animateFirstActivity ? (this.tabConfig?.animationDuration || "500ms") : "0ms";
9369
9795
  }
9370
9796
  get animationDurationMillis() {
9371
- const result = cssDurationRegex.exec(this.animationDuration);
9797
+ const result = cssDurationRegex$1.exec(this.animationDuration);
9372
9798
  if (!result) {
9373
9799
  lang.illegalState(`unsupported css duration: ${this.animationDuration}`);
9374
9800
  }
@@ -9441,7 +9867,7 @@ class InPlaceInteractionContextComponent extends DisposableComponent {
9441
9867
  }
9442
9868
  }
9443
9869
  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 });
9444
- 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"] }] });
9870
+ 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", "animationDuration"] }] });
9445
9871
  }
9446
9872
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InPlaceInteractionContextComponent, decorators: [{
9447
9873
  type: Component,
@@ -9910,12 +10336,14 @@ class StringInputActivity extends InputActivity {
9910
10336
  [label]="activityData.label"
9911
10337
  [placeholder]="activityData.placeholder"
9912
10338
  [command.enter]="confirmCommand"
9913
- [command.escape]="cancelCommand"></aup-string-input>
10339
+ [command.escape]="cancelCommand"
10340
+ [dense]="true"
10341
+ ></aup-string-input>
9914
10342
  <aup-activity-actions [layout]="layout" align="end"
9915
10343
  [confirmFace]="confirmFace"
9916
10344
  [cancelFace]="cancelFace"
9917
10345
  ></aup-activity-actions>
9918
- `, 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"] }] });
10346
+ `, 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"] }] });
9919
10347
  }
9920
10348
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: StringInputActivity, decorators: [{
9921
10349
  type: Component,
@@ -9926,7 +10354,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
9926
10354
  [label]="activityData.label"
9927
10355
  [placeholder]="activityData.placeholder"
9928
10356
  [command.enter]="confirmCommand"
9929
- [command.escape]="cancelCommand"></aup-string-input>
10357
+ [command.escape]="cancelCommand"
10358
+ [dense]="true"
10359
+ ></aup-string-input>
9930
10360
  <aup-activity-actions [layout]="layout" align="end"
9931
10361
  [confirmFace]="confirmFace"
9932
10362
  [cancelFace]="cancelFace"
@@ -10192,6 +10622,7 @@ class SelectInputActivity extends InputActivity {
10192
10622
  [options]="options"
10193
10623
  [optionLabelFormat]="optionLabelFormat"
10194
10624
  [allowNil]="activityData.allowNil"
10625
+ [dense]="true"
10195
10626
  >
10196
10627
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10197
10628
  </aup-select-input>
@@ -10214,6 +10645,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10214
10645
  [options]="options"
10215
10646
  [optionLabelFormat]="optionLabelFormat"
10216
10647
  [allowNil]="activityData.allowNil"
10648
+ [dense]="true"
10217
10649
  >
10218
10650
  <ng-template #nilOptionTemplate>{{activityData.nilLabel}}</ng-template>
10219
10651
  </aup-select-input>
@@ -10225,6 +10657,182 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10225
10657
  }]
10226
10658
  }] });
10227
10659
 
10660
+ const slideDownOnEnterDef = style({
10661
+ opacity: 0,
10662
+ 'height': '0',
10663
+ 'max-height': '0',
10664
+ paddingTop: '0',
10665
+ paddingBottom: '0'
10666
+ });
10667
+ // TODO: params aren't getting customised in the view. Need to figure out the correct approach.
10668
+ const slideDownOnEnterAnimation = trigger('slideDownOnEnter', [
10669
+ transition(':enter', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10670
+ transition(':leave', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10671
+ ]);
10672
+ const slideDownWhenOpenAnimation = trigger('slideDownWhenOpen', [
10673
+ transition('closed => open', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10674
+ transition('open => closed', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
10675
+ ]);
10676
+ const slideLeftOnEnterDef = style({
10677
+ opacity: 0,
10678
+ 'width': '0',
10679
+ paddingLeft: '0',
10680
+ paddingRight: '0'
10681
+ });
10682
+ const slideRightOnEnterAnimation = trigger('slideRightOnEnter', [
10683
+ transition(':enter', [slideLeftOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
10684
+ transition(':leave', [animate('{{duration}}', slideLeftOnEnterDef)], { params: { duration: '100ms' } })
10685
+ ]);
10686
+ const ZERO_WIDTH = {
10687
+ opacity: 0,
10688
+ width: '0',
10689
+ paddingLeft: '0',
10690
+ paddingRight: '0',
10691
+ };
10692
+ const ZERO_HEIGHT = {
10693
+ opacity: 0,
10694
+ height: '0',
10695
+ paddingTop: '0',
10696
+ paddingBottom: '0',
10697
+ };
10698
+ const slideDownAndRightOnEnterAnimation = trigger('slideDownAndRightOnEnter', [
10699
+ transition(':enter', [
10700
+ style({ overflow: "hidden", whiteSpace: "nowrap", ...ZERO_WIDTH, ...ZERO_HEIGHT }),
10701
+ animate('{{duration}}')
10702
+ ], { params: { duration: '100ms' } }),
10703
+ transition(':leave', [
10704
+ style({ overflow: "hidden", whiteSpace: "nowrap" }),
10705
+ group([
10706
+ animate('{{duration}}', style(ZERO_HEIGHT)),
10707
+ // Hack: 100ms is too quick as it animates from * - 0 as we only see it animate the width is greater than the parent.
10708
+ // Not sure how to animate from * to natural new width of parent. This hack won't work for text that's just a little
10709
+ // bit wider than the parent as it'll fall within the parent bounds very early in the animation cycle.
10710
+ animate('300ms', style(ZERO_WIDTH)),
10711
+ ])
10712
+ ], { params: { duration: '100ms' } })
10713
+ ]);
10714
+
10715
+ const cssDurationRegex = /(\d+)(m?s)/;
10716
+ /**
10717
+ * This interaction context remains hidden (height: 0) until it is active.
10718
+ * @example
10719
+ * <aup-slide-down-interaction-context #inPlaceInteractionContext>
10720
+ * </aup-slide-down-interaction-context>
10721
+ *
10722
+ * in your component
10723
+ * @ViewChild(SlideDownInteractionContextComponent)
10724
+ * interactionContext: InteractionContext;
10725
+ *
10726
+ *
10727
+ */
10728
+ class SlideDownInteractionContextComponent extends DisposableComponent {
10729
+ tabConfig;
10730
+ activityContainerComponent;
10731
+ // NOTE: disabling this as I'm using the initialise callback to release the hacky height clamp.
10732
+ // The whole registration thing is a bit naf so I should really clean that up at some point.
10733
+ // /**
10734
+ // * If true the activity will sync with the router to enable back button support. This is a work around for
10735
+ // * deeply nested activities that can't be linked with the root place interactionContext hook for cancelling
10736
+ // * active interactions.
10737
+ // */
10738
+ // @Input()
10739
+ // syncWithRoutes = true;
10740
+ dynamicHeight = true;
10741
+ get active() {
10742
+ return this.isActive();
10743
+ }
10744
+ // Horrible hack to stop the div and activity container bouncing back for a bit in after closing. No idea why it's doing that.
10745
+ clampShut = true;
10746
+ interactionService = this.inject(InteractionService);
10747
+ constructor(tabConfig) {
10748
+ super();
10749
+ this.tabConfig = tabConfig;
10750
+ }
10751
+ ngAfterViewInit() {
10752
+ // NOTE: this is a temp work around to detach inplace contexts from the router until AUP-88 is implemented.
10753
+ // https://coolon.atlassian.net/browse/AUP-88?atlOrigin=eyJpIjoiOTg5YjEzZGUzZjRmNDg0NmExOWU3ZGJmMzJiNTRmNGYiLCJwIjoiaiJ9
10754
+ const self = this;
10755
+ this.activityContainerComponent.initialise("dont-care", {
10756
+ async notifyActive(interactionContext) {
10757
+ self.clampShut = false;
10758
+ return undefined;
10759
+ },
10760
+ async notifyFinished(interactionContext) {
10761
+ return undefined;
10762
+ }
10763
+ });
10764
+ // if (this.syncWithRoutes) {
10765
+ // this.interactionService.registerInplaceInteractionContext(this);
10766
+ // }
10767
+ }
10768
+ getAnimationState() {
10769
+ return {
10770
+ value: this.isActive() ? "open" : "closed",
10771
+ params: { duration: "200ms" }
10772
+ };
10773
+ }
10774
+ // this is a regsitration callback from the interaction service
10775
+ // @Trace() // webstorm says no usages... but I'm not sure.
10776
+ onInplaceInteractionContextRegistered(id, api) {
10777
+ this.activityContainerComponent.initialise(id, api);
10778
+ }
10779
+ get identifier() {
10780
+ return this.activityContainerComponent.identifier;
10781
+ }
10782
+ alert(alert) {
10783
+ return this.activityContainerComponent.alert(alert);
10784
+ }
10785
+ cancelActiveActivity() {
10786
+ return this.activityContainerComponent.cancelActiveActivity();
10787
+ }
10788
+ confirm(confirm) {
10789
+ return this.activityContainerComponent.confirm(confirm);
10790
+ }
10791
+ confirmOrReject(confirm) {
10792
+ return this.activityContainerComponent.confirmOrReject(confirm);
10793
+ }
10794
+ confirmThen(confirm, activityType, data) {
10795
+ return this.activityContainerComponent.confirmThen(confirm, activityType);
10796
+ }
10797
+ confirmThenExecute(confirm, operation) {
10798
+ return this.activityContainerComponent.confirmThenExecute(confirm, operation);
10799
+ }
10800
+ isActive() {
10801
+ return this.activityContainerComponent.isActive();
10802
+ }
10803
+ startActivity(activityType, data, options) {
10804
+ return this.activityContainerComponent.startActivity(activityType, data, options);
10805
+ }
10806
+ onAnimationDone() {
10807
+ if (!this.isActive()) {
10808
+ this.clampShut = true;
10809
+ }
10810
+ }
10811
+ 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 });
10812
+ 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: [
10813
+ slideDownWhenOpenAnimation
10814
+ ] });
10815
+ }
10816
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SlideDownInteractionContextComponent, decorators: [{
10817
+ type: Component,
10818
+ args: [{ selector: "aup-slide-down-interaction-context", animations: [
10819
+ slideDownWhenOpenAnimation
10820
+ ], 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"] }]
10821
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
10822
+ type: Inject,
10823
+ args: [MAT_TABS_CONFIG]
10824
+ }, {
10825
+ type: Optional
10826
+ }] }]; }, propDecorators: { activityContainerComponent: [{
10827
+ type: ViewChild,
10828
+ args: ["activityContainer", { static: true }]
10829
+ }], dynamicHeight: [{
10830
+ type: Input
10831
+ }], active: [{
10832
+ type: HostBinding,
10833
+ args: ["class.active"]
10834
+ }] } });
10835
+
10228
10836
  class InteractionContextTriggerForDirective extends GarbageCollector {
10229
10837
  aupInteractionContextTriggerFor;
10230
10838
  activityClass;
@@ -10307,6 +10915,7 @@ class InteractionModule {
10307
10915
  AlertDialogComponent,
10308
10916
  ActivityOutletComponent,
10309
10917
  InPlaceInteractionContextComponent,
10918
+ SlideDownInteractionContextComponent,
10310
10919
  AddItemInteractionContextComponent,
10311
10920
  ActivityActionsComponent,
10312
10921
  PopupInteractionContextComponent,
@@ -10333,8 +10942,6 @@ class InteractionModule {
10333
10942
  RouterModule,
10334
10943
  MatIconModule,
10335
10944
  DirectivesModule,
10336
- FlexModule,
10337
- GridModule,
10338
10945
  ComponentsModule,
10339
10946
  FormsModule,
10340
10947
  MatInputModule,
@@ -10354,7 +10961,8 @@ class InteractionModule {
10354
10961
  InlineActivityTriggerComponent,
10355
10962
  ModalActivityTriggerComponent,
10356
10963
  AddCardActivityComponent,
10357
- InlineStringEditorComponent] });
10964
+ InlineStringEditorComponent,
10965
+ SlideDownInteractionContextComponent] });
10358
10966
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: InteractionModule, providers: [
10359
10967
  InteractionService
10360
10968
  // {
@@ -10368,8 +10976,6 @@ class InteractionModule {
10368
10976
  RouterModule,
10369
10977
  MatIconModule,
10370
10978
  DirectivesModule,
10371
- FlexModule,
10372
- GridModule,
10373
10979
  ComponentsModule,
10374
10980
  FormsModule,
10375
10981
  MatInputModule,
@@ -10388,8 +10994,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10388
10994
  RouterModule,
10389
10995
  MatIconModule,
10390
10996
  DirectivesModule,
10391
- FlexModule,
10392
- GridModule,
10393
10997
  ComponentsModule,
10394
10998
  FormsModule,
10395
10999
  MatInputModule,
@@ -10404,6 +11008,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10404
11008
  AlertDialogComponent,
10405
11009
  ActivityOutletComponent,
10406
11010
  InPlaceInteractionContextComponent,
11011
+ SlideDownInteractionContextComponent,
10407
11012
  AddItemInteractionContextComponent,
10408
11013
  ActivityActionsComponent,
10409
11014
  PopupInteractionContextComponent,
@@ -10441,6 +11046,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10441
11046
  ModalActivityTriggerComponent,
10442
11047
  AddCardActivityComponent,
10443
11048
  InlineStringEditorComponent,
11049
+ SlideDownInteractionContextComponent,
10444
11050
  ],
10445
11051
  providers: [
10446
11052
  InteractionService
@@ -10511,7 +11117,6 @@ class PlaceOutletComponent extends DisposableComponent {
10511
11117
  router;
10512
11118
  placeRouter;
10513
11119
  placeConfig;
10514
- cdr;
10515
11120
  #animate$_accessor_storage = proxify((ValueModel));
10516
11121
  get animate$() { return this.#animate$_accessor_storage; }
10517
11122
  set animate$(value) { this.#animate$_accessor_storage = value; }
@@ -10545,12 +11150,11 @@ class PlaceOutletComponent extends DisposableComponent {
10545
11150
  animationEnabled;
10546
11151
  authorised;
10547
11152
  notAuthorisedNoticePortal;
10548
- constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet, cdr) {
11153
+ constructor(router, placeRouter, placeConfig, unauthorisedPlaceNotice, parentOutlet) {
10549
11154
  super();
10550
11155
  this.router = router;
10551
11156
  this.placeRouter = placeRouter;
10552
11157
  this.placeConfig = placeConfig;
10553
- this.cdr = cdr;
10554
11158
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
10555
11159
  this.parentOutletModel = new MutableValueModel(parentOutlet);
10556
11160
  const defaultPlaceAnimationOrder = chain(this.parentOutletModel)
@@ -10562,7 +11166,7 @@ class PlaceOutletComponent extends DisposableComponent {
10562
11166
  this.placesInAnimationOrder = chain(this.customPlaceAnimationOrder$)
10563
11167
  .otherwise(defaultPlaceAnimationOrder);
10564
11168
  this.activePlaceAnimationPosition = this.placesInAnimationOrder
10565
- .reduce((placesInOrder) => {
11169
+ .reduceAll((placesInOrder) => {
10566
11170
  let placeIndex = 0;
10567
11171
  if (activatePlaceType.value) {
10568
11172
  placeIndex = placesInOrder.indexOf(activatePlaceType.value);
@@ -10716,7 +11320,7 @@ class PlaceOutletComponent extends DisposableComponent {
10716
11320
  this.onAnimationFinishedJob = undefined;
10717
11321
  }
10718
11322
  }
10719
- 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 });
11323
+ 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 }], target: i0.ɵɵFactoryTarget.Component });
10720
11324
  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] });
10721
11325
  }
10722
11326
  __decorate([
@@ -10752,7 +11356,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
10752
11356
  type: SkipSelf
10753
11357
  }, {
10754
11358
  type: Optional
10755
- }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { animate$: [{
11359
+ }] }]; }, propDecorators: { animate$: [{
10756
11360
  type: Input
10757
11361
  }], animate: [{
10758
11362
  type: Input
@@ -10885,7 +11489,7 @@ class ListPlaceNavComponent extends AbstractPlaceNavigationComponent {
10885
11489
  super(router);
10886
11490
  }
10887
11491
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ListPlaceNavComponent, deps: [{ token: PlaceRouter }], target: i0.ɵɵFactoryTarget.Component });
10888
- 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"] }] });
11492
+ 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"] }] });
10889
11493
  }
10890
11494
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ListPlaceNavComponent, decorators: [{
10891
11495
  type: Component,
@@ -10960,7 +11564,7 @@ class SidePlaceNavigationComponent extends AbstractPlaceNavigationComponent {
10960
11564
  this.expanded = !this.expanded;
10961
11565
  }
10962
11566
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SidePlaceNavigationComponent, deps: [{ token: PlaceRouter }], target: i0.ɵɵFactoryTarget.Component });
10963
- 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"] }] });
11567
+ 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"] }] });
10964
11568
  }
10965
11569
  __decorate([
10966
11570
  Proxify(),
@@ -10972,7 +11576,7 @@ __decorate([
10972
11576
  ], SidePlaceNavigationComponent.prototype, "expanded", null);
10973
11577
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: SidePlaceNavigationComponent, decorators: [{
10974
11578
  type: Component,
10975
- 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"] }]
11579
+ 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"] }]
10976
11580
  }], ctorParameters: function () { return [{ type: PlaceRouter }]; }, propDecorators: { expanded$: [{
10977
11581
  type: Input
10978
11582
  }], expanded: [{
@@ -11013,7 +11617,6 @@ class PlaceModule {
11013
11617
  MatTooltipModule,
11014
11618
  MatIconModule,
11015
11619
  DirectivesModule,
11016
- FlexModule,
11017
11620
  ComponentsModule,
11018
11621
  PortalModule,
11019
11622
  MatCardModule], exports: [PlaceOutletComponent,
@@ -11030,7 +11633,6 @@ class PlaceModule {
11030
11633
  MatTooltipModule,
11031
11634
  MatIconModule,
11032
11635
  DirectivesModule,
11033
- FlexModule,
11034
11636
  ComponentsModule,
11035
11637
  PortalModule,
11036
11638
  MatCardModule] });
@@ -11048,7 +11650,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11048
11650
  MatTooltipModule,
11049
11651
  MatIconModule,
11050
11652
  DirectivesModule,
11051
- FlexModule,
11052
11653
  ComponentsModule,
11053
11654
  PortalModule,
11054
11655
  MatCardModule
@@ -11138,60 +11739,44 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11138
11739
  }]
11139
11740
  }] });
11140
11741
 
11141
- const slideDownOnEnterDef = style({
11142
- opacity: 0,
11143
- 'height': '0',
11144
- paddingTop: '0',
11145
- paddingBottom: '0'
11146
- });
11147
- // TODO: params aren't getting customised in the view. Need to figure out the correct approach.
11148
- const slideDownOnEnterAnimation = trigger('slideDownOnEnter', [
11149
- transition(':enter', [slideDownOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
11150
- transition(':leave', [animate('{{duration}}', slideDownOnEnterDef)], { params: { duration: '100ms' } })
11151
- ]);
11152
- const slideLeftOnEnterDef = style({
11153
- opacity: 0,
11154
- 'width': '0',
11155
- paddingLeft: '0',
11156
- paddingRight: '0'
11157
- });
11158
- const slideRightOnEnterAnimation = trigger('slideRightOnEnter', [
11159
- transition(':enter', [slideLeftOnEnterDef, animate('{{duration}}')], { params: { duration: '100ms' } }),
11160
- transition(':leave', [animate('{{duration}}', slideLeftOnEnterDef)], { params: { duration: '100ms' } })
11161
- ]);
11162
- const ZERO_WIDTH = {
11163
- opacity: 0,
11164
- width: '0',
11165
- paddingLeft: '0',
11166
- paddingRight: '0',
11167
- };
11168
- const ZERO_HEIGHT = {
11169
- opacity: 0,
11170
- height: '0',
11171
- paddingTop: '0',
11172
- paddingBottom: '0',
11173
- };
11174
- const slideDownAndRightOnEnterAnimation = trigger('slideDownAndRightOnEnter', [
11175
- transition(':enter', [
11176
- style({ overflow: "hidden", whiteSpace: "nowrap", ...ZERO_WIDTH, ...ZERO_HEIGHT }),
11177
- animate('{{duration}}')
11178
- ], { params: { duration: '100ms' } }),
11179
- transition(':leave', [
11180
- style({ overflow: "hidden", whiteSpace: "nowrap" }),
11181
- group([
11182
- animate('{{duration}}', style(ZERO_HEIGHT)),
11183
- // Hack: 100ms is too quick as it animates from * - 0 as we only see it animate the width is greater than the parent.
11184
- // Not sure how to animate from * to natural new width of parent. This hack won't work for text that's just a little
11185
- // bit wider than the parent as it'll fall within the parent bounds very early in the animation cycle.
11186
- animate('300ms', style(ZERO_WIDTH)),
11187
- ])
11188
- ], { params: { duration: '100ms' } })
11189
- ]);
11190
-
11191
11742
  /**
11192
11743
  * @file Automatically generated by barrelsby.
11193
11744
  */
11194
11745
 
11746
+ class ResizeObserverDirective extends DisposableComponent {
11747
+ aupOnResize = new EventEmitter();
11748
+ elementRef = this.inject(ElementRef);
11749
+ ngZone = this.inject(NgZone);
11750
+ _bounds$ = new MutableValueModel();
11751
+ ngAfterViewInit() {
11752
+ const element = this.elementRef.nativeElement;
11753
+ const ro = new ResizeObserver((entries, observer) => {
11754
+ this.ngZone.run(() => this._updateBounds());
11755
+ });
11756
+ ro.observe(element);
11757
+ this.onDispose(() => ro.disconnect());
11758
+ setTimeout(() => this._updateBounds());
11759
+ }
11760
+ get bounds$() {
11761
+ return this._bounds$.readonly$;
11762
+ }
11763
+ _updateBounds() {
11764
+ this._bounds$.value = Bounds.ofElement(this.elementRef.nativeElement);
11765
+ this.aupOnResize.emit(this._bounds$.value);
11766
+ }
11767
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
11768
+ 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 });
11769
+ }
11770
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ResizeObserverDirective, decorators: [{
11771
+ type: Directive,
11772
+ args: [{
11773
+ selector: "[aupOnResize]",
11774
+ standalone: true
11775
+ }]
11776
+ }], propDecorators: { aupOnResize: [{
11777
+ type: Output
11778
+ }] } });
11779
+
11195
11780
  /**
11196
11781
  * @file Automatically generated by barrelsby.
11197
11782
  */
@@ -11567,69 +12152,74 @@ var Formatter;
11567
12152
  Formatter.BOOLEAN = new BooleanType();
11568
12153
  })(Formatter || (Formatter = {}));
11569
12154
 
11570
- function installMechanics(parameterDef, prototype, propertyKey, tagPrefix) {
11571
- Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
11572
- function getMechanics(instance, propertyName) {
11573
- const key = `__mechanics_${propertyName.toString()}`;
11574
- if (!instance[key]) {
11575
- const backingModel = parameterDef.createBackingModel();
11576
- instance[key] = {
11577
- backingModel: backingModel,
11578
- binding: null
11579
- };
11580
- const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
11581
- DebugContext.getOrCreate(instance[key].backingModel).tag(tag);
11582
- }
11583
- return instance[key];
11584
- }
11585
- Object.defineProperty(prototype, propertyKey, {
11586
- get: function () {
11587
- return getMechanics(this, propertyKey).backingModel;
11588
- },
11589
- set: function (userModel) {
11590
- const mechanics = getMechanics(this, propertyKey);
11591
- // This handles the scenario where we want to push an existing value model (such as a form model)
11592
- // to and from the route.
11593
- if (mechanics.binding) {
11594
- mechanics.binding.dispose();
11595
- }
11596
- if (userModel) {
11597
- mechanics.binding = new Binding(mechanics.backingModel, userModel, {
11598
- toLeft: Functions.identity,
11599
- toRight: Functions.identity
11600
- });
11601
- if (parameterDef.isEmptyValue(userModel.value)) {
11602
- // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});
11603
- mechanics.binding.writeRight(); // push the visit into the user model;
11604
- }
11605
- else {
11606
- if (!parameterDef.isEmptyValue(mechanics.backingModel.value)) {
11607
- console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');
11608
- }
11609
- mechanics.binding.writeLeft(); // push the user model into the visit
11610
- }
11611
- }
11612
- }
11613
- });
11614
- }
12155
+ // function installMechanics<M extends HasValue<any>>(parameterDef: ParameterDefinition<any>, prototype: object, propertyKey: string | symbol, tagPrefix: string) {
12156
+ //
12157
+ // Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12158
+ //
12159
+ // function getMechanics(instance: M, propertyName: string | symbol) {
12160
+ // const key = `__mechanics_${propertyName.toString()}`;
12161
+ // if (!instance[key]) {
12162
+ // const backingModel = parameterDef.createBackingModel();
12163
+ // instance[key] = {
12164
+ // backingModel: backingModel,
12165
+ // binding: null as Binding<any, any>
12166
+ // };
12167
+ // const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
12168
+ // DebugContext.getOrCreate(instance[key].backingModel).tag(tag);
12169
+ // }
12170
+ // return instance[key];
12171
+ // }
12172
+ //
12173
+ // Object.defineProperty(prototype, propertyKey, {
12174
+ // get: function() {
12175
+ // return getMechanics(this, propertyKey).backingModel;
12176
+ // },
12177
+ // set: function(userModel: M) {
12178
+ // const mechanics = getMechanics(this, propertyKey);
12179
+ // // This handles the scenario where we want to push an existing value model (such as a form model)
12180
+ // // to and from the route.
12181
+ // if (mechanics.binding) {
12182
+ // mechanics.binding.dispose();
12183
+ // }
12184
+ // if (userModel) {
12185
+ // mechanics.binding = new Binding(mechanics.backingModel, userModel, {
12186
+ // toLeft: Functions.identity,
12187
+ // toRight: Functions.identity
12188
+ // });
12189
+ // if (parameterDef.isEmptyValue(userModel.value)) {
12190
+ // // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});
12191
+ // mechanics.binding.writeRight(); // push the visit into the user model;
12192
+ // } else {
12193
+ // if (!parameterDef.isEmptyValue(mechanics.backingModel.value)) {
12194
+ // console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');
12195
+ // }
12196
+ // mechanics.binding.writeLeft(); // push the user model into the visit
12197
+ // }
12198
+ // }
12199
+ // }
12200
+ // });
12201
+ // }
11615
12202
  function RouteId(formatter, options) {
11616
12203
  return (prototype, propertyKey) => {
11617
12204
  const parameterDef = new ParameterDefinition.RouteId(propertyKey.toString(), options, formatter);
11618
- installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12205
+ // installMechanics(parameterDef, prototype, propertyKey, '@RouteId');
12206
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
11619
12207
  };
11620
12208
  }
11621
12209
  function VisitParameter(options) {
11622
12210
  const opts = Opts.get(options);
11623
12211
  return (prototype, propertyKey) => {
11624
12212
  const parameterDef = new ParameterDefinition.ValueParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11625
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
12213
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12214
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameter');
11626
12215
  };
11627
12216
  }
11628
12217
  function VisitParameterList(options) {
11629
12218
  const opts = Opts.get(options);
11630
12219
  return (prototype, propertyKey) => {
11631
12220
  const parameterDef = new ParameterDefinition.ArrayParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));
11632
- installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
12221
+ Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, parameterDef);
12222
+ // installMechanics(parameterDef, prototype, propertyKey, '@VisitParameterList');
11633
12223
  };
11634
12224
  }
11635
12225
 
@@ -11723,5 +12313,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImpor
11723
12313
  * Generated bundle index. Do not edit.
11724
12314
  */
11725
12315
 
11726
- 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 };
12316
+ 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, 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, 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, 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, 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 };
11727
12317
  //# sourceMappingURL=coolon-angular-ui-powerups.mjs.map