@coolon/angular-ui-powerups 0.0.37 → 0.0.38

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 (116) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +1427 -808
  2. package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
  3. package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
  4. package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
  5. package/coolon-angular-ui-powerups.d.ts +16 -14
  6. package/coolon-angular-ui-powerups.metadata.json +1 -1
  7. package/esm2015/coolon-angular-ui-powerups.js +16 -14
  8. package/esm2015/index.js +2 -2
  9. package/esm2015/lib/angular-ui-powerups.module.js +6 -8
  10. package/esm2015/lib/interaction/components/activity-container/activity-container.component.js +1 -2
  11. package/esm2015/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +1 -2
  12. package/esm2015/lib/place/components/abstract-place-navigation.component.js +75 -0
  13. package/esm2015/lib/place/components/list-place-nav/list-place-nav.component.js +47 -0
  14. package/esm2015/lib/place/components/place-outlet/route-animations.js +12 -5
  15. package/esm2015/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +5 -39
  16. package/esm2015/lib/place/guards/leave-place.guard.js +11 -2
  17. package/esm2015/lib/place/guards/place-route.guard.js +29 -37
  18. package/esm2015/lib/place/index.js +11 -9
  19. package/esm2015/lib/place/nav-item.js +23 -0
  20. package/esm2015/lib/place/place-component-like.js +17 -0
  21. package/esm2015/lib/place/place-component.js +118 -14
  22. package/esm2015/lib/place/place-updates-service.js +16 -0
  23. package/esm2015/lib/place/place.decorator.js +1 -1
  24. package/esm2015/lib/place/place.module.js +6 -3
  25. package/esm2015/lib/place/place.service.js +30 -6
  26. package/esm2015/lib/place/route/default-parameter-sanitiser.js +78 -0
  27. package/esm2015/lib/place/route/parameter-decorators.js +15 -7
  28. package/esm2015/lib/place/route/parameter-definition.class.js +2 -2
  29. package/esm2015/lib/place/route/parameter-sanitiser.js +17 -2
  30. package/esm2015/lib/place/route/parameter-snapshot.js +382 -0
  31. package/esm2015/lib/place/route/parameter-type.js +3 -2
  32. package/esm2015/lib/place/route/route-parameter-sanitiser.js +73 -38
  33. package/esm2015/lib/place/visit.js +22 -0
  34. package/esm2015/public_api.js +2 -2
  35. package/esm5/coolon-angular-ui-powerups.js +16 -14
  36. package/esm5/index.js +2 -2
  37. package/esm5/lib/angular-ui-powerups.module.js +6 -8
  38. package/esm5/lib/interaction/components/activity-container/activity-container.component.js +1 -2
  39. package/esm5/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +1 -2
  40. package/esm5/lib/place/components/abstract-place-navigation.component.js +86 -0
  41. package/esm5/lib/place/components/list-place-nav/list-place-nav.component.js +61 -0
  42. package/esm5/lib/place/components/place-outlet/route-animations.js +12 -5
  43. package/esm5/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +6 -43
  44. package/esm5/lib/place/guards/leave-place.guard.js +11 -2
  45. package/esm5/lib/place/guards/place-route.guard.js +28 -37
  46. package/esm5/lib/place/index.js +11 -9
  47. package/esm5/lib/place/nav-item.js +23 -0
  48. package/esm5/lib/place/place-component-like.js +17 -0
  49. package/esm5/lib/place/place-component.js +132 -15
  50. package/esm5/lib/place/place-updates-service.js +16 -0
  51. package/esm5/lib/place/place.decorator.js +1 -1
  52. package/esm5/lib/place/place.module.js +6 -3
  53. package/esm5/lib/place/place.service.js +35 -6
  54. package/esm5/lib/place/route/default-parameter-sanitiser.js +85 -0
  55. package/esm5/lib/place/route/parameter-decorators.js +15 -7
  56. package/esm5/lib/place/route/parameter-definition.class.js +2 -2
  57. package/esm5/lib/place/route/parameter-sanitiser.js +17 -2
  58. package/esm5/lib/place/route/parameter-snapshot.js +474 -0
  59. package/esm5/lib/place/route/parameter-type.js +3 -2
  60. package/esm5/lib/place/route/route-parameter-sanitiser.js +100 -45
  61. package/esm5/lib/place/visit.js +22 -0
  62. package/esm5/public_api.js +2 -2
  63. package/fesm2015/coolon-angular-ui-powerups.js +1145 -650
  64. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  65. package/fesm5/coolon-angular-ui-powerups.js +1390 -778
  66. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  67. package/lib/place/components/abstract-place-navigation.component.d.ts +13 -0
  68. package/lib/place/components/list-place-nav/list-place-nav.component.d.ts +8 -0
  69. package/lib/place/components/place-outlet/route-animations.d.ts +1 -0
  70. package/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.d.ts +2 -9
  71. package/lib/place/guards/place-route.guard.d.ts +4 -4
  72. package/lib/place/index.d.ts +8 -6
  73. package/lib/place/nav-item.d.ts +5 -0
  74. package/lib/place/{i-place-component.d.ts → place-component-like.d.ts} +1 -1
  75. package/lib/place/place-component.d.ts +19 -8
  76. package/lib/place/place-updates-service.d.ts +10 -0
  77. package/lib/place/place.service.d.ts +11 -8
  78. package/lib/place/route/default-parameter-sanitiser.d.ts +13 -0
  79. package/lib/place/route/parameter-decorators.d.ts +6 -2
  80. package/lib/place/route/parameter-definition.class.d.ts +3 -3
  81. package/lib/place/route/parameter-sanitiser.d.ts +8 -1
  82. package/lib/place/route/parameter-snapshot.d.ts +46 -0
  83. package/lib/place/route/route-parameter-sanitiser.d.ts +13 -9
  84. package/lib/place/visit.d.ts +6 -0
  85. package/package.json +1 -1
  86. package/schematics/place-routes/index.js +8 -95
  87. package/schematics/place-routes/index.js.map +1 -1
  88. package/schematics/place-routes/place-builder.d.ts +19 -0
  89. package/schematics/place-routes/place-builder.js +109 -0
  90. package/schematics/place-routes/place-builder.js.map +1 -0
  91. package/schematics/place-routes/{scanner.d.ts → place-class-scanner.d.ts} +10 -6
  92. package/schematics/place-routes/{scanner.js → place-class-scanner.js} +43 -18
  93. package/schematics/place-routes/place-class-scanner.js.map +1 -0
  94. package/schematics/place-routes/place-def.d.ts +19 -4
  95. package/schematics/place-routes/place-def.js +54 -4
  96. package/schematics/place-routes/place-def.js.map +1 -1
  97. package/schematics/place-routes/templates/{place-routes.ts.template → places.ts.template} +14 -11
  98. package/esm2015/lib/place/i-place-component.js +0 -17
  99. package/esm2015/lib/place/i-place-service.js +0 -16
  100. package/esm2015/lib/place/route/resolved-parameter.js +0 -16
  101. package/esm2015/lib/place/route/resolved-route-parameter-snapshot.js +0 -106
  102. package/esm2015/lib/place/route/route-parameter-bindings.js +0 -150
  103. package/esm2015/lib/place/route/visit-snapshot.js +0 -7
  104. package/esm5/lib/place/i-place-component.js +0 -17
  105. package/esm5/lib/place/i-place-service.js +0 -16
  106. package/esm5/lib/place/route/resolved-parameter.js +0 -16
  107. package/esm5/lib/place/route/resolved-route-parameter-snapshot.js +0 -129
  108. package/esm5/lib/place/route/route-parameter-bindings.js +0 -167
  109. package/esm5/lib/place/route/visit-snapshot.js +0 -11
  110. package/lib/place/i-place-service.d.ts +0 -10
  111. package/lib/place/route/resolved-parameter.d.ts +0 -5
  112. package/lib/place/route/resolved-route-parameter-snapshot.d.ts +0 -12
  113. package/lib/place/route/route-parameter-bindings.d.ts +0 -17
  114. package/lib/place/route/visit-snapshot.d.ts +0 -2
  115. package/schematics/place-routes/scanner.js.map +0 -1
  116. package/schematics/place-routes/templates/place-router.ts.template +0 -33
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common'), require('@angular/core'), require('@angular/forms'), require('@angular/material'), require('@angular/platform-browser'), require('@angular/platform-browser/animations'), require('@coolon/pectin'), require('@angular/cdk/portal'), require('@coolon/pectin/lib/promise/deferred.class'), require('@coolon/typescript-utilities'), require('@angular/material/dialog'), require('@angular/material/icon'), require('@angular/material/list'), require('@angular/material/tabs'), require('@angular/material/tooltip'), require('@angular/router'), require('@typescript-plus/fast-memoize-decorator'), require('lodash'), require('reflect-metadata'), require('@angular/animations'), require('resize-observer-polyfill'), require('@typescript-plus/fast-memoize-decorator/dist/src')) :
3
- typeof define === 'function' && define.amd ? define('@coolon/angular-ui-powerups', ['exports', '@angular/common', '@angular/core', '@angular/forms', '@angular/material', '@angular/platform-browser', '@angular/platform-browser/animations', '@coolon/pectin', '@angular/cdk/portal', '@coolon/pectin/lib/promise/deferred.class', '@coolon/typescript-utilities', '@angular/material/dialog', '@angular/material/icon', '@angular/material/list', '@angular/material/tabs', '@angular/material/tooltip', '@angular/router', '@typescript-plus/fast-memoize-decorator', 'lodash', 'reflect-metadata', '@angular/animations', 'resize-observer-polyfill', '@typescript-plus/fast-memoize-decorator/dist/src'], factory) :
4
- (global = global || self, factory((global.coolon = global.coolon || {}, global.coolon['angular-ui-powerups'] = {}), global.ng.common, global.ng.core, global.ng.forms, global.ng.material, global.ng.platformBrowser, global.ng.platformBrowser.animations, global.pectin, global.ng.cdk.portal, global.deferred_class, global.typescriptUtilities, global.ng.material.dialog, global.ng.material.icon, global.ng.material.list, global.ng.material.tabs, global.ng.material.tooltip, global.ng.router, global.fastMemoizeDecorator, global.lodash, null, global.ng.animations, global.ResizeObserver, global.src));
5
- }(this, function (exports, common, core, forms, material, platformBrowser, animations, pectin, portal, deferred_class, typescriptUtilities, dialog, icon, list, tabs, tooltip, router, fastMemoizeDecorator, lodash, reflectMetadata, animations$1, ResizeObserver, src) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common'), require('@angular/core'), require('@angular/forms'), require('@angular/material'), require('@angular/platform-browser/animations'), require('@coolon/pectin'), require('@angular/cdk/portal'), require('@coolon/pectin/lib/promise/deferred.class'), require('@coolon/typescript-utilities'), require('@angular/material/dialog'), require('@angular/material/icon'), require('@angular/material/list'), require('@angular/material/tabs'), require('@angular/material/tooltip'), require('@angular/router'), require('@typescript-plus/fast-memoize-decorator/dist/src'), require('@typescript-plus/fast-memoize-decorator'), require('lodash'), require('reflect-metadata'), require('@angular/animations'), require('resize-observer-polyfill')) :
3
+ typeof define === 'function' && define.amd ? define('@coolon/angular-ui-powerups', ['exports', '@angular/common', '@angular/core', '@angular/forms', '@angular/material', '@angular/platform-browser/animations', '@coolon/pectin', '@angular/cdk/portal', '@coolon/pectin/lib/promise/deferred.class', '@coolon/typescript-utilities', '@angular/material/dialog', '@angular/material/icon', '@angular/material/list', '@angular/material/tabs', '@angular/material/tooltip', '@angular/router', '@typescript-plus/fast-memoize-decorator/dist/src', '@typescript-plus/fast-memoize-decorator', 'lodash', 'reflect-metadata', '@angular/animations', 'resize-observer-polyfill'], factory) :
4
+ (global = global || self, factory((global.coolon = global.coolon || {}, global.coolon['angular-ui-powerups'] = {}), global.ng.common, global.ng.core, global.ng.forms, global.ng.material, global.ng.platformBrowser.animations, global.pectin, global.ng.cdk.portal, global.deferred_class, global.typescriptUtilities, global.ng.material.dialog, global.ng.material.icon, global.ng.material.list, global.ng.material.tabs, global.ng.material.tooltip, global.ng.router, global.src, global.fastMemoizeDecorator, global.lodash, null, global.ng.animations, global.ResizeObserver));
5
+ }(this, function (exports, common, core, forms, material, animations, pectin, portal, deferred_class, typescriptUtilities, dialog, icon, list, tabs, tooltip, router, src, fastMemoizeDecorator, lodash, reflectMetadata, animations$1, ResizeObserver) { 'use strict';
6
6
 
7
7
  ResizeObserver = ResizeObserver && ResizeObserver.hasOwnProperty('default') ? ResizeObserver['default'] : ResizeObserver;
8
8
 
@@ -479,6 +479,126 @@
479
479
  return NumberInputComponent;
480
480
  }(AbstractInputComponent));
481
481
 
482
+ /**
483
+ * @fileoverview added by tsickle
484
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
485
+ */
486
+ var PasswordInputComponent = /** @class */ (function (_super) {
487
+ __extends(PasswordInputComponent, _super);
488
+ function PasswordInputComponent() {
489
+ return _super.call(this) || this;
490
+ }
491
+ /**
492
+ * @return {?}
493
+ */
494
+ PasswordInputComponent.prototype.ngOnInit = /**
495
+ * @return {?}
496
+ */
497
+ function () {
498
+ };
499
+ PasswordInputComponent.decorators = [
500
+ { type: core.Component, args: [{
501
+ selector: 'angular-ui-powerups-password-input',
502
+ 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]=\"valueModel\"\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",
503
+ styles: [":host{display:block}input,mat-form-field{width:100%}input mat-hint.faux-error,mat-form-field mat-hint.faux-error{color:#f44336}"]
504
+ }] }
505
+ ];
506
+ /** @nocollapse */
507
+ PasswordInputComponent.ctorParameters = function () { return []; };
508
+ return PasswordInputComponent;
509
+ }(AbstractInputComponent));
510
+
511
+ /**
512
+ * @fileoverview added by tsickle
513
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
514
+ */
515
+ /**
516
+ * @template T
517
+ */
518
+ var SelectInputComponent = /** @class */ (function (_super) {
519
+ __extends(SelectInputComponent, _super);
520
+ function SelectInputComponent() {
521
+ var _this = _super.call(this) || this;
522
+ _this.optionLabelFormat = (/**
523
+ * @param {?} option
524
+ * @return {?}
525
+ */
526
+ function (option) { return (option && _this.optionLabel) ? option[_this.optionLabel] : option; });
527
+ return _this;
528
+ }
529
+ /**
530
+ * @return {?}
531
+ */
532
+ SelectInputComponent.prototype.ngOnInit = /**
533
+ * @return {?}
534
+ */
535
+ function () {
536
+ };
537
+ SelectInputComponent.decorators = [
538
+ { type: core.Component, args: [{
539
+ selector: 'angular-ui-powerups-select-input',
540
+ 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]=\"valueModel\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-option *ngFor=\"let option of optionsModel.value\" [value]=\"option\">{{optionLabelFormat(option)}}\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",
541
+ styles: [":host{display:inline-block}mat-form-field{width:100%}"]
542
+ }] }
543
+ ];
544
+ /** @nocollapse */
545
+ SelectInputComponent.ctorParameters = function () { return []; };
546
+ SelectInputComponent.propDecorators = {
547
+ optionsModel: [{ type: core.Input }],
548
+ options: [{ type: core.Input }],
549
+ optionLabel: [{ type: core.Input }],
550
+ optionLabelFormat: [{ type: core.Input }]
551
+ };
552
+ __decorate([
553
+ pectin.UseDelegate(),
554
+ __metadata("design:type", pectin.ListModel)
555
+ ], SelectInputComponent.prototype, "optionsModel", void 0);
556
+ __decorate([
557
+ pectin.StoreInListModel('optionsModel'),
558
+ __metadata("design:type", Array)
559
+ ], SelectInputComponent.prototype, "options", void 0);
560
+ return SelectInputComponent;
561
+ }(AbstractInputComponent));
562
+ if (false) {
563
+ /** @type {?} */
564
+ SelectInputComponent.prototype.optionsModel;
565
+ /** @type {?} */
566
+ SelectInputComponent.prototype.options;
567
+ /** @type {?} */
568
+ SelectInputComponent.prototype.optionLabel;
569
+ /** @type {?} */
570
+ SelectInputComponent.prototype.optionLabelFormat;
571
+ }
572
+
573
+ /**
574
+ * @fileoverview added by tsickle
575
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
576
+ */
577
+ var StringInputComponent = /** @class */ (function (_super) {
578
+ __extends(StringInputComponent, _super);
579
+ function StringInputComponent() {
580
+ return _super.call(this) || this;
581
+ }
582
+ /**
583
+ * @return {?}
584
+ */
585
+ StringInputComponent.prototype.ngOnInit = /**
586
+ * @return {?}
587
+ */
588
+ function () {
589
+ };
590
+ StringInputComponent.decorators = [
591
+ { type: core.Component, args: [{
592
+ selector: 'angular-ui-powerups-string-input',
593
+ 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]=\"valueModel\"\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",
594
+ styles: [":host{display:block}input,mat-form-field{width:100%}input mat-hint.faux-error,mat-form-field mat-hint.faux-error{color:#f44336}"]
595
+ }] }
596
+ ];
597
+ /** @nocollapse */
598
+ StringInputComponent.ctorParameters = function () { return []; };
599
+ return StringInputComponent;
600
+ }(AbstractInputComponent));
601
+
482
602
  /**
483
603
  * @fileoverview added by tsickle
484
604
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
@@ -855,126 +975,6 @@
855
975
  FocusBindingDirective.prototype.ngZone;
856
976
  }
857
977
 
858
- /**
859
- * @fileoverview added by tsickle
860
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
861
- */
862
- var StringInputComponent = /** @class */ (function (_super) {
863
- __extends(StringInputComponent, _super);
864
- function StringInputComponent() {
865
- return _super.call(this) || this;
866
- }
867
- /**
868
- * @return {?}
869
- */
870
- StringInputComponent.prototype.ngOnInit = /**
871
- * @return {?}
872
- */
873
- function () {
874
- };
875
- StringInputComponent.decorators = [
876
- { type: core.Component, args: [{
877
- selector: 'angular-ui-powerups-string-input',
878
- 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]=\"valueModel\"\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",
879
- styles: [":host{display:block}input,mat-form-field{width:100%}input mat-hint.faux-error,mat-form-field mat-hint.faux-error{color:#f44336}"]
880
- }] }
881
- ];
882
- /** @nocollapse */
883
- StringInputComponent.ctorParameters = function () { return []; };
884
- return StringInputComponent;
885
- }(AbstractInputComponent));
886
-
887
- /**
888
- * @fileoverview added by tsickle
889
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
890
- */
891
- var PasswordInputComponent = /** @class */ (function (_super) {
892
- __extends(PasswordInputComponent, _super);
893
- function PasswordInputComponent() {
894
- return _super.call(this) || this;
895
- }
896
- /**
897
- * @return {?}
898
- */
899
- PasswordInputComponent.prototype.ngOnInit = /**
900
- * @return {?}
901
- */
902
- function () {
903
- };
904
- PasswordInputComponent.decorators = [
905
- { type: core.Component, args: [{
906
- selector: 'angular-ui-powerups-password-input',
907
- 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]=\"valueModel\"\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",
908
- styles: [":host{display:block}input,mat-form-field{width:100%}input mat-hint.faux-error,mat-form-field mat-hint.faux-error{color:#f44336}"]
909
- }] }
910
- ];
911
- /** @nocollapse */
912
- PasswordInputComponent.ctorParameters = function () { return []; };
913
- return PasswordInputComponent;
914
- }(AbstractInputComponent));
915
-
916
- /**
917
- * @fileoverview added by tsickle
918
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
919
- */
920
- /**
921
- * @template T
922
- */
923
- var SelectInputComponent = /** @class */ (function (_super) {
924
- __extends(SelectInputComponent, _super);
925
- function SelectInputComponent() {
926
- var _this = _super.call(this) || this;
927
- _this.optionLabelFormat = (/**
928
- * @param {?} option
929
- * @return {?}
930
- */
931
- function (option) { return (option && _this.optionLabel) ? option[_this.optionLabel] : option; });
932
- return _this;
933
- }
934
- /**
935
- * @return {?}
936
- */
937
- SelectInputComponent.prototype.ngOnInit = /**
938
- * @return {?}
939
- */
940
- function () {
941
- };
942
- SelectInputComponent.decorators = [
943
- { type: core.Component, args: [{
944
- selector: 'angular-ui-powerups-select-input',
945
- 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]=\"valueModel\"\n [errorStateMatcher]=\"errorStateMatcher\"\n >\n <mat-option *ngFor=\"let option of optionsModel.value\" [value]=\"option\">{{optionLabelFormat(option)}}\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",
946
- styles: [":host{display:inline-block}mat-form-field{width:100%}"]
947
- }] }
948
- ];
949
- /** @nocollapse */
950
- SelectInputComponent.ctorParameters = function () { return []; };
951
- SelectInputComponent.propDecorators = {
952
- optionsModel: [{ type: core.Input }],
953
- options: [{ type: core.Input }],
954
- optionLabel: [{ type: core.Input }],
955
- optionLabelFormat: [{ type: core.Input }]
956
- };
957
- __decorate([
958
- pectin.UseDelegate(),
959
- __metadata("design:type", pectin.ListModel)
960
- ], SelectInputComponent.prototype, "optionsModel", void 0);
961
- __decorate([
962
- pectin.StoreInListModel('optionsModel'),
963
- __metadata("design:type", Array)
964
- ], SelectInputComponent.prototype, "options", void 0);
965
- return SelectInputComponent;
966
- }(AbstractInputComponent));
967
- if (false) {
968
- /** @type {?} */
969
- SelectInputComponent.prototype.optionsModel;
970
- /** @type {?} */
971
- SelectInputComponent.prototype.options;
972
- /** @type {?} */
973
- SelectInputComponent.prototype.optionLabel;
974
- /** @type {?} */
975
- SelectInputComponent.prototype.optionLabelFormat;
976
- }
977
-
978
978
  /**
979
979
  * @fileoverview added by tsickle
980
980
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
@@ -1048,7 +1048,7 @@
1048
1048
  /**
1049
1049
  * @template D, R, E
1050
1050
  */
1051
- exports.ɵr = /** @class */ (function () {
1051
+ exports.ɵu = /** @class */ (function () {
1052
1052
  function ActivityOutletComponent(componentFactoryResolver, viewContainerRef, injector) {
1053
1053
  this.componentFactoryResolver = componentFactoryResolver;
1054
1054
  this.viewContainerRef = viewContainerRef;
@@ -1170,27 +1170,27 @@
1170
1170
  }());
1171
1171
  if (false) {
1172
1172
  /** @type {?} */
1173
- exports.ɵr.prototype.interactionContext;
1173
+ exports.ɵu.prototype.interactionContext;
1174
1174
  /**
1175
1175
  * @type {?}
1176
1176
  * @private
1177
1177
  */
1178
- exports.ɵr.prototype.activityComponentRef;
1178
+ exports.ɵu.prototype.activityComponentRef;
1179
1179
  /**
1180
1180
  * @type {?}
1181
1181
  * @private
1182
1182
  */
1183
- exports.ɵr.prototype.componentFactoryResolver;
1183
+ exports.ɵu.prototype.componentFactoryResolver;
1184
1184
  /**
1185
1185
  * @type {?}
1186
1186
  * @private
1187
1187
  */
1188
- exports.ɵr.prototype.viewContainerRef;
1188
+ exports.ɵu.prototype.viewContainerRef;
1189
1189
  /**
1190
1190
  * @type {?}
1191
1191
  * @private
1192
1192
  */
1193
- exports.ɵr.prototype.injector;
1193
+ exports.ɵu.prototype.injector;
1194
1194
  /* Skipping unhandled member: ;*/
1195
1195
  }
1196
1196
  (function (ActivityOutletComponent) {
@@ -1251,7 +1251,7 @@
1251
1251
  */
1252
1252
  OutletInteractionContext.prototype.context;
1253
1253
  }
1254
- })(exports.ɵr || (exports.ɵr = {}));
1254
+ })(exports.ɵu || (exports.ɵu = {}));
1255
1255
 
1256
1256
  /**
1257
1257
  * @fileoverview added by tsickle
@@ -1477,7 +1477,6 @@
1477
1477
  var _this = _super.call(this) || this;
1478
1478
  _this.confirm = confirm;
1479
1479
  pectin.assert.notNil(confirm);
1480
- console.log(confirm);
1481
1480
  return _this;
1482
1481
  }
1483
1482
  /**
@@ -1519,7 +1518,7 @@
1519
1518
  * @fileoverview added by tsickle
1520
1519
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1521
1520
  */
1522
- exports.ɵq = /** @class */ (function (_super) {
1521
+ exports.ɵt = /** @class */ (function (_super) {
1523
1522
  __extends(ActivityContainerComponent, _super);
1524
1523
  function ActivityContainerComponent() {
1525
1524
  var _this = _super.call(this) || this;
@@ -1630,7 +1629,6 @@
1630
1629
  */
1631
1630
  function () {
1632
1631
  var _this = this;
1633
- // TODO: notify selected tab they are ready. activty.afterAnimationComplete
1634
1632
  this.activityTabs.value = this.activityTabs.value.filter((/**
1635
1633
  * @param {?} tab
1636
1634
  * @return {?}
@@ -1653,31 +1651,31 @@
1653
1651
  parentInteractionContext: [{ type: core.Input }],
1654
1652
  initialActivity: [{ type: core.Input }],
1655
1653
  tabs: [{ type: core.ViewChild, args: ['tabs', { static: true },] }],
1656
- outlets: [{ type: core.ViewChildren, args: [exports.ɵr,] }]
1654
+ outlets: [{ type: core.ViewChildren, args: [exports.ɵu,] }]
1657
1655
  };
1658
1656
  return ActivityContainerComponent;
1659
1657
  }(DisposableComponent));
1660
1658
  if (false) {
1661
1659
  /** @type {?} */
1662
- exports.ɵq.prototype.parentInteractionContext;
1660
+ exports.ɵt.prototype.parentInteractionContext;
1663
1661
  /** @type {?} */
1664
- exports.ɵq.prototype.initialActivity;
1662
+ exports.ɵt.prototype.initialActivity;
1665
1663
  /** @type {?} */
1666
- exports.ɵq.prototype.tabs;
1664
+ exports.ɵt.prototype.tabs;
1667
1665
  /** @type {?} */
1668
- exports.ɵq.prototype.outlets;
1666
+ exports.ɵt.prototype.outlets;
1669
1667
  /** @type {?} */
1670
- exports.ɵq.prototype.activityTabs;
1668
+ exports.ɵt.prototype.activityTabs;
1671
1669
  /**
1672
1670
  * @type {?}
1673
1671
  * @private
1674
1672
  */
1675
- exports.ɵq.prototype.obsoleteTabs;
1673
+ exports.ɵt.prototype.obsoleteTabs;
1676
1674
  /**
1677
1675
  * @type {?}
1678
1676
  * @private
1679
1677
  */
1680
- exports.ɵq.prototype.lastActivityTab;
1678
+ exports.ɵt.prototype.lastActivityTab;
1681
1679
  }
1682
1680
  (function (ActivityContainerComponent) {
1683
1681
  /**
@@ -1696,7 +1694,7 @@
1696
1694
  /** @type {?} */
1697
1695
  ActivityContext.prototype.onCancel;
1698
1696
  }
1699
- })(exports.ɵq || (exports.ɵq = {}));
1697
+ })(exports.ɵt || (exports.ɵt = {}));
1700
1698
 
1701
1699
  /**
1702
1700
  * @fileoverview added by tsickle
@@ -1752,7 +1750,7 @@
1752
1750
  autoFocus: false
1753
1751
  };
1754
1752
  /** @type {?} */
1755
- var matDialogRef = (/** @type {?} */ (this.dialogService.open(exports.ɵq, config)));
1753
+ var matDialogRef = (/** @type {?} */ (this.dialogService.open(exports.ɵt, config)));
1756
1754
  return new Promise((/**
1757
1755
  * @param {?} resolve
1758
1756
  * @param {?} reject
@@ -1844,13 +1842,13 @@
1844
1842
  portal.PortalModule
1845
1843
  ],
1846
1844
  declarations: [
1847
- exports.ɵq,
1845
+ exports.ɵt,
1848
1846
  ConfirmationDialogComponent,
1849
1847
  AlertDialogComponent,
1850
- exports.ɵr
1848
+ exports.ɵu
1851
1849
  ],
1852
1850
  entryComponents: [
1853
- exports.ɵq,
1851
+ exports.ɵt,
1854
1852
  ConfirmationDialogComponent,
1855
1853
  AlertDialogComponent
1856
1854
  ],
@@ -1938,88 +1936,175 @@
1938
1936
  * @fileoverview added by tsickle
1939
1937
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1940
1938
  */
1941
- var ResolvedRouteParameterSnapshot = /** @class */ (function () {
1942
- function ResolvedRouteParameterSnapshot(parameters) {
1943
- this.parameters = parameters;
1939
+ // TODO: there are really two types of snapshot, ones with id's and ones without.
1940
+ // Id snapshot are repesented by 2 url segments
1941
+ // ID => [{'/basePath', params}, {'id', params}]
1942
+ // NO ID => [{'/basePath', params}]
1943
+ exports.ParameterSnapshot = /** @class */ (function () {
1944
+ function ParameterSnapshot(placeDefinition, resolved) {
1945
+ this.placeDefinition = placeDefinition;
1946
+ this.resolved = resolved;
1944
1947
  }
1945
1948
  /**
1946
- * @template T
1947
- * @param {?} parameter
1949
+ * @param {?} other
1948
1950
  * @return {?}
1949
1951
  */
1950
- ResolvedRouteParameterSnapshot.prototype.get = /**
1951
- * @template T
1952
- * @param {?} parameter
1952
+ ParameterSnapshot.prototype.hasChanged = /**
1953
+ * @param {?} other
1953
1954
  * @return {?}
1954
1955
  */
1955
- function (parameter) {
1956
+ function (other) {
1956
1957
  /** @type {?} */
1957
- var resolved = this.parameters.find((/**
1958
- * @param {?} p
1958
+ var changed = this.resolved.find((/**
1959
+ * @param {?} r
1959
1960
  * @return {?}
1960
1961
  */
1961
- function (p) { return p.parameterDef === parameter; }));
1962
- return resolved ? resolved.resolvedValue : null;
1962
+ function (r) {
1963
+ return !r.isSame(other.getResolvedParameterValue(r.parameterDef));
1964
+ }));
1965
+ if (changed) {
1966
+ console.log({ mine: changed, theirs: other.getResolvedParameter(changed.parameterDef) });
1967
+ }
1968
+ return !!changed;
1963
1969
  };
1964
1970
  /**
1965
- * @template T
1966
- * @param {?} parameter
1967
- * @param {?} value
1971
+ * @param {?} other
1968
1972
  * @return {?}
1969
1973
  */
1970
- ResolvedRouteParameterSnapshot.prototype.replace = /**
1971
- * @template T
1972
- * @param {?} parameter
1973
- * @param {?} value
1974
+ ParameterSnapshot.prototype.asUrlSegment = /**
1975
+ * @param {?} other
1974
1976
  * @return {?}
1975
1977
  */
1976
- function (parameter, value) {
1977
- return new ResolvedRouteParameterSnapshot(this.parameters.filter((/**
1978
- * @param {?} p
1979
- * @return {?}
1978
+ function (other) {
1979
+ pectin.assert.isTruthy(this.hasChanged(other));
1980
+ /** @type {?} */
1981
+ var routeParts = [];
1982
+ /** @type {?} */
1983
+ var gainedId = this.getFormattedRouteId() && !other.getFormattedRouteId();
1984
+ /** @type {?} */
1985
+ var sameId = this.getFormattedRouteId() === other.getFormattedRouteId();
1986
+ /** @type {?} */
1987
+ var lostId = (!this.getFormattedRouteId() && other.getFormattedRouteId());
1988
+ /** @type {?} */
1989
+ var changedId = (this.getFormattedRouteId() !== other.getFormattedRouteId());
1990
+ if (lostId || changedId) {
1991
+ routeParts.push('..');
1992
+ if (changedId) {
1993
+ routeParts.push(this.getFormattedRouteId());
1994
+ }
1995
+ }
1996
+ else {
1997
+ routeParts.push('.');
1998
+ }
1999
+ routeParts.push(this.getFormattedParameters());
2000
+ return routeParts;
2001
+ };
2002
+ /**
2003
+ * @template T, S
2004
+ * @param {?} parameterDef
2005
+ * @return {?}
2006
+ */
2007
+ ParameterSnapshot.prototype.getResolvedParameter = /**
2008
+ * @template T, S
2009
+ * @param {?} parameterDef
2010
+ * @return {?}
2011
+ */
2012
+ function (parameterDef) {
2013
+ return this.resolved.find((/**
2014
+ * @param {?} r
2015
+ * @return {?}
1980
2016
  */
1981
- function (p) { return p.parameterDef !== parameter; })).concat({
1982
- parameterDef: parameter,
1983
- resolvedValue: value
1984
- }));
2017
+ function (r) { return r.parameterDef === parameterDef; }));
2018
+ };
2019
+ /**
2020
+ * @template T, S
2021
+ * @param {?} parameterDef
2022
+ * @return {?}
2023
+ */
2024
+ ParameterSnapshot.prototype.getResolvedParameterValue = /**
2025
+ * @template T, S
2026
+ * @param {?} parameterDef
2027
+ * @return {?}
2028
+ */
2029
+ function (parameterDef) {
2030
+ /** @type {?} */
2031
+ var resolvedParameter = this.getResolvedParameter(parameterDef);
2032
+ return resolvedParameter ? resolvedParameter.value : null;
1985
2033
  };
1986
2034
  /**
1987
2035
  * @return {?}
1988
2036
  */
1989
- ResolvedRouteParameterSnapshot.prototype.getFormattedRouteId = /**
2037
+ ParameterSnapshot.prototype.getRouteId = /**
1990
2038
  * @return {?}
1991
2039
  */
1992
2040
  function () {
2041
+ return this.getResolvedRouteId() ? this.getResolvedRouteId().value : null;
2042
+ };
2043
+ /**
2044
+ * @param {?} name
2045
+ * @return {?}
2046
+ */
2047
+ ParameterSnapshot.prototype.getRouteParameter = /**
2048
+ * @param {?} name
2049
+ * @return {?}
2050
+ */
2051
+ function (name) {
1993
2052
  /** @type {?} */
1994
- var routeIdParam = this.getRouteIdParam();
1995
- return routeIdParam ? routeIdParam.parameterDef.type.format(routeIdParam.resolvedValue) : null;
2053
+ var resolvedParameter = this.resolved.find((/**
2054
+ * @param {?} r
2055
+ * @return {?}
2056
+ */
2057
+ function (r) { return r.parameterDef.name === name; }));
2058
+ return resolvedParameter ? resolvedParameter.value : null;
1996
2059
  };
1997
2060
  /**
1998
2061
  * @private
1999
2062
  * @return {?}
2000
2063
  */
2001
- ResolvedRouteParameterSnapshot.prototype.getRouteIdParam = /**
2064
+ ParameterSnapshot.prototype.getResolvedRouteId = /**
2002
2065
  * @private
2003
2066
  * @return {?}
2004
2067
  */
2005
2068
  function () {
2006
- return this.parameters.find((/**
2069
+ // RouteId's are never arrays: see parameter-decorators.ts createDefinition methods. It would be nice to
2070
+ // capture this in the type system though
2071
+ return (/** @type {?} */ (this.resolved.find((/**
2007
2072
  * @param {?} p
2008
2073
  * @return {?}
2009
2074
  */
2010
- function (p) { return p.parameterDef.isRouteId; }));
2075
+ function (p) { return p.parameterDef.isRouteId; }))));
2076
+ };
2077
+ /**
2078
+ * @return {?}
2079
+ */
2080
+ ParameterSnapshot.prototype.hasRouteId = /**
2081
+ * @return {?}
2082
+ */
2083
+ function () {
2084
+ return !!this.getResolvedRouteId();
2085
+ };
2086
+ /**
2087
+ * @return {?}
2088
+ */
2089
+ ParameterSnapshot.prototype.getFormattedRouteId = /**
2090
+ * @return {?}
2091
+ */
2092
+ function () {
2093
+ /** @type {?} */
2094
+ var routeIdParam = this.getResolvedRouteId();
2095
+ return routeIdParam ? routeIdParam.formattedValue() : null;
2011
2096
  };
2012
2097
  /**
2013
2098
  * @return {?}
2014
2099
  */
2015
- ResolvedRouteParameterSnapshot.prototype.getFormattedParameters = /**
2100
+ ParameterSnapshot.prototype.getFormattedParameters = /**
2016
2101
  * @return {?}
2017
2102
  */
2018
2103
  function () {
2019
2104
  /** @type {?} */
2020
2105
  var params = {};
2021
2106
  /** @type {?} */
2022
- var routeIdParam = this.parameters.filter((/**
2107
+ var routeIdParam = this.resolved.filter((/**
2023
2108
  * @param {?} p
2024
2109
  * @return {?}
2025
2110
  */
@@ -2028,91 +2113,325 @@
2028
2113
  * @return {?}
2029
2114
  */
2030
2115
  function (p) {
2031
- params[p.parameterDef.name] = p.parameterDef.type.format(p.resolvedValue);
2116
+ params[p.parameterDef.name] = p.formattedValue();
2032
2117
  }));
2033
2118
  return params;
2034
2119
  };
2035
2120
  /**
2121
+ * @template T, S
2122
+ * @param {?} parameter
2123
+ * @param {?} value
2036
2124
  * @return {?}
2037
2125
  */
2038
- ResolvedRouteParameterSnapshot.prototype.hasRouteId = /**
2126
+ ParameterSnapshot.prototype.replace = /**
2127
+ * @template T, S
2128
+ * @param {?} parameter
2129
+ * @param {?} value
2039
2130
  * @return {?}
2040
2131
  */
2041
- function () {
2042
- return !!this.getRouteIdParam();
2132
+ function (parameter, value) {
2133
+ return new ParameterSnapshot(this.placeDefinition, this.resolved.map((/**
2134
+ * @param {?} p
2135
+ * @return {?}
2136
+ */
2137
+ function (p) {
2138
+ return p.parameterDef === parameter ? p.replace(value) : p;
2139
+ })));
2140
+ };
2141
+ /**
2142
+ * @param {?} url
2143
+ * @return {?}
2144
+ */
2145
+ ParameterSnapshot.prototype.updateUrl = /**
2146
+ * @param {?} url
2147
+ * @return {?}
2148
+ */
2149
+ function (url) {
2150
+ return url;
2043
2151
  };
2152
+ var _a;
2044
2153
  __decorate([
2045
- pectin.Trace(),
2154
+ src.Memoize(),
2046
2155
  __metadata("design:type", Function),
2047
- __metadata("design:paramtypes", []),
2048
- __metadata("design:returntype", void 0)
2049
- ], ResolvedRouteParameterSnapshot.prototype, "getFormattedRouteId", null);
2156
+ __metadata("design:paramtypes", [Object]),
2157
+ __metadata("design:returntype", ParameterSnapshot.ResolvedParameter)
2158
+ ], ParameterSnapshot.prototype, "getResolvedParameter", null);
2050
2159
  __decorate([
2051
- pectin.Trace(),
2160
+ src.Memoize(),
2161
+ __metadata("design:type", Function),
2162
+ __metadata("design:paramtypes", [Object]),
2163
+ __metadata("design:returntype", typeof (_a = typeof S !== "undefined" && S) === "function" ? _a : Object)
2164
+ ], ParameterSnapshot.prototype, "getResolvedParameterValue", null);
2165
+ __decorate([
2166
+ src.Memoize(),
2167
+ __metadata("design:type", Function),
2168
+ __metadata("design:paramtypes", [String]),
2169
+ __metadata("design:returntype", Object)
2170
+ ], ParameterSnapshot.prototype, "getRouteParameter", null);
2171
+ __decorate([
2172
+ src.Memoize(),
2052
2173
  __metadata("design:type", Function),
2053
2174
  __metadata("design:paramtypes", []),
2054
- __metadata("design:returntype", void 0)
2055
- ], ResolvedRouteParameterSnapshot.prototype, "getFormattedParameters", null);
2056
- return ResolvedRouteParameterSnapshot;
2175
+ __metadata("design:returntype", ParameterSnapshot.ResolvedValueParameter)
2176
+ ], ParameterSnapshot.prototype, "getResolvedRouteId", null);
2177
+ return ParameterSnapshot;
2057
2178
  }());
2058
2179
  if (false) {
2059
2180
  /** @type {?} */
2060
- ResolvedRouteParameterSnapshot.prototype.parameters;
2181
+ exports.ParameterSnapshot.prototype.placeDefinition;
2182
+ /**
2183
+ * @type {?}
2184
+ * @private
2185
+ */
2186
+ exports.ParameterSnapshot.prototype.resolved;
2061
2187
  }
2188
+ (function (ParameterSnapshot) {
2189
+ /**
2190
+ * @param {?} placeDef
2191
+ * @param {?} paramMap
2192
+ * @return {?}
2193
+ */
2194
+ function create(placeDef, paramMap) {
2195
+ /** @type {?} */
2196
+ var resolvedParameters = placeDef.getRouteParameters()
2197
+ .map((/**
2198
+ * @param {?} def
2199
+ * @return {?}
2200
+ */
2201
+ function (def) {
2202
+ if (def.isArray) {
2203
+ /** @type {?} */
2204
+ var value = paramMap.has(def.name) ? paramMap.getAll(def.name).map((/**
2205
+ * @param {?} raw
2206
+ * @return {?}
2207
+ */
2208
+ function (raw) { return def.type.parse(raw); })) : null;
2209
+ return new ResolvedArrayParameter(def, value);
2210
+ }
2211
+ else {
2212
+ /** @type {?} */
2213
+ var value = paramMap.has(def.name) ? def.type.parse(paramMap.get(def.name)) : null;
2214
+ return new ResolvedValueParameter(def, value);
2215
+ }
2216
+ }));
2217
+ return new ParameterSnapshot(placeDef, resolvedParameters);
2218
+ }
2219
+ ParameterSnapshot.create = create;
2220
+ /**
2221
+ * @abstract
2222
+ * @template T, S
2223
+ */
2224
+ var /**
2225
+ * @abstract
2226
+ * @template T, S
2227
+ */
2228
+ ResolvedParameter = /** @class */ (function () {
2229
+ function ResolvedParameter(parameterDef, value) {
2230
+ this.parameterDef = parameterDef;
2231
+ this.value = value;
2232
+ }
2233
+ /**
2234
+ * @return {?}
2235
+ */
2236
+ ResolvedParameter.prototype.isRouteId = /**
2237
+ * @return {?}
2238
+ */
2239
+ function () {
2240
+ return this.parameterDef.isRouteId;
2241
+ };
2242
+ return ResolvedParameter;
2243
+ }());
2244
+ ParameterSnapshot.ResolvedParameter = ResolvedParameter;
2245
+ if (false) {
2246
+ /** @type {?} */
2247
+ ResolvedParameter.prototype.parameterDef;
2248
+ /** @type {?} */
2249
+ ResolvedParameter.prototype.value;
2250
+ /**
2251
+ * @abstract
2252
+ * @param {?} dest
2253
+ * @return {?}
2254
+ */
2255
+ ResolvedParameter.prototype.injectRouteParam = function (dest) { };
2256
+ /**
2257
+ * @abstract
2258
+ * @param {?} otherValue
2259
+ * @return {?}
2260
+ */
2261
+ ResolvedParameter.prototype.isSame = function (otherValue) { };
2262
+ /**
2263
+ * @abstract
2264
+ * @return {?}
2265
+ */
2266
+ ResolvedParameter.prototype.formattedValue = function () { };
2267
+ /**
2268
+ * @abstract
2269
+ * @param {?} value
2270
+ * @return {?}
2271
+ */
2272
+ ResolvedParameter.prototype.replace = function (value) { };
2273
+ }
2274
+ /**
2275
+ * @template T
2276
+ */
2277
+ var ResolvedValueParameter = /** @class */ (function (_super) {
2278
+ __extends(ResolvedValueParameter, _super);
2279
+ function ResolvedValueParameter() {
2280
+ return _super !== null && _super.apply(this, arguments) || this;
2281
+ }
2282
+ /**
2283
+ * @param {?} otherValue
2284
+ * @return {?}
2285
+ */
2286
+ ResolvedValueParameter.prototype.isSame = /**
2287
+ * @param {?} otherValue
2288
+ * @return {?}
2289
+ */
2290
+ function (otherValue) {
2291
+ return this.value === otherValue;
2292
+ };
2293
+ /**
2294
+ * @param {?} dest
2295
+ * @return {?}
2296
+ */
2297
+ ResolvedValueParameter.prototype.injectRouteParam = /**
2298
+ * @param {?} dest
2299
+ * @return {?}
2300
+ */
2301
+ function (dest) {
2302
+ dest[this.parameterDef.name] = this.parameterDef.type.format(this.value);
2303
+ };
2304
+ /**
2305
+ * @param {?} value
2306
+ * @return {?}
2307
+ */
2308
+ ResolvedValueParameter.prototype.replace = /**
2309
+ * @param {?} value
2310
+ * @return {?}
2311
+ */
2312
+ function (value) {
2313
+ return new ResolvedValueParameter(this.parameterDef, value);
2314
+ };
2315
+ /**
2316
+ * @return {?}
2317
+ */
2318
+ ResolvedValueParameter.prototype.formattedValue = /**
2319
+ * @return {?}
2320
+ */
2321
+ function () {
2322
+ return !lodash.isNil(this.value) ? this.parameterDef.type.format(this.value) : null;
2323
+ };
2324
+ __decorate([
2325
+ pectin.Trace(),
2326
+ __metadata("design:type", Function),
2327
+ __metadata("design:paramtypes", [Object]),
2328
+ __metadata("design:returntype", Boolean)
2329
+ ], ResolvedValueParameter.prototype, "isSame", null);
2330
+ return ResolvedValueParameter;
2331
+ }(ResolvedParameter));
2332
+ ParameterSnapshot.ResolvedValueParameter = ResolvedValueParameter;
2333
+ /**
2334
+ * @template T
2335
+ */
2336
+ var ResolvedArrayParameter = /** @class */ (function (_super) {
2337
+ __extends(ResolvedArrayParameter, _super);
2338
+ function ResolvedArrayParameter() {
2339
+ return _super !== null && _super.apply(this, arguments) || this;
2340
+ }
2341
+ /**
2342
+ * @param {?} otherValue
2343
+ * @return {?}
2344
+ */
2345
+ ResolvedArrayParameter.prototype.isSame = /**
2346
+ * @param {?} otherValue
2347
+ * @return {?}
2348
+ */
2349
+ function (otherValue) {
2350
+ return lodash.isEqual(this.value, otherValue);
2351
+ };
2352
+ /**
2353
+ * @param {?} dest
2354
+ * @return {?}
2355
+ */
2356
+ ResolvedArrayParameter.prototype.injectRouteParam = /**
2357
+ * @param {?} dest
2358
+ * @return {?}
2359
+ */
2360
+ function (dest) {
2361
+ var _this = this;
2362
+ dest[this.parameterDef.name] = this.value.map((/**
2363
+ * @param {?} v
2364
+ * @return {?}
2365
+ */
2366
+ function (v) { return _this.parameterDef.type.format(v); }));
2367
+ };
2368
+ /**
2369
+ * @param {?} value
2370
+ * @return {?}
2371
+ */
2372
+ ResolvedArrayParameter.prototype.replace = /**
2373
+ * @param {?} value
2374
+ * @return {?}
2375
+ */
2376
+ function (value) {
2377
+ return new ResolvedArrayParameter(this.parameterDef, value);
2378
+ };
2379
+ /**
2380
+ * @return {?}
2381
+ */
2382
+ ResolvedArrayParameter.prototype.formattedValue = /**
2383
+ * @return {?}
2384
+ */
2385
+ function () {
2386
+ var _this = this;
2387
+ return this.value ? this.value.map((/**
2388
+ * @param {?} v
2389
+ * @return {?}
2390
+ */
2391
+ function (v) { return _this.parameterDef.type.format(v); })) : [];
2392
+ };
2393
+ __decorate([
2394
+ pectin.Trace(),
2395
+ __metadata("design:type", Function),
2396
+ __metadata("design:paramtypes", [Array]),
2397
+ __metadata("design:returntype", Boolean)
2398
+ ], ResolvedArrayParameter.prototype, "isSame", null);
2399
+ return ResolvedArrayParameter;
2400
+ }(ResolvedParameter));
2401
+ ParameterSnapshot.ResolvedArrayParameter = ResolvedArrayParameter;
2402
+ })(exports.ParameterSnapshot || (exports.ParameterSnapshot = {}));
2062
2403
 
2063
2404
  /**
2064
2405
  * @fileoverview added by tsickle
2065
2406
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2066
2407
  */
2067
- exports.RouteParameterBindings = /** @class */ (function (_super) {
2068
- __extends(RouteParameterBindings, _super);
2069
- function RouteParameterBindings(component, placeService) {
2408
+ // RAKE: making this Symbol(...) broke things.
2409
+ /** @type {?} */
2410
+ var DEFINITION_META_DATA_KEY = 'PLACE_DEFINITION_OPTIONS';
2411
+ // this one seems ok.
2412
+ /** @type {?} */
2413
+ var ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');
2414
+ exports.PlaceComponent = /** @class */ (function (_super) {
2415
+ __extends(PlaceComponent, _super);
2416
+ function PlaceComponent(activatedRoute, placeService) {
2070
2417
  var _this = _super.call(this) || this;
2071
- _this.component = component;
2418
+ _this.activatedRoute = activatedRoute;
2072
2419
  _this._incomingRouteChange = new pectin.MutableValueModel(false);
2073
2420
  _this.resolvedParameters = new pectin.MutableValueModel();
2074
- var _a = pectin.Dsl.disposeWith(_this), chain = _a.chain, valueOf = _a.valueOf, before = _a.before, when = _a.when, after = _a.after, observe = _a.observe;
2075
- _this.txo = new pectin.TransactionObserver(); //.onEvent(e => console.log(e.toString()));
2076
- //.onEvent(e => console.log(e.toString()));
2077
- /** @type {?} */
2078
- var routeParameterDefs = typescriptUtilities.Klass.get(component).getMetadataList(RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY);
2079
- routeParameterDefs.forEach((/**
2080
- * @param {?} parameter
2421
+ var _a = pectin.Dsl.disposeWith(_this), chain = _a.chain, valueOf = _a.valueOf, before = _a.before, when = _a.when, after = _a.after, observe = _a.observe, switchOn = _a.switchOn;
2422
+ _this.placeDefinition.getRouteParameters().forEach((/**
2423
+ * @param {?} p
2081
2424
  * @return {?}
2082
2425
  */
2083
- function (parameter) { return _this.installBinding(parameter); }));
2084
- /** @type {?} */
2085
- var incomingResolvedRouteParameters = observe.valuesFrom(component.activatedRoute.paramMap)
2426
+ function (p) { return _this.installBinding(p); }));
2427
+ observe.valuesFrom(activatedRoute.paramMap)
2086
2428
  .last()
2087
2429
  .map((/**
2088
2430
  * @param {?} params
2089
2431
  * @return {?}
2090
2432
  */
2091
- function (params) {
2092
- /** @type {?} */
2093
- var result = [];
2094
- routeParameterDefs.forEach((/**
2095
- * @param {?} parameterDef
2096
- * @return {?}
2097
- */
2098
- function (parameterDef) {
2099
- /** @type {?} */
2100
- var resolvedValue;
2101
- if (parameterDef.isArray) {
2102
- resolvedValue = params.getAll(parameterDef.name).map((/**
2103
- * @param {?} v
2104
- * @return {?}
2105
- */
2106
- function (v) { return parameterDef.type.parse(v); }));
2107
- }
2108
- else {
2109
- resolvedValue = parameterDef.type.parse(params.get(parameterDef.name));
2110
- }
2111
- result.push({ parameterDef: parameterDef, resolvedValue: resolvedValue });
2112
- }));
2113
- return new ResolvedRouteParameterSnapshot(result);
2114
- }));
2115
- incomingResolvedRouteParameters.subscribe((/**
2433
+ function (params) { return exports.ParameterSnapshot.create(_this.placeDefinition, params); }))
2434
+ .subscribe((/**
2116
2435
  * @param {?} resolvedParameters
2117
2436
  * @return {?}
2118
2437
  */
@@ -2128,17 +2447,15 @@
2128
2447
  */
2129
2448
  function (params, previous) {
2130
2449
  placeService.notifyRouteParametersChanged({
2131
- placeComponent: component,
2450
+ activatedRoute: _this.activatedRoute,
2132
2451
  next: params,
2133
2452
  previous: previous,
2134
2453
  updateRoute: !_this.incomingRouteChange.value // we update the route if it's a component triggered change.
2135
2454
  });
2136
2455
  }));
2137
- _this.txo.observe('incomingResolvedRouteParameters', incomingResolvedRouteParameters);
2138
- _this.txo.observe('this.routeIsChanging', _this.incomingRouteChange);
2139
2456
  return _this;
2140
2457
  }
2141
- Object.defineProperty(RouteParameterBindings.prototype, "incomingRouteChange", {
2458
+ Object.defineProperty(PlaceComponent.prototype, "incomingRouteChange", {
2142
2459
  get: /**
2143
2460
  * @return {?}
2144
2461
  */
@@ -2149,28 +2466,28 @@
2149
2466
  configurable: true
2150
2467
  });
2151
2468
  /**
2152
- * @protected
2153
- * @template T
2154
- * @param {?} parameter
2469
+ * @private
2470
+ * @template T, S
2471
+ * @param {?} parameterDef
2155
2472
  * @return {?}
2156
2473
  */
2157
- RouteParameterBindings.prototype.installBinding = /**
2158
- * @protected
2159
- * @template T
2160
- * @param {?} parameter
2474
+ PlaceComponent.prototype.installBinding = /**
2475
+ * @private
2476
+ * @template T, S
2477
+ * @param {?} parameterDef
2161
2478
  * @return {?}
2162
2479
  */
2163
- function (parameter) {
2480
+ function (parameterDef) {
2164
2481
  /** @type {?} */
2165
- var model = this.getModelFor(parameter);
2166
- // this.txo.observe(parameter.propertyName, model);
2482
+ var model = (/** @type {?} */ (this[parameterDef.propertyName]));
2483
+ // this.txo.observe(parameterDef.propertyName, model);
2167
2484
  this.registerDisposable(new pectin.Binding(this.resolvedParameters, model, {
2168
2485
  toRight: /**
2169
2486
  * @param {?} parameters
2170
2487
  * @return {?}
2171
2488
  */
2172
2489
  function (parameters) {
2173
- return parameters.get(parameter);
2490
+ return parameters.getResolvedParameterValue(parameterDef);
2174
2491
  },
2175
2492
  toLeft: /**
2176
2493
  * @param {?} value
@@ -2178,66 +2495,11 @@
2178
2495
  * @return {?}
2179
2496
  */
2180
2497
  function (value, currentParameters) {
2181
- return currentParameters.replace(parameter, value);
2498
+ return currentParameters.replace(parameterDef, value);
2182
2499
  }
2183
2500
  }));
2184
2501
  };
2185
- /**
2186
- * @private
2187
- * @template T
2188
- * @param {?} parameter
2189
- * @return {?}
2190
- */
2191
- RouteParameterBindings.prototype.getModelFor = /**
2192
- * @private
2193
- * @template T
2194
- * @param {?} parameter
2195
- * @return {?}
2196
- */
2197
- function (parameter) {
2198
- return this.component[parameter.propertyName];
2199
- };
2200
- return RouteParameterBindings;
2201
- }(pectin.GarbageCollector));
2202
- if (false) {
2203
- /** @type {?} */
2204
- exports.RouteParameterBindings.prototype._incomingRouteChange;
2205
- /**
2206
- * @type {?}
2207
- * @private
2208
- */
2209
- exports.RouteParameterBindings.prototype.txo;
2210
- /**
2211
- * @type {?}
2212
- * @private
2213
- */
2214
- exports.RouteParameterBindings.prototype.resolvedParameters;
2215
- /**
2216
- * @type {?}
2217
- * @private
2218
- */
2219
- exports.RouteParameterBindings.prototype.component;
2220
- }
2221
- (function (RouteParameterBindings) {
2222
- RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');
2223
- })(exports.RouteParameterBindings || (exports.RouteParameterBindings = {}));
2224
-
2225
- /**
2226
- * @fileoverview added by tsickle
2227
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2228
- */
2229
- // RAKE: making this Symbol(...) broke things.
2230
- /** @type {?} */
2231
- var DEFINITION_META_DATA_KEY = 'PLACE_DEFINITION_OPTIONS';
2232
- exports.PlaceComponent = /** @class */ (function (_super) {
2233
- __extends(PlaceComponent, _super);
2234
- function PlaceComponent(activatedRoute, placeService) {
2235
- var _this = _super.call(this) || this;
2236
- _this.activatedRoute = activatedRoute;
2237
- _this.routeBindingMediator = _this.registerDisposable(new exports.RouteParameterBindings(_this, placeService));
2238
- return _this;
2239
- }
2240
- Object.defineProperty(PlaceComponent.prototype, "placeConfig", {
2502
+ Object.defineProperty(PlaceComponent.prototype, "placeDefinition", {
2241
2503
  get: /**
2242
2504
  * @return {?}
2243
2505
  */
@@ -2268,7 +2530,7 @@
2268
2530
  fastMemoizeDecorator.Memoize(),
2269
2531
  __metadata("design:type", PlaceComponent.Definition),
2270
2532
  __metadata("design:paramtypes", [])
2271
- ], PlaceComponent.prototype, "placeConfig", null);
2533
+ ], PlaceComponent.prototype, "placeDefinition", null);
2272
2534
  __decorate([
2273
2535
  pectin.Trace(),
2274
2536
  __metadata("design:type", Function),
@@ -2278,11 +2540,13 @@
2278
2540
  return PlaceComponent;
2279
2541
  }(DisposableComponent));
2280
2542
  if (false) {
2543
+ /** @type {?} */
2544
+ exports.PlaceComponent.prototype._incomingRouteChange;
2281
2545
  /**
2282
2546
  * @type {?}
2283
2547
  * @private
2284
2548
  */
2285
- exports.PlaceComponent.prototype.routeBindingMediator;
2549
+ exports.PlaceComponent.prototype.resolvedParameters;
2286
2550
  /** @type {?} */
2287
2551
  exports.PlaceComponent.prototype.activatedRoute;
2288
2552
  }
@@ -2295,17 +2559,31 @@
2295
2559
  this.order = options.order;
2296
2560
  this.data = options.data;
2297
2561
  this.authenticate = lodash.isNil(options.authenticate) || options.authenticate;
2562
+ this.children = (options.children || []).map((/**
2563
+ * @param {?} c
2564
+ * @return {?}
2565
+ */
2566
+ function (c) { return PlaceComponent.getDefinition(c).component; }));
2298
2567
  }
2299
2568
  /**
2300
- * @param {?} construcable
2569
+ * @return {?}
2570
+ */
2571
+ Definition.prototype.getRouteParameters = /**
2572
+ * @return {?}
2573
+ */
2574
+ function () {
2575
+ return typescriptUtilities.Klass.get(this.component).getMetadataList(ROUTE_PARAMETER_LIST_KEY);
2576
+ };
2577
+ /**
2578
+ * @param {?} constructable
2301
2579
  * @return {?}
2302
2580
  */
2303
2581
  Definition.prototype.isDescriptorForType = /**
2304
- * @param {?} construcable
2582
+ * @param {?} constructable
2305
2583
  * @return {?}
2306
2584
  */
2307
- function (construcable) {
2308
- return pectin.lang.constructorChain(construcable).includes(PlaceComponent);
2585
+ function (constructable) {
2586
+ return pectin.lang.constructorChain(constructable).includes(PlaceComponent);
2309
2587
  };
2310
2588
  /**
2311
2589
  * @param {?} placeComponent
@@ -2362,6 +2640,12 @@
2362
2640
  return defaultValue;
2363
2641
  }
2364
2642
  };
2643
+ __decorate([
2644
+ fastMemoizeDecorator.Memoize(),
2645
+ __metadata("design:type", Function),
2646
+ __metadata("design:paramtypes", []),
2647
+ __metadata("design:returntype", Array)
2648
+ ], Definition.prototype, "getRouteParameters", null);
2365
2649
  return Definition;
2366
2650
  }());
2367
2651
  PlaceComponent.Definition = Definition;
@@ -2375,6 +2659,8 @@
2375
2659
  /** @type {?} */
2376
2660
  Definition.prototype.data;
2377
2661
  /** @type {?} */
2662
+ Definition.prototype.children;
2663
+ /** @type {?} */
2378
2664
  Definition.prototype.component;
2379
2665
  }
2380
2666
  /**
@@ -2391,15 +2677,24 @@
2391
2677
  Options.prototype.data;
2392
2678
  /** @type {?|undefined} */
2393
2679
  Options.prototype.authenticate;
2680
+ /** @type {?|undefined} */
2681
+ Options.prototype.children;
2682
+ }
2683
+ /**
2684
+ * @record
2685
+ */
2686
+ function ChildOptions() { }
2687
+ PlaceComponent.ChildOptions = ChildOptions;
2688
+ if (false) {
2689
+ /** @type {?} */
2690
+ ChildOptions.prototype.parent;
2394
2691
  }
2395
2692
  /**
2396
2693
  * @param {?} klass
2397
2694
  * @return {?}
2398
2695
  */
2399
2696
  function getDefinition(klass) {
2400
- /** @type {?} */
2401
- var placeOptions = Reflect.getMetadata(DEFINITION_META_DATA_KEY, klass);
2402
- return new Definition(klass, placeOptions);
2697
+ return Reflect.getMetadata(DEFINITION_META_DATA_KEY, klass);
2403
2698
  }
2404
2699
  PlaceComponent.getDefinition = getDefinition;
2405
2700
  /**
@@ -2408,20 +2703,157 @@
2408
2703
  * @return {?}
2409
2704
  */
2410
2705
  function injectDefinition(klass, options) {
2411
- Reflect.defineMetadata(DEFINITION_META_DATA_KEY, options, klass);
2706
+ Reflect.defineMetadata(DEFINITION_META_DATA_KEY, new Definition(klass, options), klass);
2412
2707
  }
2413
2708
  PlaceComponent.injectDefinition = injectDefinition;
2414
2709
  })(exports.PlaceComponent || (exports.PlaceComponent = {}));
2415
2710
 
2711
+ /**
2712
+ * @fileoverview added by tsickle
2713
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2714
+ */
2715
+ var AbstractPlaceNavigationComponent = /** @class */ (function (_super) {
2716
+ __extends(AbstractPlaceNavigationComponent, _super);
2717
+ function AbstractPlaceNavigationComponent() {
2718
+ var _this = _super.call(this) || this;
2719
+ var _a = pectin.Dsl.disposeWith(_this), chain = _a.chain, valueOf = _a.valueOf, before = _a.before, when = _a.when, after = _a.after, observe = _a.observe, switchOn = _a.switchOn;
2720
+ _this.placeDefinitions = chain(_this.placesModel).map((/**
2721
+ * @param {?} c
2722
+ * @return {?}
2723
+ */
2724
+ function (c) { return exports.PlaceComponent.getDefinition(c); }));
2725
+ return _this;
2726
+ }
2727
+ /**
2728
+ * @param {?} placeDef
2729
+ * @return {?}
2730
+ */
2731
+ AbstractPlaceNavigationComponent.prototype.getNavItem = /**
2732
+ * @param {?} placeDef
2733
+ * @return {?}
2734
+ */
2735
+ function (placeDef) {
2736
+ /** @type {?} */
2737
+ var navItem = (/** @type {?} */ (placeDef.getData('navItem')));
2738
+ return {
2739
+ title: (/**
2740
+ * @return {?}
2741
+ */
2742
+ function () { return navItem ? navItem.title() : placeDef.searchData(['navTitle', 'title']); }),
2743
+ tooltip: (/**
2744
+ * @return {?}
2745
+ */
2746
+ function () { return navItem && navItem.tooltip ? navItem.tooltip() : placeDef.getData('navTooltip', null); }),
2747
+ icon: (/**
2748
+ * @return {?}
2749
+ */
2750
+ function () { return navItem && navItem.icon ? navItem.icon() : placeDef.getData('navIcon', null); })
2751
+ };
2752
+ };
2753
+ /**
2754
+ * @return {?}
2755
+ */
2756
+ AbstractPlaceNavigationComponent.prototype.ngOnInit = /**
2757
+ * @return {?}
2758
+ */
2759
+ function () {
2760
+ };
2761
+ AbstractPlaceNavigationComponent.propDecorators = {
2762
+ places: [{ type: core.Input }],
2763
+ placesModel: [{ type: core.Input }]
2764
+ };
2765
+ __decorate([
2766
+ pectin.StoreInListModel('placesModel'),
2767
+ __metadata("design:type", Array)
2768
+ ], AbstractPlaceNavigationComponent.prototype, "places", void 0);
2769
+ __decorate([
2770
+ pectin.UseDelegate(),
2771
+ __metadata("design:type", pectin.ListModel)
2772
+ ], AbstractPlaceNavigationComponent.prototype, "placesModel", void 0);
2773
+ __decorate([
2774
+ src.Memoize(),
2775
+ __metadata("design:type", Function),
2776
+ __metadata("design:paramtypes", [exports.PlaceComponent.Definition]),
2777
+ __metadata("design:returntype", Object)
2778
+ ], AbstractPlaceNavigationComponent.prototype, "getNavItem", null);
2779
+ return AbstractPlaceNavigationComponent;
2780
+ }(DisposableComponent));
2781
+ if (false) {
2782
+ /** @type {?} */
2783
+ AbstractPlaceNavigationComponent.prototype.places;
2784
+ /** @type {?} */
2785
+ AbstractPlaceNavigationComponent.prototype.placesModel;
2786
+ /** @type {?} */
2787
+ AbstractPlaceNavigationComponent.prototype.placeDefinitions;
2788
+ }
2789
+
2790
+ /**
2791
+ * @fileoverview added by tsickle
2792
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2793
+ */
2794
+ var ListPlaceNavComponent = /** @class */ (function (_super) {
2795
+ __extends(ListPlaceNavComponent, _super);
2796
+ function ListPlaceNavComponent() {
2797
+ var _this = _super.call(this) || this;
2798
+ _this.expanded = true;
2799
+ return _this;
2800
+ }
2801
+ /**
2802
+ * @return {?}
2803
+ */
2804
+ ListPlaceNavComponent.prototype.expandMenu = /**
2805
+ * @return {?}
2806
+ */
2807
+ function () {
2808
+ this.expanded = true;
2809
+ };
2810
+ /**
2811
+ * @return {?}
2812
+ */
2813
+ ListPlaceNavComponent.prototype.collapseMenu = /**
2814
+ * @return {?}
2815
+ */
2816
+ function () {
2817
+ this.expanded = false;
2818
+ };
2819
+ /**
2820
+ * @return {?}
2821
+ */
2822
+ ListPlaceNavComponent.prototype.toggleMenu = /**
2823
+ * @return {?}
2824
+ */
2825
+ function () {
2826
+ this.expanded = !this.expanded;
2827
+ };
2828
+ ListPlaceNavComponent.decorators = [
2829
+ { type: core.Component, args: [{
2830
+ selector: 'angular-ui-powerups-list-place-nav',
2831
+ template: "<mat-nav-list class=\"app-menu\">\n <a mat-list-item *ngFor=\"let place of placeDefinitions.value\"\n [routerLink]='place.path'\n routerLinkActive #rla=\"routerLinkActive\"\n [matTooltip]=\"getNavItem(place).tooltip()\">\n <mat-icon *ngIf=\"getNavItem(place).icon()\">{{getNavItem(place).icon()}}</mat-icon>\n <span class=\"expanded-only\">{{getNavItem(place).title()}}</span>\n </a>\n</mat-nav-list>\n",
2832
+ styles: [":host{display:flex;flex-direction:column;--expanded-width:235px;--nav-item-width:var(--nav-bar-height);width:var(--nav-item-width);transition:width 125ms linear}:host.expanded{width:var(--expanded-width);max-width:var(--expanded-width)}.expanded-only{max-width:0;overflow:hidden}.collapsed-only{max-width:100%;overflow:hidden}.header{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;height:var(--nav-bar-height);border-bottom:var(--pinstripe-border);cursor:pointer}.header .menu{flex:1}.header button{color:inherit;width:var(--nav-item-width);height:var(--nav-bar-height)}mat-nav-list{flex:1;display:flex;flex-direction:column}.mat-list-item{width:var(--nav-item-width);height:var(--nav-bar-height);color:inherit}mat-icon{color:inherit}mat-icon.flip-horizontal{transform:scaleX(-1)}:host-context(.expanded) .expanded-only{max-width:100%}:host-context(.expanded) .collapsed-only{max-width:0}:host-context(.expanded) .mat-list-item mat-icon{margin-right:12px}:host-context(.expanded) .mat-list-item span{text-wrap:none;white-space:nowrap}a[ng-reflect-router-link=manage-instruments] mat-icon{transform:rotate(90deg)}.app-menu{padding-top:0}"]
2833
+ }] }
2834
+ ];
2835
+ /** @nocollapse */
2836
+ ListPlaceNavComponent.ctorParameters = function () { return []; };
2837
+ ListPlaceNavComponent.propDecorators = {
2838
+ expanded: [{ type: core.HostBinding, args: ['class.expanded',] }]
2839
+ };
2840
+ return ListPlaceNavComponent;
2841
+ }(AbstractPlaceNavigationComponent));
2842
+ if (false) {
2843
+ /** @type {?} */
2844
+ ListPlaceNavComponent.prototype.expanded;
2845
+ }
2846
+
2416
2847
  /**
2417
2848
  * @fileoverview added by tsickle
2418
2849
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2419
2850
  */
2420
2851
  var PlaceService = /** @class */ (function (_super) {
2421
2852
  __extends(PlaceService, _super);
2422
- function PlaceService(router) {
2853
+ function PlaceService(router, injector) {
2423
2854
  var _this = _super.call(this) || this;
2424
2855
  _this.router = router;
2856
+ _this.injector = injector;
2425
2857
  _this._activePlaces = new pectin.MutableListModel();
2426
2858
  return _this;
2427
2859
  }
@@ -2475,10 +2907,25 @@
2475
2907
  /** @type {?} */
2476
2908
  var path = routeId ? [relativePath, routeId, params.next.getFormattedParameters()] : [relativePath, params.next.getFormattedParameters()];
2477
2909
  this.router.navigate(path, {
2478
- relativeTo: params.placeComponent.activatedRoute
2910
+ relativeTo: params.activatedRoute
2479
2911
  });
2480
2912
  }
2481
2913
  };
2914
+ /**
2915
+ * @param {?} snapshot
2916
+ * @return {?}
2917
+ */
2918
+ PlaceService.prototype.sanitise = /**
2919
+ * @param {?} snapshot
2920
+ * @return {?}
2921
+ */
2922
+ function (snapshot) {
2923
+ return __awaiter(this, void 0, void 0, function () {
2924
+ return __generator(this, function (_a) {
2925
+ return [2 /*return*/, snapshot];
2926
+ });
2927
+ });
2928
+ };
2482
2929
  PlaceService.decorators = [
2483
2930
  { type: core.Injectable, args: [{
2484
2931
  providedIn: 'root'
@@ -2486,9 +2933,10 @@
2486
2933
  ];
2487
2934
  /** @nocollapse */
2488
2935
  PlaceService.ctorParameters = function () { return [
2489
- { type: router.Router }
2936
+ { type: router.Router },
2937
+ { type: core.Injector }
2490
2938
  ]; };
2491
- /** @nocollapse */ PlaceService.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function PlaceService_Factory() { return new PlaceService(core.ɵɵinject(router.Router)); }, token: PlaceService, providedIn: "root" });
2939
+ /** @nocollapse */ PlaceService.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function PlaceService_Factory() { return new PlaceService(core.ɵɵinject(router.Router), core.ɵɵinject(core.INJECTOR)); }, token: PlaceService, providedIn: "root" });
2492
2940
  __decorate([
2493
2941
  pectin.Trace(),
2494
2942
  __metadata("design:type", Function),
@@ -2507,6 +2955,12 @@
2507
2955
  __metadata("design:paramtypes", [Object]),
2508
2956
  __metadata("design:returntype", void 0)
2509
2957
  ], PlaceService.prototype, "notifyRouteParametersChanged", null);
2958
+ __decorate([
2959
+ pectin.Trace(),
2960
+ __metadata("design:type", Function),
2961
+ __metadata("design:paramtypes", [exports.ParameterSnapshot]),
2962
+ __metadata("design:returntype", Promise)
2963
+ ], PlaceService.prototype, "sanitise", null);
2510
2964
  return PlaceService;
2511
2965
  }(pectin.GarbageCollector));
2512
2966
  if (false) {
@@ -2520,6 +2974,11 @@
2520
2974
  * @protected
2521
2975
  */
2522
2976
  PlaceService.prototype.router;
2977
+ /**
2978
+ * @type {?}
2979
+ * @protected
2980
+ */
2981
+ PlaceService.prototype.injector;
2523
2982
  }
2524
2983
 
2525
2984
  /**
@@ -2562,11 +3021,18 @@
2562
3021
  })
2563
3022
  ])
2564
3023
  ];
3024
+ /**
3025
+ * @param {?} duration
3026
+ * @return {?}
3027
+ */
3028
+ function leftRightPlaceAnimation(duration) {
3029
+ return animations$1.trigger('routeAnimations', [
3030
+ animations$1.transition(':increment', right, { params: { duration: duration } }),
3031
+ animations$1.transition(':decrement', left, { params: { duration: duration } })
3032
+ ]);
3033
+ }
2565
3034
  /** @type {?} */
2566
- var LEFT_RIGHT_PLACE_ANIMATION = animations$1.trigger('routeAnimations', [
2567
- animations$1.transition(':increment', right, { params: { duration: '.3s' } }),
2568
- animations$1.transition(':decrement', left, { params: { duration: '.3s' } })
2569
- ]);
3035
+ var LEFT_RIGHT_PLACE_ANIMATION = leftRightPlaceAnimation("0.3s");
2570
3036
 
2571
3037
  /**
2572
3038
  * @fileoverview added by tsickle
@@ -2687,54 +3153,19 @@
2687
3153
  var TabbedPlaceNavigationComponent = /** @class */ (function (_super) {
2688
3154
  __extends(TabbedPlaceNavigationComponent, _super);
2689
3155
  function TabbedPlaceNavigationComponent() {
2690
- var _this = _super.call(this) || this;
2691
- var _a = pectin.Dsl.disposeWith(_this), chain = _a.chain, valueOf = _a.valueOf, before = _a.before, when = _a.when, after = _a.after, observe = _a.observe, switchOn = _a.switchOn;
2692
- _this.orderedPlaces = chain(_this.placesModel).map((/**
2693
- * @param {?} c
2694
- * @return {?}
2695
- */
2696
- function (c) { return exports.PlaceComponent.getDefinition(c); })).sortBy('order');
2697
- return _this;
3156
+ return _super.call(this) || this;
2698
3157
  }
2699
- /**
2700
- * @return {?}
2701
- */
2702
- TabbedPlaceNavigationComponent.prototype.ngOnInit = /**
2703
- * @return {?}
2704
- */
2705
- function () {
2706
- };
2707
3158
  TabbedPlaceNavigationComponent.decorators = [
2708
3159
  { type: core.Component, args: [{
2709
3160
  selector: 'angular-ui-powerups-tabbed-place-navigation',
2710
- template: "<nav mat-tab-nav-bar>\n <a mat-tab-link *ngFor=\"let placeDescriptor of orderedPlaces.value\"\n [routerLink]='placeDescriptor.path'\n routerLinkActive #rla=\"routerLinkActive\"\n [active]=\"rla.isActive\"\n [matTooltip]=\"placeDescriptor.searchData(['navTooltip', 'navTitle'])\">\n <mat-icon *ngIf=\"placeDescriptor.getData('navIcon')\">{{placeDescriptor.getData('navIcon')}}</mat-icon>\n <span>{{placeDescriptor.getData(\"navTitle\", 'missing @Place({data: {navTitle: ??}\\})')}}</span>\n </a>\n</nav>\n",
3161
+ template: "<nav mat-tab-nav-bar>\n <a mat-tab-link *ngFor=\"let place of placeDefinitions.value\"\n [routerLink]='place.path'\n routerLinkActive #rla=\"routerLinkActive\"\n [active]=\"rla.isActive\"\n [matTooltip]=\"getNavItem(place).tooltip()\">\n <mat-icon *ngIf=\"getNavItem(place).icon()\">{{getNavItem(place).icon()}}</mat-icon>\n <span>{{getNavItem(place).title()}}</span>\n </a>\n</nav>\n",
2711
3162
  styles: [""]
2712
3163
  }] }
2713
3164
  ];
2714
3165
  /** @nocollapse */
2715
3166
  TabbedPlaceNavigationComponent.ctorParameters = function () { return []; };
2716
- TabbedPlaceNavigationComponent.propDecorators = {
2717
- places: [{ type: core.Input }],
2718
- placesModel: [{ type: core.Input }]
2719
- };
2720
- __decorate([
2721
- pectin.StoreInListModel('placesModel'),
2722
- __metadata("design:type", Array)
2723
- ], TabbedPlaceNavigationComponent.prototype, "places", void 0);
2724
- __decorate([
2725
- pectin.UseDelegate(),
2726
- __metadata("design:type", pectin.ListModel)
2727
- ], TabbedPlaceNavigationComponent.prototype, "placesModel", void 0);
2728
3167
  return TabbedPlaceNavigationComponent;
2729
- }(DisposableComponent));
2730
- if (false) {
2731
- /** @type {?} */
2732
- TabbedPlaceNavigationComponent.prototype.places;
2733
- /** @type {?} */
2734
- TabbedPlaceNavigationComponent.prototype.placesModel;
2735
- /** @type {?} */
2736
- TabbedPlaceNavigationComponent.prototype.orderedPlaces;
2737
- }
3168
+ }(AbstractPlaceNavigationComponent));
2738
3169
 
2739
3170
  /**
2740
3171
  * @fileoverview added by tsickle
@@ -2759,14 +3190,16 @@
2759
3190
  EmptyStateComponent,
2760
3191
  BusyOverlayComponent,
2761
3192
  PlaceOutletComponent,
2762
- TabbedPlaceNavigationComponent
3193
+ TabbedPlaceNavigationComponent,
3194
+ ListPlaceNavComponent
2763
3195
  ],
2764
3196
  entryComponents: [BusyOverlayComponent],
2765
3197
  exports: [
2766
3198
  BusyOverlayComponent,
2767
3199
  PlaceOutletComponent,
2768
3200
  EmptyStateComponent,
2769
- TabbedPlaceNavigationComponent
3201
+ TabbedPlaceNavigationComponent,
3202
+ ListPlaceNavComponent
2770
3203
  ],
2771
3204
  providers: [
2772
3205
  PlaceService
@@ -2791,11 +3224,10 @@
2791
3224
  NumberInputComponent,
2792
3225
  StringInputComponent,
2793
3226
  PasswordInputComponent,
2794
- SelectInputComponent,
3227
+ SelectInputComponent
2795
3228
  ],
2796
3229
  imports: [
2797
3230
  common.CommonModule,
2798
- platformBrowser.BrowserModule,
2799
3231
  animations.BrowserAnimationsModule,
2800
3232
  forms.FormsModule,
2801
3233
  material.MatInputModule,
@@ -2812,7 +3244,7 @@
2812
3244
  PasswordInputComponent,
2813
3245
  SelectInputComponent,
2814
3246
  InteractionModule,
2815
- PlaceModule,
3247
+ PlaceModule
2816
3248
  ]
2817
3249
  },] }
2818
3250
  ];
@@ -3193,14 +3625,37 @@
3193
3625
  /**
3194
3626
  * @record
3195
3627
  */
3196
- function IPlaceComponent() { }
3628
+ function NavItem() { }
3629
+ if (false) {
3630
+ /**
3631
+ * @return {?}
3632
+ */
3633
+ NavItem.prototype.title = function () { };
3634
+ /**
3635
+ * @return {?}
3636
+ */
3637
+ NavItem.prototype.icon = function () { };
3638
+ /**
3639
+ * @return {?}
3640
+ */
3641
+ NavItem.prototype.tooltip = function () { };
3642
+ }
3643
+
3644
+ /**
3645
+ * @fileoverview added by tsickle
3646
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3647
+ */
3648
+ /**
3649
+ * @record
3650
+ */
3651
+ function PlaceComponentLike() { }
3197
3652
  if (false) {
3198
3653
  /** @type {?} */
3199
- IPlaceComponent.prototype.activatedRoute;
3654
+ PlaceComponentLike.prototype.activatedRoute;
3200
3655
  /**
3201
3656
  * @return {?}
3202
3657
  */
3203
- IPlaceComponent.prototype.onPlaceReady = function () { };
3658
+ PlaceComponentLike.prototype.onPlaceReady = function () { };
3204
3659
  }
3205
3660
 
3206
3661
  /**
@@ -3210,13 +3665,13 @@
3210
3665
  /**
3211
3666
  * @record
3212
3667
  */
3213
- function IPlaceService() { }
3668
+ function PlaceUpdatesService() { }
3214
3669
  if (false) {
3215
3670
  /**
3216
3671
  * @param {?} params
3217
3672
  * @return {?}
3218
3673
  */
3219
- IPlaceService.prototype.notifyRouteParametersChanged = function (params) { };
3674
+ PlaceUpdatesService.prototype.notifyRouteParametersChanged = function (params) { };
3220
3675
  }
3221
3676
 
3222
3677
  /**
@@ -3240,6 +3695,28 @@
3240
3695
  });
3241
3696
  }
3242
3697
 
3698
+ /**
3699
+ * @fileoverview added by tsickle
3700
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3701
+ */
3702
+ /**
3703
+ * @record
3704
+ */
3705
+ function Visit() { }
3706
+ if (false) {
3707
+ /** @type {?} */
3708
+ Visit.prototype.placeDefinition;
3709
+ /**
3710
+ * @return {?}
3711
+ */
3712
+ Visit.prototype.getRouteId = function () { };
3713
+ /**
3714
+ * @param {?} name
3715
+ * @return {?}
3716
+ */
3717
+ Visit.prototype.getRouteParameter = function (name) { };
3718
+ }
3719
+
3243
3720
  /**
3244
3721
  * @fileoverview added by tsickle
3245
3722
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
@@ -3264,7 +3741,16 @@
3264
3741
  * @return {?}
3265
3742
  */
3266
3743
  function (component, currentRoute, currentState, nextState) {
3267
- return component.canDeactivate();
3744
+ // HACK: this will break with child routes...
3745
+ /** @type {?} */
3746
+ var path = "/" + component.placeDefinition.path;
3747
+ console.log({ path: path, next: nextState.url });
3748
+ if (!nextState.url.startsWith(path)) {
3749
+ return component.canDeactivate();
3750
+ }
3751
+ else {
3752
+ return true;
3753
+ }
3268
3754
  };
3269
3755
  LeavePlaceGuard.decorators = [
3270
3756
  { type: core.Injectable, args: [{
@@ -3296,453 +3782,143 @@
3296
3782
  * @fileoverview added by tsickle
3297
3783
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3298
3784
  */
3299
- /**
3300
- * @abstract
3301
- * @template T, S
3302
- */
3303
- /**
3304
- * @abstract
3305
- * @template T, S
3306
- */
3307
- exports.Sanitiser = /** @class */ (function () {
3308
- function Sanitiser(parameterDef, snapshot, sanitiser) {
3309
- this.parameterDef = parameterDef;
3310
- this.snapshot = snapshot;
3311
- this.sanitiser = sanitiser;
3785
+ var PlaceRouteGuard = /** @class */ (function () {
3786
+ function PlaceRouteGuard(placeService, router) {
3787
+ this.placeService = placeService;
3788
+ this.router = router;
3312
3789
  }
3313
3790
  /**
3791
+ * @param {?} route
3792
+ * @param {?} state
3314
3793
  * @return {?}
3315
3794
  */
3316
- Sanitiser.prototype.isRouteId = /**
3317
- * @return {?}
3318
- */
3319
- function () {
3320
- return this.parameterDef.isRouteId;
3321
- };
3322
- Object.defineProperty(Sanitiser.prototype, "valueChanged", {
3323
- get: /**
3324
- * @return {?}
3325
- */
3326
- function () {
3327
- return !lodash.isNil(this.initialValue) && this.hasChanged(this.initialValue, this.sanitisedValue);
3328
- },
3329
- enumerable: true,
3330
- configurable: true
3331
- });
3332
- Object.defineProperty(Sanitiser.prototype, "sanitisedValue", {
3333
- get: /**
3334
- * @return {?}
3335
- */
3336
- function () {
3337
- return this._sanitisedValue;
3338
- },
3339
- enumerable: true,
3340
- configurable: true
3341
- });
3342
- /**
3343
- * @return {?}
3344
- */
3345
- Sanitiser.prototype.sanitize = /**
3795
+ PlaceRouteGuard.prototype.canActivate = /**
3796
+ * @param {?} route
3797
+ * @param {?} state
3346
3798
  * @return {?}
3347
3799
  */
3348
- function () {
3349
- return __awaiter(this, void 0, void 0, function () {
3350
- var _a;
3351
- return __generator(this, function (_b) {
3352
- switch (_b.label) {
3353
- case 0:
3354
- if (!this.sanitiser) return [3 /*break*/, 2];
3355
- this.initialValue = this.readFrom(this.snapshot);
3356
- _a = this;
3357
- return [4 /*yield*/, this.sanitiser.sanitise(this.initialValue)];
3358
- case 1:
3359
- _a._sanitisedValue = _b.sent();
3360
- if (this.initialValue !== this._sanitisedValue) {
3361
- return [2 /*return*/, false];
3362
- }
3363
- _b.label = 2;
3364
- case 2: return [2 /*return*/, true];
3365
- }
3366
- });
3367
- });
3800
+ function (route, state) {
3801
+ // Implement this when adding child routes.
3802
+ // TODO: there are really two types of snapshot, ones with id's and ones without.
3803
+ // Id snapshot are repesented by 2 url segments
3804
+ // ID => [{'/basePath', params}, {'id', params}]
3805
+ // NO ID => [{'/basePath', params}]
3806
+ console.log({ urlSegments: route.url });
3807
+ // const snapshot = ParameterSnapshot.create(PlaceComponent.getDefinition(route.component as Constructable<PlaceComponent>), route.paramMap);
3808
+ // return this.placeService.sanitise(snapshot).then(sanitised => {
3809
+ // if (sanitised.hasChanged(snapshot)) {
3810
+ // return this.router.createUrlTree(snapshot.updateUrl(route.url))
3811
+ // } else {
3812
+ // return true;
3813
+ // }
3814
+ // });
3815
+ return true;
3368
3816
  };
3369
- return Sanitiser;
3817
+ PlaceRouteGuard.decorators = [
3818
+ { type: core.Injectable, args: [{
3819
+ providedIn: 'root'
3820
+ },] }
3821
+ ];
3822
+ /** @nocollapse */
3823
+ PlaceRouteGuard.ctorParameters = function () { return [
3824
+ { type: PlaceService },
3825
+ { type: router.Router }
3826
+ ]; };
3827
+ /** @nocollapse */ PlaceRouteGuard.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function PlaceRouteGuard_Factory() { return new PlaceRouteGuard(core.ɵɵinject(PlaceService), core.ɵɵinject(router.Router)); }, token: PlaceRouteGuard, providedIn: "root" });
3828
+ return PlaceRouteGuard;
3370
3829
  }());
3371
3830
  if (false) {
3372
3831
  /**
3373
3832
  * @type {?}
3374
3833
  * @private
3375
3834
  */
3376
- exports.Sanitiser.prototype.initialValue;
3835
+ PlaceRouteGuard.prototype.placeService;
3377
3836
  /**
3378
3837
  * @type {?}
3379
3838
  * @private
3380
3839
  */
3381
- exports.Sanitiser.prototype._sanitisedValue;
3382
- /** @type {?} */
3383
- exports.Sanitiser.prototype.parameterDef;
3384
- /** @type {?} */
3385
- exports.Sanitiser.prototype.snapshot;
3386
- /** @type {?} */
3387
- exports.Sanitiser.prototype.sanitiser;
3388
- /**
3389
- * @abstract
3390
- * @protected
3391
- * @param {?} snapshot
3392
- * @return {?}
3393
- */
3394
- exports.Sanitiser.prototype.readFrom = function (snapshot) { };
3395
- /**
3396
- * @abstract
3397
- * @protected
3398
- * @param {?} initialValue
3399
- * @param {?} sanitisedValue
3400
- * @return {?}
3401
- */
3402
- exports.Sanitiser.prototype.hasChanged = function (initialValue, sanitisedValue) { };
3403
- /**
3404
- * @abstract
3405
- * @param {?} dest
3406
- * @return {?}
3407
- */
3408
- exports.Sanitiser.prototype.injectRouteParam = function (dest) { };
3840
+ PlaceRouteGuard.prototype.router;
3409
3841
  }
3410
- var RouteParameterSanitiser = /** @class */ (function () {
3411
- function RouteParameterSanitiser(parameterDefs, snapshot, injector) {
3412
- var _this = this;
3413
- this.parameterDefs = parameterDefs;
3414
- this.snapshot = snapshot;
3415
- this.injector = injector;
3416
- this.parameterSanitisers = [];
3417
- /** @type {?} */
3418
- var sanitisers = parameterDefs.map((/**
3419
- * @param {?} def
3420
- * @return {?}
3421
- */
3422
- function (def) {
3423
- return def.isArray ?
3424
- new exports.Sanitiser.Array(def, snapshot, _this.getSanitiser(def)) :
3425
- new exports.Sanitiser.Value(def, snapshot, _this.getSanitiser(def));
3426
- }));
3427
- this.routeIdSanitiser = sanitisers.find((/**
3428
- * @param {?} p
3429
- * @return {?}
3430
- */
3431
- function (p) { return p.isRouteId(); }));
3432
- this.parameterSanitisers = sanitisers.filter((/**
3433
- * @param {?} p
3434
- * @return {?}
3435
- */
3436
- function (p) { return !p.isRouteId(); }));
3842
+
3843
+ /**
3844
+ * @fileoverview added by tsickle
3845
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3846
+ */
3847
+ /**
3848
+ * @template T, S
3849
+ */
3850
+ var DefaultParameterSanitiser = /** @class */ (function () {
3851
+ function DefaultParameterSanitiser(def, placeService, options) {
3852
+ this.def = def;
3853
+ this.placeService = placeService;
3854
+ this.remember = lodash.isNil(options.remember) ? false : options.remember;
3855
+ this.defaultValue = lodash.isNil(options.defaultValue) ? null : options.defaultValue;
3437
3856
  }
3438
3857
  /**
3858
+ * @param {?} value
3859
+ * @param {?} visit
3439
3860
  * @return {?}
3440
3861
  */
3441
- RouteParameterSanitiser.prototype.sanitise = /**
3442
- * @return {?}
3443
- */
3444
- function () {
3445
- return __awaiter(this, void 0, void 0, function () {
3446
- var e_1, _a, _b, _c, sanitiser, e_1_1;
3447
- return __generator(this, function (_d) {
3448
- switch (_d.label) {
3449
- case 0:
3450
- if (!this.routeIdSanitiser) return [3 /*break*/, 2];
3451
- return [4 /*yield*/, this.routeIdSanitiser.sanitize()];
3452
- case 1:
3453
- _d.sent();
3454
- if (this.routeIdSanitiser.valueChanged) {
3455
- // if the route id isn't ok we redirect immediately as the query params may need to be sanitised in the
3456
- // context of the route id.
3457
- return [2 /*return*/, false];
3458
- }
3459
- _d.label = 2;
3460
- case 2:
3461
- _d.trys.push([2, 7, 8, 9]);
3462
- _b = __values(this.parameterSanitisers), _c = _b.next();
3463
- _d.label = 3;
3464
- case 3:
3465
- if (!!_c.done) return [3 /*break*/, 6];
3466
- sanitiser = _c.value;
3467
- return [4 /*yield*/, sanitiser.sanitize()];
3468
- case 4:
3469
- _d.sent();
3470
- _d.label = 5;
3471
- case 5:
3472
- _c = _b.next();
3473
- return [3 /*break*/, 3];
3474
- case 6: return [3 /*break*/, 9];
3475
- case 7:
3476
- e_1_1 = _d.sent();
3477
- e_1 = { error: e_1_1 };
3478
- return [3 /*break*/, 9];
3479
- case 8:
3480
- try {
3481
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
3482
- }
3483
- finally { if (e_1) throw e_1.error; }
3484
- return [7 /*endfinally*/];
3485
- case 9: return [2 /*return*/, !this.parameterSanitisers.find((/**
3486
- * @param {?} s
3487
- * @return {?}
3488
- */
3489
- function (s) { return s.valueChanged; }))];
3490
- }
3491
- });
3492
- });
3493
- };
3494
- /**
3495
- * @param {?} router
3496
- * @return {?}
3497
- */
3498
- RouteParameterSanitiser.prototype.redirect = /**
3499
- * @param {?} router
3862
+ DefaultParameterSanitiser.prototype.sanitise = /**
3863
+ * @param {?} value
3864
+ * @param {?} visit
3500
3865
  * @return {?}
3501
3866
  */
3502
- function (router) {
3503
- pectin.assert.isTruthy(this.parameterSanitisers.length !== 0);
3504
- if (this.routeIdSanitiser.valueChanged) {
3505
- return router.navigate(['..', this.routeIdSanitiser.sanitisedValue]);
3867
+ function (value, visit) {
3868
+ if (this.isBlank(value)) {
3869
+ if (this.remember) {
3870
+ // value = null;
3871
+ }
3872
+ return this.isBlank(value) && !lodash.isNil(this.defaultValue) ? this.defaultValue : value;
3506
3873
  }
3507
3874
  else {
3508
- /** @type {?} */
3509
- var routeParams_1 = {};
3510
- this.parameterSanitisers.forEach((/**
3511
- * @param {?} s
3512
- * @return {?}
3513
- */
3514
- function (s) { return s.injectRouteParam(routeParams_1); }));
3515
- return router.navigate(['.', routeParams_1]);
3875
+ return value;
3516
3876
  }
3517
3877
  };
3518
3878
  /**
3519
3879
  * @private
3520
- * @template T, S
3521
- * @param {?} def
3880
+ * @param {?} value
3522
3881
  * @return {?}
3523
3882
  */
3524
- RouteParameterSanitiser.prototype.getSanitiser = /**
3883
+ DefaultParameterSanitiser.prototype.isBlank = /**
3525
3884
  * @private
3526
- * @template T, S
3527
- * @param {?} def
3885
+ * @param {?} value
3528
3886
  * @return {?}
3529
3887
  */
3530
- function (def) {
3531
- return def.sanitiser ? this.injector.get(def.sanitiser, new def.sanitiser()) : null;
3888
+ function (value) {
3889
+ /** @type {?} */
3890
+ var isNil$1 = lodash.isNil(value);
3891
+ return this.def.isArray ? !isNil$1 || value['length'] < 1 : isNil$1;
3532
3892
  };
3533
3893
  __decorate([
3534
- src.Memoize(),
3894
+ pectin.Trace(),
3535
3895
  __metadata("design:type", Function),
3536
- __metadata("design:paramtypes", [Object]),
3896
+ __metadata("design:paramtypes", [Object, Object]),
3537
3897
  __metadata("design:returntype", Object)
3538
- ], RouteParameterSanitiser.prototype, "getSanitiser", null);
3539
- return RouteParameterSanitiser;
3898
+ ], DefaultParameterSanitiser.prototype, "sanitise", null);
3899
+ return DefaultParameterSanitiser;
3540
3900
  }());
3541
3901
  if (false) {
3542
3902
  /**
3543
3903
  * @type {?}
3544
3904
  * @private
3545
3905
  */
3546
- RouteParameterSanitiser.prototype.routeIdSanitiser;
3906
+ DefaultParameterSanitiser.prototype.remember;
3547
3907
  /**
3548
3908
  * @type {?}
3549
3909
  * @private
3550
3910
  */
3551
- RouteParameterSanitiser.prototype.parameterSanitisers;
3552
- /** @type {?} */
3553
- RouteParameterSanitiser.prototype.parameterDefs;
3554
- /** @type {?} */
3555
- RouteParameterSanitiser.prototype.snapshot;
3556
- /** @type {?} */
3557
- RouteParameterSanitiser.prototype.injector;
3558
- }
3559
- (function (Sanitiser) {
3911
+ DefaultParameterSanitiser.prototype.defaultValue;
3560
3912
  /**
3561
- * @template T
3913
+ * @type {?}
3914
+ * @private
3562
3915
  */
3563
- var /**
3564
- * @template T
3916
+ DefaultParameterSanitiser.prototype.def;
3917
+ /**
3918
+ * @type {?}
3919
+ * @private
3565
3920
  */
3566
- Value = /** @class */ (function (_super) {
3567
- __extends(Value, _super);
3568
- function Value() {
3569
- return _super !== null && _super.apply(this, arguments) || this;
3570
- }
3571
- /**
3572
- * @param {?} snapshot
3573
- * @return {?}
3574
- */
3575
- Value.prototype.readFrom = /**
3576
- * @param {?} snapshot
3577
- * @return {?}
3578
- */
3579
- function (snapshot) {
3580
- /** @type {?} */
3581
- var rawValue = this.parameterDef.isRouteId ?
3582
- snapshot.paramMap.get(this.parameterDef.name) :
3583
- snapshot.queryParamMap.get(this.parameterDef.name);
3584
- return this.parameterDef.type.parse(rawValue);
3585
- };
3586
- /**
3587
- * @protected
3588
- * @param {?} initialValue
3589
- * @param {?} sanitisedValue
3590
- * @return {?}
3591
- */
3592
- Value.prototype.hasChanged = /**
3593
- * @protected
3594
- * @param {?} initialValue
3595
- * @param {?} sanitisedValue
3596
- * @return {?}
3597
- */
3598
- function (initialValue, sanitisedValue) {
3599
- return initialValue !== sanitisedValue;
3600
- };
3601
- /**
3602
- * @param {?} dest
3603
- * @return {?}
3604
- */
3605
- Value.prototype.injectRouteParam = /**
3606
- * @param {?} dest
3607
- * @return {?}
3608
- */
3609
- function (dest) {
3610
- dest[this.parameterDef.name] = this.parameterDef.type.format(this.sanitisedValue);
3611
- };
3612
- return Value;
3613
- }(Sanitiser));
3614
- Sanitiser.Value = Value;
3615
- /**
3616
- * @template T
3617
- */
3618
- var /**
3619
- * @template T
3620
- */
3621
- Array = /** @class */ (function (_super) {
3622
- __extends(Array, _super);
3623
- function Array() {
3624
- return _super !== null && _super.apply(this, arguments) || this;
3625
- }
3626
- /**
3627
- * @param {?} snapshot
3628
- * @return {?}
3629
- */
3630
- Array.prototype.readFrom = /**
3631
- * @param {?} snapshot
3632
- * @return {?}
3633
- */
3634
- function (snapshot) {
3635
- var _this = this;
3636
- /** @type {?} */
3637
- var rawValues = snapshot.queryParamMap.getAll(this.parameterDef.name);
3638
- return rawValues.map((/**
3639
- * @param {?} value
3640
- * @return {?}
3641
- */
3642
- function (value) { return _this.parameterDef.type.parse(value); }));
3643
- };
3644
- /**
3645
- * @protected
3646
- * @param {?} initialValue
3647
- * @param {?} sanitisedValue
3648
- * @return {?}
3649
- */
3650
- Array.prototype.hasChanged = /**
3651
- * @protected
3652
- * @param {?} initialValue
3653
- * @param {?} sanitisedValue
3654
- * @return {?}
3655
- */
3656
- function (initialValue, sanitisedValue) {
3657
- return initialValue !== sanitisedValue;
3658
- };
3659
- /**
3660
- * @param {?} dest
3661
- * @return {?}
3662
- */
3663
- Array.prototype.injectRouteParam = /**
3664
- * @param {?} dest
3665
- * @return {?}
3666
- */
3667
- function (dest) {
3668
- var _this = this;
3669
- dest[this.parameterDef.name] = this.sanitisedValue.map((/**
3670
- * @param {?} v
3671
- * @return {?}
3672
- */
3673
- function (v) { return _this.parameterDef.type.format(v); }));
3674
- };
3675
- return Array;
3676
- }(Sanitiser));
3677
- Sanitiser.Array = Array;
3678
- })(exports.Sanitiser || (exports.Sanitiser = {}));
3679
-
3680
- /**
3681
- * @fileoverview added by tsickle
3682
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
3683
- */
3684
- var PlaceRouteGuard = /** @class */ (function () {
3685
- function PlaceRouteGuard(router, injector) {
3686
- this.router = router;
3687
- this.injector = injector;
3688
- }
3689
- /**
3690
- * @param {?} route
3691
- * @param {?} state
3692
- * @return {?}
3693
- */
3694
- PlaceRouteGuard.prototype.canActivate = /**
3695
- * @param {?} route
3696
- * @param {?} state
3697
- * @return {?}
3698
- */
3699
- function (route, state) {
3700
- var _this = this;
3701
- /** @type {?} */
3702
- var routeParameters = typescriptUtilities.Klass.get(route.component).getMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY);
3703
- /** @type {?} */
3704
- var sanitiser = new RouteParameterSanitiser(routeParameters, route, this.injector);
3705
- return sanitiser.sanitise().then((/**
3706
- * @param {?} proceed
3707
- * @return {?}
3708
- */
3709
- function (proceed) {
3710
- if (!proceed) {
3711
- sanitiser.redirect(_this.router);
3712
- }
3713
- return proceed;
3714
- }));
3715
- };
3716
- PlaceRouteGuard.decorators = [
3717
- { type: core.Injectable, args: [{
3718
- providedIn: 'root'
3719
- },] }
3720
- ];
3721
- /** @nocollapse */
3722
- PlaceRouteGuard.ctorParameters = function () { return [
3723
- { type: router.Router },
3724
- { type: core.Injector }
3725
- ]; };
3726
- /** @nocollapse */ PlaceRouteGuard.ngInjectableDef = core.ɵɵdefineInjectable({ factory: function PlaceRouteGuard_Factory() { return new PlaceRouteGuard(core.ɵɵinject(router.Router), core.ɵɵinject(core.INJECTOR)); }, token: PlaceRouteGuard, providedIn: "root" });
3727
- __decorate([
3728
- pectin.Trace(),
3729
- __metadata("design:type", Function),
3730
- __metadata("design:paramtypes", [router.ActivatedRouteSnapshot, router.RouterStateSnapshot]),
3731
- __metadata("design:returntype", Object)
3732
- ], PlaceRouteGuard.prototype, "canActivate", null);
3733
- return PlaceRouteGuard;
3734
- }());
3735
- if (false) {
3736
- /**
3737
- * @type {?}
3738
- * @private
3739
- */
3740
- PlaceRouteGuard.prototype.router;
3741
- /**
3742
- * @type {?}
3743
- * @private
3744
- */
3745
- PlaceRouteGuard.prototype.injector;
3921
+ DefaultParameterSanitiser.prototype.placeService;
3746
3922
  }
3747
3923
 
3748
3924
  /**
@@ -3773,6 +3949,10 @@
3773
3949
  /** @type {?|undefined} */
3774
3950
  ParameterOptions.prototype.optional;
3775
3951
  /** @type {?|undefined} */
3952
+ ParameterOptions.prototype.remember;
3953
+ /** @type {?|undefined} */
3954
+ ParameterOptions.prototype.defaultValue;
3955
+ /** @type {?|undefined} */
3776
3956
  ParameterOptions.prototype.sanitiser;
3777
3957
  }
3778
3958
  /**
@@ -3786,7 +3966,11 @@
3786
3966
  /** @type {?|undefined} */
3787
3967
  ListParameterOptions.prototype.optional;
3788
3968
  /** @type {?|undefined} */
3789
- ListParameterOptions.prototype.listSanitiser;
3969
+ ListParameterOptions.prototype.remember;
3970
+ /** @type {?|undefined} */
3971
+ ListParameterOptions.prototype.defaultValue;
3972
+ /** @type {?|undefined} */
3973
+ ListParameterOptions.prototype.sanitiser;
3790
3974
  }
3791
3975
  /**
3792
3976
  * @template T
@@ -3804,7 +3988,7 @@
3804
3988
  function (prototype, propertyKey) {
3805
3989
  /** @type {?} */
3806
3990
  var param = createDefinition(propertyKey, type, options, true);
3807
- typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
3991
+ typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, param);
3808
3992
  pectin.UseDelegate()(prototype, propertyKey);
3809
3993
  });
3810
3994
  }
@@ -3824,7 +4008,7 @@
3824
4008
  function (prototype, propertyKey) {
3825
4009
  /** @type {?} */
3826
4010
  var param = createDefinition(propertyKey, type, options, false);
3827
- typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
4011
+ typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, param);
3828
4012
  pectin.UseDelegate()(prototype, propertyKey);
3829
4013
  });
3830
4014
  }
@@ -3844,7 +4028,7 @@
3844
4028
  function (prototype, propertyKey) {
3845
4029
  /** @type {?} */
3846
4030
  var param = createArrayDefinition(propertyKey, elementType, options);
3847
- typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
4031
+ typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, param);
3848
4032
  pectin.UseDelegate()(prototype, propertyKey);
3849
4033
  });
3850
4034
  }
@@ -3889,7 +4073,7 @@
3889
4073
  name: opts.getOptional('as', propertyNameAsString),
3890
4074
  propertyName: propertyNameAsString,
3891
4075
  type: pectin.assert.notNil(type),
3892
- sanitiser: opts.getOptional('listSanitiser', null),
4076
+ sanitiser: opts.getOptional('sanitiser', null),
3893
4077
  isRouteId: false,
3894
4078
  isArray: true
3895
4079
  };
@@ -3902,7 +4086,7 @@
3902
4086
  */
3903
4087
  /**
3904
4088
  * @record
3905
- * @template E, S
4089
+ * @template T, S
3906
4090
  */
3907
4091
  function ParameterDefinition() { }
3908
4092
  if (false) {
@@ -3932,10 +4116,25 @@
3932
4116
  if (false) {
3933
4117
  /**
3934
4118
  * @param {?} value
4119
+ * @param {?=} visit
3935
4120
  * @return {?}
3936
4121
  */
3937
- ParameterSanitiser.prototype.sanitise = function (value) { };
4122
+ ParameterSanitiser.prototype.sanitise = function (value, visit) { };
3938
4123
  }
4124
+ (function (ParameterSanitiser) {
4125
+ /**
4126
+ * @record
4127
+ * @template T
4128
+ */
4129
+ function Options() { }
4130
+ ParameterSanitiser.Options = Options;
4131
+ if (false) {
4132
+ /** @type {?|undefined} */
4133
+ Options.prototype.remember;
4134
+ /** @type {?|undefined} */
4135
+ Options.prototype.defaultValue;
4136
+ }
4137
+ })(ParameterSanitiser || (ParameterSanitiser = {}));
3939
4138
 
3940
4139
  /**
3941
4140
  * @fileoverview added by tsickle
@@ -3994,7 +4193,7 @@
3994
4193
  * @return {?}
3995
4194
  */
3996
4195
  function (value) {
3997
- return +value;
4196
+ return lodash.isNil(value) || lodash.isEmpty(value) ? null : +value;
3998
4197
  };
3999
4198
  return NumberType;
4000
4199
  }());
@@ -4035,38 +4234,454 @@
4035
4234
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4036
4235
  */
4037
4236
  /**
4038
- * @record
4039
- * @template T
4237
+ * @template T, S
4040
4238
  */
4041
- function ResolvedParameter() { }
4042
- if (false) {
4043
- /** @type {?} */
4044
- ResolvedParameter.prototype.parameterDef;
4045
- /** @type {?} */
4046
- ResolvedParameter.prototype.resolvedValue;
4047
- }
4048
-
4049
- /**
4050
- * @fileoverview added by tsickle
4051
- * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4239
+ /**
4240
+ * @template T, S
4052
4241
  */
4053
- var VisitSnapshot = /** @class */ (function () {
4054
- function VisitSnapshot() {
4242
+ exports.Sanitiser = /** @class */ (function () {
4243
+ function Sanitiser(parameterDef, snapshot, sanitiser) {
4244
+ this.parameterDef = parameterDef;
4245
+ this.snapshot = snapshot;
4246
+ this.sanitiser = sanitiser;
4055
4247
  }
4056
- return VisitSnapshot;
4057
- }());
4248
+ /**
4249
+ * @return {?}
4250
+ */
4251
+ Sanitiser.prototype.isRouteId = /**
4252
+ * @return {?}
4253
+ */
4254
+ function () {
4255
+ return this.parameterDef.isRouteId;
4256
+ };
4257
+ Object.defineProperty(Sanitiser.prototype, "valueChanged", {
4258
+ get: /**
4259
+ * @return {?}
4260
+ */
4261
+ function () {
4262
+ return !lodash.isNil(this.initialValue) && this.hasChanged(this.initialValue, this.sanitisedValue);
4263
+ },
4264
+ enumerable: true,
4265
+ configurable: true
4266
+ });
4267
+ Object.defineProperty(Sanitiser.prototype, "sanitisedValue", {
4268
+ get: /**
4269
+ * @return {?}
4270
+ */
4271
+ function () {
4272
+ return this._sanitisedValue;
4273
+ },
4274
+ enumerable: true,
4275
+ configurable: true
4276
+ });
4277
+ /**
4278
+ * @protected
4279
+ * @param {?} snapshot
4280
+ * @return {?}
4281
+ */
4282
+ Sanitiser.prototype.readFrom = /**
4283
+ * @protected
4284
+ * @param {?} snapshot
4285
+ * @return {?}
4286
+ */
4287
+ function (snapshot) {
4288
+ return pectin.lang.abstractMethod(this.constructor);
4289
+ };
4290
+ /**
4291
+ * @protected
4292
+ * @param {?} initialValue
4293
+ * @param {?} sanitisedValue
4294
+ * @return {?}
4295
+ */
4296
+ Sanitiser.prototype.hasChanged = /**
4297
+ * @protected
4298
+ * @param {?} initialValue
4299
+ * @param {?} sanitisedValue
4300
+ * @return {?}
4301
+ */
4302
+ function (initialValue, sanitisedValue) {
4303
+ return pectin.lang.abstractMethod(this.constructor);
4304
+ };
4305
+ /**
4306
+ * @param {?} dest
4307
+ * @return {?}
4308
+ */
4309
+ Sanitiser.prototype.injectRouteParam = /**
4310
+ * @param {?} dest
4311
+ * @return {?}
4312
+ */
4313
+ function (dest) {
4314
+ pectin.lang.abstractMethod(this.constructor);
4315
+ };
4316
+ /**
4317
+ * @return {?}
4318
+ */
4319
+ Sanitiser.prototype.sanitize = /**
4320
+ * @return {?}
4321
+ */
4322
+ function () {
4323
+ return __awaiter(this, void 0, void 0, function () {
4324
+ var _a;
4325
+ return __generator(this, function (_b) {
4326
+ switch (_b.label) {
4327
+ case 0:
4328
+ if (!this.sanitiser) return [3 /*break*/, 2];
4329
+ this.initialValue = this.readFrom(this.snapshot);
4330
+ _a = this;
4331
+ return [4 /*yield*/, this.sanitiser.sanitise(this.initialValue)];
4332
+ case 1:
4333
+ _a._sanitisedValue = _b.sent();
4334
+ if (this.initialValue !== this._sanitisedValue) {
4335
+ return [2 /*return*/, false];
4336
+ }
4337
+ _b.label = 2;
4338
+ case 2: return [2 /*return*/, true];
4339
+ }
4340
+ });
4341
+ });
4342
+ };
4343
+ return Sanitiser;
4344
+ }());
4345
+ if (false) {
4346
+ /**
4347
+ * @type {?}
4348
+ * @private
4349
+ */
4350
+ exports.Sanitiser.prototype.initialValue;
4351
+ /**
4352
+ * @type {?}
4353
+ * @private
4354
+ */
4355
+ exports.Sanitiser.prototype._sanitisedValue;
4356
+ /** @type {?} */
4357
+ exports.Sanitiser.prototype.parameterDef;
4358
+ /** @type {?} */
4359
+ exports.Sanitiser.prototype.snapshot;
4360
+ /** @type {?} */
4361
+ exports.Sanitiser.prototype.sanitiser;
4362
+ }
4363
+ var RouteParameterSanitiser = /** @class */ (function () {
4364
+ function RouteParameterSanitiser(parameterDefs, snapshot, placeService, injector) {
4365
+ var _this = this;
4366
+ this.parameterDefs = parameterDefs;
4367
+ this.snapshot = snapshot;
4368
+ this.placeService = placeService;
4369
+ this.injector = injector;
4370
+ this.parameterSanitisers = [];
4371
+ /** @type {?} */
4372
+ var sanitisers = parameterDefs.map((/**
4373
+ * @param {?} def
4374
+ * @return {?}
4375
+ */
4376
+ function (def) {
4377
+ return def.isArray ?
4378
+ new exports.Sanitiser.Array(def, snapshot, _this.getSanitiser(def)) :
4379
+ new exports.Sanitiser.Value(def, snapshot, _this.getSanitiser(def));
4380
+ }));
4381
+ this.routeIdSanitiser = sanitisers.find((/**
4382
+ * @param {?} p
4383
+ * @return {?}
4384
+ */
4385
+ function (p) { return p.isRouteId(); }));
4386
+ this.parameterSanitisers = sanitisers.filter((/**
4387
+ * @param {?} p
4388
+ * @return {?}
4389
+ */
4390
+ function (p) { return !p.isRouteId(); }));
4391
+ }
4392
+ /**
4393
+ * @return {?}
4394
+ */
4395
+ RouteParameterSanitiser.prototype.sanitise = /**
4396
+ * @return {?}
4397
+ */
4398
+ function () {
4399
+ return __awaiter(this, void 0, void 0, function () {
4400
+ var e_1, _a, _b, _c, sanitiser, e_1_1;
4401
+ return __generator(this, function (_d) {
4402
+ switch (_d.label) {
4403
+ case 0:
4404
+ if (!this.routeIdSanitiser) return [3 /*break*/, 2];
4405
+ return [4 /*yield*/, this.routeIdSanitiser.sanitize()];
4406
+ case 1:
4407
+ _d.sent();
4408
+ if (this.routeIdSanitiser.valueChanged) {
4409
+ // if the route id isn't ok we redirect immediately as the query params may need to be sanitised in the
4410
+ // context of the route id.
4411
+ return [2 /*return*/, false];
4412
+ }
4413
+ _d.label = 2;
4414
+ case 2:
4415
+ _d.trys.push([2, 7, 8, 9]);
4416
+ _b = __values(this.parameterSanitisers), _c = _b.next();
4417
+ _d.label = 3;
4418
+ case 3:
4419
+ if (!!_c.done) return [3 /*break*/, 6];
4420
+ sanitiser = _c.value;
4421
+ return [4 /*yield*/, sanitiser.sanitize()];
4422
+ case 4:
4423
+ _d.sent();
4424
+ _d.label = 5;
4425
+ case 5:
4426
+ _c = _b.next();
4427
+ return [3 /*break*/, 3];
4428
+ case 6: return [3 /*break*/, 9];
4429
+ case 7:
4430
+ e_1_1 = _d.sent();
4431
+ e_1 = { error: e_1_1 };
4432
+ return [3 /*break*/, 9];
4433
+ case 8:
4434
+ try {
4435
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
4436
+ }
4437
+ finally { if (e_1) throw e_1.error; }
4438
+ return [7 /*endfinally*/];
4439
+ case 9: return [2 /*return*/, !this.parameterSanitisers.find((/**
4440
+ * @param {?} s
4441
+ * @return {?}
4442
+ */
4443
+ function (s) { return s.valueChanged; }))];
4444
+ }
4445
+ });
4446
+ });
4447
+ };
4448
+ /**
4449
+ * @private
4450
+ * @template T, S
4451
+ * @param {?} def
4452
+ * @return {?}
4453
+ */
4454
+ RouteParameterSanitiser.prototype.getSanitiser = /**
4455
+ * @private
4456
+ * @template T, S
4457
+ * @param {?} def
4458
+ * @return {?}
4459
+ */
4460
+ function (def) {
4461
+ if (def.sanitiser) {
4462
+ if (this.isSanitiserContructor(def.sanitiser)) {
4463
+ return this.injector.get(def.sanitiser, new def.sanitiser());
4464
+ }
4465
+ else {
4466
+ return new DefaultParameterSanitiser(def, this.placeService, def.sanitiser);
4467
+ }
4468
+ }
4469
+ else {
4470
+ return null;
4471
+ }
4472
+ };
4473
+ /**
4474
+ * @return {?}
4475
+ */
4476
+ RouteParameterSanitiser.prototype.routeIdHasChanged = /**
4477
+ * @return {?}
4478
+ */
4479
+ function () {
4480
+ pectin.assert.isTruthy(this.parameterSanitisers.length !== 0);
4481
+ return this.routeIdSanitiser && this.routeIdSanitiser.valueChanged;
4482
+ };
4483
+ /**
4484
+ * @return {?}
4485
+ */
4486
+ RouteParameterSanitiser.prototype.getRedirectParams = /**
4487
+ * @return {?}
4488
+ */
4489
+ function () {
4490
+ if (this.routeIdHasChanged()) {
4491
+ return [this.routeIdSanitiser.sanitisedValue];
4492
+ }
4493
+ else {
4494
+ /** @type {?} */
4495
+ var routeParams_1 = {};
4496
+ this.parameterSanitisers.forEach((/**
4497
+ * @param {?} s
4498
+ * @return {?}
4499
+ */
4500
+ function (s) { return s.injectRouteParam(routeParams_1); }));
4501
+ return [routeParams_1];
4502
+ }
4503
+ };
4504
+ /**
4505
+ * @private
4506
+ * @template S
4507
+ * @param {?} value
4508
+ * @return {?}
4509
+ */
4510
+ RouteParameterSanitiser.prototype.isSanitiserContructor = /**
4511
+ * @private
4512
+ * @template S
4513
+ * @param {?} value
4514
+ * @return {?}
4515
+ */
4516
+ function (value) {
4517
+ return lodash.isFunction(value) && pectin.lang.constructorChain((/** @type {?} */ ((/** @type {?} */ (value))))).includes(exports.Sanitiser);
4518
+ };
4519
+ __decorate([
4520
+ src.Memoize(),
4521
+ __metadata("design:type", Function),
4522
+ __metadata("design:paramtypes", [Object]),
4523
+ __metadata("design:returntype", Object)
4524
+ ], RouteParameterSanitiser.prototype, "getSanitiser", null);
4525
+ __decorate([
4526
+ pectin.Trace(),
4527
+ __metadata("design:type", Function),
4528
+ __metadata("design:paramtypes", []),
4529
+ __metadata("design:returntype", Array)
4530
+ ], RouteParameterSanitiser.prototype, "getRedirectParams", null);
4531
+ return RouteParameterSanitiser;
4532
+ }());
4533
+ if (false) {
4534
+ /**
4535
+ * @type {?}
4536
+ * @private
4537
+ */
4538
+ RouteParameterSanitiser.prototype.routeIdSanitiser;
4539
+ /**
4540
+ * @type {?}
4541
+ * @private
4542
+ */
4543
+ RouteParameterSanitiser.prototype.parameterSanitisers;
4544
+ /** @type {?} */
4545
+ RouteParameterSanitiser.prototype.parameterDefs;
4546
+ /** @type {?} */
4547
+ RouteParameterSanitiser.prototype.snapshot;
4548
+ /** @type {?} */
4549
+ RouteParameterSanitiser.prototype.placeService;
4550
+ /** @type {?} */
4551
+ RouteParameterSanitiser.prototype.injector;
4552
+ }
4553
+ (function (Sanitiser) {
4554
+ /**
4555
+ * @template T
4556
+ */
4557
+ var /**
4558
+ * @template T
4559
+ */
4560
+ Value = /** @class */ (function (_super) {
4561
+ __extends(Value, _super);
4562
+ function Value() {
4563
+ return _super !== null && _super.apply(this, arguments) || this;
4564
+ }
4565
+ /**
4566
+ * @param {?} snapshot
4567
+ * @return {?}
4568
+ */
4569
+ Value.prototype.readFrom = /**
4570
+ * @param {?} snapshot
4571
+ * @return {?}
4572
+ */
4573
+ function (snapshot) {
4574
+ /** @type {?} */
4575
+ var rawValue = snapshot.paramMap.get(this.parameterDef.name);
4576
+ return this.parameterDef.type.parse(rawValue);
4577
+ };
4578
+ /**
4579
+ * @protected
4580
+ * @param {?} initialValue
4581
+ * @param {?} sanitisedValue
4582
+ * @return {?}
4583
+ */
4584
+ Value.prototype.hasChanged = /**
4585
+ * @protected
4586
+ * @param {?} initialValue
4587
+ * @param {?} sanitisedValue
4588
+ * @return {?}
4589
+ */
4590
+ function (initialValue, sanitisedValue) {
4591
+ return initialValue !== sanitisedValue;
4592
+ };
4593
+ /**
4594
+ * @param {?} dest
4595
+ * @return {?}
4596
+ */
4597
+ Value.prototype.injectRouteParam = /**
4598
+ * @param {?} dest
4599
+ * @return {?}
4600
+ */
4601
+ function (dest) {
4602
+ dest[this.parameterDef.name] = this.parameterDef.type.format(this.sanitisedValue);
4603
+ };
4604
+ return Value;
4605
+ }(Sanitiser));
4606
+ Sanitiser.Value = Value;
4607
+ /**
4608
+ * @template T
4609
+ */
4610
+ var /**
4611
+ * @template T
4612
+ */
4613
+ Array = /** @class */ (function (_super) {
4614
+ __extends(Array, _super);
4615
+ function Array() {
4616
+ return _super !== null && _super.apply(this, arguments) || this;
4617
+ }
4618
+ /**
4619
+ * @param {?} snapshot
4620
+ * @return {?}
4621
+ */
4622
+ Array.prototype.readFrom = /**
4623
+ * @param {?} snapshot
4624
+ * @return {?}
4625
+ */
4626
+ function (snapshot) {
4627
+ var _this = this;
4628
+ /** @type {?} */
4629
+ var rawValues = snapshot.paramMap.getAll(this.parameterDef.name);
4630
+ return rawValues.map((/**
4631
+ * @param {?} value
4632
+ * @return {?}
4633
+ */
4634
+ function (value) { return _this.parameterDef.type.parse(value); }));
4635
+ };
4636
+ /**
4637
+ * @protected
4638
+ * @param {?} initialValue
4639
+ * @param {?} sanitisedValue
4640
+ * @return {?}
4641
+ */
4642
+ Array.prototype.hasChanged = /**
4643
+ * @protected
4644
+ * @param {?} initialValue
4645
+ * @param {?} sanitisedValue
4646
+ * @return {?}
4647
+ */
4648
+ function (initialValue, sanitisedValue) {
4649
+ return initialValue !== sanitisedValue;
4650
+ };
4651
+ /**
4652
+ * @param {?} dest
4653
+ * @return {?}
4654
+ */
4655
+ Array.prototype.injectRouteParam = /**
4656
+ * @param {?} dest
4657
+ * @return {?}
4658
+ */
4659
+ function (dest) {
4660
+ var _this = this;
4661
+ dest[this.parameterDef.name] = this.sanitisedValue.map((/**
4662
+ * @param {?} v
4663
+ * @return {?}
4664
+ */
4665
+ function (v) { return _this.parameterDef.type.format(v); }));
4666
+ };
4667
+ return Array;
4668
+ }(Sanitiser));
4669
+ Sanitiser.Array = Array;
4670
+ })(exports.Sanitiser || (exports.Sanitiser = {}));
4058
4671
 
4059
4672
  exports.ACTIVITY_DATA = ACTIVITY_DATA;
4060
4673
  exports.AbstractActivity = AbstractActivity;
4061
4674
  exports.AbstractInputComponent = AbstractInputComponent;
4062
- exports.ActivityContainerComponent = exports.ɵq;
4063
- exports.ActivityOutletComponent = exports.ɵr;
4675
+ exports.AbstractPlaceNavigationComponent = AbstractPlaceNavigationComponent;
4676
+ exports.ActivityContainerComponent = exports.ɵt;
4677
+ exports.ActivityOutletComponent = exports.ɵu;
4064
4678
  exports.AlertDialogComponent = AlertDialogComponent;
4065
4679
  exports.AngularUiPowerupsModule = AngularUiPowerupsModule;
4066
4680
  exports.BusyOverlayComponent = BusyOverlayComponent;
4067
4681
  exports.CommandDirective = CommandDirective;
4068
4682
  exports.ConfirmationDialogComponent = ConfirmationDialogComponent;
4069
4683
  exports.DEFINITION_META_DATA_KEY = DEFINITION_META_DATA_KEY;
4684
+ exports.DefaultParameterSanitiser = DefaultParameterSanitiser;
4070
4685
  exports.DialogInteractionService = DialogInteractionService;
4071
4686
  exports.Dimension = Dimension;
4072
4687
  exports.DisposableComponent = DisposableComponent;
@@ -4077,6 +4692,7 @@
4077
4692
  exports.InteractionModule = InteractionModule;
4078
4693
  exports.LEFT_RIGHT_PLACE_ANIMATION = LEFT_RIGHT_PLACE_ANIMATION;
4079
4694
  exports.LeavePlaceGuard = LeavePlaceGuard;
4695
+ exports.ListPlaceNavComponent = ListPlaceNavComponent;
4080
4696
  exports.NumberInputComponent = NumberInputComponent;
4081
4697
  exports.PasswordInputComponent = PasswordInputComponent;
4082
4698
  exports.Place = Place;
@@ -4085,8 +4701,8 @@
4085
4701
  exports.PlaceRouteGuard = PlaceRouteGuard;
4086
4702
  exports.PlaceService = PlaceService;
4087
4703
  exports.Point = Point;
4704
+ exports.ROUTE_PARAMETER_LIST_KEY = ROUTE_PARAMETER_LIST_KEY;
4088
4705
  exports.ResizeAwareComponent = ResizeAwareComponent;
4089
- exports.ResolvedRouteParameterSnapshot = ResolvedRouteParameterSnapshot;
4090
4706
  exports.RouteId = RouteId;
4091
4707
  exports.RouteParameter = RouteParameter;
4092
4708
  exports.RouteParameterList = RouteParameterList;
@@ -4094,10 +4710,12 @@
4094
4710
  exports.SelectInputComponent = SelectInputComponent;
4095
4711
  exports.StringInputComponent = StringInputComponent;
4096
4712
  exports.TabbedPlaceNavigationComponent = TabbedPlaceNavigationComponent;
4097
- exports.VisitSnapshot = VisitSnapshot;
4713
+ exports.leftRightPlaceAnimation = leftRightPlaceAnimation;
4098
4714
  exports.slideDownAndUpAnimation = slideDownAndUpAnimation;
4099
4715
  exports.ɵa = CommandDirective;
4100
4716
  exports.ɵb = FocusBindingDirective;
4717
+ exports.ɵbb = DialogInteractionService;
4718
+ exports.ɵbc = InteractionContext;
4101
4719
  exports.ɵc = DisposableComponent;
4102
4720
  exports.ɵd = NumberInputComponent;
4103
4721
  exports.ɵe = AbstractInputComponent;
@@ -4108,16 +4726,17 @@
4108
4726
  exports.ɵj = EmptyStateComponent;
4109
4727
  exports.ɵk = BusyOverlayComponent;
4110
4728
  exports.ɵl = PlaceOutletComponent;
4111
- exports.ɵm = LEFT_RIGHT_PLACE_ANIMATION;
4112
- exports.ɵn = PlaceService;
4113
- exports.ɵo = TabbedPlaceNavigationComponent;
4114
- exports.ɵp = InteractionModule;
4115
- exports.ɵs = ConfirmationDialogComponent;
4116
- exports.ɵt = AbstractActivity;
4117
- exports.ɵu = ACTIVITY_DATA;
4118
- exports.ɵw = AlertDialogComponent;
4119
- exports.ɵy = DialogInteractionService;
4120
- exports.ɵz = InteractionContext;
4729
+ exports.ɵm = leftRightPlaceAnimation;
4730
+ exports.ɵn = LEFT_RIGHT_PLACE_ANIMATION;
4731
+ exports.ɵo = PlaceService;
4732
+ exports.ɵp = TabbedPlaceNavigationComponent;
4733
+ exports.ɵq = AbstractPlaceNavigationComponent;
4734
+ exports.ɵr = ListPlaceNavComponent;
4735
+ exports.ɵs = InteractionModule;
4736
+ exports.ɵv = ConfirmationDialogComponent;
4737
+ exports.ɵw = AbstractActivity;
4738
+ exports.ɵx = ACTIVITY_DATA;
4739
+ exports.ɵz = AlertDialogComponent;
4121
4740
 
4122
4741
  Object.defineProperty(exports, '__esModule', { value: true });
4123
4742