@coolon/angular-ui-powerups 0.0.8 → 0.0.10

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 (53) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +592 -167
  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/animations/slideDownAndUpAnimation.js +2 -1
  10. package/esm2015/lib/components/forms/abstract-input.component.js +22 -12
  11. package/esm2015/lib/directives/command.directive.js +48 -4
  12. package/esm2015/lib/directives/focus-binding.directive.js +30 -14
  13. package/esm2015/lib/interaction/services/dialog-interaction.service.js +3 -1
  14. package/esm2015/lib/place/components/busy-overlay/busy-overlay.component.js +4 -4
  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 +98 -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/animations/slideDownAndUpAnimation.js +2 -1
  27. package/esm5/lib/components/forms/abstract-input.component.js +26 -12
  28. package/esm5/lib/directives/command.directive.js +52 -4
  29. package/esm5/lib/directives/focus-binding.directive.js +34 -14
  30. package/esm5/lib/interaction/services/dialog-interaction.service.js +3 -1
  31. package/esm5/lib/place/components/busy-overlay/busy-overlay.component.js +4 -4
  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 +98 -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 +473 -121
  42. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  43. package/fesm5/coolon-angular-ui-powerups.js +562 -139
  44. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  45. package/lib/components/forms/abstract-input.component.d.ts +9 -8
  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
@@ -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('@coolon/typescript-utilities'), 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('@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/list', '@angular/material/tabs', '@angular/material/tooltip', '@angular/router', '@angular/animations', 'resize-observer-polyfill', '@typescript-plus/fast-memoize-decorator', 'lodash', 'reflect-metadata', '@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.list, global.ng.material.tabs, global.ng.material.tooltip, global.ng.router, global.ng.animations, global.ResizeObserver, global.fastMemoizeDecorator, global.lodash, null, global.src));
5
+ }(this, function (exports, common, core, forms, material, platformBrowser, animations, pectin, portal, deferred_class, typescriptUtilities, dialog, list, tabs, tooltip, router, animations$1, ResizeObserver, fastMemoizeDecorator, lodash, reflectMetadata, src) { 'use strict';
6
6
 
7
7
  ResizeObserver = ResizeObserver && ResizeObserver.hasOwnProperty('default') ? ResizeObserver['default'] : ResizeObserver;
8
8
 
@@ -228,8 +228,6 @@
228
228
  * @fileoverview added by tsickle
229
229
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
230
230
  */
231
- /** @type {?} */
232
- var EMPTY_ERRORS = new pectin.MutableListModel().readonly;
233
231
  /**
234
232
  * @abstract
235
233
  * @template T
@@ -238,9 +236,15 @@
238
236
  __extends(AbstractInputComponent, _super);
239
237
  function AbstractInputComponent() {
240
238
  var _this = _super.call(this) || this;
239
+ _this.valueModel = new pectin.DelegatingFormValueModel();
240
+ // TODO: fix this.
241
+ // tslint:disable-next-line:no-output-native
241
242
  _this.focus = new core.EventEmitter();
243
+ // tslint:disable-next-line:no-output-native
242
244
  _this.blur = new core.EventEmitter();
245
+ // tslint:disable-next-line:no-output-native
243
246
  _this.enterKey = new core.EventEmitter();
247
+ // tslint:disable-next-line:no-output-native
244
248
  _this.escapeKey = new core.EventEmitter();
245
249
  /** @type {?} */
246
250
  var self = _this;
@@ -256,6 +260,17 @@
256
260
  };
257
261
  return _this;
258
262
  }
263
+ Object.defineProperty(AbstractInputComponent.prototype, "userValueModel", {
264
+ set: /**
265
+ * @param {?} model
266
+ * @return {?}
267
+ */
268
+ function (model) {
269
+ this.valueModel.setDelegate(model);
270
+ },
271
+ enumerable: true,
272
+ configurable: true
273
+ });
259
274
  /**
260
275
  * @return {?}
261
276
  */
@@ -316,7 +331,7 @@
316
331
  * @return {?}
317
332
  */
318
333
  function (command) {
319
- if (command && command.isEnabled()) {
334
+ if (command && command.enabled.value) {
320
335
  command.execute();
321
336
  }
322
337
  };
@@ -327,7 +342,6 @@
327
342
  * @return {?}
328
343
  */
329
344
  function () {
330
- // this._focused = this.valueModel['focused'] || new ValueHolder();
331
345
  };
332
346
  /**
333
347
  * @return {?}
@@ -343,8 +357,7 @@
343
357
  * @return {?}
344
358
  */
345
359
  function () {
346
- // @ts-ignore
347
- return ((/** @type {?} */ (this.valueModel))).enabled || pectin.Constant.TRUE;
360
+ return this.valueModel.enabled;
348
361
  },
349
362
  enumerable: true,
350
363
  configurable: true
@@ -363,7 +376,7 @@
363
376
  * @return {?}
364
377
  */
365
378
  function () {
366
- return ((/** @type {?} */ (this.valueModel))).errorList || EMPTY_ERRORS;
379
+ return this.valueModel.errorList;
367
380
  },
368
381
  enumerable: true,
369
382
  configurable: true
@@ -379,7 +392,7 @@
379
392
  configurable: true
380
393
  });
381
394
  AbstractInputComponent.propDecorators = {
382
- valueModel: [{ type: core.Input }],
395
+ userValueModel: [{ type: core.Input, args: ['valueModel',] }],
383
396
  label: [{ type: core.Input }],
384
397
  floatLabel: [{ type: core.Input }],
385
398
  hint: [{ type: core.Input }],
@@ -399,8 +412,9 @@
399
412
  };
400
413
  __decorate([
401
414
  pectin.UseDelegate(),
402
- __metadata("design:type", pectin.MutableValueModel)
403
- ], AbstractInputComponent.prototype, "valueModel", void 0);
415
+ __metadata("design:type", pectin.ValueModel),
416
+ __metadata("design:paramtypes", [pectin.ValueModel])
417
+ ], AbstractInputComponent.prototype, "userValueModel", null);
404
418
  return AbstractInputComponent;
405
419
  }(DisposableComponent));
406
420
  if (false) {
@@ -469,13 +483,35 @@
469
483
  * @fileoverview added by tsickle
470
484
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
471
485
  */
486
+ /**
487
+ * @template P
488
+ */
472
489
  var CommandDirective = /** @class */ (function (_super) {
473
490
  __extends(CommandDirective, _super);
474
491
  function CommandDirective(elementRef) {
475
492
  var _this = _super.call(this) || this;
476
493
  _this.elementRef = elementRef;
494
+ _this._commandParameterProvided = false;
477
495
  return _this;
478
496
  }
497
+ Object.defineProperty(CommandDirective.prototype, "commandParameter", {
498
+ get: /**
499
+ * @return {?}
500
+ */
501
+ function () {
502
+ return this._commandParameter;
503
+ },
504
+ set: /**
505
+ * @param {?} value
506
+ * @return {?}
507
+ */
508
+ function (value) {
509
+ this._commandParameterProvided = true;
510
+ this._commandParameter = value;
511
+ },
512
+ enumerable: true,
513
+ configurable: true
514
+ });
479
515
  /**
480
516
  * @return {?}
481
517
  */
@@ -484,6 +520,16 @@
484
520
  */
485
521
  function () {
486
522
  pectin.assert.notNil(this.pectinCommand);
523
+ if (this.pectinCommand instanceof pectin.UnaryCommand) {
524
+ if (!this._commandParameterProvided) {
525
+ pectin.lang.illegalState('UnaryCommands required the command parameter to be specified.');
526
+ }
527
+ }
528
+ else {
529
+ if (this._commandParameterProvided) {
530
+ pectin.lang.illegalState('command parameters are only supported by UnaryCommands');
531
+ }
532
+ }
487
533
  };
488
534
  /**
489
535
  * @return {?}
@@ -535,8 +581,13 @@
535
581
  function ($event) {
536
582
  $event.preventDefault();
537
583
  $event.stopPropagation();
538
- if (this.pectinCommand.isEnabled()) {
539
- this.pectinCommand.execute({ event: $event });
584
+ if (this.pectinCommand.enabled.value) {
585
+ if (this.pectinCommand instanceof pectin.UnaryCommand) {
586
+ this.pectinCommand.withContext({ event: $event }).execute(this.commandParameter);
587
+ }
588
+ else {
589
+ this.pectinCommand.withContext({ event: $event }).execute();
590
+ }
540
591
  }
541
592
  else {
542
593
  console.warn('disabled command clicked, ignoring.');
@@ -554,6 +605,7 @@
554
605
  ]; };
555
606
  CommandDirective.propDecorators = {
556
607
  pectinCommand: [{ type: core.Input }],
608
+ commandParameter: [{ type: core.Input }],
557
609
  notifyClick: [{ type: core.HostListener, args: ['click', ['$event'],] }]
558
610
  };
559
611
  return CommandDirective;
@@ -561,6 +613,16 @@
561
613
  if (false) {
562
614
  /** @type {?} */
563
615
  CommandDirective.prototype.pectinCommand;
616
+ /**
617
+ * @type {?}
618
+ * @private
619
+ */
620
+ CommandDirective.prototype._commandParameter;
621
+ /**
622
+ * @type {?}
623
+ * @private
624
+ */
625
+ CommandDirective.prototype._commandParameterProvided;
564
626
  /**
565
627
  * @type {?}
566
628
  * @private
@@ -589,7 +651,9 @@
589
651
  * @return {?}
590
652
  */
591
653
  function () {
592
- this.pectinFocusBinding.focusCallbacks.notifyFocusIn();
654
+ if (this.hasBinding()) {
655
+ this.pectinFocusBinding.focusContext.notifyFocusIn();
656
+ }
593
657
  };
594
658
  /**
595
659
  * @return {?}
@@ -598,7 +662,9 @@
598
662
  * @return {?}
599
663
  */
600
664
  function () {
601
- this.pectinFocusBinding.focusCallbacks.notifyFocusOut();
665
+ if (this.hasBinding()) {
666
+ this.pectinFocusBinding.focusContext.notifyFocusOut();
667
+ }
602
668
  };
603
669
  /**
604
670
  * @return {?}
@@ -617,16 +683,32 @@
617
683
  function () {
618
684
  var _this = this;
619
685
  // 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
- }));
686
+ if (this.hasBinding()) {
687
+ var chain = pectin.Dsl.disposeWith(this).chain;
688
+ chain.value(this.pectinFocusBinding.focusContext.focused).subscribe((/**
689
+ * @param {?} focused
690
+ * @return {?}
691
+ */
692
+ function (focused) {
693
+ if (focused && !_this.alreadyHasFocus()) {
694
+ _this.tryAndFocus();
695
+ }
696
+ }));
697
+ }
698
+ else {
699
+ pectin.Logger.get(this).warn("pectinFocusBinding was nil");
700
+ }
701
+ };
702
+ /**
703
+ * @private
704
+ * @return {?}
705
+ */
706
+ FocusBindingDirective.prototype.hasBinding = /**
707
+ * @private
708
+ * @return {?}
709
+ */
710
+ function () {
711
+ return !!this.pectinFocusBinding && !!this.pectinFocusBinding.focusContext;
630
712
  };
631
713
  // Hook method for debugging via tracing.
632
714
  // Hook method for debugging via tracing.
@@ -711,7 +793,7 @@
711
793
  * @return {?}
712
794
  */
713
795
  function () {
714
- return this.pectinFocusBinding.focused.value;
796
+ return this.hasBinding() && this.pectinFocusBinding.focusContext.focused.value;
715
797
  };
716
798
  // Hook method for debugging via tracing.
717
799
  // Hook method for debugging via tracing.
@@ -1214,7 +1296,7 @@
1214
1296
  * @fileoverview added by tsickle
1215
1297
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1216
1298
  */
1217
- exports.ɵo = /** @class */ (function (_super) {
1299
+ exports.ɵp = /** @class */ (function (_super) {
1218
1300
  __extends(ActivityContainerComponent, _super);
1219
1301
  function ActivityContainerComponent() {
1220
1302
  var _this = _super.call(this) || this;
@@ -1349,18 +1431,18 @@
1349
1431
  }(DisposableComponent));
1350
1432
  if (false) {
1351
1433
  /** @type {?} */
1352
- exports.ɵo.prototype.parentInteractionContext;
1434
+ exports.ɵp.prototype.parentInteractionContext;
1353
1435
  /** @type {?} */
1354
- exports.ɵo.prototype.initialActivity;
1436
+ exports.ɵp.prototype.initialActivity;
1355
1437
  /** @type {?} */
1356
- exports.ɵo.prototype.tabs;
1438
+ exports.ɵp.prototype.tabs;
1357
1439
  /** @type {?} */
1358
- exports.ɵo.prototype.activityTabs;
1440
+ exports.ɵp.prototype.activityTabs;
1359
1441
  /**
1360
1442
  * @type {?}
1361
1443
  * @private
1362
1444
  */
1363
- exports.ɵo.prototype.obsoleteTabs;
1445
+ exports.ɵp.prototype.obsoleteTabs;
1364
1446
  }
1365
1447
  (function (ActivityContainerComponent) {
1366
1448
  /**
@@ -1379,7 +1461,7 @@
1379
1461
  /** @type {?} */
1380
1462
  ActivityContext.prototype.onCancel;
1381
1463
  }
1382
- })(exports.ɵo || (exports.ɵo = {}));
1464
+ })(exports.ɵp || (exports.ɵp = {}));
1383
1465
 
1384
1466
  /**
1385
1467
  * @fileoverview added by tsickle
@@ -1388,7 +1470,7 @@
1388
1470
  /**
1389
1471
  * @template D, R, E
1390
1472
  */
1391
- exports.ɵv = /** @class */ (function () {
1473
+ exports.ɵw = /** @class */ (function () {
1392
1474
  function ActivityOutletComponent(componentFactoryResolver, viewContainerRef, injector) {
1393
1475
  this.componentFactoryResolver = componentFactoryResolver;
1394
1476
  this.viewContainerRef = viewContainerRef;
@@ -1499,27 +1581,27 @@
1499
1581
  }());
1500
1582
  if (false) {
1501
1583
  /** @type {?} */
1502
- exports.ɵv.prototype.interactionContext;
1584
+ exports.ɵw.prototype.interactionContext;
1503
1585
  /**
1504
1586
  * @type {?}
1505
1587
  * @private
1506
1588
  */
1507
- exports.ɵv.prototype.activityComponent;
1589
+ exports.ɵw.prototype.activityComponent;
1508
1590
  /**
1509
1591
  * @type {?}
1510
1592
  * @private
1511
1593
  */
1512
- exports.ɵv.prototype.componentFactoryResolver;
1594
+ exports.ɵw.prototype.componentFactoryResolver;
1513
1595
  /**
1514
1596
  * @type {?}
1515
1597
  * @private
1516
1598
  */
1517
- exports.ɵv.prototype.viewContainerRef;
1599
+ exports.ɵw.prototype.viewContainerRef;
1518
1600
  /**
1519
1601
  * @type {?}
1520
1602
  * @private
1521
1603
  */
1522
- exports.ɵv.prototype.injector;
1604
+ exports.ɵw.prototype.injector;
1523
1605
  /* Skipping unhandled member: ;*/
1524
1606
  }
1525
1607
  (function (ActivityOutletComponent) {
@@ -1580,7 +1662,7 @@
1580
1662
  */
1581
1663
  OutletInteractionContext.prototype.context;
1582
1664
  }
1583
- })(exports.ɵv || (exports.ɵv = {}));
1665
+ })(exports.ɵw || (exports.ɵw = {}));
1584
1666
 
1585
1667
  /**
1586
1668
  * @fileoverview added by tsickle
@@ -1591,6 +1673,7 @@
1591
1673
  function DialogInteractionService(dialogService) {
1592
1674
  var _this = _super.call(this) || this;
1593
1675
  _this.dialogService = dialogService;
1676
+ typescriptUtilities.assert.notNil(dialogService);
1594
1677
  return _this;
1595
1678
  }
1596
1679
  /**
@@ -1635,7 +1718,7 @@
1635
1718
  autoFocus: false
1636
1719
  };
1637
1720
  /** @type {?} */
1638
- var matDialogRef = (/** @type {?} */ (this.dialogService.open(exports.ɵo, config)));
1721
+ var matDialogRef = (/** @type {?} */ (this.dialogService.open(exports.ɵp, config)));
1639
1722
  return new Promise((/**
1640
1723
  * @param {?} resolve
1641
1724
  * @param {?} reject
@@ -1727,13 +1810,13 @@
1727
1810
  portal.PortalModule
1728
1811
  ],
1729
1812
  declarations: [
1730
- exports.ɵo,
1813
+ exports.ɵp,
1731
1814
  ConfirmationDialogComponent,
1732
1815
  AlertDialogComponent,
1733
- exports.ɵv
1816
+ exports.ɵw
1734
1817
  ],
1735
1818
  entryComponents: [
1736
- exports.ɵo,
1819
+ exports.ɵp,
1737
1820
  ConfirmationDialogComponent,
1738
1821
  AlertDialogComponent
1739
1822
  ],
@@ -1762,7 +1845,7 @@
1762
1845
  };
1763
1846
  BusyOverlayComponent.decorators = [
1764
1847
  { type: core.Component, args: [{
1765
- selector: 'aup-busy-overlay',
1848
+ selector: 'angular-ui-powerups-busy-overlay',
1766
1849
  template: "<ng-content></ng-content>\n<div class=\"busy-overlay-backdrop\" *ngIf=\"busyModel.value\">\n <mat-progress-spinner mode=\"indeterminate\" [diameter]=\"52\"></mat-progress-spinner>\n</div>\n",
1767
1850
  styles: [":host{position:relative}div.busy-overlay-backdrop{position:absolute;background-color:rgba(0,0,0,.2);top:0;left:0;bottom:0;right:0;display:-ms-grid;display:grid;-ms-grid-columns:auto;grid-template-columns:auto;-ms-grid-rows:auto;grid-template-rows:auto;place-content:center}"]
1768
1851
  }] }
@@ -1774,7 +1857,7 @@
1774
1857
  busy: [{ type: core.Input }]
1775
1858
  };
1776
1859
  __decorate([
1777
- pectin.UseDelegatingValueModel(),
1860
+ pectin.UseDelegate(),
1778
1861
  __metadata("design:type", pectin.ValueModel)
1779
1862
  ], BusyOverlayComponent.prototype, "busyModel", void 0);
1780
1863
  __decorate([
@@ -1817,6 +1900,40 @@
1817
1900
  return EmptyStateComponent;
1818
1901
  }());
1819
1902
 
1903
+ /**
1904
+ * @fileoverview added by tsickle
1905
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
1906
+ */
1907
+ var NavComponent = /** @class */ (function () {
1908
+ function NavComponent() {
1909
+ }
1910
+ /**
1911
+ * @return {?}
1912
+ */
1913
+ NavComponent.prototype.ngOnInit = /**
1914
+ * @return {?}
1915
+ */
1916
+ function () {
1917
+ };
1918
+ NavComponent.decorators = [
1919
+ { type: core.Component, args: [{
1920
+ selector: 'angular-ui-powerups-nav',
1921
+ 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",
1922
+ styles: [""]
1923
+ }] }
1924
+ ];
1925
+ /** @nocollapse */
1926
+ NavComponent.ctorParameters = function () { return []; };
1927
+ NavComponent.propDecorators = {
1928
+ places: [{ type: core.Input }]
1929
+ };
1930
+ return NavComponent;
1931
+ }());
1932
+ if (false) {
1933
+ /** @type {?} */
1934
+ NavComponent.prototype.places;
1935
+ }
1936
+
1820
1937
  /**
1821
1938
  * @fileoverview added by tsickle
1822
1939
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
@@ -1957,19 +2074,25 @@
1957
2074
  { type: core.NgModule, args: [{
1958
2075
  imports: [
1959
2076
  common.CommonModule,
2077
+ animations.BrowserAnimationsModule,
1960
2078
  material.MatProgressSpinnerModule,
1961
- router.RouterModule
2079
+ router.RouterModule,
2080
+ tabs.MatTabsModule,
2081
+ list.MatListModule,
2082
+ tooltip.MatTooltipModule
1962
2083
  ],
1963
2084
  declarations: [
1964
2085
  EmptyStateComponent,
1965
2086
  BusyOverlayComponent,
1966
- PlaceOutletComponent
2087
+ PlaceOutletComponent,
2088
+ NavComponent
1967
2089
  ],
1968
2090
  entryComponents: [BusyOverlayComponent],
1969
2091
  exports: [
1970
2092
  BusyOverlayComponent,
1971
2093
  PlaceOutletComponent,
1972
- EmptyStateComponent
2094
+ EmptyStateComponent,
2095
+ NavComponent
1973
2096
  ],
1974
2097
  providers: [
1975
2098
  PlaceService
@@ -2039,6 +2162,7 @@
2039
2162
  * @return {?}
2040
2163
  */
2041
2164
  function slideDownAndUpAnimation(triggerName, options) {
2165
+ // SEE to fix this: https://github.com/angular/angular/issues/15587#issuecomment-351510501
2042
2166
  /** @type {?} */
2043
2167
  var duration = pectin.OptionsHelper.get(options).getOptional('duration', '100ms');
2044
2168
  /** @type {?} */
@@ -2460,7 +2584,7 @@
2460
2584
  function ResolvedParameter() { }
2461
2585
  if (false) {
2462
2586
  /** @type {?} */
2463
- ResolvedParameter.prototype.parameter;
2587
+ ResolvedParameter.prototype.parameterDef;
2464
2588
  /** @type {?} */
2465
2589
  ResolvedParameter.prototype.resolvedValue;
2466
2590
  }
@@ -2484,7 +2608,7 @@
2484
2608
  * @param {?} p
2485
2609
  * @return {?}
2486
2610
  */
2487
- function (p) { return p.parameter === parameter; }));
2611
+ function (p) { return p.parameterDef === parameter; }));
2488
2612
  return resolved ? resolved.resolvedValue : null;
2489
2613
  };
2490
2614
  /**
@@ -2504,8 +2628,8 @@
2504
2628
  * @param {?} p
2505
2629
  * @return {?}
2506
2630
  */
2507
- function (p) { return p.parameter !== parameter; })).concat({
2508
- parameter: parameter,
2631
+ function (p) { return p.parameterDef !== parameter; })).concat({
2632
+ parameterDef: parameter,
2509
2633
  resolvedValue: value
2510
2634
  }));
2511
2635
  };
@@ -2520,7 +2644,7 @@
2520
2644
  function () {
2521
2645
  /** @type {?} */
2522
2646
  var routeIdParam = this.getRouteIdParam();
2523
- return routeIdParam ? routeIdParam.parameter.type.format(routeIdParam.resolvedValue) : null;
2647
+ return routeIdParam ? routeIdParam.parameterDef.type.format(routeIdParam.resolvedValue) : null;
2524
2648
  };
2525
2649
  /**
2526
2650
  * @private
@@ -2535,7 +2659,7 @@
2535
2659
  * @param {?} p
2536
2660
  * @return {?}
2537
2661
  */
2538
- function (p) { return p.parameter.isRouteId; }));
2662
+ function (p) { return p.parameterDef.isRouteId; }));
2539
2663
  };
2540
2664
  /**
2541
2665
  * @protected
@@ -2553,12 +2677,12 @@
2553
2677
  * @param {?} p
2554
2678
  * @return {?}
2555
2679
  */
2556
- function (p) { return !p.parameter.isRouteId; })).forEach((/**
2680
+ function (p) { return !p.parameterDef.isRouteId; })).forEach((/**
2557
2681
  * @param {?} p
2558
2682
  * @return {?}
2559
2683
  */
2560
2684
  function (p) {
2561
- params[p.parameter.name] = p.parameter.type.format(p.resolvedValue);
2685
+ params[p.parameterDef.name] = p.parameterDef.type.format(p.resolvedValue);
2562
2686
  }));
2563
2687
  return params;
2564
2688
  };
@@ -2591,7 +2715,7 @@
2591
2715
  /** @type {?} */
2592
2716
  var path = routeId ? [relativePath, routeId, this.getFormattedParameters()] : [relativePath, this.getFormattedParameters()];
2593
2717
  router.navigate(path, {
2594
- relativeTo: activatedRoute,
2718
+ relativeTo: activatedRoute
2595
2719
  });
2596
2720
  };
2597
2721
  __decorate([
@@ -2648,11 +2772,23 @@
2648
2772
  /** @type {?} */
2649
2773
  var result = [];
2650
2774
  routeParameterDefs.forEach((/**
2651
- * @param {?} parameter
2775
+ * @param {?} parameterDef
2652
2776
  * @return {?}
2653
2777
  */
2654
- function (parameter) {
2655
- result.push({ parameter: parameter, resolvedValue: parameter.type.parse(params.get(parameter.name)) });
2778
+ function (parameterDef) {
2779
+ /** @type {?} */
2780
+ var resolvedValue;
2781
+ if (parameterDef.isArray) {
2782
+ resolvedValue = params.getAll(parameterDef.name).map((/**
2783
+ * @param {?} v
2784
+ * @return {?}
2785
+ */
2786
+ function (v) { return parameterDef.type.parse(v); }));
2787
+ }
2788
+ else {
2789
+ resolvedValue = parameterDef.type.parse(params.get(parameterDef.name));
2790
+ }
2791
+ result.push({ parameterDef: parameterDef, resolvedValue: resolvedValue });
2656
2792
  }));
2657
2793
  return new ResolvedParameters(result);
2658
2794
  }));
@@ -2903,41 +3039,162 @@
2903
3039
  * @fileoverview added by tsickle
2904
3040
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
2905
3041
  */
3042
+ /**
3043
+ * @abstract
3044
+ * @template T, S
3045
+ */
3046
+ /**
3047
+ * @abstract
3048
+ * @template T, S
3049
+ */
3050
+ exports.Sanitiser = /** @class */ (function () {
3051
+ function Sanitiser(parameterDef, snapshot, sanitiser) {
3052
+ this.parameterDef = parameterDef;
3053
+ this.snapshot = snapshot;
3054
+ this.sanitiser = sanitiser;
3055
+ }
3056
+ /**
3057
+ * @return {?}
3058
+ */
3059
+ Sanitiser.prototype.isRouteId = /**
3060
+ * @return {?}
3061
+ */
3062
+ function () {
3063
+ return this.parameterDef.isRouteId;
3064
+ };
3065
+ Object.defineProperty(Sanitiser.prototype, "valueChanged", {
3066
+ get: /**
3067
+ * @return {?}
3068
+ */
3069
+ function () {
3070
+ return !lodash.isNil(this.initialValue) && this.hasChanged(this.initialValue, this.sanitisedValue);
3071
+ },
3072
+ enumerable: true,
3073
+ configurable: true
3074
+ });
3075
+ Object.defineProperty(Sanitiser.prototype, "sanitisedValue", {
3076
+ get: /**
3077
+ * @return {?}
3078
+ */
3079
+ function () {
3080
+ return this._sanitisedValue;
3081
+ },
3082
+ enumerable: true,
3083
+ configurable: true
3084
+ });
3085
+ /**
3086
+ * @return {?}
3087
+ */
3088
+ Sanitiser.prototype.sanitize = /**
3089
+ * @return {?}
3090
+ */
3091
+ function () {
3092
+ return __awaiter(this, void 0, void 0, function () {
3093
+ var _a;
3094
+ return __generator(this, function (_b) {
3095
+ switch (_b.label) {
3096
+ case 0:
3097
+ if (!this.sanitiser) return [3 /*break*/, 2];
3098
+ this.initialValue = this.readFrom(this.snapshot);
3099
+ _a = this;
3100
+ return [4 /*yield*/, this.sanitiser.sanitise(this.initialValue)];
3101
+ case 1:
3102
+ _a._sanitisedValue = _b.sent();
3103
+ if (this.initialValue !== this._sanitisedValue) {
3104
+ return [2 /*return*/, false];
3105
+ }
3106
+ _b.label = 2;
3107
+ case 2: return [2 /*return*/, true];
3108
+ }
3109
+ });
3110
+ });
3111
+ };
3112
+ return Sanitiser;
3113
+ }());
3114
+ if (false) {
3115
+ /**
3116
+ * @type {?}
3117
+ * @private
3118
+ */
3119
+ exports.Sanitiser.prototype.initialValue;
3120
+ /**
3121
+ * @type {?}
3122
+ * @private
3123
+ */
3124
+ exports.Sanitiser.prototype._sanitisedValue;
3125
+ /** @type {?} */
3126
+ exports.Sanitiser.prototype.parameterDef;
3127
+ /** @type {?} */
3128
+ exports.Sanitiser.prototype.snapshot;
3129
+ /** @type {?} */
3130
+ exports.Sanitiser.prototype.sanitiser;
3131
+ /**
3132
+ * @abstract
3133
+ * @protected
3134
+ * @param {?} snapshot
3135
+ * @return {?}
3136
+ */
3137
+ exports.Sanitiser.prototype.readFrom = function (snapshot) { };
3138
+ /**
3139
+ * @abstract
3140
+ * @protected
3141
+ * @param {?} initialValue
3142
+ * @param {?} sanitisedValue
3143
+ * @return {?}
3144
+ */
3145
+ exports.Sanitiser.prototype.hasChanged = function (initialValue, sanitisedValue) { };
3146
+ /**
3147
+ * @abstract
3148
+ * @param {?} dest
3149
+ * @return {?}
3150
+ */
3151
+ exports.Sanitiser.prototype.injectRouteParam = function (dest) { };
3152
+ }
2906
3153
  var RouteParameterSanitiser = /** @class */ (function () {
2907
- function RouteParameterSanitiser(parameterDefs, injector) {
3154
+ function RouteParameterSanitiser(parameterDefs, snapshot, injector) {
3155
+ var _this = this;
2908
3156
  this.parameterDefs = parameterDefs;
3157
+ this.snapshot = snapshot;
2909
3158
  this.injector = injector;
2910
- this.sanitisedParameters = [];
2911
- this.routeParameter = parameterDefs.find((/**
3159
+ this.parameterSanitisers = [];
3160
+ /** @type {?} */
3161
+ var sanitisers = parameterDefs.map((/**
3162
+ * @param {?} def
3163
+ * @return {?}
3164
+ */
3165
+ function (def) {
3166
+ return def.isArray ?
3167
+ new exports.Sanitiser.Array(def, snapshot, _this.getSanitiser(def)) :
3168
+ new exports.Sanitiser.Value(def, snapshot, _this.getSanitiser(def));
3169
+ }));
3170
+ this.routeIdSanitiser = sanitisers.find((/**
2912
3171
  * @param {?} p
2913
3172
  * @return {?}
2914
3173
  */
2915
- function (p) { return p.isRouteId; }));
2916
- this.queryParameters = parameterDefs.filter((/**
3174
+ function (p) { return p.isRouteId(); }));
3175
+ this.parameterSanitisers = sanitisers.filter((/**
2917
3176
  * @param {?} p
2918
3177
  * @return {?}
2919
3178
  */
2920
- function (p) { return !p.isRouteId; }));
3179
+ function (p) { return !p.isRouteId(); }));
2921
3180
  }
2922
3181
  /**
2923
- * @param {?} snapshot
2924
3182
  * @return {?}
2925
3183
  */
2926
3184
  RouteParameterSanitiser.prototype.sanitise = /**
2927
- * @param {?} snapshot
2928
3185
  * @return {?}
2929
3186
  */
2930
- function (snapshot) {
3187
+ function () {
2931
3188
  return __awaiter(this, void 0, void 0, function () {
2932
- var e_1, _a, routeOk, _b, _c, param, e_1_1;
3189
+ var e_1, _a, _b, _c, sanitiser, e_1_1;
2933
3190
  return __generator(this, function (_d) {
2934
3191
  switch (_d.label) {
2935
3192
  case 0:
2936
- if (!this.routeParameter) return [3 /*break*/, 2];
2937
- return [4 /*yield*/, this.sanitiseParameter(this.routeParameter, snapshot.paramMap.get(this.routeParameter.name))];
3193
+ if (!this.routeIdSanitiser) return [3 /*break*/, 2];
3194
+ return [4 /*yield*/, this.routeIdSanitiser.sanitize()];
2938
3195
  case 1:
2939
- routeOk = _d.sent();
2940
- if (!routeOk) {
3196
+ _d.sent();
3197
+ if (this.routeIdSanitiser.valueChanged) {
2941
3198
  // if the route id isn't ok we redirect immediately as the query params may need to be sanitised in the
2942
3199
  // context of the route id.
2943
3200
  return [2 /*return*/, false];
@@ -2945,12 +3202,12 @@
2945
3202
  _d.label = 2;
2946
3203
  case 2:
2947
3204
  _d.trys.push([2, 7, 8, 9]);
2948
- _b = __values(this.queryParameters), _c = _b.next();
3205
+ _b = __values(this.parameterSanitisers), _c = _b.next();
2949
3206
  _d.label = 3;
2950
3207
  case 3:
2951
3208
  if (!!_c.done) return [3 /*break*/, 6];
2952
- param = _c.value;
2953
- return [4 /*yield*/, this.sanitiseParameter(param, snapshot.queryParamMap.get(param.name))];
3209
+ sanitiser = _c.value;
3210
+ return [4 /*yield*/, sanitiser.sanitize()];
2954
3211
  case 4:
2955
3212
  _d.sent();
2956
3213
  _d.label = 5;
@@ -2968,42 +3225,11 @@
2968
3225
  }
2969
3226
  finally { if (e_1) throw e_1.error; }
2970
3227
  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];
3228
+ case 9: return [2 /*return*/, !this.parameterSanitisers.find((/**
3229
+ * @param {?} s
3230
+ * @return {?}
3231
+ */
3232
+ function (s) { return s.valueChanged; }))];
3007
3233
  }
3008
3234
  });
3009
3235
  });
@@ -3017,57 +3243,36 @@
3017
3243
  * @return {?}
3018
3244
  */
3019
3245
  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]);
3246
+ pectin.assert.isTruthy(this.parameterSanitisers.length !== 0);
3247
+ if (this.routeIdSanitiser.valueChanged) {
3248
+ return router.navigate(['..', this.routeIdSanitiser.sanitisedValue]);
3030
3249
  }
3031
3250
  else {
3032
3251
  /** @type {?} */
3033
- var queryParams = this.sanitisedParameters.filter((/**
3252
+ var routeParams_1 = {};
3253
+ this.parameterSanitisers.forEach((/**
3034
3254
  * @param {?} s
3035
3255
  * @return {?}
3036
3256
  */
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]);
3257
+ function (s) { return s.injectRouteParam(routeParams_1); }));
3258
+ return router.navigate(['.', routeParams_1]);
3048
3259
  }
3049
3260
  };
3050
3261
  /**
3051
3262
  * @private
3052
- * @template T
3263
+ * @template T, S
3053
3264
  * @param {?} def
3054
3265
  * @return {?}
3055
3266
  */
3056
3267
  RouteParameterSanitiser.prototype.getSanitiser = /**
3057
3268
  * @private
3058
- * @template T
3269
+ * @template T, S
3059
3270
  * @param {?} def
3060
3271
  * @return {?}
3061
3272
  */
3062
3273
  function (def) {
3063
3274
  return def.sanitiser ? this.injector.get(def.sanitiser, new def.sanitiser()) : null;
3064
3275
  };
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
3276
  __decorate([
3072
3277
  src.Memoize(),
3073
3278
  __metadata("design:type", Function),
@@ -3081,22 +3286,139 @@
3081
3286
  * @type {?}
3082
3287
  * @private
3083
3288
  */
3084
- RouteParameterSanitiser.prototype.routeParameter;
3289
+ RouteParameterSanitiser.prototype.routeIdSanitiser;
3085
3290
  /**
3086
3291
  * @type {?}
3087
3292
  * @private
3088
3293
  */
3089
- RouteParameterSanitiser.prototype.queryParameters;
3090
- /**
3091
- * @type {?}
3092
- * @private
3093
- */
3094
- RouteParameterSanitiser.prototype.sanitisedParameters;
3294
+ RouteParameterSanitiser.prototype.parameterSanitisers;
3095
3295
  /** @type {?} */
3096
3296
  RouteParameterSanitiser.prototype.parameterDefs;
3097
3297
  /** @type {?} */
3298
+ RouteParameterSanitiser.prototype.snapshot;
3299
+ /** @type {?} */
3098
3300
  RouteParameterSanitiser.prototype.injector;
3099
3301
  }
3302
+ (function (Sanitiser) {
3303
+ /**
3304
+ * @template T
3305
+ */
3306
+ var /**
3307
+ * @template T
3308
+ */
3309
+ Value = /** @class */ (function (_super) {
3310
+ __extends(Value, _super);
3311
+ function Value() {
3312
+ return _super !== null && _super.apply(this, arguments) || this;
3313
+ }
3314
+ /**
3315
+ * @param {?} snapshot
3316
+ * @return {?}
3317
+ */
3318
+ Value.prototype.readFrom = /**
3319
+ * @param {?} snapshot
3320
+ * @return {?}
3321
+ */
3322
+ function (snapshot) {
3323
+ /** @type {?} */
3324
+ var rawValue = this.parameterDef.isRouteId ?
3325
+ snapshot.paramMap.get(this.parameterDef.name) :
3326
+ snapshot.queryParamMap.get(this.parameterDef.name);
3327
+ return this.parameterDef.type.parse(rawValue);
3328
+ };
3329
+ /**
3330
+ * @protected
3331
+ * @param {?} initialValue
3332
+ * @param {?} sanitisedValue
3333
+ * @return {?}
3334
+ */
3335
+ Value.prototype.hasChanged = /**
3336
+ * @protected
3337
+ * @param {?} initialValue
3338
+ * @param {?} sanitisedValue
3339
+ * @return {?}
3340
+ */
3341
+ function (initialValue, sanitisedValue) {
3342
+ return initialValue !== sanitisedValue;
3343
+ };
3344
+ /**
3345
+ * @param {?} dest
3346
+ * @return {?}
3347
+ */
3348
+ Value.prototype.injectRouteParam = /**
3349
+ * @param {?} dest
3350
+ * @return {?}
3351
+ */
3352
+ function (dest) {
3353
+ dest[this.parameterDef.name] = this.parameterDef.type.format(this.sanitisedValue);
3354
+ };
3355
+ return Value;
3356
+ }(Sanitiser));
3357
+ Sanitiser.Value = Value;
3358
+ /**
3359
+ * @template T
3360
+ */
3361
+ var /**
3362
+ * @template T
3363
+ */
3364
+ Array = /** @class */ (function (_super) {
3365
+ __extends(Array, _super);
3366
+ function Array() {
3367
+ return _super !== null && _super.apply(this, arguments) || this;
3368
+ }
3369
+ /**
3370
+ * @param {?} snapshot
3371
+ * @return {?}
3372
+ */
3373
+ Array.prototype.readFrom = /**
3374
+ * @param {?} snapshot
3375
+ * @return {?}
3376
+ */
3377
+ function (snapshot) {
3378
+ var _this = this;
3379
+ /** @type {?} */
3380
+ var rawValues = snapshot.queryParamMap.getAll(this.parameterDef.name);
3381
+ return rawValues.map((/**
3382
+ * @param {?} value
3383
+ * @return {?}
3384
+ */
3385
+ function (value) { return _this.parameterDef.type.parse(value); }));
3386
+ };
3387
+ /**
3388
+ * @protected
3389
+ * @param {?} initialValue
3390
+ * @param {?} sanitisedValue
3391
+ * @return {?}
3392
+ */
3393
+ Array.prototype.hasChanged = /**
3394
+ * @protected
3395
+ * @param {?} initialValue
3396
+ * @param {?} sanitisedValue
3397
+ * @return {?}
3398
+ */
3399
+ function (initialValue, sanitisedValue) {
3400
+ return initialValue !== sanitisedValue;
3401
+ };
3402
+ /**
3403
+ * @param {?} dest
3404
+ * @return {?}
3405
+ */
3406
+ Array.prototype.injectRouteParam = /**
3407
+ * @param {?} dest
3408
+ * @return {?}
3409
+ */
3410
+ function (dest) {
3411
+ var _this = this;
3412
+ dest[this.parameterDef.name] = this.sanitisedValue.map((/**
3413
+ * @param {?} v
3414
+ * @return {?}
3415
+ */
3416
+ function (v) { return _this.parameterDef.type.format(v); }));
3417
+ };
3418
+ return Array;
3419
+ }(Sanitiser));
3420
+ Sanitiser.Array = Array;
3421
+ })(exports.Sanitiser || (exports.Sanitiser = {}));
3100
3422
 
3101
3423
  /**
3102
3424
  * @fileoverview added by tsickle
@@ -3122,8 +3444,8 @@
3122
3444
  /** @type {?} */
3123
3445
  var routeParameters = typescriptUtilities.Klass.get(route.component).getMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY);
3124
3446
  /** @type {?} */
3125
- var sanitiser = new RouteParameterSanitiser(routeParameters, this.injector);
3126
- return sanitiser.sanitise(route).then((/**
3447
+ var sanitiser = new RouteParameterSanitiser(routeParameters, route, this.injector);
3448
+ return sanitiser.sanitise().then((/**
3127
3449
  * @param {?} proceed
3128
3450
  * @return {?}
3129
3451
  */
@@ -3194,6 +3516,17 @@
3194
3516
  /** @type {?|undefined} */
3195
3517
  ParameterOptions.prototype.sanitiser;
3196
3518
  }
3519
+ /**
3520
+ * @record
3521
+ * @template T
3522
+ */
3523
+ function ListParameterOptions() { }
3524
+ if (false) {
3525
+ /** @type {?|undefined} */
3526
+ ListParameterOptions.prototype.as;
3527
+ /** @type {?|undefined} */
3528
+ ListParameterOptions.prototype.listSanitiser;
3529
+ }
3197
3530
  /**
3198
3531
  * @template T
3199
3532
  * @param {?} type
@@ -3215,12 +3548,32 @@
3215
3548
  });
3216
3549
  }
3217
3550
  /**
3551
+ * @deprecated use RouteParameter instead.
3218
3552
  * @template T
3219
3553
  * @param {?} type
3220
3554
  * @param {?=} options
3221
3555
  * @return {?}
3222
3556
  */
3223
3557
  function QueryParameter(type, options) {
3558
+ return (/**
3559
+ * @param {?} prototype
3560
+ * @param {?} propertyKey
3561
+ * @return {?}
3562
+ */
3563
+ function (prototype, propertyKey) {
3564
+ /** @type {?} */
3565
+ var param = createDefinition(propertyKey, type, options, false);
3566
+ typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
3567
+ pectin.UseDelegate()(prototype, propertyKey);
3568
+ });
3569
+ }
3570
+ /**
3571
+ * @template T
3572
+ * @param {?} type
3573
+ * @param {?=} options
3574
+ * @return {?}
3575
+ */
3576
+ function RouteParameter(type, options) {
3224
3577
  // assert.isTruthy(type.isValid());
3225
3578
  return (/**
3226
3579
  * @param {?} prototype
@@ -3234,6 +3587,47 @@
3234
3587
  pectin.UseDelegate()(prototype, propertyKey);
3235
3588
  });
3236
3589
  }
3590
+ /**
3591
+ * @deprecated use RouteParameterList instead
3592
+ * @template E
3593
+ * @param {?} elementType
3594
+ * @param {?=} options
3595
+ * @return {?}
3596
+ */
3597
+ function QueryParameterList(elementType, options) {
3598
+ // assert.isTruthy(type.isValid());
3599
+ return (/**
3600
+ * @param {?} prototype
3601
+ * @param {?} propertyKey
3602
+ * @return {?}
3603
+ */
3604
+ function (prototype, propertyKey) {
3605
+ /** @type {?} */
3606
+ var param = createArrayDefinition(propertyKey, elementType, options);
3607
+ typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
3608
+ pectin.UseDelegate()(prototype, propertyKey);
3609
+ });
3610
+ }
3611
+ /**
3612
+ * @template E
3613
+ * @param {?} elementType
3614
+ * @param {?=} options
3615
+ * @return {?}
3616
+ */
3617
+ function RouteParameterList(elementType, options) {
3618
+ // assert.isTruthy(type.isValid());
3619
+ return (/**
3620
+ * @param {?} prototype
3621
+ * @param {?} propertyKey
3622
+ * @return {?}
3623
+ */
3624
+ function (prototype, propertyKey) {
3625
+ /** @type {?} */
3626
+ var param = createArrayDefinition(propertyKey, elementType, options);
3627
+ typescriptUtilities.Klass.get(prototype).addToOwnMetadataList(exports.RouteParameterBindings.ROUTE_PARAMETER_LIST_KEY, param);
3628
+ pectin.UseDelegate()(prototype, propertyKey);
3629
+ });
3630
+ }
3237
3631
  /**
3238
3632
  * @template T
3239
3633
  * @param {?} propertyName
@@ -3253,7 +3647,31 @@
3253
3647
  propertyName: propertyNameAsString,
3254
3648
  type: pectin.assert.notNil(type),
3255
3649
  sanitiser: opts.getOptional('sanitiser', null),
3256
- isRouteId: routeId
3650
+ isRouteId: routeId,
3651
+ isArray: false
3652
+ };
3653
+ return def;
3654
+ }
3655
+ /**
3656
+ * @template T
3657
+ * @param {?} propertyName
3658
+ * @param {?} type
3659
+ * @param {?} options
3660
+ * @return {?}
3661
+ */
3662
+ function createArrayDefinition(propertyName, type, options) {
3663
+ /** @type {?} */
3664
+ var opts = typescriptUtilities.Opts.get(options);
3665
+ /** @type {?} */
3666
+ var propertyNameAsString = pectin.assert.notNil(propertyName).toString();
3667
+ /** @type {?} */
3668
+ var def = {
3669
+ name: opts.getOptional('as', propertyNameAsString),
3670
+ propertyName: propertyNameAsString,
3671
+ type: pectin.assert.notNil(type),
3672
+ sanitiser: opts.getOptional('listSanitiser', null),
3673
+ isRouteId: false,
3674
+ isArray: true
3257
3675
  };
3258
3676
  return def;
3259
3677
  }
@@ -3264,7 +3682,7 @@
3264
3682
  */
3265
3683
  /**
3266
3684
  * @record
3267
- * @template T
3685
+ * @template E, S
3268
3686
  */
3269
3687
  function ParameterDefinition() { }
3270
3688
  if (false) {
@@ -3278,6 +3696,8 @@
3278
3696
  ParameterDefinition.prototype.sanitiser;
3279
3697
  /** @type {?} */
3280
3698
  ParameterDefinition.prototype.isRouteId;
3699
+ /** @type {?} */
3700
+ ParameterDefinition.prototype.isArray;
3281
3701
  }
3282
3702
 
3283
3703
  /**
@@ -3366,8 +3786,8 @@
3366
3786
  exports.AbstractActivity = AbstractActivity;
3367
3787
  exports.AbstractInputComponent = AbstractInputComponent;
3368
3788
  exports.AbstractPlaceComponent = AbstractPlaceComponent;
3369
- exports.ActivityContainerComponent = exports.ɵo;
3370
- exports.ActivityOutletComponent = exports.ɵv;
3789
+ exports.ActivityContainerComponent = exports.ɵp;
3790
+ exports.ActivityOutletComponent = exports.ɵw;
3371
3791
  exports.AlertDialogComponent = AlertDialogComponent;
3372
3792
  exports.AngularUiPowerupsModule = AngularUiPowerupsModule;
3373
3793
  exports.BusyOverlayComponent = BusyOverlayComponent;
@@ -3382,6 +3802,7 @@
3382
3802
  exports.InteractionContext = InteractionContext;
3383
3803
  exports.InteractionModule = InteractionModule;
3384
3804
  exports.LeavePlaceGuard = LeavePlaceGuard;
3805
+ exports.NavComponent = NavComponent;
3385
3806
  exports.NumberInputComponent = NumberInputComponent;
3386
3807
  exports.PasswordInputComponent = PasswordInputComponent;
3387
3808
  exports.Place = Place;
@@ -3391,8 +3812,11 @@
3391
3812
  exports.PlaceService = PlaceService;
3392
3813
  exports.Point = Point;
3393
3814
  exports.QueryParameter = QueryParameter;
3815
+ exports.QueryParameterList = QueryParameterList;
3394
3816
  exports.ResizeAwareComponent = ResizeAwareComponent;
3395
3817
  exports.RouteId = RouteId;
3818
+ exports.RouteParameter = RouteParameter;
3819
+ exports.RouteParameterList = RouteParameterList;
3396
3820
  exports.RouteParameterSanitiser = RouteParameterSanitiser;
3397
3821
  exports.SelectInputComponent = SelectInputComponent;
3398
3822
  exports.StringInputComponent = StringInputComponent;
@@ -3410,13 +3834,14 @@
3410
3834
  exports.ɵk = BusyOverlayComponent;
3411
3835
  exports.ɵl = PlaceOutletComponent;
3412
3836
  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;
3837
+ exports.ɵn = NavComponent;
3838
+ exports.ɵo = InteractionModule;
3839
+ exports.ɵq = ConfirmationDialogComponent;
3840
+ exports.ɵr = AbstractActivity;
3841
+ exports.ɵs = ACTIVITY_DATA;
3842
+ exports.ɵu = AlertDialogComponent;
3843
+ exports.ɵx = DialogInteractionService;
3844
+ exports.ɵy = InteractionContext;
3420
3845
 
3421
3846
  Object.defineProperty(exports, '__esModule', { value: true });
3422
3847