@coolon/angular-ui-powerups 13.1.7 → 13.3.0

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 (114) hide show
  1. package/assets/table.scss +2 -2
  2. package/esm2020/lib/components/commands/command/command.component.mjs +18 -5
  3. package/esm2020/lib/components/components.module.mjs +22 -19
  4. package/esm2020/lib/components/exports.mjs +28 -21
  5. package/esm2020/lib/components/tables/abstract-table-model.mjs +70 -29
  6. package/esm2020/lib/components/tables/abstract-table.component.mjs +12 -10
  7. package/esm2020/lib/components/tables/column/column-list-model.mjs +39 -0
  8. package/esm2020/lib/components/tables/column/column-model.mjs +180 -0
  9. package/esm2020/lib/components/tables/column/column-template/column-template.directive.mjs +35 -0
  10. package/esm2020/lib/components/tables/column/column-text-properties.mjs +2 -0
  11. package/esm2020/lib/components/tables/column/custom-template-column-model.mjs +16 -0
  12. package/esm2020/lib/components/tables/column/custom-value-column-model.mjs +37 -0
  13. package/esm2020/lib/components/tables/column/editor-controls-column-model.mjs +21 -0
  14. package/esm2020/lib/components/tables/column/list-propery-column-model.mjs +48 -0
  15. package/esm2020/lib/components/tables/column/property-column-model.mjs +92 -0
  16. package/esm2020/lib/components/tables/column/selection-column-model.mjs +40 -0
  17. package/esm2020/lib/components/tables/editor/edit-row-controls/edit-row-controls.component.mjs +55 -0
  18. package/esm2020/lib/components/tables/editor/edit-session.mjs +23 -0
  19. package/esm2020/lib/components/tables/editor/editable-cell-renderer.mjs +2 -0
  20. package/esm2020/lib/components/tables/{table/paginator → paginator}/paginator.component.mjs +4 -4
  21. package/esm2020/lib/components/tables/renderer/cell-editors.mjs +2 -0
  22. package/esm2020/lib/components/tables/renderer/cell-portal-ref.mjs +93 -0
  23. package/esm2020/lib/components/tables/renderer/cell-renderer.mjs +2 -0
  24. package/esm2020/lib/components/tables/renderer/default-cell-renderer/default-cell-renderer.component.mjs +30 -0
  25. package/esm2020/lib/components/tables/{table → renderer}/default-header-cell-renderer/default-header-cell-renderer.component.mjs +1 -1
  26. package/esm2020/lib/components/tables/renderer/default-list-cell-renderer/default-list-cell-renderer.component.mjs +40 -0
  27. package/esm2020/lib/components/tables/renderer/select-header-cell/selection-header-cell.component.mjs +31 -0
  28. package/esm2020/lib/components/tables/renderer/selection-cell/selection-cell.component.mjs +26 -0
  29. package/esm2020/lib/components/tables/renderer/table-cell/table-cell.component.mjs +93 -0
  30. package/esm2020/lib/components/tables/renderer/table-header-cell/table-header-cell.component.mjs +32 -0
  31. package/esm2020/lib/components/tables/search/column-text-search-formatter.mjs +52 -0
  32. package/esm2020/lib/components/tables/search/enable-cell-text-search.decorator.mjs +30 -0
  33. package/esm2020/lib/components/tables/table/table-model.mjs +2 -10
  34. package/esm2020/lib/components/tables/table/table.component.mjs +12 -12
  35. package/esm2020/lib/components/tables/table-row-menu/table-row-menu.component.mjs +84 -0
  36. package/esm2020/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.mjs +1 -1
  37. package/esm2020/lib/components/tables/tree-table/tree-label-column-model.mjs +3 -3
  38. package/esm2020/lib/components/tables/tree-table/tree-table-component.mjs +10 -10
  39. package/esm2020/lib/components/tables/tree-table/tree-table-model.mjs +1 -1
  40. package/esm2020/lib/interaction/activity-ref.mjs +2 -2
  41. package/esm2020/lib/interaction/activity.mjs +36 -27
  42. package/esm2020/lib/interaction/components/abstract-confirm-dialog.component.mjs +1 -1
  43. package/esm2020/lib/interaction/components/abstract-dialog.component.mjs +6 -1
  44. package/esm2020/lib/interaction/components/activity-actions/activity-actions.component.mjs +18 -5
  45. package/esm2020/lib/interaction/components/activity-container/activity-outlet/activity-outlet.component.mjs +5 -2
  46. package/esm2020/lib/interaction/components/input-activities/input-activity.mjs +2 -4
  47. package/fesm2015/coolon-angular-ui-powerups.mjs +660 -460
  48. package/fesm2015/coolon-angular-ui-powerups.mjs.map +1 -1
  49. package/fesm2020/coolon-angular-ui-powerups.mjs +801 -602
  50. package/fesm2020/coolon-angular-ui-powerups.mjs.map +1 -1
  51. package/lib/components/commands/command/command.component.d.ts +5 -2
  52. package/lib/components/components.module.d.ts +55 -54
  53. package/lib/components/exports.d.ts +27 -20
  54. package/lib/components/tables/abstract-table-model.d.ts +24 -13
  55. package/lib/components/tables/abstract-table.component.d.ts +6 -5
  56. package/lib/components/tables/{column-list-model.d.ts → column/column-list-model.d.ts} +4 -4
  57. package/lib/components/tables/column/column-model.d.ts +77 -0
  58. package/lib/components/tables/column/custom-template-column-model.d.ts +8 -0
  59. package/lib/components/tables/column/custom-value-column-model.d.ts +10 -0
  60. package/lib/components/tables/column/editor-controls-column-model.d.ts +13 -0
  61. package/lib/components/tables/column/list-propery-column-model.d.ts +15 -0
  62. package/lib/components/tables/column/property-column-model.d.ts +24 -0
  63. package/lib/components/tables/column/selection-column-model.d.ts +12 -0
  64. package/lib/components/tables/{table → editor}/edit-row-controls/edit-row-controls.component.d.ts +1 -1
  65. package/lib/components/tables/{edit-session.d.ts → editor/edit-session.d.ts} +2 -2
  66. package/lib/components/tables/{table/mutable-cell-renderer.d.ts → editor/editable-cell-renderer.d.ts} +2 -2
  67. package/lib/components/tables/{table/paginator → paginator}/paginator.component.d.ts +1 -1
  68. package/lib/components/tables/{table → renderer}/cell-portal-ref.d.ts +18 -18
  69. package/lib/components/tables/renderer/cell-renderer.d.ts +3 -0
  70. package/lib/components/tables/{table → renderer}/default-cell-renderer/default-cell-renderer.component.d.ts +1 -1
  71. package/lib/components/tables/renderer/default-list-cell-renderer/default-list-cell-renderer.component.d.ts +12 -0
  72. package/lib/components/tables/{table/select-header-cell-renderer/select-header-cell-renderer.component.d.ts → renderer/select-header-cell/selection-header-cell.component.d.ts} +3 -3
  73. package/lib/components/tables/{table/select-cell-renderer/select-cell-renderer.component.d.ts → renderer/selection-cell/selection-cell.component.d.ts} +3 -3
  74. package/lib/components/tables/{table/table-cell-renderer/table-cell-renderer.component.d.ts → renderer/table-cell/table-cell.component.d.ts} +5 -5
  75. package/lib/components/tables/{table/table-header-cell-renderer/table-header-cell-renderer.component.d.ts → renderer/table-header-cell/table-header-cell.component.d.ts} +4 -4
  76. package/lib/components/tables/search/column-text-search-formatter.d.ts +28 -0
  77. package/lib/components/tables/search/enable-cell-text-search.decorator.d.ts +25 -0
  78. package/lib/components/tables/table/table-model.d.ts +3 -9
  79. package/lib/components/tables/table/table.component.d.ts +4 -4
  80. package/lib/components/tables/{table/table-row-menu → table-row-menu}/table-row-menu.component.d.ts +3 -3
  81. package/lib/components/tables/tree-table/tree-label-cell-renderer/tree-label-cell-renderer.component.d.ts +1 -1
  82. package/lib/components/tables/tree-table/tree-label-column-model.d.ts +1 -1
  83. package/lib/components/tables/tree-table/tree-table-component.d.ts +2 -2
  84. package/lib/components/tables/tree-table/tree-table-model.d.ts +1 -1
  85. package/lib/interaction/activity.d.ts +15 -10
  86. package/lib/interaction/components/activity-actions/activity-actions.component.d.ts +6 -1
  87. package/lib/interaction/components/input-activities/input-activity.d.ts +0 -1
  88. package/package.json +2 -1
  89. package/esm2020/lib/components/tables/column-list-model.mjs +0 -39
  90. package/esm2020/lib/components/tables/edit-session.mjs +0 -23
  91. package/esm2020/lib/components/tables/table/cell-editors.mjs +0 -2
  92. package/esm2020/lib/components/tables/table/cell-portal-ref.mjs +0 -93
  93. package/esm2020/lib/components/tables/table/cell-renderer.mjs +0 -2
  94. package/esm2020/lib/components/tables/table/column-model.mjs +0 -392
  95. package/esm2020/lib/components/tables/table/column-template/column-template.directive.mjs +0 -35
  96. package/esm2020/lib/components/tables/table/column-text-properties.mjs +0 -2
  97. package/esm2020/lib/components/tables/table/default-cell-renderer/default-cell-renderer.component.mjs +0 -22
  98. package/esm2020/lib/components/tables/table/edit-row-controls/edit-row-controls.component.mjs +0 -55
  99. package/esm2020/lib/components/tables/table/mutable-cell-renderer.mjs +0 -2
  100. package/esm2020/lib/components/tables/table/select-cell-renderer/select-cell-renderer.component.mjs +0 -26
  101. package/esm2020/lib/components/tables/table/select-header-cell-renderer/select-header-cell-renderer.component.mjs +0 -31
  102. package/esm2020/lib/components/tables/table/table-cell-renderer/table-cell-renderer.component.mjs +0 -93
  103. package/esm2020/lib/components/tables/table/table-def.mjs +0 -2
  104. package/esm2020/lib/components/tables/table/table-header-cell-renderer/table-header-cell-renderer.component.mjs +0 -32
  105. package/esm2020/lib/components/tables/table/table-row-menu/table-row-menu.component.mjs +0 -84
  106. package/esm2020/lib/components/tables/table/text-search-predicate.mjs +0 -2
  107. package/lib/components/tables/table/cell-renderer.d.ts +0 -5
  108. package/lib/components/tables/table/column-model.d.ts +0 -145
  109. package/lib/components/tables/table/table-def.d.ts +0 -7
  110. package/lib/components/tables/table/text-search-predicate.d.ts +0 -1
  111. /package/lib/components/tables/{table → column}/column-template/column-template.directive.d.ts +0 -0
  112. /package/lib/components/tables/{table → column}/column-text-properties.d.ts +0 -0
  113. /package/lib/components/tables/{table → renderer}/cell-editors.d.ts +0 -0
  114. /package/lib/components/tables/{table → renderer}/default-header-cell-renderer/default-header-cell-renderer.component.d.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  import * as i4 from '@angular/common';
2
2
  import { DOCUMENT, CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { ElementRef, Directive, Inject, Host, Optional, Input, HostListener, NgZone, Injectable, Pipe, NgModule, Component, ContentChild, ViewEncapsulation, HostBinding, InjectionToken, ViewChildren, EventEmitter, ViewChild, Output, SkipSelf, Self, ContentChildren, ComponentRef, PLATFORM_ID, Injector } from '@angular/core';
4
+ import { ElementRef, Directive, Inject, Host, Optional, Input, HostListener, NgZone, Injectable, Pipe, NgModule, Component, ContentChild, ViewEncapsulation, HostBinding, InjectionToken, ViewChild, ViewChildren, EventEmitter, Output, SkipSelf, Self, ContentChildren, ComponentRef, Injector, PLATFORM_ID } from '@angular/core';
5
5
  import * as i4$1 from '@angular/forms';
6
6
  import { FormsModule } from '@angular/forms';
7
7
  import * as i1$8 from '@angular/material/form-field';
@@ -20,7 +20,7 @@ import { CdkScrollableModule } from '@angular/cdk/scrolling';
20
20
  import * as i2$1 from '@angular/material/autocomplete';
21
21
  import { MatAutocompleteModule } from '@angular/material/autocomplete';
22
22
  import * as i1 from '@angular/material/button';
23
- import { MatButtonModule } from '@angular/material/button';
23
+ import { MatButton, MatButtonModule } from '@angular/material/button';
24
24
  import * as i1$9 from '@angular/material/checkbox';
25
25
  import { MatCheckboxModule } from '@angular/material/checkbox';
26
26
  import * as i2 from '@angular/material/divider';
@@ -40,16 +40,18 @@ import { MatTooltipModule } from '@angular/material/tooltip';
40
40
  import * as i1$5 from '@fortawesome/angular-fontawesome';
41
41
  import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
42
42
  import * as i1$7 from '@coolon/pectin';
43
- import { GarbageCollector, DelegatingValueModel, assert, UnaryCommand, lang, Dsl, Logger, TrackExternal, ValueModel, StoreInValueModel, Command, MutableListModel, StoreInListModel, Disposable, DelegatingListModel, MutableValueModel, FocusManager, EventListenerList, Form, Guard, Binding, DebugContext, ListModel, MultipleSelectionModel, DelegatingSelectionModel, AbstractComputedListModel, DirtyTrackingForm, ComputedListModel, PageController, Deferred, Trace, Functions } from '@coolon/pectin';
43
+ import { GarbageCollector, DelegatingValueModel, assert, UnaryCommand, lang, Dsl, Logger, TrackExternal, ValueModel, StoreInValueModel, Command, MutableListModel, StoreInListModel, Trace, Disposable, DelegatingListModel, MutableValueModel, FocusManager, EventListenerList, Form, Guard, Binding, DebugContext, ListModel, Functions, MultipleSelectionModel, AbstractComputedListModel, DelegatingSelectionModel, DirtyTrackingForm, ComputedListModel, PageController, Deferred } from '@coolon/pectin';
44
44
  import { __decorate, __param, __metadata, __awaiter } from 'tslib';
45
+ import * as _ from 'lodash';
45
46
  import { isEmpty, isString, isFunction, isNil, isInteger, isEqual, uniq, first, findLast, isObject, isNumber, isNaN as isNaN$1 } from 'lodash';
46
47
  import * as i1$2 from '@angular/platform-browser';
47
48
  import { marked } from 'marked';
48
- import { lang as lang$1, assert as assert$1, Stringy, Opts, Klass } from '@coolon/typescript-utilities';
49
+ import { lang as lang$1, assert as assert$1, Stringy, Klass, Opts } from '@coolon/typescript-utilities';
49
50
  import { Memoize } from '@typescript-plus/fast-memoize-decorator';
50
51
  import { Enum } from 'typescript-string-enums';
51
52
  import * as i3 from '@angular/material/core';
52
53
  import ResizeObserver from 'resize-observer-polyfill';
54
+ import escapeStringRegexp from 'escape-string-regexp';
53
55
  import produce from 'immer';
54
56
  import { fas } from '@fortawesome/free-solid-svg-icons';
55
57
  import * as i6$1 from '@angular/cdk/a11y';
@@ -1083,9 +1085,12 @@ class CommandComponent extends PopupAwareComponent {
1083
1085
  getFace() {
1084
1086
  return this.face;
1085
1087
  }
1088
+ tryAndFocus() {
1089
+ this.button.focus();
1090
+ }
1086
1091
  }
1087
1092
  CommandComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: CommandComponent, deps: [{ token: i0.ElementRef }, { token: POPUP_CONTAINER, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1088
- CommandComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: CommandComponent, selector: "aup-command", inputs: { command: "command", faceModel: "faceModel", face: "face", busyFaceModel: "busyFaceModel", busyFace: "busyFace", alignFace: "alignFace" }, host: { properties: { "class": "this.alignFace" } }, 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"], components: [{ type: i1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
1093
+ CommandComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: CommandComponent, selector: "aup-command", inputs: { command: "command", faceModel: "faceModel", face: "face", busyFaceModel: "busyFaceModel", 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"], components: [{ type: i1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: CommandFaceComponent, selector: "aup-command-face", inputs: ["faces", "face", "ignoreIcon", "ignoreText", "includeMissingIconInLayout"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }, { type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }] });
1089
1094
  __decorate([
1090
1095
  TrackExternal(),
1091
1096
  __metadata("design:type", Command)
@@ -1106,6 +1111,12 @@ __decorate([
1106
1111
  StoreInValueModel('busyFaceModel'),
1107
1112
  __metadata("design:type", Object)
1108
1113
  ], CommandComponent.prototype, "busyFace", void 0);
1114
+ __decorate([
1115
+ Trace(),
1116
+ __metadata("design:type", Function),
1117
+ __metadata("design:paramtypes", []),
1118
+ __metadata("design:returntype", void 0)
1119
+ ], CommandComponent.prototype, "tryAndFocus", null);
1109
1120
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: CommandComponent, decorators: [{
1110
1121
  type: Component,
1111
1122
  args: [{ selector: 'aup-command', 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"] }]
@@ -1131,7 +1142,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
1131
1142
  }, {
1132
1143
  type: HostBinding,
1133
1144
  args: ["class"]
1134
- }] } });
1145
+ }], button: [{
1146
+ type: ViewChild,
1147
+ args: [MatButton]
1148
+ }], tryAndFocus: [] } });
1135
1149
 
1136
1150
  /**
1137
1151
  *
@@ -2535,25 +2549,6 @@ class TemplateCellRendererPortalRef extends CellRendererPortalRef {
2535
2549
  }
2536
2550
  }
2537
2551
 
2538
- class DefaultCellRendererComponent {
2539
- constructor() {
2540
- }
2541
- set value(value) {
2542
- this._value = value;
2543
- }
2544
- get value() {
2545
- return this._value;
2546
- }
2547
- }
2548
- DefaultCellRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DefaultCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2549
- DefaultCellRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: DefaultCellRendererComponent, selector: "aup-default-cell-renderer", inputs: { value: "value" }, ngImport: i0, template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n", styles: [""], pipes: { "aupHighlight": HighlightPipe } });
2550
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DefaultCellRendererComponent, decorators: [{
2551
- type: Component,
2552
- args: [{ selector: 'aup-default-cell-renderer', template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n", styles: [""] }]
2553
- }], ctorParameters: function () { return []; }, propDecorators: { value: [{
2554
- type: Input
2555
- }] } });
2556
-
2557
2552
  class DefaultHeaderCellRendererComponent {
2558
2553
  constructor() {
2559
2554
  }
@@ -2567,104 +2562,82 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
2567
2562
  type: Input
2568
2563
  }] } });
2569
2564
 
2570
- class EditRowControls extends DisposableComponent {
2571
- constructor() {
2572
- super();
2573
- this.saveCommand = Command.create(() => __awaiter(this, void 0, void 0, function* () {
2574
- const finished = yield this.editSession.saveCommand.execute();
2575
- if (finished) {
2576
- this.editSession.dispose();
2577
- }
2578
- }));
2579
- this.cancelCommand = Command.create(() => {
2580
- this.editSession.dispose();
2581
- }).disableWhile(this.saveCommand.busy);
2565
+ class ColumnTextSearchFormatter {
2566
+ }
2567
+ (function (ColumnTextSearchFormatter) {
2568
+ class Delegate extends ColumnTextSearchFormatter {
2582
2569
  }
2583
- set editSession(session) {
2584
- if (session) {
2585
- session.form.disableWhile(this.saveCommand.busy);
2570
+ ColumnTextSearchFormatter.Delegate = Delegate;
2571
+ class Delegating extends ColumnTextSearchFormatter.Delegate {
2572
+ constructor(delegateClass) {
2573
+ super();
2574
+ this.delegateClass = delegateClass;
2575
+ }
2576
+ initialise(injector) {
2577
+ this._delegate = injector.get(this.delegateClass);
2578
+ if (this._delegate instanceof Delegating) {
2579
+ this._delegate.initialise(injector);
2580
+ }
2581
+ }
2582
+ format(row) {
2583
+ return this._delegate ? this._delegate.format(row) : "";
2586
2584
  }
2587
- this._session = session;
2588
- }
2589
- get editSession() {
2590
- return this._session;
2591
2585
  }
2592
- ngOnInit() {
2586
+ ColumnTextSearchFormatter.Delegating = Delegating;
2587
+ function forFormatter(formatter) {
2588
+ return new class extends ColumnTextSearchFormatter {
2589
+ format(value) {
2590
+ return formatter(value);
2591
+ }
2592
+ };
2593
2593
  }
2594
- get form() {
2595
- var _a;
2596
- return (_a = this.editSession) === null || _a === void 0 ? void 0 : _a.form;
2594
+ ColumnTextSearchFormatter.forFormatter = forFormatter;
2595
+ class Null extends ColumnTextSearchFormatter {
2596
+ format(value) {
2597
+ return "";
2598
+ }
2597
2599
  }
2598
- }
2599
- EditRowControls.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: EditRowControls, deps: [], target: i0.ɵɵFactoryTarget.Component });
2600
- EditRowControls.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: EditRowControls, selector: "aup-row-editor-controls", inputs: { row: "row", editRowCommand: "editRowCommand", editSession: "editSession" }, usesInheritance: true, ngImport: i0, template: "<button *ngIf=\"!editSession\" mat-icon-button [pectinCommand]=\"editRowCommand\" class=\"edit-button\"><aup-icon icon=\"mat:edit\"></aup-icon></button>\n<button *ngIf=\"editSession\" mat-icon-button [pectinCommand]=\"saveCommand\"><aup-icon icon=\"mat:done\"></aup-icon></button>\n<button *ngIf=\"editSession\" mat-icon-button [pectinCommand]=\"cancelCommand\"><aup-icon icon=\"mat:clear\"></aup-icon></button>\n", styles: [":host{display:block;width:80px}.edit-button{visibility:hidden}:host-context(tr:hover) .edit-button{visibility:visible}\n"], components: [{ type: i1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: IconComponent, selector: "aup-icon", inputs: ["icon"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }] });
2601
- __decorate([
2602
- TrackExternal(),
2603
- __metadata("design:type", Command)
2604
- ], EditRowControls.prototype, "editRowCommand", void 0);
2605
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: EditRowControls, decorators: [{
2606
- type: Component,
2607
- args: [{ selector: 'aup-row-editor-controls', template: "<button *ngIf=\"!editSession\" mat-icon-button [pectinCommand]=\"editRowCommand\" class=\"edit-button\"><aup-icon icon=\"mat:edit\"></aup-icon></button>\n<button *ngIf=\"editSession\" mat-icon-button [pectinCommand]=\"saveCommand\"><aup-icon icon=\"mat:done\"></aup-icon></button>\n<button *ngIf=\"editSession\" mat-icon-button [pectinCommand]=\"cancelCommand\"><aup-icon icon=\"mat:clear\"></aup-icon></button>\n", styles: [":host{display:block;width:80px}.edit-button{visibility:hidden}:host-context(tr:hover) .edit-button{visibility:visible}\n"] }]
2608
- }], ctorParameters: function () { return []; }, propDecorators: { row: [{
2609
- type: Input
2610
- }], editRowCommand: [{
2611
- type: Input
2612
- }], editSession: [{
2613
- type: Input
2614
- }] } });
2615
-
2616
- class SelectCellRendererComponent extends DisposableComponent {
2617
- constructor() {
2618
- super();
2619
- this.selectCommand = Command.create(() => {
2600
+ ColumnTextSearchFormatter.Null = Null;
2601
+ class DefaultValueFormatter extends ColumnTextSearchFormatter {
2602
+ format(value) {
2620
2603
  var _a;
2621
- (_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.selectCommand.execute(this.row);
2622
- });
2604
+ let s = (_a = value === null || value === void 0 ? void 0 : value.toString()) !== null && _a !== void 0 ? _a : "";
2605
+ console.log("DefaultValueFormatter", { value, text: s });
2606
+ return s;
2607
+ }
2623
2608
  }
2624
- isSelected() {
2625
- var _a;
2626
- return (_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.isSelected(this.row);
2609
+ ColumnTextSearchFormatter.DefaultValueFormatter = DefaultValueFormatter;
2610
+ class DefaultArrayFormatter extends ColumnTextSearchFormatter {
2611
+ format(value) {
2612
+ return value ? value.map(it => it === null || it === void 0 ? void 0 : it.toString()).join(",") : "";
2613
+ }
2627
2614
  }
2628
- }
2629
- SelectCellRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SelectCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2630
- SelectCellRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: SelectCellRendererComponent, selector: "aup-select-cell-renderer", inputs: { row: "row" }, usesInheritance: true, ngImport: i0, template: "<mat-checkbox [pectinCommand]=\"selectCommand\" [checked]=\"isSelected()\"></mat-checkbox>\n", styles: [""], components: [{ type: i1$9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], directives: [{ type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }] });
2631
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SelectCellRendererComponent, decorators: [{
2632
- type: Component,
2633
- args: [{ selector: 'aup-select-cell-renderer', template: "<mat-checkbox [pectinCommand]=\"selectCommand\" [checked]=\"isSelected()\"></mat-checkbox>\n", styles: [""] }]
2634
- }], ctorParameters: function () { return []; }, propDecorators: { row: [{
2635
- type: Input
2636
- }] } });
2615
+ ColumnTextSearchFormatter.DefaultArrayFormatter = DefaultArrayFormatter;
2616
+ })(ColumnTextSearchFormatter || (ColumnTextSearchFormatter = {}));
2637
2617
 
2638
- class SelectHeaderCellRendererComponent extends DisposableComponent {
2618
+ const noop = () => {
2619
+ };
2620
+ class ColumnTextSearchWrapper extends ColumnTextSearchFormatter.Delegate {
2639
2621
  constructor() {
2640
- super();
2641
- this.selectCommand = Command.create(() => {
2642
- this.selectionModel.toggleAllCommand.execute();
2643
- });
2622
+ super(...arguments);
2623
+ this._map = Functions.identity;
2644
2624
  }
2645
- isSelected() {
2646
- var _a;
2647
- return ((_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.allSelected.value) || false;
2625
+ initialise(injector) {
2626
+ if (this._delegate instanceof ColumnTextSearchFormatter.Delegate) {
2627
+ this._delegate.initialise(injector);
2628
+ }
2648
2629
  }
2649
- isIntermediate() {
2650
- var _a;
2651
- return ((_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.someSelected.value) || false;
2630
+ format(row) {
2631
+ let value = this._map(row);
2632
+ let result = this._delegate ? this._delegate.format(value) : "";
2633
+ console.log({ format: row, value, text: result });
2634
+ return result;
2652
2635
  }
2653
- isVisible() {
2654
- return this.enableHeaderControls && this.selectionModel.getDelegate() instanceof MultipleSelectionModel;
2636
+ setDelegate(formatter, mapper) {
2637
+ this._delegate = formatter;
2638
+ this._map = mapper !== null && mapper !== void 0 ? mapper : Functions.identity;
2655
2639
  }
2656
2640
  }
2657
- SelectHeaderCellRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SelectHeaderCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2658
- SelectHeaderCellRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: SelectHeaderCellRendererComponent, selector: "aup-select-header-cell-renderer", usesInheritance: true, ngImport: i0, template: "<mat-checkbox *ngIf=\"isVisible()\" [pectinCommand]=\"selectCommand\" [checked]=\"isSelected()\" [indeterminate]=\"this.isIntermediate()\"></mat-checkbox>\n", styles: [""], components: [{ type: i1$9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }] });
2659
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SelectHeaderCellRendererComponent, decorators: [{
2660
- type: Component,
2661
- args: [{ selector: 'aup-select-header-cell-renderer', template: "<mat-checkbox *ngIf=\"isVisible()\" [pectinCommand]=\"selectCommand\" [checked]=\"isSelected()\" [indeterminate]=\"this.isIntermediate()\"></mat-checkbox>\n", styles: [""] }]
2662
- }], ctorParameters: function () { return []; } });
2663
-
2664
- const noop = () => {
2665
- };
2666
- const CELL_RENDERER_COMPONENT_ROW_CACHE = Symbol('aup-cell-renderer:row-data-cache');
2667
- const DEFAULT_TEXT_SEARCH_PREDICATE = (row, text) => false;
2668
2641
  class ColumnModel extends GarbageCollector {
2669
2642
  constructor(columnId, textPropertiesProvider) {
2670
2643
  super();
@@ -2672,10 +2645,9 @@ class ColumnModel extends GarbageCollector {
2672
2645
  this.textPropertiesProvider = textPropertiesProvider;
2673
2646
  this._enableRowSelection = true;
2674
2647
  this._flex = false;
2675
- this._defaultVisibility = this.registerDisposable(new DelegatingValueModel().withDefault(true));
2676
- this._visible = this.registerDisposable(new DelegatingValueModel().withDefault(this._defaultVisibility));
2677
- this._columnModelTextSearchPredicate = undefined;
2678
- this._cellRendererTextSearchPredicate = undefined;
2648
+ this._defaultVisibility$ = this.registerDisposable(new DelegatingValueModel().withDefault(true));
2649
+ this._visible$ = this.registerDisposable(new DelegatingValueModel().withDefault(this._defaultVisibility$));
2650
+ this.textSearchDelegate = new ColumnTextSearchWrapper();
2679
2651
  this.installHeaderRenderer();
2680
2652
  this.dasherisedColumnId = Stringy.from(columnId).dasherize().toString();
2681
2653
  }
@@ -2689,32 +2661,21 @@ class ColumnModel extends GarbageCollector {
2689
2661
  return ((_a = this.getColumnTextProperties()) === null || _a === void 0 ? void 0 : _a.headerText()) || this.getDefaultHeaderText();
2690
2662
  }
2691
2663
  isVisible() {
2692
- return this.visible.value;
2664
+ return this.visible$.value;
2693
2665
  }
2694
- get visible() {
2695
- return this._visible.readonly;
2666
+ get visible$() {
2667
+ return this._visible$.readonly;
2696
2668
  }
2697
2669
  visibleWhile(visible) {
2698
- this._visible.setDelegate(visible);
2670
+ this._visible$.setDelegate(visible);
2699
2671
  return this;
2700
2672
  }
2701
2673
  setDefaultVisibility(visible) {
2702
- this._defaultVisibility.setDelegate(visible);
2674
+ this._defaultVisibility$.setDelegate(visible);
2703
2675
  }
2704
2676
  getDefaultHeaderText() {
2705
2677
  return this.columnId;
2706
2678
  }
2707
- get isTextMatch() {
2708
- return this._columnModelTextSearchPredicate || this._cellRendererTextSearchPredicate || DEFAULT_TEXT_SEARCH_PREDICATE;
2709
- }
2710
- /**
2711
- * Sets the predicate to use when checking if the specified row is a text match for this column.
2712
- * @param predicate
2713
- */
2714
- useTextSearchPredicate(predicate) {
2715
- this._columnModelTextSearchPredicate = predicate;
2716
- return this;
2717
- }
2718
2679
  getColumnTextProperties() {
2719
2680
  return this._columnTextProperties || this.textPropertiesProvider();
2720
2681
  }
@@ -2729,6 +2690,14 @@ class ColumnModel extends GarbageCollector {
2729
2690
  this._columnTextProperties = columnTextProperties;
2730
2691
  return this;
2731
2692
  }
2693
+ getSearchTextFor(row) {
2694
+ return this.textSearchDelegate.format(row);
2695
+ }
2696
+ configureColumnTextSearch(formatter, mapper) {
2697
+ assert$1.notNil(formatter);
2698
+ console.log({ col: this.columnId, formatter });
2699
+ this.textSearchDelegate.setDelegate(formatter, mapper);
2700
+ }
2732
2701
  configureHeaderRenderer(config) {
2733
2702
  this._columnHeaderPortalRef = config;
2734
2703
  }
@@ -2767,12 +2736,6 @@ class ColumnModel extends GarbageCollector {
2767
2736
  onRendererAttached(host, ref) {
2768
2737
  const component = this.getComponentOrEmbeddedView(ref);
2769
2738
  this._cellRendererPortalRef.onPortalAttached(host, component);
2770
- if (isFunction(component === null || component === void 0 ? void 0 : component.matches)) {
2771
- this._cellRendererTextSearchPredicate = (row, text) => component.matches(row, text);
2772
- }
2773
- else {
2774
- this._cellRendererTextSearchPredicate = undefined;
2775
- }
2776
2739
  }
2777
2740
  // @Trace()
2778
2741
  onEditorAttached(host, ref) {
@@ -2805,6 +2768,9 @@ class ColumnModel extends GarbageCollector {
2805
2768
  return ref;
2806
2769
  }
2807
2770
  }
2771
+ initialise(injector) {
2772
+ this.textSearchDelegate.initialise(injector);
2773
+ }
2808
2774
  }
2809
2775
  __decorate([
2810
2776
  Memoize(),
@@ -2818,182 +2784,10 @@ __decorate([
2818
2784
  __metadata("design:paramtypes", []),
2819
2785
  __metadata("design:returntype", Object)
2820
2786
  ], ColumnModel.prototype, "getColumnTextProperties", null);
2821
- class PropertyColumnModel extends ColumnModel {
2822
- constructor(id, property, defaults) {
2823
- super(id, defaults);
2824
- this.property = property;
2825
- this._format = (value) => value === null || value === void 0 ? void 0 : value.toString();
2826
- this.cellRenderer(DefaultCellRendererComponent);
2827
- this.useTextSearchPredicate((row, regex) => {
2828
- return regex.test(this._format(row[this.property]));
2829
- });
2830
- }
2831
- cellRenderer(componentType, onComponentInitOrOptions) {
2832
- this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
2833
- if (firstTime) {
2834
- if (isFunction(onComponentInitOrOptions)) {
2835
- onComponentInitOrOptions(component);
2836
- }
2837
- else {
2838
- if (isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onComponentInit)) {
2839
- onComponentInitOrOptions.onComponentInit(component);
2840
- }
2841
- }
2842
- }
2843
- component.value = this._format(rowData.row[this.property]);
2844
- }));
2845
- return this;
2846
- }
2847
- liveEditCellRenderer(componentType, options) {
2848
- return this.mutableCellRenderer(componentType, options);
2849
- }
2850
- /**
2851
- * Deprecated. Use #liveEditCellRenderer instead.
2852
- * @param componentType
2853
- * @param options
2854
- */
2855
- mutableCellRenderer(componentType, options) {
2856
- this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
2857
- // keep a local copy most recent row value so it's available to teh
2858
- // edit callback without having to add/remove subscribers all the time.
2859
- component[CELL_RENDERER_COMPONENT_ROW_CACHE] = rowData.row;
2860
- let disableEditCallback = false;
2861
- if (firstTime) {
2862
- if (isFunction(options === null || options === void 0 ? void 0 : options.onComponentInit)) {
2863
- options.onComponentInit(component);
2864
- }
2865
- // install our edit callback
2866
- component.onValueEdited((is, was) => {
2867
- if (!disableEditCallback) {
2868
- options.onValueEdit(component[CELL_RENDERER_COMPONENT_ROW_CACHE], is, was);
2869
- }
2870
- });
2871
- }
2872
- // now push the value the component and disable the callback just incase the component misbehaves
2873
- // and fires a value change during the operation.
2874
- disableEditCallback = true;
2875
- component.value = rowData.row[this.property];
2876
- disableEditCallback = false;
2877
- if (!isFunction(options) && isFunction(options === null || options === void 0 ? void 0 : options.onRowUpdate)) {
2878
- options.onRowUpdate(component, rowData.row);
2879
- }
2880
- }));
2881
- return this;
2882
- }
2883
- cellEditor(editor, validatorsOrInitialiser, onComponentInit) {
2884
- const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
2885
- const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
2886
- this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
2887
- const formValueModel = editSession.form.pluck(this.property);
2888
- if (validators) {
2889
- formValueModel.validateUsing(validators);
2890
- }
2891
- component.valueModel = formValueModel;
2892
- if (initialiser) {
2893
- initialiser(component);
2894
- }
2895
- }));
2896
- return this;
2897
- }
2898
- format(formatter) {
2899
- assert$1.isFunction(formatter);
2900
- this._format = formatter;
2901
- return this;
2902
- }
2903
- selectRowOnClick(selectOnRowClick) {
2904
- return this._selectRowOnClick(selectOnRowClick);
2905
- }
2906
- }
2907
- class ListPropertyColumnModel extends ColumnModel {
2908
- constructor(id, property, defaults) {
2909
- super(id, defaults);
2910
- this.property = property;
2911
- this._format = (value) => value.map(v => v === null || v === void 0 ? void 0 : v.toString()).join(', ');
2912
- this.cellRenderer(DefaultCellRendererComponent);
2913
- this.useTextSearchPredicate((row, regex) => {
2914
- let rowElement = row[this.property];
2915
- // @ts-ignore Started complaining in ts 4.5.. but I think my logic is correct...
2916
- return regex.test(this._format(rowElement));
2917
- });
2918
- }
2919
- cellRenderer(componentType) {
2920
- this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData) => {
2921
- let rowElement = rowData.row[this.property];
2922
- // @ts-ignore Started complaining in ts 4.5.. but I think my logic is correct...
2923
- component.value = this._format(rowElement);
2924
- }));
2925
- return this;
2926
- }
2927
- cellEditor(editor, validatorsOrInitialiser, initialiseComponent) {
2928
- const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
2929
- const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
2930
- this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
2931
- const formListModel = editSession.form.pluckList(this.property);
2932
- if (validators) {
2933
- formListModel.validateUsing(validators);
2934
- }
2935
- component.listModel = formListModel;
2936
- if (initialiser) {
2937
- initialiser(component);
2938
- }
2939
- }));
2940
- return this;
2941
- }
2942
- format(formatter) {
2943
- assert$1.isFunction(formatter);
2944
- this._format = formatter;
2945
- return this;
2946
- }
2947
- selectRowOnClick(selectRowOnClick) {
2948
- return this._selectRowOnClick(selectRowOnClick);
2949
- }
2950
- }
2951
- class CustomValueColumnModel extends ColumnModel {
2952
- constructor(columnId, defaults, getValue) {
2953
- super(columnId, defaults);
2954
- this.getValue = getValue;
2955
- this.cellRenderer(DefaultCellRendererComponent);
2956
- }
2957
- cellRenderer(componentType, onComponentInitOrOptions) {
2958
- this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
2959
- if (firstTime) {
2960
- if (isFunction(onComponentInitOrOptions)) {
2961
- onComponentInitOrOptions(component);
2962
- }
2963
- else {
2964
- if (isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onComponentInit)) {
2965
- onComponentInitOrOptions.onComponentInit(component);
2966
- }
2967
- }
2968
- }
2969
- component.value = this.getValue(rowData.row);
2970
- if (!isFunction(onComponentInitOrOptions) && isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onRowUpdate)) {
2971
- onComponentInitOrOptions.onRowUpdate(component, rowData.row);
2972
- }
2973
- }));
2974
- return this;
2975
- }
2976
- selectRowOnClick(selectOnRowClick) {
2977
- return this._selectRowOnClick(selectOnRowClick);
2978
- }
2979
- }
2980
- class EditorControlColumnModel extends ColumnModel {
2981
- constructor(columnId, saveCommandFactory, defaults) {
2982
- super(columnId, defaults);
2983
- this.cellRenderer(EditRowControls);
2984
- }
2985
- cellRenderer(componentType) {
2986
- this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData) => {
2987
- component.row = rowData.row;
2988
- component.editSession = rowData.editSession;
2989
- component.editRowCommand = rowData.editRowCommand;
2990
- }));
2991
- return this;
2992
- }
2993
- getDefaultHeaderText() {
2994
- return '';
2995
- }
2996
- }
2787
+ (function (ColumnModel) {
2788
+ ColumnModel.CELL_RENDERER_COMPONENT_ROW_CACHE = Symbol('aup-cell-renderer:row-data-cache');
2789
+ })(ColumnModel || (ColumnModel = {}));
2790
+
2997
2791
  class CustomTemplateColumnModel extends ColumnModel {
2998
2792
  constructor(columnId, defaults) {
2999
2793
  super(columnId, defaults);
@@ -3007,45 +2801,11 @@ class CustomTemplateColumnModel extends ColumnModel {
3007
2801
  return this._selectRowOnClick(selectOnRowClick);
3008
2802
  }
3009
2803
  }
3010
- class SelectionColumnModel extends ColumnModel {
3011
- constructor(columnId, defaults, selectionModel) {
3012
- super(columnId, defaults);
3013
- this._enableHeaderControls = true;
3014
- this.selectionModel = DelegatingSelectionModel.createDelegate();
3015
- this._selectRowOnClick(false);
3016
- this.cellHeaderRenderer(SelectHeaderCellRendererComponent, (component) => {
3017
- component.selectionModel = this.selectionModel;
3018
- component.enableHeaderControls = this._enableHeaderControls;
3019
- });
3020
- this.configureCellRenderer(new ComponentCellRendererPortalRef(SelectCellRendererComponent, (component, rowData) => {
3021
- component.row = rowData.row;
3022
- component.selectionModel = this.selectionModel;
3023
- }));
3024
- this.setSelectionModel(selectionModel);
3025
- }
3026
- setSelectionModel(selectionModel) {
3027
- this.selectionModel.setDelegate(selectionModel);
3028
- this.setDefaultVisibility(selectionModel instanceof MultipleSelectionModel ? ValueModel.TRUE : ValueModel.FALSE);
3029
- }
3030
- getDefaultHeaderText() {
3031
- return '';
3032
- }
3033
- enableHeaderControls(enable) {
3034
- this._enableHeaderControls = enable;
3035
- return this;
3036
- }
3037
- selectRow(row) {
3038
- this.selectionModel.selectCommand.execute(row);
3039
- }
3040
- isSelected(row) {
3041
- return this.selectionModel.isSelected(row);
3042
- }
3043
- }
3044
2804
 
3045
2805
  /**
3046
2806
  * Create your model:
3047
2807
  * @example
3048
- * this.heroTableModel = TableModel.fromList(heroList, table => {
2808
+ * this.heroTableModel = new TableModel(heroList, table => {
3049
2809
  * table.pluck("firstName");
3050
2810
  * table.pluck("lastName");
3051
2811
  * table.addCustomColumn("fullName", hero => `${hero.firstName} ${hero.lastName}`);
@@ -3057,7 +2817,7 @@ class SelectionColumnModel extends ColumnModel {
3057
2817
  *
3058
2818
  * Column templates
3059
2819
  * @example
3060
- * this.heroTableModel = TableModel.fromList(heroList, table => {
2820
+ * this.heroTableModel = new TableModel(heroList, table => {
3061
2821
  * table.pluck("firstName");
3062
2822
  * table.pluck("lastName");
3063
2823
  * table.addTemplateColumn("specialColumn");
@@ -3102,8 +2862,9 @@ class SelectionColumnModel extends ColumnModel {
3102
2862
  * }
3103
2863
  */
3104
2864
  class AbstractTableComponent extends ResizeAwareComponent {
3105
- constructor(elementRef, ngZone) {
2865
+ constructor(elementRef, ngZone, injector) {
3106
2866
  super(elementRef, ngZone);
2867
+ this.injector = injector;
3107
2868
  /**
3108
2869
  * Set to true to enable scrolling. Once enabled the table will have 0 implicit height. You will either
3109
2870
  * need to set it explicitly e.g. height: 400px; or by using flex or grid layout to make it fill it's
@@ -3135,6 +2896,7 @@ class AbstractTableComponent extends ResizeAwareComponent {
3135
2896
  }
3136
2897
  ngOnInit() {
3137
2898
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
2899
+ this.getModel().initialise(this.injector);
3138
2900
  this.columns = chain(this.getModel().columns);
3139
2901
  this.columnIds = chain(this.columns).pluck('columnId');
3140
2902
  this.columnsById = chain(this.columns).indexBy('columnId');
@@ -3154,12 +2916,12 @@ class AbstractTableComponent extends ResizeAwareComponent {
3154
2916
  // @Trace()
3155
2917
  isFirstVisibleColumn(columnId) {
3156
2918
  var _a;
3157
- return ((_a = this.getModel().firstVisibleColumn.query().value) === null || _a === void 0 ? void 0 : _a.columnId) === columnId;
2919
+ return ((_a = this.getModel().firstVisibleColumn$.query().value) === null || _a === void 0 ? void 0 : _a.columnId) === columnId;
3158
2920
  }
3159
2921
  // @Trace()
3160
2922
  isLastVisibleColumn(columnId) {
3161
2923
  var _a;
3162
- return ((_a = this.getModel().lastVisibleColumn.query().value) === null || _a === void 0 ? void 0 : _a.columnId) === columnId;
2924
+ return ((_a = this.getModel().lastVisibleColumn$.query().value) === null || _a === void 0 ? void 0 : _a.columnId) === columnId;
3163
2925
  }
3164
2926
  getColumnClasses(columnId) {
3165
2927
  const classes = [`aup-col-${this.columnsById.get(columnId).dasherisedColumnId}`];
@@ -3172,7 +2934,7 @@ class AbstractTableComponent extends ResizeAwareComponent {
3172
2934
  return classes;
3173
2935
  }
3174
2936
  }
3175
- AbstractTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: AbstractTableComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
2937
+ AbstractTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: AbstractTableComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
3176
2938
  AbstractTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: AbstractTableComponent, selector: "aup-abstract-table", inputs: { showHeaderModel: "showHeaderModel", showHeader: "showHeader", enableScrolling: "enableScrolling" }, host: { properties: { "class.enable-scrolling": "this.enableScrolling", "class": "this.baseCssClass", "class.hide-header": "this.hideHeader" } }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
3177
2939
  __decorate([
3178
2940
  TrackExternal({ defaultValue: true }),
@@ -3188,7 +2950,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
3188
2950
  selector: 'aup-abstract-table',
3189
2951
  template: ''
3190
2952
  }]
3191
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { showHeaderModel: [{
2953
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Injector }]; }, propDecorators: { showHeaderModel: [{
3192
2954
  type: Input
3193
2955
  }], showHeader: [{
3194
2956
  type: Input
@@ -3236,7 +2998,183 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
3236
2998
  type: Input
3237
2999
  }] } });
3238
3000
 
3239
- class TableCellRendererComponent extends DisposableComponent {
3001
+ const TEXT_SEARCH_FORMATTER_KEY = `aup:table:textSearchFormatter`;
3002
+ const Keys = Enum("useFunction", "useInstance", "useClass");
3003
+ function EnableCellTextSearch(options) {
3004
+ assert$1.notNil(options);
3005
+ return (constructor) => {
3006
+ const klass = Klass.get(constructor);
3007
+ assert$1.isFalsey(klass.hasOwnMetadata(TEXT_SEARCH_FORMATTER_KEY), "class already decorated with @EnableCellTextSearch");
3008
+ klass.defineMetadata(TEXT_SEARCH_FORMATTER_KEY, options);
3009
+ };
3010
+ }
3011
+ (function (EnableCellTextSearch) {
3012
+ function getFormatter(renderer, useDefault) {
3013
+ var _a;
3014
+ const options = (_a = Klass.get(renderer).getMetadata(TEXT_SEARCH_FORMATTER_KEY)) !== null && _a !== void 0 ? _a : {};
3015
+ if (options[Keys.useFunction]) {
3016
+ return ColumnTextSearchFormatter.forFormatter(options[Keys.useFunction]);
3017
+ }
3018
+ if (options[Keys.useInstance]) {
3019
+ return options[Keys.useInstance];
3020
+ }
3021
+ if (options[Keys.useClass]) {
3022
+ return new ColumnTextSearchFormatter.Delegating(options[Keys.useClass]);
3023
+ }
3024
+ return useDefault();
3025
+ }
3026
+ EnableCellTextSearch.getFormatter = getFormatter;
3027
+ })(EnableCellTextSearch || (EnableCellTextSearch = {}));
3028
+
3029
+ let DefaultCellRendererComponent = class DefaultCellRendererComponent {
3030
+ constructor() {
3031
+ }
3032
+ set value(value) {
3033
+ this._value = value;
3034
+ }
3035
+ get value() {
3036
+ return this._value;
3037
+ }
3038
+ };
3039
+ DefaultCellRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DefaultCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3040
+ DefaultCellRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: DefaultCellRendererComponent, selector: "aup-default-cell-renderer", inputs: { value: "value" }, ngImport: i0, template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n", styles: [""], pipes: { "aupHighlight": HighlightPipe } });
3041
+ DefaultCellRendererComponent = __decorate([
3042
+ EnableCellTextSearch({ useClass: ColumnTextSearchFormatter.DefaultValueFormatter }),
3043
+ __metadata("design:paramtypes", [])
3044
+ ], DefaultCellRendererComponent);
3045
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DefaultCellRendererComponent, decorators: [{
3046
+ type: Component,
3047
+ args: [{ selector: "aup-default-cell-renderer", template: "<span [innerHTML]=\"value| aupHighlight\"></span>\n", styles: [""] }]
3048
+ }], ctorParameters: function () { return []; }, propDecorators: { value: [{
3049
+ type: Input
3050
+ }] } });
3051
+
3052
+ class EditRowControls extends DisposableComponent {
3053
+ constructor() {
3054
+ super();
3055
+ this.saveCommand = Command.create(() => __awaiter(this, void 0, void 0, function* () {
3056
+ const finished = yield this.editSession.saveCommand.execute();
3057
+ if (finished) {
3058
+ this.editSession.dispose();
3059
+ }
3060
+ }));
3061
+ this.cancelCommand = Command.create(() => {
3062
+ this.editSession.dispose();
3063
+ }).disableWhile(this.saveCommand.busy);
3064
+ }
3065
+ set editSession(session) {
3066
+ if (session) {
3067
+ session.form.disableWhile(this.saveCommand.busy);
3068
+ }
3069
+ this._session = session;
3070
+ }
3071
+ get editSession() {
3072
+ return this._session;
3073
+ }
3074
+ ngOnInit() {
3075
+ }
3076
+ get form() {
3077
+ var _a;
3078
+ return (_a = this.editSession) === null || _a === void 0 ? void 0 : _a.form;
3079
+ }
3080
+ }
3081
+ EditRowControls.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: EditRowControls, deps: [], target: i0.ɵɵFactoryTarget.Component });
3082
+ EditRowControls.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: EditRowControls, selector: "aup-row-editor-controls", inputs: { row: "row", editRowCommand: "editRowCommand", editSession: "editSession" }, usesInheritance: true, ngImport: i0, template: "<button *ngIf=\"!editSession\" mat-icon-button [pectinCommand]=\"editRowCommand\" class=\"edit-button\"><aup-icon icon=\"mat:edit\"></aup-icon></button>\n<button *ngIf=\"editSession\" mat-icon-button [pectinCommand]=\"saveCommand\"><aup-icon icon=\"mat:done\"></aup-icon></button>\n<button *ngIf=\"editSession\" mat-icon-button [pectinCommand]=\"cancelCommand\"><aup-icon icon=\"mat:clear\"></aup-icon></button>\n", styles: [":host{display:block;width:80px}.edit-button{visibility:hidden}:host-context(tr:hover) .edit-button{visibility:visible}\n"], components: [{ type: i1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: IconComponent, selector: "aup-icon", inputs: ["icon"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }] });
3083
+ __decorate([
3084
+ TrackExternal(),
3085
+ __metadata("design:type", Command)
3086
+ ], EditRowControls.prototype, "editRowCommand", void 0);
3087
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: EditRowControls, decorators: [{
3088
+ type: Component,
3089
+ args: [{ selector: 'aup-row-editor-controls', template: "<button *ngIf=\"!editSession\" mat-icon-button [pectinCommand]=\"editRowCommand\" class=\"edit-button\"><aup-icon icon=\"mat:edit\"></aup-icon></button>\n<button *ngIf=\"editSession\" mat-icon-button [pectinCommand]=\"saveCommand\"><aup-icon icon=\"mat:done\"></aup-icon></button>\n<button *ngIf=\"editSession\" mat-icon-button [pectinCommand]=\"cancelCommand\"><aup-icon icon=\"mat:clear\"></aup-icon></button>\n", styles: [":host{display:block;width:80px}.edit-button{visibility:hidden}:host-context(tr:hover) .edit-button{visibility:visible}\n"] }]
3090
+ }], ctorParameters: function () { return []; }, propDecorators: { row: [{
3091
+ type: Input
3092
+ }], editRowCommand: [{
3093
+ type: Input
3094
+ }], editSession: [{
3095
+ type: Input
3096
+ }] } });
3097
+
3098
+ let formatter = (row) => row.map(e => e === null || e === void 0 ? void 0 : e.toString()).join(", ");
3099
+ let DefaultListCellRendererComponent = class DefaultListCellRendererComponent extends DisposableComponent {
3100
+ constructor() {
3101
+ super();
3102
+ const { chain } = Dsl.disposeWith(this);
3103
+ this.text$ = chain(this.value$).reduce(formatter);
3104
+ }
3105
+ };
3106
+ DefaultListCellRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DefaultListCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3107
+ DefaultListCellRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: DefaultListCellRendererComponent, selector: "aup-default-list-cell-renderer", inputs: { value$: "value$", value: "value" }, usesInheritance: true, ngImport: i0, template: "<span [innerHTML]=\"text$.value| aupHighlight\"></span>\n", styles: [""], pipes: { "aupHighlight": HighlightPipe } });
3108
+ __decorate([
3109
+ TrackExternal(),
3110
+ __metadata("design:type", ListModel)
3111
+ ], DefaultListCellRendererComponent.prototype, "value$", void 0);
3112
+ __decorate([
3113
+ StoreInListModel("value$"),
3114
+ __metadata("design:type", Array)
3115
+ ], DefaultListCellRendererComponent.prototype, "value", void 0);
3116
+ DefaultListCellRendererComponent = __decorate([
3117
+ EnableCellTextSearch({ useClass: ColumnTextSearchFormatter.DefaultArrayFormatter }),
3118
+ __metadata("design:paramtypes", [])
3119
+ ], DefaultListCellRendererComponent);
3120
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: DefaultListCellRendererComponent, decorators: [{
3121
+ type: Component,
3122
+ args: [{ selector: "aup-default-list-cell-renderer", template: "<span [innerHTML]=\"text$.value| aupHighlight\"></span>\n", styles: [""] }]
3123
+ }], ctorParameters: function () { return []; }, propDecorators: { value$: [{
3124
+ type: Input
3125
+ }], value: [{
3126
+ type: Input
3127
+ }] } });
3128
+
3129
+ class SelectionCellComponent extends DisposableComponent {
3130
+ constructor() {
3131
+ super();
3132
+ this.selectCommand = Command.create(() => {
3133
+ var _a;
3134
+ (_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.selectCommand.execute(this.row);
3135
+ });
3136
+ }
3137
+ isSelected() {
3138
+ var _a;
3139
+ return (_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.isSelected(this.row);
3140
+ }
3141
+ }
3142
+ SelectionCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SelectionCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3143
+ SelectionCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: SelectionCellComponent, selector: "aup-selection-cell", inputs: { row: "row" }, usesInheritance: true, ngImport: i0, template: "<mat-checkbox [pectinCommand]=\"selectCommand\" [checked]=\"isSelected()\"></mat-checkbox>\n", styles: [""], components: [{ type: i1$9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], directives: [{ type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }] });
3144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SelectionCellComponent, decorators: [{
3145
+ type: Component,
3146
+ args: [{ selector: 'aup-selection-cell', template: "<mat-checkbox [pectinCommand]=\"selectCommand\" [checked]=\"isSelected()\"></mat-checkbox>\n", styles: [""] }]
3147
+ }], ctorParameters: function () { return []; }, propDecorators: { row: [{
3148
+ type: Input
3149
+ }] } });
3150
+
3151
+ class SelectionHeaderCellComponent extends DisposableComponent {
3152
+ constructor() {
3153
+ super();
3154
+ this.selectCommand = Command.create(() => {
3155
+ this.selectionModel.toggleAllCommand.execute();
3156
+ });
3157
+ }
3158
+ isSelected() {
3159
+ var _a;
3160
+ return ((_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.allSelected.value) || false;
3161
+ }
3162
+ isIntermediate() {
3163
+ var _a;
3164
+ return ((_a = this.selectionModel) === null || _a === void 0 ? void 0 : _a.someSelected.value) || false;
3165
+ }
3166
+ isVisible() {
3167
+ return this.enableHeaderControls && this.selectionModel.getDelegate() instanceof MultipleSelectionModel;
3168
+ }
3169
+ }
3170
+ SelectionHeaderCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SelectionHeaderCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3171
+ SelectionHeaderCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: SelectionHeaderCellComponent, selector: "aup-selection-header-cell", usesInheritance: true, ngImport: i0, template: "<mat-checkbox *ngIf=\"isVisible()\" [pectinCommand]=\"selectCommand\" [checked]=\"isSelected()\" [indeterminate]=\"this.isIntermediate()\"></mat-checkbox>\n", styles: [""], components: [{ type: i1$9.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: CommandDirective, selector: "[pectinCommand]", inputs: ["pectinCommand", "commandParameter"] }] });
3172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SelectionHeaderCellComponent, decorators: [{
3173
+ type: Component,
3174
+ args: [{ selector: 'aup-selection-header-cell', template: "<mat-checkbox *ngIf=\"isVisible()\" [pectinCommand]=\"selectCommand\" [checked]=\"isSelected()\" [indeterminate]=\"this.isIntermediate()\"></mat-checkbox>\n", styles: [""] }]
3175
+ }], ctorParameters: function () { return []; } });
3176
+
3177
+ class TableCellComponent extends DisposableComponent {
3240
3178
  constructor() {
3241
3179
  super();
3242
3180
  this.defaultClassNames = 'aup-cell-renderer';
@@ -3248,7 +3186,7 @@ class TableCellRendererComponent extends DisposableComponent {
3248
3186
  }
3249
3187
  ngOnInit() {
3250
3188
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
3251
- this.firstEditableColumn = chain(this.tableModel.firstEditableColumn).equals(this.column); // this would break if the column changed.
3189
+ this.firstEditableColumn = chain(this.tableModel.firstEditableColumn$).equals(this.column); // this would break if the column changed.
3252
3190
  this.column.attachCell(this);
3253
3191
  }
3254
3192
  hasActiveEditor() {
@@ -3296,11 +3234,11 @@ class TableCellRendererComponent extends DisposableComponent {
3296
3234
  };
3297
3235
  }
3298
3236
  }
3299
- TableCellRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3300
- TableCellRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: TableCellRendererComponent, selector: "aup-table-cell-renderer", inputs: { row: "row", column: "column", editSession: "editSession", tableModel: "tableModel" }, host: { properties: { "class": "this.defaultClassNames", "class.fillCell": "this.fillCell", "class.padChild": "this.padChild" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!hasActiveEditor()\" [cdkPortalOutlet]=\"getRendererPortal()\" (attached)=\"initialiseRenderer($event)\"></ng-container>\n<ng-container *ngIf=\"hasActiveEditor()\" [cdkPortalOutlet]=\"getEditorPortal()\" (attached)=\"initialiseEditor($event)\"></ng-container>\n", styles: [""], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$4.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
3301
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableCellRendererComponent, decorators: [{
3237
+ TableCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3238
+ TableCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: TableCellComponent, selector: "aup-table-cell", inputs: { row: "row", column: "column", editSession: "editSession", tableModel: "tableModel" }, host: { properties: { "class": "this.defaultClassNames", "class.fillCell": "this.fillCell", "class.padChild": "this.padChild" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"!hasActiveEditor()\" [cdkPortalOutlet]=\"getRendererPortal()\" (attached)=\"initialiseRenderer($event)\"></ng-container>\n<ng-container *ngIf=\"hasActiveEditor()\" [cdkPortalOutlet]=\"getEditorPortal()\" (attached)=\"initialiseEditor($event)\"></ng-container>\n", styles: [""], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$4.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
3239
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableCellComponent, decorators: [{
3302
3240
  type: Component,
3303
- args: [{ selector: 'aup-table-cell-renderer', template: "<ng-container *ngIf=\"!hasActiveEditor()\" [cdkPortalOutlet]=\"getRendererPortal()\" (attached)=\"initialiseRenderer($event)\"></ng-container>\n<ng-container *ngIf=\"hasActiveEditor()\" [cdkPortalOutlet]=\"getEditorPortal()\" (attached)=\"initialiseEditor($event)\"></ng-container>\n", styles: [""] }]
3241
+ args: [{ selector: 'aup-table-cell', template: "<ng-container *ngIf=\"!hasActiveEditor()\" [cdkPortalOutlet]=\"getRendererPortal()\" (attached)=\"initialiseRenderer($event)\"></ng-container>\n<ng-container *ngIf=\"hasActiveEditor()\" [cdkPortalOutlet]=\"getEditorPortal()\" (attached)=\"initialiseEditor($event)\"></ng-container>\n", styles: [""] }]
3304
3242
  }], ctorParameters: function () { return []; }, propDecorators: { row: [{
3305
3243
  type: Input
3306
3244
  }], column: [{
@@ -3320,7 +3258,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
3320
3258
  args: ['class.padChild']
3321
3259
  }] } });
3322
3260
 
3323
- class TableHeaderCellRendererComponent {
3261
+ class TableHeaderCellComponent {
3324
3262
  constructor() {
3325
3263
  this.defaultClassNames = 'aup-header-cell-renderer';
3326
3264
  }
@@ -3335,11 +3273,11 @@ class TableHeaderCellRendererComponent {
3335
3273
  return this[HEADER_CELL_RENDERER_PORTAL];
3336
3274
  }
3337
3275
  }
3338
- TableHeaderCellRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableHeaderCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3339
- TableHeaderCellRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: TableHeaderCellRendererComponent, selector: "aup-table-header-cell-renderer", inputs: { column: "column" }, host: { properties: { "class": "this.defaultClassNames" } }, ngImport: i0, template: "<ng-container [cdkPortalOutlet]=\"getPortal()\" (attached)=\"initialiseHeader($event)\"></ng-container>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%}\n"], directives: [{ type: i2$4.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
3340
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableHeaderCellRendererComponent, decorators: [{
3276
+ TableHeaderCellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableHeaderCellComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3277
+ TableHeaderCellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: { column: "column" }, host: { properties: { "class": "this.defaultClassNames" } }, ngImport: i0, template: "<ng-container [cdkPortalOutlet]=\"getPortal()\" (attached)=\"initialiseHeader($event)\"></ng-container>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%}\n"], directives: [{ type: i2$4.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
3278
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableHeaderCellComponent, decorators: [{
3341
3279
  type: Component,
3342
- args: [{ selector: 'aup-table-header-cell-renderer', template: "<ng-container [cdkPortalOutlet]=\"getPortal()\" (attached)=\"initialiseHeader($event)\"></ng-container>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%}\n"] }]
3280
+ args: [{ selector: 'aup-table-header-cell', template: "<ng-container [cdkPortalOutlet]=\"getPortal()\" (attached)=\"initialiseHeader($event)\"></ng-container>\n", styles: [":host{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%}\n"] }]
3343
3281
  }], ctorParameters: function () { return []; }, propDecorators: { column: [{
3344
3282
  type: Input
3345
3283
  }], defaultClassNames: [{
@@ -3425,18 +3363,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
3425
3363
  class ColumnListModel extends AbstractComputedListModel {
3426
3364
  constructor() {
3427
3365
  super();
3428
- this._allColumns = new MutableListModel();
3366
+ this._allColumns$ = new MutableListModel();
3429
3367
  const { chain } = Dsl.disposeWith(this);
3430
- this.columnsById = chain(this._allColumns).indexBy('columnId');
3368
+ this.columnsById$ = chain(this._allColumns$).indexBy('columnId');
3431
3369
  }
3432
- get allColumns() {
3433
- return this._allColumns.readonly;
3370
+ get allColumns$() {
3371
+ return this._allColumns$.readonly;
3434
3372
  }
3435
3373
  getColumn(id) {
3436
- return this.columnsById.get(id);
3374
+ return this.columnsById$.get(id);
3437
3375
  }
3438
3376
  hasColumn(id) {
3439
- return !!this.columnsById.get(id);
3377
+ return !!this.columnsById$.get(id);
3440
3378
  }
3441
3379
  addColumn(column, index) {
3442
3380
  if (this.hasColumn(column.columnId)) {
@@ -3445,17 +3383,227 @@ class ColumnListModel extends AbstractComputedListModel {
3445
3383
  this.registerDisposable(column);
3446
3384
  this.runInTransaction(() => {
3447
3385
  if (!isNil(index)) {
3448
- this._allColumns.insert(index, column);
3386
+ this._allColumns$.insert(index, column);
3449
3387
  }
3450
3388
  else {
3451
- this._allColumns.push(column);
3389
+ this._allColumns$.push(column);
3452
3390
  }
3453
- this.registerDisposable(this.trackSource(column.visible));
3391
+ this.registerDisposable(this.trackSource(column.visible$));
3454
3392
  });
3455
3393
  return column;
3456
3394
  }
3457
3395
  doComputeValue() {
3458
- return this._allColumns.value.filter(c => c.visible.value);
3396
+ return this._allColumns$.value.filter(c => c.visible$.value);
3397
+ }
3398
+ }
3399
+
3400
+ class CustomValueColumnModel extends ColumnModel {
3401
+ constructor(columnId, defaults, getValue) {
3402
+ super(columnId, defaults);
3403
+ this.getValue = getValue;
3404
+ this.cellRenderer(DefaultCellRendererComponent);
3405
+ }
3406
+ cellRenderer(componentType, onComponentInitOrOptions) {
3407
+ this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => new ColumnTextSearchFormatter.Null()), row => this.getValue(row));
3408
+ this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3409
+ if (firstTime) {
3410
+ if (isFunction(onComponentInitOrOptions)) {
3411
+ onComponentInitOrOptions(component);
3412
+ }
3413
+ else {
3414
+ if (isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onComponentInit)) {
3415
+ onComponentInitOrOptions.onComponentInit(component);
3416
+ }
3417
+ }
3418
+ }
3419
+ component.value = this.getValue(rowData.row);
3420
+ if (!isFunction(onComponentInitOrOptions) && isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onRowUpdate)) {
3421
+ onComponentInitOrOptions.onRowUpdate(component, rowData.row);
3422
+ }
3423
+ }));
3424
+ return this;
3425
+ }
3426
+ selectRowOnClick(selectOnRowClick) {
3427
+ return this._selectRowOnClick(selectOnRowClick);
3428
+ }
3429
+ }
3430
+
3431
+ class EditorControlColumnModel extends ColumnModel {
3432
+ constructor(columnId, saveCommandFactory, defaults) {
3433
+ super(columnId, defaults);
3434
+ this.cellRenderer(EditRowControls);
3435
+ }
3436
+ cellRenderer(componentType) {
3437
+ this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData) => {
3438
+ component.row = rowData.row;
3439
+ component.editSession = rowData.editSession;
3440
+ component.editRowCommand = rowData.editRowCommand;
3441
+ }));
3442
+ return this;
3443
+ }
3444
+ getDefaultHeaderText() {
3445
+ return '';
3446
+ }
3447
+ }
3448
+
3449
+ class ListPropertyColumnModel extends ColumnModel {
3450
+ constructor(id, property, defaults) {
3451
+ super(id, defaults);
3452
+ this.property = property;
3453
+ this._format = (value) => value.map(v => v === null || v === void 0 ? void 0 : v.toString()).join(", ");
3454
+ this.cellRenderer(DefaultListCellRendererComponent);
3455
+ }
3456
+ cellRenderer(componentType) {
3457
+ this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => new ColumnTextSearchFormatter.DefaultArrayFormatter()), row => row[this.property]);
3458
+ this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData) => {
3459
+ let rowElement = rowData.row[this.property];
3460
+ // @ts-ignore Started complaining in ts 4.5.. but I think my logic is correct...
3461
+ component.value = this._format(rowElement);
3462
+ }));
3463
+ return this;
3464
+ }
3465
+ cellEditor(editor, validatorsOrInitialiser, initialiseComponent) {
3466
+ const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3467
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
3468
+ this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3469
+ const formListModel = editSession.form.pluckList(this.property);
3470
+ if (validators) {
3471
+ formListModel.validateUsing(validators);
3472
+ }
3473
+ component.listModel = formListModel;
3474
+ if (initialiser) {
3475
+ initialiser(component);
3476
+ }
3477
+ }));
3478
+ return this;
3479
+ }
3480
+ format(formatter) {
3481
+ assert$1.isFunction(formatter);
3482
+ this._format = formatter;
3483
+ return this;
3484
+ }
3485
+ selectRowOnClick(selectRowOnClick) {
3486
+ return this._selectRowOnClick(selectRowOnClick);
3487
+ }
3488
+ }
3489
+
3490
+ class PropertyColumnModel extends ColumnModel {
3491
+ constructor(id, property, defaults) {
3492
+ super(id, defaults);
3493
+ this.property = property;
3494
+ this._format = (value) => value === null || value === void 0 ? void 0 : value.toString();
3495
+ this.cellRenderer(DefaultCellRendererComponent);
3496
+ }
3497
+ cellRenderer(componentType, onComponentInitOrOptions) {
3498
+ this.configureColumnTextSearch(EnableCellTextSearch.getFormatter(componentType, () => new ColumnTextSearchFormatter.DefaultValueFormatter()), row => row[this.property]);
3499
+ this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3500
+ if (firstTime) {
3501
+ if (isFunction(onComponentInitOrOptions)) {
3502
+ onComponentInitOrOptions(component);
3503
+ }
3504
+ else {
3505
+ if (isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onComponentInit)) {
3506
+ onComponentInitOrOptions.onComponentInit(component);
3507
+ }
3508
+ }
3509
+ }
3510
+ component.value = this._format(rowData.row[this.property]);
3511
+ }));
3512
+ return this;
3513
+ }
3514
+ liveEditCellRenderer(componentType, options) {
3515
+ return this.mutableCellRenderer(componentType, options);
3516
+ }
3517
+ /**
3518
+ * Deprecated. Use #liveEditCellRenderer instead.
3519
+ * @param componentType
3520
+ * @param options
3521
+ */
3522
+ mutableCellRenderer(componentType, options) {
3523
+ this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
3524
+ // keep a local copy most recent row value so it's available to teh
3525
+ // edit callback without having to add/remove subscribers all the time.
3526
+ component[ColumnModel.CELL_RENDERER_COMPONENT_ROW_CACHE] = rowData.row;
3527
+ let disableEditCallback = false;
3528
+ if (firstTime) {
3529
+ if (isFunction(options === null || options === void 0 ? void 0 : options.onComponentInit)) {
3530
+ options.onComponentInit(component);
3531
+ }
3532
+ // install our edit callback
3533
+ component.onValueEdited((is, was) => {
3534
+ if (!disableEditCallback) {
3535
+ options.onValueEdit(component[ColumnModel.CELL_RENDERER_COMPONENT_ROW_CACHE], is, was);
3536
+ }
3537
+ });
3538
+ }
3539
+ // now push the value the component and disable the callback just incase the component misbehaves
3540
+ // and fires a value change during the operation.
3541
+ disableEditCallback = true;
3542
+ component.value = rowData.row[this.property];
3543
+ disableEditCallback = false;
3544
+ if (!isFunction(options) && isFunction(options === null || options === void 0 ? void 0 : options.onRowUpdate)) {
3545
+ options.onRowUpdate(component, rowData.row);
3546
+ }
3547
+ }));
3548
+ return this;
3549
+ }
3550
+ cellEditor(editor, validatorsOrInitialiser, onComponentInit) {
3551
+ const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
3552
+ const initialiser = isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
3553
+ this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
3554
+ const formValueModel = editSession.form.pluck(this.property);
3555
+ if (validators) {
3556
+ formValueModel.validateUsing(validators);
3557
+ }
3558
+ component.valueModel = formValueModel;
3559
+ if (initialiser) {
3560
+ initialiser(component);
3561
+ }
3562
+ }));
3563
+ return this;
3564
+ }
3565
+ format(formatter) {
3566
+ assert$1.isFunction(formatter);
3567
+ this._format = formatter;
3568
+ return this;
3569
+ }
3570
+ selectRowOnClick(selectOnRowClick) {
3571
+ return this._selectRowOnClick(selectOnRowClick);
3572
+ }
3573
+ }
3574
+
3575
+ class SelectionColumnModel extends ColumnModel {
3576
+ constructor(columnId, defaults, selectionModel) {
3577
+ super(columnId, defaults);
3578
+ this._enableHeaderControls = true;
3579
+ this.selectionModel = DelegatingSelectionModel.createDelegate();
3580
+ this._selectRowOnClick(false);
3581
+ this.cellHeaderRenderer(SelectionHeaderCellComponent, (component) => {
3582
+ component.selectionModel = this.selectionModel;
3583
+ component.enableHeaderControls = this._enableHeaderControls;
3584
+ });
3585
+ this.configureCellRenderer(new ComponentCellRendererPortalRef(SelectionCellComponent, (component, rowData) => {
3586
+ component.row = rowData.row;
3587
+ component.selectionModel = this.selectionModel;
3588
+ }));
3589
+ this.setSelectionModel(selectionModel);
3590
+ }
3591
+ setSelectionModel(selectionModel) {
3592
+ this.selectionModel.setDelegate(selectionModel);
3593
+ this.setDefaultVisibility(selectionModel instanceof MultipleSelectionModel ? ValueModel.TRUE : ValueModel.FALSE);
3594
+ }
3595
+ getDefaultHeaderText() {
3596
+ return '';
3597
+ }
3598
+ enableHeaderControls(enable) {
3599
+ this._enableHeaderControls = enable;
3600
+ return this;
3601
+ }
3602
+ selectRow(row) {
3603
+ this.selectionModel.selectCommand.execute(row);
3604
+ }
3605
+ isSelected(row) {
3606
+ return this.selectionModel.isSelected(row);
3459
3607
  }
3460
3608
  }
3461
3609
 
@@ -3465,21 +3613,23 @@ class EditSession extends GarbageCollector {
3465
3613
  this.rowId = rowId;
3466
3614
  this.form = form;
3467
3615
  this.saveCommand = saveCommand;
3468
- this._liveRowValue = new MutableValueModel();
3469
- this.liveRowValue = this._liveRowValue.readonly;
3616
+ this._liveRowValue$ = new MutableValueModel();
3617
+ this.liveRowValue$ = this._liveRowValue$.readonly;
3470
3618
  this.form.load(row);
3471
- this._liveRowValue.value = row;
3619
+ this._liveRowValue$.value = row;
3472
3620
  this.form.onEdit(() => {
3473
3621
  // if (!this._liveRowValue.value[immerable]) {
3474
3622
  // console.warn()
3475
3623
  // }
3476
- this._liveRowValue.value = produce(this._liveRowValue.value, draft => {
3624
+ this._liveRowValue$.value = produce(this._liveRowValue$.value, draft => {
3477
3625
  this.form.writeDirtyStateTo(draft);
3478
3626
  });
3479
3627
  });
3480
3628
  }
3481
3629
  }
3482
3630
 
3631
+ var DefaultValueFormatter = ColumnTextSearchFormatter.DefaultValueFormatter;
3632
+ var DefaultArrayFormatter = ColumnTextSearchFormatter.DefaultArrayFormatter;
3483
3633
  // export type StringPropertiesOf<T> = { [K in keyof T]: T[K] extends string ? K : never }[keyof T];
3484
3634
  // export type NumberPropertiesOf<T> = { [K in keyof T]: T[K] extends number ? K : never }[keyof T];
3485
3635
  class RowClass {
@@ -3496,39 +3646,69 @@ class AbstractTableModel extends GarbageCollector {
3496
3646
  this._editorSessions = new MutableListModel();
3497
3647
  this.rowClassNamePredicates = [];
3498
3648
  this.rowClickListeners = new EventListenerList();
3649
+ this._searchText$ = new DelegatingValueModel();
3499
3650
  this._createForm = (row) => new DirtyTrackingForm();
3500
3651
  this.trackBy = (index, item) => {
3501
3652
  return this.identityOf ? this.identityOf(item) : index;
3502
3653
  };
3503
3654
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
3504
- this._rowsBeingEdited = new MutableListModel([], {
3655
+ this._rowsBeingEdited$ = new MutableListModel([], {
3505
3656
  identifiedWith: row => this.identityOf(row)
3506
3657
  });
3507
- this._editorSessionByRowId = chain(this._editorSessions).indexBy('rowId');
3508
- this.editing = chain(this._editorSessions).count().isGreaterThan(0);
3509
- this.dataSource = chain(this._dataSource).replaceAll(this.rowsBeingEdited);
3510
- this.firstEditableColumn = chain(this.columns).select(c => c.hasEditorPortal()).first();
3511
- this.firstVisibleColumn = chain(this._columnList).first();
3512
- this.lastVisibleColumn = chain(this._columnList).last();
3513
- this.rowSelectionDisabledOnAllColumns = chain(this._columnList).select(column => column.isRowSelectionEnabled()).count().equals(0);
3658
+ this._editorSessionByRowId = chain(this._editorSessions).indexBy("rowId");
3659
+ this.editing$ = chain(this._editorSessions).count().isGreaterThan(0);
3660
+ this._textSearchPredicate$ = chain(this._searchText$).map(text => {
3661
+ return _.isEmpty(text) ? Functions.identity : (rows) => {
3662
+ const regex = new RegExp(escapeStringRegexp(text), "i");
3663
+ return rows.filter(row => this.hasMatchingColumn(row, regex));
3664
+ };
3665
+ }, {
3666
+ allowNil: true,
3667
+ dependsOn: this.columns
3668
+ });
3669
+ this.dataSource = chain(this._dataSource)
3670
+ .reduceToList(items => this._textSearchPredicate$.value(items), {
3671
+ dependsOn: this._textSearchPredicate$
3672
+ })
3673
+ .replaceAll(this.rowsBeingEdited$);
3674
+ this.firstEditableColumn$ = chain(this.columns).select(c => c.hasEditorPortal()).first();
3675
+ this.firstVisibleColumn$ = chain(this._columnList).first();
3676
+ this.lastVisibleColumn$ = chain(this._columnList).last();
3677
+ this.rowSelectionDisabledOnAllColumns$ = chain(this._columnList).select(column => column.isRowSelectionEnabled()).count().equals(0);
3514
3678
  }
3515
3679
  findMatchingColumns(row, regex) {
3516
- return this.columns.value.filter(c => c.isTextMatch(row, regex));
3680
+ return this.columns.value.filter(c => regex.test(c.getSearchTextFor(row)));
3517
3681
  }
3682
+ // @Trace()
3518
3683
  hasMatchingColumn(row, regex) {
3519
- return !!this.columns.value.find(c => c.isTextMatch(row, regex));
3684
+ return !!this.columns.value.find(c => regex.test(c.getSearchTextFor(row)));
3685
+ }
3686
+ initialise(injector) {
3687
+ // not sure if I should define these at the module level or not...
3688
+ const customInjector = Injector.create({
3689
+ providers: [
3690
+ { provide: DefaultValueFormatter },
3691
+ { provide: DefaultArrayFormatter }
3692
+ ],
3693
+ parent: injector
3694
+ });
3695
+ this.columns.value.forEach(c => c.initialise(customInjector));
3520
3696
  }
3521
3697
  setDataSource(sourceOfTruth) {
3522
3698
  this._dataSource.setDelegate(sourceOfTruth);
3523
3699
  }
3700
+ setTextSearch(searchText$, throttleDelayMilliseconds = 100) {
3701
+ const { chain } = Dsl.disposeWith(this);
3702
+ this._searchText$.setDelegate(chain(searchText$).throttle(throttleDelayMilliseconds));
3703
+ }
3524
3704
  identityOf(row) {
3525
3705
  return this._dataSource.identityOf(row);
3526
3706
  }
3527
- get rowsBeingEdited() {
3528
- return this._rowsBeingEdited.readonly;
3707
+ get rowsBeingEdited$() {
3708
+ return this._rowsBeingEdited$.readonly;
3529
3709
  }
3530
3710
  get columns() {
3531
- return this._columnList.allColumns;
3711
+ return this._columnList.allColumns$;
3532
3712
  }
3533
3713
  get visibleColumns() {
3534
3714
  return this._columnList.readonly;
@@ -3543,9 +3723,9 @@ class AbstractTableModel extends GarbageCollector {
3543
3723
  }
3544
3724
  _addSelectionColumn(selectionModel, visible) {
3545
3725
  assert.isNil(this.selectionColumnModel);
3546
- const columnId = 'selection-column';
3726
+ const columnId = "selection-column";
3547
3727
  this.selectionColumnModel = new SelectionColumnModel(columnId, () => this.getColumnTextProperties(columnId), selectionModel);
3548
- this.addRowClass('aup-row-selected', row => this.selectionColumnModel.isSelected(row));
3728
+ this.addRowClass("aup-row-selected", row => this.selectionColumnModel.isSelected(row));
3549
3729
  const selectionColumnModel = this.addColumn(this.selectionColumnModel, 0);
3550
3730
  if (!isNil(visible)) {
3551
3731
  selectionColumnModel.visibleWhile(visible instanceof ValueModel ? visible : ValueModel.constant(visible));
@@ -3557,7 +3737,7 @@ class AbstractTableModel extends GarbageCollector {
3557
3737
  if (isFunction(formFactory)) {
3558
3738
  this._createForm = formFactory;
3559
3739
  }
3560
- const columnId = 'editControls';
3740
+ const columnId = "editControls";
3561
3741
  return this.addColumn(new EditorControlColumnModel(columnId, saveCommandFactory, () => this.getColumnTextProperties(columnId)));
3562
3742
  }
3563
3743
  addCustomColumn(columnId, dataAccessor) {
@@ -3599,7 +3779,7 @@ class AbstractTableModel extends GarbageCollector {
3599
3779
  }
3600
3780
  startEditSession(row) {
3601
3781
  const rowId = this.identityOf(row);
3602
- if (this._rowsBeingEdited.query().indexOf(row) > -1) {
3782
+ if (this._rowsBeingEdited$.query().indexOf(row) > -1) {
3603
3783
  return lang.illegalState(`Row with id=${rowId} already being edited`);
3604
3784
  }
3605
3785
  // todo: pass the factories to the edit session so we can make the whole lot pluggable?
@@ -3607,12 +3787,12 @@ class AbstractTableModel extends GarbageCollector {
3607
3787
  const saveCommand = this.saveCommandFactory.create(form);
3608
3788
  const editSession = new EditSession(rowId, row, form, saveCommand);
3609
3789
  const { when } = Dsl.disposeWith(editSession);
3610
- when(editSession.liveRowValue).changes((editedValue) => {
3611
- this._rowsBeingEdited.replaceOrPush(editedValue);
3612
- }, { initialValue: 'triggerChangeUnlessNil' });
3790
+ when(editSession.liveRowValue$).changes((editedValue) => {
3791
+ this._rowsBeingEdited$.replaceOrPush(editedValue);
3792
+ }, { initialValue: "triggerChangeUnlessNil" });
3613
3793
  this._editorSessions.push(editSession);
3614
3794
  editSession.onDispose(() => {
3615
- this._rowsBeingEdited.remove(editSession.liveRowValue.value);
3795
+ this._rowsBeingEdited$.remove(editSession.liveRowValue$.value);
3616
3796
  this._editorSessions.remove(editSession);
3617
3797
  });
3618
3798
  return editSession;
@@ -3622,7 +3802,7 @@ class AbstractTableModel extends GarbageCollector {
3622
3802
  }
3623
3803
  cancelAllEditorSessions() {
3624
3804
  this._editorSessions.runInTransaction((draft) => {
3625
- this._rowsBeingEdited.runInTransaction(() => {
3805
+ this._rowsBeingEdited$.runInTransaction(() => {
3626
3806
  draft.value.forEach(session => session.dispose());
3627
3807
  });
3628
3808
  });
@@ -3631,7 +3811,7 @@ class AbstractTableModel extends GarbageCollector {
3631
3811
  return this.isRowSelectionEnabled() && column.isRowSelectionEnabled();
3632
3812
  }
3633
3813
  isRowSelectionEnabled() {
3634
- return this.hasUserSelectionModel() && !this.rowSelectionDisabledOnAllColumns.value;
3814
+ return this.hasUserSelectionModel() && !this.rowSelectionDisabledOnAllColumns$.value;
3635
3815
  }
3636
3816
  hasUserSelectionModel() {
3637
3817
  var _a;
@@ -3666,7 +3846,7 @@ TrackExternal.oneTimeBinding(AbstractTableModel);
3666
3846
  /**
3667
3847
  * Create your model:
3668
3848
  * @example
3669
- * this.heroTableModel = TableModel.fromList(heroList, table => {
3849
+ * this.heroTableModel = new TableModel(heroList, table => {
3670
3850
  * table.pluck("firstName");
3671
3851
  * table.pluck("lastName");
3672
3852
  * table.addCustomColumn("fullName", hero => `${hero.firstName} ${hero.lastName}`);
@@ -3678,7 +3858,7 @@ TrackExternal.oneTimeBinding(AbstractTableModel);
3678
3858
  *
3679
3859
  * Column templates
3680
3860
  * @example
3681
- * this.heroTableModel = TableModel.fromList(heroList, table => {
3861
+ * this.heroTableModel = new TableModel(heroList, table => {
3682
3862
  * table.pluck("firstName");
3683
3863
  * table.pluck("lastName");
3684
3864
  * table.addTemplateColumn("specialColumn");
@@ -3724,17 +3904,17 @@ TrackExternal.oneTimeBinding(AbstractTableModel);
3724
3904
  * }
3725
3905
  */
3726
3906
  class TableComponent extends AbstractTableComponent {
3727
- constructor(elementRef, ngZone) {
3728
- super(elementRef, ngZone);
3907
+ constructor(elementRef, ngZone, injector) {
3908
+ super(elementRef, ngZone, injector);
3729
3909
  }
3730
3910
  getModel() {
3731
3911
  return this.tableModel;
3732
3912
  }
3733
3913
  }
3734
- TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
3914
+ TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TableComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
3735
3915
  TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: TableComponent, selector: "aup-table", inputs: { tableModel: "tableModel" }, providers: [
3736
3916
  { provide: AbstractTableComponent, useExisting: TableComponent }
3737
- ], usesInheritance: true, ngImport: i0, template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"getModel().dataSource.value\" [trackBy]=\"getModel().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-renderer [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell-renderer>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"getModel().isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell-renderer [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"getModel()\"\n [editSession]=\"getModel().getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell-renderer>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds.value\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"getModel().getRowClasses(row)\" [class.enable-hover]=\"getModel().isHoverEnabled()\"\n [attr.aup-row-id]=\"getModel().trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\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"], components: [{ type: i1$b.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: TableHeaderCellRendererComponent, selector: "aup-table-header-cell-renderer", inputs: ["column"] }, { type: TableCellRendererComponent, selector: "aup-table-cell-renderer", inputs: ["row", "column", "editSession", "tableModel"] }, { type: i1$b.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i1$b.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$b.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i1$b.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i1$b.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i1$b.MatCellDef, selector: "[matCellDef]" }, { type: i1$b.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i1$b.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i1$b.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
3917
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"getModel().dataSource.value\" [trackBy]=\"getModel().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]=\"getModel().isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"getModel()\"\n [editSession]=\"getModel().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\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"getModel().getRowClasses(row)\" [class.enable-hover]=\"getModel().isHoverEnabled()\"\n [attr.aup-row-id]=\"getModel().trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\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"], components: [{ type: i1$b.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: ["column"] }, { type: TableCellComponent, selector: "aup-table-cell", inputs: ["row", "column", "editSession", "tableModel"] }, { type: i1$b.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i1$b.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$b.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i1$b.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i1$b.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i1$b.MatCellDef, selector: "[matCellDef]" }, { type: i1$b.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i1$b.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i1$b.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
3738
3918
  __decorate([
3739
3919
  TrackExternal(),
3740
3920
  __metadata("design:type", AbstractTableModel)
@@ -3743,8 +3923,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
3743
3923
  type: Component,
3744
3924
  args: [{ selector: 'aup-table', providers: [
3745
3925
  { provide: AbstractTableComponent, useExisting: TableComponent }
3746
- ], template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"getModel().dataSource.value\" [trackBy]=\"getModel().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-renderer [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell-renderer>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"getModel().isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell-renderer [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"getModel()\"\n [editSession]=\"getModel().getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell-renderer>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds.value\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"getModel().getRowClasses(row)\" [class.enable-hover]=\"getModel().isHoverEnabled()\"\n [attr.aup-row-id]=\"getModel().trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\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"] }]
3747
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { tableModel: [{
3926
+ ], template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"getModel().dataSource.value\" [trackBy]=\"getModel().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]=\"getModel().isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"getModel()\"\n [editSession]=\"getModel().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\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"getModel().getRowClasses(row)\" [class.enable-hover]=\"getModel().isHoverEnabled()\"\n [attr.aup-row-id]=\"getModel().trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\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"] }]
3927
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Injector }]; }, propDecorators: { tableModel: [{
3748
3928
  type: Input
3749
3929
  }] } });
3750
3930
 
@@ -4324,17 +4504,17 @@ class TreeTableModel extends AbstractTableModel {
4324
4504
  * }
4325
4505
  */
4326
4506
  class TreeTableComponent extends AbstractTableComponent {
4327
- constructor(elementRef, ngZone) {
4328
- super(elementRef, ngZone);
4507
+ constructor(elementRef, ngZone, injector) {
4508
+ super(elementRef, ngZone, injector);
4329
4509
  }
4330
4510
  getModel() {
4331
4511
  return this.treeTableModel;
4332
4512
  }
4333
4513
  }
4334
- TreeTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TreeTableComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
4514
+ TreeTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: TreeTableComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
4335
4515
  TreeTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: TreeTableComponent, selector: "aup-tree-table", inputs: { treeTableModel: "treeTableModel" }, providers: [
4336
4516
  { provide: AbstractTableComponent, useExisting: TreeTableComponent }
4337
- ], usesInheritance: true, ngImport: i0, template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"getModel().dataSource.value\" [trackBy]=\"getModel().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-renderer [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell-renderer>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"getModel().isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell-renderer [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"getModel()\"\n [editSession]=\"getModel().getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell-renderer>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds.value\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"getModel().getRowClasses(row)\" [class.enable-hover]=\"getModel().isHoverEnabled()\"\n [attr.aup-row-id]=\"getModel().trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\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", "td.mat-cell{border-top-width:0!important;border-bottom-width:0!important}td.mat-column-tree-label,td.mat-column-tree-label{width:1px}aup-table-cell-renderer[column-id=tree-label]{padding-left:8px!important}aup-tree-label-cell-renderer{flex:1}\n"], components: [{ type: i1$b.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: TableHeaderCellRendererComponent, selector: "aup-table-header-cell-renderer", inputs: ["column"] }, { type: TableCellRendererComponent, selector: "aup-table-cell-renderer", inputs: ["row", "column", "editSession", "tableModel"] }, { type: i1$b.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i1$b.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$b.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i1$b.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i1$b.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i1$b.MatCellDef, selector: "[matCellDef]" }, { type: i1$b.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i1$b.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i1$b.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
4517
+ ], usesInheritance: true, ngImport: i0, template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"getModel().dataSource.value\" [trackBy]=\"getModel().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]=\"getModel().isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"getModel()\"\n [editSession]=\"getModel().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\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"getModel().getRowClasses(row)\" [class.enable-hover]=\"getModel().isHoverEnabled()\"\n [attr.aup-row-id]=\"getModel().trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\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", "td.mat-cell{border-top-width:0!important;border-bottom-width:0!important}td.mat-column-tree-label,td.mat-column-tree-label{width:1px}aup-table-cell-renderer[column-id=tree-label]{padding-left:8px!important}aup-tree-label-cell-renderer{flex:1}\n"], components: [{ type: i1$b.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: TableHeaderCellComponent, selector: "aup-table-header-cell", inputs: ["column"] }, { type: TableCellComponent, selector: "aup-table-cell", inputs: ["row", "column", "editSession", "tableModel"] }, { type: i1$b.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i1$b.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$b.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i1$b.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i1$b.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i1$b.MatCellDef, selector: "[matCellDef]" }, { type: i1$b.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i1$b.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i1$b.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
4338
4518
  __decorate([
4339
4519
  TrackExternal(),
4340
4520
  __metadata("design:type", TreeTableModel)
@@ -4343,8 +4523,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
4343
4523
  type: Component,
4344
4524
  args: [{ selector: 'aup-tree-table', providers: [
4345
4525
  { provide: AbstractTableComponent, useExisting: TreeTableComponent }
4346
- ], template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"getModel().dataSource.value\" [trackBy]=\"getModel().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-renderer [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-header-cell-renderer>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"notifyCellClicked(column, row)\"\n [class.enable-cursor]=\"getModel().isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell-renderer [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"getModel()\"\n [editSession]=\"getModel().getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class]=\"getColumnClasses(column.columnId)\"\n ></aup-table-cell-renderer>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"columnIds.value\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"getModel().getRowClasses(row)\" [class.enable-hover]=\"getModel().isHoverEnabled()\"\n [attr.aup-row-id]=\"getModel().trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\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", "td.mat-cell{border-top-width:0!important;border-bottom-width:0!important}td.mat-column-tree-label,td.mat-column-tree-label{width:1px}aup-table-cell-renderer[column-id=tree-label]{padding-left:8px!important}aup-tree-label-cell-renderer{flex:1}\n"] }]
4347
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { treeTableModel: [{
4526
+ ], template: "<div class=\"scroll-container\">\n <table mat-table [dataSource]=\"getModel().dataSource.value\" [trackBy]=\"getModel().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]=\"getModel().isCursorEnabled(column)\"\n [class.flex]=\"column.isFlex()\"\n [class.hide]=\"!column.isVisible()\"\n >\n <aup-table-cell [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"getModel()\"\n [editSession]=\"getModel().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\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: columnIds.value; let i = index\"\n [ngClass]=\"getModel().getRowClasses(row)\" [class.enable-hover]=\"getModel().isHoverEnabled()\"\n [attr.aup-row-id]=\"getModel().trackBy(i, row)\"\n ></tr>\n\n </table>\n</div>\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", "td.mat-cell{border-top-width:0!important;border-bottom-width:0!important}td.mat-column-tree-label,td.mat-column-tree-label{width:1px}aup-table-cell-renderer[column-id=tree-label]{padding-left:8px!important}aup-tree-label-cell-renderer{flex:1}\n"] }]
4527
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Injector }]; }, propDecorators: { treeTableModel: [{
4348
4528
  type: Input
4349
4529
  }] } });
4350
4530
 
@@ -4572,11 +4752,12 @@ ComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", versio
4572
4752
  EditRowControls,
4573
4753
  ColumnTemplateDirective,
4574
4754
  DefaultCellRendererComponent,
4575
- TableCellRendererComponent,
4576
- SelectCellRendererComponent,
4577
- SelectHeaderCellRendererComponent,
4755
+ DefaultListCellRendererComponent,
4756
+ TableCellComponent,
4757
+ SelectionCellComponent,
4758
+ SelectionHeaderCellComponent,
4578
4759
  DefaultHeaderCellRendererComponent,
4579
- TableHeaderCellRendererComponent,
4760
+ TableHeaderCellComponent,
4580
4761
  IconComponent,
4581
4762
  SectionHeaderComponent,
4582
4763
  TableRowMenuComponent,
@@ -4735,11 +4916,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
4735
4916
  EditRowControls,
4736
4917
  ColumnTemplateDirective,
4737
4918
  DefaultCellRendererComponent,
4738
- TableCellRendererComponent,
4739
- SelectCellRendererComponent,
4740
- SelectHeaderCellRendererComponent,
4919
+ DefaultListCellRendererComponent,
4920
+ TableCellComponent,
4921
+ SelectionCellComponent,
4922
+ SelectionHeaderCellComponent,
4741
4923
  DefaultHeaderCellRendererComponent,
4742
- TableHeaderCellRendererComponent,
4924
+ TableHeaderCellComponent,
4743
4925
  IconComponent,
4744
4926
  SectionHeaderComponent,
4745
4927
  TableRowMenuComponent,
@@ -4863,9 +5045,15 @@ class ActivityActionsComponent extends DisposableComponent {
4863
5045
  this.cancelCommand = activity.cancelCommand;
4864
5046
  this.cdr.detectChanges();
4865
5047
  }
5048
+ focusConfirm() {
5049
+ this.confirmCommandComponent.tryAndFocus();
5050
+ }
5051
+ focusCancel() {
5052
+ this.cancelCommandComponent.tryAndFocus();
5053
+ }
4866
5054
  }
4867
5055
  ActivityActionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ActivityActionsComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
4868
- ActivityActionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", 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" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"content\">\n <ng-content></ng-content>\n</div>\n<ng-container *ngIf=\"hasConfirmFace()\">\n <aup-command class=\"confirm\" [command]=\"confirmCommand\" [face]=\"confirmFace\" data-cy=\"confirm-command\"></aup-command>\n</ng-container>\n<ng-container *ngIf=\"hasCancelFace()\">\n <aup-command 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"], components: [{ type: CommandComponent, selector: "aup-command", inputs: ["command", "faceModel", "face", "busyFaceModel", "busyFace", "alignFace"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
5056
+ ActivityActionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", 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"], components: [{ type: CommandComponent, selector: "aup-command", inputs: ["command", "faceModel", "face", "busyFaceModel", "busyFace", "alignFace"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
4869
5057
  __decorate([
4870
5058
  TrackExternal(),
4871
5059
  __metadata("design:type", Command)
@@ -4876,8 +5064,14 @@ __decorate([
4876
5064
  ], ActivityActionsComponent.prototype, "cancelCommand", void 0);
4877
5065
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ActivityActionsComponent, decorators: [{
4878
5066
  type: Component,
4879
- args: [{ selector: 'aup-activity-actions', template: "<div class=\"content\">\n <ng-content></ng-content>\n</div>\n<ng-container *ngIf=\"hasConfirmFace()\">\n <aup-command class=\"confirm\" [command]=\"confirmCommand\" [face]=\"confirmFace\" data-cy=\"confirm-command\"></aup-command>\n</ng-container>\n<ng-container *ngIf=\"hasCancelFace()\">\n <aup-command 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"] }]
4880
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { confirmCommand: [{
5067
+ 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"] }]
5068
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { confirmCommandComponent: [{
5069
+ type: ViewChild,
5070
+ args: ["confirmCommandComponent"]
5071
+ }], cancelCommandComponent: [{
5072
+ type: ViewChild,
5073
+ args: ["cancelCommandComponent"]
5074
+ }], confirmCommand: [{
4881
5075
  type: Input
4882
5076
  }], cancelCommand: [{
4883
5077
  type: Input
@@ -4912,31 +5106,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
4912
5106
  });
4913
5107
  })(ActivityActionsComponent || (ActivityActionsComponent = {}));
4914
5108
 
4915
- const ACTIVITY_DATA = new InjectionToken('InteractionActivityData');
5109
+ const ACTIVITY_DATA = new InjectionToken("InteractionActivityData");
4916
5110
  class Activity extends DisposableComponent {
4917
5111
  constructor() {
4918
5112
  super();
4919
- this._busyModel = this.registerDisposable(new DelegatingValueModel().withDefault(false));
4920
- this._focusedModel = this.registerDisposable(new DelegatingValueModel());
4921
- this.class = 'aup-activity';
5113
+ this.activityReadyListeners = new EventListenerList();
5114
+ this._busy$ = this.registerDisposable(new DelegatingValueModel().withDefault(false));
5115
+ this._focused$ = this.registerDisposable(new DelegatingValueModel());
5116
+ this.class = "aup-activity";
4922
5117
  this.busyWhile(this.confirmCommand.busy);
4923
5118
  }
4924
5119
  get isFocused() {
4925
- return this._focusedModel.value;
5120
+ return this._focused$.value;
4926
5121
  }
4927
5122
  initialise(nestedInteractionContext, activityContext) {
4928
5123
  const { chain, when } = Dsl.disposeWith(this);
4929
5124
  assert$1.isNil(this._activityContext);
4930
5125
  this._activityContext = activityContext;
4931
5126
  this._interactionContext = nestedInteractionContext;
4932
- this._focusedModel.setDelegate(activityContext.focused);
4933
- when(this._focusedModel).becomesTruthy(() => {
4934
- this.onActivityReady();
5127
+ this._focused$.setDelegate(activityContext.focused);
5128
+ when(this._focused$).becomesTruthy(() => {
5129
+ this.notifyActivityReady();
4935
5130
  });
4936
5131
  }
4937
5132
  ngAfterViewInit() {
4938
- var _a;
4939
- (_a = this.activityActions) === null || _a === void 0 ? void 0 : _a.initCommands(this);
5133
+ if (this.activityActions) {
5134
+ this.initialiseActivityAction(this.activityActions);
5135
+ }
5136
+ }
5137
+ initialiseActivityAction(activityActions) {
5138
+ activityActions.initCommands(this);
4940
5139
  }
4941
5140
  get interactionContext() {
4942
5141
  assert$1.isTruthy(this.isInitialised());
@@ -4948,27 +5147,30 @@ class Activity extends DisposableComponent {
4948
5147
  cancel(error) {
4949
5148
  this._activityContext.onCancel(error);
4950
5149
  }
4951
- // @Trace()
4952
- onActivityReady() {
5150
+ notifyActivityReady() {
5151
+ this.activityReadyListeners.fire(l => l(this));
4953
5152
  }
4954
- get busy() {
4955
- return this._busyModel.readonly;
5153
+ onActivityReady(callback) {
5154
+ return this.activityReadyListeners.add(callback);
4956
5155
  }
4957
- get focused() {
4958
- return this._focusedModel.readonly;
5156
+ get busy$() {
5157
+ return this._busy$.readonly;
5158
+ }
5159
+ get focused$() {
5160
+ return this._focused$.readonly;
4959
5161
  }
4960
5162
  busyWhile(busyModel) {
4961
- this._busyModel.setDelegate(busyModel);
5163
+ this._busy$.setDelegate(busyModel);
4962
5164
  }
4963
5165
  isBusy() {
4964
- return this._busyModel.value;
5166
+ return this._busy$.value;
4965
5167
  }
4966
5168
  isInitialised() {
4967
5169
  return !!this._activityContext;
4968
5170
  }
4969
5171
  }
4970
5172
  Activity.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: Activity, deps: [], target: i0.ɵɵFactoryTarget.Component });
4971
- Activity.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: Activity, selector: "ng-component", host: { properties: { "class": "this.class", "attr.focused": "this.isFocused" } }, viewQueries: [{ propertyName: "activityActions", first: true, predicate: ActivityActionsComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
5173
+ Activity.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: Activity, selector: "ng-component", host: { properties: { "class": "this.class", "attr.focused": "this.isFocused" } }, viewQueries: [{ propertyName: "activityActions", first: true, predicate: ActivityActionsComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "", isInline: true });
4972
5174
  __decorate([
4973
5175
  TrackExternal(),
4974
5176
  __metadata("design:type", Command)
@@ -4980,17 +5182,17 @@ __decorate([
4980
5182
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: Activity, decorators: [{
4981
5183
  type: Component,
4982
5184
  args: [{
4983
- template: ''
5185
+ template: ""
4984
5186
  }]
4985
5187
  }], ctorParameters: function () { return []; }, propDecorators: { activityActions: [{
4986
5188
  type: ViewChild,
4987
5189
  args: [ActivityActionsComponent]
4988
5190
  }], confirmCommand: [], cancelCommand: [], class: [{
4989
5191
  type: HostBinding,
4990
- args: ['class']
5192
+ args: ["class"]
4991
5193
  }], isFocused: [{
4992
5194
  type: HostBinding,
4993
- args: ['attr.focused']
5195
+ args: ["attr.focused"]
4994
5196
  }] } });
4995
5197
 
4996
5198
  var Alert;
@@ -5024,6 +5226,11 @@ class AbstractDialogComponent extends Activity {
5024
5226
  color: () => this.color || 'primary',
5025
5227
  style: () => 'raised'
5026
5228
  };
5229
+ this.onActivityReady(() => {
5230
+ if (this.activityActions) {
5231
+ this.isDestructive() ? this.activityActions.focusCancel() : this.activityActions.focusConfirm();
5232
+ }
5233
+ });
5027
5234
  }
5028
5235
  getConfig() {
5029
5236
  return lang$1.abstractMethod(this.constructor);
@@ -5309,7 +5516,7 @@ class ActivityRef {
5309
5516
  },
5310
5517
  focused: this.focusedModel.readonly
5311
5518
  });
5312
- this._activityBusy.setDelegate(this._activity.busy);
5519
+ this._activityBusy.setDelegate(this._activity.busy$);
5313
5520
  }
5314
5521
  finishActivity(resolveOrReject) {
5315
5522
  assert.isFalsey(this.isComplete());
@@ -5361,7 +5568,10 @@ class ActivityOutletComponent {
5361
5568
  loadActivity(activityRef) {
5362
5569
  const injector = Injector.create({
5363
5570
  providers: [
5364
- { provide: ACTIVITY_DATA, useValue: activityRef.activityData }
5571
+ {
5572
+ provide: ACTIVITY_DATA,
5573
+ useValue: activityRef.activityData
5574
+ }
5365
5575
  ],
5366
5576
  parent: this.injector
5367
5577
  });
@@ -7920,14 +8130,12 @@ class InputActivity extends Activity {
7920
8130
  this.cancel();
7921
8131
  });
7922
8132
  this.busyWhile(this.confirmCommand.busy);
8133
+ this.onActivityReady(() => this.valueModel.focusContext.requestFocus());
7923
8134
  }
7924
8135
  get layout() {
7925
8136
  var _a, _b;
7926
8137
  return (_b = (_a = this.data) === null || _a === void 0 ? void 0 : _a.layout) !== null && _b !== void 0 ? _b : InputActivity.Layout.BLOCK;
7927
8138
  }
7928
- onActivityReady() {
7929
- this.valueModel.focusContext.requestFocus();
7930
- }
7931
8139
  get additionalCssClassName() {
7932
8140
  var _a;
7933
8141
  return (_a = this.data.cssClassName) !== null && _a !== void 0 ? _a : '';
@@ -8145,14 +8353,6 @@ class TableModel extends AbstractTableModel {
8145
8353
  }
8146
8354
  this.setDataSource(sourceOfTruth);
8147
8355
  }
8148
- /**
8149
- * @deprecated use new TableModel(sourceOfTruth, table => {...}); instead.
8150
- * @param sourceOfTruth
8151
- * @param builder
8152
- */
8153
- static fromList(sourceOfTruth, builder) {
8154
- return new TableModel(sourceOfTruth, builder);
8155
- }
8156
8356
  addSelectionColumn(selectionModel, showSelectionColumn) {
8157
8357
  return this._addSelectionColumn(selectionModel, showSelectionColumn);
8158
8358
  }
@@ -10113,5 +10313,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImpor
10113
10313
  * Generated bundle index. Do not edit.
10114
10314
  */
10115
10315
 
10116
- 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, CardStackComponent, CellEditorPortalRef, CellHeaderPortalRef, CellPortalRef, CellRendererPortalRef, CheckboxInputComponent, ColumnListModel, ColumnModel, ColumnTemplateDirective, 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, EditRowControls, EditSession, EditorControlColumnModel, EmptyStateComponent, EventCleanUpSession, FlattenedTreeListModel, FlexComponent, FocusBinding, FocusBindingDirective, FocusBindingFactory, FocusContainerComponent, FocusableComponent, Formatter, HEADER_CELL_RENDERER_PORTAL, HighlightPipe, HighlightTextModelDirective, HorizontalAlignment, IconComponent, InPlaceInteractionContextComponent, InlineActivityTriggerComponent, InlineEditorModel, InlineStringEditorComponent, InputActivity, InteractionContextTriggerFor, InteractionModule, InteractionService, InteractionServiceRoutingAdapter, 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, 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, SelectCellRendererComponent, SelectHeaderCellRendererComponent, SelectInputActivity, SelectInputComponent, SelectionColumnModel, SeparatorComponent, SidePlaceNavigationComponent, StringInputActivity, StringInputComponent, SwitchCaseComponent, SwitchCaseDefaultDirective, SwitchCaseOption, SwitchCaseWhenDirective, SynchroniseInteractionContextIdsWithRoute, TabbedPlaceNavigationComponent, TableCellRendererComponent, TableComponent, TableHeaderCellRendererComponent, TableModel, TableRowMenuComponent, TemplateCellRendererPortalRef, TextInputComponent, ToolBarComponent, TrackBy, TreeExpansionModel, TreeInheritanceIconComponent, TreeLabelCellRendererComponent, TreeLabelColumnModel, TreeTableComponent, TreeTableModel, UrlService, UrlSnapshot, VerticalFocusContainerComponent, VisibilityService, Visit, VisitParameter, VisitParameterList, VisitSanitiser, WaitUntilLeavingInteractionTransitionCancelled, WaitUntilLinkTriggeredNavigationInteractionCancellationTypeDetermined, WaitUntilPopStateDuringCanDeactivateInteractionFinishes, leftRightPlaceAnimation, markdownPillExtension, slideDownOnEnterAnimation, slideRightOnEnterAnimation, treeNodeDecorator };
10316
+ 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, CardStackComponent, 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, DefaultListCellRendererComponent, DialogInteractionContext, DialogInteractionContextFactory, Dimension, DirectivesModule, DisposableComponent, EditRowControls, EditSession, EditorControlColumnModel, EmptyStateComponent, EnableCellTextSearch, EventCleanUpSession, FlattenedTreeListModel, FlexComponent, FocusBinding, FocusBindingDirective, FocusBindingFactory, FocusContainerComponent, FocusableComponent, Formatter, HEADER_CELL_RENDERER_PORTAL, HighlightPipe, HighlightTextModelDirective, HorizontalAlignment, IconComponent, InPlaceInteractionContextComponent, InlineActivityTriggerComponent, InlineEditorModel, InlineStringEditorComponent, InputActivity, InteractionContextTriggerFor, 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, 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, TableCellComponent, TableComponent, TableHeaderCellComponent, TableModel, TableRowMenuComponent, TemplateCellRendererPortalRef, TextInputComponent, ToolBarComponent, TrackBy, TreeExpansionModel, TreeInheritanceIconComponent, TreeLabelCellRendererComponent, TreeLabelColumnModel, TreeTableComponent, TreeTableModel, UrlService, UrlSnapshot, VerticalFocusContainerComponent, VisibilityService, Visit, VisitParameter, VisitParameterList, VisitSanitiser, WaitUntilLeavingInteractionTransitionCancelled, WaitUntilLinkTriggeredNavigationInteractionCancellationTypeDetermined, WaitUntilPopStateDuringCanDeactivateInteractionFinishes, leftRightPlaceAnimation, markdownPillExtension, slideDownOnEnterAnimation, slideRightOnEnterAnimation, treeNodeDecorator };
10117
10317
  //# sourceMappingURL=coolon-angular-ui-powerups.mjs.map