nxt-pick-datetime 10.0.0 → 13.0.0

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 (124) hide show
  1. package/{esm2015/lib/class/date-time-adapter.class.js → esm2020/lib/class/date-time-adapter.class.mjs} +0 -0
  2. package/{esm2015/lib/class/date-time-format.class.js → esm2020/lib/class/date-time-format.class.mjs} +1 -1
  3. package/esm2020/lib/class/date-time.class.mjs +161 -0
  4. package/{esm2015/lib/class/dialog-config.class.js → esm2020/lib/class/dialog-config.class.mjs} +0 -0
  5. package/esm2020/lib/class/dialog-ref.class.mjs +121 -0
  6. package/esm2020/lib/date-time/calendar/calendar.component.mjs +345 -0
  7. package/esm2020/lib/date-time/calendar-body/calendar-body.component.mjs +145 -0
  8. package/esm2020/lib/date-time/calendar-month-view/calendar-month-view.component.mjs +438 -0
  9. package/esm2020/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.mjs +359 -0
  10. package/esm2020/lib/date-time/calendar-year-view/calendar-year-view.component.mjs +369 -0
  11. package/esm2020/lib/date-time/date-time-inline/date-time-inline.component.mjs +264 -0
  12. package/esm2020/lib/date-time/date-time-picker/date-time-picker.component.mjs +529 -0
  13. package/{esm2015/lib/date-time/date-time-picker-container/date-time-picker-container.animations.js → esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.animations.mjs} +1 -1
  14. package/esm2020/lib/date-time/date-time-picker-container/date-time-picker-container.component.mjs +390 -0
  15. package/esm2020/lib/date-time/date-time-picker-input.directive.mjs +624 -0
  16. package/esm2020/lib/date-time/date-time-picker-intl.service.mjs +61 -0
  17. package/esm2020/lib/date-time/date-time-picker-trigger.directive.mjs +68 -0
  18. package/esm2020/lib/date-time/date-time.module.mjs +88 -0
  19. package/esm2020/lib/date-time/number-fixed-len.pipe.mjs +25 -0
  20. package/esm2020/lib/date-time/timer/timer.component.mjs +292 -0
  21. package/esm2020/lib/date-time/timer-box/timer-box.component.mjs +88 -0
  22. package/esm2020/lib/dialog/dialog-container/dialog-container.component.mjs +243 -0
  23. package/esm2020/lib/dialog/dialog.module.mjs +34 -0
  24. package/esm2020/lib/dialog/dialog.service.mjs +240 -0
  25. package/{esm2015/lib/utils/object.js → esm2020/lib/utils/object.mjs} +0 -0
  26. package/esm2020/moment-adapter/date-time-adapter.class.mjs +215 -0
  27. package/{esm2015/moment-adapter/date-time-format.class.js → esm2020/moment-adapter/date-time-format.class.mjs} +0 -0
  28. package/esm2020/moment-adapter/moment-adapter.module.mjs +41 -0
  29. package/esm2020/moment-adapter/nxt-pick-datetime-moment-adapter.mjs +5 -0
  30. package/{esm2015/moment-adapter/public-api.js → esm2020/moment-adapter/public-api.mjs} +0 -0
  31. package/esm2020/native-adapter/date-time-adapter.class.mjs +344 -0
  32. package/{esm2015/native-adapter/date-time-format.class.js → esm2020/native-adapter/date-time-format.class.mjs} +0 -0
  33. package/esm2020/native-adapter/native-adapter.module.mjs +35 -0
  34. package/esm2020/native-adapter/nxt-pick-datetime-native-adapter.mjs +5 -0
  35. package/{esm2015/native-adapter/public-api.js → esm2020/native-adapter/public-api.mjs} +0 -0
  36. package/esm2020/nxt-pick-datetime.mjs +5 -0
  37. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  38. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs +269 -0
  39. package/fesm2015/nxt-pick-datetime-moment-adapter.mjs.map +1 -0
  40. package/fesm2015/{nxt-pick-datetime-native-adapter.js → nxt-pick-datetime-native-adapter.mjs} +41 -27
  41. package/fesm2015/nxt-pick-datetime-native-adapter.mjs.map +1 -0
  42. package/fesm2015/nxt-pick-datetime.mjs +4974 -0
  43. package/fesm2015/nxt-pick-datetime.mjs.map +1 -0
  44. package/{fesm2015/nxt-pick-datetime-moment-adapter.js → fesm2020/nxt-pick-datetime-moment-adapter.mjs} +48 -27
  45. package/fesm2020/nxt-pick-datetime-moment-adapter.mjs.map +1 -0
  46. package/fesm2020/nxt-pick-datetime-native-adapter.mjs +390 -0
  47. package/fesm2020/nxt-pick-datetime-native-adapter.mjs.map +1 -0
  48. package/{fesm2015/nxt-pick-datetime.js → fesm2020/nxt-pick-datetime.mjs} +2207 -1967
  49. package/fesm2020/nxt-pick-datetime.mjs.map +1 -0
  50. package/lib/class/date-time.class.d.ts +3 -0
  51. package/lib/class/dialog-ref.class.d.ts +2 -0
  52. package/lib/date-time/calendar/calendar.component.d.ts +3 -0
  53. package/lib/date-time/calendar-body/calendar-body.component.d.ts +3 -0
  54. package/lib/date-time/calendar-month-view/calendar-month-view.component.d.ts +3 -0
  55. package/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.d.ts +3 -0
  56. package/lib/date-time/calendar-year-view/calendar-year-view.component.d.ts +3 -0
  57. package/lib/date-time/date-time-inline/date-time-inline.component.d.ts +3 -0
  58. package/lib/date-time/date-time-picker/date-time-picker.component.d.ts +3 -0
  59. package/lib/date-time/date-time-picker-container/date-time-picker-container.component.d.ts +3 -0
  60. package/lib/date-time/date-time-picker-input.directive.d.ts +3 -0
  61. package/lib/date-time/date-time-picker-intl.service.d.ts +3 -0
  62. package/lib/date-time/date-time-picker-trigger.directive.d.ts +3 -0
  63. package/lib/date-time/date-time.module.d.ts +21 -0
  64. package/lib/date-time/number-fixed-len.pipe.d.ts +3 -0
  65. package/lib/date-time/timer/timer.component.d.ts +3 -0
  66. package/lib/date-time/timer-box/timer-box.component.d.ts +3 -0
  67. package/lib/dialog/dialog-container/dialog-container.component.d.ts +5 -2
  68. package/lib/dialog/dialog.module.d.ts +9 -0
  69. package/lib/dialog/dialog.service.d.ts +6 -2
  70. package/moment-adapter/date-time-adapter.class.d.ts +3 -0
  71. package/moment-adapter/moment-adapter.module.d.ts +7 -0
  72. package/moment-adapter/nxt-pick-datetime-moment-adapter.d.ts +1 -3
  73. package/moment-adapter/package.json +6 -7
  74. package/native-adapter/date-time-adapter.class.d.ts +3 -0
  75. package/native-adapter/native-adapter.module.d.ts +8 -0
  76. package/native-adapter/nxt-pick-datetime-native-adapter.d.ts +1 -3
  77. package/native-adapter/package.json +6 -7
  78. package/nxt-pick-datetime.d.ts +1 -14
  79. package/package.json +48 -13
  80. package/bundles/nxt-pick-datetime-moment-adapter.umd.js +0 -577
  81. package/bundles/nxt-pick-datetime-moment-adapter.umd.js.map +0 -1
  82. package/bundles/nxt-pick-datetime-moment-adapter.umd.min.js +0 -17
  83. package/bundles/nxt-pick-datetime-moment-adapter.umd.min.js.map +0 -1
  84. package/bundles/nxt-pick-datetime-native-adapter.umd.js +0 -706
  85. package/bundles/nxt-pick-datetime-native-adapter.umd.js.map +0 -1
  86. package/bundles/nxt-pick-datetime-native-adapter.umd.min.js +0 -16
  87. package/bundles/nxt-pick-datetime-native-adapter.umd.min.js.map +0 -1
  88. package/bundles/nxt-pick-datetime.umd.js +0 -5809
  89. package/bundles/nxt-pick-datetime.umd.js.map +0 -1
  90. package/bundles/nxt-pick-datetime.umd.min.js +0 -17
  91. package/bundles/nxt-pick-datetime.umd.min.js.map +0 -1
  92. package/esm2015/lib/class/date-time.class.js +0 -151
  93. package/esm2015/lib/class/dialog-ref.class.js +0 -113
  94. package/esm2015/lib/date-time/calendar/calendar.component.js +0 -331
  95. package/esm2015/lib/date-time/calendar-body/calendar-body.component.js +0 -144
  96. package/esm2015/lib/date-time/calendar-month-view/calendar-month-view.component.js +0 -425
  97. package/esm2015/lib/date-time/calendar-multi-year-view/calendar-multi-year-view.component.js +0 -347
  98. package/esm2015/lib/date-time/calendar-year-view/calendar-year-view.component.js +0 -356
  99. package/esm2015/lib/date-time/date-time-inline/date-time-inline.component.js +0 -246
  100. package/esm2015/lib/date-time/date-time-picker/date-time-picker.component.js +0 -511
  101. package/esm2015/lib/date-time/date-time-picker-container/date-time-picker-container.component.js +0 -373
  102. package/esm2015/lib/date-time/date-time-picker-input.directive.js +0 -592
  103. package/esm2015/lib/date-time/date-time-picker-intl.service.js +0 -59
  104. package/esm2015/lib/date-time/date-time-picker-trigger.directive.js +0 -63
  105. package/esm2015/lib/date-time/date-time.module.js +0 -60
  106. package/esm2015/lib/date-time/number-fixed-len.pipe.js +0 -21
  107. package/esm2015/lib/date-time/timer/timer.component.js +0 -287
  108. package/esm2015/lib/date-time/timer-box/timer-box.component.js +0 -77
  109. package/esm2015/lib/dialog/dialog-container/dialog-container.component.js +0 -202
  110. package/esm2015/lib/dialog/dialog.module.js +0 -26
  111. package/esm2015/lib/dialog/dialog.service.js +0 -225
  112. package/esm2015/moment-adapter/date-time-adapter.class.js +0 -206
  113. package/esm2015/moment-adapter/moment-adapter.module.js +0 -28
  114. package/esm2015/moment-adapter/nxt-pick-datetime-moment-adapter.js +0 -8
  115. package/esm2015/native-adapter/date-time-adapter.class.js +0 -342
  116. package/esm2015/native-adapter/native-adapter.module.js +0 -26
  117. package/esm2015/native-adapter/nxt-pick-datetime-native-adapter.js +0 -8
  118. package/esm2015/nxt-pick-datetime.js +0 -19
  119. package/fesm2015/nxt-pick-datetime-moment-adapter.js.map +0 -1
  120. package/fesm2015/nxt-pick-datetime-native-adapter.js.map +0 -1
  121. package/fesm2015/nxt-pick-datetime.js.map +0 -1
  122. package/moment-adapter/nxt-pick-datetime-moment-adapter.metadata.json +0 -1
  123. package/native-adapter/nxt-pick-datetime-native-adapter.metadata.json +0 -1
  124. package/nxt-pick-datetime.metadata.json +0 -1
@@ -1,77 +0,0 @@
1
- import { coerceNumberProperty } from '@angular/cdk/coercion';
2
- import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
3
- import { Subject, Subscription } from 'rxjs';
4
- import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
5
- export class OwlTimerBoxComponent {
6
- constructor() {
7
- this.showDivider = false;
8
- this.step = 1;
9
- this.valueChange = new EventEmitter();
10
- this.inputChange = new EventEmitter();
11
- this.inputStream = new Subject();
12
- this.inputStreamSub = Subscription.EMPTY;
13
- }
14
- get displayValue() {
15
- return this.boxValue || this.value;
16
- }
17
- get owlDTTimerBoxClass() {
18
- return true;
19
- }
20
- ngOnInit() {
21
- this.inputStreamSub = this.inputStream.pipe(debounceTime(500), distinctUntilChanged()).subscribe((val) => {
22
- if (val) {
23
- const inputValue = coerceNumberProperty(val, 0);
24
- this.updateValueViaInput(inputValue);
25
- }
26
- });
27
- }
28
- ngOnDestroy() {
29
- this.inputStreamSub.unsubscribe();
30
- }
31
- upBtnClicked() {
32
- this.updateValue(this.value + this.step);
33
- }
34
- downBtnClicked() {
35
- this.updateValue(this.value - this.step);
36
- }
37
- handleInputChange(val) {
38
- this.inputStream.next(val);
39
- }
40
- updateValue(value) {
41
- this.valueChange.emit(value);
42
- }
43
- updateValueViaInput(value) {
44
- if (value > this.max || value < this.min) {
45
- return;
46
- }
47
- this.inputChange.emit(value);
48
- }
49
- }
50
- OwlTimerBoxComponent.decorators = [
51
- { type: Component, args: [{
52
- exportAs: 'owlDateTimeTimerBox',
53
- selector: 'owl-date-time-timer-box',
54
- template: "<div *ngIf=\"showDivider\"\n class=\"owl-dt-timer-divider\"\n aria-hidden=\"true\"></div>\n<button class=\"owl-dt-control-button owl-dt-control-arrow-button\"\n type=\"button\"\n tabindex=\"-1\"\n [disabled]=\"upBtnDisabled\"\n [attr.aria-label]=\"upBtnAriaLabel\"\n (click)=\"upBtnClicked()\">\n <span class=\"owl-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Up\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n version=\"1.1\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 451.847 451.846\"\n style=\"enable-background:new 0 0 451.847 451.846;\"\n xml:space=\"preserve\"\n width=\"100%\"\n height=\"100%\">\n <path d=\"M248.292,106.406l194.281,194.29c12.365,12.359,12.365,32.391,0,44.744c-12.354,12.354-32.391,12.354-44.744,0\n L225.923,173.529L54.018,345.44c-12.36,12.354-32.395,12.354-44.748,0c-12.359-12.354-12.359-32.391,0-44.75L203.554,106.4\n c6.18-6.174,14.271-9.259,22.369-9.259C234.018,97.141,242.115,100.232,248.292,106.406z\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n</button>\n<label class=\"owl-dt-timer-content\">\n <input class=\"owl-dt-timer-input\"\n maxlength=\"2\"\n [value]=\"displayValue | numberFixedLen : 2\"\n (input)=\"handleInputChange(valueInput.value)\"\n #valueInput>\n <span class=\"owl-hidden-accessible\">{{inputLabel}}</span>\n</label>\n<button class=\"owl-dt-control-button owl-dt-control-arrow-button\"\n type=\"button\"\n tabindex=\"-1\"\n [disabled]=\"downBtnDisabled\"\n [attr.aria-label]=\"downBtnAriaLabel\"\n (click)=\"downBtnClicked()\">\n <span class=\"owl-dt-control-button-content\"\n tabindex=\"-1\">\n <!-- <editor-fold desc=\"SVG Arrow Down\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n version=\"1.1\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 451.847 451.846\"\n style=\"enable-background:new 0 0 451.847 451.846;\"\n xml:space=\"preserve\"\n width=\"100%\"\n height=\"100%\">\n <path\n d=\"M225.923,354.706c-8.098,0-16.195-3.092-22.369-9.263L9.27,151.157c-12.359-12.359-12.359-32.397,0-44.751\n c12.354-12.354,32.388-12.354,44.748,0l171.905,171.915l171.906-171.909c12.359-12.354,32.391-12.354,44.744,0\n c12.365,12.354,12.365,32.392,0,44.751L248.292,345.449C242.115,351.621,234.018,354.706,225.923,354.706z\" />\n </svg>\n <!-- </editor-fold> -->\n </span>\n</button>\n",
55
- preserveWhitespaces: false,
56
- changeDetection: ChangeDetectionStrategy.OnPush,
57
- styles: [""]
58
- },] }
59
- ];
60
- OwlTimerBoxComponent.ctorParameters = () => [];
61
- OwlTimerBoxComponent.propDecorators = {
62
- showDivider: [{ type: Input }],
63
- upBtnAriaLabel: [{ type: Input }],
64
- upBtnDisabled: [{ type: Input }],
65
- downBtnAriaLabel: [{ type: Input }],
66
- downBtnDisabled: [{ type: Input }],
67
- boxValue: [{ type: Input }],
68
- value: [{ type: Input }],
69
- min: [{ type: Input }],
70
- max: [{ type: Input }],
71
- step: [{ type: Input }],
72
- inputLabel: [{ type: Input }],
73
- valueChange: [{ type: Output }],
74
- inputChange: [{ type: Output }],
75
- owlDTTimerBoxClass: [{ type: HostBinding, args: ['class.owl-dt-timer-box',] }]
76
- };
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXItYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1waWNrLWRhdGV0aW1lL3NyYy9saWIvZGF0ZS10aW1lL3RpbWVyLWJveC90aW1lci1ib3guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQzVELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUMvSCxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFXbkUsTUFBTSxPQUFPLG9CQUFvQjtJQTZDN0I7UUEzQ1MsZ0JBQVcsR0FBRyxLQUFLLENBQUE7UUFzQm5CLFNBQUksR0FBRyxDQUFDLENBQUE7UUFJUCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUE7UUFFeEMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFBO1FBRTFDLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQTtRQUVuQyxtQkFBYyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUE7SUFZM0MsQ0FBQztJQVZELElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFBO0lBQ3RDLENBQUM7SUFFRCxJQUNJLGtCQUFrQjtRQUNsQixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFLTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDdkMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUNqQixvQkFBb0IsRUFBRSxDQUN6QixDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQ3hCLElBQUksR0FBRyxFQUFFO2dCQUNMLE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQTtnQkFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFBO2FBQ3ZDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRU0sV0FBVztRQUNkLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDckMsQ0FBQztJQUVNLFlBQVk7UUFDZixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFTSxjQUFjO1FBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDNUMsQ0FBQztJQUVNLGlCQUFpQixDQUFDLEdBQVc7UUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDOUIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2hDLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxLQUFhO1FBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdEMsT0FBTTtTQUNUO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDaEMsQ0FBQzs7O1lBOUZKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixRQUFRLEVBQUUseUJBQXlCO2dCQUNuQyx3eUZBQXlDO2dCQUV6QyxtQkFBbUIsRUFBRSxLQUFLO2dCQUMxQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7YUFDbEQ7Ozs7MEJBSUksS0FBSzs2QkFFTCxLQUFLOzRCQUVMLEtBQUs7K0JBRUwsS0FBSzs4QkFFTCxLQUFLO3VCQU1MLEtBQUs7b0JBRUwsS0FBSztrQkFFTCxLQUFLO2tCQUVMLEtBQUs7bUJBRUwsS0FBSzt5QkFFTCxLQUFLOzBCQUVMLE1BQU07MEJBRU4sTUFBTTtpQ0FVTixXQUFXLFNBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29lcmNlTnVtYmVyUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5AQ29tcG9uZW50KHtcbiAgICBleHBvcnRBczogJ293bERhdGVUaW1lVGltZXJCb3gnLFxuICAgIHNlbGVjdG9yOiAnb3dsLWRhdGUtdGltZS10aW1lci1ib3gnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90aW1lci1ib3guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3RpbWVyLWJveC5jb21wb25lbnQuc2NzcyddLFxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuXG5leHBvcnQgY2xhc3MgT3dsVGltZXJCb3hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKSBzaG93RGl2aWRlciA9IGZhbHNlXG5cbiAgICBASW5wdXQoKSB1cEJ0bkFyaWFMYWJlbDogc3RyaW5nXG5cbiAgICBASW5wdXQoKSB1cEJ0bkRpc2FibGVkOiBib29sZWFuXG5cbiAgICBASW5wdXQoKSBkb3duQnRuQXJpYUxhYmVsOiBzdHJpbmdcblxuICAgIEBJbnB1dCgpIGRvd25CdG5EaXNhYmxlZDogYm9vbGVhblxuXG4gICAgLyoqXG4gICAgICogVmFsdWUgd291bGQgYmUgZGlzcGxheWVkIGluIHRoZSBib3hcbiAgICAgKiBJZiBpdCBpcyBudWxsLCB0aGUgYm94IHdvdWxkIGRpc3BsYXkgW3ZhbHVlXVxuICAgICAqICovXG4gICAgQElucHV0KCkgYm94VmFsdWU6IG51bWJlclxuXG4gICAgQElucHV0KCkgdmFsdWU6IG51bWJlclxuXG4gICAgQElucHV0KCkgbWluOiBudW1iZXJcblxuICAgIEBJbnB1dCgpIG1heDogbnVtYmVyXG5cbiAgICBASW5wdXQoKSBzdGVwID0gMVxuXG4gICAgQElucHV0KCkgaW5wdXRMYWJlbDogc3RyaW5nXG5cbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKVxuXG4gICAgQE91dHB1dCgpIGlucHV0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KClcblxuICAgIHByaXZhdGUgaW5wdXRTdHJlYW0gPSBuZXcgU3ViamVjdDxzdHJpbmc+KClcblxuICAgIHByaXZhdGUgaW5wdXRTdHJlYW1TdWIgPSBTdWJzY3JpcHRpb24uRU1QVFlcblxuICAgIGdldCBkaXNwbGF5VmFsdWUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm94VmFsdWUgfHwgdGhpcy52YWx1ZVxuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mub3dsLWR0LXRpbWVyLWJveCcpXG4gICAgZ2V0IG93bERUVGltZXJCb3hDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuaW5wdXRTdHJlYW1TdWIgPSB0aGlzLmlucHV0U3RyZWFtLnBpcGUoXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUoNTAwKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKS5zdWJzY3JpYmUoKHZhbDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRWYWx1ZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbCwgMClcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlVmlhSW5wdXQoaW5wdXRWYWx1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRTdHJlYW1TdWIudW5zdWJzY3JpYmUoKVxuICAgIH1cblxuICAgIHB1YmxpYyB1cEJ0bkNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodGhpcy52YWx1ZSArIHRoaXMuc3RlcClcbiAgICB9XG5cbiAgICBwdWJsaWMgZG93bkJ0bkNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodGhpcy52YWx1ZSAtIHRoaXMuc3RlcClcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlSW5wdXRDaGFuZ2UodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFN0cmVhbS5uZXh0KHZhbClcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlKVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFsdWVWaWFJbnB1dCh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSA+IHRoaXMubWF4IHx8IHZhbHVlIDwgdGhpcy5taW4pIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh2YWx1ZSlcbiAgICB9XG59XG4iXX0=
@@ -1,202 +0,0 @@
1
- import { animate, animateChild, keyframes, style, transition, trigger } from '@angular/animations';
2
- import { FocusTrapFactory } from '@angular/cdk/a11y';
3
- import { BasePortalOutlet, CdkPortalOutlet } from '@angular/cdk/portal';
4
- import { DOCUMENT } from '@angular/common';
5
- import { ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Inject, Optional, ViewChild } from '@angular/core';
6
- const zoomFadeIn = {
7
- opacity: 0,
8
- transform: 'translateX({{ x }}) translateY({{ y }}) scale({{scale}})'
9
- };
10
- const zoomFadeInFrom = {
11
- opacity: 0,
12
- transform: 'translateX({{ x }}) translateY({{ y }}) scale({{scale}})',
13
- transformOrigin: '{{ ox }} {{ oy }}'
14
- };
15
- export class OwlDialogContainerComponent extends BasePortalOutlet {
16
- constructor(changeDetector, elementRef, focusTrapFactory, document) {
17
- super();
18
- this.changeDetector = changeDetector;
19
- this.elementRef = elementRef;
20
- this.focusTrapFactory = focusTrapFactory;
21
- this.document = document;
22
- /** ID of the element that should be considered as the dialog's label. */
23
- this.ariaLabelledBy = null;
24
- /** Emits when an animation state changes. */
25
- this.animationStateChanged = new EventEmitter();
26
- this.isAnimating = false;
27
- this.state = 'enter';
28
- // for animation purpose
29
- this.params = {
30
- x: '0px',
31
- y: '0px',
32
- ox: '50%',
33
- oy: '50%',
34
- scale: 0
35
- };
36
- // A variable to hold the focused element before the dialog was open.
37
- // This would help us to refocus back to element when the dialog was closed.
38
- this.elementFocusedBeforeDialogWasOpened = null;
39
- }
40
- get config() {
41
- return this._config;
42
- }
43
- get owlDialogContainerClass() {
44
- return true;
45
- }
46
- get owlDialogContainerTabIndex() {
47
- return -1;
48
- }
49
- get owlDialogContainerId() {
50
- return this._config.id;
51
- }
52
- get owlDialogContainerRole() {
53
- return this._config.role || null;
54
- }
55
- get owlDialogContainerAriaLabelledby() {
56
- return this.ariaLabelledBy;
57
- }
58
- get owlDialogContainerAriaDescribedby() {
59
- return this._config.ariaDescribedBy || null;
60
- }
61
- get owlDialogContainerAnimation() {
62
- return { value: this.state, params: this.params };
63
- }
64
- ngOnInit() { }
65
- /**
66
- * Attach a ComponentPortal as content to this dialog container.
67
- */
68
- attachComponentPortal(portal) {
69
- if (this.portalOutlet.hasAttached()) {
70
- throw Error('Attempting to attach dialog content after content is already attached');
71
- }
72
- this.savePreviouslyFocusedElement();
73
- return this.portalOutlet.attachComponentPortal(portal);
74
- }
75
- attachTemplatePortal(_portal) {
76
- throw new Error('Method not implemented.');
77
- }
78
- setConfig(config) {
79
- this._config = config;
80
- if (config.event) {
81
- this.calculateZoomOrigin(config.event);
82
- }
83
- }
84
- onAnimationStart(event) {
85
- this.isAnimating = true;
86
- this.animationStateChanged.emit(event);
87
- }
88
- onAnimationDone(event) {
89
- if (event.toState === 'enter') {
90
- this.trapFocus();
91
- }
92
- else if (event.toState === 'exit') {
93
- this.restoreFocus();
94
- }
95
- this.animationStateChanged.emit(event);
96
- this.isAnimating = false;
97
- }
98
- startExitAnimation() {
99
- this.state = 'exit';
100
- this.changeDetector.markForCheck();
101
- }
102
- /**
103
- * Calculate origin used in the `zoomFadeInFrom()`
104
- * for animation purpose
105
- */
106
- calculateZoomOrigin(event) {
107
- if (!event) {
108
- return;
109
- }
110
- const clientX = event.clientX;
111
- const clientY = event.clientY;
112
- const wh = window.innerWidth / 2;
113
- const hh = window.innerHeight / 2;
114
- const x = clientX - wh;
115
- const y = clientY - hh;
116
- const ox = clientX / window.innerWidth;
117
- const oy = clientY / window.innerHeight;
118
- this.params.x = `${x}px`;
119
- this.params.y = `${y}px`;
120
- this.params.ox = `${ox * 100}%`;
121
- this.params.oy = `${oy * 100}%`;
122
- this.params.scale = 0;
123
- return;
124
- }
125
- /**
126
- * Save the focused element before dialog was open
127
- */
128
- savePreviouslyFocusedElement() {
129
- if (this.document) {
130
- this.elementFocusedBeforeDialogWasOpened = this.document
131
- .activeElement;
132
- Promise.resolve().then(() => this.elementRef.nativeElement.focus());
133
- }
134
- }
135
- trapFocus() {
136
- if (!this.focusTrap) {
137
- this.focusTrap = this.focusTrapFactory.create(this.elementRef.nativeElement);
138
- }
139
- if (this._config.autoFocus) {
140
- this.focusTrap.focusInitialElementWhenReady();
141
- }
142
- }
143
- restoreFocus() {
144
- const toFocus = this.elementFocusedBeforeDialogWasOpened;
145
- // We need the extra check, because IE can set the `activeElement` to null in some cases.
146
- if (toFocus && typeof toFocus.focus === 'function') {
147
- toFocus.focus();
148
- }
149
- if (this.focusTrap) {
150
- this.focusTrap.destroy();
151
- }
152
- }
153
- }
154
- OwlDialogContainerComponent.decorators = [
155
- { type: Component, args: [{
156
- selector: 'owl-dialog-container',
157
- template: "<ng-template cdkPortalOutlet></ng-template>\n",
158
- animations: [
159
- trigger('slideModal', [
160
- transition('void => enter', [
161
- style(zoomFadeInFrom),
162
- animate('300ms cubic-bezier(0.35, 0, 0.25, 1)', style('*')),
163
- animate('150ms', keyframes([
164
- style({ transform: 'scale(1)', offset: 0 }),
165
- style({ transform: 'scale(1.05)', offset: 0.3 }),
166
- style({ transform: 'scale(.95)', offset: 0.8 }),
167
- style({ transform: 'scale(1)', offset: 1.0 })
168
- ])),
169
- animateChild()
170
- ], {
171
- params: {
172
- x: '0px',
173
- y: '0px',
174
- ox: '50%',
175
- oy: '50%',
176
- scale: 1
177
- }
178
- }),
179
- transition('enter => exit', [animateChild(), animate(200, style(zoomFadeIn))], { params: { x: '0px', y: '0px', ox: '50%', oy: '50%' } })
180
- ])
181
- ]
182
- },] }
183
- ];
184
- OwlDialogContainerComponent.ctorParameters = () => [
185
- { type: ChangeDetectorRef },
186
- { type: ElementRef },
187
- { type: FocusTrapFactory },
188
- { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }
189
- ];
190
- OwlDialogContainerComponent.propDecorators = {
191
- portalOutlet: [{ type: ViewChild, args: [CdkPortalOutlet, { static: true },] }],
192
- owlDialogContainerClass: [{ type: HostBinding, args: ['class.owl-dialog-container',] }],
193
- owlDialogContainerTabIndex: [{ type: HostBinding, args: ['attr.tabindex',] }],
194
- owlDialogContainerId: [{ type: HostBinding, args: ['attr.id',] }],
195
- owlDialogContainerRole: [{ type: HostBinding, args: ['attr.role',] }],
196
- owlDialogContainerAriaLabelledby: [{ type: HostBinding, args: ['attr.aria-labelledby',] }],
197
- owlDialogContainerAriaDescribedby: [{ type: HostBinding, args: ['attr.aria-describedby',] }],
198
- owlDialogContainerAnimation: [{ type: HostBinding, args: ['@slideModal',] }],
199
- onAnimationStart: [{ type: HostListener, args: ['@slideModal.start', ['$event'],] }],
200
- onAnimationDone: [{ type: HostListener, args: ['@slideModal.done', ['$event'],] }]
201
- };
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtcGljay1kYXRldGltZS9zcmMvbGliL2RpYWxvZy9kaWFsb2ctY29udGFpbmVyL2RpYWxvZy1jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFrQixTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNsSCxPQUFPLEVBQWEsZ0JBQWdCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFtQyxNQUFNLHFCQUFxQixDQUFBO0FBQ3hHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFnQixVQUFVLEVBQW1CLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBVSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBR3JMLE1BQU0sVUFBVSxHQUFHO0lBQ2YsT0FBTyxFQUFFLENBQUM7SUFDVixTQUFTLEVBQUUsMERBQTBEO0NBQ3hFLENBQUE7QUFDRCxNQUFNLGNBQWMsR0FBRztJQUNuQixPQUFPLEVBQUUsQ0FBQztJQUNWLFNBQVMsRUFBRSwwREFBMEQ7SUFDckUsZUFBZSxFQUFFLG1CQUFtQjtDQUN2QyxDQUFBO0FBeUNELE1BQU0sT0FBTywyQkFBNEIsU0FBUSxnQkFBZ0I7SUF1RTdELFlBQ1ksY0FBaUMsRUFDakMsVUFBc0IsRUFDdEIsZ0JBQWtDLEVBR2xDLFFBQWE7UUFFckIsS0FBSyxFQUFFLENBQUE7UUFQQyxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsZUFBVSxHQUFWLFVB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QUFDLDRCQUE0Qjt5Q0FLeEMsV0FBVyxTQUFDLGVBQWU7bUNBSzNCLFdBQVcsU0FBQyxTQUFTO3FDQUtyQixXQUFXLFNBQUMsV0FBVzsrQ0FLdkIsV0FBVyxTQUFDLHNCQUFzQjtnREFLbEMsV0FBVyxTQUFDLHVCQUF1QjswQ0FLbkMsV0FBVyxTQUFDLGFBQWE7K0JBZ0R6QixZQUFZLFNBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUM7OEJBTTVDLFlBQVksU0FBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFuaW1hdGUsIGFuaW1hdGVDaGlsZCwgQW5pbWF0aW9uRXZlbnQsIGtleWZyYW1lcywgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJ1xuaW1wb3J0IHsgRm9jdXNUcmFwLCBGb2N1c1RyYXBGYWN0b3J5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknXG5pbXBvcnQgeyBCYXNlUG9ydGFsT3V0bGV0LCBDZGtQb3J0YWxPdXRsZXQsIENvbXBvbmVudFBvcnRhbCwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJ1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb21wb25lbnRSZWYsIEVsZW1lbnRSZWYsIEVtYmVkZGVkVmlld1JlZiwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbmplY3QsIE9uSW5pdCwgT3B0aW9uYWwsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBPd2xEaWFsb2dDb25maWcgfSBmcm9tICcuLi8uLi9jbGFzcy9kaWFsb2ctY29uZmlnLmNsYXNzJ1xuXG5jb25zdCB6b29tRmFkZUluID0ge1xuICAgIG9wYWNpdHk6IDAsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCh7eyB4IH19KSB0cmFuc2xhdGVZKHt7IHkgfX0pIHNjYWxlKHt7c2NhbGV9fSknXG59XG5jb25zdCB6b29tRmFkZUluRnJvbSA9IHtcbiAgICBvcGFjaXR5OiAwLFxuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoe3sgeCB9fSkgdHJhbnNsYXRlWSh7eyB5IH19KSBzY2FsZSh7e3NjYWxlfX0pJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICd7eyBveCB9fSB7eyBveSB9fSdcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdvd2wtZGlhbG9nLWNvbnRhaW5lcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RpYWxvZy1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgdHJpZ2dlcignc2xpZGVNb2RhbCcsIFtcbiAgICAgICAgICAgIHRyYW5zaXRpb24oXG4gICAgICAgICAgICAgICAgJ3ZvaWQgPT4gZW50ZXInLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUoem9vbUZhZGVJbkZyb20pLFxuICAgICAgICAgICAgICAgICAgICBhbmltYXRlKCczMDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSknLCBzdHlsZSgnKicpKSxcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICcxNTBtcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlmcmFtZXMoW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGUoMSknLCBvZmZzZXQ6IDAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICdzY2FsZSgxLjA1KScsIG9mZnNldDogMC4zIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGUoLjk1KScsIG9mZnNldDogMC44IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGUoMSknLCBvZmZzZXQ6IDEuMCB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZUNoaWxkKClcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4OiAnMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6ICcwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3g6ICc1MCUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3k6ICc1MCUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6IDFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKFxuICAgICAgICAgICAgICAgICdlbnRlciA9PiBleGl0JyxcbiAgICAgICAgICAgICAgICBbYW5pbWF0ZUNoaWxkKCksIGFuaW1hdGUoMjAwLCBzdHlsZSh6b29tRmFkZUluKSldLFxuICAgICAgICAgICAgICAgIHsgcGFyYW1zOiB7IHg6ICcwcHgnLCB5OiAnMHB4Jywgb3g6ICc1MCUnLCBveTogJzUwJScgfSB9XG4gICAgICAgICAgICApXG4gICAgICAgIF0pXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBPd2xEaWFsb2dDb250YWluZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNlUG9ydGFsT3V0bGV0XG4gICAgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBWaWV3Q2hpbGQoQ2RrUG9ydGFsT3V0bGV0LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIHBvcnRhbE91dGxldDogQ2RrUG9ydGFsT3V0bGV0XG5cbiAgICAvKiogVGhlIGNsYXNzIHRoYXQgdHJhcHMgYW5kIG1hbmFnZXMgZm9jdXMgd2l0aGluIHRoZSBkaWFsb2cuICovXG4gICAgcHJpdmF0ZSBmb2N1c1RyYXA6IEZvY3VzVHJhcFxuXG4gICAgLyoqIElEIG9mIHRoZSBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgdGhlIGRpYWxvZydzIGxhYmVsLiAqL1xuICAgIHB1YmxpYyBhcmlhTGFiZWxsZWRCeTogc3RyaW5nIHwgbnVsbCA9IG51bGxcblxuICAgIC8qKiBFbWl0cyB3aGVuIGFuIGFuaW1hdGlvbiBzdGF0ZSBjaGFuZ2VzLiAqL1xuICAgIHB1YmxpYyBhbmltYXRpb25TdGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEFuaW1hdGlvbkV2ZW50PigpXG5cbiAgICBwdWJsaWMgaXNBbmltYXRpbmcgPSBmYWxzZVxuXG4gICAgcHJpdmF0ZSBfY29uZmlnOiBPd2xEaWFsb2dDb25maWdcbiAgICBnZXQgY29uZmlnKCk6IE93bERpYWxvZ0NvbmZpZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWdcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRlOiAndm9pZCcgfCAnZW50ZXInIHwgJ2V4aXQnID0gJ2VudGVyJ1xuXG4gICAgLy8gZm9yIGFuaW1hdGlvbiBwdXJwb3NlXG4gICAgcHJpdmF0ZSBwYXJhbXM6IGFueSA9IHtcbiAgICAgICAgeDogJzBweCcsXG4gICAgICAgIHk6ICcwcHgnLFxuICAgICAgICBveDogJzUwJScsXG4gICAgICAgIG95OiAnNTAlJyxcbiAgICAgICAgc2NhbGU6IDBcbiAgICB9XG5cbiAgICAvLyBBIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGZvY3VzZWQgZWxlbWVudCBiZWZvcmUgdGhlIGRpYWxvZyB3YXMgb3Blbi5cbiAgICAvLyBUaGlzIHdvdWxkIGhlbHAgdXMgdG8gcmVmb2N1cyBiYWNrIHRvIGVsZW1lbnQgd2hlbiB0aGUgZGlhbG9nIHdhcyBjbG9zZWQuXG4gICAgcHJpdmF0ZSBlbGVtZW50Rm9jdXNlZEJlZm9yZURpYWxvZ1dhc09wZW5lZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbFxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5vd2wtZGlhbG9nLWNvbnRhaW5lcicpXG4gICAgZ2V0IG93bERpYWxvZ0NvbnRhaW5lckNsYXNzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gICAgZ2V0IG93bERpYWxvZ0NvbnRhaW5lclRhYkluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgZ2V0IG93bERpYWxvZ0NvbnRhaW5lcklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuaWRcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgZ2V0IG93bERpYWxvZ0NvbnRhaW5lclJvbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5yb2xlIHx8IG51bGxcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbGxlZGJ5JylcbiAgICBnZXQgb3dsRGlhbG9nQ29udGFpbmVyQXJpYUxhYmVsbGVkYnkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXJpYUxhYmVsbGVkQnlcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kZXNjcmliZWRieScpXG4gICAgZ2V0IG93bERpYWxvZ0NvbnRhaW5lckFyaWFEZXNjcmliZWRieSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmFyaWFEZXNjcmliZWRCeSB8fCBudWxsXG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdAc2xpZGVNb2RhbCcpXG4gICAgZ2V0IG93bERpYWxvZ0NvbnRhaW5lckFuaW1hdGlvbigpOiBhbnkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZTogdGhpcy5zdGF0ZSwgcGFyYW1zOiB0aGlzLnBhcmFtcyB9XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgZm9jdXNUcmFwRmFjdG9yeTogRm9jdXNUcmFwRmFjdG9yeSxcbiAgICAgICAgQE9wdGlvbmFsKClcbiAgICAgICAgQEluamVjdChET0NVTUVOVClcbiAgICAgICAgcHJpdmF0ZSBkb2N1bWVudDogYW55XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEF0dGFjaCBhIENvbXBvbmVudFBvcnRhbCBhcyBjb250ZW50IHRvIHRoaXMgZGlhbG9nIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXR0YWNoQ29tcG9uZW50UG9ydGFsPFQ+KFxuICAgICAgICBwb3J0YWw6IENvbXBvbmVudFBvcnRhbDxUPlxuICAgICk6IENvbXBvbmVudFJlZjxUPiB7XG4gICAgICAgIGlmICh0aGlzLnBvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICAnQXR0ZW1wdGluZyB0byBhdHRhY2ggZGlhbG9nIGNvbnRlbnQgYWZ0ZXIgY29udGVudCBpcyBhbHJlYWR5IGF0dGFjaGVkJ1xuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KClcbiAgICAgICAgcmV0dXJuIHRoaXMucG9ydGFsT3V0bGV0LmF0dGFjaENvbXBvbmVudFBvcnRhbChwb3J0YWwpXG4gICAgfVxuXG4gICAgcHVibGljIGF0dGFjaFRlbXBsYXRlUG9ydGFsPEM+KFxuICAgICAgICBfcG9ydGFsOiBUZW1wbGF0ZVBvcnRhbDxDPlxuICAgICk6IEVtYmVkZGVkVmlld1JlZjxDPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDb25maWcoY29uZmlnOiBPd2xEaWFsb2dDb25maWcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnXG5cbiAgICAgICAgaWYgKGNvbmZpZy5ldmVudCkge1xuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVab29tT3JpZ2luKGNvbmZpZy5ldmVudClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ0BzbGlkZU1vZGFsLnN0YXJ0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25BbmltYXRpb25TdGFydChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IHRydWVcbiAgICAgICAgdGhpcy5hbmltYXRpb25TdGF0ZUNoYW5nZWQuZW1pdChldmVudClcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdAc2xpZGVNb2RhbC5kb25lJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25BbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2VudGVyJykge1xuICAgICAgICAgICAgdGhpcy50cmFwRm9jdXMoKVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdleGl0Jykge1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlRm9jdXMoKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hbmltYXRpb25TdGF0ZUNoYW5nZWQuZW1pdChldmVudClcbiAgICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0RXhpdEFuaW1hdGlvbigpIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdleGl0J1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlIG9yaWdpbiB1c2VkIGluIHRoZSBgem9vbUZhZGVJbkZyb20oKWBcbiAgICAgKiBmb3IgYW5pbWF0aW9uIHB1cnBvc2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbGN1bGF0ZVpvb21PcmlnaW4oZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsaWVudFggPSBldmVudC5jbGllbnRYXG4gICAgICAgIGNvbnN0IGNsaWVudFkgPSBldmVudC5jbGllbnRZXG5cbiAgICAgICAgY29uc3Qgd2ggPSB3aW5kb3cuaW5uZXJXaWR0aCAvIDJcbiAgICAgICAgY29uc3QgaGggPSB3aW5kb3cuaW5uZXJIZWlnaHQgLyAyXG4gICAgICAgIGNvbnN0IHggPSBjbGllbnRYIC0gd2hcbiAgICAgICAgY29uc3QgeSA9IGNsaWVudFkgLSBoaFxuICAgICAgICBjb25zdCBveCA9IGNsaWVudFggLyB3aW5kb3cuaW5uZXJXaWR0aFxuICAgICAgICBjb25zdCBveSA9IGNsaWVudFkgLyB3aW5kb3cuaW5uZXJIZWlnaHRcblxuICAgICAgICB0aGlzLnBhcmFtcy54ID0gYCR7eH1weGBcbiAgICAgICAgdGhpcy5wYXJhbXMueSA9IGAke3l9cHhgXG4gICAgICAgIHRoaXMucGFyYW1zLm94ID0gYCR7b3ggKiAxMDB9JWBcbiAgICAgICAgdGhpcy5wYXJhbXMub3kgPSBgJHtveSAqIDEwMH0lYFxuICAgICAgICB0aGlzLnBhcmFtcy5zY2FsZSA9IDBcblxuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTYXZlIHRoZSBmb2N1c2VkIGVsZW1lbnQgYmVmb3JlIGRpYWxvZyB3YXMgb3BlblxuICAgICAqL1xuICAgIHByaXZhdGUgc2F2ZVByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudEZvY3VzZWRCZWZvcmVEaWFsb2dXYXNPcGVuZWQgPSB0aGlzLmRvY3VtZW50XG4gICAgICAgICAgICAgICAgLmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnRcblxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFwRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5mb2N1c1RyYXApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwID0gdGhpcy5mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hdXRvRm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmZvY3VzSW5pdGlhbEVsZW1lbnRXaGVuUmVhZHkoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXN0b3JlRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvRm9jdXMgPSB0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkXG5cbiAgICAgICAgLy8gV2UgbmVlZCB0aGUgZXh0cmEgY2hlY2ssIGJlY2F1c2UgSUUgY2FuIHNldCB0aGUgYGFjdGl2ZUVsZW1lbnRgIHRvIG51bGwgaW4gc29tZSBjYXNlcy5cbiAgICAgICAgaWYgKHRvRm9jdXMgJiYgdHlwZW9mIHRvRm9jdXMuZm9jdXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRvRm9jdXMuZm9jdXMoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5kZXN0cm95KClcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -1,26 +0,0 @@
1
- import { A11yModule } from '@angular/cdk/a11y';
2
- import { OverlayModule } from '@angular/cdk/overlay';
3
- import { PortalModule } from '@angular/cdk/portal';
4
- import { CommonModule } from '@angular/common';
5
- import { NgModule } from '@angular/core';
6
- import { OwlDialogContainerComponent } from './dialog-container/dialog-container.component';
7
- import { OwlDialogService, OWL_DIALOG_SCROLL_STRATEGY_PROVIDER } from './dialog.service';
8
- export class OwlDialogModule {
9
- }
10
- OwlDialogModule.decorators = [
11
- { type: NgModule, args: [{
12
- imports: [CommonModule, A11yModule, OverlayModule, PortalModule],
13
- exports: [],
14
- declarations: [
15
- OwlDialogContainerComponent
16
- ],
17
- providers: [
18
- OWL_DIALOG_SCROLL_STRATEGY_PROVIDER,
19
- OwlDialogService
20
- ],
21
- entryComponents: [
22
- OwlDialogContainerComponent
23
- ]
24
- },] }
25
- ];
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL254dC1waWNrLWRhdGV0aW1lL3NyYy9saWIvZGlhbG9nL2RpYWxvZy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDeEMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sK0NBQStDLENBQUE7QUFDM0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG1DQUFtQyxFQUFFLE1BQU0sa0JBQWtCLENBQUE7QUFnQnhGLE1BQU0sT0FBTyxlQUFlOzs7WUFkM0IsUUFBUSxTQUFDO2dCQUNOLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBQztnQkFDaEUsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsWUFBWSxFQUFFO29CQUNWLDJCQUEyQjtpQkFDOUI7Z0JBQ0QsU0FBUyxFQUFFO29CQUNQLG1DQUFtQztvQkFDbkMsZ0JBQWdCO2lCQUNuQjtnQkFDRCxlQUFlLEVBQUU7b0JBQ2IsMkJBQTJCO2lCQUM5QjthQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQTExeU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5J1xuaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5J1xuaW1wb3J0IHsgUG9ydGFsTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCdcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcbmltcG9ydCB7IE93bERpYWxvZ0NvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9nLWNvbnRhaW5lci9kaWFsb2ctY29udGFpbmVyLmNvbXBvbmVudCdcbmltcG9ydCB7IE93bERpYWxvZ1NlcnZpY2UsIE9XTF9ESUFMT0dfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSIH0gZnJvbSAnLi9kaWFsb2cuc2VydmljZSdcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBBMTF5TW9kdWxlLCBPdmVybGF5TW9kdWxlLCBQb3J0YWxNb2R1bGVdLFxuICAgIGV4cG9ydHM6IFtdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBPd2xEaWFsb2dDb250YWluZXJDb21wb25lbnRcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBPV0xfRElBTE9HX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUixcbiAgICAgICAgT3dsRGlhbG9nU2VydmljZVxuICAgIF0sXG4gICAgZW50cnlDb21wb25lbnRzOiBbXG4gICAgICAgIE93bERpYWxvZ0NvbnRhaW5lckNvbXBvbmVudFxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgT3dsRGlhbG9nTW9kdWxlIHsgfVxuIl19
@@ -1,225 +0,0 @@
1
- import { Overlay, OverlayConfig, OverlayContainer } from '@angular/cdk/overlay';
2
- import { ComponentPortal, PortalInjector } from '@angular/cdk/portal';
3
- import { Location } from '@angular/common';
4
- import { Inject, Injectable, InjectionToken, Injector, Optional, SkipSelf, TemplateRef } from '@angular/core';
5
- import { defer, Subject } from 'rxjs';
6
- import { startWith } from 'rxjs/operators';
7
- import { OwlDialogConfig } from '../class/dialog-config.class';
8
- import { OwlDialogRef } from '../class/dialog-ref.class';
9
- import { extendObject } from '../utils/object';
10
- import { OwlDialogContainerComponent } from './dialog-container/dialog-container.component';
11
- export const OWL_DIALOG_DATA = new InjectionToken('OwlDialogData');
12
- /**
13
- * Injection token that determines the scroll handling while the dialog is open.
14
- * */
15
- export const OWL_DIALOG_SCROLL_STRATEGY = new InjectionToken('owl-dialog-scroll-strategy');
16
- export function OWL_DIALOG_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay) {
17
- const fn = () => overlay.scrollStrategies.block();
18
- return fn;
19
- }
20
- /** @docs-private */
21
- export const OWL_DIALOG_SCROLL_STRATEGY_PROVIDER = {
22
- provide: OWL_DIALOG_SCROLL_STRATEGY,
23
- deps: [Overlay],
24
- useFactory: OWL_DIALOG_SCROLL_STRATEGY_PROVIDER_FACTORY
25
- };
26
- /** I
27
- * njection token that can be used to specify default dialog options.
28
- * */
29
- export const OWL_DIALOG_DEFAULT_OPTIONS = new InjectionToken('owl-dialog-default-options');
30
- export class OwlDialogService {
31
- constructor(overlay, injector, location, scrollStrategy, defaultOptions, parentDialog, overlayContainer) {
32
- this.overlay = overlay;
33
- this.injector = injector;
34
- this.location = location;
35
- this.defaultOptions = defaultOptions;
36
- this.parentDialog = parentDialog;
37
- this.overlayContainer = overlayContainer;
38
- this.ariaHiddenElements = new Map();
39
- this._openDialogsAtThisLevel = [];
40
- this._afterOpenAtThisLevel = new Subject();
41
- this._afterAllClosedAtThisLevel = new Subject();
42
- /**
43
- * Stream that emits when all open dialog have finished closing.
44
- * Will emit on subscribe if there are no open dialogs to begin with.
45
- */
46
- this.afterAllClosed = defer(() => this._openDialogsAtThisLevel.length
47
- ? this._afterAllClosed
48
- : this._afterAllClosed.pipe(startWith(undefined)));
49
- this.scrollStrategy = scrollStrategy;
50
- if (!parentDialog && location) {
51
- location.subscribe(() => this.closeAll());
52
- }
53
- }
54
- /** Keeps track of the currently-open dialogs. */
55
- get openDialogs() {
56
- return this.parentDialog
57
- ? this.parentDialog.openDialogs
58
- : this._openDialogsAtThisLevel;
59
- }
60
- /** Stream that emits when a dialog has been opened. */
61
- get afterOpen() {
62
- return this.parentDialog
63
- ? this.parentDialog.afterOpen
64
- : this._afterOpenAtThisLevel;
65
- }
66
- get _afterAllClosed() {
67
- const parent = this.parentDialog;
68
- return parent
69
- ? parent._afterAllClosed
70
- : this._afterAllClosedAtThisLevel;
71
- }
72
- open(componentOrTemplateRef, config) {
73
- config = applyConfigDefaults(config, this.defaultOptions);
74
- if (config.id && this.getDialogById(config.id)) {
75
- throw Error(`Dialog with id "${config.id}" exists already. The dialog id must be unique.`);
76
- }
77
- const overlayRef = this.createOverlay(config);
78
- const dialogContainer = this.attachDialogContainer(overlayRef, config);
79
- const dialogRef = this.attachDialogContent(componentOrTemplateRef, dialogContainer, overlayRef, config);
80
- if (!this.openDialogs.length) {
81
- this.hideNonDialogContentFromAssistiveTechnology();
82
- }
83
- this.openDialogs.push(dialogRef);
84
- dialogRef
85
- .afterClosed()
86
- .subscribe(() => this.removeOpenDialog(dialogRef));
87
- this.afterOpen.next(dialogRef);
88
- return dialogRef;
89
- }
90
- /**
91
- * Closes all of the currently-open dialogs.
92
- */
93
- closeAll() {
94
- let i = this.openDialogs.length;
95
- while (i--) {
96
- this.openDialogs[i].close();
97
- }
98
- }
99
- /**
100
- * Finds an open dialog by its id.
101
- * @param id ID to use when looking up the dialog.
102
- */
103
- getDialogById(id) {
104
- return this.openDialogs.find(dialog => dialog.id === id);
105
- }
106
- attachDialogContent(componentOrTemplateRef, dialogContainer, overlayRef, config) {
107
- const dialogRef = new OwlDialogRef(overlayRef, dialogContainer, config.id, this.location);
108
- if (config.hasBackdrop) {
109
- overlayRef.backdropClick().subscribe(() => {
110
- if (!dialogRef.disableClose) {
111
- dialogRef.close();
112
- }
113
- });
114
- }
115
- if (componentOrTemplateRef instanceof TemplateRef) {
116
- }
117
- else {
118
- const injector = this.createInjector(config, dialogRef, dialogContainer);
119
- const contentRef = dialogContainer.attachComponentPortal(new ComponentPortal(componentOrTemplateRef, undefined, injector));
120
- dialogRef.componentInstance = contentRef.instance;
121
- }
122
- dialogRef
123
- .updateSize(config.width, config.height)
124
- .updatePosition(config.position);
125
- return dialogRef;
126
- }
127
- createInjector(config, dialogRef, dialogContainer) {
128
- const userInjector = config &&
129
- config.viewContainerRef &&
130
- config.viewContainerRef.injector;
131
- const injectionTokens = new WeakMap();
132
- injectionTokens.set(OwlDialogRef, dialogRef);
133
- injectionTokens.set(OwlDialogContainerComponent, dialogContainer);
134
- injectionTokens.set(OWL_DIALOG_DATA, config.data);
135
- return new PortalInjector(userInjector || this.injector, injectionTokens);
136
- }
137
- createOverlay(config) {
138
- const overlayConfig = this.getOverlayConfig(config);
139
- return this.overlay.create(overlayConfig);
140
- }
141
- attachDialogContainer(overlayRef, config) {
142
- const containerPortal = new ComponentPortal(OwlDialogContainerComponent, config.viewContainerRef);
143
- const containerRef = overlayRef.attach(containerPortal);
144
- containerRef.instance.setConfig(config);
145
- return containerRef.instance;
146
- }
147
- getOverlayConfig(dialogConfig) {
148
- const state = new OverlayConfig({
149
- positionStrategy: this.overlay.position().global(),
150
- scrollStrategy: dialogConfig.scrollStrategy || this.scrollStrategy(),
151
- panelClass: dialogConfig.paneClass,
152
- hasBackdrop: dialogConfig.hasBackdrop,
153
- minWidth: dialogConfig.minWidth,
154
- minHeight: dialogConfig.minHeight,
155
- maxWidth: dialogConfig.maxWidth,
156
- maxHeight: dialogConfig.maxHeight
157
- });
158
- if (dialogConfig.backdropClass) {
159
- state.backdropClass = dialogConfig.backdropClass;
160
- }
161
- return state;
162
- }
163
- removeOpenDialog(dialogRef) {
164
- const index = this._openDialogsAtThisLevel.indexOf(dialogRef);
165
- if (index > -1) {
166
- this.openDialogs.splice(index, 1);
167
- // If all the dialogs were closed, remove/restore the `aria-hidden`
168
- // to a the siblings and emit to the `afterAllClosed` stream.
169
- if (!this.openDialogs.length) {
170
- this.ariaHiddenElements.forEach((previousValue, element) => {
171
- if (previousValue) {
172
- element.setAttribute('aria-hidden', previousValue);
173
- }
174
- else {
175
- element.removeAttribute('aria-hidden');
176
- }
177
- });
178
- this.ariaHiddenElements.clear();
179
- this._afterAllClosed.next();
180
- }
181
- }
182
- }
183
- /**
184
- * Hides all of the content that isn't an overlay from assistive technology.
185
- */
186
- hideNonDialogContentFromAssistiveTechnology() {
187
- const overlayContainer = this.overlayContainer.getContainerElement();
188
- // Ensure that the overlay container is attached to the DOM.
189
- if (overlayContainer.parentElement) {
190
- const siblings = overlayContainer.parentElement.children;
191
- for (let i = siblings.length - 1; i > -1; i--) {
192
- const sibling = siblings[i];
193
- if (sibling !== overlayContainer &&
194
- sibling.nodeName !== 'SCRIPT' &&
195
- sibling.nodeName !== 'STYLE' &&
196
- !sibling.hasAttribute('aria-live')) {
197
- this.ariaHiddenElements.set(sibling, sibling.getAttribute('aria-hidden'));
198
- sibling.setAttribute('aria-hidden', 'true');
199
- }
200
- }
201
- }
202
- }
203
- }
204
- OwlDialogService.decorators = [
205
- { type: Injectable }
206
- ];
207
- OwlDialogService.ctorParameters = () => [
208
- { type: Overlay },
209
- { type: Injector },
210
- { type: Location, decorators: [{ type: Optional }] },
211
- { type: undefined, decorators: [{ type: Inject, args: [OWL_DIALOG_SCROLL_STRATEGY,] }] },
212
- { type: OwlDialogConfig, decorators: [{ type: Optional }, { type: Inject, args: [OWL_DIALOG_DEFAULT_OPTIONS,] }] },
213
- { type: OwlDialogService, decorators: [{ type: Optional }, { type: SkipSelf }] },
214
- { type: OverlayContainer }
215
- ];
216
- /**
217
- * Applies default options to the dialog config.
218
- * @param config Config to be modified.
219
- * @param defaultOptions Default config setting
220
- * @returns The new configuration object.
221
- */
222
- function applyConfigDefaults(config, defaultOptions) {
223
- return extendObject(new OwlDialogConfig(), config, defaultOptions);
224
- }
225
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtcGljay1kYXRldGltZS9zcmMvbGliL2RpYWxvZy9kaWFsb2cuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBOEIsTUFBTSxzQkFBc0IsQ0FBQTtBQUMzRyxPQUFPLEVBQUUsZUFBZSxFQUFpQixjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUNwRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDMUMsT0FBTyxFQUFnQixNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDM0gsT0FBTyxFQUFFLEtBQUssRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDakQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTtBQUM5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzlDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLCtDQUErQyxDQUFBO0FBRTNGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBTSxlQUFlLENBQUMsQ0FBQTtBQUV2RTs7S0FFSztBQUNMLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLElBQUksY0FBYyxDQUUxRCw0QkFBNEIsQ0FBQyxDQUFBO0FBRS9CLE1BQU0sVUFBVSwyQ0FBMkMsQ0FDdkQsT0FBZ0I7SUFFaEIsTUFBTSxFQUFFLEdBQUcsR0FBRyxF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QkFBZ0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFBO1lBRXhELEtBQUssSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMzQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7Z0JBRTNCLElBQ0ksT0FBTyxLQUFLLGdCQUFnQjtvQkFDNUIsT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRO29CQUM3QixPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU87b0JBQzVCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFDcEM7b0JBQ0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FDdkIsT0FBTyxFQUNQLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQ3RDLENBQUE7b0JBQ0QsT0FBTyxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUE7aUJBQzlDO2FBQ0o7U0FDSjtJQUNMLENBQUM7OztZQTVRSixVQUFVOzs7WUF6Q0YsT0FBTztZQUcyQyxRQUFRO1lBRDFELFFBQVEsdUJBcUZSLFFBQVE7NENBQ1IsTUFBTSxTQUFDLDBCQUEwQjtZQWxGakMsZUFBZSx1QkFtRmYsUUFBUSxZQUNSLE1BQU0sU0FBQywwQkFBMEI7WUFJWixnQkFBZ0IsdUJBRnJDLFFBQVEsWUFDUixRQUFRO1lBN0ZnQixnQkFBZ0I7O0FBd1RqRDs7Ozs7R0FLRztBQUNILFNBQVMsbUJBQW1CLENBQ3hCLE1BQXdCLEVBQ3hCLGNBQWdDO0lBRWhDLE9BQU8sWUFBWSxDQUFDLElBQUksZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFBO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5Q29udGFpbmVyLCBPdmVybGF5UmVmLCBTY3JvbGxTdHJhdGVneSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5J1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsLCBDb21wb25lbnRUeXBlLCBQb3J0YWxJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbidcbmltcG9ydCB7IENvbXBvbmVudFJlZiwgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0b3IsIE9wdGlvbmFsLCBTa2lwU2VsZiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgZGVmZXIsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBPd2xEaWFsb2dDb25maWcgfSBmcm9tICcuLi9jbGFzcy9kaWFsb2ctY29uZmlnLmNsYXNzJ1xuaW1wb3J0IHsgT3dsRGlhbG9nUmVmIH0gZnJvbSAnLi4vY2xhc3MvZGlhbG9nLXJlZi5jbGFzcydcbmltcG9ydCB7IGV4dGVuZE9iamVjdCB9IGZyb20gJy4uL3V0aWxzL29iamVjdCdcbmltcG9ydCB7IE93bERpYWxvZ0NvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4vZGlhbG9nLWNvbnRhaW5lci9kaWFsb2ctY29udGFpbmVyLmNvbXBvbmVudCdcblxuZXhwb3J0IGNvbnN0IE9XTF9ESUFMT0dfREFUQSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxhbnk+KCdPd2xEaWFsb2dEYXRhJylcblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBkZXRlcm1pbmVzIHRoZSBzY3JvbGwgaGFuZGxpbmcgd2hpbGUgdGhlIGRpYWxvZyBpcyBvcGVuLlxuICogKi9cbmV4cG9ydCBjb25zdCBPV0xfRElBTE9HX1NDUk9MTF9TVFJBVEVHWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxcbiAgICAoKSA9PiBTY3JvbGxTdHJhdGVneVxuPignb3dsLWRpYWxvZy1zY3JvbGwtc3RyYXRlZ3knKVxuXG5leHBvcnQgZnVuY3Rpb24gT1dMX0RJQUxPR19TQ1JPTExfU1RSQVRFR1lfUFJPVklERVJfRkFDVE9SWShcbiAgICBvdmVybGF5OiBPdmVybGF5XG4pOiAoKSA9PiBTY3JvbGxTdHJhdGVneSB7XG4gICAgY29uc3QgZm4gPSAoKSA9PiBvdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKVxuICAgIHJldHVybiBmblxufVxuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGNvbnN0IE9XTF9ESUFMT0dfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSID0ge1xuICAgIHByb3ZpZGU6IE9XTF9ESUFMT0dfU0NST0xMX1NUUkFURUdZLFxuICAgIGRlcHM6IFtPdmVybGF5XSxcbiAgICB1c2VGYWN0b3J5OiBPV0xfRElBTE9HX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUl9GQUNUT1JZXG59XG5cbi8qKiBJXG4gKiBuamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZGVmYXVsdCBkaWFsb2cgb3B0aW9ucy5cbiAqICovXG5leHBvcnQgY29uc3QgT1dMX0RJQUxPR19ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48T3dsRGlhbG9nQ29uZmlnPihcbiAgICAnb3dsLWRpYWxvZy1kZWZhdWx0LW9wdGlvbnMnXG4pXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPd2xEaWFsb2dTZXJ2aWNlIHtcbiAgICBwcml2YXRlIGFyaWFIaWRkZW5FbGVtZW50cyA9IG5ldyBNYXA8RWxlbWVudCwgc3RyaW5nIHwgbnVsbD4oKVxuXG4gICAgcHJpdmF0ZSBfb3BlbkRpYWxvZ3NBdFRoaXNMZXZlbDogT3dsRGlhbG9nUmVmPGFueT5bXSA9IFtdXG4gICAgcHJpdmF0ZSBfYWZ0ZXJPcGVuQXRUaGlzTGV2ZWwgPSBuZXcgU3ViamVjdDxPd2xEaWFsb2dSZWY8YW55Pj4oKVxuICAgIHByaXZhdGUgX2FmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWwgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgICAvKiogS2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnRseS1vcGVuIGRpYWxvZ3MuICovXG4gICAgZ2V0IG9wZW5EaWFsb2dzKCk6IE93bERpYWxvZ1JlZjxhbnk+W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnREaWFsb2dcbiAgICAgICAgICAgID8gdGhpcy5wYXJlbnREaWFsb2cub3BlbkRpYWxvZ3NcbiAgICAgICAgICAgIDogdGhpcy5fb3BlbkRpYWxvZ3NBdFRoaXNMZXZlbFxuICAgIH1cblxuICAgIC8qKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGEgZGlhbG9nIGhhcyBiZWVuIG9wZW5lZC4gKi9cbiAgICBnZXQgYWZ0ZXJPcGVuKCk6IFN1YmplY3Q8T3dsRGlhbG9nUmVmPGFueT4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50RGlhbG9nXG4gICAgICAgICAgICA/IHRoaXMucGFyZW50RGlhbG9nLmFmdGVyT3BlblxuICAgICAgICAgICAgOiB0aGlzLl9hZnRlck9wZW5BdFRoaXNMZXZlbFxuICAgIH1cblxuICAgIGdldCBfYWZ0ZXJBbGxDbG9zZWQoKTogYW55IHtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnREaWFsb2dcbiAgICAgICAgcmV0dXJuIHBhcmVudFxuICAgICAgICAgICAgPyBwYXJlbnQuX2FmdGVyQWxsQ2xvc2VkXG4gICAgICAgICAgICA6IHRoaXMuX2FmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWxcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGFsbCBvcGVuIGRpYWxvZyBoYXZlIGZpbmlzaGVkIGNsb3NpbmcuXG4gICAgICogV2lsbCBlbWl0IG9uIHN1YnNjcmliZSBpZiB0aGVyZSBhcmUgbm8gb3BlbiBkaWFsb2dzIHRvIGJlZ2luIHdpdGguXG4gICAgICovXG5cbiAgICBhZnRlckFsbENsb3NlZDogT2JzZXJ2YWJsZTx7fT4gPSBkZWZlcihcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIHRoaXMuX29wZW5EaWFsb2dzQXRUaGlzTGV2ZWwubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9hZnRlckFsbENsb3NlZFxuICAgICAgICAgICAgICAgIDogdGhpcy5fYWZ0ZXJBbGxDbG9zZWQucGlwZShzdGFydFdpdGgodW5kZWZpbmVkKSlcbiAgICApXG5cbiAgICBwcml2YXRlIHNjcm9sbFN0cmF0ZWd5OiAoKSA9PiBTY3JvbGxTdHJhdGVneVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICBASW5qZWN0KE9XTF9ESUFMT0dfU0NST0xMX1NUUkFURUdZKSBzY3JvbGxTdHJhdGVneTogYW55LFxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBASW5qZWN0KE9XTF9ESUFMT0dfREVGQVVMVF9PUFRJT05TKVxuICAgICAgICBwcml2YXRlIGRlZmF1bHRPcHRpb25zOiBPd2xEaWFsb2dDb25maWcsXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBTa2lwU2VsZigpXG4gICAgICAgIHByaXZhdGUgcGFyZW50RGlhbG9nOiBPd2xEaWFsb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG92ZXJsYXlDb250YWluZXI6IE92ZXJsYXlDb250YWluZXJcbiAgICApIHtcbiAgICAgICAgdGhpcy5zY3JvbGxTdHJhdGVneSA9IHNjcm9sbFN0cmF0ZWd5XG4gICAgICAgIGlmICghcGFyZW50RGlhbG9nICYmIGxvY2F0aW9uKSB7XG4gICAgICAgICAgICBsb2NhdGlvbi5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZUFsbCgpKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9wZW48VD4oXG4gICAgICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbXBvbmVudFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxUPixcbiAgICAgICAgY29uZmlnPzogT3dsRGlhbG9nQ29uZmlnXG4gICAgKTogT3dsRGlhbG9nUmVmPGFueT4ge1xuICAgICAgICBjb25maWcgPSBhcHBseUNvbmZpZ0RlZmF1bHRzKGNvbmZpZywgdGhpcy5kZWZhdWx0T3B0aW9ucylcblxuICAgICAgICBpZiAoY29uZmlnLmlkICYmIHRoaXMuZ2V0RGlhbG9nQnlJZChjb25maWcuaWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBgRGlhbG9nIHdpdGggaWQgXCIke1xuICAgICAgICAgICAgICAgIGNvbmZpZy5pZFxuICAgICAgICAgICAgICAgIH1cIiBleGlzdHMgYWxyZWFkeS4gVGhlIGRpYWxvZyBpZCBtdXN0IGJlIHVuaXF1ZS5gXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5jcmVhdGVPdmVybGF5KGNvbmZpZylcbiAgICAgICAgY29uc3QgZGlhbG9nQ29udGFpbmVyID0gdGhpcy5hdHRhY2hEaWFsb2dDb250YWluZXIob3ZlcmxheVJlZiwgY29uZmlnKVxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmF0dGFjaERpYWxvZ0NvbnRlbnQ8VD4oXG4gICAgICAgICAgICBjb21wb25lbnRPclRlbXBsYXRlUmVmLFxuICAgICAgICAgICAgZGlhbG9nQ29udGFpbmVyLFxuICAgICAgICAgICAgb3ZlcmxheVJlZixcbiAgICAgICAgICAgIGNvbmZpZ1xuICAgICAgICApXG5cbiAgICAgICAgaWYgKCF0aGlzLm9wZW5EaWFsb2dzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5oaWRlTm9uRGlhbG9nQ29udGVudEZyb21Bc3Npc3RpdmVUZWNobm9sb2d5KClcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3BlbkRpYWxvZ3MucHVzaChkaWFsb2dSZWYpXG4gICAgICAgIGRpYWxvZ1JlZlxuICAgICAgICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZW1vdmVPcGVuRGlhbG9nKGRpYWxvZ1JlZikpXG4gICAgICAgIHRoaXMuYWZ0ZXJPcGVuLm5leHQoZGlhbG9nUmVmKVxuICAgICAgICByZXR1cm4gZGlhbG9nUmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIGFsbCBvZiB0aGUgY3VycmVudGx5LW9wZW4gZGlhbG9ncy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvc2VBbGwoKTogdm9pZCB7XG4gICAgICAgIGxldCBpID0gdGhpcy5vcGVuRGlhbG9ncy5sZW5ndGhcblxuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5EaWFsb2dzW2ldLmNsb3NlKClcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGFuIG9wZW4gZGlhbG9nIGJ5IGl0cyBpZC5cbiAgICAgKiBAcGFyYW0gaWQgSUQgdG8gdXNlIHdoZW4gbG9va2luZyB1cCB0aGUgZGlhbG9nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREaWFsb2dCeUlkKGlkOiBzdHJpbmcpOiBPd2xEaWFsb2dSZWY8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5EaWFsb2dzLmZpbmQoZGlhbG9nID0+IGRpYWxvZy5pZCA9PT0gaWQpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhdHRhY2hEaWFsb2dDb250ZW50PFQ+KFxuICAgICAgICBjb21wb25lbnRPclRlbXBsYXRlUmVmOiBDb21wb25lbnRUeXBlPFQ+IHwgVGVtcGxhdGVSZWY8VD4sXG4gICAgICAgIGRpYWxvZ0NvbnRhaW5lcjogT3dsRGlhbG9nQ29udGFpbmVyQ29tcG9uZW50LFxuICAgICAgICBvdmVybGF5UmVmOiBPdmVybGF5UmVmLFxuICAgICAgICBjb25maWc6IE93bERpYWxvZ0NvbmZpZ1xuICAgICkge1xuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSBuZXcgT3dsRGlhbG9nUmVmPFQ+KFxuICAgICAgICAgICAgb3ZlcmxheVJlZixcbiAgICAgICAgICAgIGRpYWxvZ0NvbnRhaW5lcixcbiAgICAgICAgICAgIGNvbmZpZy5pZCxcbiAgICAgICAgICAgIHRoaXMubG9jYXRpb25cbiAgICAgICAgKVxuXG4gICAgICAgIGlmIChjb25maWcuaGFzQmFja2Ryb3ApIHtcbiAgICAgICAgICAgIG92ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFkaWFsb2dSZWYuZGlzYWJsZUNsb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21wb25lbnRPclRlbXBsYXRlUmVmIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5jcmVhdGVJbmplY3RvcjxUPihcbiAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgZGlhbG9nUmVmLFxuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbnRhaW5lclxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3QgY29udGVudFJlZiA9IGRpYWxvZ0NvbnRhaW5lci5hdHRhY2hDb21wb25lbnRQb3J0YWwoXG4gICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudFBvcnRhbChjb21wb25lbnRPclRlbXBsYXRlUmVmLCB1bmRlZmluZWQsIGluamVjdG9yKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlID0gY29udGVudFJlZi5pbnN0YW5jZVxuICAgICAgICB9XG5cbiAgICAgICAgZGlhbG9nUmVmXG4gICAgICAgICAgICAudXBkYXRlU2l6ZShjb25maWcud2lkdGgsIGNvbmZpZy5oZWlnaHQpXG4gICAgICAgICAgICAudXBkYXRlUG9zaXRpb24oY29uZmlnLnBvc2l0aW9uKVxuXG4gICAgICAgIHJldHVybiBkaWFsb2dSZWZcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUluamVjdG9yPFQ+KFxuICAgICAgICBjb25maWc6IE93bERpYWxvZ0NvbmZpZyxcbiAgICAgICAgZGlhbG9nUmVmOiBPd2xEaWFsb2dSZWY8VD4sXG4gICAgICAgIGRpYWxvZ0NvbnRhaW5lcjogT3dsRGlhbG9nQ29udGFpbmVyQ29tcG9uZW50XG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHVzZXJJbmplY3RvciA9XG4gICAgICAgICAgICBjb25maWcgJiZcbiAgICAgICAgICAgIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmICYmXG4gICAgICAgICAgICBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvclxuICAgICAgICBjb25zdCBpbmplY3Rpb25Ub2tlbnMgPSBuZXcgV2Vha01hcCgpXG5cbiAgICAgICAgaW5qZWN0aW9uVG9rZW5zLnNldChPd2xEaWFsb2dSZWYsIGRpYWxvZ1JlZilcbiAgICAgICAgaW5qZWN0aW9uVG9rZW5zLnNldChPd2xEaWFsb2dDb250YWluZXJDb21wb25lbnQsIGRpYWxvZ0NvbnRhaW5lcilcbiAgICAgICAgaW5qZWN0aW9uVG9rZW5zLnNldChPV0xfRElBTE9HX0RBVEEsIGNvbmZpZy5kYXRhKVxuXG4gICAgICAgIHJldHVybiBuZXcgUG9ydGFsSW5qZWN0b3IoXG4gICAgICAgICAgICB1c2VySW5qZWN0b3IgfHwgdGhpcy5pbmplY3RvcixcbiAgICAgICAgICAgIGluamVjdGlvblRva2Vuc1xuICAgICAgICApXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KGNvbmZpZzogT3dsRGlhbG9nQ29uZmlnKTogT3ZlcmxheVJlZiB7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSB0aGlzLmdldE92ZXJsYXlDb25maWcoY29uZmlnKVxuICAgICAgICByZXR1cm4gdGhpcy5vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKVxuICAgIH1cblxuICAgIHByaXZhdGUgYXR0YWNoRGlhbG9nQ29udGFpbmVyKFxuICAgICAgICBvdmVybGF5UmVmOiBPdmVybGF5UmVmLFxuICAgICAgICBjb25maWc6IE93bERpYWxvZ0NvbmZpZ1xuICAgICk6IE93bERpYWxvZ0NvbnRhaW5lckNvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoXG4gICAgICAgICAgICBPd2xEaWFsb2dDb250YWluZXJDb21wb25lbnQsXG4gICAgICAgICAgICBjb25maWcudmlld0NvbnRhaW5lclJlZlxuICAgICAgICApXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZjogQ29tcG9uZW50UmVmPFxuICAgICAgICAgICAgT3dsRGlhbG9nQ29udGFpbmVyQ29tcG9uZW50XG4gICAgICAgID4gPSBvdmVybGF5UmVmLmF0dGFjaChjb250YWluZXJQb3J0YWwpXG4gICAgICAgIGNvbnRhaW5lclJlZi5pbnN0YW5jZS5zZXRDb25maWcoY29uZmlnKVxuXG4gICAgICAgIHJldHVybiBjb250YWluZXJSZWYuaW5zdGFuY2VcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE92ZXJsYXlDb25maWcoZGlhbG9nQ29uZmlnOiBPd2xEaWFsb2dDb25maWcpOiBPdmVybGF5Q29uZmlnIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKSxcbiAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OlxuICAgICAgICAgICAgICAgIGRpYWxvZ0NvbmZpZy5zY3JvbGxTdHJhdGVneSB8fCB0aGlzLnNjcm9sbFN0cmF0ZWd5KCksXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBkaWFsb2dDb25maWcucGFuZUNsYXNzLFxuICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGRpYWxvZ0NvbmZpZy5oYXNCYWNrZHJvcCxcbiAgICAgICAgICAgIG1pbldpZHRoOiBkaWFsb2dDb25maWcubWluV2lkdGgsXG4gICAgICAgICAgICBtaW5IZWlnaHQ6IGRpYWxvZ0NvbmZpZy5taW5IZWlnaHQsXG4gICAgICAgICAgICBtYXhXaWR0aDogZGlhbG9nQ29uZmlnLm1heFdpZHRoLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiBkaWFsb2dDb25maWcubWF4SGVpZ2h0XG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKGRpYWxvZ0NvbmZpZy5iYWNrZHJvcENsYXNzKSB7XG4gICAgICAgICAgICBzdGF0ZS5iYWNrZHJvcENsYXNzID0gZGlhbG9nQ29uZmlnLmJhY2tkcm9wQ2xhc3NcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdGF0ZVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlT3BlbkRpYWxvZyhkaWFsb2dSZWY6IE93bERpYWxvZ1JlZjxhbnk+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fb3BlbkRpYWxvZ3NBdFRoaXNMZXZlbC5pbmRleE9mKGRpYWxvZ1JlZilcblxuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuRGlhbG9ncy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgICAvLyBJZiBhbGwgdGhlIGRpYWxvZ3Mgd2VyZSBjbG9zZWQsIHJlbW92ZS9yZXN0b3JlIHRoZSBgYXJpYS1oaWRkZW5gXG4gICAgICAgICAgICAvLyB0byBhIHRoZSBzaWJsaW5ncyBhbmQgZW1pdCB0byB0aGUgYGFmdGVyQWxsQ2xvc2VkYCBzdHJlYW0uXG4gICAgICAgICAgICBpZiAoIXRoaXMub3BlbkRpYWxvZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmlhSGlkZGVuRWxlbWVudHMuZm9yRWFjaCgocHJldmlvdXNWYWx1ZSwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgcHJldmlvdXNWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgdGhpcy5hcmlhSGlkZGVuRWxlbWVudHMuY2xlYXIoKVxuICAgICAgICAgICAgICAgIHRoaXMuX2FmdGVyQWxsQ2xvc2VkLm5leHQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGlkZXMgYWxsIG9mIHRoZSBjb250ZW50IHRoYXQgaXNuJ3QgYW4gb3ZlcmxheSBmcm9tIGFzc2lzdGl2ZSB0ZWNobm9sb2d5LlxuICAgICAqL1xuICAgIHByaXZhdGUgaGlkZU5vbkRpYWxvZ0NvbnRlbnRGcm9tQXNzaXN0aXZlVGVjaG5vbG9neSgpIHtcbiAgICAgICAgY29uc3Qgb3ZlcmxheUNvbnRhaW5lciA9IHRoaXMub3ZlcmxheUNvbnRhaW5lci5nZXRDb250YWluZXJFbGVtZW50KClcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3ZlcmxheSBjb250YWluZXIgaXMgYXR0YWNoZWQgdG8gdGhlIERPTS5cbiAgICAgICAgaWYgKG92ZXJsYXlDb250YWluZXIucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBvdmVybGF5Q29udGFpbmVyLnBhcmVudEVsZW1lbnQuY2hpbGRyZW5cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2libGluZyA9IHNpYmxpbmdzW2ldXG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmcgIT09IG92ZXJsYXlDb250YWluZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgc2libGluZy5ub2RlTmFtZSAhPT0gJ1NDUklQVCcgJiZcbiAgICAgICAgICAgICAgICAgICAgc2libGluZy5ub2RlTmFtZSAhPT0gJ1NUWUxFJyAmJlxuICAgICAgICAgICAgICAgICAgICAhc2libGluZy5oYXNBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXJpYUhpZGRlbkVsZW1lbnRzLnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nLmdldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHNpYmxpbmcuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBkZWZhdWx0IG9wdGlvbnMgdG8gdGhlIGRpYWxvZyBjb25maWcuXG4gKiBAcGFyYW0gY29uZmlnIENvbmZpZyB0byBiZSBtb2RpZmllZC5cbiAqIEBwYXJhbSBkZWZhdWx0T3B0aW9ucyBEZWZhdWx0IGNvbmZpZyBzZXR0aW5nXG4gKiBAcmV0dXJucyBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBhcHBseUNvbmZpZ0RlZmF1bHRzKFxuICAgIGNvbmZpZz86IE93bERpYWxvZ0NvbmZpZyxcbiAgICBkZWZhdWx0T3B0aW9ucz86IE93bERpYWxvZ0NvbmZpZ1xuKTogT3dsRGlhbG9nQ29uZmlnIHtcbiAgICByZXR1cm4gZXh0ZW5kT2JqZWN0KG5ldyBPd2xEaWFsb2dDb25maWcoKSwgY29uZmlnLCBkZWZhdWx0T3B0aW9ucylcbn1cbiJdfQ==