@coolon/angular-ui-powerups 2.0.0-alpha.12 → 2.0.0-alpha.14

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 (40) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/bundles/coolon-angular-ui-powerups.umd.js +84 -93
  3. package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
  4. package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
  5. package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
  6. package/coolon-angular-ui-powerups.metadata.json +1 -1
  7. package/esm2015/lib/components/forms/abstract-list-input.component.js +11 -10
  8. package/esm2015/lib/components/forms/abstract-list-input.component.js.map +1 -1
  9. package/esm2015/lib/components/forms/abstract-list-input.component.metadata.json +1 -1
  10. package/esm2015/lib/components/forms/abstract-value-input.component.js +2 -1
  11. package/esm2015/lib/components/forms/abstract-value-input.component.js.map +1 -1
  12. package/esm2015/lib/interaction/components/activity-container/activity-container.component.js +2 -7
  13. package/esm2015/lib/interaction/components/activity-container/activity-container.component.js.map +1 -1
  14. package/esm2015/lib/interaction/components/activity-container/activity-container.component.metadata.json +1 -1
  15. package/esm2015/lib/place/place-component.js +1 -1
  16. package/esm2015/lib/place/place-component.js.map +1 -1
  17. package/esm2015/lib/place/place-router.js +2 -8
  18. package/esm2015/lib/place/place-router.js.map +1 -1
  19. package/esm2015/lib/place/place-router.metadata.json +1 -1
  20. package/esm2015/lib/place/route/parameter-decorators.js +2 -3
  21. package/esm2015/lib/place/route/parameter-decorators.js.map +1 -1
  22. package/esm2015/lib/place/route/parameter-decorators.metadata.json +1 -1
  23. package/esm5/lib/components/forms/abstract-list-input.component.js +11 -10
  24. package/esm5/lib/components/forms/abstract-list-input.component.js.map +1 -1
  25. package/esm5/lib/components/forms/abstract-value-input.component.js +2 -1
  26. package/esm5/lib/components/forms/abstract-value-input.component.js.map +1 -1
  27. package/esm5/lib/interaction/components/activity-container/activity-container.component.js +2 -7
  28. package/esm5/lib/interaction/components/activity-container/activity-container.component.js.map +1 -1
  29. package/esm5/lib/place/place-component.js +1 -1
  30. package/esm5/lib/place/place-component.js.map +1 -1
  31. package/esm5/lib/place/place-router.js +2 -8
  32. package/esm5/lib/place/place-router.js.map +1 -1
  33. package/esm5/lib/place/route/parameter-decorators.js +2 -3
  34. package/esm5/lib/place/route/parameter-decorators.js.map +1 -1
  35. package/fesm2015/coolon-angular-ui-powerups.js +80 -89
  36. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  37. package/fesm5/coolon-angular-ui-powerups.js +85 -94
  38. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  39. package/lib/components/forms/abstract-list-input.component.d.ts +1 -1
  40. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  /* tslint:disable:no-input-rename */
3
3
  import { Component, EventEmitter, Input, Output } from '@angular/core';
4
- import { Dsl, Form, Guard, MutableListModel, TrackExternal } from '@coolon/pectin';
4
+ import { DebugContext, Dsl, Form, Guard, MutableListModel, TrackExternal } from '@coolon/pectin';
5
5
  import { AbstractInputComponent } from './abstract-input.component';
6
6
  let AbstractListInputComponent = class AbstractListInputComponent extends AbstractInputComponent {
7
7
  constructor() {
@@ -18,24 +18,25 @@ let AbstractListInputComponent = class AbstractListInputComponent extends Abstra
18
18
  */
19
19
  // We have to register it as a disposable so it ditches any listeners when we're disposed.
20
20
  this.inputModel = this.registerDisposable(new Form.DelegatingListModel());
21
- this.setValueIsInitialising = new Guard();
21
+ this.setValueIsInProgress = new Guard();
22
22
  this.valueChange = new EventEmitter();
23
23
  const { when } = Dsl.disposeWith(this);
24
24
  when(this.inputModel).changes(value => this.valueChange.emit(value), {
25
25
  initialValue: 'ignore',
26
- unless: this.setValueIsInitialising
26
+ unless: this.setValueIsInProgress
27
27
  });
28
+ DebugContext.tag(this.inputModel, `${this.constructor.name}.inputModel`);
28
29
  }
29
30
  set value(value) {
30
- if (!this.listHolder) {
31
- this.setValueIsInitialising.whileTrue(() => {
31
+ this.setValueIsInProgress.whileTrue(() => {
32
+ if (!this.listHolder) {
32
33
  this.listHolder = new MutableListModel(value);
33
34
  this.listModel = this.listHolder;
34
- });
35
- }
36
- else {
37
- this.listHolder.value = value;
38
- }
35
+ }
36
+ else {
37
+ this.listHolder.value = value;
38
+ }
39
+ });
39
40
  }
40
41
  };
41
42
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"abstract-list-input.component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/components/forms/abstract-list-input.component.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAqB,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,IAAa,0BAA0B,GAAvC,MAAa,0BAA8B,SAAQ,sBAA2B;IAmC5E;QACE,KAAK,EAAE,CAAC;QA/BV;;;;;;;;;WASG;QACD,0FAA0F;QACnF,eAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAK,CAAC,CAAC;QAEzE,2BAAsB,GAAG,IAAI,KAAK,EAAE,CAAC;QAe1B,gBAAW,GAAG,IAAI,YAAY,EAAO,CAAC;QAIvD,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACnE,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,IAAI,CAAC,sBAAsB;SACpC,CAAC,CAAC;IACL,CAAC;IArBQ,IAAI,KAAK,CAAC,KAAU;QAC3B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,GAAG,EAAE;gBACzC,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAI,KAAK,CAAC,CAAC;gBACjD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;YAEnC,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;SAC/B;IACH,CAAC;CAYF,CAAA;AAxCC;IADC,KAAK,EAAE,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;6DACG;AAkB/C;IAAR,KAAK,EAAE;;;uDAUP;AAES;IAAT,MAAM,EAAE;;+DAAgD;AAjC9C,0BAA0B;IADtC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;;GACf,0BAA0B,CA2CtC;SA3CY,0BAA0B","sourcesContent":["/* tslint:disable:no-input-rename */\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Dsl, Form, Guard, IMutableListModel, MutableListModel, TrackExternal } from '@coolon/pectin';\nimport { AbstractInputComponent } from './abstract-input.component';\n\n@Component({ template: '' })\nexport class AbstractListInputComponent<T> extends AbstractInputComponent<T[]> implements OnInit {\n\n @Input() @TrackExternal({ delegateTo: 'inputModel' })\n listModel: Form.ListModelBase<T> | IMutableListModel<T>;\n\n /**\n * A backing model for all our @Input() valueModel properties which should be defined as follows.\n *\n * @Input() @TrackExternal({useExisting: \"inputModel\"})\n * valueModel: Form.ListModelBase<string> | IMutableListModel<string>;\n *\n * This approach allows the input to accept plain or form models but all backed by a form\n * friendly delegate. We have to use an existing delegate for union types as pectin just\n * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).\n */\n // We have to register it as a disposable so it ditches any listeners when we're disposed.\n readonly inputModel = this.registerDisposable(new Form.DelegatingListModel<T>());\n\n private setValueIsInitialising = new Guard();\n private listHolder: MutableListModel<T>;\n\n @Input() set value(value: T[]) {\n if (!this.listHolder) {\n this.setValueIsInitialising.whileTrue(() => {\n this.listHolder = new MutableListModel<T>(value);\n this.listModel = this.listHolder;\n\n });\n } else {\n this.listHolder.value = value;\n }\n }\n\n @Output() readonly valueChange = new EventEmitter<T[]>();\n\n constructor() {\n super();\n const { when } = Dsl.disposeWith(this);\n when(this.inputModel).changes(value => this.valueChange.emit(value), {\n initialValue: 'ignore',\n unless: this.setValueIsInitialising\n });\n }\n}\n"]}
1
+ {"version":3,"file":"abstract-list-input.component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/components/forms/abstract-list-input.component.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAqB,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,IAAa,0BAA0B,GAAvC,MAAa,0BAA8B,SAAQ,sBAA2B;IAkC5E;QACE,KAAK,EAAE,CAAC;QA9BV;;;;;;;;;WASG;QACD,0FAA0F;QACnF,eAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAK,CAAC,CAAC;QAEzE,yBAAoB,GAAG,IAAI,KAAK,EAAE,CAAC;QAcxB,gBAAW,GAAG,IAAI,YAAY,EAAO,CAAC;QAIvD,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACnE,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,IAAI,CAAC,oBAAoB;SAClC,CAAC,CAAC;QACH,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,aAAa,CAAC,CAAC;IAC3E,CAAC;IArBQ,IAAI,KAAK,CAAC,KAAU;QAC3B,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACpB,IAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAI,KAAK,CAAC,CAAC;gBACjD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;aAClC;iBAAM;gBACL,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;aAC/B;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CAaF,CAAA;AAxCC;IADC,KAAK,EAAE,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;6DACG;AAkB/C;IAAR,KAAK,EAAE;;;uDASP;AAES;IAAT,MAAM,EAAE;;+DAAgD;AAhC9C,0BAA0B;IADtC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;;GACf,0BAA0B,CA2CtC;SA3CY,0BAA0B","sourcesContent":["/* tslint:disable:no-input-rename */\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { DebugContext, Dsl, Form, Guard, IMutableListModel, MutableListModel, TrackExternal } from '@coolon/pectin';\nimport { AbstractInputComponent } from './abstract-input.component';\n\n@Component({ template: '' })\nexport class AbstractListInputComponent<T> extends AbstractInputComponent<T[]> implements OnInit {\n\n @Input() @TrackExternal({ delegateTo: 'inputModel' })\n listModel: Form.ListModelBase<T> | IMutableListModel<T>;\n\n /**\n * A backing model for all our @Input() valueModel properties which should be defined as follows.\n *\n * @Input() @TrackExternal({useExisting: \"inputModel\"})\n * valueModel: Form.ListModelBase<string> | IMutableListModel<string>;\n *\n * This approach allows the input to accept plain or form models but all backed by a form\n * friendly delegate. We have to use an existing delegate for union types as pectin just\n * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).\n */\n // We have to register it as a disposable so it ditches any listeners when we're disposed.\n readonly inputModel = this.registerDisposable(new Form.DelegatingListModel<T>());\n\n private setValueIsInProgress = new Guard();\n private listHolder: MutableListModel<T>;\n\n @Input() set value(value: T[]) {\n this.setValueIsInProgress.whileTrue(() => {\n if (!this.listHolder) {\n this.listHolder = new MutableListModel<T>(value);\n this.listModel = this.listHolder;\n } else {\n this.listHolder.value = value;\n }\n });\n }\n\n @Output() readonly valueChange = new EventEmitter<T[]>();\n\n constructor() {\n super();\n const { when } = Dsl.disposeWith(this);\n when(this.inputModel).changes(value => this.valueChange.emit(value), {\n initialValue: 'ignore',\n unless: this.setValueIsInProgress\n });\n DebugContext.tag(this.inputModel, `${this.constructor.name}.inputModel`);\n }\n}\n"]}
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"AbstractListInputComponent":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"./abstract-input.component","name":"AbstractInputComponent","line":6,"character":51},"arity":1,"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":5,"character":1},"arguments":[{"template":""}]}],"members":{"listModel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":8,"character":3}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@coolon/pectin","name":"TrackExternal","line":8,"character":12},"arguments":[{"delegateTo":"inputModel"}]}]}],"value":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":27,"character":3}}]}],"valueChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":39,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"AbstractListInputComponent":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"./abstract-input.component","name":"AbstractInputComponent","line":6,"character":51},"arity":1,"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":5,"character":1},"arguments":[{"template":""}]}],"members":{"listModel":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":8,"character":3}},{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@coolon/pectin","name":"TrackExternal","line":8,"character":12},"arguments":[{"delegateTo":"inputModel"}]}]}],"value":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":27,"character":3}}]}],"valueChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":38,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor"}]}}}}]
@@ -1,7 +1,7 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  /* tslint:disable:no-input-rename */
3
3
  import { Component, EventEmitter, Input, Output } from '@angular/core';
4
- import { Dsl, Form, Guard, MutableValueModel, TrackExternal } from '@coolon/pectin';
4
+ import { DebugContext, Dsl, Form, Guard, MutableValueModel, TrackExternal } from '@coolon/pectin';
5
5
  import { AbstractInputComponent } from './abstract-input.component';
6
6
  let AbstractValueInputComponent = class AbstractValueInputComponent extends AbstractInputComponent {
7
7
  constructor() {
@@ -25,6 +25,7 @@ let AbstractValueInputComponent = class AbstractValueInputComponent extends Abst
25
25
  initialValue: 'ignore',
26
26
  unless: this.setValueInProgress
27
27
  });
28
+ DebugContext.tag(this.inputModel, `${this.constructor.name}.inputModel`);
28
29
  }
29
30
  set value(value) {
30
31
  // we never fire events during an external set value operation. This allows
@@ -1 +1 @@
1
- {"version":3,"file":"abstract-value-input.component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/components/forms/abstract-value-input.component.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAsB,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACxG,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,IAAa,2BAA2B,GAAxC,MAAa,2BAA+B,SAAQ,sBAAyB;IAqC3E;QACE,KAAK,EAAE,CAAC;QAjCV;;;;;;;;;WASG;QACD,0FAA0F;QACnF,eAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAK,CAAC,CAAC;QAExE,uBAAkB,GAAG,IAAI,KAAK,EAAE,CAAC;QAiBxB,gBAAW,GAAG,IAAI,YAAY,EAAK,CAAC;QAIrD,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACnE,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,IAAI,CAAC,kBAAkB;SAChC,CAAC,CAAC;IACL,CAAC;IAvBQ,IAAI,KAAK,CAAC,KAAQ;QACzB,2EAA2E;QAC3E,gEAAgE;QAChE,gCAAgC;QAChC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrB,IAAI,CAAC,WAAW,GAAG,IAAI,iBAAiB,CAAI,KAAK,CAAC,CAAC;gBACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;aACpC;iBAAM;gBACL,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;aAChC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CAYF,CAAA;AA1CC;IADC,KAAK,EAAE,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;+DACM;AAkBlD;IAAR,KAAK,EAAE;;;wDAYP;AAES;IAAT,MAAM,EAAE;;gEAA8C;AAnC5C,2BAA2B;IADvC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;;GACf,2BAA2B,CA6CvC;SA7CY,2BAA2B","sourcesContent":["/* tslint:disable:no-input-rename */\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Dsl, Form, Guard, IMutableValueModel, MutableValueModel, TrackExternal } from '@coolon/pectin';\nimport { AbstractInputComponent } from './abstract-input.component';\n\n@Component({ template: '' })\nexport class AbstractValueInputComponent<T> extends AbstractInputComponent<T> implements OnInit {\n\n @Input() @TrackExternal({ delegateTo: 'inputModel' })\n valueModel: Form.ValueModelBase<T> | IMutableValueModel<T>;\n\n /**\n * A backing model for all our @Input() valueModel properties which should be defined as follows.\n *\n * @Input() @TrackExternal({useExisting: \"inputModel\"})\n * valueModel: DirtyTrackingForm.ValueModel<string> | IMutableValueModel<string>;\n *\n * This approach allows the input to accept plain or form models but all backed by a form\n * friendly delegate. We have to use an existing delegate for union types as pectin just\n * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).\n */\n // We have to register it as a disposable so it ditches any listeners when we're disposed.\n readonly inputModel = this.registerDisposable(new Form.DelegatingValueModel<T>());\n\n protected setValueInProgress = new Guard();\n private valueHolder: MutableValueModel<T>;\n\n @Input() set value(value: T) {\n // we never fire events during an external set value operation. This allows\n // the component to behave when used in the conventional angular\n // fashion, i.e. [(value)]=\"...\"\n this.setValueInProgress.whileTrue(() => {\n if (!this.valueHolder) {\n this.valueHolder = new MutableValueModel<T>(value);\n this.valueModel = this.valueHolder;\n } else {\n this.valueHolder.value = value;\n }\n });\n }\n\n @Output() readonly valueChange = new EventEmitter<T>();\n\n constructor() {\n super();\n const { when } = Dsl.disposeWith(this);\n when(this.inputModel).changes(value => this.valueChange.emit(value), {\n initialValue: 'ignore',\n unless: this.setValueInProgress\n });\n }\n}\n"]}
1
+ {"version":3,"file":"abstract-value-input.component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/components/forms/abstract-value-input.component.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAsB,iBAAiB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE,IAAa,2BAA2B,GAAxC,MAAa,2BAA+B,SAAQ,sBAAyB;IAqC3E;QACE,KAAK,EAAE,CAAC;QAjCV;;;;;;;;;WASG;QACD,0FAA0F;QACnF,eAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,oBAAoB,EAAK,CAAC,CAAC;QAExE,uBAAkB,GAAG,IAAI,KAAK,EAAE,CAAC;QAiBxB,gBAAW,GAAG,IAAI,YAAY,EAAK,CAAC;QAIrD,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YACnE,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,IAAI,CAAC,kBAAkB;SAChC,CAAC,CAAC;QACH,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,aAAa,CAAC,CAAC;IAC3E,CAAC;IAxBQ,IAAI,KAAK,CAAC,KAAQ;QACzB,2EAA2E;QAC3E,gEAAgE;QAChE,gCAAgC;QAChC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrB,IAAI,CAAC,WAAW,GAAG,IAAI,iBAAiB,CAAI,KAAK,CAAC,CAAC;gBACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;aACpC;iBAAM;gBACL,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;aAChC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CAaF,CAAA;AA3CC;IADC,KAAK,EAAE,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;+DACM;AAkBlD;IAAR,KAAK,EAAE;;;wDAYP;AAES;IAAT,MAAM,EAAE;;gEAA8C;AAnC5C,2BAA2B;IADvC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;;GACf,2BAA2B,CA8CvC;SA9CY,2BAA2B","sourcesContent":["/* tslint:disable:no-input-rename */\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { DebugContext, Dsl, Form, Guard, IMutableValueModel, MutableValueModel, TrackExternal } from '@coolon/pectin';\nimport { AbstractInputComponent } from './abstract-input.component';\n\n@Component({ template: '' })\nexport class AbstractValueInputComponent<T> extends AbstractInputComponent<T> implements OnInit {\n\n @Input() @TrackExternal({ delegateTo: 'inputModel' })\n valueModel: Form.ValueModelBase<T> | IMutableValueModel<T>;\n\n /**\n * A backing model for all our @Input() valueModel properties which should be defined as follows.\n *\n * @Input() @TrackExternal({useExisting: \"inputModel\"})\n * valueModel: DirtyTrackingForm.ValueModel<string> | IMutableValueModel<string>;\n *\n * This approach allows the input to accept plain or form models but all backed by a form\n * friendly delegate. We have to use an existing delegate for union types as pectin just\n * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).\n */\n // We have to register it as a disposable so it ditches any listeners when we're disposed.\n readonly inputModel = this.registerDisposable(new Form.DelegatingValueModel<T>());\n\n protected setValueInProgress = new Guard();\n private valueHolder: MutableValueModel<T>;\n\n @Input() set value(value: T) {\n // we never fire events during an external set value operation. This allows\n // the component to behave when used in the conventional angular\n // fashion, i.e. [(value)]=\"...\"\n this.setValueInProgress.whileTrue(() => {\n if (!this.valueHolder) {\n this.valueHolder = new MutableValueModel<T>(value);\n this.valueModel = this.valueHolder;\n } else {\n this.valueHolder.value = value;\n }\n });\n }\n\n @Output() readonly valueChange = new EventEmitter<T>();\n\n constructor() {\n super();\n const { when } = Dsl.disposeWith(this);\n when(this.inputModel).changes(value => this.valueChange.emit(value), {\n initialValue: 'ignore',\n unless: this.setValueInProgress\n });\n DebugContext.tag(this.inputModel, `${this.constructor.name}.inputModel`);\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { __awaiter, __decorate, __metadata } from "tslib";
2
2
  import { Component, Input, QueryList, ViewChild, ViewChildren } from '@angular/core';
3
3
  import { MatTabGroup } from '@angular/material/tabs';
4
- import { assert, Dsl, GarbageCollector, Trace } from '@coolon/pectin';
4
+ import { assert, Dsl, GarbageCollector } from '@coolon/pectin';
5
5
  import { lang } from '@coolon/typescript-utilities';
6
6
  import _ from 'lodash';
7
7
  import { AbstractInteractionContext } from '../../abstract-interaction-context';
@@ -44,6 +44,7 @@ let ActivityContainerComponent = class ActivityContainerComponent extends Abstra
44
44
  registerDisposable(disposable) {
45
45
  return this.garbage.registerDisposable(disposable);
46
46
  }
47
+ // @Trace()
47
48
  dispose() {
48
49
  // TODO: think about auto cancelling any outstanding activity on dispose.
49
50
  // See NavigationState.Navigating for a use-case.
@@ -183,12 +184,6 @@ __decorate([
183
184
  ViewChildren(ActivityOutletComponent),
184
185
  __metadata("design:type", QueryList)
185
186
  ], ActivityContainerComponent.prototype, "activityOutlets", void 0);
186
- __decorate([
187
- Trace(),
188
- __metadata("design:type", Function),
189
- __metadata("design:paramtypes", []),
190
- __metadata("design:returntype", void 0)
191
- ], ActivityContainerComponent.prototype, "dispose", null);
192
187
  ActivityContainerComponent = __decorate([
193
188
  Component({
194
189
  selector: 'aup-activity-container',
@@ -1 +1 @@
1
- {"version":3,"file":"activity-container.component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/interaction/components/activity-container/activity-container.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { AfterViewInit, Component, Input, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core';\nimport { MatTabGroup } from '@angular/material/tabs';\nimport { assert, Constructable, Disposable, Dsl, GarbageCollector, Trace } from '@coolon/pectin';\nimport { lang } from '@coolon/typescript-utilities';\nimport _ from 'lodash';\nimport { AbstractInteractionContext } from '../../abstract-interaction-context';\nimport { Activity } from '../../activity';\nimport { ActivityRef } from '../../activity-ref';\nimport { InteractionService } from '../../services/interaction.service';\nimport { ActivityOutletComponent } from './activity-outlet/activity-outlet.component';\n\n@Component({\n selector: 'aup-activity-container',\n templateUrl: './activity-container.component.html',\n styleUrls: ['./activity-container.component.scss']\n})\nexport class ActivityContainerComponent<D, R, E> extends AbstractInteractionContext implements OnInit, AfterViewInit {\n\n @Input()\n dynamicHeight = false;\n\n @ViewChild('tabs', { static: true })\n tabs: MatTabGroup;\n\n @ViewChildren(ActivityOutletComponent)\n activityOutlets: QueryList<ActivityOutletComponent<any, any, any>>;\n\n activityTabs: ActivityRef<any, any, any>[] = [];\n\n private _identifier: string;\n private _deferredCleanUp: Promise<any>;\n\n private interactionServiceApi: InteractionService.Api;\n\n private garbage = new GarbageCollector();\n private syncSelectedTabTimeout: any;\n private onAnimationFinishedJob: () => void;\n\n constructor() {\n super();\n }\n\n ngOnInit() {\n }\n\n ngAfterViewInit(): void {\n const { chain, observe } = Dsl.disposeWith(this);\n // using the component directly rather than (animationDone)=.. allows us\n // to keep our callback private.\n observe.valuesFrom(this.tabs.animationDone).subscribe(() => this.onAnimationFinished());\n }\n\n initialise(identifier: string, api: InteractionService.Api) {\n assert.isFalsey(this.isInitialised());\n assert.notNil(identifier);\n assert.notNil(api);\n this._identifier = identifier;\n this.interactionServiceApi = api;\n }\n\n get identifier() {\n return this._identifier;\n }\n\n isInitialised() {\n return !!this.identifier;\n }\n\n /**\n * Returns true if an activity is currently running.\n */\n isActive(): boolean {\n return this.getActiveActivityCount() > 0;\n }\n\n registerDisposable<T extends Disposable>(disposable: T): T {\n return this.garbage.registerDisposable(disposable);\n }\n\n @Trace()\n dispose(): void {\n // TODO: think about auto cancelling any outstanding activity on dispose.\n // See NavigationState.Navigating for a use-case.\n assert.isFalsey(this.isActive());\n this.garbage.dispose();\n }\n\n getActiveActivityRef(): ActivityRef<any, any, any> {\n if (!this.isActive()) {\n lang.illegalState('no activity in progress');\n }\n return _.findLast(this.activityTabs, tab => !tab.isComplete());\n }\n\n /**\n * Cancels the current activity and returns true the context is no longer active, false if\n * there is still another activity running.\n */\n // @Trace()\n async cancelActiveActivity(): Promise<boolean> {\n const activity = this.getActiveActivityRef();\n activity.cancel();\n if (this.isCleaningUp()) {\n return this.waitForInteractionContextCleanupToFinish();\n } else {\n return !this.isActive();\n }\n }\n\n // TODO: this handling of multiple nested activities is only used by the activity component and is not a general case.\n // @Trace()\n protected createAndLaunchActivity<D1, R1, E1>(activityType: Constructable<Activity<D1, R1, E1>>, data: D1, disableClose: boolean): Promise<R1> {\n assert.isTruthy(this.isInitialised()); // make sure we've been initialised\n const activityRef = new ActivityRef<D1, R1, E1>(activityType, data, () => {\n const activeActivityCount = this.getActiveActivityCount() > 0;\n if (activeActivityCount) {\n this.triggerTabSynchronisation();\n } else {\n this.finishAndStartCleanup();\n }\n });\n this.launchActivity(activityRef);\n // if this is the first activity let the interaction service know.\n if (this.activityTabs.length === 1) {\n // console.log('Now active!!!');\n this.interactionServiceApi.notifyActive(this);\n }\n return activityRef.activityResult;\n }\n\n private getActiveActivityCount(): number {\n return this.activityTabs.filter(ref => !ref.isComplete()).length;\n }\n\n /**\n * Checks if this interaction context has finished an is in the process of waiting\n * for all the infrastructure (including route updates) to be completed.\n */\n isCleaningUp(): boolean {\n return !!this._deferredCleanUp;\n }\n\n async waitForInteractionContextCleanupToFinish(): Promise<any> {\n return this._deferredCleanUp ?\n this._deferredCleanUp :\n true;\n }\n\n // @Trace()\n private finishAndStartCleanup(): void {\n if (!this._deferredCleanUp) {\n // Important:\n // Clear our tabs so the next activity triggers a tab change.\n // Without this our animation done wasn't called when a single\n // new activity followed a single tab activity (since we're tracking\n // by activity index)\n this.activityTabs = [];\n const promise = this.interactionServiceApi.notifyFinished(this);\n this._deferredCleanUp = promise\n .finally(() => {\n this._deferredCleanUp = null;\n });\n }\n }\n\n// @Trace()\n launchActivity<D1, R1, E1>(activityRef: ActivityRef<D1, R1, E1>) {\n const cleanedTabs = this.activityTabs.filter(tab => !tab.isComplete());\n this.activityTabs = cleanedTabs.concat(activityRef);\n this.synchroniseSelectedTabIndex();\n }\n\n activityIndex(index: number, activityRef: ActivityRef<any, any, any>) {\n return index;\n };\n\n private onAnimationFinished() {\n if (this.onAnimationFinishedJob) {\n this.onAnimationFinishedJob();\n this.onAnimationFinishedJob = undefined;\n }\n }\n\n /**\n * Synchronises the selected tab index.\n */\n private synchroniseSelectedTabIndex(): void {\n const previousIndex = this.tabs.selectedIndex;\n const newIndex = this.getActiveActivityCount() - 1;\n if (previousIndex !== newIndex) {\n this.tabs.selectedIndex = newIndex;\n this.onAnimationFinishedJob = () => {\n this.getSelectedOutlet().component.onActivityReady();\n this.activityTabs = this.activityTabs.filter(tab => !tab.isComplete());\n }\n }\n }\n\n private getSelectedOutlet() {\n return this.activityOutlets.toArray()[this.tabs.selectedIndex];\n }\n\n // @Trace()\n private triggerTabSynchronisation() {\n if (this.syncSelectedTabTimeout) {\n clearTimeout(this.syncSelectedTabTimeout);\n }\n this.syncSelectedTabTimeout = setTimeout(() => {\n this.syncSelectedTabTimeout = null;\n this.synchroniseSelectedTabIndex();\n }, 75);\n }\n}\n"]}
1
+ {"version":3,"file":"activity-container.component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/interaction/components/activity-container/activity-container.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { AfterViewInit, Component, Input, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core';\nimport { MatTabGroup } from '@angular/material/tabs';\nimport { assert, Constructable, Disposable, Dsl, GarbageCollector, Trace } from '@coolon/pectin';\nimport { lang } from '@coolon/typescript-utilities';\nimport _ from 'lodash';\nimport { AbstractInteractionContext } from '../../abstract-interaction-context';\nimport { Activity } from '../../activity';\nimport { ActivityRef } from '../../activity-ref';\nimport { InteractionService } from '../../services/interaction.service';\nimport { ActivityOutletComponent } from './activity-outlet/activity-outlet.component';\n\n@Component({\n selector: 'aup-activity-container',\n templateUrl: './activity-container.component.html',\n styleUrls: ['./activity-container.component.scss']\n})\nexport class ActivityContainerComponent<D, R, E> extends AbstractInteractionContext implements OnInit, AfterViewInit {\n\n @Input()\n dynamicHeight = false;\n\n @ViewChild('tabs', { static: true })\n tabs: MatTabGroup;\n\n @ViewChildren(ActivityOutletComponent)\n activityOutlets: QueryList<ActivityOutletComponent<any, any, any>>;\n\n activityTabs: ActivityRef<any, any, any>[] = [];\n\n private _identifier: string;\n private _deferredCleanUp: Promise<any>;\n\n private interactionServiceApi: InteractionService.Api;\n\n private garbage = new GarbageCollector();\n private syncSelectedTabTimeout: any;\n private onAnimationFinishedJob: () => void;\n\n constructor() {\n super();\n }\n\n ngOnInit() {\n }\n\n ngAfterViewInit(): void {\n const { chain, observe } = Dsl.disposeWith(this);\n // using the component directly rather than (animationDone)=.. allows us\n // to keep our callback private.\n observe.valuesFrom(this.tabs.animationDone).subscribe(() => this.onAnimationFinished());\n }\n\n initialise(identifier: string, api: InteractionService.Api) {\n assert.isFalsey(this.isInitialised());\n assert.notNil(identifier);\n assert.notNil(api);\n this._identifier = identifier;\n this.interactionServiceApi = api;\n }\n\n get identifier() {\n return this._identifier;\n }\n\n isInitialised() {\n return !!this.identifier;\n }\n\n /**\n * Returns true if an activity is currently running.\n */\n isActive(): boolean {\n return this.getActiveActivityCount() > 0;\n }\n\n registerDisposable<T extends Disposable>(disposable: T): T {\n return this.garbage.registerDisposable(disposable);\n }\n\n // @Trace()\n dispose(): void {\n // TODO: think about auto cancelling any outstanding activity on dispose.\n // See NavigationState.Navigating for a use-case.\n assert.isFalsey(this.isActive());\n this.garbage.dispose();\n }\n\n getActiveActivityRef(): ActivityRef<any, any, any> {\n if (!this.isActive()) {\n lang.illegalState('no activity in progress');\n }\n return _.findLast(this.activityTabs, tab => !tab.isComplete());\n }\n\n /**\n * Cancels the current activity and returns true the context is no longer active, false if\n * there is still another activity running.\n */\n // @Trace()\n async cancelActiveActivity(): Promise<boolean> {\n const activity = this.getActiveActivityRef();\n activity.cancel();\n if (this.isCleaningUp()) {\n return this.waitForInteractionContextCleanupToFinish();\n } else {\n return !this.isActive();\n }\n }\n\n // TODO: this handling of multiple nested activities is only used by the activity component and is not a general case.\n // @Trace()\n protected createAndLaunchActivity<D1, R1, E1>(activityType: Constructable<Activity<D1, R1, E1>>, data: D1, disableClose: boolean): Promise<R1> {\n assert.isTruthy(this.isInitialised()); // make sure we've been initialised\n const activityRef = new ActivityRef<D1, R1, E1>(activityType, data, () => {\n const activeActivityCount = this.getActiveActivityCount() > 0;\n if (activeActivityCount) {\n this.triggerTabSynchronisation();\n } else {\n this.finishAndStartCleanup();\n }\n });\n this.launchActivity(activityRef);\n // if this is the first activity let the interaction service know.\n if (this.activityTabs.length === 1) {\n // console.log('Now active!!!');\n this.interactionServiceApi.notifyActive(this);\n }\n return activityRef.activityResult;\n }\n\n private getActiveActivityCount(): number {\n return this.activityTabs.filter(ref => !ref.isComplete()).length;\n }\n\n /**\n * Checks if this interaction context has finished an is in the process of waiting\n * for all the infrastructure (including route updates) to be completed.\n */\n isCleaningUp(): boolean {\n return !!this._deferredCleanUp;\n }\n\n async waitForInteractionContextCleanupToFinish(): Promise<any> {\n return this._deferredCleanUp ?\n this._deferredCleanUp :\n true;\n }\n\n // @Trace()\n private finishAndStartCleanup(): void {\n if (!this._deferredCleanUp) {\n // Important:\n // Clear our tabs so the next activity triggers a tab change.\n // Without this our animation done wasn't called when a single\n // new activity followed a single tab activity (since we're tracking\n // by activity index)\n this.activityTabs = [];\n const promise = this.interactionServiceApi.notifyFinished(this);\n this._deferredCleanUp = promise\n .finally(() => {\n this._deferredCleanUp = null;\n });\n }\n }\n\n// @Trace()\n launchActivity<D1, R1, E1>(activityRef: ActivityRef<D1, R1, E1>) {\n const cleanedTabs = this.activityTabs.filter(tab => !tab.isComplete());\n this.activityTabs = cleanedTabs.concat(activityRef);\n this.synchroniseSelectedTabIndex();\n }\n\n activityIndex(index: number, activityRef: ActivityRef<any, any, any>) {\n return index;\n };\n\n private onAnimationFinished() {\n if (this.onAnimationFinishedJob) {\n this.onAnimationFinishedJob();\n this.onAnimationFinishedJob = undefined;\n }\n }\n\n /**\n * Synchronises the selected tab index.\n */\n private synchroniseSelectedTabIndex(): void {\n const previousIndex = this.tabs.selectedIndex;\n const newIndex = this.getActiveActivityCount() - 1;\n if (previousIndex !== newIndex) {\n this.tabs.selectedIndex = newIndex;\n this.onAnimationFinishedJob = () => {\n this.getSelectedOutlet().component.onActivityReady();\n this.activityTabs = this.activityTabs.filter(tab => !tab.isComplete());\n }\n }\n }\n\n private getSelectedOutlet() {\n return this.activityOutlets.toArray()[this.tabs.selectedIndex];\n }\n\n // @Trace()\n private triggerTabSynchronisation() {\n if (this.syncSelectedTabTimeout) {\n clearTimeout(this.syncSelectedTabTimeout);\n }\n this.syncSelectedTabTimeout = setTimeout(() => {\n this.syncSelectedTabTimeout = null;\n this.synchroniseSelectedTabIndex();\n }, 75);\n }\n}\n"]}
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"ActivityContainerComponent":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../../abstract-interaction-context","name":"AbstractInteractionContext","line":16,"character":57},"arity":3,"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":11,"character":1},"arguments":[{"selector":"aup-activity-container","template":"<mat-tab-group #tabs no-tab-header\n [dynamicHeight]=\"dynamicHeight\"\n [class.full-height-tabs]=\"!dynamicHeight\">\n <mat-tab *ngFor=\"let tab of activityTabs; trackBy: activityIndex\" >\n <aup-activity-outlet [nestedInteractionContext]=\"this\" [activityRef]=\"tab\"></aup-activity-outlet>\n </mat-tab>\n</mat-tab-group>\n","styles":[":host{display:flex;flex-direction:column}mat-tab-group{flex:1}"]}]}],"members":{"dynamicHeight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":18,"character":3}}]}],"tabs":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":21,"character":3},"arguments":["tabs",{"static":true}]}]}],"activityOutlets":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChildren","line":24,"character":3},"arguments":[{"__symbolic":"reference","module":"./activity-outlet/activity-outlet.component","name":"ActivityOutletComponent","line":24,"character":16}]}]}],"__ctor__":[{"__symbolic":"constructor"}],"ngOnInit":[{"__symbolic":"method"}],"ngAfterViewInit":[{"__symbolic":"method"}],"initialise":[{"__symbolic":"method"}],"isInitialised":[{"__symbolic":"method"}],"isActive":[{"__symbolic":"method"}],"registerDisposable":[{"__symbolic":"method"}],"dispose":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@coolon/pectin","name":"Trace","line":79,"character":3}}]}],"getActiveActivityRef":[{"__symbolic":"method"}],"cancelActiveActivity":[{"__symbolic":"method"}],"createAndLaunchActivity":[{"__symbolic":"method"}],"getActiveActivityCount":[{"__symbolic":"method"}],"isCleaningUp":[{"__symbolic":"method"}],"waitForInteractionContextCleanupToFinish":[{"__symbolic":"method"}],"finishAndStartCleanup":[{"__symbolic":"method"}],"launchActivity":[{"__symbolic":"method"}],"activityIndex":[{"__symbolic":"method"}],"onAnimationFinished":[{"__symbolic":"method"}],"synchroniseSelectedTabIndex":[{"__symbolic":"method"}],"getSelectedOutlet":[{"__symbolic":"method"}],"triggerTabSynchronisation":[{"__symbolic":"method"}]}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"ActivityContainerComponent":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"../../abstract-interaction-context","name":"AbstractInteractionContext","line":16,"character":57},"arity":3,"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":11,"character":1},"arguments":[{"selector":"aup-activity-container","template":"<mat-tab-group #tabs no-tab-header\n [dynamicHeight]=\"dynamicHeight\"\n [class.full-height-tabs]=\"!dynamicHeight\">\n <mat-tab *ngFor=\"let tab of activityTabs; trackBy: activityIndex\" >\n <aup-activity-outlet [nestedInteractionContext]=\"this\" [activityRef]=\"tab\"></aup-activity-outlet>\n </mat-tab>\n</mat-tab-group>\n","styles":[":host{display:flex;flex-direction:column}mat-tab-group{flex:1}"]}]}],"members":{"dynamicHeight":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":18,"character":3}}]}],"tabs":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":21,"character":3},"arguments":["tabs",{"static":true}]}]}],"activityOutlets":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChildren","line":24,"character":3},"arguments":[{"__symbolic":"reference","module":"./activity-outlet/activity-outlet.component","name":"ActivityOutletComponent","line":24,"character":16}]}]}],"__ctor__":[{"__symbolic":"constructor"}],"ngOnInit":[{"__symbolic":"method"}],"ngAfterViewInit":[{"__symbolic":"method"}],"initialise":[{"__symbolic":"method"}],"isInitialised":[{"__symbolic":"method"}],"isActive":[{"__symbolic":"method"}],"registerDisposable":[{"__symbolic":"method"}],"dispose":[{"__symbolic":"method"}],"getActiveActivityRef":[{"__symbolic":"method"}],"cancelActiveActivity":[{"__symbolic":"method"}],"createAndLaunchActivity":[{"__symbolic":"method"}],"getActiveActivityCount":[{"__symbolic":"method"}],"isCleaningUp":[{"__symbolic":"method"}],"waitForInteractionContextCleanupToFinish":[{"__symbolic":"method"}],"finishAndStartCleanup":[{"__symbolic":"method"}],"launchActivity":[{"__symbolic":"method"}],"activityIndex":[{"__symbolic":"method"}],"onAnimationFinished":[{"__symbolic":"method"}],"synchroniseSelectedTabIndex":[{"__symbolic":"method"}],"getSelectedOutlet":[{"__symbolic":"method"}],"triggerTabSynchronisation":[{"__symbolic":"method"}]}}}}]
@@ -22,7 +22,7 @@ let PlaceComponent = PlaceComponent_1 = class PlaceComponent extends DisposableC
22
22
  assert.isNil(this.visitModel.value);
23
23
  const { when } = Dsl.disposeWith(this);
24
24
  this.visitModel.value = visit;
25
- DebugContext.get(this.visitModel).tag(`${this.placeDefinition.component.name}.visitModel`);
25
+ DebugContext.getOrCreate(this.visitModel).tag(`${this.placeDefinition.component.name}.visitModel`);
26
26
  this.placeDefinition.getVisitParameterDefs().forEach(parameterDef => this.installBinding(parameterDef));
27
27
  when.valueOf(this.visitModel).changes((current, previous) => {
28
28
  notifyVisitChanged(current, previous);
@@ -1 +1 @@
1
- {"version":3,"file":"place-component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/place/place-component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Directive } from '@angular/core';\nimport {\n assert,\n Binding,\n Constructable,\n DebugContext,\n Dsl,\n Guard,\n IMutableHasValue,\n lang,\n MutableValueModel\n} from '@coolon/pectin';\nimport { Klass } from '@coolon/typescript-utilities';\nimport { Memoize } from '@typescript-plus/fast-memoize-decorator';\nimport 'reflect-metadata';\nimport { DisposableComponent } from '../components/disposable-component';\nimport { InteractionContext } from '../interaction/interaction-context';\nimport { PlaceDefinition } from './place-definition';\nimport { ParameterDefinition } from './route/parameter-definition.class';\nimport { Visit } from './visit';\n\n// RAKE: making this Symbol(...) broke things.\nexport const DEFINITION_META_DATA_KEY = 'PLACE_DEFINITION_OPTIONS';\n// this one seems ok.\nexport const ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');\n\n@Directive()\nexport class PlaceComponent extends DisposableComponent {\n\n private visitModel = new MutableValueModel<Visit>();\n private _inVisitUpdate = new Guard();\n\n interactionContext?: InteractionContext;\n\n canDeactivate?(interactionContext: InteractionContext): boolean | Promise<boolean>;\n\n constructor() {\n super();\n }\n\n // @Trace()\n public initialiseVisit(visit: Visit, notifyVisitChanged: (current: Visit, previous:Visit) => void) {\n assert.isNil(this.visitModel.value);\n\n const { when } = Dsl.disposeWith(this);\n\n this.visitModel.value = visit;\n DebugContext.get(this.visitModel).tag(`${this.placeDefinition.component.name}.visitModel`);\n this.placeDefinition.getVisitParameterDefs().forEach(parameterDef => this.installBinding(parameterDef));\n when.valueOf(this.visitModel).changes((current,previous) => {\n notifyVisitChanged(current, previous);\n }, {unless: this._inVisitUpdate});\n }\n\n public updateVisit(visit: Visit) {\n assert.isTruthy(this.isInitialised());\n assert.notNil(visit);\n this._inVisitUpdate.whileTrue(() => {\n this.visitModel.value = visit;\n });\n }\n\n isInitialised() {\n return !!this.visitModel.value;\n }\n\n // @Trace()\n private installBinding<T, S>(parameterDef: ParameterDefinition<T, S>) {\n const model = this[parameterDef.propertyName] as IMutableHasValue<S>;\n DebugContext.tag(model, `${this.placeDefinition.component.name}.${parameterDef.propertyName}`);\n const binding = this.registerDisposable(new Binding(this.visitModel, model, {\n toRight(visit: Visit): S {\n const value = visit.getParameter(parameterDef.name);\n // console.log('push to component', { name: parameterDef.name, value, visit });\n return value;\n },\n toLeft(value: S, currentVisit?: Visit): Visit {\n // console.log('push to route', { name: parameterDef.name, value, currentVisit });\n return currentVisit.replace(parameterDef, value);\n }\n }));\n\n binding.writeRight();\n }\n\n @Memoize()\n get placeDefinition(): PlaceDefinition {\n return PlaceComponent.getDefinition(this.constructor as any as Constructable<PlaceComponent>);\n }\n\n get childPlaces(): Constructable<PlaceComponent>[] {\n return this.placeDefinition.children.map(d => d.component);\n }\n\n onPlaceReady() {\n }\n\n}\n\nexport namespace PlaceComponent {\n\n export function isPlaceComponentConstructor(target: any): target is Constructable<PlaceComponent> {\n return lang.constructorChain(target as Constructable<any>).includes(PlaceComponent);\n }\n\n export function getRouteParameters(klass: Constructable<PlaceComponent>): ParameterDefinition<any>[] {\n return Klass.get(klass).getMetadataList(ROUTE_PARAMETER_LIST_KEY) as ParameterDefinition<any>[];\n }\n\n export function getDefinition(klass: Constructable<PlaceComponent>): PlaceDefinition {\n return Reflect.getMetadata(DEFINITION_META_DATA_KEY, klass);\n }\n\n export function injectDefinition(klass: Constructable<PlaceComponent>, definition: PlaceDefinition) {\n Reflect.defineMetadata(DEFINITION_META_DATA_KEY, definition, klass);\n }\n\n}\n"]}
1
+ {"version":3,"file":"place-component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/place/place-component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Directive } from '@angular/core';\nimport {\n assert,\n Binding,\n Constructable,\n DebugContext,\n Dsl,\n Guard,\n IMutableHasValue,\n lang,\n MutableValueModel\n} from '@coolon/pectin';\nimport { Klass } from '@coolon/typescript-utilities';\nimport { Memoize } from '@typescript-plus/fast-memoize-decorator';\nimport 'reflect-metadata';\nimport { DisposableComponent } from '../components/disposable-component';\nimport { InteractionContext } from '../interaction/interaction-context';\nimport { PlaceDefinition } from './place-definition';\nimport { ParameterDefinition } from './route/parameter-definition.class';\nimport { Visit } from './visit';\n\n// RAKE: making this Symbol(...) broke things.\nexport const DEFINITION_META_DATA_KEY = 'PLACE_DEFINITION_OPTIONS';\n// this one seems ok.\nexport const ROUTE_PARAMETER_LIST_KEY = Symbol('place:route:parameters');\n\n@Directive()\nexport class PlaceComponent extends DisposableComponent {\n\n private visitModel = new MutableValueModel<Visit>();\n private _inVisitUpdate = new Guard();\n\n interactionContext?: InteractionContext;\n\n canDeactivate?(interactionContext: InteractionContext): boolean | Promise<boolean>;\n\n constructor() {\n super();\n }\n\n // @Trace()\n public initialiseVisit(visit: Visit, notifyVisitChanged: (current: Visit, previous:Visit) => void) {\n assert.isNil(this.visitModel.value);\n\n const { when } = Dsl.disposeWith(this);\n\n this.visitModel.value = visit;\n DebugContext.getOrCreate(this.visitModel).tag(`${this.placeDefinition.component.name}.visitModel`);\n this.placeDefinition.getVisitParameterDefs().forEach(parameterDef => this.installBinding(parameterDef));\n when.valueOf(this.visitModel).changes((current,previous) => {\n notifyVisitChanged(current, previous);\n }, {unless: this._inVisitUpdate});\n }\n\n public updateVisit(visit: Visit) {\n assert.isTruthy(this.isInitialised());\n assert.notNil(visit);\n this._inVisitUpdate.whileTrue(() => {\n this.visitModel.value = visit;\n });\n }\n\n isInitialised() {\n return !!this.visitModel.value;\n }\n\n // @Trace()\n private installBinding<T, S>(parameterDef: ParameterDefinition<T, S>) {\n const model = this[parameterDef.propertyName] as IMutableHasValue<S>;\n DebugContext.tag(model, `${this.placeDefinition.component.name}.${parameterDef.propertyName}`);\n const binding = this.registerDisposable(new Binding(this.visitModel, model, {\n toRight(visit: Visit): S {\n const value = visit.getParameter(parameterDef.name);\n // console.log('push to component', { name: parameterDef.name, value, visit });\n return value;\n },\n toLeft(value: S, currentVisit?: Visit): Visit {\n // console.log('push to route', { name: parameterDef.name, value, currentVisit });\n return currentVisit.replace(parameterDef, value);\n }\n }));\n\n binding.writeRight();\n }\n\n @Memoize()\n get placeDefinition(): PlaceDefinition {\n return PlaceComponent.getDefinition(this.constructor as any as Constructable<PlaceComponent>);\n }\n\n get childPlaces(): Constructable<PlaceComponent>[] {\n return this.placeDefinition.children.map(d => d.component);\n }\n\n onPlaceReady() {\n }\n\n}\n\nexport namespace PlaceComponent {\n\n export function isPlaceComponentConstructor(target: any): target is Constructable<PlaceComponent> {\n return lang.constructorChain(target as Constructable<any>).includes(PlaceComponent);\n }\n\n export function getRouteParameters(klass: Constructable<PlaceComponent>): ParameterDefinition<any>[] {\n return Klass.get(klass).getMetadataList(ROUTE_PARAMETER_LIST_KEY) as ParameterDefinition<any>[];\n }\n\n export function getDefinition(klass: Constructable<PlaceComponent>): PlaceDefinition {\n return Reflect.getMetadata(DEFINITION_META_DATA_KEY, klass);\n }\n\n export function injectDefinition(klass: Constructable<PlaceComponent>, definition: PlaceDefinition) {\n Reflect.defineMetadata(DEFINITION_META_DATA_KEY, definition, klass);\n }\n\n}\n"]}
@@ -2,7 +2,7 @@ import { __awaiter, __decorate, __metadata } from "tslib";
2
2
  import { Location } from '@angular/common';
3
3
  import { Injectable } from '@angular/core';
4
4
  import { ActivatedRoute, NavigationCancel, NavigationEnd, NavigationError, NavigationExtras, NavigationStart, Router } from '@angular/router';
5
- import { assert, DebugContext, Dsl, GarbageCollector, lang, Logger, MutableListModel, MutableValueModel, Trace } from '@coolon/pectin';
5
+ import { assert, DebugContext, Dsl, GarbageCollector, lang, Logger, MutableListModel, MutableValueModel } from '@coolon/pectin';
6
6
  import { InteractionService } from '../interaction/services/interaction.service';
7
7
  import { NavigatingDuringInteraction } from './navigation/session/interactions/navigating-during-interaction';
8
8
  import { PopStateDuringInteractionNavigation } from './navigation/session/interactions/pop-state-during-interaction-navigation';
@@ -12,7 +12,6 @@ import { NavigationContext } from './navigation/session/navigation-context';
12
12
  import { PopStateNavigation } from './navigation/session/pop-state-navigation';
13
13
  import { PlaceHistory } from './place-history';
14
14
  import { UrlService } from './url-service';
15
- import { Visit } from './visit';
16
15
  import * as i0 from "@angular/core";
17
16
  import * as i1 from "@angular/router";
18
17
  import * as i2 from "@angular/common";
@@ -180,6 +179,7 @@ let PlaceRouter = class PlaceRouter extends GarbageCollector {
180
179
  get activeVisits() {
181
180
  return this._activeVisits.readonly;
182
181
  }
182
+ // @Trace()
183
183
  pushVisitChangesToRoute(previous, next) {
184
184
  return __awaiter(this, void 0, void 0, function* () {
185
185
  this.placeHistory.updateVisit(next);
@@ -276,12 +276,6 @@ PlaceRouter.ctorParameters = () => [
276
276
  { type: PlaceHistory }
277
277
  ];
278
278
  PlaceRouter.ɵprov = i0.ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i2.Location), i0.ɵɵinject(i3.InteractionService), i0.ɵɵinject(i4.UrlService), i0.ɵɵinject(i5.PlaceHistory)); }, token: PlaceRouter, providedIn: "root" });
279
- __decorate([
280
- Trace(),
281
- __metadata("design:type", Function),
282
- __metadata("design:paramtypes", [Visit, Visit]),
283
- __metadata("design:returntype", Promise)
284
- ], PlaceRouter.prototype, "pushVisitChangesToRoute", null);
285
279
  PlaceRouter = __decorate([
286
280
  Injectable({
287
281
  providedIn: 'root'
@@ -1 +1 @@
1
- {"version":3,"file":"place-router.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/place/place-router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Location } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport {\n ActivatedRoute,\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n NavigationExtras,\n NavigationStart,\n Router\n} from '@angular/router';\nimport {\n assert,\n DebugContext,\n Dsl,\n GarbageCollector,\n lang,\n ListModel,\n Logger, MapModelChain,\n MutableListModel,\n MutableValueModel,\n Trace,\n ValueModelChain\n} from '@coolon/pectin';\nimport { InteractionServiceRoutingAdapter } from '../interaction/services/interaction-service-routing-adapter';\nimport { InteractionService } from '../interaction/services/interaction.service';\nimport { NavigatingDuringInteraction } from './navigation/session/interactions/navigating-during-interaction';\nimport { PopStateDuringInteractionNavigation } from './navigation/session/interactions/pop-state-during-interaction-navigation';\nimport { SynchroniseInteractionContextIdsWithRoute } from './navigation/session/interactions/synchronise-interaction-context-ids-with-route';\nimport { Navigating } from './navigation/session/navigating';\nimport { NavigationContext } from './navigation/session/navigation-context';\nimport { NavigationSession } from './navigation/session/navigation-session';\nimport { PopStateNavigation } from './navigation/session/pop-state-navigation';\nimport { PlaceDefinition } from './place-definition';\nimport { PlaceHistory } from './place-history';\nimport { UrlService } from './url-service';\nimport { UrlSnapshot } from './url-snapshot';\nimport { Visit } from './visit';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PlaceRouter extends GarbageCollector {\n\n readonly navigationSessionModel = new MutableValueModel<NavigationSession>();\n readonly navigationInProgress: ValueModelChain<boolean>;\n readonly navigationSessionName: ValueModelChain<string>; // used by tests\n\n private readonly navigationContext: NavigationContext.Impl;\n\n private readonly _activeVisits = new MutableListModel<Visit>();\n readonly activeVisitsByPlaceDefinition: MapModelChain<PlaceDefinition, Visit>;\n private routerInteractionAdapter: InteractionServiceRoutingAdapter;\n private sessionFinishedJobs: (() => void)[] = [];\n\n constructor(private readonly angularRouter: Router,\n private readonly angularLocation: Location,\n private readonly interactionService: InteractionService,\n private readonly urlService: UrlService,\n private readonly placeHistory: PlaceHistory) {\n super();\n\n this.routerInteractionAdapter = interactionService.registerPlaceRouter(this);\n\n // TODO: Make this an interface and use 'this' instead.\n this.navigationContext = new NavigationContext.Impl(\n this.urlService,\n this.routerInteractionAdapter,\n (urlSnapshot: UrlSnapshot, options: { replaceUrl: boolean }) => {\n return this.navigateByUrl(urlSnapshot, options);\n },\n state => {\n this.transitionTo(state);\n },\n visits => {\n this.routingSessionFinished(visits);\n });\n\n const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);\n this.navigationInProgress = chain(this.navigationSessionModel).isNotNil();\n\n const idleStateName = chain(this.interactionService.active).map(active => active ? 'IdleDuringInteraction' : 'Idle');\n this.navigationSessionName = chain(this.navigationSessionModel)\n .pluck('name')\n .otherwise(idleStateName);\n\n DebugContext.tag(this._activeVisits, 'PlaceRouter.activeVisits');\n this.activeVisitsByPlaceDefinition = chain(this._activeVisits).indexBy('placeDefinition');\n\n // TODO: make setup the callbacks in during module initiation to make this testable.\n angularRouter.events.subscribe(event => {\n // Routing event sequence\n // ======================\n // NavigationStart -> .... -> NavigationCancel --> redirect, go around again in the same session\n // NavigationStart -> .... -> NavigationEnd --> navigation complete, end session.\n // NavigationStart -> .... -> NavigationError --> navigation aborted, end session.\n // =======================\n if (event instanceof NavigationStart) {\n // console.log(`---> NavigationStart[${event.id}]: ${event.url} (${event.navigationTrigger})`);\n if (event.navigationTrigger === 'popstate') {\n this.onPopState(event);\n } else {\n this.onRouterStarted(event);\n }\n // console.log(`<--- NavigationStart[${event.id}]: ${event.url} (${event.navigationTrigger})`);\n }\n if (event instanceof NavigationEnd) {\n // console.log(`---> NavigationEnd[${event.id}]: ${event.url}`);\n this.onRouterEnd(event);\n // console.log(`<--- NavigationEnd[${event.id}]: ${event.url}`);\n }\n if (event instanceof NavigationError) {\n // console.log(`---> NavigationError[${event.id}]: ${event.url}`);\n this.onRouterError(event);\n // console.log(`<--- NavigationError[${event.id}]: ${event.url}`);\n }\n if (event instanceof NavigationCancel) {\n // console.log(`---> NavigationCancel[${event.id}]: ${event.url}`);\n this.onRouterCancelled(event);\n // console.log(`<--- NavigationCancel[${event.id}]: ${event.url}`);\n }\n });\n\n // The router needs to know about url changes and in some cases they are the only way the router can know if\n // the back button was clicked.\n angularLocation.onUrlChange(url => this.onUrlChanged(url));\n\n }\n\n get navigationSession() {\n return this.navigationSessionModel.value;\n }\n\n get currentSession() {\n return this.navigationSessionModel.value;\n }\n\n // @Trace()\n onPopState(event: NavigationStart) {\n assert.isTruthy(event.navigationTrigger === 'popstate');\n if (this.currentSession) {\n this.currentSession.onPopState(event);\n } else {\n const poppedHistoryUrl = event.url;\n const currentRouterUrl = this.urlService.getCurrentRouterUrl();\n const session = this.interactionService.isActive() ?\n new PopStateDuringInteractionNavigation(this.navigationContext, currentRouterUrl, poppedHistoryUrl) :\n new PopStateNavigation(this.navigationContext, currentRouterUrl, poppedHistoryUrl);\n this.transitionTo(session);\n }\n }\n\n // @Trace()\n onRouterStarted(event: NavigationStart) {\n assert.isFalsey(event.navigationTrigger === 'popstate');\n const inInteraction = this.interactionService.isActive();\n if (this.currentSession) {\n this.currentSession.onRouterStarted(event);\n } else {\n this.transitionTo(this.createNavigationSession(this.urlService.getCurrentRouterUrl()));\n }\n }\n\n // @Trace()\n onUrlChanged(newUrl: string) {\n // the back button can trigger a url change without a navigation session in progress so we\n // console.log(`---> Url Changed ${newUrl}`);\n if (this.currentSession) {\n this.currentSession.onUrlChange(newUrl);\n } else {\n console.log('FYI: url changed without a navigation session in progress');\n }\n // console.log(`<--- Url Changed`);\n }\n\n // @Trace()\n onRouterCancelled(event: NavigationCancel) {\n this.currentSession.onRouterCancelled(event);\n }\n\n // @Trace()\n onRouterError(event: NavigationError) {\n this.currentSession.onRouterError(event);\n }\n\n // @Trace()\n onRouterEnd(event: NavigationEnd) {\n this.currentSession.onRouterEnd(event);\n }\n\n navigate(visit: Visit, options?: { relativeTo: ActivatedRoute }) {\n return this.doNavigation(visit, async router => {\n const commands = [\n visit.placeDefinition.path,\n ...this.createRouteParameters(visit)\n ];\n await this.angularRouter.navigate(commands, {\n relativeTo: options ? options.relativeTo : null\n });\n });\n }\n\n // @Trace()\n async doNavigation(visit: Visit, runNavigationCommands: (router: Router) => any) {\n if (this.navigationInProgress.value) {\n lang.illegalState('Navigation already in progress');\n }\n const navigation = this.createNavigationSession(this.urlService.getCurrentRouterUrl());\n navigation.storeVisit(visit);\n this.transitionTo(navigation);\n try {\n await runNavigationCommands(this.angularRouter);\n } finally {\n // Check if the router has finished (in the case where no router change required) and we're still in a\n // transient state and finish of the transition.\n if (!this.angularRouter.getCurrentNavigation() && this.currentSession) {\n this.currentSession.onRouterEnd(new NavigationEnd(-1, '', ''));\n }\n }\n }\n\n navigateByUrl(urlSnapshot: UrlSnapshot, navigationExtras?: NavigationExtras) {\n // console.log(`### navigationByUrl -> ${urlSnapshot.urlTree.toString()}`);\n return this.angularRouter.navigateByUrl(urlSnapshot.urlTree, navigationExtras);\n }\n\n get activeVisits(): ListModel<Visit> {\n return this._activeVisits.readonly;\n }\n\n @Trace()\n async pushVisitChangesToRoute(previous: Visit, next: Visit): Promise<void> {\n this.placeHistory.updateVisit(next);\n\n // FIXME: no route id -> route id duplicates route parameters\n if (next.hasRoutingChangedFrom(previous)) {\n return this.doNavigation(next, router => {\n const urlSnapshot = this.urlService.parseUrl(this.angularRouter.routerState.snapshot.url).updateVisitSegments(next);\n // console.log('### Push Changes to route Redirect', { commands: urlSnapshot.url });\n return this.navigateByUrl(urlSnapshot);\n });\n }\n }\n\n\n private createNavigationSession(currentRouterUrl: string): NavigationSession {\n const inInteraction = this.interactionService.isActive();\n return inInteraction ?\n new NavigatingDuringInteraction(this.navigationContext, currentRouterUrl) :\n new Navigating(this.navigationContext, currentRouterUrl);\n }\n\n // @Trace()\n protected transitionTo(next: NavigationSession) {\n const previous = this.navigationSessionModel.value;\n if (!previous) {\n this.placeHistory.notifyNavigationStarted();\n }\n assert.isTruthy(next !== previous);\n Logger.get(this).info(`### Router State Transition: ${previous ? previous.toString() : 'null'} -> ${next.toString()}`);\n this.navigationSessionModel.value = next;\n if (!!previous) {\n previous.dispose();\n }\n next.notifyActive();\n }\n\n // @Trace()\n private routingSessionFinished(visits: Visit[]) {\n if (visits && visits.length > 0) {\n assert.isTruthy(this.navigationInProgress.value);\n this.placeHistory.notifyNavigationFinished(visits);\n // We update the active visits before we finish the session so the\n // place outlets can ignore the incoming changes until things are\n // settled. TODO: can we removed the event'ness here and just do a push?\n this._activeVisits.value = visits;\n }\n const session = this.currentSession;\n session.dispose();\n this.navigationSessionModel.value = null;\n console.log(`### Router Session Finished (was ${session.toString()})`);\n this.sessionFinishedJobs.forEach(job => job());\n this.sessionFinishedJobs = [];\n }\n\n private runAfterRoutingSessionFinishes(func: () => void) {\n assert.isTruthy(this.navigationInProgress);\n this.sessionFinishedJobs.push(func);\n }\n\n\n /**\n * Sync's the current interaction state with the URL. We need to push something in the URL in order\n * to be able to capture the back button on the first page. If we don't then the back click will exit\n * the app directly and we don't get to ask.\n */\n // @Trace()\n syncInteractionContextIdsWithRouter(): Promise<unknown> {\n if (this.navigationSession) {\n // console.log(`Navigation active -> ${this.navigationSession.toString()}, sync delayed until finished.`);\n const session = this.navigationSession;\n return new Promise((resolve, reject) => {\n this.runAfterRoutingSessionFinishes(() => {\n this.runAfterRoutingSessionFinishes(resolve);\n const syncSession = new SynchroniseInteractionContextIdsWithRoute(this.navigationContext, this.urlService.getCurrentRouterUrl(), false);\n this.transitionTo(syncSession);\n });\n });\n } else {\n return new Promise<unknown>(((resolve, reject) => {\n // console.log(`No navigation in progress, starting synchronisation job`);\n this.runAfterRoutingSessionFinishes(resolve);\n const session = new SynchroniseInteractionContextIdsWithRoute(this.navigationContext, this.urlService.getCurrentRouterUrl(), false);\n this.transitionTo(session);\n }));\n\n }\n }\n\n\n private createRouteParameters(visit: Visit) {\n const def = visit.placeDefinition;\n return visit.hasRouteId() ?\n [def.getFormattedRouteId(visit), def.getFormattedRouteParameters(visit)] :\n [def.getFormattedRouteParameters(visit)];\n }\n\n}\n\nexport namespace NavigationStateMachine {\n export type VisitsUpdatedCallback = (visits: Visit[]) => void;\n}\n"]}
1
+ {"version":3,"file":"place-router.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/place/place-router.ts"],"names":[],"mappings":"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","sourcesContent":["import { Location } from '@angular/common';\nimport { Injectable } from '@angular/core';\nimport {\n ActivatedRoute,\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n NavigationExtras,\n NavigationStart,\n Router\n} from '@angular/router';\nimport {\n assert,\n DebugContext,\n Dsl,\n GarbageCollector,\n lang,\n ListModel,\n Logger, MapModelChain,\n MutableListModel,\n MutableValueModel,\n Trace,\n ValueModelChain\n} from '@coolon/pectin';\nimport { InteractionServiceRoutingAdapter } from '../interaction/services/interaction-service-routing-adapter';\nimport { InteractionService } from '../interaction/services/interaction.service';\nimport { NavigatingDuringInteraction } from './navigation/session/interactions/navigating-during-interaction';\nimport { PopStateDuringInteractionNavigation } from './navigation/session/interactions/pop-state-during-interaction-navigation';\nimport { SynchroniseInteractionContextIdsWithRoute } from './navigation/session/interactions/synchronise-interaction-context-ids-with-route';\nimport { Navigating } from './navigation/session/navigating';\nimport { NavigationContext } from './navigation/session/navigation-context';\nimport { NavigationSession } from './navigation/session/navigation-session';\nimport { PopStateNavigation } from './navigation/session/pop-state-navigation';\nimport { PlaceDefinition } from './place-definition';\nimport { PlaceHistory } from './place-history';\nimport { UrlService } from './url-service';\nimport { UrlSnapshot } from './url-snapshot';\nimport { Visit } from './visit';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PlaceRouter extends GarbageCollector {\n\n readonly navigationSessionModel = new MutableValueModel<NavigationSession>();\n readonly navigationInProgress: ValueModelChain<boolean>;\n readonly navigationSessionName: ValueModelChain<string>; // used by tests\n\n private readonly navigationContext: NavigationContext.Impl;\n\n private readonly _activeVisits = new MutableListModel<Visit>();\n readonly activeVisitsByPlaceDefinition: MapModelChain<PlaceDefinition, Visit>;\n private routerInteractionAdapter: InteractionServiceRoutingAdapter;\n private sessionFinishedJobs: (() => void)[] = [];\n\n constructor(private readonly angularRouter: Router,\n private readonly angularLocation: Location,\n private readonly interactionService: InteractionService,\n private readonly urlService: UrlService,\n private readonly placeHistory: PlaceHistory) {\n super();\n\n this.routerInteractionAdapter = interactionService.registerPlaceRouter(this);\n\n // TODO: Make this an interface and use 'this' instead.\n this.navigationContext = new NavigationContext.Impl(\n this.urlService,\n this.routerInteractionAdapter,\n (urlSnapshot: UrlSnapshot, options: { replaceUrl: boolean }) => {\n return this.navigateByUrl(urlSnapshot, options);\n },\n state => {\n this.transitionTo(state);\n },\n visits => {\n this.routingSessionFinished(visits);\n });\n\n const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);\n this.navigationInProgress = chain(this.navigationSessionModel).isNotNil();\n\n const idleStateName = chain(this.interactionService.active).map(active => active ? 'IdleDuringInteraction' : 'Idle');\n this.navigationSessionName = chain(this.navigationSessionModel)\n .pluck('name')\n .otherwise(idleStateName);\n\n DebugContext.tag(this._activeVisits, 'PlaceRouter.activeVisits');\n this.activeVisitsByPlaceDefinition = chain(this._activeVisits).indexBy('placeDefinition');\n\n // TODO: make setup the callbacks in during module initiation to make this testable.\n angularRouter.events.subscribe(event => {\n // Routing event sequence\n // ======================\n // NavigationStart -> .... -> NavigationCancel --> redirect, go around again in the same session\n // NavigationStart -> .... -> NavigationEnd --> navigation complete, end session.\n // NavigationStart -> .... -> NavigationError --> navigation aborted, end session.\n // =======================\n if (event instanceof NavigationStart) {\n // console.log(`---> NavigationStart[${event.id}]: ${event.url} (${event.navigationTrigger})`);\n if (event.navigationTrigger === 'popstate') {\n this.onPopState(event);\n } else {\n this.onRouterStarted(event);\n }\n // console.log(`<--- NavigationStart[${event.id}]: ${event.url} (${event.navigationTrigger})`);\n }\n if (event instanceof NavigationEnd) {\n // console.log(`---> NavigationEnd[${event.id}]: ${event.url}`);\n this.onRouterEnd(event);\n // console.log(`<--- NavigationEnd[${event.id}]: ${event.url}`);\n }\n if (event instanceof NavigationError) {\n // console.log(`---> NavigationError[${event.id}]: ${event.url}`);\n this.onRouterError(event);\n // console.log(`<--- NavigationError[${event.id}]: ${event.url}`);\n }\n if (event instanceof NavigationCancel) {\n // console.log(`---> NavigationCancel[${event.id}]: ${event.url}`);\n this.onRouterCancelled(event);\n // console.log(`<--- NavigationCancel[${event.id}]: ${event.url}`);\n }\n });\n\n // The router needs to know about url changes and in some cases they are the only way the router can know if\n // the back button was clicked.\n angularLocation.onUrlChange(url => this.onUrlChanged(url));\n\n }\n\n get navigationSession() {\n return this.navigationSessionModel.value;\n }\n\n get currentSession() {\n return this.navigationSessionModel.value;\n }\n\n // @Trace()\n onPopState(event: NavigationStart) {\n assert.isTruthy(event.navigationTrigger === 'popstate');\n if (this.currentSession) {\n this.currentSession.onPopState(event);\n } else {\n const poppedHistoryUrl = event.url;\n const currentRouterUrl = this.urlService.getCurrentRouterUrl();\n const session = this.interactionService.isActive() ?\n new PopStateDuringInteractionNavigation(this.navigationContext, currentRouterUrl, poppedHistoryUrl) :\n new PopStateNavigation(this.navigationContext, currentRouterUrl, poppedHistoryUrl);\n this.transitionTo(session);\n }\n }\n\n // @Trace()\n onRouterStarted(event: NavigationStart) {\n assert.isFalsey(event.navigationTrigger === 'popstate');\n const inInteraction = this.interactionService.isActive();\n if (this.currentSession) {\n this.currentSession.onRouterStarted(event);\n } else {\n this.transitionTo(this.createNavigationSession(this.urlService.getCurrentRouterUrl()));\n }\n }\n\n // @Trace()\n onUrlChanged(newUrl: string) {\n // the back button can trigger a url change without a navigation session in progress so we\n // console.log(`---> Url Changed ${newUrl}`);\n if (this.currentSession) {\n this.currentSession.onUrlChange(newUrl);\n } else {\n console.log('FYI: url changed without a navigation session in progress');\n }\n // console.log(`<--- Url Changed`);\n }\n\n // @Trace()\n onRouterCancelled(event: NavigationCancel) {\n this.currentSession.onRouterCancelled(event);\n }\n\n // @Trace()\n onRouterError(event: NavigationError) {\n this.currentSession.onRouterError(event);\n }\n\n // @Trace()\n onRouterEnd(event: NavigationEnd) {\n this.currentSession.onRouterEnd(event);\n }\n\n navigate(visit: Visit, options?: { relativeTo: ActivatedRoute }) {\n return this.doNavigation(visit, async router => {\n const commands = [\n visit.placeDefinition.path,\n ...this.createRouteParameters(visit)\n ];\n await this.angularRouter.navigate(commands, {\n relativeTo: options ? options.relativeTo : null\n });\n });\n }\n\n // @Trace()\n async doNavigation(visit: Visit, runNavigationCommands: (router: Router) => any) {\n if (this.navigationInProgress.value) {\n lang.illegalState('Navigation already in progress');\n }\n const navigation = this.createNavigationSession(this.urlService.getCurrentRouterUrl());\n navigation.storeVisit(visit);\n this.transitionTo(navigation);\n try {\n await runNavigationCommands(this.angularRouter);\n } finally {\n // Check if the router has finished (in the case where no router change required) and we're still in a\n // transient state and finish of the transition.\n if (!this.angularRouter.getCurrentNavigation() && this.currentSession) {\n this.currentSession.onRouterEnd(new NavigationEnd(-1, '', ''));\n }\n }\n }\n\n navigateByUrl(urlSnapshot: UrlSnapshot, navigationExtras?: NavigationExtras) {\n // console.log(`### navigationByUrl -> ${urlSnapshot.urlTree.toString()}`);\n return this.angularRouter.navigateByUrl(urlSnapshot.urlTree, navigationExtras);\n }\n\n get activeVisits(): ListModel<Visit> {\n return this._activeVisits.readonly;\n }\n\n // @Trace()\n async pushVisitChangesToRoute(previous: Visit, next: Visit): Promise<void> {\n this.placeHistory.updateVisit(next);\n\n // FIXME: no route id -> route id duplicates route parameters\n if (next.hasRoutingChangedFrom(previous)) {\n return this.doNavigation(next, router => {\n const urlSnapshot = this.urlService.parseUrl(this.angularRouter.routerState.snapshot.url).updateVisitSegments(next);\n // console.log('### Push Changes to route Redirect', { commands: urlSnapshot.url });\n return this.navigateByUrl(urlSnapshot);\n });\n }\n }\n\n\n private createNavigationSession(currentRouterUrl: string): NavigationSession {\n const inInteraction = this.interactionService.isActive();\n return inInteraction ?\n new NavigatingDuringInteraction(this.navigationContext, currentRouterUrl) :\n new Navigating(this.navigationContext, currentRouterUrl);\n }\n\n // @Trace()\n protected transitionTo(next: NavigationSession) {\n const previous = this.navigationSessionModel.value;\n if (!previous) {\n this.placeHistory.notifyNavigationStarted();\n }\n assert.isTruthy(next !== previous);\n Logger.get(this).info(`### Router State Transition: ${previous ? previous.toString() : 'null'} -> ${next.toString()}`);\n this.navigationSessionModel.value = next;\n if (!!previous) {\n previous.dispose();\n }\n next.notifyActive();\n }\n\n // @Trace()\n private routingSessionFinished(visits: Visit[]) {\n if (visits && visits.length > 0) {\n assert.isTruthy(this.navigationInProgress.value);\n this.placeHistory.notifyNavigationFinished(visits);\n // We update the active visits before we finish the session so the\n // place outlets can ignore the incoming changes until things are\n // settled. TODO: can we removed the event'ness here and just do a push?\n this._activeVisits.value = visits;\n }\n const session = this.currentSession;\n session.dispose();\n this.navigationSessionModel.value = null;\n console.log(`### Router Session Finished (was ${session.toString()})`);\n this.sessionFinishedJobs.forEach(job => job());\n this.sessionFinishedJobs = [];\n }\n\n private runAfterRoutingSessionFinishes(func: () => void) {\n assert.isTruthy(this.navigationInProgress);\n this.sessionFinishedJobs.push(func);\n }\n\n\n /**\n * Sync's the current interaction state with the URL. We need to push something in the URL in order\n * to be able to capture the back button on the first page. If we don't then the back click will exit\n * the app directly and we don't get to ask.\n */\n // @Trace()\n syncInteractionContextIdsWithRouter(): Promise<unknown> {\n if (this.navigationSession) {\n // console.log(`Navigation active -> ${this.navigationSession.toString()}, sync delayed until finished.`);\n const session = this.navigationSession;\n return new Promise((resolve, reject) => {\n this.runAfterRoutingSessionFinishes(() => {\n this.runAfterRoutingSessionFinishes(resolve);\n const syncSession = new SynchroniseInteractionContextIdsWithRoute(this.navigationContext, this.urlService.getCurrentRouterUrl(), false);\n this.transitionTo(syncSession);\n });\n });\n } else {\n return new Promise<unknown>(((resolve, reject) => {\n // console.log(`No navigation in progress, starting synchronisation job`);\n this.runAfterRoutingSessionFinishes(resolve);\n const session = new SynchroniseInteractionContextIdsWithRoute(this.navigationContext, this.urlService.getCurrentRouterUrl(), false);\n this.transitionTo(session);\n }));\n\n }\n }\n\n\n private createRouteParameters(visit: Visit) {\n const def = visit.placeDefinition;\n return visit.hasRouteId() ?\n [def.getFormattedRouteId(visit), def.getFormattedRouteParameters(visit)] :\n [def.getFormattedRouteParameters(visit)];\n }\n\n}\n\nexport namespace NavigationStateMachine {\n export type VisitsUpdatedCallback = (visits: Visit[]) => void;\n}\n"]}
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"PlaceRouter":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@coolon/pectin","name":"GarbageCollector","line":42,"character":33},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":39,"character":1},"arguments":[{"providedIn":"root"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"Router","line":55,"character":46},{"__symbolic":"reference","module":"@angular/common","name":"Location","line":56,"character":48},{"__symbolic":"reference","module":"../interaction/services/interaction.service","name":"InteractionService","line":57,"character":51},{"__symbolic":"reference","module":"./url-service","name":"UrlService","line":58,"character":43},{"__symbolic":"reference","module":"./place-history","name":"PlaceHistory","line":59,"character":45}]}],"onPopState":[{"__symbolic":"method"}],"onRouterStarted":[{"__symbolic":"method"}],"onUrlChanged":[{"__symbolic":"method"}],"onRouterCancelled":[{"__symbolic":"method"}],"onRouterError":[{"__symbolic":"method"}],"onRouterEnd":[{"__symbolic":"method"}],"navigate":[{"__symbolic":"method"}],"doNavigation":[{"__symbolic":"method"}],"navigateByUrl":[{"__symbolic":"method"}],"pushVisitChangesToRoute":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@coolon/pectin","name":"Trace","line":230,"character":3}}]}],"createNavigationSession":[{"__symbolic":"method"}],"transitionTo":[{"__symbolic":"method"}],"routingSessionFinished":[{"__symbolic":"method"}],"runAfterRoutingSessionFinishes":[{"__symbolic":"method"}],"syncInteractionContextIdsWithRouter":[{"__symbolic":"method"}],"createRouteParameters":[{"__symbolic":"method"}]},"statics":{"ɵprov":{}}}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"PlaceRouter":{"__symbolic":"class","extends":{"__symbolic":"reference","module":"@coolon/pectin","name":"GarbageCollector","line":42,"character":33},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":39,"character":1},"arguments":[{"providedIn":"root"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"Router","line":55,"character":46},{"__symbolic":"reference","module":"@angular/common","name":"Location","line":56,"character":48},{"__symbolic":"reference","module":"../interaction/services/interaction.service","name":"InteractionService","line":57,"character":51},{"__symbolic":"reference","module":"./url-service","name":"UrlService","line":58,"character":43},{"__symbolic":"reference","module":"./place-history","name":"PlaceHistory","line":59,"character":45}]}],"onPopState":[{"__symbolic":"method"}],"onRouterStarted":[{"__symbolic":"method"}],"onUrlChanged":[{"__symbolic":"method"}],"onRouterCancelled":[{"__symbolic":"method"}],"onRouterError":[{"__symbolic":"method"}],"onRouterEnd":[{"__symbolic":"method"}],"navigate":[{"__symbolic":"method"}],"doNavigation":[{"__symbolic":"method"}],"navigateByUrl":[{"__symbolic":"method"}],"pushVisitChangesToRoute":[{"__symbolic":"method"}],"createNavigationSession":[{"__symbolic":"method"}],"transitionTo":[{"__symbolic":"method"}],"routingSessionFinished":[{"__symbolic":"method"}],"runAfterRoutingSessionFinishes":[{"__symbolic":"method"}],"syncInteractionContextIdsWithRouter":[{"__symbolic":"method"}],"createRouteParameters":[{"__symbolic":"method"}]},"statics":{"ɵprov":{}}}}}]
@@ -1,4 +1,4 @@
1
- import { Binding, DebugContext, Functions, Logger, MutableListModel, MutableValueModel } from '@coolon/pectin';
1
+ import { Binding, DebugContext, Functions, MutableListModel, MutableValueModel } from '@coolon/pectin';
2
2
  import { Klass, Opts } from '@coolon/typescript-utilities';
3
3
  import { ROUTE_PARAMETER_LIST_KEY } from '../place-component';
4
4
  import { ParameterDefinition } from './parameter-definition.class';
@@ -8,8 +8,7 @@ function installMechanics(prototype, propertyKey, backingModel, tagPrefix, isEmp
8
8
  binding: null
9
9
  };
10
10
  const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;
11
- DebugContext.get(mechanics.backingModel).tag(tag);
12
- Logger.get(mechanics.backingModel).tag(tag);
11
+ DebugContext.getOrCreate(mechanics.backingModel).tag(tag);
13
12
  Object.defineProperty(prototype, propertyKey, {
14
13
  get: function () {
15
14
  return mechanics.backingModel;
@@ -1 +1 @@
1
- {"version":3,"file":"parameter-decorators.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/place/route/parameter-decorators.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Binding,\n DebugContext,\n Functions,\n HasValue,\n Logger,\n MutableListModel,\n MutableValueModel\n} from '@coolon/pectin';\nimport { Klass, Opts } from '@coolon/typescript-utilities';\nimport { ROUTE_PARAMETER_LIST_KEY } from '../place-component';\nimport { Formatter } from './formatter';\nimport { ParameterDefinition } from './parameter-definition.class';\n\n\nexport interface RouteIdOptions<T> {\n as?: string;\n optional?: boolean;\n remember?: boolean;\n defaultValue?: T;\n // sanitiser?: Constructable<ParameterSanitiser<T>> | ParameterSanitiser<T>;\n}\n\nexport interface RouteParameterOptions<T> {\n as?: string;\n optional?: boolean;\n remember?: boolean;\n defaultValue?: T;\n storeInUrl?: Formatter<T>\n // sanitiser?: Constructable<ParameterSanitiser<T>> | ParameterSanitiser<T>;\n}\n\nexport interface RouteListParameterOptions<T> {\n as?: string;\n optional?: boolean;\n remember?: boolean;\n defaultValue?: T[];\n storeInUrl?: Formatter<T>\n // sanitiser?: Constructable<ParameterSanitiser<T[]>> | ParameterSanitiser<T[]>;\n}\n\n\nfunction installMechanics<M extends HasValue<any>>(prototype: Object, propertyKey: string | symbol, backingModel: M, tagPrefix: string, isEmpty: (mode: M) => boolean) {\n const mechanics = {\n backingModel: backingModel,\n binding: null as Binding<any, any>\n };\n const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;\n DebugContext.get(mechanics.backingModel).tag(tag);\n Logger.get(mechanics.backingModel).tag(tag);\n Object.defineProperty(prototype, propertyKey, {\n get: function() {\n return mechanics.backingModel;\n },\n set: function(userModel: M) {\n // This handles the scenario where we want to push an existing value model (such as a form model)\n // to and from the route.\n if (mechanics.binding) {\n mechanics.binding.dispose();\n }\n if (userModel) {\n mechanics.binding = new Binding(mechanics.backingModel, userModel, {\n toLeft: Functions.identity,\n toRight: Functions.identity\n });\n if (isEmpty(userModel)) {\n // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});\n mechanics.binding.writeRight(); // push the visit into the user model;\n } else {\n if (!isEmpty(mechanics.backingModel)) {\n console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');\n }\n mechanics.binding.writeLeft(); // push the user model into the visit\n }\n }\n }\n });\n}\n\nexport function RouteId<T extends string | number>(type: Formatter<T>, options?: RouteIdOptions<T>): PropertyDecorator {\n return (prototype: Object, propertyKey: string | symbol) => {\n const param = new ParameterDefinition.RouteId(propertyKey.toString(), options, type);\n Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, param);\n installMechanics(prototype, propertyKey, new MutableValueModel<T>(), '@RouteId', m => m.query().isNil());\n };\n}\n\nexport function VisitParameter<T>(options?: RouteParameterOptions<T>): PropertyDecorator {\n const opts = Opts.get(options);\n return (prototype: Object, propertyKey: string | symbol) => {\n const param = new ParameterDefinition.ValueParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));\n Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, param);\n installMechanics(prototype, propertyKey, new MutableValueModel<T>(), '@VisitParameter', m => m.query().isNil());\n };\n}\n\nexport function VisitParameterList<E>(options?: RouteListParameterOptions<E>): PropertyDecorator {\n const opts = Opts.get(options);\n return (prototype: Object, propertyKey: string | symbol) => {\n const param = new ParameterDefinition.ArrayParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));\n Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, param);\n installMechanics(prototype, propertyKey, new MutableListModel<E>(), '@VisitParameterList', m => m.query().isEmpty());\n };\n}\n"]}
1
+ {"version":3,"file":"parameter-decorators.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/place/route/parameter-decorators.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Binding,\n DebugContext,\n Functions,\n HasValue,\n Logger,\n MutableListModel,\n MutableValueModel\n} from '@coolon/pectin';\nimport { Klass, Opts } from '@coolon/typescript-utilities';\nimport { ROUTE_PARAMETER_LIST_KEY } from '../place-component';\nimport { Formatter } from './formatter';\nimport { ParameterDefinition } from './parameter-definition.class';\n\n\nexport interface RouteIdOptions<T> {\n as?: string;\n optional?: boolean;\n remember?: boolean;\n defaultValue?: T;\n // sanitiser?: Constructable<ParameterSanitiser<T>> | ParameterSanitiser<T>;\n}\n\nexport interface RouteParameterOptions<T> {\n as?: string;\n optional?: boolean;\n remember?: boolean;\n defaultValue?: T;\n storeInUrl?: Formatter<T>\n // sanitiser?: Constructable<ParameterSanitiser<T>> | ParameterSanitiser<T>;\n}\n\nexport interface RouteListParameterOptions<T> {\n as?: string;\n optional?: boolean;\n remember?: boolean;\n defaultValue?: T[];\n storeInUrl?: Formatter<T>\n // sanitiser?: Constructable<ParameterSanitiser<T[]>> | ParameterSanitiser<T[]>;\n}\n\n\nfunction installMechanics<M extends HasValue<any>>(prototype: Object, propertyKey: string | symbol, backingModel: M, tagPrefix: string, isEmpty: (mode: M) => boolean) {\n const mechanics = {\n backingModel: backingModel,\n binding: null as Binding<any, any>\n };\n const tag = `${tagPrefix}(${prototype.constructor.name}.${propertyKey.toString()})`;\n DebugContext.getOrCreate(mechanics.backingModel).tag(tag);\n Object.defineProperty(prototype, propertyKey, {\n get: function() {\n return mechanics.backingModel;\n },\n set: function(userModel: M) {\n // This handles the scenario where we want to push an existing value model (such as a form model)\n // to and from the route.\n if (mechanics.binding) {\n mechanics.binding.dispose();\n }\n if (userModel) {\n mechanics.binding = new Binding(mechanics.backingModel, userModel, {\n toLeft: Functions.identity,\n toRight: Functions.identity\n });\n if (isEmpty(userModel)) {\n // console.log(`Push visit to model for ${tag}`, {value: mechanics.backingModel.value});\n mechanics.binding.writeRight(); // push the visit into the user model;\n } else {\n if (!isEmpty(mechanics.backingModel)) {\n console.warn('Assigning a visit model with an existing value to a visit parameter with an existing value. Visit parameter will be overridden');\n }\n mechanics.binding.writeLeft(); // push the user model into the visit\n }\n }\n }\n });\n}\n\nexport function RouteId<T extends string | number>(type: Formatter<T>, options?: RouteIdOptions<T>): PropertyDecorator {\n return (prototype: Object, propertyKey: string | symbol) => {\n const param = new ParameterDefinition.RouteId(propertyKey.toString(), options, type);\n Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, param);\n installMechanics(prototype, propertyKey, new MutableValueModel<T>(), '@RouteId', m => m.query().isNil());\n };\n}\n\nexport function VisitParameter<T>(options?: RouteParameterOptions<T>): PropertyDecorator {\n const opts = Opts.get(options);\n return (prototype: Object, propertyKey: string | symbol) => {\n const param = new ParameterDefinition.ValueParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));\n Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, param);\n installMechanics(prototype, propertyKey, new MutableValueModel<T>(), '@VisitParameter', m => m.query().isNil());\n };\n}\n\nexport function VisitParameterList<E>(options?: RouteListParameterOptions<E>): PropertyDecorator {\n const opts = Opts.get(options);\n return (prototype: Object, propertyKey: string | symbol) => {\n const param = new ParameterDefinition.ArrayParameter(propertyKey.toString(), options, opts.getOptional('storeInUrl', null));\n Klass.get(prototype).addToOwnMetadataList(ROUTE_PARAMETER_LIST_KEY, param);\n installMechanics(prototype, propertyKey, new MutableListModel<E>(), '@VisitParameterList', m => m.query().isEmpty());\n };\n}\n"]}
@@ -1 +1 @@
1
- [{"__symbolic":"module","version":4,"metadata":{"RouteIdOptions":{"__symbolic":"interface"},"RouteParameterOptions":{"__symbolic":"interface"},"RouteListParameterOptions":{"__symbolic":"interface"},"RouteId":{"__symbolic":"function","parameters":["type","options"],"value":{"__symbolic":"error","message":"Lambda not supported","line":80,"character":9}},"VisitParameter":{"__symbolic":"function"},"VisitParameterList":{"__symbolic":"function"}}}]
1
+ [{"__symbolic":"module","version":4,"metadata":{"RouteIdOptions":{"__symbolic":"interface"},"RouteParameterOptions":{"__symbolic":"interface"},"RouteListParameterOptions":{"__symbolic":"interface"},"RouteId":{"__symbolic":"function","parameters":["type","options"],"value":{"__symbolic":"error","message":"Lambda not supported","line":79,"character":9}},"VisitParameter":{"__symbolic":"function"},"VisitParameterList":{"__symbolic":"function"}}}]
@@ -1,7 +1,7 @@
1
1
  import { __decorate, __extends, __metadata } from "tslib";
2
2
  /* tslint:disable:no-input-rename */
3
3
  import { Component, EventEmitter, Input, Output } from '@angular/core';
4
- import { Dsl, Form, Guard, MutableListModel, TrackExternal } from '@coolon/pectin';
4
+ import { DebugContext, Dsl, Form, Guard, MutableListModel, TrackExternal } from '@coolon/pectin';
5
5
  import { AbstractInputComponent } from './abstract-input.component';
6
6
  var AbstractListInputComponent = /** @class */ (function (_super) {
7
7
  __extends(AbstractListInputComponent, _super);
@@ -19,27 +19,28 @@ var AbstractListInputComponent = /** @class */ (function (_super) {
19
19
  */
20
20
  // We have to register it as a disposable so it ditches any listeners when we're disposed.
21
21
  _this.inputModel = _this.registerDisposable(new Form.DelegatingListModel());
22
- _this.setValueIsInitialising = new Guard();
22
+ _this.setValueIsInProgress = new Guard();
23
23
  _this.valueChange = new EventEmitter();
24
24
  var when = Dsl.disposeWith(_this).when;
25
25
  when(_this.inputModel).changes(function (value) { return _this.valueChange.emit(value); }, {
26
26
  initialValue: 'ignore',
27
- unless: _this.setValueIsInitialising
27
+ unless: _this.setValueIsInProgress
28
28
  });
29
+ DebugContext.tag(_this.inputModel, _this.constructor.name + ".inputModel");
29
30
  return _this;
30
31
  }
31
32
  Object.defineProperty(AbstractListInputComponent.prototype, "value", {
32
33
  set: function (value) {
33
34
  var _this = this;
34
- if (!this.listHolder) {
35
- this.setValueIsInitialising.whileTrue(function () {
35
+ this.setValueIsInProgress.whileTrue(function () {
36
+ if (!_this.listHolder) {
36
37
  _this.listHolder = new MutableListModel(value);
37
38
  _this.listModel = _this.listHolder;
38
- });
39
- }
40
- else {
41
- this.listHolder.value = value;
42
- }
39
+ }
40
+ else {
41
+ _this.listHolder.value = value;
42
+ }
43
+ });
43
44
  },
44
45
  enumerable: true,
45
46
  configurable: true
@@ -1 +1 @@
1
- {"version":3,"file":"abstract-list-input.component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/components/forms/abstract-list-input.component.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAqB,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE;IAAmD,8CAA2B;IAmC5E;QAAA,YACE,iBAAO,SAMR;QArCD;;;;;;;;;WASG;QACD,0FAA0F;QACnF,gBAAU,GAAG,KAAI,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAK,CAAC,CAAC;QAEzE,4BAAsB,GAAG,IAAI,KAAK,EAAE,CAAC;QAe1B,iBAAW,GAAG,IAAI,YAAY,EAAO,CAAC;QAI/C,IAAA,kCAAI,CAA2B;QACvC,IAAI,CAAC,KAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAA,KAAK,IAAI,OAAA,KAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAA5B,CAA4B,EAAE;YACnE,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,KAAI,CAAC,sBAAsB;SACpC,CAAC,CAAC;;IACL,CAAC;IArBQ,sBAAI,6CAAK;aAAT,UAAU,KAAU;YAA7B,iBAUC;YATC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACpB,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC;oBACpC,KAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAI,KAAK,CAAC,CAAC;oBACjD,KAAI,CAAC,SAAS,GAAG,KAAI,CAAC,UAAU,CAAC;gBAEnC,CAAC,CAAC,CAAC;aACJ;iBAAM;gBACL,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;aAC/B;QACH,CAAC;;;OAAA;IA5BD;QADC,KAAK,EAAE,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;iEACG;IAkB/C;QAAR,KAAK,EAAE;;;2DAUP;IAES;QAAT,MAAM,EAAE;;mEAAgD;IAjC9C,0BAA0B;QADtC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;;OACf,0BAA0B,CA2CtC;IAAD,iCAAC;CAAA,AA3CD,CAAmD,sBAAsB,GA2CxE;SA3CY,0BAA0B","sourcesContent":["/* tslint:disable:no-input-rename */\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { Dsl, Form, Guard, IMutableListModel, MutableListModel, TrackExternal } from '@coolon/pectin';\nimport { AbstractInputComponent } from './abstract-input.component';\n\n@Component({ template: '' })\nexport class AbstractListInputComponent<T> extends AbstractInputComponent<T[]> implements OnInit {\n\n @Input() @TrackExternal({ delegateTo: 'inputModel' })\n listModel: Form.ListModelBase<T> | IMutableListModel<T>;\n\n /**\n * A backing model for all our @Input() valueModel properties which should be defined as follows.\n *\n * @Input() @TrackExternal({useExisting: \"inputModel\"})\n * valueModel: Form.ListModelBase<string> | IMutableListModel<string>;\n *\n * This approach allows the input to accept plain or form models but all backed by a form\n * friendly delegate. We have to use an existing delegate for union types as pectin just\n * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).\n */\n // We have to register it as a disposable so it ditches any listeners when we're disposed.\n readonly inputModel = this.registerDisposable(new Form.DelegatingListModel<T>());\n\n private setValueIsInitialising = new Guard();\n private listHolder: MutableListModel<T>;\n\n @Input() set value(value: T[]) {\n if (!this.listHolder) {\n this.setValueIsInitialising.whileTrue(() => {\n this.listHolder = new MutableListModel<T>(value);\n this.listModel = this.listHolder;\n\n });\n } else {\n this.listHolder.value = value;\n }\n }\n\n @Output() readonly valueChange = new EventEmitter<T[]>();\n\n constructor() {\n super();\n const { when } = Dsl.disposeWith(this);\n when(this.inputModel).changes(value => this.valueChange.emit(value), {\n initialValue: 'ignore',\n unless: this.setValueIsInitialising\n });\n }\n}\n"]}
1
+ {"version":3,"file":"abstract-list-input.component.js","sourceRoot":"ng://@coolon/angular-ui-powerups/","sources":["lib/components/forms/abstract-list-input.component.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAqB,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAGpE;IAAmD,8CAA2B;IAkC5E;QAAA,YACE,iBAAO,SAOR;QArCD;;;;;;;;;WASG;QACD,0FAA0F;QACnF,gBAAU,GAAG,KAAI,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,mBAAmB,EAAK,CAAC,CAAC;QAEzE,0BAAoB,GAAG,IAAI,KAAK,EAAE,CAAC;QAcxB,iBAAW,GAAG,IAAI,YAAY,EAAO,CAAC;QAI/C,IAAA,kCAAI,CAA2B;QACvC,IAAI,CAAC,KAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAA,KAAK,IAAI,OAAA,KAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAA5B,CAA4B,EAAE;YACnE,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,KAAI,CAAC,oBAAoB;SAClC,CAAC,CAAC;QACH,YAAY,CAAC,GAAG,CAAC,KAAI,CAAC,UAAU,EAAK,KAAI,CAAC,WAAW,CAAC,IAAI,gBAAa,CAAC,CAAC;;IAC3E,CAAC;IArBQ,sBAAI,6CAAK;aAAT,UAAU,KAAU;YAA7B,iBASC;YARC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC;gBAClC,IAAI,CAAC,KAAI,CAAC,UAAU,EAAE;oBACpB,KAAI,CAAC,UAAU,GAAG,IAAI,gBAAgB,CAAI,KAAK,CAAC,CAAC;oBACjD,KAAI,CAAC,SAAS,GAAG,KAAI,CAAC,UAAU,CAAC;iBAClC;qBAAM;oBACL,KAAI,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC;iBAC/B;YACH,CAAC,CAAC,CAAC;QACL,CAAC;;;OAAA;IA3BD;QADC,KAAK,EAAE,EAAE,aAAa,CAAC,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;;iEACG;IAkB/C;QAAR,KAAK,EAAE;;;2DASP;IAES;QAAT,MAAM,EAAE;;mEAAgD;IAhC9C,0BAA0B;QADtC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;;OACf,0BAA0B,CA2CtC;IAAD,iCAAC;CAAA,AA3CD,CAAmD,sBAAsB,GA2CxE;SA3CY,0BAA0B","sourcesContent":["/* tslint:disable:no-input-rename */\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { DebugContext, Dsl, Form, Guard, IMutableListModel, MutableListModel, TrackExternal } from '@coolon/pectin';\nimport { AbstractInputComponent } from './abstract-input.component';\n\n@Component({ template: '' })\nexport class AbstractListInputComponent<T> extends AbstractInputComponent<T[]> implements OnInit {\n\n @Input() @TrackExternal({ delegateTo: 'inputModel' })\n listModel: Form.ListModelBase<T> | IMutableListModel<T>;\n\n /**\n * A backing model for all our @Input() valueModel properties which should be defined as follows.\n *\n * @Input() @TrackExternal({useExisting: \"inputModel\"})\n * valueModel: Form.ListModelBase<string> | IMutableListModel<string>;\n *\n * This approach allows the input to accept plain or form models but all backed by a form\n * friendly delegate. We have to use an existing delegate for union types as pectin just\n * gets told it's an Object and can't scan for a base type annotated with @DelegateUsing(..).\n */\n // We have to register it as a disposable so it ditches any listeners when we're disposed.\n readonly inputModel = this.registerDisposable(new Form.DelegatingListModel<T>());\n\n private setValueIsInProgress = new Guard();\n private listHolder: MutableListModel<T>;\n\n @Input() set value(value: T[]) {\n this.setValueIsInProgress.whileTrue(() => {\n if (!this.listHolder) {\n this.listHolder = new MutableListModel<T>(value);\n this.listModel = this.listHolder;\n } else {\n this.listHolder.value = value;\n }\n });\n }\n\n @Output() readonly valueChange = new EventEmitter<T[]>();\n\n constructor() {\n super();\n const { when } = Dsl.disposeWith(this);\n when(this.inputModel).changes(value => this.valueChange.emit(value), {\n initialValue: 'ignore',\n unless: this.setValueIsInProgress\n });\n DebugContext.tag(this.inputModel, `${this.constructor.name}.inputModel`);\n }\n}\n"]}