@coolon/angular-ui-powerups 2.0.0-alpha.2 → 2.0.0-alpha.21

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 (173) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/assets/form.scss +33 -0
  3. package/bundles/coolon-angular-ui-powerups.umd.js +571 -330
  4. package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
  5. package/bundles/coolon-angular-ui-powerups.umd.min.js +2 -2
  6. package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
  7. package/coolon-angular-ui-powerups.d.ts +55 -54
  8. package/coolon-angular-ui-powerups.metadata.json +1 -1
  9. package/esm2015/coolon-angular-ui-powerups.js +53 -52
  10. package/esm2015/coolon-angular-ui-powerups.js.map +1 -1
  11. package/esm2015/coolon-angular-ui-powerups.metadata.json +1 -1
  12. package/esm2015/lib/angular-ui-powerups.module.ngfactory.js.map +1 -1
  13. package/esm2015/lib/components/card-container/card-container.component.js +1 -1
  14. package/esm2015/lib/components/card-container/card-container.component.metadata.json +1 -1
  15. package/esm2015/lib/components/components.module.js +29 -12
  16. package/esm2015/lib/components/components.module.js.map +1 -1
  17. package/esm2015/lib/components/components.module.metadata.json +1 -1
  18. package/esm2015/lib/components/components.module.ngfactory.js.map +1 -1
  19. package/esm2015/lib/components/forms/abstract-input.component.js +26 -6
  20. package/esm2015/lib/components/forms/abstract-input.component.js.map +1 -1
  21. package/esm2015/lib/components/forms/abstract-input.component.metadata.json +1 -1
  22. package/esm2015/lib/components/forms/abstract-list-input.component.js +51 -6
  23. package/esm2015/lib/components/forms/abstract-list-input.component.js.map +1 -1
  24. package/esm2015/lib/components/forms/abstract-list-input.component.metadata.json +1 -1
  25. package/esm2015/lib/components/forms/abstract-value-input.component.js +46 -7
  26. package/esm2015/lib/components/forms/abstract-value-input.component.js.map +1 -1
  27. package/esm2015/lib/components/forms/abstract-value-input.component.metadata.json +1 -1
  28. package/esm2015/lib/components/forms/autocomplete-input/autocomplete-input.component.js +70 -0
  29. package/esm2015/lib/components/forms/autocomplete-input/autocomplete-input.component.js.map +1 -0
  30. package/esm2015/lib/components/forms/autocomplete-input/autocomplete-input.component.metadata.json +1 -0
  31. package/esm2015/lib/components/forms/autocomplete-input/autocomplete-input.component.ngfactory.js.map +1 -0
  32. package/esm2015/lib/components/forms/autocomplete-input/autocomplete-input.component.scss.shim.ngstyle.js.map +1 -0
  33. package/esm2015/lib/components/forms/checkbox-input/checkbox-input.component.js +4 -7
  34. package/esm2015/lib/components/forms/checkbox-input/checkbox-input.component.js.map +1 -1
  35. package/esm2015/lib/components/forms/checkbox-input/checkbox-input.component.metadata.json +1 -1
  36. package/esm2015/lib/components/forms/multiple-select-input/multiple-select-input.component.js +8 -13
  37. package/esm2015/lib/components/forms/multiple-select-input/multiple-select-input.component.js.map +1 -1
  38. package/esm2015/lib/components/forms/multiple-select-input/multiple-select-input.component.metadata.json +1 -1
  39. package/esm2015/lib/components/forms/number-input/number-input.component.js +4 -7
  40. package/esm2015/lib/components/forms/number-input/number-input.component.js.map +1 -1
  41. package/esm2015/lib/components/forms/number-input/number-input.component.metadata.json +1 -1
  42. package/esm2015/lib/components/forms/password-input/password-input.component.js +5 -8
  43. package/esm2015/lib/components/forms/password-input/password-input.component.js.map +1 -1
  44. package/esm2015/lib/components/forms/password-input/password-input.component.metadata.json +1 -1
  45. package/esm2015/lib/components/forms/select-input/select-input.component.js +8 -5
  46. package/esm2015/lib/components/forms/select-input/select-input.component.js.map +1 -1
  47. package/esm2015/lib/components/forms/select-input/select-input.component.metadata.json +1 -1
  48. package/esm2015/lib/components/forms/string-input/string-input.component.js +4 -8
  49. package/esm2015/lib/components/forms/string-input/string-input.component.js.map +1 -1
  50. package/esm2015/lib/components/forms/string-input/string-input.component.metadata.json +1 -1
  51. package/esm2015/lib/components/forms/text-input/text-input.component.js +4 -7
  52. package/esm2015/lib/components/forms/text-input/text-input.component.js.map +1 -1
  53. package/esm2015/lib/components/forms/text-input/text-input.component.metadata.json +1 -1
  54. package/esm2015/lib/components/index.js +2 -1
  55. package/esm2015/lib/components/index.js.map +1 -1
  56. package/esm2015/lib/components/index.metadata.json +1 -1
  57. package/esm2015/lib/components/table/cell-editors.js.map +1 -1
  58. package/esm2015/lib/components/table/{cell-protal-ref.js → cell-portal-ref.js} +7 -3
  59. package/esm2015/lib/components/table/cell-portal-ref.js.map +1 -0
  60. package/esm2015/lib/components/table/{cell-protal-ref.metadata.json → cell-portal-ref.metadata.json} +1 -1
  61. package/esm2015/lib/components/table/column-model.js +66 -11
  62. package/esm2015/lib/components/table/column-model.js.map +1 -1
  63. package/esm2015/lib/components/table/column-model.metadata.json +1 -1
  64. package/esm2015/lib/components/table/mutable-cell-renderer.js +1 -0
  65. package/esm2015/lib/components/table/mutable-cell-renderer.js.map +1 -0
  66. package/esm2015/lib/components/table/mutable-cell-renderer.metadata.json +1 -0
  67. package/esm2015/lib/components/table/table-cell-renderer/table-cell-renderer.component.js +1 -1
  68. package/esm2015/lib/components/table/table-cell-renderer/table-cell-renderer.component.js.map +1 -1
  69. package/esm2015/lib/components/table/table-header-cell-renderer/table-header-cell-renderer.component.js +1 -1
  70. package/esm2015/lib/components/table/table-header-cell-renderer/table-header-cell-renderer.component.js.map +1 -1
  71. package/esm2015/lib/components/table/table-model.js +11 -10
  72. package/esm2015/lib/components/table/table-model.js.map +1 -1
  73. package/esm2015/lib/components/table/table-model.metadata.json +1 -1
  74. package/esm2015/lib/components/table/table.component.js +1 -1
  75. package/esm2015/lib/components/table/table.component.js.map +1 -1
  76. package/esm2015/lib/components/table/table.component.metadata.json +1 -1
  77. package/esm2015/lib/interaction/components/activity-container/activity-container.component.js +2 -7
  78. package/esm2015/lib/interaction/components/activity-container/activity-container.component.js.map +1 -1
  79. package/esm2015/lib/interaction/components/activity-container/activity-container.component.metadata.json +1 -1
  80. package/esm2015/lib/interaction/interaction.module.ngfactory.js.map +1 -1
  81. package/esm2015/lib/place/place-component.js +1 -1
  82. package/esm2015/lib/place/place-component.js.map +1 -1
  83. package/esm2015/lib/place/place-router.js +2 -8
  84. package/esm2015/lib/place/place-router.js.map +1 -1
  85. package/esm2015/lib/place/place-router.metadata.json +1 -1
  86. package/esm2015/lib/place/place.module.ngfactory.js.map +1 -1
  87. package/esm2015/lib/place/route/parameter-decorators.js +2 -3
  88. package/esm2015/lib/place/route/parameter-decorators.js.map +1 -1
  89. package/esm2015/lib/place/route/parameter-decorators.metadata.json +1 -1
  90. package/esm5/coolon-angular-ui-powerups.js +53 -52
  91. package/esm5/coolon-angular-ui-powerups.js.map +1 -1
  92. package/esm5/lib/angular-ui-powerups.module.ngfactory.js.map +1 -1
  93. package/esm5/lib/components/card-container/card-container.component.js +1 -1
  94. package/esm5/lib/components/components.module.js +29 -12
  95. package/esm5/lib/components/components.module.js.map +1 -1
  96. package/esm5/lib/components/components.module.ngfactory.js.map +1 -1
  97. package/esm5/lib/components/forms/abstract-input.component.js +34 -6
  98. package/esm5/lib/components/forms/abstract-input.component.js.map +1 -1
  99. package/esm5/lib/components/forms/abstract-list-input.component.js +56 -6
  100. package/esm5/lib/components/forms/abstract-list-input.component.js.map +1 -1
  101. package/esm5/lib/components/forms/abstract-value-input.component.js +51 -7
  102. package/esm5/lib/components/forms/abstract-value-input.component.js.map +1 -1
  103. package/esm5/lib/components/forms/autocomplete-input/autocomplete-input.component.js +73 -0
  104. package/esm5/lib/components/forms/autocomplete-input/autocomplete-input.component.js.map +1 -0
  105. package/esm5/lib/components/forms/autocomplete-input/autocomplete-input.component.ngfactory.js.map +1 -0
  106. package/esm5/lib/components/forms/autocomplete-input/autocomplete-input.component.scss.shim.ngstyle.js.map +1 -0
  107. package/esm5/lib/components/forms/checkbox-input/checkbox-input.component.js +4 -7
  108. package/esm5/lib/components/forms/checkbox-input/checkbox-input.component.js.map +1 -1
  109. package/esm5/lib/components/forms/multiple-select-input/multiple-select-input.component.js +8 -13
  110. package/esm5/lib/components/forms/multiple-select-input/multiple-select-input.component.js.map +1 -1
  111. package/esm5/lib/components/forms/number-input/number-input.component.js +4 -7
  112. package/esm5/lib/components/forms/number-input/number-input.component.js.map +1 -1
  113. package/esm5/lib/components/forms/password-input/password-input.component.js +5 -8
  114. package/esm5/lib/components/forms/password-input/password-input.component.js.map +1 -1
  115. package/esm5/lib/components/forms/select-input/select-input.component.js +8 -5
  116. package/esm5/lib/components/forms/select-input/select-input.component.js.map +1 -1
  117. package/esm5/lib/components/forms/string-input/string-input.component.js +4 -8
  118. package/esm5/lib/components/forms/string-input/string-input.component.js.map +1 -1
  119. package/esm5/lib/components/forms/text-input/text-input.component.js +4 -7
  120. package/esm5/lib/components/forms/text-input/text-input.component.js.map +1 -1
  121. package/esm5/lib/components/index.js +2 -1
  122. package/esm5/lib/components/index.js.map +1 -1
  123. package/esm5/lib/components/table/cell-editors.js.map +1 -1
  124. package/esm5/lib/components/table/{cell-protal-ref.js → cell-portal-ref.js} +7 -3
  125. package/esm5/lib/components/table/cell-portal-ref.js.map +1 -0
  126. package/esm5/lib/components/table/column-model.js +67 -11
  127. package/esm5/lib/components/table/column-model.js.map +1 -1
  128. package/esm5/lib/components/table/mutable-cell-renderer.js +1 -0
  129. package/esm5/lib/components/table/mutable-cell-renderer.js.map +1 -0
  130. package/esm5/lib/components/table/table-cell-renderer/table-cell-renderer.component.js +1 -1
  131. package/esm5/lib/components/table/table-cell-renderer/table-cell-renderer.component.js.map +1 -1
  132. package/esm5/lib/components/table/table-header-cell-renderer/table-header-cell-renderer.component.js +1 -1
  133. package/esm5/lib/components/table/table-header-cell-renderer/table-header-cell-renderer.component.js.map +1 -1
  134. package/esm5/lib/components/table/table-model.js +11 -11
  135. package/esm5/lib/components/table/table-model.js.map +1 -1
  136. package/esm5/lib/components/table/table.component.js +1 -1
  137. package/esm5/lib/components/table/table.component.js.map +1 -1
  138. package/esm5/lib/interaction/components/activity-container/activity-container.component.js +2 -7
  139. package/esm5/lib/interaction/components/activity-container/activity-container.component.js.map +1 -1
  140. package/esm5/lib/interaction/interaction.module.ngfactory.js.map +1 -1
  141. package/esm5/lib/place/place-component.js +1 -1
  142. package/esm5/lib/place/place-component.js.map +1 -1
  143. package/esm5/lib/place/place-router.js +2 -8
  144. package/esm5/lib/place/place-router.js.map +1 -1
  145. package/esm5/lib/place/place.module.ngfactory.js.map +1 -1
  146. package/esm5/lib/place/route/parameter-decorators.js +2 -3
  147. package/esm5/lib/place/route/parameter-decorators.js.map +1 -1
  148. package/fesm2015/coolon-angular-ui-powerups.js +466 -247
  149. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  150. package/fesm5/coolon-angular-ui-powerups.js +503 -263
  151. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  152. package/lib/components/forms/abstract-input.component.d.ts +12 -3
  153. package/lib/components/forms/abstract-list-input.component.d.ts +10 -3
  154. package/lib/components/forms/abstract-value-input.component.d.ts +9 -3
  155. package/lib/components/forms/autocomplete-input/autocomplete-input.component.d.ts +25 -0
  156. package/lib/components/forms/checkbox-input/checkbox-input.component.d.ts +0 -2
  157. package/lib/components/forms/multiple-select-input/multiple-select-input.component.d.ts +8 -4
  158. package/lib/components/forms/number-input/number-input.component.d.ts +0 -2
  159. package/lib/components/forms/password-input/password-input.component.d.ts +0 -2
  160. package/lib/components/forms/select-input/select-input.component.d.ts +8 -2
  161. package/lib/components/forms/string-input/string-input.component.d.ts +1 -2
  162. package/lib/components/forms/text-input/text-input.component.d.ts +0 -2
  163. package/lib/components/index.d.ts +3 -1
  164. package/lib/components/table/cell-editors.d.ts +3 -3
  165. package/lib/components/table/{cell-protal-ref.d.ts → cell-portal-ref.d.ts} +4 -4
  166. package/lib/components/table/column-model.d.ts +18 -12
  167. package/lib/components/table/mutable-cell-renderer.d.ts +6 -0
  168. package/lib/components/table/table-cell-renderer/table-cell-renderer.component.d.ts +1 -1
  169. package/lib/components/table/table-header-cell-renderer/table-header-cell-renderer.component.d.ts +1 -1
  170. package/lib/components/table/table-model.d.ts +15 -4
  171. package/package.json +4 -4
  172. package/esm2015/lib/components/table/cell-protal-ref.js.map +0 -1
  173. package/esm5/lib/components/table/cell-protal-ref.js.map +0 -1
@@ -9,18 +9,19 @@ import { MatTabsModule, MatTabGroup, MAT_TABS_CONFIG } from '@angular/material/t
9
9
  import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
10
10
  import { ComponentPortal, TemplatePortal, PortalModule } from '@angular/cdk/portal';
11
11
  import { CdkScrollableModule } from '@angular/cdk/scrolling';
12
+ import { MatAutocompleteModule } from '@angular/material/autocomplete';
12
13
  import { MatButtonModule } from '@angular/material/button';
13
14
  import { MatCheckboxModule } from '@angular/material/checkbox';
14
15
  import { MatIconModule } from '@angular/material/icon';
15
16
  import { MatTableModule } from '@angular/material/table';
16
- import { GarbageCollector, DelegatingValueModel, assert, UnaryCommand, lang, Dsl, Logger, TrackExternal, Command, FocusManager, Form, ListModel, StoreInListModel, ValueModel, StoreInValueModel, MutableValueModel, MultipleSelectionModel, MutableListModel, DirtyTrackingForm, DelegatingCommand, Deferred, Trace, Guard, DebugContext, Binding, Functions } from '@coolon/pectin';
17
+ import { MatTooltipModule } from '@angular/material/tooltip';
18
+ import { FaIconLibrary, FontAwesomeModule } from '@fortawesome/angular-fontawesome';
19
+ import { fas } from '@fortawesome/free-solid-svg-icons';
20
+ import { GarbageCollector, DelegatingValueModel, assert, UnaryCommand, lang, Dsl, Logger, TrackExternal, Command, FocusManager, EventListenerList, Form, MutableListModel, Guard, Binding, DebugContext, MutableValueModel, ListModel, StoreInListModel, ValueModel, StoreInValueModel, MultipleSelectionModel, DirtyTrackingForm, DelegatingCommand, Deferred, Functions } from '@coolon/pectin';
21
+ import ___default, { isEqual, isNil } from 'lodash';
17
22
  import { assert as assert$1, Opts, lang as lang$1, Klass } from '@coolon/typescript-utilities';
18
23
  import { Memoize } from '@typescript-plus/fast-memoize-decorator/dist/src';
19
- import ___default, { isEqual, isNil } from 'lodash';
20
24
  import produce from 'immer';
21
- import { FaIconLibrary, FontAwesomeModule } from '@fortawesome/angular-fontawesome';
22
- import { fas } from '@fortawesome/free-solid-svg-icons';
23
- import { MatTooltipModule } from '@angular/material/tooltip';
24
25
  import { FlexModule, GridModule } from '@angular/flex-layout';
25
26
  import { MatDialogModule, MatDialog, MatDialogConfig, MAT_DIALOG_DEFAULT_OPTIONS } from '@angular/material/dialog';
26
27
  import { RouterModule, UrlSegment, Router, UrlSerializer, NavigationStart, NavigationEnd, NavigationError, NavigationCancel, RouterOutlet } from '@angular/router';
@@ -369,7 +370,7 @@ CardContainerComponent = __decorate([
369
370
  Component({
370
371
  selector: 'aup-card-container',
371
372
  template: "<div class=\"card-container\">\n <ng-content></ng-content>\n\n <div class=\"add-card-container\" *ngIf=\"addCardCommand.enabled.value\" [pectinCommand]=\"addCardCommand\">\n <aup-icon icon=\"mat:add\"></aup-icon>\n </div>\n\n <div class=\"add-card-template\" *ngIf=\"addCardTemplate\">\n <ng-container [ngTemplateOutlet]=\"addCardTemplate\"></ng-container>\n </div>\n\n</div>\n",
372
- styles: [":root{--aup-default-padding:var(--default-padding, 18px);--aup-default-background:white}.router-outlet-container>*{position:absolute;top:0;left:0;bottom:0;right:0}[no-tab-header]>mat-tab-header{display:none}[full-height-tabs] .mat-tab-body-wrapper,mat-tab-group.full-height-tabs .mat-tab-body-wrapper{flex:1}[full-height-tabs] .mat-tab-body-wrapper .mat-tab-body-content,[full-height-tabs] .mat-tab-body-wrapper mat-tab-body,mat-tab-group.full-height-tabs .mat-tab-body-wrapper .mat-tab-body-content,mat-tab-group.full-height-tabs .mat-tab-body-wrapper mat-tab-body{display:flex;flex-direction:column;justify-content:stretch}.dialog-interaction-context{max-width:95vw!important;max-height:95vh!important}.dialog-interaction-context mat-dialog-container{max-width:95vw!important;max-height:95vh!important;padding:0}.aup-popup-interaction-panel{background:var(--aup-default-background,#fff);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);transition:box-shadow 280ms cubic-bezier(.4,0,.2,1)}.aup-input-activity{padding:calc(var(--aup-default-padding)/2)}.aup-input-component{display:block}.aup-input-component input,.aup-input-component mat-form-field{width:100%}.aup-input-component input mat-hint.faux-error,.aup-input-component mat-form-field mat-hint.faux-error{color:#f44336}aup-table-cell-renderer>.aup-input-component .mat-form-field-flex{padding-top:0}aup-table-cell-renderer>.aup-input-component .mat-form-field-infix{width:0}aup-table-cell-renderer>.aup-input-component .mat-form-field-label-wrapper{display:none}aup-table{--default-column-gap:var(--column-gap, 24px);--resolved-row-hover-background-color:var(--row-hover-background-color, rgba(0, 0, 0, 0.05))}aup-table .mat-table td.mat-cell:first-of-type,aup-table .mat-table td.mat-footer-cell:first-of-type,aup-table .mat-table th.mat-header-cell:first-of-type{padding-left:0}aup-table .mat-table tr.enable-hover:hover{background-color:var(--resolved-row-hover-background-color)}aup-table .mat-table td.enable-cursor{cursor:pointer}aup-table aup-table-cell-renderer,aup-table aup-table-header-cell-renderer{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%;min-height:47px}aup-table aup-table-cell-renderer.first-column,aup-table aup-table-cell-renderer:not(.first-column),aup-table aup-table-header-cell-renderer.first-column,aup-table aup-table-header-cell-renderer:not(.first-column){padding-left:var(--default-column-gap)}aup-table aup-table-cell-renderer.fillCell{justify-content:stretch;padding-left:0!important}aup-table aup-table-cell-renderer.padChild>:first-child{padding-left:var(--default-column-gap);flex:1}:host{--resolved-card-gap:var(--card-gap, 16px);--resolved-card-width:var(--card-width, 300px);--resolved-card-height:var(--card-height, auto);--resolved-card-min-height:var(--card-min-height, auto);--resolved-card-background:var(--card-background, #fcfcfb);flex:1;display:block;background:var(--resolved-card-background)}.card-container{display:-ms-grid;display:grid;grid-template-columns:repeat(auto-fill,var(--resolved-card-width));grid-template-rows:repeat(auto-fit,minmax(0,var(--resolved-card-height)));grid-gap:var(--resolved-card-gap);box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));min-width:calc(var(--resolved-card-width) + 2 * var(--resolved-card-gap));width:calc((var(--resolved-card-width) + var(--resolved-card-gap)) * 2 + var(--grid-gap));max-width:100%}.add-card-container{width:var(--resolved-card-width);height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:rgba(0,0,0,.54);background-color:rgba(255,255,255,.8);transition:280ms cubic-bezier(.4,0,.2,1)}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{transition:280ms cubic-bezier(.4,0,.2,1);border-color:transparent;background-color:#fff;color:rgba(0,0,0,.54)}.add-card-container:hover:hover{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.add-card-template-container{width:var(--resolved-card-width);height:var(--resolved-card-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}"]
373
+ styles: [":root{--aup-default-padding:var(--default-padding, 18px);--aup-default-background:white}.router-outlet-container>*{position:absolute;top:0;left:0;bottom:0;right:0}[no-tab-header]>mat-tab-header{display:none}[full-height-tabs] .mat-tab-body-wrapper,mat-tab-group.full-height-tabs .mat-tab-body-wrapper{flex:1}[full-height-tabs] .mat-tab-body-wrapper .mat-tab-body-content,[full-height-tabs] .mat-tab-body-wrapper mat-tab-body,mat-tab-group.full-height-tabs .mat-tab-body-wrapper .mat-tab-body-content,mat-tab-group.full-height-tabs .mat-tab-body-wrapper mat-tab-body{display:flex;flex-direction:column;justify-content:stretch}.dialog-interaction-context{max-width:95vw!important;max-height:95vh!important}.dialog-interaction-context mat-dialog-container{max-width:95vw!important;max-height:95vh!important;padding:0}.aup-popup-interaction-panel{background:var(--aup-default-background,#fff);box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);transition:box-shadow 280ms cubic-bezier(.4,0,.2,1)}.aup-input-activity{padding:calc(var(--aup-default-padding)/2)}.aup-input-component{display:block}.aup-input-component input,.aup-input-component mat-form-field{width:100%}.aup-input-component input mat-hint.faux-error,.aup-input-component mat-form-field mat-hint.faux-error{color:#f44336}.aup-input-component.dense mat-form-field .mat-form-field-infix{border-top:none}.aup-input-component.dense mat-form-field .mat-form-field-flex{padding-top:0}.aup-input-component.dense mat-form-field .mat-form-field-wrapper{padding-bottom:0;border-bottom:0}.aup-input-component.dense mat-form-field .mat-form-field-underline{bottom:0}.aup-input-component.dense mat-form-field.mat-form-field-can-float.mat-form-field-should-float .mat-form-field-label-wrapper{display:none}.aup-input-component.dense mat-form-field.mat-form-field-appearance-standard.mat-form-field-has-label .mat-select:not(.mat-select-empty) .mat-select-arrow-wrapper{transform:translateY(0)}aup-table-cell-renderer>.aup-input-component .mat-form-field-flex{padding-top:0}aup-table-cell-renderer>.aup-input-component .mat-form-field-infix{width:0}aup-table-cell-renderer>.aup-input-component .mat-form-field-label-wrapper{display:none}aup-table{--default-column-gap:var(--column-gap, 24px);--resolved-row-hover-background-color:var(--row-hover-background-color, rgba(0, 0, 0, 0.05))}aup-table .mat-table td.mat-cell:first-of-type,aup-table .mat-table td.mat-footer-cell:first-of-type,aup-table .mat-table th.mat-header-cell:first-of-type{padding-left:0}aup-table .mat-table tr.enable-hover:hover{background-color:var(--resolved-row-hover-background-color)}aup-table .mat-table td.enable-cursor{cursor:pointer}aup-table aup-table-cell-renderer,aup-table aup-table-header-cell-renderer{display:flex;flex-direction:column;align-items:stretch;justify-content:center;height:100%;min-height:47px}aup-table aup-table-cell-renderer.first-column,aup-table aup-table-cell-renderer:not(.first-column),aup-table aup-table-header-cell-renderer.first-column,aup-table aup-table-header-cell-renderer:not(.first-column){padding-left:var(--default-column-gap)}aup-table aup-table-cell-renderer.fillCell{justify-content:stretch;padding-left:0!important}aup-table aup-table-cell-renderer.padChild>:first-child{padding-left:var(--default-column-gap);flex:1}:host{--resolved-card-gap:var(--card-gap, 16px);--resolved-card-width:var(--card-width, 300px);--resolved-card-height:var(--card-height, auto);--resolved-card-min-height:var(--card-min-height, auto);--resolved-card-background:var(--card-background, #fcfcfb);flex:1;display:block;background:var(--resolved-card-background)}.card-container{display:-ms-grid;display:grid;grid-template-columns:repeat(auto-fill,var(--resolved-card-width));grid-template-rows:repeat(auto-fit,minmax(0,var(--resolved-card-height)));grid-gap:var(--resolved-card-gap);box-sizing:border-box;padding:var(--resolved-card-gap);min-height:calc(var(--resolved-card-height) + 2 * var(--resolved-card-gap));min-width:calc(var(--resolved-card-width) + 2 * var(--resolved-card-gap));width:calc((var(--resolved-card-width) + var(--resolved-card-gap)) * 2 + var(--grid-gap));max-width:100%}.add-card-container{width:var(--resolved-card-width);height:var(--resolved-card-height);min-height:var(--resolved-card-min-height);display:flex;flex-direction:column;align-items:center;justify-content:center;box-sizing:border-box;border:2px dashed rgba(0,0,0,.1);border-radius:6px;font-weight:300;cursor:pointer;color:rgba(0,0,0,.54);background-color:rgba(255,255,255,.8);transition:280ms cubic-bezier(.4,0,.2,1)}.add-card-container mat-icon{font-size:200%}.add-card-container:hover{transition:280ms cubic-bezier(.4,0,.2,1);border-color:transparent;background-color:#fff;color:rgba(0,0,0,.54)}.add-card-container:hover:hover{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.add-card-template-container{width:var(--resolved-card-width);height:var(--resolved-card-height);display:flex;flex-direction:column;align-items:stretch;justify-content:stretch}"]
373
374
  }),
374
375
  __metadata("design:paramtypes", [])
375
376
  ], CardContainerComponent);
@@ -467,6 +468,8 @@ FocusableComponent = __decorate([
467
468
  let AbstractInputComponent = class AbstractInputComponent extends DisposableComponent {
468
469
  constructor() {
469
470
  super();
471
+ this.onValueEditedListeners = new EventListenerList();
472
+ this.dense = false;
470
473
  // TODO: fix this.
471
474
  // tslint:disable-next-line:no-output-native
472
475
  this.focus = new EventEmitter();
@@ -514,19 +517,32 @@ let AbstractInputComponent = class AbstractInputComponent extends DisposableComp
514
517
  return this.enabled.value;
515
518
  }
516
519
  get enabled() {
517
- return this.inputModel.enabled;
520
+ return this.formValueModel.enabled;
518
521
  }
519
522
  hasErrors() {
520
523
  return !this.errorList.query().isEmpty();
521
524
  }
522
525
  get errorList() {
523
- return this.inputModel.errorList;
526
+ return this.formValueModel.errorList;
524
527
  }
525
528
  get firstError() {
526
529
  return this.hasErrors() ? this.errorList.value[0] : null;
527
530
  }
528
531
  get focusContext() {
529
- return this.inputModel.focusContext;
532
+ return this.formValueModel.focusContext;
533
+ }
534
+ get floatLabel() {
535
+ return this.dense ? 'never' : this.userFloatLabel;
536
+ }
537
+ get showHint() {
538
+ return this.dense ? false : !!this.hint;
539
+ }
540
+ /**
541
+ * Invokes the callback when this components value is changed by a user edit.
542
+ * @param callback
543
+ */
544
+ onValueEdited(callback) {
545
+ return this.onValueEditedListeners.add(callback);
530
546
  }
531
547
  };
532
548
  __decorate([
@@ -534,9 +550,9 @@ __decorate([
534
550
  __metadata("design:type", String)
535
551
  ], AbstractInputComponent.prototype, "label", void 0);
536
552
  __decorate([
537
- Input(),
553
+ Input('floatLabel'),
538
554
  __metadata("design:type", String)
539
- ], AbstractInputComponent.prototype, "floatLabel", void 0);
555
+ ], AbstractInputComponent.prototype, "userFloatLabel", void 0);
540
556
  __decorate([
541
557
  Input(),
542
558
  __metadata("design:type", String)
@@ -545,6 +561,11 @@ __decorate([
545
561
  Input(),
546
562
  __metadata("design:type", String)
547
563
  ], AbstractInputComponent.prototype, "placeholder", void 0);
564
+ __decorate([
565
+ HostBinding('class.dense'),
566
+ Input(),
567
+ __metadata("design:type", Object)
568
+ ], AbstractInputComponent.prototype, "dense", void 0);
548
569
  __decorate([
549
570
  Input('command.focus'),
550
571
  __metadata("design:type", Command)
@@ -610,7 +631,7 @@ AbstractInputComponent = __decorate([
610
631
 
611
632
  let AbstractListInputComponent = class AbstractListInputComponent extends AbstractInputComponent {
612
633
  constructor() {
613
- super(...arguments);
634
+ super();
614
635
  /**
615
636
  * A backing model for all our @Input() valueModel properties which should be defined as follows.
616
637
  *
@@ -622,11 +643,56 @@ let AbstractListInputComponent = class AbstractListInputComponent extends Abstra
622
643
  * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).
623
644
  */
624
645
  // We have to register it as a disposable so it ditches any listeners when we're disposed.
625
- this.inputModel = this.registerDisposable(new Form.DelegatingListModel());
646
+ this.formValueModel = this.registerDisposable(new Form.DelegatingListModel());
647
+ this.componentListModel = new MutableListModel();
648
+ this.setValueIsInProgress = new Guard();
649
+ this.valueChange = new EventEmitter();
650
+ const { when, valueOf, chain } = Dsl.disposeWith(this);
651
+ const binding = new Binding.Identity(this.formValueModel, this.componentListModel);
652
+ const inExternalChange = valueOf.any(this.setValueIsInProgress, chain(binding.direction).equals(Binding.Direction.RIGHT)).areTruthy();
653
+ when(this.componentListModel).changes((is, was) => {
654
+ this.valueChange.emit(is);
655
+ this.onValueEditedListeners.fire(l => l(is, was));
656
+ }, {
657
+ initialValue: 'ignore',
658
+ // we never fire events during an external changes to the value. This allows
659
+ // the component to behave when used in the conventional angular
660
+ // fashion, i.e. [(value)]="..."
661
+ unless: inExternalChange
662
+ });
663
+ DebugContext.tag(this.formValueModel, `${this.constructor.name}.formValueModel`);
664
+ }
665
+ // We add support for simple direct display of values by allowing components to be used
666
+ // by `component.value = ...` This use of the component without a value model in tables
667
+ // and the like.
668
+ set value(value) {
669
+ this.setValueIsInProgress.whileTrue(() => {
670
+ if (!this.listHolder) {
671
+ this.listHolder = new MutableListModel(value);
672
+ this.listModel = this.listHolder;
673
+ }
674
+ else {
675
+ this.listHolder.value = value;
676
+ }
677
+ });
626
678
  }
627
679
  };
680
+ __decorate([
681
+ Input(), TrackExternal({ delegateTo: 'formValueModel' }),
682
+ __metadata("design:type", Object)
683
+ ], AbstractListInputComponent.prototype, "listModel", void 0);
684
+ __decorate([
685
+ Input(),
686
+ __metadata("design:type", Array),
687
+ __metadata("design:paramtypes", [Array])
688
+ ], AbstractListInputComponent.prototype, "value", null);
689
+ __decorate([
690
+ Output(),
691
+ __metadata("design:type", Object)
692
+ ], AbstractListInputComponent.prototype, "valueChange", void 0);
628
693
  AbstractListInputComponent = __decorate([
629
- Component({ template: '' })
694
+ Component({ template: '' }),
695
+ __metadata("design:paramtypes", [])
630
696
  ], AbstractListInputComponent);
631
697
 
632
698
  let AbstractValueInputComponent = class AbstractValueInputComponent extends AbstractInputComponent {
@@ -643,32 +709,133 @@ let AbstractValueInputComponent = class AbstractValueInputComponent extends Abst
643
709
  * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).
644
710
  */
645
711
  // We have to register it as a disposable so it ditches any listeners when we're disposed.
646
- this.inputModel = this.registerDisposable(new Form.DelegatingValueModel());
647
- this.inputModel.onTransactionStart(tx => {
648
- tx.onRootTransactionFinalised(() => {
649
- console.log({ changed: tx.hasChanged() });
650
- });
712
+ this.formValueModel = this.registerDisposable(new Form.DelegatingValueModel());
713
+ this.setValueInProgress = new Guard();
714
+ this.componentValueModel = new MutableValueModel();
715
+ this.valueChange = new EventEmitter();
716
+ const { when, chain, valueOf } = Dsl.disposeWith(this);
717
+ const binding = new Binding.Identity(this.formValueModel, this.componentValueModel);
718
+ const inExternalChange = valueOf.any(this.setValueInProgress, chain(binding.direction).equals(Binding.Direction.RIGHT)).areTruthy();
719
+ when(this.componentValueModel).changes((is, was) => {
720
+ this.valueChange.emit(is);
721
+ this.onValueEditedListeners.fire(l => l(is, was));
722
+ }, {
723
+ initialValue: 'ignore',
724
+ // we never fire events during an external set value operation. This allows
725
+ // the component to behave when used in the conventional angular
726
+ // fashion, i.e. [(value)]="..."
727
+ unless: inExternalChange
728
+ });
729
+ DebugContext.tag(this.formValueModel, `${this.constructor.name}.formValueModel`);
730
+ }
731
+ // We add support for simple direct display of values by allowing components to be used
732
+ // by `component.value = ...` This use of the component without a value model in tables
733
+ // and the like.
734
+ set value(value) {
735
+ this.setValueInProgress.whileTrue(() => {
736
+ if (!this.plainValueHolder) {
737
+ this.plainValueHolder = new MutableValueModel(value);
738
+ this.valueModel = this.plainValueHolder;
739
+ }
740
+ else {
741
+ this.plainValueHolder.value = value;
742
+ }
651
743
  });
652
744
  }
653
745
  };
746
+ __decorate([
747
+ Input(), TrackExternal({ delegateTo: 'formValueModel' }),
748
+ __metadata("design:type", Object)
749
+ ], AbstractValueInputComponent.prototype, "valueModel", void 0);
750
+ __decorate([
751
+ Input(),
752
+ __metadata("design:type", Object),
753
+ __metadata("design:paramtypes", [Object])
754
+ ], AbstractValueInputComponent.prototype, "value", null);
755
+ __decorate([
756
+ Output(),
757
+ __metadata("design:type", Object)
758
+ ], AbstractValueInputComponent.prototype, "valueChange", void 0);
654
759
  AbstractValueInputComponent = __decorate([
655
760
  Component({ template: '' }),
656
761
  __metadata("design:paramtypes", [])
657
762
  ], AbstractValueInputComponent);
658
763
 
764
+ /**
765
+ * Using templates (not only supported for nil values:
766
+ * <aup-autocomplete-input [valueModel]="myModel" [options]="myOptions">
767
+ * <ng-template #nilOptionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
768
+ * </aup-autocomplete-input>
769
+ */
770
+ let AutocompleteInputComponent = class AutocompleteInputComponent extends AbstractValueInputComponent {
771
+ constructor() {
772
+ super();
773
+ this.filterValue = new MutableValueModel();
774
+ this.optionLabelFormat = (option) => (option && this.optionLabel) ? option[this.optionLabel] : option;
775
+ const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
776
+ const lowerCaseFilterValue = chain(this.filterValue)
777
+ .map(v => ___default.isString(v) ? v.toLowerCase() : '');
778
+ this.filteredOptions = chain(this.optionsModel)
779
+ .select(option => {
780
+ return ___default.isEmpty(this.filterValue.value) || this.optionLabelFormat(option).toString().toLowerCase().includes(lowerCaseFilterValue.value);
781
+ }, { dependsOn: lowerCaseFilterValue });
782
+ }
783
+ ngOnInit() {
784
+ }
785
+ formatOption(option) {
786
+ return this.optionLabelFormat(option);
787
+ }
788
+ updateFilter($event) {
789
+ this.filterValue.value = $event;
790
+ }
791
+ onSelect($event) {
792
+ this.valueModel.value = $event.option.value;
793
+ }
794
+ };
795
+ __decorate([
796
+ Input(), TrackExternal(),
797
+ __metadata("design:type", ListModel)
798
+ ], AutocompleteInputComponent.prototype, "optionsModel", void 0);
799
+ __decorate([
800
+ Input(), StoreInListModel('optionsModel'),
801
+ __metadata("design:type", Array)
802
+ ], AutocompleteInputComponent.prototype, "options", void 0);
803
+ __decorate([
804
+ Input(),
805
+ __metadata("design:type", Object)
806
+ ], AutocompleteInputComponent.prototype, "optionLabel", void 0);
807
+ __decorate([
808
+ Input(),
809
+ __metadata("design:type", Boolean)
810
+ ], AutocompleteInputComponent.prototype, "allowNil", void 0);
811
+ __decorate([
812
+ ContentChild('nilOptionTemplate'),
813
+ __metadata("design:type", TemplateRef)
814
+ ], AutocompleteInputComponent.prototype, "nilOptionTemplateRef", void 0);
815
+ __decorate([
816
+ Input(),
817
+ __metadata("design:type", Function)
818
+ ], AutocompleteInputComponent.prototype, "optionLabelFormat", void 0);
819
+ AutocompleteInputComponent = __decorate([
820
+ Component({
821
+ selector: 'aup-autocomplete-input',
822
+ template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input type=\"string\"\n matInput\n [matAutocomplete]=\"autocomplete\"\n placeholder=\"{{placeholder}}\"\n [ngModel]=\"componentValueModel.value\"\n (ngModelChange)=\"updateFilter($event)\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-autocomplete #autocomplete [displayWith]=\"optionLabelFormat\" [autoActiveFirstOption]=\"true\" (optionSelected)=\"onSelect($event)\">\n <mat-option *ngFor=\"let option of filteredOptions.value; let i = index\"\n [value]=\"option\"\n >{{formatOption(option)}}</mat-option>\n <mat-option *ngIf=\"allowNil\">{{placeholder}}</mat-option>\n </mat-autocomplete>\n\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n",
823
+ styles: [":host{display:inline-block}mat-form-field{width:100%}"]
824
+ }),
825
+ __metadata("design:paramtypes", [])
826
+ ], AutocompleteInputComponent);
827
+
659
828
  let CheckboxInputComponent = class CheckboxInputComponent extends AbstractValueInputComponent {
660
829
  constructor() {
661
830
  super();
831
+ // @Input() @TrackExternal({ delegateTo: 'inputModel' })
832
+ // valueModel: Form.ValueModelBase<boolean> | IMutableValueModel<boolean>;
662
833
  this.color = 'accent';
663
834
  this.labelPosition = 'after';
664
835
  }
665
836
  ngOnInit() {
666
837
  }
667
838
  };
668
- __decorate([
669
- Input(), TrackExternal({ delegateTo: 'inputModel' }),
670
- __metadata("design:type", Object)
671
- ], CheckboxInputComponent.prototype, "valueModel", void 0);
672
839
  __decorate([
673
840
  Input(),
674
841
  __metadata("design:type", String)
@@ -680,25 +847,67 @@ __decorate([
680
847
  CheckboxInputComponent = __decorate([
681
848
  Component({
682
849
  selector: 'aup-checkbox-input',
683
- template: "<!-- TODO: add focus binding -->\n<mat-checkbox\n [(ngModel)]=\"valueModel.value\"\n [color]=\"color\"\n [labelPosition]=\"labelPosition\"\n [disabled]=\"!isEnabled()\"\n>{{label}}</mat-checkbox>\n<mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n<mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n",
684
- styles: [":host{display:inline-flex;flex-direction:column;margin-top:24px;margin-bottom:16px}mat-error,mat-hint{margin-top:4px;margin-left:24px;font-size:12px;font-weight:400;line-height:13.5px}"]
850
+ template: "<!-- TODO: add focus binding -->\n<mat-checkbox\n [(ngModel)]=\"componentValueModel.value\"\n [color]=\"color\"\n [labelPosition]=\"labelPosition\"\n [disabled]=\"!isEnabled()\"\n>{{label}}</mat-checkbox>\n<mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n<mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n",
851
+ styles: [":host{display:inline-flex;flex-direction:column;padding:24px 0 16px}:host.dense{padding:6px 0 2px}mat-error,mat-hint{margin-top:4px;margin-left:24px;font-size:12px;font-weight:400;line-height:13.5px}"]
685
852
  }),
686
853
  __metadata("design:paramtypes", [])
687
854
  ], CheckboxInputComponent);
688
855
 
856
+ /**
857
+ * Using templates:
858
+ * <aup-multiple-select-input [valueModel]="myModel" [options]="myOptions">
859
+ * <ng-template #optionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
860
+ * <ng-template #nilOptionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
861
+ * </aup-multiple-select_input>
862
+ */
863
+ let MultipleSelectInputComponent = class MultipleSelectInputComponent extends AbstractListInputComponent {
864
+ constructor() {
865
+ super();
866
+ this.optionLabelFormat = (option) => (option && this.optionLabel) ? option[this.optionLabel] : option;
867
+ }
868
+ ngOnInit() {
869
+ }
870
+ };
871
+ __decorate([
872
+ Input(), TrackExternal(),
873
+ __metadata("design:type", ListModel)
874
+ ], MultipleSelectInputComponent.prototype, "optionsModel", void 0);
875
+ __decorate([
876
+ Input(), StoreInListModel('optionsModel'),
877
+ __metadata("design:type", Array)
878
+ ], MultipleSelectInputComponent.prototype, "options", void 0);
879
+ __decorate([
880
+ Input(),
881
+ __metadata("design:type", Object)
882
+ ], MultipleSelectInputComponent.prototype, "optionLabel", void 0);
883
+ __decorate([
884
+ ContentChild('optionTemplate'),
885
+ __metadata("design:type", TemplateRef)
886
+ ], MultipleSelectInputComponent.prototype, "optionTemplateRef", void 0);
887
+ __decorate([
888
+ Input(),
889
+ __metadata("design:type", Function)
890
+ ], MultipleSelectInputComponent.prototype, "optionLabelFormat", void 0);
891
+ MultipleSelectInputComponent = __decorate([
892
+ Component({
893
+ selector: 'aup-multiple-select-input',
894
+ template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n multiple\n [(ngModel)]=\"componentListModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-option *ngFor=\"let option of optionsModel.value; let i = index\" [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n </mat-select>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n",
895
+ styles: [":host{display:inline-block}mat-form-field{width:100%}"]
896
+ }),
897
+ __metadata("design:paramtypes", [])
898
+ ], MultipleSelectInputComponent);
899
+
689
900
  let NumberInputComponent = class NumberInputComponent extends AbstractValueInputComponent {
690
901
  constructor() {
691
902
  super();
903
+ // @Input() @TrackExternal({ delegateTo: 'inputModel' })
904
+ // valueModel: Form.ValueModelBase<number> | IMutableValueModel<number>;
692
905
  this.min = Number.MIN_SAFE_INTEGER;
693
906
  this.max = Number.MAX_SAFE_INTEGER;
694
907
  }
695
908
  ngOnInit() {
696
909
  }
697
910
  };
698
- __decorate([
699
- Input(), TrackExternal({ delegateTo: 'inputModel' }),
700
- __metadata("design:type", Object)
701
- ], NumberInputComponent.prototype, "valueModel", void 0);
702
911
  __decorate([
703
912
  Input(),
704
913
  __metadata("design:type", Object)
@@ -710,32 +919,37 @@ __decorate([
710
919
  NumberInputComponent = __decorate([
711
920
  Component({
712
921
  selector: 'aup-number-input',
713
- template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"valueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n >\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n",
714
- styles: [":host{display:block}input,mat-form-field{width:100%}input mat-hint.faux-error,mat-form-field mat-hint.faux-error{color:#f44336}:host-context(aup-table-cell-renderer) mat-form-field div.mat-form-field-infix{width:auto}"]
922
+ template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input type=\"number\"\n matInput\n placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"componentValueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [min]=\"min\"\n [max]=\"max\"\n >\n <mat-hint *ngIf=\"hint && !dense\" >{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n",
923
+ styles: [""]
715
924
  }),
716
925
  __metadata("design:paramtypes", [])
717
926
  ], NumberInputComponent);
718
927
 
719
928
  let PasswordInputComponent = class PasswordInputComponent extends AbstractValueInputComponent {
929
+ // @Input() @TrackExternal({ delegateTo: 'inputModel' })
930
+ // valueModel: Form.ValueModelBase<string> | IMutableValueModel<string>;
720
931
  constructor() {
721
932
  super();
722
933
  }
723
934
  ngOnInit() {
724
935
  }
725
936
  };
726
- __decorate([
727
- Input(), TrackExternal({ delegateTo: 'inputModel' }),
728
- __metadata("design:type", Object)
729
- ], PasswordInputComponent.prototype, "valueModel", void 0);
730
937
  PasswordInputComponent = __decorate([
731
938
  Component({
732
939
  selector: 'aup-password-input',
733
- template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input type=\"password\"\n matInput\n placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"valueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n\n",
734
- styles: [":host{display:block}input,mat-form-field{width:100%}input mat-hint.faux-error,mat-form-field mat-hint.faux-error{color:#f44336}:host-context(aup-table-cell-renderer) mat-form-field div.mat-form-field-infix{width:auto}"]
940
+ template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input type=\"password\"\n matInput\n placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"componentValueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n\n",
941
+ styles: [""]
735
942
  }),
736
943
  __metadata("design:paramtypes", [])
737
944
  ], PasswordInputComponent);
738
945
 
946
+ /**
947
+ * Using templates:
948
+ * <aup-select-input [valueModel]="myModel" [options]="myOptions">
949
+ * <ng-template #optionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
950
+ * <ng-template #nilOptionTemplate let-option>{{option.thePropertyYouWant}}</ng-template>
951
+ * </aup-select_input>
952
+ */
739
953
  let SelectInputComponent = class SelectInputComponent extends AbstractValueInputComponent {
740
954
  constructor() {
741
955
  super();
@@ -744,10 +958,6 @@ let SelectInputComponent = class SelectInputComponent extends AbstractValueInput
744
958
  ngOnInit() {
745
959
  }
746
960
  };
747
- __decorate([
748
- Input(), TrackExternal({ delegateTo: 'inputModel' }),
749
- __metadata("design:type", Object)
750
- ], SelectInputComponent.prototype, "valueModel", void 0);
751
961
  __decorate([
752
962
  Input(), TrackExternal(),
753
963
  __metadata("design:type", ListModel)
@@ -779,7 +989,7 @@ __decorate([
779
989
  SelectInputComponent = __decorate([
780
990
  Component({
781
991
  selector: 'aup-select-input',
782
- template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"valueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-option *ngIf=\"allowNil\">{{placeholder}}</mat-option>\n <mat-option *ngFor=\"let option of optionsModel.value; let i = index\" [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n </mat-select>\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n",
992
+ template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"componentValueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-option *ngIf=\"allowNil\">\n <ng-container *ngIf=\"!nilOptionTemplateRef\">{{placeholder}}</ng-container>\n <ng-container *ngIf=\"nilOptionTemplateRef\" [ngTemplateOutlet]=\"nilOptionTemplateRef\"></ng-container>\n </mat-option>\n <mat-option *ngFor=\"let option of optionsModel.value; let i = index\" [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n </mat-select>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n",
783
993
  styles: [":host{display:inline-block}mat-form-field{width:100%}"]
784
994
  }),
785
995
  __metadata("design:paramtypes", [])
@@ -790,17 +1000,13 @@ let StringInputComponent = class StringInputComponent extends AbstractValueInput
790
1000
  super();
791
1001
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
792
1002
  this.clearCommand = Command.create(() => {
793
- this.valueModel.value = null;
1003
+ this.componentValueModel.value = null;
794
1004
  });
795
- this.clearCommand.disableWhile(chain.stringValue(this.valueModel).isBlank());
1005
+ this.clearCommand.disableWhile(chain.stringValue(this.componentValueModel).isBlank());
796
1006
  }
797
1007
  ngOnInit() {
798
1008
  }
799
1009
  };
800
- __decorate([
801
- Input(), TrackExternal({ delegateTo: 'inputModel' }),
802
- __metadata("design:type", Object)
803
- ], StringInputComponent.prototype, "valueModel", void 0);
804
1010
  __decorate([
805
1011
  Input(), TrackExternal({ defaultValue: false }),
806
1012
  __metadata("design:type", ValueModel)
@@ -812,8 +1018,8 @@ __decorate([
812
1018
  StringInputComponent = __decorate([
813
1019
  Component({
814
1020
  selector: 'aup-string-input',
815
- template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input matInput\n placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"valueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <button mat-button mat-icon-button matSuffix *ngIf=\"enableClear\" [pectinCommand]=\"clearCommand\">\n <aup-icon icon=\"mat:close\"></aup-icon>\n </button>\n</mat-form-field>\n\n",
816
- styles: [":host{display:block}input,mat-form-field{width:100%}input mat-hint.faux-error,mat-form-field mat-hint.faux-error{color:#f44336}:host-context(aup-table-cell-renderer) mat-form-field div.mat-form-field-infix{width:auto}button[disabled]{visibility:hidden}"]
1021
+ template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <input matInput\n placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"componentValueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n <button mat-button mat-icon-button matSuffix *ngIf=\"enableClear\" [pectinCommand]=\"clearCommand\">\n <aup-icon icon=\"mat:close\"></aup-icon>\n </button>\n</mat-form-field>\n\n",
1022
+ styles: ["button[disabled]{visibility:hidden}"]
817
1023
  }),
818
1024
  __metadata("design:paramtypes", [])
819
1025
  ], StringInputComponent);
@@ -821,16 +1027,14 @@ StringInputComponent = __decorate([
821
1027
  let TextInputComponent = class TextInputComponent extends AbstractValueInputComponent {
822
1028
  constructor() {
823
1029
  super();
1030
+ // @Input() @TrackExternal({ delegateTo: 'inputModel' })
1031
+ // valueModel: Form.ValueModelBase<string> | IMutableValueModel<string>;
824
1032
  this.rows = 2;
825
1033
  // const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
826
1034
  }
827
1035
  ngOnInit() {
828
1036
  }
829
1037
  };
830
- __decorate([
831
- Input(), TrackExternal({ delegateTo: 'inputModel' }),
832
- __metadata("design:type", Object)
833
- ], TextInputComponent.prototype, "valueModel", void 0);
834
1038
  __decorate([
835
1039
  Input(),
836
1040
  __metadata("design:type", Object)
@@ -842,12 +1046,47 @@ __decorate([
842
1046
  TextInputComponent = __decorate([
843
1047
  Component({
844
1048
  selector: 'aup-text-input',
845
- template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <textarea matInput\n placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"valueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [rows]=\"rows\"\n [cols]=\"cols\"\n >\n </textarea>\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n\n",
846
- styles: [":host{display:block}input,mat-form-field{width:100%}input mat-hint.faux-error,mat-form-field mat-hint.faux-error{color:#f44336}:host-context(aup-table-cell-renderer) mat-form-field div.mat-form-field-infix{width:auto}button[disabled]{visibility:hidden}textarea{overflow:auto}"]
1049
+ template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <textarea matInput\n placeholder=\"{{placeholder}}\"\n [(ngModel)]=\"componentValueModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n [rows]=\"rows\"\n [cols]=\"cols\"\n >\n </textarea>\n <mat-hint *ngIf=\"showHint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n\n",
1050
+ styles: ["button[disabled]{visibility:hidden}textarea{overflow:auto}"]
847
1051
  }),
848
1052
  __metadata("design:paramtypes", [])
849
1053
  ], TextInputComponent);
850
1054
 
1055
+ let IconComponent = class IconComponent {
1056
+ set icon(iconName) {
1057
+ this._icon = iconName;
1058
+ if (!iconName) {
1059
+ this.errorMessage = 'icon is nil';
1060
+ this.prefix = undefined;
1061
+ return;
1062
+ }
1063
+ const colonIndex = iconName.indexOf(':');
1064
+ if (colonIndex > 0) {
1065
+ this.prefix = this.icon.slice(0, colonIndex);
1066
+ this.suffix = this.icon.slice(colonIndex + 1);
1067
+ }
1068
+ if (this.prefix) {
1069
+ this.errorMessage = `Unknown icon "${iconName}"`;
1070
+ }
1071
+ this.errorMessage = `Unknown icon prefix "${this.prefix}"`;
1072
+ }
1073
+ get icon() {
1074
+ return this._icon;
1075
+ }
1076
+ };
1077
+ __decorate([
1078
+ Input(),
1079
+ __metadata("design:type", String),
1080
+ __metadata("design:paramtypes", [String])
1081
+ ], IconComponent.prototype, "icon", null);
1082
+ IconComponent = __decorate([
1083
+ Component({
1084
+ selector: 'aup-icon',
1085
+ template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"'svg'\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"'mat'\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"'fab'\"\n class=\"faIconWrapper\">\n <fa-icon [icon]=\"suffix\">\n </fa-icon>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n",
1086
+ styles: [":host{display:inline-flex;width:24px}fa-icon{vertical-align:middle}.faIconWrapper{text-align:center;width:24px;height:24px}.svgIcon{width:24px;height:24px}:host(.mat-chip-remove) mat-icon{font-size:18px}mat-icon{width:inherit;height:inherit}"]
1087
+ })
1088
+ ], IconComponent);
1089
+
851
1090
  let NoopComponent = class NoopComponent {
852
1091
  constructor() {
853
1092
  }
@@ -1032,6 +1271,7 @@ class CellHeaderPortalRef extends CellPortalRef {
1032
1271
  assert$1.isTruthy(host);
1033
1272
  host[HEADER_CELL_RENDERER_PORTAL] = new ComponentPortal(this.componentType);
1034
1273
  }
1274
+ // @Trace()
1035
1275
  onPortalAttached(host, portalComponent) {
1036
1276
  this.initialiseHeader(portalComponent, host.column);
1037
1277
  }
@@ -1047,13 +1287,15 @@ class ComponentCellRendererPortalRef extends CellRendererPortalRef {
1047
1287
  initialiseHost(host, columnModel) {
1048
1288
  host[CELL_RENDERER_PORTAL] = new ComponentPortal(this.componentType);
1049
1289
  }
1290
+ // @Trace()
1050
1291
  onPortalAttached(host, portalComponent) {
1051
1292
  host[PORTAL_RENDERER_COMPONENT] = portalComponent;
1052
- this.updateComponent(portalComponent, host.getRowData());
1293
+ this.updateComponent(portalComponent, host.getRowData(), true);
1053
1294
  }
1295
+ // @Trace()
1054
1296
  pushState(host) {
1055
1297
  if (host[PORTAL_RENDERER_COMPONENT]) {
1056
- this.updateComponent(host[PORTAL_RENDERER_COMPONENT], host.getRowData());
1298
+ this.updateComponent(host[PORTAL_RENDERER_COMPONENT], host.getRowData(), false);
1057
1299
  }
1058
1300
  }
1059
1301
  }
@@ -1090,6 +1332,7 @@ class TemplateCellRendererPortalRef extends CellRendererPortalRef {
1090
1332
  onPortalAttached(host, portalComponent) {
1091
1333
  // don't care
1092
1334
  }
1335
+ // @Trace()
1093
1336
  pushState(host) {
1094
1337
  host[CELL_RENDERER_PORTAL] = this.createPortal(host.getRowData());
1095
1338
  host.fillCell = this.fillCell;
@@ -1258,6 +1501,7 @@ SelectHeaderCellRendererComponent = __decorate([
1258
1501
  const noop = () => {
1259
1502
  };
1260
1503
  const ɵ0 = noop;
1504
+ const CELL_RENDERER_COMPONENT_ROW_CACHE = Symbol("aup-cell-renderer:row-data-cache");
1261
1505
  class ColumnModel {
1262
1506
  constructor(columnId, defaults) {
1263
1507
  this.columnId = columnId;
@@ -1346,21 +1590,62 @@ __decorate([
1346
1590
  __metadata("design:returntype", Object)
1347
1591
  ], ColumnModel.prototype, "getColumnTextProperties", null);
1348
1592
  class PropertyColumnModel extends ColumnModel {
1349
- constructor(property, defaults) {
1350
- super(property.toString(), defaults);
1593
+ constructor(id, property, defaults) {
1594
+ super(id, defaults);
1351
1595
  this.property = property;
1352
1596
  this._format = (value) => value;
1353
1597
  this.cellRenderer(DefaultCellRendererComponent);
1354
1598
  }
1355
- cellRenderer(componentType) {
1356
- this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData) => {
1599
+ cellRenderer(componentType, onComponentInitOrOptions) {
1600
+ this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
1601
+ if (firstTime) {
1602
+ if (___default.isFunction(onComponentInitOrOptions)) {
1603
+ onComponentInitOrOptions(component);
1604
+ }
1605
+ else {
1606
+ if (___default.isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onComponentInit)) {
1607
+ onComponentInitOrOptions.onComponentInit(component);
1608
+ }
1609
+ }
1610
+ }
1357
1611
  component.value = this._format(rowData.row[this.property]);
1612
+ if (!___default.isFunction(onComponentInitOrOptions) && ___default.isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onRowUpdate)) {
1613
+ onComponentInitOrOptions.onRowUpdate(component, rowData.row);
1614
+ }
1358
1615
  }));
1359
1616
  return this;
1360
1617
  }
1361
- cellEditor(editor, validatorsOrInitialiser, initialiseComponent) {
1618
+ mutableCellRenderer(componentType, options) {
1619
+ this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
1620
+ // keep a local copy most recent row value so it's available to teh
1621
+ // edit callback without having to add/remove subscribers all the time.
1622
+ component[CELL_RENDERER_COMPONENT_ROW_CACHE] = rowData.row;
1623
+ let disableEditCallback = false;
1624
+ if (firstTime) {
1625
+ if (___default.isFunction(options === null || options === void 0 ? void 0 : options.onComponentInit)) {
1626
+ options.onComponentInit(component);
1627
+ }
1628
+ // install our edit callback
1629
+ component.onValueEdited((is, was) => {
1630
+ if (!disableEditCallback) {
1631
+ options.onValueEdit(component[CELL_RENDERER_COMPONENT_ROW_CACHE], is, was);
1632
+ }
1633
+ });
1634
+ }
1635
+ // now push the value the component and disable the callback just incase the component misbehaves
1636
+ // and fires a value change during the operation.
1637
+ disableEditCallback = true;
1638
+ component.value = rowData.row[this.property];
1639
+ disableEditCallback = false;
1640
+ if (!___default.isFunction(options) && ___default.isFunction(options === null || options === void 0 ? void 0 : options.onRowUpdate)) {
1641
+ options.onRowUpdate(component, rowData.row);
1642
+ }
1643
+ }));
1644
+ return this;
1645
+ }
1646
+ cellEditor(editor, validatorsOrInitialiser, onComponentInit) {
1362
1647
  const validators = Array.isArray(validatorsOrInitialiser) ? validatorsOrInitialiser : undefined;
1363
- const initialiser = ___default.isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : initialiseComponent;
1648
+ const initialiser = ___default.isFunction(validatorsOrInitialiser) ? validatorsOrInitialiser : onComponentInit;
1364
1649
  this.configureCellEditor(new CellEditorPortalRef(editor, (component, editSession) => {
1365
1650
  const formValueModel = editSession.form.pluck(this.property);
1366
1651
  if (validators) {
@@ -1383,8 +1668,8 @@ class PropertyColumnModel extends ColumnModel {
1383
1668
  }
1384
1669
  }
1385
1670
  class ListPropertyColumnModel extends ColumnModel {
1386
- constructor(property, defaults) {
1387
- super(property.toString(), defaults);
1671
+ constructor(id, property, defaults) {
1672
+ super(id, defaults);
1388
1673
  this.property = property;
1389
1674
  this._format = (value) => value.map(v => v === null || v === void 0 ? void 0 : v.toString()).join(', ');
1390
1675
  this.cellRenderer(DefaultCellRendererComponent);
@@ -1425,9 +1710,22 @@ class CustomValueColumnModel extends ColumnModel {
1425
1710
  this.getValue = getValue;
1426
1711
  this.cellRenderer(DefaultCellRendererComponent);
1427
1712
  }
1428
- cellRenderer(componentType) {
1429
- this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData) => {
1713
+ cellRenderer(componentType, onComponentInitOrOptions) {
1714
+ this.configureCellRenderer(new ComponentCellRendererPortalRef(componentType, (component, rowData, firstTime) => {
1715
+ if (firstTime) {
1716
+ if (___default.isFunction(onComponentInitOrOptions)) {
1717
+ onComponentInitOrOptions(component);
1718
+ }
1719
+ else {
1720
+ if (___default.isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onComponentInit)) {
1721
+ onComponentInitOrOptions.onComponentInit(component);
1722
+ }
1723
+ }
1724
+ }
1430
1725
  component.value = this.getValue(rowData.row);
1726
+ if (!___default.isFunction(onComponentInitOrOptions) && ___default.isFunction(onComponentInitOrOptions === null || onComponentInitOrOptions === void 0 ? void 0 : onComponentInitOrOptions.onRowUpdate)) {
1727
+ onComponentInitOrOptions.onRowUpdate(component, rowData.row);
1728
+ }
1431
1729
  }));
1432
1730
  return this;
1433
1731
  }
@@ -1589,6 +1887,9 @@ let TableModel = TableModel_1 = class TableModel {
1589
1887
  this._editorSessions = new MutableListModel();
1590
1888
  this.rowClassNamePredicates = [];
1591
1889
  this._createForm = (row) => new DirtyTrackingForm();
1890
+ this.trackBy = (index, item) => {
1891
+ return this.identityOf ? this.identityOf(item) : index;
1892
+ };
1592
1893
  this.identityOf = sourceOfTruth.identityOf;
1593
1894
  const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this._garbage);
1594
1895
  this._columnsById = chain(this._columns).indexBy('columnId');
@@ -1600,7 +1901,7 @@ let TableModel = TableModel_1 = class TableModel {
1600
1901
  this.dataSource = chain(this.sourceOfTruth).replaceAll(this.rowsBeingEdited);
1601
1902
  this.firstEditableColumn = chain(this.columns).select(c => c.hasEditorPortal()).first();
1602
1903
  this.hasColumnsWithRowSelectionExplicitlyEnabled = chain(this._columns).findIndex(column => column.isRowSelectionExplicitlyEnabled()).isGreaterThanOrEqualTo(0);
1603
- this.addRowClass("enable-hover", () => this.isRowSelectionEnabled());
1904
+ this.addRowClass('enable-hover', () => this.isRowSelectionEnabled());
1604
1905
  }
1605
1906
  static fromList(sourceOfTruth, builder) {
1606
1907
  const model = new TableModel_1(sourceOfTruth);
@@ -1610,19 +1911,14 @@ let TableModel = TableModel_1 = class TableModel {
1610
1911
  get rowsBeingEdited() {
1611
1912
  return this._rowsBeingEdited.readonly;
1612
1913
  }
1613
- getTrackByFunction() {
1614
- return (index, item) => {
1615
- return this.identityOf ? this.identityOf(item) : index;
1616
- };
1617
- }
1618
1914
  get columns() {
1619
1915
  return this._columns.readonly;
1620
1916
  }
1621
- pluck(property) {
1622
- return this.addColumn(new PropertyColumnModel(property, this));
1917
+ pluck(property, options) {
1918
+ return this.addColumn(new PropertyColumnModel((options === null || options === void 0 ? void 0 : options.columnId) || property.toString(), property, this));
1623
1919
  }
1624
- pluckList(property) {
1625
- return this.addColumn(new ListPropertyColumnModel(property, this));
1920
+ pluckList(property, options) {
1921
+ return this.addColumn(new ListPropertyColumnModel((options === null || options === void 0 ? void 0 : options.columnId) || property.toString(), property, this));
1626
1922
  }
1627
1923
  addSelectionColumn(selectionModel) {
1628
1924
  assert.isNil(this.selectionColumnModel);
@@ -1636,6 +1932,9 @@ let TableModel = TableModel_1 = class TableModel {
1636
1932
  addCustomColumn(columnId, dataAccessor) {
1637
1933
  return this.addColumn(new CustomValueColumnModel(columnId, this, dataAccessor));
1638
1934
  }
1935
+ addComponentColumn(columnId, component, onComponentInitOrOptions) {
1936
+ return this.addColumn(new CustomValueColumnModel(columnId, this, row => row)).cellRenderer(component, onComponentInitOrOptions);
1937
+ }
1639
1938
  addTemplateColumn(columnId) {
1640
1939
  return this.addColumn(new CustomTemplateColumnModel(columnId, this));
1641
1940
  }
@@ -1783,7 +2082,7 @@ __decorate([
1783
2082
  TableComponent = __decorate([
1784
2083
  Component({
1785
2084
  selector: 'aup-table',
1786
- template: "<table mat-table [dataSource]=\"tableModel.dataSource.value\" [trackBy]=\"tableModel.getTrackByFunction()\">\n\n <ng-container *ngFor=\"let column of columns.value; index as index; first as first; last as last\" matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef>\n <aup-table-header-cell-renderer [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class.first-column]=\"first\"\n [class.last-column]=\"last\"\n ></aup-table-header-cell-renderer>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"onCellClicked(column, row)\" [class.enable-cursor]=\"tableModel.isRowSelectionEnabledFor(column)\">\n <aup-table-cell-renderer [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"tableModel\"\n [editSession]=\"tableModel.getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class.first-column]=\"first\"\n [class.last-column]=\"last\"\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;\"\n [ngClass]=\"tableModel.getRowClasses(row)\"\n ></tr>\n\n</table>\n",
2085
+ template: "<table mat-table [dataSource]=\"tableModel.dataSource.value\" [trackBy]=\"tableModel.trackBy\">\n\n <ng-container *ngFor=\"let column of columns.value; index as index; first as first; last as last\" matColumnDef=\"{{column.columnId}}\">\n <th mat-header-cell *matHeaderCellDef>\n <aup-table-header-cell-renderer [column]=\"column\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class.first-column]=\"first\"\n [class.last-column]=\"last\"\n ></aup-table-header-cell-renderer>\n </th>\n <td mat-cell *matCellDef=\"let row\" (click)=\"onCellClicked(column, row)\" [class.enable-cursor]=\"tableModel.isRowSelectionEnabledFor(column)\">\n <aup-table-cell-renderer [column]=\"column\"\n [row]=\"row\"\n [tableModel]=\"tableModel\"\n [editSession]=\"tableModel.getEditSessionFor(row)\"\n [attr.column-index]=\"index\"\n [attr.column-id]=\"column.columnId\"\n [class.first-column]=\"first\"\n [class.last-column]=\"last\"\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]=\"tableModel.getRowClasses(row)\" [attr.trackBy]=\"tableModel.trackBy(i, row)\"\n ></tr>\n\n</table>\n",
1787
2086
  styles: [":host{display:flex;flex-direction:column;align-items:stretch}:host table{flex:1}"]
1788
2087
  }),
1789
2088
  __metadata("design:paramtypes", [])
@@ -2040,90 +2339,6 @@ VerticalFocusContainerComponent = __decorate([
2040
2339
  __metadata("design:paramtypes", [FocusManager])
2041
2340
  ], VerticalFocusContainerComponent);
2042
2341
 
2043
- let MultipleSelectInputComponent = class MultipleSelectInputComponent extends AbstractListInputComponent {
2044
- constructor() {
2045
- super();
2046
- this.optionLabelFormat = (option) => (option && this.optionLabel) ? option[this.optionLabel] : option;
2047
- }
2048
- ngOnInit() {
2049
- }
2050
- };
2051
- __decorate([
2052
- Input(), TrackExternal({ delegateTo: 'inputModel' }),
2053
- __metadata("design:type", Object)
2054
- ], MultipleSelectInputComponent.prototype, "listModel", void 0);
2055
- __decorate([
2056
- Input(), TrackExternal(),
2057
- __metadata("design:type", ListModel)
2058
- ], MultipleSelectInputComponent.prototype, "optionsModel", void 0);
2059
- __decorate([
2060
- Input(), StoreInListModel('optionsModel'),
2061
- __metadata("design:type", Array)
2062
- ], MultipleSelectInputComponent.prototype, "options", void 0);
2063
- __decorate([
2064
- Input(),
2065
- __metadata("design:type", Object)
2066
- ], MultipleSelectInputComponent.prototype, "optionLabel", void 0);
2067
- __decorate([
2068
- Input(),
2069
- __metadata("design:type", Boolean)
2070
- ], MultipleSelectInputComponent.prototype, "allowNil", void 0);
2071
- __decorate([
2072
- ContentChild('optionTemplate'),
2073
- __metadata("design:type", TemplateRef)
2074
- ], MultipleSelectInputComponent.prototype, "optionTemplateRef", void 0);
2075
- __decorate([
2076
- ContentChild('nilOptionTemplate'),
2077
- __metadata("design:type", TemplateRef)
2078
- ], MultipleSelectInputComponent.prototype, "nilOptionTemplateRef", void 0);
2079
- __decorate([
2080
- Input(),
2081
- __metadata("design:type", Function)
2082
- ], MultipleSelectInputComponent.prototype, "optionLabelFormat", void 0);
2083
- MultipleSelectInputComponent = __decorate([
2084
- Component({
2085
- selector: 'aup-multiple-select-input',
2086
- template: "<mat-form-field appearance=\"standard\" [floatLabel]=\"floatLabel\">\n <mat-label *ngIf=\"label\">{{label}}</mat-label>\n <mat-select placeholder=\"{{placeholder}}\"\n multiple\n [(ngModel)]=\"listModel.value\"\n [disabled]=\"!enabled.value\"\n (keydown.enter)=\"notifyEnterKey()\"\n (keydown.escape)=\"notifyEscapeKey()\"\n [pectinFocusBinding]=\"focusContext\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-option *ngIf=\"allowNil\">{{placeholder}}</mat-option>\n <mat-option *ngFor=\"let option of optionsModel.value; let i = index\" [value]=\"option\">\n <ng-container *ngIf=\"!optionTemplateRef\">{{optionLabelFormat(option)}}</ng-container>\n <ng-container *ngIf=\"optionTemplateRef\"\n [ngTemplateOutlet]=\"optionTemplateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: option, index: i }\"\n >\n </ng-container>\n </mat-option>\n </mat-select>\n <mat-hint *ngIf=\"hint\">{{hint}}</mat-hint>\n <mat-error *ngIf=\"hasErrors\">{{firstError}}</mat-error>\n</mat-form-field>\n",
2087
- styles: [":host{display:inline-block}mat-form-field{width:100%}"]
2088
- }),
2089
- __metadata("design:paramtypes", [])
2090
- ], MultipleSelectInputComponent);
2091
-
2092
- let IconComponent = class IconComponent {
2093
- set icon(iconName) {
2094
- this._icon = iconName;
2095
- if (!iconName) {
2096
- this.errorMessage = 'icon is nil';
2097
- this.prefix = undefined;
2098
- return;
2099
- }
2100
- const colonIndex = iconName.indexOf(':');
2101
- if (colonIndex > 0) {
2102
- this.prefix = this.icon.slice(0, colonIndex);
2103
- this.suffix = this.icon.slice(colonIndex + 1);
2104
- }
2105
- if (this.prefix) {
2106
- this.errorMessage = `Unknown icon "${iconName}"`;
2107
- }
2108
- this.errorMessage = `Unknown icon prefix "${this.prefix}"`;
2109
- }
2110
- get icon() {
2111
- return this._icon;
2112
- }
2113
- };
2114
- __decorate([
2115
- Input(),
2116
- __metadata("design:type", String),
2117
- __metadata("design:paramtypes", [String])
2118
- ], IconComponent.prototype, "icon", null);
2119
- IconComponent = __decorate([
2120
- Component({
2121
- selector: 'aup-icon',
2122
- template: "<ng-container [ngSwitch]=\"prefix\">\n\n <mat-icon *ngSwitchCase=\"'svg'\"\n [svgIcon]=\"suffix\"\n class=\"svgIcon\">\n </mat-icon>\n\n <mat-icon *ngSwitchCase=\"'mat'\">\n {{suffix}}\n </mat-icon>\n\n <div *ngSwitchCase=\"'fab'\"\n class=\"faIconWrapper\">\n <fa-icon [icon]=\"suffix\">\n </fa-icon>\n </div>\n\n <mat-icon *ngSwitchDefault\n [matTooltip]=\"errorMessage\">\n bug_report\n </mat-icon>\n\n</ng-container>\n\n",
2123
- styles: [":host{display:inline-flex;width:24px}fa-icon{vertical-align:middle}.faIconWrapper{text-align:center;width:24px;height:24px}.svgIcon{width:24px;height:24px}:host(.mat-chip-remove) mat-icon{font-size:18px}mat-icon{width:inherit;height:inherit}"]
2124
- })
2125
- ], IconComponent);
2126
-
2127
2342
  let ComponentsModule = class ComponentsModule {
2128
2343
  constructor(faIconLibrary) {
2129
2344
  faIconLibrary.addIconPacks(fas);
@@ -2143,6 +2358,8 @@ ComponentsModule = __decorate([
2143
2358
  TextInputComponent,
2144
2359
  PasswordInputComponent,
2145
2360
  SelectInputComponent,
2361
+ MultipleSelectInputComponent,
2362
+ AutocompleteInputComponent,
2146
2363
  CheckboxInputComponent,
2147
2364
  ScrollContainerComponent,
2148
2365
  NoopComponent,
@@ -2162,7 +2379,6 @@ ComponentsModule = __decorate([
2162
2379
  SelectHeaderCellRendererComponent,
2163
2380
  DefaultHeaderCellRendererComponent,
2164
2381
  TableHeaderCellRendererComponent,
2165
- MultipleSelectInputComponent,
2166
2382
  IconComponent,
2167
2383
  SectionHeaderComponent
2168
2384
  ],
@@ -2182,7 +2398,8 @@ ComponentsModule = __decorate([
2182
2398
  PortalModule,
2183
2399
  CdkScrollableModule,
2184
2400
  FontAwesomeModule,
2185
- MatTooltipModule
2401
+ MatTooltipModule,
2402
+ MatAutocompleteModule
2186
2403
  ],
2187
2404
  exports: [
2188
2405
  NumberInputComponent,
@@ -2191,6 +2408,8 @@ ComponentsModule = __decorate([
2191
2408
  PasswordInputComponent,
2192
2409
  CheckboxInputComponent,
2193
2410
  SelectInputComponent,
2411
+ MultipleSelectInputComponent,
2412
+ AutocompleteInputComponent,
2194
2413
  ScrollContainerComponent,
2195
2414
  NoopComponent,
2196
2415
  SwitchCaseComponent,
@@ -2203,12 +2422,23 @@ ComponentsModule = __decorate([
2203
2422
  TableComponent,
2204
2423
  EditRowControls,
2205
2424
  ColumnTemplateDirective,
2206
- MultipleSelectInputComponent,
2207
2425
  IconComponent,
2208
2426
  SectionHeaderComponent
2209
2427
  ],
2210
2428
  providers: [
2211
- FocusBindingFactory,
2429
+ FocusBindingFactory
2430
+ // {
2431
+ // provide: CELL_EDITOR_REGISTRATION, useValue: {
2432
+ // type: 'string',
2433
+ // editorClass: StringInputComponent
2434
+ // }, multi: true
2435
+ // },
2436
+ // {
2437
+ // provide: CELL_EDITOR_REGISTRATION, useValue: {
2438
+ // type: 'number',
2439
+ // editorClass: NumberInputComponent
2440
+ // }, multi: true
2441
+ // }
2212
2442
  ]
2213
2443
  }),
2214
2444
  __metadata("design:paramtypes", [FaIconLibrary])
@@ -2581,6 +2811,7 @@ let ActivityContainerComponent = class ActivityContainerComponent extends Abstra
2581
2811
  registerDisposable(disposable) {
2582
2812
  return this.garbage.registerDisposable(disposable);
2583
2813
  }
2814
+ // @Trace()
2584
2815
  dispose() {
2585
2816
  // TODO: think about auto cancelling any outstanding activity on dispose.
2586
2817
  // See NavigationState.Navigating for a use-case.
@@ -2720,12 +2951,6 @@ __decorate([
2720
2951
  ViewChildren(ActivityOutletComponent),
2721
2952
  __metadata("design:type", QueryList)
2722
2953
  ], ActivityContainerComponent.prototype, "activityOutlets", void 0);
2723
- __decorate([
2724
- Trace(),
2725
- __metadata("design:type", Function),
2726
- __metadata("design:paramtypes", []),
2727
- __metadata("design:returntype", void 0)
2728
- ], ActivityContainerComponent.prototype, "dispose", null);
2729
2954
  ActivityContainerComponent = __decorate([
2730
2955
  Component({
2731
2956
  selector: 'aup-activity-container',
@@ -3712,7 +3937,7 @@ let PlaceComponent = PlaceComponent_1 = class PlaceComponent extends DisposableC
3712
3937
  assert.isNil(this.visitModel.value);
3713
3938
  const { when } = Dsl.disposeWith(this);
3714
3939
  this.visitModel.value = visit;
3715
- DebugContext.get(this.visitModel).tag(`${this.placeDefinition.component.name}.visitModel`);
3940
+ DebugContext.getOrCreate(this.visitModel).tag(`${this.placeDefinition.component.name}.visitModel`);
3716
3941
  this.placeDefinition.getVisitParameterDefs().forEach(parameterDef => this.installBinding(parameterDef));
3717
3942
  when.valueOf(this.visitModel).changes((current, previous) => {
3718
3943
  notifyVisitChanged(current, previous);
@@ -4752,70 +4977,6 @@ UrlService = __decorate([
4752
4977
  __metadata("design:paramtypes", [Router, Location, UrlSerializer])
4753
4978
  ], UrlService);
4754
4979
 
4755
- class Visit {
4756
- constructor(placeDefinition, visitParameters = {}) {
4757
- this.placeDefinition = placeDefinition;
4758
- this.visitParameters = visitParameters;
4759
- }
4760
- // @Trace()
4761
- getRouteId() {
4762
- return this.placeDefinition.getRouteIdFrom(this);
4763
- }
4764
- // @Trace()
4765
- hasRouteId() {
4766
- return !isNil(this.getRouteId());
4767
- }
4768
- /**
4769
- * Returns the value of the place parameter with the specified name. The parameter
4770
- * name is taken from the `as` option, e.g. {as: 'aCustomName'} otherwise it is the
4771
- * same as the the ValueModel property name.
4772
- * @param parameterName the field name of the property model or the `as` option if specified.
4773
- */
4774
- getParameter(parameterName) {
4775
- return this.visitParameters[parameterName];
4776
- }
4777
- // @Trace()
4778
- hasParameter(parameterName) {
4779
- return Object.keys(this.visitParameters).includes(parameterName);
4780
- }
4781
- replace(parameter, value) {
4782
- return new Visit(this.placeDefinition, Object.assign(Object.assign({}, this.visitParameters), { [parameter.name]: value }));
4783
- }
4784
- mergeRouteParameters(routeParams) {
4785
- // todo: whitelist parameters.
4786
- const routeParameterKeys = Object.keys(routeParams);
4787
- const params = {};
4788
- this.placeDefinition.getVisitParameterDefs().forEach(def => {
4789
- if (def.isRouteId || def.isRouteParameter) {
4790
- if (routeParameterKeys.includes(def.name)) {
4791
- params[def.name] = routeParams[def.name];
4792
- }
4793
- }
4794
- else {
4795
- // copy non route params as is, but only if they already exist otherwise we'll inject nil values and break the
4796
- // defaults and remember sanitisation process.
4797
- const value = this.getParameter(def.name);
4798
- if (this.hasParameter(def.name)) {
4799
- params[def.name] = value;
4800
- }
4801
- }
4802
- });
4803
- return new Visit(this.placeDefinition, params);
4804
- }
4805
- hasRoutingChangedFrom(other) {
4806
- const samePlace = other.placeDefinition === this.placeDefinition;
4807
- const sameRouteParameters = isEqual(this.placeDefinition.getFormattedRouteParameters(this, true), this.placeDefinition.getFormattedRouteParameters(other, true));
4808
- return !samePlace || !sameRouteParameters;
4809
- }
4810
- hasChangedFrom(other) {
4811
- const sameNonRouteParameters = isEqual(this.placeDefinition.getNonRouteParameters(this), this.placeDefinition.getNonRouteParameters(other));
4812
- return !sameNonRouteParameters || this.hasRoutingChangedFrom(other);
4813
- }
4814
- toDebugString() {
4815
- return Object.keys(this.visitParameters).map(k => `${k}=${this.visitParameters[k]}`).join(",");
4816
- }
4817
- }
4818
-
4819
4980
  let PlaceRouter = class PlaceRouter extends GarbageCollector {
4820
4981
  constructor(angularRouter, angularLocation, interactionService, urlService, placeHistory) {
4821
4982
  super();
@@ -4977,6 +5138,7 @@ let PlaceRouter = class PlaceRouter extends GarbageCollector {
4977
5138
  get activeVisits() {
4978
5139
  return this._activeVisits.readonly;
4979
5140
  }
5141
+ // @Trace()
4980
5142
  pushVisitChangesToRoute(previous, next) {
4981
5143
  return __awaiter(this, void 0, void 0, function* () {
4982
5144
  this.placeHistory.updateVisit(next);
@@ -5073,12 +5235,6 @@ PlaceRouter.ctorParameters = () => [
5073
5235
  { type: PlaceHistory }
5074
5236
  ];
5075
5237
  PlaceRouter.ɵprov = ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(ɵɵinject(Router), ɵɵinject(Location), ɵɵinject(InteractionService), ɵɵinject(UrlService), ɵɵinject(PlaceHistory)); }, token: PlaceRouter, providedIn: "root" });
5076
- __decorate([
5077
- Trace(),
5078
- __metadata("design:type", Function),
5079
- __metadata("design:paramtypes", [Visit, Visit]),
5080
- __metadata("design:returntype", Promise)
5081
- ], PlaceRouter.prototype, "pushVisitChangesToRoute", null);
5082
5238
  PlaceRouter = __decorate([
5083
5239
  Injectable({
5084
5240
  providedIn: 'root'
@@ -5090,6 +5246,70 @@ PlaceRouter = __decorate([
5090
5246
  PlaceHistory])
5091
5247
  ], PlaceRouter);
5092
5248
 
5249
+ class Visit {
5250
+ constructor(placeDefinition, visitParameters = {}) {
5251
+ this.placeDefinition = placeDefinition;
5252
+ this.visitParameters = visitParameters;
5253
+ }
5254
+ // @Trace()
5255
+ getRouteId() {
5256
+ return this.placeDefinition.getRouteIdFrom(this);
5257
+ }
5258
+ // @Trace()
5259
+ hasRouteId() {
5260
+ return !isNil(this.getRouteId());
5261
+ }
5262
+ /**
5263
+ * Returns the value of the place parameter with the specified name. The parameter
5264
+ * name is taken from the `as` option, e.g. {as: 'aCustomName'} otherwise it is the
5265
+ * same as the the ValueModel property name.
5266
+ * @param parameterName the field name of the property model or the `as` option if specified.
5267
+ */
5268
+ getParameter(parameterName) {
5269
+ return this.visitParameters[parameterName];
5270
+ }
5271
+ // @Trace()
5272
+ hasParameter(parameterName) {
5273
+ return Object.keys(this.visitParameters).includes(parameterName);
5274
+ }
5275
+ replace(parameter, value) {
5276
+ return new Visit(this.placeDefinition, Object.assign(Object.assign({}, this.visitParameters), { [parameter.name]: value }));
5277
+ }
5278
+ mergeRouteParameters(routeParams) {
5279
+ // todo: whitelist parameters.
5280
+ const routeParameterKeys = Object.keys(routeParams);
5281
+ const params = {};
5282
+ this.placeDefinition.getVisitParameterDefs().forEach(def => {
5283
+ if (def.isRouteId || def.isRouteParameter) {
5284
+ if (routeParameterKeys.includes(def.name)) {
5285
+ params[def.name] = routeParams[def.name];
5286
+ }
5287
+ }
5288
+ else {
5289
+ // copy non route params as is, but only if they already exist otherwise we'll inject nil values and break the
5290
+ // defaults and remember sanitisation process.
5291
+ const value = this.getParameter(def.name);
5292
+ if (this.hasParameter(def.name)) {
5293
+ params[def.name] = value;
5294
+ }
5295
+ }
5296
+ });
5297
+ return new Visit(this.placeDefinition, params);
5298
+ }
5299
+ hasRoutingChangedFrom(other) {
5300
+ const samePlace = other.placeDefinition === this.placeDefinition;
5301
+ const sameRouteParameters = isEqual(this.placeDefinition.getFormattedRouteParameters(this, true), this.placeDefinition.getFormattedRouteParameters(other, true));
5302
+ return !samePlace || !sameRouteParameters;
5303
+ }
5304
+ hasChangedFrom(other) {
5305
+ const sameNonRouteParameters = isEqual(this.placeDefinition.getNonRouteParameters(this), this.placeDefinition.getNonRouteParameters(other));
5306
+ return !sameNonRouteParameters || this.hasRoutingChangedFrom(other);
5307
+ }
5308
+ toDebugString() {
5309
+ return Object.keys(this.visitParameters).map(k => `${k}=${this.visitParameters[k]}`).join(",");
5310
+ }
5311
+ }
5312
+
5093
5313
  const AUP_PLACE_CONFIG = new InjectionToken('AUP_PLACE_CONFIG');
5094
5314
 
5095
5315
  // Freezes the state of the components at the start of the animation.
@@ -5975,8 +6195,7 @@ function installMechanics(prototype, propertyKey, backingModel, tagPrefix, isEmp
5975
6195
  binding: null
5976
6196
  };
5977
6197
  const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
5978
- DebugContext.get(mechanics.backingModel).tag(tag);
5979
- Logger.get(mechanics.backingModel).tag(tag);
6198
+ DebugContext.getOrCreate(mechanics.backingModel).tag(tag);
5980
6199
  Object.defineProperty(prototype, propertyKey, {
5981
6200
  get: function () {
5982
6201
  return mechanics.backingModel;
@@ -6038,5 +6257,5 @@ function VisitParameterList(options) {
6038
6257
  * Generated bundle index. Do not edit.
6039
6258
  */
6040
6259
 
6041
- export { ACTIVITY_DATA, AUP_PLACE_CONFIG, AbstractInputActivity, AbstractInputComponent, AbstractInteractionContext, AbstractListInputComponent, AbstractPlaceNavigationComponent, AbstractPopStateNavigation, AbstractValueInputComponent, Activity, ActivityActionsComponent, ActivityContainerComponent, ActivityOutletComponent, ActivityRef, AddItemInteractionContextComponent, AlertDialogComponent, AngularUiPowerupsModule, Bounds, BusyOverlayComponent, CELL_EDITOR_PORTAL, CELL_RENDERER_PORTAL, CardContainerComponent, CellEditorPortalRef, CellHeaderPortalRef, CellPortalRef, CellRendererPortalRef, CheckboxInputComponent, ColumnModel, ColumnTemplateDirective, CommandDirective, ComponentCellRendererPortalRef, ComponentsModule, ConfirmThenDialogComponent, ConfirmationDialogComponent, ConsolidatedParameterMap, CustomTemplateColumnModel, CustomValueColumnModel, DEFINITION_META_DATA_KEY, DIALOG_INTERACTION_SERVICE_DEFAULTS, DefaultCellRendererComponent, DefaultHeaderCellRendererComponent, DialogInteractionContext, DialogInteractionContextFactory, Dimension, DirectivesModule, DisposableComponent, EditRowControls, EditSession, EditorControlColumnModel, EmptyStateComponent, EventCleanUpSession, FocusBinding, FocusBindingDirective, FocusBindingFactory, FocusContainerComponent, FocusableComponent, Formatter, HEADER_CELL_RENDERER_PORTAL, IconComponent, InPlaceInteractionContextComponent, InteractionContextTriggerFor, InteractionModule, InteractionService, InteractionServiceRoutingAdapter, LEFT_RIGHT_PLACE_ANIMATION, ListPlaceNavComponent, ListPropertyColumnModel, ModalInteractionContextFactory, MultipleSelectInputComponent, Navigating, NavigatingDuringInteraction, NavigationContext, NavigationSession, NoopAuthGuard, NoopComponent, NumberInputComponent, PORTAL_EDITOR_COMPONENT, PORTAL_RENDERER_COMPONENT, ParameterDefinition, PasswordInputComponent, Place, PlaceComponent, PlaceComponentDeactivationHandler, PlaceDefinition, PlaceGuard, PlaceHistory, PlaceModule, PlaceOutletComponent, PlaceRouter, Point, PopStateDuringInteractionNavigation, PopStateNavigation, PopupInteractionContextComponent, PropertyColumnModel, ROUTE_PARAMETER_LIST_KEY, RemoveLastInteractionFromUrlNavigationSession, ResizeAwareComponent, RouteId, ScrollContainerComponent, SectionHeaderComponent, SelectCellRendererComponent, SelectHeaderCellRendererComponent, SelectInputActivity, SelectInputComponent, SelectionColumnModel, SidePlaceNavigationComponent, StringInputActivity, StringInputComponent, SwitchCaseComponent, SwitchCaseDefaultDirective, SwitchCaseOption, SwitchCaseWhenDirective, SynchroniseInteractionContextIdsWithRoute, TabbedPlaceNavigationComponent, TableCellRendererComponent, TableComponent, TableHeaderCellRendererComponent, TableModel, TemplateCellRendererPortalRef, TextInputComponent, UrlService, UrlSnapshot, VerticalFocusContainerComponent, Visit, VisitParameter, VisitParameterList, VisitSanitiser, WaitUntilLeavingInteractionTransitionCancelled, WaitUntilLinkTriggeredNavigationInteractionCancellationEventsFinish, WaitUntilPopStateDuringCanDeactivateInteractionFinishes, leftRightPlaceAnimation, slideDownOnEnterAnimation, slideRightOnEnterAnimation, ɵ0, DirectivesModule as ɵa, CommandDirective as ɵb, EditRowControls as ɵba, ColumnTemplateDirective as ɵbb, DefaultCellRendererComponent as ɵbc, TableCellRendererComponent as ɵbd, SelectCellRendererComponent as ɵbe, SelectHeaderCellRendererComponent as ɵbf, DefaultHeaderCellRendererComponent as ɵbg, TableHeaderCellRendererComponent as ɵbh, MultipleSelectInputComponent as ɵbi, IconComponent as ɵbj, SectionHeaderComponent as ɵbk, PlaceModule as ɵbl, ComponentsModule as ɵbm, EmptyStateComponent as ɵbn, BusyOverlayComponent as ɵbo, PlaceOutletComponent as ɵbp, leftRightPlaceAnimation as ɵbq, LEFT_RIGHT_PLACE_ANIMATION as ɵbr, AUP_PLACE_CONFIG as ɵbs, PlaceRouter as ɵbu, InteractionService as ɵbv, ModalInteractionContextFactory as ɵbw, UrlService as ɵbx, PlaceHistory as ɵby, TabbedPlaceNavigationComponent as ɵbz, FocusBindingDirective as ɵc, AbstractPlaceNavigationComponent as ɵca, ListPlaceNavComponent as ɵcb, SidePlaceNavigationComponent as ɵcc, InteractionModule as ɵcd, ActivityContainerComponent as ɵce, AbstractInteractionContext as ɵcf, ActivityOutletComponent as ɵcg, ConfirmationDialogComponent as ɵch, ACTIVITY_DATA as ɵci, Activity as ɵcj, ConfirmThenDialogComponent as ɵcl, AlertDialogComponent as ɵcm, InPlaceInteractionContextComponent as ɵco, AddItemInteractionContextComponent as ɵcp, ActivityActionsComponent as ɵcq, PopupInteractionContextComponent as ɵcr, StringInputActivity as ɵcs, AbstractInputActivity as ɵct, SelectInputActivity as ɵcu, InteractionContextTriggerFor as ɵcv, DisposableComponent as ɵd, FocusBindingFactory as ɵe, ComponentsModule as ɵf, AbstractInputComponent as ɵg, AbstractValueInputComponent as ɵh, AbstractListInputComponent as ɵi, NumberInputComponent as ɵj, StringInputComponent as ɵk, TextInputComponent as ɵl, PasswordInputComponent as ɵm, SelectInputComponent as ɵn, CheckboxInputComponent as ɵo, ScrollContainerComponent as ɵp, NoopComponent as ɵq, SwitchCaseOption as ɵr, SwitchCaseWhenDirective as ɵs, SwitchCaseDefaultDirective as ɵt, SwitchCaseComponent as ɵu, FocusContainerComponent as ɵv, VerticalFocusContainerComponent as ɵw, FocusableComponent as ɵx, CardContainerComponent as ɵy, TableComponent as ɵz };
6260
+ export { ACTIVITY_DATA, AUP_PLACE_CONFIG, AbstractInputActivity, AbstractInputComponent, AbstractInteractionContext, AbstractListInputComponent, AbstractPlaceNavigationComponent, AbstractPopStateNavigation, AbstractValueInputComponent, Activity, ActivityActionsComponent, ActivityContainerComponent, ActivityOutletComponent, ActivityRef, AddItemInteractionContextComponent, AlertDialogComponent, AngularUiPowerupsModule, AutocompleteInputComponent, Bounds, BusyOverlayComponent, CELL_EDITOR_PORTAL, CELL_RENDERER_PORTAL, CardContainerComponent, CellEditorPortalRef, CellHeaderPortalRef, CellPortalRef, CellRendererPortalRef, CheckboxInputComponent, ColumnModel, ColumnTemplateDirective, CommandDirective, ComponentCellRendererPortalRef, ComponentsModule, ConfirmThenDialogComponent, ConfirmationDialogComponent, ConsolidatedParameterMap, CustomTemplateColumnModel, CustomValueColumnModel, DEFINITION_META_DATA_KEY, DIALOG_INTERACTION_SERVICE_DEFAULTS, DefaultCellRendererComponent, DefaultHeaderCellRendererComponent, DialogInteractionContext, DialogInteractionContextFactory, Dimension, DirectivesModule, DisposableComponent, EditRowControls, EditSession, EditorControlColumnModel, EmptyStateComponent, EventCleanUpSession, FocusBinding, FocusBindingDirective, FocusBindingFactory, FocusContainerComponent, FocusableComponent, Formatter, HEADER_CELL_RENDERER_PORTAL, IconComponent, InPlaceInteractionContextComponent, InteractionContextTriggerFor, InteractionModule, InteractionService, InteractionServiceRoutingAdapter, LEFT_RIGHT_PLACE_ANIMATION, ListPlaceNavComponent, ListPropertyColumnModel, ModalInteractionContextFactory, MultipleSelectInputComponent, Navigating, NavigatingDuringInteraction, NavigationContext, NavigationSession, NoopAuthGuard, NoopComponent, NumberInputComponent, PORTAL_EDITOR_COMPONENT, PORTAL_RENDERER_COMPONENT, ParameterDefinition, PasswordInputComponent, Place, PlaceComponent, PlaceComponentDeactivationHandler, PlaceDefinition, PlaceGuard, PlaceHistory, PlaceModule, PlaceOutletComponent, PlaceRouter, Point, PopStateDuringInteractionNavigation, PopStateNavigation, PopupInteractionContextComponent, PropertyColumnModel, ROUTE_PARAMETER_LIST_KEY, RemoveLastInteractionFromUrlNavigationSession, ResizeAwareComponent, RouteId, ScrollContainerComponent, SectionHeaderComponent, SelectCellRendererComponent, SelectHeaderCellRendererComponent, SelectInputActivity, SelectInputComponent, SelectionColumnModel, SidePlaceNavigationComponent, StringInputActivity, StringInputComponent, SwitchCaseComponent, SwitchCaseDefaultDirective, SwitchCaseOption, SwitchCaseWhenDirective, SynchroniseInteractionContextIdsWithRoute, TabbedPlaceNavigationComponent, TableCellRendererComponent, TableComponent, TableHeaderCellRendererComponent, TableModel, TemplateCellRendererPortalRef, TextInputComponent, UrlService, UrlSnapshot, VerticalFocusContainerComponent, Visit, VisitParameter, VisitParameterList, VisitSanitiser, WaitUntilLeavingInteractionTransitionCancelled, WaitUntilLinkTriggeredNavigationInteractionCancellationEventsFinish, WaitUntilPopStateDuringCanDeactivateInteractionFinishes, leftRightPlaceAnimation, slideDownOnEnterAnimation, slideRightOnEnterAnimation, ɵ0, DirectivesModule as ɵa, CommandDirective as ɵb, CardContainerComponent as ɵba, TableComponent as ɵbb, EditRowControls as ɵbc, ColumnTemplateDirective as ɵbd, DefaultCellRendererComponent as ɵbe, TableCellRendererComponent as ɵbf, SelectCellRendererComponent as ɵbg, SelectHeaderCellRendererComponent as ɵbh, DefaultHeaderCellRendererComponent as ɵbi, TableHeaderCellRendererComponent as ɵbj, IconComponent as ɵbk, SectionHeaderComponent as ɵbl, PlaceModule as ɵbm, ComponentsModule as ɵbn, EmptyStateComponent as ɵbo, BusyOverlayComponent as ɵbp, PlaceOutletComponent as ɵbq, leftRightPlaceAnimation as ɵbr, LEFT_RIGHT_PLACE_ANIMATION as ɵbs, AUP_PLACE_CONFIG as ɵbt, PlaceRouter as ɵbv, InteractionService as ɵbw, ModalInteractionContextFactory as ɵbx, UrlService as ɵby, PlaceHistory as ɵbz, FocusBindingDirective as ɵc, TabbedPlaceNavigationComponent as ɵca, AbstractPlaceNavigationComponent as ɵcb, ListPlaceNavComponent as ɵcc, SidePlaceNavigationComponent as ɵcd, InteractionModule as ɵce, ActivityContainerComponent as ɵcf, AbstractInteractionContext as ɵcg, ActivityOutletComponent as ɵch, ConfirmationDialogComponent as ɵci, ACTIVITY_DATA as ɵcj, Activity as ɵck, ConfirmThenDialogComponent as ɵcm, AlertDialogComponent as ɵcn, InPlaceInteractionContextComponent as ɵcp, AddItemInteractionContextComponent as ɵcq, ActivityActionsComponent as ɵcr, PopupInteractionContextComponent as ɵcs, StringInputActivity as ɵct, AbstractInputActivity as ɵcu, SelectInputActivity as ɵcv, InteractionContextTriggerFor as ɵcw, DisposableComponent as ɵd, FocusBindingFactory as ɵe, ComponentsModule as ɵf, AbstractInputComponent as ɵg, AbstractValueInputComponent as ɵh, AbstractListInputComponent as ɵi, NumberInputComponent as ɵj, StringInputComponent as ɵk, TextInputComponent as ɵl, PasswordInputComponent as ɵm, SelectInputComponent as ɵn, MultipleSelectInputComponent as ɵo, AutocompleteInputComponent as ɵp, CheckboxInputComponent as ɵq, ScrollContainerComponent as ɵr, NoopComponent as ɵs, SwitchCaseOption as ɵt, SwitchCaseWhenDirective as ɵu, SwitchCaseDefaultDirective as ɵv, SwitchCaseComponent as ɵw, FocusContainerComponent as ɵx, VerticalFocusContainerComponent as ɵy, FocusableComponent as ɵz };
6042
6261
  //# sourceMappingURL=coolon-angular-ui-powerups.js.map