@coolon/angular-ui-powerups 0.0.7 → 0.0.9

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 (54) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +552 -159
  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 +12 -11
  6. package/coolon-angular-ui-powerups.metadata.json +1 -1
  7. package/esm2015/coolon-angular-ui-powerups.js +12 -11
  8. package/esm2015/index.js +2 -2
  9. package/esm2015/lib/components/forms/abstract-input.component.js +8 -3
  10. package/esm2015/lib/directives/command.directive.js +48 -4
  11. package/esm2015/lib/directives/focus-binding.directive.js +30 -14
  12. package/esm2015/lib/interaction/components/alert-dialog/alert-dialog.component.js +1 -1
  13. package/esm2015/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +1 -1
  14. package/esm2015/lib/place/components/empty-state/empty-state.component.js +1 -1
  15. package/esm2015/lib/place/components/nav/nav.component.js +31 -0
  16. package/esm2015/lib/place/guards/place-route.guard.js +3 -3
  17. package/esm2015/lib/place/index.js +4 -3
  18. package/esm2015/lib/place/place.module.js +16 -5
  19. package/esm2015/lib/place/route/parameter-decorators.js +77 -2
  20. package/esm2015/lib/place/route/parameter-definition.class.js +4 -2
  21. package/esm2015/lib/place/route/route-parameter-bindings.js +25 -13
  22. package/esm2015/lib/place/route/route-parameter-sanitiser.js +206 -74
  23. package/esm2015/public_api.js +2 -2
  24. package/esm5/coolon-angular-ui-powerups.js +12 -11
  25. package/esm5/index.js +2 -2
  26. package/esm5/lib/components/forms/abstract-input.component.js +8 -3
  27. package/esm5/lib/directives/command.directive.js +52 -4
  28. package/esm5/lib/directives/focus-binding.directive.js +34 -14
  29. package/esm5/lib/interaction/components/alert-dialog/alert-dialog.component.js +1 -1
  30. package/esm5/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +1 -1
  31. package/esm5/lib/place/components/empty-state/empty-state.component.js +1 -1
  32. package/esm5/lib/place/components/nav/nav.component.js +36 -0
  33. package/esm5/lib/place/guards/place-route.guard.js +3 -3
  34. package/esm5/lib/place/index.js +4 -3
  35. package/esm5/lib/place/place.module.js +16 -5
  36. package/esm5/lib/place/route/parameter-decorators.js +77 -2
  37. package/esm5/lib/place/route/parameter-definition.class.js +4 -2
  38. package/esm5/lib/place/route/route-parameter-bindings.js +25 -13
  39. package/esm5/lib/place/route/route-parameter-sanitiser.js +284 -92
  40. package/esm5/public_api.js +2 -2
  41. package/fesm2015/coolon-angular-ui-powerups.js +436 -112
  42. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  43. package/fesm5/coolon-angular-ui-powerups.js +521 -130
  44. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  45. package/lib/components/forms/abstract-input.component.d.ts +7 -7
  46. package/lib/directives/command.directive.d.ts +6 -3
  47. package/lib/directives/focus-binding.directive.d.ts +1 -0
  48. package/lib/place/components/nav/nav.component.d.ts +7 -0
  49. package/lib/place/index.d.ts +1 -0
  50. package/lib/place/route/parameter-decorators.d.ts +17 -0
  51. package/lib/place/route/parameter-definition.class.d.ts +4 -3
  52. package/lib/place/route/route-parameter-sanitiser.d.ts +33 -6
  53. package/package.json +2 -2
  54. package/styles/styles.scss +15 -0
@@ -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('@angular/material/dialog'), require('@angular/router'), require('@angular/animations'), require('resize-observer-polyfill'), require('@typescript-plus/fast-memoize-decorator'), require('lodash'), require('reflect-metadata'), require('@coolon/typescript-utilities'), 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', '@angular/material/dialog', '@angular/router', '@angular/animations', 'resize-observer-polyfill', '@typescript-plus/fast-memoize-decorator', 'lodash', 'reflect-metadata', '@coolon/typescript-utilities', '@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.ng.material.dialog, global.ng.router, global.ng.animations, global.ResizeObserver, global.fastMemoizeDecorator, global.lodash, null, global.typescriptUtilities, global.src));
5
- }(this, function (exports, common, core, forms, material, platformBrowser, animations, pectin, portal, deferred_class, dialog, router, animations$1, ResizeObserver, fastMemoizeDecorator, lodash, reflectMetadata, typescriptUtilities, 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'), require('@angular/platform-browser/animations'), require('@coolon/pectin'), require('@angular/cdk/portal'), require('@coolon/pectin/lib/promise/deferred.class'), require('@angular/material/dialog'), require('@angular/material/list'), require('@angular/material/tabs'), require('@angular/material/tooltip'), require('@angular/router'), require('@angular/animations'), require('resize-observer-polyfill'), require('@typescript-plus/fast-memoize-decorator'), require('lodash'), require('reflect-metadata'), require('@coolon/typescript-utilities'), 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', '@angular/material/dialog', '@angular/material/list', '@angular/material/tabs', '@angular/material/tooltip', '@angular/router', '@angular/animations', 'resize-observer-polyfill', '@typescript-plus/fast-memoize-decorator', 'lodash', 'reflect-metadata', '@coolon/typescript-utilities', '@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.ng.material.dialog, global.ng.material.list, global.ng.material.tabs, global.ng.material.tooltip, global.ng.router, global.ng.animations, global.ResizeObserver, global.fastMemoizeDecorator, global.lodash, null, global.typescriptUtilities, global.src));
5
+ }(this, function (exports, common, core, forms, material, platformBrowser, animations, pectin, portal, deferred_class, dialog, list, tabs, tooltip, router, animations$1, ResizeObserver, fastMemoizeDecorator, lodash, reflectMetadata, typescriptUtilities, src) { 'use strict';
6
6
 
7
7
  ResizeObserver = ResizeObserver && ResizeObserver.hasOwnProperty('default') ? ResizeObserver['default'] : ResizeObserver;
8
8
 
@@ -238,9 +238,14 @@
238
238
  __extends(AbstractInputComponent, _super);
239
239
  function AbstractInputComponent() {
240
240
  var _this = _super.call(this) || this;
241
+ // TODO: fix this.
242
+ // tslint:disable-next-line:no-output-native
241
243
  _this.focus = new core.EventEmitter();
244
+ // tslint:disable-next-line:no-output-native
242
245
  _this.blur = new core.EventEmitter();
246
+ // tslint:disable-next-line:no-output-native
243
247
  _this.enterKey = new core.EventEmitter();
248
+ // tslint:disable-next-line:no-output-native
244
249
  _this.escapeKey = new core.EventEmitter();
245
250
  /** @type {?} */
246
251
  var self = _this;
@@ -316,7 +321,7 @@
316
321
  * @return {?}
317
322
  */
318
323
  function (command) {
319
- if (command && command.isEnabled()) {
324
+ if (command && command.enabled.value) {
320
325
  command.execute();
321
326
  }
322
327
  };
@@ -469,13 +474,35 @@
469
474
  * @fileoverview added by tsickle
470
475
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
471
476
  */
477
+ /**
478
+ * @template P
479
+ */
472
480
  var CommandDirective = /** @class */ (function (_super) {
473
481
  __extends(CommandDirective, _super);
474
482
  function CommandDirective(elementRef) {
475
483
  var _this = _super.call(this) || this;
476
484
  _this.elementRef = elementRef;
485
+ _this._commandParameterProvided = false;
477
486
  return _this;
478
487
  }
488
+ Object.defineProperty(CommandDirective.prototype, "commandParameter", {
489
+ get: /**
490
+ * @return {?}
491
+ */
492
+ function () {
493
+ return this._commandParameter;
494
+ },
495
+ set: /**
496
+ * @param {?} value
497
+ * @return {?}
498
+ */
499
+ function (value) {
500
+ this._commandParameterProvided = true;
501
+ this._commandParameter = value;
502
+ },
503
+ enumerable: true,
504
+ configurable: true
505
+ });
479
506
  /**
480
507
  * @return {?}
481
508
  */
@@ -484,6 +511,16 @@
484
511
  */
485
512
  function () {
486
513
  pectin.assert.notNil(this.pectinCommand);
514
+ if (this.pectinCommand instanceof pectin.UnaryCommand) {
515
+ if (!this._commandParameterProvided) {
516
+ pectin.lang.illegalState('UnaryCommands required the command parameter to be specified.');
517
+ }
518
+ }
519
+ else {
520
+ if (this._commandParameterProvided) {
521
+ pectin.lang.illegalState('command parameters are only supported by UnaryCommands');
522
+ }
523
+ }
487
524
  };
488
525
  /**
489
526
  * @return {?}
@@ -535,8 +572,13 @@
535
572
  function ($event) {
536
573
  $event.preventDefault();
537
574
  $event.stopPropagation();
538
- if (this.pectinCommand.isEnabled()) {
539
- this.pectinCommand.execute({ event: $event });
575
+ if (this.pectinCommand.enabled.value) {
576
+ if (this.pectinCommand instanceof pectin.UnaryCommand) {
577
+ this.pectinCommand.withContext({ event: $event }).execute(this.commandParameter);
578
+ }
579
+ else {
580
+ this.pectinCommand.withContext({ event: $event }).execute();
581
+ }
540
582
  }
541
583
  else {
542
584
  console.warn('disabled command clicked, ignoring.');
@@ -554,6 +596,7 @@
554
596
  ]; };
555
597
  CommandDirective.propDecorators = {
556
598
  pectinCommand: [{ type: core.Input }],
599
+ commandParameter: [{ type: core.Input }],
557
600
  notifyClick: [{ type: core.HostListener, args: ['click', ['$event'],] }]
558
601
  };
559
602
  return CommandDirective;
@@ -561,6 +604,16 @@
561
604
  if (false) {
562
605
  /** @type {?} */
563
606
  CommandDirective.prototype.pectinCommand;
607
+ /**
608
+ * @type {?}
609
+ * @private
610
+ */
611
+ CommandDirective.prototype._commandParameter;
612
+ /**
613
+ * @type {?}
614
+ * @private
615
+ */
616
+ CommandDirective.prototype._commandParameterProvided;
564
617
  /**
565
618
  * @type {?}
566
619
  * @private
@@ -589,7 +642,9 @@
589
642
  * @return {?}
590
643
  */
591
644
  function () {
592
- this.pectinFocusBinding.focusCallbacks.notifyFocusIn();
645
+ if (this.hasBinding()) {
646
+ this.pectinFocusBinding.focusCallbacks.notifyFocusIn();
647
+ }
593
648
  };
594
649
  /**
595
650
  * @return {?}
@@ -598,7 +653,9 @@
598
653
  * @return {?}
599
654
  */
600
655
  function () {
601
- this.pectinFocusBinding.focusCallbacks.notifyFocusOut();
656
+ if (this.hasBinding()) {
657
+ this.pectinFocusBinding.focusCallbacks.notifyFocusOut();
658
+ }
602
659
  };
603
660
  /**
604
661
  * @return {?}
@@ -617,16 +674,32 @@
617
674
  function () {
618
675
  var _this = this;
619
676
  // TODO: Make this also track the current enabled/disabled state.
620
- var chain = pectin.Dsl.disposeWith(this).chain;
621
- chain.value(this.pectinFocusBinding.focused).subscribe((/**
622
- * @param {?} focused
623
- * @return {?}
624
- */
625
- function (focused) {
626
- if (focused && !_this.alreadyHasFocus()) {
627
- _this.tryAndFocus();
628
- }
629
- }));
677
+ if (this.hasBinding()) {
678
+ var chain = pectin.Dsl.disposeWith(this).chain;
679
+ chain.value(this.pectinFocusBinding.focused).subscribe((/**
680
+ * @param {?} focused
681
+ * @return {?}
682
+ */
683
+ function (focused) {
684
+ if (focused && !_this.alreadyHasFocus()) {
685
+ _this.tryAndFocus();
686
+ }
687
+ }));
688
+ }
689
+ else {
690
+ pectin.Logger.get(this).warn("pectinFocusBinding was nil");
691
+ }
692
+ };
693
+ /**
694
+ * @private
695
+ * @return {?}
696
+ */
697
+ FocusBindingDirective.prototype.hasBinding = /**
698
+ * @private
699
+ * @return {?}
700
+ */
701
+ function () {
702
+ return this.pectinFocusBinding && this.pectinFocusBinding.focused;
630
703
  };
631
704
  // Hook method for debugging via tracing.
632
705
  // Hook method for debugging via tracing.
@@ -711,7 +784,7 @@
711
784
  * @return {?}
712
785
  */
713
786
  function () {
714
- return this.pectinFocusBinding.focused.value;
787
+ return this.hasBinding() && this.pectinFocusBinding.focused.value;
715
788
  };
716
789
  // Hook method for debugging via tracing.
717
790
  // Hook method for debugging via tracing.
@@ -1148,7 +1221,7 @@
1148
1221
  { type: core.Component, args: [{
1149
1222
  selector: 'angular-ui-powerups-alert-dialog',
1150
1223
  template: "<h3 matDialogTitle *ngIf=\"alert.title\">{{alert.title()}}</h3>\n<div matDialogContent>\n <p *ngFor=\"let line of alert.content()\">{{line}}</p>\n</div>\n<p matDialogActions>\n <button mat-raised-button color=\"primary\" (click)=\"done()\">{{alert.ok()}}</button>\n</p>\n",
1151
- styles: [":host{display:block;padding:var(--default-padding)}.mat-dialog-actions{justify-content:flex-end}"]
1224
+ styles: [":host{display:block;padding:var(--angular-ui-powerups-default-padding)}.mat-dialog-actions{justify-content:flex-end}"]
1152
1225
  }] }
1153
1226
  ];
1154
1227
  /** @nocollapse */
@@ -1196,7 +1269,7 @@
1196
1269
  { type: core.Component, args: [{
1197
1270
  selector: 'angular-ui-powerups-confirmation-dialog',
1198
1271
  template: "<h3 matDialogTitle *ngIf=\"confirm.title\">{{confirm.title()}}</h3>\n<div matDialogContent>\n <p *ngFor=\"let line of confirm.content()\">{{line}}</p>\n</div>\n<p matDialogActions>\n <button mat-button (click)=\"cancel()\">{{confirm.cancel()}}</button>\n <button mat-raised-button [color]=\"isDestructive() ? 'warn' : 'primary'\" (click)=\"done(true)\">{{confirm.ok()}}</button>\n</p>\n\n",
1199
- styles: [":host{display:block;padding:var(--default-padding)}.mat-dialog-actions{justify-content:flex-end}"]
1272
+ styles: [":host{display:block;padding:var(--angular-ui-powerups-default-padding)}.mat-dialog-actions{justify-content:flex-end}"]
1200
1273
  }] }
1201
1274
  ];
1202
1275
  /** @nocollapse */
@@ -1214,7 +1287,7 @@
1214
1287
  * @fileoverview added by tsickle
1215
1288
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1216
1289
  */
1217
- exports.ɵo = /** @class */ (function (_super) {
1290
+ exports.ɵp = /** @class */ (function (_super) {
1218
1291
  __extends(ActivityContainerComponent, _super);
1219
1292
  function ActivityContainerComponent() {
1220
1293
  var _this = _super.call(this) || this;
@@ -1349,18 +1422,18 @@
1349
1422
  }(DisposableComponent));
1350
1423
  if (false) {
1351
1424
  /** @type {?} */
1352
- exports.ɵo.prototype.parentInteractionContext;
1425
+ exports.ɵp.prototype.parentInteractionContext;
1353
1426
  /** @type {?} */
1354
- exports.ɵo.prototype.initialActivity;
1427
+ exports.ɵp.prototype.initialActivity;
1355
1428
  /** @type {?} */
1356
- exports.ɵo.prototype.tabs;
1429
+ exports.ɵp.prototype.tabs;
1357
1430
  /** @type {?} */
1358
- exports.ɵo.prototype.activityTabs;
1431
+ exports.ɵp.prototype.activityTabs;
1359
1432
  /**
1360
1433
  * @type {?}
1361
1434
  * @private
1362
1435
  */
1363
- exports.ɵo.prototype.obsoleteTabs;
1436
+ exports.ɵp.prototype.obsoleteTabs;
1364
1437
  }
1365
1438
  (function (ActivityContainerComponent) {
1366
1439
  /**
@@ -1379,7 +1452,7 @@
1379
1452
  /** @type {?} */
1380
1453
  ActivityContext.prototype.onCancel;
1381
1454
  }
1382
- })(exports.ɵo || (exports.ɵo = {}));
1455
+ })(exports.ɵp || (exports.ɵp = {}));
1383
1456
 
1384
1457
  /**
1385
1458
  * @fileoverview added by tsickle
@@ -1388,7 +1461,7 @@
1388
1461
  /**
1389
1462
  * @template D, R, E
1390
1463
  */
1391
- exports.ɵv = /** @class */ (function () {
1464
+ exports.ɵw = /** @class */ (function () {
1392
1465
  function ActivityOutletComponent(componentFactoryResolver, viewContainerRef, injector) {
1393
1466
  this.componentFactoryResolver = componentFactoryResolver;
1394
1467
  this.viewContainerRef = viewContainerRef;
@@ -1499,27 +1572,27 @@
1499
1572
  }());
1500
1573
  if (false) {
1501
1574
  /** @type {?} */
1502
- exports.ɵv.prototype.interactionContext;
1575
+ exports.ɵw.prototype.interactionContext;
1503
1576
  /**
1504
1577
  * @type {?}
1505
1578
  * @private
1506
1579
  */
1507
- exports.ɵv.prototype.activityComponent;
1580
+ exports.ɵw.prototype.activityComponent;
1508
1581
  /**
1509
1582
  * @type {?}
1510
1583
  * @private
1511
1584
  */
1512
- exports.ɵv.prototype.componentFactoryResolver;
1585
+ exports.ɵw.prototype.componentFactoryResolver;
1513
1586
  /**
1514
1587
  * @type {?}
1515
1588
  * @private
1516
1589
  */
1517
- exports.ɵv.prototype.viewContainerRef;
1590
+ exports.ɵw.prototype.viewContainerRef;
1518
1591
  /**
1519
1592
  * @type {?}
1520
1593
  * @private
1521
1594
  */
1522
- exports.ɵv.prototype.injector;
1595
+ exports.ɵw.prototype.injector;
1523
1596
  /* Skipping unhandled member: ;*/
1524
1597
  }
1525
1598
  (function (ActivityOutletComponent) {
@@ -1580,7 +1653,7 @@
1580
1653
  */
1581
1654
  OutletInteractionContext.prototype.context;
1582
1655
  }
1583
- })(exports.ɵv || (exports.ɵv = {}));
1656
+ })(exports.ɵw || (exports.ɵw = {}));
1584
1657
 
1585
1658
  /**
1586
1659
  * @fileoverview added by tsickle
@@ -1635,7 +1708,7 @@
1635
1708
  autoFocus: false
1636
1709
  };
1637
1710
  /** @type {?} */
1638
- var matDialogRef = (/** @type {?} */ (this.dialogService.open(exports.ɵo, config)));
1711
+ var matDialogRef = (/** @type {?} */ (this.dialogService.open(exports.ɵp, config)));
1639
1712
  return new Promise((/**
1640
1713
  * @param {?} resolve
1641
1714
  * @param {?} reject
@@ -1727,13 +1800,13 @@
1727
1800
  portal.PortalModule
1728
1801
  ],
1729
1802
  declarations: [
1730
- exports.ɵo,
1803
+ exports.ɵp,
1731
1804
  ConfirmationDialogComponent,
1732
1805
  AlertDialogComponent,
1733
- exports.ɵv
1806
+ exports.ɵw
1734
1807
  ],
1735
1808
  entryComponents: [
1736
- exports.ɵo,
1809
+ exports.ɵp,
1737
1810
  ConfirmationDialogComponent,
1738
1811
  AlertDialogComponent
1739
1812
  ],
@@ -1809,7 +1882,7 @@
1809
1882
  { type: core.Component, args: [{
1810
1883
  selector: 'angular-ui-powerups-empty-state',
1811
1884
  template: "\n <div class=\"container\">\n <ng-content></ng-content>\n </div>\n ",
1812
- styles: [":host{display:flex;flex-direction:column;justify-content:center;align-items:center}.container{padding:var(--default-padding);border:2px dashed rgba(0,0,0,.2);border-radius:5px;font-size:14px;font-weight:300}"]
1885
+ styles: [":host{display:flex;flex-direction:column;justify-content:center;align-items:center}.container{padding:var(--angular-ui-powerups-default-padding);border:2px dashed rgba(0,0,0,.2);border-radius:5px;font-size:14px;font-weight:300}"]
1813
1886
  }] }
1814
1887
  ];
1815
1888
  /** @nocollapse */
@@ -1817,6 +1890,40 @@
1817
1890
  return EmptyStateComponent;
1818
1891
  }());
1819
1892
 
1893
+ /**
1894
+ * @fileoverview added by tsickle
1895
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1896
+ */
1897
+ var NavComponent = /** @class */ (function () {
1898
+ function NavComponent() {
1899
+ }
1900
+ /**
1901
+ * @return {?}
1902
+ */
1903
+ NavComponent.prototype.ngOnInit = /**
1904
+ * @return {?}
1905
+ */
1906
+ function () {
1907
+ };
1908
+ NavComponent.decorators = [
1909
+ { type: core.Component, args: [{
1910
+ selector: 'angular-ui-powerups-nav',
1911
+ template: "<nav mat-tab-nav-bar>\n <a mat-tab-link *ngFor=\"let place of places\" [routerLink]='place.path'\n routerLinkActive #rla=\"routerLinkActive\"\n [active]=\"rla.isActive\"\n [matTooltip]=\"place.title\">{{place.title}}</a>\n</nav>\n\n",
1912
+ styles: [""]
1913
+ }] }
1914
+ ];
1915
+ /** @nocollapse */
1916
+ NavComponent.ctorParameters = function () { return []; };
1917
+ NavComponent.propDecorators = {
1918
+ places: [{ type: core.Input }]
1919
+ };
1920
+ return NavComponent;
1921
+ }());
1922
+ if (false) {
1923
+ /** @type {?} */
1924
+ NavComponent.prototype.places;
1925
+ }
1926
+
1820
1927
  /**
1821
1928
  * @fileoverview added by tsickle
1822
1929
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
@@ -1957,19 +2064,25 @@
1957
2064
  { type: core.NgModule, args: [{
1958
2065
  imports: [
1959
2066
  common.CommonModule,
2067
+ animations.BrowserAnimationsModule,
1960
2068
  material.MatProgressSpinnerModule,
1961
- router.RouterModule
2069
+ router.RouterModule,
2070
+ tabs.MatTabsModule,
2071
+ list.MatListModule,
2072
+ tooltip.MatTooltipModule
1962
2073
  ],
1963
2074
  declarations: [
1964
2075
  EmptyStateComponent,
1965
2076
  BusyOverlayComponent,
1966
- PlaceOutletComponent
2077
+ PlaceOutletComponent,
2078
+ NavComponent
1967
2079
  ],
1968
2080
  entryComponents: [BusyOverlayComponent],
1969
2081
  exports: [
1970
2082
  BusyOverlayComponent,
1971
2083
  PlaceOutletComponent,
1972
- EmptyStateComponent
2084
+ EmptyStateComponent,
2085
+ NavComponent
1973
2086
  ],
1974
2087
  providers: [
1975
2088
  PlaceService
@@ -2460,7 +2573,7 @@
2460
2573
  function ResolvedParameter() { }
2461
2574
  if (false) {
2462
2575
  /** @type {?} */
2463
- ResolvedParameter.prototype.parameter;
2576
+ ResolvedParameter.prototype.parameterDef;
2464
2577
  /** @type {?} */
2465
2578
  ResolvedParameter.prototype.resolvedValue;
2466
2579
  }
@@ -2484,7 +2597,7 @@
2484
2597
  * @param {?} p
2485
2598
  * @return {?}
2486
2599
  */
2487
- function (p) { return p.parameter === parameter; }));
2600
+ function (p) { return p.parameterDef === parameter; }));
2488
2601
  return resolved ? resolved.resolvedValue : null;
2489
2602
  };
2490
2603
  /**
@@ -2504,8 +2617,8 @@
2504
2617
  * @param {?} p
2505
2618
  * @return {?}
2506
2619
  */
2507
- function (p) { return p.parameter !== parameter; })).concat({
2508
- parameter: parameter,
2620
+ function (p) { return p.parameterDef !== parameter; })).concat({
2621
+ parameterDef: parameter,
2509
2622
  resolvedValue: value
2510
2623
  }));
2511
2624
  };
@@ -2520,7 +2633,7 @@
2520
2633
  function () {
2521
2634
  /** @type {?} */
2522
2635
  var routeIdParam = this.getRouteIdParam();
2523
- return routeIdParam ? routeIdParam.parameter.type.format(routeIdParam.resolvedValue) : null;
2636
+ return routeIdParam ? routeIdParam.parameterDef.type.format(routeIdParam.resolvedValue) : null;
2524
2637
  };
2525
2638
  /**
2526
2639
  * @private
@@ -2535,7 +2648,7 @@
2535
2648
  * @param {?} p
2536
2649
  * @return {?}
2537
2650
  */
2538
- function (p) { return p.parameter.isRouteId; }));
2651
+ function (p) { return p.parameterDef.isRouteId; }));
2539
2652
  };
2540
2653
  /**
2541
2654
  * @protected
@@ -2553,12 +2666,12 @@
2553
2666
  * @param {?} p
2554
2667
  * @return {?}
2555
2668
  */
2556
- function (p) { return !p.parameter.isRouteId; })).forEach((/**
2669
+ function (p) { return !p.parameterDef.isRouteId; })).forEach((/**
2557
2670
  * @param {?} p
2558
2671
  * @return {?}
2559
2672
  */
2560
2673
  function (p) {
2561
- params[p.parameter.name] = p.parameter.type.format(p.resolvedValue);
2674
+ params[p.parameterDef.name] = p.parameterDef.type.format(p.resolvedValue);
2562
2675
  }));
2563
2676
  return params;
2564
2677
  };
@@ -2591,7 +2704,7 @@
2591
2704
  /** @type {?} */
2592
2705
  var path = routeId ? [relativePath, routeId, this.getFormattedParameters()] : [relativePath, this.getFormattedParameters()];
2593
2706
  router.navigate(path, {
2594
- relativeTo: activatedRoute,
2707
+ relativeTo: activatedRoute
2595
2708
  });
2596
2709
  };
2597
2710
  __decorate([
@@ -2648,11 +2761,23 @@
2648
2761
  /** @type {?} */
2649
2762
  var result = [];
2650
2763
  routeParameterDefs.forEach((/**
2651
- * @param {?} parameter
2764
+ * @param {?} parameterDef
2652
2765
  * @return {?}
2653
2766
  */
2654
- function (parameter) {
2655
- result.push({ parameter: parameter, resolvedValue: parameter.type.parse(params.get(parameter.name)) });
2767
+ function (parameterDef) {
2768
+ /** @type {?} */
2769
+ var resolvedValue;
2770
+ if (parameterDef.isArray) {
2771
+ resolvedValue = params.getAll(parameterDef.name).map((/**
2772
+ * @param {?} v
2773
+ * @return {?}
2774
+ */
2775
+ function (v) { return parameterDef.type.parse(v); }));
2776
+ }
2777
+ else {
2778
+ resolvedValue = parameterDef.type.parse(params.get(parameterDef.name));
2779
+ }
2780
+ result.push({ parameterDef: parameterDef, resolvedValue: resolvedValue });
2656
2781
  }));
2657
2782
  return new ResolvedParameters(result);
2658
2783
  }));
@@ -2903,41 +3028,162 @@
2903
3028
  * @fileoverview added by tsickle
2904
3029
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2905
3030
  */
3031
+ /**
3032
+ * @abstract
3033
+ * @template T, S
3034
+ */
3035
+ /**
3036
+ * @abstract
3037
+ * @template T, S
3038
+ */
3039
+ exports.Sanitiser = /** @class */ (function () {
3040
+ function Sanitiser(parameterDef, snapshot, sanitiser) {
3041
+ this.parameterDef = parameterDef;
3042
+ this.snapshot = snapshot;
3043
+ this.sanitiser = sanitiser;
3044
+ }
3045
+ /**
3046
+ * @return {?}
3047
+ */
3048
+ Sanitiser.prototype.isRouteId = /**
3049
+ * @return {?}
3050
+ */
3051
+ function () {
3052
+ return this.parameterDef.isRouteId;
3053
+ };
3054
+ Object.defineProperty(Sanitiser.prototype, "valueChanged", {
3055
+ get: /**
3056
+ * @return {?}
3057
+ */
3058
+ function () {
3059
+ return !lodash.isNil(this.initialValue) && this.hasChanged(this.initialValue, this.sanitisedValue);
3060
+ },
3061
+ enumerable: true,
3062
+ configurable: true
3063
+ });
3064
+ Object.defineProperty(Sanitiser.prototype, "sanitisedValue", {
3065
+ get: /**
3066
+ * @return {?}
3067
+ */
3068
+ function () {
3069
+ return this._sanitisedValue;
3070
+ },
3071
+ enumerable: true,
3072
+ configurable: true
3073
+ });
3074
+ /**
3075
+ * @return {?}
3076
+ */
3077
+ Sanitiser.prototype.sanitize = /**
3078
+ * @return {?}
3079
+ */
3080
+ function () {
3081
+ return __awaiter(this, void 0, void 0, function () {
3082
+ var _a;
3083
+ return __generator(this, function (_b) {
3084
+ switch (_b.label) {
3085
+ case 0:
3086
+ if (!this.sanitiser) return [3 /*break*/, 2];
3087
+ this.initialValue = this.readFrom(this.snapshot);
3088
+ _a = this;
3089
+ return [4 /*yield*/, this.sanitiser.sanitise(this.initialValue)];
3090
+ case 1:
3091
+ _a._sanitisedValue = _b.sent();
3092
+ if (this.initialValue !== this._sanitisedValue) {
3093
+ return [2 /*return*/, false];
3094
+ }
3095
+ _b.label = 2;
3096
+ case 2: return [2 /*return*/, true];
3097
+ }
3098
+ });
3099
+ });
3100
+ };
3101
+ return Sanitiser;
3102
+ }());
3103
+ if (false) {
3104
+ /**
3105
+ * @type {?}
3106
+ * @private
3107
+ */
3108
+ exports.Sanitiser.prototype.initialValue;
3109
+ /**
3110
+ * @type {?}
3111
+ * @private
3112
+ */
3113
+ exports.Sanitiser.prototype._sanitisedValue;
3114
+ /** @type {?} */
3115
+ exports.Sanitiser.prototype.parameterDef;
3116
+ /** @type {?} */
3117
+ exports.Sanitiser.prototype.snapshot;
3118
+ /** @type {?} */
3119
+ exports.Sanitiser.prototype.sanitiser;
3120
+ /**
3121
+ * @abstract
3122
+ * @protected
3123
+ * @param {?} snapshot
3124
+ * @return {?}
3125
+ */
3126
+ exports.Sanitiser.prototype.readFrom = function (snapshot) { };
3127
+ /**
3128
+ * @abstract
3129
+ * @protected
3130
+ * @param {?} initialValue
3131
+ * @param {?} sanitisedValue
3132
+ * @return {?}
3133
+ */
3134
+ exports.Sanitiser.prototype.hasChanged = function (initialValue, sanitisedValue) { };
3135
+ /**
3136
+ * @abstract
3137
+ * @param {?} dest
3138
+ * @return {?}
3139
+ */
3140
+ exports.Sanitiser.prototype.injectRouteParam = function (dest) { };
3141
+ }
2906
3142
  var RouteParameterSanitiser = /** @class */ (function () {
2907
- function RouteParameterSanitiser(parameterDefs, injector) {
3143
+ function RouteParameterSanitiser(parameterDefs, snapshot, injector) {
3144
+ var _this = this;
2908
3145
  this.parameterDefs = parameterDefs;
3146
+ this.snapshot = snapshot;
2909
3147
  this.injector = injector;
2910
- this.sanitisedParameters = [];
2911
- this.routeParameter = parameterDefs.find((/**
3148
+ this.parameterSanitisers = [];
3149
+ /** @type {?} */
3150
+ var sanitisers = parameterDefs.map((/**
3151
+ * @param {?} def
3152
+ * @return {?}
3153
+ */
3154
+ function (def) {
3155
+ return def.isArray ?
3156
+ new exports.Sanitiser.Array(def, snapshot, _this.getSanitiser(def)) :
3157
+ new exports.Sanitiser.Value(def, snapshot, _this.getSanitiser(def));
3158
+ }));
3159
+ this.routeIdSanitiser = sanitisers.find((/**
2912
3160
  * @param {?} p
2913
3161
  * @return {?}
2914
3162
  */
2915
- function (p) { return p.isRouteId; }));
2916
- this.queryParameters = parameterDefs.filter((/**
3163
+ function (p) { return p.isRouteId(); }));
3164
+ this.parameterSanitisers = sanitisers.filter((/**
2917
3165
  * @param {?} p
2918
3166
  * @return {?}
2919
3167
  */
2920
- function (p) { return !p.isRouteId; }));
3168
+ function (p) { return !p.isRouteId(); }));
2921
3169
  }
2922
3170
  /**
2923
- * @param {?} snapshot
2924
3171
  * @return {?}
2925
3172
  */
2926
3173
  RouteParameterSanitiser.prototype.sanitise = /**
2927
- * @param {?} snapshot
2928
3174
  * @return {?}
2929
3175
  */
2930
- function (snapshot) {
3176
+ function () {
2931
3177
  return __awaiter(this, void 0, void 0, function () {
2932
- var e_1, _a, routeOk, _b, _c, param, e_1_1;
3178
+ var e_1, _a, _b, _c, sanitiser, e_1_1;
2933
3179
  return __generator(this, function (_d) {
2934
3180
  switch (_d.label) {
2935
3181
  case 0:
2936
- if (!this.routeParameter) return [3 /*break*/, 2];
2937
- return [4 /*yield*/, this.sanitiseParameter(this.routeParameter, snapshot.paramMap.get(this.routeParameter.name))];
3182
+ if (!this.routeIdSanitiser) return [3 /*break*/, 2];
3183
+ return [4 /*yield*/, this.routeIdSanitiser.sanitize()];
2938
3184
  case 1:
2939
- routeOk = _d.sent();
2940
- if (!routeOk) {
3185
+ _d.sent();
3186
+ if (this.routeIdSanitiser.valueChanged) {
2941
3187
  // if the route id isn't ok we redirect immediately as the query params may need to be sanitised in the
2942
3188
  // context of the route id.
2943
3189
  return [2 /*return*/, false];
@@ -2945,12 +3191,12 @@
2945
3191
  _d.label = 2;
2946
3192
  case 2:
2947
3193
  _d.trys.push([2, 7, 8, 9]);
2948
- _b = __values(this.queryParameters), _c = _b.next();
3194
+ _b = __values(this.parameterSanitisers), _c = _b.next();
2949
3195
  _d.label = 3;
2950
3196
  case 3:
2951
3197
  if (!!_c.done) return [3 /*break*/, 6];
2952
- param = _c.value;
2953
- return [4 /*yield*/, this.sanitiseParameter(param, snapshot.queryParamMap.get(param.name))];
3198
+ sanitiser = _c.value;
3199
+ return [4 /*yield*/, sanitiser.sanitize()];
2954
3200
  case 4:
2955
3201
  _d.sent();
2956
3202
  _d.label = 5;
@@ -2968,42 +3214,11 @@
2968
3214
  }
2969
3215
  finally { if (e_1) throw e_1.error; }
2970
3216
  return [7 /*endfinally*/];
2971
- case 9: return [2 /*return*/, this.sanitisedParameters.length === 0];
2972
- }
2973
- });
2974
- });
2975
- };
2976
- /**
2977
- * @template T
2978
- * @param {?} def
2979
- * @param {?} formattedInitialValue
2980
- * @return {?}
2981
- */
2982
- RouteParameterSanitiser.prototype.sanitiseParameter = /**
2983
- * @template T
2984
- * @param {?} def
2985
- * @param {?} formattedInitialValue
2986
- * @return {?}
2987
- */
2988
- function (def, formattedInitialValue) {
2989
- return __awaiter(this, void 0, void 0, function () {
2990
- var sanitiser, initialValue, sanitisedValue;
2991
- return __generator(this, function (_a) {
2992
- switch (_a.label) {
2993
- case 0:
2994
- if (!def) return [3 /*break*/, 2];
2995
- sanitiser = this.getSanitiser(def);
2996
- if (!sanitiser) return [3 /*break*/, 2];
2997
- initialValue = def.type.parse(formattedInitialValue);
2998
- return [4 /*yield*/, sanitiser.sanitise(initialValue)];
2999
- case 1:
3000
- sanitisedValue = _a.sent();
3001
- if (initialValue !== sanitisedValue) {
3002
- this.sanitisedParameters.push({ def: def, value: def.type.format(sanitisedValue) });
3003
- return [2 /*return*/, false];
3004
- }
3005
- _a.label = 2;
3006
- case 2: return [2 /*return*/, true];
3217
+ case 9: return [2 /*return*/, !this.parameterSanitisers.find((/**
3218
+ * @param {?} s
3219
+ * @return {?}
3220
+ */
3221
+ function (s) { return s.valueChanged; }))];
3007
3222
  }
3008
3223
  });
3009
3224
  });
@@ -3017,57 +3232,36 @@
3017
3232
  * @return {?}
3018
3233
  */
3019
3234
  function (router) {
3020
- var _this = this;
3021
- pectin.assert.isTruthy(this.sanitisedParameters.length !== 0);
3022
- /** @type {?} */
3023
- var sanitisedRouteId = this.sanitisedParameters.find((/**
3024
- * @param {?} s
3025
- * @return {?}
3026
- */
3027
- function (s) { return s.def === _this.routeParameter; }));
3028
- if (sanitisedRouteId) {
3029
- return router.navigate(['..', sanitisedRouteId.value]);
3235
+ pectin.assert.isTruthy(this.parameterSanitisers.length !== 0);
3236
+ if (this.routeIdSanitiser.valueChanged) {
3237
+ return router.navigate(['..', this.routeIdSanitiser.sanitisedValue]);
3030
3238
  }
3031
3239
  else {
3032
3240
  /** @type {?} */
3033
- var queryParams = this.sanitisedParameters.filter((/**
3241
+ var routeParams_1 = {};
3242
+ this.parameterSanitisers.forEach((/**
3034
3243
  * @param {?} s
3035
3244
  * @return {?}
3036
3245
  */
3037
- function (s) { return s.def !== _this.routeParameter; }))
3038
- .reduce((/**
3039
- * @param {?} params
3040
- * @param {?} item
3041
- * @return {?}
3042
- */
3043
- function (params, item) {
3044
- var _a;
3045
- return (__assign({}, params, (_a = {}, _a[item.def.name] = item.value, _a)));
3046
- }), {});
3047
- return router.navigate(['.', queryParams]);
3246
+ function (s) { return s.injectRouteParam(routeParams_1); }));
3247
+ return router.navigate(['.', routeParams_1]);
3048
3248
  }
3049
3249
  };
3050
3250
  /**
3051
3251
  * @private
3052
- * @template T
3252
+ * @template T, S
3053
3253
  * @param {?} def
3054
3254
  * @return {?}
3055
3255
  */
3056
3256
  RouteParameterSanitiser.prototype.getSanitiser = /**
3057
3257
  * @private
3058
- * @template T
3258
+ * @template T, S
3059
3259
  * @param {?} def
3060
3260
  * @return {?}
3061
3261
  */
3062
3262
  function (def) {
3063
3263
  return def.sanitiser ? this.injector.get(def.sanitiser, new def.sanitiser()) : null;
3064
3264
  };
3065
- __decorate([
3066
- pectin.Trace(),
3067
- __metadata("design:type", Function),
3068
- __metadata("design:paramtypes", [Object, String]),
3069
- __metadata("design:returntype", Promise)
3070
- ], RouteParameterSanitiser.prototype, "sanitiseParameter", null);
3071
3265
  __decorate([
3072
3266
  src.Memoize(),
3073
3267
  __metadata("design:type", Function),
@@ -3081,22 +3275,139 @@
3081
3275
  * @type {?}
3082
3276
  * @private
3083
3277
  */
3084
- RouteParameterSanitiser.prototype.routeParameter;
3278
+ RouteParameterSanitiser.prototype.routeIdSanitiser;
3085
3279
  /**
3086
3280
  * @type {?}
3087
3281
  * @private
3088
3282
  */
3089
- RouteParameterSanitiser.prototype.queryParameters;
3090
- /**
3091
- * @type {?}
3092
- * @private
3093
- */
3094
- RouteParameterSanitiser.prototype.sanitisedParameters;
3283
+ RouteParameterSanitiser.prototype.parameterSanitisers;
3095
3284
  /** @type {?} */
3096
3285
  RouteParameterSanitiser.prototype.parameterDefs;
3097
3286
  /** @type {?} */
3287
+ RouteParameterSanitiser.prototype.snapshot;
3288
+ /** @type {?} */
3098
3289
  RouteParameterSanitiser.prototype.injector;
3099
3290
  }
3291
+ (function (Sanitiser) {
3292
+ /**
3293
+ * @template T
3294
+ */
3295
+ var /**
3296
+ * @template T
3297
+ */
3298
+ Value = /** @class */ (function (_super) {
3299
+ __extends(Value, _super);
3300
+ function Value() {
3301
+ return _super !== null && _super.apply(this, arguments) || this;
3302
+ }
3303
+ /**
3304
+ * @param {?} snapshot
3305
+ * @return {?}
3306
+ */
3307
+ Value.prototype.readFrom = /**
3308
+ * @param {?} snapshot
3309
+ * @return {?}
3310
+ */
3311
+ function (snapshot) {
3312
+ /** @type {?} */
3313
+ var rawValue = this.parameterDef.isRouteId ?
3314
+ snapshot.paramMap.get(this.parameterDef.name) :
3315
+ snapshot.queryParamMap.get(this.parameterDef.name);
3316
+ return this.parameterDef.type.parse(rawValue);
3317
+ };
3318
+ /**
3319
+ * @protected
3320
+ * @param {?} initialValue
3321
+ * @param {?} sanitisedValue
3322
+ * @return {?}
3323
+ */
3324
+ Value.prototype.hasChanged = /**
3325
+ * @protected
3326
+ * @param {?} initialValue
3327
+ * @param {?} sanitisedValue
3328
+ * @return {?}
3329
+ */
3330
+ function (initialValue, sanitisedValue) {
3331
+ return initialValue !== sanitisedValue;
3332
+ };
3333
+ /**
3334
+ * @param {?} dest
3335
+ * @return {?}
3336
+ */
3337
+ Value.prototype.injectRouteParam = /**
3338
+ * @param {?} dest
3339
+ * @return {?}
3340
+ */
3341
+ function (dest) {
3342
+ dest[this.parameterDef.name] = this.parameterDef.type.format(this.sanitisedValue);
3343
+ };
3344
+ return Value;
3345
+ }(Sanitiser));
3346
+ Sanitiser.Value = Value;
3347
+ /**
3348
+ * @template T
3349
+ */
3350
+ var /**
3351
+ * @template T
3352
+ */
3353
+ Array = /** @class */ (function (_super) {
3354
+ __extends(Array, _super);
3355
+ function Array() {
3356
+ return _super !== null && _super.apply(this, arguments) || this;
3357
+ }
3358
+ /**
3359
+ * @param {?} snapshot
3360
+ * @return {?}
3361
+ */
3362
+ Array.prototype.readFrom = /**
3363
+ * @param {?} snapshot
3364
+ * @return {?}
3365
+ */
3366
+ function (snapshot) {
3367
+ var _this = this;
3368
+ /** @type {?} */
3369
+ var rawValues = snapshot.queryParamMap.getAll(this.parameterDef.name);
3370
+ return rawValues.map((/**
3371
+ * @param {?} value
3372
+ * @return {?}
3373
+ */
3374
+ function (value) { return _this.parameterDef.type.parse(value); }));
3375
+ };
3376
+ /**
3377
+ * @protected
3378
+ * @param {?} initialValue
3379
+ * @param {?} sanitisedValue
3380
+ * @return {?}
3381
+ */
3382
+ Array.prototype.hasChanged = /**
3383
+ * @protected
3384
+ * @param {?} initialValue
3385
+ * @param {?} sanitisedValue
3386
+ * @return {?}
3387
+ */
3388
+ function (initialValue, sanitisedValue) {
3389
+ return initialValue !== sanitisedValue;
3390
+ };
3391
+ /**
3392
+ * @param {?} dest
3393
+ * @return {?}
3394
+ */
3395
+ Array.prototype.injectRouteParam = /**
3396
+ * @param {?} dest
3397
+ * @return {?}
3398
+ */
3399
+ function (dest) {
3400
+ var _this = this;
3401
+ dest[this.parameterDef.name] = this.sanitisedValue.map((/**
3402
+ * @param {?} v
3403
+ * @return {?}
3404
+ */
3405
+ function (v) { return _this.parameterDef.type.format(v); }));
3406
+ };
3407
+ return Array;
3408
+ }(Sanitiser));
3409
+ Sanitiser.Array = Array;
3410
+ })(exports.Sanitiser || (exports.Sanitiser = {}));
3100
3411
 
3101
3412
  /**
3102
3413
  * @fileoverview added by tsickle
@@ -3122,8 +3433,8 @@
3122
3433
  /** @type {?} */
3123
3434
  var routeParameters = typescriptUtilities.Klass.get(route.component).getMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY);
3124
3435
  /** @type {?} */
3125
- var sanitiser = new RouteParameterSanitiser(routeParameters, this.injector);
3126
- return sanitiser.sanitise(route).then((/**
3436
+ var sanitiser = new RouteParameterSanitiser(routeParameters, route, this.injector);
3437
+ return sanitiser.sanitise().then((/**
3127
3438
  * @param {?} proceed
3128
3439
  * @return {?}
3129
3440
  */
@@ -3194,6 +3505,17 @@
3194
3505
  /** @type {?|undefined} */
3195
3506
  ParameterOptions.prototype.sanitiser;
3196
3507
  }
3508
+ /**
3509
+ * @record
3510
+ * @template T
3511
+ */
3512
+ function ListParameterOptions() { }
3513
+ if (false) {
3514
+ /** @type {?|undefined} */
3515
+ ListParameterOptions.prototype.as;
3516
+ /** @type {?|undefined} */
3517
+ ListParameterOptions.prototype.listSanitiser;
3518
+ }
3197
3519
  /**
3198
3520
  * @template T
3199
3521
  * @param {?} type
@@ -3215,12 +3537,22 @@
3215
3537
  });
3216
3538
  }
3217
3539
  /**
3540
+ * @deprecated use RouteParameter instead.
3218
3541
  * @template T
3219
3542
  * @param {?} type
3220
3543
  * @param {?=} options
3221
3544
  * @return {?}
3222
3545
  */
3223
3546
  function QueryParameter(type, options) {
3547
+ return RouteParameter(type, options);
3548
+ }
3549
+ /**
3550
+ * @template T
3551
+ * @param {?} type
3552
+ * @param {?=} options
3553
+ * @return {?}
3554
+ */
3555
+ function RouteParameter(type, options) {
3224
3556
  // assert.isTruthy(type.isValid());
3225
3557
  return (/**
3226
3558
  * @param {?} prototype
@@ -3234,6 +3566,36 @@
3234
3566
  pectin.UseDelegate()(prototype, propertyKey);
3235
3567
  });
3236
3568
  }
3569
+ /**
3570
+ * @deprecated use RouteParameterList instead
3571
+ * @template E
3572
+ * @param {?} elementType
3573
+ * @param {?=} options
3574
+ * @return {?}
3575
+ */
3576
+ function QueryParameterList(elementType, options) {
3577
+ return RouteParameterList(elementType, options);
3578
+ }
3579
+ /**
3580
+ * @template E
3581
+ * @param {?} elementType
3582
+ * @param {?=} options
3583
+ * @return {?}
3584
+ */
3585
+ function RouteParameterList(elementType, options) {
3586
+ // assert.isTruthy(type.isValid());
3587
+ return (/**
3588
+ * @param {?} prototype
3589
+ * @param {?} propertyKey
3590
+ * @return {?}
3591
+ */
3592
+ function (prototype, propertyKey) {
3593
+ /** @type {?} */
3594
+ var param = createArrayDefinition(propertyKey, elementType, options);
3595
+ typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
3596
+ pectin.UseDelegate()(prototype, propertyKey);
3597
+ });
3598
+ }
3237
3599
  /**
3238
3600
  * @template T
3239
3601
  * @param {?} propertyName
@@ -3253,7 +3615,31 @@
3253
3615
  propertyName: propertyNameAsString,
3254
3616
  type: pectin.assert.notNil(type),
3255
3617
  sanitiser: opts.getOptional('sanitiser', null),
3256
- isRouteId: routeId
3618
+ isRouteId: routeId,
3619
+ isArray: false
3620
+ };
3621
+ return def;
3622
+ }
3623
+ /**
3624
+ * @template T
3625
+ * @param {?} propertyName
3626
+ * @param {?} type
3627
+ * @param {?} options
3628
+ * @return {?}
3629
+ */
3630
+ function createArrayDefinition(propertyName, type, options) {
3631
+ /** @type {?} */
3632
+ var opts = typescriptUtilities.Opts.get(options);
3633
+ /** @type {?} */
3634
+ var propertyNameAsString = pectin.assert.notNil(propertyName).toString();
3635
+ /** @type {?} */
3636
+ var def = {
3637
+ name: opts.getOptional('as', propertyNameAsString),
3638
+ propertyName: propertyNameAsString,
3639
+ type: pectin.assert.notNil(type),
3640
+ sanitiser: opts.getOptional('listSanitiser', null),
3641
+ isRouteId: false,
3642
+ isArray: true
3257
3643
  };
3258
3644
  return def;
3259
3645
  }
@@ -3264,7 +3650,7 @@
3264
3650
  */
3265
3651
  /**
3266
3652
  * @record
3267
- * @template T
3653
+ * @template E, S
3268
3654
  */
3269
3655
  function ParameterDefinition() { }
3270
3656
  if (false) {
@@ -3278,6 +3664,8 @@
3278
3664
  ParameterDefinition.prototype.sanitiser;
3279
3665
  /** @type {?} */
3280
3666
  ParameterDefinition.prototype.isRouteId;
3667
+ /** @type {?} */
3668
+ ParameterDefinition.prototype.isArray;
3281
3669
  }
3282
3670
 
3283
3671
  /**
@@ -3366,8 +3754,8 @@
3366
3754
  exports.AbstractActivity = AbstractActivity;
3367
3755
  exports.AbstractInputComponent = AbstractInputComponent;
3368
3756
  exports.AbstractPlaceComponent = AbstractPlaceComponent;
3369
- exports.ActivityContainerComponent = exports.ɵo;
3370
- exports.ActivityOutletComponent = exports.ɵv;
3757
+ exports.ActivityContainerComponent = exports.ɵp;
3758
+ exports.ActivityOutletComponent = exports.ɵw;
3371
3759
  exports.AlertDialogComponent = AlertDialogComponent;
3372
3760
  exports.AngularUiPowerupsModule = AngularUiPowerupsModule;
3373
3761
  exports.BusyOverlayComponent = BusyOverlayComponent;
@@ -3382,6 +3770,7 @@
3382
3770
  exports.InteractionContext = InteractionContext;
3383
3771
  exports.InteractionModule = InteractionModule;
3384
3772
  exports.LeavePlaceGuard = LeavePlaceGuard;
3773
+ exports.NavComponent = NavComponent;
3385
3774
  exports.NumberInputComponent = NumberInputComponent;
3386
3775
  exports.PasswordInputComponent = PasswordInputComponent;
3387
3776
  exports.Place = Place;
@@ -3391,8 +3780,11 @@
3391
3780
  exports.PlaceService = PlaceService;
3392
3781
  exports.Point = Point;
3393
3782
  exports.QueryParameter = QueryParameter;
3783
+ exports.QueryParameterList = QueryParameterList;
3394
3784
  exports.ResizeAwareComponent = ResizeAwareComponent;
3395
3785
  exports.RouteId = RouteId;
3786
+ exports.RouteParameter = RouteParameter;
3787
+ exports.RouteParameterList = RouteParameterList;
3396
3788
  exports.RouteParameterSanitiser = RouteParameterSanitiser;
3397
3789
  exports.SelectInputComponent = SelectInputComponent;
3398
3790
  exports.StringInputComponent = StringInputComponent;
@@ -3410,13 +3802,14 @@
3410
3802
  exports.ɵk = BusyOverlayComponent;
3411
3803
  exports.ɵl = PlaceOutletComponent;
3412
3804
  exports.ɵm = PlaceService;
3413
- exports.ɵn = InteractionModule;
3414
- exports.ɵp = ConfirmationDialogComponent;
3415
- exports.ɵq = AbstractActivity;
3416
- exports.ɵr = ACTIVITY_DATA;
3417
- exports.ɵt = AlertDialogComponent;
3418
- exports.ɵw = DialogInteractionService;
3419
- exports.ɵx = InteractionContext;
3805
+ exports.ɵn = NavComponent;
3806
+ exports.ɵo = InteractionModule;
3807
+ exports.ɵq = ConfirmationDialogComponent;
3808
+ exports.ɵr = AbstractActivity;
3809
+ exports.ɵs = ACTIVITY_DATA;
3810
+ exports.ɵu = AlertDialogComponent;
3811
+ exports.ɵx = DialogInteractionService;
3812
+ exports.ɵy = InteractionContext;
3420
3813
 
3421
3814
  Object.defineProperty(exports, '__esModule', { value: true });
3422
3815