turbogui-angular 7.0.0 → 8.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 (150) hide show
  1. package/esm2020/main/controller/browser.service.mjs +48 -0
  2. package/esm2020/main/controller/dialog.service.mjs +324 -0
  3. package/esm2020/main/controller/globalerror.service.mjs +68 -0
  4. package/esm2020/main/controller/http.service.mjs +70 -0
  5. package/esm2020/main/controller/localization.service.mjs +22 -0
  6. package/esm2020/main/controller/notification.service.mjs +56 -0
  7. package/esm2020/main/controller/user.service.mjs +124 -0
  8. package/esm2020/main/controller/views.service.mjs +113 -0
  9. package/esm2020/main/model/modules/turbogui-angular.module.mjs +142 -0
  10. package/esm2020/main/view/animations/fade.animation.mjs +35 -0
  11. package/esm2020/main/view/components/busy-state-base/busy-state-base.component.mjs +38 -0
  12. package/esm2020/main/view/components/button-base/button-base.component.mjs +180 -0
  13. package/esm2020/main/view/components/button-container/button-container.component.mjs +34 -0
  14. package/esm2020/main/view/components/button-image/button-image.component.mjs +47 -0
  15. package/esm2020/main/view/components/dialog-error/dialog-error.component.mjs +41 -0
  16. package/esm2020/main/view/components/dialog-multiple-option/dialog-multiple-option.component.mjs +38 -0
  17. package/esm2020/main/view/components/dialog-single-option/dialog-single-option.component.mjs +41 -0
  18. package/esm2020/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.mjs +112 -0
  19. package/esm2020/main/view/components/dialog-two-option/dialog-two-option.component.mjs +42 -0
  20. package/{esm2015/main/view/components/views-container/views-container.component.js → esm2020/main/view/components/views-container/views-container.component.mjs} +15 -13
  21. package/esm2020/main/view/directives/AutoFocusOnDisplayDirective.mjs +39 -0
  22. package/esm2020/main/view/directives/AutoSelectTextOnFocusDirective.mjs +39 -0
  23. package/esm2020/main/view/directives/ElementCreatedDirective.mjs +42 -0
  24. package/esm2020/main/view/directives/ElementDestroyedDirective.mjs +42 -0
  25. package/{esm2015/public_api.js → esm2020/public_api.mjs} +1 -1
  26. package/esm2020/turbogui-angular.mjs +5 -0
  27. package/fesm2015/turbogui-angular.mjs +1953 -0
  28. package/fesm2015/turbogui-angular.mjs.map +1 -0
  29. package/{fesm2015/turbogui-angular.js → fesm2020/turbogui-angular.mjs} +368 -298
  30. package/fesm2020/turbogui-angular.mjs.map +1 -0
  31. package/main/controller/browser.service.d.ts +3 -8
  32. package/main/controller/browser.service.d.ts.map +1 -1
  33. package/main/controller/dialog.service.d.ts +3 -8
  34. package/main/controller/dialog.service.d.ts.map +1 -1
  35. package/main/controller/globalerror.service.d.ts +3 -0
  36. package/main/controller/globalerror.service.d.ts.map +1 -1
  37. package/main/controller/http.service.d.ts +3 -8
  38. package/main/controller/http.service.d.ts.map +1 -1
  39. package/main/controller/localization.service.d.ts +3 -8
  40. package/main/controller/localization.service.d.ts.map +1 -1
  41. package/main/controller/notification.service.d.ts +3 -8
  42. package/main/controller/notification.service.d.ts.map +1 -1
  43. package/main/controller/user.service.d.ts +3 -8
  44. package/main/controller/user.service.d.ts.map +1 -1
  45. package/main/controller/views.service.d.ts +3 -0
  46. package/main/controller/views.service.d.ts.map +1 -1
  47. package/main/model/modules/turbogui-angular.module.d.ts +23 -8
  48. package/main/model/modules/turbogui-angular.module.d.ts.map +1 -1
  49. package/main/view/animations/fade.animation.d.ts +3 -8
  50. package/main/view/animations/fade.animation.d.ts.map +1 -1
  51. package/main/view/components/busy-state-base/busy-state-base.component.d.ts +3 -8
  52. package/main/view/components/busy-state-base/busy-state-base.component.d.ts.map +1 -1
  53. package/main/view/components/button-base/button-base.component.d.ts +3 -0
  54. package/main/view/components/button-base/button-base.component.d.ts.map +1 -1
  55. package/main/view/components/button-container/button-container.component.d.ts +3 -8
  56. package/main/view/components/button-container/button-container.component.d.ts.map +1 -1
  57. package/main/view/components/button-image/button-image.component.d.ts +3 -0
  58. package/main/view/components/button-image/button-image.component.d.ts.map +1 -1
  59. package/main/view/components/dialog-error/dialog-error.component.d.ts +3 -8
  60. package/main/view/components/dialog-error/dialog-error.component.d.ts.map +1 -1
  61. package/main/view/components/dialog-multiple-option/dialog-multiple-option.component.d.ts +3 -8
  62. package/main/view/components/dialog-multiple-option/dialog-multiple-option.component.d.ts.map +1 -1
  63. package/main/view/components/dialog-single-option/dialog-single-option.component.d.ts +3 -8
  64. package/main/view/components/dialog-single-option/dialog-single-option.component.d.ts.map +1 -1
  65. package/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.d.ts +3 -8
  66. package/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.d.ts.map +1 -1
  67. package/main/view/components/dialog-two-option/dialog-two-option.component.d.ts +3 -8
  68. package/main/view/components/dialog-two-option/dialog-two-option.component.d.ts.map +1 -1
  69. package/main/view/components/views-container/views-container.component.d.ts +3 -0
  70. package/main/view/components/views-container/views-container.component.d.ts.map +1 -1
  71. package/main/view/directives/AutoFocusOnDisplayDirective.d.ts +3 -0
  72. package/main/view/directives/AutoFocusOnDisplayDirective.d.ts.map +1 -1
  73. package/main/view/directives/AutoSelectTextOnFocusDirective.d.ts +3 -0
  74. package/main/view/directives/AutoSelectTextOnFocusDirective.d.ts.map +1 -1
  75. package/main/view/directives/ElementCreatedDirective.d.ts +3 -0
  76. package/main/view/directives/ElementCreatedDirective.d.ts.map +1 -1
  77. package/main/view/directives/ElementDestroyedDirective.d.ts +3 -0
  78. package/main/view/directives/ElementDestroyedDirective.d.ts.map +1 -1
  79. package/package.json +24 -12
  80. package/turbogui-angular.d.ts +1 -2
  81. package/turbogui-angular.d.ts.map +1 -1
  82. package/bundles/turbogui-angular.umd.js +0 -2431
  83. package/bundles/turbogui-angular.umd.js.map +0 -1
  84. package/esm2015/main/controller/browser.service.js +0 -48
  85. package/esm2015/main/controller/dialog.service.js +0 -329
  86. package/esm2015/main/controller/globalerror.service.js +0 -65
  87. package/esm2015/main/controller/http.service.js +0 -70
  88. package/esm2015/main/controller/localization.service.js +0 -19
  89. package/esm2015/main/controller/notification.service.js +0 -53
  90. package/esm2015/main/controller/user.service.js +0 -125
  91. package/esm2015/main/controller/views.service.js +0 -113
  92. package/esm2015/main/model/modules/turbogui-angular.module.js +0 -93
  93. package/esm2015/main/view/animations/fade.animation.js +0 -32
  94. package/esm2015/main/view/components/busy-state-base/busy-state-base.component.js +0 -39
  95. package/esm2015/main/view/components/button-base/button-base.component.js +0 -149
  96. package/esm2015/main/view/components/button-container/button-container.component.js +0 -35
  97. package/esm2015/main/view/components/button-image/button-image.component.js +0 -46
  98. package/esm2015/main/view/components/dialog-error/dialog-error.component.js +0 -39
  99. package/esm2015/main/view/components/dialog-multiple-option/dialog-multiple-option.component.js +0 -36
  100. package/esm2015/main/view/components/dialog-single-option/dialog-single-option.component.js +0 -39
  101. package/esm2015/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.js +0 -108
  102. package/esm2015/main/view/components/dialog-two-option/dialog-two-option.component.js +0 -40
  103. package/esm2015/main/view/directives/AutoFocusOnDisplayDirective.js +0 -40
  104. package/esm2015/main/view/directives/AutoSelectTextOnFocusDirective.js +0 -39
  105. package/esm2015/main/view/directives/ElementCreatedDirective.js +0 -38
  106. package/esm2015/main/view/directives/ElementDestroyedDirective.js +0 -38
  107. package/esm2015/turbogui-angular.js +0 -7
  108. package/fesm2015/turbogui-angular.js.map +0 -1
  109. package/main/controller/browser.service.ngfactory.d.ts.map +0 -1
  110. package/main/controller/dialog.service.ngfactory.d.ts.map +0 -1
  111. package/main/controller/globalerror.service.ngfactory.d.ts.map +0 -1
  112. package/main/controller/http.service.ngfactory.d.ts.map +0 -1
  113. package/main/controller/localization.service.ngfactory.d.ts.map +0 -1
  114. package/main/controller/notification.service.ngfactory.d.ts.map +0 -1
  115. package/main/controller/user.service.ngfactory.d.ts.map +0 -1
  116. package/main/controller/views.service.ngfactory.d.ts.map +0 -1
  117. package/main/model/modules/turbogui-angular.module.ngfactory.d.ts.map +0 -1
  118. package/main/view/animations/fade.animation.ngfactory.d.ts.map +0 -1
  119. package/main/view/components/busy-state-base/busy-state-base.component.ngfactory.d.ts.map +0 -1
  120. package/main/view/components/busy-state-base/busy-state-base.component.scss.shim.ngstyle.d.ts.map +0 -1
  121. package/main/view/components/button-container/button-container.component.ngfactory.d.ts.map +0 -1
  122. package/main/view/components/button-container/button-container.component.scss.shim.ngstyle.d.ts.map +0 -1
  123. package/main/view/components/button-image/button-image.component.ngfactory.d.ts.map +0 -1
  124. package/main/view/components/button-image/button-image.component.scss.shim.ngstyle.d.ts.map +0 -1
  125. package/main/view/components/dialog-error/dialog-error.component.ngfactory.d.ts.map +0 -1
  126. package/main/view/components/dialog-error/dialog-error.component.scss.shim.ngstyle.d.ts.map +0 -1
  127. package/main/view/components/dialog-multiple-option/dialog-multiple-option.component.ngfactory.d.ts.map +0 -1
  128. package/main/view/components/dialog-multiple-option/dialog-multiple-option.component.scss.shim.ngstyle.d.ts.map +0 -1
  129. package/main/view/components/dialog-single-option/dialog-single-option.component.ngfactory.d.ts.map +0 -1
  130. package/main/view/components/dialog-single-option/dialog-single-option.component.scss.shim.ngstyle.d.ts.map +0 -1
  131. package/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.ngfactory.d.ts.map +0 -1
  132. package/main/view/components/dialog-single-selection-list/dialog-single-selection-list.component.scss.shim.ngstyle.d.ts.map +0 -1
  133. package/main/view/components/dialog-two-option/dialog-two-option.component.ngfactory.d.ts.map +0 -1
  134. package/main/view/components/dialog-two-option/dialog-two-option.component.scss.shim.ngstyle.d.ts.map +0 -1
  135. package/main/view/components/views-container/views-container.component.ngfactory.d.ts.map +0 -1
  136. package/main/view/components/views-container/views-container.component.scss.shim.ngstyle.d.ts.map +0 -1
  137. package/main/view/directives/AutoFocusOnDisplayDirective.ngfactory.d.ts.map +0 -1
  138. package/main/view/directives/AutoSelectTextOnFocusDirective.ngfactory.d.ts.map +0 -1
  139. package/main/view/directives/ElementCreatedDirective.ngfactory.d.ts.map +0 -1
  140. package/main/view/directives/ElementDestroyedDirective.ngfactory.d.ts.map +0 -1
  141. package/turbogui-angular.metadata.json +0 -1
  142. /package/{esm2015/main/controller/httpservice/HTTPServiceGetRequest.js → esm2020/main/controller/httpservice/HTTPServiceGetRequest.mjs} +0 -0
  143. /package/{esm2015/main/controller/httpservice/HTTPServicePostRequest.js → esm2020/main/controller/httpservice/HTTPServicePostRequest.mjs} +0 -0
  144. /package/{esm2015/main/managers/DelayedMethodCallManager.js → esm2020/main/managers/DelayedMethodCallManager.mjs} +0 -0
  145. /package/{esm2015/main/model/classes/GUINotification.js → esm2020/main/model/classes/GUINotification.mjs} +0 -0
  146. /package/{esm2015/main/model/classes/View.js → esm2020/main/model/classes/View.mjs} +0 -0
  147. /package/{esm2015/main/model/classes/ViewModel.js → esm2020/main/model/classes/ViewModel.mjs} +0 -0
  148. /package/{esm2015/main/model/classes/ViewService.js → esm2020/main/model/classes/ViewService.mjs} +0 -0
  149. /package/{esm2015/main/view/components/dialog-base/dialog-base.component.js → esm2020/main/view/components/dialog-base/dialog-base.component.mjs} +0 -0
  150. /package/{esm2015/main/view/components/dialog-options-base/dialog-options-base.component.js → esm2020/main/view/components/dialog-options-base/dialog-options-base.component.mjs} +0 -0
@@ -0,0 +1,48 @@
1
+ /**
2
+ * TurboGUI is A library that helps with the most common and generic UI elements and functionalities
3
+ *
4
+ * Website : -> http://www.turbogui.org
5
+ * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
6
+ * License Url : -> http://www.apache.org/licenses/LICENSE-2.0
7
+ * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
8
+ */
9
+ import { Injectable } from '@angular/core';
10
+ import { BrowserManager } from 'turbocommons-ts';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ /**
14
+ * An abstraction of the browser entity an all its related operations and properties
15
+ */
16
+ export class BrowserService extends BrowserManager {
17
+ constructor(location) {
18
+ super();
19
+ this.location = location;
20
+ }
21
+ /**
22
+ * Modify the current browser URI without reloading the current page document
23
+ *
24
+ * @param path The uri value we want to set
25
+ * @param query The query url parameters part we want to specify if any
26
+ *
27
+ * @returns void
28
+ */
29
+ setURI(path, query) {
30
+ this.location.go(path, query);
31
+ }
32
+ /**
33
+ * Obtain a subscription to get notified on any changes at the browser url
34
+ *
35
+ * @param onNext A method to be executed every time the url changes on the browser. The url will be available inside the value parameter
36
+ *
37
+ * @returns Subscribed events. Make sure to unsubscribe when not needed
38
+ */
39
+ subscribeToUrlChange(onNext) {
40
+ return this.location.subscribe(onNext);
41
+ }
42
+ }
43
+ BrowserService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: BrowserService, deps: [{ token: i1.Location }], target: i0.ɵɵFactoryTarget.Injectable });
44
+ BrowserService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: BrowserService });
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: BrowserService, decorators: [{
46
+ type: Injectable
47
+ }], ctorParameters: function () { return [{ type: i1.Location }]; } });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9jb250cm9sbGVyL2Jyb3dzZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQUlqRDs7R0FFRztBQUVILE1BQU0sT0FBTyxjQUFlLFNBQVEsY0FBYztJQUc5QyxZQUE2QixRQUFrQjtRQUUzQyxLQUFLLEVBQUUsQ0FBQztRQUZpQixhQUFRLEdBQVIsUUFBUSxDQUFVO0lBRy9DLENBQUM7SUFHRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLElBQVksRUFBRSxLQUEwQjtRQUUzQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUdEOzs7Ozs7T0FNRztJQUNILG9CQUFvQixDQUFDLE1BQXNDO1FBRXZELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7MkdBakNRLGNBQWM7K0dBQWQsY0FBYzsyRkFBZCxjQUFjO2tCQUQxQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFR1cmJvR1VJIGlzIEEgbGlicmFyeSB0aGF0IGhlbHBzIHdpdGggdGhlIG1vc3QgY29tbW9uIGFuZCBnZW5lcmljIFVJIGVsZW1lbnRzIGFuZCBmdW5jdGlvbmFsaXRpZXNcclxuICpcclxuICogV2Vic2l0ZSA6IC0+IGh0dHA6Ly93d3cudHVyYm9ndWkub3JnXHJcbiAqIExpY2Vuc2UgOiAtPiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIExpY2Vuc2UgVXJsIDogLT4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqIENvcHlSaWdodCA6IC0+IENvcHlyaWdodCAyMDE4IEVkZXJ0b25lIEFkdmFuZGVkIFNvbHV0aW9ucy4gaHR0cHM6Ly93d3cuZWRlcnRvbmUuY29tXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCcm93c2VyTWFuYWdlciB9IGZyb20gJ3R1cmJvY29tbW9ucy10cyc7XHJcbmltcG9ydCB7IExvY2F0aW9uLCBQb3BTdGF0ZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcblxyXG4vKipcclxuICogQW4gYWJzdHJhY3Rpb24gb2YgdGhlIGJyb3dzZXIgZW50aXR5IGFuIGFsbCBpdHMgcmVsYXRlZCBvcGVyYXRpb25zIGFuZCBwcm9wZXJ0aWVzXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBCcm93c2VyU2VydmljZSBleHRlbmRzIEJyb3dzZXJNYW5hZ2VyIHtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBsb2NhdGlvbjogTG9jYXRpb24pIHtcclxuXHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb2RpZnkgdGhlIGN1cnJlbnQgYnJvd3NlciBVUkkgd2l0aG91dCByZWxvYWRpbmcgdGhlIGN1cnJlbnQgcGFnZSBkb2N1bWVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwYXRoIFRoZSB1cmkgdmFsdWUgd2Ugd2FudCB0byBzZXRcclxuICAgICAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdXJsIHBhcmFtZXRlcnMgcGFydCB3ZSB3YW50IHRvIHNwZWNpZnkgaWYgYW55XHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgdm9pZFxyXG4gICAgICovXHJcbiAgICBzZXRVUkkocGF0aDogc3RyaW5nLCBxdWVyeT86IHN0cmluZyB8IHVuZGVmaW5lZCl7XHJcblxyXG4gICAgICAgIHRoaXMubG9jYXRpb24uZ28ocGF0aCwgcXVlcnkpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogT2J0YWluIGEgc3Vic2NyaXB0aW9uIHRvIGdldCBub3RpZmllZCBvbiBhbnkgY2hhbmdlcyBhdCB0aGUgYnJvd3NlciB1cmxcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gb25OZXh0IEEgbWV0aG9kIHRvIGJlIGV4ZWN1dGVkIGV2ZXJ5IHRpbWUgdGhlIHVybCBjaGFuZ2VzIG9uIHRoZSBicm93c2VyLiBUaGUgdXJsIHdpbGwgYmUgYXZhaWxhYmxlIGluc2lkZSB0aGUgdmFsdWUgcGFyYW1ldGVyXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgU3Vic2NyaWJlZCBldmVudHMuIE1ha2Ugc3VyZSB0byB1bnN1YnNjcmliZSB3aGVuIG5vdCBuZWVkZWRcclxuICAgICAqL1xyXG4gICAgc3Vic2NyaWJlVG9VcmxDaGFuZ2Uob25OZXh0OiAodmFsdWU6IFBvcFN0YXRlRXZlbnQpID0+IHZvaWQpe1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnN1YnNjcmliZShvbk5leHQpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,324 @@
1
+ /**
2
+ * TurboGUI is A library that helps with the most common and generic UI elements and functionalities
3
+ *
4
+ * Website : -> http://www.turbogui.org
5
+ * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
6
+ * License Url : -> http://www.apache.org/licenses/LICENSE-2.0
7
+ * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
8
+ */
9
+ import { ArrayUtils, NumericUtils } from 'turbocommons-ts';
10
+ import { Injectable } from '@angular/core';
11
+ import { BusyStateBaseComponent } from '../view/components/busy-state-base/busy-state-base.component';
12
+ import { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/material/snack-bar";
15
+ import * as i2 from "@angular/material/dialog";
16
+ /**
17
+ * Manages the application modal and non modal floating elements
18
+ */
19
+ export class DialogService {
20
+ constructor(rendererFactory, matSnackBar, matDialog, injector, applicationRef, componentFactoryResolver) {
21
+ this.matSnackBar = matSnackBar;
22
+ this.matDialog = matDialog;
23
+ this.injector = injector;
24
+ this.applicationRef = applicationRef;
25
+ this.componentFactoryResolver = componentFactoryResolver;
26
+ /**
27
+ * Used to modify the busy state component that is shown by default by the addModalBusyState() method.
28
+ *
29
+ * @see this.addModalBusyState()
30
+ */
31
+ this.customBusyStateComponentClass = BusyStateBaseComponent;
32
+ /**
33
+ * Check public getter for docs
34
+ */
35
+ this._isEnabled = true;
36
+ /**
37
+ * Tells if the main application is currently showing a busy state that blocks all user interaction
38
+ */
39
+ this._isShowingBusyState = false;
40
+ /**
41
+ * A reference to the modal busy state component that is initialized only the first time it is called.
42
+ *
43
+ * (To append the busy state dynamically, we use the Portal concept from the angular material library)
44
+ */
45
+ this._componentPortal = null;
46
+ /**
47
+ * A reference to the modal busy state container where the component will be added
48
+ */
49
+ this._modalBusyStateHost = null;
50
+ /**
51
+ * Tells if the manager is currently showing a snackbar element or not
52
+ */
53
+ this._isShowingSnackBar = false;
54
+ /**
55
+ * Contains a list of the dialogs that are currently visible to the user.
56
+ * Each item in this list is a hash that is computed when dialog is created to uniquely identify it.
57
+ *
58
+ * Empty list means no dialogs are currently visible
59
+ */
60
+ this._activeDialogs = [];
61
+ /**
62
+ * Contains a list with all the MatDialog instances that are currently visible to the user.
63
+ * The list uses the same order as the list of _activeDialogs hash values
64
+ */
65
+ this._activeDialogInstances = [];
66
+ /**
67
+ * Method that is used to delete the window beforeunload event listener once not used anymore
68
+ */
69
+ this._windowBeforeUnloadUnListen = null;
70
+ /**
71
+ * Method that is used to delete the document keydown event listener once not used anymore
72
+ */
73
+ this._documentKeydownUnlisten = null;
74
+ /**
75
+ * Method that is used to delete the document mousedown event listener once not used anymore
76
+ */
77
+ this._documentMousedownUnlisten = null;
78
+ /**
79
+ * Method that is used to delete the document pointerdown event listener once not used anymore
80
+ */
81
+ this._documentPointerdownUnlisten = null;
82
+ this._renderer = rendererFactory.createRenderer(null, null);
83
+ }
84
+ /**
85
+ * Tells if this dialog service is enabled or not. If dialog service is disabled, none of it's features will work
86
+ * This is used to block all dialog features normally when shutting down the application
87
+ *
88
+ * Use with caution. When this is set to false, dialog service stops working.
89
+ */
90
+ set isEnabled(v) {
91
+ if (v === this._isEnabled) {
92
+ return;
93
+ }
94
+ this._isEnabled = v;
95
+ }
96
+ /**
97
+ * Enables a warning that will be shown to the user when he/she tries to close the application.
98
+ * This warning will prompt the user to continue with the exit process or cancel it.
99
+ * The specific texts of this message are a generic ones and cannot be changed.
100
+ *
101
+ * IMPORTANT: This method must be called after the main application has been initialized in order to work,
102
+ * otherwise it will do nothing.
103
+ */
104
+ addCloseApplicationWarning() {
105
+ if (this._windowBeforeUnloadUnListen === null) {
106
+ this._windowBeforeUnloadUnListen = this._renderer.listen('window', 'beforeunload', (event) => event.returnValue = true);
107
+ }
108
+ }
109
+ /**
110
+ * Remove the close application warning message if previously assigned
111
+ */
112
+ removeCloseApplicationWarning() {
113
+ if (this._windowBeforeUnloadUnListen !== null) {
114
+ this._windowBeforeUnloadUnListen();
115
+ this._windowBeforeUnloadUnListen = null;
116
+ }
117
+ }
118
+ /**
119
+ * Change the application visual appearance so the user perceives that the application is
120
+ * currently busy. While modal busy state is enabled, no user input is possible neither via
121
+ * keyboard, mouse or touch. Use this state when performing server requests or operations that
122
+ * must block the user interaction with the application.
123
+ *
124
+ * Note: We can modify the busy state component that is shown by this method. To do it, we must
125
+ * set this.customBusyStateComponentClass property with our own custom busy state component class. (We can do it at
126
+ * our main application component constructor for example). Our custom component must extend the
127
+ * BusyStateBaseComponent one to add its own visual appearance.
128
+ *
129
+ * @see this.customBusyStateComponentClass
130
+ */
131
+ addModalBusyState() {
132
+ if (!this._isEnabled || this._isShowingBusyState) {
133
+ return;
134
+ }
135
+ this._disableUserInteraction();
136
+ // Dynamically create the busy state component reference if this is the first time
137
+ if (this._componentPortal === null) {
138
+ this._componentPortal = new ComponentPortal(this.customBusyStateComponentClass);
139
+ // Create a PortalHost with document.body as its anchor element
140
+ this._modalBusyStateHost = new DomPortalOutlet(document.body, this.componentFactoryResolver, this.applicationRef, this.injector);
141
+ }
142
+ this._modalBusyStateHost.attach(this._componentPortal);
143
+ this._isShowingBusyState = true;
144
+ }
145
+ /**
146
+ * Tells if the application is currently locked in a modal busy state (caused by an addModalBusyState() call)
147
+ */
148
+ get isShowingBusyState() {
149
+ return this._isShowingBusyState;
150
+ }
151
+ /**
152
+ * Remove the application busy state and restore it back to normal user interaction
153
+ */
154
+ removeModalBusyState() {
155
+ if (!this._isEnabled || !this._isShowingBusyState) {
156
+ return;
157
+ }
158
+ if (this._componentPortal !== null) {
159
+ this._modalBusyStateHost.detach();
160
+ }
161
+ this._enableUserInteraction();
162
+ this._isShowingBusyState = false;
163
+ }
164
+ /**
165
+ * TODO - adapt from TS version
166
+ */
167
+ addToolTip() {
168
+ // TODO - adapt from TS version
169
+ }
170
+ /**
171
+ * Show a non modal snackbar notification to the user (Only one snack-bar can ever be opened at the same time).
172
+ *
173
+ * Snackbars inform users of a process that an app has performed or will perform. They appear temporarily, towards the bottom or top of the screen.
174
+ * They shouldn’t interrupt the user experience, and they don’t require user input to disappear.
175
+ *
176
+ * @param config A MatSnackBarConfig instance with the customizations we want for this snackbar
177
+ * @param message The message to show on the snackbar
178
+ * @param action If not empty, the text to place on the snackbar confirmation button
179
+ * @param actionCallback A method to execute once the user clicks into the action button.
180
+ *
181
+ * @return void
182
+ */
183
+ addSnackBar(config, message, action = '', actionCallback = null) {
184
+ if (!this._isEnabled) {
185
+ return;
186
+ }
187
+ if (this._isShowingSnackBar) {
188
+ throw new Error('Trying to show a snackbar while another one is still visible');
189
+ }
190
+ this._isShowingSnackBar = true;
191
+ const snackBarRef = this.matSnackBar.open(message, action === '' ? undefined : action, config);
192
+ if (actionCallback !== null) {
193
+ snackBarRef.onAction().subscribe(() => {
194
+ actionCallback();
195
+ });
196
+ }
197
+ }
198
+ /**
199
+ * Tells if the application is currently showing a snackbar or not
200
+ */
201
+ get isShowingSnackBar() {
202
+ return this._isShowingSnackBar;
203
+ }
204
+ /**
205
+ * Force the removal of the snack bar dialog if it exists.
206
+ *
207
+ * If no snackbar is currently visible, this method will do nothing
208
+ */
209
+ removeSnackBar() {
210
+ if (!this._isEnabled || !this._isShowingSnackBar) {
211
+ return;
212
+ }
213
+ this.matSnackBar.dismiss();
214
+ this._isShowingSnackBar = false;
215
+ }
216
+ /**
217
+ * Show a dialog with one or more options that can be used to close it. We can use any of the predefined dialog types that are bundled with
218
+ * this library or extend DialogOptionsBaseComponent to create our own custom ones.
219
+ *
220
+ * @param width Specify the css value for the maximum width the dialog will have. As the dialog is responsive, the value will be automatically
221
+ reduced if the available screen is not enough, and will reach the desired value otherwise. Note that height will be adapted to the contents
222
+ of the dialog and cannot be specified here. We can set a pixels, % or any other css accepted value. For example: '400px', '50%', etc.
223
+ * @param texts A list with strings containing the dialog texts, sorted by importance. When dialog has a title, this should
224
+ * be placed first, subtitle second and so (Each dialog may accept different kind of texts).
225
+ * @param options A list of strings that will be used as button captions for each one of the accepted dialog options
226
+ * @param dialogComponentClass A class for a component that extends DialogOptionsBaseComponent, which will be the
227
+ * dialog visual element that is shown to the user.
228
+ * @param callback A function that will be called after the dialog is closed and will receive an object with the numeric index and value for
229
+ * the option that's been selected by the user.
230
+ * @param modal True (default) if selecting an option is mandatory to close the dialog, false if the dialog can be closed
231
+ * by the user by clicking outside it
232
+ */
233
+ addDialog(width, texts, options, dialogComponentClass, callback = null, modal = true) {
234
+ if (!this._isEnabled) {
235
+ return;
236
+ }
237
+ // Generate a string to uniquely identify this dialog on the list of active dialogs
238
+ const dialogHash = texts.join('') + options.join('') + dialogComponentClass.name;
239
+ // identical dialogs won't be allowed at the same time
240
+ if (this._activeDialogs.includes(dialogHash)) {
241
+ return;
242
+ }
243
+ const dialogRef = this.matDialog.open(dialogComponentClass, {
244
+ width: width,
245
+ disableClose: modal,
246
+ autoFocus: false,
247
+ closeOnNavigation: !modal,
248
+ data: { texts: texts, options: options }
249
+ });
250
+ this._activeDialogs.push(dialogHash);
251
+ this._activeDialogInstances.push(dialogRef);
252
+ dialogRef.beforeClosed().subscribe((selectedOptionIndex) => {
253
+ this._activeDialogs = ArrayUtils.removeElement(this._activeDialogs, dialogHash);
254
+ this._activeDialogInstances = ArrayUtils.removeElement(this._activeDialogInstances, dialogRef);
255
+ if (!NumericUtils.isInteger(selectedOptionIndex)) {
256
+ if (modal) {
257
+ throw new Error(`dialogRef.close() expects int value`);
258
+ }
259
+ else {
260
+ selectedOptionIndex = -1;
261
+ }
262
+ }
263
+ if (callback !== null) {
264
+ let selectedOption = { index: selectedOptionIndex, value: '' };
265
+ if (selectedOptionIndex >= 0) {
266
+ selectedOption.value = options[selectedOptionIndex];
267
+ }
268
+ callback(selectedOption);
269
+ }
270
+ });
271
+ }
272
+ /**
273
+ * Force the removal of all the dialogs that are currently visible.
274
+ *
275
+ * If no dialogs are currently visible, this method will do nothing
276
+ */
277
+ removeAllDialogs() {
278
+ if (!this._isEnabled) {
279
+ return;
280
+ }
281
+ for (const dialogRef of this._activeDialogInstances) {
282
+ dialogRef.close(-1);
283
+ }
284
+ this._activeDialogs = [];
285
+ this._activeDialogInstances = [];
286
+ }
287
+ /**
288
+ * Block all the user interactions with the application (keyboard, touch, mouse, ...)
289
+ */
290
+ _disableUserInteraction() {
291
+ if (this._documentKeydownUnlisten === null) {
292
+ this._documentKeydownUnlisten = this._renderer.listen('document', 'keydown', (event) => event.preventDefault());
293
+ }
294
+ if (this._documentMousedownUnlisten === null) {
295
+ this._documentMousedownUnlisten = this._renderer.listen('document', 'mousedown', (event) => event.preventDefault());
296
+ }
297
+ if (this._documentPointerdownUnlisten === null) {
298
+ this._documentPointerdownUnlisten = this._renderer.listen('document', 'pointerdown', (event) => event.preventDefault());
299
+ }
300
+ }
301
+ /**
302
+ * Restore the user interactions that were previously disabled with _disableUserInteraction method
303
+ */
304
+ _enableUserInteraction() {
305
+ if (this._documentKeydownUnlisten !== null) {
306
+ this._documentKeydownUnlisten();
307
+ this._documentKeydownUnlisten = null;
308
+ }
309
+ if (this._documentMousedownUnlisten !== null) {
310
+ this._documentMousedownUnlisten();
311
+ this._documentMousedownUnlisten = null;
312
+ }
313
+ if (this._documentPointerdownUnlisten !== null) {
314
+ this._documentPointerdownUnlisten();
315
+ this._documentMousedownUnlisten = null;
316
+ }
317
+ }
318
+ }
319
+ DialogService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogService, deps: [{ token: i0.RendererFactory2 }, { token: i1.MatSnackBar }, { token: i2.MatDialog }, { token: i0.Injector }, { token: i0.ApplicationRef }, { token: i0.ComponentFactoryResolver }], target: i0.ɵɵFactoryTarget.Injectable });
320
+ DialogService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogService });
321
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: DialogService, decorators: [{
322
+ type: Injectable
323
+ }], ctorParameters: function () { return [{ type: i0.RendererFactory2 }, { type: i1.MatSnackBar }, { type: i2.MatDialog }, { type: i0.Injector }, { type: i0.ApplicationRef }, { type: i0.ComponentFactoryResolver }]; } });
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL2NvbnRyb2xsZXIvZGlhbG9nLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUFRLFVBQVUsRUFBbUYsTUFBTSxlQUFlLENBQUM7QUFHbEksT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUt2RTs7R0FFRztBQUVILE1BQU0sT0FBTyxhQUFhO0lBeUZ0QixZQUFZLGVBQWlDLEVBQ2hCLFdBQXdCLEVBQ3hCLFNBQW9CLEVBQ3BCLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLHdCQUFrRDtRQUpsRCxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUEzRi9FOzs7O1dBSUc7UUFDSCxrQ0FBNkIsR0FBaUMsc0JBQXNCLENBQUM7UUFHckY7O1dBRUc7UUFDSyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRzFCOztXQUVHO1FBQ0ssd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBR3BDOzs7O1dBSUc7UUFDSyxxQkFBZ0IsR0FBbUQsSUFBSSxDQUFDO1FBR2hGOztXQUVHO1FBQ0ssd0JBQW1CLEdBQTJCLElBQUksQ0FBQztRQUczRDs7V0FFRztRQUNLLHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUduQzs7Ozs7V0FLRztRQUNLLG1CQUFj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QUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztTQUN2SDtRQUVELElBQUksSUFBSSxDQUFDLDRCQUE0QixLQUFLLElBQUksRUFBRTtZQUU1QyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDM0g7SUFDTCxDQUFDO0lBR0Q7O09BRUc7SUFDSyxzQkFBc0I7UUFFMUIsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssSUFBSSxFQUFFO1lBRXhDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7U0FDeEM7UUFFRCxJQUFJLElBQUksQ0FBQywwQkFBMEIsS0FBSyxJQUFJLEVBQUU7WUFFMUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztTQUMxQztRQUVELElBQUksSUFBSSxDQUFDLDRCQUE0QixLQUFLLElBQUksRUFBRTtZQUU1QyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO1NBQzFDO0lBQ0wsQ0FBQzs7MEdBemJRLGFBQWE7OEdBQWIsYUFBYTsyRkFBYixhQUFhO2tCQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFR1cmJvR1VJIGlzIEEgbGlicmFyeSB0aGF0IGhlbHBzIHdpdGggdGhlIG1vc3QgY29tbW9uIGFuZCBnZW5lcmljIFVJIGVsZW1lbnRzIGFuZCBmdW5jdGlvbmFsaXRpZXNcclxuICpcclxuICogV2Vic2l0ZSA6IC0+IGh0dHA6Ly93d3cudHVyYm9ndWkub3JnXHJcbiAqIExpY2Vuc2UgOiAtPiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIExpY2Vuc2UgVXJsIDogLT4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqIENvcHlSaWdodCA6IC0+IENvcHlyaWdodCAyMDE4IEVkZXJ0b25lIEFkdmFuZGVkIFNvbHV0aW9ucy4gaHR0cHM6Ly93d3cuZWRlcnRvbmUuY29tXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQXJyYXlVdGlscywgTnVtZXJpY1V0aWxzIH0gZnJvbSAndHVyYm9jb21tb25zLXRzJztcclxuaW1wb3J0IHsgVHlwZSwgSW5qZWN0YWJsZSwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBJbmplY3RvciwgQXBwbGljYXRpb25SZWYsIFJlbmRlcmVyMiwgUmVuZGVyZXJGYWN0b3J5MiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciwgTWF0U25hY2tCYXJDb25maWcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBCdXN5U3RhdGVCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2J1c3ktc3RhdGUtYmFzZS9idXN5LXN0YXRlLWJhc2UuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsLCBEb21Qb3J0YWxPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgRGlhbG9nT3B0aW9uc0Jhc2VDb21wb25lbnQgfSBmcm9tICcuLi92aWV3L2NvbXBvbmVudHMvZGlhbG9nLW9wdGlvbnMtYmFzZS9kaWFsb2ctb3B0aW9ucy1iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERpYWxvZ0Jhc2VDb21wb25lbnQgfSBmcm9tICcuLi92aWV3L2NvbXBvbmVudHMvZGlhbG9nLWJhc2UvZGlhbG9nLWJhc2UuY29tcG9uZW50JztcclxuXHJcblxyXG4vKipcclxuICogTWFuYWdlcyB0aGUgYXBwbGljYXRpb24gbW9kYWwgYW5kIG5vbiBtb2RhbCBmbG9hdGluZyBlbGVtZW50c1xyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRGlhbG9nU2VydmljZSB7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXNlZCB0byBtb2RpZnkgdGhlIGJ1c3kgc3RhdGUgY29tcG9uZW50IHRoYXQgaXMgc2hvd24gYnkgZGVmYXVsdCBieSB0aGUgYWRkTW9kYWxCdXN5U3RhdGUoKSBtZXRob2QuXHJcbiAgICAgKlxyXG4gICAgICogQHNlZSB0aGlzLmFkZE1vZGFsQnVzeVN0YXRlKClcclxuICAgICAqL1xyXG4gICAgY3VzdG9tQnVzeVN0YXRlQ29tcG9uZW50Q2xhc3M6IFR5cGU8QnVzeVN0YXRlQmFzZUNvbXBvbmVudD4gPSBCdXN5U3RhdGVCYXNlQ29tcG9uZW50O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIHB1YmxpYyBnZXR0ZXIgZm9yIGRvY3NcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaXNFbmFibGVkID0gdHJ1ZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyBpZiB0aGUgbWFpbiBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgc2hvd2luZyBhIGJ1c3kgc3RhdGUgdGhhdCBibG9ja3MgYWxsIHVzZXIgaW50ZXJhY3Rpb25cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaXNTaG93aW5nQnVzeVN0YXRlID0gZmFsc2U7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1vZGFsIGJ1c3kgc3RhdGUgY29tcG9uZW50IHRoYXQgaXMgaW5pdGlhbGl6ZWQgb25seSB0aGUgZmlyc3QgdGltZSBpdCBpcyBjYWxsZWQuXHJcbiAgICAgKlxyXG4gICAgICogKFRvIGFwcGVuZCB0aGUgYnVzeSBzdGF0ZSBkeW5hbWljYWxseSwgd2UgdXNlIHRoZSBQb3J0YWwgY29uY2VwdCBmcm9tIHRoZSBhbmd1bGFyIG1hdGVyaWFsIGxpYnJhcnkpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2NvbXBvbmVudFBvcnRhbDogQ29tcG9uZW50UG9ydGFsPEJ1c3lTdGF0ZUJhc2VDb21wb25lbnQ+IHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIG1vZGFsIGJ1c3kgc3RhdGUgY29udGFpbmVyIHdoZXJlIHRoZSBjb21wb25lbnQgd2lsbCBiZSBhZGRlZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9tb2RhbEJ1c3lTdGF0ZUhvc3Q6IERvbVBvcnRhbE91dGxldCB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlbGxzIGlmIHRoZSBtYW5hZ2VyIGlzIGN1cnJlbnRseSBzaG93aW5nIGEgc25hY2tiYXIgZWxlbWVudCBvciBub3RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfaXNTaG93aW5nU25hY2tCYXIgPSBmYWxzZTtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb250YWlucyBhIGxpc3Qgb2YgdGhlIGRpYWxvZ3MgdGhhdCBhcmUgY3VycmVudGx5IHZpc2libGUgdG8gdGhlIHVzZXIuXHJcbiAgICAgKiBFYWNoIGl0ZW0gaW4gdGhpcyBsaXN0IGlzIGEgaGFzaCB0aGF0IGlzIGNvbXB1dGVkIHdoZW4gZGlhbG9nIGlzIGNyZWF0ZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgaXQuXHJcbiAgICAgKlxyXG4gICAgICogRW1wdHkgbGlzdCBtZWFucyBubyBkaWFsb2dzIGFyZSBjdXJyZW50bHkgdmlzaWJsZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9hY3RpdmVEaWFsb2dzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbnRhaW5zIGEgbGlzdCB3aXRoIGFsbCB0aGUgTWF0RGlhbG9nIGluc3RhbmNlcyB0aGF0IGFyZSBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci5cclxuICAgICAqIFRoZSBsaXN0IHVzZXMgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGxpc3Qgb2YgX2FjdGl2ZURpYWxvZ3MgaGFzaCB2YWx1ZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfYWN0aXZlRGlhbG9nSW5zdGFuY2VzOiBNYXREaWFsb2dSZWY8RGlhbG9nQmFzZUNvbXBvbmVudD5bXSA9IFtdO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVzZWQgdG8gc3RvcmUgdGhlIGluaXRpYWxpemVkIFJlbmRlcmVyIDIgaW5zdGFuY2UgdGhhdCBpcyB1c2VkIGJ5IHRoaXMgY2xhc3NcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVuZGVyZXI6IFJlbmRlcmVyMjtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRob2QgdGhhdCBpcyB1c2VkIHRvIGRlbGV0ZSB0aGUgd2luZG93IGJlZm9yZXVubG9hZCBldmVudCBsaXN0ZW5lciBvbmNlIG5vdCB1c2VkIGFueW1vcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfd2luZG93QmVmb3JlVW5sb2FkVW5MaXN0ZW46ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBkb2N1bWVudCBrZXlkb3duIGV2ZW50IGxpc3RlbmVyIG9uY2Ugbm90IHVzZWQgYW55bW9yZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9kb2N1bWVudEtleWRvd25Vbmxpc3RlbjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHRoYXQgaXMgdXNlZCB0byBkZWxldGUgdGhlIGRvY3VtZW50IG1vdXNlZG93biBldmVudCBsaXN0ZW5lciBvbmNlIG5vdCB1c2VkIGFueW1vcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZG9jdW1lbnRNb3VzZWRvd25Vbmxpc3RlbjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0aG9kIHRoYXQgaXMgdXNlZCB0byBkZWxldGUgdGhlIGRvY3VtZW50IHBvaW50ZXJkb3duIGV2ZW50IGxpc3RlbmVyIG9uY2Ugbm90IHVzZWQgYW55bW9yZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9kb2N1bWVudFBvaW50ZXJkb3duVW5saXN0ZW46ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihyZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTIsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1hdFNuYWNrQmFyOiBNYXRTbmFja0JhcixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbWF0RGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG5cclxuICAgICAgICB0aGlzLl9yZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCBudWxsKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyBpZiB0aGlzIGRpYWxvZyBzZXJ2aWNlIGlzIGVuYWJsZWQgb3Igbm90LiBJZiBkaWFsb2cgc2VydmljZSBpcyBkaXNhYmxlZCwgbm9uZSBvZiBpdCdzIGZlYXR1cmVzIHdpbGwgd29ya1xyXG4gICAgICogVGhpcyBpcyB1c2VkIHRvIGJsb2NrIGFsbCBkaWFsb2cgZmVhdHVyZXMgbm9ybWFsbHkgd2hlbiBzaHV0dGluZyBkb3duIHRoZSBhcHBsaWNhdGlvblxyXG4gICAgICpcclxuICAgICAqIFVzZSB3aXRoIGNhdXRpb24uIFdoZW4gdGhpcyBpcyBzZXQgdG8gZmFsc2UsIGRpYWxvZyBzZXJ2aWNlIHN0b3BzIHdvcmtpbmcuXHJcbiAgICAgKi9cclxuICAgIHNldCBpc0VuYWJsZWQodjogYm9vbGVhbikge1xyXG5cclxuICAgICAgICBpZiAodiA9PT0gdGhpcy5faXNFbmFibGVkKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pc0VuYWJsZWQgPSB2O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgYSB3YXJuaW5nIHRoYXQgd2lsbCBiZSBzaG93biB0byB0aGUgdXNlciB3aGVuIGhlL3NoZSB0cmllcyB0byBjbG9zZSB0aGUgYXBwbGljYXRpb24uXHJcbiAgICAgKiBUaGlzIHdhcm5pbmcgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gY29udGludWUgd2l0aCB0aGUgZXhpdCBwcm9jZXNzIG9yIGNhbmNlbCBpdC5cclxuICAgICAqIFRoZSBzcGVjaWZpYyB0ZXh0cyBvZiB0aGlzIG1lc3NhZ2UgYXJlIGEgZ2VuZXJpYyBvbmVzIGFuZCBjYW5ub3QgYmUgY2hhbmdlZC5cclxuICAgICAqXHJcbiAgICAgKiBJTVBPUlRBTlQ6IFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBtYWluIGFwcGxpY2F0aW9uIGhhcyBiZWVuIGluaXRpYWxpemVkIGluIG9yZGVyIHRvIHdvcmssXHJcbiAgICAgKiBvdGhlcndpc2UgaXQgd2lsbCBkbyBub3RoaW5nLlxyXG4gICAgICovXHJcbiAgICBhZGRDbG9zZUFwcGxpY2F0aW9uV2FybmluZygpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZFVuTGlzdGVuID09PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRVbkxpc3RlbiA9IHRoaXMuX3JlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2JlZm9yZXVubG9hZCcsXHJcbiAgICAgICAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnJldHVyblZhbHVlID0gdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSB0aGUgY2xvc2UgYXBwbGljYXRpb24gd2FybmluZyBtZXNzYWdlIGlmIHByZXZpb3VzbHkgYXNzaWduZWRcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQ2xvc2VBcHBsaWNhdGlvbldhcm5pbmcoKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRVbkxpc3RlbiAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkVW5MaXN0ZW4oKTtcclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkVW5MaXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGFuZ2UgdGhlIGFwcGxpY2F0aW9uIHZpc3VhbCBhcHBlYXJhbmNlIHNvIHRoZSB1c2VyIHBlcmNlaXZlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpc1xyXG4gICAgICogY3VycmVudGx5IGJ1c3kuIFdoaWxlIG1vZGFsIGJ1c3kgc3RhdGUgaXMgZW5hYmxlZCwgbm8gdXNlciBpbnB1dCBpcyBwb3NzaWJsZSBuZWl0aGVyIHZpYVxyXG4gICAgICoga2V5Ym9hcmQsIG1vdXNlIG9yIHRvdWNoLiBVc2UgdGhpcyBzdGF0ZSB3aGVuIHBlcmZvcm1pbmcgc2VydmVyIHJlcXVlc3RzIG9yIG9wZXJhdGlvbnMgdGhhdFxyXG4gICAgICogbXVzdCBibG9jayB0aGUgdXNlciBpbnRlcmFjdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBOb3RlOiBXZSBjYW4gbW9kaWZ5IHRoZSBidXN5IHN0YXRlIGNvbXBvbmVudCB0aGF0IGlzIHNob3duIGJ5IHRoaXMgbWV0aG9kLiBUbyBkbyBpdCwgd2UgbXVzdFxyXG4gICAgICogc2V0IHRoaXMuY3VzdG9tQnVzeVN0YXRlQ29tcG9uZW50Q2xhc3MgcHJvcGVydHkgd2l0aCBvdXIgb3duIGN1c3RvbSBidXN5IHN0YXRlIGNvbXBvbmVudCBjbGFzcy4gKFdlIGNhbiBkbyBpdCBhdFxyXG4gICAgICogb3VyIG1haW4gYXBwbGljYXRpb24gY29tcG9uZW50IGNvbnN0cnVjdG9yIGZvciBleGFtcGxlKS4gT3VyIGN1c3RvbSBjb21wb25lbnQgbXVzdCBleHRlbmQgdGhlXHJcbiAgICAgKiBCdXN5U3RhdGVCYXNlQ29tcG9uZW50IG9uZSB0byBhZGQgaXRzIG93biB2aXN1YWwgYXBwZWFyYW5jZS5cclxuICAgICAqXHJcbiAgICAgKiBAc2VlIHRoaXMuY3VzdG9tQnVzeVN0YXRlQ29tcG9uZW50Q2xhc3NcclxuICAgICAqL1xyXG4gICAgYWRkTW9kYWxCdXN5U3RhdGUoKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkIHx8IHRoaXMuX2lzU2hvd2luZ0J1c3lTdGF0ZSkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzYWJsZVVzZXJJbnRlcmFjdGlvbigpO1xyXG5cclxuICAgICAgICAvLyBEeW5hbWljYWxseSBjcmVhdGUgdGhlIGJ1c3kgc3RhdGUgY29tcG9uZW50IHJlZmVyZW5jZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudFBvcnRhbCA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbCh0aGlzLmN1c3RvbUJ1c3lTdGF0ZUNvbXBvbmVudENsYXNzKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIFBvcnRhbEhvc3Qgd2l0aCBkb2N1bWVudC5ib2R5IGFzIGl0cyBhbmNob3IgZWxlbWVudFxyXG4gICAgICAgICAgICB0aGlzLl9tb2RhbEJ1c3lTdGF0ZUhvc3QgPSBuZXcgRG9tUG9ydGFsT3V0bGV0KFxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvblJlZixcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluamVjdG9yKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICh0aGlzLl9tb2RhbEJ1c3lTdGF0ZUhvc3QgYXMgRG9tUG9ydGFsT3V0bGV0KS5hdHRhY2godGhpcy5fY29tcG9uZW50UG9ydGFsKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNTaG93aW5nQnVzeVN0YXRlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUZWxscyBpZiB0aGUgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IGxvY2tlZCBpbiBhIG1vZGFsIGJ1c3kgc3RhdGUgKGNhdXNlZCBieSBhbiBhZGRNb2RhbEJ1c3lTdGF0ZSgpIGNhbGwpXHJcbiAgICAgKi9cclxuICAgIGdldCBpc1Nob3dpbmdCdXN5U3RhdGUoKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc1Nob3dpbmdCdXN5U3RhdGU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIHRoZSBhcHBsaWNhdGlvbiBidXN5IHN0YXRlIGFuZCByZXN0b3JlIGl0IGJhY2sgdG8gbm9ybWFsIHVzZXIgaW50ZXJhY3Rpb25cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlTW9kYWxCdXN5U3RhdGUoKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkIHx8ICF0aGlzLl9pc1Nob3dpbmdCdXN5U3RhdGUpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRQb3J0YWwgIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgICh0aGlzLl9tb2RhbEJ1c3lTdGF0ZUhvc3QgYXMgRG9tUG9ydGFsT3V0bGV0KS5kZXRhY2goKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2VuYWJsZVVzZXJJbnRlcmFjdGlvbigpO1xyXG5cclxuICAgICAgICB0aGlzLl9pc1Nob3dpbmdCdXN5U3RhdGUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRPRE8gLSBhZGFwdCBmcm9tIFRTIHZlcnNpb25cclxuICAgICAqL1xyXG4gICAgYWRkVG9vbFRpcCgpIHtcclxuXHJcbiAgICAgICAgLy8gVE9ETyAtIGFkYXB0IGZyb20gVFMgdmVyc2lvblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3cgYSBub24gbW9kYWwgc25hY2tiYXIgbm90aWZpY2F0aW9uIHRvIHRoZSB1c2VyIChPbmx5IG9uZSBzbmFjay1iYXIgY2FuIGV2ZXIgYmUgb3BlbmVkIGF0IHRoZSBzYW1lIHRpbWUpLlxyXG4gICAgICpcclxuICAgICAqIFNuYWNrYmFycyBpbmZvcm0gdXNlcnMgb2YgYSBwcm9jZXNzIHRoYXQgYW4gYXBwIGhhcyBwZXJmb3JtZWQgb3Igd2lsbCBwZXJmb3JtLiBUaGV5IGFwcGVhciB0ZW1wb3JhcmlseSwgdG93YXJkcyB0aGUgYm90dG9tIG9yIHRvcCBvZiB0aGUgc2NyZWVuLlxyXG4gICAgICogVGhleSBzaG91bGRu4oCZdCBpbnRlcnJ1cHQgdGhlIHVzZXIgZXhwZXJpZW5jZSwgYW5kIHRoZXkgZG9u4oCZdCByZXF1aXJlIHVzZXIgaW5wdXQgdG8gZGlzYXBwZWFyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb25maWcgQSBNYXRTbmFja0JhckNvbmZpZyBpbnN0YW5jZSB3aXRoIHRoZSBjdXN0b21pemF0aW9ucyB3ZSB3YW50IGZvciB0aGlzIHNuYWNrYmFyXHJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzaG93IG9uIHRoZSBzbmFja2JhclxyXG4gICAgICogQHBhcmFtIGFjdGlvbiBJZiBub3QgZW1wdHksIHRoZSB0ZXh0IHRvIHBsYWNlIG9uIHRoZSBzbmFja2JhciBjb25maXJtYXRpb24gYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0gYWN0aW9uQ2FsbGJhY2sgQSBtZXRob2QgdG8gZXhlY3V0ZSBvbmNlIHRoZSB1c2VyIGNsaWNrcyBpbnRvIHRoZSBhY3Rpb24gYnV0dG9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm4gdm9pZFxyXG4gICAgICovXHJcbiAgICBhZGRTbmFja0Jhcihjb25maWc6IE1hdFNuYWNrQmFyQ29uZmlnLCBtZXNzYWdlOiBzdHJpbmcsIGFjdGlvbiA9ICcnLCBhY3Rpb25DYWxsYmFjazogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGwpIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc1Nob3dpbmdTbmFja0Jhcikge1xyXG5cclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcnlpbmcgdG8gc2hvdyBhIHNuYWNrYmFyIHdoaWxlIGFub3RoZXIgb25lIGlzIHN0aWxsIHZpc2libGUnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2lzU2hvd2luZ1NuYWNrQmFyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3Qgc25hY2tCYXJSZWYgPSB0aGlzLm1hdFNuYWNrQmFyLm9wZW4obWVzc2FnZSwgYWN0aW9uID09PSAnJyA/IHVuZGVmaW5lZCA6IGFjdGlvbiwgY29uZmlnKTtcclxuXHJcbiAgICAgICAgaWYgKGFjdGlvbkNhbGxiYWNrICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICBzbmFja0JhclJlZi5vbkFjdGlvbigpLnN1YnNjcmliZSgoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgYWN0aW9uQ2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlbGxzIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgc2hvd2luZyBhIHNuYWNrYmFyIG9yIG5vdFxyXG4gICAgICovXHJcbiAgICBnZXQgaXNTaG93aW5nU25hY2tCYXIoKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc1Nob3dpbmdTbmFja0JhcjtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb3JjZSB0aGUgcmVtb3ZhbCBvZiB0aGUgc25hY2sgYmFyIGRpYWxvZyBpZiBpdCBleGlzdHMuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gc25hY2tiYXIgaXMgY3VycmVudGx5IHZpc2libGUsIHRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZ1xyXG4gICAgICovXHJcbiAgICByZW1vdmVTbmFja0JhcigpIHtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQgfHwgIXRoaXMuX2lzU2hvd2luZ1NuYWNrQmFyKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLmRpc21pc3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNTaG93aW5nU25hY2tCYXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IGEgZGlhbG9nIHdpdGggb25lIG9yIG1vcmUgb3B0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNsb3NlIGl0LiBXZSBjYW4gdXNlIGFueSBvZiB0aGUgcHJlZGVmaW5lZCBkaWFsb2cgdHlwZXMgdGhhdCBhcmUgYnVuZGxlZCB3aXRoXHJcbiAgICAgKiB0aGlzIGxpYnJhcnkgb3IgZXh0ZW5kIERpYWxvZ09wdGlvbnNCYXNlQ29tcG9uZW50IHRvIGNyZWF0ZSBvdXIgb3duIGN1c3RvbSBvbmVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB3aWR0aCBTcGVjaWZ5IHRoZSBjc3MgdmFsdWUgZm9yIHRoZSBtYXhpbXVtIHdpZHRoIHRoZSBkaWFsb2cgd2lsbCBoYXZlLiBBcyB0aGUgZGlhbG9nIGlzIHJlc3BvbnNpdmUsIHRoZSB2YWx1ZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHlcclxuICAgICAgICAgICAgICByZWR1Y2VkIGlmIHRoZSBhdmFpbGFibGUgc2NyZWVuIGlzIG5vdCBlbm91Z2gsIGFuZCB3aWxsIHJlYWNoIHRoZSBkZXNpcmVkIHZhbHVlIG90aGVyd2lzZS4gTm90ZSB0aGF0IGhlaWdodCB3aWxsIGJlIGFkYXB0ZWQgdG8gdGhlIGNvbnRlbnRzXHJcbiAgICAgICAgICAgICAgb2YgdGhlIGRpYWxvZyBhbmQgY2Fubm90IGJlIHNwZWNpZmllZCBoZXJlLiBXZSBjYW4gc2V0IGEgcGl4ZWxzLCAlIG9yIGFueSBvdGhlciBjc3MgYWNjZXB0ZWQgdmFsdWUuIEZvciBleGFtcGxlOiAnNDAwcHgnLCAnNTAlJywgZXRjLlxyXG4gICAgICogQHBhcmFtIHRleHRzIEEgbGlzdCB3aXRoIHN0cmluZ3MgY29udGFpbmluZyB0aGUgZGlhbG9nIHRleHRzLCBzb3J0ZWQgYnkgaW1wb3J0YW5jZS4gV2hlbiBkaWFsb2cgaGFzIGEgdGl0bGUsIHRoaXMgc2hvdWxkXHJcbiAgICAgKiAgICAgICAgYmUgcGxhY2VkIGZpcnN0LCBzdWJ0aXRsZSBzZWNvbmQgYW5kIHNvIChFYWNoIGRpYWxvZyBtYXkgYWNjZXB0IGRpZmZlcmVudCBraW5kIG9mIHRleHRzKS5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEEgbGlzdCBvZiBzdHJpbmdzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGJ1dHRvbiBjYXB0aW9ucyBmb3IgZWFjaCBvbmUgb2YgdGhlIGFjY2VwdGVkIGRpYWxvZyBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0gZGlhbG9nQ29tcG9uZW50Q2xhc3MgQSBjbGFzcyBmb3IgYSBjb21wb25lbnQgdGhhdCBleHRlbmRzIERpYWxvZ09wdGlvbnNCYXNlQ29tcG9uZW50LCB3aGljaCB3aWxsIGJlIHRoZVxyXG4gICAgICogICAgICAgIGRpYWxvZyB2aXN1YWwgZWxlbWVudCB0aGF0IGlzIHNob3duIHRvIHRoZSB1c2VyLlxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZGlhbG9nIGlzIGNsb3NlZCBhbmQgd2lsbCByZWNlaXZlIGFuIG9iamVjdCB3aXRoIHRoZSBudW1lcmljIGluZGV4IGFuZCB2YWx1ZSBmb3JcclxuICAgICAqICAgICAgICB0aGUgb3B0aW9uIHRoYXQncyBiZWVuIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLlxyXG4gICAgICogQHBhcmFtIG1vZGFsIFRydWUgKGRlZmF1bHQpIGlmIHNlbGVjdGluZyBhbiBvcHRpb24gaXMgbWFuZGF0b3J5IHRvIGNsb3NlIHRoZSBkaWFsb2csIGZhbHNlIGlmIHRoZSBkaWFsb2cgY2FuIGJlIGNsb3NlZFxyXG4gICAgICogICAgICAgIGJ5IHRoZSB1c2VyIGJ5IGNsaWNraW5nIG91dHNpZGUgaXQgXHJcbiAgICAgKi9cclxuICAgIGFkZERpYWxvZyh3aWR0aDogc3RyaW5nLFxyXG4gICAgICAgICAgICAgIHRleHRzOiBzdHJpbmdbXSxcclxuICAgICAgICAgICAgICBvcHRpb25zOiBzdHJpbmdbXSxcclxuICAgICAgICAgICAgICBkaWFsb2dDb21wb25lbnRDbGFzczogVHlwZTxEaWFsb2dPcHRpb25zQmFzZUNvbXBvbmVudD4sXHJcbiAgICAgICAgICAgICAgY2FsbGJhY2s6IG51bGwgfCAoKHNlbGVjdGVkT3B0aW9uOiB7aW5kZXg6bnVtYmVyLCB2YWx1ZTogc3RyaW5nfSkgPT4gdm9pZCkgPSBudWxsLFxyXG4gICAgICAgICAgICAgIG1vZGFsID0gdHJ1ZSkge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2VuZXJhdGUgYSBzdHJpbmcgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBkaWFsb2cgb24gdGhlIGxpc3Qgb2YgYWN0aXZlIGRpYWxvZ3NcclxuICAgICAgICBjb25zdCBkaWFsb2dIYXNoID0gdGV4dHMuam9pbignJykgKyBvcHRpb25zLmpvaW4oJycpICsgZGlhbG9nQ29tcG9uZW50Q2xhc3MubmFtZTtcclxuXHJcbiAgICAgICAgLy8gaWRlbnRpY2FsIGRpYWxvZ3Mgd29uJ3QgYmUgYWxsb3dlZCBhdCB0aGUgc2FtZSB0aW1lXHJcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZURpYWxvZ3MuaW5jbHVkZXMoZGlhbG9nSGFzaCkpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMubWF0RGlhbG9nLm9wZW4oZGlhbG9nQ29tcG9uZW50Q2xhc3MsIHtcclxuICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxyXG4gICAgICAgICAgICBkaXNhYmxlQ2xvc2U6IG1vZGFsLFxyXG4gICAgICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxyXG4gICAgICAgICAgICBjbG9zZU9uTmF2aWdhdGlvbjogIW1vZGFsLFxyXG4gICAgICAgICAgICBkYXRhOiB7IHRleHRzOiB0ZXh0cywgb3B0aW9uczogb3B0aW9ucyB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fYWN0aXZlRGlhbG9ncy5wdXNoKGRpYWxvZ0hhc2gpO1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZURpYWxvZ0luc3RhbmNlcy5wdXNoKGRpYWxvZ1JlZik7XHJcblxyXG4gICAgICAgIGRpYWxvZ1JlZi5iZWZvcmVDbG9zZWQoKS5zdWJzY3JpYmUoKHNlbGVjdGVkT3B0aW9uSW5kZXg6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGlhbG9ncyA9IEFycmF5VXRpbHMucmVtb3ZlRWxlbWVudCh0aGlzLl9hY3RpdmVEaWFsb2dzLCBkaWFsb2dIYXNoKTtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlRGlhbG9nSW5zdGFuY2VzID0gQXJyYXlVdGlscy5yZW1vdmVFbGVtZW50KHRoaXMuX2FjdGl2ZURpYWxvZ0luc3RhbmNlcywgZGlhbG9nUmVmKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghTnVtZXJpY1V0aWxzLmlzSW50ZWdlcihzZWxlY3RlZE9wdGlvbkluZGV4KSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKG1vZGFsKXtcclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGRpYWxvZ1JlZi5jbG9zZSgpIGV4cGVjdHMgaW50IHZhbHVlYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb25JbmRleCA9IC0xO1xyXG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9uID0ge2luZGV4OiBzZWxlY3RlZE9wdGlvbkluZGV4LCB2YWx1ZTogJyd9O1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZihzZWxlY3RlZE9wdGlvbkluZGV4ID49IDApe1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uLnZhbHVlID0gb3B0aW9uc1tzZWxlY3RlZE9wdGlvbkluZGV4XTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAoY2FsbGJhY2sgYXMgKChzZWxlY3RlZE9wdGlvbjoge2luZGV4Om51bWJlciwgdmFsdWU6IHN0cmluZ30pID0+IHZvaWQpKShzZWxlY3RlZE9wdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEZvcmNlIHRoZSByZW1vdmFsIG9mIGFsbCB0aGUgZGlhbG9ncyB0aGF0IGFyZSBjdXJyZW50bHkgdmlzaWJsZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBubyBkaWFsb2dzIGFyZSBjdXJyZW50bHkgdmlzaWJsZSwgdGhpcyBtZXRob2Qgd2lsbCBkbyBub3RoaW5nXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZUFsbERpYWxvZ3MoKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XHJcblxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGRpYWxvZ1JlZiBvZiB0aGlzLl9hY3RpdmVEaWFsb2dJbnN0YW5jZXMpIHtcclxuXHJcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgtMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuX2FjdGl2ZURpYWxvZ3MgPSBbXTtcclxuICAgICAgICB0aGlzLl9hY3RpdmVEaWFsb2dJbnN0YW5jZXMgPSBbXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCbG9jayBhbGwgdGhlIHVzZXIgaW50ZXJhY3Rpb25zIHdpdGggdGhlIGFwcGxpY2F0aW9uIChrZXlib2FyZCwgdG91Y2gsIG1vdXNlLCAuLi4pXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX2Rpc2FibGVVc2VySW50ZXJhY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudEtleWRvd25Vbmxpc3RlbiA9PT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRLZXlkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2tleWRvd24nLCAoZXZlbnQpID0+IGV2ZW50LnByZXZlbnREZWZhdWx0KCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ21vdXNlZG93bicsIChldmVudCkgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuID09PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudFBvaW50ZXJkb3duVW5saXN0ZW4gPSB0aGlzLl9yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ3BvaW50ZXJkb3duJywgKGV2ZW50KSA9PiBldmVudC5wcmV2ZW50RGVmYXVsdCgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzdG9yZSB0aGUgdXNlciBpbnRlcmFjdGlvbnMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgZGlzYWJsZWQgd2l0aCBfZGlzYWJsZVVzZXJJbnRlcmFjdGlvbiBtZXRob2RcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfZW5hYmxlVXNlckludGVyYWN0aW9uKCkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnRLZXlkb3duVW5saXN0ZW4gIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50S2V5ZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50S2V5ZG93blVubGlzdGVuID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kb2N1bWVudE1vdXNlZG93blVubGlzdGVuICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kb2N1bWVudE1vdXNlZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RvY3VtZW50UG9pbnRlcmRvd25Vbmxpc3RlbiAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRQb2ludGVyZG93blVubGlzdGVuKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duVW5saXN0ZW4gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,68 @@
1
+ /**
2
+ * TurboGUI is A library that helps with the most common and generic UI elements and functionalities
3
+ *
4
+ * Website : -> http://www.turbogui.org
5
+ * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
6
+ * License Url : -> http://www.apache.org/licenses/LICENSE-2.0
7
+ * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
8
+ */
9
+ import { Injectable } from '@angular/core';
10
+ import * as i0 from "@angular/core";
11
+ /**
12
+ * Captures all the application exceptions and performs any required action.
13
+ * It also contains multiple general error management features.
14
+ *
15
+ * To define this class as your application error handler, you must add the following to your
16
+ * main app module providers:
17
+ * {
18
+ * provide: ErrorHandler,
19
+ * useClass: GlobalErrorService
20
+ * },
21
+ * GlobalErrorService
22
+ *
23
+ * You cannot access the error handler at runtime. If you need to modify any of the behaviours
24
+ * or implement your custom ones, you must extend this class and set your new one as the error
25
+ * handler provider.
26
+ */
27
+ export class GlobalErrorService {
28
+ constructor() {
29
+ /**
30
+ * Enables or disables the error notification to user via an alert box
31
+ * Extend this class and override this value on your custom error handle to change it
32
+ */
33
+ this.showExceptionsToUser = true;
34
+ /**
35
+ * Enables or disables the error notification to user via an alert box
36
+ * Extend this class and override this value on your custom error handle to change it
37
+ */
38
+ this.showExceptionsOnConsole = true;
39
+ /**
40
+ * Defines the text that will be used for the alert that is shown to the user when an exception happens
41
+ * and showExceptionsToUser is true
42
+ * Extend this class and override this value on your custom error handle to change it
43
+ */
44
+ this.errorAlertMessage = 'Application exception:\n\n';
45
+ }
46
+ /**
47
+ * Show an alert with the received error detail and also log it to the js console.
48
+ *
49
+ * Angular expects at least this method to be implemented on any class that is used as a global exception handler.
50
+ *
51
+ * @param error An error instance
52
+ */
53
+ handleError(error) {
54
+ if (this.showExceptionsToUser) {
55
+ alert(this.errorAlertMessage + error);
56
+ }
57
+ if (this.showExceptionsOnConsole) {
58
+ console.log(error);
59
+ }
60
+ throw error;
61
+ }
62
+ }
63
+ GlobalErrorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GlobalErrorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
64
+ GlobalErrorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GlobalErrorService });
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GlobalErrorService, decorators: [{
66
+ type: Injectable
67
+ }] });
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsZXJyb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1cmJvZ3VpLWFuZ3VsYXIvc3JjL21haW4vY29udHJvbGxlci9nbG9iYWxlcnJvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLGVBQWUsQ0FBQzs7QUFHekQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUQvQjtRQUlJOzs7V0FHRztRQUNjLHlCQUFvQixHQUFHLElBQUksQ0FBQztRQUc3Qzs7O1dBR0c7UUFDYyw0QkFBdUIsR0FBRyxJQUFJLENBQUM7UUFHaEQ7Ozs7V0FJRztRQUNjLHNCQUFpQixHQUFHLDRCQUE0QixDQUFDO0tBd0JyRTtJQXJCRzs7Ozs7O09BTUc7SUFDSCxXQUFXLENBQUMsS0FBVTtRQUVsQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUUzQixLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFJLEtBQWdCLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBRTlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEI7UUFFRCxNQUFNLEtBQUssQ0FBQztJQUNoQixDQUFDOzsrR0E3Q1Esa0JBQWtCO21IQUFsQixrQkFBa0I7MkZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBUdXJib0dVSSBpcyBBIGxpYnJhcnkgdGhhdCBoZWxwcyB3aXRoIHRoZSBtb3N0IGNvbW1vbiBhbmQgZ2VuZXJpYyBVSSBlbGVtZW50cyBhbmQgZnVuY3Rpb25hbGl0aWVzXHJcbiAqXHJcbiAqIFdlYnNpdGUgOiAtPiBodHRwOi8vd3d3LnR1cmJvZ3VpLm9yZ1xyXG4gKiBMaWNlbnNlIDogLT4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMC4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBMaWNlbnNlIFVybCA6IC0+IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4gKiBDb3B5UmlnaHQgOiAtPiBDb3B5cmlnaHQgMjAxOCBFZGVydG9uZSBBZHZhbmRlZCBTb2x1dGlvbnMuIGh0dHBzOi8vd3d3LmVkZXJ0b25lLmNvbVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUsIEVycm9ySGFuZGxlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBDYXB0dXJlcyBhbGwgdGhlIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbnMgYW5kIHBlcmZvcm1zIGFueSByZXF1aXJlZCBhY3Rpb24uXHJcbiAqIEl0IGFsc28gY29udGFpbnMgbXVsdGlwbGUgZ2VuZXJhbCBlcnJvciBtYW5hZ2VtZW50IGZlYXR1cmVzLlxyXG4gKlxyXG4gKiBUbyBkZWZpbmUgdGhpcyBjbGFzcyBhcyB5b3VyIGFwcGxpY2F0aW9uIGVycm9yIGhhbmRsZXIsIHlvdSBtdXN0IGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXJcclxuICogbWFpbiBhcHAgbW9kdWxlIHByb3ZpZGVyczpcclxuICogICAgICB7XHJcbiAqICAgICAgICAgIHByb3ZpZGU6IEVycm9ySGFuZGxlcixcclxuICogICAgICAgICAgdXNlQ2xhc3M6IEdsb2JhbEVycm9yU2VydmljZVxyXG4gKiAgICAgIH0sXHJcbiAqICAgICAgR2xvYmFsRXJyb3JTZXJ2aWNlXHJcbiAqXHJcbiAqIFlvdSBjYW5ub3QgYWNjZXNzIHRoZSBlcnJvciBoYW5kbGVyIGF0IHJ1bnRpbWUuIElmIHlvdSBuZWVkIHRvIG1vZGlmeSBhbnkgb2YgdGhlIGJlaGF2aW91cnNcclxuICogb3IgaW1wbGVtZW50IHlvdXIgY3VzdG9tIG9uZXMsIHlvdSBtdXN0IGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBzZXQgeW91ciBuZXcgb25lIGFzIHRoZSBlcnJvclxyXG4gKiBoYW5kbGVyIHByb3ZpZGVyLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgR2xvYmFsRXJyb3JTZXJ2aWNlIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHtcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBlcnJvciBub3RpZmljYXRpb24gdG8gdXNlciB2aWEgYW4gYWxlcnQgYm94XHJcbiAgICAgKiBFeHRlbmQgdGhpcyBjbGFzcyBhbmQgb3ZlcnJpZGUgdGhpcyB2YWx1ZSBvbiB5b3VyIGN1c3RvbSBlcnJvciBoYW5kbGUgdG8gY2hhbmdlIGl0XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2hvd0V4Y2VwdGlvbnNUb1VzZXIgPSB0cnVlO1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGVycm9yIG5vdGlmaWNhdGlvbiB0byB1c2VyIHZpYSBhbiBhbGVydCBib3hcclxuICAgICAqIEV4dGVuZCB0aGlzIGNsYXNzIGFuZCBvdmVycmlkZSB0aGlzIHZhbHVlIG9uIHlvdXIgY3VzdG9tIGVycm9yIGhhbmRsZSB0byBjaGFuZ2UgaXRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzaG93RXhjZXB0aW9uc09uQ29uc29sZSA9IHRydWU7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB0aGUgdGV4dCB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGFsZXJ0IHRoYXQgaXMgc2hvd24gdG8gdGhlIHVzZXIgd2hlbiBhbiBleGNlcHRpb24gaGFwcGVuc1xyXG4gICAgICogYW5kIHNob3dFeGNlcHRpb25zVG9Vc2VyIGlzIHRydWVcclxuICAgICAqIEV4dGVuZCB0aGlzIGNsYXNzIGFuZCBvdmVycmlkZSB0aGlzIHZhbHVlIG9uIHlvdXIgY3VzdG9tIGVycm9yIGhhbmRsZSB0byBjaGFuZ2UgaXRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBlcnJvckFsZXJ0TWVzc2FnZSA9ICdBcHBsaWNhdGlvbiBleGNlcHRpb246XFxuXFxuJztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93IGFuIGFsZXJ0IHdpdGggdGhlIHJlY2VpdmVkIGVycm9yIGRldGFpbCBhbmQgYWxzbyBsb2cgaXQgdG8gdGhlIGpzIGNvbnNvbGUuXHJcbiAgICAgKlxyXG4gICAgICogQW5ndWxhciBleHBlY3RzIGF0IGxlYXN0IHRoaXMgbWV0aG9kIHRvIGJlIGltcGxlbWVudGVkIG9uIGFueSBjbGFzcyB0aGF0IGlzIHVzZWQgYXMgYSBnbG9iYWwgZXhjZXB0aW9uIGhhbmRsZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGVycm9yIEFuIGVycm9yIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0V4Y2VwdGlvbnNUb1VzZXIpIHtcclxuXHJcbiAgICAgICAgICAgIGFsZXJ0KHRoaXMuZXJyb3JBbGVydE1lc3NhZ2UgKyAoZXJyb3IgYXMgc3RyaW5nKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93RXhjZXB0aW9uc09uQ29uc29sZSkge1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,70 @@
1
+ /**
2
+ * TurboGUI is A library that helps with the most common and generic UI elements and functionalities
3
+ *
4
+ * Website : -> http://www.turbogui.org
5
+ * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
6
+ * License Url : -> http://www.apache.org/licenses/LICENSE-2.0
7
+ * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
8
+ */
9
+ import { Injectable } from '@angular/core';
10
+ import { HTTPManager, StringUtils } from 'turbocommons-ts';
11
+ import { DialogErrorComponent } from '../view/components/dialog-error/dialog-error.component';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "./dialog.service";
14
+ /**
15
+ * Manages application http communications
16
+ */
17
+ export class HTTPService extends HTTPManager {
18
+ constructor(dialogService) {
19
+ super(true);
20
+ this.dialogService = dialogService;
21
+ }
22
+ /**
23
+ * The same method as HTTPManager.execute but with the ability to enable several options which are specific to this service:
24
+ *
25
+ * - HTTPService.NO_MODAL_BUSY_STATE To prevent the default behaviour of locking the UI while the request is running
26
+ * - HTTPService.DISABLE_ERROR_HANDLING To prevent the default behaviour of showing a detailed error dialog when a request fails
27
+ *
28
+ * @see HTTPManager.execute()
29
+ */
30
+ execute(requests, finishedCallback = null, progressCallback = null, options = []) {
31
+ if (options.indexOf(HTTPService.NO_MODAL_BUSY_STATE) < 0) {
32
+ this.dialogService.addModalBusyState();
33
+ }
34
+ super.execute(requests, (results, anyError) => {
35
+ if (options.indexOf(HTTPService.NO_MODAL_BUSY_STATE) < 0) {
36
+ this.dialogService.removeModalBusyState();
37
+ }
38
+ if ((options.indexOf(HTTPService.DISABLE_ERROR_HANDLING) < 0) && anyError) {
39
+ for (let result of results) {
40
+ if (result.isError) {
41
+ let errorMsg = result.errorMsg + '\n\n' + result.response;
42
+ if (StringUtils.isEmpty(errorMsg)) {
43
+ errorMsg = 'Unknown error. Make sure Internet connection is available';
44
+ }
45
+ this.dialogService.addDialog('600px', ['Error: ' + result.code, errorMsg], ['Ok'], DialogErrorComponent);
46
+ }
47
+ }
48
+ }
49
+ if (finishedCallback !== null) {
50
+ finishedCallback(results, anyError);
51
+ }
52
+ }, progressCallback);
53
+ }
54
+ }
55
+ /**
56
+ * execute() method option that tells the service to avoid blocking the user interface with a modal busy state while the requests that are
57
+ * launched by the execute method are running.
58
+ */
59
+ HTTPService.NO_MODAL_BUSY_STATE = 'NO_MODAL_BUSY_STATE';
60
+ /**
61
+ * execute() method option that tells the service to skip showing an error dialog when a request fails. We normally use this to handle the
62
+ * errors by ourselves or if we want to hide the error dialog for a specific request.
63
+ */
64
+ HTTPService.DISABLE_ERROR_HANDLING = 'DISABLE_ERROR_HANDLING';
65
+ HTTPService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: HTTPService, deps: [{ token: i1.DialogService }], target: i0.ɵɵFactoryTarget.Injectable });
66
+ HTTPService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: HTTPService });
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: HTTPService, decorators: [{
68
+ type: Injectable
69
+ }], ctorParameters: function () { return [{ type: i1.DialogService }]; } });
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVyYm9ndWktYW5ndWxhci9zcmMvbWFpbi9jb250cm9sbGVyL2h0dHAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsV0FBVyxFQUEwQixXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVuRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3REFBd0QsQ0FBQzs7O0FBRzlGOztHQUVHO0FBRUgsTUFBTSxPQUFPLFdBQVksU0FBUSxXQUFXO0lBaUJ4QyxZQUFtQixhQUE0QjtRQUUzQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFGRyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUcvQyxDQUFDO0lBR0Q7Ozs7Ozs7T0FPRztJQUNILE9BQU8sQ0FBQyxRQUF5RSxFQUN6RSxtQkFBOEksSUFBSSxFQUNsSixtQkFBbUYsSUFBSSxFQUN2RixVQUFnRyxFQUFFO1FBRXRHLElBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLEVBQUM7WUFFckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQ3pDO1FBRUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFFMUMsSUFBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsRUFBQztnQkFFcEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQzdDO1lBRUQsSUFBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksUUFBUSxFQUFDO2dCQUVyRSxLQUFJLElBQUksTUFBTSxJQUFJLE9BQU8sRUFBQztvQkFFdEIsSUFBRyxNQUFNLENBQUMsT0FBTyxFQUFDO3dCQUVkLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7d0JBRTFELElBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBQzs0QkFFN0IsUUFBUSxHQUFHLDJEQUEyRCxDQUFDO3lCQUMxRTt3QkFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7cUJBQzVHO2lCQUNKO2FBQ0o7WUFFRCxJQUFHLGdCQUFnQixLQUFLLElBQUksRUFBQztnQkFFekIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3ZDO1FBRUosQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDMUIsQ0FBQzs7QUFyRUQ7OztHQUdHO0FBQ2EsK0JBQW1CLEdBQUcscUJBQXNCLENBQUE7QUFHNUQ7OztHQUdHO0FBQ2Esa0NBQXNCLEdBQUcsd0JBQXlCLENBQUE7d0dBZHpELFdBQVc7NEdBQVgsV0FBVzsyRkFBWCxXQUFXO2tCQUR2QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIFR1cmJvR1VJIGlzIEEgbGlicmFyeSB0aGF0IGhlbHBzIHdpdGggdGhlIG1vc3QgY29tbW9uIGFuZCBnZW5lcmljIFVJIGVsZW1lbnRzIGFuZCBmdW5jdGlvbmFsaXRpZXNcclxuICpcclxuICogV2Vic2l0ZSA6IC0+IGh0dHA6Ly93d3cudHVyYm9ndWkub3JnXHJcbiAqIExpY2Vuc2UgOiAtPiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiAqIExpY2Vuc2UgVXJsIDogLT4gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbiAqIENvcHlSaWdodCA6IC0+IENvcHlyaWdodCAyMDE4IEVkZXJ0b25lIEFkdmFuZGVkIFNvbHV0aW9ucy4gaHR0cHM6Ly93d3cuZWRlcnRvbmUuY29tXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIVFRQTWFuYWdlciwgSFRUUE1hbmFnZXJCYXNlUmVxdWVzdCwgU3RyaW5nVXRpbHMgfSBmcm9tICd0dXJib2NvbW1vbnMtdHMnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWxvZ0Vycm9yQ29tcG9uZW50IH0gZnJvbSAnLi4vdmlldy9jb21wb25lbnRzL2RpYWxvZy1lcnJvci9kaWFsb2ctZXJyb3IuY29tcG9uZW50JztcclxuXHJcblxyXG4vKipcclxuICogTWFuYWdlcyBhcHBsaWNhdGlvbiBodHRwIGNvbW11bmljYXRpb25zXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBIVFRQU2VydmljZSBleHRlbmRzIEhUVFBNYW5hZ2VyIHtcclxuICAgIFxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIGV4ZWN1dGUoKSBtZXRob2Qgb3B0aW9uIHRoYXQgdGVsbHMgdGhlIHNlcnZpY2UgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIHVzZXIgaW50ZXJmYWNlIHdpdGggYSBtb2RhbCBidXN5IHN0YXRlIHdoaWxlIHRoZSByZXF1ZXN0cyB0aGF0IGFyZVxyXG4gICAgICogbGF1bmNoZWQgYnkgdGhlIGV4ZWN1dGUgbWV0aG9kIGFyZSBydW5uaW5nLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVhZG9ubHkgTk9fTU9EQUxfQlVTWV9TVEFURSA9ICdOT19NT0RBTF9CVVNZX1NUQVRFJztcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBleGVjdXRlKCkgbWV0aG9kIG9wdGlvbiB0aGF0IHRlbGxzIHRoZSBzZXJ2aWNlIHRvIHNraXAgc2hvd2luZyBhbiBlcnJvciBkaWFsb2cgd2hlbiBhIHJlcXVlc3QgZmFpbHMuIFdlIG5vcm1hbGx5IHVzZSB0aGlzIHRvIGhhbmRsZSB0aGVcclxuICAgICAqIGVycm9ycyBieSBvdXJzZWx2ZXMgb3IgaWYgd2Ugd2FudCB0byBoaWRlIHRoZSBlcnJvciBkaWFsb2cgZm9yIGEgc3BlY2lmaWMgcmVxdWVzdC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlYWRvbmx5IERJU0FCTEVfRVJST1JfSEFORExJTkcgPSAnRElTQUJMRV9FUlJPUl9IQU5ETElORyc7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlKSB7XHJcblxyXG4gICAgICAgIHN1cGVyKHRydWUpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNhbWUgbWV0aG9kIGFzIEhUVFBNYW5hZ2VyLmV4ZWN1dGUgYnV0IHdpdGggdGhlIGFiaWxpdHkgdG8gZW5hYmxlIHNldmVyYWwgb3B0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhpcyBzZXJ2aWNlOlxyXG4gICAgICpcclxuICAgICAqIC0gSFRUUFNlcnZpY2UuTk9fTU9EQUxfQlVTWV9TVEFURSBUbyBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBsb2NraW5nIHRoZSBVSSB3aGlsZSB0aGUgcmVxdWVzdCBpcyBydW5uaW5nXHJcbiAgICAgKiAtIEhUVFBTZXJ2aWNlLkRJU0FCTEVfRVJST1JfSEFORExJTkcgVG8gcHJldmVudCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2Ygc2hvd2luZyBhIGRldGFpbGVkIGVycm9yIGRpYWxvZyB3aGVuIGEgcmVxdWVzdCBmYWlsc1xyXG4gICAgICpcclxuICAgICAqIEBzZWUgSFRUUE1hbmFnZXIuZXhlY3V0ZSgpXHJcbiAgICAgKi9cclxuICAgIGV4ZWN1dGUocmVxdWVzdHM6IHN0cmluZ3xzdHJpbmdbXXxIVFRQTWFuYWdlckJhc2VSZXF1ZXN0fEhUVFBNYW5hZ2VyQmFzZVJlcXVlc3RbXSxcclxuICAgICAgICAgICAgZmluaXNoZWRDYWxsYmFjazogKChyZXN1bHRzOiB7dXJsOnN0cmluZywgcmVzcG9uc2U6YW55LCBpc0Vycm9yOmJvb2xlYW4sIGVycm9yTXNnOnN0cmluZywgY29kZTpudW1iZXJ9W10sIGFueUVycm9yOmJvb2xlYW4pID0+IHZvaWQpIHwgbnVsbCA9IG51bGwsXHJcbiAgICAgICAgICAgIHByb2dyZXNzQ2FsbGJhY2s6IG51bGwgfCAoKGNvbXBsZXRlZFVybDogc3RyaW5nLCB0b3RhbFJlcXVlc3RzOiBudW1iZXIpID0+IHZvaWQpID0gbnVsbCxcclxuICAgICAgICAgICAgb3B0aW9uczogKHR5cGVvZiBIVFRQU2VydmljZS5OT19NT0RBTF9CVVNZX1NUQVRFfHR5cGVvZiBIVFRQU2VydmljZS5ESVNBQkxFX0VSUk9SX0hBTkRMSU5HKVtdID0gW10pe1xyXG4gICAgXHJcbiAgICAgICAgaWYob3B0aW9ucy5pbmRleE9mKEhUVFBTZXJ2aWNlLk5PX01PREFMX0JVU1lfU1RBVEUpIDwgMCl7XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmFkZE1vZGFsQnVzeVN0YXRlKCk7IFxyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIHN1cGVyLmV4ZWN1dGUocmVxdWVzdHMsIChyZXN1bHRzLCBhbnlFcnJvcikgPT4geyBcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmKG9wdGlvbnMuaW5kZXhPZihIVFRQU2VydmljZS5OT19NT0RBTF9CVVNZX1NUQVRFKSA8IDApe1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UucmVtb3ZlTW9kYWxCdXN5U3RhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoKG9wdGlvbnMuaW5kZXhPZihIVFRQU2VydmljZS5ESVNBQkxFX0VSUk9SX0hBTkRMSU5HKSA8IDApICYmIGFueUVycm9yKXtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCByZXN1bHQgb2YgcmVzdWx0cyl7XHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzdWx0LmlzRXJyb3Ipe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVycm9yTXNnID0gcmVzdWx0LmVycm9yTXNnICsgJ1xcblxcbicgKyByZXN1bHQucmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihTdHJpbmdVdGlscy5pc0VtcHR5KGVycm9yTXNnKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2cgPSAnVW5rbm93biBlcnJvci4gTWFrZSBzdXJlIEludGVybmV0IGNvbm5lY3Rpb24gaXMgYXZhaWxhYmxlJzsgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UuYWRkRGlhbG9nKCc2MDBweCcsIFsnRXJyb3I6ICcgKyByZXN1bHQuY29kZSwgZXJyb3JNc2ddLCBbJ09rJ10sIERpYWxvZ0Vycm9yQ29tcG9uZW50KTsgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoZmluaXNoZWRDYWxsYmFjayAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGZpbmlzaGVkQ2FsbGJhY2socmVzdWx0cywgYW55RXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICB9LCBwcm9ncmVzc0NhbGxiYWNrKTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,22 @@
1
+ /**
2
+ * TurboGUI is A library that helps with the most common and generic UI elements and functionalities
3
+ *
4
+ * Website : -> http://www.turbogui.org
5
+ * License : -> Licensed under the Apache License, Version 2.0. You may not use this file except in compliance with the License.
6
+ * License Url : -> http://www.apache.org/licenses/LICENSE-2.0
7
+ * CopyRight : -> Copyright 2018 Edertone Advanded Solutions. https://www.edertone.com
8
+ */
9
+ import { Injectable } from '@angular/core';
10
+ import { LocalizationManager } from 'turbocommons-ts';
11
+ import * as i0 from "@angular/core";
12
+ /**
13
+ * Manages application text translations and languages
14
+ */
15
+ export class LocalizationService extends LocalizationManager {
16
+ }
17
+ LocalizationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LocalizationService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
18
+ LocalizationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LocalizationService });
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LocalizationService, decorators: [{
20
+ type: Injectable
21
+ }] });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dXJib2d1aS1hbmd1bGFyL3NyYy9tYWluL2NvbnRyb2xsZXIvbG9jYWxpemF0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBR3REOztHQUVHO0FBRUgsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG1CQUFtQjs7Z0hBQS9DLG1CQUFtQjtvSEFBbkIsbUJBQW1COzJGQUFuQixtQkFBbUI7a0JBRC9CLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogVHVyYm9HVUkgaXMgQSBsaWJyYXJ5IHRoYXQgaGVscHMgd2l0aCB0aGUgbW9zdCBjb21tb24gYW5kIGdlbmVyaWMgVUkgZWxlbWVudHMgYW5kIGZ1bmN0aW9uYWxpdGllc1xyXG4gKlxyXG4gKiBXZWJzaXRlIDogLT4gaHR0cDovL3d3dy50dXJib2d1aS5vcmdcclxuICogTGljZW5zZSA6IC0+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuICogTGljZW5zZSBVcmwgOiAtPiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICogQ29weVJpZ2h0IDogLT4gQ29weXJpZ2h0IDIwMTggRWRlcnRvbmUgQWR2YW5kZWQgU29sdXRpb25zLiBodHRwczovL3d3dy5lZGVydG9uZS5jb21cclxuICovXHJcblxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExvY2FsaXphdGlvbk1hbmFnZXIgfSBmcm9tICd0dXJib2NvbW1vbnMtdHMnO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBNYW5hZ2VzIGFwcGxpY2F0aW9uIHRleHQgdHJhbnNsYXRpb25zIGFuZCBsYW5ndWFnZXNcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIExvY2FsaXphdGlvblNlcnZpY2UgZXh0ZW5kcyBMb2NhbGl6YXRpb25NYW5hZ2VyIHtcclxuXHJcbn1cclxuIl19